fpspreadsheet: Add chm help for unit fpsCurrency. Refine some help texts in fpsUtils.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8152 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
4111ff1ff1
commit
a0993874a1
@ -1,4 +1,5 @@
|
|||||||
::set chm_cmd="C:\Program Files (x86)\HTML Help Workshop\hhc.exe"
|
set chm_cmd="C:\Program Files (x86)\HTML Help Workshop\hhc.exe"
|
||||||
set chm_cmd=chmcmd.exe
|
::set chm_cmd=chmcmd.exe
|
||||||
%chm_cmd% output\fpspreadsheet.hhp
|
%chm_cmd% output\fpspreadsheet.hhp
|
||||||
|
copy /Y output\fpspreadsheet.chm ..\fpspreadsheet-api.chm
|
||||||
|
|
||||||
|
@ -5,5 +5,6 @@
|
|||||||
../../source/common/fpsnumformat.pas
|
../../source/common/fpsnumformat.pas
|
||||||
../../source/common/fpsallformats.pas
|
../../source/common/fpsallformats.pas
|
||||||
../../source/common/fpsrpn.pas
|
../../source/common/fpsrpn.pas
|
||||||
|
../../source/common/fpscurrency.pas
|
||||||
../../source/visual/fpspreadsheetctrls.pas
|
../../source/visual/fpspreadsheetctrls.pas
|
||||||
../../source/visual/fpspreadsheetgrid.pas
|
../../source/visual/fpspreadsheetgrid.pas
|
||||||
|
Binary file not shown.
@ -1,3 +1,15 @@
|
|||||||
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
Unit **fpsCurrency** provides a variety of **utility functions** related to
|
||||||
|
currency values.
|
||||||
|
|
||||||
|
Currency symbols are the key to detection of currency values.
|
||||||
|
In order to reckognize strings as currency symbols they have to be registered
|
||||||
|
in the internal CurrencyList.
|
||||||
|
|
||||||
|
LICENSE: See the file COPYING.modifiedLGPL.txt, included in the Lazarus
|
||||||
|
distribution, for details about the license.
|
||||||
|
-------------------------------------------------------------------------------}
|
||||||
|
|
||||||
unit fpsCurrency;
|
unit fpsCurrency;
|
||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
@ -29,12 +41,14 @@ var
|
|||||||
Registers a currency symbol UTF8 string for usage by fpspreadsheet
|
Registers a currency symbol UTF8 string for usage by fpspreadsheet
|
||||||
|
|
||||||
Currency symbols are the key for detection of currency values. In order to
|
Currency symbols are the key for detection of currency values. In order to
|
||||||
reckognize strings are currency symbols they have to be registered in the
|
reckognize strings as currency symbols they have to be registered in the
|
||||||
internal CurrencyList.
|
internal CurrencyList.
|
||||||
|
|
||||||
Registration occurs automatically for USD, "$", the currencystring defined
|
Registration occurs automatically for USD, "$", the currencystring defined
|
||||||
in the DefaultFormatSettings and for the currency symbols used explicitly
|
in the DefaultFormatSettings and for the currency symbols used explicitly
|
||||||
when calling WriteCurrency or WriteNumerFormat.
|
when calling WriteCurrency or WriteNumerFormat.
|
||||||
|
|
||||||
|
@param ACurrencySymbol A string symbol which identifies the currency, e.g. '$'
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
procedure RegisterCurrency(ACurrencySymbol: String);
|
procedure RegisterCurrency(ACurrencySymbol: String);
|
||||||
begin
|
begin
|
||||||
@ -42,8 +56,12 @@ begin
|
|||||||
CurrencyList.Add(ACurrencySymbol);
|
CurrencyList.Add(ACurrencySymbol);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{@@ RegisterCurrencies registers the currency strings contained in the string list
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
RegisterCurrencies() registers the currency strings contained in the string list
|
||||||
If AReplace is true, the list replaces the currently registered list.
|
If AReplace is true, the list replaces the currently registered list.
|
||||||
|
|
||||||
|
@param AList A list containing the strings to be registered as currency symbols.
|
||||||
|
@param AReplace When this is @true the currently registered symbols are deleted, otherwise the strings are registered as additional currency symbols.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
procedure RegisterCurrencies(AList: TStrings; AReplace: Boolean);
|
procedure RegisterCurrencies(AList: TStrings; AReplace: Boolean);
|
||||||
var
|
var
|
||||||
@ -59,6 +77,8 @@ end;
|
|||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Removes registration of a currency symbol string for usage by fpspreadsheet
|
Removes registration of a currency symbol string for usage by fpspreadsheet
|
||||||
|
|
||||||
|
@param ACurrencySymbol The currency symbol which is to be un-registered.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
procedure UnregisterCurrency(ACurrencySymbol: String);
|
procedure UnregisterCurrency(ACurrencySymbol: String);
|
||||||
var
|
var
|
||||||
@ -70,6 +90,9 @@ end;
|
|||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Checks whether a string is registered as valid currency symbol string
|
Checks whether a string is registered as valid currency symbol string
|
||||||
|
|
||||||
|
@param ACurrencySymbol The currency symbol to be checked.
|
||||||
|
@returns @true of the currency symbol is registered, @false otherwise.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function CurrencyRegistered(ACurrencySymbol: String): Boolean;
|
function CurrencyRegistered(ACurrencySymbol: String): Boolean;
|
||||||
begin
|
begin
|
||||||
@ -78,6 +101,8 @@ end;
|
|||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Writes all registered currency symbols to a string list
|
Writes all registered currency symbols to a string list
|
||||||
|
|
||||||
|
@param AList List to which all the registered currency symbols are copied.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
procedure GetRegisteredCurrencies(AList: TStrings);
|
procedure GetRegisteredCurrencies(AList: TStrings);
|
||||||
begin
|
begin
|
||||||
@ -87,8 +112,11 @@ end;
|
|||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Checks whether the given number string is a negative value. In case of
|
Checks whether the given number string is a negative value. In case of
|
||||||
currency value, this can be indicated by brackets, or a minus sign at string
|
currency values, this can be indicated by brackets, or a minus sign at string
|
||||||
start or end.
|
start or end.
|
||||||
|
|
||||||
|
@param AText String to be analyzed. Brackets or minus sign will be removed if the string is found to correspond to a negative value.
|
||||||
|
@returns @true when the input string was detected to be a negative number, @false otherwise.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function IsNegative(var AText: String): Boolean;
|
function IsNegative(var AText: String): Boolean;
|
||||||
begin
|
begin
|
||||||
@ -119,6 +147,10 @@ end;
|
|||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Checks wheter a specified currency symbol is contained in a string, removes
|
Checks wheter a specified currency symbol is contained in a string, removes
|
||||||
the currency symbol and returns the remaining string.
|
the currency symbol and returns the remaining string.
|
||||||
|
|
||||||
|
@param ACurrencySymbol The currency symbol to be detected.
|
||||||
|
@param AText String to be checked. On output, the currency symbol will be removed from the string if found.
|
||||||
|
@returns @true if the input string did contain a currency symbol, @false otherwise.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function RemoveCurrencySymbol(ACurrencySymbol: String; var AText: String): Boolean;
|
function RemoveCurrencySymbol(ACurrencySymbol: String; var AText: String): Boolean;
|
||||||
var
|
var
|
||||||
@ -137,6 +169,12 @@ end;
|
|||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Checks whether a string is a number with attached currency symbol. Looks also
|
Checks whether a string is a number with attached currency symbol. Looks also
|
||||||
for negative values in brackets.
|
for negative values in brackets.
|
||||||
|
|
||||||
|
@param AText String which is to be converted to a currency value.
|
||||||
|
@param ANumber Returns the numeric value of the string
|
||||||
|
@param ACurrencySymbol Returns the currency symbol found.
|
||||||
|
@param AFormatSettings Contains the decimal separator used in the input string.
|
||||||
|
@returns @true if the string could be converted to a number successfully, @false otherwise.
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function TryStrToCurrency(AText: String; out ANumber: Double;
|
function TryStrToCurrency(AText: String; out ANumber: Double;
|
||||||
out ACurrencySymbol:String; const AFormatSettings: TFormatSettings): boolean;
|
out ACurrencySymbol:String; const AFormatSettings: TFormatSettings): boolean;
|
||||||
|
@ -715,6 +715,20 @@ begin
|
|||||||
if rfRelCol in f then Include(AFlags, rfRelCol2);
|
if rfRelCol in f then Include(AFlags, rfRelCol2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
Extracts a cell's row and column index from a string in "R1C1" notation.
|
||||||
|
Returns in AFlags also information on relative/absolute cells.
|
||||||
|
|
||||||
|
@param AStr Cell string, in R1C1 syntax, such as R[2]C[3] or R1C5
|
||||||
|
@param ABaseRow Row index from which the cell reference is seen.
|
||||||
|
@param ABaseCol Column index from which the cell reference is seen.
|
||||||
|
@param ASheet Name of the worksheet which contains the cell (output)
|
||||||
|
@param ACellRow Row index of cell (output)
|
||||||
|
@param ACellCol Column index of cell (output)
|
||||||
|
@param AFlags A set containing an element for AFirstCellRow, AFirstCellCol, ALastCellRow, ALastCellCol if they represent a relative cell address. (output)
|
||||||
|
|
||||||
|
@returns @FALSE if the string is not a valid cell reference
|
||||||
|
-------------------------------------------------------------------------------}
|
||||||
function ParseCellString_R1C1(const AStr: String; ABaseRow, ABaseCol: Cardinal;
|
function ParseCellString_R1C1(const AStr: String; ABaseRow, ABaseCol: Cardinal;
|
||||||
out ASheet: String; out ACellRow, ACellCol: Cardinal;
|
out ASheet: String; out ACellRow, ACellCol: Cardinal;
|
||||||
out AFlags: TsRelFlags): Boolean;
|
out AFlags: TsRelFlags): Boolean;
|
||||||
@ -733,15 +747,15 @@ end;
|
|||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Parses a cell string in "R1C1" notation into zero-based column and row numbers
|
Parses a cell string in "R1C1" notation into zero-based column and row numbers
|
||||||
'AFlags' indicates relative addresses.
|
AFlags indicates relative addresses.
|
||||||
|
|
||||||
@param AStr Cell reference in R1C1 syntax, such as R[2]C[3] or R1C5
|
@param AStr Cell reference in R1C1 syntax, such as R[2]C[3] or R1C5
|
||||||
@param ABaseRow Row index from which the cell reference is seen.
|
@param ABaseRow Zero-based row index from which the cell reference is seen.
|
||||||
@param ABaseCol Column index from which the cell reference is seen.
|
@param ABaseCol Zero-based column index from which the cell reference is seen.
|
||||||
@param ACellRow Row index of the top/left cell of the range (output)
|
@param ACellRow Zero-based row index of the cell (output)
|
||||||
@param ACellCol Column index of the top/left cell of the range (output)
|
@param ACellCol Zero-based column index of cell (output)
|
||||||
@param AFlags A set containing an element for ACellRow and/or ACellCol, if they represent a relative cell address.
|
@param AFlags A set containing rfRelRow and/or rfRelCol if the row and/or column index is relative to the base cell (output).
|
||||||
@returns @FALSE if the string is not a valid cell range
|
@returns @FALSE if the string is not a valid cell address
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function ParseCellString_R1C1(const AStr: String; ABaseRow, ABaseCol: Cardinal;
|
function ParseCellString_R1C1(const AStr: String; ABaseRow, ABaseCol: Cardinal;
|
||||||
out ACellRow, ACellCol: Cardinal; out AFlags: TsRelFlags): Boolean;
|
out ACellRow, ACellCol: Cardinal; out AFlags: TsRelFlags): Boolean;
|
||||||
@ -833,8 +847,9 @@ end;
|
|||||||
@param AStr Cell reference in R1C1 syntax, such as R[2]C[3] or R1C5
|
@param AStr Cell reference in R1C1 syntax, such as R[2]C[3] or R1C5
|
||||||
@param ABaseRow Row index from which the cell reference is seen.
|
@param ABaseRow Row index from which the cell reference is seen.
|
||||||
@param ABaseCol Column index from which the cell reference is seen.
|
@param ABaseCol Column index from which the cell reference is seen.
|
||||||
@param ACellRow Row index of the top/left cell of the range (output)
|
@param ACellRow Row index of cell (output)
|
||||||
@param ACellCol Column index of the top/left cell of the range (output)
|
@param ACellCol Column index of the cell (output)
|
||||||
|
@returns @FALSE if the string is not a valid cell address
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function ParseCellString_R1C1(const AStr: string; ABaseRow, ABaseCol: Cardinal;
|
function ParseCellString_R1C1(const AStr: string; ABaseRow, ABaseCol: Cardinal;
|
||||||
out ACellRow, ACellCol: Cardinal): Boolean;
|
out ACellRow, ACellCol: Cardinal): Boolean;
|
||||||
@ -847,8 +862,21 @@ end;
|
|||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Parses a 3D cell and sheet range string in Excel R1C1 dialect. Returns the
|
Parses a 3D cell and sheet range string in Excel R1C1 dialect. Returns the
|
||||||
names of the limiting sheets and the indexes of the limiting borders.
|
names of the limiting sheets and the indexes of the limiting row/col borders.
|
||||||
The function result is @false if the provided string is not valid.
|
The function result is @false if the provided string is not valid.
|
||||||
|
|
||||||
|
@param AStr Cell range string, in R1C1 syntax, such as R[2]C[3]:R[4]C[8]
|
||||||
|
@param ABaseRow Row index from which the cell range is seen.
|
||||||
|
@param ABaseCol Column index from which the cell range is seen.
|
||||||
|
@param ASheet1 Name of the worksheet with the first cell of the 3D cell block (part before the colon) (output)
|
||||||
|
@param ASheet1 Name of the worksheet with the second cell of the 3D cell block (part after the colon) (output)
|
||||||
|
@param ARow1 Index of the left row of the 3D range (part before the colon)(output)
|
||||||
|
@param ACol1 Index of the top row of the 3D range (part before the colon) (output)
|
||||||
|
@param ARow2 Index of the right row of the 3D range (part after the colon) (output)
|
||||||
|
@param ACol2 Index of the bottom row of the 3D range (part after the colon) (output)
|
||||||
|
@param AFlags A set containing element rfRow1, rfCol1, rfRow2, rfCol2 if the corresponding row/column indexes are relative addresses (output)
|
||||||
|
|
||||||
|
@returns @FALSE if the string is not a valid cell range
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function ParseCellRangeString_R1C1(const AStr: String; ABaseRow, ABaseCol: Cardinal;
|
function ParseCellRangeString_R1C1(const AStr: String; ABaseRow, ABaseCol: Cardinal;
|
||||||
out ASheet1, ASheet2: String; out ARow1, ACol1, ARow2, ACol2: Cardinal;
|
out ASheet1, ASheet2: String; out ARow1, ACol1, ARow2, ACol2: Cardinal;
|
||||||
@ -894,7 +922,7 @@ end;
|
|||||||
@param AStr Cell range string, such as A1
|
@param AStr Cell range string, such as A1
|
||||||
@param ACellRow Row index of the top/left cell of the range (output)
|
@param ACellRow Row index of the top/left cell of the range (output)
|
||||||
@param ACellCol Column index of the top/left cell of the range (output)
|
@param ACellCol Column index of the top/left cell of the range (output)
|
||||||
@returns @False if the string is not a valid cell range
|
@returns @False if the string is not a valid cell reference
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function ParseCellString(const AStr: string;
|
function ParseCellString(const AStr: string;
|
||||||
out ACellRow, ACellCol: Cardinal): Boolean;
|
out ACellRow, ACellCol: Cardinal): Boolean;
|
||||||
@ -904,6 +932,20 @@ begin
|
|||||||
Result := ParseCellString(AStr, ACellRow, ACellCol, flags);
|
Result := ParseCellString(AStr, ACellRow, ACellCol, flags);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
Parses a full cell string, like 'Sheet1!A1' into zero-based column and row numbers
|
||||||
|
Note that there can be several letters to address for more than 26 columns.
|
||||||
|
|
||||||
|
For compatibility with old version which does not return flags for relative
|
||||||
|
cell addresses.
|
||||||
|
|
||||||
|
@param AStr Cell range string, such as A1
|
||||||
|
@param ASheetName Name of the worksheet which contains the cell (output)=
|
||||||
|
@param ACellRow Row index of the cell (output)
|
||||||
|
@param ACellCol Column index of the cell (output)
|
||||||
|
@param ASheetSeparator Character which separates the worksheet name from the cell reference string. By default this is '!' as used by Excel.
|
||||||
|
@returns @False if the string is not a valid cell reference
|
||||||
|
-------------------------------------------------------------------------------}
|
||||||
function ParseSheetCellString(const AStr: String; out ASheetName: String;
|
function ParseSheetCellString(const AStr: String; out ASheetName: String;
|
||||||
out ACellRow, ACellCol: Cardinal; ASheetSeparator: Char = '!'): Boolean;
|
out ACellRow, ACellCol: Cardinal; ASheetSeparator: Char = '!'): Boolean;
|
||||||
var
|
var
|
||||||
@ -916,7 +958,6 @@ begin
|
|||||||
end else begin
|
end else begin
|
||||||
ASheetName := UTF8Copy(AStr, 1, p-1);
|
ASheetName := UTF8Copy(AStr, 1, p-1);
|
||||||
Result := ParseCellString(Copy(AStr, p+1, Length(AStr)), ACellRow, ACellCol);
|
Result := ParseCellString(Copy(AStr, p+1, Length(AStr)), ACellRow, ACellCol);
|
||||||
// Result := ParseCellString(UTF8Copy(AStr, p+1, UTF8Length(AStr)), ACellRow, ACellCol);
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -924,7 +965,7 @@ end;
|
|||||||
Parses a cell row string to a zero-based row number.
|
Parses a cell row string to a zero-based row number.
|
||||||
|
|
||||||
@param AStr Cell row string, such as '1', 1-based!
|
@param AStr Cell row string, such as '1', 1-based!
|
||||||
@param ARow Index of the row (zero-based!) (putput)
|
@param ARow Index of the row (zero-based!) (output)
|
||||||
@returns @False if the string is not a valid cell row string
|
@returns @False if the string is not a valid cell row string
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
function ParseCellRowString(const AStr: string; out ARow: Cardinal): Boolean;
|
function ParseCellRowString(const AStr: string; out ARow: Cardinal): Boolean;
|
||||||
@ -956,7 +997,8 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
|
|
||||||
if AStr[1] = '$' then
|
if AStr[1] = '$' then
|
||||||
j1 := 2 else
|
j1 := 2
|
||||||
|
else
|
||||||
j1 := 1;
|
j1 := 1;
|
||||||
|
|
||||||
for j := j1 to Length(AStr) do
|
for j := j1 to Length(AStr) do
|
||||||
@ -972,23 +1014,6 @@ begin
|
|||||||
|
|
||||||
dec(ACol);
|
dec(ACol);
|
||||||
Result := true;
|
Result := true;
|
||||||
|
|
||||||
{
|
|
||||||
if Length(AStr) = 1 then AResult := Ord(AStr[1]) - Ord('A')
|
|
||||||
else if Length(AStr) = 2 then
|
|
||||||
begin
|
|
||||||
AResult := (Ord(AStr[1]) - Ord('A') + 1) * INT_NUM_LETTERS
|
|
||||||
+ Ord(AStr[2]) - Ord('A');
|
|
||||||
end
|
|
||||||
else if Length(AStr) = 3 then
|
|
||||||
begin
|
|
||||||
AResult := (Ord(AStr[1]) - Ord('A') + 1) * INT_NUM_LETTERS * INT_NUM_LETTERS
|
|
||||||
+ (Ord(AStr[2]) - Ord('A') + 1) * INT_NUM_LETTERS
|
|
||||||
+ Ord(AStr[3]) - Ord('A');
|
|
||||||
end
|
|
||||||
else Exit(False);
|
|
||||||
|
|
||||||
Result := True; }
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function Letter(AValue: Integer): char;
|
function Letter(AValue: Integer): char;
|
||||||
@ -1204,8 +1229,6 @@ begin
|
|||||||
Result := Format('%s:%s!%s', [ASheet1, ASheet2, s]);
|
Result := Format('%s:%s!%s', [ASheet1, ASheet2, s]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Calculates a cell range address string from zero-based column and row indexes
|
Calculates a cell range address string from zero-based column and row indexes
|
||||||
and the relative address state flags.
|
and the relative address state flags.
|
||||||
@ -1234,6 +1257,14 @@ begin
|
|||||||
]);
|
]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
Determines whether a worksheet name must to be quoted. This is needed when
|
||||||
|
the name begins with a numeral or a period, or when the name contains a space
|
||||||
|
character.
|
||||||
|
|
||||||
|
@param ASheet Name of the worksheet to be analyzed
|
||||||
|
@returns @TRUE when the sheet name must be quoted, @FALSE otherwise
|
||||||
|
-------------------------------------------------------------------------------}
|
||||||
function SheetNameNeedsQuotes(ASheet: String): Boolean;
|
function SheetNameNeedsQuotes(ASheet: String): Boolean;
|
||||||
begin
|
begin
|
||||||
if ASheet <> '' then begin
|
if ASheet <> '' then begin
|
||||||
|
Loading…
Reference in New Issue
Block a user