You've already forked lazarus-ccr
fpspreadsheet: Support error bar ranges in chart link (only for single-valued charts, though - limitation of TAChart).
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9106 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -15,8 +15,16 @@ var
|
|||||||
ser: TsScatterSeries;
|
ser: TsScatterSeries;
|
||||||
fn: String;
|
fn: String;
|
||||||
rotated: Boolean;
|
rotated: Boolean;
|
||||||
|
errorRange: Boolean = false;
|
||||||
begin
|
begin
|
||||||
|
if (ParamCount > 0) and (lowercase(ParamStr(1)) = 'range') then
|
||||||
|
errorRange := true;
|
||||||
|
|
||||||
fn := FILE_NAME;
|
fn := FILE_NAME;
|
||||||
|
if errorRange then
|
||||||
|
fn := fn + '-range'
|
||||||
|
else
|
||||||
|
fn := fn + '-percentage';
|
||||||
|
|
||||||
book := TsWorkbook.Create;
|
book := TsWorkbook.Create;
|
||||||
try
|
try
|
||||||
@ -26,13 +34,13 @@ begin
|
|||||||
// Enter data
|
// Enter data
|
||||||
sheet.WriteText(0, 0, 'Data');
|
sheet.WriteText(0, 0, 'Data');
|
||||||
sheet.WriteFont(0, 0, '', 12, [fssBold], scBlack);
|
sheet.WriteFont(0, 0, '', 12, [fssBold], scBlack);
|
||||||
sheet.WriteText (2, 0, 'x'); sheet.Writetext (2, 1, 'y');
|
sheet.WriteText (2, 0, 'x'); sheet.Writetext (2, 1, 'y'); sheet.WriteText (2, 2, 'dy');
|
||||||
sheet.WriteNumber(3, 0, 1.1); sheet.WriteNumber(3, 1, 9.0);
|
sheet.WriteNumber(3, 0, 1.1); sheet.WriteNumber(3, 1, 9.0); sheet.WriteNumber(3, 2, 0.5);
|
||||||
sheet.WriteNumber(4, 0, 1.9); sheet.WriteNumber(4, 1, 20.5);
|
sheet.WriteNumber(4, 0, 1.9); sheet.WriteNumber(4, 1, 20.5); sheet.WriteNumber(4, 2, 3.5);
|
||||||
sheet.WriteNumber(5, 0, 2.5); sheet.WriteNumber(5, 1, 24.5);
|
sheet.WriteNumber(5, 0, 2.5); sheet.WriteNumber(5, 1, 24.5); sheet.WriteNumber(5, 2, 2.7);
|
||||||
sheet.WriteNumber(6, 0, 3.1); sheet.WriteNumber(6, 1, 33.2);
|
sheet.WriteNumber(6, 0, 3.1); sheet.WriteNumber(6, 1, 33.2); sheet.WriteNumber(6, 2, 3.1);
|
||||||
sheet.WriteNumber(7, 0, 5.2); sheet.WriteNumber(7, 1, 49.4);
|
sheet.WriteNumber(7, 0, 5.2); sheet.WriteNumber(7, 1, 49.4); sheet.WriteNumber(7, 2, 6.7);
|
||||||
sheet.WriteNumber(8, 0, 6.8); sheet.WriteNumber(8, 1, 71.3);
|
sheet.WriteNumber(8, 0, 6.8); sheet.WriteNumber(8, 1, 71.3); sheet.WriteNumber(8, 2, 3.5);
|
||||||
|
|
||||||
// Create chart: left/top in cell D4, 150 mm x 100 mm
|
// Create chart: left/top in cell D4, 150 mm x 100 mm
|
||||||
ch := book.AddChart(sheet, 2, 3, 150, 100);
|
ch := book.AddChart(sheet, 2, 3, 150, 100);
|
||||||
@ -59,9 +67,17 @@ begin
|
|||||||
ser.XErrorBars.Line.Color := scRed;
|
ser.XErrorBars.Line.Color := scRed;
|
||||||
|
|
||||||
ser.YErrorBars.Visible := true;
|
ser.YErrorBars.Visible := true;
|
||||||
|
if errorRange then
|
||||||
|
begin
|
||||||
|
ser.YErrorBars.Kind := cebkCellRange;
|
||||||
|
ser.YErrorBars.SetErrorBarRangePos(3, 2, 8, 2);
|
||||||
|
ser.YErrorBars.SetErrorBarRangeNeg(3, 2, 8, 2);
|
||||||
|
end else
|
||||||
|
begin
|
||||||
ser.YErrorBars.Kind := cebkPercentage;
|
ser.YErrorBars.Kind := cebkPercentage;
|
||||||
ser.YErrorBars.ValuePos := 10; // percent
|
ser.YErrorBars.ValuePos := 10; // percent
|
||||||
ser.YErrorBars.ValueNeg := 10; // percent
|
ser.YErrorBars.ValueNeg := 10; // percent
|
||||||
|
end;
|
||||||
ser.YErrorBars.Line.Color := scRed;
|
ser.YErrorBars.Line.Color := scRed;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@ scatter_write_demo log-log
|
|||||||
echo.
|
echo.
|
||||||
echo Scatter series with error bars
|
echo Scatter series with error bars
|
||||||
errorbars_write_demo
|
errorbars_write_demo
|
||||||
|
errorbars_write_demo range
|
||||||
echo.
|
echo.
|
||||||
echo Scatter series and regression demo...
|
echo Scatter series and regression demo...
|
||||||
regressionchart_write_demo
|
regressionchart_write_demo
|
||||||
|
@ -104,7 +104,8 @@ object Form1: TForm1
|
|||||||
'../../../other/chart/bars-2axes.ods'
|
'../../../other/chart/bars-2axes.ods'
|
||||||
'../../../other/chart/bars-2axes-rotated.ods'
|
'../../../other/chart/bars-2axes-rotated.ods'
|
||||||
'../../../other/chart/bubble.ods'
|
'../../../other/chart/bubble.ods'
|
||||||
'../../../other/chart/errorbars.ods'
|
'../../../other/chart/errorbars-percentage.ods'
|
||||||
|
'../../../other/chart/errorbars-range.ods'
|
||||||
'../../../other/chart/pie.ods'
|
'../../../other/chart/pie.ods'
|
||||||
'../../../other/chart/radar.ods'
|
'../../../other/chart/radar.ods'
|
||||||
'../../../other/chart/regression.ods'
|
'../../../other/chart/regression.ods'
|
||||||
|
@ -351,7 +351,7 @@ type
|
|||||||
property Items[AIndex: Integer]: TsChartDataPointStyle read GetItem write SetItem; default;
|
property Items[AIndex: Integer]: TsChartDataPointStyle read GetItem write SetItem; default;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TsChartErrorBarKind = (cebkConstant, cebkPercentage, cebkRange);
|
TsChartErrorBarKind = (cebkConstant, cebkPercentage, cebkCellRange);
|
||||||
|
|
||||||
TsChartErrorBars = class(TsChartElement)
|
TsChartErrorBars = class(TsChartElement)
|
||||||
private
|
private
|
||||||
|
@ -1355,7 +1355,7 @@ begin
|
|||||||
s := GetAttrValue(AStyleNode, 'chart:error-category');
|
s := GetAttrValue(AStyleNode, 'chart:error-category');
|
||||||
case s of
|
case s of
|
||||||
'constant': AErrorBars.Kind := cebkConstant;
|
'constant': AErrorBars.Kind := cebkConstant;
|
||||||
'cell-range': AErrorBars.Kind := cebkRange;
|
'cell-range': AErrorBars.Kind := cebkCellRange;
|
||||||
'percentage': AErrorBars.Kind := cebkPercentage;
|
'percentage': AErrorBars.Kind := cebkPercentage;
|
||||||
else
|
else
|
||||||
exit;
|
exit;
|
||||||
@ -2301,7 +2301,7 @@ begin
|
|||||||
chartProps := chartProps + Format('chart:error-percentage="%.9g" ', [ AErrorBar.ValuePos ], FPointSeparatorSettings);
|
chartProps := chartProps + Format('chart:error-percentage="%.9g" ', [ AErrorBar.ValuePos ], FPointSeparatorSettings);
|
||||||
chartProps := chartProps + 'loext:std-weight="1" ';
|
chartProps := chartProps + 'loext:std-weight="1" ';
|
||||||
end;
|
end;
|
||||||
cebkRange:
|
cebkCellRange:
|
||||||
begin
|
begin
|
||||||
chartProps := chartProps + 'chart:error-category="cell-range" ';
|
chartProps := chartProps + 'chart:error-category="cell-range" ';
|
||||||
if AErrorBar.ShowPos then
|
if AErrorBar.ShowPos then
|
||||||
|
@ -53,7 +53,7 @@ type
|
|||||||
FTitleCol, FTitleRow: Cardinal;
|
FTitleCol, FTitleRow: Cardinal;
|
||||||
FTitleSheetName: String;
|
FTitleSheetName: String;
|
||||||
FCyclicX: Boolean;
|
FCyclicX: Boolean;
|
||||||
FIntegerX: Boolean;
|
FIntegerX: Boolean; // only integers allowed for x values
|
||||||
FDataPointColors: array of TsColor;
|
FDataPointColors: array of TsColor;
|
||||||
function GetRange(AIndex: TsXYLRange): String;
|
function GetRange(AIndex: TsXYLRange): String;
|
||||||
function GetTitle: String;
|
function GetTitle: String;
|
||||||
@ -65,6 +65,7 @@ type
|
|||||||
procedure SetWorkbookSource(AValue: TsWorkbookSource);
|
procedure SetWorkbookSource(AValue: TsWorkbookSource);
|
||||||
protected
|
protected
|
||||||
FCurItem: TChartDataItem;
|
FCurItem: TChartDataItem;
|
||||||
|
FCurItemIndex: Integer;
|
||||||
function BuildRangeStr(AIndex: TsXYLRange; AListSeparator: char = #0): String;
|
function BuildRangeStr(AIndex: TsXYLRange; AListSeparator: char = #0): String;
|
||||||
procedure ClearRanges;
|
procedure ClearRanges;
|
||||||
function CountValues(AIndex: TsXYLRange): Integer;
|
function CountValues(AIndex: TsXYLRange): Integer;
|
||||||
@ -85,8 +86,8 @@ type
|
|||||||
procedure SetXRange(XIndex: Integer; ARange: TsChartRange);
|
procedure SetXRange(XIndex: Integer; ARange: TsChartRange);
|
||||||
procedure SetYRange(YIndex: Integer; ARange: TsChartRange);
|
procedure SetYRange(YIndex: Integer; ARange: TsChartRange);
|
||||||
procedure SetTitleAddr(Addr: TsChartCellAddr);
|
procedure SetTitleAddr(Addr: TsChartCellAddr);
|
||||||
procedure SetXErrorBarRange(ARange: TsChartRange);
|
procedure SetXErrorBarRange(APosRange, ANegRange: TsChartRange);
|
||||||
procedure SetYErrorBarRange(ARange: TsChartRange);
|
procedure SetYErrorBarRange(APosRange, ANegRange: TsChartRange);
|
||||||
procedure UseDataPointColors(ASeries: TsChartSeries);
|
procedure UseDataPointColors(ASeries: TsChartSeries);
|
||||||
property PointsNumber: Cardinal read FPointsNumber;
|
property PointsNumber: Cardinal read FPointsNumber;
|
||||||
property Workbook: TsWorkbook read GetWorkbook;
|
property Workbook: TsWorkbook read GetWorkbook;
|
||||||
@ -138,6 +139,7 @@ type
|
|||||||
procedure AddSeries(ASeries: TsChartSeries);
|
procedure AddSeries(ASeries: TsChartSeries);
|
||||||
procedure FixAreaSeries({%H-}AWorkbookChart: TsChart);
|
procedure FixAreaSeries({%H-}AWorkbookChart: TsChart);
|
||||||
procedure FixBarSeries(AWorkbookChart: TsChart);
|
procedure FixBarSeries(AWorkbookChart: TsChart);
|
||||||
|
procedure FixSource(AChartSeries: TBasicPointSeries);
|
||||||
procedure ClearChart;
|
procedure ClearChart;
|
||||||
procedure ConstructHatchPattern(AWorkbookChart: TsChart; AFill: TsChartFill; ABrush: TBrush);
|
procedure ConstructHatchPattern(AWorkbookChart: TsChart; AFill: TsChartFill; ABrush: TBrush);
|
||||||
procedure ConstructHatchPatternSolid(AWorkbookChart: TsChart; AFill: TsChartFill; ABrush: TBrush);
|
procedure ConstructHatchPatternSolid(AWorkbookChart: TsChart; AFill: TsChartFill; ABrush: TBrush);
|
||||||
@ -197,8 +199,15 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
TBasicPointSeriesOpener = class(TBasicPointSeries);
|
TBasicPointSeriesOpener = class(TBasicPointSeries);
|
||||||
|
|
||||||
TsCustomLineSeriesOpener = class(TsCustomLineSeries);
|
TsCustomLineSeriesOpener = class(TsCustomLineSeries);
|
||||||
|
|
||||||
|
TErrorbarSeries = class(TBasicPointSeries)
|
||||||
|
public
|
||||||
|
property XErrorBars;
|
||||||
|
property YErrorBars;
|
||||||
|
end;
|
||||||
|
|
||||||
function mmToPx(mm: Double; ppi: Integer): Integer;
|
function mmToPx(mm: Double; ppi: Integer): Integer;
|
||||||
begin
|
begin
|
||||||
Result := round(mmToIn(mm * ppi));
|
Result := round(mmToIn(mm * ppi));
|
||||||
@ -331,6 +340,7 @@ end;
|
|||||||
constructor TsWorkbookChartSource.Create(AOwner: TComponent);
|
constructor TsWorkbookChartSource.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
|
FCurItemIndex := -1;
|
||||||
ClearRanges;
|
ClearRanges;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -473,6 +483,12 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
value: Double;
|
value: Double;
|
||||||
begin
|
begin
|
||||||
|
if AIndex = FCurItemIndex then
|
||||||
|
begin
|
||||||
|
Result := @FCurItem;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
for i := 0 to XCount-1 do
|
for i := 0 to XCount-1 do
|
||||||
begin
|
begin
|
||||||
if (FRanges[rngX, i] <> nil) then
|
if (FRanges[rngX, i] <> nil) then
|
||||||
@ -510,6 +526,7 @@ begin
|
|||||||
FCurItem.Color := round(dummyNumber);
|
FCurItem.Color := round(dummyNumber);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
FCurItemIndex := AIndex;
|
||||||
Result := @FCurItem;
|
Result := @FCurItem;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -884,8 +901,10 @@ begin
|
|||||||
FRanges[ARangeIndex, AListIndex, 0].Row2 := ARange.Row2;
|
FRanges[ARangeIndex, AListIndex, 0].Row2 := ARange.Row2;
|
||||||
FRanges[ARangeIndex, AListIndex, 0].Col2 := ARange.Col2;
|
FRanges[ARangeIndex, AListIndex, 0].Col2 := ARange.Col2;
|
||||||
FWorksheets[ARangeIndex, AListIndex] := FworkbookSource.Workbook.GetWorksheetByName(ARange.Sheet1);
|
FWorksheets[ARangeIndex, AListIndex] := FworkbookSource.Workbook.GetWorksheetByName(ARange.Sheet1);
|
||||||
if ARangeIndex in [rngX, rngY] then
|
case ARangeIndex of
|
||||||
|
rngX, rngY:
|
||||||
FPointsNumber := Max(CountValues(rngX), CountValues(rngY));
|
FPointsNumber := Max(CountValues(rngX), CountValues(rngY));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
@ -917,9 +936,11 @@ begin
|
|||||||
FTitleSheetName := Addr.GetSheetName;
|
FTitleSheetName := Addr.GetSheetName;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsWorkbookChartSource.SetXErrorBarRange(ARange: TsChartRange);
|
procedure TsWorkbookChartSource.SetXErrorBarRange(APosRange, ANegRange: TsChartRange);
|
||||||
begin
|
begin
|
||||||
SetRangeFromChart(rngXErrors, 0, ARange);
|
// TAChart supports error bars only for single-valued sources.
|
||||||
|
SetRangeFromChart(rngXErrors, 0, APosRange);
|
||||||
|
SetRangeFromChart(rngXErrors, 1, ANegRange)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsWorkbookChartSource.SetXRange(XIndex: Integer; ARange: TsChartRange);
|
procedure TsWorkbookChartSource.SetXRange(XIndex: Integer; ARange: TsChartRange);
|
||||||
@ -927,9 +948,11 @@ begin
|
|||||||
SetRangeFromChart(rngX, XIndex, ARange);
|
SetRangeFromChart(rngX, XIndex, ARange);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsWorkbookChartSource.SetYErrorBarRange(ARange: TsChartRange);
|
procedure TsWorkbookChartSource.SetYErrorBarRange(APosRange, ANegRange: TsChartRange);
|
||||||
begin
|
begin
|
||||||
SetRangeFromChart(rngYErrors, 0, ARange);
|
// TAChart supports error bars only for single-valued sources.
|
||||||
|
SetRangeFromChart(rngYErrors, 0, APosRange);
|
||||||
|
SetRangeFromChart(rngYErrors, 1, ANegRange);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsWorkbookChartSource.SetYRange(YIndex: Integer; ARange: TsChartRange);
|
procedure TsWorkbookChartSource.SetYRange(YIndex: Integer; ARange: TsChartRange);
|
||||||
@ -1551,6 +1574,74 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TsWorkbookChartLink.FixSource(AChartSeries: TBasicPointSeries);
|
||||||
|
var
|
||||||
|
i, j, nx, ny: Integer;
|
||||||
|
src: TsWorkbookChartSource;
|
||||||
|
calcsrc: TCalculatedChartSource;
|
||||||
|
begin
|
||||||
|
if AChartSeries.Source is TCalculatedChartSource then
|
||||||
|
begin
|
||||||
|
calcSrc := TCalculatedChartSource(AChartSeries.Source);
|
||||||
|
if calcSrc.Origin is TsWorkbookChartSource then
|
||||||
|
src := TsWorkbookChartSource(calcSrc.Origin)
|
||||||
|
else
|
||||||
|
exit;
|
||||||
|
end else
|
||||||
|
if AChartSeries.Source is TsWorkbookChartSource then
|
||||||
|
src := TsWorkbookChartSource(AChartSeries.Source)
|
||||||
|
else
|
||||||
|
exit;
|
||||||
|
|
||||||
|
{ TAChart does supports error bars only for single-values chart sources. Only
|
||||||
|
when FixSource is called it is known how many values are used by the source.
|
||||||
|
If ranges have been added as rngXErrors or rgnYErrors display of error bars
|
||||||
|
must be turned off in this case. Otherwise the main series would not be
|
||||||
|
shown correctly. }
|
||||||
|
if (src.XCount > 0) and (Length(src.FRanges[rngXErrors]) > 0) then
|
||||||
|
src.XErrorBarData.Kind := ebkNone;
|
||||||
|
|
||||||
|
if (src.YCount > 1) and (Length(src.FRanges[rngYErrors]) > 0) then
|
||||||
|
src.YErrorbarData.Kind := ebkNone;
|
||||||
|
|
||||||
|
{ If we get error bar values from the worksheet the range information must
|
||||||
|
be added to the rngX/rngY ranges because the Worksheet chartsource expects
|
||||||
|
it to be there at the index specified in [X|Y]ErrorBarData.Index[Plus|Minus]. }
|
||||||
|
if src.XErrorBarData.Kind = ebkChartSource then
|
||||||
|
begin
|
||||||
|
nx := src.XCount;
|
||||||
|
SetLength(src.FRanges[rngX], nx + Length(src.FRanges[rngXErrors]));
|
||||||
|
SetLength(src.FWorksheets[rngX], Length(src.FRanges[rngX]));
|
||||||
|
for i := 0 to High(src.FRanges[rngXErrors]) do
|
||||||
|
begin
|
||||||
|
src.FRanges[rngX, nx + i] := src.FRanges[rngXErrors, i];
|
||||||
|
src.FWorksheets[rngX, nx + i] := src.FWorksheets[rngXErrors, i];
|
||||||
|
if odd(i) then
|
||||||
|
src.XErrorBarData.IndexMinus := nx + i
|
||||||
|
else
|
||||||
|
src.XErrorBarData.IndexPlus := nx + i;
|
||||||
|
end;
|
||||||
|
src.XCount := Length(src.FRanges[rngX]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if src.YErrorBarData.Kind = ebkChartSource then
|
||||||
|
begin
|
||||||
|
ny := src.YCount;
|
||||||
|
SetLength(src.FRanges[rngY], ny + Length(src.FRanges[rngYErrors]));
|
||||||
|
SetLength(src.FWorksheets[rngY], Length(src.FRanges[rngY]));
|
||||||
|
for i := 0 to High(src.FRanges[rngYErrors]) do
|
||||||
|
begin
|
||||||
|
src.FRanges[rngY, ny + i] := src.FRanges[rngYErrors, i];
|
||||||
|
src.FWorksheets[rngY, ny + i] := src.FWorksheets[rngYErrors, i];
|
||||||
|
if odd(i) then
|
||||||
|
src.YErrorBarData.IndexMinus := ny + i
|
||||||
|
else
|
||||||
|
src.YErrorBarData.IndexPlus := ny + i;
|
||||||
|
end;
|
||||||
|
src.YCount := Length(src.Franges[rngY]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TsWorkbookChartLink.GetAutoScaleAxisTransform(AChartAxis: TChartAxis): TAutoScaleAxisTransform;
|
function TsWorkbookChartLink.GetAutoScaleAxisTransform(AChartAxis: TChartAxis): TAutoScaleAxisTransform;
|
||||||
begin
|
begin
|
||||||
Result := TAutoScaleAxisTransform(GetAxisTransform(AChartAxis, TAutoScaleAxisTransform));
|
Result := TAutoScaleAxisTransform(GetAxisTransform(AChartAxis, TAutoScaleAxisTransform));
|
||||||
@ -1757,6 +1848,10 @@ begin
|
|||||||
for i := 0 to ch.Series.Count-1 do
|
for i := 0 to ch.Series.Count-1 do
|
||||||
AddSeries(ch.Series[i]);
|
AddSeries(ch.Series[i]);
|
||||||
|
|
||||||
|
for i := 0 to FChart.SeriesCount-1 do
|
||||||
|
if FChart.Series[i] is TBasicPointSeries then
|
||||||
|
FixSource(TBasicPointSeries(FChart.Series[i]));
|
||||||
|
|
||||||
FChart.Prepare;
|
FChart.Prepare;
|
||||||
UpdateChartAxisLabels(ch);
|
UpdateChartAxisLabels(ch);
|
||||||
FixAreaSeries(ch);
|
FixAreaSeries(ch);
|
||||||
@ -1989,13 +2084,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
type
|
|
||||||
TErrorbarSeries = class(TBasicPointSeries)
|
|
||||||
public
|
|
||||||
property XErrorBars;
|
|
||||||
property YErrorBars;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TsWorkbookChartLink.UpdateChartErrorBars(AWorkbookSeries: TsChartSeries;
|
procedure TsWorkbookChartLink.UpdateChartErrorBars(AWorkbookSeries: TsChartSeries;
|
||||||
ASeries: TBasicPointSeries);
|
ASeries: TBasicPointSeries);
|
||||||
const
|
const
|
||||||
@ -2016,34 +2104,33 @@ var
|
|||||||
series: TErrorBarSeries;
|
series: TErrorBarSeries;
|
||||||
source: TsWorkbookChartSource;
|
source: TsWorkbookChartSource;
|
||||||
begin
|
begin
|
||||||
|
series := TErrorBarSeries(ASeries);
|
||||||
source := GetChartSource(ASeries.Source);
|
source := GetChartSource(ASeries.Source);
|
||||||
if source = nil then
|
if source = nil then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
series := TErrorBarSeries(ASeries);
|
// TAChart supports error bars only for single-values sources!
|
||||||
|
if source.XCount = 1 then
|
||||||
|
begin
|
||||||
series.XErrorBars.Visible := AWorkbookSeries.XErrorBars.ShowPos or AWorkbookSeries.XErrorBars.ShowNeg;;
|
series.XErrorBars.Visible := AWorkbookSeries.XErrorBars.ShowPos or AWorkbookSeries.XErrorBars.ShowNeg;;
|
||||||
series.YErrorBars.Visible := AWorkbookSeries.YErrorBars.ShowPos or AWorkbookSeries.YErrorBars.ShowNeg;;
|
|
||||||
|
|
||||||
UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.XErrorBars.Line, series.XErrorBars.Pen);
|
UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.XErrorBars.Line, series.XErrorBars.Pen);
|
||||||
UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.YErrorBars.Line, series.YErrorBars.Pen);
|
|
||||||
|
|
||||||
source.XErrorBarData.Kind := ERRORBAR_KINDS[AWorkbookSeries.XErrorBars.Kind];
|
source.XErrorBarData.Kind := ERRORBAR_KINDS[AWorkbookSeries.XErrorBars.Kind];
|
||||||
source.YErrorBarData.Kind := ERRORBAR_KINDS[AWorkbookSeries.YErrorBars.Kind];
|
|
||||||
|
|
||||||
source.XErrorBarData.ValuePlus := AWorkbookSeries.XErrorBars.ValuePos;
|
source.XErrorBarData.ValuePlus := AWorkbookSeries.XErrorBars.ValuePos;
|
||||||
source.YErrorBarData.ValuePlus := AWorkbookSeries.YErrorBars.ValuePos;
|
|
||||||
|
|
||||||
source.XErrorBarData.ValueMinus := AWorkbookSeries.XErrorBars.ValueNeg;
|
source.XErrorBarData.ValueMinus := AWorkbookSeries.XErrorBars.ValueNeg;
|
||||||
|
if (AWorkbookSeries.XErrorBars.Kind = cebkCellRange) then
|
||||||
|
source.SetXErrorBarRange(AWorkbookSeries.XErrorBars.RangePos, AWorkbookSeries.XErrorBars.RangeNeg);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if source.YCount = 1 then
|
||||||
|
begin
|
||||||
|
series.YErrorBars.Visible := AWorkbookSeries.YErrorBars.ShowPos or AWorkbookSeries.YErrorBars.ShowNeg;;
|
||||||
|
UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.YErrorBars.Line, series.YErrorBars.Pen);
|
||||||
|
source.YErrorBarData.Kind := ERRORBAR_KINDS[AWorkbookSeries.YErrorBars.Kind];
|
||||||
|
source.YErrorBarData.ValuePlus := AWorkbookSeries.YErrorBars.ValuePos;
|
||||||
source.YErrorBarData.ValueMinus := AWorkbookSeries.YErrorBars.ValueNeg;
|
source.YErrorBarData.ValueMinus := AWorkbookSeries.YErrorBars.ValueNeg;
|
||||||
|
if (AWorkbookSeries.YErrorBars.Kind = cebkCellRange) then
|
||||||
{ To do: pass the cell range to the workbookchartsource. There's a problem
|
source.SetYErrorBarRange(AWorkbookSeries.YErrorBars.RangePos, AWorkbookSeries.YErrorBars.RangeNeg);
|
||||||
with the following code that TAChart assumes the error values to be stored
|
end;
|
||||||
in additional x and y values of the TChartDataItem...
|
|
||||||
|
|
||||||
if AWorkbookSeries.XErrorBars.Kind = cebkRange then
|
|
||||||
source.SetXErrorBarRange(AWorkbookSeries.XErrorBars.Range
|
|
||||||
}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TsWorkbookChartLink.UpdateChartLegend(AWorkbookLegend: TsChartLegend;
|
procedure TsWorkbookChartLink.UpdateChartLegend(AWorkbookLegend: TsChartLegend;
|
||||||
|
Reference in New Issue
Block a user