2009-05-26 42 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; 

這樣,應用程序會顯示錯誤對話框後立即被關閉。