Delphi中MainForm的OnShow事件的ExitProcess
我有一个应用程序,它在启动时检查一些条件,并在主窗体的OnShow事件中启动一个外部程序。问题是,如果启动外部程序时出错,我希望应用程序立即终止。但这有一个问题,EurekaLog捕获了我的异常,并通过否定对Delphi中MainForm的OnShow事件的ExitProcess,delphi,winapi,Delphi,Winapi,我有一个应用程序,它在启动时检查一些条件,并在主窗体的OnShow事件中启动一个外部程序。问题是,如果启动外部程序时出错,我希望应用程序立即终止。但这有一个问题,EurekaLog捕获了我的异常,并通过否定对Application.Teminate和任何其他正常关闭方法的所有调用,以某种方式中断了那里的消息循环 因此,我的问题是,当这种情况存在时,ExitProcess是否是立即终止我的应用程序的最佳途径?您最好向窗口发送wmClose消息。否则,您很有可能会因为发送到表单的其他消息而陷入麻烦。
Application.Teminate
和任何其他正常关闭方法的所有调用,以某种方式中断了那里的消息循环
因此,我的问题是,当这种情况存在时,ExitProcess是否是立即终止我的应用程序的最佳途径?您最好向窗口发送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.
当
OnShow
启动时,您对程序的了解太深,无法决定是否真的希望该程序运行。你应该早点下决心OnShow
不是决定不显示表单的地方
这是在创建主窗体之前应该检查的内容。将检查放入DPR文件中,如果确定程序不应运行,则只需调用exit
begin
Application.Initialize;
if not ApplicationShouldReallyStart then
exit;
Application.CreateForm(TMainAppForm, MainAppForm);
Application.Run;
end.
填写您自己的应用程序实现houldreallystart
。(实际上,它应该是一个单独的函数,而不是DPR文件中的内联函数。如果DPR文件中的begin
-end
块变得太复杂,IDE就会混淆。)
除此之外,不要调用
ExitProcess
。改为调用Halt
Halt
调用ExitProcess,但它也调用单元终结部分和其他Delphi特定的过程关闭任务。与系统一起工作,而不是对抗它!你不能简单地在事情的中间死去。如果你想死,在规则范围内做——WM_CLOSE或者你自己的程序,说明它为什么会死,然后发送WM_CLOSE。虽然我完全同意Rob Kennedy的观点,但我想指出的是,你可以使用EurekaLog的程序来控制错误对话行为。
例如:
uses
ExceptionLog, ECore;
...
begin
ForceApplicationTermination(tbTerminate);
// ... <- Bad code goes there
end;
使用
例外日志,ECore;
...
开始
强制应用终止(tbTerminate);
// ... 唯一的缺点是应用程序会在屏幕上短暂闪烁。为了避免闪烁,首先将窗体移出屏幕。@skamradt,说得对。虽然我想给出一条错误消息,让用户知道为什么应用程序没有启动。我同意。为什么不试着从dpr启动外部程序,如果失败,就不要继续。这样就不需要暂停、wmClose或其他什么了。是的,我想我会在创建主窗体之前检查条件。一个好而有效的问题和一个好而优雅的答案+1适合你们两个:推送者和弹出者:)永远不会溢出堆栈;PI无法调用close方法,因为Eurekalog在获取异常时阻止主窗体在该点关闭,并且主窗体仍然出现。然后,您可以告诉Eurekalog忽略该异常(类型),或者将其他程序的启动放在项目文件中。通过将其放置在项目文件中,可以在创建主窗体之前或在application.run命令之前捕获它。