【问题标题】:create Tframes on runtime:在运行时创建 Tframe:
【发布时间】:2011-05-22 21:15:25
【问题描述】:

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

喜欢:

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

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

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

【问题讨论】:

    标签: delphi runtime tframe


    【解决方案1】:

    我认为你不会通过复制来解决这个问题。你需要的是这样的函数:

    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;
    

    【讨论】:

    • @InTheName 因为在这个函数中我们需要返回一个新创建的对象,并让调用者对生命周期负责。但是如果创建后出现异常,那么我们需要在让异常上浮调用堆栈之前销毁对象。
    【解决方案2】:

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

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

    销毁该表单将销毁面板!

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

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

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

    【讨论】:

      【解决方案3】:

      您必须使用与创建第一个框架 (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 上保存的信息(我没有测试此选项)。

      问候。

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 2012-03-05
        • 2012-02-28
        • 2018-09-13
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        相关资源
        最近更新 更多