delphi 当调用TsaveDialog时,我的详细信息窗体隐藏在主窗体后面

qhhrdooz  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(146)

我的应用程序基于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,我已经设置了应用程序。String:True;当我在Detailform中使用PromptForFileName或TSaveDialog时,DetailForm将位于主窗体之后。关闭对话框后,DetailForm返回。
当我使用DialogForm(带有PopupMode属性的TForm的Showmodal:pmAuto),那么我的DetailForm就停留在主对话框和对话框之间。我如何像showmodal一样使用PopupMode属性来强制TsaveDialog:pmAuto或者我怎样才能防止我的detailform落后于mainform
演示:

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

tyu7yeag1#

步骤1是您不能使桌面窗口成为窗体的所有者。Raymond Chen explains为什么不呢?
要真正了解发生了什么,您需要阅读MSDN上的Window Features,以更清楚地了解窗口所有权。并且要非常小心,窗口所有权是一个与 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
1.删除WS_EX_APPWINDOW扩展样式,无主顶层窗口不需要它。
1.在保存对话框中调用Execute时传递详细信息表单的句柄。

更新

事实证明,您使用的是XP,显示文件对话框的 Delphi 代码是垃圾。尽管您向Execute方法传递了一个句柄,但该句柄被忽略,主窗口句柄被用作对话框的所有者。这就是为什么主窗口在前面。
您可以通过将Application.ModalPopupMode设置为pmAuto来解决此问题。你应该把这个放在你的。dpr文件。
阅读更多关于这一点在这里:https://web.archive.org/web/20140806033012/https://blogs.embarcadero.com/abauer/2005/09/30/21517( www.example.com -页面不存在页面不存在.

相关问题