2015-03-31 73 views
2
TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    end; 

    TForm2 = class(TForm) 
    private 
    FAppWindow: Boolean; 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    public 
    property AppWindow: Boolean read FAppWindow write FAppWindow; 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Form2 := TForm2.Create(Self); 
    Form2.AppWindow := True; 
    Form2.Show; 
end; 

procedure TForm2.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    if FAppWindow then begin 
    Params.Style := Params.Style or WS_EX_APPWINDOW; 
    Params.WndParent := 0; 
    end; 
end; 

這是不行的,因爲TForm的的構造過程中創建的窗口句柄,所以CreateParams運行太早,FAppWindow總是False如何在構造函數運行後設置CreateParams?

編寫自定義構造函數也不起作用,因爲最終你必須要調用繼承的構造它創建之前,你可以將任何數據保存到該實例的句柄:

constructor TForm2.CreateAppWindow(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    FAppWindow := True; 
end; 

有沒有一種辦法:

  • 推遲創建窗口句柄?
  • 創建窗口句柄後改變窗口樣式?
  • 構造函數運行後重新創建窗口句柄?
  • 其他一些選項我沒有想過,但呢?

如何從類的「外部」改變表單的樣式?

+3

寫二傳手該屬性即會'RecreateWnd'。 – TLama 2015-03-31 11:56:07

+0

或者,如果您不想重新創建窗口,則可以執行'ChangeAppWindow'內部過程的操作。它通過'SetWindowLong'在一對'ShowWindow'調用('SW_HIDE'和'SW_SHOW'或'SW_MINIMIZE'對)內設置樣式。我寧願在這裏重新創作。 – TLama 2015-03-31 15:00:59

回答

4

最簡單的解決方法是將參數傳遞給在其構造形式,而不是等到它已完成創建。

這意味着您需要引入TForm2的構造函數,該構造函數接受CreateParams中需要傳遞的任何信息作爲參數。

在調用繼承的構造方法之前記下任何狀態。另外,當您將所有者設置爲零時,不需要設置WS_EX_APPWINDOW

+0

我不明白這會有什麼幫助,請參閱我的更新問題。 – 2015-03-31 13:26:26

+2

在調用繼承之前記下參數。這是要走的路。 – 2015-03-31 13:51:42

+0

是的,這是'CreateParented'的做法 – EProgrammerNotFound 2015-03-31 14:05:36

1

這似乎是工作重新手柄,我從RecreateAsPopup VCL方法的理念是:

procedure TForm2.SetAppWindow(const Value: Boolean); 
begin 
    FAppWindow := Value; 
    if HandleAllocated then 
    RecreateWnd 
    else 
    UpdateControlState; 
end; 
3

德爾福的好處是,派生構造不必調用inherited構造爲第一聲明。所以,你可以先設置你的FAppWindow成員,然後調用inherited構造以流的DFM和創建窗口,如:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Form2 := TForm2.CreateAppWindow(Self); 
    Form2.Show; 
end; 

constructor TForm2.CreateAppWindow(AOwner: TComponent); 
begin 
    FAppWindow := True; 
    inherited Create(AOwner); 
end; 
相關問題