Как закрыть модальную форму сразу после ее открытия?

из моего приложения я хочу открыть диалоговое окно, которое должно закрыться немедленно (после короткого сообщения) при некоторых обстоятельствах.

Я попытался это:

procedure TForm2.FormActivate(Sender: TObject);
begin
  if SomeCondition then
  begin
    ShowMessage('You can''t use this dialog right now.');
    close;
    modalresult := mrCancel;
  end;
end;

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

почему это не работает?

4 ответов


попробуй этот

procedure TForm2.FormActivate(Sender: TObject);
begin
  ShowMessage('You can''t use this dialog right now.');
  PostMessage(Self.Handle,wm_close,0,0);
end;

опубликовать сообщение WM_CLOSE вместо прямого вызова close;

ShowMessage('You can''t use this dialog right now.');
PostMessage(Handle, WM_CLOSE, 0, 0);
modalresult := mrCancel;

не было бы проще проверить определенное обстоятельство до открытия формы и не открывать ее?

Я не вижу причины для того, чтобы форма оставалась открытой, она должна исчезнуть сразу после нажатия OK показать окно сообщения.

showmessage блокируется, поэтому вы не сможете закрыть, пока это не будет нормально (если вам нужно закрыть до этого, вы можете вернуть другой модальный результат (или сделать свой собственный, который не конфликтует с существующими, такими как mrUnavailable = 12). Затем вы можете показать сообщение, если ModalResult был mrunavailable.

если он работает с кодом и просто не закрывается, попробуйте использовать Release вместо close.

Edit: если вы повторно используете одну и ту же форму в нескольких местах, не используйте Release, если вы не хотите каждый раз воссоздавать форму! Опубликуйте сообщение "закрыть", как предложили другие


вы можете попробовать таймер:

  • установите таймер на низкий интервал (20)
  • в событии OnTimer закройте форму;
  • включить таймер на событии FormActivate