终止 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()则是立即异常终止。基本上,将进程从内存中删除。仅在没有其他选择可用的极端情况下使用它。

System.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.TerminateHalt 都无法实现。前者执行有序终止。将执行大量代码。调用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.