把你的代码改一下应该就可以了。1、设置 TreeView.MultiSelect := True; 然后就可以CTRL+单击选中多个节点了2、在DragDrop中套上一个循环: for I := TTreeView(Source).SelectionCount-1 downto 0 do begin循环对 TTreeView(Source).Selections[I]进行操作(就是选中的多个节点)自己试一下
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); var selectedNode: TTreeNode; toNode: TTreeNode; i: integer; begin if Source=TreeView1 then begin if self.TreeView1.SelectionCount>0 then begin toNode:=self.TreeView1.GetNodeAt(X,Y); for i:=TreeView1.SelectionCount-1 downto 0 do begin selectedNode:=self.TreeView1.Selections[i]; selectedNode.MoveTo(toNode,naAddChild); end end end end;
我这样写,会出错,而且也不能同时移多个 另外DragOver函数如下 procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var selectedNode: TTreeNode; toNode: TTreeNode; i: integer; begin if Source=TreeView1 then begin if self.TreeView1.SelectionCount>0 then begin toNode:=self.TreeView1.GetNodeAt(X,Y); for i:=0 to TreeView1.SelectionCount-1 do begin selectedNode:=self.TreeView1.Selections[i]; if (selectedNode.Level=2) and (toNode.Level=1) and (toNode<>selectedNode.Parent) then begin Accept:=true; end else begin Accept:=false; end end end end else begin Accept:=false; end end;
//按楼主的写法改的procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TTreeView; end;procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); var I: integer; sNode, tNode : TTreeNode; begin tNode := TTreeView(Source).GetNodeAt(X, Y); for I := 0 to TTreeView(Source).SelectionCount-1 do begin Showmessage(inttostr(i)); sNode := TTreeView(Source).Selections[I]; sNode.MoveTo(tNode, naAddChild); end; end;
然后就可以CTRL+单击选中多个节点了2、在DragDrop中套上一个循环: for I := TTreeView(Source).SelectionCount-1 downto 0 do begin循环对 TTreeView(Source).Selections[I]进行操作(就是选中的多个节点)自己试一下
先让节点可以多选,
然后在触发Drag事件时,
循环找选中的节点,
在新的树里加上就可以了。
var
selectedNode: TTreeNode;
toNode: TTreeNode;
i: integer;
begin
if Source=TreeView1 then
begin
if self.TreeView1.SelectionCount>0 then
begin
toNode:=self.TreeView1.GetNodeAt(X,Y);
for i:=TreeView1.SelectionCount-1 downto 0 do
begin
selectedNode:=self.TreeView1.Selections[i];
selectedNode.MoveTo(toNode,naAddChild);
end
end
end
end;
另外DragOver函数如下
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
selectedNode: TTreeNode;
toNode: TTreeNode;
i: integer;
begin
if Source=TreeView1 then
begin
if self.TreeView1.SelectionCount>0 then
begin
toNode:=self.TreeView1.GetNodeAt(X,Y);
for i:=0 to TreeView1.SelectionCount-1 do
begin
selectedNode:=self.TreeView1.Selections[i];
if (selectedNode.Level=2) and (toNode.Level=1) and (toNode<>selectedNode.Parent) then
begin
Accept:=true;
end
else
begin
Accept:=false;
end
end
end
end
else
begin
Accept:=false;
end
end;
//按楼主的写法改的procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source is TTreeView;
end;procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
I: integer;
sNode, tNode : TTreeNode;
begin
tNode := TTreeView(Source).GetNodeAt(X, Y);
for I := 0 to TTreeView(Source).SelectionCount-1 do begin
Showmessage(inttostr(i));
sNode := TTreeView(Source).Selections[I];
sNode.MoveTo(tNode, naAddChild);
end;
end;
另外MultiSelect我有设置