2010-12-09 92 views
5

是否可以創建運行時框架並添加現有面板,如將面板的父級設置爲框架?當它添加時,複製框架並使用它?在運行時創建Tframes:

喜歡:

f:= Tframe. create(..) 
... 

panel3.parent = f; //where panel3 has many controls. 

然後複製的F?它有可能嗎?怎麼樣?或任何其他suggerstion? e

回答

5

我不認爲你會通過複製來解決這個問題。你需要的是這樣一個功能:

function CreateFrameAndHostPanel(Owner: TComponent; Parent: TWinControl; Panel: TPanel): TFrame; 
begin 
    Result := TFrame.Create(Owner); 
    Try 
    Result.Parent := Parent; 
    Panel.Parent := Result; 
    Except 
    FreeAndNil(Result); 
    raise; 
    End; 
end; 
3

你需要記住,所有的控件有一個父母和一個所有者。業主可能是nil但您需要通過代碼釋放這些控件,因此大多數控件都屬於其他組件。

因此,如果所有者被破壞,面板也會被破壞。如果面板是在設計時創建的,那麼它就由它所在的窗體所擁有!

銷燬該表單會破壞面板!

但是,如果您在運行時創建面板並將Application設置爲所有者而不是表單,則可以將它們移動到多個表單和框架上。

但它是一個很好的設計模式?我不知道你想做什麼,但這可能是一個壞主意!

一般來說,在設計時用面板設計整個框架會更實用。然後添加一些代碼,允許通過從另一個面板或控件複製數據來創建框架。這將是一個更好的設計模式...

1

您必須使用您用於創建第一個(FRAME1)的相同代碼創建新框架(FRAME2);之後,您必須在FRAME2的FRAME1內創建包含的所有組件(在運行時創建)。

對於這一點,使用:

for i := 0 to (FRAME1.ComponentCount - 1) do 
    ... 
    cmp := TComponent(FRAME1.Component[i]); 
    ... create cmp on Frame2 

你可以嘗試第二選擇;使用TMemoryStream(SaveComponent)保存FRAME1,稍後創建新的Frame並檢索Stream上保存的信息(我沒有測試此選項)。

問候。