有時候,我們在設計程式時需要限定文字框只能輸入數字,鑑於網上現存的程式碼都不完善,比如不能輸入小數、負數;用KeyPress會把退格、DEL、CTRL+V等一併過濾;用Change事件則在輸入“-”時就即時判定為非數字;而採用Val函式則“1d1e2”這樣的非法字串也會誤認為是數字的;用API則太繁瑣。
有鑑於此,我特意寫了一段程式碼用來限定在VB的TextBox控制元件中只能輸入實數,可以檢測直接貼上到TextBox中的內容是否為實數,且不改變游標的位置,而且是直接寫成模組的,可以供任意多個TextBox呼叫。
工具/原料
Visual Basic
方法/步驟
首先,我們最好是新增一個模組,那麼無論你有多少個TextBox控制元件需要實現只能輸入數字,都可以直接呼叫即可。
開啟Modoule1模組,先定義3個全域性變數,用來儲存TextBox的現態,程式碼如下:
'LastText變數用於記錄TextBox的上次正確輸入
'LastLen變數用於儲存TextBox的上次正確輸入時的字串長度,以便恢復游標的上次位置
'NotText變數用來防止在進行撤銷行為時進行2次檢測而增加CPU負擔
Public LastText As String, LastLen As Integer, NotText As Boolean
由於我的方法是檢測到輸入非數字,即撤銷到上一步狀態,所以我們要對需要限定的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
然後是核心程式碼,就是對輸入或貼上到文字框的內容是否為數字進行檢測,通用同樣寫在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
我們把核心程式碼全部寫成了模組,所以,大家看不懂也沒關係,把我寫的模組直接複製、貼上即可。在窗體中只需要呼叫我寫的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的輸入限定的: