gpt4 book ai didi

delphi - 如何在其所有者表单之上显示模态表单(其所有者是否设置为 fsStayOnTop),就像 TOpenDialog 一样

转载 作者:行者123 更新时间:2023-12-03 15:01:38 25 4
gpt4 key购买 nike

总结:

请参阅下面来自 Craig 和 Sertac 的有用评论。

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

如下面的最小化代码所示,TForm10 设置为 fsStayOnTopTForm10.btnTryDlgClick 调用 dlgOpen1.Execute,显示的对话框符合预期。但是,当我在 TForm10.btnTryFormClick 内调用 TForm11.Create(Self).ShowModal 时,表单隐藏在 TForm10 后面。我想知道如何理解这种行为,以及为什么标准 TOpenDialog 可以按预期显示?如有任何评论,我们将不胜感激!

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

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

PS:Remy 在下面的相关 SO 页面中提到了另一种解决方法:将模态表单的 PopupParent 属性设置为 StayOnTop Form。但在随后的评论中,Sertac 提到这种解决方法也会破坏窗口层次结构。

PS:可能相关的 SO 页面:
Modal forms hidden by fsStayOnTop forms
How Can I Keep the FindDialog from Staying on Top (Delphi)?
How to make sure a dialog is always front of the main window
Form is hidden behind other forms when ShowModal is called
Make 2 forms able to overlap each other?
Multiple form Delphi applications and dialogs
Newly created modal window loses focus and become inacessible in Windows Vista
Delphi - How to prevent Forms/MsgBoxes to move under prior form?
How to allow Delphi secondary forms behind the main form
Fake modal dialog using Show?
Delphi MainFormOnTaskBar Modal windows bug

第 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.

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

第 11 单元来源:

    unit Unit11;

interface

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

type
TForm11 = class(TForm)
end;


implementation

{$R *.dfm}

end.

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

最佳答案

设置模态表单的 PopupParent 属性,就像 Remy 建议的那样。这将使对话框成为 StayOnTop 窗体的父级,这就是对话框的 Execute 方法已经执行的操作。我不确定 Sertac 的注释来自哪里,但使用 PopupParent 可以正确设置窗口层次结构,因此对话框将始终位于 StayOnTop 表单上方。

关于delphi - 如何在其所有者表单之上显示模态表单(其所有者是否设置为 fsStayOnTop),就像 TOpenDialog 一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com