你可以用一个变量,当KEYDOWN发生后,置为TRUE,当KEYUP发生后在FALSE;在KEYDOWN事件里判断是否FALSE,否则不执行。

解决方案 »

  1.   

    应该是这样的~~~你不KEYUP,不就是连续了吗?
      

  2.   

    在keydown事件最后向edit发送消息啊,或者直接一点
    Edit1.OnKeyUp(sender,key,shift);
    马上执行keyup
      

  3.   

    是不是要实现
    比如说当一个按钮按住不放时,不停的累加一个数字这样的功能?
    你可以用Timer:当按钮按下时,Timer.enable,当按钮弹起时,
    Timer.disable.在timer.timer中触发事件。
      

  4.   

    sendmessage(botton.handle,WM_KEYUP,0,0)
      

  5.   

    在keydown事件里调用keyup事件
    就可以了
    ,这样执行kedown时,就必须执行keyup了
      

  6.   

    但是我在KEYUP中所取的值是在KEYDOWN完了才开始变化的啊,比如STRINGGRID中的COL OR ROW。所以必须在KEYDOWN完了之后才能执行KEYUP!!谢谢
      

  7.   

    我建议做一个继承你当前的控件类
    然后把WM_KEYUP和WM_KEYDOWN时间都截下来,
    再定义一个标识property sign
    WM_KEYUP事件 begin
      if sign:=true then
      begin
       //执行代码
        ...
        ...
       
       sign:=false; 
      end;
     end;WM_KEYDOWN事件里:
    begin
    sign:=true;
    end;还没有试过,理论上应该可以
      

  8.   

    当执行过一次keydown以后,设置一个全局信号,当再次触发的时候监测这个全局信号,确定是否执行和是否让key:=0;
    关于执行了keydown就执行keyup很简单,只要在keydown函数里调用keyup函数就可以了
      

  9.   

    同意 : stanely(俺是邢她汉子)
      

  10.   

    我要实现的功能:
       在STRINGGRID中编辑单元格,当按ENTER时单元格内容改变,当按TAB,UP,DOWN时,单元格内容变回编辑前的状态。
       我在KEYDOWN中取得新的单元格,在KEYUP中把旧的填回去,一个一个的按都没问题,但当按键过快后,则内容出现错误。(如在键盘上快速乱敲)
    帮帮忙
      

  11.   

    这样做是不行的:你把Key按住不放时,会不停触发Keydown,
    或者先按第一个键,再先按第二个键,再放第二个键,再放第一个键,
    也会有问题!
    建议不要在KEYDOWN中取得新的单元格,而是KEYUP中取得新的单元格并且把旧的填回去
      

  12.   

    否则只有通过设定变量:
    implementation
    var
      KeyPressed:Boolean;
    ....procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if KeyPressed then Exit;
      KeyPressed :=True; 
      .....
    end;procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if not KeyPressed then Exit;
      KeyPressed :=False; 
      ....
    end;