Delphi中MainForm的OnShow事件的ExitProcess

Delphi中MainForm的OnShow事件的ExitProcess,delphi,winapi,Delphi,Winapi,我有一个应用程序,它在启动时检查一些条件,并在主窗体的OnShow事件中启动一个外部程序。问题是,如果启动外部程序时出错,我希望应用程序立即终止。但这有一个问题,EurekaLog捕获了我的异常,并通过否定对Application.Teminate和任何其他正常关闭方法的所有调用,以某种方式中断了那里的消息循环 因此,我的问题是,当这种情况存在时,ExitProcess是否是立即终止我的应用程序的最佳途径?您最好向窗口发送wmClose消息。否则,您很有可能会因为发送到表单的其他消息而陷入麻烦。

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


因此,我的问题是,当这种情况存在时,ExitProcess是否是立即终止我的应用程序的最佳途径?

您最好向窗口发送wmClose消息。否则,您很有可能会因为发送到表单的其他消息而陷入麻烦。

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

调用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.

OnShow
启动时,您对程序的了解太深,无法决定是否真的希望该程序运行。你应该早点下决心
OnShow
不是决定不显示表单的地方

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

begin
  Application.Initialize;
  if not ApplicationShouldReallyStart then
    exit;
  Application.CreateForm(TMainAppForm, MainAppForm);
  Application.Run;
end.
填写您自己的
应用程序实现houldreallystart
。(实际上,它应该是一个单独的函数,而不是DPR文件中的内联函数。如果DPR文件中的
begin
-
end
块变得太复杂,IDE就会混淆。)


除此之外,不要调用
ExitProcess
。改为调用
Halt
Halt
调用ExitProcess,但它也调用单元终结部分和其他Delphi特定的过程关闭任务。

与系统一起工作,而不是对抗它!你不能简单地在事情的中间死去。如果你想死,在规则范围内做——WM_CLOSE或者你自己的程序,说明它为什么会死,然后发送WM_CLOSE。

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

uses
  ExceptionLog, ECore;
...
begin
  ForceApplicationTermination(tbTerminate);
  // ... <- Bad code goes there
end;
使用
例外日志,ECore;
...
开始
强制应用终止(tbTerminate);

// ... 唯一的缺点是应用程序会在屏幕上短暂闪烁。为了避免闪烁,首先将窗体移出屏幕。@skamradt,说得对。虽然我想给出一条错误消息,让用户知道为什么应用程序没有启动。我同意。为什么不试着从dpr启动外部程序,如果失败,就不要继续。这样就不需要暂停、wmClose或其他什么了。是的,我想我会在创建主窗体之前检查条件。一个好而有效的问题和一个好而优雅的答案+1适合你们两个:推送者和弹出者:)永远不会溢出堆栈;PI无法调用close方法,因为Eurekalog在获取异常时阻止主窗体在该点关闭,并且主窗体仍然出现。然后,您可以告诉Eurekalog忽略该异常(类型),或者将其他程序的启动放在项目文件中。通过将其放置在项目文件中,可以在创建主窗体之前或在application.run命令之前捕获它。