例如一棵樹: Root |--aaa |--bbb |--ccc UP |--ddd Down |--eee 當我按UP按鈕時,選中的節點向上移,當我按Down時選中的節點向下移 如選中節點ddd,按UP時,ddd向上移 Root |--aaa |--ddd |--bbb UP |--ccc Down |--eee
----有答案都不肯自己看:
------------------------------------------------------------
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;
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;