我有一个应用程序,在启动时检查一些条件,并在主窗体的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