在Delphi中从主窗体的OnShow事件中退出进程ExitProcess

8
我有一个应用程序,在启动时检查一些条件,并在主窗体的OnShow事件中启动外部程序。问题是,如果启动外部程序时出现错误,我希望应用程序立即终止。但问题在于,EurekaLog捕获了我的异常,并通过取消对Application.Teminate和任何其他正常关闭方法的所有调用来破坏消息循环。
所以这里是我的问题,当存在这种情况时,ExitProcess是否是立即终止我的应用程序的最佳途径?
5个回答

11

OnShow 被触发时,您已经进入程序太远,无法决定不想运行程序。您应该更早地作出这个决定。 OnShow 不是决定不显示表单的地方。

这是您应该在创建主窗体之前检查的内容。将检查放在 DPR 文件中,如果确定不需要运行程序,则只需调用 exit

begin
  Application.Initialize;
  if not ApplicationShouldReallyStart then
    exit;
  Application.CreateForm(TMainAppForm, MainAppForm);
  Application.Run;
end.

请填写自己的ApplicationShouldReallyStart函数实现。此函数应该独立于DPR文件,不要内联在其中。如果DPR文件中的begin-end块过于复杂,IDE可能会感到困惑。

除此之外,不要调用ExitProcess,而应该使用HaltHalt将调用ExitProcess,但它还将调用单元终结化部分以及其他特定于Delphi的进程关闭任务。


我同意。为什么不尝试从dpr启动外部程序,如果失败了就不继续进行呢?这样就不需要Halt、wmClose或其他的东西了。 - Mihaela
是的,我想我会在主窗体创建之前检查条件。 - yozey
一个很好而且合理的问题,以及一个漂亮而优雅的答案,+1 给你们两个:Pusher 和 Popper :) 永远不要溢出栈! ;P - Peter Perháč

2

与系统合作,而不是与其对抗!你不能仅仅在过程中就放弃。如果你想退出,按照规则来——使用WM_CLOSE或者自己编写的程序来解释为什么要退出,并发送一个WM_CLOSE。


1

你最好发送一个 wmClose 消息到窗口。否则,由于发送到表单的其他消息,你很有可能遇到麻烦。


2
唯一的缺点是应用程序会在屏幕上短暂闪烁。为了避免闪烁,首先将窗体移出屏幕。 - skamradt
@skamradt,说得好。虽然我想发出错误消息,让用户知道应用程序为什么没有启动。 - Toon Krijthe

0

我写了一个小应用程序来测试一个理论,这是我的建议。

调用CLOSE方法。

以下示例单元在D2009中关闭应用程序而不出现错误。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
   close;
end;

end.

我无法调用close方法,因为当Eurekalog捕获异常时会阻止主窗体关闭,但是主窗体仍然会出现。 - yozey
你可以告诉Eurekalog忽略那个异常(类型),或者将另一个程序的启动放置在项目文件中。通过将其放置在项目文件中,您可以在创建主窗体之前或应用程序运行命令之前捕获它。 - Vivian Mills

0

虽然我完全同意Rob Kennedy的观点,但我想指出,您可以使用EurekaLog的例程来控制错误对话框的行为。 例如:

uses
  ExceptionLog, ECore;
...
begin
  ForceApplicationTermination(tbTerminate);
  // ... <- Bad code goes there
end;

这样,应用程序在显示错误对话框后将立即关闭。


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