Zrobiłem sobie teścik używając innej metody odczytu z pliku. 20000 linii po 4 kolumny wyświetlało sie 2 min 15 sek na Duronie 850/386 MB. Niestety 20000 to sporo. Może to byc nie do przeskoczenia z TListView. Może inny (własny) komponent? Może nie ładowac wszystkiego na początku, tylko dopiero na żądanie? Może ktoś wpdanie na lepszy pomysł... A może postawić ProgressBara i kazać userowi poczekać?
//o, albo wątek - vide poniżej :-)
Dla porównania, oto mój kod:
tRow=record
c1:string[10];
c2:string[5];
c3:string[10];
c4:string[20];
end;
var
a: array of TRow;
f: file of TRow;
//tworzenie i wypelnianie tablicy fikcyjnych danych
SetLength(a,20000);
for i:=Low(a) to High(a) do
begin
a[i].c1:=IntToStr(i);
a[i].c2:=IntToStr(Random(65536));
a[i].c3:=IntToStr(Random($FFFFFFFF));
a[i].c4:=StringOfChar(Chr(65+Random(20)),2+Random(19));
end;
//zapis do pliku
AssignFile(F,'test.dat');
Rewrite(F);
BlockWrite(F,a[0],Length(a));
CloseFile(F);
//odczyt z pliku
AssignFile(F,'test.dat');
Reset(F);
SetLength(a,FileSize(F));
BlockRead(F,a[0],FileSize(F));
CloseFile(F);
ProGressBar1.Min:=0;
ProgressBar1.Max:=High(a);
//do tej chwili leci błyskiem, następna część robi się 2:15
//wyswietlenie
with ListView1.Items do
begin
BeginUpdate;
for i:=Low(a) to High(a) do
begin
it:=Add;
it.Caption:=a[i].c1;
it.SubItems.Add(a[i].c2);
it.SubItems.Add(a[i].c3);
it.SubItems.Add(a[i].c4);
if (i and $1f)=0 then begin
ProgressBar1.Position:=i;
Application.ProcessMessages;
end;
end;
EndUpdate;
end;