回 帖 发 新 帖 刷新版面

主题:求教:一个关于文本框的问题

如果一个窗体中有若干个文本框(不同名字的),可不可以设一个程序,令只能在文本框中输入数字

回复列表 (共11个回复)

沙发

当然可以:

Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

板凳

数字,还是数目字,这个关系很大。

数目字是指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 楼

Private Sub Text1_Change()
    If Not IsNumeric(Text1.Text) Then SendKeys ("{bs}")
End Sub

4 楼

3楼,你的文本框不能输入2.0123e-5这样的数字的。

5 楼

'临时写了一个,大家看看有没有问题

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 楼

如果不同的名字呢(如:txtno,txtname),那又如何

7 楼

[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 楼

嘿嘿,不过顺序好像是从后向前数?

9 楼

另,佩服“好宝宝”,写了那么多代码。

但是,在vb里还有双精度数字呢,你的代码又得扩展了~~~
并且,你目前的代码存在这样的问题:在文本框原有非数字字符的情况下是可以输入你限制的字符的

实际上,我认为,你应该放弃“每键检测”这样的思路。并不是说不能实现,而是
1、代码太繁;
2、界面操作不合惯例

10 楼

[quote]另,佩服“好宝宝”,写了那么多代码。

但是,在vb里还有双精度数字呢,你的代码又得扩展了~~~
并且,你目前的代码存在这样的问题:在文本框原有非数字字符的情况下是可以输入你限制的字符的

实际上,我认为,你应该放弃“每键检测”这样的思路。并不是说不能实现,而是
1、代码太繁;
2、界面操作不合惯例

[/quote]
我写的代码不存在双精度数据输入的问题,当然输入数据超过Double类型数据范围就不行了(同样对于你的完成后检测也有这个问题,因为IsNumeric函数本身就支持到Double),而且对于粘贴方式输入的内容同样不能正确检查。对于文本框初始内容,只需要设置为数值或空文本即可。
你说的思路大家都明白,不过,有些时候(如需要实时检测输入数据的场合)可能需要键入检查。是实时检测还是完成后再检测是两种不同的风格,对于编程者而言当然第二种简单,但对于适用程序者感觉就不一样了(为什么非要多按个按钮?),呵呵。

我来回复

您尚未登录,请登录后再回复。点此登录或注册