fpspreadsheet: Destroy charts along with their worksheet.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9164 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-01-23 21:30:58 +00:00
parent 82ec07edc6
commit 1c088daf23
6 changed files with 51 additions and 20 deletions

View File

@ -733,7 +733,8 @@ type
FName: String;
FIndex: Integer; // Index in workbook's chart list
FWorkbook: TsBasicWorkbook;
FSheetIndex: Integer;
FWorksheet: TsBasicWorksheet;
// FSheetIndex: Integer;
FRow, FCol: Cardinal;
FOffsetX, FOffsetY: Double;
FWidth, FHeight: Double; // Width, Height of the chart, in mm.
@ -766,7 +767,7 @@ type
public
constructor Create;
destructor Destroy; override;
function GetWorksheet: TsBasicWorksheet;
// function GetWorksheet: TsBasicWorksheet;
procedure DeleteSeries(AIndex: Integer);
@ -779,8 +780,12 @@ type
property Name: String read FName write FName;
{ Index of chart in workbook's chart list. }
property Index: Integer read FIndex write FIndex;
{ Worksheet into which the chart is embedded }
property Worksheet: TsBasicWorksheet read FWorksheet write FWorksheet;
(*
{ Index of worksheet sheet which contains the chart. }
property SheetIndex: Integer read FSheetIndex write FSheetIndex;
*)
{ Row index of the cell in which the chart has its top/left corner (anchor) }
property Row: Cardinal read FRow write FRow;
{ Column index of the cell in which the chart has its top/left corner (anchor) }
@ -1461,7 +1466,7 @@ begin
if Sheet <> '' then
Result := Sheet
else
Result := FChart.GetWorksheet.Name;
Result := FChart.Worksheet.Name;
end;
function TsChartCellAddr.IsUsed: Boolean;
@ -1498,7 +1503,7 @@ begin
if Sheet1 <> '' then
Result := Sheet1
else
Result := FChart.GetWorksheet.Name;
Result := FChart.Worksheet.Name;
end;
function TsChartRange.GetSheet2Name: String;
@ -1506,7 +1511,7 @@ begin
if Sheet2 <> '' then
Result := Sheet2
else
Result := FChart.GetWorksheet.Name;
Result := FChart.Worksheet.Name;
end;
function TsChartRange.IsEmpty: Boolean;
@ -2581,7 +2586,7 @@ begin
fgradients.AddLinearGradient('g1', scRed, scBlue, 0, 0, 1, 1, 0, 0);
FSheetIndex := 0;
FWorksheet := nil;
FRow := 0;
FCol := 0;
FOffsetX := 0.0;
@ -2700,11 +2705,12 @@ begin
Result := nil;
end;
{
function TsChart.GetWorksheet: TsBasicWorksheet;
begin
Result := TsWorkbook(FWorkbook).GetWorksheetByIndex(FSheetIndex);
end;
}
function TsChart.IsScatterChart: Boolean;
begin
Result := GetChartType = ctScatter;

View File

@ -9070,7 +9070,6 @@ procedure TsSpreadOpenDocWriter.WriteShapes(AStream: TStream;
var
sheet: TsWorksheet absolute ASheet;
i: Integer;
sheetIdx: Integer;
img: TsImage;
imgType: TsImageType;
r1,c1,r2,c2: Cardinal;
@ -9092,11 +9091,10 @@ begin
'<table:shapes>');
{$IFDEF FPS_CHARTS}
sheetIdx := sheet.Index;
for i:=0 to TsWorkbook(FWorkbook).GetChartCount-1 do
begin
chart := TsWorkbook(FWorkbook).GetChartByIndex(i);
if chart.SheetIndex <> sheetIdx then
if chart.Worksheet <> sheet then
Continue;
if chart.Series.Count = 0 then
Continue;

View File

@ -3251,7 +3251,7 @@ begin
if (Axis = chart.XAxis) and (not chart.IsScatterChart) and (chart.Series.Count > 0) then
begin
series := chart.Series[0];
sheet := TsWorkbook(Writer.Workbook).GetWorksheetByIndex(chart.SheetIndex);
sheet := TsWorksheet(chart.Worksheet);
r1 := series.LabelRange.Row1;
c1 := series.LabelRange.Col1;
r2 := series.LabelRange.Row2;

View File

@ -644,6 +644,8 @@ type
{$ifdef FPS_CHARTS}
{ Chart support }
function GetChartCount: Integer;
procedure RemoveAllCharts;
procedure RemoveChart(AChart: TsChart);
{$endif}
{ Protection }
@ -1273,6 +1275,9 @@ end;
-------------------------------------------------------------------------------}
destructor TsWorksheet.Destroy;
begin
{$IFDEF FPS_CHARTS}
RemoveAllCharts;
{$ENDIF}
RemoveAllImages;
RemoveAllRows;
RemoveAllCols;
@ -1582,9 +1587,35 @@ begin
for i := 0 to Workbook.GetChartCount-1 do
begin
chart := Workbook.GetChartByIndex(i);
if chart.SheetIndex = idx then inc(Result);
if chart.Worksheet = self then inc(Result);
end;
end;
{@@ ----------------------------------------------------------------------------
Destroys all charts from the worksheet
-------------------------------------------------------------------------------}
procedure TsWorksheet.RemoveAllCharts;
var
i: Integer;
begin
for i := Workbook.FCharts.Count-1 downto 0 do
if Workbook.GetChartByIndex(i).Worksheet = Self then
Workbook.FCharts.Delete(i); // This destroys the chart
end;
{@@ ----------------------------------------------------------------------------
Removes the specified chart from the worksheet and destroys it
-------------------------------------------------------------------------------}
procedure TsWorksheet.RemoveChart(AChart: TsChart);
var
idx: Integer;
begin
if AChart.Worksheet <> self then
exit;
idx := Workbook.FCharts.IndexOf(AChart);
if idx > -1 then Workbook.FCharts.Delete(idx); // This destroys the chart
end;
{$endif}
{@@ ----------------------------------------------------------------------------

View File

@ -15,7 +15,7 @@ begin
if (ASheet = nil) then
raise Exception.Create('To do: Insert chart as new ChartSheet');
Result.Workbook := self;
Result.SheetIndex := GetWorksheetIndex(ASheet);
Result.Worksheet := ASheet;
Result.Row := ARow;
Result.Col := ACol;
Result.OffsetX := AOffsetX;

View File

@ -7357,7 +7357,7 @@ procedure TsSpreadOOXMLWriter.WriteDrawings(AWorksheet: TsBasicWorksheet);
cOffs1 := AChart.OffsetY;
w := AChart.Width;
h := AChart.Height;
sheet := TsWorkbook(FWorkbook).GetWorksheetByIndex(AChart.SheetIndex);
sheet := TsWorksheet(AChart.Worksheet);
sheet.CalcDrawingExtent(true, w, h, r1, c1, r2, c2, rOffs1, cOffs1, rOffs2, cOffs2, x, y);
AppendToStream(AStream,
@ -7401,7 +7401,6 @@ var
i, j: Integer;
rId: Integer;
sheet: TsWorksheet absolute AWorksheet;
sheetIdx: Integer;
chart: TsChart;
begin
if (sheet.GetImageCount = 0) {$ifdef FPS_CHARTS}and (sheet.GetChartCount = 0){$endif} then
@ -7427,12 +7426,11 @@ begin
{$ifdef FPS_CHARTS}
// Repeat for each chart
sheetIdx := sheet.Index;
j := 1; // Counts the charts in the current sheet
for i := 0 to TsWorkbook(FWorkbook).GetChartCount - 1 do
begin
chart := TsWorkbook(FWorkbook).GetChartByIndex(i);
if chart.SheetIndex = sheetIdx then
if chart.Worksheet = AWorksheet then
begin
DoWriteChart(FSDrawings[FCurSheetNum], chart, j, rId);
inc(j);
@ -7461,7 +7459,6 @@ var
target, bookmark: String;
u: TURI;
sheet: TsWorksheet absolute AWorksheet;
sheetIdx: Integer;
begin
if (sheet.GetImageCount = 0) {$ifdef FPS_CHARTS}and (sheet.GetChartCount = 0){$endif} then
exit;
@ -7508,11 +7505,10 @@ begin
{$ifdef FPS_CHARTS}
// Repeat for each chart
sheetIdx := sheet.Index;
for i := 0 to TsWorkbook(FWorkbook).GetChartCount - 1 do
begin
chart := TsWorkbook(FWorkbook).GetChartByIndex(i);
if chart.SheetIndex = sheetIdx then
if chart.Worksheet = AWorksheet then
begin
AppendToStream(FSDrawingsRels[FCurSheetNum], Format(
' <Relationship Id="rId%d" Type="%s" Target="../charts/chart%d.xml"/>' + LE, [