Delphi中的TreeView

一劍平江湖發表於2014-02-18
以前總是迴圈展開,現在有這個屬性,就簡單多了
RzTreeView_DWDept.FullExpand;  這樣就可以全部 展開了。
還有一個問題,設定節點選中
RzTreeView_DWDept.SetFocus;
if RzTreeView_DWDept.Selected = nil then
      RzTreeView_DWDept.Selected := RzTreeView_DWDept.Items.Item[0];
這個的重點是  RzTreeView_DWDept.SetFocus; 如果當前焦點沒有在樹上,你怎麼設定都不起作用。


**************************************************************
.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操作,與標準的拖放操作使用方法一樣


下面是我寫的一個TREEVIEW小程式的程式碼   
  var       rootnode,subnode,personnode,matenode:ttreenode;   
              i,j,k:integer;   
      begin   
      rootnode:=tv1.items.add(nil,'公司');   
      qrymaster.Close;   
      qrymaster.sql.add('select   *   from   master');   
      qrymaster.Open;   
      qrymaster.First;   
      for   i:=0   to   qrymaster.RecordCount-1   do   
      begin   
                  subnode:=tv1.Items.Addchild(rootnode,qrymaster.FieldByName('company').AsString);   
              //原形:rootnode=tv1.items.add(nil,string);   
              //       rootnode.ImageIndex   :=0;   
              //       rootnode.stateIndex   =0;   
                    qrysub.Close;   
                    qrysub.SQL.clear;   
                    qrysub.SQL.Add('select   *   from   submaster   where   companyid=:dd');   
                    qrysub.ParamByName('dd').asinteger:=qrymaster.FieldByName('companyid').asinteger;   
                    qrysub.Open;   
                    qrysub.First;   
                      for   j:=0   to   qrysub.RecordCount-1   do   
                      begin   
                            personnode:=tv1.Items.AddChild(subnode,qrysub.FieldByName('personname').AsString);   
                            //   subnode.ImageIndex   :=-1;   
                            //   subnode.StateIndex   :=-1;   
                            qrymate.close;   
                            qrymate.sql.clear;   
                            qrymate.sql.add('select   *   from   comunication   where   personid=:personid');   
                            qrymate.parambyname('personid').asinteger:=qrysub.fieldbyname('personid').asinteger;   
                            qrymate.open;   
    
                            for   k:=0   to   qrymate.recordcount-1   do   
                              begin   
                              matenode:=tv1.items.addchild(personnode,qrymate.fieldbyname('name').asstring);   
                              qrymate.next;   
                              end;   
                              qrysub.Next;   
                      end;   
    
              qrymaster.Next;   
          end;   
        end;

相關文章