Streamlining your code

Chapter 9 - Adding some eye-candy

- StPendl StPendl Oct 29, 2011
To make the resistor look more real we now add some rounded ends to it.

Code for rounded ends:
    'Draw Body
    #w.resistor "color 21 228 255;backcolor 21 228 255"
    #w.resistor "place "; 50+CenterY; " "; CenterY; ";circlefilled "; CenterY
    #w.resistor "place "; BoxWidth-50-CenterY; " "; CenterY; ";circlefilled "; CenterY
    #w.resistor "place "; 50+CenterY; " 0;boxfilled "; BoxWidth-50-CenterY; " "; BoxHeight

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
    '
    ' always take the time for some sleep or you will make things worse ;-)
    '
    ' 27.11.10 10:56:24 - removed radio buttons
    ' 27.11.10 11:53:34 - used single graphics box for resistor
    ' 27.11.10 13:09:19 - now using the bare minimum of GUI controls
    ' 27.11.10 13:14:19 - now displaying a resistor with rounded ends
 
    nomainwin
    WindowWidth = 820:WindowHeight = 600
    UpperLeftX=int( (DisplayWidth- WindowWidth) /2)
    UpperLeftY=int( (DisplayHeight- WindowHeight) /2)
    BackgroundColor$ = "green"
 
    ' define variables to be remembered between calling the sub
    GLOBAL Band1value, Band2value, Band3value, Band4value
    GLOBAL ColorValue1$, ColorValue2$, ColorValue3$, ColorValue4$
 
    ' set initial band color to body color
    ColorValue1$ = "21 228 255"
    ColorValue2$ = ColorValue1$
    ColorValue3$ = ColorValue1$
    ColorValue4$ = ColorValue1$
 
    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), 420,  42, 50, 20
    STATICTEXT #w,Tolerances$(2,1), 420,  82, 50, 20
    STATICTEXT #w,Tolerances$(3,1), 420, 122, 50, 20
 
    STATICTEXT #w,"K=Kilo " , 470, 300,100, 20
    STATICTEXT #w,"M=Mega " , 470, 330,100, 20
    STATICTEXT #w,"Light Blue is The Default Color of Resistance " , 470, 360,400, 20
 
    'Band1
    STATICTEXT #w, "First Digit",  70,  7, 80, 20
    groupbox   #w, "",             70, 20, 70,420
    graphicbox #w.Band1 ,          90, 40, 30,390
    stylebits  #w.Band1, 0,_WS_BORDER, 0,0
 
    'Band2
    STATICTEXT #w, "Second Digit", 150,  7, 90, 20
    groupbox   #w, "",             160, 20, 70,420
    graphicbox #w.Band2 ,          180, 40, 30,390
    stylebits  #w.Band2, 0,_WS_BORDER, 0,0
 
    'Band3
    STATICTEXT #w, "Multiplier",   250,  7, 80, 20
    groupbox   #w, "",             250, 20, 70,420
    graphicbox #w.Band3 ,          270, 40, 30,390
    stylebits  #w.Band3, 0,_WS_BORDER, 0,0
 
    'Band4
    STATICTEXT #w, "Tolerance",    340,  7, 80, 20
    groupbox   #w, "",             340, 20, 70,420
    graphicbox #w.Band4 ,          360, 40, 30,110
    stylebits  #w.Band4, 0,_WS_BORDER, 0,0
 
    'Fram
    graphicbox #w.title, 488,53,306,44
    stylebits  #w.title, 0,_WS_BORDER, 0,0
 
    'General Body Resistance
    graphicbox #w.resistor, 80,470,270,35
    stylebits  #w.resistor, 0,_WS_BORDER,0,0
 
    open "Resistor Calculator" for window_nf as #w
    #w "trapclose [quit]"
    #w "font Times_New_Roman 13"
 
    #w.title "cls;down;color blue;backcolor yellow;size 15;place 0 0;boxfilled 306 44"
    #w.title "font Times_New_Roman 16 bold;color red"
    #w.title "place 13 28;\Resistor Color Code of 4 Bands"
    #w.title "flush"
 
    ' create color fields
    FOR Band = 1 to 4
        Handle$ = "#w.Band"; Band
 
        #Handle$ "cls;down;fill "; BackgroundColor$
        #Handle$ "when leftButtonUp MouseClick"
 
        FOR Color = 1 to 10
            if Band = 4 then
                if Color > 3 then exit for
 
                #Handle$ "backcolor "; Tolerances$(Color,2)
            else
                #Handle$ "backcolor "; Colors$(Color,2)
            end if
 
            #Handle$ "place 0 "; 40*(Color-1); ";boxfilled 30 "; 40*(Color-1)+30
        NEXT
 
        #Handle$ "flush"
 
        ' apply initial settings
        if Band = 4 then
            call MouseClick Handle$, 0, 95
        else
            call MouseClick Handle$, 0, 15
        end if
    NEXT
 
[none]
    WAIT
 
[quit]
    close #w
    END
 
SUB MouseClick Handle$, PosX, PosY
    ' parse handle of calling control
    Band = val(Right$(Handle$, 1))
 
    ' get position of color
    ColorIndex = int(PosY/40)+1
 
    Select Case Band
        Case 1
        Band1value = (ColorIndex-1) * 10
        ColorValue1$ = Colors$(ColorIndex,2)
 
        Case 2
        Band2value = ColorIndex-1
        ColorValue2$ = Colors$(ColorIndex,2)
 
        Case 3
        Band3value = 10 ^ (ColorIndex-1)
        ColorValue3$ = Colors$(ColorIndex,2)
 
        Case 4
        Band4value = ColorIndex*5
        if Band4value = 15 then Band4value = 20
        ColorValue4$ = Tolerances$(ColorIndex,2)
 
        Case Else
        Exit Sub
    End Select
 
    'Draw Resistor
    #w.resistor "cls;down;home;posxy CenterX CenterY;fill "; BackgroundColor$
    BoxWidth  = CenterX*2
    BoxHeight = CenterY*2
 
    'Draw Wire
    #w.resistor "color 127 127 127;backcolor 127 127 127"
    #w.resistor "place 0 "; CenterY-2; ";boxfilled "; BoxWidth; " "; CenterY+2
 
    'Draw Body
    #w.resistor "color 21 228 255;backcolor 21 228 255"
    #w.resistor "place "; 50+CenterY; " "; CenterY; ";circlefilled "; CenterY
    #w.resistor "place "; BoxWidth-50-CenterY; " "; CenterY; ";circlefilled "; CenterY
    #w.resistor "place "; 50+CenterY; " 0;boxfilled "; BoxWidth-50-CenterY; " "; BoxHeight
 
    'Draw Bands
    #w.resistor "color "; ColorValue1$; ";backcolor "; ColorValue1$
    #w.resistor "place 70 0;boxfilled 85 "; BoxHeight
 
    #w.resistor "color "; ColorValue2$; ";backcolor "; ColorValue2$
    #w.resistor "place 100 0;boxfilled 115 "; BoxHeight
 
    #w.resistor "color "; ColorValue3$; ";backcolor "; ColorValue3$
    #w.resistor "place 130 0;boxfilled 145 "; BoxHeight
 
    #w.resistor "color "; ColorValue4$; ";backcolor "; ColorValue4$
    #w.resistor "place 160 0;boxfilled 175 "; BoxHeight
 
    #w.resistor "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 (Using hot-spots)
Chapter 9 - Adding some eye-candy
Chapter 10 - Summary