![]() |
Delphi-Version: 10.2 Tokyo
TStrings (ListBox.Items) ohne ".add" ?
Hallo,
kann man eigentlich auch die Anzahl der ListBox-Items direkt angeben? "ListBox.Count:=10" geht natürlich nicht. Zur Zeit nutze ich in einer For-Schleife "ListBox.Items.Add(""); Der Inhalt wird anders befüllt und dachte mir, wenn ich "...items.add" mir sparen kann, dass es evtl. ein wenig schneller wird. Gruß Mic |
AW: TStrings (ListBox.Items) ohne ".add" ?
Du kannst BeginUpdate vor und EndUpdate nach der Schleife nutzen. Das sollte das alles etwas beschleunigen wenn das dein Problem ist.
|
AW: TStrings (ListBox.Items) ohne ".add" ?
listbox1.Items.Count
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Hallo,
Zitat:
Zitat:
anstatt erst mal leere Strings einzutragen? |
AW: TStrings (ListBox.Items) ohne ".add" ?
Danke für die Info. Begin/Endupdate habe ich schon.
Habe eben kurz was gefunden. In meiner For-Schleife habe ich mal mit eine String-Variabel rumprobiert. Also ct := ct + ', '; und außerhalb der Schleife mit "items.commatext := ct" die Anzahl gesetzt. Aber das ist auch nicht schneller, als wie gehabt "items.add('')" in der Schleife zu nutzen. Zitat:
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Hallo,
gehen tut das schon ![]() Aber es bringt Dich hier nicht weiter, wegen der dort genannten Einschränkungen. |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
|
AW: TStrings (ListBox.Items) ohne ".add" ?
@hoika, danke für die Info. Gleich gelesen... nur 32767 Items. Zu wenig :)
@DieDolly Nix besonderes...
Code:
Items.BeginUpdate;
For I := 0 To Length(D1)+Length(D2)-1 Do Begin // hier zwischen drin hab ich noch anderes Zeug. Datenverarbeitung. Hat aber nix mit der ListBox direkt zu tun. Items.Add(''); End; Items.EndUpdate; |
AW: TStrings (ListBox.Items) ohne ".add" ?
Was zum Beispiel auch Zeit kostet, ist die Listbox zu leeren. Also mit Clear.
Muss man zwar nicht immer machen aber manchmal halt schon. Aber trotzdem mal Danke an alle. 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. Gute Nachtruhe und schöne Source-Code Träume :) |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
|
AW: TStrings (ListBox.Items) ohne ".add" ?
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.
|
AW: TStrings (ListBox.Items) ohne ".add" ?
250.000x ListBox1.Items.Add() = ~3,8 Sekunden
StringList, 250.000x sl.Add() und dann ListBox1.Items.AddStrings() = 5,7 Sekunden. |
AW: TStrings (ListBox.Items) ohne ".add" ?
Kennt TListbox(.items) assign?
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Ja. Dauert damit noch immer 5,4 Sekunden.
|
AW: TStrings (ListBox.Items) ohne ".add" ?
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. |
AW: TStrings (ListBox.Items) ohne ".add" ?
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 |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
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? |
AW: TStrings (ListBox.Items) ohne ".add" ?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Folgendes kleine Beispielprogramm füllt die Listbox mit 250000 Einträgen in 20 ms. Ein nicht-virtuelles
Delphi-Quellcode:
mit BeginUpdate/Endupdate braucht hier 1616 ms.
Listbox1.Items.Add
Faktisch wird beim lbVirtual auch das LB_SETCOUNT benutzt. lbVirtual gibt es auch als lbVirtualOwnerDraw. |
AW: TStrings (ListBox.Items) ohne ".add" ?
Welcher Benutzer scrollt eigentlich durch zigtausende Einträge?
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Hallo,
Zitat:
Ganz klar der falsche Ansatz. Biete vorher einen Filter an, der die Anzahl eingrenzt und gut is. |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
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... |
AW: TStrings (ListBox.Items) ohne ".add" ?
Hallo,
Zitat:
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
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... |
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 |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
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. |
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. |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
|
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.
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Statt solcher Tricks die betriebssystemabhängig sind würde ich ganz einfach VirtualStringTree nutzen.
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
Oder man überlegt nochmal, warum man so viele Items in eine ListBox pumpen will. Ciao Heza |
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
|
AW: TStrings (ListBox.Items) ohne ".add" ?
Zitat:
Ein VST ist um Welten schneller als eine ListBox, wenn man die Daten von der Oberfläche trennt. Die Oberfläche eines VST kann man auch anpassen. Da gibt es quasi keine Grenzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz