Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TListview im Virtual Modus (https://www.delphipraxis.net/204129-tlistview-im-virtual-modus.html)

Zodi 26. Apr 2020 16:22

TListview im Virtual Modus
 
Hi Delphianer

Ich befülle eine Lsitview mit ca 1000 Zeilen nun ist es sehr langsam. Ich habe gelesen das man vor dem befüllen ein BeginUpdate und danach ein EndUpdate setzen soll.
Nun ist es aber trotzdem noch langsam.
Danach hab ich bisschen gegoogelt und gelesen man könne ne Listview im VirtualModus verwenden indem man OwnerData auf True setzt.
Leider wird die Listview jetzt aber nicht mehr befüllt.

So hab ich es bisher gemacht mit dem Button Click.

Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Li : TListItem;

begin
   Li := Listview1.Items.Add;
   Li.Caption := 'Text Spalte 1';
   Li.SubItems.Add('Text Spalte 2');
   Li.SubItems.Add('Text Spalte 3');
   Li.SubItems.Add('Text Spalte 4');

   listview1.Items.b
end;
wie muss ich das genau bewerkstelligen mit dem OwnerData damit das funktioniert?

Grüsse Zodi

DieDolly 26. Apr 2020 16:23

AW: TListview im Virtual Modus
 
Aktuell schreibst du die Daten direkt in die ListView. Eine virtuelle Liste lebt aber davon, dass die Daten in einer extra Datenstruktur abgelegt werden. Also beispielsweise eine Klasse und jede Instanz davon in eine Liste. Und an dieser Liste bedient sich dann die virtuelle ListView.

Zodi 26. Apr 2020 16:37

AW: TListview im Virtual Modus
 
Hat wer ein beispiel ich bin noch Neuling.
Hab schon gegoogelt aber nichts gefunden was ich verstanden habe.

Redeemer 26. Apr 2020 21:44

AW: TListview im Virtual Modus
 
Dass das ListView so lahm ist, liegt auch stark an Delphis extrem schlechter Umsetzung der TSubItems mit einem TStrings-Erben.
Ich hab mir mal irgendwann einen TListItem-Erben geschrieben und einen dazugehörigen TSubItems-Erben, der alle Schreibzugriffe direkt an Windows weitergibt ohne sie selbst zu speichern. Man kann zwar nicht mehr lesend auf TListItem.SubItems.Strings[] zugreifen (braucht man oft auch nicht, könnte man aber threoretisch auch über WinAPI-Calls realisieren), dafür läuft das um ein Vielfaches schneller.

Falls da Interesse besteht, kann ich das mal hochladen. Eine brauchbare Lösung zu TListGroups fehlt mir aber noch.

DieDolly 26. Apr 2020 22:03

AW: TListview im Virtual Modus
 
Wäre es nicht einfacher einfach eine Virtual String Tree zu nutzen?

Gausi 27. Apr 2020 07:26

AW: TListview im Virtual Modus
 
Ich denke auch, dass der Virtual String Tree mittelfristig hier die bessere Lösung wäre. Der erfordert zwar etwas Einarbeitung, aber es sind gute Beispiele dabei, bei denen man "abschreiben" kann. Der ist nicht nur schnell, sondern auch sehr flexibel und hat ne Menge Features, die man nach und nach kennen lernen kann, wenn man möchte.

Mit dem zeige ich auch Listen mit einigen 10.000 Einträgen ohne Probleme an. Das ist natürlich nur dann sinnvoll, wenn darin auch gefiltert werden kann. Dem User einfach nur so lange Listen hinknallen, in denen er dann durch scrollen muss, bringt wenig.

mschaefer 27. Apr 2020 08:42

AW: TListview im Virtual Modus
 
Moin, zumindest was zum spielen kommt hier, sicherlich updatefähig.

Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
var
  Li : TListItem;
      i : integer;
begin
  Listview1.Clear ;
  ListView1.OwnerData  := false;
  ListView1.Items.Count :=10;
  ListView1.OwnerData:= false;
  for i := 1 to 100 do
   begin
     Li := Listview1.Items.Add;
     Li.Caption := inttostr(i)
   end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  Li : TListItem;
      i : integer;
begin
   Listview1.Clear ;
   ListView1.OwnerData := True;
   ListView1.Items.Count := 10000;
   ListView1.OwnerData:= true; // switch to virtualmode;
   for i := 1 to 100 do
   begin
     Li := Listview1.Items.Add;
     Li.Caption := inttostr(i)
   end;
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
  if Item <> nil then Item.Caption := Item.Index.ToString();
end;
Grüße in die Runde

freimatz 28. Apr 2020 09:05

AW: TListview im Virtual Modus
 
Zitat:

Zitat von Gausi (Beitrag 1462947)
Ich denke auch, dass der Virtual String Tree mittelfristig hier die bessere Lösung wäre.

Man möge bedenken, dass das optisch dann nicht das ist was man gerne hätte. Ich selber (Nein manche Kunden) haben das Problem, dass bei dem Dinge die Rollbalken anders aussehen wie das Rest des Programms.

jaenicke 28. Apr 2020 10:17

AW: TListview im Virtual Modus
 
Zitat:

Zitat von freimatz (Beitrag 1463004)
Man möge bedenken, dass das optisch dann nicht das ist was man gerne hätte. Ich selber (Nein manche Kunden) haben das Problem, dass bei dem Dinge die Rollbalken anders aussehen wie das Rest des Programms.

Solange man sich an die Systemstandards hält, sollte es da keine Probleme geben. Bei uns sehen die genauso aus wie in anderen Programmen und unseren Programmen ansonsten auch.

Gausi 28. Apr 2020 10:31

AW: TListview im Virtual Modus
 
Ich sehe bei den Scrollbalken im VST auch keinen Unterschied. Sowohl im Windows-Standard, als auch bei der Verwendung von VCL-Styles. Wo tritt das Problem denn auf?

freimatz 28. Apr 2020 14:29

AW: TListview im Virtual Modus
 
DevExpress, ExpressSkins Library. Wird wohl eher wenige betreffen, wollte es aber schon erwähnen.

hoika 28. Apr 2020 14:33

AW: TListview im Virtual Modus
 
Hallo,

Zitat:

Nun ist es aber trotzdem noch langsam.
Definiere langsam.
1.000 Einträge dauern bei mir 2 Sek.
Mit BeginUpdate/EndUpdate < 0.5 Sek.

Zitat:

Ich habe gelesen das man vor dem befüllen ein BeginUpdate und danach ein EndUpdate setzen soll.
Nun ist es aber trotzdem noch langsam.
Dann zeig doch mal jetzt den Code mit den BeginUpdate/EndUpdate.

Zitat:

Leider wird die Listview jetzt aber nicht mehr befüllt.
Welche Wert hat denn ListView.Items.Count?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz