我在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应用程序?
答案 0 :(得分:1)
因为没有人在这里提供答案......
Metropolitan UI应用程序使用TSplitForm = class(TForm)
和TDetailForm = class(TForm)
,其中TForm
是Forms.TForm
。关于它没有什么不同,所以唯一的问题是大都会UI中的某些东西是否会改变。
在VCL Metropolitan UI分屏应用程序中查看两个生成的表单,在使用的组件方式上没有任何异常,因此除了生成的实际代码之外,没有什么会影响行为。 (它们是通常的TPanel
,TGridPanel
,TGestureManager
和其他标准VCL组件;我无法看到任何其他VCL应用程序无法使用的内容。)< / p>
测试显示主窗体中的Close
像往常一样退出应用程序。因此,没有功能差异。快速浏览VCL消息来源说,大都会应用程序没有替代代码路径。
Close
和Application.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生成的应用程序模板的人停下并告诉我们时才能确定。 :-)