关闭Metro应用程序

时间:2013-07-31 17:01:28

标签: delphi delphi-xe4

我在File-New菜单上使用VCL Metropolis UI Application创建了一个Metro应用程序。

我很惊讶他们用以下方式关闭了应用程序:

procedure TSplitForm.CloseButtonClick(Sender: TObject);
{ CloseButtonClick. }
begin
  Application.Terminate;
end;

rather than the usual:
procedure TSplitForm.Close1Click(Sender: TObject);
{ Close1Click. }
begin
  Close;
end;

我看到Application.Terminate只发布一个PostQuitMessage(0);

关闭和终止之间是否有任何区别......是否有必要使用Application.Terminate关闭Metro应用程序?

1 个答案:

答案 0 :(得分:1)

因为没有人在这里提供答案......

Metropolitan UI应用程序使用TSplitForm = class(TForm)TDetailForm = class(TForm),其中TFormForms.TForm。关于它没有什么不同,所以唯一的问题是大都会UI中的某些东西是否会改变。

在VCL Metropolitan UI分屏应用程序中查看两个生成的表单,在使用的组件方式上没有任何异常,因此除了生成的实际代码之外,没有什么会影响行为。 (它们是通常的TPanelTGridPanelTGestureManager和其他标准VCL组件;我无法看到任何其他VCL应用程序无法使用的内容。)< / p>

测试显示主窗体中的Close像往常一样退出应用程序。因此,没有功能差异。快速浏览VCL消息来源说,大都会应用程序没有替代代码路径。

CloseApplication.Terminate之间唯一真正的区别在于Close会检查它是否为模态形式以及是否已分配OnCloseQuery且应该是调用。然后检查它是否是主要形式;如果是,则只需调用Application.Terminate。从VCL.Forms,XE4 Update 1,约。第#6812行:

if Application.MainForm = Self then Application.Terminate

Metropolitan VCL应用程序模板似乎只是避免了通常的关闭处理并直接终止应用程序。 没有迹象表明为什么我需要找到它。

实际上,在仔细查看Metro VCL模板生成的代码之后,看起来Application.Terminate的调用正好是,因为它会跳过正常的Form.Close处理并立即退出,这可能是真正的Metro应用程序的典型。 (CloseButton实际上并不是一个按钮,而是一个TImage,这也是有趣的。)

为什么它使用Application.Terminate而不是通常的Close的明确答案可能只有在参与编写IDE生成的应用程序模板的人停下并告诉我们时才能确定。 :-)