[gelöst] TChart: zusätzliche Achsen ohne Objektinspektor

Rund um die LCL und andere Komponenten
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

[gelöst] TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

Hallo,

ich muss in einem Programm zusätzliche Achsen in einem TChart erstellen. Es gibt zwar:

Code: Alles auswählen

Chart.AxisList.Add;
aber bei der Ausführung wird dies mit einem

Code: Alles auswählen

External SIGSEGV
belohnt.

Wer kann mir weiterhelfen?

Gruß, Linkat
Zuletzt geändert von Linkat am Do 27. Feb 2014, 11:34, insgesamt 2-mal geändert.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von wp_xyz »

Schau dir mal die Tutorials http://wiki.lazarus.freepascal.org/TACh ... _one_Chart und http://wiki.lazarus.freepascal.org/TACh ... is,_Legend an - da geht es um zusätzliche y-Achsen.

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

Hallo wp_xyz,

In den beiden Tutorials ist beschrieben, wie man Achsen mit dem Objektinspektor erzeugt. Ich muss die Achsen aber ohne Objektinspektor im laufenden Programm erzeugen.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von wp_xyz »

Dein Ansatz ist eigentlich naheliegend, aber wahrscheinlich wird dadurch der Benachrichtigungsmechanismus ausgelöst, wobei aber der zugehörige Chart so noch nicht bekannt ist.

Im Constructor von TChart findet man den Hinweis auf den richtigen Ansatz, und so funktioniert es dann:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var
  axis : TChartAxis;
begin
  axis := TChartAxis.Create(Chart1.AxisList);
  axis.Alignment := calRight;
end;  
 

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

Hallo wp_xyz,
das sieht sehr vernünftig aus. Werde ich morgen ausprobieren.

Vielen Dank.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

Guten Morgen allerseits und speziell wp_xyz,
der Teufel steckt doch im Details.
Habe nun Deinen Ansatz (kleinere Änderungen mussten angebracht werden) versucht umzusetzen, aber mit mäßigem Erfolg.

Code: Alles auswählen

unit TestU;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, TAGraph, TATransformations, TASources, Forms,
  Controls, Graphics, Dialogs;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    //Chart1: TChart;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var chart     :TChart;
    axis      :TChartAxisTransformations;
begin
  chart:=TChart.Create(Form1);
  chart.Parent:=Form1;
  chart.Title.Visible:=True;
  axis:=TChartAxisTransformations.Create(chart);
 
Variante 1 -->  axis.alignment:=calRight; //Error: identifier idents no member "alignment"
Variante 2 -->  chart.AxisList.Axes[2].Alignment:=calRight; //Error: identifier not found "calRight"
 
end;
end.
 
Wo liegt die Lösung des Problems?

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von wp_xyz »

Warum jetzt Transformations? Ich dachte, du willst eine Achse erzeugen? Schau dir doch bitte meinen Code nochmals genau an...

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

weil mit:

Code: Alles auswählen

axis      :TChartAxis
der Fehler: Error: identifier not found "TChartAxis" generiert wird.

Vielleicht fehlt noch eine bestimmte Unit?
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

so jetzt habe ich die Unit TAChartAxis in die uses Klausel eingefügt. Jetzt wird der Typ TChartAxis erkannt, und eine zweite y-Achse wird auch gezeichnet (aber links).
Aber immer noch wird:

Code: Alles auswählen

axis.Alignment:=calRight; 
bzw.

Code: Alles auswählen

chart.AxisList.Axes[2].Alignment:=calRight;
mit dem Fehler:

Code: Alles auswählen

Error: identifier not found "calRight"
quittiert.

Fehlt noch eine andere Unit?
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

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

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von wp_xyz »

Code: Alles auswählen

 
uses
  ..., TAChartAxis, TAChartAxisUtils, ...
 
procedure TForm1.FormCreate(Sender: TObject);
var 
  chart    :TChart;          // Gefahr: Der Chart existiert damit nur während "FormCreate"!
  axis     :TChartAxis;  
begin
  chart:=TChart.Create(Form1);   
  chart.Parent:=Form1;
  chart.Title.Visible:=True;
  axis:=TChartAxis.Create(chart.AxisList);  // Der Owner der ChartAxis ist die AxisList, nicht der Chart!
  axis.Alignment := calRight;
end;
 
Um rauszufinden, welche Units benötigt werden, klicke ich mit der linken Maustaste und gedrücktem CTRL auf den Bezeichner "TChart". Damit wird die Unit geöffnet, in der "TChart" deklariert wird. Suche hier mit den Bezeichner "TChartAxis" und klicke wieder mit CTRL drauf. Nun wird die Unit TAChartAxis geöffnet --> also brauchst du TAChartAxis in "uses". Nun suchst du in TAChartAxis den Bezeichner "calRight". Klick mit CTRL öffnet "TAChartAxisUtils" --> uses TAChartUtils.

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: TChart: zusätzliche Achsen ohne Objektinspektor

Beitrag von Linkat »

Hallo wp_xyz,

vielen Dank für deine schnelle Hilfe. Der Tipp, wie man sich durch die Units hangeln kann ist hervorragend.

Nach dem Einfügen der Unit

Code: Alles auswählen

TAChartAxisUtils
ist die Achse da, wo sie hin soll.

Das Beispiel war ja nur für den Test. In meinem Projekt sind die Chart-Variablen natürlich global deklariert.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Antworten