You've already forked lazarus-ccr
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:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user