我想在不执行任何其他代码行的情况下终止 Delphi 应用程序,我想知道哪种方法是正确的。此外,我想知道我目前正在做的事情是否有问题。 基本上,我的代码是这样的:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
这是停止 Delphi 应用程序的正确方法还是应该以其他方式完成?
Application.Terminate()
打破 TApplication.Run()
和 TForm.ShowModal()
中的消息循环,允许主线程正常退出,执行必要的清理等
Vcl.Forms.TApplication.Terminate
结束应用程序执行。
调用
以编程方式结束应用程序。通过调用Terminate
而不是释放应用程序对象,您允许应用程序 以有序的方式关闭.Terminate
调用 Windows APITerminate
函数来执行应用程序的有序关闭。PostQuitMessage
不是即时的。Terminate
在 WM_QUIT 消息和主窗体关闭时自动调用。Terminate
Halt()
,另一方面,是立即异常终止。基本上,将进程从内存中删除。仅在没有其他选择的极端情况下使用它。
启动程序的异常终止。
halt 执行程序异常终止并返回操作系统。
要执行 Delphi 应用程序的正常终止,请在全局
对象上调用Terminate
方法。如果应用程序不使用提供Application
对象的单元,请从主程序块调用Application
过程。Exit
我想在不执行任何其他代码的情况下终止 Delphi 应用程序。
Application.Terminate
和 Halt
都不会实现这一点。前者执行有序终止。将执行大量代码。呼唤Halt
更有希望。那就是异常终止。但是执行单元完成代码。
ExitProcess
。这是 Halt
的最后一步,通过直接调用 ExitProcess
,您可以避免 Halt
在调用 ExitProcess
之前采取的所有步骤。
我在使用 Application.Terminate 时遇到了一些问题,因为我必须启动 Form Close 程序,所以我只做了:
Form1.Close;
我在 .dproj 中找到了一个新的解决方案
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
if Not(VerifyCode()) then
begin
ShowMessage('Software unregistered!');
Application.Terminate;
end
else
Application.Run;
end.
如果代码必须在主窗体 OnCreate 上,只是在一个额外的问题上留下一点。
在主窗体 OnCreate 事件上尝试这样的代码。它没有按预期工作,显示主窗体,然后应用程序完成。
为了能够看到它,添加另一个表单并对其创建一个长循环。
好像主项目源上的所有
Application.CreateForm
都被执行了
示例代码:
procedure TMyMainForm.FormCreate(Sender: TObject);
begin
ShowMessage('[1] This must allways be shown');
if mrOK=MessageDlg('Exit?',mtConfirmation,[mbOK,mbCancel],0)
then begin
Application.Terminate;
Exit;
end;
ShowMessage('[2] This must not allways be shown');
end;
procedure TMyOtherForm.FormCreate(Sender: TObject);
begin
ShowMessage('[3] This must not allways be shown');
end;
使用该代码消息 [1] 和 [3] 始终显示。
不显示 [3] 的唯一方法是调用 Halt。
注意:为什么在 MainForm OnCreate 上有这样的代码?简单的答案可能是,exe 检查要运行的条件并查看它们不满足(丢失文件等),粗鲁的一个(对此感到抱歉),只是因为我想要/需要。
我知道这是一个旧话题,但如果有人还在听,我将不胜感激对这个话题的评论。
很长一段时间我都调用了 Application.Terminate,然后调用了 ExitProcess(0)。我的理论是 Application.Terminate 进行了优雅的清理,但 ExitProcess 阻止了任何其他代码的执行。它似乎有效,而且我没有收到有关内存泄漏或其他不良影响的报告。代码会是这样的:
Procedure (KillTheApp);
begin
Application.Terminate;
Application.ProcessMessages;
ExitProcess(0);
end;