24

我想在不执行任何其他代码行的情况下终止 Delphi 应用程序,我想知道哪种方法是正确的方法。此外,我想知道我目前正在做的事情是否有问题。基本上,我的代码如下所示:

//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;

这是停止 Delphi 应用程序的正确方法还是应该以其他方式完成?

4

4 回答 4

38

Application.Terminate()TApplication.Run()中断and中的消息循环TForm.ShowModal(),允许主线程正常退出,执行必要的清理等。

Vcl.Forms.TApplication.Terminate

结束应用程序执行。

调用Terminate以编程方式结束应用程序。通过调用Terminate而不是释放应用程序对象,您可以让应用程序以有序的方式关闭

Terminate调用 Windows APIPostQuitMessage函数以执行应用程序的有序关闭。Terminate不是立即的。 Terminate在 WM_QUIT 消息和主窗体关闭时自动调用。

Halt(),另一方面,是立即异常终止。基本上,将进程从内存中提取出来。仅在没有其他选项可用的极端情况下使用它。

System.Halt

启动程序的异常终止

Halt 执行程序的异常终止并返回到操作系统。

要执行 Delphi 应用程序的正常终止,请调用Terminate全局Application对象上的方法。如果应用程序不使用提供对象的单元,请从主程序块Application调用过程。Exit

于 2015-05-23T17:36:33.300 回答
12

我想在不执行任何其他代码的情况下终止 Delphi 应用程序。

Application.Terminate不会也Halt不会实现这一点。前者执行有序终止。会执行很多代码。打电话Halt更有希望。那是异常终止。但是单元完成代码被执行。

如果您希望尽快退出,同时执行最少量的代码,请调用ExitProcess. 这是最后一步,直接Halt调用ExitProcess可以避免调用Halt之前的所有步骤ExitProcess

于 2015-05-24T08:33:32.673 回答
2

我对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.
于 2021-07-07T14:11:58.647 回答
1

如果代码必须在主窗体 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 检查要运行的条件并查看它们不满足(丢失文件等),粗鲁的一个(对不起),只是因为我想要/需要。

于 2016-04-28T07:18:38.087 回答