複製程式碼如下:
單位1;
介面
用途
Windows、訊息、SysUtils、變體、類別、圖形、控制項、表單、
對話框、StdCtrl、ComCtrl、DB、ADODB;
類型
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = 打包記錄
節點ID:整數;
ParentID:整數;
節點類型:整數;
ChnNodeTitle:字串;
圖像索引:SmallInt;
選定索引:SmallInt;
結尾;
TForm1 = 類別(TForm)
tv1:TTreeView;
btn1:T按鈕;
qry1:TADO查詢;
程序 btn1Click(寄件人: TObject);
過程 FormDestroy(寄件者: TObject);
私人的
{ 私人聲明 }
函數 StaticBuildTree(TreeView:TTreeView ):Boolean;
函數 AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
函數 FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
民眾
{ 公開聲明 }
結尾;
變數
表格1:TForm1;
執行
{$R *.dfm}
函數 TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
變數
新增節點資訊:PNodeInfoEx;
開始
結果:=假;
qry1.LoadFromFile('c:/AdminixTree.xml');//這裡以XML檔案做為資料來源
Treeview.Items.BeginUpdate;//記住:在進行批次新增資料時要使用BeginUpdate,暫時關閉因新增資料而觸發的某些事件(例如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
嘗試
嘗試
如果 qry1.RecordCount >0 那麼
開始
qry1.第一;
而不是 qry1.Eof 做
開始
New(AddNodeInfo) ;//產生結構體
AddNodeInfo^.NodeID := qry1.FieldByName('NODE_ID').AsInteger;
AddNodeInfo^.ParentID := qry1.FieldByName('PARENT_ID').AsInteger;
AddNodeInfo^.NodeType := qry1.FieldByName('NodeType').AsInteger;
AddNodeInfo^.ChnNodeTitle := qry1.FieldByName('ChnNodeTitle').AsString;
AddNodeInfo^.ImageIndex := qry1.FieldByName('ImageIndex').AsInteger;
AddNodeInfo^.SelectedIndex := qry1.FieldByName('SelectedIndex').AsInteger;
AddTreeItem(Treeview,AddNodeInfo);//把結構體的指標存到Treeview中
qry1.下一個;
結尾;
結尾;
除了
Application.MessageBox('產生樹結點失敗',MB_ICONSTOP+MB_OK);
raise;//向上級拋異常
結尾;
qry1.關閉;
結果:=真;
最後
Treeview.Items.EndUpdate;
結尾;
結尾;
//在判斷結點時,應先加入是父結點還是子結點,判斷的判定是在已存在的樹加入結點中是否存在該結點的ParentID
函數 TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
變數
父節點:TTreeNode;
開始
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
如果 ParentNode <> nil 那麼
結果 := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), 指標(AddNodeInfo))
別的
結果 := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
如果結果 <>nil 那麼
開始
結果.ImageIndex := AddNodeInfo.ImageIndex;
結果.SelectedIndex := AddNodeInfo.SelectedIndex;
結尾;
結尾;
//這裡是判斷是否存在其父結點
函數 TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
變數
我:整數;
開始
結果:=零;
for i := 0 到 Treeview.Items.Count-1 做
開始
如果 CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID 那麼
開始
結果 := Treeview.Items[i];
出口;
結尾;
結尾;
結尾;
//生成樹狀結構
過程 TForm1.btn1Click(寄件者: TObject);
開始
靜態建構樹 (tv1)
結尾;
//在表格釋放時一定要樹結點中的結構體指針給釋放掉,對於在Dispose時為什麼要進行強制主動後釋放,之前有專門的講解,這裡還沒累述
過程 TForm1.FormDestroy(Sender: TObject);
變數
我:整數;
開始
對於 i := 0 到 tv1.Items.Count-1 做
開始
處置( PNodeInfoEx(tv1.Items[i].Data) )
結尾;
結尾;
結尾。
複製程式碼如下:
//如何存取樹結點?
過程 TForm1.tv1MouseDown(發送者: TObject; 按鈕: TMouseButton;
移位:TShiftState; X、Y:整數);
變數
pNode:TTreeNode;
開始
pNode:=tv1.GetNodeAt(x,y);
if (pNode<>nil) and (Button=mleft) then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
結尾;