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 2 von 4     12 34      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

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

  Alt 28. Nov 2019, 23:37
Bereite deine Daten so auf, dass du sie einzeln in einer Schleife in die Listbox schreiben kannst. Oder besser, schreib sie in eine Stringlist und Weise der Listbox zum Schluss die Stringlist zu.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 28. Nov 2019, 23:49
250.000x ListBox1.Items.Add() = ~3,8 Sekunden

StringList, 250.000x sl.Add() und dann ListBox1.Items.AddStrings() = 5,7 Sekunden.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

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

  Alt 28. Nov 2019, 23:54
Kennt TListbox(.items) assign?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 29. Nov 2019, 00:01
Ja. Dauert damit noch immer 5,4 Sekunden.
  Mit Zitat antworten Zitat
MicMic

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

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

  Alt 29. Nov 2019, 00:04
Ich habe jetzt mal LB_SETCOUNT ($01A7) ausprobiert. Also "SendMessage(ListBox.Handle, $01A7, anzahl, 0);"

Auf der Microsoft Seite wird ja beschrieben, dass der Parameter wParam auf 16-Bit-Werte beschränkt ist. Also nicht mehr als 32767 Items steht da. Eine Info zu Windows 95/Windows 98/Windows Millennium Edition (Windows Me). Was andere BS-Versionen machen, steht da nicht. In nutze Windows 10 und habe es einfach mal probiert. Ein Test mit 136558 Items. Und es geht. Nun ohne ".add". Und es ist schneller

Sollte ich es mit Vorsicht nutzen? Meine Anwendung muss jedenfalls nicht mit Windows 95/Windows 98/Windows Millennium Edition (Windows Me) kompatibel sein.
  Mit Zitat antworten Zitat
MicMic

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

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

  Alt 29. Nov 2019, 00:14
Nachtrag: Das mit dem "LB_SETCOUNT" hat auch noch einen positiven Effekt. Mein ListBox.Clear ist dadurch auch um einiges schneller.
Gerade alles zu schön um wahr zu sein. Mal schauen ob ich dadurch neue Fehler entdecke *lach
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#17

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

  Alt 29. Nov 2019, 00:24
Das mit ".add" ist auch nicht so schlimm. Dachte nur, evtl. spare ich eine Sekunde, wenn ich hunderttausende Einträge irgendwie direkt setzen kann, als es mit ".add" zu machen.
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:

Delphi-Quellcode:
var hs : tstringlist;
  i: Integer;
begin
  hs := tstringlist.Create;
 try
  for i := 1 to 100000 do hs.Add( i.tostring );
  listbox1.Items := hs;
 finally
  hs.Free;
 end;
  showmessage( listbox1.items.count.tostring );
end;

Dabei habe ich soeben festgestellt, dass das Scrollen über den vertikalen Listbox-Scrollbalken nicht wirklich gut funktioniert. Ist das ein Delphi (10.3.3) oder ein Windows (Win10 19033) Problem?
Michael Gasser
  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
 
#18

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

  Alt 29. Nov 2019, 00:29
@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.
Angehängte Dateien
Dateityp: zip Beispiel.zip (1,4 KB, 37x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#19

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

  Alt 29. Nov 2019, 07:13
Welcher Benutzer scrollt eigentlich durch zigtausende Einträge?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

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

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

  Alt 29. Nov 2019, 07:43
Hallo,
Zitat:
wenn ich hunderttausende Einträge
Und er soll sich bei Deinen 100.000-en Einträgen zurecht finden?

Ganz klar der falsche Ansatz.
Biete vorher einen Filter an, der die Anzahl eingrenzt und gut is.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 19:54 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