whats new ¦  programming tips ¦  indy articles ¦  intraweb articles ¦  informations ¦  links ¦  interviews
 misc ¦  tutorials ¦  Add&Win Game

Tips (1541)

Database (90)
Files (137)
Forms (107)
Graphic (114)
IDE (21)
Indy (5)
Internet / LAN (130)
IntraWeb (0)
Math (76)
Misc (126)
Multimedia (45)
Objects/
ActiveX (51)

OpenTools API (3)
Printing (35)
Strings (83)
System (266)
VCL (242)

Top15

Tips sort by
component


Search Tip

Add new Tip

Add&Win Game

Advertising

39 Visitors Online


 
...Copy subnodes of a TreeView to a second Treeview?
Autor: P. Below
[ Print tip ]  

Tip Rating (11):  
     



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;

 

Rate this tip:

poor
very good


Copyright © by SwissDelphiCenter.ch
All trademarks are the sole property of their respective owners