delphi中Treeview的使用介紹


今天重點學習了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);

 

 

delphi中TreeView使用常見問題

 

編程心得

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


免責聲明!

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



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