unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    AdShowing : Boolean;
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
     AdShowing := True;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
     AdShowing:=false;  Timer1.Enabled := false;
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
     AdShowing := True;  Timer2.Enabled := false;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
     if adshowing then
     begin
          ShowMessage('True');
     end else
     begin
          ShowMessage('False');
     end;end;procedure TForm1.Button1Click(Sender: TObject);
begin
     Timer1.Enabled := True;
     Timer2.Enabled := True;    
end;end.Timer1和Timer2都是设置的Interval=1000 Enabled=False
程序打开后,点击Button1,过一秒钟后点击Button2,为何会是‘False’?
在Button1Click中Timer1先执行,Timer2后执行,AdShowing应该是True啊,大家试试

解决方案 »

  1.   

    timer2并不会等着timer1执行完才执行,他们是并行的
      

  2.   

    对啊,他们同时开始计时,但是微观上Timer2还是要晚点,而且他们的OnTimer事件中的代码基本一样,耗时也一样,结果应该是AdShowing=True才解释得过
      

  3.   

    而且我试过很多次,每次结果都一样,说明Timer1和Timer2根本不是竞争,而是在Button1Click中
    先执行哪个Timer,AdShowing的结果就是相对应的OnTimer中的值
      

  4.   

    这个问题应该和消息机制有关,具体不是很清楚,不过改为以下代码加入HandleMessage就会按顺序来执行.
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Application.HandleMessage;
      Timer1.Enabled := True;
      Application.HandleMessage;
      Timer2.Enabled := True;
    end;