delphi – 调用TsaveDialog时,我的详细信息表单隐藏在主窗体后面
我的应用程序基于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; 当我使用DialogForm(具有属性PopupMode:pmAuto的TForm的Showmodal)时,我的DetailForm保持在主和对话之间. 演示: 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. 更新 事实证明你使用的是XP,显示文件对话框的Delphi代码是垃圾.虽然您将句柄传递给Execute方法,但会忽略该操作,并且主窗口句柄将用作对话框的所有者.这就是为什么主窗口出现在前面. 你可以通过将Application.ModalPopupMode设置为pmAuto来解决这个问题.您应该在.dpr文件中设置它. 在这里阅读更多相关信息:http://blogs.embarcadero.com/abauer/2005/09/30/21517 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |