Streamlining your code

Chapter 3 - Use variables for duplicate command strings

- StPendl StPendl Oct 29, 2011
On a second glance we can see some places, where redundant graphics command strings are used.
To reduce the amount of work to change them, we introduce string variables that hold the command strings.

This way the following lines of code:
    #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"
 
    '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"

Will be replaced by their equivalents where only one line has to be changed:
    CommandString$ = "cls;down;fill blue;flush"
    #w.up    CommandString$
    #w.down  CommandString$
    #w.side1 CommandString$
    #w.adds2 CommandString$
 
    '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$

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 boxes
    ' 27.11.10 00:34:07 - replaced duplicate command strings by variables
 
    nomainwin
    WindowWidth = 850:WindowHeight = 600
    UpperLeftX=int( (DisplayWidth- WindowWidth) /2)
    UpperLeftY=int( (DisplayHeight- WindowHeight) /2)
    BackgroundColor$ = "green"
 
    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"
 
    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$
 
[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

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 (Using hot-spots)
Chapter 9 - Adding some eye-candy
Chapter 10 - Summary