今天重點學習了treeview的使用方法,基本的已經寫了,現在主要想說的是如何顯示資料庫的資料,今天只是做了個較簡單的例子,乙個父節點下顯示資料庫中某個field的值。**如下:
procedure tmainform.treeviewshow(sender: tobject);
varnode1,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);
delphi中treeview使用常見問題
程式設計心得
1,在delphi中,treeview控制項是一款很出色而且很常用的控制項。
type
pmyrc = ^tmyrc;
tmyrc = record
id:string;
name:string;
age:integer;
end;
新增乙個節點,顯示資訊為tmyrc的name,同時儲存id,age。方法如下:
varp: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
DELPHI控制項學習之TreeView
一.如何初始化乙個treeview?弄乙個視窗,放上乙個treeview和乙個button,分別取名為tv1和btn1。如果需要 在每個節點前有個圖,請在視窗上放上乙個imagelist,取名為imagelist1,雙擊 它,加入六個圖示。還要記得記得將tv1的images屬性改為imagelist...
delphi在TreeView 裡加核取方塊
這裡是建立乙個乙個類 type tcheckboxtreeview class ttreeview protected procedure createparams var params tcreateparams override end 具體只要加一句話 procedure tcheckboxt...
WinFrom中TreeView中的應用
c 中的樹很多。比如,windows form 程式設計和 web程式設計中都有一種被稱為 treeview 的控制項。treeview 控制項是乙個顯示樹形結構的控制項,此樹形結構與 windows 資源管理器中的樹形結構非常類似。不同的是,treeview 可以由任意多個節點物件組成。每個節點物...