5

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

喜欢:

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

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

然后复制 f? 可能吗?如何?或任何其他建议?e

4

3 回答 3

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;
于 2010-12-09T14:13:21.607 回答
3

您需要记住,所有控件都有父级和所有者。所有者可能是nil,但您需要通过代码释放这些控件,因此大多数控件由其他组件拥有。

因此,如果所有者被破坏,面板也会被破坏。如果面板是在设计时创建的,那么它就属于它所在的表单!

破坏那个表格会破坏面板!

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

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

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

于 2010-12-10T08:45:34.900 回答
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 上保存的信息(我没有测试此选项)。

问候。

于 2010-12-10T09:15:13.857 回答