(1)做一个类cControl,可以把所有需要对TXT的操作都封装在里面 Option Explicit Private WithEvents MyTxt As TextBoxPublic Sub Attach_Txt(txt1 As TextBox) On Error GoTo err '接受外部变量到mytxt中 Set MyTxt = txt1Exit Suberr: MsgBox err.Description Exit Sub
End SubPrivate Sub MyTxt_KeyPress(KeyAscii As Integer) On Error Resume Next Dim sTemplate As String sTemplate = "'/|!@#$%^&*()_+-=" '用来存放不接受的字符 If InStr(1, sTemplate, Chr(KeyAscii)) > 0 Then KeyAscii = 0 If KeyAscii = 13 Then SendKeys "{TAB}"End Sub (2)在窗体中引用一下即可.如: cControl.Attach_Txt txtCode
不必光顾所有控件: Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Const WM_KEYDOWN As Long = &H100 Const VK_TAB As Long = &H9Private Sub Form_Load() me.KeyPreview = true End IfPrivate Sub Form_KeyPress(KeyAscii As Integer) Dim retVal As Long If KeyAccii = 13 Then retVal = PostMessage(Me.hwnd, WM_KEYDOWN, VK_TAB, 0) End Sub
楼上的方法真麻烦 难道每想过用控件数组吗?把控制框复制一下然后粘贴几次 之后在数组的KeyPress里设置一下 Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) If KeyAscii = 13 Then SendKeys "{Tab}" End Sub
看我的这个 托几个名为text1的控件数组,然后沾下边的代码就行了。Option ExplicitDim m_Index As LongPrivate Sub Form_Load() KeyPreview = True End SubPrivate Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then m_Index = IIf(m_Index = Text1.Count - 1, 0, m_Index + 1) Text1.Item(m_Index).SetFocus End IfEnd SubPrivate Sub Text1_GotFocus(Index As Integer) m_Index = Index Text1(m_Index).SelStart = 0 Text1.Item(m_Index).SelLength = Len(Text1.Item(m_Index).Text) End Sub
If KeyAscii = 13 Then SendKeys "{Tab}"
End Sub
还有不能设置default否则回车会自动确定
然后在所有需要使用替换的控件的KeyPress事件中用楼上的代码就可以了
If KeyAscii = 13 Then SendKeys "{Tab}"
用下列API函数替代Sendkeys:
1
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte,ByVal _
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)Const KEYEVENTF_KEYUP = &H2
Const VK_TAB = &H9keybd_event VK_TAB, 0, 0, 0
keybd_event VK_TAB, 0, KEYEVENTF_KEYUP, 0或
2
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As LongConst WM_KEYDOWN As Long = &H100
Const VK_TAB As Long = &H9
Dim retVal as longretVal = PostMessage(Me.hwnd, WM_KEYDOWN, VK_TAB, 0)
Option Explicit
Private WithEvents MyTxt As TextBoxPublic Sub Attach_Txt(txt1 As TextBox)
On Error GoTo err '接受外部变量到mytxt中
Set MyTxt = txt1Exit Suberr:
MsgBox err.Description
Exit Sub
End SubPrivate Sub MyTxt_KeyPress(KeyAscii As Integer)
On Error Resume Next Dim sTemplate As String sTemplate = "'/|!@#$%^&*()_+-=" '用来存放不接受的字符
If InStr(1, sTemplate, Chr(KeyAscii)) > 0 Then KeyAscii = 0 If KeyAscii = 13 Then SendKeys "{TAB}"End Sub
(2)在窗体中引用一下即可.如:
cControl.Attach_Txt txtCode
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Const WM_KEYDOWN As Long = &H100
Const VK_TAB As Long = &H9Private Sub Form_Load()
me.KeyPreview = true
End IfPrivate Sub Form_KeyPress(KeyAscii As Integer)
Dim retVal As Long
If KeyAccii = 13 Then retVal = PostMessage(Me.hwnd, WM_KEYDOWN, VK_TAB, 0)
End Sub
难道每想过用控件数组吗?把控制框复制一下然后粘贴几次
之后在数组的KeyPress里设置一下
Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)
If KeyAscii = 13 Then SendKeys "{Tab}"
End Sub
托几个名为text1的控件数组,然后沾下边的代码就行了。Option ExplicitDim m_Index As LongPrivate Sub Form_Load()
KeyPreview = True
End SubPrivate Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
m_Index = IIf(m_Index = Text1.Count - 1, 0, m_Index + 1)
Text1.Item(m_Index).SetFocus
End IfEnd SubPrivate Sub Text1_GotFocus(Index As Integer)
m_Index = Index
Text1(m_Index).SelStart = 0
Text1.Item(m_Index).SelLength = Len(Text1.Item(m_Index).Text)
End Sub
难道每想过用控件数组吗?只怕是还有 ComboBox, DTPicker,…… 控件要用。