Delphi 在运行时创建Tframes:

Delphi 在运行时创建Tframes:,delphi,runtime,tframe,Delphi,Runtime,Tframe,是否可以创建运行时框架并添加现有面板,如将面板的父级设置为框架?当它被添加时,复制框架并使用它 比如: 那么复制f?可能吗?怎样?或者其他建议? 我认为你不会通过复制来解决这个问题。您需要的是这样一个函数: function CreateFrameAndHostPanel(Owner: TComponent; Parent: TWinControl; Panel: TPanel): TFrame; begin Result := TFrame.Create(Owner); Try

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

比如:

那么复制f?可能吗?怎样?或者其他建议?
我认为你不会通过复制来解决这个问题。您需要的是这样一个函数:

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
,但是您需要通过代码释放这些控件,所以大多数控件都属于其他组件

因此,如果业主被毁,配电盘也会被毁。如果面板是在设计时创建的,那么它就属于它所在的窗体

摧毁那张表格会摧毁面板

但是,如果在运行时创建面板,并将
应用程序
设置为所有者而不是表单,则可以将它们移动到多个表单和框架上

但这是一种好的设计模式吗?我不知道你想做什么,但这可能是个坏主意


一般来说,在设计时间内用面板设计整个框架更为实用。然后添加一些代码,允许通过从另一个面板或控件复制数据来创建框架。这将是一个更好的设计模式…

您必须使用与创建第一个框架(框架1)相同的代码创建新框架(框架2);稍后,您必须在FRAME2上的FRAME1中创建所有包含的组件(在运行时创建)

为此,请使用:

for i := 0 to (FRAME1.ComponentCount - 1) do 
  ...
  cmp := TComponent(FRAME1.Component[i]);
  ... create cmp  on Frame2
你可以尝试第二种选择;使用TMemoryStream(SaveComponent)保存FRAME1,然后创建新的Frame并在流中检索保存的信息(我没有测试此选项)


问候

@InTheName,因为在这个函数中,我们需要返回一个新创建的对象,并让调用方负责整个生命周期。但是,如果在创建之后出现异常,那么我们需要销毁该对象,然后再让异常在调用堆栈中浮动。
for i := 0 to (FRAME1.ComponentCount - 1) do 
  ...
  cmp := TComponent(FRAME1.Component[i]);
  ... create cmp  on Frame2