AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Performanceprobleme beim Befüllen von TComboBoxen
Thema durchsuchen
Ansicht
Themen-Optionen

Performanceprobleme beim Befüllen von TComboBoxen

Ein Thema von m.pritscher · begonnen am 24. Jul 2025 · letzter Beitrag vom 30. Jul 2025
 
m.pritscher

Registriert seit: 24. Jul 2025
5 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Performanceprobleme beim Befüllen von TComboBoxen

  Alt 24. Jul 2025, 14:17
Hallo zusammen,

wir beobachten in unserer Anwendung derzeit sehr lange Ladezeiten – insbesondere beim Befüllen von TComboBox-Elementen.
Das reine Hinzufügen von Strings dauert pro TComboBox etwa 0,5 Sekunden, was sich bei vielen Elementen massiv auf die Gesamtperformance auswirkt.

Zum Vergleich:
In einem separaten Testprogramm mit nahezu identischem Code (ebenfalls TComboBoxen, gleiche Datenbasis)
erfolgt das Befüllen deutlich schneller – nahezu ohne spürbare Verzögerung.

Zusätzlich fällt auf, dass auch einfache Operationen wie "ItemIndex := -1" auf diese TComboBoxen
ebenfalls mehrere hundert Millisekunden (ca. 400–500 ms) benötigen.

Hat jemand eine Idee, woran diese extrem langen Ladezeiten liegen könnten?
Oder warum das Verhalten in der echten Anwendung so stark von einem einfachen Testprogramm abweicht?

Vielen Dank vorab für eure Hilfe!


Delphi-Quellcode:
// ------------------------- Hauptsoftware ------------------------- //
procedure TFenster_EinstInterfaces2.FormCreate(Sender: TObject);
begin
  LogProcedureStart('--- FormCreate ---');
  StartTime := Now;

  // Liste vorbereiten
  varList := TStringList.Create;
  LogTime('Create varList', StartTime);
  StartTime := Now;
  try
    for i := 1 to 500 do
      varList.Add('<Var ' + IntToStr(i) + '>');
    LogTime('Filled varList with 500 entries', StartTime);
    StartTime := Now;

    // Comboboxen-Array
    cmbArray[1] := cmb1; cmbArray[2] := cmb2;
    cmbArray[3] := cmb3; cmbArray[4] := cmb4;
    cmbArray[5] := cmb5; cmbArray[6] := cmb6;
    cmbArray[7] := cmb7; cmbArray[8] := cmb8;
    cmbArray[9] := cmb9; cmbArray[10] := cmb10;

    // Comboboxen befüllen mit Update-Block
    for i := 1 to 10 do
    begin
      cmbArray[i].Items.Assign(varList);
      LogTime('Assigned cmb' + IntToStr(i), StartTime);
      StartTime:= Now;
    end;

  finally
    varList.Free;
    LogTime('Freed varList', StartTime);
    StartTime := Now;
  end;

  LogProcedureEnd('--- FormCreate ---');
end; {FormCreate}


procedure TFenster_EinstInterfaces2.ClearParVarPanel;
begin
  LogProcedureStart('--- ClearParVarPanel ---');

  StepStartTime := Now;
  for i := 1 to 15 do
  begin
    LoopStartTime := Now;
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));
    LogTime('FindComponent für cmb' + IntToStr(i), LoopStartTime);

    if hcombo <> nil then
    begin
      LoopStartTime := Now;
      hcombo.Items.BeginUpdate;
      try
        hcombo.ItemIndex := -1;
      finally
        hcombo.Items.EndUpdate;
      end;
    end
    else
    begin
      LogTime('cmb' + IntToStr(i) + ' = nil', LoopStartTime);
    end;
  end;
  LogTime('cmb-Schleife abgeschlossen', StepStartTime);

  LogProcedureEnd('--- ClearParVarPanel ---');
end; {ClearParVarPanel}
Delphi-Quellcode:
// ------------------------- Testprogramm ------------------------- //
procedure TForm1.FormCreate(Sender: TObject);
var
  VarList: TStringList;
  i, aos: Integer;
  StartStepTime: TDateTime;
  cmbArray: array[1..10] of TComboBox;
begin
  FProcedureStartTime := Now;

  // Anzahl an Strings festlegen
  aos:= 500;

  LogProcedureStart('--- FormCreat ---');
  StartStepTime := Now;

  VarList := TStringList.Create;
  try
    for i := 1 to aos do
      VarList.Add('<Var ' + IntToStr(i) + '>');
    LogTime('VarList gefüllt (' + IntToStr(aos) + ')', StartStepTime);
    StartStepTime := Now;

    // Combobox-Array vorbereiten
    cmbArray[1] := cmb1; cmbArray[2] := cmb2;
    cmbArray[3] := cmb3; cmbArray[4] := cmb4;
    cmbArray[5] := cmb5; cmbArray[6] := cmb6;
    cmbArray[7] := cmb7; cmbArray[8] := cmb8;
    cmbArray[9] := cmb9; cmbArray[10] := cmb10;
    LogTime('Comboboxen Pointer', StartStepTime);
    StartStepTime := Now;

    // Comboboxen befüllen mit StringList
    for i := 1 to 10 do
    begin
      cmbArray[i].Items.Assign(VarList);
      LogTime('Assigned cmb' + IntToStr(i) + ' mit ' + IntToStr(aos) + ' Strings', StartStepTime);
      StartStepTime := Now;
    end;

  finally
    VarList.Free;
    LogTime('Freed VarList', StartStepTime);
  end;

  LogProcedureEnd('--- FormCreate ---');
end; {FormCreate}
Angehängte Grafiken
Dateityp: png ItemIndex - Hauptsoftware.png (59,4 KB, 32x aufgerufen)
Dateityp: png TComboBox - Hauptsoftware.png (82,7 KB, 29x aufgerufen)
Dateityp: jpg TComboBox - Testprogramm.jpg (115,7 KB, 29x aufgerufen)
  Mit Zitat antworten Zitat
 


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