ich habe ein Performance-Problem mit Liniengrafiken in TChart. Es handelt sich um etwa 130 XY-Datensätze mit jeweils einigen tausend Datenpunkten in jeweils 3 Charts. Hinzu kommen zwei weitere Charts, die jeweils nur einen Datensatz enthalten. Es sollten eigentlich nur die Y-Werte ausgetauscht werden. Weist man diese über YValue[j] mit j = Integer zu dann wird die Sache zur Gedultsprobe bzw. das Programm schläft ein. Bereinigt man die Charts über TChart.Series.Clear, erzeugt alle LineSeries neu und füllt diese wieder mit Daten geht es so schnell, dass das Programm interaktiv bleibt bzw. der Vorgang ist fast instantan abgeschlossen.
Die Frage ist: Warum ist das so? Eigentlich ist das unlogisch.
Ich zeige hier mal den Code nebts auskommentierten Fehlschlägen:
Code: Alles auswählen
Procedure TMainForm.RefreshAllIntensitysInChartsExceptMeasuredDark;
Var TempRamanLineSeries : TLineSeries;
i, j : Integer;
TempRamanChartLineSeries : TLineSeries;
TempDarkChartLineSeries : TLineSeries;
TempRawChartLineSeries : TLineSeries;
TempLineSeries : TLineSeries;
rgSeriesColor : Array Of TColor;
rgstSeriesTitle : Array Of String;
Begin
//Schneller Code
Setlength(rgSeriesColor, RamanSpectraObjectList.Count);
Setlength(rgstSeriesTitle, RamanSpectraObjectList.Count);
For i := 0 To RamanSpectraObjectList.Count - 1 Do
Begin
rgSeriesColor[i] := (RamanChart.Series.Items[i] As TLineSeries).SeriesColor;
rgstSeriesTitle[i] := (RamanChart.Series.Items[i] As TLineSeries).Title;
End;
RamanChart.Series.Clear;
DarkChart.Series.Clear;
RawChart.Series.Clear;
For i := 0 To RamanSpectraObjectList.Count - 1 Do
Begin
TempRamanChartLineSeries := TLineSeries.Create(RamanChart);
TempDarkChartLineSeries := TLineSeries.Create(DarkChart);
TempRawChartLineSeries := TLineSeries.Create(RawChart);
TempRamanChartLineSeries.SeriesColor := rgSeriesColor[i];
TempDarkChartLineSeries. SeriesColor := rgSeriesColor[i];
TempRawChartLineSeries. SeriesColor := rgSeriesColor[i];
TempRamanChartLineSeries.Title := rgstSeriesTitle[i];
TempDarkChartLineSeries. Title := rgstSeriesTitle[i];
TempRawChartLineSeries. Title := rgstSeriesTitle[i];
With (RamanSpectraObjectList.Items[i] As TRamanSpectrum) Do
For j := 0 To iPropLength - 1 Do
Begin
TempRamanChartLineSeries.AddXY(dbGetWaveNumber(j), dbGetIntensity(j));
TempDarkChartLineSeries. AddXY(dbGetWaveNumber(j), dbGetDarkIntensity(j));
TempRawChartLineSeries. AddXY(dbGetWaveNumber(j), dbGetRawIntensity(j));
End;
RamanChart.AddSeries(TempRamanChartLineSeries);
DarkChart.AddSeries(TempDarkChartLineSeries);
RawChart.AddSeries(TempRawChartLineSeries);
End;
//Blockert das Programm und ist viel zu langsam
{For i := 0 To RamanSpectraObjectList.Count - 1 Do
Begin
(RamanChart.Series.Items[i] As TLineSeries).Clear;
(DarkChart.Series.Items[i] As TLineSeries).Clear;
(RawChart.Series.Items[i] As TLineSeries).Clear;
End;
For i := 0 To RamanSpectraObjectList.Count - 1 Do
Begin
TempRamanChartLineSeries := (RamanChart.Series.Items[i] As TLineSeries);
TempDarkChartLineSeries := (DarkChart.Series.Items[i] As TLineSeries);
TempRawChartLineSeries := (RawChart.Series.Items[i] As TLineSeries);
With (RamanSpectraObjectList.Items[i] As TRamanSpectrum) Do
For j := 0 To iPropLength - 1 Do
Begin
TempRamanChartLineSeries.AddXY(dbGetWaveNumber(j), dbGetIntensity(j));
TempDarkChartLineSeries. AddXY(dbGetWaveNumber(j), dbGetDarkIntensity(j));
TempRawChartLineSeries. AddXY(dbGetWaveNumber(j), dbGetRawIntensity(j));
End;
End; }
//Ist ebenfalls übermäßig langsam
{For i := 0 To RamanSpectraObjectList.Count - 1 Do
With (RamanSpectraObjectList.Items[i] As TRamanSpectrum) Do
Begin
For j := 0 To iPropLength - 1 Do
Begin
(RamanChart.Series.Items[i] As TLineSeries).AddXY(dbGetWaveNumber(j), dbGetIntensity(j));
(DarkChart.Series.Items[i] As TLineSeries).AddXY(dbGetWaveNumber(j), dbGetDarkIntensity(j));
(RawChart.Series.Items[i] As TLineSeries).AddXY(dbGetWaveNumber(j), dbGetRawIntensity(j));
End;
For j := 0 To iPropLength - 1 Do
Begin
(RamanChart.Series.Items[i] As TLineSeries).YValue[j] := dbGetIntensity(j);
(DarkChart.Series.Items[i] As TLineSeries).YValue[j] := dbGetDarkIntensity(j);
(RawChart.Series.Items[i] As TLineSeries).YValue[j] := dbGetRawIntensity(j);
End
end; }
//Austausch der Y-Werte in den Einzelspektren-Charts
If Not(iActualSpectrum = -1) Then
With (RamanSpectraObjectList.Items[iActualSpectrum] As TRamanSpectrum) Do
For j := 0 To iPropLength - 1 Do
Begin
(ActualRamanChart.Series.Items[0] As TLineSeries).YValue[j] := dbGetIntensity(j);
(ActualDarkChart.Series.Items[0] As TLineSeries).YValue[j] := dbGetDarkIntensity(j);
End
end;