[gelöst] Absturz TAChart PieSeries und UserDefinedCharData

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[gelöst] Absturz TAChart PieSeries und UserDefinedCharData

Beitrag von Michl »

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
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; 

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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.

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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:

Code: Alles auswählen

 
procedure TUserDefinedChartSource.Reset;
begin
  if csDesigning in ComponentState then
    exit;
  InvalidateCaches;
  Notify;
end;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von Michl »

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?!):

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; 

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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:

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;
 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von Michl »

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.

Nichts­des­to­trotz 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; 

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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?).

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von Michl »

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.
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.

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).

wp_xyz hat geschrieben:Hast du übrigens die vorherige Einfügung von "if csDesigning..." wieder rückgängig gemacht?
Ja.
Dateianhänge
NachPatch.png
Original.png

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von Michl »

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?
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).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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...

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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):

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?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von Michl »

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):

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; 

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von wp_xyz »

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:

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;   
....
 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Absturz TAChart mit PieSeries und UserDefinedCharData

Beitrag von Michl »

Funktioniert!

Danke wp!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten