Delphi中MainForm的OnShow事件中的ExitProcess

时间:2009-05-26 19:30:04

标签: delphi winapi

我有一个应用程序,在启动时检查一些条件并在主窗体的OnShow事件中启动外部程序。问题是如果启动外部程序时出错,我希望应用程序立即终止。但是有一个问题,因为EurekaLog捕获了我的异常并以某种方式通过否定对Application.Teminate的所有调用和任何其他正常关闭方法来中断消息循环。

所以这是我的问题,当这种情况存在时,ExitProcess是否会立即终止我的应用程序?

5 个答案:

答案 0 :(得分: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的进程关闭任务。

答案 1 :(得分:2)

WITH 系统,而不是反对它!你不能简单地死在事物的中间。如果你想死在规则范围内 - WM_CLOSE或者你自己的例程,说明为什么它会死,然后发送一个WM_CLOSE。

答案 2 :(得分:1)

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

答案 3 :(得分: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.

答案 4 :(得分:0)

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

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

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