Chart Crosshair mit Cursortasten bewegen

Rund um die LCL und andere Komponenten
Antworten
fseuhs
Beiträge: 13
Registriert: Mi 20. Sep 2017, 10:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Niederösterreich

Chart Crosshair mit Cursortasten bewegen

Beitrag von fseuhs »

In einem Chart mit Lineserien mit der X-Achse als Zeitachse werden die Messwerte als Y-werte dargestellt.
Mit einem Crosshair Tool und ein Hint Tool kann man bei gedrückter Alt-Taste mit der Maus die Messwertkurve abfahren und bekommt die Zeit und den Messwert im Hint angezeigt.
Ich möchte gerne aber weiter bei gedrückten Alt-Taste die Kurve mit den Cursortasten abfahren, ohne die Maus zu bewegen.
Ein weitere Wunsch wäre dann noch, dass man den angezeigten Hint durch Drücken der Entertaste in z.B. einem Memo abspeichern kann.
Es gibt zwar die Events Keydown usw. ich weiß aber trotzdem nicht wie ich da weiter komme.
Mit bestem Dank
LG Fritz

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

Re: Chart Crosshair mit Cursortasten bewegen

Beitrag von wp_xyz »

Das ist nicht ganz einfach, weil TChart keinen Zugriff auf die Tastatur-Events hat. Aber schau dir das beigefügte Beispiel an, das deinen Vorstellungen recht nahe kommen könnte. Ich erhebe nicht den Anspruch, dass das die "richtige" Lösung ist, aber es war die, die mir am schnellsten einfiel.

Zunächst gibt es ein TDataPointClickTool, mit dem man auf einen Datenpunkt klicken kann; der Index und die zugehörige Series (falls sich mehrere auf dem chart befinden) werden zwischengespeichert (--> FCurrIndex, FCurrSeries). Der Chart wird neu ausgegeben. Weil an die LineSeries ein OnCustomDrawPointer-Event-Handler angehängt ist und dieser entsprechend programmiert ist, wird der angeklickte Datenpunkt vergößert dargestellt. Damit dieser nun mit den Cursor-Tasten über den Chart bewegt werden kann, ist das KeyPreview-Property des Formulars auf true gesetzt, so dass die Tastatur-Ereignisse, die der Chart nicht verarbeiten kann, vom Formular abgefangen werden. Dort gibt es nun einem KeyDown-Handler, der auf die Pfeiltasten den markierten Datenpunkt um 1 weiterbefördert und mit der ENTER-Taste die x/y-Werte des markierten Datenpunkts ausliest, in einen String umwandelt und in ein Memo schreibt (dort gibt es noch das Problem, dass unbeabsichtigte Leerzeilen eingefügt werden - dem bin ich aber nicht mehr nachgegangen). Ein Problem war auch, dass sobald das Memo fokussiert ist, diese Tasten nicht mehr vom Formular abgefangen werden. Daher habe ich kurzerhand den Focus auf den Chart gesetzt - das ist aber nicht die "feine Art", denn das kommt vielleicht für den Benutzer unerwartet. Bleibt noch der Punkt, wie man die Markierung des Datenpunkts wieder entfernt. Dazu klickt man irgendwo ins Formular (nur nicht auf einen Datenpunkt), und ein UserDefinedTool erkennt das und entfernt die Markierung wieder.
Dateianhänge
read_values.zip
(3.22 KiB) 120-mal heruntergeladen

fseuhs
Beiträge: 13
Registriert: Mi 20. Sep 2017, 10:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Niederösterreich

Re: Chart Crosshair mit Cursortasten bewegen

Beitrag von fseuhs »

Danke für Dein Beispiel. Habe es ausprobiert und das hat mich zu noch mehr inspiriert.

Das Problem mit der Enter Taste habe ich so gelöst, dass ich in KEYDown den Key auf 0 setze.
Weiters habe ich Deine Idee des focus setzen erweitert (Wußte nicht, dass das geht).
In Form Create setze ich Chart1.Tabstop auf true, FCurrIndex auf 0 und FCurrseries auf Chart1LineSeries1.
In FormKeyDown frage ich ab ob der Focus auf Chart1 gesetzt ist und verarbeite dann die Keys entsprechend.
Key auf 0 setzen wird nur ausgeführt wenn der Key nicht der Tabkey ist. damit kann ich wieder den Focus zum Memo wechseln.
In FormKeyUp frage ich den Focus des Charts ab und setze entsprechend die Hintergrundfarbe, somit ist ersichtlich wo sich der Focus befindet.

Der Fantasie sind weiter keine Grenzen gesetzt für weitere Funktionen mit dem Keyboard, wie Cursor, Zoom ...

LG

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

Re: Chart Crosshair mit Cursortasten bewegen

Beitrag von wp_xyz »

Na dann! Zum erwähnten Zoom muss ich noch erwähnen, das das standardmäßig verwendete Zoomen ausgeschaltet wird, sobald eine ChartTools-Komonente mit dem Chart verbunden wird. Um weiterhin zoomen zu können, musst du nur ein ZoomDrag-Tool der ChartTools-Komponente hinzufügen.

Antworten