Option ExplicitPrivate Sub Text1_Change() MsgBox Text1.Text & vbCrLf & "改变后的" End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer) MsgBox Text1.Text & vbCrLf & "改变前的" End Sub
鼠标删除有撤销。Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long Private Const VK_CONTROL = &H11 Private Const KEYEVENTF_KEYUP = &H2 Private disa As BooleanPrivate Sub Text1_Change() Text1.SetFocus If disa = False Then keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0 keybd_event Asc("Z"), MapVirtualKey(Asc("Z"), 0), 0, 0 keybd_event Asc("Z"), MapVirtualKey(Asc("Z"), 0), KEYEVENTF_KEYUP, 0 keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0 disa = True End If End Sub Delete则用KeyDown事件替换KeyPress
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim strLeft As String, strRight As String
strLeft = Mid$(Text1.Text, 1, Text1.SelStart)
strRight = Mid$(Text1.Text, Text1.SelStart + Text1.SelLength + 1)
'MsgBox strLeft
MsgBox strLeft & Chr(KeyAscii) & strRight
End Sub
这个还要考虑text1.sellength吧?在选择了某些文本的情况下,再键入值就是替换了
楼主只问就像再问吃了东西之后人是什么感觉。什么感觉???别问我,那得看看你吃了什么
或者,换个问题,如何知道change事件之前的textbox.text是什么?
就在KeyPress事件中获取吧。KeyPress之后文本框的值是什么?
就在KeyPress事件以后,从Text1_Change事件中获取.这样行不?
Option ExplicitPrivate Sub Text1_Change()
MsgBox Text1.Text & vbCrLf & "改变后的"
End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer)
MsgBox Text1.Text & vbCrLf & "改变前的"
End Sub
可以用鼠标右键删除字符,这样触发了change事件,但是无keypress事件
另外,delete键删除字符也没kepress
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Const VK_CONTROL = &H11
Private Const KEYEVENTF_KEYUP = &H2
Private disa As BooleanPrivate Sub Text1_Change()
Text1.SetFocus
If disa = False Then
keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0
keybd_event Asc("Z"), MapVirtualKey(Asc("Z"), 0), 0, 0
keybd_event Asc("Z"), MapVirtualKey(Asc("Z"), 0), KEYEVENTF_KEYUP, 0
keybd_event VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0
disa = True
End If
End Sub
Delete则用KeyDown事件替换KeyPress
对于没有提供类似BeforeChange一类事件的控件来说,最容易想到也是最基本的也就是你说的这样做了.
我这所以要和你进一步讨论KeyPress等,只是因为在很多时候,我们会需要做更多的处理, 以便用户录入起来更方便.比如说,当用户输入了无效字符时,要把当前值恢复为原始值,并且当前字符位置也要恢复,这就需要在KeyPress等事件中做处理.补充两点:
1,我在2楼中的代码你可能没仔细测试,你说"这个还要考虑text1.sellength吧?在选择了某些文本的情况下,再键入值就是替换了",但事实上我这代码已经考虑了这点的.
2,delete键在KeyDown事件中通过KeyCode参数可识别.
我来做个补充:
1,如果是功能键(比如回车)要过滤掉,因为这个受单行文本和多行文本的限制;
2,如阁下所说:在keycode中处理delete(不过一般来说,如果只是做校验,是不需要处理delete的);
3,如果用来做校验,还是要处理右键菜单才行的
做了这几点,用它做校验就比较完善了
在文本框输入的中间状态,Text 值并不能一直“合法有效”的,比如一个非空字段中,我准备全选、按 DELETE 清除、重新输入,那么清除时的 Text 并不是有效的,难道你就马上恢复旧值了?标准的做法是在 Validate 事件中进行校验,最多如果你存有旧值,校验非法时恢复一下,这就够了。
Validate 这个事件好像在用了一些表格或者皮肤控件之后有点小问题。