[gelöst] Absturz TAChart PieSeries und UserDefinedCharData
[gelöst] Absturz TAChart PieSeries und UserDefinedCharData
Hallo allerseits, hallo wp,
ich hatte eben ein wenig mit TAChart herumgespielt, dabei ist es zum Absturz von Lazarus gekommen (beide Versionen 1.2.6 und 1.5 Trunc jeweils unter Win7).
Dazu habe ich:
- ein TChart und eine TUserDefinedChartSource auf das Formular gelegt
- im "Edit series" von Chart1 eine TPieSeries hinzugefügt
- von dieser Chart1PieSeries1 die Eigenschaft PointsNumber von 0 auf 10 geändert
- dieser Chart1PieSeries1 die Source Chart1PieSeries1 zugewiesen -> Chrash
Ist dieses Problem bekannt, bzw. darf man das überhaupt machen? Wenn nicht, so wäre es gut, wenn es einen Hinweis statt eines Crashs gäbe.
Ein Beispiel zum testen anbei (einfach Source von Chart1PieSeries1 zu "UserDefinedChartSource1" ändern).
Edit: Ich habe eben noch alle anderen Series (soweit möglich) ausprobiert, beim Ändern der Source bei einer "Least-squares fit series" (TFitSeries) kommt es ebenfalls zum Absturz der IDE.
Vielen Dank
Michael
ich hatte eben ein wenig mit TAChart herumgespielt, dabei ist es zum Absturz von Lazarus gekommen (beide Versionen 1.2.6 und 1.5 Trunc jeweils unter Win7).
Dazu habe ich:
- ein TChart und eine TUserDefinedChartSource auf das Formular gelegt
- im "Edit series" von Chart1 eine TPieSeries hinzugefügt
- von dieser Chart1PieSeries1 die Eigenschaft PointsNumber von 0 auf 10 geändert
- dieser Chart1PieSeries1 die Source Chart1PieSeries1 zugewiesen -> Chrash
Ist dieses Problem bekannt, bzw. darf man das überhaupt machen? Wenn nicht, so wäre es gut, wenn es einen Hinweis statt eines Crashs gäbe.
Ein Beispiel zum testen anbei (einfach Source von Chart1PieSeries1 zu "UserDefinedChartSource1" ändern).
Edit: Ich habe eben noch alle anderen Series (soweit möglich) ausprobiert, beim Ändern der Source bei einer "Least-squares fit series" (TFitSeries) kommt es ebenfalls zum Absturz der IDE.
Vielen Dank
Michael
- Dateianhänge
-
- AbsturzTestTChart.zip
- (3.3 KiB) 70-mal heruntergeladen
Zuletzt geändert von Michl am Do 14. Mai 2015, 10:38, insgesamt 1-mal geändert.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
OK - ich sehe, da ist etwas faul... Als Workaround kannst du die Source im FormCreate-Ereignis zuweisen (aus diesem Grund ist das Problem in meinen eigenen Projekten noch nicht aufgetreten). Mal sehen, wie ich mit dem Debuggen der IDE klarkomme.
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Die Methode "Reset" der UserDefinedChartSource ist wahrscheinlich fehlerhaft. Da werden interne Caches aufgefrischt und Chart-Teilkomponenten über Änderungen informiert. Zur Designzeit hat die UserDefinedChartSource aber gar keine Daten, schon möglich dass dieser Spezialfall irgendwo nicht richtig berücksichtigt wird. Ich habe daher zur Sicherheit ein "if csDesigning in ComponentState then exit" vorgeschaltet. Der Fehler ist damit weg. Ich denke, dass das wegen der speziellen Wirkungsweise dieser ChartSource keine negativen Effekte haben sollte, aber ich wäre dir trotzdem dankbar, wenn du das selbst noch testen könntest, bevor ich es ins svn hochlade.
Ersetze die Methode "TUserDefinedChartSource.Reset" durch folgenden Code und übersetzte die IDE neu:
Ersetze die Methode "TUserDefinedChartSource.Reset" durch folgenden Code und übersetzte die IDE neu:
Code: Alles auswählen
procedure TUserDefinedChartSource.Reset;
begin
if csDesigning in ComponentState then
exit;
InvalidateCaches;
Notify;
end;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Die Zuweisung der Source zur Laufzeit funktioniert. Allerdings das Zufügen, ob sich diese im Designmodus befindet hat keine Änderung bewirkt (ich habe beide IDEs 1.2.6 und 1.5 neu gebaut). Die IDEs stürzen immer noch ab.
Ich habe mal einen Backtrace von Lazarus 1.2.6 erstellt (evtl. hilft es ja?!):
Ich habe mal einen Backtrace von Lazarus 1.2.6 erstellt (evtl. hilft es ja?!):
Code: Alles auswählen
#0 0x00f815ce in TARADIALSERIES_TCUSTOMPIESERIES_$__TRYRADIUS$ICHARTDRAWER$$RECT ()
#1 0x00f81062 in TARADIALSERIES_TCUSTOMPIESERIES_$__MEASURE$ICHARTDRAWER ()
#2 0x00f80250 in TARADIALSERIES_TCUSTOMPIESERIES_$__DRAW$ICHARTDRAWER ()
#3 0x00f48d3d in DRAWORDEACTIVATE (parentfp=0xce2f358, ASERIES=0xcfb0098,
ATRANSPARENCY=0) at tagraph.pas:724
#4 0x00f48b27 in DISPLAYSERIES (this=0x145eccd0, ADRAWER=0x13307728)
at tagraph.pas:763
#5 0x00f49286 in DRAW (this=0x145eccd0, ADRAWER=0x13307728, ARECT=...)
at tagraph.pas:836
#6 0x00f4b1e5 in PAINT (this=0x145eccd0) at tagraph.pas:1226
#7 0x005e2db7 in TCUSTOMCONTROL__PAINTWINDOW (DC=3825276315,
this=<error reading variable>) at ./include/customcontrol.inc:126
#8 0x005c7f11 in TWINCONTROL__PAINTHANDLER (THEMESSAGE=...,
this=<error reading variable>) at ./include/wincontrol.inc:4762
#9 0x005cc602 in TWINCONTROL__WMPAINT (MSG=...,
this=<error reading variable>) at ./include/wincontrol.inc:6636
#10 0x005e2cac in TCUSTOMCONTROL__WMPAINT (MESSAGE=...,
this=<error reading variable>) at ./include/customcontrol.inc:106
#11 0x0040cf86 in SYSTEM_TOBJECT_$__DISPATCH$formal ()
#12 0x005e2c70 in TCUSTOMCONTROL__WSREGISTERCLASS (pvmt=0x145eccd0)
at ./include/customcontrol.inc:93
#13 0x00804bd2 in TDESIGNER__ISDESIGNMSG (SENDER=0x145eccd0, THEMESSAGE=...,
this=<error reading variable>) at C:/lazarus/designer/designer.pp:2583
#14 0x005d79e9 in TCONTROL__WNDPROC (THEMESSAGE=...,
this=<error reading variable>) at ./include/control.inc:2022
#15 0x005c9813 in TWINCONTROL__WNDPROC (MESSAGE=...,
this=<error reading variable>) at ./include/wincontrol.inc:5326
#16 0x00655d55 in DELIVERMESSAGE (TARGET=0x145eccd0, AMESSAGE=void)
at lclmessageglue.pas:112
#17 0x00576349 in SENDPAINTMESSAGE (CONTROLDC=0, parentfp=0xce2fb8c)
at ./win32/win32callback.inc:538
#18 0x00573698 in WINDOWPROC (WINDOW=3081738, MSG=15, WPARAM=0, LPARAM=0)
at ./win32/win32callback.inc:1999
#19 0x75a962fa in USER32!OffsetRect () from C:\Windows\syswow64\user32.dll
#20 0x002f060a in ?? ()
#21 0x75a96d3a in USER32!IsWindow () from C:\Windows\syswow64\user32.dll
#22 0x005718d0 in DISPOSECOMBOEDITWINDOWINFO (COMBOBOX=0x0)
at ./win32/win32callback.inc:216
#23 0x75a96de8 in USER32!IsWindow () from C:\Windows\syswow64\user32.dll
#24 0x00000000 in ?? ()
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Seltsam, mit 1.5 konnte ich jetzt nicht einmal mehr den Ausgangszustand herstellen, aber 1.4 ist dann auch abgestürzt.
Hier ein neuer Versuch: Dein Stacktrace (danke für's Mitdenken!) legt nahe, dass das Problem beim Zeichnen der Series auftritt; dabei wird u.a. TryRadius aufgerufen, das den y-Wert des DataItems auf NaN prüft. Verfolgt man andererseits den Weg der Daten in der UserDefinedChartSource, sieht man dass die Methode GetItem vor dem Aufrufen des Eventhandlers den DataItem via SetDataItemDefaults initialisiert. Dort wird der y-Wert aber auf 0 gesetzt, nicht auf NaN.
"SetDataItemDefaults" würde ich ungern verändern, da diese globale Prozedur auch noch von der DBChartSource (und evtl. auch anderen) aufgerufen wird. Daher habe ich im Code von TUserDefinedChartSource.GetItem zwischen SetDataItemDefaults und dem Event-Handler ein "FItem.Y := NaN" gesetzt. Damit ist bei mir der Fehler weg, getestet mit Laz 1.2, 1.4, 1.5.
Verändere also in TASources folgendes:
Hier ein neuer Versuch: Dein Stacktrace (danke für's Mitdenken!) legt nahe, dass das Problem beim Zeichnen der Series auftritt; dabei wird u.a. TryRadius aufgerufen, das den y-Wert des DataItems auf NaN prüft. Verfolgt man andererseits den Weg der Daten in der UserDefinedChartSource, sieht man dass die Methode GetItem vor dem Aufrufen des Eventhandlers den DataItem via SetDataItemDefaults initialisiert. Dort wird der y-Wert aber auf 0 gesetzt, nicht auf NaN.
"SetDataItemDefaults" würde ich ungern verändern, da diese globale Prozedur auch noch von der DBChartSource (und evtl. auch anderen) aufgerufen wird. Daher habe ich im Code von TUserDefinedChartSource.GetItem zwischen SetDataItemDefaults und dem Event-Handler ein "FItem.Y := NaN" gesetzt. Damit ist bei mir der Fehler weg, getestet mit Laz 1.2, 1.4, 1.5.
Verändere also in TASources folgendes:
Code: Alles auswählen
function TUserDefinedChartSource.GetItem(AIndex: Integer): PChartDataItem;
begin
SetDataItemDefaults(FItem); // <-- hier wird FItem.Y auf 0 gesetzt, die RadialSeries prüft bei ungültigen Daten aber auf NaN
FItem.Y := NaN; // <--- neu
if Assigned(FOnGetChartDataItem) then
FOnGetChartDataItem(Self, AIndex, FItem);
Result := @FItem;
end;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Hallo wp,
funktioniert, es gibt zur Designzeit keinen Absturz mehr.
Ich habe mal alle meine kleinen Testprogrämmchen der letzten Woche, die eine TUserDefinedChartSource nutzen und auch alle möglichen Series getestet. Scheint alles zu funktionieren.
Zuvor wurde beim Setzen der Source in den Series schon eine Paint-Operation durchgeführt, das ist jetzt nicht mehr.
Ich weiss nicht, ob dies zuvor gewollt war oder nicht (vermissen tue ich es nicht). Damit war es aber z.B. möglich bei einer LineSeries ShowPoints auf True zu stellen und die Pointer im Aussehen zu verändern und dieses veränderte Aussehen zur Designzeit darzustellen.
Wie gesagt, ich weiss nicht, ob dies ein gewolltes Feature war oder nur Zufall?!
Darüber kannst du ja noch mal nachdenken, bevor du da eine Änderung im Trunc machen willst.
Nichtsdestotrotz ein dickes Danke für die schnelle Antwort und einen schönen Abend noch!
Michael
funktioniert, es gibt zur Designzeit keinen Absturz mehr.
Ich habe mal alle meine kleinen Testprogrämmchen der letzten Woche, die eine TUserDefinedChartSource nutzen und auch alle möglichen Series getestet. Scheint alles zu funktionieren.
Zuvor wurde beim Setzen der Source in den Series schon eine Paint-Operation durchgeführt, das ist jetzt nicht mehr.
Ich weiss nicht, ob dies zuvor gewollt war oder nicht (vermissen tue ich es nicht). Damit war es aber z.B. möglich bei einer LineSeries ShowPoints auf True zu stellen und die Pointer im Aussehen zu verändern und dieses veränderte Aussehen zur Designzeit darzustellen.
Wie gesagt, ich weiss nicht, ob dies ein gewolltes Feature war oder nur Zufall?!
Darüber kannst du ja noch mal nachdenken, bevor du da eine Änderung im Trunc machen willst.
Nichtsdestotrotz ein dickes Danke für die schnelle Antwort und einen schönen Abend noch!
Michael
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Michl hat geschrieben:Zuvor wurde beim Setzen der Source in den Series schon eine Paint-Operation durchgeführt, das ist jetzt nicht mehr.
Ich weiss nicht, ob dies zuvor gewollt war oder nicht (vermissen tue ich es nicht). Damit war es aber z.B. möglich bei einer LineSeries ShowPoints auf True zu stellen und die Pointer im Aussehen zu verändern und dieses veränderte Aussehen zur Designzeit darzustellen.
Wie gesagt, ich weiss nicht, ob dies ein gewolltes Feature war oder nur Zufall?!
Das musst du mir näher erklären, das kann ich mir nicht vorstellen, weil ich nur UserDefinedChartSource geändert habe.
Bei einer Series ist die automatische Aktualisierung der Bildschirmanzeige praktisch nicht möglich, weil die Daten üblicherweise mit AddXY zur Laufzeit in eine ListSource geladen werden und zur Designzeit nicht zur Verfügung stehen (es sei denn, du tippst die Daten bei "DataPoints" ein - siehe http://wiki.lazarus.freepascal.org/TACh ... s,_Fitting).
Auch wenn die Series mit einer UserDefinedChartSource verbunden ist, müsste sie zur Designzeit nicht sichtbar sein, weil das Daten-Ereignis nicht ausgewertet werden kann. Nur wenn eine RandomChartSource verwendet wird, wird zur Designzeit die Series angezeigt, und beim Ändern von ShowPoints zum Beispiel wird prompt aktualisiert, so wie ich eben auch mit der geänderten Version geprüft habe. (Hast du übrigens die vorherige Einfügung von "if csDesigning..." wieder rückgängig gemacht?).
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Davon hatte ich auch gesprochen (vielleicht etwas zu undeutlich). Aber wie gesagt, es kann Zufall gewesen sein, dass ein Punkt 0 angezeigt wurde oder es ist ein Feature, keine Ahnung.wp_xyz hat geschrieben:Das musst du mir näher erklären, das kann ich mir nicht vorstellen, weil ich nur UserDefinedChartSource geändert habe.
Anbei mal zwei Bildschirmfotos, die zeigen, dass unverändert z.B. ein Pointer gezeigt wird (ich habe ihn mal rot gemacht) und nach der Veränderung nicht mehr (alles im Designmodus). Fügst du zum Beispiel eine B-Sline series dem Cahrt hinzu und setzt deren Source auf die UserDefinedChartSource, wurde sofort ein Pointer gezeigt, nach der Veränderung nicht mehr (deshalb war es mir überhaupt erst aufgefallen).
Ja.wp_xyz hat geschrieben:Hast du übrigens die vorherige Einfügung von "if csDesigning..." wieder rückgängig gemacht?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Ach ja - die "Keine-Daten-Null" haben wir ja durch ein NaN ersetzt, und NaN-Punkte werden weggelassen. Vielleicht muss ich noch weitersuchen, ob es noch eine bessere Stelle gibt den Absturz abzufangen.
Aber ich verstehe jetzt nicht: wie konntest du denn eine UserDefinedChartSource zur Designzeit verwenden, wo doch die IDE abgestürzt ist?
Aber ich verstehe jetzt nicht: wie konntest du denn eine UserDefinedChartSource zur Designzeit verwenden, wo doch die IDE abgestürzt ist?
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Wie ich anfänglich schrieb, hatte ich mir mal alle Series (soweit möglich) anschauen wollen, ob es für ein aktuelles Problem eine alternative Lösung zu der bisherigen TLineSeries gibt. Ich konnte zu allen Series die UserDefinedChartSource problemlos zur Designzeit zuweisen außer zur "Least-squares fit series" (TFitSeries) und TPieSeries. (Bildschirmfoto zeigt eine LineSeries mit aktivierten Pointer, der problemlos die UserDefinedChartSource zur Designzeit zugewiesen werden konnte).wp_xyz hat geschrieben:Aber ich verstehe jetzt nicht: wie konntest du denn eine UserDefinedChartSource zur Designzeit verwenden, wo doch die IDE abgestürzt ist?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Okay, dann ist das Problem nicht bei UserDefinedChartSource sondern bei PieSeries und FitSeries - ich hätten den 1.Post besser lesen sollen. Mal sehen, was ich da finde...
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
TCustomPieSeries erzeugt in TryRadius eine Division durch Null, wenn "total" null ist. Das kann man mit "if total=0 then exit" abfangen; das verhindert bei mir wieder den Absturz (natürlich nachdem die vorige Änderung - FItem.Y := NaN - wieder rückgängig gemacht wurde):
Den Absturz mit TFitSeries kann ich nicht reproduzieren, und im Code sind einige Vorkehrungen für den Fall, dass die Source keine Daten liefert. Könntest du mir wieder so eine schöne Demo zusammenklicken?
Code: Alles auswählen
function TCustomPieSeries.TryRadius(ADrawer: IChartDrawer): TRect;
...
total := Source.ValuesTotal; // das müsste die Summe aller y-Werte sein
if total = 0 then // <-- neu
exit; // <-- neu
for i := 0 to Count - 1 do begin
di := Source[i];
if IsNan(di^.Y) then continue;
with FSlices[j] do begin
FOrigIndex := i;
FPrevAngle := prevAngle;
FNextAngle := FPrevAngle + CycleToRad(di^.Y / total); // <--- div/0 bei total = 0
FVisible := not IsNan(di^.X);
...
Den Absturz mit TFitSeries kann ich nicht reproduzieren, und im Code sind einige Vorkehrungen für den Fall, dass die Source keine Daten liefert. Könntest du mir wieder so eine schöne Demo zusammenklicken?
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Was'n Tag, ist zwar kein Freitag aber ein 13. (Nachdem gestern ein Gewitter aufzog, hatte ich meine Technik vor Beschädigung schützen wollen und alles ausgestöpselt. Das hat mir meine Fritzbox übel genommen und trotz diverser Rettungsversuchen ist sie nun Schrott. Nun ist Ersatz da und auch endlich funktionstüchtig)
Der letzte Codeschnipsel funktioniert tiptop (Lazarus 1.5 r49012M FPC 3.1.1 i386-win32-win32/win64), ich denke so sollte es für die TPieSeries passen!
Für die TFitSeries habe ich wieder das kleine Prog. angehangen (war aber eigentlich nur die Series im Objektinspektor zu tauschen).
Auch den Backtrace habe ich anbei (vermute mal, man müsste bei TFitSeries.ExecFit.TryFit ansetzen, sofort ersichtlich ist es für mich aber erstmal nicht):
Der letzte Codeschnipsel funktioniert tiptop (Lazarus 1.5 r49012M FPC 3.1.1 i386-win32-win32/win64), ich denke so sollte es für die TPieSeries passen!
Für die TFitSeries habe ich wieder das kleine Prog. angehangen (war aber eigentlich nur die Series im Objektinspektor zu tauschen).
Auch den Backtrace habe ich anbei (vermute mal, man müsste bei TFitSeries.ExecFit.TryFit ansetzen, sofort ersichtlich ist es für mich aber erstmal nicht):
Code: Alles auswählen
#0 0x00f9f524 in ORTPOL (M=1000, N=2, X=0, ALFA=0, BETA=0)
at numlib_fix/ipf.pas:458
#1 0x00f9fc10 in IPFPOL (M=1000, N=2, X=0, Y=0, B=0, TERM=1)
at numlib_fix/ipf.pas:546
#2 0x00f7d983 in TRYFIT (parentfp=0xce2f138) at tafuncseries.pas:1412
#3 0x00f7d4f4 in EXECFIT (this=0x1320c720) at tafuncseries.pas:1429
#4 0x00f7d221 in DRAW (this=0x1320c720, ADRAWER=0x132b1fe0)
at tafuncseries.pas:1348
#5 0x00f48d3d in DRAWORDEACTIVATE (parentfp=0xce2f358, ASERIES=0x1320c720,
ATRANSPARENCY=0) at tagraph.pas:724
#6 0x00f48b27 in DISPLAYSERIES (this=0x1466c670, ADRAWER=0x132b1fe0)
at tagraph.pas:763
#7 0x00f49286 in DRAW (this=0x1466c670, ADRAWER=0x132b1fe0, ARECT=...)
at tagraph.pas:836
#8 0x00f4b1e5 in PAINT (this=0x1466c670) at tagraph.pas:1226
#9 0x005e2db7 in TCUSTOMCONTROL__PAINTWINDOW (DC=2650870081,
this=<error reading variable>) at ./include/customcontrol.inc:126
#10 0x005c7f11 in TWINCONTROL__PAINTHANDLER (THEMESSAGE=...,
this=<error reading variable>) at ./include/wincontrol.inc:4762
#11 0x005cc602 in TWINCONTROL__WMPAINT (MSG=...,
this=<error reading variable>) at ./include/wincontrol.inc:6636
#12 0x005e2cac in TCUSTOMCONTROL__WMPAINT (MESSAGE=...,
this=<error reading variable>) at ./include/customcontrol.inc:106
#13 0x0040cf86 in SYSTEM_TOBJECT_$__DISPATCH$formal ()
#14 0x005e2c70 in TCUSTOMCONTROL__WSREGISTERCLASS (pvmt=0x1466c670)
at ./include/customcontrol.inc:93
#15 0x00804bd2 in TDESIGNER__ISDESIGNMSG (SENDER=0x1466c670, THEMESSAGE=...,
this=<error reading variable>) at C:/lazarus/designer/designer.pp:2583
#16 0x005d79e9 in TCONTROL__WNDPROC (THEMESSAGE=...,
this=<error reading variable>) at ./include/control.inc:2022
#17 0x005c9813 in TWINCONTROL__WNDPROC (MESSAGE=...,
this=<error reading variable>) at ./include/wincontrol.inc:5326
#18 0x00655d55 in DELIVERMESSAGE (TARGET=0x1466c670, AMESSAGE=void)
at lclmessageglue.pas:112
#19 0x00576349 in SENDPAINTMESSAGE (CONTROLDC=0, parentfp=0xce2fb8c)
at ./win32/win32callback.inc:538
#20 0x00573698 in WINDOWPROC (WINDOW=264102, MSG=15, WPARAM=0, LPARAM=0)
at ./win32/win32callback.inc:1999
#21 0x764c62fa in USER32!OffsetRect () from C:\Windows\syswow64\user32.dll
#22 0x000407a6 in ?? ()
#23 0x764c6d3a in USER32!IsWindow () from C:\Windows\syswow64\user32.dll
#24 0x005718d0 in DISPOSECOMBOEDITWINDOWINFO (COMBOBOX=0x0)
at ./win32/win32callback.inc:216
#25 0x764c6de8 in USER32!IsWindow () from C:\Windows\syswow64\user32.dll
#26 0x00000000 in ?? ()
- Dateianhänge
-
- TestAbsturzTChart2.zip
- (3.51 KiB) 71-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Ach so! Ich hatte in meinen Tests immer die PointsNumber der UserDefinedChartSeries auf 0 gelassen, dadurch wurde TryFit gleich zu Beginn verlassen, weil offensichtlich keine Daten vorhanden sind. Du hast dagegen die PointsNumber auf 1000 gesetzt. Zur Designzeit wird der Eventhandler nicht ausgeführt (der hier ohnehin nicht geschrieben war), deshalb werden alle X/Y-Koordinaten per Default zu 0 (siehe SetDataItemDefaults weiter oben), d.h. alle 1000 Datenpunkte fallen im Ursprung zusammen. Durch 1 Daten-Punkt kann man aber nichts fitten --> Crash
Bei mir funktioniert alles auch mit deiner Demo, wenn ich in TryFit nach "CalcXRange" die Zeile "if xmax = xmin then exit" einfüge.
Strenggenommen müsste man den Sonderfall "Fit eines Polynoms 0-ten Grades", d.h. Mittelwertberechnung, noch zulassen, aber da die Fitkurve nur 1 Punkt enthält, wird nichts angezeigt. Daher lasse ich es bei obigem beruhen:
Bei mir funktioniert alles auch mit deiner Demo, wenn ich in TryFit nach "CalcXRange" die Zeile "if xmax = xmin then exit" einfüge.
Strenggenommen müsste man den Sonderfall "Fit eines Polynoms 0-ten Grades", d.h. Mittelwertberechnung, noch zulassen, aber da die Fitkurve nur 1 Punkt enthält, wird nichts angezeigt. Daher lasse ich es bei obigem beruhen:
Code: Alles auswählen
procedure TryFit;
var
i, j, term, ns, np, n: Integer;
xv, yv, fp: array of ArbFloat;
begin
np := ParamCount;
ns := Source.Count;
if (np <= 0) or (ns = 0) or (ns < np) then exit;
CalcXRange(xmin, xmax);
if (xmin = xmax) then exit; // <--- neu
n := 0;
for i := 0 to ns - 1 do
with Source.Item[i]^ do
n += Ord(IsValidPoint(X, Y));
if n < np then exit;
....
Re: Absturz TAChart mit PieSeries und UserDefinedCharData
Funktioniert!
Danke wp!
Danke wp!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;