Treeview Thanks(budong205 (我是真的很菜) )
樹形圖(Treeview)是Win95下新增加的通用顯示部件(Common Control,在COMCTL32.DLL中)之一,從Delphi2.0開始也增加了相應的控件Treeview,用於取代原Outline控件。由於樹形圖結構較複雜,使用起來常不知如何下手。這裏就使用中的一些問題作些介紹。
Treeview用於顯示按照樹形結構進行組織的數據,這在實際當中用途還是比較廣泛的,如計算機中的文件系統(Windows95中的資源管理器)、企業或公司的組成結構等等。Treeview控件中一個樹形圖由節點(TreeNode)和連接線組成。TtreeNode是TTreeview的基本組成單元。一個樹的節點又包含文本(Text)和數據(Data)。Text爲String類,Data則爲無定形指針(Untyped Pointer),可以指向一個與節點相聯繫的數據結構。
每一個節點下子節點形成這一節點的Items屬性,當前節點有一個唯一的Index(TreeNode的Index屬性),用於說明子節點在Items中的位置,每一個節點下的子節點是順序編號的,第一個是0,第二個是1,依次類推。用IndexOf方法獲得子節點的順序,絕對順序(AbsoluteIndex)則是指從Treeview第一個項開始的順序值,第一個是0,如此推下去。Item屬性則根據Index的值返回當前節點的第Index個子節點。Count則表明屬於此項的所有子節點的數量。用MoveTo方法將Item由一個位置移到另一個位置。
Expanded屬性表明是否所有的子項都全部展開(包括子項的子項),爲True表示全部展開。IsVisible屬性表明一個項是否在樹中能被看到,如果樹全部展開那麼這個Item是肯定可以被看到。HasChildren屬性表明一個項是否有子項。 GetFirstChild, GetLastChild, GetPrevChild, and GetNextChild分別返回當前項子項的第一個、最後一個和前一個、後一個項。GetNextSibling and GetPrevSibling則返回在同一Level下的下一個和上一個項。GetNextVisible and GetPrevVisible則返回能看得到的下一個和上一個項。如果一個節點有Parent,則HasAsParent方法返回True. Parent爲當前項的父項。Focused屬性確定焦點是否落在此節點上,被Focus時會一個標準的方框圍住。很顯然,只有一個節點會被聚焦。 Selected屬性表明一個節點是否被選中,同樣只有一個節點會被選中。DropTarget屬性表明節點在拖動操作中是源還是目標。
.1.添加、刪除、修改節點:
靜態的方法可以在設計時通過Items的編輯器設置各節點的內容。
在添加和刪除前必須保證有節點被選中(Treeview.Selected = nil)
用AddFirst, AddFirstChild, AddChild等先添加根節點,如Treeview.Items.AddFirst( nil, 'Root');
然後以此爲基礎,添加此項的子節點。
刪除節點
Treeview.Selected.Delete
編輯節點內容
Treeview.Selected.EditText
注意:由於根節點沒有父節點 (TTreeNode.Parent= nil)
此外,在大批量添加數據到Treeview中時最好使用
TreeView.Items.BeginUpdate;
添加節點
TreeView.Items.EndUpdate
這樣能加快顯示速度。
2.在節點上添加圖象
Treeview中幾個與圖象相關的屬性:
SelectedIndex:當節點被選中時在TimageList 中選什麼樣的圖象
OverlayIndex:選那副圖象作爲掩圖(一幅圖象透明地顯示在另一幅圖象的前面),比如一個節點不可用時加一副X圖象在其前面。
ImageIndex:在常態時選用的圖的序號
StateIndex: 在StateImages這個ImageList中對應的序號,-1時不顯示圖象
比較典型的,象在文件管理器中的所顯示的一樣,Treeview控件在節點之前也可以顯示圖象。在Form中放置一ImageList控件,加入幾個圖片,分別被Index爲0,1,…在Treeview的Image屬性項填入你所加入的ImageList的控件名稱。TreeNode的ImageIndex表示節點未被選中時(Selected=nil)的圖片序號,SelectedIndex表示節點被選中時圖片序號。
3.關於Level
Level的概念可以用下圖表示:
Level0 Level1 Level2
4.排序
SortType決定什麼時候進行排序;
TreeView.AlphaSort對節點進行排序,如果不能滿足要求,你可以定義自己的CustomSort方法。
5.Drag&Drop操作,與標準的拖放操作使用方法一樣
========================================
都讓二樓說完了,我來段代碼給樓主和一樓學習吧。
樹結構:
部門人員 // 根節點
|
|______部門1
| |_________職員1
| |_________職員2
| |_________職員3
|______部門2
|_________職員1
|_________職員2
|_________職員3
數據庫結構:
bmdm bmmc xm bh
001 部門1 0
001 部門1 職員1 0
001 部門1 職員2 1
002 部門2 0
003 部門3 0
003 部門3 職員2 0
003 部門3 職員3 1
在數據庫中建立一個上表,然後加入LoadTreeNode過程,在FormCreate調用即可
treeview中必須有一個根節點.
procedure TfrmBMSZ.LoadTreeNode;
var
rootNode, childNode: TTreeNode;
NodeBM: array of TTreeNode;
iBMCount, i: Integer;
szBMDM, szBMMC, szZYMC: string; // 部門職員名稱
szTemp: string;
begin
if not DataSource1.DataSet.Active then Exit;
i := 0;
rootNode := Treeview1.Items[0];
// 加入部門信息
with ADOQueryBM do
begin
Close;
SQL.Add('Select bmdm, bmmc, xm from bmry where (bh = 0) order by bmdm');
Open;
Last;
First;
iBMCount := RecordCount;
if iBMCount > 0 then //部門數量
begin
SetLength(NodeBM, iBMCount);
while not Eof do
begin
szBMDM := FieldByName('bmdm').AsString;
szBMMC := szBMDM + ' ' + FieldByName('bmmc').AsString;
NodeBM[i] := Treeview1.Items.AddChild(rootNode, szBMMC);
NodeBM[i].ImageIndex := 1;
NodeBM[i].SelectedIndex := 1;
Inc(i);
Next;
end;
end;
Close;
end;
if i = 0 then Exit; // i = 0表示沒有部門信息
// 加入職員信息到樹
i := -1;
with DataSource1.DataSet do
begin
First;
while not Eof do
begin
szBMDM := FieldByName('bmdm').AsString;
szZYMC := FieldByName('xm').AsString;
if (szBMDM <> szTemp) then
begin
szTemp := szBMDM;
Inc(i);
end
else
begin
childNode := Treeview1.Items.AddChild(NodeBM[i], szZYMC);
childNode.ImageIndex := 2;
childNode.SelectedIndex := 2;
end;
Next;
end; // while not Eof
Close;
end; // with ADOQuery2
Treeview1.FullExpand;
end;
Treeview用於顯示按照樹形結構進行組織的數據,這在實際當中用途還是比較廣泛的,如計算機中的文件系統(Windows95中的資源管理器)、企業或公司的組成結構等等。Treeview控件中一個樹形圖由節點(TreeNode)和連接線組成。TtreeNode是TTreeview的基本組成單元。一個樹的節點又包含文本(Text)和數據(Data)。Text爲String類,Data則爲無定形指針(Untyped Pointer),可以指向一個與節點相聯繫的數據結構。
每一個節點下子節點形成這一節點的Items屬性,當前節點有一個唯一的Index(TreeNode的Index屬性),用於說明子節點在Items中的位置,每一個節點下的子節點是順序編號的,第一個是0,第二個是1,依次類推。用IndexOf方法獲得子節點的順序,絕對順序(AbsoluteIndex)則是指從Treeview第一個項開始的順序值,第一個是0,如此推下去。Item屬性則根據Index的值返回當前節點的第Index個子節點。Count則表明屬於此項的所有子節點的數量。用MoveTo方法將Item由一個位置移到另一個位置。
Expanded屬性表明是否所有的子項都全部展開(包括子項的子項),爲True表示全部展開。IsVisible屬性表明一個項是否在樹中能被看到,如果樹全部展開那麼這個Item是肯定可以被看到。HasChildren屬性表明一個項是否有子項。 GetFirstChild, GetLastChild, GetPrevChild, and GetNextChild分別返回當前項子項的第一個、最後一個和前一個、後一個項。GetNextSibling and GetPrevSibling則返回在同一Level下的下一個和上一個項。GetNextVisible and GetPrevVisible則返回能看得到的下一個和上一個項。如果一個節點有Parent,則HasAsParent方法返回True. Parent爲當前項的父項。Focused屬性確定焦點是否落在此節點上,被Focus時會一個標準的方框圍住。很顯然,只有一個節點會被聚焦。 Selected屬性表明一個節點是否被選中,同樣只有一個節點會被選中。DropTarget屬性表明節點在拖動操作中是源還是目標。
.1.添加、刪除、修改節點:
靜態的方法可以在設計時通過Items的編輯器設置各節點的內容。
在添加和刪除前必須保證有節點被選中(Treeview.Selected = nil)
用AddFirst, AddFirstChild, AddChild等先添加根節點,如Treeview.Items.AddFirst( nil, 'Root');
然後以此爲基礎,添加此項的子節點。
刪除節點
Treeview.Selected.Delete
編輯節點內容
Treeview.Selected.EditText
注意:由於根節點沒有父節點 (TTreeNode.Parent= nil)
此外,在大批量添加數據到Treeview中時最好使用
TreeView.Items.BeginUpdate;
添加節點
TreeView.Items.EndUpdate
這樣能加快顯示速度。
2.在節點上添加圖象
Treeview中幾個與圖象相關的屬性:
SelectedIndex:當節點被選中時在TimageList 中選什麼樣的圖象
OverlayIndex:選那副圖象作爲掩圖(一幅圖象透明地顯示在另一幅圖象的前面),比如一個節點不可用時加一副X圖象在其前面。
ImageIndex:在常態時選用的圖的序號
StateIndex: 在StateImages這個ImageList中對應的序號,-1時不顯示圖象
比較典型的,象在文件管理器中的所顯示的一樣,Treeview控件在節點之前也可以顯示圖象。在Form中放置一ImageList控件,加入幾個圖片,分別被Index爲0,1,…在Treeview的Image屬性項填入你所加入的ImageList的控件名稱。TreeNode的ImageIndex表示節點未被選中時(Selected=nil)的圖片序號,SelectedIndex表示節點被選中時圖片序號。
3.關於Level
Level的概念可以用下圖表示:
Level0 Level1 Level2
4.排序
SortType決定什麼時候進行排序;
TreeView.AlphaSort對節點進行排序,如果不能滿足要求,你可以定義自己的CustomSort方法。
5.Drag&Drop操作,與標準的拖放操作使用方法一樣
========================================
都讓二樓說完了,我來段代碼給樓主和一樓學習吧。
樹結構:
部門人員 // 根節點
|
|______部門1
| |_________職員1
| |_________職員2
| |_________職員3
|______部門2
|_________職員1
|_________職員2
|_________職員3
數據庫結構:
bmdm bmmc xm bh
001 部門1 0
001 部門1 職員1 0
001 部門1 職員2 1
002 部門2 0
003 部門3 0
003 部門3 職員2 0
003 部門3 職員3 1
在數據庫中建立一個上表,然後加入LoadTreeNode過程,在FormCreate調用即可
treeview中必須有一個根節點.
procedure TfrmBMSZ.LoadTreeNode;
var
rootNode, childNode: TTreeNode;
NodeBM: array of TTreeNode;
iBMCount, i: Integer;
szBMDM, szBMMC, szZYMC: string; // 部門職員名稱
szTemp: string;
begin
if not DataSource1.DataSet.Active then Exit;
i := 0;
rootNode := Treeview1.Items[0];
// 加入部門信息
with ADOQueryBM do
begin
Close;
SQL.Add('Select bmdm, bmmc, xm from bmry where (bh = 0) order by bmdm');
Open;
Last;
First;
iBMCount := RecordCount;
if iBMCount > 0 then //部門數量
begin
SetLength(NodeBM, iBMCount);
while not Eof do
begin
szBMDM := FieldByName('bmdm').AsString;
szBMMC := szBMDM + ' ' + FieldByName('bmmc').AsString;
NodeBM[i] := Treeview1.Items.AddChild(rootNode, szBMMC);
NodeBM[i].ImageIndex := 1;
NodeBM[i].SelectedIndex := 1;
Inc(i);
Next;
end;
end;
Close;
end;
if i = 0 then Exit; // i = 0表示沒有部門信息
// 加入職員信息到樹
i := -1;
with DataSource1.DataSet do
begin
First;
while not Eof do
begin
szBMDM := FieldByName('bmdm').AsString;
szZYMC := FieldByName('xm').AsString;
if (szBMDM <> szTemp) then
begin
szTemp := szBMDM;
Inc(i);
end
else
begin
childNode := Treeview1.Items.AddChild(NodeBM[i], szZYMC);
childNode.ImageIndex := 2;
childNode.SelectedIndex := 2;
end;
Next;
end; // while not Eof
Close;
end; // with ADOQuery2
Treeview1.FullExpand;
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.