【问题标题】:How do I close a modal form right after opening it?如何在打开模态表单后立即关闭它?
【发布时间】:2010-08-06 08:38:16
【问题描述】:

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

我试过了:

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

为什么这不起作用?

【问题讨论】:

    标签: delphi dialog


    【解决方案1】:

    发布 WM_CLOSE 消息,而不是直接调用 close;

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

    【讨论】:

    • 我接受了 Bharat 的回答,尽管您的回答几乎相同。对不起。他比你多两秒 :-)
    • @Svein - 在这里,SO 显示我的答案在 37 秒内击败了他。但无论如何,它已经足够接近了,不会大惊小怪。 :-)
    • 正如爱因斯坦所说:对时间的感知取决于你的速度。
    • 因为 mrCancel 而投票赞成这个答案
    【解决方案2】:

    试试这个

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

    【讨论】:

      【解决方案3】:

      在表单打开之前检查某些情况而不打开它不是更容易吗?

      我看不到表单保持打开状态的原因,在显示消息对话框上单击 OK 后它应该会立即消失。

      显示消息被阻止,因此您将无法关闭,直到一切正常(如果您需要在此之前关闭,您可以返回不同的模态结果(或者自己制作与现有的不冲突的结果)例如 mrUnavailable = 12)。然后,如果 ModalResult 是 mrunavailable,则可以显示消息。

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

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

      【讨论】:

      • 我从几个地方打开对话框,我不想检查每个地方。
      • 然后使用可以从多个地方调用的方法。在该方法中进行检查,如果没问题,然后打开表单
      【解决方案4】:

      你可以试试计时器:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 2020-05-23
        • 2017-08-20
        • 2017-11-21
        • 2014-11-23
        相关资源
        最近更新 更多