例如一棵樹:Root
|--aaa
|--bbb
|--ccc UP
|--ddd Down
|--eee
當我按UP按鈕時,選中的節點向上移,當我按Down時選中的節點向下移如選中節點ddd,按UP時,ddd向上移Root
|--aaa
|--ddd
|--bbb UP
|--ccc Down
|--eee
|--aaa
|--bbb
|--ccc UP
|--ddd Down
|--eee
當我按UP按鈕時,選中的節點向上移,當我按Down時選中的節點向下移如選中節點ddd,按UP時,ddd向上移Root
|--aaa
|--ddd
|--bbb UP
|--ccc Down
|--eee
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;以上代码调试通过!
不行啊,
我的意思是每按一次UP或down按鈕時,所選中的節點向下或向下移動
再重新生成一颗数一般来讲,如果树的一个结点里不带有其它信息的话实现楼主所说的我认为改改Text的就可以了
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;------------------------经过测试
------------------------------------------------------------
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;