在运行时创建Tframe:

时间:2010-12-09 13:53:15

标签: delphi runtime tframe

是否可以创建运行时框架并添加现有面板,例如将面板的父级设置为框架?当它添加时,重复框架并使用它?

像:

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

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

然后复制f?它可以吗?怎么样?或任何其他建议? ë

3 个答案:

答案 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上检索已保存的信息(我没有测试此选项)。

的问候。