AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStrings (ListBox.Items) ohne ".add" ?

Ein Thema von MicMic · begonnen am 28. Nov 2019 · letzter Beitrag vom 29. Nov 2019
Antwort Antwort
Seite 3 von 4     123 4      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#21

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

  Alt 29. Nov 2019, 09:06
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.
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#22

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

  Alt 29. Nov 2019, 09:56
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...
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#23

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

  Alt 29. Nov 2019, 10:05
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.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#24

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

  Alt 29. Nov 2019, 10:25
@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 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.

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...
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#25

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

  Alt 29. Nov 2019, 11:07
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#26

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

  Alt 29. Nov 2019, 11:26
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#27

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

  Alt 29. Nov 2019, 11:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#28

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

  Alt 29. Nov 2019, 12:16
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#29

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

  Alt 29. Nov 2019, 13:14
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.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#30

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

  Alt 29. Nov 2019, 14:10
Statt solcher Tricks die betriebssystemabhängig sind würde ich ganz einfach VirtualStringTree nutzen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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