diff --git a/components/fpspreadsheet/fpsexprparser.pas b/components/fpspreadsheet/fpsexprparser.pas index 4eec8de5b..495665fb3 100644 --- a/components/fpspreadsheet/fpsexprparser.pas +++ b/components/fpspreadsheet/fpsexprparser.pas @@ -186,8 +186,6 @@ type { TsOrderingExprNode } TsOrderingExprNode = class(TsBooleanResultExprNode) - protected - procedure CheckSameNodeTypes; override; public procedure Check; override; end; @@ -300,10 +298,9 @@ type TsUnaryOperationExprNode = class(TsExprNode) private FOperand: TsExprNode; - protected - procedure Check; override; public constructor Create(AParser: TsExpressionParser; AOperand: TsExprNode); + procedure Check; override; destructor Destroy; override; property Operand: TsExprNode read FOperand; end; @@ -317,11 +314,11 @@ type { TsNotExprNode } TsNotExprNode = class(TsUnaryOperationExprNode) protected - procedure Check; override; procedure GetNodeValue(var Result: TsExpressionResult); override; public function AsRPNItem(ANext: PRPNItem): PRPNItem; override; function AsString: String; override; + procedure Check; override; function NodeType: TsResultType; override; end; @@ -350,9 +347,9 @@ type { TsFloatToDateTimeExprNode } TsFloatToDateTimeExprNode = class(TsConvertExprNode) protected - procedure Check; override; procedure GetNodeValue(var Result: TsExpressionResult); override; public + procedure Check; override; function NodeType: TsResultType; override; end; @@ -404,9 +401,9 @@ type private FValue: TsExpressionResult; protected - procedure Check; override; procedure GetNodeValue(var Result: TsExpressionResult); override; public + procedure Check; override; constructor CreateString(AParser: TsExpressionParser; AValue: String); constructor CreateInteger(AParser: TsExpressionParser; AValue: Int64); constructor CreateDateTime(AParser: TsExpressionParser; AValue: TDateTime); @@ -549,6 +546,7 @@ type { TsVariableExprNode } TsVariableExprNode = class(TsIdentifierExprNode) + public procedure Check; override; function AsString: string; override; Function AsRPNItem(ANext: PRPNItem): PRPNItem; override; @@ -605,7 +603,6 @@ type FCell: PCell; FIsRef: Boolean; protected - procedure Check; override; function GetCol: Cardinal; function GetRow: Cardinal; procedure GetNodeValue(var Result: TsExpressionResult); override; @@ -616,6 +613,7 @@ type ARow, ACol: Cardinal; AFlags: TsRelFlags); overload; function AsRPNItem(ANext: PRPNItem): PRPNItem; override; function AsString: string; override; + procedure Check; override; function NodeType: TsResultType; override; property Worksheet: TsWorksheet read FWorksheet; end; @@ -628,7 +626,6 @@ type FCol1, FCol2: Cardinal; FFlags: TsRelFlags; protected - procedure Check; override; procedure GetNodeValue(var Result: TsExpressionResult); override; public constructor Create(AParser: TsExpressionParser; AWorksheet: TsWorksheet; @@ -637,6 +634,7 @@ type ARow1,ACol1, ARow2,ACol2: Cardinal; AFlags: TsRelFlags); overload; function AsRPNItem(ANext: PRPNItem): PRPNItem; override; function AsString: String; override; + procedure Check; override; function NodeType: TsResultType; override; property Worksheet: TsWorksheet read FWorksheet; end; @@ -859,7 +857,6 @@ resourcestring SErrUnknownCharacter = 'Unknown character at pos %d: "%s"'; SErrUnexpectedEndOfExpression = 'Unexpected end of expression'; SErrUnknownComparison = 'Internal error: Unknown comparison'; - SErrUnknownBooleanOp = 'Internal error: Unknown boolean operation'; SErrBracketExpected = 'Expected ) bracket at position %d, but got %s'; SerrUnknownTokenAtPos = 'Unknown token at pos %d : %s'; SErrLeftBracketExpected = 'Expected ( bracket at position %d, but got %s'; @@ -880,7 +877,6 @@ resourcestring SErrNoNOTOperation = 'Cannot perform NOT operation on expression of type %s: %s'; SErrNoPercentOperation = 'Cannot perform percent operation on expression of type %s: %s'; SErrTypesDoNotMatch = 'Type mismatch: %s<>%s for expressions "%s" and "%s".'; - SErrTypesIncompatible = 'Incompatible types: %s<>%s for expressions "%s" and "%s".'; SErrNoNodeToCheck = 'Internal error: No node to check !'; SInvalidNodeType = 'Node type (%s) not in allowed types (%s) for expression: %s'; SErrUnterminatedExpression = 'Badly terminated expression. Found token at position %d : %s'; @@ -890,7 +886,6 @@ resourcestring SErrInvalidArgumentType = 'Invalid type for argument %d: Expected %s, got %s'; SErrInvalidResultType = 'Invalid result type: %s'; SErrNotVariable = 'Identifier %s is not a variable'; - SErrInactive = 'Operation not allowed while an expression is active'; SErrCircularReference = 'Circular reference found when calculating worksheet formulas'; { --------------------------------------------------------------------- @@ -1409,9 +1404,11 @@ begin end; function TsExpressionParser.Level1: TsExprNode; +{ var tt: TsTokenType; Right: TsExprNode; + } begin {$ifdef debugexpr}Writeln('Level 1 ',TokenName(TokenType),': ',CurrentToken);{$endif debugexpr} { @@ -1425,21 +1422,6 @@ begin else } Result := Level2; - { - try - if TokenType = ttPower then - begin - tt := Tokentype; - GetToken; - CheckEOF; - Right := Level2; - Result := TsPowerExprNode.Create(Result, Right); - end; - except - Result.Free; - raise; - end; - } { try @@ -1572,7 +1554,6 @@ end; function TsExpressionParser.Level6: TsExprNode; var - tt: TsTokenType; Right: TsExprNode; currToken: String; begin @@ -1600,7 +1581,6 @@ begin begin try CheckEOF; - tt := Tokentype; GetToken; Right := Primitive; CheckNodes(Result, right); @@ -1651,7 +1631,6 @@ var ID: TsExprIdentifierDef; Args: TsExprArgumentArray; AI: Integer; - cell: PCell; optional: Boolean; token: String; begin @@ -1836,10 +1815,9 @@ procedure TsExpressionParser.SetRPNFormula(const AFormula: TsRPNFormula); procedure CreateNodeFromRPN(var ANode: TsExprNode; var AIndex: Integer); var - node: TsExprNode; - left: TsExprNode; - right: TsExprNode; - operand: TsExprNode; + left: TsExprNode = nil; + right: TsExprNode = nil; + operand: TsExprNode = nil; fek: TFEKind; r,c, r2,c2: Cardinal; flags: TsRelFlags; @@ -1971,7 +1949,6 @@ procedure TsExpressionParser.SetRPNFormula(const AFormula: TsRPNFormula); var index: Integer; - node: TsExprNode; begin FExpression := ''; FreeAndNil(FExprNode); @@ -2172,6 +2149,7 @@ end; procedure TsExprIdentifierDefs.Update(Item: TCollectionItem); begin + Unused(Item); if Assigned(FParser) then FParser.FDirty := true; end; @@ -2732,7 +2710,6 @@ end; procedure TsUPlusExprNode.GetNodeValue(var Result: TsExpressionResult); var - res: TsExpressionresult; cell: PCell; begin Operand.GetNodeValue(Result); @@ -3040,22 +3017,6 @@ begin inherited Check; end; -procedure TsOrderingExprNode.CheckSameNodeTypes; -var - LT, RT: TsResultType; -begin - { - LT := Left.NodeType; - RT := Right.NodeType; - case LT of - rtFloat, rtInteger: - if (RT in [rtFloat, rtInteger]) or - ((Rt = rtCell) and (Right.Res - if (RT <> LT) then - RaiseParserError(SErrTypesDoNotMatch, [ResultTypeName(LT), ResultTypeName(RT), Left.AsString, Right.AsString]) - } -end; - { TsLessExprNode } @@ -3205,7 +3166,7 @@ begin Result := RPNFunc(fekConcat, Right.AsRPNItem( Left.AsRPNItem( - nil))); + ANext))); end; function TsConcatExprNode.AsString: string; @@ -3468,7 +3429,6 @@ end; procedure TsPowerExprNode.GetNodeValue(var Result: TsExpressionResult); var RRes: TsExpressionResult; - ex: TsExprFloat; begin Left.GetNodeValue(Result); if Result.ResultType = rtError then @@ -3599,6 +3559,7 @@ end; function TsVariableExprNode.AsRPNItem(ANext: PRPNItem): PRPNItem; begin + Result := ANext; // Just a dummy assignment to silence the compiler... RaiseParserError('Cannot handle variables for RPN, so far.'); end; @@ -4060,7 +4021,7 @@ begin rtBoolean : if Arg.ResBoolean then Result := 1.0; rtString : begin fs := Arg.Worksheet.Workbook.FormatSettings; - if not TryStrToDateTime(Arg.ResString, Result) then + if not TryStrToDateTime(Arg.ResString, Result, fs) then Result := 1.0; end; rtCell : begin diff --git a/components/fpspreadsheet/fpsfunc.pas b/components/fpspreadsheet/fpsfunc.pas index e510f9e7b..e477bd590 100644 --- a/components/fpspreadsheet/fpsfunc.pas +++ b/components/fpspreadsheet/fpsfunc.pas @@ -503,6 +503,7 @@ procedure fpsNOW(var Result: TsExpressionResult; const Args: TsExprParameterArra // whenever the worksheet recalculates. // NOW() begin + Unused(Args); Result := DateTimeResult(Now); end; @@ -553,6 +554,7 @@ procedure fpsTODAY(var Result: TsExpressionResult; const Args: TsExprParameterAr // whenever the worksheet recalculates. // TODAY() begin + Unused(Args); Result := DateTimeResult(Date); end; @@ -1251,7 +1253,6 @@ var stype: String; r1,r2, c1,c2: Cardinal; cell: PCell; - res: TsExpressionResult; begin if Length(Args)=1 then begin diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas index 165f5e5e2..f1224322d 100755 --- a/components/fpspreadsheet/fpspreadsheet.pas +++ b/components/fpspreadsheet/fpspreadsheet.pas @@ -1209,7 +1209,7 @@ implementation uses Math, StrUtils, TypInfo, - fpsStreams, fpsUtils, fpsNumFormatParser, fpsExprParser, fpsFunc; + fpsStreams, fpsUtils, fpsNumFormatParser, fpsExprParser; { Translatable strings } resourcestring @@ -1820,7 +1820,7 @@ begin parser.ActiveCell := ACell; end; parser.Expression := formula; - parser.EvaluateExpression(res); + res := parser.Evaluate; case res.ResultType of rtEmpty : WriteBlank(ACell); rtError : WriteErrorValue(ACell, res.ResError); diff --git a/components/fpspreadsheet/xlscommon.pas b/components/fpspreadsheet/xlscommon.pas index 2cbf99840..3626f3556 100644 --- a/components/fpspreadsheet/xlscommon.pas +++ b/components/fpspreadsheet/xlscommon.pas @@ -1461,7 +1461,7 @@ begin // 2 bytes for offset to last row r2 := WordLEToN(AStream.ReadWord); dr2 := SmallInt(r2 and $3FFF); - ARow1Offset := dr2; + ARow2Offset := dr2; // 1 byte for offset to first column dc1 := ShortInt(AStream.ReadByte); @@ -1664,9 +1664,6 @@ end; procedure TsSpreadBIFFReader.ReadSharedFormula(AStream: TStream); var r1, r2, c1, c2: Cardinal; - flags: TsRelFlags; - b: Byte; - ok: Boolean; cell: PCell; begin // Cell range in which the formula is valid @@ -1689,7 +1686,7 @@ begin AStream.ReadByte; // RPN formula tokens - ok := ReadRPNTokenArray(AStream, cell); + ReadRPNTokenArray(AStream, cell); end; { Helper function for reading a string with 8-bit length. Here, we implement the @@ -2488,7 +2485,6 @@ var TokenArraySizePos: Int64; FinalPos: Int64; exprDef: TsExprIdentifierDef; - excelCode: Word; primaryExcelCode, secondaryExcelCode: Word; begin RPNLength := 0; @@ -2815,8 +2811,9 @@ var recordSizePos: Int64; startPos, finalPos: Int64; formula: TsRPNFormula; - i: Integer; begin + RPNLength := 0; + // Determine cell range covered by the shared formula in ACell. // Find range of cells using this shared formula r1 := ACell^.Row; r2 := r1; diff --git a/components/fpspreadsheet/xlsxooxml.pas b/components/fpspreadsheet/xlsxooxml.pas index 512871b56..9a16e3128 100755 --- a/components/fpspreadsheet/xlsxooxml.pas +++ b/components/fpspreadsheet/xlsxooxml.pas @@ -615,9 +615,6 @@ var formulaStr: String; sstIndex: Integer; number: Double; - ref: String; - r1,r2, c1,c2: Cardinal; - sharedFormulaBase: PCell; begin if ANode = nil then exit; @@ -2531,7 +2528,6 @@ var r, r1, r2: Cardinal; c, c1, c2: Cardinal; cell: PCell; - id: Cardinal; t, v: String; begin cellPosText := TsWorksheet.CellPosToText(ARow, ACol);