2013-07-31 211 views
2

我在File-New菜单上使用VCL Metropolis UI Application创建了一个Metro应用程序。关闭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

无法进行30秒的测试(或者不管你需要输入'Application.Terminate'并运行应用程序,然后将其更改为'Close'并运行应用程序)回答这个问题? –

+3

delphi VCL应用程序仍然是一个持续运行的“真正”x86应用程序。不要将“Metro(polis)用户界面应用程序”与运行在WinRT上的“Metro应用程序”混为一谈。您的delphi应用程序仍然是Windows 8的常规桌面应用程序。 –

+0

@Ken ...很显然,我已经知道什么关闭了,我也知道应用终止从Delphi 1开始25年编程后的工作情况......但我只是想知道为什么他们选择调用Application.Terminate ...当大多数时候你看到Close ? – Bill

回答

1

由于没有其他人在这里提供了一个答案...

大都市UI应用程序使用TSplitForm = class(TForm)TDetailForm = class(TForm),其中TFormForms.TForm。没有什么不同,所以唯一的问题是大都会用户界面中的东西是否会改变事物。

查看VCL Metropolitan UI拆分屏幕应用程序中的两个生成表单,显示使用的组件的方式没有任何不寻常之处,因此除了生成的实际代码之外,没有任何操作会影响行为。 (他们通常TPanelTGridPanelTGestureManager,和其他标准的VCL组件。没有什么我可以看到正在使用的是不提供给任何其他VCL应用程序)

的测试表明,Close在主窗体照常退出应用程序。因此,没有功能差异。快速浏览VCL源代码说,大都会应用程序没有备用代码路径。

CloseApplication.Terminate之间唯一的区别是,Close检查,看它是否是一个模态窗体或不和OnCloseQuery是否已被分配,应该被调用。然后检查它是否是主要形式;如果是,它只需调用Application.Terminate。来自VCL.Forms,XE4 Update 1,约。 line#6812:

if Application.MainForm = Self then Application.Terminate 

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

实际上,经过认真审查由地铁VCL模板生成的代码,它看起来像调用Application.Terminate由精确因为它跳过正常Form.Close处理,并立即退出,这可能是更典型的实Metro应用程序。 (这也是该关注CloseButton实际上不是按钮,而是代替TImage

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