精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>计算器

主题:计算器
发信人: hunter__fox(雁回西楼)
整理人: winsy(2004-06-30 09:49:23), 站内信件
昨天一个朋友问我,用VB怎么做计算器,本来想起来是很简单的,也就没在意,后来过了一个多小时他又发信息过来问,怎么把表达式计算出结果...
这下把我问蒙了...因为想到一个问题:如果用一个表达式来记录用户的输入,那么,判断输入的正确性就很复杂了(可能性太多了),所以,我告诉他用两个变量来存放两个数,计算结果可以放入其中一个变量...

后来不胜其烦,干脆动手做了一个,省了不少口舌.
==表单控件设置================================================
数字用了一个控件数组(cmdN),+-*/也用了一个控件数组(cmdY),小数点cmdP,"="cmdE,"C"(清除所有)cmdC,"CE"(清除当前数)cmdCE,Breakspace(清除最后一个输入的数)cmdCELast,输出是Test1
所有按钮TabStop = False
将 Text1.locked = .T.
==代码部分====================================================
Option Explicit
Dim dblN(0 To 1) As Double '用于计算的数
Dim dblM As Double '记忆数值
Dim blnP As Boolean '小数点
Dim bytY As Byte '运算符

Private Sub cmdCE1_Click() '清除输入的最后一个键
  Me.Text1.Text = dblN(1)
  dblN(1) = CDbl(Left(Me.Text1.Text, Len(Me.Text1.Text) - 1))
  Me.Text1.Text = dblN(1)
End Sub

Private Sub cmdCE_Click() '清除输入的这个数值
  dblN(1) = 0
  Me.Text1.Text = dblN(1)
End Sub

Private Sub cmdCELast_Click()
  Me.Text1.Text = dblN(1)
  If Len(Me.Text1.Text) = 1 Then
    dblN(1) = 0
  Else
    dblN(1) = CDbl(Left(Me.Text1.Text, Len(Me.Text1.Text) - 1))
  End If
  Me.Text1.Text = dblN(1)
End Sub

Private Sub cmdE_Click() '计算结果
On Error GoTo err
  Select Case bytY
  Case Is = 0
    dblN(0) = dblN(0) + dblN(1)
  Case Is = 1
    dblN(0) = dblN(0) - dblN(1)
  Case Is = 2
    dblN(0) = dblN(0) * dblN(1)
  Case Is = 3
    dblN(0) = dblN(0) / dblN(1)
  End Select
  Me.Text1.Text = dblN(0)
  If Left(Me.Text1.Text, 1) = "." Then Me.Text1.Text = "0" + Me.Text1.Text
  bytY = 0
  dblN(1) = 0
  blnP = False
  Exit Sub
err:
  Me.Text1.Text = "错误:" & Error(err.Number)
  bytY = 0
  dblN(1) = 0:  dblN(0) = 0
  blnP = False
End Sub

Private Sub cmdN_Click(Index As Integer) '数字输入
  If Not blnP Then
    dblN(1) = dblN(1) * 10 + Index
  Else
    If InStr(CStr(dblN(1)), ".") > 0 Then
      dblN(1) = Val(CStr(dblN(1)) + CStr(Index))
    Else
      dblN(1) = dblN(1) + Index / 10
    End If
  End If
  Me.Text1.Text = dblN(1)
  If Left(Me.Text1.Text, 1) = "." Then Me.Text1.Text = "0" + Me.Text1.Text
End Sub

Private Sub cmdP_Click() '小数点输入
  blnP = True
End Sub

Private Sub cmdY_Click(Index As Integer) '运算符输入
  Call cmdE_Click
  bytY = Index
End Sub

Private Sub cmdC_Click() '归零
  bytY = 0
  dblN(1) = 0:  dblN(0) = 0
  blnP = False
  Me.Text1.Text = dblN(1)
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  '处理键盘输入数值
  Select Case KeyCode
  Case 96 To 105, 48 To 57
    If Shift = 0 Then Call cmdN_Click(KeyCode - IIf(KeyCode >= 96, 96, 48)) '数字输入
    If Shift = 1 And KeyCode = 56 Then Call cmdY_Click(2) '大键盘上档 *
  Case 110, 190 '小数点
    If Shift = 0 Then Call cmdP_Click
  Case Is = 107, 187 '+
    Call cmdY_Click(0)
  Case 109, 189 '-
    Call cmdY_Click(1)
  Case Is = 106 '小键盘 *
    Call cmdY_Click(2)
  Case 111, 191 '/
    Call cmdY_Click(3)
  Case Is = 13 '回车(=)
    Call cmdE_Click
  Case Is = 187
    If Shift = 1 Then
      Call cmdY_Click(0) '大键盘上档 +
    Else
      Call cmdE_Click '大键盘 =
    End If
  Case Is = 27 'C
    Call cmdC_Click
  End Select
End Sub

Private Sub Text1_Validate(Cancel As Boolean) '焦点一直在text1
  Me.Text1.SetFocus
End Sub
=================================================================
至于M+,M-.MC,MR之类的就懒得做了,结果运行下来,不足的就是文本框里有个光标插入符老在闪,也懒得弄了.




----
请来网易广社VFP版  

[关闭][返回]