是否可以创建运行时框架并添加现有面板,例如将面板的父级设置为框架?当它添加时,复制框架并使用它?
喜欢:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
然后复制 f? 可能吗?如何?或任何其他建议?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 上保存的信息(我没有测试此选项)。
问候。