2011-12-22 1 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

Такое поведение происходит именно потому, что вы показываете диалог. Чтобы закрыть диалоговое окно, вы должны нажать кнопку «ОК». Это помещает входное сообщение в очередь. После этого будет обработано событие OnIdle. И вы снова показываете окно сообщения. И так далее, и так далее.

Вам необходимо убедиться, что вы не делаете ничего, что требует ввода пользователя в обработчик OnIdle. В вашем случае попробуйте вывести в журнал, а не показывать диалог, например. OutputDebugString.

+0

Это имеет смысл благодаря – opc0de

0

Создайте личное булевское поле в TForm1, чтобы указать, когда было показано диалоговое окно, чтобы вы не отображали его снова.

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

Вам нужно также установить флаг в значение false –