一. 如何初始化一个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;