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

Delphi TListView 完整操作指南:增刪改查、選取、排序與資料綁定

     編輯:更多程式設計知識

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;

依 Caption 刪除項目


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;

資料集綁定:將 ADOTable/Query 資料載入 ListView


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% 以上清單介面開發需求。進階功能(虛擬模式、擁有者繪製、拖放排序)可依專案複雜度漸進式導入。

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