Older Version
Newer Version
StPendl
Oct 29, 2011
=Streamlining your code=
==Chapter 2 - Using arrays to reduce redundant code==
//[[user:StPendl|1319905523]]//
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.
[[code format="lb"]]
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 arrays
RESTORE [Colors]
FOR i = 1 to 10
READ ColorName$, ColorValue$
Colors$(i,1) = ColorName$
Colors$(i,2) = ColorValue$
NEXT
RESTORE [Tolerances]
FOR i = 1 to 3
READ ColorName$, ColorValue$
Tolerances$(i,1) = ColorName$
Tolerances$(i,2) = ColorValue$
NEXT
[[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:
[[code format="lb"]]
#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
[[code]]
With the following simple loops, where we utilize the handle variables capability of Liberty BASIC.
[[code format="lb"]]
FOR Band = 1 to 3
FOR Color = 1 to 10
Handle$ = "#w."; Colors$(Color,1); Band
#Handle$ "cls;down;fill "; Colors$(Color,2); ";flush"
NEXT
NEXT
FOR Tolerance = 1 to 3
Handle$ = "#w."; Tolerances$(Tolerance,1)
#Handle$ "cls;down;fill "; Tolerances$(Tolerance,2); ";flush"
NEXT
[[code]]
The complete code now looks like this.
[[code format="lb"]]
'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 boxes
nomainwin
WindowWidth = 850:WindowHeight = 600
UpperLeftX=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 arrays
RESTORE [Colors]
FOR i = 1 to 10
READ ColorName$, ColorValue$
Colors$(i,1) = ColorName$
Colors$(i,2) = ColorValue$
NEXT
RESTORE [Tolerances]
FOR i = 1 to 3
READ ColorName$, ColorValue$
Tolerances$(i,1) = ColorName$
Tolerances$(i,2) = ColorValue$
NEXT
STATICTEXT #w.Ohm, "" , 500, 200, 300, 20
STATICTEXT #w.Tole,"" , 500, 230, 300, 20
STATICTEXT #w,Colors$( 1,1), 10, 42, 50, 20
STATICTEXT #w,Colors$( 2,1), 10, 82, 50, 20
STATICTEXT #w,Colors$( 3,1), 10, 122, 50, 20
STATICTEXT #w,Colors$( 4,1), 10, 162, 50, 20
STATICTEXT #w,Colors$( 5,1), 10, 202, 50, 20
STATICTEXT #w,Colors$( 6,1), 10, 242, 50, 20
STATICTEXT #w,Colors$( 7,1), 10, 282, 50, 20
STATICTEXT #w,Colors$( 8,1), 10, 322, 50, 20
STATICTEXT #w,Colors$( 9,1), 10, 362, 50, 20
STATICTEXT #w,Colors$(10,1), 10, 402, 50, 20
STATICTEXT #w,Tolerances$(1,1), 470, 42, 50, 20
STATICTEXT #w,Tolerances$(2,1), 470, 82, 50, 20
STATICTEXT #w,Tolerances$(3,1), 470, 122, 50, 20
STATICTEXT #w,"K=Kilo " , 500, 300,100, 20
STATICTEXT #w,"M=Mega " , 500, 330,100, 20
STATICTEXT #w,"Light Blue is The Default Color of Resistance " , 500, 360,400, 20
'Band1
groupbox #w.FirstDigit, "First Digit", 70,10,80,430
radiobutton #w.Blackr1 , "", [Band1],[Band1] ,75, 45,20,20'Black=0
radiobutton #w.Brownr1 , "", [Band1],[Band1] ,75, 85,20,20'Brown=1
radiobutton #w.Redr1 , "", [Band1],[Band1] ,75,125,20,20'Red=2
radiobutton #w.Oranger1 , "", [Band1],[Band1] ,75,165,20,20'Orange=3
radiobutton #w.Yellowr1 , "", [Band1],[Band1] ,75,205,20,20'Yellow=4
radiobutton #w.Greenr1 , "", [Band1],[Band1] ,75,245,20,20'Green=5
radiobutton #w.Bluer1 , "", [Band1],[Band1] ,75,285,20,20'Blue=6
radiobutton #w.Violetr1 , "", [Band1],[Band1] ,75,325,20,20'Violet=7
radiobutton #w.Grayr1 , "", [Band1],[Band1] ,75,365,20,20'Gray=8
radiobutton #w.Whiter1 , "", [Band1],[Band1] ,75,405,20,20'White=9
'Band2
groupbox #w.SecondtDigit, "Second Digit", 180,10,80,430
radiobutton #w.Blackr2 , "", [Band2],[Band2] ,185, 45,20,20'Black=0
radiobutton #w.Brownr2 , "", [Band2],[Band2] ,185, 85,20,20'Brown=1
radiobutton #w.Redr2 , "", [Band2],[Band2] ,185,125,20,20'Red=2
radiobutton #w.Oranger2 , "", [Band2],[Band2] ,185,165,20,20'Orange=3
radiobutton #w.Yellowr2 , "", [Band2],[Band2] ,185,205,20,20'Yellow=4
radiobutton #w.Greenr2 , "", [Band2],[Band2] ,185,245,20,20'Green=5
radiobutton #w.Bluer2 , "", [Band2],[Band2] ,185,285,20,20'Blue=6
radiobutton #w.Violetr2 , "", [Band2],[Band2] ,185,325,20,20'Violet=7
radiobutton #w.Grayr2 , "", [Band2],[Band2] ,185,365,20,20'Gray=8
radiobutton #w.Whiter2 , "", [Band2],[Band2] ,185,405,20,20'White=9
'Band3
groupbox #w.Multiplier, "Multiplier", 280,10,80,430
radiobutton #w.Blackr3 , "", [Band3],[Band3] ,285, 45,20,20'Black=0
radiobutton #w.Brownr3 , "", [Band3],[Band3] ,285, 85,20,20'Brown=1
radiobutton #w.Redr3 , "", [Band3],[Band3] ,285,125,20,20'Red=2
radiobutton #w.Oranger3 , "", [Band3],[Band3] ,285,165,20,20'Orange=3
radiobutton #w.Yellowr3 , "", [Band3],[Band3] ,285,205,20,20'Yellow=4
radiobutton #w.Greenr3 , "", [Band3],[Band3] ,285,245,20,20'Green=5
radiobutton #w.Bluer3 , "", [Band3],[Band3] ,285,285,20,20'Blue=6
radiobutton #w.Violetr3 , "", [Band3],[Band3] ,285,325,20,20'Violet=7
radiobutton #w.Grayr3 , "", [Band3],[Band3] ,285,365,20,20'Gray=8
radiobutton #w.Whiter3 , "", [Band3],[Band3] ,285,405,20,20'White=9
'Band4
groupbox #w.Tolerance, "Tolerance", 380,10,80,430
radiobutton #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%
'Fram
graphicbox #w.add, 530,60,292,30'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
stylebits #w.add, 0,_WS_BORDER, 0,0
graphicbox #w.up, 523,53,306,7
stylebits #w.up, 0,_WS_BORDER, 0,0'
graphicbox #w.down, 523,90,306,7
stylebits #w.down, 0,_WS_BORDER, 0,0'
graphicbox #w.side1, 523,53,7,44
stylebits #w.side1, 0,_WS_BORDER, 0,0'
graphicbox #w.adds2, 822,53,7,44
stylebits #w.adds2, 0,_WS_BORDER, 0,0'
'Band1
graphicbox #w.Black1 , 100, 40,30,30
graphicbox #w.Brown1 , 100, 80,30,30
graphicbox #w.Red1 , 100,120,30,30
graphicbox #w.Orange1, 100,160,30,30
graphicbox #w.Yellow1, 100,200,30,30
graphicbox #w.Green1 , 100,240,30,30
graphicbox #w.Blue1 , 100,280,30,30
graphicbox #w.Violet1, 100,320,30,30
graphicbox #w.Gray1 , 100,360,30,30
graphicbox #w.White1 , 100,400,30,30
'Band2
graphicbox #w.Black2 , 210, 40,30,30
graphicbox #w.Brown2 , 210, 80,30,30
graphicbox #w.Red2 , 210,120,30,30
graphicbox #w.Orange2, 210,160,30,30
graphicbox #w.Yellow2, 210,200,30,30
graphicbox #w.Green2 , 210,240,30,30
graphicbox #w.Blue2 , 210,280,30,30
graphicbox #w.Violet2, 210,320,30,30
graphicbox #w.Gray2 , 210,360,30,30
graphicbox #w.White2 , 210,400,30,30
'Band3
graphicbox #w.Black3 , 310, 40,30,30
graphicbox #w.Brown3 , 310, 80,30,30
graphicbox #w.Red3 , 310,120,30,30
graphicbox #w.Orange3, 310,160,30,30
graphicbox #w.Yellow3, 310,200,30,30
graphicbox #w.Green3 , 310,240,30,30
graphicbox #w.Blue3 , 310,280,30,30
graphicbox #w.Violet3, 310,320,30,30
graphicbox #w.Gray3 , 310,360,30,30
graphicbox #w.White3 , 310,400,30,30
'Band4
graphicbox #w.Gold , 410, 40,30,30
graphicbox #w.Silver, 410, 80,30,30
graphicbox #w.None , 410,120,30,30
'Selected Bands of Body Resistance
graphicbox #w.Band1, 155,470,15,35
graphicbox #w.Band2, 185,470,15,35
graphicbox #w.Band3, 215,470,15,35
graphicbox #w.Band4, 255,470,15,35
stylebits #w.Band1, 0,_WS_BORDER,0,0
stylebits #w.Band2, 0,_WS_BORDER,0,0
stylebits #w.Band3, 0,_WS_BORDER,0,0
stylebits #w.Band4, 0,_WS_BORDER,0,0
'General Body Resistance
graphicbox #w.37, 130,470,168,35
stylebits #w.37, 0,_WS_BORDER,0,0
'Terminal Wires
graphicbox #w.42, 80,485,50,5
graphicbox #w.43, 300,485,50,5
open "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 = 1 to 3
FOR Color = 1 to 10
Handle$ = "#w."; Colors$(Color,1); Band
#Handle$ "cls;down;fill "; Colors$(Color,2); ";flush"
NEXT
NEXT
FOR Tolerance = 1 to 3
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$"
select case
case Blackr1$="set"
case1=1
#w.Band1, "home; down; fill 0 0 0;flush"
Band1value=0*10'Black
case Brownr1$="set"
case1=1
#w.Band1, "home; down; fill 170 100 20;flush"
Band1value=1*10'Brown
case Redr1$="set"
case1=1
#w.Band1, "home; down; fill 255 0 0;flush"
Band1value=2*10'Red
case Oranger1$="set"
case1=1
#w.Band1, "home; down; fill 255 180 0;flush"
Band1value=3*10
case Yellowr1$="set"
case1=1
#w.Band1, "home; down; fill 255 255 55;flush"
Band1value=4*10
case Greenr1$="set"
case1=1
#w.Band1, "home; down; fill 45 157 40;flush"
Band1value=5*10
case Bluer1$="set"
case1=1
#w.Band1, "home; down; fill 0 0 255;flush"
Band1value=6*10
case Violetr1$="set"
case1=1
#w.Band1, "home; down; fill 170 0 180;flush"
Band1value=7*10
case Grayr1$="set"
case1=1
#w.Band1, "home; down; fill 127 127 127;flush"
Band1value=8*10
case Whiter1$="set"
case1=1
#w.Band1, "home; down; fill 255 255 255;flush"
Band1value=9*10
case else
wait
end select
[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$"
select case
case Blackr2$="set"
case2=2
#w.Band2, "home; down; fill 0 0 0;flush"
Band2value=0'Black
case Brownr2$="set"
case2=2
#w.Band2, "home; down; fill 170 100 20;flush"
Band2value=1'Brown
case Redr2$="set"
case2=2
#w.Band2, "home; down; fill 255 0 0;flush"
Band2value=2'Red
case Oranger2$="set"
case2=2
#w.Band2, "home; down; fill 255 180 0;flush"
Band2value=3
case Yellowr2$="set"
case2=2
#w.Band2, "home; down; fill 255 255 55;flush"
Band2value=4
case Greenr2$="set"
case2=2
#w.Band2, "home; down; fill 45 157 40;flush"
Band2value=5
case Bluer2$="set"
case2=2
#w.Band2, "home; down; fill 0 0 255;flush"
Band2value=6
case Violetr2$="set"
case2=2
#w.Band2, "home; down; fill 170 0 180;flush"
Band2value=7
case Grayr2$="set"
case2=2
#w.Band2, "home; down; fill 127 127 127;flush"
Band2value=8
case Whiter2$="set"
case2=2
#w.Band2, "home; down; fill 255 255 255;flush"
Band2value=9
case else
wait
end select
[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$"
select case
case Blackr3$="set"
case3=3
#w.Band3, "home; down; fill 0 0 0;flush"
Band3value=1'Black
case Brownr3$="set"
case3=3
#w.Band3, "home; down; fill 170 100 20;flush"
Band3value=10'Brown
case Redr3$="set"
case3=3
#w.Band3, "home; down; fill 255 0 0;flush"
Band3value=100'Red
case Oranger3$="set"
case3=3
#w.Band3, "home; down; fill 255 180 0;flush"
Band3value=1000
case Yellowr3$="set"
case3=3
#w.Band3, "home; down; fill 255 255 55;flush"
Band3value=10000
case Greenr3$="set"
case3=3
#w.Band3, "home; down; fill 45 157 40;flush"
Band3value=100000
case Bluer3$="set"
case3=3
#w.Band3, "home; down; fill 0 0 255;flush"
Band3value=1000000
case Violetr3$="set"
case3=3
#w.Band3, "home; down; fill 170 0 180;flush"
Band3value=10000000
case Grayr3$="set"
case3=3
#w.Band3, "home; down; fill 127 127 127;flush"
Band3value=100000000
case Whiter3$="set"
case3=3
#w.Band3, "home; down; fill 255 255 255;flush"
Band3value=1000000000
case else
if case1= 0 then notice "Please Select Color of Band 1"
wait
end select
vv=(Band1value+Band2value)*Band3value
if vv<=999 then Print #w.Ohm, "Resistance Value=";vv;" Ohm"
if vv>=1000 and vv<=999999 then Print #w.Ohm, "Resistance Value=";vv/1000;" K Ohm"
if vv>=1000000 then Print #w.Ohm, "Resistance Value=";vv/1000000;" M Ohm"
[Band4]
#w.Goldr "value? Goldr$"
#w.Silverr "value? Silverr$"
#w.Noner "value? Noner$"
select case
case Goldr$="set"
'case4=4
#w.Band4, "home; down; fill 250 235 90;flush"
Band4value=5'Black
case Silverr$="set"
'case4=4
#w.Band4, "home; down; fill 200 200 250;flush"
Band4value=10'Brown
case Noner$="set"
'case4=4
#w.Band4, "home; down; fill 21 228 255;flush"
Band4value=20'Brown
case else
'if case4= 0 then notice "Please Select Color of Band 3"
if case2= 0 then notice "Please Select Color of Band 2"
if case1= 0 then notice "Please Select Color of Band 1"
wait
'notice "Please Select Color"
end select
'if case4= 0 then notice "Please Select Color of Band 3"
if Band4value>0 then Print #w.Tole, "Tolerance Value =";" -+ ";Band4value;"%"
wait
[quit]
close #w
END
[[code]]
[[StreamLineCode1|Chapter 1 - Starting the mission]]
**Chapter 2 - Using arrays to reduce redundant code**
[[StreamLineCode3|Chapter 3 - Use variables for duplicate command strings]]
[[StreamLineCode4|Chapter 4 - Consolidate event handlers]]
[[StreamLineCode5|Chapter 5 - Apply mouse selection]]
[[StreamLineCode6|Chapter 6 - Remove radio buttons]]
[[StreamLineCode7|Chapter 7 - Use a single graphics box for the resistor display]]
[[StreamLineCode8|Chapter 8 - Further reduce the amount of GUI controls]]
[[StreamLineCode9|Chapter 9 - Adding some eye-candy]]
[[StreamLineCode10|Chapter 10 - Summary]]