Delphi Treeview 操作实例

怎么改变Treeview中的图标? OnClick事件Click获取Node.text 批量处理及实现TreeView结点拖拽的实例

//这个过程根据你的要求选择图标

procedure TForm1.TreeView1GetImageIndex(Sender: TObject; Node: TTreeNode);

begin

if Node.HasChildren then

if Node.Expanded then

Node.ImageIndex := 3 //节点有子节点时打开的图标

else

Node.ImageIndex := 0 //节点有子节点时收起来的图标

else Node.ImageIndex := 1; //节点没有子节点时图标

end;

//这个过程显示选择的图标

procedure TForm1.TreeView1GetSelectedIndex(Sender: TObject; Node: TTreeNode);

begin

Node.SelectedIndex := Node.ImageIndex; //节点选择后使用的图标

end;

——————————————————————————————————-

//treeview的单击事件

procedure TForm1.TreeView1Click(Sender: TObject);

begin

//如果选中节点的等级(level)为0(根节点等级为0,根节点的子节点等级为1,依次类推)并且其序号(index)为0(同等级下的的节点按从上到下数第一个为0,第二个为1,以此类推)

if(treeview1.Selected.Level = 0)and(treeview1.Selected.Index = 0) then

begin

//这里写点中了第一个根节点后要做的事

form1.Color := clred;

end

else

if (treeview1.Selected.Level = 1)and(treeview1.Selected.Index=1) then

begin

//这里写点中了第三个根节点的第2个子节点后要做的事

form1.Color := clblue;

end;

end;

//如果你想点节点前的“+”号也有同样的效果,那么就应该在Expanding事件里写判断处理程序。

//【补充】【如果你不想要点+号的时候触发事件,这下面的可以删去 】

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean);

begin

if(node.Level = 0)and(node.Index = 0) then

begin

form1.Color := clred;

end

else

if (node.Level = 1)and(node.Index=1) then

begin

form1.Color := clblue;

end;

end;

//直接Click获取Node.text

procedure TForm1.TreeView1Click(Sender: TObject);

begin

if TreeView1.Selected.Index >= 0 then

Edit1.Text := TreeView1.Selected.Text;

end;

————————————————————————————————————-

//如何批量处理TreeView结点

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

TreeView1.items.BeginUpdate;

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

begin

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

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;

参考

http://blog.csdn.net/delphi308/article/details/10124125