Private Sub Text1_KeyPress(KeyAscii As Integer) If (Chr(KeyAscii) > "9" Or Chr(KeyAscii) < "0") And Chr(KeyAscii) <> "." Then KeyAscii = 0 End If End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case Asc("-") '允许负数 If Text1.SelStart = 0 Then If Left(Text1.Text, 1) = "-" Then KeyAscii = 0 Beep End If Else KeyAscii = 0 Beep End If Case 8 '无变化,退格键不屏蔽 Case Asc(" ") '32 If Text1.SelLength = 0 Then KeyAscii = 0 End If Case Asc(".") '46 '允许小数点 If InStr(Text1.Text, ".") Then KeyAscii = 0 End If Case Is < Asc(0) '48 KeyAscii = 0 Case Is > Asc(9) '57 KeyAscii = 0 End Select End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case Asc("0") To Asc("9") 'do nothing Case Asc(".") 'do nothing Case Else KeyAscii = 0 End Select End Sub
啊,来晚了 同意playyuer(女爱㊣)
playyuer(女爱㊣) 的代码很不错
Function ValiText(KeyIn As Integer, ValidateString As String, _ Editable As Boolean) As Integer Dim ValidateList As String Dim KeyOut As Integer If Editable = True Then ValidateList = UCase(ValidateString) & Chr(8) Else ValidateList = UCase(ValidateString) End If If InStr(1, ValidateList, UCase(Chr(KeyIn)), 1) > 0 Then KeyOut = KeyIn Else KeyOut = 0 Beep End If ValiText = KeyOut End Function 在工程中加入此函数后,你就可以使用它了。方法:在需要限制输入的控件的 KeyPress 加入以下代码: KeyAscii=ValiText(Keyascii, "0123456789/-",True) 现在你就可以过虑掉你不希望的字符了。在此例中,我们只接受第二个参数提供的字符, 即:"0123456789/-", 而此函数的第三个函数就决定了能否使用 [Backspace] 键。最后 值得一提的是此函数对大小写是不敏感的。
to ttyp(懒人) 代码共享的思想不错! 但没考虑某些细节: 小数点只能有一个、"-"的位置只能在最左、空格键的处理! 另外我 (playyuer) 有改进"空格键的处理"了一下:Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii <> 13 Then Select Case KeyAscii Case Asc("-") '只能在最左 If Text1.SelStart = 0 Then If Left(Text1.Text, 1) = "-" Then KeyAscii = 0 Beep End If Else KeyAscii = 0 Beep End If Case Asc(vbBack) '无变化,退格键不屏蔽 Case Asc(" ") '32 KeyAscii = 0 If Text1.SelLength > 0 Then Text1.SelText = "" End If Case Asc(".") '46 Only One!!!! If InStr(Text1.Text, ".") Then KeyAscii = 0 End If Case Is < Asc(0) '48 KeyAscii = 0 Case Is > Asc(9) '57 KeyAscii = 0 End Select End Sub
to Wuxyingshu(无影石): 要改 "111999111" 为 "111111" 咋办? to gameboy999(无名): playyuer 的代码 ctrl+v 没事! 弹出"菜单"到是有必要屏蔽!Form1: Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = vbRightButton Then OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC) ' 取得窗口函数的地址 Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage) ' 用SubClass1_WndMessage代替窗口函数处理消息 End If End Sub Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = vbRightButton Then Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc) ' 恢复窗口的默认函数 ' 弹出自定义菜单 End If End SubModule1:Option Explicit Public OldWindowProc As Long ' 保存默认的窗口函数的地址 Public Const WM_CONTEXTMENU = &H7B ' 当右击文本框时,产生这条消息 Public Const GWL_EXSTYLE = (-20) Public Const GWL_HINSTANCE = (-6) Public Const GWL_HWNDPARENT = (-8) Public Const GWL_ID = (-12) Public Const GWL_STYLE = (-16) Public Const GWL_USERDATA = (-21) Public Const GWL_WNDPROC = (-4) Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Function SubClass1_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long If Msg = WM_CONTEXTMENU Then SubClass1_WndMessage = True Else SubClass1_WndMessage = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp) ' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理 End IfEnd Function
to playyuer: 你的代码ctrl+v当然会有问题咯,如果人家拷贝的是"11abc22",你的代码将不能够去除掉中间的"1122". 而ttyp的方法也是检验keypress/keydown之类的,自然也会对ctrl+v贴进来的无效数据束手无策。其实我有段代码在textbox的onchange中处理,不过很不想写出来(因为记不得了)~ 方法有不少,看你的需要。
具体函数的参数我不太会写了,就是用sendkeys的
Select Case KeyAscii
Case Asc("-") '允许负数
If Text1.SelStart = 0 Then
If Left(Text1.Text, 1) = "-" Then
KeyAscii = 0
Beep
End If
Else
KeyAscii = 0
Beep
End If
Case 8
'无变化,退格键不屏蔽
Case Asc(" ") '32
If Text1.SelLength = 0 Then
KeyAscii = 0
End If
Case Asc(".") '46 '允许小数点
If InStr(Text1.Text, ".") Then
KeyAscii = 0
End If
Case Is < Asc(0) '48
KeyAscii = 0
Case Is > Asc(9) '57
KeyAscii = 0
End Select
End Sub
Select Case KeyAscii
Case Asc("0") To Asc("9")
'do nothing
Case Asc(".")
'do nothing
Case Else
KeyAscii = 0
End Select
End Sub
同意playyuer(女爱㊣)
Editable As Boolean) As Integer
Dim ValidateList As String
Dim KeyOut As Integer
If Editable = True Then
ValidateList = UCase(ValidateString) & Chr(8)
Else
ValidateList = UCase(ValidateString)
End If
If InStr(1, ValidateList, UCase(Chr(KeyIn)), 1) > 0 Then
KeyOut = KeyIn
Else
KeyOut = 0
Beep
End If
ValiText = KeyOut
End Function
在工程中加入此函数后,你就可以使用它了。方法:在需要限制输入的控件的 KeyPress
加入以下代码:
KeyAscii=ValiText(Keyascii, "0123456789/-",True)
现在你就可以过虑掉你不希望的字符了。在此例中,我们只接受第二个参数提供的字符,
即:"0123456789/-", 而此函数的第三个函数就决定了能否使用 [Backspace] 键。最后
值得一提的是此函数对大小写是不敏感的。
但没考虑某些细节:
小数点只能有一个、"-"的位置只能在最左、空格键的处理!
另外我 (playyuer) 有改进"空格键的处理"了一下:Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii <> 13 Then
Select Case KeyAscii
Case Asc("-") '只能在最左
If Text1.SelStart = 0 Then
If Left(Text1.Text, 1) = "-" Then
KeyAscii = 0
Beep
End If
Else
KeyAscii = 0
Beep
End If
Case Asc(vbBack)
'无变化,退格键不屏蔽
Case Asc(" ") '32
KeyAscii = 0
If Text1.SelLength > 0 Then
Text1.SelText = ""
End If
Case Asc(".") '46 Only One!!!!
If InStr(Text1.Text, ".") Then
KeyAscii = 0
End If
Case Is < Asc(0) '48
KeyAscii = 0
Case Is > Asc(9) '57
KeyAscii = 0
End Select
End Sub
这种方法人家用ctrl+v就会出问题!
最根本就是在onvalidate或textchange中检测。
要改 "111999111" 为 "111111" 咋办?
to gameboy999(无名):
playyuer 的代码 ctrl+v 没事!
弹出"菜单"到是有必要屏蔽!Form1:
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbRightButton Then
OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
' 取得窗口函数的地址
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
' 用SubClass1_WndMessage代替窗口函数处理消息
End If
End Sub
Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbRightButton Then
Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc)
' 恢复窗口的默认函数 ' 弹出自定义菜单
End If
End SubModule1:Option Explicit
Public OldWindowProc As Long
' 保存默认的窗口函数的地址
Public Const WM_CONTEXTMENU = &H7B
' 当右击文本框时,产生这条消息
Public Const GWL_EXSTYLE = (-20)
Public Const GWL_HINSTANCE = (-6)
Public Const GWL_HWNDPARENT = (-8)
Public Const GWL_ID = (-12)
Public Const GWL_STYLE = (-16)
Public Const GWL_USERDATA = (-21)
Public Const GWL_WNDPROC = (-4)
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Function SubClass1_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
If Msg = WM_CONTEXTMENU Then
SubClass1_WndMessage = True
Else
SubClass1_WndMessage = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
End IfEnd Function
你的代码ctrl+v当然会有问题咯,如果人家拷贝的是"11abc22",你的代码将不能够去除掉中间的"1122".
而ttyp的方法也是检验keypress/keydown之类的,自然也会对ctrl+v贴进来的无效数据束手无策。其实我有段代码在textbox的onchange中处理,不过很不想写出来(因为记不得了)~
方法有不少,看你的需要。