Delphi - 在主窗体创建时停止应用程序

5
以下是需要翻译的内容:

情况如下:在应用程序主表单创建事件中,有些条件没有被满足,因此应用程序需要关闭。

是的,这是一个糟糕的设计,但应用程序应该如何关闭?使用Application.MainForm.Close会生成AV。Application.Terminate 不是一个很好的选择。还有其他想法吗?


6
Application.Terminate 确实有效。但是最好将代码编写在 .DPR 文件中,而不是主窗体的 OnCreate 事件处理程序中... - Andreas Rejbrand
3
在创建表单之前,请检查条件。如果你需要退出,则可以跳过创建表单并调用Application.Run.dpr代码。例如,你可以在.dpr文件中使用exit来退出。 - David Heffernan
@AndreasRejbrand - 这就是我正在做的 :) 我想问的是如何在OnCreate事件中终止它。 - RBA
很抱歉如果在这里提问不合适,但为什么Application.Terminate不是一个好选择呢?我的意思是,应用程序的内存总会被释放,你为什么要关心发生的顺序呢? - GabrielF
3个回答

13

Application.Terminate 可以正常工作。不过请注意,它是一种延迟终止方式,它只是向调用线程的消息队列中发布了一个 WM_QUIT 消息,因此应用程序直到调用 Application.Run() 开始处理主线程的消息队列时才会真正终止。因此,您可能会在应用程序实际终止之前瞥见 MainForm 在屏幕上闪烁。如果您希望避免这种情况,可以将 Application.ShowMainForm 属性设置为 false,例如:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  if (some condition) then
  begin
    Application.ShowMainForm := False;
    Application.Terminate;
  end;
end;

然而,正如其他人所说,更好的设计是在项目的DPR文件中进行检查,如果必要的话根本不创建主表单,例如:

Application.Initialize;
if not (some condition) then
begin
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end;

4

如果你想坚持你的糟糕设计,那么这里有一个糟糕的答案:

try
  Application.Terminate
except
end;

2
Application.Terminate

除非您在创建表单时(在DPR中)检查这些条件,否则默认设置就足够好了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接