原生 TListView 在 5,000+ 筆資料下操作極慢。本文提出一套通用類別架構,結合虛擬模式 (OwnerData) 與 MVC 分離,實現高效能、可維護的 ListView 資料操作。
IInterface 且常繼承 TInterfacedObject,限制多重繼承彈性{ 產品: 成曉旭個人軟體 Delphi 原始碼庫 }
{ 模組: ListView 顯示控制類 - 應用層: Soft socket 類定義 }
{ 單元: unLVSoftSocket.pas → unLVQuickSocket.pas }
{ 作者: 成曉旭 }
unit unLVQuickSocket;
interface
uses
Classes, Controls, ComCtrls,
unLVControler; { 核心控制器封裝包 }
type
{ 快速操作基類 }
TLVQuickClass = class
protected
{ 子類必須實作的兩個核心虛擬方法 }
function CheckFound(const AData: Pointer): Boolean; virtual; abstract;
procedure ProcOnDataDetail(const AItem: TListItem; const AData: Pointer); virtual; abstract;
public
constructor Create(const AListView: TListView); virtual;
destructor Destroy; override;
{ 公開操作介面 }
procedure AddItem(const AData: Pointer);
procedure UpdateItem(const AData: Pointer);
procedure DeleteItem(const AData: Pointer);
procedure ClearItems;
end;
{ Socket 專用快速顯示類 }
TLVQuickSocket = class(TLVQuickClass)
protected
function CheckFound(const AData: Pointer): Boolean; override;
procedure ProcOnDataDetail(const AItem: TListItem; const AData: Pointer); override;
public
{ 業務擴充方法 }
procedure RefreshBySocketID(const ASocketID: Integer);
procedure UpdateStatus(const AData: Pointer);
end;
implementation
{ 核心虛擬方法實作略... }
end.
| 層級 | 類別 | 職責 |
|---|---|---|
| 核心封裝 | LVControler 包 | ListView 虛擬模式底層操作 (Add/Update/Delete/Refresh),外部不可見 |
| 傳統基類 | TLVCommonClass | 非虛擬模式操作基類,直接繼承用 |
| 快速基類 | TLVQuickClass | 虛擬模式操作基類,強制實作 CheckFound/ProcOnDataDetail |
| 應用具體類 | TLVQuickSocket | 實作兩個虛擬方法 + 業務擴充方法 |
{ Controller 中 }
var
SocketView: TLVQuickSocket;
begin
SocketView := TLVQuickSocket.Create(ListView1);
try
SocketView.AddItem(SocketData);
SocketView.UpdateItem(SocketData);
SocketView.DeleteItem(SocketData);
finally
SocketView.Free;
end;
end;
此架構在多個專案中經過驗證,有效解決了「程式碼散落、重複、難維護」的痛點,是 Delphi ListView 大量資料處理的成熟解決方案。