5

私は現在、既存のDelphiアプリケーション用のウィンドウシステムを作成しています。

現在、このプログラムは、必要な順序でモーダルに表示される多数のフルサイズのフォームで構成されており、ユーザーが移動することはできません。私の目的は、これらすべてのフォームを移動できるようにすることです。以前はフォームが互いに積み重ねられていましたが、移動できなかったため、背景のフォームはユーザーに表示されませんでした。これまでの私の解決策は、新しい子を開くときに「親」フォームを非表示にし、その子を閉じるときにそれを再表示することでした。

残念ながら、各子はshowModalで呼び出されるため、親フォームを表示する呼び出しは、モーダルプロセスが完了し、子フォームが非表示になるまで行われないため、フォームが表示されていない場所で一瞬のフラッシュが表示されます。

プロセスの完了後にモーダルフォームが自動的に非表示になるのを防ぐ方法はありますか?これにより、親フォームが再び表示されたら、手動で非表示にすることができます。各子フォームのFormHideイベントでこれをスケジュールしようとしましたが、子フォームが自分の子の1つを開くときにも非表示になるため、これは機能しません。

編集:

これが私がこれまでにレミーのアドバイスに基づいて持っているものです

procedure openModalChild(child: TForm; parent: TForm);
var
  WindowList: Pointer;
  SaveFocusCount: Integer;
  SaveCursor: TCursor;
  SaveCount: Integer;
  ActiveWindow: HWnd;
  Result: integer;
begin
  CancelDrag;
  with child do begin
  Application.ModalStarted;
  try
  ActiveWindow := GetActiveWindow;
  WindowList := DisableTaskWindows(0);
  //set the window to fullscreen if required
  setScreenMode(child);
  try
    Show; //show the child form
    try
      SendMessage(Handle, CM_ACTIVATE, 0, 0);
      ModalResult := 0;
      repeat
        Application.HandleMessage;
        //if Forms.Application.FTerminate then ModalResult := mrCancel else
          if ModalResult <> 0 then closeModal(child as TCustomForm);
      until ModalResult <> 0;
      Result := ModalResult;
      SendMessage(Handle, CM_DEACTIVATE, 0, 0);
      if GetActiveWindow <> Handle then ActiveWindow := 0;
    finally
      parent.Show;
      Hide;
    end;
  finally
    EnableTaskWindows(WindowList);
    parent.Show; //reshow the parent form
    if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
  end;
  finally
    Application.ModalFinished;
  end;
  end;
end;

これはうまく機能しますが、唯一の問題は、子がエスケープされた後でもアクティブな繰り返しループが中断しないため、親フォームが再表示されないことです。これを解決する方法はありますか?

4

1 に答える 1

10

ShowModal()Show()モーダル処理ループに入る直前に明示的に呼び出しHide()、ループを終了した直後に明示的に呼び出します。VCLのForms.pasソースファイルのコードを変更せずにこれを変更することはできません。

VCLソースコードを編集せずにウィンドウをより細かく制御する必要がある場合は、まったく使用ShowModal()しないでください。必要に応じて、、、、および自分自身を使用Show()します。Forms.pasを見て、それらがどのように使用されているかを確認することをお勧めします。の実装を独自の関数にコピーして、必要に応じてカスタマイズできます。Hide()DisableTaskWindows()EnableTaskWindows()ShowModal()

于 2011-12-16T21:51:55.587 に答える