fpspreadsheet: Replace previous commit (was buggy)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6467 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-06-05 19:23:19 +00:00
parent 23b19c86c5
commit 40092c09e2

View File

@@ -1945,14 +1945,12 @@ procedure TsWorksheet.CopyFormula(AFromCell, AToCell: PCell);
var var
srcBook, destBook: TsWorkbook; srcBook, destBook: TsWorkbook;
srcSheet, destSheet: TsWorksheet; srcSheet, destSheet: TsWorksheet;
referencedSrcSheet, referencedDestSheet: TsWorksheet; referencedSheet: TsWorksheet;
referencedSrcSheet2, referencedDestSheet2: TsWorksheet; sheetName: String;
tmpSrcSheet, tmpDestSheet: TsWorksheet;
srcCell, destCell: PCell;
srcFormula, destFormula: PsFormula; srcFormula, destFormula: PsFormula;
rpn: TsRPNFormula; rpn: TsRPNFormula;
elem: TsFormulaElement; elem: TsFormulaElement;
i, j, r, c: Integer; i, j: Integer;
begin begin
if (AFromCell = nil) or (AToCell = nil) then if (AFromCell = nil) or (AToCell = nil) then
exit; exit;
@@ -1969,35 +1967,27 @@ begin
srcFormula := srcSheet.Formulas.FindFormula(AFromCell^.Row, AFromCell^.Col); srcFormula := srcSheet.Formulas.FindFormula(AFromCell^.Row, AFromCell^.Col);
destFormula := destSheet.Formulas.AddFormula(AToCell^.Row, AToCell^.Col); destFormula := destSheet.Formulas.AddFormula(AToCell^.Row, AToCell^.Col);
// destFormula.Parser := TsSpreadsheetParser.Create(self); // wp: why "self" ?
destFormula.Parser := TsSpreadsheetParser.Create(destSheet); destFormula.Parser := TsSpreadsheetParser.Create(destSheet);
srcFormula^.Parser.PrepareCopyMode(AFromCell, AToCell); srcFormula^.Parser.PrepareCopyMode(AFromCell, AToCell);
try try
rpn := srcFormula^.Parser.RPNFormula; rpn := srcFormula^.Parser.RPNFormula;
// Make sure that referenced sheets exist in destination workbook
for i:=0 to High(rpn) do begin for i:=0 to High(rpn) do begin
elem := rpn[i]; elem := rpn[i];
if elem.ElementKind in [fekCell3D, fekCellRef3d, fekCellRange3d] then begin if elem.ElementKind in [fekCell3D, fekCellRef3d, fekCellRange3d] then begin
referencedSrcSheet := srcBook.GetWorksheetByIndex(elem.Sheet); sheetName := srcBook.GetWorksheetByIndex(elem.Sheet).Name;
referencedDestSheet := destBook.GetWorksheetByIndex(elem.Sheet); referencedSheet := destBook.GetWorksheetByName(sheetName);
referencedSrcSheet2 := srcBook.GetWorksheetByIndex(elem.Sheet2); if referencedSheet = nil then
referencedDestSheet2 := destBook.GetWorksheetByIndex(elem.Sheet2); referencedSheet := destBook.AddWorksheet(sheetName);
if referencedDestSheet = nil then rpn[i].Sheet := destBook.GetWorksheetIndex(referencedSheet);
referencedDestSheet := destBook.AddWorksheet(referencedSrcSheet.Name); if (elem.Sheet = elem.Sheet2) or (elem.Sheet2 = -1) then
if (referencedDestSheet2 = nil) and (elem.Sheet2 <> -1) then continue;
referencedDestSheet2 := destbook.AddWorksheet(referencedSrcSheet2.Name); sheetName := srcBook.GetWorksheetByIndex(elem.Sheet2).Name;
for j:=elem.Sheet to elem.Sheet2 do begin referencedSheet := destBook.GetWorksheetByName(sheetName);
tmpSrcSheet := srcBook.GetWorksheetByIndex(j); if referencedSheet = nil then
tmpDestSheet := destBook.GetWorksheetByIndex(j); referencedSheet := destBook.AddWorksheet(sheetName);
for r := elem.Row to elem.Row2 do rpn[i].Sheet2 := destBook.GetWorksheetIndex(referencedSheet);
for c := elem.Col to elem.Col2 do begin
srcCell := tmpSrcSheet.FindCell(r, c);
if srcCell = nil then
continue;
destCell := tmpDestSheet.GetCell(r, c);
tmpDestSheet.CopyCell(srcCell, destcell);
end;
end;
end; end;
end; end;
destFormula^.Parser.RPNFormula := rpn; destFormula^.Parser.RPNFormula := rpn;
@@ -2006,7 +1996,6 @@ begin
finally finally
srcFormula^.Parser.PrepareCopyMode(nil, nil); srcFormula^.Parser.PrepareCopyMode(nil, nil);
end; end;
ChangedCell(AToCell^.Row, AToCell^.Col); ChangedCell(AToCell^.Row, AToCell^.Col);
end; end;
@@ -9754,7 +9743,7 @@ begin
if ActiveWorksheet.IsMerged(srccell) then if ActiveWorksheet.IsMerged(srccell) then
srccell := ActiveWorksheet.FindMergeBase(srccell); srccell := ActiveWorksheet.FindMergeBase(srccell);
if srccell <> nil then begin if srccell <> nil then begin
destcell := clipsheet.AddCell(r, c); destcell := clipsheet.GetCell(r, c); // wp: why was there AddCell?
clipsheet.CopyCell(srccell, destcell); clipsheet.CopyCell(srccell, destcell);
end; end;
end; end;