Na gut, hier eine kleine Beispiel-Form, mit ListView1.OwnerData = true:
Delphi-Quellcode:
unit FormUnitVirtualListViewDemo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ListView1Data(Sender: TObject; Item: TListItem);
private
{ Private declarations }
FSomeData: TStringList;
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
FSomeData.Add(FormatDateTime('
c', Now));
ListView1.Items.Count := FSomeData.Count;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FSomeData := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FSomeData.Free;
end;
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := FSomeData[Item.
Index];
Item.SubItems.Add('
Hallo');
Item.SubItems.Add('
Welt');
end;
end.
Wie ich schon sagte: die Daten außerhalb der Liste verwalten, einfachste Möglichkeit hier in einer TStringList, etwas komplexer (dafür ohne Stringbastelei mit mehr als 1/2 Feldern möglich) in einer TCollection (geht natürlich mit etwas weniger Tippaufwand auch eine simple TList mit eigenem Objekt).
In dieser Listview-externen Datensammlung kannst Du dann effektiver schalten und walten, und wenn Sich die Anzahl ändert, diese über die Count-Zuweisung anpassen. Das Listview selber verwaltet nur die Anzahl (für Scrollbalken), und fragt für jede Zeile, wenn sie angezeigt werden soll, die Daten per OnData ab.