實現一個從資料庫讀取層級資料、按需遞迴建立樹狀節點、節點攜帶業務資料(ID、完整名稱、URL),並支援雙擊彈出 URL 的經典 Delphi 應用場景。
type
PNodeInfo = ^TNodeInfo;
TNodeInfo = record
ID: string;
FullName: string;
Url: string;
end;
使用指標記錄結構體,配合 TTreeNode.Data 屬性掛載業務資料,實現 UI 與資料解耦。
procedure TForm3.CreateChildTree(ParentNode: TTreeNode);
var
Query: TADOQuery;
ChildNode: TTreeNode;
ChildNodeInfo: PNodeInfo;
begin
Query := TADOQuery.Create(nil);
try
with Query do begin
Connection := ADOConnection1;
SQL.Add('SELECT ID, FullName, Url FROM PInfo WHERE ParentID = ''' +
PNodeInfo(ParentNode.Data)^.ID + '''');
Open;
while not Eof do begin
New(ChildNodeInfo);
ChildNodeInfo^.ID := FieldByName('ID').AsString;
ChildNodeInfo^.FullName := FieldByName('FullName').AsString;
ChildNodeInfo^.Url := FieldByName('Url').AsString;
ChildNode := TreeView1.Items.AddChildObject(ParentNode,
ChildNodeInfo^.FullName, ChildNodeInfo);
CreateChildTree(ChildNode); // 遞迴處理子節點
Next;
end;
Close;
end;
finally
Query.Free;
end;
end;
procedure TForm3.CreateViewTree(Sender: TObject);
var
BootNode: TTreeNode;
BootNodeInfo: PNodeInfo;
begin
with ADOQuery1 do begin
SQL.Clear;
SQL.Add('SELECT ID, FullName, Url FROM PInfo WHERE ParentID IS NULL');
Open;
New(BootNodeInfo);
BootNodeInfo^.ID := FieldByName('ID').AsString;
BootNodeInfo^.FullName := FieldByName('FullName').AsString;
BootNodeInfo^.Url := FieldByName('Url').AsString;
TreeView1.Items.Clear;
BootNode := TreeView1.Items.AddChildObject(nil,
BootNodeInfo^.FullName, BootNodeInfo);
Close;
end;
CreateChildTree(BootNode); // 遞迴建立完整樹
TreeView1.FullExpand; // 全部展開
end;
procedure TForm3.TreeView1DblClick(Sender: TObject);
var
TNode: TTreeNode;
X, Y: Integer;
begin
with TreeView1 do begin
X := ScreenToClient(Mouse.CursorPos).X;
Y := ScreenToClient(Mouse.CursorPos).Y;
TNode := GetNodeAt(X, Y);
end;
if (TNode <> nil) and (TNode = TreeView1.Selected) then
ShowMessage(PNodeInfo(TNode.Data)^.Url); // 顯示 URL
end;
ParentID 為鍵值逐層下鑽,自然映射樹狀結構。AddChildObject 將 PNodeInfo 指標存入 Data 屬性,型別轉換時需雙重解參考 PNodeInfo(Node.Data)^.Field。New/Dispose 配對使用,實際專案建議在表單銷毀時遍歷釋放所有節點資料。GetNodeAt 精確獲取點擊節點。此模式廣泛適用於組織架構、檔案目錄、選單權限等層級資料視覺化場景。