如何在其所有者表单上显示模式表单(其所有者设置为fsStayOnTop与否),就像TOpenDialog一样

SOU*_*ser 6 forms delphi dialog modal-dialog stayontop

综述:

请参阅以下Craig和Sertac的有用评论.

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

如下面的最小化代码所示,TForm10设置为fsStayOnTop.TForm10.btnTryDlgClick调用dlgOpen1.Execute,显示的对话框符合预期.但是,当我TForm11.Create(Self).ShowModal在里面打电话时TForm10.btnTryFormClick,表格隐藏在TForm10后面.我想知道如何理解这种行为,以及为什么标准的TOpenDialog可以按预期显示?任何评论表示赞赏!

PS:一种解决方法是覆盖TForm11的CreateParams过程,并将Params.wndParent设置为0.但是在我看来,使用此变通方法将破坏窗口层次结构.

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

PS:Remy在以下相关的SO页面中提到了另一种解决方法: setting the modal Form's PopupParent property to be the StayOnTop Form.但在随后的评论中,Sertac提到这种解决方法也会破坏窗口层次结构.

PS:可能相关的SO页面:
fsStayOnTop形式隐藏的模态形式
如何让FindDialog保持最佳状态(Delphi)?
如何确保对话框始终位于主窗口的前面
当调用ShowModal时,Form隐藏在其他窗体后面
使2个窗体能够相互重叠?
多形式Delphi应用程序和对话框
新创建的模态窗口在Windows Vista
Delphi中失去焦点并变得无法使用 - 如何防止Forms/MsgBox在先前的形式下移动?
如何在主窗体后面使用Delphi辅助表单
使用Show的Fake模式对话框?
Delphi MainFormOnTaskBar模态窗口错误

第10单元的来源:

    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.
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

第11单元的来源:

    unit Unit11;

    interface

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

    type
      TForm11 = class(TForm)
      end;


    implementation

    {$R *.dfm}

    end.
Run Code Online (Sandbox Code Playgroud)

第11单元的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
Run Code Online (Sandbox Code Playgroud)

Zoë*_*son 5

设置模态窗体的 PopupParent 属性,就像 Remy 建议的那样。这会将对话框作为 StayOnTop 表单的父级,这是对话框的 Execute 方法已经在做的事情。我不确定 Sertac 的评论来自哪里,但使用 PopupParent 正确设置了窗口层次结构,因此对话框将始终位于 StayOnTop 窗体上方。

  • 如果您希望特定对话框始终显示在特定表单上方,则可以,请设置 PopupParent 属性。这就是它的用途。您可以*通常* 将“Application.ModalPopupMode”设置为“pmAuto”,Delphi 将为您处理一切。设置后,对话框将成为当前活动表单(通常是“Application.MainForm”)的父级,而不是“Application.Handle”,这可以防止它卡在主表单后面。如果 fsStayOnTop 表单未处于活动状态,那么这将不起作用,在这种情况下,对话框将出现在其后面。 (2认同)

归档时间:

查看次数:

18679 次

最近记录:

15 年,5 月 前