如何在打开模态窗口后立即关闭它?

12

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

我尝试了以下方法:

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个回答

20

不要直接调用close方法,而是发送WM_CLOSE消息。

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

我接受了Bharat的答案,尽管你的答案几乎完全相同。抱歉。他比你快了两秒钟 :-) - Svein Bringsli
2
@Svein - 这里,SO显示我的答案比他快了37秒。但无论如何,这已经足够接近了,不必大惊小怪。 :-) - Sertac Akyuz
2
正如爱因斯坦所说:时间的感知取决于你的速度。 - Uwe Raabe
1
因为mrCancel的回答,我投了赞成票。 - Michael Riley - AKA Gunny

16

试试这个

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

5

在表单打开之前检查特定情况并不打开它,这样不是更容易吗?

我看不出表单保持打开的理由,点击显示消息对话框上的OK后,表单应立即消失。

showmessage是阻塞的,所以在它得到确认之前你将无法关闭(如果你需要在此之前关闭,则可以返回不同的模态结果(或者自己创建一个与现有结果不冲突的结果,如mrUnavailable = 12)。然后,如果ModalResult为mrunavailable,你可以显示消息。

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

编辑:如果你在多个地方重复使用相同的表单,请不要使用Release,除非你想每次重新创建表单!像其他人建议的那样发布关闭消息。


我从多个地方打开对话框,而我不想检查每个地方。 - Svein Bringsli
5
然后使用一个可以从多个地方调用的方法。在该方法中进行检查,如果一切正常,才打开表单。 - Marjan Venema

0

你可以尝试使用计时器:

  • 将计时器设置为较低的间隔(20)
  • 在 OnTimer 事件中关闭表单;
  • 在 FormActivate 事件中启用计时器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接