Как отобразить модальную форму поверх формы ее владельца (для ее владельца установлено fsStayOnTop или нет), так же, как это делает TOpenDialog - PullRequest
6 голосов
/ 22 марта 2011

Суммирование:

Пожалуйста, смотрите полезные комментарии ниже от Крейга и Сертака.

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

Как показано в следующем свернутом коде, TForm10 имеет значение fsStayOnTop. TForm10.btnTryDlgClick вызовите dlgOpen1.Execute, и показанное диалоговое окно соответствует ожидаемому. Однако, когда я звоню TForm11.Create(Self).ShowModal внутри TForm10.btnTryFormClick, форма скрывается за TForm10. Мне интересно, как понять это поведение, и почему стандартный TOpenDialog может показывать, как ожидалось? Любой комментарий приветствуется!

PS: Один из обходных путей - переопределить процедуру CreateParams в TForm11 и установить для Params.wndParent значение 0. Но мне кажется, что при использовании этого обходного пути иерархия окон будет нарушена.

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

PS: Реми упоминает еще один обходной путь на следующих соответствующих страницах SO: setting the modal Form's PopupParent property to be the StayOnTop Form. Но в последующих комментариях Sertac упомянул, что этот обходной путь также нарушит иерархию окон.

PS: возможно соответствующие страницы SO:
Модальные формы, скрытые формами fsStayOnTop
Как я могу не дать FindDialog оставаться сверху (Delphi)?
Как убедиться, что диалоговое окно всегда находится перед главным окном
Форма скрыта за другими формами, когда ShowModal вызывается
Сделать 2 формы способными перекрывать друг друга?
Множественные формы приложений и диалогов Delphi
Недавно созданное модальное окно теряет фокус и становится недоступным в Windows Vista
Delphi - Как предотвратить перемещение форм / MsgBox по предыдущей форме?
Как разрешить Delphi вторичные формы за основной формой
Поддельный модальный диалог с использованием Show?
Delphi MainFormOnTaskBar Модальная ошибка Windows

Источник для 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.

DFM для Unit10:

    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.

DFM для Unit11:

    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

1 Ответ

4 голосов
/ 22 марта 2011

Установите свойство PopupParent модальной формы, точно так же, как предложил Реми. Это будет привязывать диалог к ​​форме StayOnTop, что и делает метод Execute диалога. Я не уверен, откуда поступают комментарии Sertac, но использование PopupParent правильно устанавливает иерархию окна, поэтому диалог всегда будет выше формы StayOnTop.

...