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 = nil) or (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)) thenraise Exception.Create("CopySubtree cannot copy a subtree to one of the " +
"subtrees nodes.");
ifnot Assigned(CopyProc) then
CopyProc := DefaultCopyDataProc;
anchor := target.Items.AddChild(targetnode, sourcenode.Text);
CopyProc(sourcenode, anchor);
child := sourcenode.GetFirstChild;
while Assigned(child) dobegin
CopySubtree(child, target, anchor, CopyProc);
child := child.getNextSibling;
end; { While }end; { CopySubtree }procedure TForm1.Button1Click(Sender : TObject);
beginif assigned(treeview1.selected) then
CopySubtree(treeview1.selected, treeview2, nil);
end;
Если Вас заинтересовала или понравилась информация по разработке на Delph - "Копировать нижние узлы TTreeView во второй TTreeView", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу: Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!