是否可以创建运行时框架并添加现有面板,例如将面板的父级设置为框架?当它添加时,重复框架并使用它?
像:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
然后复制f?它可以吗?怎么样?或任何其他建议? ë
答案 0 :(得分: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;
答案 1 :(得分:3)
您需要记住所有控件都有父级和所有者。所有者可能 nil
但是您需要通过代码释放这些控件,因此大多数控件都归其他组件所有。
因此,如果所有者被摧毁,该面板也将被销毁。如果面板是在设计时创建的,那么它就是它所在的表单所拥有的!
销毁该表格会破坏该小组!
但是如果您在运行时创建面板并将 Application
设置为所有者而不是表单,则可以将它们移动到多个表单和框架上。
但这是一个好的设计模式吗?我不知道你要做什么,但这可能是一个坏主意!
通常,在设计时使用面板设计整个框架会更实际。然后添加一些代码,允许通过从另一个面板或控件复制数据来创建框架。那将是一个更好的设计模式......
答案 2 :(得分: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上检索已保存的信息(我没有测试此选项)。
的问候。