fpspreadsheet: Fix shared formula incorrectly written assigned to cell row. Add shared formula to demo_write_formula.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3496 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2014-08-19 10:15:35 +00:00
parent f6845282d9
commit 2e236d1fe7
3 changed files with 15 additions and 4 deletions

View File

@ -23,6 +23,7 @@ procedure WriteFirstWorksheet();
var
MyFormula: TsFormula;
MyRPNFormula: TsRPNFormula;
MyCell: PCell;
begin
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
@ -61,6 +62,15 @@ begin
RPNNumber(4.0,
RPNNumber(5.0,
RPNFunc(fekAdd, nil)))));
// Write a shared formula "=E1+100" to the cell range F1:F5
// Please note that shared formulas are not written by sfOOXML and sfOpenDocument formats.
MyCell := MyWorksheet.WriteRPNFormula(0, 5, CreateRPNFormula(
RPNCellOffset(0, -1, [rfRelRow, rfRelCol],
RPNNumber(100,
RPNFunc(fekAdd, nil)))));
MyWorksheet.UseSharedFormula('F1:F5', MyCell);
end;
procedure WriteSecondWorksheet();

View File

@ -1007,9 +1007,9 @@ begin
begin
AElement.ElementKind := fekCell;
if (rfRelRow in AElement.RelFlags) then
AElement.Row := Integer(ACell^.Row) + Integer(AElement.Row); // AElement.Row means here: "RowOffsset"
AElement.Row := ACell^.Row + Integer(AElement.Row); // AElement.Row means here: "RowOffsset"
if (rfRelCol in AElement.RelFlags) then
AElement.Col := Integer(ACell^.Col) + Integer(AElement.Col); // AElement.Col means here: "ColOffsset"
AElement.Col := ACell^.Col + Integer(AElement.Col); // AElement.Col means here: "ColOffsset"
end;
end;

View File

@ -2397,7 +2397,8 @@ begin
if (rfRelCol in AFlags) then r := r + MASK_EXCEL_RELATIVE_COL;
AStream.WriteWord(WordToLE(r));
// Column address
c := Lo(AColOffset);
c := Lo(word(AColOffset));
//c := Lo(AColOffset);
AStream.WriteByte(c);
// Number of bytes written
Result := 3;
@ -2910,7 +2911,7 @@ begin
while r <= FWorksheet.GetLastRowIndex do
begin
cell := FWorksheet.FindCell(r, c);
if (cell <> nil) and (cell^.SharedFormulaBase <> ACell^.SharedFormulaBase) then
if (cell <> nil) and (cell^.SharedFormulaBase = ACell^.SharedFormulaBase) then
r2 := r
else
break;