首页  编辑  

TreeView的使用

Tags: /超级猛料/VCL/TreeView/   Date Created:

一. 如何初始化一个TreeView?

弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要

在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击

它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按

钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。

procedure TForm1.Btn1Click(Sender: TObject);

Const

MyDocDir = 'C:\My Documents';

PersonDir = '3hSoft';

Var

Var

I : Word;

SubNodeName : array [1..5] of ShortString;

RootNode, SubNode : TTreeNode;

P : PString;

begin

SubNodeName[1] := '便笺';

SubNodeName[2] := '发件箱';

SubNodeName[3] := '联系人';

SubNodeName[4] := '任务';

SubNodeName[5] := '日记';

TV1.Items.Clear;

TV1.Items.BeginUpdate;

New(P);

P^ := MyDocDir + '\' + PersonDir;

RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);

// 此 Node 的图标已对 Images 属性中取第 0 个了。

For I := 1 to 5 do

begin

New(P);

P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];

SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P)

;

;

// 如果不想使用图标的话请删除以下两行

SubNode.ImageIndex := I;

SubNode.SelectedIndex := I;

end;

TV1.Items.EndUpdate;

end;

二.在TreeView中如何设置选中结点

var

i:integer; {i为设置的选中结点的索引值}

begin

if i>treeview1.items.count then

treeview1.items[i].selected:=true;

treeview1.selected:=treeview1.items[i];

三。设置TreeView结点的图形

1. 设置TreeView的images属性为已存在的images对象

treeview1.images:=imagelist1;

2. 在加入结点后执行:

var

anode:TTreeNode;

begein

anode:=Treeview1.add(nil,'item1');

anode.imageindex:=0; {结点未选中时显示的图标}

anode.selectedindex:=1; {结点选中时显示的图标}

end

3. 如果结点图形在改变后未发生变化,可以执行:

treeview1.refresh;

四。如何批量处理TreeView结点

使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:

TreeView1.items.BeginUpdate;

for i:=0 to TreeView1.items.count-1 do

begin

//将每个结点的文字改成为小写字母

TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);

end;

TreeView1.items.EndUpdate;

五。 实现TreeView结点拖拽的实例

下面的程序片段演示了如何实现拖拽treeview构件结点的例子

{鼠标按下时执行的语句}

procedure TForm1.Treeview1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

{判断左键按下并且鼠标点在一个结点上开始实现拖拽}

if ( Button = mbLeft ) and

( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then

begin

Treeview1.BeginDrag( False );

end;

end;

{鼠标拖动执行语句}

procedure TForm1.Treeview1DragOver( Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

var

Node : TTreeNode;

begin

if Source = Treeview1 then

begin

Node := Treeview1.GetNodeAt( X, Y ); {取当前结点}

if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true}

Accept := true;

end;

end;

{鼠标释放时执行的语句}

procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;

X, Y : Integer );

var

TempNode : TTreeNode;

AttachMode : TNodeAttachMode;

begin

if Treeview1.Selected = nil then

Exit;

AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}

{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}

{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }

{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }

Treeview1.Items.BeginUpdate;

try

TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,

'Temp' );

try

{ 移动选中的结点到目标结点 }

Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );

finally

TempNode.Free; { 不要忘了释放临时结点 }

end;

finally

Treeview1.Items.EndUpdate;

end;

end;