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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章