TAChart: Split the two area demos off into separate frames.

This commit is contained in:
wp_xyz 2025-03-03 19:53:34 +01:00
parent 5584457e13
commit c42495ffab
8 changed files with 845 additions and 735 deletions

View File

@ -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>

View File

@ -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}

View 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

View 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.

View 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

View 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.

View File

@ -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

View File

@ -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.