AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Warum dauert CB.ITEMS := aStringList so lange?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum dauert CB.ITEMS := aStringList so lange?

Ein Thema von Eppos · begonnen am 24. Feb 2022 · letzter Beitrag vom 25. Feb 2022
Antwort Antwort
Seite 1 von 2  1 2      
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#1

Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 09:17
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:
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;
Gruß
Eppos
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
677 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 09:28
Hallo,

hast du mal CB.Items.AddStrings(aStringList); probiert?
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
523 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 09:38
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.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 10:05
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:

https://stackoverflow.com/questions/...obox-in-delphi

(Hab's nicht getestet.)
Thomas Mueller

Geändert von dummzeuch (24. Feb 2022 um 10:08 Uhr)
  Mit Zitat antworten Zitat
fred.ahrens

Registriert seit: 11. Aug 2007
Ort: Ketzin/Havel
45 Beiträge
 
Delphi 12 Athens
 
#5

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 10:28
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.
Man kann das gut nachvollziehen, indem man den Style der Combobox auf csSimple setzt. Das geht schon bedeutend schneller.
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.
Fred Ahrens (ZeeBORN GmbH)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#6

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 14:51
Moin zusammen!

Aus Neugier gerade mal getestet ... kein Unterschied bei mir zwischen:


Delphi-Quellcode:
    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);
Obwohl ich das direkte Zuweisen zum Property Items (zwischen Log(2) und Log(3)) nicht so schön finde. 😂
Ich hatte ja gehofft, dass das SetRedraw noch was raus holen kann.

LG
Incocnito
  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
 
#7

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 15:08
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 15:10
Schon mal wie vorgeschlagen CB_INITSTORAGE getestet? Bringt nicht viel, laut der SO-Antwort, aber jedes bisschen zählt.

https://stackoverflow.com/a/46215724/49925
Thomas Mueller
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 24. Feb 2022, 23:43
Seit wann kann man TComboBox.Items eine TStringList zuweisen?

Ich gebe dir Recht mit 1000 Einträgen - aber bei 100 reden wir von 42 Millisekunden.
Dann schau dir ComboBoxEx am besten gar nicht erst an.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Warum dauert CB.ITEMS := aStringList so lange?

  Alt 25. Feb 2022, 09:30
Seit wann kann man TComboBox.Items eine TStringList zuweisen?
Schon fast immer. Intern wird ein Assign gemacht. Im Übrigen ist das BeginUpdate/ EndUpdate überflüssig, da dies schon im Add gemacht wird. Siehe hier.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:29 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