delphi中Treeview的使用介紹

chinajobs發表於2016-05-18

今天重點學習了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(TreeNodeIndex屬性),用於說明子節點在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控制元件,加入幾個圖片,分別被Index0,1,…在TreeviewImage屬性項填入你所加入的ImageList的控制元件名稱。TreeNodeImageIndex表示節點未被選中時(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

相關文章