Application.OnIdle продолжает выполнение - PullRequest
1 голос
/ 22 декабря 2011

Я пытаюсь обработать некоторые события, когда мое приложение не используется, поэтому я создал этот код

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 ]

11 голосов
/ 22 декабря 2011

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

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

0 голосов
/ 22 декабря 2011

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

procedure TForm1.ApplicationEventIdle(Sender: TObject; var Done: Boolean);
begin
  if not FDialogShown then
  begin
    FDialogShown := True;
    ShowMessage('Hello');
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...