在VB中,限制TextBox只能輸入數字,包括貼上?

Tags: 程式碼, 數字,

有時候,我們在設計程式時需要限定文字框只能輸入數字,鑑於網上現存的程式碼都不完善,比如不能輸入小數、負數;用KeyPress會把退格、DEL、CTRL+V等一併過濾;用Change事件則在輸入“-”時就即時判定為非數字;而採用Val函式則“1d1e2”這樣的非法字串也會誤認為是數字的;用API則太繁瑣。

有鑑於此,我特意寫了一段程式碼用來限定在VB的TextBox控制元件中只能輸入實數,可以檢測直接貼上到TextBox中的內容是否為實數,且不改變游標的位置,而且是直接寫成模組的,可以供任意多個TextBox呼叫。

工具/原料

Visual Basic

方法/步驟

首先,我們最好是新增一個模組,那麼無論你有多少個TextBox控制元件需要實現只能輸入數字,都可以直接呼叫即可。

在VB中,限制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的輸入限定的:

在VB中,限制TextBox只能輸入數字,包括貼上

相關問題答案