[gelöst] TAChart Oszilloscope mit Zeitachse mit Access Violation

Rund um die LCL und andere Komponenten
Antworten
Helios
Lazarusforum e. V.
Beiträge: 106
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

[gelöst] TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von Helios »

Guten Morgen zusammen,

ich möchte ein kleines Programm schreiben, mit dem ich den RAM Verbrauch und die CPU Nutzung eines Programmes/Prozesses
während der Ausführung anzeige. Dazu verwende ich die TChart Komponente und das "Oszilloscope" aus dem "Line-Demo" unter
der Lazarus Standardinstallation (C:\Lazarus\components\tachart\demo\line).
Jetzt würde ich gerne auch an der X-Ychse die Uhrzeit 'hh:mm:ss' anzeigen (ggf. (besser) auch als "hint" wenn man über den Achseneintrag
mit der Maus schwebt). Dazu habe ich bereits den Eintrag viewtopic.php?t=6769 hier im Forum gefunden.
Wenn ich das aber zusammenbaue bekomme ich bereits mit dem Aufruf von
DateTimeIntervalChartSource1.DateTimeFormat := 'hh:mm';
eine Access Violation.
Den Fehler bekomme ich auch ohne den Aufruf Add() in TForm1.timOscilloscopeTimer mit dem ich das Chart ja erst befülle.
Was mache ich denn da falsch?
Danke für jeden Hinweis zur Ursache des Problems (im Projekt im Anhang habe ich die entsprechend kritische Zeile auskommentiert)
Helios
Dateianhänge
Oscillator.zip
(5.25 KiB) 35-mal heruntergeladen
Zuletzt geändert von Helios am Sa 27. Mai 2023, 14:23, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von theo »

Vielleicht wäre es ganz hilfreich, wenn du die Komponente DateTimeIntervalChartSource1 tatsächlich auf's Formular legen würdest.
Die ist nämlich gar nicht da. Die hast du wohl versehentlich gelöscht.

Helios
Lazarusforum e. V.
Beiträge: 106
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von Helios »

Hallo Theo,
puh, was für ein Anfängerfehler... Da hab ich den Wald vor lauter Bäumen nicht gesehen. Danke für Deinen Hinweis!
Der Access Violation Fehler ist mit dem Einfügen der graphischen Komponente natürlich behoben.
Etwas Probleme habe ich noch, wirklich die Zeiten in "hh:mm:ss" oder kürzer in "mm:ss" im Sekundentakt in/an der
X-Achse anzuzeigen.
Da muss ich heute Abend nochmal schauen, wie ich das hinbekomme.
Vielen Dank aber nochmal!
Gruß
Helios

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

Re: [gelöst] TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von wp_xyz »

Ich denke, das Haupt-Problem ist, dass du die Werte mit "Add" zur Series hinzufügst. Da werden keine x-Werte vergeben, nur die angegebenen y-Werte. Stattdessen wird für x der laufende Index genommen. Wenn du dir dir Achse jetzt von einer TDateTimeIntervalChartSource beschriften lässt, interpretiert diese die Daten so, als wären sie im Tagesabstand aufgenommen, aber nicht wie gewollt im Sekundenabstand .

Ich würde stattdessen die "wahre" Zeit verwenden, d.h. diese mit der Funktion Now() auslesen und - wenn du die Zeitdifferenz um Start der Messung willst - diese Werte von der Anfangszeit, die man sich natürlich entsprechend merken muss, subtrahieren. Und wenn die das Beispiel aus den TAChart-Demos beibehalten willst, musst du den x-Wert, der an die Sin-Funktion übergeben wird, entsprechend hochskalieren. Das Wertepaar wird dann mit "AddXY" an die Series übergeben.

Details im beigefügten Projekt "oscilloscope-wp", mit einigen weiteren Anregungen. Siehe Kommentare.

Alternativ wäre zu überlegen, ob du die Messwerte wirklich wegwerfen willst. In dem Beispiel werden die ältesten Werte gelöscht, wenn mehr als 20 Werte aufgelaufen sind. Wenn du die Werte behalten willst, solltest du einen ganz anderen Ansatz versuchen, und zwar mit einer TChartLiveView (https://wiki.lazarus.freepascal.org/TAC ... #Live_View). Das ist eine Hilfskomponente, mit dem man nur einen bestimmten Ausschnitt aus den Gesamtdaten sehen kann. Wenn mehr Daten vorhanden sind, als in dieses Fenster passen, laufen die älteren einfach nach links aus dem Fenster, bleiben aber weiterhin in der Series.

Details im beigefügten LiveView-Projekt.
Dateianhänge
LiveView.zip
(4.09 KiB) 38-mal heruntergeladen
oscilloscope-wp.zip
(4.19 KiB) 37-mal heruntergeladen

Helios
Lazarusforum e. V.
Beiträge: 106
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: [gelöst] TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von Helios »

Hallo wp_xyz,
ich war zwar schon richtig mit AddXY unterwegs, aber bei mir kam es da zu hässlichen X-Achsen Beschriftungen weil die meistens zu breit waren;-).
Deine Lösungen sind wie aus dem "Bilderbuch", auch die Lösung mit dem TChartLiveView ist super geeignet für meinen Anwendungsfall (Danke für den Tipp).
Wenn ich das richtig verstehe, kann ich damit alle erfassten Daten in ein Log schreiben, ohne noch eine weitere Datenstruktur aufzunehmen, klasse!
Zwei Fragen hätte ich noch:
1. Kann ich evtl. die echte Zeit und Datum also z.B. "yyy.mm.dd hh:nn:ss" auf der X-Achse mit Klicken/Hoovern über der Marker/Label auf der Achse anzeigen?
2. Ist das Thema "Disable/EnableRedrawing" in "oscilloscope-wp" oder Konzept-bedingt und zukünftig immer durch den Programmierer zu behandeln?
Danke nochmal vielmals für diese super Beispiele!
Gruß
Helios

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

Re: [gelöst] TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von wp_xyz »

Helios hat geschrieben:
So 28. Mai 2023, 09:43
Wenn ich das richtig verstehe, kann ich damit alle erfassten Daten in ein Log schreiben, ohne noch eine weitere Datenstruktur aufzunehmen, klasse!
Das kannst du immer. Es ist oft praktisch, die Daten in einer auf das Projekt optimierten Datenstruktur zu halten und gar nicht über Series.AddXY nochmals in die interne ChartSource zu kopieren - doppelte Datenhaltung schafft immer mal Probleme... Stattdessen kannst du eine UserDefinedChartSource aufs Formular setzen und mit der Source-Property der Series verbinden. Anschließend schreibst du einen Handler für der OnGetChartDataItem-Ereignis, in dem du der Series mitteilst, wo die x/y-Daten für den aktuellen Datenpunkt mit dem angegebenen Index gefunden werden können.

Über TUserDefinedChartSource gibt es ein Tutorial im wiki: https://wiki.lazarus.freepascal.org/TAC ... hartSource
Helios hat geschrieben:
So 28. Mai 2023, 09:43
1. Kann ich evtl. die echte Zeit und Datum also z.B. "yyy.mm.dd hh:nn:ss" auf der X-Achse mit Klicken/Hoovern über der Marker/Label auf der Achse anzeigen?
Es gibt seit Laz 2.0 ein Axis-Click-Tool, mit dem man sowas machen könnte: Einen Handler für OnClick schreiben und dabei mit dem als Parameter übergebenen HitInfo abfragen, auf welchem Teil der Achse geklickt wurde (TChartAxisHitTests = set of (ahtTitle, ahtLine, ahtLabels, ahtGrid,ahtAxisStart, ahtAxisCenter, ahtAxisEnd)).
Helios hat geschrieben:
So 28. Mai 2023, 09:43
2. Ist das Thema "Disable/EnableRedrawing" in "oscilloscope-wp" oder Konzept-bedingt und zukünftig immer durch den Programmierer zu behandeln?
Ich habe gestern versucht, das zu vereinfachen, aber ich fürchte, das kann man nicht in den Interna der DateTimeIntervalChartSource verstecken, denn eine ChartSource "weiß" gar nicht, mit welchem Chart sie verbunden ist und kann somit gar nicht dessen "Disable/EnableRedrawing" aufrufen.

Helios
Lazarusforum e. V.
Beiträge: 106
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.4 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: [gelöst] TAChart Oszilloscope mit Zeitachse mit Access Violation

Beitrag von Helios »

Hallo wp_xyz und auch theo
erneut vielen Dank für die Tipps!
Das Thema ist jetzt vollständig gelöst. Wenn mein Programm vollständig ist (das dauert sicher noch etwas) werde ich es hier noch drunter ablegen.
Gruß
Helios

Antworten