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

3
在某些情况下,我应该通过代码“terminate”来终止应用程序。
Application.Terminate;

在这种情况下,我想在某些 TFramedestructor 中向用户显示一些消息。
我已经尝试使用 MessageBoxMessageBoxIndirectShowMessage 函数,但都没有成功。消息框不会出现在屏幕上,应用程序也关闭了。
有没有办法在 Application 终止时向用户显示一些消息?
顺便说一句,使用的是 Delphi XE

2
在终止应用程序之前,您需要显示消息。或者创建一个单独的进程来显示消息。想要显示消息并终止是很奇怪的。这些完全相反的要求。如果进程被终止了,它如何显示消息呢? - David Heffernan
@DavidHeffernan 开启新进程是个好主意。我可以使用一些命令(如msg)来显示消息。谢谢。你可以将此作为答案发布,我会接受它。 - Evgeny
2个回答

5

像评论一样用于显示消息,例如使用MessageBox MessageBoxIndirectShowMessage ,您的进程仍然需要运行。

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

然而,可以使用退出过程,就像TApplication 自身使用DoneApplication 一样。此过程在进程仍然存在的点上调用,然后调用System.Halt 。通过在System.SysUtils 中调用AddExitProc(Proc:TProcedure)添加该过程。对此的代码注释如下:

{AddExitProc将给定的过程添加到运行时库的退出过程列表中。当应用程序终止时,其退出过程按照定义的相反顺序执行,即传递给AddExitProc的最后一个过程是在终止时执行的第一个过程。}

个人认为应该使用此方法,尽管文档中有警告,因为在Tokyo中,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
@Evgeny 我不知道为什么你看不到它。无论我是直接终止应用程序还是通过关闭主窗体间接终止,我都能看到这条消息。 - nil

4

一旦您调用了Application.Terminate,任何尝试显示对话框的操作都会失败。您不能既终止进程,又保持其活动状态以显示对话框。

因此,该难题的显而易见的解决方案为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接