我想在不执行任何其他代码行的情况下终止 Delphi 应用程序,我想知道哪种方法是正确的方法。此外,我想知道我目前正在做的事情是否有问题。基本上,我的代码如下所示:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
这是停止 Delphi 应用程序的正确方法还是应该以其他方式完成?
Application.Terminate()
TApplication.Run()
中断and中的消息循环TForm.ShowModal()
,允许主线程正常退出,执行必要的清理等。
Vcl.Forms.TApplication.Terminate
结束应用程序执行。
调用
Terminate
以编程方式结束应用程序。通过调用Terminate
而不是释放应用程序对象,您可以让应用程序以有序的方式关闭。
Terminate
调用 Windows APIPostQuitMessage
函数以执行应用程序的有序关闭。Terminate
不是立即的。Terminate
在 WM_QUIT 消息和主窗体关闭时自动调用。
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 检查要运行的条件并查看它们不满足(丢失文件等),粗鲁的一个(对不起),只是因为我想要/需要。