if btn_1.enabled then
  begin
   btn_1.enabled := false;
   sleep(2000);
   FormMain.caption :='1';
   sleep(2000);
   FormMain.caption :='2';
   btn_1.enabled := true;
  end;

解决方案 »

  1.   

    加个全局变量?不会吧,那个鼠标的click消息应该是在堆栈里面,当onclick返回后,堆栈里的鼠标消息被处理,那么也就是说,我这个onclick事件执行的两次是顺序执行的 ?加全局变量能有用?我身边没有delphi, 不过,我认为楼上的解决办法是有问题的.当然,谢谢!
      

  2.   

    var b:boolean;
    b:=true;
    func onclick()
    begin
    if not b then exit;
    ...
    b:=false;
    end;
      

  3.   

    为什么要加开关,只需要把 onclick事件赋空就可以了
    btn_1.btn_1onclick(send:Tobject);
    begin
       btn_1.onclick := nil;
       FormMain.caption :='1';
       FormMain.caption :='2';
       btn_1.onclick := btnonclick;
    end;
      

  4.   

    忘了加 procedure,哈哈
    procedure btn_1.btn_1onclick(send:Tobject);
    begin
       btn_1.onclick := nil;
       FormMain.caption :='1';
       FormMain.caption :='2';
       btn_1.onclick := btnonclick;
    end;
      

  5.   

    button.onclick;
    begin
      ....
      Button.Enabled := False;
    end;
      

  6.   

    我这样试一下,是可以的,不过总感觉太复杂了点。
    procedure TFormMain.btn_1Click(Sender: TObject);
    begin
      if FiLock = 0 then begin
        Inc(FiLock);
        btn_1.Enabled := False;
        try
          btn_1.onclick := nil;
          sleep(1000);
          FormMain.caption :='1';
          sleep(1000);
          FormMain.caption :='2';
        fianlly
          Dec(FiLock);
        end;
      end;
    end;procedure TFormMain.FormCreate(Sender: TObject);
    begin
      FiLock := 0;
    end;
      

  7.   

    感谢大家的关注,我觉得楼上的设置onclik := nil,真的不错,我明天去做一下,希望大家都是实践过的,不过感觉好象还是....
      

  8.   

    还是不行啊,我上面的办法都试过了,都不行,因为这不是一段代码重入的问题,实际上onclik在任何时候都只有一个执行。我的问题是在按钮变灰的时候在按钮上电击,这次点击会有效,我现在要求是在变灰时的点击无效!
      

  9.   

    你如果要在变灰后不执行onclik事件里的代码功能,简单的就是onclik 代码一开始就判断enabled 的值嘛,如果是FALSE就跳过后面的代码,这样onclik 事件虽然回被响应,但不会重复执行真正的代码功能啊,看上去就象只响应了一次。也就是说实际是有效点饥,但看上去是点击无效。
      

  10.   

    这样是
    ///
    if button1.tag=1 then exit;
    button1.tag:=;
    ....
    代的代码
    end;
      

  11.   

    有一个办法解决是这样的,onclick结束的时候获得一个时间。onclick开始的时候获得一个时间,并判断和onclick结束的时间的间隔,如果间隔太短,那么exit.
    当时,如果onclik事件执行的时间足够长,在button变灰的时间内鼠标单击的次数足够多,那么,这招也是不管用的,可能唯一的办法是退出onclick事件的时候,清空消息队列,可是这应该怎么做呢,欢迎大家继续讨论。
      

  12.   

    fermium(列御寇) ,你把我上面的代码拿回去修改再试一下好吗?你会发现问题不是这么简单的。谢谢你的关注。
      

  13.   

    我现在在山东出差,手边没有DELPHI,下面是我在news.marcocantu.it上问别人的回答,你试一下下面的代码:btn_1.enabled := false;
       Caption := Caption +' Dis-';
       Caption := Caption +'1';
       sleep(2000);
       Application.ProcessMessage;
       Caption := Caption +'2';
       sleep(2000);
       Application.ProcessMessage;
       Caption := Caption +'3';
       sleep(2000);
       Application.ProcessMessage;
       Caption := Caption +'-En ';
       btn_1.enabled := true;
    回答的人叫:Humberto Jemma (Brazil巴西)
    我回成都也会试一下
      

  14.   

    Humberto Jemma的方法我测试了,可行
      

  15.   

    在你的语句里加上application.processmessage 就行了,不然,你点一下就会执行一次,不管是否灰化,队列里还是有啊???
      

  16.   

    这样简单,用BlockInput:btn_1.enabled := false;
    BlockInput(true);  //<-------
    sleep(2000);
    FormMain.caption :='1';
    sleep(2000);
    FormMain.caption :='2';
    btn_1.enabled := true;
    BlockInput(false);   //<-------
      

  17.   

    呵呵,果然还是有高手啊!谢谢大家关注,我终于明白了,以前我没有明白的是:
    1、application.processmessage的用法(看来对delphi的消息处理机制没有去了解过)
    2、至于blockinput(这可是带星好的大大给的)我也不知道用,等下去看帮助去。
      

  18.   

    可是blockinput这个函数好象没有啊?有的话告诉我,我翻遍了 delphi的帮助!