我的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用於背景,所以我沒有修改子窗體在所有。因此,舉辦這次子窗體TChildForm
內THostForm
簡單地做:
procedure THostForm.FormCreate(Sender: TObject);
begin
FForm := TChildForm.Create(Self);
FForm.Panel1.Parent := Self;
end;
完成任務。感謝Marco。
嘗試[ClientToScreen](http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Controls.TControl.ClientToScreen)(ClientRect)或 - 如果父表單本身不是其他表單的子表單 - 簡單地BoundsRect。 – 2014-10-22 10:34:29
好主意 - 解決左上角的問題,但移動宿主窗體不會移動孩子 - 我猜是因爲這不會觸發OnResize。調整大小看起來相當可怕,因爲重新定位導致閃爍的黑色帶。 – 2014-10-22 10:50:21