procedure TMainForm.CopyNode(DNode, SNode: TTreeNode);
var
ANode, NextNode : TTreeNode;
Owner : TTreeView;
SLevel, DLevel :Integer;
begin
Owner := DNode.TreeView as TTreeView;
with Owner do
begin
if not DNode.HasAsParent(SNode) then
begin
try
try
Items.BeginUpdate;
NextNode:=Items.AddChild(DNode,SNode.Text);
NextNode.Assign(SNode);
ANode:=SNode.GetNext;
SLevel:=SNode.Level;
DLevel:=DNode.Level + 1;
while ANode.Level>SNode.Level do
begin
if(ANode.Level-SLevel)=(NextNode.Level-DLevel)then
begin
NextNode:=Items.AddChild(NextNode.Parent,
ANode.Text);
NextNode.Assign(ANode);
end
else if(ANode.Level-SLevel)>
(NextNode.Level-DLevel) then
begin
NextNode:=Items.AddChild(NextNode,ANode.Text);
NextNode.Assign(ANode);
end
else if(ANode.Level-SLevel)<
(NextNode.Level-DLevel)then
begin
while(NextNode.Level-DLevel)>
(ANode.Level-SLevel)do
NextNode := NextNode.Parent;
NextNode:=
Items.AddChild(NextNode.Parent,ANode.Text);
NextNode.Assign(ANode);
end;
ANode := ANode.GetNext;
if not Assigned(ANode) then Break;
Application.ProcessMessages;
end;
finally
Items.EndUpdate;
end;
except
// force repaint on exception
(Owner as TWinControl).Invalidate;
raise;
end;
end
else
Application.MessageBox('不能copy到子节点', '错误',
MB_OK + MB_DEFBUTTON1);
end;
end;
用时
procedure TMainForm.TreeViewDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
tSrcNode ,tDesNode: TTreeNode;
tSrcID ,tDesID: Integer;
sSql: String ;
lSrcItem: TListItem;
begin
tSrcID := 0 ;tDesID := 0;
tDesNode := TTreeview(Sender).GetNodeAt(X,Y);
if Source is TTreeview then
begin
tSrcNode := TTreeview(Source).Selected;
if btnMode.Down then
tSrcNode.Moveto(tDesNode, naInsert)
else
tSrcNode.MoveTo(tDesNode, naAddChild);
end
end;