TListView 是 Delphi 顯示結構化清單資料的核心控制項,支援圖示、報表、小圖示、列表四種檢視模式。本文彙整實戰中最常用的操作模式:新增/刪除/選取/移動項目、報表模式欄位操作、資料集綁定、通用移動排序程序,代碼可直接複製套用。
設計時設定ViewStyle = vsReport,並在Columns屬性編輯器建立欄位 (Column[0] 為 Caption,其餘為 SubItems)。
var
Item: TListItem;
i: Integer;
begin
i := ListView1.Items.Count; // 新項目索引
Item := ListView1.Items.Add;
Item.Caption := IntToStr(i); // 第 0 欄
Item.SubItems.Add('第 ' + IntToStr(i) + ' 行'); // 第 1 欄
Item.SubItems.Add('第三欄內容'); // 第 2 欄
// 可繼續 Add SubItems...
end;
var
i: Integer;
begin
for i := ListView1.Items.Count - 1 downto 0 do
if ListView1.Items[i].Caption = Edit1.Text then
ListView1.Items[i].Delete;
end;
必須**倒序刪除**,避免索引位移導致漏刪或越界。
if ListView1.Selected <> nil then
Edit1.Text := ListView1.Selected.Caption;
// 選取第一項
ListView1.SetFocus;
ListView1.Items[0].Selected := True;
// 選取最後一項
ListView1.SetFocus;
ListView1.Items[ListView1.Items.Count - 1].Selected := True;
ListView1.Items[ListView1.Items.Count - 1].MakeVisible(True); // 滾動至可見區
支援任意項目、任意方向、可選是否設定焦點與滾動。
procedure ListViewItemMoveUpDown(lv: TListView; Item: TListItem; MoveUp, SetFocus: Boolean);
var
DestItem: TListItem;
begin
if (Item = nil) or
((Item.Index - 1 < 0) and MoveUp) or
((Item.Index + 1 >= lv.Items.Count) and not MoveUp) then Exit;
lv.Items.BeginUpdate;
try
if MoveUp then
DestItem := lv.Items.Insert(Item.Index - 1)
else
DestItem := lv.Items.Insert(Item.Index + 2);
DestItem.Assign(Item); // 複製 Caption、SubItems、ImageIndex、Data 等
lv.Selected := DestItem;
Item.Free;
finally
lv.Items.EndUpdate;
end;
if SetFocus then lv.SetFocus;
DestItem.MakeVisible(False);
end;
// 移動目前選取項目
ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True); // 上移
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True); // 下移
uses CommCtrl;
procedure TForm1.Button1Click(Sender: TObject);
var
ColIndex: Integer;
begin
ColIndex := 1; // 要刪除的欄位索引 (0-based)
ListView_DeleteColumn(ListView1.Handle, ColIndex);
end;
procedure ViewChange(ListV: TListView; Table: TCustomADODataSet; var ColIdx: Integer);
var
Item: TListItem;
begin
ListV.Items.BeginUpdate;
try
ListV.Items.Clear;
with Table do begin
Active := True;
First;
while not Eof do begin
Item := ListV.Items.Add;
Item.Caption := Trim(Fields[ColIdx].AsString); // 指定欄位為 Caption
// 如需多欄位,可在這裡 Add SubItems
Next;
end;
end;
finally
ListV.Items.EndUpdate;
end;
end;
var
Col: Integer;
begin
Col := 0; // 顯示第 0 欄資料
ViewChange(ListView1, ADOTable1, Col);
end;
| 需求 | 實作要點 |
|---|---|
| 項目圖示 | 設定 SmallImages/LargeImages = TImageList,項目 ImageIndex 指定圖示。 |
| 欄位排序 | OnColumnClick 事件中呼叫 CustomSort,實作 TListItemCompare 比較函式。 |
| 擁有者繪製 | OwnerDraw = True,處理 OnDrawItem/OnCustomDrawItem 自訂繪製。 |
| 虛擬模式 | OwnerData = True,處理 OnData/OnDataFind/OnDataHint,支援百萬級資料。 |
| 拖放重排 | DragMode = dmAutomatic,處理 OnDragOver/OnDragDrop 實作拖放排序。 |
| 複選框 | CheckBoxes = True,項目 Checked 屬性控制。 |
Items.BeginUpdate/EndUpdate,避免重繪閃爍。OwnerData)。Items[i],改用變數暫存。SubItems 為字串清單,頻繁修改時考慮直接操作 TListItem.SubItems.Strings[j]。TListView 功能強大且靈活,掌握「項目增刪查、選取控制、通用移動排序、資料集綁定、欄位動態管理」五大核心操作,即能覆蓋 95% 以上清單介面開發需求。進階功能(虛擬模式、擁有者繪製、拖放排序)可依專案複雜度漸進式導入。