TreeView是Delphi中使用頻率比較高的一個控件,雖然使用次數很多,但總結不夠。借着這次做GDW原型的機會總結一下,寫的過程中也會參考網上的博文。
TTreeView、TTreeNodes和TTreeNode
TTreeView由節點構成,建樹通過對TreeView.items屬性進行操作。Items是一個TTreeNodes對象,這是一個TTreeNode集。
常用的屬性
- Count,結點個數;
- Item[index],通過index得到結點;
- TTreeNode.Data,指向一個指針,可以存對象,存指針,也可以存整數;
- TTreeNode.Text,樹結點的文本;
- TTreeNode.ImageIndex,TTreeNode.SelectedIndex,分別是樹結點圖標序號,樹結點選中時圖標序號,用於設置樹結點的圖標;
- TTreeNode.Expanded屬性表明是否所有的子項都全部展開;
- TTreeNode.HasChildren屬性表明一個項是否有子項;
- TTreeNode.Focused屬性確定焦點是否落在此節點上,被Focus時會一個標准的方框圍住,只能有一個節點會被聚焦。
- TTreeNode.Selected屬性表明一個節點是否被選中,同樣只有一個節點會被選中。
常用的方法
- GetFirstNode 得到根結點;
- TTreeNode.GetNext 得到本節點的下一個結點,配合GetFirstNode可以遍歷整個樹;
- AddFirst 添加第一個根節點,此函數添加的節點總排在前面,除非后來又使用此函數添加了一個節點,則后添加的節點將排在前面。返回新添加的節點。
- AddChild添加一個子節點,要求有父節點作為其參數。返回新添加的節點。
- Add添加一個兄弟節點,要求有兄弟節點作為其參數。返回新添加的節點。
- TTreeNode的一些結點關系方法:GetFirstChild, GetLastChild, GetPrevChild, and GetNextChild分別返回當前項子項的第一個、最后一個和前一個、后一個項。GetNextSibling、 GetPrevSibling則返回在同一Level下的下一個和上一個項。
常用的事件
- 當從一個節點跳到另一個節點,會觸發TTreeView.OnChange事件。該事件中,將傳遞node,即當前被選中的節點。
- 當修改一個節點的text時,會觸發TTreeView.OnEdit事件。
TreeView的常見使用方法
添加、刪除和編輯樹結點
- 用AddFirst, AddFirstChild, AddChild等先添加根節點,如Treeview.Items.AddFirst( nil, 'Root');然后以此為基礎,添加此項的子節點。
- 刪除節點:Treeview.Selected.Delete
- 編輯節點內容:Treeview.Selected.EditText
- 為了提升效率,避免界面大幅閃動,最好使用TreeView.Items.BeginUpdate 和 TreeView.Items.EndUpdate 方法;
設置樹結點圖標
- ImageIndex:在常態時選用的圖的序號;
- SelectedIndex:當節點被選中時在TimageList 中選什么樣的圖象;
一段代碼
1 Items.BeginUpdate; 2 Items.Clear; 3 // 建立第一層節點 4 AddElemntType2Tree(AElementTypeID, AAddNoChildNode); 5 // 建立第二層節點 6 if Items.GetFirstNode <> nil then 7 begin 8 oNode := Items[0]; // 選擇第一個構件類型結點 9 while oNode <> nil do 10 begin 11 UpdateTreeNode(oNode, ASelectedElementID); 12 oNode := oNode.getNextSibling; 13 end; 14 end; 15 // 展開 16 if Selected <> nil then 17 Selected.Expanded := True 18 else if Items.Count > 0 then 19 begin 20 oNode := Items.GetFirstNode; 21 Assert(oNode <> nil); 22 // 選中第一個節點的第一個子節點(若存在則為第一個構件類型下的第一個構件)。 23 Selected := oNode.getFirstChild(); 24 // 若沒有選中構件,則選中第一個構件類型節點,否則展開節點。 25 if Selected = nil then 26 Selected := oNode 27 else 28 Selected.Expanded := True; 29 end; 30 Items.EndUpdate;