textbox,我需要在其keyup事件过程中作一些比较耗时的处理,并且会在此过程中改变textbox的文本。所以,要求按键输入时,如果前一次按键的keyup事件没有结束,则按键输入的字符暂时不插入textbox中,直到前一次按键处理完毕,才响应本次按键,并且还要能触发keyup事件?这个能做到吗?怎么做?最好能给出代码。谢谢。

解决方案 »

  1.   

    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)      Text1.Enabled = False           你需要处理的代码      Text1.Enabled = True
    End Sub
      

  2.   

    guoxu_009(迟来) , 这样不行的,会使textbox失去焦点。
      

  3.   

    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)      Text1.Enabled = False           你需要处理的代码      Text1.Enabled = True
          text1.setfocusEnd Sub我不知道你的程序界面有多复杂,我用了几个控件试了一下。如果怕失去焦点。
    用:text1.setfocus就可以搞点,光标还是会停留在最后一次位置。
    你再看看。
      

  4.   


        这样不行的。在text1.enabled=false期间的用户输入不能被正确处理。界面没有多复杂。只是这个keyup事件过程需要一点点时间,比如10ms。    所以,一定不能用改变enabled或locked属性的方法来处理。
      

  5.   

    你试试这样行吗?
    先添加一个全局变量
    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
    用于屏蔽处理过程中的输入。
    不知道符合你的要求吗?
    注意:这种方法只适合按一次键屏蔽一次,对于连续按着不松的情况需要改进一下才能屏蔽。
      

  6.   

    你可以尝试做一个字符buffer,然后现将未启动keyup事件时按下的字符,比如我两只手按在键盘的几个钮上不放松,这时将这些字符暂存于buffer然后,等keyup来临,响应时间处理时将buffer输出到textbox;
    咦~~写完才看见要代码,我想这个方法不难实现吧,一个小字符数组,响应一下按键,来一个redim一下,然后在keyup里输出,有点象C里的文件操作
      

  7.   

    zdcwin(赵大成)的方法也会丢失按键。whiledo(小玉) 的方法我再试试。
      

  8.   

    不复杂啊Private Sub Text1_KeyPress(KeyAscii As Integer)
       If 你的验证函数名()=False Then             '判断为False则表示未通过验证
           KeyAscii = 0                      '把KeyAscii设为0值,则text控件不做反应,不接收输入.
       end if
    End If
      

  9.   

    我真的有点怀疑按下一个键,会有多大的处理,
    这种方法应该行的
    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)      Text1.Enabled = False           你需要处理的代码      Text1.Enabled = True
    End Sub
      

  10.   

    SemYum(黄金骑士) , 也不是你说的意思。举个例子来讲:用户在text1中输入两个字符“A”、“B”。第一次按下“A”时,keyup事件过程进行处理,比如处理的结果是把text1中的文本由“A”改成了“A123”,光标在第二个字符,即“A”与“1”之间。接着用户按下“B”时,text1中得到“AB123”,这个是希望得到的正确结果。但是,如果在第一次keyup事件过程还没有结束时,已经接收到了按键“B”,则可能会变成“A123B"。
    这是不希望得到的结果。所以想在处理keyup时,暂缓接收下一次按键。等到过程返回时,才接收“B”字符。并且还要使按下“B”字符的keyup事件也能被触发。上面有网友的方法是把“B”丢弃,这样不符合我的要求。
      

  11.   

    我想你的思路可能有问题。
    一、我实在不理解为什么非要在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的输入进行了大量的分析处理,甚至对粘贴来的数据进行监视。并没有向你说的问题存在。所以我想您可能是思路存在问题。再检查一下你的程序吧。
      

  12.   

    keydown事件如果不松开按键是会一直触发的,如按住“A”不放,会产生一长串“AAAAAAAAAAA”
    你可以在keypress后判断一段时间延时(如500毫秒),然后再加上123
    或者干脆用2个文本框,一个(123)左对齐,一个(AB)右对齐,连在一起,一个用于输入,一个用于添加结尾字符,最简单。
      

  13.   


        谢谢大家的参与。我改用keypress来做了。