Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TStrings (ListBox.Items) ohne ".add" ? (https://www.delphipraxis.net/202701-tstrings-listbox-items-ohne-add.html)

DieDolly 29. Nov 2019 08:06

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Zitat:

Ich bin zwar nicht sicher, was du genau suchst... aber 100'000 Einträge aufs Mal in eine Listbox quetschen geht enorm viel schneller (als mit .add) so:
Eben nicht. Das habe ich oben getestet und die Zeit mehrfach gemessen. Bei knapp 1,5 sekunden Unterschied kann man nicht mehr von Messtoleranz sprechen.

Frickler 29. Nov 2019 08:56

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Zitat:

Zitat von DeddyH (Beitrag 1452447)
Welcher Benutzer scrollt eigentlich durch zigtausende Einträge?

Ich denke, das ist für die berühmte völlig unscharfe Suche (*). Direkt scrollt da keiner. Aber über der Liste sind ein oder mehrere Suchfelder. Und da gibt man grob ein, was man so weiß, und unten wird live aufgelistet, was da bei rum kommt. Den Rest regelt das Gedächtnis des Bearbeiters... :) Je nach Datenbank kann es schneller sein, einfach alle Datensätze in die Listbox zu prügeln und dort dann zu filtern.

Für uns hat da immer noch das gute alte ClientDataSet gereicht.


----
(*) "Kam der Kunde nicht aus Koblenz? Hat den nicht die Müller bearbeitet? War der Vorgang nicht 2014 im Mai?" man kennt das...

hoika 29. Nov 2019 09:05

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Hallo,
Zitat:

Je nach Datenbank kann es schneller sein, einfach alle Datensätze in die Listbox zu prügeln und dort dann zu filtern.
Es ist bestimmt schneller, die in eine TStringList zu packen, als in eine TListBox.

Harry Stahl 29. Nov 2019 09:25

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1452446)
Zitat:

Zitat von MicMic (Beitrag 1452434)
@hoika, danke für die Info. Gleich gelesen... nur 32767 Items. Zu wenig :)

Das gilt nur für Windows 95/98/Me!

Folgendes kleine Beispielprogramm füllt die Listbox mit 250000 Einträgen in 20 ms. Ein nicht-virtuelles
Delphi-Quellcode:
Listbox1.Items.Add
mit BeginUpdate/Endupdate braucht hier 1616 ms.

Faktisch wird beim lbVirtual auch das LB_SETCOUNT benutzt. lbVirtual gibt es auch als lbVirtualOwnerDraw.

Das ist eindeutig die schnellste Variante.:thumb:

Und wenn man statt

"FListBox1Items.Add(I.ToString);"

einfach nur

"FListBox1Items.Add('');"

nutzt, sind es nur ca. 7 ms...

Übrigens gibt es wohl tatsächlich Probleme mit dem Scrollbalken, wenn Über ca. 60.000 Zeilen hinaus gescrollt werden soll.

Für die Anzeige so vieler Elemente kann man aber z.B. ein StringGrid nehmen, das aber nicht selber die Daten hält, sondern nur im DrawEvent auf die passenden Daten zugreift, die gerade auf dem Bildschirm angezeigt werden sollen. Da gibt es keine Probleme...

HeZa 29. Nov 2019 10:07

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Da ja bekannt ist wie viele Elemente eingefügt werden sollen, könnte es etwas bringen vorher Items.Capacity zu setzen (bei nicht virtueller Listbox).
Habe leider gerade kein Delphi zur Hand um das mal testen zu können.

Ciao Heza

Uwe Raabe 29. Nov 2019 10:26

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Zitat:

Zitat von HeZa (Beitrag 1452462)
Da ja bekannt ist wie viele Elemente eingefügt werden sollen, könnte es etwas bringen vorher Items.Capacity zu setzen (bei nicht virtueller Listbox).

Das TListBox.Items eine TListBoxStrings-Instanz ist, die SetCapacity nicht überschreibt, wird dort lediglich die leere Implementierung von TStrings ausgeführt. Bringt also rein gar nichts.

Diese TListBoxStrings-Klasse hat nur wenig mit einer TStringList gemein, was die üblichen Optimierungstechniken in der Regel scheitern lässt. Lediglich BeginUpdate/EndUpdate führt den entsprechenden WM_SETREDRAW Aufruf durch. Deswegen ist Assign auch langsamer als eine Folge von Add-Aufrufen, da bei Assign nach jedem Add auch noch ein PutObject folgt, was wiederum eine LB_SETITEMDATA Message sendet.

Rolf Frei 29. Nov 2019 10:32

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Listbox.Items.Text := #13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#1 3#10#13#10;

So hast du 10 Leerzeilen.

Uwe Raabe 29. Nov 2019 11:16

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Zitat:

Zitat von Rolf Frei (Beitrag 1452464)
Listbox.Items.Text := #13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#1 3#10#13#10;

So hast du 10 Leerzeilen.

Macht am Ende auch wieder 10 Add-Calls.

MicMic 29. Nov 2019 12:14

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Wichtig wäre noch zu erwähnen, wenn man nun das "lbVirtualOwnerDraw" und "LB_SETCOUNT" nutzt, dass man (wenn man die Anzahl braucht) nicht "ListBox.Count", sondern "ListBox.Items.Count" nutzt. Mir ist das zufällig aufgefallen, weil eine Sache bei mir nicht mehr funktionierte und gesehen habe, dass ich "ListBox.Count" angegeben hatte und sonst überall "ListBox.Items.Count". Nur mal so zur Info.

DieDolly 29. Nov 2019 13:10

AW: TStrings (ListBox.Items) ohne ".add" ?
 
Statt solcher Tricks die betriebssystemabhängig sind würde ich ganz einfach VirtualStringTree nutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
Seite 3 von 4     123 4      

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