[英]My detail form is hidden behind main form when calling the 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; 當我在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, 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步是您不能使桌面窗口成為表單的所有者。 雷蒙德陳解釋了為什么不。
要真正了解正在發生的事情,您需要閱讀MSDN上的窗口功能 ,以更清楚地了解窗口所有權。 並且要非常小心,窗口所有權是一個與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
來解決這個pmAuto
。 您應該在.dpr文件中設置它。
在此處閱讀更多相關信息: http : //blogs.embarcadero.com/abauer/2005/09/30/21517
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.