我有一個應用程序,在啓動時檢查一些條件,並在主窗體的OnShow事件中啓動外部程序。問題是,如果啓動外部程序時發生錯誤,我希望應用程序立即終止。但是有一個問題,因爲EurekaLog捕獲我的異常,並以某種方式通過否定所有對Application.Teminate
和任何其他正常關閉方法的調用來破壞那裏的消息循環。從Delphi的MainForm的OnShow事件ExitProcess
所以這裏是我的問題,ExitProcess是最好的路線,然後立即終止我的應用程序,當這種情況存在?
我有一個應用程序,在啓動時檢查一些條件,並在主窗體的OnShow事件中啓動外部程序。問題是,如果啓動外部程序時發生錯誤,我希望應用程序立即終止。但是有一個問題,因爲EurekaLog捕獲我的異常,並以某種方式通過否定所有對Application.Teminate
和任何其他正常關閉方法的調用來破壞那裏的消息循環。從Delphi的MainForm的OnShow事件ExitProcess
所以這裏是我的問題,ExitProcess是最好的路線,然後立即終止我的應用程序,當這種情況存在?
的時候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
。改爲撥打Halt
。 Halt
調用ExitProcess
,但它也調用單元最終化部分和其他Delphi特定的過程關閉任務。
您最好將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.
我無法調用close方法,因爲Eurekalog在拾取異常時阻止主窗體在此時關閉,並且主窗體仍然出現。 – yozey 2009-05-26 23:23:14
工作與系統,而不是反對它!你不能簡單地死在事情的中間。如果你想死在規則中 - WM_CLOSE或者你自己的例程,它說明它爲什麼會死亡,然後發送WM_CLOSE。
儘管我完全同意Rob Kennedy的意見,但我想指出,您可能會使用EurekaLog的例程來控制錯誤對話行爲。 例如:
uses
ExceptionLog, ECore;
...
begin
ForceApplicationTermination(tbTerminate);
// ... <- Bad code goes there
end;
這樣,應用程序會顯示錯誤對話框後立即被關閉。
唯一的缺點是應用程序會在屏幕上短暫閃爍。要避免閃光,請首先將窗體移出屏幕。 – skamradt 2009-05-26 21:49:18
@skamradt,好點。雖然我想給出一個錯誤信息讓用戶知道爲什麼應用程序沒有啓動。 – 2009-05-26 21:54:30