是否可以創建運行時框架並添加現有面板,如將面板的父級設置爲框架?當它添加時,複製框架並使用它?在運行時創建Tframes:
喜歡:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
然後複製的F?它有可能嗎?怎麼樣?或任何其他suggerstion? e
是否可以創建運行時框架並添加現有面板,如將面板的父級設置爲框架?當它添加時,複製框架並使用它?在運行時創建Tframes:
喜歡:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
然後複製的F?它有可能嗎?怎麼樣?或任何其他suggerstion? e
我不認爲你會通過複製來解決這個問題。你需要的是這樣一個功能:
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;
你需要記住,所有的控件有一個父母和一個所有者。業主可能是nil
但您需要通過代碼釋放這些控件,因此大多數控件都屬於其他組件。
因此,如果所有者被破壞,面板也會被破壞。如果面板是在設計時創建的,那麼它就由它所在的窗體所擁有!
銷燬該表單會破壞面板!
但是,如果您在運行時創建面板並將Application
設置爲所有者而不是表單,則可以將它們移動到多個表單和框架上。
但它是一個很好的設計模式?我不知道你想做什麼,但這可能是一個壞主意!
一般來說,在設計時用面板設計整個框架會更實用。然後添加一些代碼,允許通過從另一個面板或控件複製數據來創建框架。這將是一個更好的設計模式...
您必須使用您用於創建第一個(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上保存的信息(我沒有測試此選項)。
問候。