- StPendl Oct 29, 2011
First we analyze the source code to determine the steps we need to take to achieve our goal.
From the display and the source code we found out that there are at least three code sections, which duplicate the same features.
They are the three bands to display the color code of the resistor, which share the same number of colors to display.
This is something where arrays are best used to simplify and unify the source code.
To get arrays into play we add the following lines of code.
Since the original poster has already used control extensions in the format {name}{index}, he has greatly smoothed our path to further code simplification.
This enables us to further simplify the way to draw the colored bands by replacing:
#w.Black1,"home; down; fill 0 0 0;flush"#w.Brown1,"home; down; fill 170 100 20;flush"#w.Red1,"home; down; fill 255 0 0;flush"#w.Orange1,"home; down; fill 255 180 0;flush"#w.Yellow1,"home; down; fill 255 255 55;flush"#w.Green1,"home; down; fill 45 157 40;flush"#w.Blue1,"home; down; fill 0 0 255;flush"#w.Violet1,"home; down; fill 170 0 180;flush"#w.Gray1,"home; down; fill 127 127 127;flush"#w.White1,"home; down; fill 255 255 255;flush"#w.Black2,"home; down; fill 0 0 0;flush"#w.Brown2,"home; down; fill 170 100 20;flush"#w.Red2,"home; down; fill 255 0 0;flush"#w.Orange2,"home; down; fill 255 180 0;flush"#w.Yellow2,"home; down; fill 255 255 55;flush"#w.Green2,"home; down; fill 45 157 40;flush"#w.Blue2,"home; down; fill 0 0 255;flush"#w.Violet2,"home; down; fill 170 0 180;flush"#w.Gray2,"home; down; fill 127 127 127;flush"#w.White2,"home; down; fill 255 255 255;flush"#w.Black3,"home; down; fill 0 0 0;flush"#w.Brown3,"home; down; fill 170 100 20;flush"#w.Red3,"home; down; fill 255 0 0;flush"#w.Orange3,"home; down; fill 255 180 0;flush"#w.Yellow3,"home; down; fill 255 255 55;flush"#w.Green3,"home; down; fill 45 157 40;flush"#w.Blue3,"home; down; fill 0 0 255;flush"#w.Violet3,"home; down; fill 170 0 180;flush"#w.Gray3,"home; down; fill 127 127 127;flush"#w.White3,"home; down; fill 255 255 255;flush"#w.Gold,"home; down; fill 255 238 51;flush"' golden#w.Silver,"home; down; fill 200 200 250;flush"' silver#w.None,"home; down; fill 21 228 255;flush"'None
With the following simple loops, where we utilize the handle variables capability of Liberty BASIC.
FOR Band =1to3FOR Color =1to10
Handle$ ="#w."; Colors$(Color,1); Band
#Handle$ "cls;down;fill "; Colors$(Color,2); ";flush"NEXTNEXTFOR Tolerance =1to3
Handle$ ="#w."; Tolerances$(Tolerance,1)#Handle$ "cls;down;fill "; Tolerances$(Tolerance,2); ";flush"NEXT
The complete code now looks like this.
'Resistor Calculator.bas'Author: salaion Yahoo! Group'Date: 27.11.10'' 27.11.10 00:18:50 - Initial as posted' 27.11.10 00:21:40 - added array for colors and reduced redundant code for color boxesnomainwinWindowWidth=850:WindowHeight=600UpperLeftX=int((DisplayWidth-WindowWidth)/2)UpperLeftY=int((DisplayHeight-WindowHeight)/2)BackgroundColor$="green"'ForegroundColor$ = "Black"dim Colors$(10,2), Tolerances$(3,2)[Colors]DATA"Black"," 0 0 0"DATA"Brown","170 100 20"DATA"Red","255 0 0"DATA"Orange","255 180 0"DATA"Yellow","255 255 55"DATA"Green"," 45 157 40"DATA"Blue"," 0 0 255"DATA"Violet","170 0 180"DATA"Gray","127 127 127"DATA"White","255 255 255"[Tolerances]DATA"Gold","255 238 51"DATA"Silver","200 200 250"DATA"None"," 21 228 255"'Fill the arraysRESTORE[Colors]FOR i =1to10READ ColorName$, ColorValue$
Colors$(i,1)= ColorName$
Colors$(i,2)= ColorValue$
NEXTRESTORE[Tolerances]FOR i =1to3READ ColorName$, ColorValue$
Tolerances$(i,1)= ColorName$
Tolerances$(i,2)= ColorValue$
NEXTSTATICTEXT#w.Ohm,"",500,200,300,20STATICTEXT#w.Tole,"",500,230,300,20STATICTEXT#w,Colors$(1,1),10,42,50,20STATICTEXT#w,Colors$(2,1),10,82,50,20STATICTEXT#w,Colors$(3,1),10,122,50,20STATICTEXT#w,Colors$(4,1),10,162,50,20STATICTEXT#w,Colors$(5,1),10,202,50,20STATICTEXT#w,Colors$(6,1),10,242,50,20STATICTEXT#w,Colors$(7,1),10,282,50,20STATICTEXT#w,Colors$(8,1),10,322,50,20STATICTEXT#w,Colors$(9,1),10,362,50,20STATICTEXT#w,Colors$(10,1),10,402,50,20STATICTEXT#w,Tolerances$(1,1),470,42,50,20STATICTEXT#w,Tolerances$(2,1),470,82,50,20STATICTEXT#w,Tolerances$(3,1),470,122,50,20STATICTEXT#w,"K=Kilo ",500,300,100,20STATICTEXT#w,"M=Mega ",500,330,100,20STATICTEXT#w,"Light Blue is The Default Color of Resistance ",500,360,400,20'Band1groupbox#w.FirstDigit,"First Digit",70,10,80,430radiobutton#w.Blackr1 ,"",[Band1],[Band1],75,45,20,20'Black=0radiobutton#w.Brownr1 ,"",[Band1],[Band1],75,85,20,20'Brown=1radiobutton#w.Redr1 ,"",[Band1],[Band1],75,125,20,20'Red=2radiobutton#w.Oranger1 ,"",[Band1],[Band1],75,165,20,20'Orange=3radiobutton#w.Yellowr1 ,"",[Band1],[Band1],75,205,20,20'Yellow=4radiobutton#w.Greenr1 ,"",[Band1],[Band1],75,245,20,20'Green=5radiobutton#w.Bluer1 ,"",[Band1],[Band1],75,285,20,20'Blue=6radiobutton#w.Violetr1 ,"",[Band1],[Band1],75,325,20,20'Violet=7radiobutton#w.Grayr1 ,"",[Band1],[Band1],75,365,20,20'Gray=8radiobutton#w.Whiter1 ,"",[Band1],[Band1],75,405,20,20'White=9'Band2groupbox#w.SecondtDigit,"Second Digit",180,10,80,430radiobutton#w.Blackr2 ,"",[Band2],[Band2],185,45,20,20'Black=0radiobutton#w.Brownr2 ,"",[Band2],[Band2],185,85,20,20'Brown=1radiobutton#w.Redr2 ,"",[Band2],[Band2],185,125,20,20'Red=2radiobutton#w.Oranger2 ,"",[Band2],[Band2],185,165,20,20'Orange=3radiobutton#w.Yellowr2 ,"",[Band2],[Band2],185,205,20,20'Yellow=4radiobutton#w.Greenr2 ,"",[Band2],[Band2],185,245,20,20'Green=5radiobutton#w.Bluer2 ,"",[Band2],[Band2],185,285,20,20'Blue=6radiobutton#w.Violetr2 ,"",[Band2],[Band2],185,325,20,20'Violet=7radiobutton#w.Grayr2 ,"",[Band2],[Band2],185,365,20,20'Gray=8radiobutton#w.Whiter2 ,"",[Band2],[Band2],185,405,20,20'White=9'Band3groupbox#w.Multiplier,"Multiplier",280,10,80,430radiobutton#w.Blackr3 ,"",[Band3],[Band3],285,45,20,20'Black=0radiobutton#w.Brownr3 ,"",[Band3],[Band3],285,85,20,20'Brown=1radiobutton#w.Redr3 ,"",[Band3],[Band3],285,125,20,20'Red=2radiobutton#w.Oranger3 ,"",[Band3],[Band3],285,165,20,20'Orange=3radiobutton#w.Yellowr3 ,"",[Band3],[Band3],285,205,20,20'Yellow=4radiobutton#w.Greenr3 ,"",[Band3],[Band3],285,245,20,20'Green=5radiobutton#w.Bluer3 ,"",[Band3],[Band3],285,285,20,20'Blue=6radiobutton#w.Violetr3 ,"",[Band3],[Band3],285,325,20,20'Violet=7radiobutton#w.Grayr3 ,"",[Band3],[Band3],285,365,20,20'Gray=8radiobutton#w.Whiter3 ,"",[Band3],[Band3],285,405,20,20'White=9'Band4groupbox#w.Tolerance,"Tolerance",380,10,80,430radiobutton#w.Goldr ,"",[Band4],[Band4],385,45,20,20'Gold=5%radiobutton#w.Silverr ,"",[Band4],[Band4],385,85,20,20'Silver=10%radiobutton#w.Noner ,"",[Band4],[Band4],385,125,20,20'None=20%'Framgraphicbox#w.add,530,60,292,30'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxstylebits#w.add,0,_WS_BORDER,0,0graphicbox#w.up,523,53,306,7stylebits#w.up,0,_WS_BORDER,0,0'graphicbox#w.down,523,90,306,7stylebits#w.down,0,_WS_BORDER,0,0'graphicbox#w.side1,523,53,7,44stylebits#w.side1,0,_WS_BORDER,0,0'graphicbox#w.adds2,822,53,7,44stylebits#w.adds2,0,_WS_BORDER,0,0''Band1graphicbox#w.Black1 ,100,40,30,30graphicbox#w.Brown1 ,100,80,30,30graphicbox#w.Red1 ,100,120,30,30graphicbox#w.Orange1,100,160,30,30graphicbox#w.Yellow1,100,200,30,30graphicbox#w.Green1 ,100,240,30,30graphicbox#w.Blue1 ,100,280,30,30graphicbox#w.Violet1,100,320,30,30graphicbox#w.Gray1 ,100,360,30,30graphicbox#w.White1 ,100,400,30,30'Band2graphicbox#w.Black2 ,210,40,30,30graphicbox#w.Brown2 ,210,80,30,30graphicbox#w.Red2 ,210,120,30,30graphicbox#w.Orange2,210,160,30,30graphicbox#w.Yellow2,210,200,30,30graphicbox#w.Green2 ,210,240,30,30graphicbox#w.Blue2 ,210,280,30,30graphicbox#w.Violet2,210,320,30,30graphicbox#w.Gray2 ,210,360,30,30graphicbox#w.White2 ,210,400,30,30'Band3graphicbox#w.Black3 ,310,40,30,30graphicbox#w.Brown3 ,310,80,30,30graphicbox#w.Red3 ,310,120,30,30graphicbox#w.Orange3,310,160,30,30graphicbox#w.Yellow3,310,200,30,30graphicbox#w.Green3 ,310,240,30,30graphicbox#w.Blue3 ,310,280,30,30graphicbox#w.Violet3,310,320,30,30graphicbox#w.Gray3 ,310,360,30,30graphicbox#w.White3 ,310,400,30,30'Band4graphicbox#w.Gold ,410,40,30,30graphicbox#w.Silver,410,80,30,30graphicbox#w.None,410,120,30,30'Selected Bands of Body Resistancegraphicbox#w.Band1,155,470,15,35graphicbox#w.Band2,185,470,15,35graphicbox#w.Band3,215,470,15,35graphicbox#w.Band4,255,470,15,35stylebits#w.Band1,0,_WS_BORDER,0,0stylebits#w.Band2,0,_WS_BORDER,0,0stylebits#w.Band3,0,_WS_BORDER,0,0stylebits#w.Band4,0,_WS_BORDER,0,0'General Body Resistancegraphicbox#w.37,130,470,168,35stylebits#w.37,0,_WS_BORDER,0,0'Terminal Wiresgraphicbox#w.42,80,485,50,5graphicbox#w.43,300,485,50,5open"Resistor Calculator"for window_nf as#w
#w "trapclose [quit]"#w "font Times_New_Roman 13"#w.add "cls;down;fill yellow;font Times_New_Roman 16 bold;color red;backcolor yellow"#w.add "place 5 20;\Resistor Color Code of 4 Bands"#w.add "flush"#w.up "cls;down;fill blue;flush"#w.down "cls;down;fill blue;flush"#w.side1 "cls;down;fill blue;flush"#w.adds2 "cls;down;fill blue;flush"FOR Band =1to3FOR Color =1to10
Handle$ ="#w."; Colors$(Color,1); Band
#Handle$ "cls;down;fill "; Colors$(Color,2); ";flush"NEXTNEXTFOR Tolerance =1to3
Handle$ ="#w."; Tolerances$(Tolerance,1)#Handle$ "cls;down;fill "; Tolerances$(Tolerance,2); ";flush"NEXT'General Body Resistance Color#w.37 "cls; down; fill 21 228 255;flush"'light blue'Color of Terminal Wires#w.42 "cls; down; fill 127 127 127;flush"#w.43 "cls; down; fill 127 127 127;flush"#w.Band1 "cls; down;fill 21 228 255;flush"#w.Band2 "cls; down;fill 21 228 255;flush"#w.Band3 "cls; down;fill 21 228 255;flush"#w.Band4 "cls; down;fill 21 228 255;flush"[Band1]#w.Blackr1 "value? Blackr1$"#w.Brownr1 "value? Brownr1$"#w.Redr1 "value? Redr1$"#w.Oranger1 "value? Oranger1$"#w.Yellowr1 "value? Yellowr1$"#w.Greenr1 "value? Greenr1$"#w.Bluer1 "value? Bluer1$"#w.Violetr1 "value? Violetr1$"#w.Grayr1 "value? Grayr1$"#w.Whiter1 "value? Whiter1$"selectcasecase Blackr1$="set"
case1=1#w.Band1,"home; down; fill 0 0 0;flush"
Band1value=0*10'Blackcase Brownr1$="set"
case1=1#w.Band1,"home; down; fill 170 100 20;flush"
Band1value=1*10'Browncase Redr1$="set"
case1=1#w.Band1,"home; down; fill 255 0 0;flush"
Band1value=2*10'Redcase Oranger1$="set"
case1=1#w.Band1,"home; down; fill 255 180 0;flush"
Band1value=3*10case Yellowr1$="set"
case1=1#w.Band1,"home; down; fill 255 255 55;flush"
Band1value=4*10case Greenr1$="set"
case1=1#w.Band1,"home; down; fill 45 157 40;flush"
Band1value=5*10case Bluer1$="set"
case1=1#w.Band1,"home; down; fill 0 0 255;flush"
Band1value=6*10case Violetr1$="set"
case1=1#w.Band1,"home; down; fill 170 0 180;flush"
Band1value=7*10case Grayr1$="set"
case1=1#w.Band1,"home; down; fill 127 127 127;flush"
Band1value=8*10case Whiter1$="set"
case1=1#w.Band1,"home; down; fill 255 255 255;flush"
Band1value=9*10caseelsewaitendselect[Band2]#w.Blackr2 "value? Blackr2$"#w.Brownr2 "value? Brownr2$"#w.Redr2 "value? Redr2$"#w.Oranger2 "value? Oranger2$"#w.Yellowr2 "value? Yellowr2$"#w.Greenr2 "value? Greenr2$"#w.Bluer2 "value? Bluer2$"#w.Violetr2 "value? Violetr2$"#w.Grayr2 "value? Grayr2$"#w.Whiter2 "value? Whiter2$"selectcasecase Blackr2$="set"
case2=2#w.Band2,"home; down; fill 0 0 0;flush"
Band2value=0'Blackcase Brownr2$="set"
case2=2#w.Band2,"home; down; fill 170 100 20;flush"
Band2value=1'Browncase Redr2$="set"
case2=2#w.Band2,"home; down; fill 255 0 0;flush"
Band2value=2'Redcase Oranger2$="set"
case2=2#w.Band2,"home; down; fill 255 180 0;flush"
Band2value=3case Yellowr2$="set"
case2=2#w.Band2,"home; down; fill 255 255 55;flush"
Band2value=4case Greenr2$="set"
case2=2#w.Band2,"home; down; fill 45 157 40;flush"
Band2value=5case Bluer2$="set"
case2=2#w.Band2,"home; down; fill 0 0 255;flush"
Band2value=6case Violetr2$="set"
case2=2#w.Band2,"home; down; fill 170 0 180;flush"
Band2value=7case Grayr2$="set"
case2=2#w.Band2,"home; down; fill 127 127 127;flush"
Band2value=8case Whiter2$="set"
case2=2#w.Band2,"home; down; fill 255 255 255;flush"
Band2value=9caseelsewaitendselect[Band3]#w.Blackr3 "value? Blackr3$"#w.Brownr3 "value? Brownr3$"#w.Redr3 "value? Redr3$"#w.Oranger3 "value? Oranger3$"#w.Yellowr3 "value? Yellowr3$"#w.Greenr3 "value? Greenr3$"#w.Bluer3 "value? Bluer3$"#w.Violetr3 "value? Violetr3$"#w.Grayr3 "value? Grayr3$"#w.Whiter3 "value? Whiter3$"selectcasecase Blackr3$="set"
case3=3#w.Band3,"home; down; fill 0 0 0;flush"
Band3value=1'Blackcase Brownr3$="set"
case3=3#w.Band3,"home; down; fill 170 100 20;flush"
Band3value=10'Browncase Redr3$="set"
case3=3#w.Band3,"home; down; fill 255 0 0;flush"
Band3value=100'Redcase Oranger3$="set"
case3=3#w.Band3,"home; down; fill 255 180 0;flush"
Band3value=1000case Yellowr3$="set"
case3=3#w.Band3,"home; down; fill 255 255 55;flush"
Band3value=10000case Greenr3$="set"
case3=3#w.Band3,"home; down; fill 45 157 40;flush"
Band3value=100000case Bluer3$="set"
case3=3#w.Band3,"home; down; fill 0 0 255;flush"
Band3value=1000000case Violetr3$="set"
case3=3#w.Band3,"home; down; fill 170 0 180;flush"
Band3value=10000000case Grayr3$="set"
case3=3#w.Band3,"home; down; fill 127 127 127;flush"
Band3value=100000000case Whiter3$="set"
case3=3#w.Band3,"home; down; fill 255 255 255;flush"
Band3value=1000000000caseelseif case1=0thennotice"Please Select Color of Band 1"waitendselect
vv=(Band1value+Band2value)*Band3value
if vv<=999thenPrint#w.Ohm,"Resistance Value=";vv;" Ohm"if vv>=1000and vv<=999999thenPrint#w.Ohm,"Resistance Value=";vv/1000;" K Ohm"if vv>=1000000thenPrint#w.Ohm,"Resistance Value=";vv/1000000;" M Ohm"[Band4]#w.Goldr "value? Goldr$"#w.Silverr "value? Silverr$"#w.Noner "value? Noner$"selectcasecase Goldr$="set"'case4=4#w.Band4,"home; down; fill 250 235 90;flush"
Band4value=5'Blackcase Silverr$="set"'case4=4#w.Band4,"home; down; fill 200 200 250;flush"
Band4value=10'Browncase Noner$="set"'case4=4#w.Band4,"home; down; fill 21 228 255;flush"
Band4value=20'Browncaseelse'if case4= 0 then notice "Please Select Color of Band 3"if case2=0thennotice"Please Select Color of Band 2"if case1=0thennotice"Please Select Color of Band 1"wait'notice "Please Select Color"endselect'if case4= 0 then notice "Please Select Color of Band 3"if Band4value>0thenPrint#w.Tole,"Tolerance Value =";" -+ ";Band4value;"%"wait[quit]close#w
END
Streamlining your code
Chapter 2 - Using arrays to reduce redundant code
-First we analyze the source code to determine the steps we need to take to achieve our goal.
From the display and the source code we found out that there are at least three code sections, which duplicate the same features.
They are the three bands to display the color code of the resistor, which share the same number of colors to display.
This is something where arrays are best used to simplify and unify the source code.
To get arrays into play we add the following lines of code.
Since the original poster has already used control extensions in the format {name}{index}, he has greatly smoothed our path to further code simplification.
This enables us to further simplify the way to draw the colored bands by replacing:
With the following simple loops, where we utilize the handle variables capability of Liberty BASIC.
The complete code now looks like this.
Chapter 1 - Starting the mission
Chapter 2 - Using arrays to reduce redundant code
Chapter 3 - Use variables for duplicate command strings
Chapter 4 - Consolidate event handlers
Chapter 5 - Apply mouse selection
Chapter 6 - Remove radio buttons
Chapter 7 - Use a single graphics box for the resistor display
Chapter 8 - Further reduce the amount of GUI controls
Chapter 9 - Adding some eye-candy
Chapter 10 - Summary