当我在极快的时候点击2下 btutton的执行情况 如下  button_onclick(){
do1,
do2,
do3,
do4,
}
当点击第一下的时候 代码开始执行到do2,这时事件还没处理完 。
后第2次的点击事件也开始了 这怎么避免

解决方案 »

  1.   

    button_onclick(){ 
    button.enabled:=false;do1, 
    do2, 
    do3, 
    do4, 
    button.enabled:=true;} 
      

  2.   

    button.enabled := false;
    try
      do1;
      do2;
      do3;
      do4;
    finally
      button.enabled := true;
    end;
      

  3.   

    因为你这个button始终是enable的啊,所以任何时候都能去点。
    所以,在点了以后,应该让它先disable掉,然后等执行结束了再enable
      

  4.   

    这是最好的办法 也是最有效的办法
    在做B/S的时候 为了防止重复提交
    也是这么实现的
    utton.enabled := false; 
    try 
    do1; 
    do2; 
    do3; 
    do4; 
    finally 
    button.enabled := true; 
    end; 
      

  5.   

    只要button_onclick()中没有处理消息循环的代码,它会一直等到do4完成的时候才会再次响应的,所以一般你不用担心重入的问题。但是给用户的感觉不友好,如果处理的时间较长就会出现用户点了按钮之后看起来没什么反应,然后他以为没点中,再次点,结果就执行了两遍。所以建议在前面把Enabled置False,在后面把Enabled置True。当然你可以继承TButton,重写Click方法,在其中加上那两句,然后你都使用你重写过的Button
      

  6.   

    button.enabled := false; 
    try 
     do1; 
     do2; 
     do3; 
     do4; 
    except
     button.enabled := true; 
    end; 
    button.enabled := true;
      

  7.   


    谁说会等到do4完成才会再次响应?
    如果do1,do2,do3,do4里面的操作有能够响应系统消息的代码,那就会重入。并且,按照楼主的代码,do1,do2,do3,do4似乎执行时间比较长,否则也不会考虑重入问题,那么执行时间长的代码,一定要加入响应系统事件的代码,
    否则界面停顿,程序很不友好。所以,这里一定会重入的问题。
      

  8.   


    enabled:=false;
    ....
    enabled:=true;这样不行么?
      

  9.   

    可以再把光標的形狀修改一下,讓用戶相信已點完,執行后再恢復光標形狀
    screen.cursor:=crhourglass;
    screen.cursor:=crdefault;
      

  10.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Self.OnClick := nil;
      do1;
      do2;
      do3;
      do4;
      Self.OnClick := Button1Click;
    end;