home *** CD-ROM | disk | FTP | other *** search
/ Dr. CD ROM (Annual Premium Edition) / premium.zip / premium / REFERENC / RPNCAL.ZIP / RPNCALC.FRM < prev    next >
Text File  |  1993-05-17  |  16KB  |  585 lines

  1. VERSION 2.00
  2. Begin Form Calculator 
  3.    BackColor       =   &H00C0C000&
  4.    BorderStyle     =   1  'Fixed Single
  5.    Caption         =   "RPN Calculator"
  6.    FontBold        =   -1  'True
  7.    FontItalic      =   0   'False
  8.    FontName        =   "System"
  9.    FontSize        =   9.75
  10.    FontStrikethru  =   0   'False
  11.    FontUnderline   =   0   'False
  12.    Height          =   4065
  13.    Icon            =   RPNCALC.FRX:0000
  14.    KeyPreview      =   -1  'True
  15.    Left            =   1110
  16.    LinkMode        =   1  'Source
  17.    LinkTopic       =   "Form1"
  18.    MaxButton       =   0   'False
  19.    ScaleHeight     =   3540
  20.    ScaleWidth      =   3690
  21.    Top             =   3390
  22.    Width           =   3810
  23.    Begin CommandButton Enter 
  24.       Caption         =   "Enter"
  25.       Default         =   -1  'True
  26.       Height          =   1095
  27.       Left            =   1920
  28.       TabIndex        =   1
  29.       Top             =   2400
  30.       Width           =   495
  31.    End
  32.    Begin CommandButton LastX 
  33.       Caption         =   "L"
  34.       Height          =   495
  35.       Left            =   3120
  36.       TabIndex        =   0
  37.       Top             =   1800
  38.       Width           =   495
  39.    End
  40.    Begin CheckBox FixDec 
  41.       Caption         =   "Check1"
  42.       Height          =   255
  43.       Left            =   240
  44.       TabIndex        =   2
  45.       TabStop         =   0   'False
  46.       Top             =   840
  47.       Width           =   255
  48.    End
  49.    Begin CommandButton Number 
  50.       Caption         =   "7"
  51.       Height          =   480
  52.       Index           =   7
  53.       Left            =   120
  54.       TabIndex        =   3
  55.       TabStop         =   0   'False
  56.       Top             =   1200
  57.       Width           =   480
  58.    End
  59.    Begin CommandButton Number 
  60.       Caption         =   "8"
  61.       Height          =   480
  62.       Index           =   8
  63.       Left            =   720
  64.       TabIndex        =   4
  65.       TabStop         =   0   'False
  66.       Top             =   1200
  67.       Width           =   480
  68.    End
  69.    Begin CommandButton Number 
  70.       Caption         =   "9"
  71.       Height          =   480
  72.       Index           =   9
  73.       Left            =   1320
  74.       TabIndex        =   5
  75.       TabStop         =   0   'False
  76.       Top             =   1200
  77.       Width           =   480
  78.    End
  79.    Begin CommandButton Number 
  80.       Caption         =   "4"
  81.       Height          =   480
  82.       Index           =   4
  83.       Left            =   120
  84.       TabIndex        =   6
  85.       TabStop         =   0   'False
  86.       Top             =   1800
  87.       Width           =   480
  88.    End
  89.    Begin CommandButton Number 
  90.       Caption         =   "5"
  91.       Height          =   480
  92.       Index           =   5
  93.       Left            =   720
  94.       TabIndex        =   7
  95.       TabStop         =   0   'False
  96.       Top             =   1800
  97.       Width           =   480
  98.    End
  99.    Begin CommandButton Number 
  100.       Caption         =   "6"
  101.       Height          =   480
  102.       Index           =   6
  103.       Left            =   1320
  104.       TabIndex        =   8
  105.       TabStop         =   0   'False
  106.       Top             =   1800
  107.       Width           =   480
  108.    End
  109.    Begin CommandButton Number 
  110.       Caption         =   "1"
  111.       Height          =   480
  112.       Index           =   1
  113.       Left            =   120
  114.       TabIndex        =   9
  115.       TabStop         =   0   'False
  116.       Top             =   2400
  117.       Width           =   480
  118.    End
  119.    Begin CommandButton Number 
  120.       Caption         =   "2"
  121.       Height          =   480
  122.       Index           =   2
  123.       Left            =   720
  124.       TabIndex        =   10
  125.       TabStop         =   0   'False
  126.       Top             =   2400
  127.       Width           =   480
  128.    End
  129.    Begin CommandButton Number 
  130.       Caption         =   "3"
  131.       Height          =   480
  132.       Index           =   3
  133.       Left            =   1320
  134.       TabIndex        =   11
  135.       TabStop         =   0   'False
  136.       Top             =   2400
  137.       Width           =   480
  138.    End
  139.    Begin CommandButton Number 
  140.       Caption         =   "0"
  141.       Height          =   480
  142.       Index           =   0
  143.       Left            =   120
  144.       TabIndex        =   12
  145.       TabStop         =   0   'False
  146.       Top             =   3000
  147.       Width           =   1080
  148.    End
  149.    Begin CommandButton Decimal 
  150.       Caption         =   "."
  151.       Height          =   480
  152.       Left            =   1320
  153.       TabIndex        =   13
  154.       TabStop         =   0   'False
  155.       Top             =   3000
  156.       Width           =   480
  157.    End
  158.    Begin Image Pi 
  159.       Height          =   480
  160.       Left            =   3120
  161.       Picture         =   RPNCALC.FRX:0302
  162.       Top             =   600
  163.       Width           =   480
  164.    End
  165.    Begin Image XSquare 
  166.       Height          =   480
  167.       Left            =   3120
  168.       Picture         =   RPNCALC.FRX:0604
  169.       Top             =   1200
  170.       Width           =   480
  171.    End
  172.    Begin Label LabelFix 
  173.       Alignment       =   2  'Center
  174.       BackColor       =   &H00C0C000&
  175.       Caption         =   "Fix 4"
  176.       FontBold        =   -1  'True
  177.       FontItalic      =   0   'False
  178.       FontName        =   "System"
  179.       FontSize        =   9.75
  180.       FontStrikethru  =   0   'False
  181.       FontUnderline   =   0   'False
  182.       Height          =   255
  183.       Left            =   105
  184.       TabIndex        =   14
  185.       Top             =   600
  186.       Width           =   510
  187.    End
  188.    Begin Image Change 
  189.       Height          =   480
  190.       Left            =   2520
  191.       Picture         =   RPNCALC.FRX:0906
  192.       Top             =   1800
  193.       Width           =   480
  194.    End
  195.    Begin Image SquareRoot 
  196.       Height          =   480
  197.       Left            =   2520
  198.       Picture         =   RPNCALC.FRX:0C08
  199.       Top             =   1200
  200.       Width           =   480
  201.    End
  202.    Begin Image Up 
  203.       Height          =   480
  204.       Left            =   3120
  205.       Picture         =   RPNCALC.FRX:0F0A
  206.       Top             =   2400
  207.       Width           =   480
  208.    End
  209.    Begin Image Down 
  210.       Height          =   480
  211.       Left            =   2520
  212.       Picture         =   RPNCALC.FRX:120C
  213.       Top             =   2400
  214.       Width           =   480
  215.    End
  216.    Begin Image Plus 
  217.       Height          =   480
  218.       Left            =   1920
  219.       Picture         =   RPNCALC.FRX:150E
  220.       Top             =   1200
  221.       Width           =   480
  222.    End
  223.    Begin Image Minus 
  224.       Height          =   480
  225.       Left            =   1920
  226.       Picture         =   RPNCALC.FRX:1810
  227.       Top             =   600
  228.       Width           =   480
  229.    End
  230.    Begin Image Devide 
  231.       Height          =   480
  232.       Left            =   720
  233.       Picture         =   RPNCALC.FRX:1B12
  234.       Top             =   600
  235.       Width           =   480
  236.    End
  237.    Begin Image Mult 
  238.       Height          =   480
  239.       Left            =   1320
  240.       Picture         =   RPNCALC.FRX:1E14
  241.       Top             =   600
  242.       Width           =   480
  243.    End
  244.    Begin Image SwapXY 
  245.       Height          =   480
  246.       Left            =   1920
  247.       Picture         =   RPNCALC.FRX:2116
  248.       Top             =   1800
  249.       Width           =   480
  250.    End
  251.    Begin Image xby1 
  252.       Height          =   480
  253.       Left            =   2520
  254.       Picture         =   RPNCALC.FRX:2418
  255.       Top             =   600
  256.       Width           =   480
  257.    End
  258.    Begin Image Backspace 
  259.       Height          =   480
  260.       Left            =   2520
  261.       Picture         =   RPNCALC.FRX:271A
  262.       Top             =   3000
  263.       Width           =   1080
  264.    End
  265.    Begin Label Readout 
  266.       Alignment       =   1  'Right Justify
  267.       BackColor       =   &H00FFFF80&
  268.       Caption         =   "0"
  269.       FontBold        =   0   'False
  270.       FontItalic      =   0   'False
  271.       FontName        =   "MS Sans Serif"
  272.       FontSize        =   13.5
  273.       FontStrikethru  =   0   'False
  274.       FontUnderline   =   0   'False
  275.       ForeColor       =   &H00000000&
  276.       Height          =   375
  277.       Index           =   0
  278.       Left            =   120
  279.       TabIndex        =   15
  280.       Top             =   120
  281.       Width           =   3495
  282.    End
  283. End
  284.  
  285. ' ------------------------------------------------------------------------
  286. '                       Public Domain
  287. '                       RPN Caculator
  288. ' ------------------------------------------------------------------------
  289.  
  290. Option Explicit
  291.  
  292. Dim Register(0 To 5)  As Variant       ' RPN Registers
  293.                     ' 0 = Last X
  294.                     ' 1 = x
  295.                     ' 2 = y
  296.                     ' 3 = z
  297.                     ' 4 = t
  298.                     ' 5 = temp storage
  299.  
  300. Dim DecimalFlag As Integer              ' Decimal point present yet?
  301. Dim UserInput As String                 ' Numeric InPut String
  302. Dim UseStr As String                    ' Format Control String
  303.  
  304. ' Event Functions ----------------------------------------------------------
  305. '----------------------------------------------------------------------------
  306.  
  307. Sub BackSpace_Click ()
  308.     Call submit(Chr$(8))
  309. End Sub
  310.  
  311. Sub Change_Click ()
  312.     Call submit(Chr$(241))
  313. End Sub
  314.  
  315. ' Misc Functions ----------------------------------------------------------
  316. Sub CheckInput ()
  317.     If Len(UserInput) > 0 Then
  318.         Call PushUp
  319.         Register(1) = Val(UserInput)
  320.         Register(0) = Register(1)
  321.         UserInput = ""
  322.         DecimalFlag = False
  323.     End If
  324. End Sub
  325.  
  326. Sub Decimal_Click ()
  327.     Call submit(".")
  328. End Sub
  329.  
  330. Sub Devide_Click ()
  331.     Call submit("/")
  332. End Sub
  333.  
  334. Sub Devide0 () ' Devide by zero error display
  335.     MsgBox "Attempted Devide by zero.", 48, "ERROR"
  336. End Sub
  337.  
  338. Sub Down_Click ()
  339.     Call submit(Chr$(31))
  340. End Sub
  341.  
  342. Sub Enter_Click ()
  343.     Call submit(Chr$(13))
  344. End Sub
  345.  
  346. Sub FixDec_Click ()
  347.     If FixDec.Value = 1 Then
  348.     UseStr = "###,###,###.0000;\-###,###,###.0000;0.0000;0.0"
  349.     Else
  350.     UseStr = ""
  351.     End If
  352.     Call Ok
  353. End Sub
  354.  
  355. Sub Form_KeyDown (KeyCode As Integer, Shift As Integer)
  356.     KeyCode = 0
  357. End Sub
  358.  
  359. Sub Form_KeyPress (KeyAscii As Integer)
  360.     ' Readout(6).Caption = KeyAscii
  361.     If KeyAscii = 27 Then End
  362.     If KeyAscii = 8 Then Call submit(Chr$(8))
  363.     Dim k As String * 1
  364.     k = UCase$(Chr$(KeyAscii))
  365.     If InStr("0123456789XSRLC.+-*/=", k) Then
  366.     Call submit(k)
  367.     End If
  368.     KeyAscii = 0
  369. End Sub
  370.  
  371. Sub Form_KeyUp (KeyCode As Integer, Shift As Integer)
  372.     ' Readout(6).Caption = KeyCode
  373.     ' NOTE: Contrary to the documentation the next line is useless !
  374.     If KeyCode = 13 Then Call submit(Chr$(13))
  375.     If KeyCode = 33 Then Call submit(Chr$(30))
  376.     If KeyCode = 34 Then Call submit(Chr$(31))
  377. End Sub
  378.  
  379. ' Initialization routine for the form.
  380. Sub Form_Load ()
  381.     Calculator.Caption = App.EXEName + ".EXE"
  382.     If Left$(Calculator.Caption, 3) <> "RPN" Then
  383.         Calculator.Caption = Calculator.Caption + "  RPN"
  384.     End If
  385.     ' Calculator.Height  =   5910
  386.     ' NOTE: Contrary to the documentation the next line is useless !
  387.     Calculator.KeyPreview = True
  388.     Dim i As Integer
  389.     For i = 0 To 5
  390.         Register(i) = 0
  391.     Next i
  392.     UserInput = "0"
  393.     Call CheckInput
  394. End Sub
  395.  
  396. Sub LastX_Click ()
  397.     Call submit("L")
  398. End Sub
  399.  
  400. Sub Minus_Click ()
  401.     Call submit("-")
  402. End Sub
  403.  
  404. Sub Mult_Click ()
  405.     Call submit("*")
  406. End Sub
  407.  
  408. Sub Number_Click (Index As Integer)
  409.     Call submit(Chr$(48 + Index))
  410. End Sub
  411.  
  412. Sub Number_KeyUp (Index As Integer, KeyCode As Integer, Shift As Integer)
  413.     If KeyCode = 13 Then Call submit(Chr$(13))
  414. End Sub
  415.  
  416. Sub Ok ()
  417.     If Len(UserInput) > 0 Then
  418.     Readout(0) = UserInput
  419.     Else
  420.     Readout(0) = Format$(Register(1), UseStr)
  421.     ' ReadOut(1) = Register(0)
  422.     ' ReadOut(2) = Register(1)
  423.     ' ReadOut(3) = Register(2)
  424.     ' ReadOut(4) = Register(3)
  425.     ' ReadOut(5) = Register(4)
  426.     End If
  427. End Sub
  428.  
  429. Sub Pi_Click ()
  430.     Call submit("P")
  431. End Sub
  432.  
  433. Sub Plus_Click ()
  434.     Call submit("+")
  435. End Sub
  436.  
  437. ' Stack Functions ----------------------------------------------------------
  438. ' Push Registers down, T retains Value
  439. Sub PushDown ()
  440.     Register(1) = Register(2)
  441.     Register(2) = Register(3)
  442.     Register(3) = Register(4)
  443. End Sub
  444.  
  445. ' Push Registers up, X retains value
  446. Sub PushUp ()
  447.     Register(4) = Register(3)
  448.     Register(3) = Register(2)
  449.     Register(2) = Register(1)
  450. End Sub
  451.  
  452. ' Rotate Register x-t (1 to 4) down
  453. Sub RollDown ()
  454.     Register(5) = Register(1)      ' Save X register
  455.     Call PushDown
  456.     Register(4) = Register(5)
  457. End Sub
  458.  
  459. ' Rotate Register x-t (1 to 4) up
  460. Sub RollUp ()
  461.     Register(5) = Register(4)      ' Save T register
  462.     Call PushUp
  463.     Register(1) = Register(5)
  464. End Sub
  465.  
  466. Sub SquareRoot_Click ()
  467.     Call submit("R")
  468. End Sub
  469.  
  470. ' Program Core ---------------------------------------------------------------
  471. ' All input is processed here. This Subroutine is used so that multiple
  472. ' events can be mapped to the same function:
  473. ' EXAMPLE: Image Enter_Click and KeyPress (Enter)
  474. ' It also allows for a future implimentation of *.RPN script files
  475. ' or the assingment userdefined functions.
  476. '
  477. Sub submit (s As String)
  478.    Select Case s
  479.     Case "."                                ' Decimal Point
  480.         If Len(UserInput) > 0 Then
  481.             If DecimalFlag = False Then UserInput = UserInput + "."
  482.         Else
  483.             UserInput = "0."
  484.         End If
  485.         DecimalFlag = True
  486.     Case "0" To "9"
  487.         UserInput = UserInput + s
  488.     Case "*"                                ' Multiply Y by X
  489.         Call CheckInput
  490.         Register(0) = Register(1)
  491.         Register(2) = Register(2) * Register(1)
  492.         Call PushDown
  493.     Case "+"                                ' Add X to Y
  494.         Call CheckInput
  495.         Register(0) = Register(1)
  496.         Register(2) = Register(2) + Register(1)
  497.         Call PushDown
  498.     Case "-"                                ' Sub X from Y
  499.         Call CheckInput
  500.         Register(0) = Register(1)
  501.         Register(2) = Register(2) - Register(1)
  502.         Call PushDown
  503.     Case "/"                                ' Devide Y by X
  504.         Call CheckInput
  505.         If Abs(Register(1)) > 0 Then
  506.             Register(0) = Register(1)
  507.             Register(2) = Register(2) / Register(1)
  508.             Call PushDown
  509.         Else
  510.             Call Devide0
  511.         End If
  512.     Case "="                                ' Exchange X and Y
  513.         Call CheckInput
  514.         Register(5) = Register(1)      ' Save X register
  515.         Register(1) = Register(2)
  516.         Register(2) = Register(5)
  517.     Case "X"                                ' X = 1/X
  518.         Call CheckInput
  519.         If Abs(Register(1)) > 0 Then
  520.             Register(0) = Register(1)
  521.             Register(1) = 1 / Register(1)
  522.         Else
  523.             Call Devide0
  524.         End If
  525.     Case Chr$(241)                          ' Change Sign of X
  526.         Call CheckInput
  527.         Register(1) = -(Register(1))
  528.     Case Chr$(30)                           ' Roll Up
  529.         Call CheckInput
  530.         Call RollUp
  531.     Case Chr$(31)                           ' Roll Down
  532.         Call CheckInput
  533.         Call RollDown
  534.     Case "S"                                ' Square (X = X * X)
  535.         Call CheckInput
  536.         Register(1) = Register(1) * Register(1)
  537.     Case "R"                                ' SquareRoot
  538.         Call CheckInput
  539.         Register(1) = Sqr(Abs(Register(1)))
  540.     Case "P"                                ' Insert Value for Pi
  541.         Call CheckInput
  542.         UserInput = "3.141592654"
  543.         Call CheckInput
  544.     Case "L"                                ' Resstore last "X" value
  545.         Call CheckInput
  546.         UserInput = Register(0)
  547.         Call CheckInput
  548.     Case Chr$(8)                            ' BackSpace
  549.         If Len(UserInput) > 0 Then
  550.             If Right$(UserInput, 1) = "." Then DecimalFlag = False
  551.             UserInput = Left$(UserInput, Len(UserInput) - 1)
  552.         Else
  553.             UserInput = "0"
  554.             Call CheckInput
  555.         End If
  556.  
  557.     Case Chr$(13)                           ' Enter Key
  558.         If Len(UserInput) = 0 Then
  559.             UserInput = Format$(Register(1))
  560.         End If
  561.         Call CheckInput
  562.     Case Else
  563.         ' do nothing
  564.    End Select
  565.    Call Ok
  566.    Calculator.Enter.SetFocus
  567. End Sub
  568.  
  569. Sub SwapXY_Click ()
  570.     Call submit("=")
  571. End Sub
  572.  
  573. Sub Up_Click ()
  574.     Call submit(Chr$(30))
  575. End Sub
  576.  
  577. Sub Xby1_Click ()
  578.     Call submit("X")
  579. End Sub
  580.  
  581. Sub XSquare_Click ()
  582.     Call submit("S")
  583. End Sub
  584.  
  585.