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

Posted

技术标签:

【中文标题】Delphi 程序终止时向用户显示消息【英文标题】:Show message to user while Delphi program terminating 【发布时间】:2018-02-21 08:06:54 【问题描述】:

在某些情况下,我应该使用

终止应用程序
Application.Terminate;

在这种情况下,我想在destructorTFrame 中向用户显示一些消息。

我曾尝试使用MessageBoxMessageBoxIndirectShowMessage 函数但没有成功。消息框未出现在屏幕上并且应用程序关闭。

有没有办法在Application 终止时向用户显示一些消息?

顺便说一句,Delphi XE 已使用。

【问题讨论】:

您需要在终止应用程序之前显示该消息。或者创建一个单独的进程来显示消息。您想显示一条消息并终止,这很奇怪。这些是完全矛盾的要求。如果您的进程被终止,它如何显示消息? @DavidHeffernan 开始新流程是个好主意。我可以使用诸如msg 之类的命令来显示消息。肿瘤坏死因子。您可以将此作为答案发布,我会接受。 【参考方案1】:

就像 cmets 表示的那样,用于显示消息,例如MessageBoxMessageBoxIndirectShowMessage,您的进程仍需要运行。

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

但是,可以使用退出过程,例如 TApplication 使用 DoneApplication。在调用System.Halt 之前,在进程仍然存在的位置调用此过程。它是通过在System.SysUtils 中调用AddExitProc(Proc: TProcedure) 添加的。对此的代码注释如下:

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

我个人会决定使用它,尽管warning from the documentation,因为TApplication 本身仍在东京使用它来调用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.

【讨论】:

如果我打电话给Application.Terminate,这个对话框不会出现。 @Evgeny 我不知道为什么它没有显示给你。无论我是通过关闭主窗体直接还是间接终止应用程序,我都会看到该消息。【参考方案2】:

一旦您调用了Application.Terminate,任何显示对话框的尝试都会失败。你不能吃你的蛋糕。你不能终止你的进程,并让它保持活动状态以显示一个对话框。

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

    在您终止应用程序之前显示您的对话框,或者 创建一个单独的进程来显示对话框,然后终止应用程序。

【讨论】:

以上是关于Delphi 程序终止时向用户显示消息的主要内容,如果未能解决你的问题,请参考以下文章

delphi如何接收别的程序发过来的自定义的消息

“来自调试器的消息:由于内存问题而终止”的任何通知或观察者?

OWASP MASVS 是不是足以显示根检测警告消息,而不是完全终止应用程序?

用DELPHI中实现RAR文件解压到指定一目录

如果设备收到来自 fcm 的推送通知,如何向处于终止状态的 android 应用程序显示/通信/广播消息

多线程 Delphi 7 App - 应用程序终止问题