Registriert seit: 24. Jul 2025
6 Beiträge
Delphi 10 Seattle Professional
|
AW: Performanceprobleme beim Befüllen von TComboBoxen
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;
|
|
Zitat
|