Older Version
Newer Version
StPendl
Oct 29, 2011
Streamlining your code
Chapter 4 - Consolidate event handlers
-The next thing is to introduce one event handler for all the radio buttons to further simplify our code.
The best way to introduce a single event handler for multiple controls is by using a subroutine, which receives the handle of the control as the first argument.
Parsing the passed handle allows us to determine, which control we have to apply our actions on.
To keep track of the current value of our four bands we introduce four global variables:
GLOBAL Band1value, Band2value, Band3value, Band4value
In a second attempt we replace all the individual set event handlers by our unified subroutine and a dummy event handler for the reset action.
radiobutton #w.Blackr1 , "", SetBandValue,[none] ,75, 45,20,20'Black=0
radiobutton #w.Brownr1 , "", SetBandValue,[none] ,75, 85,20,20'Brown=1
radiobutton #w.Redr1 , "", SetBandValue,[none] ,75,125,20,20'Red=2
radiobutton #w.Oranger1 , "", SetBandValue,[none] ,75,165,20,20'Orange=3
radiobutton #w.Yellowr1 , "", SetBandValue,[none] ,75,205,20,20'Yellow=4
radiobutton #w.Greenr1 , "", SetBandValue,[none] ,75,245,20,20'Green=5
radiobutton #w.Bluer1 , "", SetBandValue,[none] ,75,285,20,20'Blue=6
radiobutton #w.Violetr1 , "", SetBandValue,[none] ,75,325,20,20'Violet=7
radiobutton #w.Grayr1 , "", SetBandValue,[none] ,75,365,20,20'Gray=8
radiobutton #w.Whiter1 , "", SetBandValue,[none] ,75,405,20,20'White=9
' and so forth
We want to utilize the unified event handler for the fourth band too, so we need to change the extension to follow the same naming convention.
radiobutton #w.Goldr4 , "", SetBandValue,[none] ,385, 45,20,20'Gold=5%
radiobutton #w.Silverr4 , "", SetBandValue,[none] ,385, 85,20,20'Silver=10%
radiobutton #w.Noner4 , "", SetBandValue,[none] ,385,125,20,20'None=20%
Now we can replace the four [Band...] event handlers by our single subroutine with heavy use of SELECT..CASE blocks:
[none]
WAIT
[quit]
close #w
END
SUB SetBandValue Handle$
' parse handle of calling control
Band = val(Right$(Handle$, 1))
ColorName$ = Mid$(Handle$, 4, Len(Handle$)-5)
' get position of color
FOR i = 1 to 10
if Colors$(i,1) = ColorName$ then exit for
if i < 4 then if Tolerances$(i,1) = ColorName$ then exit for
NEXT
' if we had no match exit
If i = 11 Then Exit Sub
' calculate the values
Select Case Band
Case 1
Band1value = (i-1) * 10
Case 2
Band2value = i-1
Case 3
Band3value = 10 ^ (i-1)
Case 4
Band4value = i*5
if Band4value = 15 then Band4value = 20
Case Else
Exit Sub
End Select
' get the band color
Select Case Band
Case 1, 2, 3
ColorValue$ = Colors$(i,2)
Case 4
ColorValue$ = Tolerances$(i,2)
Case Else
Exit Sub
End Select
GBhandle$ = "#w.Band"; Band
#GBhandle$ "cls;down;fill "; ColorValue$; ";flush"
vv=(Band1value+Band2value)*Band3value
Select Case
Case vv>=1000000
#w.Ohm "Resistance Value=";vv/1000000;" M Ohm"
Case vv>=1000
#w.Ohm "Resistance Value=";vv/1000;" K Ohm"
Case Else
#w.Ohm "Resistance Value=";vv;" Ohm"
End Select
if Band4value>0 then #w.Tole "Tolerance Value =";" +/- ";Band4value;"%"
END SUB
The complete code now looks like this.
'Resistor Calculator.bas
'Author: salaion Yahoo! Group
'Date: 27.11.10
'
' List of Colors at http://en.wikipedia.org/wiki/List_of_colors
'
' 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
' 27.11.10 00:34:07 - replaced duplicate command strings by variables
' 27.11.10 02:22:16 - consolidated event handler
nomainwin
WindowWidth = 850:WindowHeight = 600
UpperLeftX=int( (DisplayWidth- WindowWidth) /2)
UpperLeftY=int( (DisplayHeight- WindowHeight) /2)
BackgroundColor$ = "green"
GLOBAL Band1value, Band2value, Band3value, Band4value
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 0"
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", "212 175 55"
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 , "", SetBandValue,[none] ,75, 45,20,20'Black=0
radiobutton #w.Brownr1 , "", SetBandValue,[none] ,75, 85,20,20'Brown=1
radiobutton #w.Redr1 , "", SetBandValue,[none] ,75,125,20,20'Red=2
radiobutton #w.Oranger1 , "", SetBandValue,[none] ,75,165,20,20'Orange=3
radiobutton #w.Yellowr1 , "", SetBandValue,[none] ,75,205,20,20'Yellow=4
radiobutton #w.Greenr1 , "", SetBandValue,[none] ,75,245,20,20'Green=5
radiobutton #w.Bluer1 , "", SetBandValue,[none] ,75,285,20,20'Blue=6
radiobutton #w.Violetr1 , "", SetBandValue,[none] ,75,325,20,20'Violet=7
radiobutton #w.Grayr1 , "", SetBandValue,[none] ,75,365,20,20'Gray=8
radiobutton #w.Whiter1 , "", SetBandValue,[none] ,75,405,20,20'White=9
'Band2
groupbox #w.SecondtDigit, "Second Digit", 180,10,80,430
radiobutton #w.Blackr2 , "", SetBandValue,[none] ,185, 45,20,20'Black=0
radiobutton #w.Brownr2 , "", SetBandValue,[none] ,185, 85,20,20'Brown=1
radiobutton #w.Redr2 , "", SetBandValue,[none] ,185,125,20,20'Red=2
radiobutton #w.Oranger2 , "", SetBandValue,[none] ,185,165,20,20'Orange=3
radiobutton #w.Yellowr2 , "", SetBandValue,[none] ,185,205,20,20'Yellow=4
radiobutton #w.Greenr2 , "", SetBandValue,[none] ,185,245,20,20'Green=5
radiobutton #w.Bluer2 , "", SetBandValue,[none] ,185,285,20,20'Blue=6
radiobutton #w.Violetr2 , "", SetBandValue,[none] ,185,325,20,20'Violet=7
radiobutton #w.Grayr2 , "", SetBandValue,[none] ,185,365,20,20'Gray=8
radiobutton #w.Whiter2 , "", SetBandValue,[none] ,185,405,20,20'White=9
'Band3
groupbox #w.Multiplier, "Multiplier", 280,10,80,430
radiobutton #w.Blackr3 , "", SetBandValue,[none] ,285, 45,20,20'Black=0
radiobutton #w.Brownr3 , "", SetBandValue,[none] ,285, 85,20,20'Brown=1
radiobutton #w.Redr3 , "", SetBandValue,[none] ,285,125,20,20'Red=2
radiobutton #w.Oranger3 , "", SetBandValue,[none] ,285,165,20,20'Orange=3
radiobutton #w.Yellowr3 , "", SetBandValue,[none] ,285,205,20,20'Yellow=4
radiobutton #w.Greenr3 , "", SetBandValue,[none] ,285,245,20,20'Green=5
radiobutton #w.Bluer3 , "", SetBandValue,[none] ,285,285,20,20'Blue=6
radiobutton #w.Violetr3 , "", SetBandValue,[none] ,285,325,20,20'Violet=7
radiobutton #w.Grayr3 , "", SetBandValue,[none] ,285,365,20,20'Gray=8
radiobutton #w.Whiter3 , "", SetBandValue,[none] ,285,405,20,20'White=9
'Band4
groupbox #w.Tolerance, "Tolerance", 380,10,80,430
radiobutton #w.Goldr4 , "", SetBandValue,[none] ,385, 45,20,20'Gold=5%
radiobutton #w.Silverr4 , "", SetBandValue,[none] ,385, 85,20,20'Silver=10%
radiobutton #w.Noner4 , "", SetBandValue,[none] ,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"
CommandString$ = "cls;down;fill blue;flush"
#w.up CommandString$
#w.down CommandString$
#w.side1 CommandString$
#w.adds2 CommandString$
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
'Color of Terminal Wires
CommandString$ = "cls; down; fill 127 127 127;flush"
#w.42 CommandString$
#w.43 CommandString$
'General Body Resistance Color
CommandString$ = "cls; down; fill 21 228 255;flush" 'light blue
#w.37 CommandString$
#w.Band1 CommandString$
#w.Band2 CommandString$
#w.Band3 CommandString$
#w.Band4 CommandString$
[none]
WAIT
[quit]
close #w
END
SUB SetBandValue Handle$
' parse handle of calling control
Band = val(Right$(Handle$, 1))
ColorName$ = Mid$(Handle$, 4, Len(Handle$)-5)
' get position of color
FOR i = 1 to 10
if Colors$(i,1) = ColorName$ then exit for
if i < 4 then if Tolerances$(i,1) = ColorName$ then exit for
NEXT
' if we had no match exit
If i = 11 Then Exit Sub
Select Case Band
Case 1
Band1value = (i-1) * 10
Case 2
Band2value = i-1
Case 3
Band3value = 10 ^ (i-1)
Case 4
Band4value = i*5
if Band4value = 15 then Band4value = 20
Case Else
Exit Sub
End Select
Select Case Band
Case 1, 2, 3
ColorValue$ = Colors$(i,2)
Case 4
ColorValue$ = Tolerances$(i,2)
Case Else
Exit Sub
End Select
GBhandle$ = "#w.Band"; Band
#GBhandle$ "cls;down;fill "; ColorValue$; ";flush"
vv=(Band1value+Band2value)*Band3value
Select Case
Case vv>=1000000
#w.Ohm "Resistance Value=";vv/1000000;" M Ohm"
Case vv>=1000
#w.Ohm "Resistance Value=";vv/1000;" K Ohm"
Case Else
#w.Ohm "Resistance Value=";vv;" Ohm"
End Select
if Band4value>0 then #w.Tole "Tolerance Value =";" +/- ";Band4value;"%"
END SUB
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