![]() |
Warum dauert CB.ITEMS := aStringList so lange?
Hallo zusammen,
entweder ich stehe auf dem Schlauch oder es liegt etwas anderes in der Luft. Kann mir jemand erklären, warum dies 300ms dauert?
Delphi-Quellcode:
Gruß
procedure TForm2.FormShow(Sender: TObject);
var aStringList : TStringList; i : Integer; begin aStringList := TStringList.Create; for i:=0 to 1000 do begin aStringList.Add( IntToStr(i) ); end; Memo1.Lines.Add( FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz',now) + 'Items := aStringList START' ); ComboBox1.Items.BeginUpdate; ComboBox1.Items := aStringList; ComboBox1.Items.EndUpdate; ComboBox2.Items.BeginUpdate; ComboBox2.Items := aStringList; ComboBox2.Items.EndUpdate; Memo1.Lines.Add( FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz',now) + 'Items := aStringList STOP' ); aStringList.Free; end; Eppos |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Hallo,
hast du mal
Delphi-Quellcode:
probiert?
CB.Items.AddStrings(aStringList);
Ist zwar vermutlich intern gleich, aber man kann es ja mal probieren. Allerdings finde ich 1000 Einträge in einer Combobox auch ein bisschen merkwürdig. |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Danke - habe ich probiert - kein unterscheid.
Ich gebe dir Recht mit 1000 Einträgen - aber bei 100 reden wir von 42 Millisekunden. Was ich immer noch viel zu viel finde. |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Dahinter steckt deutlich mehr als die Zuweisung einer Stringlist. Jeder Eintrag muss per Windows-Messages zum Control hinzugefügt werden. Und das ist deutlich langsamer als ein paar Operationen im Speicher.
edit: Rudy Velthuis mal wieder zur Rettung: ![]() (Hab's nicht getestet.) |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Zitat:
Wenn man dann aber nach der Zuweisung der Stringlist den Style zurück auf csDropDown setzt, kann man gut messen, wie die Combobox mit sich selbst beschäftigt ist, um die Werte für die Auswahlliste aufzubereiten. |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Moin zusammen!
Aus Neugier gerade mal getestet ... kein Unterschied bei mir zwischen:
Delphi-Quellcode:
Obwohl ich das direkte Zuweisen zum Property Items (zwischen Log(2) und Log(3)) nicht so schön finde. 😂
for iTemp := 0 to 10000 do
begin slTemp.Add(IntToStr(iTemp)); end; Log(2); cbbTest1.Items.BeginUpdate(); cbbTest1.Items := slTemp; cbbTest1.Items.EndUpdate(); Log(3); cbbTest2.Items.Assign(slTemp); Log(4); SendMessage(cbbTest3.Handle, WM_SETREDRAW, Ord(False), 0); cbbTest3.Items.Assign(slTemp); SendMessage(cbbTest3.Handle, WM_SETREDRAW, Ord(True), 0); Log(5); SendMessage(cbbTest4.Handle, WM_SETREDRAW, Ord(False), 0); cbbTest4.Items.BeginUpdate(); cbbTest4.Items.Assign(slTemp); cbbTest4.Items.EndUpdate(); SendMessage(cbbTest3.Handle, WM_SETREDRAW, Ord(True), 0); Log(6); Ich hatte ja gehofft, dass das SetRedraw noch was raus holen kann. LG Incocnito |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Das Redraw wird schon durch das BeginUpdate verhindert. Faktisch ist der Aufwand mit der separaten StringList nicht sinnvoll. Wenn die StringList sowieso vorher immer aufgebaut wird, kannst du auch gleich direkt in Items schreiben.
|
AW: Warum dauert CB.ITEMS := aStringList so lange?
Schon mal wie vorgeschlagen CB_INITSTORAGE getestet? Bringt nicht viel, laut der SO-Antwort, aber jedes bisschen zählt.
![]() |
AW: Warum dauert CB.ITEMS := aStringList so lange?
Seit wann kann man TComboBox.Items eine TStringList zuweisen?
Zitat:
|
AW: Warum dauert CB.ITEMS := aStringList so lange?
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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 by Thomas Breitkreuz