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)
设置模态窗体的 PopupParent 属性,就像 Remy 建议的那样。这会将对话框作为 StayOnTop 表单的父级,这是对话框的 Execute 方法已经在做的事情。我不确定 Sertac 的评论来自哪里,但使用 PopupParent 正确设置了窗口层次结构,因此对话框将始终位于 StayOnTop 窗体上方。
| 归档时间: |
|
| 查看次数: |
18679 次 |
| 最近记录: |