begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
if Not(VerifyCode()) then
begin
ShowMessage('Software unregistered!');
Application.Terminate;
end
else
Application.Run;
end.
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;
5条答案
按热度按时间wfypjpf41#
Application.Terminate()
中断TApplication.Run()
和TForm.ShowModal()
中的消息循环,允许主线程正常退出,执行必要的清理等。Vcl.Forms.TApplication.Terminate
结束应用程序执行。
调用
Terminate
以编程方式结束应用程序。通过调用Terminate
而不是释放应用程序对象,您允许应用程序以有序的方式关闭。Terminate
调用Windows APIPostQuitMessage
函数以执行应用程序的有序关闭。Terminate
不会立即执行。Terminate
在WM_QUIT消息和主窗体关闭时自动调用。另一方面,
Halt()
是一个立即异常终止。基本上,从内存中剥离进程。只有在没有其他选项可用的极端情况下才使用它。System.Halt
启动程序的异常终止。
暂停执行程序的异常终止并返回操作系统。
要执行 Delphi 应用程序的正常终止,请调用全局
Application
对象上的Terminate
方法。如果应用程序不使用提供Application
对象的单元,请从主Program块调用Exit
过程。qlvxas9a2#
我想终止一个 Delphi 应用程序而不执行任何其他代码。
Application.Terminate
和Halt
都不能做到,前者是有序终止,会执行很多代码,调用Halt
更有希望,那是非正常终止,但是单元终结代码执行了。如果你想尽快退出,执行最少的代码,调用
ExitProcess
,这是Halt
的最后一步,直接调用ExitProcess
可以避免Halt
调用ExitProcess
之前的所有步骤。mqkwyuun3#
我在使用Application.Terminate时遇到一些问题,因为我必须启动“表单关闭”过程,所以我只执行了以下操作:
我在里面找到了新的解决方案。dproj
92vpleto4#
如果代码必须在主窗体OnCreate上,那么就留下一个额外的问题。
在主窗体OnCreate事件上尝试这样的代码。它没有按预期工作,显示主窗体,然后应用程序结束。
为了能够看到它,添加另一个窗体,并在其创建过程中放置一个长循环。
似乎主项目源代码上的所有
Application.CreateForm
都已执行。样本代码:
使用该代码时,消息[1]和[3]始终显示。
不显示[3]的唯一方法是调用Halt。
注意:为什么这样的代码在主窗体上创建?简单的答案可能是,exe检查要运行的条件,并看到他们不满足(丢失文件等),粗鲁的一个(对不起),只是因为我想/需要。
ehxuflar5#
我知道这是一个老线程,但会感谢对这个线程添加评论,如果有人还在听。
很长一段时间以来,我调用了Application.Terminate,然后调用了ExitProcess(0)。我的理论是,Application.Terminate执行了优雅的清理,但ExitProcess阻止了任何其他代码的执行。它似乎可以工作,而且我没有收到内存泄漏或其他不良影响的报告。代码如下所示: