From baf8abdc4023f440c0b6733fe45ec8a6016b73f1 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 26 Nov 2023 23:04:52 +0000 Subject: [PATCH] fpspreadsheet: Update workbookchartsource demo to show multiple-y-values feature. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9046 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../workbookchartsource/fpschartsource.lpi | 3 + .../fpschart/workbookchartsource/mainform.lfm | 80 +++++++++++------- .../fpschart/workbookchartsource/mainform.pas | 24 ++++-- .../workbookchartsource/test-data.xlsx | Bin 13106 -> 14478 bytes .../source/visual/fpspreadsheetchart.pas | 63 +++++++++----- 5 files changed, 108 insertions(+), 62 deletions(-) diff --git a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/fpschartsource.lpi b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/fpschartsource.lpi index 2cf944a0f..7ef3e16a0 100644 --- a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/fpschartsource.lpi +++ b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/fpschartsource.lpi @@ -61,6 +61,9 @@ + + + diff --git a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.lfm b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.lfm index b2dde7172..7a74bf880 100644 --- a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.lfm +++ b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.lfm @@ -2,22 +2,22 @@ object Form1: TForm1 Left = 256 Height = 618 Top = 127 - Width = 828 + Width = 1047 Caption = 'Form1' ClientHeight = 618 - ClientWidth = 828 + ClientWidth = 1047 + LCLVersion = '3.99.0.0' OnCreate = FormCreate - LCLVersion = '1.8.4.0' object Panel1: TPanel Left = 0 Height = 33 Top = 0 - Width = 828 + Width = 1047 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 33 - ClientWidth = 828 + ClientWidth = 1047 TabOrder = 0 object BtnDeleteSheet: TButton AnchorSideLeft.Control = Panel1 @@ -32,8 +32,8 @@ object Form1: TForm1 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 Caption = 'Delete sheet' - OnClick = BtnDeleteSheetClick TabOrder = 0 + OnClick = BtnDeleteSheetClick end object BtnRenameSheet: TButton AnchorSideLeft.Control = BtnDeleteSheet @@ -48,15 +48,15 @@ object Form1: TForm1 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 Caption = 'Rename sheet' - OnClick = BtnRenameSheetClick TabOrder = 1 + OnClick = BtnRenameSheetClick end end object sWorkbookTabControl1: TsWorkbookTabControl Left = 5 Height = 581 Top = 37 - Width = 280 + Width = 475 TabIndex = 0 Tabs.Strings = ( 'Sheet1' @@ -68,10 +68,12 @@ object Form1: TForm1 Left = 2 Height = 556 Top = 23 - Width = 276 + Width = 471 AutoCalc = True FrozenCols = 0 FrozenRows = 0 + PageBreakPen.Color = clBlue + PageBreakPen.Style = psDash ReadFormulas = True WorkbookSource = sWorkbookSource1 Align = alClient @@ -84,10 +86,10 @@ object Form1: TForm1 end end object Panel2: TPanel - Left = 285 + Left = 480 Height = 581 Top = 37 - Width = 543 + Width = 567 Align = alClient BevelOuter = bvNone ChildSizing.EnlargeHorizontal = crsHomogenousChildResize @@ -97,13 +99,13 @@ object Form1: TForm1 ChildSizing.Layout = cclLeftToRightThenTopToBottom ChildSizing.ControlsPerLine = 1 ClientHeight = 581 - ClientWidth = 543 + ClientWidth = 567 TabOrder = 2 object Chart1: TChart Left = 0 Height = 194 Top = 0 - Width = 543 + Width = 567 AxisList = < item Grid.Color = clSilver @@ -128,17 +130,16 @@ object Form1: TForm1 'Chart from 1st sheet' ) Title.Visible = True - object Chart1AreaSeries1: TAreaSeries - AreaBrush.Color = clSkyBlue - AreaLinesPen.Style = psClear + object Chart1LineSeries1: TLineSeries Source = sWorkbookChartSource1 + Styles = ChartStyles1 end end object Chart2: TChart Left = 0 Height = 194 Top = 194 - Width = 543 + Width = 567 AxisList = < item Grid.Color = clSilver @@ -164,6 +165,9 @@ object Form1: TForm1 ) Title.Visible = True object Chart2BarSeries1: TBarSeries + BarBrush.Color = 9934847 + BarWidthStyle = bwPercentMin + Depth = 6 Marks.Distance = 5 Marks.Format = '%.2f' Marks.Frame.Visible = False @@ -171,8 +175,6 @@ object Form1: TForm1 Marks.LinkPen.Color = clGray Marks.OverlapPolicy = opHideNeighbour Marks.Style = smsCustom - BarBrush.Color = 9934847 - Depth = 6 Source = sWorkbookChartSource2 end end @@ -180,7 +182,7 @@ object Form1: TForm1 Left = 0 Height = 193 Top = 388 - Width = 543 + Width = 567 AxisList = < item Visible = False @@ -208,10 +210,11 @@ object Form1: TForm1 Title.Visible = True object Chart3PieSeries1: TPieSeries Legend.Multiplicity = lmPoint + Exploded = True + MarkPositions = pmpInside Marks.Distance = 10 Marks.Format = '%2:s' Marks.Style = smsLabel - MarkPositions = pmpInside Source = sWorkbookChartSource3 end end @@ -220,7 +223,7 @@ object Form1: TForm1 Left = 0 Height = 4 Top = 33 - Width = 828 + Width = 1047 Align = alTop Shape = bsTopLine end @@ -233,22 +236,39 @@ object Form1: TForm1 object sWorkbookSource1: TsWorkbookSource FileFormat = sfUser Options = [boAutoCalc, boReadFormulas] - left = 152 - top = 184 + Left = 152 + Top = 184 end object sWorkbookChartSource3: TsWorkbookChartSource WorkbookSource = sWorkbookSource1 - left = 544 - top = 503 + Left = 544 + Top = 503 end object sWorkbookChartSource2: TsWorkbookChartSource WorkbookSource = sWorkbookSource1 - left = 544 - top = 316 + Left = 544 + Top = 316 end object sWorkbookChartSource1: TsWorkbookChartSource WorkbookSource = sWorkbookSource1 - left = 544 - top = 120 + Left = 544 + Top = 120 + end + object ChartStyles1: TChartStyles + Styles = < + item + Brush.Color = clRed + Pen.Color = clRed + end + item + Brush.Color = clBlue + Pen.Color = clBlue + end + item + Brush.Color = clYellow + Pen.Color = clOlive + end> + Left = 688 + Top = 120 end end diff --git a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.pas b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.pas index d7905fcd3..1b88b97d0 100644 --- a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.pas +++ b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/mainform.pas @@ -5,9 +5,9 @@ unit mainform; interface uses - Classes, SysUtils, FileUtil, TAGraph, TASources, TASeries, Forms, Controls, - Graphics, Dialogs, ExtCtrls, StdCtrls, fpspreadsheetctrls, fpspreadsheetgrid, - fpspreadsheetchart, fpsallformats; + Classes, SysUtils, FileUtil, TAGraph, TASources, TASeries, TAStyles, Forms, + Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, fpspreadsheetctrls, + fpspreadsheetgrid, fpspreadsheetchart, fpsallformats; type @@ -16,13 +16,16 @@ type TForm1 = class(TForm) Bevel1: TBevel; BtnDeleteSheet: TButton; + BtnRenameSheet: TButton; Button2: TButton; Chart1: TChart; - Chart1AreaSeries1: TAreaSeries; + Chart1AreaSeries1: TLineSeries; + Chart1LineSeries1: TLineSeries; Chart2: TChart; Chart2BarSeries1: TBarSeries; Chart3: TChart; Chart3PieSeries1: TPieSeries; + ChartStyles1: TChartStyles; Panel1: TPanel; Panel2: TPanel; Splitter1: TSplitter; @@ -53,11 +56,14 @@ implementation procedure TForm1.FormCreate(Sender: TObject); begin sWorkbookSource1.Filename := 'test-data.xlsx'; - sWorkbookChartSource1.XRange := 'Sheet1!A2:A21'; - sWorkbookChartSource1.YRange := 'Sheet1!B2:B21'; - sWorkbookChartSource2.XRange := 'Sheet2!A2:A16'; - sWorkbookChartSource2.YRange := 'Sheet2!B2:B16'; - sWorkbookChartSource3.XRange := 'Sheet3!A2:A5'; + + sWorkbookChartSource1.XRange := 'Sheet1!A2:A32'; + sWorkbookChartSource1.YRange := '(Sheet1!B2:B32) (Sheet1!C2:C32) (Sheet1!D2:D17;Sheet1!E18:E32)'; + + sWorkbookChartSource2.XRange := 'Sheet2!A2:A27'; + sWorkbookChartSource2.YRange := 'Sheet2!B2:B27'; + + sWorkbookChartSource3.XRange := 'Sheet3!C2:C5'; sWorkbookChartSource3.YRange := 'Sheet3!B2:B5'; sWorkbookChartSource3.LabelRange := 'Sheet3!A2:A5'; end; diff --git a/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/test-data.xlsx b/components/fpspreadsheet/examples/visual/fpschart/workbookchartsource/test-data.xlsx index 9ad612dbfab0715295fcd9c545ce36027e275141..0d885c44b2ea840e54a8ec3a9fbed52bd7a63988 100644 GIT binary patch delta 10052 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 L^U+AYzefKDTmPA! delta 8848 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 diff --git a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas index 20a3cec18..3ce2d6af4 100644 --- a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas +++ b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas @@ -524,16 +524,16 @@ end; and to worksheet changes by selecting the tab corresponding to the selected worksheet. - @param AChangedItems Set with elements identifying whether workbook, - worksheet, cell content or cell formatting has changed - @param AData Additional data, not used here + (@param AChangedItems Set of elements identifying whether workbook, + worksheet, cell content or cell formatting has changed) + (@param AData Additional data, contains the worksheet for worksheet-related items) @see TsNotificationItem -------------------------------------------------------------------------------} procedure TsWorkbookChartSource.ListenerNotification( AChangedItems: TsNotificationItems; AData: Pointer = nil); var - ir, i: Integer; + ir, i, j: Integer; cell: PCell; ResetDone: Boolean; rng: TsXYLRange; @@ -555,13 +555,25 @@ begin // Used worksheet will be deleted? if (lniWorksheetRemoving in AChangedItems) then + begin for rng in TsXYLRange do for i := 0 to High(FWorksheets[rng]) do - if TsWorksheet(AData) = FWorksheets[rng, i] then begin - FWorksheets[rng] := nil; - FRangeStr[rng] := BuildRangeStr(rng); - Prepare(rng); + if TsWorksheet(AData) = FWorksheets[rng, i] then + begin + for j := i+1 to High(FWorksheets[rng]) do + FWorksheets[rng, j-1] := FWorksheets[rng, j]; + SetLength(FWorkSheets[rng], Length(FWorksheets[rng])-1); + for j := i+1 to High(FRanges[rng]) do + FRanges[rng, j-1] := FRanges[rng, j]; + SetLength(FRanges[rng], Length(FRanges[rng])-1); end; + for rng in TsXYLRange do + begin + FRangeStr[rng] := BuildRangeStr(rng); + Prepare(rng); + end; + Reset; + end; // Cell changes: Enforce recalculation of axes if modified cell is within the // x or y range(s). @@ -625,12 +637,28 @@ var ok: Boolean; i, j: Integer; begin + if (FWorkbookSource = nil) then + begin + FPointsNumber := 0; + Reset; + exit; + end; + + s := FRangeStr[AIndex]; + if (s = '') then + begin + if AIndex = rngY then + begin + FPointsNumber := 0; + Reset; + exit; + end; + end; + // Split range string into parts for the individual xindex and yindex parts. // Each part is enclosed by parenthesis. // Example for two y ranges: // '(A1:A10) (B1:B5;B6:B11)' --> 1st y range is A1:A10, 2nd y range is B1:B5 and B6:B11 - s := ''; - s := FRangeStr[AIndex]; if (s <> '') and (s[Length(s)] = ')') then Delete(s, Length(s), 1); for i := 1 to Length(s) do @@ -656,17 +684,6 @@ begin else ; end; - // Trivial valdiation - if (Workbook = nil) or (not ok) then - begin - FWorksheets[AIndex] := nil; - SetLength(FRanges[AIndex], 0); - if AIndex = rngY then - FPointsNumber := 0; - Reset; - exit; - end; - // Extract range parameters and store them in FRanges SetLength(FRanges[AIndex], Length(sa)); SetLength(FWorksheets[AIndex], Length(sa)); @@ -682,8 +699,8 @@ begin Reset; end else if (Workbook.GetWorksheetCount > 0) then begin - if FWorksheets[AIndex] = nil then - exit; + if FWorksheets[AIndex, i] = nil then + raise Exception.Create('Worksheet not found in ' + sa[i]); end; end; // Make sure to include worksheet name in RangeString.