我有一个TPanel pnlMain,在几个动态TPanels是创建(和pnlMain是他们的父母)根据用户的行动、数据验证,等等。每个小组包含一个颜色的网格完整的弦。除了板,还有一些开放源箭的组件和一张照片。大堆东西。

现在我要用户能够打印本小组(我要如何做到这一点 关于这个问题的),但是在印刷之前,用户必须提出一个新的形式、包含的副本pnlMain.在这种形式的用户做的一些修改,添加几个部件,那么他打印制的副本pnlMain.在印刷之后的用户将近这种形式,并返回到原来的形式与原pnlMain.和如你猜测的原pnlMain必须保持不变。

因此,是否有任何聪明的方法来复制整个TPanel和它的内容是什么?我知道我可以手动使其迭代过pnlMain.控制清单。

有帮助吗?

解决方案

代码为基础的迭代的孩子的控制,但不坏无论如何;-)

procedure TForm1.btn1Click(Sender: TObject);

    function CloneComponent(AAncestor: TComponent): TComponent;
      var
        XMemoryStream: TMemoryStream;
        XTempName: string;
      begin
        Result:=nil;
        if not Assigned(AAncestor) then
          exit;
        XMemoryStream:=TMemoryStream.Create;
        try
          XTempName:=AAncestor.Name;
          AAncestor.Name:='clone_' + XTempName;
          XMemoryStream.WriteComponent(AAncestor);
          AAncestor.Name:=XTempName;
          XMemoryStream.Position:=0;
          Result:=TComponentClass(AAncestor.ClassType).Create(AAncestor.Owner);
          if AAncestor is TControl then TControl(Result).Parent:=TControl(AAncestor).Parent;
          XMemoryStream.ReadComponent(Result);
        finally
          XMemoryStream.Free;
        end;
      end;

    var
      aPanel: TPanel;
      Ctrl, Ctrl_: TComponent;
      i: integer;
    begin
      //handle the Control (here Panel1) itself first
      TComponent(aPanel) := CloneComponent(pnl1);
      with aPanel do
      begin
        Left := 400;
        Top := 80;
      end;

      //now handle the childcontrols
      for i:= 0 to pnl1.ControlCount-1 do begin
        Ctrl := TComponent(pnl1.Controls[i]);
        Ctrl_ := CloneComponent(Ctrl);
        TControl(Ctrl_).Parent := aPanel;
        TControl(Ctrl_).Left := TControl(Ctrl).Left;
        TControl(Ctrl_).top := TControl(Ctrl).top;
      end;
    end;

代码 Delphi3000 文章

其他提示

太多的代码...ObjectBinaryToText和ObjectTextToBinary做的工作很好地使用流。德尔菲7有一个代码的例子,不知道,2009年(或2006年,从来没有打扰到你看)仍然有它。见D5帮助的文件对于这些职能(没有d5提供这里)。

我会做到这一点通过使用RTTI复制所有的属性。你还有迭代过所有的控制,但是当你需要设置的财产价值,RTTI可以帮助实现自动化的过程。你可以得到的一个例子的底部 这篇文章, ,在那里你会找到一个链接到一些帮助者的代码,其中包括一个 CopyObject 程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top