终止 delphi 应用程序的正确方法是什么?
Which is the proper way to terminate a delphi application?
我想在不执行任何其他代码行的情况下终止 Delphi 应用程序,我想知道执行此操作的正确方法是什么。此外,我想知道我目前正在做的事情是否有问题。
基本上,我的代码如下所示:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
这是停止 Delphi 应用程序的正确方法还是应该以其他方式完成?
Application.Terminate()
打破 TApplication.Run()
和 TForm.ShowModal()
中的消息循环,允许主线程正常退出,执行必要的清理等
Vcl.Forms.TApplication.Terminate
Ends application execution.
Call Terminate
to end the application programmatically. By calling Terminate
rather than freeing the application object, you allow the application to shut down in an orderly fashion.
Terminate
calls the Windows API PostQuitMessage
function to perform an orderly shutdown of the application. Terminate
is not immediate.
Terminate
is called automatically on a WM_QUIT message and when the main form closes.
而Halt()
则是立即异常终止。基本上,将进程从内存中删除。仅在没有其他选择可用的极端情况下使用它。
Initiates the abnormal termination of a program.
Halt performs an abnormal termination of a program and returns to the operating system.
To perform a normal termination of a Delphi application, call the Terminate
method on the global Application
object. If the application does not use a unit that provides an Application
object, call the Exit
procedure from the main Program block.
I would like to terminate a Delphi application without executing any other code.
Application.Terminate
和 Halt
都无法实现。前者执行有序终止。将执行大量代码。调用Halt
更有希望。那就是异常终止。但是执行单元完成代码。
如果您希望尽快退出,同时执行最少的代码,请调用 ExitProcess
。这是 Halt
的最后一步,通过直接调用 ExitProcess
,您可以避免 Halt
在调用 ExitProcess
之前执行的所有步骤。
如果代码必须在主窗体 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 检查条件 运行 并发现它们不满足(丢失文件等),粗鲁的一个(对此感到抱歉),只是因为我 want/need to.
我在使用 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.
我想在不执行任何其他代码行的情况下终止 Delphi 应用程序,我想知道执行此操作的正确方法是什么。此外,我想知道我目前正在做的事情是否有问题。 基本上,我的代码如下所示:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
这是停止 Delphi 应用程序的正确方法还是应该以其他方式完成?
Application.Terminate()
打破 TApplication.Run()
和 TForm.ShowModal()
中的消息循环,允许主线程正常退出,执行必要的清理等
Vcl.Forms.TApplication.Terminate
而Ends application execution.
Call
Terminate
to end the application programmatically. By callingTerminate
rather than freeing the application object, you allow the application to shut down in an orderly fashion.
Terminate
calls the Windows APIPostQuitMessage
function to perform an orderly shutdown of the application.Terminate
is not immediate.Terminate
is called automatically on a WM_QUIT message and when the main form closes.
Halt()
则是立即异常终止。基本上,将进程从内存中删除。仅在没有其他选择可用的极端情况下使用它。
Initiates the abnormal termination of a program.
Halt performs an abnormal termination of a program and returns to the operating system.
To perform a normal termination of a Delphi application, call the
Terminate
method on the globalApplication
object. If the application does not use a unit that provides anApplication
object, call theExit
procedure from the main Program block.
I would like to terminate a Delphi application without executing any other code.
Application.Terminate
和 Halt
都无法实现。前者执行有序终止。将执行大量代码。调用Halt
更有希望。那就是异常终止。但是执行单元完成代码。
如果您希望尽快退出,同时执行最少的代码,请调用 ExitProcess
。这是 Halt
的最后一步,通过直接调用 ExitProcess
,您可以避免 Halt
在调用 ExitProcess
之前执行的所有步骤。
如果代码必须在主窗体 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 检查条件 运行 并发现它们不满足(丢失文件等),粗鲁的一个(对此感到抱歉),只是因为我 want/need to.
我在使用 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.