Sylvain and fellow FBers,
The following shell is strictly a work in progress undertaken as a
programming exercise using some Appearance Manager (v1.4) controls
from Mac OS 8.
One problem is the Expander Arrow control which opens the printable
ribbon window. It is on a white background, and I do not know how to
change it to the window color. Instead, I have disguised it here with
some lines, but would like to know how handle it properly.
p.s. Any hints for adding the math functions to make this thing
actually work will be appreciated! I have been experimenting with
arrays, DATA structures, linked lists, etc. I readily acknowledge
that this code is very loose and can stand a good optimizing (or
maybe a good trashing!) I am in severe brain drain now and can no
longer see the forest for the trees. How do I put two lines of code
in an Edit Field and add them?!? For that matter, how do I put one
line of numbers in a EF and call it back later? How do I use an Enter
key? What is 1+1?
I'mmm mmmeeelllltttingggg...
Please adjust code for e-mail line breaks:
'----------------- Begin ---------------------
'This calculator/keypad shell is coded
'in FutureBASIC II by Ken Shmidheiser,
'September 1999. It uses Appearance
'Manager compliant controls for Mac OS 8
'or above.
'----------------- Constants -----------------
_numField = 4
_alphaField = 8
_gZero = 48 'ASCII key
equivalents for keypad
_gOne = 49
_gTwo = 50
_gThree = 51
_gFour = 52
_gFive = 53
_gSix = 54
_gSeven = 55
_gEight = 56
_gNine = 57
_gMultiply = 42
_gPlus = 43
_gMinus = 45
_gDivide = 47
_gDecimal = 46
_gReturn = 13
_gEnter = 3
_gClear = 27
_gEquals = 61
_gExpandArrows = 65
'----------------- Globals -------------------
DIM gProgramEnds
DIM gKeyPress%
DIM gBtnClick%
END GLOBALS
'----------------- Functions -----------------
CLEAR LOCAL
DIM rect;8
LOCAL FN mainRefresh 'This function adds
refreshable background color
CALL SETRECT(rect, 0, 0, 460, 300) 'Background color
rectangle same size as main window
PEN 0, 0,1, 8, 0
LONG COLOR -13000,-14660,-14660 'Mid-gray
CALL PAINTRECT(rect)
PEN 0, 0,1, 8, 0
LONG COLOR 0, 0, 0
CALL FRAMERECT(rect)
CALL PENNORMAL:COLOR=_zBlack
PLOT 212,41 TO 212,55 'Left
PEN 1,1
PLOT 212,41 TO 225,41 'Top
PLOT 225,41 TO 225,55 'Right
PLOT 212,55 TO 225,55 'Bottom
END FN
CLEAR LOCAL
DIM rect.8
LOCAL FN mainBuild
WINDOW # -1,"Ken's Calculator",( 0, 0)-( 246, 300),_docNoGrow, 1
APPLE MENU "(Ken's Demo Calculator"
MENU 1,0, _enable, "File"
MENU 1,1, _enable, "Quit /Q"
EDIT MENU 2
EDIT = 6
TEXT _geneva,13,0,0:COLOR=_zBlack
EDIT FIELD -1,"",( 45, 40)-( 200, 60),_framed, _rightJust +
_numField'Number Fields are 4, alpha fields are 8
EDIT FIELD 2,"",( 45, 13)-( 200, 28),_framedNoCR, _rightJust +
_numField'Number Fields are 4, alpha fields are 8
EDIT FIELD -4,"",(260,40)-(410,275),_framed, _rightJust'+
_numField'Number Fields are 4, alpha fields are 8
SCROLL BUTTON -4,1,1,1,20,(415,34)-(431,281),_scrollOther
TEXT _sysFont,12,0,0:COLOR=_zBlack
BUTTON _gClear, 1,"Clear",( 38, 70)-( 80, 112),35
BUTTON _gEquals, 1,"=",( 80, 70)-( 122, 112),35
BUTTON _gDivide, 1,"/",( 122, 70)-( 166, 112),35
BUTTON _gMultiply, 1,"*",( 166, 70)-( 208, 112),35
BUTTON _gSeven, 1,"7",( 38, 112)-( 80, 154),35
BUTTON _gEight, 1,"8",( 80, 112)-( 122, 154),35
BUTTON _gNine, 1,"9",( 122, 112)-( 166, 154),35
BUTTON _gMinus, 1,"-",( 166, 112)-( 208, 154),35
BUTTON _gFour, 1,"4",( 38, 154)-( 80, 196),35
BUTTON _gFive, 1,"5",( 80, 154)-( 122, 196),35
BUTTON _gSix, 1,"6",( 122, 154)-( 166, 196),35
BUTTON _gPlus, 1,"+",( 166, 154)-( 208, 196),35
BUTTON _gOne, 1,"1",( 38, 196)-( 80, 238),35
BUTTON _gTwo, 1,"2",( 80, 196)-( 122, 238),35
BUTTON _gThree, 1,"3",( 122, 196)-( 166, 238),35
BUTTON _gZero, 1,"0",( 38, 238)-( 122, 280),35
BUTTON _gDecimal, 1,".",( 122, 238)-( 166, 280),35
BUTTON _gEnter, 1,"Enter",( 166, 196)-( 208, 280),35
BUTTON _gExpandArrows, _activeBtn, "", (213,43)-(225,55),
65'Appearance compliant expander arrows (64 + 1 = 65)
EDIT FIELD 1
WINDOW 1
END FN
CLEAR LOCAL
DIM rect.8
LOCAL FN twoBuild
WINDOW # -1,"Ken's Calculator",( 0, 0)-( 460, 300),_docNoGrow, 1
APPLE MENU "(Ken's Demo Calculator"
MENU 1,0, _enable, "File"
MENU 1,1, _enable, "Quit /Q"
EDIT MENU 2
EDIT = 6
TEXT _geneva,13,0,0:COLOR=_zBlack
EDIT FIELD -1,"",( 45, 40)-( 200, 60),_framed, _rightJust +
_numField'Number Fields are 4, alpha fields are 8
EDIT FIELD 2,"",( 45, 13)-( 200, 28),_framedNoCR, _rightJust +
_numField'Number Fields are 4, alpha fields are 8
EDIT FIELD -4,"",(260,40)-(410,275),_framed, _rightJust'+
_numField'Number Fields are 4, alpha fields are 8
SCROLL BUTTON -4,1,1,1,20,(415,34)-(431,281),_scrollOther
TEXT _sysFont,12,0,0:COLOR=_zBlack
BUTTON _gClear, 1,"Clear",( 38, 70)-( 80, 112),35
BUTTON _gEquals, 1,"=",( 80, 70)-( 122, 112),35
BUTTON _gDivide, 1,"/",( 122, 70)-( 166, 112),35
BUTTON _gMultiply, 1,"*",( 166, 70)-( 208, 112),35
BUTTON _gSeven, 1,"7",( 38, 112)-( 80, 154),35
BUTTON _gEight, 1,"8",( 80, 112)-( 122, 154),35
BUTTON _gNine, 1,"9",( 122, 112)-( 166, 154),35
BUTTON _gMinus, 1,"-",( 166, 112)-( 208, 154),35
BUTTON _gFour, 1,"4",( 38, 154)-( 80, 196),35
BUTTON _gFive, 1,"5",( 80, 154)-( 122, 196),35
BUTTON _gSix, 1,"6",( 122, 154)-( 166, 196),35
BUTTON _gPlus, 1,"+",( 166, 154)-( 208, 196),35
BUTTON _gOne, 1,"1",( 38, 196)-( 80, 238),35
BUTTON _gTwo, 1,"2",( 80, 196)-( 122, 238),35
BUTTON _gThree, 1,"3",( 122, 196)-( 166, 238),35
BUTTON _gZero, 1,"0",( 38, 238)-( 122, 280),35
BUTTON _gDecimal, 1,".",( 122, 238)-( 166, 280),35
BUTTON _gEnter, 1,"Enter",( 166, 196)-( 208, 280),35
BUTTON _gExpandArrows, _markedBtn, "", (213,43)-(225,55),
65'Appearance compliant expander arrows (64 + 1 = 65)
EDIT FIELD 1
WINDOW 1
END FN
LOCAL FN doMath
EDIT$(2) = "Math function goes here."
EDIT$(4) = "Math function goes here."
END FN
LOCAL FN errorWarning
BEEP
END FN
LOCAL FN checkKeys
EFnum = WINDOW(_EFnum) 'Figures out what
window it's looking at
key$ = TEKEY$ 'Once it has the
window, grabs keystrokes for massaging
SELECT WINDOW(_EFclass)/4 'Check for the
right kind of window
LONG IF ASC(key$) => ASC("0") AND ASC(key$) <=ASC("9") OR
ASC(key$) = 46'Numbers and decimal point
TEKEY$ = key$
XELSE
'FN errorWarning
END IF
gKeyPress% = ASC(key$)
LONG IF ASC(STR$(gKeyPress%)) 'Push button
feedback for number keys
BUTTON gKeyPress%, 2 : DELAY 50 : BUTTON gKeyPress%, 1
XELSE
FN errorWarning
END IF
LONG IF ASC(key$) = _gPlus
'plus$ = EDIT$(1) + CHR$(_gPlus) + CHR$(13) + CHR$(13) + "OK"
'TEKEY$ = plus$
EDIT$(2) = "Plus key pressed"
EDIT$(4) = "Plus key pressed"
DELAY 800
FN doMath
XELSE
END IF
LONG IF ASC(key$) = _gMinus
EDIT$(2) = "Minus key pressed"
EDIT$(4) = "Minus key pressed"
DELAY 800
FN doMath
XELSE
END IF
LONG IF ASC(key$) = _gMultiply
EDIT$(2) = "Multiply key pressed"
EDIT$(4) = "Multiply key pressed"
DELAY 800
FN doMath
XELSE
END IF
LONG IF ASC(key$) = _gDivide
EDIT$(2) = "Divide key pressed"
EDIT$(4) = "Divide key pressed"
DELAY 800
FN doMath
XELSE
END IF
LONG IF ASC(key$) = _gEquals
EDIT$(2) = "Equals key pressed"
EDIT$(4) = "Equals key pressed"
DELAY 800
FN doMath
XELSE
END IF
LONG IF ASC(key$) = _gEnter
EDIT$(2) = "Enter key pressed"
EDIT$(4) = "Enter key pressed"
DELAY 800
FN doMath
XELSE
END IF
END SELECT
END FN
LOCAL FN doDialog
evnt = DIALOG(0)
id = DIALOG(evnt)
key$ = TEKEY$
SELECT CASE evnt
CASE _btnClick
SELECT CASE id
CASE _gZero
TEKEY$ = "0"
CASE _gOne
TEKEY$ = "1"
CASE _gTwo
TEKEY$ = "2"
CASE _gThree
TEKEY$ = "3"
CASE _gFour
TEKEY$ = "4"
CASE _gFive
TEKEY$ = "5"
CASE _gSix
TEKEY$ = "6"
CASE _gSeven
TEKEY$ = "7"
CASE _gEight
TEKEY$ = "8"
CASE _gNine
TEKEY$ = "9"
CASE _gDecimal
TEKEY$ = "."
CASE _gClear
EDIT$(1) = ""
EDIT$(2) = ""
EDIT$(4) = "" 'Clears the input field
BUTTON _gClear, 2 : DELAY 50 : BUTTON _gClear, 1'Highlights
the Clear button
CASE _gPlus
EDIT$(2) = "Plus button clicked"
EDIT$(4) = "Plus button clicked"
DELAY 800
FN doMath
CASE _gMinus
EDIT$(2) = "Minus button clicked"
EDIT$(4) = "Minus button clicked"
DELAY 800
FN doMath
CASE _gMultiply
EDIT$(2) = "Multiply button clicked"
EDIT$(4) = "Multiply button clicked"
DELAY 800
FN doMath
CASE _gDivide
EDIT$(2) = "Divide button clicked"
EDIT$(4) = "Divide button clicked"
DELAY 800
FN doMath
CASE _gEquals
EDIT$(2) = "Equals button clicked"
EDIT$(4) = "Equals button clicked"
DELAY 800
FN doMath
CASE _gEnter
EDIT$(2) = "Enter _gEnter button clicked"
EDIT$(4) = "Enter _gEnter button clicked"
DELAY 800
FN doMath
BUTTON _gEnter, 2 : DELAY 50 : BUTTON _gEnter, 1'Highlights
the Enter button
CASE _gExpandArrows
SELECT CASE BUTTON(_gExpandArrows)
CASE _activeBtn
BUTTON _gExpandArrows, _markedBtn
WINDOW CLOSE 1
FN twoBuild
CASE _markedBtn
BUTTON _gExpandArrows, _activeBtn
WINDOW CLOSE 1
FN mainBuild
END SELECT
END SELECT
CASE _efReturn
SELECT CASE BUTTON(_efReturn)
CASE 1
EDIT$(2) = "Enter _efReturn button pushed"
EDIT$(4) = "Enter _efReturn button pushed"
DELAY 800
FN doMath
BUTTON _gEnter, 2 : DELAY 50 : BUTTON _gEnter, 1'Highlights
the Enter button
CASE ELSE
END SELECT
CASE _efClear
EDIT$(1) = ""
EDIT$(2) = "" 'Clears the input field
EDIT$(4) = ""
BUTTON _gClear, 2 : DELAY 50 : BUTTON _gClear, 1'Highlights the
Clear button
CASE _wndClose 'When calculator
window closes, program ends
gProgramEnds = _true
CASE _wndRefresh 'In this app calls
the mid-gray background color
FN mainRefresh
END SELECT
END FN
LOCAL FN doMenu
menuID = MENU(_menuID)
itemID = MENU(_itemID)
SELECT CASE
CASE _menuID = 1 AND _itemID = 1
gProgramEnds = _true
CASE ELSE
END SELECT
END FN
'----------------- Main -----------------
WINDOW OFF
COORDINATE WINDOW
ON EDIT FN checkKeys
ON DIALOG FN doDialog
ON MENU FN doMenu
FN mainBuild
DO
HANDLEEVENTS
UNTIL gProgramEnds
'----------------- End ---------------------