TChart Werte unter dem Mauscursor abfragen.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

TChart Werte unter dem Mauscursor abfragen.

Beitrag von Frank Ranis »

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
www.flz-vortex.de

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

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von wp_xyz »

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.

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von Frank Ranis »

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

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

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;         
 
Bin also mit dem finden von passenden Methoden noch nicht richtig weiter.

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
und der Mausposition selber was zu basteln.

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;         
Ich danke dir aber dennoch für deine Antwort.
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
www.flz-vortex.de

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

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von wp_xyz »

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:

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

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

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von Frank Ranis »

Hallo ,

super, das war es . :D

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

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

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von wp_xyz »

Wie kann man bei der Doku mithelfen?
Artikel für das wiki schreiben. (Kündige das aber im Lazarus-Forum an, damit die Koordinatoren draufschauen können).

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von Frank Ranis »

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
www.flz-vortex.de

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

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von wp_xyz »

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.

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von Frank Ranis »

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
www.flz-vortex.de

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

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von wp_xyz »

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.

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: TChart Werte unter dem Mauscursor abfragen.

Beitrag von Frank Ranis »

Hallo wp_xyz,
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.
habe hier Version 1.010 .

Werde mir den Link mal anschauen.

Gruß

Frank
www.flz-vortex.de

Antworten