在Delphi程序终止时向用户显示消息

时间:2018-02-21 08:06:54

标签: delphi

在某些情况下,我应该用

终止申请
Application.Terminate;

在这种情况下,我想在某些destructor的{​​{1}}内向用户显示一些消息。

我尝试使用TFrameMessageBoxMessageBoxIndirect功能但没有成功。消息框不会出现在屏幕上,应用程序将关闭。

ShowMessage终止时,有没有办法向用户显示某些消息?

顺便说一句,Application已使用。

2 个答案:

答案 0 :(得分:5)

类似评论表明用例如MessageBoxMessageBoxIndirectShowMessage,您的流程仍然需要运行。

Delphi for .NET会有一个适合OnShutdown的事件,但是当没有使用条件CLR进行编译时,它就不存在了。

然而,可以使用退出程序,例如TApplicationDoneApplication一起使用。在调用System.Halt之前,在进程仍然存在的位置调用此过程。通过在AddExitProc(Proc: TProcedure)中调用System.SysUtils来添加它。代码评论如下:

  

{AddExitProc将给定的过程添加到运行时库的退出   程序清单。当应用程序终止时,它的退出程序   以与定义相反的顺序执行,即最后一个程序   传递给AddExitProc是第一个被执行的   终止。 }

我个人决定使用此功能,尽管warning from the documentationTApplication本身仍然在东京使用它来调用DoneApplication。摘自文档:

  

[...] AddExitProc与ULX软件包支持不兼容   仅提供向后兼容性。不要使用AddExitProc   新申请。[...]

VCL项目的小代码示例将显示有关应用程序终止的消息:

program Project1;

uses
  Vcl.Forms,
  Vcl.Dialogs,
  System.SysUtils,
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

procedure AppTerminated;
begin
  MessageDlg('Message', mtInformation, [mbOk], 0);
end;

begin
  AddExitProc(AppTerminated);
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

答案 1 :(得分:4)

调用Application.Terminate后,任何显示对话失败的尝试都会失败。你不能吃蛋糕吃。您无法终止您的流程,并将其保持活动状态以显示对话框。

因此,这个难题的明显解决方案是:

  1. 在终止应用程序之前显示对话框,或
  2. 创建一个单独的进程以显示该对话框,然后终止该应用程序。