2

我使用 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 应用程序?

4

1 回答 1

2

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

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

查看 VCL Metropolitan UI 分屏应用程序中生成的两个表单,可以看出在使用组件的方式上没有任何异常,因此除了生成的实际代码之外没有任何影响行为。(它们是常用TPanel的 、TGridPanelTGestureManager和其他标准 VCL 组件;我看不到任何其他 VCL 应用程序无法使用的东西。)

测试表明,Close在主窗体中像往常一样退出应用程序。因此,没有功能上的区别。快速浏览 VCL 源代码表明 Metropolitan 应用程序没有替代代码路径。

Closeand之间唯一真正的区别Application.TerminateClose检查它是否是模态形式以及是否OnCloseQuery已分配并应该调用 an。然后它检查它是否是主窗体;如果是,它只是调用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。)

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

于 2013-08-01T20:56:10.167 回答