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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM