我有一个应用程序,在启动时检查一些条件,并在主窗体的OnShow事件中启动外部程序。问题是,如果启动外部程序时出现错误,我希望应用程序立即终止。但问题在于,EurekaLog捕获了我的异常,并通过取消对Application.Teminate和任何其他正常关闭方法的所有调用来破坏消息循环。
所以这里是我的问题,当存在这种情况时,ExitProcess是否是立即终止我的应用程序的最佳途径?
所以这里是我的问题,当存在这种情况时,ExitProcess是否是立即终止我的应用程序的最佳途径?
当 OnShow
被触发时,您已经进入程序太远,无法决定不想运行程序。您应该更早地作出这个决定。 OnShow
不是决定不显示表单的地方。
这是您应该在创建主窗体之前检查的内容。将检查放在 DPR 文件中,如果确定不需要运行程序,则只需调用 exit
。
begin
Application.Initialize;
if not ApplicationShouldReallyStart then
exit;
Application.CreateForm(TMainAppForm, MainAppForm);
Application.Run;
end.
请填写自己的ApplicationShouldReallyStart
函数实现。此函数应该独立于DPR文件,不要内联在其中。如果DPR文件中的begin
-end
块过于复杂,IDE可能会感到困惑。
除此之外,不要调用ExitProcess
,而应该使用Halt
。Halt
将调用ExitProcess
,但它还将调用单元终结化部分以及其他特定于Delphi的进程关闭任务。
与系统合作,而不是与其对抗!你不能仅仅在过程中就放弃。如果你想退出,按照规则来——使用WM_CLOSE或者自己编写的程序来解释为什么要退出,并发送一个WM_CLOSE。
你最好发送一个 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.
虽然我完全同意Rob Kennedy的观点,但我想指出,您可以使用EurekaLog的例程来控制错误对话框的行为。 例如:
uses
ExceptionLog, ECore;
...
begin
ForceApplicationTermination(tbTerminate);
// ... <- Bad code goes there
end;
这样,应用程序在显示错误对话框后将立即关闭。