lazarus/components/tachart/demo/runtime/plotunit/main.pas

133 lines
3.8 KiB
ObjectPascal

unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Types, Forms, Controls,
Graphics, Dialogs, StdCtrls, ExtCtrls,
TAGraph, TACustomSeries, TASeries, TAFuncSeries;
type
{ TMainForm }
TMainForm = class(TForm)
Bevel1: TBevel;
BtnAdd: TButton;
BtnClear: TButton;
Chart: TChart;
CbPlotTypes: TComboBox;
procedure BtnAddClick(Sender: TObject);
procedure BtnClearClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
uses
TATypes, uplot;
const
PALETTE: array[0..7] of TColor = (
clRed, clGreen, clBlue, clOlive, clFuchsia, clAqua, clBlack, clLime);
SYMBOLS: array[0..5] of TSeriesPointerStyle = (
psCircle, psRectangle, psTriangle, psDiamond, psDownTriangle, psFullStar);
LINESTYLES: array[0..4] of TPenStyle = (
psSolid, psDot, psDash, psDashDot, psDashDotDot);
{ TMainForm }
procedure CreateData(ACount: Integer; var x, y: TDoubleDynArray);
const
MIN = -10;
MAX = 10;
var
i: Integer;
begin
SetLength(x, ACount);
SetLength(y, ACount);
for i:=0 to ACount-1 do
begin
x[i] := MIN + (MAX - MIN) * i / (ACount - 1);
y[i] := random;
end;
end;
procedure TMainForm.BtnAddClick(Sender: TObject);
var
x: TDoubleDynArray = nil;
y: TDoubleDynArray = nil;
colorIndex: Integer;
symbolIndex: Integer;
linestyleIndex: Integer;
plottype: Integer;
begin
if Chart.SeriesCount = 0 then
PrepareChart(Chart, 'x axis', 'y axis', 'TAChart Plot Demo', 'Written by Lazarus');
CreateData(Random(20)+3, x, y);
colorIndex := Chart.SeriesCount mod Length(PALETTE);
symbolIndex := Chart.SeriesCount mod Length(SYMBOLS);
lineStyleIndex := Chart.SeriesCount mod Length(LINESTYLES);
plottype := PtrInt(CbPlotTypes.Items.Objects[CbPlotTypes.ItemIndex]);
Plot(Chart,
x, y,
'Series #'+IntToStr(Chart.SeriesCount+1),
PALETTE[colorIndex],
SYMBOLS[symbolIndex],
LINESTYLES[linestyleIndex],
TPlotType(abs(plottype)),
plottype < 0 // with symbols if value is negative
);
end;
procedure TMainForm.BtnClearClick(Sender: TObject);
begin
Chart.ClearSeries;
Chart.Legend.Visible := false;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Chart.Visible := false;
CbPlotTypes.Items.Clear;
// Encode plot types into the object of the CbPlotTypes combobox:
// - The ord value of the plot type is cast to an object if the series is
// without symbols.
// - The negative ord value of the plot type is cast if an object if the
// series is with symbols.
CbPlotTypes.Items.AddObject('Symbols only', TObject(PtrInt(ptSymbolsOnly)));
CbPlotTypes.Items.AddObject('Line segments w/ symbols', TObject(-PtrInt(ptSegments)));
CbPlotTypes.Items.AddObject('Line segments w/o symbols', TObject(PtrInt(ptSegments)));
CbPlotTypes.Items.AddObject('Cubic spline w/ symbols', TObject(-PtrInt(ptCubicSpline)));
CbPlotTypes.Items.AddObject('Cubic spline w/o symbols', TObject(PtrInt(ptCubicSpline)));
CbPlotTypes.Items.AddObject('B-Spline w/ symbols', TObject(-PtrInt(ptBSpline)));
CbPlotTypes.Items.AddObject('B-Spline w/o symbols', TObject(PtrInt(ptBSpline)));
CbPlotTypes.Items.AddObject('Linear fit w/ symbols', TObject(-PtrInt(ptLinearfit)));
CbPlotTypes.Items.AddObject('Linear fit w/o symbols', TObject(PtrInt(ptLinearFit)));
CbPlotTypes.Items.AddObject('Parabolic fit w/symbols', TObject(-PtrInt(ptSquareFit)));
CbPlotTypes.Items.AddObject('Parabolic fit w/o symbols)', TObject(PtrInt(ptSquareFit)));
CbPlotTypes.Items.AddObject('Area (no symbols)', TObject(PtrInt(ptArea)));
CbPlotTypes.Items.AddObject('Bars (horizontal)', TObject(PtrInt(ptBars)));
CbPlotTypes.Items.AddObject('Columns (vertical)', TObject(PtrInt(ptColumns)));
CbPlotTypes.ItemIndex := 1;
end;
end.