fpspreadsheet: Fix cell references in several formulas.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6534 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-06-26 15:36:41 +00:00
parent d6b6154fff
commit ce3d71a362
3 changed files with 50 additions and 92 deletions

View File

@ -4520,7 +4520,7 @@ begin
AError := errOK;
SetLength(AData, BLOCKSIZE);
n := 0;
for i:=0 to High(Args) do
for i:=Low(Args) to High(Args) do
begin
arg := Args[i];
if arg.ResultType = rtError then begin

View File

@ -121,7 +121,7 @@ var
x: TsExprFloat;
n: Integer;
begin
if Args[0].ResultType in [rtInteger, rtFloat, rtDateTime, rtCell, rtEmpty] then begin
if Args[0].ResultType in [rtCell, rtInteger, rtFloat, rtDateTime, rtEmpty] then begin
x := ArgToFloat(Args[0]);
if x > 0 then
begin
@ -152,7 +152,7 @@ var
res: TsExprFloat;
i, n: Integer;
begin
if Args[0].ResultType in [rtInteger, rtFloat, rtEmpty, rtDateTime] then
if Args[0].ResultType in [rtCell, rtInteger, rtFloat, rtEmpty, rtDateTime] then
begin
res := 1.0;
n := ArgToInt(Args[0]);
@ -263,7 +263,7 @@ var
x: TsExprFloat;
n: Integer;
begin
if Args[0].ResultType in [rtInteger, rtFloat, rtDateTime, rtCell, rtEmpty] then
if Args[0].ResultType in [rtCell, rtInteger, rtFloat, rtDateTime, rtEmpty] then
begin
x := ArgToFloat(Args[0]);
if x >= 0 then
@ -421,22 +421,13 @@ procedure fpsDAY(var Result: TsExpressionResult; const Args: TsExprParameterArra
// date_value can be a serial number or a string
var
y,m,d: Word;
dt: TDateTime;
begin
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger]) then
DecodeDate(ArgToFloat(Args[0]), y,m,d)
else
if Args[0].ResultType in [rtString] then
begin
if TryStrToDate(Args[0].ResString, dt) then
DecodeDate(dt, y,m,d)
else
begin
Result := ErrorResult(errWrongType);
exit;
end;
end;
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell])
then begin
DecodeDate(ArgToFloat(Args[0]), y, m, d);
Result := IntegerResult(d);
end else
Result := ErrorResult(errWrongType);
end;
procedure fpsHOUR(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -446,20 +437,12 @@ var
h, m, s, ms: Word;
t: double;
begin
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger]) then
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms)
else
if (Args[0].ResultType in [rtString]) then
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
if TryStrToTime(Args[0].ResString, t) then
DecodeTime(t, h,m,s,ms)
else
begin
Result := ErrorResult(errWrongType);
exit;
end;
end;
DecodeTime(trunc(ArgToFloat(Args[0])), h,m,s,ms);
Result := IntegerResult(h);
end else
Result := ErrorResult(errWrongType);
end;
procedure fpsMINUTE(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -468,20 +451,12 @@ var
h, m, s, ms: Word;
t: double;
begin
if (Args[0].resultType in [rtDateTime, rtFloat, rtInteger]) then
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms)
else
if (Args[0].ResultType in [rtString]) then
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
if TryStrToTime(Args[0].ResString, t) then
DecodeTime(t, h,m,s,ms)
else
begin
Result := ErrorResult(errWrongType);
exit;
end;
end;
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms);
Result := IntegerResult(m);
end else
Result := ErrorResult(errWrongType);
end;
procedure fpsMONTH(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -490,20 +465,12 @@ var
y,m,d: Word;
dt: TDateTime;
begin
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger]) then
DecodeDate(ArgToFloat(Args[0]), y,m,d)
else
if (Args[0].ResultType in [rtString]) then
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]) then
begin
if TryStrToDate(Args[0].ResString, dt) then
DecodeDate(dt, y,m,d)
else
begin
Result := ErrorResult(errWrongType);
exit;
end;
end;
DecodeDate(ArgToFloat(Args[0]), y,m,d);
Result := IntegerResult(m);
end else
Result := ErrorResult(errWrongType);
end;
procedure fpsNOW(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -521,20 +488,12 @@ var
h, m, s, ms: Word;
t: Double;
begin
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger]) then
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms)
else
if (Args[0].ResultType in [rtString]) then
begin
if TryStrToTime(Args[0].ResString, t) then
DecodeTime(t, h,m,s,ms)
else
begin
Result := ErrorResult(errWrongType);
exit;
end;
end;
if (Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell])
then begin
DecodeTime(ArgToFloat(Args[0]), h,m,s,ms);
Result := IntegerResult(s);
end else
Result := ErrorResult(errWrongType);
end;
procedure fpsTIME(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -580,7 +539,7 @@ begin
n := ArgToInt(Args[1])
else
n := 1;
if Args[0].ResultType in [rtCell, rtDateTime, rtFloat, rtInteger] then
if Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtCell] then
dt := ArgToDateTime(Args[0])
else
if Args[0].ResultType in [rtString] then
@ -604,20 +563,12 @@ var
y,m,d: Word;
dt: TDateTime;
begin
if Args[0].ResultType in [rtDateTime, rtFloat, rtInteger] then
DecodeDate(ArgToFloat(Args[0]), y,m,d)
else
if Args[0].ResultType in [rtString] then
begin
if TryStrToDate(Args[0].ResString, dt) then
DecodeDate(dt, y,m,d)
else
begin
Result := ErrorResult(errWrongType);
exit;
end;
end;
if Args[0].ResultType in [rtDateTime, rtFloat, rtInteger, rtString, rtCell]
then begin
DecodeDate(ArgToFloat(Args[0]), y,m,d);
Result := IntegerResult(y);
end else
Result := ErrorResult(errWrongType);
end;
@ -905,7 +856,10 @@ var
begin
b := true;
for i:=0 to High(Args) do
b := b and Args[i].ResBoolean;
if not ArgToBoolean(Args[i]) then begin
b := false;
break;
end;
Result.ResBoolean := b;
end;
@ -921,13 +875,13 @@ procedure fpsIF(var Result: TsExpressionResult; const Args: TsExprParameterArray
begin
if Length(Args) > 2 then
begin
if Args[0].ResBoolean then
if ArgToBoolean(Args[0]) then
Result := Args[1]
else
Result := Args[2];
end else
begin
if Args[0].ResBoolean then
if ArgToBoolean(Args[0]) then
Result := Args[1]
else
Result.ResBoolean := false;
@ -937,7 +891,7 @@ end;
procedure fpsNOT(var Result: TsExpressionResult; const Args: TsExprParameterArray);
// NOT( condition )
begin
Result.ResBoolean := not Args[0].ResBoolean;
Result.ResBoolean := not ArgToBoolean(Args[0]);
end;
procedure fpsOR(var Result: TsExpressionResult; const Args: TsExprParameterArray);
@ -949,7 +903,10 @@ var
begin
b := false;
for i:=0 to High(Args) do
b := b or Args[i].ResBoolean;
if ArgToBoolean(Args[i]) then begin
b := true;
break;
end;
Result.ResBoolean := b;
end;

View File

@ -1939,6 +1939,7 @@ begin
// Initiate validation of current input
PostMessage(Handle, UM_VALIDATEINPUT, 0, LParam(Self));
end;
inherited;
end;
{@@ ----------------------------------------------------------------------------