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 var
MyFormula: TsFormula; MyFormula: TsFormula;
MyRPNFormula: TsRPNFormula; MyRPNFormula: TsRPNFormula;
MyCell: PCell;
begin begin
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1'); MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
@@ -61,6 +62,15 @@ begin
RPNNumber(4.0, RPNNumber(4.0,
RPNNumber(5.0, RPNNumber(5.0,
RPNFunc(fekAdd, nil))))); 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; end;
procedure WriteSecondWorksheet(); procedure WriteSecondWorksheet();

View File

@@ -1007,9 +1007,9 @@ begin
begin begin
AElement.ElementKind := fekCell; AElement.ElementKind := fekCell;
if (rfRelRow in AElement.RelFlags) then 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 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;
end; end;

View File

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