TList 類別概述
TList 繼承自 TObject,用於儲存與管理**物件指標**的動態陣列。提供新增、刪除、排序、搜尋、重排等完整操作介面。
核心屬性
| 屬性 | 說明 |
Capacity | 內部指標陣列配置大小(≥ Count),預先設定可減少重新配置 |
Count | 目前實際使用的項目數 |
Items[Index] | 存取指定索引的物件指標(唯讀/寫) |
List | 直接取得內部指標陣列(PPointerList) |
Capacity vs Count 關鍵差異
Capacity:已配置記憶體可容納的指標數
Count:實際使用的項目數
Capacity >= Count 恆成立
- 大量新增前設定
Capacity := Count 可顯著提升效能
核心方法完整對照
| 方法 | 功能 | 備註 |
Add(Item) | 尾端新增項目,回傳索引 | 自動擴充 Capacity |
Clear | 移除所有項目,Count=0,Capacity=0 | 釋放內部陣列記憶體 |
Delete(Index) | 刪除指定索引項目 | 後續項目前移,Count-- |
Exchange(Index1, Index2) | 交換兩項目位置 | |
Expand | 依規則擴充 Capacity | Count=Capacity 時觸發 |
First | 回傳 Items[0] | 空清單回傳 nil |
IndexOf(Item) | 搜尋項目索引 | 找不到回傳 -1 |
Insert(Index, Item) | 指定位置插入 | 必要時擴充 Capacity |
Last | 回傳 Items[Count-1] | |
Move(CurIndex, NewIndex) | 移動項目位置 | |
Pack | 移除所有 nil 指標 | Count 變為實際物件數 |
Remove(Item) | 移除首個匹配項目 | 回傳原索引,Count-- |
Sort(CompareFunc) | 快速排序 | 需提供比較函數 |
排序比較函數規範
type
TListSortCompare = function (Item1, Item2: Pointer): Integer;
// 回傳值規則:
// Item1 < Item2 -> 負值
// Item1 = Item2 -> 0
// Item1 > Item2 -> 正值
實用程式碼範例
預先配置 Capacity 提升大量新增效能
List.Clear;
List.Capacity := ExpectedCount;
for i := 0 to ExpectedCount - 1 do
List.Add(CreateItem(i));
安全遍歷與釋放物件
for i := List.Count - 1 downto 0 do begin
TMyObject(List.Items[i]).Free;
List.Delete(i);
end;
// 或使用 Pack 後再釋放
自訂排序範例
function CompareByName(Item1, Item2: Pointer): Integer;
begin
Result := AnsiCompareStr(TMyObject(Item1).Name, TMyObject(Item2).Name);
end;
List.Sort(@CompareByName);
記憶體管理注意事項
TList **不擁有**所指向的物件,Clear/Delete/Remove 僅移除指標,**不釋放物件本身**
- 銷毀
TList 實例前,必須手動釋放所有內含物件
Pack 移除 nil 指標但不釋放記憶體,需配合 Capacity := Count 回收
建構與解構
- 建立:
List := TList.Create(勿直接呼叫建構函式,用 new/Create)
- 銷毀:
List.Free(會呼叫 ~TList 釋放內部陣列記憶體)