TChart Werte unter dem Mauscursor abfragen.
-
- Beiträge: 210
- Registriert: Do 24. Jan 2013, 21:22
TChart Werte unter dem Mauscursor abfragen.
Hallo,
habe vor kurzem mit Lazarus angefangen und probier so einiges durch, was ich von Delphi her kenne.
Hänge nun ein wenig bei Tchart fest.
Unter Delphi gab es die Methode Series.XScreenToValue(x) bzw. Series.YScreenToValue(y).
Damit konnte ich schön bei onmousemove die Werte des Darstellungsbereiches an der Stelle des Maus-Cursors abfragen.
Gibt es etwas vergleichbares unter Lazarus (ich kann nichts finden) ?
Gruß
Frank
habe vor kurzem mit Lazarus angefangen und probier so einiges durch, was ich von Delphi her kenne.
Hänge nun ein wenig bei Tchart fest.
Unter Delphi gab es die Methode Series.XScreenToValue(x) bzw. Series.YScreenToValue(y).
Damit konnte ich schön bei onmousemove die Werte des Darstellungsbereiches an der Stelle des Maus-Cursors abfragen.
Gibt es etwas vergleichbares unter Lazarus (ich kann nichts finden) ?
Gruß
Frank
www.flz-vortex.de
Re: TChart Werte unter dem Mauscursor abfragen.
Die von dir angesprochenen Methoden heißen bei TAChart XGraphToImage bzw. YGraphToImage. Zu den von TAChart verwendeten Koordinatensystemen siehe http://wiki.lazarus.freepascal.org/TACh ... and_axises
Allerdings solltest du bei TAChart die Maus gar nicht selbst abfragen, sondern die ChartTools verwenden, die das für dich machen und alles über die Skalierung etc. wissen. Speziell zu deiner Fragestellung gibt es das DataPointCrosshairTool, das einen Cursor (Kreuz oder Fadenkreuz) auf dem Datenpunkt einblendet, auf dem sich aktuell die Maus befindet. Das OnDraw Event kannst du verwenden, um die Koordinaten o.ä. zum Beispiel in der Statuszeile anzuzeigen. Eine andere Möglichkeit ist das DataPointClickTool, das bei einem Klick auf einen Datenpunkt aktiv wird. Näheres zu diesem Tool findest du in dem Tutorial http://wiki.lazarus.freepascal.org/TACh ... hart_Tools. Weitere Tutorials, sowie die offizielle Dokumentation sind verlinkt unter http://wiki.lazarus.freepascal.org/Category:TAChart. Vielleicht hilft dir das beim Einstieg.
Allerdings solltest du bei TAChart die Maus gar nicht selbst abfragen, sondern die ChartTools verwenden, die das für dich machen und alles über die Skalierung etc. wissen. Speziell zu deiner Fragestellung gibt es das DataPointCrosshairTool, das einen Cursor (Kreuz oder Fadenkreuz) auf dem Datenpunkt einblendet, auf dem sich aktuell die Maus befindet. Das OnDraw Event kannst du verwenden, um die Koordinaten o.ä. zum Beispiel in der Statuszeile anzuzeigen. Eine andere Möglichkeit ist das DataPointClickTool, das bei einem Klick auf einen Datenpunkt aktiv wird. Näheres zu diesem Tool findest du in dem Tutorial http://wiki.lazarus.freepascal.org/TACh ... hart_Tools. Weitere Tutorials, sowie die offizielle Dokumentation sind verlinkt unter http://wiki.lazarus.freepascal.org/Category:TAChart. Vielleicht hilft dir das beim Einstieg.
-
- Beiträge: 210
- Registriert: Do 24. Jan 2013, 21:22
Re: TChart Werte unter dem Mauscursor abfragen.
Hallo wp_xyz,
zunächst einmal Danke für die Infos.
Die Methoden XGraphToImage bzw. YGraphToImage sind nicht das Richtige, diese liefern irgendwelche globalen Bildschirmkoordinaten zurück.
Wenn ich z.B. eine Liste
habe und ExpandPercentage steht auf 0, dann füllt ja die Serie1 den gesamten Bereich des Chartbildschirmes aus.
Der kleinste X-Wert ist 0, der größte 1.
Fahre ich nun mit der Maus über den Ausgabebildschirm möchte ich halt kontinuierlich Werte zwischen 0 und 1 zurückbekommen, je nach Mausposition X.
Zoome ich einen Teil der Serie , z.B. von X=0.3 bis X=0.7 , dann ist X-Min halt 0,3 und X-Max 0.7 .
Beim überfahren mit der Maus müßen also X-Werte von 0.3 bis 0.7 geliefert werden.
Die Delphi-Chart hat das mit den Methoden Series.XScreenToValue(mouse_pos_x) bzw. Series.YScreenToValue(maouse_pos_y) auch schön gemacht.
Du hattest mir DataPointCrosshairTool vorgeschlagen.
Das funktioniert auch prima, ist aber halt nur eine Fangfunktion für vorhandene Punkte der Serie.
In apoint.x und apoint.y bekommen ich ja auch die Mausposition geliefert und in TDataPointCrosshairTool(atool).PointIndex steht der letzte gefangene Index der Serienpunkte.
Bin also mit dem finden von passenden Methoden noch nicht richtig weiter.
Eine Lösung wäre, sich aus vorhandenen Methoden von Tchart, also
und der Mausposition selber was zu basteln.
Also
Ich danke dir aber dennoch für deine Antwort.
Eventuell kennt ja noch einer der Lazarus-Kollege eine bessere Lösung.
Gruß
Frank
zunächst einmal Danke für die Infos.
Die Methoden XGraphToImage bzw. YGraphToImage sind nicht das Richtige, diese liefern irgendwelche globalen Bildschirmkoordinaten zurück.
Wenn ich z.B. eine Liste
Code: Alles auswählen
Serie1.AddXY(0,0);
Serie1.AddXY(0.1,0.05);
Serie1.AddXY(0.2,0.025);
Serie1.AddXY(0.3,0.075);
Serie1.AddXY(0.4,0.03);
Serie1.AddXY(0.5,0);
Serie1.AddXY(0.6,0.11);
Serie1.AddXY(0.7,0.15);
Serie1.AddXY(0.8,0.08);
Serie1.AddXY(0.9,0.10);
Serie1.AddXY(1.0,0.0);
Der kleinste X-Wert ist 0, der größte 1.
Fahre ich nun mit der Maus über den Ausgabebildschirm möchte ich halt kontinuierlich Werte zwischen 0 und 1 zurückbekommen, je nach Mausposition X.
Zoome ich einen Teil der Serie , z.B. von X=0.3 bis X=0.7 , dann ist X-Min halt 0,3 und X-Max 0.7 .
Beim überfahren mit der Maus müßen also X-Werte von 0.3 bis 0.7 geliefert werden.
Die Delphi-Chart hat das mit den Methoden Series.XScreenToValue(mouse_pos_x) bzw. Series.YScreenToValue(maouse_pos_y) auch schön gemacht.
Du hattest mir DataPointCrosshairTool vorgeschlagen.
Das funktioniert auch prima, ist aber halt nur eine Fangfunktion für vorhandene Punkte der Serie.
In apoint.x und apoint.y bekommen ich ja auch die Mausposition geliefert und in TDataPointCrosshairTool(atool).PointIndex steht der letzte gefangene Index der Serienpunkte.
Code: Alles auswählen
procedure TForm1.ChartToolset1DataPointCrosshairTool1AfterMouseMove(
ATool: TChartTool; APoint: TPoint);
var ind:integer;
begin
// Mausposition auf dem TChart
edit3.text:=inttostr(apoint.x);
edit4.text:=inttostr(apoint.y);
// Series-Index des letzten gefangenen Punktes
ind:=TDataPointCrosshairTool(atool).PointIndex;
// Ausgabe der Series-Values mit einem gültigen Index
if ind>-1
then
begin
edit5.Text:=inttostr(ind);
edit1.text:=floattostr(serie1.GetXValue(Ind));
edit2.text:=floattostr(serie1.GetyValue(Ind));
end;
end;
Eine Lösung wäre, sich aus vorhandenen Methoden von Tchart, also
Code: Alles auswählen
// Min-Max-Values der dargestellten Series
Tchart.XGraphMin
Tchart.XGraphMax
Tchart.YGraphMin
Tchart.YGraphMax
// Ausgabebereich für die Series
chart.ClipRect
Also
Code: Alles auswählen
procedure TForm1.ChartToolset1DataPointCrosshairTool1AfterMouseMove(
ATool: TChartTool; APoint: TPoint);
var ind:integer;
begin
// Mausposition auf dem Chart
edit3.text:=inttostr(apoint.x);
edit4.text:=inttostr(apoint.y);
// Series-Index des letzten gefangenen Punktes
ind:=TDataPointCrosshairTool(atool).PointIndex;
// Ausgabe der Series-Values mit einem gültigen Index
if ind>-1
then
begin
edit5.Text:=inttostr(ind);
edit1.text:=floattostr(serie1.GetXValue(Ind));
edit2.text:=floattostr(serie1.GetyValue(Ind));
end;
// Hier dann der gezoomte Bereich der Series
edit6.text:=floattostr(chart1.XGraphMin)+' '+floattostr(chart1.XGraphMax);
edit7.text:=floattostr(chart1.YGraphMin)+' '+floattostr(chart1.YGraphMax);
// Und die Koordinaten des Series-Auschnittes
edit8.text:=inttostr(chart1.ClipRect.Left)+' '+inttostr(chart1.ClipRect.top);
edit9.text:=inttostr(chart1.ClipRect.Right)+' '+inttostr(chart1.ClipRect.Bottom);
// Hier käme dann noch die Verrechnung der Mausposition mit den Value-Werten
end;
Eventuell kennt ja noch einer der Lazarus-Kollege eine bessere Lösung.
Gruß
Frank
Zuletzt geändert von Lori am Fr 25. Jan 2013, 14:44, insgesamt 1-mal geändert.
Grund: Highlighter
Grund: Highlighter
www.flz-vortex.de
Re: TChart Werte unter dem Mauscursor abfragen.
Sorry, das war ein Fehler meinerseits. Für die Umwandlung der Mauskoordinaten brauchst du natürlich ImageToGraph: "Image" sind die Pixel-Koordianten, "Graph" die Koordinaten im Diagramm - deswegen hatte ich den Docs-Abschnitt über die Koordiantensysteme verlinkt (falls du Transformationen (z.B. logarithmische Achse) verwendest, sind die Graph-Koordinaten aber die Logarithmen, die direkten Koordinaten, die an der Achse stehen, heißen "Axis coordinates", und für diese Umwandlung gibt es spezielle Methoden der Achse, die mit der Transformation verknüpft ist.).
Damit sollte es so funktionieren:
Statt des direkten Zugriffs auf das MouseMove event kannst du auch die ChartTools verwenden, in diesem Fall, weil keine weitere Funktionalität benötigt wird, das UserDefinedTool. Die Mauskoordinaten wandelst du wie oben im AfterMouseMove-Event des Tools um:
Vorteil dieser Methode ist, dass du dem Tool einen Tastencode zuweisen kannst, z.B. die CTRL-Taste, so dass die Koordinaten nur dann angzeiegt werden, wenn du die CTRL-Taste drückst. Falls du dieses Feature nicht benötigst, ist natürlich der direkte Zugriff einfacher.
Damit sollte es so funktionieren:
Code: Alles auswählen
procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
xx,yy: Double;
begin
xx := Chart1.XImageToGraph(X);
yy := Chart1.YImageToGraph(Y);
StatusBar1.SimpleText := Format('%f / %f', [xx, yy]);
end;
Code: Alles auswählen
procedure TForm1.ChartToolset1UserDefinedTool1AfterMouseMove(ATool: TChartTool;
APoint: TPoint);
var
p: TDoublePoint;
begin
p := Chart1.ImageToGraph(APoint);
Statusbar1.SimpleText := Format('%f / %f', [p.x, p.y]);
end;
-
- Beiträge: 210
- Registriert: Do 24. Jan 2013, 21:22
Re: TChart Werte unter dem Mauscursor abfragen.
Hallo ,
super, das war es .
Lazarus gefällt mir von Tag zu Tag immer besser.
Es ist alles vorhaden, nur das finden von Informationen fällt mir noch schwer.
Bin ein wenig verwöhnt von der Delphi-Hilfe.
Wie kann man bei der Doku mithelfen?
Gruß
Frank
super, das war es .

Lazarus gefällt mir von Tag zu Tag immer besser.
Es ist alles vorhaden, nur das finden von Informationen fällt mir noch schwer.
Bin ein wenig verwöhnt von der Delphi-Hilfe.
Wie kann man bei der Doku mithelfen?
Gruß
Frank
www.flz-vortex.de
Re: TChart Werte unter dem Mauscursor abfragen.
Artikel für das wiki schreiben. (Kündige das aber im Lazarus-Forum an, damit die Koordinatoren draufschauen können).Wie kann man bei der Doku mithelfen?
-
- Beiträge: 210
- Registriert: Do 24. Jan 2013, 21:22
Re: TChart Werte unter dem Mauscursor abfragen.
Hallo,
ich bin mal wieder beim TChart und komme nicht weiter.
Versuche verzweifelt die Zomm-Funktion so hin zu bekommen, wie ich das vom Delphi her kenne.
Habe also meine Series im Chart angezeigt und mittels dem Chart-Toolset-ZoomDragTool und Maus (linke Maustaste) von links oben nach rechts unten kann ich auch einen gewünschten Bereich zoomen.
Klicke ich aber mit der Maus (linke Maustaste) in die Grafik , wird sofort ein Undo-Zoom ausgelöst.
Beim Delphi mußte man für einen Undo-Zomm von rechts unten nach links oben ziehen.
Mach mich ganz wuschelig, weil ich nicht weiter komme und das OnClick-Ereignis für was anderes benutzen will.
Die Grafik soll dabei aber unbeeinflußt stehen bleiben.
Wie kann ich also den Undo-Zomm auf ein OnClick abstellen?
Gruß
Frank
ich bin mal wieder beim TChart und komme nicht weiter.
Versuche verzweifelt die Zomm-Funktion so hin zu bekommen, wie ich das vom Delphi her kenne.
Habe also meine Series im Chart angezeigt und mittels dem Chart-Toolset-ZoomDragTool und Maus (linke Maustaste) von links oben nach rechts unten kann ich auch einen gewünschten Bereich zoomen.
Klicke ich aber mit der Maus (linke Maustaste) in die Grafik , wird sofort ein Undo-Zoom ausgelöst.
Beim Delphi mußte man für einen Undo-Zomm von rechts unten nach links oben ziehen.
Mach mich ganz wuschelig, weil ich nicht weiter komme und das OnClick-Ereignis für was anderes benutzen will.
Die Grafik soll dabei aber unbeeinflußt stehen bleiben.
Wie kann ich also den Undo-Zomm auf ein OnClick abstellen?
Gruß
Frank
www.flz-vortex.de
Re: TChart Werte unter dem Mauscursor abfragen.
Bin nicht ganz sicher, ob das in der offiziellen Version schon mit dabei. In der svn-trunk-Version jedenfalls hat das ZoomDragTool die Eigenschaft RestoreExtentOn, mit der man das Unzoomen näher festlegen kann.
-
- Beiträge: 210
- Registriert: Do 24. Jan 2013, 21:22
Re: TChart Werte unter dem Mauscursor abfragen.
Hallo wp_xyz,
danke für die Antwort.
Da muß ich wohl noch ein wenig warten, denn in der aktuell verfügbaren Version konnte ich diese Eigenschaft nicht finden.
Bis demnächst
Gruß
Frank
danke für die Antwort.
Da muß ich wohl noch ein wenig warten, denn in der aktuell verfügbaren Version konnte ich diese Eigenschaft nicht finden.
Bis demnächst
Gruß
Frank
www.flz-vortex.de
Re: TChart Werte unter dem Mauscursor abfragen.
Welche Version hast du denn? Es ist wirklich kein Problem, die trunk-Version aus den Snapshots zu installieren (ftp://freepascal.dfmk.hu/pub/lazarus/snapshots/), in der Regel laufen diese Tagesversionen sehr stabil. Du kannst sogar mehrere Versionen gleichzeitig auf dem Rechner haben.
-
- Beiträge: 210
- Registriert: Do 24. Jan 2013, 21:22
Re: TChart Werte unter dem Mauscursor abfragen.
Hallo wp_xyz,
Werde mir den Link mal anschauen.
Gruß
Frank
habe hier Version 1.010 .wp_xyz hat geschrieben:Welche Version hast du denn? Es ist wirklich kein Problem, die trunk-Version aus den Snapshots zu installieren (ftp://freepascal.dfmk.hu/pub/lazarus/snapshots/), in der Regel laufen diese Tagesversionen sehr stabil. Du kannst sogar mehrere Versionen gleichzeitig auf dem Rechner haben.
Werde mir den Link mal anschauen.
Gruß
Frank
www.flz-vortex.de