gpt4 book ai didi

delphi - 调用 TsaveDialog 时,我的详细表单隐藏在主表单后面

转载 作者:行者123 更新时间:2023-12-03 14:57:51 25 4
gpt4 key购买 nike

我的应用程序基于 MainForm、DetailForms 和 DialogForms。在任务栏上,我可以看到 MainFormButton 和 DetailForms。因此我使用:

procedure <DetailForm>.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent:= GetDesktopWindow;
end;

我使用delphi 2010并且我设置了Application.MainFormOnTaskbar:= True;当我在 Detailform 中使用 PromptForFileName 或 TSaveDialog 时,DetailForm 会位于 Mainform 后面。关闭对话框后,DetailForm 将返回。

当我使用 DialogForm(具有 PopupMode: pmAuto 属性的 TForm 的 Showmodal)时,我的 DetailForm 停留在主窗口和对话框之间。如何强制 TSaveDialog 像具有属性 PopupMode: pmAuto 的显示模式一样,或者如何防止我的详细信息表单位于主表单后面

演示:

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
<小时/>
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
oForm: TForm;
begin
oForm:= Unit2.TForm2.Create(Self);
oForm.Show;
end;
end.
<小时/>
unit Unit2;

interface

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

type
TForm2 = class(TForm)

SaveDialog1: TSaveDialog;
procedure cxButton1Click(Sender: TObject);
private
protected
procedure CreateParams(var Params: TCreateParams); override;
{ Private declarations }

public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent:= 0; // --> Testing
end;

procedure TForm2.cxButton1Click(Sender: TObject);
begin
self.SaveDialog1.execute();
end;

end.

最佳答案

第 1 步是您不得使桌面窗口成为表单的所有者。陈雷蒙explains为什么不呢。

要真正了解正在发生的事情,您需要阅读 Window Features在 MSDN 上可以更清楚地了解窗口所有权。并且要非常小心,窗口所有权是一个与 Delphi 组件所有权完全无关的概念。在 Delphi 术语中,窗口所有权由 PopupParent 属性控制。

正如评论中所澄清的那样,您希望这两个窗体都是无主的顶级窗口。主要形式自动就是这样。对于详细信息表单,您需要将 WndParent 设置为 0,就是这样:

procedure <DetailForm>.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0;
end;

最后一步是确保正确拥有保存对话框。为此,请在调用 Execute 时指定所有者:

Self.SaveDialog1.Execute(Self.Handle);

因此,总的来说,您需要进行三项更改:

  1. 将详细信息表单的 WndParent 设置为 0
  2. 删除 WS_EX_APPWINDOW 扩展样式,无主顶级窗口不需要它。
  3. 在保存对话框上调用执行时传递详细信息表单的句柄。
<小时/>

更新

原来你使用的是XP,显示文件对话框的Delphi代码是垃圾。尽管您将句柄传递给 Execute 方法,但该句柄会被忽略,并且主窗口句柄将用作对话框的所有者。这就是主窗口出现在前面的原因。

您可以通过将 Application.ModalPopupMode 设置为 pmAuto 来解决此问题。您可能应该在 .dpr 文件中设置它。

在这里阅读更多相关信息:https://web.archive.org/web/20140806033012/https://blogs.embarcadero.com/abauer/2005/09/30/21517 (在 archive.org 上,因为原始页面已不存在)

关于delphi - 调用 TsaveDialog 时,我的详细表单隐藏在主表单后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502820/

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