2014-10-22 45 views
2

我的Delphi XE7 FireMonkey項目正在增加控件,自然我已經轉向使用框架。在VCL中使用過框架的地方,有些情況下我只是選擇在另一個框架中託管一個(複雜的)VCL表單,在表單的OnShow中創建和顯示它並將其設置爲客戶端對齊(這樣做的好處當你編輯框架時,你不會遇到懸掛繼承控件的問題)。如何託管一個FireMonkey表單客戶端在另一個內部對齊?

儘管使用FireMonkey,事情已經發生了一些變化,我試圖讓一個孩子表單客戶端在另一個裏面對齊,這是一個絆腳石。我碰到這個very useful SO link它展示瞭如何舉辦一個FireMonkey形式的VCL形式裏面,所以我建立在這個與我的代碼如下傳來:

procedure THostForm.FormCreate(Sender: TObject); 
begin 
    FForm := TChildForm.Create(Self); 
    FForm.BorderIcons := []; 
    FForm.BorderStyle := TFmxFormBorderStyle.None; 
    FForm.Visible := True; 
    FForm.Parent := Self; 
    ResizeForm; 
end; 

procedure THostForm.FormResize(Sender: TObject); 
begin 
    inherited; 
    ResizeForm; 
end; 

procedure THostForm.ResizeForm; 
begin 
    if Assigned(FForm) then 
    FForm.SetBounds(Round(ClientRect.Left), Round(ClientRect.Top), Round(ClientWidth), Round(ClientHeight)); 
end; 

這將產生一個子窗體與主機的形式改變大小,但仍在屏幕的左上方。我也試過ResizeForm例程中的各種位置選項。在我看來,表單可能無法成爲另一個表單的父項,因爲TForm不是IAligneableControl而TFrame是。所以,我嘗試將我的子窗體「對接」到一個在宿主窗體中對齊的TRectangle客戶端,並且其行爲方式相同。

有沒有人檢查過這個?

*解決方案細節的建議由Marco BELOW *

Marco的解決方案是非常整潔,減少了「託管」來的代碼只是兩行。你需要確保你的孩子(託管)窗體內有另一個客戶端對齊控件中的所有東西 - Marco建議使用TLayout,但我已經有一個TPanel用於背景,所以我沒有修改子窗體在所有。因此,舉辦這次子窗體TChildFormTHostForm簡單地做:

procedure THostForm.FormCreate(Sender: TObject); 
begin 
    FForm := TChildForm.Create(Self); 
    FForm.Panel1.Parent := Self; 
end; 

完成任務。感謝Marco。

+0

嘗試[ClientToScreen](http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Controls.TControl.ClientToScreen)(ClientRect)或 - 如果父表單本身不是其他表單的子表單 - 簡單地BoundsRect。 – 2014-10-22 10:34:29

+0

好主意 - 解決左上角的問題,但移動宿主窗體不會移動孩子 - 我猜是因爲這不會觸發OnResize。調整大小看起來相當可怕,因爲重新定位導致閃爍的黑色帶。 – 2014-10-22 10:50:21

回答

4

在FireMonkey中混合形式和控件並不是一個好主意,因爲它是VCL,因爲在VCL控件和窗體中都是帶有自己的Windows句柄的TWinControl後裔,而在FireMoneky中,窗體與操作系統而控件則不是。

地址情況,我使用了不同的解決方案。用一個客戶端對齊的無用TLayout創建一個表單,其中包含所有的控件。在運行時,創建此表單並將佈局父級到新的容器(例如多選項卡控件中的選項卡)。

我已經使用了幾次,從未發現它的重大問題,以及動態創建保持可視化開發模型的標籤頁的好方法。

+0

完美的馬可,謝謝。我已經用實現你的建議的令人驚訝的簡單代碼得出了我的問題 - 在我的情況下,我沒有努力,因爲我有一個TPanel。 – 2014-10-22 14:40:30

相關問題