主题:求教:一个关于文本框的问题
fsduron
[专家分:90] 发布于 2008-06-02 13:17:00
如果一个窗体中有若干个文本框(不同名字的),可不可以设一个程序,令只能在文本框中输入数字
回复列表 (共11个回复)
沙发
一江秋水 [专家分:9680] 发布于 2008-06-02 13:52:00
当然可以:
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
板凳
老大徒伤悲 [专家分:29120] 发布于 2008-06-02 13:59:00
数字,还是数目字,这个关系很大。
数目字是指0、1、2、3、4、5、6、7、8、9,这个比较容易。
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0
End Sub
每一个文本框都得这么做。当然显得罗嗦了,好的办法就是,使用文本框数组,其代码只有一段:
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0
End Sub
如果要是数字,就比较麻烦,因为通常涉及到小数点、科学计数法等问题。
这个的处理一般都采用输入完成后,点确定按钮然后检测。
Private Sub Command1_Click()
Dim 正确 As Boolean
正确 = True
For i = 0 To Text1.Count - 1
If Not IsNumeric(Text1(i)) Then
MsgBox "第" & i & "个文本框里不是数字" & vbCrLf & "请重新输入"
正确 = False
Exit For
End If
Next i
If Not 正确 Then
Text1(i) = ""
Text1(i).SetFocus
Command1.Default = True
Else
MsgBox "文本框输入全部是数字"
Command1.Default = False
End If
End Sub
3 楼
okbaby [专家分:100] 发布于 2008-06-03 18:53:00
Private Sub Text1_Change()
If Not IsNumeric(Text1.Text) Then SendKeys ("{bs}")
End Sub
4 楼
老大徒伤悲 [专家分:29120] 发布于 2008-06-03 19:58:00
3楼,你的文本框不能输入2.0123e-5这样的数字的。
5 楼
okbaby [专家分:100] 发布于 2008-06-03 21:49:00
'临时写了一个,大家看看有没有问题
Private Sub Text1_Change()
If Not mIsNumeric(Text1.Text) Then SendKeys ("{bs}")
End Sub
Private Function mIsNumeric(S As String) As Boolean
If Len(S) = 1 Then
If Not IsNumeric(S) And S <> "-" And S <> "." Then GoTo No
GoTo Yes
ElseIf Len(S) > 1 Then
If IsNumeric(S) Then GoTo Yes
If Right(S, 1) = "e" Then
If InStr(1, S, "e") <> Len(S) Then GoTo No
GoTo Yes
End If
If Right(S, 1) = "E" Then
If InStr(1, S, "E") <> Len(S) Then GoTo No
GoTo Yes
End If
If Right(S, 2) = "e+" Or Right(S, 2) = "e-" Then
If InStr(1, S, "e") <> Len(S) - 1 Then GoTo No
GoTo Yes
End If
If Right(S, 2) = "E+" Or Right(S, 2) = "E-" Then
If InStr(1, S, "E") <> Len(S) - 1 Then GoTo No
GoTo Yes
End If
GoTo No
End If
Exit Function
Yes:
mIsNumeric = True
Exit Function
No:
mIsNumeric = False
End Function
6 楼
fsduron [专家分:90] 发布于 2008-06-03 21:49:00
如果不同的名字呢(如:txtno,txtname),那又如何
7 楼
老大徒伤悲 [专家分:29120] 发布于 2008-06-03 22:31:00
[quote]如果不同的名字呢(如:txtno,txtname),那又如何[/quote]这个问题提得好啊
我的看法是,如果有这样的需求,在开始的时候,就把他们都设计成一个控件数组,如我在2楼的最后一段代码,即可实现。
如是改造已有工程(如果界面内所有文本框都要进行这个检测,就好办;不然,你总的给出他们区别于必须要检测的文本框的特征来),代码可以如下:
Private Sub Command1_Click()
Dim 正确 As Boolean
正确 = True
For i = 0 To Controls.Count - 1
If TypeOf Controls(i) Is TextBox Then 如果,不需要全检测,在这里的条件加上需要检测的文本框的特征判定
If Not IsNumeric(Controls(i).Text) Then
MsgBox "第" & i & "个文本框里不是数字" & vbCrLf & "请重新输入"
正确 = False
Exit For
End If
End If
Next i
If Not 正确 Then
Controls(i).Text = ""
Controls(i).SetFocus
Command1.Default = True
Else
MsgBox "文本框输入全部是数字"
Command1.Default = False
End If
End Sub
8 楼
老大徒伤悲 [专家分:29120] 发布于 2008-06-03 22:34:00
嘿嘿,不过顺序好像是从后向前数?
9 楼
老大徒伤悲 [专家分:29120] 发布于 2008-06-03 22:42:00
另,佩服“好宝宝”,写了那么多代码。
但是,在vb里还有双精度数字呢,你的代码又得扩展了~~~
并且,你目前的代码存在这样的问题:在文本框原有非数字字符的情况下是可以输入你限制的字符的
实际上,我认为,你应该放弃“每键检测”这样的思路。并不是说不能实现,而是
1、代码太繁;
2、界面操作不合惯例
10 楼
okbaby [专家分:100] 发布于 2008-06-04 10:04:00
[quote]另,佩服“好宝宝”,写了那么多代码。
但是,在vb里还有双精度数字呢,你的代码又得扩展了~~~
并且,你目前的代码存在这样的问题:在文本框原有非数字字符的情况下是可以输入你限制的字符的
实际上,我认为,你应该放弃“每键检测”这样的思路。并不是说不能实现,而是
1、代码太繁;
2、界面操作不合惯例
[/quote]
我写的代码不存在双精度数据输入的问题,当然输入数据超过Double类型数据范围就不行了(同样对于你的完成后检测也有这个问题,因为IsNumeric函数本身就支持到Double),而且对于粘贴方式输入的内容同样不能正确检查。对于文本框初始内容,只需要设置为数值或空文本即可。
你说的思路大家都明白,不过,有些时候(如需要实时检测输入数据的场合)可能需要键入检查。是实时检测还是完成后再检测是两种不同的风格,对于编程者而言当然第二种简单,但对于适用程序者感觉就不一样了(为什么非要多按个按钮?),呵呵。
我来回复