Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Warum dauert CB.ITEMS := aStringList so lange? (https://www.delphipraxis.net/210063-warum-dauert-cb-items-%3D-astringlist-so-lange.html)

Eppos 24. Feb 2022 08:17

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

Sinspin 24. Feb 2022 08:28

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

hast du mal
Delphi-Quellcode:
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.

Eppos 24. Feb 2022 08:38

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.

dummzeuch 24. Feb 2022 09:05

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:

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

(Hab's nicht getestet.)

fred.ahrens 24. Feb 2022 09:28

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

Zitat von dummzeuch (Beitrag 1502641)
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.

Incocnito 24. Feb 2022 13:51

AW: Warum dauert CB.ITEMS := aStringList so lange?
 
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

Uwe Raabe 24. Feb 2022 14:08

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.

dummzeuch 24. Feb 2022 14:10

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.

https://stackoverflow.com/a/46215724/49925

Redeemer 24. Feb 2022 22:43

AW: Warum dauert CB.ITEMS := aStringList so lange?
 
Seit wann kann man TComboBox.Items eine TStringList zuweisen?

Zitat:

Zitat von Eppos (Beitrag 1502638)
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.

Union 25. Feb 2022 08:30

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

Zitat von Redeemer (Beitrag 1502675)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 Uhr.
Seite 1 von 2  1 2      

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