在VB中,限制TextBox只能输入数字,包括粘贴

  • 原创
  • |
  • 浏览:5754
  • |
  • 更新:
  • |
  • 标签:编程语言 

    有时候,我们在设计程序时需要限定文本框只能输入数字,鉴于网上现存的代码都不完善,比如不能输入小数、负数;用KeyPress会把退格、DEL、CTRL+V等一并过滤;用Change事件则在输入“-”时就即时判定为非数字;而采用Val函数则“1d1e2”这样的非法字符串也会误认为是数字的;用API则太繁琐。

    有鉴于此,我特意写了一段代码用来限定在VB的TextBox控件中只能输入实数,可以检测直接粘贴到TextBox中的内容是否为实数,且不改变光标的位置,而且是直接写成模块的,可以供任意多个TextBox调用。

工具/原料

  • Visual Basic

方法/步骤

  1. 1

    首先,我们最好是添加一个模块,那么无论你有多少个TextBox控件需要实现只能输入数字,都可以直接调用即可。

    在VB中,限制TextBox只能输入数字,包括粘贴
  2. 2

    打开Modoule1模块,先定义3个全局变量,用来保存TextBox的现态,代码如下:

    'LastText变量用于记录TextBox的上次正确输入

    'LastLen变量用于保存TextBox的上次正确输入时的字符串长度,以便恢复光标的上次位置

    'NotText变量用来防止在进行撤销行为时进行2次检测而增加CPU负担

    Public LastText As String, LastLen As Integer, NotText As Boolean

  3. 3

    由于我的方法是检测到输入非数字,即撤销到上一步状态,所以我们要对需要限定的TextBox赋一个正确的初始值,还是写成模块,这样可以方便所有的TextBox调用,代码如下:

    Function Initialize(MyText As TextBox)

        Dim a$

        a = MyText & "1"

        If Not IsNumeric(a) Then MyText = "0" ‘保证TextBox的初始值是数字

        LastText = MyText

        LastLen = Len(MyText)

        NotText = False

    End Function

  4. 4

    然后是核心代码,就是对输入或粘贴到文本框的内容是否为数字进行检测,通用同样写在Modoule1模块中,代码如下:

    Function OnlyNumbers(MyText As TextBox)

        If NotText Then NotText = False: Exit Function

        

        Dim a$, b$, c%, d%

        a = MyText.Text

        b = a

        c = Len(MyText.Text)

        

        '保存光标的位置,网上很多限制只能输入数字的代码要么屏蔽了退格、小数点等键,要么把光标位置给变了

        d = MyText.SelStart

        

        '字符D是十进制数结尾标志,字符E是科学计数法形式,下边这2行是屏蔽这2个字母的,如果需要使用科学计数法,可以自己灵活修改

        a = Replace(a, "E", "", 1, -1, 1)

        a = Replace(a, "D", "", 1, -1, 1)

        

        '屏蔽字母D和E的同时会使光标位置的判断出错

        If a <> b Then d = d - 1

        

        '这样给b赋值是考虑负数和小数的情况,如果是正整数去掉此行和上一行即可

        b = a & "1"

        

        '是否允许TextBox的内容为空这里,可以自行设置,我这里是允许为空的

        If a = "" Then Exit Function

        

        '之所以采用出错即撤销到上次正确的方法,是因为按键检测的方法是无法对直接粘贴的数据进行检测的

        If IsNumeric(b) Then

            LastText = a

            LastLen = Len(a)

        Else

            NotText = True

            a = LastText

            d = d + LastLen - c

        End If

        

        '恢复光标所在的位置

        MyText.Text = a

        MyText.SelStart = d

    End Function

  5. 5

    我们把核心代码全部写成了模块,所以,大家看不懂也没关系,把我写的模块直接复制、粘贴即可。在窗体中只需要调用我写的2个模块即可,比如想限定Text1只能输入数字,可以加入下列代码:

    Private Sub Text1_Change()

        OnlyNumbers Me.Text1

    End Sub

    Private Sub Text1_GotFocus()

        Initialize Me.Text1

    End Sub

    同样,如果有Text2、Text3等多个TextBox需要限定,也只需调用我写的模块即可。而且即使是Form2中的Text2也可以调用的,如下:

    Private Sub Text2_Change()

        OnlyNumbers Form2.Text2

    End Sub

    Private Sub Text2_GotFocus()

        Initialize Form2.Text2

    End Sub

    然后,我随便画了2个TextBox,可以看到对Text1的输入限定,并不影响对Text2的输入限定的:

    在VB中,限制TextBox只能输入数字,包括粘贴
    END
  6. 5
    相关内容非法爬取自百度经验

注意事项

  • 此经验是本人原创经验,转载请说明出处,如果有更好的方法也可以跟我交流的
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部
相关标签编程语言