首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Delphi 動態載入 TreeView 節點實戰:遞迴查詢、資料關聯與雙擊響應完整範例

     編輯:關於C語言

需求背景:資料庫驅動的樹狀結構動態展開

實現一個從資料庫讀取層級資料、按需遞迴建立樹狀節點、節點攜帶業務資料(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;

關鍵技術點總結

  1. 遞迴查詢:以 ParentID 為鍵值逐層下鑽,自然映射樹狀結構。
  2. 資料掛載:AddChildObject 將 PNodeInfo 指標存入 Data 屬性,型別轉換時需雙重解參考 PNodeInfo(Node.Data)^.Field。
  3. 記憶體管理:New/Dispose 配對使用,實際專案建議在表單銷毀時遍歷釋放所有節點資料。
  4. 座標轉換:螢幕座標轉客戶區座標後呼叫 GetNodeAt 精確獲取點擊節點。

此模式廣泛適用於組織架構、檔案目錄、選單權限等層級資料視覺化場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved