lazarus/components/tachart/demo/labels/Main.pas
2012-09-16 06:12:13 +00:00

152 lines
4.0 KiB
ObjectPascal

unit Main;
{$mode objfpc}{$H+}
interface
uses
Classes, ComCtrls, ExtCtrls, Spin, StdCtrls, SysUtils, FileUtil, Forms, Types,
Controls, Graphics, Dialogs, TAGraph, TASeries, TASources, TAChartAxis,
TAChartUtils, TATextElements;
type
{ TForm1 }
TForm1 = class(TForm)
Chart1: TChart;
Chart1BarSeries1: TBarSeries;
cbHideOverlapping: TCheckBox;
ChartMulti: TChart;
ChartMultiLineSeries1: TLineSeries;
cbShape: TComboBox;
gbAngles: TGroupBox;
lblAxisAngle: TLabel;
lblSeriesAngle: TLabel;
lblTitleAngle: TLabel;
lblCalloutAngle: TLabel;
pcMain: TPageControl;
pnlControls: TPanel;
RandomChartSource1: TRandomChartSource;
seAxisAngle: TSpinEdit;
seSeriesAngle: TSpinEdit;
seTitleAngle: TSpinEdit;
Multiline: TTabSheet;
seCalloutAngle: TSpinEdit;
tsBar: TTabSheet;
procedure cbHideOverlappingChange(Sender: TObject);
procedure cbShapeChange(Sender: TObject);
procedure Chart1BarSeries1MarksGetShape(ASender: TChartTextElement;
const ABoundingBox: TRect; var APolygon: TPointArray);
procedure ChartMultiAxisList1MarkToText(var AText: String; AMark: Double);
procedure seAxisAngleChange(Sender: TObject);
procedure seCalloutAngleChange(Sender: TObject);
procedure seSeriesAngleChange(Sender: TObject);
procedure seTitleAngleChange(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
uses
Math, TAGeometry;
{ TForm1 }
procedure TForm1.cbHideOverlappingChange(Sender: TObject);
var
op: TChartMarksOverlapPolicy;
begin
if cbHideOverlapping.Checked then
op := opHideNeighbour
else
op := opIgnore;
Chart1.LeftAxis.Marks.OverlapPolicy := op;
Chart1.BottomAxis.Marks.OverlapPolicy := op;
ChartMulti.LeftAxis.Marks.OverlapPolicy := op;
ChartMulti.BottomAxis.Marks.OverlapPolicy := op;
Chart1BarSeries1.Marks.OverlapPolicy := op;
end;
procedure TForm1.cbShapeChange(Sender: TObject);
var
s: TChartLabelShape;
begin
s := TChartLabelShape(cbShape.ItemIndex);
Chart1BarSeries1.Marks.Shape := s;
ChartMulti.LeftAxis.Marks.Shape := s;
ChartMulti.BottomAxis.Marks.Shape := s;
with Chart1BarSeries1.Marks do
if s = clsUserDefined then
OnGetShape := @Chart1BarSeries1MarksGetShape
else
OnGetShape := nil;
end;
procedure TForm1.Chart1BarSeries1MarksGetShape(
ASender: TChartTextElement; const ABoundingBox: TRect;
var APolygon: TPointArray);
const
N = 24;
var
i: Integer;
a, b, k: Double;
cp: TPoint;
s, c: Extended;
begin
Unused(ASender);
SetLength(APolygon, N);
with ABoundingBox do begin
a := (Right - Left) / 2;
b := (Bottom - Top) / 2;
end;
cp := CenterPoint(ABoundingBox);
for i := 0 to High(APolygon) do begin
SinCos(i * 2 * Pi / N, s, c);
k := (i mod 2) * 0.5 + 1;
APolygon[i] := cp + Point(Round(a * c * k), Round(b * s * k));
end;
end;
procedure TForm1.ChartMultiAxisList1MarkToText(
var AText: String; AMark: Double);
begin
AText += Format(#13#10'%.9g', [AMark * 2]);
end;
procedure TForm1.seAxisAngleChange(Sender: TObject);
begin
Chart1.LeftAxis.Marks.LabelFont.Orientation := 900 + seAxisAngle.Value * 10;
Chart1.BottomAxis.Marks.LabelFont.Orientation := seAxisAngle.Value * 10;
ChartMulti.LeftAxis.Marks.LabelFont.Orientation := 900 + seAxisAngle.Value * 10;
ChartMulti.BottomAxis.Marks.LabelFont.Orientation := seAxisAngle.Value * 10;
end;
procedure TForm1.seCalloutAngleChange(Sender: TObject);
begin
with Chart1BarSeries1.Marks do begin
CalloutAngle := seCalloutAngle.Value * 10;
LinkPen.Visible := seCalloutAngle.Value = 0;
Arrow.Visible := seCalloutAngle.Value = 0;
end;
end;
procedure TForm1.seSeriesAngleChange(Sender: TObject);
begin
Chart1BarSeries1.Marks.LabelFont.Orientation := seSeriesAngle.Value * 10;
end;
procedure TForm1.seTitleAngleChange(Sender: TObject);
begin
Chart1.LeftAxis.Title.LabelFont.Orientation := 900 + seTitleAngle.Value * 10;
Chart1.BottomAxis.Title.LabelFont.Orientation := seTitleAngle.Value * 10;
ChartMulti.Title.Font.Orientation := seTitleAngle.Value * 10;
end;
end.