7

要約:

CraigとSertacからの以下の役立つコメントをご覧ください。

================================================== ====

次の最小化されたコードに示すように、TForm10はに設定されますfsStayOnTopTForm10.btnTryDlgClickを呼び出すdlgOpen1.Executeと、表示されるダイアログは期待どおりです。ただし、TForm11.Create(Self).ShowModal内部を呼び出すTForm10.btnTryFormClickと、フォームはTForm10の背後に隠れています。この動作をどのように理解するのか、そしてなぜ標準のTOpenDialogが期待どおりに表示されるのか疑問に思っています。コメントは大歓迎です!

PS:1つの回避策は、TForm11のCreateParamsプロシージャをオーバーライドし、Params.wndParentを0に設定することです。しかし、この回避策を使用すると、ウィンドウ階層が壊れているように見えます。

  procedure TForm11.CreateParams(var Params: TCreateParams); // override;
  begin
    inherited;
    params.wndParent := 0;
  end;

PS:別の回避策は、以下の関連するSOページでRemyによって言及されています setting the modal Form's PopupParent property to be the StayOnTop Form。しかし、その後のコメントで、Sertacは、この回避策はウィンドウ階層も壊すだろうと述べました。

PS:おそらく関連するSOページ:
fsStayOnTopフォームによって隠されたモーダルフォーム
FindDialogがトップに留まらないようにするにはどうすればよいですか(Delphi)?
ダイアログが常にメインウィンドウの前面にあることを確認するには
、ShowModalが呼び出されたときにフォームが他のフォームの背後に隠れているようにするには、
2つのフォームを互いにオーバーラップできるようにしますか?
複数のフォームのDelphiアプリケーションとダイアログ
新しく作成されたモーダルウィンドウはフォーカスを失い、WindowsVistaDelphiでアクセスできなくなります-Forms
/MsgBoxesが以前のフォームの下に移動しないようにするにはどうすればよいですか?
Showを使用してメインフォームの
フェイクモーダルダイアログの背後にあるDelphiセカンダリフォームを許可するにはどうすればよいですか?
DelphiMainFormOnTaskBarモーダルウィンドウのバグ

Unit10のソース:

    unit Unit10;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm10 = class(TForm)
        btnTryDlg: TButton;
        dlgOpen1: TOpenDialog;
        btnTryForm: TButton;
        procedure FormCreate(Sender: TObject);
        procedure btnTryDlgClick(Sender: TObject);
        procedure btnTryFormClick(Sender: TObject);
      end;

    var
      Form10: TForm10;

    implementation

    {$R *.dfm}

    uses
      Unit11;

    procedure TForm10.FormCreate(Sender: TObject);
    begin
      FormStyle := fsStayOnTop;
    end;

    procedure TForm10.btnTryDlgClick(Sender: TObject);
    begin
      dlgOpen1.Execute;
    //  dlgOpen1.Execute(Self.Handle);
    end;

    procedure TForm10.btnTryFormClick(Sender: TObject);
    begin
      TForm11.Create(Self).ShowModal;
    end;

    end.

Unit10のDFM:

    object Form10: TForm10
      Left = 0
      Top = 0
      Caption = 'Form10'
      ClientHeight = 255
      ClientWidth = 414
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object btnTryDlg: TButton
        Left = 32
        Top = 24
        Width = 153
        Height = 201
        Caption = 'Try dialog'
        TabOrder = 0
        OnClick = btnTryDlgClick
      end
      object btnTryForm: TButton
        Left = 224
        Top = 24
        Width = 153
        Height = 201
        Caption = 'btnTryForm'
        TabOrder = 1
        OnClick = btnTryFormClick
      end
      object dlgOpen1: TOpenDialog
        Left = 96
        Top = 168
      end
    end

Unit11のソース:

    unit Unit11;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;

    type
      TForm11 = class(TForm)
      end;


    implementation

    {$R *.dfm}

    end.

Unit11のDFM:

    object Form11: TForm11
      Left = 0
      Top = 0
      Caption = 'Form11'
      ClientHeight = 183
      ClientWidth = 203
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
    end
4

1 に答える 1

5

Remyが提案したように、モーダルフォームのPopupParentプロパティを設定します。これにより、ダイアログがStayOnTopフォームの親になります。これは、ダイアログのExecuteメソッドがすでに実行していることです。Sertacのコメントがどこから来ているのかはわかりませんが、PopupParentを使用するとウィンドウ階層が正しく設定されるため、ダイアログは常にStayOnTopフォームの上に表示されます。

于 2011-03-22T18:37:01.210 に答える