如何使事件处理程序与其他事件处理程序交换消息)

时间:2010-06-22 11:17:03

标签: delphi

假设我写了一个button1click事件处理程序,在调用时(即当click1单击时)继续向变量计数器添加1:

var 
i : counter;
begin
while 1 = 1 do
inc(i);
end;

现在我想在我的表单上添加另一个按钮,并将其命名为“停止”,这将突然退出 button1click(在被调用之后)或者阻止它向计数器添加1,我该怎么做?

3 个答案:

答案 0 :(得分:3)

希望这将提供一些关于如何根据您的需求调整基于计时器的方法的想法:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;  // with Interval = 1 (for example) and Enabled = FALSE
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Execute(Sender: TObject);
  private
    fCounter: Integer;
  end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := TRUE;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer1.Enabled := FALSE;
end;


procedure TForm1.Timer1Execute(Sender: TObject);
begin
  Inc(fCounter);
end;

如果您的需求更加复杂,那么基于TThread的方法可能更合适。但无论你做什么,都不要求助于 Application.ProcessMessages 它只会让你感到悲伤!

答案 1 :(得分:2)

  1. Application.ProcessMessages放在里面。这允许其他控件处理和响应事件。
  2. 创建一个全局变量“停止”。
  3. 在停止按钮事件处理程序中,将Stop设置为true。
  4. 在你的同时,检查Stop和break的值是否为真。
  5. 但是,做这样的事情并不是一个好习惯。你在表单中做的所有事情应该是对某些事件的反应,所以如果你想做一些定期的事情,你应该使用计时器或类似的东西。

答案 2 :(得分:2)

你可以把你的时间放在一个单独的线程中。简单的TThread就足够了,但也有特殊的线程库,如AsyncCalls或OmniThreadLibrary。