簡體   English   中英

調用TsaveDialog時,我的詳細信息表格隱藏在主窗體后面

[英]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);

因此,總而言之,您需要進行三項更改:

  1. 將詳細信息表單的WndParent0
  2. 刪除WS_EX_APPWINDOW擴展樣式,無主頂級窗口不需要它。
  3. 在保存對話框中調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM