2

私のアプリケーションにはいくつかの MDI フォームがあり、このフォームの 1 つに詳細情報を含む子モーダル フォームがあります。したがって、MDI フォームからこのモーダル フォームを開くときは、[参照] ボタンをクリックして OpenFileDialog を作成します。ALT + TAB を使用しない限り、すべて正常に動作します。ALT+TAB を押してから ALT+TAB でアプリケーションに戻ると、OpenFileDialog (メッセージボックスも) がモーダル ウィンドウの背後にありますが、MDI ウィンドウの前にあることがわかります。StayOnTopなどはありません。すべてのウィンドウの前に OpenDialog を戻す唯一の方法は、アプリケーションに 2 番目の ALT+TAB を作成することです。これにより、Dialog が他のすべてのウィンドウの前面に表示されます。

Dialog が Modal フォームの背後に隠れないようにするにはどうすればよいですか? なにか提案を?

delphi7 を使用していますが、それ以上のバージョンを使用できません

4

1 に答える 1

6

この問題はウィンドウの所有権に関連していると仮定しています。Delphi 7 では、ファイル ダイアログのウィンドウ オーナーとして非表示のアプリケーション ウィンドウが表示されます。しかし、ウィンドウの所有者はアクティブなフォームのウィンドウである必要があります。

これを修正する方法はたくさんありますが、おそらく最も簡単なのは、次のようにサブクラス化TOpenDialogしてオーバーライドするTaskModalDialogことです。

function TMyOpenDialog.TaskModalDialog(DialogFunc: Pointer;
  var DialogData): LongBool;
var
  hwndOwner: HWND;
begin
  hwndOwner := Screen.ActiveForm.Handle;
  if hwndOwner = 0 then
    hwndOwner := Application.MainForm.Handle;
  if hwndOwner = 0 then
    hwndOwner := Application.Handle;
  TOpenFilename(DialogData).hwndOwner := hwndOwner;
  Result := inherited TaskModalDialog(DialogFunc, DialogData);
end;

私はこれをテストするための Delphi 7 を手元に持っていませんが、これらの線に沿った何か (おそらくhwndOwner選択を微調整することで) が解決されるとかなり確信しています。

于 2013-07-24T11:36:35.163 に答える