TAChart: Position von TConstantLine anzeigen

Rund um die LCL und andere Komponenten
Antworten
ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

TAChart: Position von TConstantLine anzeigen

Beitrag von ErnstVolker »

Hallo,

ich bewege eine TConstantLine über das Chart. Das klappt.
Mit einem OnDataPointDragTool gebe ich die aktuelle Position der TConstantLine mittels OnAfterMouseMove-Event im Konsolenfenster per Writeln aus.
Man kann das auch in einer Statusbar machen, dann braucht es kein Konsolenfenster.

Ich würde aber gerne den aktuellen Positionswert an der Diagrammachse sozusagen "wandernd" anzeigen. Das OnMarkToText-Event der entsprechenden Achse ändert alle Werte an der Achse.

Am liebsten wäre mir ein "smsLabel" unterhalb der TConstantLine etwas abgesetzt (unterhalb -x-Achse-) von der Achsenbeschriftung. Das AnzeigeLabel wandert mit der Linie über das Chart.
Wie realisiert man das? In welchem Beispiel muß ich nachsehen?

Weiterhin bin ich mit TDatapointDistance Tool innerhalb des Charts am messen. Die Länge der Messbalken (PointerStart und PointerEnd) kann mit "VertSize" beeinflusst werden. Wenn ich als VertSize := Chart.Width oder ChartHeight verwende, dann gehen die Messbalken aber über das Chart hinaus in die Achsen hinein. Ich hätte die Länge gerne so, dass sie innerhalb der Chart-Fläche bleibt.

Worin liegt der Unterschied zwischen Chart.Width und Chart.ChartWidth bzw. Chart.Height und Chart.ChartHeight?

Wie kann das ChartDistanceTool beeinflusst werden, dass mehrere Messungen auf dem Chart verbleiben? Wenn man unter den Optionen "dpdoPermanent" auf True setzt bleibt eine Messung so lange stehen bis man eine Neue ansetzt. Wie kann man hier Messungen hinzufügen ohne dass die Vormessung verschwindet?

Vielen Dank

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

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von wp_xyz »

Zur 1.Frage:

Datenpunkt-Labels können sich nur innerhalb der Zeichenfläche des Chart befinden. Aber du kannst unterhalb des Chart ein entsprechendes TLabel, TStaticText, read-only TEdit aufs Formular setzen, das die Position der ConstantLine ausgibt; diese wiederum wird mit einem DatapointDragTool bewegt. Damit das Label der Linie folgt, musst du die Position von Graph-Einheiten in Pixel umrechnen (Chart.XGraphToImage). Da die Pixel relativ zum Chart sind, musst du die Pixel mit Chart.ClientToParent auf die Koordianten des Containers umrechnen, in dem sich Chart und Anzeigeelement befinden.

Schau dir einfach das beigefügte Programm an. Ich habe statt einem Label/StaticText/Edit eine TPaintbox genommen, da man da mehr Möglichkeiten bei der Gestaltung hat (Farbe, Umrandung usw). Wenn du die vertikale Linie mit gedrückter linkter Maustaste bewegst, wird die aktuelle Linienposition angezeigt und die Paintbox folgt der Linie.
Dateianhänge
tracking_label.zip
(2.61 KiB) 138-mal heruntergeladen

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von h-elsner »

Ist das geil! Das kann ich 1:1 in den verschiedensten Projekten brauchen. Vielen Dank!
PS: Ich muss es nur noch verstehen ;-).

Gruß HE

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von ErnstVolker »

Wow! Genau so wie ich's mir vorgestellt habe.

Ich hab' da jetzt 2 Tage getüftelt...

Vielen vielen Dank!!

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

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:Weiterhin bin ich mit TDatapointDistance Tool innerhalb des Charts am messen. Die Länge der Messbalken (PointerStart und PointerEnd) kann mit "VertSize" beeinflusst werden. Wenn ich als VertSize := Chart.Width oder ChartHeight verwende, dann gehen die Messbalken aber über das Chart hinaus in die Achsen hinein. Ich hätte die Länge gerne so, dass sie innerhalb der Chart-Fläche bleibt.

Lade dir den aktuellen Laz-Trunk, da gibt es in der Eigenschaft "Options" des TDatapointDistanceTool nun ein Element dpdoClipping. Wenn das gesetzt ist, wird der Messbalken inkl. Querstrichen und Werte-Label am Rand des Zeichenfläche abgeschnitten.

ErnstVolker hat geschrieben:Worin liegt der Unterschied zwischen Chart.Width und Chart.ChartWidth bzw. Chart.Height und Chart.ChartHeight?

Chart.Width ist die Breite des gesamten Chart-Controls - d.h. wenn du auf den Chart im Form-Designer klickst, dann ist das der Abstand zwischen den Auswahlmarkierungskästchen links und rechts.
Chart.ChartWidth ist die Breite der Zeichenfläche des Chart, also des zwischen der linken und rechten Achse eingeschlossenen Rechtecks.

Damit der Messquerbalken immer über den gesamten Chart reicht, würde ich das Clipping einschalten und eine sehr große Zahl in PointerStart.VertSize and PointerEnd.VertSize eintragen, größer als die Bildschirmhöhe, etwa 10 000. Nimmst du nur Chart.ChartHeight, dann könnte trotzdem das obere Ende des Balkens sichtbar werden, wenn die Maus sehr weit unter den Chart hinausgezogen wird.

ErnstVolker hat geschrieben:Wie kann das ChartDistanceTool beeinflusst werden, dass mehrere Messungen auf dem Chart verbleiben? Wenn man unter den Optionen "dpdoPermanent" auf True setzt bleibt eine Messung so lange stehen bis man eine Neue ansetzt. Wie kann man hier Messungen hinzufügen ohne dass die Vormessung verschwindet?

Dazu musst du für jede Messung ein eigenes DistanceTool bereitstellen. Bei mehreren Tools musst du etwas programmieren, weil nur ein Distance-Tool aktiv sein kann, sonst wird die Shift-Einstellung nicht erkannt. Im beigefügten Beispiel werden alle Messergebnisse in einer Listbox angezeigt. Darüber gibt es drei Schalter mit folgender Funktion:
  • "+": erzeugt zur Laufzeit ein neues Distancetool für eine neue Messung und aktiviert es. Nach der Messung wird das Ergebnis in die Listbox übernommen, der "+" Schalter wird deaktiviert und der "Edit"-Schalter wird aktiv
  • "Edit": damit kann die Messung, die in der Listbox ausgewählt ist, wiederholt werden
  • "-": entfernt die Messung aus der Listbox, sowie das zugehörige ChartTool.
Dateianhänge
measurementtool_multi.zip
(4.2 KiB) 114-mal heruntergeladen

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von ErnstVolker »

Hallo wp_xy,

vielen vielen Dank für Deine Hilfe. Entschuldige dass ich erst verspätet antworte. Gestern war ich zu müde noch zu tüfteln und heute musste ich erstmal die Trunk installieren.
Das hat mit zunächst TortoiseSVN und dann mit fpcupdeluxe zu meinem Erstaunen hervorragend funktioniert. Normalerweise geht bei mir sowas erstmal gründlich in die Hose. Es dauert zwar ein wenig und es erscheinen auch zwischendurch diverse Meldungen in roter Schrift aber am Ende stand "Done" und die IDE funktioniert.
Ich habe jetzt IDE 2.1.0 mit FPC 3.0.4.

Deine beiden Beispiele funktionieren genauso wie vorgestellt. Das Tool zum Messen und das Tracking-Label. Wird jetzt beides eingebaut.

Vielen Dank nochmal.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von ErnstVolker »

Hallo,

leider stelle ich jetzt fest, dass nach dem Zeichnen einer Messlinie Zoom und Pan nicht mehr funktionieren. Auch bei dem mitgelieferten Beispiel nicht. Muß man die dann auch zur Laufzeit erzeugen bzw. werden die überschrieben wenn man zur Laufzeit ein DistanceTool erzeugt?

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

Re: TAChart: Position von TConstantLine anzeigen

Beitrag von wp_xyz »

Wenn eine ChartTools-Komponente mit dem Chart verknüpft wird, sind die eingebauten Tools für Zoom und Pan nicht mehr aktiv, denn ein Chart kann nur von einem einzigen Toolset bedient werden. Aber kein Problem: Füge per Doppelklick auf der ChartTools-Komponente ein ZoomDrag und ein PanDrag-Tool hinzu. Gib dem ZoomDragTools den Wert Shift=ssLeft und dem PanDragTool den Wert Shift=ssRight, um beide Funktionen wie bisher mit der linken bzw. rechten Maustaste zu verknüpfen. Allerding steht dann für das DistanceTool die linke Maustaste nicht mehr zur Verfügung. Ich würde einfach dem DistanceTool zusätzlich auch die Ctrl-Taste zuweisen: ändere in dem Code weiter oben die Zeile "t.Shift := [ssLeft]" zu "t.Shift := [ssLeft, ssCtrl]". Oder du kannst einen ganz anderen Ansatz verfolgen und eine Toolbar einsetzen, deren Buttons nur das Zoom, das Drag oder das Mess-Tool aktivieren, die dann auch dieselbe Shift-Einstellung, z.B. ssLeft, verwenden können (diese Vorgehensweise ist in dem Tutorial http://wiki.lazarus.freepascal.org/TACh ... ouse-wheel näher erläutert).

Antworten