Delphi 如何在打开模式窗体后立即关闭它?

Delphi 如何在打开模式窗体后立即关闭它?,delphi,dialog,Delphi,Dialog,在我的应用程序中,我希望打开一个对话框,在某些情况下,该对话框应该立即关闭(在短消息之后) 我试过这个: procedure TForm2.FormActivate(Sender: TObject); begin if SomeCondition then begin ShowMessage('You can''t use this dialog right now.'); close; modalresult := mrCancel; end; end;

在我的应用程序中,我希望打开一个对话框,在某些情况下,该对话框应该立即关闭(在短消息之后)

我试过这个:

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事件中,但结果是一样的


为什么这不起作用呢?

在表单打开之前检查特定情况,而不打开表单,不是更容易吗

我看不出表单保持打开状态的原因,在单击“显示消息”对话框上的“确定”后,它应该立即消失

showmessage正在被阻止,因此在确定之前您无法关闭(如果您需要在关闭之前关闭,则可以返回不同的模式结果(或自行创建与现有结果不冲突的结果,如mrUnavailable=12)。然后,如果ModalResult为mrUnavailable,则可以显示消息

如果它正在运行代码但没有关闭,则尝试使用
Release
而不是close


编辑:如果您在多个地方使用同一表单,除非每次都要重新创建表单,否则不要使用Release!按照其他人的建议发布关闭消息,而不是直接调用close

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

procedure TForm2.FormActivate(Sender: TObject);
begin
  ShowMessage('You can''t use this dialog right now.');
  PostMessage(Self.Handle,wm_close,0,0);
end;
您可以尝试使用计时器:

  • 将计时器设置为低间隔(20)
  • 在OnTimer事件上,关闭表单
  • 在FormActivate事件上启用计时器

我从几个地方打开对话框,我不想检查每个地方。然后使用一种可以从多个地方调用的方法。使用该方法进行检查,如果可以,只打开formI接受的巴拉特的答案,即使你的答案几乎相同。抱歉,他比你领先了两秒:-)@Svein-这里,因此,我的答案以37秒击败了他的答案。但无论如何,它离我们很近,所以我们不会对此大惊小怪。:-)正如爱因斯坦所说:对时间的感知取决于你的速度。投票支持这个答案是因为