我有一个应用程序,在启动时检查一些条件并在主窗体的OnShow事件中启动外部程序。问题是如果启动外部程序时出错,我希望应用程序立即终止。但是有一个问题,因为EurekaLog捕获了我的异常并以某种方式通过否定对Application.Teminate
的所有调用和任何其他正常关闭方法来中断消息循环。
所以这是我的问题,当这种情况存在时,ExitProcess是否会立即终止我的应用程序?
答案 0 :(得分:11)
当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的进程关闭任务。
答案 1 :(得分:2)
WITH 系统,而不是反对它!你不能简单地死在事物的中间。如果你想死在规则范围内 - WM_CLOSE或者你自己的例程,说明为什么它会死,然后发送一个WM_CLOSE。
答案 2 :(得分:1)
您最好向窗口发送wmClose消息。否则,由于发送到表单的其他消息,您很有可能遇到麻烦。
答案 3 :(得分: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.
答案 4 :(得分:0)
虽然我完全赞同Rob Kennedy,但我想指出,您可以使用EurekaLog的例程来控制错误对话行为。 例如:
uses
ExceptionLog, ECore;
...
begin
ForceApplicationTermination(tbTerminate);
// ... <- Bad code goes there
end;
这样,应用程序将在显示错误对话框后立即关闭。