You've already forked lazarus-ccr
fpspreadsheet: Shame on me - forgot to add the new files fpsstrings.pas and fpsrpn.pas...
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3575 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
483
components/fpspreadsheet/fpsrpn.pas
Normal file
483
components/fpspreadsheet/fpsrpn.pas
Normal file
@ -0,0 +1,483 @@
|
|||||||
|
{ Simple creation an RPNFormula array to be used in fpspreadsheet. }
|
||||||
|
|
||||||
|
unit fpsRPN;
|
||||||
|
|
||||||
|
{$ifdef fpc}
|
||||||
|
{$mode delphi}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
SysUtils, fpspreadsheet;
|
||||||
|
|
||||||
|
{@@ Helper record for simplification of RPN formula creation }
|
||||||
|
type
|
||||||
|
PRPNItem = ^TRPNItem;
|
||||||
|
TRPNItem = record
|
||||||
|
FE: TsFormulaElement;
|
||||||
|
Next: PRPNItem;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CreateRPNFormula(AItem: PRPNItem; AReverse: Boolean = false): TsRPNFormula;
|
||||||
|
procedure DestroyRPNFormula(AItem: PRPNItem);
|
||||||
|
|
||||||
|
function RPNBool(AValue: Boolean;
|
||||||
|
ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNCellValue(ACellAddress: String;
|
||||||
|
ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNCellValue(ARow, ACol: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNCellRef(ACellAddress: String;
|
||||||
|
ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNCellRef(ARow, ACol: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNCellRange(ACellRangeAddress: String;
|
||||||
|
ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNCellRange(ARow, ACol, ARow2, ACol2: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNCellOffset(ARowOffset, AColOffset: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNErr(AErrCode: Byte; ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNInteger(AValue: Word; ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNMissingArg(ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNNumber(AValue: Double; ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNParenthesis(ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNString(AValue: String; ANext: PRPNItem): PRPNItem;
|
||||||
|
function RPNFunc(AToken: TFEKind; ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNFunc(AFuncName: String; ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
function RPNFunc(AFuncName: String; ANumParams: Byte; ANext: PRPNItem): PRPNItem; overload;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
fpsStrings, fpsUtils;
|
||||||
|
|
||||||
|
{******************************************************************************}
|
||||||
|
{ Simplified creation of RPN formulas }
|
||||||
|
{******************************************************************************}
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates a pointer to a new RPN item. This represents an element in the array
|
||||||
|
of token of an RPN formula.
|
||||||
|
|
||||||
|
@return Pointer to the RPN item
|
||||||
|
}
|
||||||
|
function NewRPNItem: PRPNItem;
|
||||||
|
begin
|
||||||
|
New(Result);
|
||||||
|
FillChar(Result^.FE, SizeOf(Result^.FE), 0);
|
||||||
|
Result^.FE.StringValue := '';
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Destroys an RPN item
|
||||||
|
}
|
||||||
|
procedure DisposeRPNItem(AItem: PRPNItem);
|
||||||
|
begin
|
||||||
|
if AItem <> nil then
|
||||||
|
Dispose(AItem);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates a boolean value entry in the RPN array.
|
||||||
|
|
||||||
|
@param AValue Boolean value to be stored in the RPN item
|
||||||
|
@next ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNBool(AValue: Boolean; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekBool;
|
||||||
|
if AValue then Result^.FE.DoubleValue := 1.0 else Result^.FE.DoubleValue := 0.0;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a cell value, specifed by its
|
||||||
|
address, e.g. 'A1'. Takes care of absolute and relative cell addresses.
|
||||||
|
|
||||||
|
@param ACellAddress Adress of the cell given in Excel A1 notation
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellValue(ACellAddress: String; ANext: PRPNItem): PRPNItem;
|
||||||
|
var
|
||||||
|
r,c: Cardinal;
|
||||||
|
flags: TsRelFlags;
|
||||||
|
begin
|
||||||
|
if not ParseCellString(ACellAddress, r, c, flags) then
|
||||||
|
raise Exception.CreateFmt('"%s" is not a valid cell address.', [ACellAddress]);
|
||||||
|
Result := RPNCellValue(r,c, flags, ANext);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a cell value, specifed by its
|
||||||
|
row and column index and a flag containing information on relative addresses.
|
||||||
|
|
||||||
|
@param ARow Row index of the cell
|
||||||
|
@param ACol Column index of the cell
|
||||||
|
@param AFlags Flags specifying absolute or relative cell addresses
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellValue(ARow, ACol: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekCell;
|
||||||
|
Result^.FE.Row := ARow;
|
||||||
|
Result^.FE.Col := ACol;
|
||||||
|
Result^.FE.RelFlags := AFlags;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a cell reference, specifed by its
|
||||||
|
address, e.g. 'A1'. Takes care of absolute and relative cell addresses.
|
||||||
|
"Cell reference" means that all properties of the cell can be handled.
|
||||||
|
Note that most Excel formulas with cells require the cell value only
|
||||||
|
(--> RPNCellValue)
|
||||||
|
|
||||||
|
@param ACellAddress Adress of the cell given in Excel A1 notation
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellRef(ACellAddress: String; ANext: PRPNItem): PRPNItem;
|
||||||
|
var
|
||||||
|
r,c: Cardinal;
|
||||||
|
flags: TsRelFlags;
|
||||||
|
begin
|
||||||
|
if not ParseCellString(ACellAddress, r, c, flags) then
|
||||||
|
raise Exception.CreateFmt(rsNoValidCellAddress, [ACellAddress]);
|
||||||
|
Result := RPNCellRef(r,c, flags, ANext);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a cell reference, specifed by its
|
||||||
|
row and column index and flags containing information on relative addresses.
|
||||||
|
"Cell reference" means that all properties of the cell can be handled.
|
||||||
|
Note that most Excel formulas with cells require the cell value only
|
||||||
|
(--> RPNCellValue)
|
||||||
|
|
||||||
|
@param ARow Row index of the cell
|
||||||
|
@param ACol Column index of the cell
|
||||||
|
@param AFlags Flags specifying absolute or relative cell addresses
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellRef(ARow, ACol: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekCellRef;
|
||||||
|
Result^.FE.Row := ARow;
|
||||||
|
Result^.FE.Col := ACol;
|
||||||
|
Result^.FE.RelFlags := AFlags;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a range of cells, specified by an
|
||||||
|
Excel-style address, e.g. A1:G5. As in Excel, use a $ sign to indicate
|
||||||
|
absolute addresses.
|
||||||
|
|
||||||
|
@param ACellRangeAddress Adress of the cell range given in Excel notation, such as A1:G5
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellRange(ACellRangeAddress: String; ANext: PRPNItem): PRPNItem;
|
||||||
|
var
|
||||||
|
r1,c1, r2,c2: Cardinal;
|
||||||
|
flags: TsRelFlags;
|
||||||
|
begin
|
||||||
|
if not ParseCellRangeString(ACellRangeAddress, r1,c1, r2,c2, flags) then
|
||||||
|
raise Exception.CreateFmt(rsNoValidCellRangeAddress, [ACellRangeAddress]);
|
||||||
|
Result := RPNCellRange(r1,c1, r2,c2, flags, ANext);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a range of cells, specified by the
|
||||||
|
row/column indexes of the top/left and bottom/right corners of the block.
|
||||||
|
The flags indicate relative indexes.
|
||||||
|
|
||||||
|
@param ARow Row index of the top/left cell
|
||||||
|
@param ACol Column index of the top/left cell
|
||||||
|
@param ARow2 Row index of the bottom/right cell
|
||||||
|
@param ACol2 Column index of the bottom/right cell
|
||||||
|
@param AFlags Flags specifying absolute or relative cell addresses
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellRange(ARow, ACol, ARow2, ACol2: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekCellRange;
|
||||||
|
Result^.FE.Row := ARow;
|
||||||
|
Result^.FE.Col := ACol;
|
||||||
|
Result^.FE.Row2 := ARow2;
|
||||||
|
Result^.FE.Col2 := ACol2;
|
||||||
|
Result^.FE.RelFlags := AFlags;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a relative cell reference as used in
|
||||||
|
shared formulas. The given parameters indicate the relativ offset between
|
||||||
|
the current cell coordinates and a reference rell.
|
||||||
|
|
||||||
|
@param ARowOffset Offset between current row and the row of a reference cell
|
||||||
|
@param AColOffset Offset between current column and the column of a reference cell
|
||||||
|
@param AFlags Flags specifying absolute or relative cell addresses
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNCellOffset(ARowOffset, AColOffset: Integer; AFlags: TsRelFlags;
|
||||||
|
ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekCellOffset;
|
||||||
|
Result^.FE.Row := Cardinal(ARowOffset);
|
||||||
|
Result^.FE.Col := Cardinal(AColOffset);
|
||||||
|
Result^.FE.RelFlags := AFlags;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array with an error value.
|
||||||
|
|
||||||
|
@param AErrCode Error code to be inserted (see TsErrorValue
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
@see TsErrorValue
|
||||||
|
}
|
||||||
|
function RPNErr(AErrCode: Byte; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekErr;
|
||||||
|
Result^.FE.IntValue := AErrCode;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a 2-byte unsigned integer
|
||||||
|
|
||||||
|
@param AValue Integer value to be inserted into the formula
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNInteger(AValue: Word; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekInteger;
|
||||||
|
Result^.FE.IntValue := AValue;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a missing argument in of function call.
|
||||||
|
Use this in a formula to indicate a missing argument
|
||||||
|
|
||||||
|
@param ANext Pointer to the next RPN item in the list.
|
||||||
|
}
|
||||||
|
function RPNMissingArg(ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekMissingArg;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a floating point number.
|
||||||
|
|
||||||
|
@param AValue Number value to be inserted into the formula
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNNumber(AValue: Double; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekNum;
|
||||||
|
Result^.FE.DoubleValue := AValue;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array which puts the current operator in parenthesis.
|
||||||
|
For display purposes only, does not affect calculation.
|
||||||
|
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNParenthesis(ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekParen;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for a string.
|
||||||
|
|
||||||
|
@param AValue String to be inserted into the formula
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
}
|
||||||
|
function RPNString(AValue: String; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekString;
|
||||||
|
Result^.FE.StringValue := AValue;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for an Excel function or operation
|
||||||
|
specified by its TokenID (--> TFEKind). Note that array elements for all
|
||||||
|
needed parameters must have been created before.
|
||||||
|
|
||||||
|
@param AToken Formula element indicating the function to be executed,
|
||||||
|
see the TFEKind enumeration for possible values.
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
|
||||||
|
@see TFEKind
|
||||||
|
}
|
||||||
|
function RPNFunc(AToken: TFEKind; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
if FEProps[AToken].MinParams <> FEProps[AToken].MaxParams then
|
||||||
|
raise Exception.CreateFmt(lpSpecifyNumberOfParams, [FEProps[AToken].Symbol]);
|
||||||
|
}
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := AToken;
|
||||||
|
Result^.Fe.FuncName := '';
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for an Excel function or operation
|
||||||
|
specified by its TokenID (--> TFEKind). Note that array elements for all
|
||||||
|
needed parameters must have been created before.
|
||||||
|
|
||||||
|
@param AToken Formula element indicating the function to be executed,
|
||||||
|
see the TFEKind enumeration for possible values.
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
|
||||||
|
@see TFEKind
|
||||||
|
}
|
||||||
|
function RPNFunc(AFuncName: String; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
if FEProps[AToken].MinParams <> FEProps[AToken].MaxParams then
|
||||||
|
raise Exception.CreateFmt(lpSpecifyNumberOfParams, [FEProps[AToken].Symbol]);
|
||||||
|
}
|
||||||
|
Result := RPNFunc(AFuncName, 255, ANext); //FEProps[AToken].MinParams, ANext);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Creates an entry in the RPN array for an Excel function or operation
|
||||||
|
specified by its TokenID (--> TFEKind). Specify the number of parameters used.
|
||||||
|
They must have been created before.
|
||||||
|
|
||||||
|
@param AToken Formula element indicating the function to be executed,
|
||||||
|
see the TFEKind enumeration for possible values.
|
||||||
|
@param ANumParams Number of arguments used in the formula. If -1 then the
|
||||||
|
fixed number of arguments known from the function definiton
|
||||||
|
is used.
|
||||||
|
@param ANext Pointer to the next RPN item in the list
|
||||||
|
|
||||||
|
@see TFEKind
|
||||||
|
}
|
||||||
|
function RPNFunc(AFuncName: String; ANumParams: Byte; ANext: PRPNItem): PRPNItem;
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
if (ANumParams > -1) then
|
||||||
|
if (ANumParams < FEProps[AToken].MinParams) or (ANumParams > FEProps[AToken].MaxParams) then
|
||||||
|
raise Exception.CreateFmt(lpIncorrectParamCount, [
|
||||||
|
FEProps[AToken].Symbol, FEProps[AToken].MinParams, FEProps[AToken].MaxParams
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
Result := NewRPNItem;
|
||||||
|
Result^.FE.ElementKind := fekFunc;
|
||||||
|
Result^.Fe.FuncName := AFuncName;
|
||||||
|
Result^.FE.ParamsNum := ANumParams;
|
||||||
|
Result^.Next := ANext;
|
||||||
|
end;
|
||||||
|
(*
|
||||||
|
{@@
|
||||||
|
Returns if the function defined by the token requires a fixed number of parameter.
|
||||||
|
|
||||||
|
@param AElementKind Identifier of the formula function considered
|
||||||
|
}
|
||||||
|
function FixedParamCount(AElementKind: TFEKind): Boolean;
|
||||||
|
begin
|
||||||
|
Result := (FEProps[AElementKind].MinParams = FEProps[AElementKind].MaxParams)
|
||||||
|
and (FEProps[AElementKind].MinParams >= 0);
|
||||||
|
end;
|
||||||
|
*)
|
||||||
|
{@@
|
||||||
|
Creates an RPN formula by a single call using nested RPN items.
|
||||||
|
|
||||||
|
For each formula element, use one of the RPNxxxx functions implemented here.
|
||||||
|
They are designed to be nested into each other. Terminate the chain by using nil.
|
||||||
|
|
||||||
|
@param AItem Pointer to the first RPN item representing the formula.
|
||||||
|
Each item contains a pointer to the next item in the list.
|
||||||
|
The list is terminated by nil.
|
||||||
|
@param AReverse If true the first rpn item in the chained list becomes the
|
||||||
|
last item in the token array. This feature is needed for
|
||||||
|
reading an xls file.
|
||||||
|
|
||||||
|
@example
|
||||||
|
The RPN formula for the string expression "$A1+2" can be created as follows:
|
||||||
|
<pre>
|
||||||
|
var
|
||||||
|
f: TsRPNFormula;
|
||||||
|
begin
|
||||||
|
f := CreateRPNFormula(
|
||||||
|
RPNCellValue('$A1',
|
||||||
|
RPNNumber(2,
|
||||||
|
RPNFunc(fekAdd,
|
||||||
|
nil))));
|
||||||
|
</pre>
|
||||||
|
}
|
||||||
|
function CreateRPNFormula(AItem: PRPNItem; AReverse: Boolean = false): TsRPNFormula;
|
||||||
|
var
|
||||||
|
item: PRPNItem;
|
||||||
|
nextitem: PRPNItem;
|
||||||
|
n: Integer;
|
||||||
|
begin
|
||||||
|
// Determine count of RPN elements
|
||||||
|
n := 0;
|
||||||
|
item := AItem;
|
||||||
|
while item <> nil do begin
|
||||||
|
inc(n);
|
||||||
|
item := item^.Next;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// Set array length of TsRPNFormula result
|
||||||
|
SetLength(Result, n);
|
||||||
|
|
||||||
|
// Copy FormulaElements to result and free temporary RPNItems
|
||||||
|
item := AItem;
|
||||||
|
if AReverse then n := Length(Result)-1 else n := 0;
|
||||||
|
while item <> nil do begin
|
||||||
|
nextitem := item^.Next;
|
||||||
|
Result[n] := item^.FE;
|
||||||
|
if AReverse then dec(n) else inc(n);
|
||||||
|
DisposeRPNItem(item);
|
||||||
|
item := nextitem;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{@@
|
||||||
|
Destroys the RPN formula starting with the given RPN item.
|
||||||
|
|
||||||
|
@param AItem Pointer to the first RPN items representing the formula.
|
||||||
|
Each item contains a pointer to the next item in the list.
|
||||||
|
The list is terminated by nil.
|
||||||
|
}
|
||||||
|
procedure DestroyRPNFormula(AItem: PRPNItem);
|
||||||
|
var
|
||||||
|
nextitem: PRPNItem;
|
||||||
|
begin
|
||||||
|
while AItem <> nil do begin
|
||||||
|
nextitem := AItem^.Next;
|
||||||
|
DisposeRPNItem(AItem);
|
||||||
|
AItem := nextitem;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
54
components/fpspreadsheet/fpsstrings.pas
Normal file
54
components/fpspreadsheet/fpsstrings.pas
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{ Translatable strings for fpspreadsheet }
|
||||||
|
|
||||||
|
unit fpsStrings;
|
||||||
|
|
||||||
|
{$ifdef fpc}
|
||||||
|
{$mode delphi}
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
resourcestring
|
||||||
|
rsUnsupportedReadFormat = 'Tried to read a spreadsheet using an unsupported format';
|
||||||
|
rsUnsupportedWriteFormat = 'Tried to write a spreadsheet using an unsupported format';
|
||||||
|
rsNoValidSpreadsheetFile = '"%s" is not a valid spreadsheet file';
|
||||||
|
rsUnknownSpreadsheetFormat = 'unknown format';
|
||||||
|
rsMaxRowsExceeded = 'This workbook contains %d rows, but the selected ' +
|
||||||
|
'file format does not support more than %d rows.';
|
||||||
|
rsMaxColsExceeded = 'This workbook contains %d columns, but the selected ' +
|
||||||
|
'file format does not support more than %d columns.';
|
||||||
|
rsTooManyPaletteColors = 'This workbook contains more colors (%d) than ' +
|
||||||
|
'supported by the file format (%d). The additional colors are replaced by '+
|
||||||
|
'the best-matching palette colors.';
|
||||||
|
rsInvalidFontIndex = 'Invalid font index';
|
||||||
|
rsInvalidNumberFormat = 'Trying to use an incompatible number format.';
|
||||||
|
rsInvalidDateTimeFormat = 'Trying to use an incompatible date/time format.';
|
||||||
|
rsNoValidNumberFormatString = 'No valid number format string.';
|
||||||
|
rsNoValidCellAddress = '"%s" is not a valid cell address.';
|
||||||
|
rsNoValidCellRangeAddress = '"%s" is not a valid cell range address.';
|
||||||
|
rsNoValidCellRangeOrCellAddress = '"%s" is not a valid cell or cell range address.';
|
||||||
|
rsSpecifyNumberOfParams = 'Specify number of parameters for function %s';
|
||||||
|
rsIncorrectParamCount = 'Funtion %s requires at least %d and at most %d parameters.';
|
||||||
|
rsCircularReference = 'Circular reference found when calculating worksheet formulas';
|
||||||
|
rsFileNotFound = 'File "%s" not found.';
|
||||||
|
rsInvalidWorksheetName = '"%s" is not a valid worksheet name.';
|
||||||
|
|
||||||
|
rsTRUE = 'TRUE';
|
||||||
|
rsFALSE = 'FALSE';
|
||||||
|
rsErrEmptyIntersection = '#NULL!';
|
||||||
|
rsErrDivideByZero = '#DIV/0!';
|
||||||
|
rsErrWrongType = '#VALUE!';
|
||||||
|
rsErrIllegalRef = '#REF!';
|
||||||
|
rsErrWrongName = '#NAME?';
|
||||||
|
rsErrOverflow = '#NUM!';
|
||||||
|
rsErrArgError = '#N/A';
|
||||||
|
rsErrFormulaNotSupported = '<FORMULA?>';
|
||||||
|
|
||||||
|
{%H-}rsNoValidDateTimeFormatString = 'No valid date/time format string.';
|
||||||
|
{%H-}rsIllegalNumberFormat = 'Illegal number format.';
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
end.
|
Reference in New Issue
Block a user