Benötige Funktion tchart.ZoomPercent(x)

Rund um die LCL und andere Komponenten
Antworten
Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Benötige Funktion tchart.ZoomPercent(x)

Beitrag von Frank Ranis »

Hallo,

für die Portierung eines alten Delphi6-Programmes nach LAZ benötige ich eine tchart.ZoomPercent(x) - Funktion.

Die Oberfläche des alten Delphi6-Prog's hatte zusätzlich zu den Zoom-Mausfunktionen 3 Button's
(zoom+) , mit tchart.ZoomPercent(105) , für 105% .
(1:1) , mit tchart.undozoom (Delphi) , das geht ja mit tchart.zoomfull (Lazarus) .
(zoom-) , mit tchart.ZoomPercent(95) , für 95% .

Das Aussehen der Programmoberfläche soll indentisch mit dem Delphi-Orginal sein und die User sind es gewohnt diese Buttons zu nutzen.

Hat jemand eine Idee , wie man so eine Funktion bei (TChart unter Lazarus) umsetzten / nachbauen könnte?

Gruß

Frank
www.flz-vortex.de

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

Re: Benötige Funktion tchart.ZoomPercent(x)

Beitrag von wp_xyz »

Für spezielle Zoom-Anforderungen kannst du ein TChartToolset aufs Formular setzen und eines der Zoom-Tools verwenden:
  • ZoomDrag = Aufziehen eines Zoom-Rechtecks mit der Maus,
  • ZoomClick = Zoomen beim Klicken in den Chart,
  • ZoomMouseWheel = Zoomen mit dem Mausrad.
Bei den beiden letzteren gibt es Properties ZoomFactor und ZoomRatio, mit denen man den Skalierungsfaktor, auch für x und y getrennt, bestimmen kann. Siehe dazu http://wiki.lazarus.freepascal.org/TACh ... click_tool, sowie die Tutorials http://wiki.lazarus.freepascal.org/TACh ... hart_Tools und http://wiki.lazarus.freepascal.org/TACh ... s,_Zooming

Für Zoomen mit Hilfe eines externen Buttons, unabhängig von den ChartTools, kannst du die Eigenschaft LogicalExtent verändern. Das definiert den sichtbaren Ausschnitt des Charts, als DoubleRect mit den Punkten a und b für die linke untere und rechte obere Ecke.

Code: Alles auswählen

uses
  TAChartUtils, TAGeometry;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Zoom(1.05);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Zoom(1/1.05);
end;
 
procedure TForm1.Zoom(AFactor: Double);
var
  ext: TDoubleRect;
  oldW, oldH: Double;
  newW, newH: Double;
  dx, dy: Double;
begin
  ext := Chart1.LogicalExtent;
  oldW := ext.b.x - ext.a.x;
  oldH := ext.b.y - ext.a.y;
  newW := oldW * AFactor;
  newH := oldH * AFactor;
  dx := (newW - oldW) / 2;
  dy := (newH - oldH) / 2;
  Chart1.LogicalExtent := DoubleRect(ext.a.x-dx, ext.a.y-dy, ext.b.x+dx, ext.b.y+dy);
end

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

Re: Benötige Funktion tchart.ZoomPercent(x)

Beitrag von Frank Ranis »

Hallo wp_xyz ,

vielen Dank für deine Hilfe.

Die Zoomfunktionen per TChartToolset kenne ich und nutze sie regelmäßig.

Mein Problem war halt eine Steuerungs-Möglichkeit von außen.

Habe deine Zoom-Funktion getestet und eingebaut , funzt prima.

Wäre es nicht schick , wenn man für zukünftige TCHart-Versionen die Methode tchart.ZoomPercent(x) generell einbaut?

Das würde es dann wieder etwas kompatibler machen.

Gruß

Frank
www.flz-vortex.de

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

Re: Benötige Funktion tchart.ZoomPercent(x)

Beitrag von wp_xyz »

Frank Ranis hat geschrieben:Wäre es nicht schick , wenn man für zukünftige TCHart-Versionen die Methode tchart.ZoomPercent(x) generell einbaut?

Das würde es dann wieder etwas kompatibler machen.

Ich habe jetzt in der Unit TAChartTeeChart zwei Helper-Routinen ZoomPercent und UndoZoom eingefügt, die diese Methoden im TChart zur Verfügung stellen, wenn TAChartTeeChart in der Uses-Zeile enthalten ist. Da TAChart zu TeeChart ohnehin nicht sehr kompatibel ist, finde ich es nicht angebracht, diese Methoden direkt in TChart einzubauen, die recht naheliegend direkten TChart-Methoden entsprechen.

Im Unterschied zu meiner hier im Forum präsentierten Prozedur wird der Zoom-Faktor als Prozentsatz eingegeben (105), nicht als Faktor (1.05).

Hast du ZoomRect schon einmal angewendet? Das benötigt das Zoom-Rechteck in Pixel-Koordinaten, und das Beispiel der TeeChart-Hilfe erscheint mir falsch, da sich die als Rechteck verwendeten Koordinaten auf das gesamte Control zu beziehen scheinen, nicht aber auf den durch die Achsen aufgespannten Bereich:

Code: Alles auswählen

//Zoom in example:
Chart1.ZoomRect( Rect( 5,5,Chart1.Width-5,Chart1.Height-5 ) );
 
//Zoom out example:
Chart1.ZoomRect( Rect( -5,-5,Chart1.Width+5,Chart1.Height+5 ) );
 

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

Re: Benötige Funktion tchart.ZoomPercent(x)

Beitrag von Frank Ranis »

Hallo wp_xyz ,

wp_xyz hat geschrieben:
Ich habe jetzt in der Unit TAChartTeeChart zwei Helper-Routinen ZoomPercent und UndoZoom eingefügt, die diese Methoden im

TChart zur Verfügung stellen, wenn TAChartTeeChart in der Uses-Zeile enthalten ist. Da TAChart zu TeeChart ohnehin nicht sehr

kompatibel ist, finde ich es nicht angebracht, diese Methoden direkt in TChart einzubauen, die recht naheliegend direkten

TChart-Methoden entsprechen.


Das ist super.
Kann man deine aktuelle Unit 'TAChartTeeChart' irgendwo herunterladen ?
Ist das dann in Zukunft Standard im Lazarus-Paket ?

wp_xyz hat geschrieben:Hast du ZoomRect schon einmal angewendet? Das benötigt das Zoom-Rechteck in Pixel-Koordinaten, und das Beispiel der TeeChart-Hilfe erscheint mir falsch, da sich die als Rechteck verwendeten Koordinaten auf das gesamte Control zu beziehen scheinen, nicht aber auf den durch die Achsen aufgespannten Bereich:
CODE: ALLES AUSWÄHLEN
//Zoom in example:
Chart1.ZoomRect( Rect( 5,5,Chart1.Width-5,Chart1.Height-5 ) );
 
//Zoom out example:
Chart1.ZoomRect( Rect( -5,-5,Chart1.Width+5,Chart1.Height+5 ) );
 


Habe ich versucht , mein Compiler meckert aber , kennt er nicht .
Aktuell benutze ich immer nocht 'Lazarus 1.8.0 r56594 FPC 3.0.4 i386-win32-win32/win64' .

Gruß

Frank
www.flz-vortex.de

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

Re: Benötige Funktion tchart.ZoomPercent(x)

Beitrag von wp_xyz »

Frank Ranis hat geschrieben:Hallo wp_xyz ,
Kann man deine aktuelle Unit 'TAChartTeeChart' irgendwo herunterladen ?
Ist das dann in Zukunft Standard im Lazarus-Paket ?

TAChartTeeChart gibt es schon lange. Die neue Version ist im Trunk enthalten und wird in v2.2 offiziell enthalten sein (ein neues Feature, daher kommt es noch nicht in die v2.0). Du kannst mal versuchen, die aktuelle Version von TAChartTeeChart unter https://svn.freepascal.org/cgi-bin/view ... ot=lazarus herunterzuladen und in dein Lazarus-Verzeichnis components/tachart zu kopieren (vorher ein Backup der alten Datei machen) und damit die IDE neu zu kompilieren. Ich kann nicht versprechen, ob sich die neue Version mit Laz 1.8 verträgt.

Frank Ranis hat geschrieben:Hallo wp_xyz ,
wp_xyz hat geschrieben:Hast du ZoomRect schon einmal angewendet? [...] 

Habe ich versucht , mein Compiler meckert aber , kennt er nicht .

Da hast du mich falsch verstanden. Ich meinte: ausprobiert mit Delphi, nicht mit Lazarus. In Lazarus' TAChart gibt es ZoomRect nicht, weil die übergebenen Parameter für mich unsinnig sind.

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

Re: Benötige Funktion tchart.ZoomPercent(x)

Beitrag von Frank Ranis »

Hallo wp_xyz,

wp_xyz hat geschrieben:Da hast du mich falsch verstanden. Ich meinte: ausprobiert mit Delphi, nicht mit Lazarus.
In Lazarus' TAChart gibt es ZoomRect nicht, weil die übergebenen Parameter für mich unsinnig sind.


Ja , falsch verstanden.
ZoomRect brauch dann aber auch nicht mehr , weil ich ja vom Delphi weg zum LAZ gewechselt bin.

Ich möchte ja mit all meinen alten Projekten umziehen und da im Delphi-Prog das chart.zoompercent(x) benutzt wurde , welches

ja dort prima funzte , war das halt beim Portieren aufgefallen .

wp_xyz hat geschrieben:TAChartTeeChart gibt es schon lange.
Die neue Version ist im Trunk enthalten und wird in v2.2 offiziell enthalten sein (ein neues Feature, daher kommt es noch nicht in

die v2.0). Du kannst mal versuchen, die aktuelle Version von TAChartTeeChart unter https://svn.freepascal.org/cgi-bin/view ...

ot=lazarus herunterzuladen und in dein Lazarus-Verzeichnis components/tachart zu kopieren (vorher ein Backup der alten Datei

machen) und damit die IDE neu zu kompilieren. Ich kann nicht versprechen, ob sich die neue Version mit Laz 1.8 verträgt.


Genau das habe ich jetzt gemacht.
1) Unit TAChartTeeChart von

https://svn.freepascal.org/cgi-bin/view ... ot=lazarus

gesaugt.
2) Die alte Unit TAChartTeeChart.pas in TAChartTeeChart_alt.pas umbenannt
3) Deine aktuelle TAChartTeeChart.pas eingefügt und Lazarus neu kompiliert.
4) Im Programm , unter Uses die TAChartTeeChart eingetragen .

Es funzt ohne Macken (abwärtskompatibel , genial , genial) , ich bin begeistert , Du bist ein Held .

Code: Alles auswählen

procedure TForm1.Button5Click(Sender: TObject);
begin
 Chart1.ZoomPercent(105);
end;
 
procedure TForm1.Button6Click(Sender: TObject);
begin
 Chart1.ZoomPercent(95);
end;
 
procedure TForm1.Button7Click(Sender: TObject);
begin
 chart1.UndoZoom;
end;         
 


Gruß

Frank
www.flz-vortex.de

Antworten