textbox,我需要在其keyup事件过程中作一些比较耗时的处理,并且会在此过程中改变textbox的文本。所以,要求按键输入时,如果前一次按键的keyup事件没有结束,则按键输入的字符暂时不插入textbox中,直到前一次按键处理完毕,才响应本次按键,并且还要能触发keyup事件?这个能做到吗?怎么做?最好能给出代码。谢谢。
textbox,我需要在其keyup事件过程中作一些比较耗时的处理,并且会在此过程中改变textbox的文本。所以,要求按键输入时,如果前一次按键的keyup事件没有结束,则按键输入的字符暂时不插入textbox中,直到前一次按键处理完毕,才响应本次按键,并且还要能触发keyup事件?这个能做到吗?怎么做?最好能给出代码。谢谢。
End Sub
text1.setfocusEnd Sub我不知道你的程序界面有多复杂,我用了几个控件试了一下。如果怕失去焦点。
用:text1.setfocus就可以搞点,光标还是会停留在最后一次位置。
你再看看。
这样不行的。在text1.enabled=false期间的用户输入不能被正确处理。界面没有多复杂。只是这个keyup事件过程需要一点点时间,比如10ms。 所以,一定不能用改变enabled或locked属性的方法来处理。
先添加一个全局变量
Dim bKeypress As Boolean
用于记录是否触发按键松开的事件再
Private Sub Form_Load()
bKeypress = False
End Sub然后Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) Dim a
If bKeypress Then Exit Sub
a = Timer
bKeypress = True
While bKeypress
'这一段循环用于模拟你的处理程序
While Timer - a < 3
DoEvents
Wend
bKeypress = False
WendEnd Sub最后在
Private Sub Text1_KeyPress(KeyAscii As Integer)
If bKeypress Then
KeyAscii = 0
Exit Sub
End IfEnd Sub
用于屏蔽处理过程中的输入。
不知道符合你的要求吗?
注意:这种方法只适合按一次键屏蔽一次,对于连续按着不松的情况需要改进一下才能屏蔽。
咦~~写完才看见要代码,我想这个方法不难实现吧,一个小字符数组,响应一下按键,来一个redim一下,然后在keyup里输出,有点象C里的文件操作
If 你的验证函数名()=False Then '判断为False则表示未通过验证
KeyAscii = 0 '把KeyAscii设为0值,则text控件不做反应,不接收输入.
end if
End If
这种方法应该行的
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) Text1.Enabled = False 你需要处理的代码 Text1.Enabled = True
End Sub
这是不希望得到的结果。所以想在处理keyup时,暂缓接收下一次按键。等到过程返回时,才接收“B”字符。并且还要使按下“B”字符的keyup事件也能被触发。上面有网友的方法是把“B”丢弃,这样不符合我的要求。
一、我实在不理解为什么非要在Keyup中处理,为什么不直接在KeyDown中先处理呢?若用户按下“A”键不放,在textbox已键入了n个“A”,你的程序会得到正确的结果吗?
二、你上面举的这个例子中,B被插入到了末尾,我想这不是你说的原因造成的,而当你修改了text属性后,textbox控件的插入位置自然就变为末尾插入了。如果你想得到正确的结果,你需要修改光标的位置才行。
三、我觉得在keyup返回前,可能不会产生下一次keydown事件吧。你可以试下这段代码:
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Debug.Print Timer, "KeyDown"
End SubPrivate Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Debug.Print Timer, "KeyUp"
Dim i As Long, j As Long
For i = 0 To 1000
For j = 0 To 10000
'DoEvents
Next j
Next i
End Sub你一下一下的按键,你会看到两个事件会交替产生,并会感到一点输入的延迟。如果你打开DoEvents语句,两个事件同样会交替产生。但整个过程会被延迟。在我做的控件组中(为避嫌,我不说出控件的名称),有一个maskbox控件,定义了几种输入格式,在那个控件中就对textbox的输入进行了大量的分析处理,甚至对粘贴来的数据进行监视。并没有向你说的问题存在。所以我想您可能是思路存在问题。再检查一下你的程序吧。
你可以在keypress后判断一段时间延时(如500毫秒),然后再加上123
或者干脆用2个文本框,一个(123)左对齐,一个(AB)右对齐,连在一起,一个用于输入,一个用于添加结尾字符,最简单。
谢谢大家的参与。我改用keypress来做了。