【问题标题】:DELPHI. How to close the modal form just after calling another modal form德尔福。如何在调用另一个模态表单后关闭模态表单
【发布时间】:2013-12-17 08:52:41
【问题描述】:

在 MDI 应用程序中,有一个打开的模态表单 A。表单 B 显示为表单 A 的模态。 如何在调用模态表单 B 后关闭模态表单 A?

【问题讨论】:

  • 你可以尝试调用FormA.Hide;它会隐藏表单但不会关闭,就好像 FormB 是 FormA 的子级一样,我认为您无法关闭父级。
  • 也许在这里使用向导比使用孤立但连续的模态形式更好?
  • 你不能 - 模态表单的全部意义在于用户有义务在继续之前完成它(即提供 ModalResult)。如果您发现您必须使用一些技巧来使其行为有所不同,那么我建议您需要重新审视您的设计。
  • @Hugh:问题通常不是用户是否完成了第一个模态表单,而是第一个表单中的逻辑需要控制接下来按顺序显示哪个模态表单。虽然有很多方法可以控制这一点,但通常在定义应用程序结构之后,需求就会出现,并且没有能力重新审视结构决策……直到下一个主要版本,等等。
  • @Mark - 当然。我在 OP 的另一个背景下回答这个问题,我认为这表明我们正处于设计的早期阶段。

标签: delphi delphi-xe


【解决方案1】:

模态意味着终生嵌套。当一个模态窗体打开另一个模态窗体时,第一个窗体需要在第二个模态窗体的整个生命周期内保留。

因此,您需要做的是在显示第二个模态表单之前关闭第一个模态表单。从第一个模态表单内部执行此操作有点棘手,因此最好向主表单寻求帮助。主窗体可以:

  1. 在第一个模态表单上调用 Free
  2. 创建并显示第二个模态表单。

如果第一个模态表单需要从它自己的一个事件处理程序中触发它,那么最好的方法是让第一个模态表单将消息排队到主表单。例如PostMessageTThread.Queue

【讨论】:

  • PostMessage(Self.Handle,wm_close,0,0);在第一个模态表单中,仅在第二个模态表单关闭后才关闭第一个模态表单;
  • @Avrob 是的。请参阅我的答案的第一段。
  • @Arioch'The 取决于您是否正确使用表单的生命周期!
  • 如果表单是自动创建的,直到应用退出才被释放,只是显示和隐藏 - 那有什么问题?
  • 嗯,猜猜在这个特定的工作流程中,CPS 风格的 XE5 ShowModal 重载可能会更好:-D
【解决方案2】:

将模态显示表单的ModalResult 属性设置为mrNone 以外的值将导致表单关闭。

procedure TFormA.Button1Click(Sender: TObject);
begin
  ShowFormBModal;
  ModalResult := mrCancel; // this will close Form A if it's being shown modally
end;

根据您的要求,ModalResult的实际值可能取决于Form B的模态结果或其他条件。

【讨论】:

  • 问题的措辞很糟糕,但 Dvid 回答下面的讨论表明他是对的:在显示两种形式后,OP 不需要 A 与 B 一起关闭,他希望 A 在用户关闭时关闭与 B 合作
  • @Arioch'我认为问题很清楚,答案也很清楚。
  • 任何关于“调用表单”的文本都不能有严格的意义,因此不能清楚:-)
  • @TOndrej:ShowFormBModal 是做什么的?
  • ShowFormb 根据输入值创建一个 MDIChid 窗口或什么都不做。
【解决方案3】:

在显示模态 FormB 之前隐藏 FormA。然后根据 FormB 的 ModalResult 显示或关闭 formA。

Hide; 
FormB.ShowModal; 
if FormB.ModalResult <> mrOK then Close; 

ModalResult = mrOK 表示 Formb 已经打开了一个 MDIchild 表单并被关闭了。

【讨论】:

    【解决方案4】:

    在关闭第一个模态窗体之前,我会向应用程序的主窗体(或其他)发布一条自定义消息,这将导致它显示第二个模态窗体。我更喜欢两种形式的“所有者”都在控制之中的想法。

    PostMessage(Application.Mainform.Handle, DO_OPEN_2ND_MODALFORM, 0, 0);

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多