基本上,我正在使用TTimer
事件来关闭所有打开的表单并将用户带回主表单。
我可以遍历Screen.Forms
:
for i := 0 to Screen.Formcount - 1 do
Screen.Forms[i].close;
问题是某些表单上的OnCloseQuery
事件 - 它们会弹出MessageDlg
来中断此过程:(
答案 0 :(得分:7)
在询问用户是否继续之前,您可以在主表单中使用其他表单将检查的标记。像这样:
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;
答案 1 :(得分:-1)
for i := 1 to Screen.Formcount - 1 do
Screen.Forms[i].close;
将值i初始化为1而不是0。