今天重點學習了TreeView的使用方法,基本的已經寫了,現在主要想說的是如何顯示數據庫的資料,今天只是做了個較簡單的例子,一個父節點下顯示數據庫中某個field的值。代碼如下:
procedure TMainForm.TreeviewShow(Sender: TObject);
var
node1,subnode1: TTreeNode;
i: Integer;
begin
Treeview1.Selected := nil;
node1 := Treeview1.Items.AddFirst(nil,'user');
ADOTable1.Active := True;
while not ADOTable1.Eof do
for i := 0 to ADOTable1.RecordCount - 1 do
begin
Treeview1.Items.AddChildObject(node1, ADOTable1.FieldByName('USERNAME').AsString, nil);
ADOTable1.Next;
end;
end;
使用的是ADO中的ADOTable1來完成。
心得:今天下午比較重要的心得或許就是當你在某個函數中寫代碼的時候,它會自動把那些不符合它返回值的函數功能屏蔽掉。打個比方,象Treeview1.Items.AddChildObject(node1, ADOTable1.FieldByName('USERNAME').AsString, nil);中的第二項,它要求的是返回String ,如果你使用得失ADODATASET的話,它就自動幫你屏蔽掉了FieldByName這個功能,因為返回的不是String,所以,在這種情況下最好是把你需要的函數在空白處得到在copy到里面去。
每一個節點下子節點形成這一節點的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表示節點被選中時圖片序號。
加入父節點使用的命令是Treeview.Items.AddFirst(nil,'father');里面的nil的意思是初始標記(不是0的意思,0已經代表了建立了一個關於節點的對象了,nil代表的是初始化時候的一個node)。在使用該函數來創建節點的時候,你會發現很多例子中都會建立一個TTreeNode對象來把剛才建立父節點的命令賦給這個對象,比如現在有個TTreeNode對象node1,那么就可以寫成node1 := Treeview1.Items.AddFirst(nil,'father'),目的是把該節點的標識位置賦予node1,這里不需要再寫多一個相同的AddFirst了,因為在賦予node1的同時就已經建立了這個父節點了。那為什么需要這個node1呢?當然,如果你只有一層節點沒有子節點的話,可以不需要這個,這個node1主要是為了給建立子節點的時候給它一個標識,告訴系統這個子節點是屬於哪個父節點的,命令如下reeview1.Items.AddChildObject(node1, 'child', nil);
編程心得
1,在Delphi中,TreeView控件是一款很出色而且很常用的控件。
在使用過程中,了解到其TTreeNode對象的data屬性存儲相關數據很有用,一般情況下,我們先聲明一個結構體以及其指針,例如:
type
PMyRc = ^TMyRc;
TMyRc = Record
id:string;
name:string;
age:integer;
end;
添加一個節點,顯示信息為TMyRc的name,同時存儲id,age。方法如下:
var
p:PMyRc;
i:integer;
begin
Randomize;
for i:= 0 to 9 do
begin
New(p);
p.id:=inttostr(random(100));
p.name:='name'+ inttostr(random(205));
p.age:=random(90);
// Caption := p.id+' '+P.name + ' '+inttostr(p.age);
TreeView1.Items.AddObject(nil,p.name,Tobject(p));
//dispose(p); 如果在這里釋放指針,id,age並不能存在樹中,而是在這里就被釋放了。應該在釋放樹的事件里書寫。
end;
end;
釋放樹的事件deletion, 即使是刪除也會執行這些代碼。所以不用擔心內存泄漏。但是如果不書寫以下代碼,或者用相關的方式釋放內存,必定會造成內存泄漏。
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
dispose(pmyrc(node.data));
end;
訪問某個樹枝中的age值:
Pmyrc(TreeView1.Selected.data)^.age