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