...Copy subnodes of a TreeView to a second Treeview?

Author: P. Below

Category: VCL


type
  
{: Callback to use to copy the data of a treenode when the
     node itself is copied by CopySubtree.
   @param oldnode is the old node
   @param newnode is the new node
   @Desc Use a callback of this type to implement your own algorithm
     for a node copy. The default just uses the Assign method, which
     produces a shallow copy of the nodes Data property. }
  
TCopyDataProc = procedure(oldnode, newnode : TTreenode);

{: The default operation is to do a shallow copy of the node, via
Assign. }
procedure DefaultCopyDataProc(oldnode, newnode : TTreenode);
begin
  
newnode.Assign(oldnode);
end;

{-- CopySubtree
-------------------------------------------------------}
{: Copies the source node with all child nodes to the target treeview.
@Param sourcenode is the node to copy
@Param target is the treeview to insert the copied nodes into
@Param targetnode is the node to insert the copy under, can be nil to
  make the copy a top-level node.
@Param CopyProc is the (optional) callback to use to copy a node.
  If Nil is passed for this parameter theDefaultCopyDataProc will be
used.
@Precondition  sourcenode <> nil, target <> nil, targetnode is either
  nil or a node of target
@Raises Exception if targetnode happens to be in the subtree rooted in
  sourcenode. Handling that special case is rather complicated, so we
  simply refuse to do it at the moment.
}{ Created 2003-04-09 by P. Below -----------------------------------------------------------------------
}
procedure CopySubtree(sourcenode : TTreenode; target : TTreeview;
  targetnode : TTreenode; CopyProc : TCopyDataProc = nil);
var
  
anchor : TTreenode;
  child : TTreenode;
begin { CopySubtree }
  
Assert(Assigned(sourcenode),
    'CopySubtree:sourcenode cannot be nil');
  Assert(Assigned(target),
    'CopySubtree: target treeview cannot be nil');
  Assert((targetnode = nilor (targetnode.TreeView = target),
    'CopySubtree: targetnode has to be a node in the target
    treeview.');

  if (sourcenode.TreeView = target) and
    
(targetnode.HasAsParent(sourcenode) or (sourcenode =
    targetnode)) then
    raise 
Exception.Create('CopySubtree cannot copy a subtree to one of the ' +
      'subtrees nodes.');

  if not Assigned(CopyProc) then
    
CopyProc := DefaultCopyDataProc;

  anchor := target.Items.AddChild(targetnode, sourcenode.Text);
  CopyProc(sourcenode, anchor);
  child := sourcenode.GetFirstChild;
  while Assigned(child) do 
  begin
    
CopySubtree(child, target, anchor, CopyProc);
    child := child.getNextSibling;
  end{ While }
end{ CopySubtree }


procedure TForm1.Button1Click(Sender : TObject);
begin
  if 
assigned(treeview1.selected) then
    
CopySubtree(treeview1.selected, treeview2, nil);
end;

 

printed from
www.swissdelphicenter.ch
developers knowledge base