Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ListView: Nur die sichtbaren Listitems anzeigen (https://www.delphipraxis.net/179820-listview-nur-die-sichtbaren-listitems-anzeigen.html)

Gerd01 4. Apr 2014 09:56

ListView: Nur die sichtbaren Listitems anzeigen
 
Ich hab in einer Report-Listview ca 8000 Datensätze und stelle fest, das das Füllen der Listview doch sichtbar Zeit benötigt. Ich habe Virtual Listviews ausprobiert, aber immer fehlt irgendwas.

Gibt es eine Möglichkeit nur die sichtbaren ListItems zu laden und dann bei Bedarf bei Tastatur- oder Mauseingabe die nächsten für die Sichtbarkeit erforderlichen ListItems nachzuladen?

Das wäre doch eine elegante Methode große Listviews adäquat anzuzeigen. Weiss jemand, ob es sowas gibt?

Der schöne Günther 4. Apr 2014 10:57

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Als Benutzer fände ich es alles andere als angenehm, riesige Listen mit tausenden Einträgen vorgesetzt zu bekommen und mich mit millimetergroßen Scrollbalken herumzuplagen. Sollte man das nicht vielleicht besser filtern lassen und maximal n Einträge ausgeben?

8.000 Items dauern (Style: vsReport, keine Sortierung) bei mir 400ms auf 32 Bit und 270ms auf 64 Bit. Egal ob Delphi oder C++. Ich finde das eigentlich noch im Rahmen.

Hier noch ein paar Stolperfallen (fehlendes Begin/EndUpdate(), ...): http://stackoverflow.com/q/9008310/2298252

Neutral General 4. Apr 2014 10:59

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
So als Tipp:
Delphi-Quellcode:
ListView.Items.BeginUpdate;
// ListView füllen
ListView.Items.EndUpdate;
Das beschleunigt den Vorgang ungemein.

Popov 4. Apr 2014 12:02

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Zitat:

Zitat von Gerd01 (Beitrag 1254614)
Das wäre doch eine elegante Methode große Listviews adäquat anzuzeigen. Weiss jemand, ob es sowas gibt?

Zufällig wurde vor etwa einer Woche das Thema durchgekommen, wobei es hier zwar um Dateinamen ging, aber ListView ist es im Grunde egal was es darstellt. Zumindest wurden in dem Thread mehrere Möglichkeiten durchgenommen, von klassisch, virtuale ListView bis Mischformen.

http://www.delphipraxis.net/179651-l...ert-lange.html
http://www.delphipraxis.net/179644-l...-machen-3.html
http://www.delphipraxis.net/179669-v...nzufuegen.html

Gerd01 4. Apr 2014 17:07

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Das "Einfassen" in Beginupdate und Endupdate ist Standard, sonst gäbe es ja beim Listview Aufbau ein elendes Geflackere.

Leider kann ich die Listview nicht filtern, da ich vorher nicht weiss, was der Benutzer sich ansehen will (Liste von Mails).

Ich habe vor einiger Zeit mal sowas gesehen, wie ich es mir wünsche. Ich brauche ja erstmal nur die anzuzeigenden Daten in der Listview. Erst wenn eine Scrolländerung vorliegt, müssen neue ListItem-Einträge "nachgeladen" werden.

ol1uw 4. Apr 2014 18:26

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Gerd01 (Beitrag 1254685)
Leider kann ich die Listview nicht filtern, da ich vorher nicht weiss, was der Benutzer sich ansehen will (Liste von Mails).

da bin ich mal optimistisch und sage aber der Benutzer sollte es wissen :-)

Zitat:

Zitat von Gerd01 (Beitrag 1254614)
Gibt es eine Möglichkeit nur die sichtbaren ListItems zu laden und dann bei Bedarf bei Tastatur- oder Mauseingabe die nächsten für die Sichtbarkeit erforderlichen ListItems nachzuladen?

eine Art Seitenmodus vielleicht siehe Anhang

Popov 4. Apr 2014 18:39

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also eine Eigenschaft die ListItems unsichtbar macht, ist mir nicht bekannt. Du kommst also um das Filtern nicht herum.

Das Geheimnis ist Virtual ListView, oder du lädst jedes mal die komplette ListView neu.

Anbei ein kleines Beispiel mit 8000 Einträgen. Es nutzt ListView virtual und arbeitet mit zwei Listen. Die erste Liste enthält alle Daten, die zweite Liste die gefilterten. ListView greift dann virtual auf die zweite Liste zu.

Das Ganze kann man natürlich noch ausbauen, ist ja nur ein Beispiel.

Popov 4. Apr 2014 19:49

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Zitat:

Zitat von Gerd01 (Beitrag 1254614)
Gibt es eine Möglichkeit nur die sichtbaren ListItems zu laden und dann bei Bedarf bei Tastatur- oder Mauseingabe die nächsten für die Sichtbarkeit erforderlichen ListItems nachzuladen?

Die Frage habe ich überlesen. In dem Beitrag http://www.delphipraxis.net/1252959-post16.html habe ich eine Lösung die in etwa dem entspricht was in der Frage steht. Es werden zuerst leere Items angelegt und erst dann gefüllt wenn sie angezeigt werden.

Im Grunde genommen ist aber eine Virtual ListView besser, weil flexibler, bzw. das betreffende Projekt füllt die Items nach und nach mit Daten, Virtual ListView zeigt nur die Daten Items an die sichtbar sind.

Gerd01 6. Apr 2014 08:14

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Vielen Dank für die Infos. Ich werde die Tipps jetzt mal ausprobieren.

Popov 6. Apr 2014 13:51

AW: ListView: Nur die sichtbaren Listitems anzeigen
 
Wobei das Beispiel in #7 auch mit einer Liste lösbar ist. Statt die erste Liste erst filtern und in zweite Liste kopieren, kann man auch nur die erste Liste nutzen. Dann muss man im ersten Durchgang aber erst die Menge der gefilterten Einträge ermitteln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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