4

基本的に、TTimerイベントを使用して、開いているすべてのフォームを閉じ、ユーザーをメイン フォームに戻します。私は繰り返すことができますScreen.Forms

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

問題は、これらのフォームのいくつかのイベントです - それらはこのプロセスを中断するOnCloseQueryポップアップします:(MessageDlg

4

2 に答える 2

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;


もう 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;
于 2012-06-03T14:54:30.953 に答える