问关于treeview节点拖动问题

xiaojinyulyh 2006-03-27 09:55:34
treeview同级节点托动怎么实现阿?谢谢
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengxue291080 2006-03-27
  • 打赏
  • 举报
回复
学习
Cassava 2006-03-27
  • 打赏
  • 举报
回复
procedure TForm1.TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with Sender as TTreeView do
begin
if (Button = mbLeft) and (htOnItem in GetHitTestInfoAt(X,Y)) then
BeginDrag(false);
end;
end;


procedure TForm1.TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
aNode : TTreeNode;
ks: TkeyBoardState;
begin
Accept := (Source is TTreeView);
with Sender as TTreeView do
begin
aNode := GetNodeAt(X, Y);
if aNode <> nil then
begin
//Accept := true; // 允许拖动
FMoveAsChild := false;
GetKeyboardState(ks);
if ks[VK_CONTROL] and $80 <> 0 then
FMoveAsChild := true;
// Items.BeginUpdate;
// 控制向上滚动
if Y <= 15 then
SendMessage(Handle, WM_VSCROLL, SB_LINEUP, 0)
else // 控制向下滚动
if (Height-Y <= 25) then
SendMessage(Handle, WM_VSCROLL, SB_LINEDOWN, 0);
//Refresh;
// Items.EndUpdate;
end;
end;
end;

procedure TForm1.myMoveNodes(tv: TTreeView; dNode, NeedMoveNodes: TTreeNode; MoveAsChild: boolean);
var
aNode: TTreeNode;
i: integer;
begin
if MoveAsChild then
aNode := tv.Items.AddChild(dNode, NeedMoveNodes.Text)
else
aNode := tv.Items.Insert(dNode, NeedMoveNodes.Text);

for i:= 0 to NeedMoveNodes.Count-1 do
begin
myMoveNodes(tv, aNode, NeedMoveNodes.Item[i], true);
end;
end;

procedure TForm1.TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
var
sNode, dNode, aNode: TTreeNode;
begin
sNode := (Source as TTreeView).Selected;
if sNode = nil then exit;

dNode := (Sender as TTreeView).GetNodeAt(X, Y);
if dNode = nil then exit;

(Sender as TTreeView).Items.BeginUpdate;
if FMoveAsChild then // 作为孩子, 这段代码不够优化,为的是更好地移动对应节点内容
begin
aNode := dNode.GetNextSibling;
if aNode = nil then
begin
if Sender = Source then
begin
aNode := (Sender as TTreeView).Items.AddChild(dNode, 'Temp');
sNode.MoveTo(aNode, naInsert);
aNode.Delete;
end
else begin
myMoveNodes(Sender as TTreeView, dNode, sNode, true);
(Sender as TTreeView).Selected := dNode;
end;
end
else begin
if Sender = Source then
(Sender as TTreeView).Selected.MoveTo(dNode, naAddChild)
else begin
myMoveNodes(Sender as TTreeView, dNode, sNode, true);
(Sender as TTreeView).Selected := dNode;
end;
end;
end
else begin // 移到前面
if Sender = Source then
(Sender as TTreeView).Selected.MoveTo(dNode, naInsert)
else begin
myMoveNodes(Sender as TTreeView, dNode, sNode, false);
(Sender as TTreeView).Selected := dNode;
end;
end;
(Sender as TTreeView).Items.EndUpdate;

FMoveAsChild := false;
end;
xiaojinyulyh 2006-03-27
  • 打赏
  • 举报
回复
谢谢,不过能不能告诉我具体在哪里写这些代码阿?是在MouseDown中设置dNode:=MyTreeView.Selected;再在MouseUp中写这句代码吗?我没弄成,嘿嘿能不能说明白一点阿
Cassava 2006-03-27
  • 打赏
  • 举报
回复
(Sender as TTreeView).Selected.MoveTo(dNode, naInsert)
xiaojinyulyh 2006-03-27
  • 打赏
  • 举报
回复
是阿
apartst 2006-03-27
  • 打赏
  • 举报
回复
改变顺序吗?
zzq4823 2006-03-27
  • 打赏
  • 举报
回复
procedure TEditSubClassFrm.ClassTreeDragDrop(Sender, Source: TObject; X,
Y: Integer);
var targetnode,sourcenode:TTreenode;
MyHitTest : THitTests;
begin
targetnode:=ClassTree.getnodeat(x,y); //获得源节点
sourcenode:=ClassTree.selected; //获得目标节点
MyHitTest := ClassTree.GetHitTestInfoAt(X,Y);
if htOnIcon in MyHitTest then begin
SwapNode(targetnode,sourcenode);
if (Fini.LogSet>0) then
RecordLog('拖动频道['+sourcenode.Text+']改变顺序');
end else begin
//修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;
ClassTree.items.beginupdate; //禁用TreeView重绘操作
try
copynodeunder(ClassTree,sourcenode,targetnode); //启动移动过程
ClassTree.selected:=targetnode;
finally
ClassTree.items.endupdate; //重新设置
end;
end;
end;
procedure CopyNodeUnder(treeview:TTreeview;sourcenode,targetnode:ttreenode);
var newnode:ttreenode;
i:integer;
begin
newnode:=TreeView.items.addchildfirst(targetnode,''); //建立目标项
newnode.assign(sourcenode); //复制源项属性
// pMyid(newnode.Data)^.nodeParent:=pMyid(targetnode.Data)^.nodeid;
for i:=sourcenode.count-1 downto 0 do //递归调用,按倒序移动其所有子项
CopyNodeUnder (treeview,sourcenode.item[i],newnode);
treeview.items.delete(sourcenode); //删除源项
end;

procedure SwapNode(targetnode,sourcenode:TTreeNode);
begin
Sourcenode.MoveTo(targetnode,naInsert);
end;

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧