2011-12-22 94 views
1

我想处理一些事件时,我的应用程序是空闲的,所以我创造了这个代码Application.OnIdle保持执行

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; 

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

回答

9

这种行为恰好发生,因为你显示对话框。为了关闭对话框,你必须点击OK按钮。这将输入消息放置在队列中。在处理之后,OnIdle事件触发。然后你再次显示消息框。等等等等。

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

+0

这很有意义,谢谢 – opc0de 2011-12-22 10:34:33

0

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

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

你需要在某处设置标志为false – 2011-12-22 10:44:14