mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-08 16:38:17 +02:00
TAChart: Split the two area demos off into separate frames.
This commit is contained in:
parent
5584457e13
commit
c42495ffab
@ -36,7 +36,7 @@
|
||||
<PackageName Value="LCL"/>
|
||||
</Item2>
|
||||
</RequiredPackages>
|
||||
<Units Count="2">
|
||||
<Units Count="4">
|
||||
<Unit0>
|
||||
<Filename Value="areaseriesdemo.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
@ -48,6 +48,20 @@
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
</Unit1>
|
||||
<Unit2>
|
||||
<Filename Value="frmerrorrange.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="ErrorRangeFrame"/>
|
||||
<ResourceBaseClass Value="Frame"/>
|
||||
<UnitName Value="frmErrorRange"/>
|
||||
</Unit2>
|
||||
<Unit3>
|
||||
<Filename Value="frmgeneral.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="GeneralFrame"/>
|
||||
<ResourceBaseClass Value="Frame"/>
|
||||
<UnitName Value="frmGeneral"/>
|
||||
</Unit3>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
|
@ -7,7 +7,7 @@ uses
|
||||
cthreads,
|
||||
{$ENDIF}{$ENDIF}
|
||||
Interfaces, // this includes the LCL widgetset
|
||||
Forms, main, tachartlazaruspkg
|
||||
Forms, main
|
||||
{ you can add units after this };
|
||||
|
||||
{$R *.res}
|
||||
|
118
components/tachart/demo/area/frmerrorrange.lfm
Normal file
118
components/tachart/demo/area/frmerrorrange.lfm
Normal file
@ -0,0 +1,118 @@
|
||||
object ErrorRangeFrame: TErrorRangeFrame
|
||||
Left = 0
|
||||
Height = 264
|
||||
Top = 0
|
||||
Width = 417
|
||||
ClientHeight = 264
|
||||
ClientWidth = 417
|
||||
TabOrder = 0
|
||||
DesignLeft = 587
|
||||
DesignTop = 268
|
||||
object Label1: TLabel
|
||||
Left = 8
|
||||
Height = 15
|
||||
Top = 8
|
||||
Width = 401
|
||||
Align = alTop
|
||||
Alignment = taCenter
|
||||
BorderSpacing.Around = 8
|
||||
Caption = 'This functionality requires at least Lazarus version 1.9'
|
||||
Visible = False
|
||||
end
|
||||
object Chart: TChart
|
||||
Left = 0
|
||||
Height = 233
|
||||
Top = 31
|
||||
Width = 417
|
||||
AxisList = <
|
||||
item
|
||||
Grid.Color = clSilver
|
||||
Grid.Style = psSolid
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelFont.Orientation = 900
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end
|
||||
item
|
||||
Grid.Color = clSilver
|
||||
Grid.Style = psSolid
|
||||
Alignment = calBottom
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end>
|
||||
BackColor = clWhite
|
||||
Foot.Brush.Color = clBtnFace
|
||||
Foot.Font.Color = clBlue
|
||||
Legend.Visible = True
|
||||
Title.Brush.Color = clBtnFace
|
||||
Title.Font.Color = clBlue
|
||||
Title.Text.Strings = (
|
||||
'TAChart'
|
||||
)
|
||||
Align = alClient
|
||||
Color = clDefault
|
||||
object ChartAreaSeries1: TAreaSeries
|
||||
Legend.Visible = False
|
||||
Transparency = 180
|
||||
AreaBrush.Color = clRed
|
||||
AreaContourPen.Style = psClear
|
||||
AreaLinesPen.Style = psClear
|
||||
Banded = True
|
||||
Source = ChartSourceArea1
|
||||
Stacked = False
|
||||
end
|
||||
object ChartLineSeries1: TLineSeries
|
||||
Title = 'sin data'
|
||||
LinePen.Color = clRed
|
||||
LinePen.Width = 3
|
||||
LineType = ltNone
|
||||
Pointer.Brush.Color = clRed
|
||||
Pointer.HorizSize = 5
|
||||
Pointer.Style = psCircle
|
||||
Pointer.VertSize = 5
|
||||
Pointer.Visible = True
|
||||
ShowPoints = True
|
||||
Source = ChartSourceLine1
|
||||
end
|
||||
object ChartAreaSeries2: TAreaSeries
|
||||
Legend.Visible = False
|
||||
Transparency = 180
|
||||
AreaBrush.Color = clBlue
|
||||
AreaLinesPen.Style = psClear
|
||||
Banded = True
|
||||
Source = ChartSourceArea2
|
||||
end
|
||||
object ChartLineSeries2: TLineSeries
|
||||
Title = 'cos data'
|
||||
LinePen.Color = clBlue
|
||||
Pointer.Brush.Color = clBlue
|
||||
Pointer.HorizSize = 5
|
||||
Pointer.Style = psCircle
|
||||
Pointer.VertSize = 5
|
||||
Pointer.Visible = True
|
||||
ShowPoints = True
|
||||
Source = ChartSourceLine2
|
||||
end
|
||||
end
|
||||
object ChartSourceLine1: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceLine1GetChartDataItem
|
||||
Left = 82
|
||||
Top = 62
|
||||
end
|
||||
object ChartSourceArea1: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceArea1GetChartDataItem
|
||||
Left = 240
|
||||
Top = 62
|
||||
end
|
||||
object ChartSourceLine2: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceLine2GetChartDataItem
|
||||
Left = 82
|
||||
Top = 119
|
||||
end
|
||||
object ChartSourceArea2: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceArea2GetChartDataItem
|
||||
Left = 240
|
||||
Top = 119
|
||||
end
|
||||
end
|
128
components/tachart/demo/area/frmerrorrange.pas
Normal file
128
components/tachart/demo/area/frmerrorrange.pas
Normal file
@ -0,0 +1,128 @@
|
||||
unit frmErrorRange;
|
||||
|
||||
{$mode ObjFPC}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Math,
|
||||
Forms, Controls, StdCtrls,
|
||||
TAGraph, TACustomSource, TASources, TASeries;
|
||||
|
||||
type
|
||||
TErrorRangeFrame = class(TFrame)
|
||||
Chart: TChart;
|
||||
ChartAreaSeries1: TAreaSeries;
|
||||
ChartAreaSeries2: TAreaSeries;
|
||||
ChartLineSeries1: TLineSeries;
|
||||
ChartLineSeries2: TLineSeries;
|
||||
Label1: TLabel;
|
||||
ChartSourceLine1: TUserDefinedChartSource;
|
||||
ChartSourceArea1: TUserDefinedChartSource;
|
||||
ChartSourceLine2: TUserDefinedChartSource;
|
||||
ChartSourceArea2: TUserDefinedChartSource;
|
||||
procedure ChartSourceArea1GetChartDataItem(ASource: TUserDefinedChartSource;
|
||||
AIndex: Integer; var AItem: TChartDataItem);
|
||||
procedure ChartSourceArea2GetChartDataItem(ASource: TUserDefinedChartSource;
|
||||
AIndex: Integer; var AItem: TChartDataItem);
|
||||
procedure ChartSourceLine1GetChartDataItem(ASource: TUserDefinedChartSource;
|
||||
AIndex: Integer; var AItem: TChartDataItem);
|
||||
procedure ChartSourceLine2GetChartDataItem(ASource: TUserDefinedChartSource;
|
||||
AIndex: Integer; var AItem: TChartDataItem);
|
||||
|
||||
private
|
||||
procedure PopulateSeries;
|
||||
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
type
|
||||
TData = record
|
||||
x, y, dy: Double;
|
||||
end;
|
||||
TDataArray = array of TData;
|
||||
|
||||
var
|
||||
Data1, Data2: TDataArray;
|
||||
|
||||
constructor TErrorRangeFrame.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited;
|
||||
PopulateSeries;
|
||||
end;
|
||||
|
||||
procedure TErrorRangeFrame.ChartSourceArea1GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data1[AIndex].x;
|
||||
AItem.Y := Data1[AIndex].y - Data1[AIndex].dy;
|
||||
AItem.YList[0] := Data1[AIndex].y + Data1[AIndex].dy;
|
||||
end;
|
||||
|
||||
procedure TErrorRangeFrame.ChartSourceArea2GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data2[AIndex].x;
|
||||
AItem.Y := Data2[AIndex].y;
|
||||
AItem.YList[0] := -Data2[AIndex].dy;
|
||||
AItem.YList[1] := 2*Data2[AIndex].dy;
|
||||
end;
|
||||
|
||||
procedure TErrorRangeFrame.ChartSourceLine1GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data1[AIndex].X;
|
||||
AItem.Y := Data1[AIndex].Y;
|
||||
end;
|
||||
|
||||
procedure TErrorRangeFrame.ChartSourceLine2GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data2[AIndex].X;
|
||||
AItem.Y := Data2[AIndex].Y;
|
||||
end;
|
||||
|
||||
procedure TErrorRangeFrame.PopulateSeries;
|
||||
const
|
||||
N1 = 20;
|
||||
N2 = 25;
|
||||
XMIN = -10;
|
||||
XMAX = +10;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
SetLength(Data1, N1);
|
||||
for i:=0 to N1-1 do begin
|
||||
Data1[i].x := XMIN + (XMAX - XMIN) * i / (N1-1);
|
||||
Data1[i].y := sin(Data1[i].x * 0.5);
|
||||
Data1[i].dy := randg(0.2, 0.05);
|
||||
end;
|
||||
ChartSourceLine1.YCount := 1;
|
||||
ChartSourceLine1.PointsNumber := N1;
|
||||
ChartSourceArea1.YCount := 2;
|
||||
ChartSourceArea1.PointsNumber := N1;
|
||||
|
||||
SetLength(Data2, N2);
|
||||
for i:=0 to N2-1 do begin
|
||||
Data2[i].x := XMIN + (XMAX - XMIN) * i / (N2-1);
|
||||
Data2[i].y := cos(Data2[i].x); // + randg(0, 0.2);
|
||||
Data2[i].dy := randg(0.2, 0.05);
|
||||
end;
|
||||
ChartSourceLine2.YCount := 1;
|
||||
ChartSourceLine2.PointsNumber := N2;
|
||||
ChartSourceArea2.YCount := 3;
|
||||
ChartSourceArea2.PointsNumber := N2;
|
||||
|
||||
ChartAreaSeries1.Banded := true;
|
||||
ChartAreaSeries2.Banded := true;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
352
components/tachart/demo/area/frmgeneral.lfm
Normal file
352
components/tachart/demo/area/frmgeneral.lfm
Normal file
@ -0,0 +1,352 @@
|
||||
object GeneralFrame: TGeneralFrame
|
||||
Left = 0
|
||||
Height = 369
|
||||
Top = 0
|
||||
Width = 629
|
||||
ClientHeight = 369
|
||||
ClientWidth = 629
|
||||
TabOrder = 0
|
||||
DesignLeft = 602
|
||||
DesignTop = 302
|
||||
object ParamsPanel: TPanel
|
||||
Left = 0
|
||||
Height = 87
|
||||
Top = 282
|
||||
Width = 629
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 87
|
||||
ClientWidth = 629
|
||||
Color = clNone
|
||||
ParentBackground = False
|
||||
ParentColor = False
|
||||
TabOrder = 0
|
||||
object CbRotated: TCheckBox
|
||||
AnchorSideLeft.Control = CbBanded
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 82
|
||||
Height = 19
|
||||
Top = 8
|
||||
Width = 59
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Rotated'
|
||||
TabOrder = 0
|
||||
OnChange = CbRotatedChange
|
||||
end
|
||||
object Cb3D: TCheckBox
|
||||
AnchorSideLeft.Control = CbRotated
|
||||
AnchorSideTop.Control = CbBanded
|
||||
Left = 82
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 32
|
||||
Caption = '3D'
|
||||
TabOrder = 1
|
||||
OnChange = Cb3DChange
|
||||
end
|
||||
object CbUseZeroLevel: TCheckBox
|
||||
AnchorSideLeft.Control = CbRotated
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 157
|
||||
Height = 19
|
||||
Top = 8
|
||||
Width = 89
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Use zero level'
|
||||
TabOrder = 2
|
||||
OnChange = CbUseZeroLevelChange
|
||||
end
|
||||
object EdZeroLevel: TFloatSpinEdit
|
||||
AnchorSideLeft.Control = CmbLabelsAt
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = CmbLabelsAt
|
||||
AnchorSideRight.Side = asrBottom
|
||||
Left = 267
|
||||
Height = 23
|
||||
Top = 6
|
||||
Width = 76
|
||||
Alignment = taRightJustify
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
Increment = 0.1
|
||||
MaxValue = 2
|
||||
MinValue = -2
|
||||
TabOrder = 3
|
||||
OnChange = EdZeroLevelChange
|
||||
end
|
||||
object BtnNewData: TButton
|
||||
AnchorSideLeft.Control = CbCentered
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbUseZeroLevel
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 425
|
||||
Height = 25
|
||||
Top = 5
|
||||
Width = 76
|
||||
AutoSize = True
|
||||
BorderSpacing.Left = 8
|
||||
Caption = 'New data'
|
||||
TabOrder = 4
|
||||
OnClick = BtnNewDataClick
|
||||
end
|
||||
object LblCount: TLabel
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = EdYCount
|
||||
Left = 525
|
||||
Height = 15
|
||||
Top = 10
|
||||
Width = 33
|
||||
Anchors = [akTop, akRight]
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Count'
|
||||
FocusControl = EdCount
|
||||
end
|
||||
object EdCount: TSpinEdit
|
||||
AnchorSideLeft.Control = EdYCount
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 566
|
||||
Height = 23
|
||||
Top = 6
|
||||
Width = 50
|
||||
Alignment = taRightJustify
|
||||
MaxValue = 20
|
||||
MinValue = 1
|
||||
TabOrder = 5
|
||||
Value = 10
|
||||
OnChange = EdCountChange
|
||||
end
|
||||
object CbStacked: TCheckBox
|
||||
AnchorSideLeft.Control = ParamsPanel
|
||||
AnchorSideTop.Control = ParamsPanel
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 8
|
||||
Height = 19
|
||||
Top = 8
|
||||
Width = 59
|
||||
BorderSpacing.Left = 8
|
||||
BorderSpacing.Top = 8
|
||||
Caption = 'Stacked'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 6
|
||||
OnChange = CbStackedChange
|
||||
end
|
||||
object CbBanded: TCheckBox
|
||||
AnchorSideLeft.Control = CbStacked
|
||||
AnchorSideTop.Control = EdYCount
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 8
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 58
|
||||
Caption = 'Banded'
|
||||
TabOrder = 7
|
||||
OnChange = CbBandedChange
|
||||
end
|
||||
object LblYCount: TLabel
|
||||
AnchorSideLeft.Control = BtnNewData
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = EdYCount
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 517
|
||||
Height = 15
|
||||
Top = 37
|
||||
Width = 41
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Y count'
|
||||
FocusControl = EdYCount
|
||||
end
|
||||
object EdYCount: TSpinEdit
|
||||
AnchorSideLeft.Control = LblYCount
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = EdCount
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 566
|
||||
Height = 23
|
||||
Top = 33
|
||||
Width = 50
|
||||
Alignment = taRightJustify
|
||||
BorderSpacing.Left = 8
|
||||
BorderSpacing.Top = 4
|
||||
MaxValue = 5
|
||||
MinValue = 1
|
||||
TabOrder = 8
|
||||
Value = 3
|
||||
OnChange = EdYCountChange
|
||||
end
|
||||
object CbShowDropLines: TCheckBox
|
||||
AnchorSideLeft.Control = CbUseZeroLevel
|
||||
AnchorSideTop.Control = CbShowLegend
|
||||
Left = 157
|
||||
Height = 19
|
||||
Top = 62
|
||||
Width = 102
|
||||
Caption = 'Show drop lines'
|
||||
Checked = True
|
||||
State = cbChecked
|
||||
TabOrder = 9
|
||||
OnChange = CbShowDropLinesChange
|
||||
end
|
||||
object CbShowDataLabels: TCheckBox
|
||||
AnchorSideLeft.Control = CbShowDropLines
|
||||
AnchorSideTop.Control = CbBanded
|
||||
Left = 157
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 106
|
||||
Caption = 'Show data labels'
|
||||
TabOrder = 10
|
||||
OnChange = CbShowDataLabelsChange
|
||||
end
|
||||
object CmbLabelsAt: TComboBox
|
||||
AnchorSideLeft.Control = CbShowDataLabels
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbShowDataLabels
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 267
|
||||
Height = 23
|
||||
Top = 33
|
||||
Width = 76
|
||||
BorderSpacing.Left = 4
|
||||
Enabled = False
|
||||
ItemHeight = 15
|
||||
TabOrder = 11
|
||||
Text = 'CmbLabelsAt'
|
||||
OnChange = CmbLabelsAtChange
|
||||
end
|
||||
object CbShowLegend: TCheckBox
|
||||
AnchorSideLeft.Control = CbStacked
|
||||
AnchorSideTop.Control = CbBanded
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 8
|
||||
Height = 19
|
||||
Top = 62
|
||||
Width = 86
|
||||
BorderSpacing.Top = 8
|
||||
Caption = 'Show legend'
|
||||
TabOrder = 12
|
||||
OnChange = CbShowLegendChange
|
||||
end
|
||||
object CbCentered: TCheckBox
|
||||
AnchorSideLeft.Control = CmbLabelsAt
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbShowDataLabels
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 351
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 66
|
||||
BorderSpacing.Left = 8
|
||||
Caption = 'Centered'
|
||||
Enabled = False
|
||||
TabOrder = 13
|
||||
OnChange = CbCenteredChange
|
||||
end
|
||||
object EdDepthBrightnessDelta: TSpinEdit
|
||||
AnchorSideLeft.Control = LblYCount
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = EdYCount
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 566
|
||||
Height = 23
|
||||
Top = 60
|
||||
Width = 50
|
||||
Alignment = taRightJustify
|
||||
BorderSpacing.Left = 8
|
||||
BorderSpacing.Top = 4
|
||||
BorderSpacing.Bottom = 4
|
||||
Enabled = False
|
||||
MaxValue = 255
|
||||
MinValue = -255
|
||||
TabOrder = 14
|
||||
OnChange = EdDepthBrightnessDeltaChange
|
||||
end
|
||||
object LblDepthBrightnessDelta: TLabel
|
||||
AnchorSideTop.Control = EdDepthBrightnessDelta
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = EdYCount
|
||||
Left = 439
|
||||
Height = 15
|
||||
Top = 64
|
||||
Width = 119
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Depth brightness delta'
|
||||
Enabled = False
|
||||
end
|
||||
end
|
||||
object Chart: TChart
|
||||
Left = 0
|
||||
Height = 282
|
||||
Top = 0
|
||||
Width = 629
|
||||
AxisList = <
|
||||
item
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelFont.Orientation = 900
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end
|
||||
item
|
||||
Alignment = calBottom
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end>
|
||||
Foot.Brush.Color = clBtnFace
|
||||
Foot.Font.Color = clBlue
|
||||
Title.Brush.Color = clBtnFace
|
||||
Title.Font.Color = clBlue
|
||||
Title.Text.Strings = (
|
||||
'TAChart'
|
||||
)
|
||||
Align = alClient
|
||||
Color = clDefault
|
||||
object AreaSeries: TAreaSeries
|
||||
Legend.Multiplicity = lmStyle
|
||||
AxisIndexX = 1
|
||||
AxisIndexY = 0
|
||||
AreaContourPen.Width = 3
|
||||
Marks.YIndex = -1
|
||||
Styles = ChartStyles
|
||||
UseZeroLevel = True
|
||||
end
|
||||
end
|
||||
object ChartStyles: TChartStyles
|
||||
Styles = <
|
||||
item
|
||||
Brush.Color = clRed
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 1'
|
||||
end
|
||||
item
|
||||
Brush.Color = clBlue
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 2'
|
||||
end
|
||||
item
|
||||
Brush.Color = clYellow
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 3'
|
||||
end
|
||||
item
|
||||
Brush.Color = clSilver
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 4'
|
||||
end
|
||||
item
|
||||
Brush.Color = clGreen
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 5'
|
||||
end>
|
||||
Left = 156
|
||||
Top = 124
|
||||
end
|
||||
end
|
218
components/tachart/demo/area/frmgeneral.pas
Normal file
218
components/tachart/demo/area/frmgeneral.pas
Normal file
@ -0,0 +1,218 @@
|
||||
unit frmGeneral;
|
||||
|
||||
{$mode ObjFPC}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Math,
|
||||
Graphics, Forms, Controls, StdCtrls, ExtCtrls, Spin,
|
||||
TAGraph, TAChartUtils, TASeries, TATextElements, TAStyles;
|
||||
|
||||
type
|
||||
TGeneralFrame = class(TFrame)
|
||||
BtnNewData: TButton;
|
||||
Cb3D: TCheckBox;
|
||||
CbBanded: TCheckBox;
|
||||
CbCentered: TCheckBox;
|
||||
CmbLabelsAt: TComboBox;
|
||||
CbRotated: TCheckBox;
|
||||
CbShowDataLabels: TCheckBox;
|
||||
CbShowDropLines: TCheckBox;
|
||||
CbShowLegend: TCheckBox;
|
||||
CbStacked: TCheckBox;
|
||||
CbUseZeroLevel: TCheckBox;
|
||||
Chart: TChart;
|
||||
AreaSeries: TAreaSeries;
|
||||
ChartStyles: TChartStyles;
|
||||
EdCount: TSpinEdit;
|
||||
EdDepthBrightnessDelta: TSpinEdit;
|
||||
EdYCount: TSpinEdit;
|
||||
EdZeroLevel: TFloatSpinEdit;
|
||||
LblCount: TLabel;
|
||||
LblDepthBrightnessDelta: TLabel;
|
||||
LblYCount: TLabel;
|
||||
ParamsPanel: TPanel;
|
||||
procedure BtnNewDataClick(Sender: TObject);
|
||||
procedure Cb3DChange(Sender: TObject);
|
||||
procedure CbBandedChange(Sender: TObject);
|
||||
procedure CbCenteredChange(Sender: TObject);
|
||||
procedure CmbLabelsAtChange(Sender: TObject);
|
||||
procedure CbRotatedChange(Sender: TObject);
|
||||
procedure CbShowDataLabelsChange(Sender: TObject);
|
||||
procedure CbShowDropLinesChange(Sender: TObject);
|
||||
procedure CbShowLegendChange(Sender: TObject);
|
||||
procedure CbStackedChange(Sender: TObject);
|
||||
procedure CbUseZeroLevelChange(Sender: TObject);
|
||||
procedure EdCountChange(Sender: TObject);
|
||||
procedure EdDepthBrightnessDeltaChange(Sender: TObject);
|
||||
procedure EdYCountChange(Sender: TObject);
|
||||
procedure EdZeroLevelChange(Sender: TObject);
|
||||
private
|
||||
procedure PopulateSeries(N, NY: Integer);
|
||||
procedure UpdateStyles(Count: Integer);
|
||||
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
constructor TGeneralFrame.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited;
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.BtnNewDataClick(Sender: TObject);
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.Cb3DChange(Sender: TObject);
|
||||
const
|
||||
DEPTH = 20;
|
||||
begin
|
||||
AreaSeries.Depth := IfThen(Cb3D.Checked, DEPTH, 0);
|
||||
Chart.Margins.Right := 4 + AreaSeries.Depth;
|
||||
Chart.Margins.Top := 4 + AreaSeries.Depth;
|
||||
EdDepthBrightnessDelta.Enabled := Cb3D.Checked;
|
||||
lblDepthBrightnessDelta.Enabled := Cb3D.Checked;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbBandedChange(Sender: TObject);
|
||||
begin
|
||||
AreaSeries.Banded := CbBanded.Checked;
|
||||
if AreaSeries.Banded then
|
||||
UpdateStyles(AreaSeries.ListSource.YCount-1)
|
||||
else
|
||||
UpdateStyles(AreaSeries.ListSource.YCount);
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbCenteredChange(Sender: TObject);
|
||||
begin
|
||||
AreaSeries.MarkPositionCentered := CbCentered.Checked;
|
||||
if CbCentered.Checked then begin
|
||||
AreaSeries.Marks.Distance := 0;
|
||||
AreaSeries.Marks.Attachment := maCenter;
|
||||
end else begin
|
||||
AreaSeries.Marks.Distance := 20;
|
||||
AreaSeries.Marks.Attachment := maDefault;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CmbLabelsAtChange(Sender: TObject);
|
||||
begin
|
||||
if CmbLabelsAt.ItemIndex = 0 then
|
||||
AreaSeries.Marks.YIndex := - 1
|
||||
else
|
||||
AreaSeries.Marks.YIndex := CmbLabelsAt.ItemIndex - 1;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbRotatedChange(Sender: TObject);
|
||||
var
|
||||
tmp: Integer;
|
||||
begin
|
||||
tmp := AreaSeries.AxisIndexX;
|
||||
AreaSeries.AxisIndexX := AreaSeries.AxisIndexY;
|
||||
AreaSeries.AxisIndexY := tmp;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbShowDataLabelsChange(Sender: TObject);
|
||||
begin
|
||||
if CbShowDataLabels.Checked then begin
|
||||
AreaSeries.Marks.Style := smsLabel;
|
||||
AreaSeries.Marks.Format := '%.2f';
|
||||
end else
|
||||
AreaSeries.Marks.Style := smsNone;
|
||||
CbCentered.Enabled := CbShowDataLabels.Checked;
|
||||
CmbLabelsAt.Enabled := CbShowDataLabels.Checked;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbShowDropLinesChange(Sender: TObject);
|
||||
begin
|
||||
if CbShowDropLines.Checked then
|
||||
AreaSeries.AreaLinesPen.Style := psSolid
|
||||
else
|
||||
AreaSeries.AreaLinesPen.Style := psClear;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbShowLegendChange(Sender: TObject);
|
||||
begin
|
||||
Chart.Legend.Visible := CbShowLegend.Checked;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbStackedChange(Sender: TObject);
|
||||
begin
|
||||
AreaSeries.Stacked := CbStacked.Checked;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.CbUseZeroLevelChange(Sender: TObject);
|
||||
begin
|
||||
AreaSeries.UseZeroLevel := CbUseZeroLevel.Checked;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.EdCountChange(Sender: TObject);
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.EdDepthBrightnessDeltaChange(Sender: TObject);
|
||||
begin
|
||||
AreaSeries.DepthBrightnessDelta := EdDepthBrightnessDelta.Value;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.EdYCountChange(Sender: TObject);
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.EdZeroLevelChange(Sender: TObject);
|
||||
begin
|
||||
AreaSeries.ZeroLevel := EdZeroLevel.Value;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.PopulateSeries(N, NY: Integer);
|
||||
var
|
||||
i: Integer;
|
||||
idx: Integer;
|
||||
begin
|
||||
AreaSeries.Clear;
|
||||
AreaSeries.ListSource.YCount := NY;
|
||||
for i:=1 to N do
|
||||
AreaSeries.AddXY(i, Random, [0.1 + Random, 0.2 + Random, 0.3 + Random, 0.2 + Random]);
|
||||
|
||||
UpdateStyles(AreaSeries.ListSource.YCount);
|
||||
|
||||
idx := CmbLabelsAt.ItemIndex;
|
||||
CmbLabelsAt.Clear;
|
||||
CmbLabelsAt.Items.Add('all');
|
||||
for i:= 0 to NY - 1 do
|
||||
CmbLabelsAt.Items.Add('y index ' + IntToStr(i));
|
||||
if (idx > -1) and (idx < CmbLabelsAt.Items.Count) then
|
||||
CmbLabelsAt.ItemIndex := idx
|
||||
else
|
||||
CmbLabelsAt.ItemIndex := 0;
|
||||
end;
|
||||
|
||||
procedure TGeneralFrame.UpdateStyles(Count: Integer);
|
||||
const
|
||||
COLORS: array[0..4] of TColor = (clRed, clBlue, clYellow, clGreen, clFuchsia);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
ChartStyles.Styles.Clear;
|
||||
for i := 1 to Count do
|
||||
with ChartStyles.Add do begin
|
||||
Brush.Color := COLORS[i-1];
|
||||
Pen.Width := 3;
|
||||
Text := 'Curve ' + IntToStr(i);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
@ -1,13 +1,13 @@
|
||||
object Form1: TForm1
|
||||
Left = 356
|
||||
Left = 440
|
||||
Height = 440
|
||||
Top = 130
|
||||
Top = 142
|
||||
Width = 694
|
||||
Caption = 'Area series demo'
|
||||
ClientHeight = 440
|
||||
ClientWidth = 694
|
||||
LCLVersion = '4.99.0.0'
|
||||
OnCreate = FormCreate
|
||||
LCLVersion = '2.3.0.0'
|
||||
object PageControl1: TPageControl
|
||||
Left = 4
|
||||
Height = 432
|
||||
@ -20,459 +20,9 @@ object Form1: TForm1
|
||||
TabOrder = 0
|
||||
object PgGeneral: TTabSheet
|
||||
Caption = 'General'
|
||||
ClientHeight = 404
|
||||
ClientWidth = 678
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Height = 87
|
||||
Top = 317
|
||||
Width = 678
|
||||
Align = alBottom
|
||||
AutoSize = True
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 87
|
||||
ClientWidth = 678
|
||||
Color = clNone
|
||||
ParentBackground = False
|
||||
ParentColor = False
|
||||
TabOrder = 0
|
||||
object CbRotated: TCheckBox
|
||||
AnchorSideLeft.Control = CbBanded
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 82
|
||||
Height = 19
|
||||
Top = 8
|
||||
Width = 59
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Rotated'
|
||||
OnChange = CbRotatedChange
|
||||
TabOrder = 0
|
||||
end
|
||||
object Cb3D: TCheckBox
|
||||
AnchorSideLeft.Control = CbRotated
|
||||
AnchorSideTop.Control = CbBanded
|
||||
Left = 82
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 32
|
||||
Caption = '3D'
|
||||
OnChange = Cb3DChange
|
||||
TabOrder = 1
|
||||
end
|
||||
object CbUseZeroLevel: TCheckBox
|
||||
AnchorSideLeft.Control = CbRotated
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 157
|
||||
Height = 19
|
||||
Top = 8
|
||||
Width = 89
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Use zero level'
|
||||
OnChange = CbUseZeroLevelChange
|
||||
TabOrder = 2
|
||||
end
|
||||
object EdZeroLevel: TFloatSpinEdit
|
||||
AnchorSideLeft.Control = CbLabelsAt
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = CbLabelsAt
|
||||
AnchorSideRight.Side = asrBottom
|
||||
Left = 267
|
||||
Height = 23
|
||||
Top = 6
|
||||
Width = 76
|
||||
Alignment = taRightJustify
|
||||
Anchors = [akTop, akLeft, akRight]
|
||||
Increment = 0.1
|
||||
MaxValue = 2
|
||||
MinValue = -2
|
||||
OnChange = EdZeroLevelChange
|
||||
TabOrder = 3
|
||||
end
|
||||
object BtnNewData: TButton
|
||||
AnchorSideLeft.Control = CbCentered
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbUseZeroLevel
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 425
|
||||
Height = 25
|
||||
Top = 5
|
||||
Width = 76
|
||||
AutoSize = True
|
||||
BorderSpacing.Left = 8
|
||||
Caption = 'New data'
|
||||
OnClick = BtnNewDataClick
|
||||
TabOrder = 4
|
||||
end
|
||||
object LblCount: TLabel
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = EdYCount
|
||||
Left = 525
|
||||
Height = 15
|
||||
Top = 10
|
||||
Width = 33
|
||||
Anchors = [akTop, akRight]
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Count'
|
||||
FocusControl = EdCount
|
||||
end
|
||||
object EdCount: TSpinEdit
|
||||
AnchorSideLeft.Control = EdYCount
|
||||
AnchorSideTop.Control = CbStacked
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 566
|
||||
Height = 23
|
||||
Top = 6
|
||||
Width = 50
|
||||
Alignment = taRightJustify
|
||||
MaxValue = 20
|
||||
MinValue = 1
|
||||
OnChange = EdCountChange
|
||||
TabOrder = 5
|
||||
Value = 10
|
||||
end
|
||||
object CbStacked: TCheckBox
|
||||
AnchorSideLeft.Control = Panel1
|
||||
AnchorSideTop.Control = Panel1
|
||||
AnchorSideBottom.Side = asrBottom
|
||||
Left = 8
|
||||
Height = 19
|
||||
Top = 8
|
||||
Width = 59
|
||||
BorderSpacing.Left = 8
|
||||
BorderSpacing.Top = 8
|
||||
Caption = 'Stacked'
|
||||
Checked = True
|
||||
OnChange = CbStackedChange
|
||||
State = cbChecked
|
||||
TabOrder = 6
|
||||
end
|
||||
object CbBanded: TCheckBox
|
||||
AnchorSideLeft.Control = CbStacked
|
||||
AnchorSideTop.Control = EdYCount
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 8
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 58
|
||||
Caption = 'Banded'
|
||||
OnChange = CbBandedChange
|
||||
TabOrder = 7
|
||||
end
|
||||
object LblYCount: TLabel
|
||||
AnchorSideLeft.Control = BtnNewData
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = EdYCount
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 517
|
||||
Height = 15
|
||||
Top = 37
|
||||
Width = 41
|
||||
BorderSpacing.Left = 16
|
||||
Caption = 'Y count'
|
||||
FocusControl = EdYCount
|
||||
end
|
||||
object EdYCount: TSpinEdit
|
||||
AnchorSideLeft.Control = LblYCount
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = EdCount
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 566
|
||||
Height = 23
|
||||
Top = 33
|
||||
Width = 50
|
||||
Alignment = taRightJustify
|
||||
BorderSpacing.Left = 8
|
||||
BorderSpacing.Top = 4
|
||||
MaxValue = 5
|
||||
MinValue = 1
|
||||
OnChange = EdYCountChange
|
||||
TabOrder = 8
|
||||
Value = 3
|
||||
end
|
||||
object CbShowDropLines: TCheckBox
|
||||
AnchorSideLeft.Control = CbUseZeroLevel
|
||||
AnchorSideTop.Control = CbShowLegend
|
||||
Left = 157
|
||||
Height = 19
|
||||
Top = 62
|
||||
Width = 102
|
||||
Caption = 'Show drop lines'
|
||||
Checked = True
|
||||
OnChange = CbShowDropLinesChange
|
||||
State = cbChecked
|
||||
TabOrder = 9
|
||||
end
|
||||
object CbShowDataLabels: TCheckBox
|
||||
AnchorSideLeft.Control = CbShowDropLines
|
||||
AnchorSideTop.Control = CbBanded
|
||||
Left = 157
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 106
|
||||
Caption = 'Show data labels'
|
||||
OnChange = CbShowDataLabelsChange
|
||||
TabOrder = 10
|
||||
end
|
||||
object CbLabelsAt: TComboBox
|
||||
AnchorSideLeft.Control = CbShowDataLabels
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbShowDataLabels
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 267
|
||||
Height = 23
|
||||
Top = 33
|
||||
Width = 76
|
||||
BorderSpacing.Left = 4
|
||||
Enabled = False
|
||||
ItemHeight = 15
|
||||
OnChange = CbLabelsAtChange
|
||||
TabOrder = 11
|
||||
Text = 'CbLabelsAt'
|
||||
end
|
||||
object CbShowLegend: TCheckBox
|
||||
AnchorSideLeft.Control = CbStacked
|
||||
AnchorSideTop.Control = CbBanded
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 8
|
||||
Height = 19
|
||||
Top = 62
|
||||
Width = 86
|
||||
BorderSpacing.Top = 8
|
||||
Caption = 'Show legend'
|
||||
OnChange = CbShowLegendChange
|
||||
TabOrder = 12
|
||||
end
|
||||
object CbCentered: TCheckBox
|
||||
AnchorSideLeft.Control = CbLabelsAt
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = CbShowDataLabels
|
||||
AnchorSideTop.Side = asrCenter
|
||||
Left = 351
|
||||
Height = 19
|
||||
Top = 35
|
||||
Width = 66
|
||||
BorderSpacing.Left = 8
|
||||
Caption = 'Centered'
|
||||
Enabled = False
|
||||
OnChange = CbCenteredChange
|
||||
TabOrder = 13
|
||||
end
|
||||
object EdDepthBrightnessDelta: TSpinEdit
|
||||
AnchorSideLeft.Control = LblYCount
|
||||
AnchorSideLeft.Side = asrBottom
|
||||
AnchorSideTop.Control = EdYCount
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 566
|
||||
Height = 23
|
||||
Top = 60
|
||||
Width = 50
|
||||
Alignment = taRightJustify
|
||||
BorderSpacing.Left = 8
|
||||
BorderSpacing.Top = 4
|
||||
BorderSpacing.Bottom = 4
|
||||
Enabled = False
|
||||
MaxValue = 255
|
||||
MinValue = -255
|
||||
OnChange = EdDepthBrightnessDeltaChange
|
||||
TabOrder = 14
|
||||
end
|
||||
object LblDepthBrightnessDelta: TLabel
|
||||
AnchorSideTop.Control = EdDepthBrightnessDelta
|
||||
AnchorSideTop.Side = asrCenter
|
||||
AnchorSideRight.Control = EdYCount
|
||||
Left = 439
|
||||
Height = 15
|
||||
Top = 64
|
||||
Width = 119
|
||||
Anchors = [akTop, akRight]
|
||||
Caption = 'Depth brightness delta'
|
||||
Enabled = False
|
||||
end
|
||||
end
|
||||
object Chart1: TChart
|
||||
Left = 0
|
||||
Height = 317
|
||||
Top = 0
|
||||
Width = 678
|
||||
AxisList = <
|
||||
item
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelFont.Orientation = 900
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end
|
||||
item
|
||||
Alignment = calBottom
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end>
|
||||
Foot.Brush.Color = clBtnFace
|
||||
Foot.Font.Color = clBlue
|
||||
Title.Brush.Color = clBtnFace
|
||||
Title.Font.Color = clBlue
|
||||
Title.Text.Strings = (
|
||||
'TAChart'
|
||||
)
|
||||
Align = alClient
|
||||
Color = clDefault
|
||||
object Chart1AreaSeries1: TAreaSeries
|
||||
Legend.Multiplicity = lmStyle
|
||||
AxisIndexX = 1
|
||||
AxisIndexY = 0
|
||||
AreaContourPen.Width = 3
|
||||
Marks.YIndex = -1
|
||||
Styles = ChartStyles1
|
||||
UseZeroLevel = True
|
||||
end
|
||||
end
|
||||
end
|
||||
object PgErrorRange: TTabSheet
|
||||
Caption = 'Error range'
|
||||
ClientHeight = 404
|
||||
ClientWidth = 678
|
||||
object Chart2: TChart
|
||||
Left = 0
|
||||
Height = 373
|
||||
Top = 31
|
||||
Width = 678
|
||||
AxisList = <
|
||||
item
|
||||
Grid.Color = clSilver
|
||||
Grid.Style = psSolid
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelFont.Orientation = 900
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end
|
||||
item
|
||||
Grid.Color = clSilver
|
||||
Grid.Style = psSolid
|
||||
Alignment = calBottom
|
||||
Marks.LabelBrush.Style = bsClear
|
||||
Minors = <>
|
||||
Title.LabelBrush.Style = bsClear
|
||||
end>
|
||||
BackColor = clWhite
|
||||
Foot.Brush.Color = clBtnFace
|
||||
Foot.Font.Color = clBlue
|
||||
Legend.Visible = True
|
||||
Title.Brush.Color = clBtnFace
|
||||
Title.Font.Color = clBlue
|
||||
Title.Text.Strings = (
|
||||
'TAChart'
|
||||
)
|
||||
Align = alClient
|
||||
Color = clDefault
|
||||
object Chart2AreaSeries1: TAreaSeries
|
||||
Legend.Visible = False
|
||||
Transparency = 180
|
||||
AreaBrush.Color = clRed
|
||||
AreaContourPen.Style = psClear
|
||||
AreaLinesPen.Style = psClear
|
||||
Source = ChartSourceArea1
|
||||
Stacked = False
|
||||
end
|
||||
object Chart2LineSeries1: TLineSeries
|
||||
Title = 'sin data'
|
||||
LinePen.Color = clRed
|
||||
LinePen.Width = 3
|
||||
LineType = ltNone
|
||||
Pointer.Brush.Color = clRed
|
||||
Pointer.HorizSize = 5
|
||||
Pointer.Style = psCircle
|
||||
Pointer.VertSize = 5
|
||||
Pointer.Visible = True
|
||||
ShowPoints = True
|
||||
Source = ChartSourceLine1
|
||||
end
|
||||
object Chart2AreaSeries2: TAreaSeries
|
||||
Legend.Visible = False
|
||||
Transparency = 180
|
||||
AreaBrush.Color = clBlue
|
||||
AreaLinesPen.Style = psClear
|
||||
Source = ChartSourceArea2
|
||||
end
|
||||
object Chart2LineSeries2: TLineSeries
|
||||
Title = 'cos data'
|
||||
LinePen.Color = clBlue
|
||||
Pointer.Brush.Color = clBlue
|
||||
Pointer.HorizSize = 5
|
||||
Pointer.Style = psCircle
|
||||
Pointer.VertSize = 5
|
||||
Pointer.Visible = True
|
||||
ShowPoints = True
|
||||
Source = ChartSourceLine2
|
||||
end
|
||||
end
|
||||
object Label1: TLabel
|
||||
Left = 8
|
||||
Height = 15
|
||||
Top = 8
|
||||
Width = 662
|
||||
Align = alTop
|
||||
Alignment = taCenter
|
||||
BorderSpacing.Around = 8
|
||||
Caption = 'This functionality requires at least Lazarus version 1.9'
|
||||
Visible = False
|
||||
end
|
||||
end
|
||||
end
|
||||
object ChartStyles1: TChartStyles
|
||||
Styles = <
|
||||
item
|
||||
Brush.Color = clRed
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 1'
|
||||
end
|
||||
item
|
||||
Brush.Color = clBlue
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 2'
|
||||
end
|
||||
item
|
||||
Brush.Color = clYellow
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 3'
|
||||
end
|
||||
item
|
||||
Brush.Color = clSilver
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 4'
|
||||
end
|
||||
item
|
||||
Brush.Color = clGreen
|
||||
Pen.Width = 3
|
||||
Text = 'Curve 5'
|
||||
end>
|
||||
Left = 128
|
||||
Top = 96
|
||||
end
|
||||
object ChartSourceArea1: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceArea1GetChartDataItem
|
||||
Left = 258
|
||||
Top = 96
|
||||
end
|
||||
object ChartSourceLine1: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceLine1GetChartDataItem
|
||||
Left = 258
|
||||
Top = 184
|
||||
end
|
||||
object ChartSourceArea2: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceArea2GetChartDataItem
|
||||
Left = 424
|
||||
Top = 96
|
||||
end
|
||||
object ChartSourceLine2: TUserDefinedChartSource
|
||||
OnGetChartDataItem = ChartSourceLine2GetChartDataItem
|
||||
Left = 423
|
||||
Top = 184
|
||||
end
|
||||
end
|
||||
|
@ -8,77 +8,21 @@ uses
|
||||
LCLVersion,
|
||||
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin,
|
||||
ComCtrls, ExtCtrls,
|
||||
TAGraph, TASeries, TASources, TAStyles, TACustomSeries, TACustomSource;
|
||||
TAGraph, TASeries, TASources, TAStyles, TACustomSeries, TACustomSource,
|
||||
frmGeneral, frmErrorRange;
|
||||
|
||||
type
|
||||
|
||||
{ TForm1 }
|
||||
|
||||
TForm1 = class(TForm)
|
||||
BtnNewData: TButton;
|
||||
Chart1: TChart;
|
||||
Chart1AreaSeries1: TAreaSeries;
|
||||
Chart2: TChart;
|
||||
Chart2AreaSeries1: TAreaSeries;
|
||||
Chart2AreaSeries2: TAreaSeries;
|
||||
Chart2LineSeries1: TLineSeries;
|
||||
Chart2LineSeries2: TLineSeries;
|
||||
ChartStyles1: TChartStyles;
|
||||
CbStacked: TCheckBox;
|
||||
CbRotated: TCheckBox;
|
||||
Cb3D: TCheckBox;
|
||||
CbUseZeroLevel: TCheckBox;
|
||||
CbBanded: TCheckBox;
|
||||
CbShowDropLines: TCheckBox;
|
||||
CbShowDataLabels: TCheckBox;
|
||||
CbLabelsAt: TComboBox;
|
||||
CbShowLegend: TCheckBox;
|
||||
CbCentered: TCheckBox;
|
||||
EdYCount: TSpinEdit;
|
||||
EdDepthBrightnessDelta: TSpinEdit;
|
||||
EdZeroLevel: TFloatSpinEdit;
|
||||
Label1: TLabel;
|
||||
LblDepthBrightnessDelta: TLabel;
|
||||
LblCount: TLabel;
|
||||
LblYCount: TLabel;
|
||||
PageControl1: TPageControl;
|
||||
Panel1: TPanel;
|
||||
EdCount: TSpinEdit;
|
||||
PgGeneral: TTabSheet;
|
||||
PgErrorRange: TTabSheet;
|
||||
ChartSourceArea1: TUserDefinedChartSource;
|
||||
ChartSourceLine1: TUserDefinedChartSource;
|
||||
ChartSourceArea2: TUserDefinedChartSource;
|
||||
ChartSourceLine2: TUserDefinedChartSource;
|
||||
procedure BtnNewDataClick(Sender: TObject);
|
||||
procedure CbBandedChange(Sender: TObject);
|
||||
procedure CbCenteredChange(Sender: TObject);
|
||||
procedure CbLabelsAtChange(Sender: TObject);
|
||||
procedure CbShowDataLabelsChange(Sender: TObject);
|
||||
procedure CbShowLegendChange(Sender: TObject);
|
||||
procedure CbStackedChange(Sender: TObject);
|
||||
procedure CbRotatedChange(Sender: TObject);
|
||||
procedure Cb3DChange(Sender: TObject);
|
||||
procedure CbUseZeroLevelChange(Sender: TObject);
|
||||
procedure ChartSourceArea1GetChartDataItem({%H-}ASource: TUserDefinedChartSource;
|
||||
AIndex: Integer; var AItem: TChartDataItem);
|
||||
procedure ChartSourceArea2GetChartDataItem(
|
||||
{%H-}ASource: TUserDefinedChartSource; AIndex: Integer;
|
||||
var AItem: TChartDataItem);
|
||||
procedure ChartSourceLine1GetChartDataItem({%H-}ASource: TUserDefinedChartSource;
|
||||
AIndex: Integer; var AItem: TChartDataItem);
|
||||
procedure ChartSourceLine2GetChartDataItem(
|
||||
{%H-}ASource: TUserDefinedChartSource; AIndex: Integer;
|
||||
var AItem: TChartDataItem);
|
||||
procedure CbShowDropLinesChange(Sender: TObject);
|
||||
procedure EdDepthBrightnessDeltaChange(Sender: TObject);
|
||||
procedure EdYCountChange(Sender: TObject);
|
||||
procedure EdZeroLevelChange(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure EdCountChange(Sender: TObject);
|
||||
private
|
||||
procedure PopulateSeries(N, NY: Integer);
|
||||
procedure UpdateStyles(Count: Integer);
|
||||
FGeneralFrame: TGeneralFrame;
|
||||
FErrorRangeFrame: TErrorRangeFrame;
|
||||
|
||||
public
|
||||
|
||||
@ -94,229 +38,15 @@ implementation
|
||||
uses
|
||||
Math, TAChartUtils, TATextElements;
|
||||
|
||||
type
|
||||
TData = record
|
||||
x, y, dy: Double;
|
||||
end;
|
||||
TDataArray = array of TData;
|
||||
|
||||
var
|
||||
Data1, Data2: TDataArray;
|
||||
|
||||
{ TForm1 }
|
||||
|
||||
procedure TForm1.BtnNewDataClick(Sender: TObject);
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TForm1.CbBandedChange(Sender: TObject);
|
||||
begin
|
||||
Chart1AreaSeries1.Banded := CbBanded.Checked;
|
||||
if Chart1AreaSeries1.Banded then
|
||||
UpdateStyles(Chart1AreaSeries1.ListSource.YCount-1)
|
||||
else
|
||||
UpdateStyles(Chart1AreaSeries1.ListSource.YCount);
|
||||
end;
|
||||
|
||||
procedure TForm1.CbCenteredChange(Sender: TObject);
|
||||
begin
|
||||
Chart1AreaSeries1.MarkPositionCentered := CbCentered.Checked;
|
||||
if CbCentered.Checked then begin
|
||||
Chart1AreaSeries1.Marks.Distance := 0;
|
||||
Chart1AreaSeries1.Marks.Attachment := maCenter;
|
||||
end else begin
|
||||
Chart1AreaSeries1.Marks.Distance := 20;
|
||||
Chart1AreaSeries1.Marks.Attachment := maDefault;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbLabelsAtChange(Sender: TObject);
|
||||
begin
|
||||
if CbLabelsAt.ItemIndex = 0 then
|
||||
Chart1AreaSeries1.Marks.YIndex := - 1
|
||||
else
|
||||
Chart1AreaSeries1.Marks.YIndex := CbLabelsAt.ItemIndex - 1;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbShowDataLabelsChange(Sender: TObject);
|
||||
begin
|
||||
if CbShowDataLabels.Checked then begin
|
||||
Chart1AreaSeries1.Marks.Style := smsLabel;
|
||||
Chart1AreaSeries1.Marks.Format := '%.2f';
|
||||
end else
|
||||
Chart1AreaSeries1.Marks.Style := smsNone;
|
||||
CbCentered.Enabled := CbShowDataLabels.Checked;
|
||||
CbLabelsAt.Enabled := CbShowDataLabels.Checked;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbShowLegendChange(Sender: TObject);
|
||||
begin
|
||||
Chart1.Legend.Visible := CbShowLegend.Checked;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbStackedChange(Sender: TObject);
|
||||
begin
|
||||
Chart1AreaSeries1.Stacked := CbStacked.Checked;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbRotatedChange(Sender: TObject);
|
||||
var
|
||||
tmp: Integer;
|
||||
begin
|
||||
tmp := Chart1AreaSeries1.AxisIndexX;
|
||||
Chart1AreaSeries1.AxisIndexX := Chart1AreaSeries1.AxisIndexY;
|
||||
Chart1AreaSeries1.AxisIndexY := tmp;
|
||||
end;
|
||||
|
||||
procedure TForm1.Cb3DChange(Sender: TObject);
|
||||
const
|
||||
DEPTH = 20;
|
||||
begin
|
||||
Chart1AreaSeries1.Depth := IfThen(Cb3D.Checked, DEPTH, 0);
|
||||
Chart1.Margins.Right := 4 + Chart1AreaSeries1.Depth;
|
||||
Chart1.Margins.Top := 4 + Chart1AreaSeries1.Depth;
|
||||
EdDepthBrightnessDelta.Enabled := Cb3D.Checked;
|
||||
lblDepthBrightnessDelta.Enabled := Cb3D.Checked;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbUseZeroLevelChange(Sender: TObject);
|
||||
begin
|
||||
Chart1AreaSeries1.UseZeroLevel := CbUseZeroLevel.Checked;
|
||||
end;
|
||||
|
||||
procedure TForm1.ChartSourceArea1GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data1[AIndex].x;
|
||||
AItem.Y := Data1[AIndex].y - Data1[AIndex].dy;
|
||||
AItem.YList[0] := Data1[AIndex].y + Data1[AIndex].dy;
|
||||
end;
|
||||
|
||||
procedure TForm1.ChartSourceArea2GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data2[AIndex].x;
|
||||
AItem.Y := Data2[AIndex].y;
|
||||
AItem.YList[0] := -Data2[AIndex].dy;
|
||||
AItem.YList[1] := 2*Data2[AIndex].dy;
|
||||
end;
|
||||
|
||||
procedure TForm1.ChartSourceLine1GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data1[AIndex].X;
|
||||
AItem.Y := Data1[AIndex].Y;
|
||||
end;
|
||||
|
||||
procedure TForm1.ChartSourceLine2GetChartDataItem(
|
||||
ASource: TUserDefinedChartSource; AIndex: Integer; var AItem: TChartDataItem);
|
||||
begin
|
||||
AItem.X := Data2[AIndex].X;
|
||||
AItem.Y := Data2[AIndex].Y;
|
||||
end;
|
||||
|
||||
procedure TForm1.CbShowDropLinesChange(Sender: TObject);
|
||||
begin
|
||||
if CbShowDropLines.Checked then
|
||||
Chart1AreaSeries1.AreaLinesPen.Style := psSolid
|
||||
else
|
||||
Chart1AreaSeries1.AreaLinesPen.Style := psClear;
|
||||
end;
|
||||
|
||||
procedure TForm1.EdDepthBrightnessDeltaChange(Sender: TObject);
|
||||
begin
|
||||
Chart1AreaSeries1.DepthBrightnessDelta := EdDepthBrightnessDelta.Value;
|
||||
end;
|
||||
|
||||
procedure TForm1.EdYCountChange(Sender: TObject);
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TForm1.EdZeroLevelChange(Sender: TObject);
|
||||
begin
|
||||
Chart1AreaSeries1.ZeroLevel := EdZeroLevel.Value;
|
||||
end;
|
||||
|
||||
procedure TForm1.FormCreate(Sender: TObject);
|
||||
const
|
||||
N1 = 20;
|
||||
N2 = 25;
|
||||
XMIN = -10;
|
||||
XMAX = +10;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
FGeneralFrame := TGeneralFrame.Create(Self);
|
||||
FGeneralFrame.Parent := PgGeneral;
|
||||
FGeneralFrame.Align := alClient;
|
||||
|
||||
SetLength(Data1, N1);
|
||||
for i:=0 to N1-1 do begin
|
||||
Data1[i].x := XMIN + (XMAX - XMIN) * i / (N1-1);
|
||||
Data1[i].y := sin(Data1[i].x * 0.5);
|
||||
Data1[i].dy := randg(0.2, 0.05);
|
||||
end;
|
||||
ChartSourceLine1.YCount := 1;
|
||||
ChartSourceLine1.PointsNumber := N1;
|
||||
ChartSourceArea1.YCount := 2;
|
||||
ChartSourceArea1.PointsNumber := N1;
|
||||
|
||||
SetLength(Data2, N2);
|
||||
for i:=0 to N2-1 do begin
|
||||
Data2[i].x := XMIN + (XMAX - XMIN) * i / (N2-1);
|
||||
Data2[i].y := cos(Data2[i].x); // + randg(0, 0.2);
|
||||
Data2[i].dy := randg(0.2, 0.05);
|
||||
end;
|
||||
ChartSourceLine2.YCount := 1;
|
||||
ChartSourceLine2.PointsNumber := N2;
|
||||
ChartSourceArea2.YCount := 3;
|
||||
ChartSourceArea2.PointsNumber := N2;
|
||||
|
||||
Chart2AreaSeries1.Banded := true;
|
||||
Chart2AreaSeries2.Banded := true;
|
||||
end;
|
||||
|
||||
procedure TForm1.EdCountChange(Sender: TObject);
|
||||
begin
|
||||
PopulateSeries(EdCount.Value, EdYCount.Value);
|
||||
end;
|
||||
|
||||
procedure TForm1.PopulateSeries(N, NY: Integer);
|
||||
var
|
||||
i: Integer;
|
||||
idx: Integer;
|
||||
begin
|
||||
Chart1AreaSeries1.Clear;
|
||||
Chart1AreaSeries1.ListSource.YCount := NY;
|
||||
for i:=1 to N do
|
||||
Chart1AreaSeries1.AddXY(i, Random, [0.1 + Random, 0.2 + Random, 0.3 + Random, 0.2 + Random]);
|
||||
|
||||
UpdateStyles(Chart1AreaSeries1.ListSource.YCount);
|
||||
|
||||
idx := CbLabelsAt.ItemIndex;
|
||||
CbLabelsAt.Clear;
|
||||
CbLabelsAt.Items.Add('all');
|
||||
for i:= 0 to NY - 1 do
|
||||
CbLabelsAt.Items.Add('y index ' + IntToStr(i));
|
||||
if (idx > -1) and (idx < CblabelsAt.Items.Count) then
|
||||
CbLabelsAt.ItemIndex := idx
|
||||
else
|
||||
CbLabelsAt.ItemIndex := 0;
|
||||
end;
|
||||
|
||||
procedure TForm1.UpdateStyles(Count: Integer);
|
||||
const
|
||||
COLORS: array[0..4] of TColor = (clRed, clBlue, clYellow, clGreen, clFuchsia);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
ChartStyles1.Styles.Clear;
|
||||
for i := 1 to Count do
|
||||
with ChartStyles1.Add do begin
|
||||
Brush.Color := COLORS[i-1];
|
||||
Pen.Width := 3;
|
||||
Text := 'Curve ' + IntToStr(i);
|
||||
end;
|
||||
FErrorRangeFrame := TErrorRangeFrame.Create(Self);
|
||||
FErrorRangeFrame.Parent := PgErrorRange;
|
||||
FErrorRangeFrame.Align := alClient;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user