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

善用 TreeView 與 ListView 的 Data 指標屬性:以部門樹為例的資料綁定最佳實踐

     編輯:Delphi

痛點:平行陣列與 TStrings 的缺陷

傳統做法用陣列或 TStringList 存節點代碼,索引易脫節、記憶體碎片化、釋放麻煩。TTreeNode.Data 與 TListItem.Data 為 Pointer,可直接指向記錄結構,效能與維護性雙贏。

實作範例:部門樹

1. 定義資料結構與指標類型

type
  TUnitNodeInfo = record
    UnitCode: string;      // 部門代碼(唯一鍵)
    UnitName: string;      // 部門名稱
    Manager: string;       // 擴充欄位:主管
    // ... 其他業務欄位
  end;
  PUnitNodeInfo = ^TUnitNodeInfo;

2. 建樹時配置記憶體並綁定

procedure CreateUnitTree;
var
  Node: TTreeNode;
  Info: PUnitNodeInfo;
begin
  // 假設已開啟 Query 並定位第一筆
  while not Query.Eof do
  begin
    Node := TreeView1.Items.AddChild(nil, Query.FieldByName('UnitName').AsString);
    Node.ImageIndex := 0; // 設定圖示

    New(Info);                       // 配置記憶體
    Info^.UnitCode := Query.FieldByName('UnitCode').AsString;
    Info^.UnitName := Query.FieldByName('UnitName').AsString;
    Info^.Manager  := Query.FieldByName('Manager').AsString;

    Node.Data := Info;               // 綁定指標
    Query.Next;
  end;
end;

3. 取得選中節點資料

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
  Code: string;
begin
  if Assigned(Node) and Assigned(Node.Data) then
  begin
    Code := PUnitNodeInfo(Node.Data)^.UnitCode;
    // 以 Code 查詢人員列表、顯示詳情...
  end;
end;

4. 釋放記憶體(FormDestroy 或 Clear 時)

procedure TForm1.FreeTreeData;
var
  i: Integer;
begin
  for i := 0 to TreeView1.Items.Count - 1 do
  begin
    if Assigned(TreeView1.Items[i].Data) then
    begin
      Dispose(PUnitNodeInfo(TreeView1.Items[i].Data));
      TreeView1.Items[i].Data := nil;
    end;
  end;
end;

ListView 同理

// 新增
with ListView1.Items.Add do
begin
  Caption := Rec^.Name;
  SubItems.Add(Rec^.Code);
  Data := Rec;
end;

// 讀取
Rec := PMyRecord(ListView1.Selected.Data);

// 釋放
for i := 0 to ListView1.Items.Count - 1 do
  Dispose(PMyRecord(ListView1.Items[i].Data));

優勢總結

  • 型別安全:編譯期檢查記錄結構,避免字串轉換錯誤。
  • O(1) 存取:直接指標解參考,無需索引查找。
  • 擴充彈性:記錄欄位隨時增減,不影響 UI 邏輯。
  • 記憶體可控:明確 New/Dispose,配合 OwnerData 虛擬模式可支撐百萬級資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved