Delphi:关闭所有表单(MainForm除外),但忽略任何OnCloseQuery对话框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi:关闭所有表单(MainForm除外),但忽略任何OnCloseQuery对话框相关的知识,希望对你有一定的参考价值。

基本上,我正在使用TTimer事件来关闭所有打开的表单并将用户带回主表单。我可以通过Screen.Forms迭代:

for i := 0 to Screen.Formcount - 1 do
  Screen.Forms[i].close;

问题是某些形式的OnCloseQuery事件 - 它们弹出MessageDlg的中断这个过程:(

答案

在询问用户是否继续之前,您可以在主表单中使用其他表单将检查的标记。像这样的东西:

1单元

type
  TForm1 = class(TForm)
    ..
  public
    UnconditinalClose: Boolean;
  end;

..

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  UnconditinalClose := True;
end;

单元2:

implementation

uses
  unit1;

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := unit1.Form1.UnconditinalClose;
  if not CanClose then
    // ask the user if he/she's sure he/she wants to close
end;

另一个解决方案可能是分离其他形式的OnCloseQuery事件处理程序。 只有在关闭时释放(释放)这些其他形式,而不是隐藏时,这才是实用的 (编辑以反映Rob的评论):

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
  SaveHandler: TCloseQueryEvent;
begin
  for i := 0 to Screen.Formcount - 1 do
    if Screen.Forms[i] <> Self then begin
      SaveHandler := Screen.Forms[i].OnCloseQuery;
      Screen.Forms[i].OnCloseQuery := nil;
      Screen.Forms[i].Close;
      Screen.Forms[i].OnCloseQuery := SaveHandler;
    end;
end;
另一答案
for i := 1 to Screen.Formcount - 1 do
  Screen.Forms[i].close;

将值i初始化为1,而不是0。

以上是关于Delphi:关闭所有表单(MainForm除外),但忽略任何OnCloseQuery对话框的主要内容,如果未能解决你的问题,请参考以下文章

关闭所有打开的表单,除了一些 VB.Net

Delphi的几个难题?

关闭一个表单,然后调用另一个表单

在 MainForm 关闭 OTL 线程不关闭

c#子窗体控制父窗体的显隐

C# 更新并将对象从 MainForm 传递到已打开的 childForm