ListView1.Items 為 TListItems,每個項目為 TListItem,包含 Caption(第一欄)與 SubItems(其餘欄)。
with ListView1.Items.Add do
begin
Caption := '標題文字'; // 第一欄
SubItems.Add('子項目1'); // 第二欄
SubItems.Add('子項目2'); // 第三欄
SubItems.Add('子項目3'); // 第四欄
// 可同步設定 ImageIndex, StateIndex, Data 指標等
end;
// 單一欄位
var s: string;
s := ListView1.Items[i].Caption; // 第 i 行標題
s := ListView1.Items[i].SubItems.Strings[j]; // 第 i 行第 j+1 欄
// 整行導出
s := ListView1.Items[i].SubItems.CommaText; // 含引號 CSV 格式:"標題","子1","子2"
s := ListView1.Items[i].SubItems.Text; // 換行分隔:標題#13#10子1#13#10子2
// 選取狀態
if ListView1.Items[i].Selected then ... // 是否被選中(受 MultiSelect 影響)
ListView1.Items[i].Delete; // 刪除單行
ListView1.Items.Clear; // 清空所有
i := ListView1.Items.Count; // 總行數
// 可對單項設定 Checked, Focused, Selected, Cut 等布林屬性
避免使用平行陣列或 TStringList 維護業務資料,改用 TListItem.Data: Pointer 指向記錄結構:
type
PMyRecord = ^TMyRecord;
TMyRecord = record
ID: Integer;
Name: string;
ExtraData: string;
end;
var
Rec: PMyRecord;
begin
New(Rec);
Rec^.ID := 123;
Rec^.Name := 'Test';
with ListView1.Items.Add do
begin
Caption := Rec^.Name;
SubItems.Add(IntToStr(Rec^.ID));
Data := Rec; // 綁定指標
end;
end;
// 讀取
Rec := PMyRecord(ListView1.Selected.Data);
ShowMessage(Rec^.ExtraData);
// 釋放(在 Clear 或 FormDestroy 時)
for i := 0 to ListView1.Items.Count - 1 do
begin
Dispose(PMyRecord(ListView1.Items[i].Data));
ListView1.Items[i].Data := nil;
end;
大量資料(>10 萬筆)設定 OwnerData := True,於 OnData、OnDataFind、OnDataHint 事件即時提供資料,不佔用 Items 集合記憶體。