加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi5上创建TPanel的精确副本

发布时间:2020-12-15 09:23:47 所属栏目:大数据 来源:网络整理
导读:我有一个TPanel pnlMain,根据用户操作,数据验证等创建了几个动态TPanel(并且pnlMain是它们的Parent).每个面板包含一个充满字符串的彩色网格.除了面板,还有一些开源箭头组件和图片.整堆的东西. 现在我希望用户能够打印这个面板(我问过如何操作on this questio
我有一个TPanel pnlMain,根据用户操作,数据验证等创建了几个动态TPanel(并且pnlMain是它们的Parent).每个面板包含一个充满字符串的彩色网格.除了面板,还有一些开源箭头组件和图片.整堆的东西.

现在我希望用户能够打印这个面板(我问过如何操作on this question),但在打印之前,必须向用户提供一个包含pnlMain副本的新表单.在此表单上,用户必须进行一些更改,添加少量组件,然后打印自定义的pnlMain副本.打印后,用户将关闭此表单并返回原始表单与原始pnlMain.而且 – 你可以猜到 – 原始的pnlMain必须保持完整.

那么有没有任何聪明的方法来复制整个TPanel及其内容?我知道我可以手动迭代pnlMain.Controls列表.

解决方法

代码基于对子控件的迭代,但无论如何都不错;-)

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文章

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读