发信人: 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之类的就懒得做了,结果运行下来,不足的就是文本框里有个光标插入符老在闪,也懒得弄了.
----
|
|