Tree如何上下移支節點?

ZXYSOSO 2004-08-25 09:32:18
例如一棵樹:

Root
|--aaa
|--bbb
|--ccc UP
|--ddd Down
|--eee


當我按UP按鈕時,選中的節點向上移,當我按Down時選中的節點向下移

如選中節點ddd,按UP時,ddd向上移

Root
|--aaa
|--ddd
|--bbb UP
|--ccc Down
|--eee



...全文
117 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjazz 2004-08-25
  • 打赏
  • 举报
回复
----有答案都不肯自己看:
------------------------------------------------------------
procedure MoveDownNode(Node:TTreeNode);
var T:Ttreenode;
begin
If Node=nil then exit;
T:=Node.getNextSibling;
if T=nil then exit;
if T.getNextSibling=nil then Node.MoveTo(T,naAdd)
else
Node.MoveTo(T.getNextSibling,naInsert);
end;
procedure MoveUpNode(Node:TTreeNode);
var T:Ttreenode;
begin
If Node=nil then exit;
T:=Node.getPrevSibling;
if T=nil then exit;
Node.MoveTo(T,naInsert);
end;
ZXYSOSO 2004-08-25
  • 打赏
  • 举报
回复
你們都跑題了,我的UP,Down都是Button按鈕,不是方向鍵啊
luke5678 2004-08-25
  • 打赏
  • 举报
回复
呵呵,向楼上学习!
jinjazz 2004-08-25
  • 打赏
  • 举报
回复
方向键不能直接被接受,必须重写构件:

从treeview继承:并添加两个public 方法 moveup 和movedown 用于操作

----------代码-------拷贝后保存并安装:component-install component-browse...

unit TestTree;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls;
type
TMoveTree=class(TTreeview)
protected
procedure CMWantSpecialKey(var Message: TCMWantSpecialKey); message CM_WANTSPECIALKEY;
public
procedure MoveDownNode(Node:TTreeNode);
procedure MoveUpNode(Node:TTreeNode);
end;
procedure Register;
implementation
procedure TMoveTree.MoveDownNode(Node:TTreeNode);
var T:Ttreenode;
begin
If Node=nil then exit;
T:=Node.getNextSibling;
if T=nil then exit;
if T.getNextSibling=nil then Node.MoveTo(T,naAdd)
else
Node.MoveTo(T.getNextSibling,naInsert);
end;
procedure TMoveTree.MoveUpNode(Node:TTreeNode);
var T:Ttreenode;
begin
If Node=nil then exit;
T:=Node.getPrevSibling;
if T=nil then exit;
Node.MoveTo(T,naInsert);
end;
procedure TMoveTree.CMWantSpecialKey(var Message: TCMWantSpecialKey);
begin
inherited;
if (Message.CharCode = VK_Down) or (Message.CharCode = VK_Up)
then message.Result:=1;
end;

procedure Register;
begin
RegisterComponents('System', [TMoveTree]);
end;
end.
----------------------------------------------------------------

使用范例:由于拦截了 CM_WANTSPECIALKEY 就可以在keydown中处理
---------------------------------------------------------------
procedure TForm1.MoveTree1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_Down then
begin
MoveTree1.MoveDownNode(MoveTree1.Selected);
MoveTree1.Selected.getPrevSibling.Selected:=true;
end;
if (key = VK_Up) then
begin
MoveTree1.MoveUpNode(MoveTree1.Selected);
MoveTree1.Selected.getNextSibling.Selected:=true;
end;
end;

------------------------经过测试
linweifeng 2004-08-25
  • 打赏
  • 举报
回复
用moveto方法,参数自己研究一下
ZXYSOSO 2004-08-25
  • 打赏
  • 举报
回复
不可以重生一棵樹
難道這樣不行嗎?
luke5678 2004-08-25
  • 打赏
  • 举报
回复
给个思路吧:

先TreeView1.Destroy;
再重新生成一颗数

一般来讲,如果树的一个结点里不带有其它信息的话实现楼主所说的我认为改改Text的就可以了
ZXYSOSO 2004-08-25
  • 打赏
  • 举报
回复
to:luke5678(奇异)
不行啊,
我的意思是每按一次UP或down按鈕時,所選中的節點向下或向下移動
luke5678 2004-08-25
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Select_Text: string;
Pre_Text: string;
Beh_Text: string;
Current_index: integer;
begin
Select_Text := TreeView1.Selected.Text;
Current_index := TreeView1.Selected.Index;
if Ord(key) = 38 then
begin
if Current_index = 0 then Exit;
Pre_Text := TreeView1.Items.Item[Current_index - 1].Text;
TreeView1.Selected.Text := Pre_Text;
TreeView1.Items.Item[Current_index - 1].Text := Select_Text;
TreeView1.Items.Item[Current_index].Selected := True;
end;
if Ord(key) = 40 then
begin
if Current_index = 4 then Exit;
Beh_Text := TreeView1.Items.Item[Current_index + 1].Text;
TreeView1.Selected.Text := Beh_Text;
TreeView1.Items.Item[Current_index + 1].Text := Select_Text;
TreeView1.Items.Item[Current_index].Selected := True;
end;
end;

以上代码调试通过!
outer2000 2004-08-25
  • 打赏
  • 举报
回复
替换一下啊
minjunw 2004-08-25
  • 打赏
  • 举报
回复
在按键事件中判断相应按键,然后用节点的MoveTo方法进行移动。
linweifeng 2004-08-25
  • 打赏
  • 举报
回复
用treeNode.moveto不就可以了,给的方法,要自己研究...
linweifeng 2004-08-25
  • 打赏
  • 举报
回复
楼主是不是新手?

5,388

社区成员

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

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