加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:30:37 所属栏目:大数据 来源:网络整理
导读:我的应用程序基于MainForm,DetailForms和DialogForms. 在任务栏上,我可以看到MainFormButton以及DetailForms. 因此我使用: procedure DetailForm.CreateParams(var Params: TCreateParams);begin inherited CreateParams(Params); Params.ExStyle := Params
我的应用程序基于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像一个showmodal与属性PopupMode: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,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步是您不能使桌面窗口成为表单的所有者. 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);

因此,总而言之,您需要进行三项更改:

>将详细信息表单的WndParent设置为0.
>删除WS_EX_APPWINDOW扩展样式,无主顶级窗口不需要它.
>在保存对话框中调用Execute时传递详细信息表单的句柄.

更新

事实证明你使用的是XP,显示文件对话框的Delphi代码是垃圾.虽然您将句柄传递给Execute方法,但会忽略该操作,并且主窗口句柄将用作对话框的所有者.这就是为什么主窗口出现在前面.

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

在这里阅读更多相关信息:http://blogs.embarcadero.com/abauer/2005/09/30/21517

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读