basierend auf die Multi-Pane und Runtime TChart Demos in einer Standardinstallation (Lazarus 1.8, Windws7 64bit)
möchte ich jetzt eine (fast) beliebige (naja maximal 25) Anzahl Y-Achsen übereinander in einem Chart darstellen.
Das soll/kann natürlich nur zur Laufzeit (bei Button1Cklick) passiern.
Probleme habe ich dabei wahrscheinlich mit der AxisList der TChart Komponente.
Im Anhang ein Beispiel, wie ich es mir vorstellen würde.
Leider klappt der Aufbau des Charts nach Button1 Click nicht so wie gewünscht.
Im Voraus vielen Dank für jede Hilfe/Unterstützung.
Gruß
Arne
Sorry, das Anhängen scheint nicht zu klappen, dann versuche ich es so:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
TAGraph, TASeries, TATransformations, TAChartAxis, TAChartAxisUtils;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure PlotSin(cnt: integer);
private
public
end;
var
Form1: TForm1;
Chart1: TChart;
Line: array[1..50] of TLineSeries;
Axis: array[0..50] of TChartAxis; // one more for x/bottom axis
MyAxisList: TChartAxisList;
ChartAxisTransformations: array[1..50] of TChartAxisTransformations;
AutoScaleAxisTransform: array[1..50] of TAutoScaleAxisTransform;
x, y: array[0..1000] of Double;
seriescount: integer = 0;
minAxisVal: integer = 0;
maxAxisVal: integer = 0;
delta: integer = 2;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.PlotSin(cnt: integer);
var
i: integer;
min: double;
max: double;
begin
min := y[0];
max := y[0];
Line[cnt].SeriesColor := clRed;
for i := low(x) to high(y) do
begin
x[i] := 0.01 * i + seriescount;
y[i] := sin(x[i]);
if y[i] < min then
min := y[i];
if y[i] > max then
max := y[i];
Line[cnt].AddXY(x[i], y[i]);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if seriescount = 0 then
begin
Chart1 := TChart.Create(Form1);
Chart1.Align := alClient;
Chart1.Anchors := [akTop, akLeft,akRight, akBottom];
Chart1.Visible := true;
Chart1.AxisVisible := true;
Chart1.Enabled := true;
Chart1.Height := 450;
Chart1.Width := 700;
MyAxisList := TChartAxisList.Create(Chart1);
Axis[0] := TChartAxis.Create(MyAxisList);
Axis[0].Alignment := calBottom;
Axis[0].Title.Caption := 'Bottom axis';
Axis[0].Title.Visible := true;
Axis[0].Group := 0;
Chart1.BottomAxis := Axis[0];
end
else
begin
maxAxisVal := maxAxisVal + delta;
Axis[seriescount] := TChartAxis.Create(MyAxisList);
Axis[seriescount].Alignment := calBottom;
Axis[seriescount].Title.Caption := IntToStr(seriescount) + '. axis';
Axis[seriescount].Title.LabelFont.Orientation := 900;
Axis[seriescount].Title.Visible := true;
Axis[seriescount].Title.PositionOnMarks := true;
Axis[seriescount].Group := 1;
Axis[seriescount].Marks.Range.Max := 50;
Axis[seriescount].Marks.Range.Min := 0;
Axis[seriescount].Marks.Range.UseMax := True;
Axis[seriescount].Marks.Range.UseMin := True;
if seriescount = 1 then
begin
Chart1.BottomAxis := Axis[0];
Chart1.LeftAxis := Axis[1];
end;
Line[seriescount] := TLineSeries.Create(Chart1);
Line[seriescount].AxisIndexY := seriescount;
Line[seriescount].AxisIndexX := 0;
ChartAxisTransformations[seriescount] := TChartAxisTransformations.Create(Chart1);
Axis[seriescount].Transformations := ChartAxisTransformations[seriescount];
AutoScaleAxisTransform[seriescount] := TAutoScaleAxisTransform.Create(Axis[seriescount].Transformations);
AutoScaleAxisTransform[seriescount].MinValue := MinAxisVal;
AutoScaleAxisTransform[seriescount].MaxValue := MaxAxisVal;
minAxisVal := maxAxisVal;
AutoScaleAxisTransform[seriescount].Enabled := true;
Chart1.AxisList := MyAxisList;
Chart1.AddSeries(Line[seriescount]);
PlotSin(seriescount);
end;
inc(seriescount);
end;
end.
und
Code: Alles auswählen
object Form1: TForm1
Left = 663
Height = 462
Top = 376
Width = 700
Caption = 'Form1'
ClientHeight = 462
ClientWidth = 700
LCLVersion = '1.8.0.6'
object Panel1: TPanel
Left = 0
Height = 28
Top = 0
Width = 700
Align = alTop
Caption = 'Panel1'
ClientHeight = 28
ClientWidth = 700
TabOrder = 0
object Button1: TButton
Left = 12
Height = 25
Top = 1
Width = 107
Caption = 'Button1'
OnClick = Button1Click
TabOrder = 0
end
end
end