基本的に、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;
もう 1 つの解決策は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;