2009-05-26 90 views
8

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

所以这里是我的问题,ExitProcess是最好的路线,然后立即终止我的应用程序,当这种情况存在?

回答

11

的时候OnShow已经解雇,你太遥远的程序来决定,你真的不想要的程序运行。你应该尽早做出决定。 OnShow不是决定不显示表单的地方。

这是在创建主窗体之前应该检查的事情。把你的支票放在DPR文件中,如果你确定程序不应该运行,那么只需拨打exit即可。

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

填写您自己的ApplicationShouldReallyStart的实现。 (它真的应该是一个独立的功能,而不是在线的DPR文件,如果begin的IDE迷糊 - 。在DPR文件end块变得太复杂)

除此之外,不叫ExitProcess 。改为拨打HaltHalt调用ExitProcess,但它也调用单元最终化部分和其他Delphi特定的过程关闭任务。

1

您最好将wmClose消息发送到窗口。否则,由于其他消息发送到表单,您有很大的机会陷入困境。

+2

唯一的缺点是应用程序会在屏幕上短暂闪烁。要避免闪光,请首先将窗体移出屏幕。 – skamradt 2009-05-26 21:49:18

+0

@skamradt,好点。虽然我想给出一个错误信息让用户知道为什么应用程序没有启动。 – 2009-05-26 21:54:30

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. 
+0

我无法调用close方法,因为Eurekalog在拾取异常时阻止主窗体在此时关闭,并且主窗体仍然出现。 – yozey 2009-05-26 23:23:14

2

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

0

尽管我完全同意Rob Kennedy的意见,但我想指出,您可能会使用EurekaLog的例程来控制错误对话行为。 例如:

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

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