Einzelnen Beitrag anzeigen

m.pritscher

Registriert seit: 24. Jul 2025
6 Beiträge
 
Delphi 10 Seattle Professional
 
#14

AW: Performanceprobleme beim Befüllen von TComboBoxen

  Alt 28. Jul 2025, 10:41
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.
Das sollte sich doch relativ einfach finden lassen:
Diese Aktion in eine Schleife packen und mehrfach ausführen (also mit unterschiedlichen Indizes). Dann laufen lassen und immer wieder im Debugger anhalten und schauen, was das Programm gerade macht...

Ansonsten gibt es Profiler, mit denen du genau siehst, was da passiert.

Beim detaillierten Überprüfen dieses Ansatzes sind wir auf den womöglich "wahren Übeltäter" gestoßen.
Der eigentliche Zeitfresser scheint das "WM_SETREDRAW" zu sein.

Delphi-Quellcode:
// ------------------------- Hauptsoftware ------------------------- //
procedure TFenster_EinstInterfaces2.ClearParVarPanel;
begin
  StartParVarTime := Now;
  LogProcedureStart('--- ClearParVarPanel ---');

  StartStepTime := Now;
  for i := 1 to 15 do
  begin
    hedit := TLabeledEdit(FindComponent('ledt' + IntToStr(i)));
    if hedit <> nil then
    begin
      hedit.Text := '';
      hedit.Hint := sDblClickForVar;
    end;
  end;
  LogTime('ledt-Schleife abgeschlossen', StartStepTime);

  StartStepTime := Now;
  // Redraw deaktivieren (WM_SETREDRAW False)
  for i := 1 to 15 do
  begin
    StartLoopTime := Now;
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));
    LogTime('FindComponent', StartLoopTime);
    if Assigned(hcombo) then
      SendMessage(hcombo.Handle, WM_SETREDRAW, WPARAM(False), 0);
    LogTime('SendMessage redraw', StartLoopTime);
  end;
  LogTime('WM_SETREDRAW false', StartStepTime);

  // Alle Index-Werte in Schleife setzen
  StartStepTime := Now;
  for i := 1 to 15 do
  begin
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));

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

  StartStepTime := Now;
  // Redraw reaktivieren und Controls invalidieren
  for i := 1 to 15 do
  begin
    hcombo := TComboBox(FindComponent('cmb' + IntToStr(i)));
    if Assigned(hcombo) then
    begin
      SendMessage(hcombo.Handle, WM_SETREDRAW, WPARAM(True), 0);
      RedrawWindow(hcombo.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN);
    end;
  end;
  LogTime('WM_SETREDRAW true', StartStepTime);

  LogTime('ClearParVarPanel gesamt:', StartParVarTime);
  LogProcedureEnd('--- ClearParVarPanel ---');
end;
Miniaturansicht angehängter Grafiken
screenshot-2025-07-28-113449.png  
Angehängte Dateien
Dateityp: txt logfile - 28-07-2025_10-44-10.txt (4,6 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat