Delphi 程序终止时向用户显示消息
Posted
技术标签:
【中文标题】Delphi 程序终止时向用户显示消息【英文标题】:Show message to user while Delphi program terminating 【发布时间】:2018-02-21 08:06:54 【问题描述】:在某些情况下,我应该使用
终止应用程序Application.Terminate;
在这种情况下,我想在destructor
或TFrame
中向用户显示一些消息。
我曾尝试使用MessageBox
、MessageBoxIndirect
、ShowMessage
函数但没有成功。消息框未出现在屏幕上并且应用程序关闭。
有没有办法在Application
终止时向用户显示一些消息?
顺便说一句,Delphi XE
已使用。
【问题讨论】:
您需要在终止应用程序之前显示该消息。或者创建一个单独的进程来显示消息。您想显示一条消息并终止,这很奇怪。这些是完全矛盾的要求。如果您的进程被终止,它如何显示消息? @DavidHeffernan 开始新流程是个好主意。我可以使用诸如msg
之类的命令来显示消息。肿瘤坏死因子。您可以将此作为答案发布,我会接受。
【参考方案1】:
就像 cmets 表示的那样,用于显示消息,例如MessageBox
、MessageBoxIndirect
或 ShowMessage
,您的进程仍需要运行。
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 程序终止时向用户显示消息的主要内容,如果未能解决你的问题,请参考以下文章
“来自调试器的消息:由于内存问题而终止”的任何通知或观察者?
OWASP MASVS 是不是足以显示根检测警告消息,而不是完全终止应用程序?