Application.OnIdle继续执行

时间:2011-12-22 10:19:36

标签: delphi event-handling

当我的应用程序处于空闲状态时,我正在尝试处理某些事件,因此我创建了此代码

procedure TForm1.ApplicationEventIdle(Sender: TObject; var Done: Boolean);
begin
      Done := false;
      ShowMessage('Hello');
      Done := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := ApplicationEventIdle;
end;

问题是消息框无限次出现我怎么才能只显示一次?

2 个答案:

答案 0 :(得分:11)

出现此行为正是因为您显示了对话框。要关闭对话框,您必须单击“确定”按钮。这会在队列中放置输入消息。处理完毕后,OnIdle事件将触发。然后再次显示消息框。等等等等。

您需要确保在OnIdle处理程序中不执行任何需要用户输入的操作。在您的情况下,尝试输出到日志而不是显示对话框,例如OutputDebugString的。

答案 1 :(得分:0)

在TForm1中创建一个私有布尔字段,以指示对话框何时显示,因此您不会再显示它。

procedure TForm1.ApplicationEventIdle(Sender: TObject; var Done: Boolean);
begin
  if not FDialogShown then
  begin
    FDialogShown := True;
    ShowMessage('Hello');
  end;
end;