Search code examples
delphidelphi-7

How to make copy of a treeview nodes to another treeview


How do I take the data from one populated treeview and put it into another existing treeview. All the nodes and children need to be copied.


Solution

  • TTreeNode implements the TPersistent.Assign() method, so one option would be to write a recursive function that iterates the source TreeView adding-and-assigning nodes to the target TreeView. For example:

    procedure CopyNodes(SrcTree, DstTree: TTreeView);
    var
      DstNodes: TTreeNodes;
      SrcRootNode: TTreeNode;
    
      procedure DoCopyNodes(SrcNode, Relative: TTreeNode; AddMode: TNodeAttachMode);
      var
        DstNode: TTreeNode;
      begin
        while SrcNode <> nil do
        begin
          DstNode := DstNodes.AddNode(nil, Relative, '', nil, AddMode);
          try
            DstNode.Assign(SrcNode);
            DoCopyNodes(SrcNode.GetFirstChild, DstNode, naAddChild);
          except
            DstNode.Delete;
            raise;
          end;
          SrcNode := SrcNode.GetNextSibling;    
        end;
      end;
    
    begin
      SrcRootNode := SrcTree.Items.GetFirstNode;
      if SrcRootNode <> nil then
      begin
        DstNodes := DstTree.Items;
        DstNodes.BeginUpdate;
        try
          DoCopyNodes(SrcRootNode, nil, naAdd);
        finally
          DstNodes.EndUpdate;
        end;
      end;
    end;
    
    CopyNodes(TreeView1, TreeView2);