我想终止一个Delphi应用程序而不执行任何其他代码行,我想知道哪个是正确的方法来执行此操作。此外,我想知道我现在正在做的事情是否有问题。 基本上,我的代码看起来像这样:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
这是停止Delphi应用程序的正确方法还是以其他方式完成?
答案 0 :(得分:29)
drawRect
打破了Application.Terminate()
和TApplication.Run()
中的消息循环,允许主线程正常退出,执行必要的清理等等。
Vcl.Forms.TApplication.Terminate
另一方面,结束应用程序执行。
调用
TForm.ShowModal()
以编程方式结束应用程序。通过调用Terminate
而不是释放应用程序对象,您允许应用程序以有序方式关闭。
Terminate
调用Windows APITerminate
函数来执行应用程序的有序关闭。PostQuitMessage
不是即时的。 在WM_QUIT消息上以及主窗体关闭时会自动调用Terminate
。
Terminate
是立即异常终止。基本上,将进程从内存中删除。仅在没有其他选项的极端情况下使用它。
启动程序的异常终止。
Halt执行异常终止程序并返回操作系统。
要执行Delphi应用程序的正常终止,请在全局
Halt()
对象上调用Terminate
方法。如果应用程序不使用提供Application
对象的单元,请从主程序块中调用Application
过程。
答案 1 :(得分:7)
我想在不执行任何其他代码的情况下终止Delphi应用程序。
Application.Terminate
和Halt
都不会实现这一目标。前者执行有序终止。很多代码都会执行。呼叫Halt
更有希望。这是异常终止。但是执行单元定型代码。
如果您希望尽快退出,请沿途执行最少量的代码,请致电ExitProcess
。这是Halt
的最后一步,通过直接致电ExitProcess
,您可以避免Halt
在调用ExitProcess
之前采取的所有步骤。
答案 2 :(得分:1)
如果代码必须在主窗体OnCreate上,那么就要给出一个额外的问题。
在Main Form 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检查要运行的条件并看到它们不符合(丢失的文件等),粗鲁的(对不起),只是因为我想要/需要。
答案 3 :(得分:0)
我在使用 Application.Terminate 时遇到了一些问题,因为我必须启动 Form Close 程序,所以我只做了:
Form1.Close;