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}