//点击一个按钮然后把其他的按钮禁用掉,等检索完数据后再把它们解开,但是在它们被禁用期间竟然能
//相应鼠标的点击时间,我百思不得其解,大家来帮我看看.
//代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB,  Buttons, StdCtrls,
  ExtCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ds1: TDataSource;
    dbgrd1: TDBGrid;
    btn1: TButton;
    btn2: TButton;
    btn3: TBitBtn;
    btn4: TSpeedButton;
    edt1: TEdit;
    ADOQuery1: TADOQuery;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
begin
  edt1.SetFocus;
  btn1.Enabled:=False;
  btn2.Enabled:=False;
  btn3.Enabled:=False;
  btn4.Enabled:=False;
  ADOQuery1.Close;
  ADOQuery1.Open;
  btn1.Enabled:=True;
  btn2.Enabled:=True;
  btn3.Enabled:=True;
  btn4.Enabled:=True;
end;procedure TForm1.btn2Click(Sender: TObject);
begin
  edt1.Text:=edt1.Text+'btn2Click';
end;procedure TForm1.btn3Click(Sender: TObject);
begin
  edt1.Text:=edt1.Text+'btn3Click';
end;procedure TForm1.btn4Click(Sender: TObject);
begin
  edt1.Text:=edt1.Text+'btn4Click';
end;procedure TForm1.btn2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    edt1.Text:=edt1.Text+'btn2MouseDown';
end;end.

解决方案 »

  1.   

    可能是
    ADOQuery1.Close;
    ADOQuery1.Open;
    所用的时间太短了, 要不你在
    ADOQuery1.Close;
    ADOQuery1.Open;
    Sleep(5000);
    Self.UpdateControlState;
    这样试试看
      

  2.   

    ADOQuery1.Close;
    ADOQuery1.Open;
    所用的时间所用的时间足够长了,在检索的这段时间里你点击其他按钮看看,它们仍然能相应鼠标点击事件
      

  3.   

    edt1.SetFocus;
      btn1.Enabled:=False;
      btn2.Enabled:=False;
      btn3.Enabled:=False;
      btn4.Enabled:=False;
    在这之后加入
    Self.UpdateControlState; 
    试试
      

  4.   

    再回旺仔的话,还是不行,Action在那里用?怎样用?
      

  5.   

    感觉不是button的问题,你换个全局变量来标记试试。
      

  6.   

    你就是想要btn1Click这个事件不能重叠执行是吧?
    咱们优秀的程序员解决问题不能只走一条路嘛。
    在Implementation部分,或者这个窗体的Private区,声明一个变量mBtnClickRunning: Boolean;
    将其初始化为false。procedure TForm1.btn1Click(Sender: TObject);
    begin
      if not mBtnClickRunning then
      begin  
        mBtnClickRunning := true;
        edt1.SetFocus;
        btn1.Enabled:=False;
        btn2.Enabled:=False;
        btn3.Enabled:=False;
        btn4.Enabled:=False;
        ADOQuery1.Close;
        ADOQuery1.Open;
        btn1.Enabled:=True;
        btn2.Enabled:=True;
        btn3.Enabled:=True;
        btn4.Enabled:=True;
        mBtnClickRunning := false;
      end;
    end;
      

  7.   

    edt1.SetFocus;
      btn1.Enabled:=False;
      btn2.Enabled:=False;
      btn3.Enabled:=False;
      btn4.Enabled:=False;  Application.ProcessMessages;  //加上这句  ADOQuery1.Close;
      ADOQuery1.Open;
      btn1.Enabled:=True;
      btn2.Enabled:=True;
      btn3.Enabled:=True;
      btn4.Enabled:=True;
      

  8.   

    回 fengqingwanzhong(风情万种) 大人的话,你的方法我已经试过,还是不行。
    回 chuchu(维他命C)大人的话,你做法是可行的,但是这种情况不是我想要的,我要的是在检索过程中,所有的按钮都不能点击执行。
    不管能不能解决,我都谢谢各位大人了。希望大家继续帮忙,小弟万分感谢。
    说句实话我现在用鼠标钩子屏蔽点击事件,但是仍然不行。这是一个很诡异的问题。
    以下是波兰公司帮助文档的Enabled说明,它说得很清楚,是否相应鼠标\键盘和时间的事件,可是事情偏偏不是这样.我希望大家能把我的例子用在你们的机子上调试看看,是不是我的系统出了问题.如果再不能解决,我只好去找波兰公司了(说说而已,我那敢去找波兰啊,因为我用的是盗版的delphi7啊!).
    =============革命尚未成功,筒子仍须努力!===============
    VCL Reference
    Enabled property (TControl)TControl See also
    Controls whether the control responds to mouse, keyboard, and timer events. Delphi syntax:property Enabled: Boolean;C++ syntax:__property bool Enabled = {read=GetEnabled, write=SetEnabled, stored=IsEnabledStored, default=1};DescriptionUse Enabled to change the availability of the control to the user. To disable a control, set Enabled to false. Disabled controls appear dimmed. If Enabled is false, the control ignores mouse, keyboard, and timer events.To re-enable a control, set Enabled to true. The control is no longer dimmed, and the user can use the control.
      

  9.   

    不要在同一个函数(事件)中重复设置控件的可用状态
    在ADOQuery1的AfterOpen事件中把按钮状态置过来!
      btn1.Enabled:=True;
      btn2.Enabled:=True;
      btn3.Enabled:=True;
      btn4.Enabled:=True;
      

  10.   

    回holylts(海岸)大人的话,你的方案我也已经试过,还是不行。
      

  11.   

    lz的意思是屏蔽MouseDown事件吧!这个是在消息循环中控制的和控件的enable属性无关,最简单的办法是查询单独启动一个线程,把主线程的消息获取屏蔽(自己完成消息的读取、分发和抛弃),还有就是覆盖需要屏蔽指定消息的控件的消息处理函数比如楼主可以从TButton继承一个Tmybt,在下面写MouseDown消息的处理函数,最后还有一个办法是干脆加一个消息处理过滤器!最后哪个办法是最简单的,不过效率妈有点低!
      

  12.   

    楼主贴出你的sql看看,感觉问题不应该出在button上,所以拦截消息应该也没有太大作用,效果和设置Enable没多大区别。楼主形容的情况像是在访问数据库时启用了另外一个线程,在我印象里好像delphi不会自动为TADOQuery建立单独线程的,相反大家为了避免用户等待,界面没有响应还会手动建立线程。楼主会不会在sql启动了一些delphi以外的程序呢?比如调用了一个存储过程?另外问楼主一句,你说的“按钮还能起作用”,是指他们都变成正常样子了,还是仍然是灰的,但是却响应点击事件?
      

  13.   

    procedure TForm1.btn1Click(Sender: TObject);
    begin
      edt1.SetFocus;
      btn1.Enabled:=False;
      btn2.Enabled:=False;
      btn3.Enabled:=False;
      btn4.Enabled:=False;
      ADOQuery1.Close;
      ADOQuery1.Open;
      btn1.Enabled:=True;
      btn2.Enabled:=True;
      btn3.Enabled:=True;
      btn4.Enabled:=True;
    end;
    你这么写不就是瞎掰吗。
      

  14.   

    你在代码里直接调用事件,跟现实中操作是不一样的,哪怕你设置了button的enable为false,如果用代码控制也会触发,举个最简单的例子
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        ShowMessage('a');
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
        Button1.Click;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        Button1.Enabled:=false;
    end;自己试试效果就知道了最直接的解决方法:不要在代码里调用