我的应用程序基于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属性的showmodal: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.
答案 0 :(得分:11)
第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