home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / COMAL3-1.DMS / in.adf / CITDemos / Calculator < prev    next >
Encoding:
Text File  |  1993-03-30  |  3.5 KB  |  171 lines

  1. USE CITScreen
  2. USE CITWindow
  3. USE CITGadgets
  4.  
  5. // Initialization variables
  6. DIM Error OF SHORT
  7. DIM i OF SHORT
  8.  
  9. // Working variables
  10. DIM Display OF FLOAT
  11. DIM Register OF FLOAT
  12. DIM Operator OF SHORT
  13. DIM WeightFactor OF FLOAT
  14.  
  15. WeightFactor:=1
  16.  
  17. // Make the calculator window
  18. DIM Calculator OF CITWindow
  19. Calculator.Size(300,150)
  20. Calculator.Position(100,30)
  21. Calculator.Activate
  22. Calculator.DragBar
  23. Calculator.CloseGadget
  24. Calculator.Label("Calculator")
  25. ComalScreen.InsObject(Calculator,Error)
  26.  
  27. // The display is a simple read only text gadget
  28. DIM DisplayText OF TextGadget
  29. DisplayText.Size(250,16)
  30. DisplayText.Position(20,10)
  31. DisplayText.Border
  32. Calculator.InsObject(DisplayText,Error)
  33.  
  34. // Make the clear button
  35. DIM ClearButton OF ButtonGadget
  36. ClearButton.Size(55,12)
  37. ClearButton.Position(215,35)
  38. ClearButton.Label("CLEAR",INSIDE)
  39. ClearButton.EventHandler(ClearEvent())
  40. Calculator.InsObject(ClearButton,Error)
  41.  
  42. // .. all the digit buttons
  43. DIM NumButton(0..9) OF ButtonGadget
  44. FOR i:=0 TO 9 DO
  45.   NumButton(i).Size(55,12)
  46.   NumButton(i).Position(20+(i MOD 3)*65,55+(i DIV 3)*20)
  47.   NumButton(i).EventHandler(NumEvent())
  48.   NumButton(i).Label(CHR$(ORD("0")+((i+1) MOD 10)),INSIDE)
  49.   NumButton(i).Id((1+i) MOD 10)
  50.   Calculator.InsObject(NumButton(i),Error)
  51. ENDFOR i
  52.  
  53. // .. the point button
  54. DIM PointButton OF ButtonGadget
  55. PointButton.Size(55,12)
  56. PointButton.Position(85,115)
  57. PointButton.EventHandler(PointEvent())
  58. PointButton.Label(".",INSIDE)
  59. Calculator.InsObject(PointButton,Error)
  60.  
  61. // .. the '=' button
  62. DIM EqualButton OF ButtonGadget
  63. EqualButton.Size(55,12)
  64. EqualButton.Position(150,115)
  65. EqualButton.EventHandler(EqualEvent())
  66. EqualButton.Label("=",INSIDE)
  67. Calculator.InsObject(EqualButton,Error)
  68.  
  69. // .. and the 4 operator buttons
  70. DIM OperatorButton(0..3) OF ButtonGadget
  71. FOR i:=0 TO 3 DO
  72.   OperatorButton(i).Size(55,12)
  73.   OperatorButton(i).Position(215,55+i*20)
  74.   OperatorButton(i).Id(i+20)
  75.   OperatorButton(i).EventHandler(OperatorEvent())
  76.   CASE i OF
  77.   WHEN 0
  78.     OperatorButton(i).Label("+",INSIDE)
  79.   WHEN 1
  80.     OperatorButton(i).Label("-",INSIDE)
  81.   WHEN 2
  82.     OperatorButton(i).Label("×",INSIDE)
  83.   WHEN 3
  84.     OperatorButton(i).Label("/",INSIDE)
  85.   ENDCASE
  86.   Calculator.InsObject(OperatorButton(i),Error)
  87. ENDFOR i
  88.  
  89. DIGITS 14
  90. WriteDisplay(0)
  91.  
  92. WHILE NOT Calculator.ClosePressed DO WAIT
  93.  
  94. ComalScreen.RemObject(Calculator)
  95.  
  96. // Event procedures
  97.  
  98. PROC NumEvent(Id OF USHORT)
  99.   IF WeightFactor=1 THEN
  100.     Display:=10*Display+Id
  101.   ELSE
  102.     Display:=Display+Id*WeightFactor
  103.     WeightFactor:/10
  104.   ENDIF
  105.   WriteDisplay(Display)
  106. ENDPROC NumEvent
  107.  
  108. PROC PointEvent(Id OF USHORT)
  109.   IF WeightFactor=1 THEN
  110.     WeightFactor:=0.1
  111.   ENDIF
  112. ENDPROC PointEvent
  113.  
  114. PROC EqualEvent(Id OF USHORT)
  115.   Calculate
  116.   Register:=0
  117.   Display:=0
  118.   Operator:=0
  119.   WeightFactor:=1
  120. ENDPROC EqualEvent
  121.  
  122. PROC ClearEvent(Id OF USHORT)
  123.   IF Display=0 THEN
  124.     Register:=0
  125.   ELSE
  126.     Display:=0
  127.   ENDIF
  128.   WriteDisplay(Display)
  129.   WeightFactor:=1
  130. ENDPROC ClearEvent
  131.  
  132. PROC OperatorEvent(Id OF USHORT)
  133.   Calculate
  134.   Register:=Display
  135.   Display:=0
  136.   Operator:=Id
  137.   WeightFactor:=1
  138. ENDPROC OperatorEvent
  139.  
  140.  
  141. // Other procedures
  142.  
  143. PROC Calculate
  144.   CASE Operator OF
  145.   WHEN 20
  146.     Display:=Register+Display
  147.   WHEN 21
  148.     Display:=Register-Display
  149.   WHEN 22
  150.     Display:=Register*Display
  151.   WHEN 23
  152.     IF Display=0 THEN
  153.       DisplayText.Text(SPC$(20)+"E R R O R")
  154.       RETURN
  155.     ELSE
  156.       Display:=Register/Display
  157.     ENDIF
  158.   OTHERWISE
  159.     // No action
  160.   ENDCASE
  161.   WriteDisplay(Display)
  162. ENDPROC Calculate
  163.  
  164. PROC WriteDisplay(Value OF FLOAT)
  165.   LOCAL Text$ OF 29
  166.  
  167.   Text$:=STR$(Value)
  168.   Text$:=SPC$(28-LEN(Text$))+Text$
  169.   DisplayText.Text(Text$)
  170. ENDPROC WriteDisplay
  171.