简体   繁体   English

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

[英]How to show a modal form on top of its owner form (its owner is set to fsStayOnTop or not), just as TOpenDialog does

Summarization: 综述:

Please see the helpful comments below from Craig and Sertac. 请参阅以下Craig和Sertac的有用评论。

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

As shown in the following minimized code, TForm10 is set to be fsStayOnTop . 如下面的最小化代码所示, TForm10设置为fsStayOnTop TForm10.btnTryDlgClick call dlgOpen1.Execute , and the dialog shown is as expected. TForm10.btnTryDlgClick调用dlgOpen1.Execute ,显示的对话框如预期。 However, when I call TForm11.Create(Self).ShowModal inside TForm10.btnTryFormClick , the form is hidden behind the TForm10. 但是,当我在TForm10.btnTryFormClick调用TForm11.Create(Self).ShowModal TForm10.btnTryFormClick ,表单隐藏在TForm10后面。 I am wondering how to understand this behavior, and why standard TOpenDialog can show as expected? 我想知道如何理解这种行为,以及为什么标准的TOpenDialog可以按预期显示? Any comment is appreciated! 任何评论表示赞赏!

PS: One workaround is to override the CreateParams procedure of TForm11, and set Params.wndParent to 0. But it looks to me that window hierarchy will be broke using this workaround. PS:一种解决方法是覆盖TForm11的CreateParams过程,并将Params.wndParent设置为0.但是在我看来,使用此变通方法将破坏窗口层次结构。

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

PS: Another workaround is mentioned by Remy in the below relevant SO pages: setting the modal Form's PopupParent property to be the StayOnTop Form . PS:Remy在下面的相关SO页面中提到了另一种解决方法: setting the modal Form's PopupParent property to be the StayOnTop Form But in the followed comments, Sertac mentioned this workaround will also break window hierarchy. 但在随后的评论中,Sertac提到这种解决方法也会破坏窗口层次结构。

PS: Possibly relevant SO pages: PS:可能相关的SO页面:
Modal forms hidden by fsStayOnTop forms 由fsStayOnTop表单隐藏的模态表单
How Can I Keep the FindDialog from Staying on Top (Delphi)? 如何让FindDialog保持最佳状态(Delphi)?
How to make sure a dialog is always front of the main window 如何确保对话框始终位于主窗口的前面
Form is hidden behind other forms when ShowModal is called 调用ShowModal时,表单隐藏在其他表单后面
Make 2 forms able to overlap each other? 使两种形式能够相互重叠?
Multiple form Delphi applications and dialogs 多种形式的Delphi应用程序和对话框
Newly created modal window loses focus and become inacessible in Windows Vista 新创建的模式窗口在Windows Vista中失去焦点并变得无法使用
Delphi - How to prevent Forms/MsgBoxes to move under prior form? Delphi - 如何防止Forms / MsgBox在先前的表单下移动?
How to allow Delphi secondary forms behind the main form 如何让主要表单背后的Delphi二级表单
Fake modal dialog using Show? 使用Show的假模态对话框?
Delphi MainFormOnTaskBar Modal windows bug Delphi MainFormOnTaskBar模态窗口错误

Source for Unit10: 第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.

DFM for Unit10: 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

Source for Unit11: 第11单元的来源:

    unit Unit11;

    interface

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

    type
      TForm11 = class(TForm)
      end;


    implementation

    {$R *.dfm}

    end.

DFM for Unit11: 第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

Set the modal form's PopupParent property, exactly like Remy suggested. 设置模态窗体的PopupParent属性,就像Remy建议的那样。 That will parent the dialog to the StayOnTop form, which is what the dialog's Execute method is already doing. 这将使对话框的父对象成为StayOnTop表单,这是对话框的Execute方法已经在做的事情。 I'm not sure where Sertac's comments are coming from, but using PopupParent sets the window heirarchy correctly, so the dialog will always be above the StayOnTop form. 我不确定Sertac的评论来自哪里,但使用PopupParent正确设置窗口层次结构,因此对话框将始终位于StayOnTop表单之上。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM