Einzelnen Beitrag anzeigen

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}
Miniaturansicht angehängter Grafiken
itemindex-hauptsoftware.png   tcombobox-hauptsoftware.png   tcombobox-testprogramm.jpg  
  Mit Zitat antworten Zitat