fpspreadsheet: Experimental change related to recursive formulas.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9387 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
96338e6a58
commit
d7fad0c7b8
@ -1344,6 +1344,7 @@ var
|
|||||||
res: TsExpressionResult;
|
res: TsExpressionResult;
|
||||||
p: Integer;
|
p: Integer;
|
||||||
link, txt: String;
|
link, txt: String;
|
||||||
|
changed: Boolean;
|
||||||
begin
|
begin
|
||||||
if (boIgnoreFormulas in Workbook.Options) or (AFormula = nil) then
|
if (boIgnoreFormulas in Workbook.Options) or (AFormula = nil) then
|
||||||
exit;
|
exit;
|
||||||
@ -1384,53 +1385,85 @@ begin
|
|||||||
try
|
try
|
||||||
// Assign formula result
|
// Assign formula result
|
||||||
case res.ResultType of
|
case res.ResultType of
|
||||||
rtEmpty : WriteBlank(lCell, true);
|
rtEmpty:
|
||||||
rtError : WriteErrorValue(lCell, res.ResError);
|
begin
|
||||||
rtInteger : WriteNumber(lCell, res.ResInteger);
|
changed := (lCell^.ContentType <> cctEmpty);
|
||||||
rtFloat : WriteNumber(lCell, res.ResFloat);
|
if changed then WriteBlank(lCell, true);
|
||||||
rtDateTime : WriteDateTime(lCell, res.ResDateTime);
|
end;
|
||||||
rtString : WriteText(lCell, res.ResString);
|
rtError:
|
||||||
rtHyperlink : begin
|
begin
|
||||||
link := ArgToString(res);
|
changed := (lCell^.ContentType <> cctError) or (lCell^.ErrorValue <> res.ResError);
|
||||||
p := pos(HYPERLINK_SEPARATOR, link);
|
if changed then WriteErrorValue(lCell, res.ResError);
|
||||||
if p > 0 then
|
end;
|
||||||
begin
|
rtInteger:
|
||||||
txt := Copy(link, p+Length(HYPERLINK_SEPARATOR), Length(link));
|
begin
|
||||||
link := Copy(link, 1, p-1);
|
changed := (lCell^.ContentType <> cctNumber) or (lCell^.Numbervalue <> res.ResInteger);
|
||||||
end else
|
if changed then WriteNumber(lCell, res.ResInteger);
|
||||||
txt := link;
|
end;
|
||||||
WriteHyperlink(lCell, link);
|
rtFloat:
|
||||||
WriteText(lCell, txt);
|
begin
|
||||||
end;
|
changed := (lCell^.ContentType <> cctNumber) or (lCell^.NumberValue <> res.ResFloat);
|
||||||
rtBoolean : WriteBoolValue(lCell, res.ResBoolean);
|
if changed then WriteNumber(lCell, res.ResFloat);
|
||||||
rtCell : begin
|
end;
|
||||||
if res.Worksheet = nil then
|
rtDateTime:
|
||||||
begin
|
begin
|
||||||
if res.ResSheetName = '' then
|
changed := (lCell^.ContentType <> cctDateTime) or (lCell^.DateTimeValue <> res.ResDateTime);
|
||||||
res.Worksheet := self
|
if changed then WriteDateTime(lCell, res.ResDateTime);
|
||||||
else
|
end;
|
||||||
res.Worksheet := Workbook.GetWorksheetByName(res.ResSheetName);
|
rtString:
|
||||||
if res.Worksheet = nil then
|
begin
|
||||||
begin
|
changed := (lCell^.ContentType <> cctUTF8String) or (lCell^.UTF8StringValue <> res.ResString);
|
||||||
WriteErrorValue(lCell, errIllegalRef);
|
if changed then WriteText(lCell, res.ResString);
|
||||||
exit;
|
end;
|
||||||
end;
|
rtHyperlink :
|
||||||
end else
|
begin
|
||||||
if res.ResSheetName <> '' then
|
link := ArgToString(res);
|
||||||
res.Worksheet := Workbook.GetWorksheetByName(res.ResSheetname);
|
p := pos(HYPERLINK_SEPARATOR, link);
|
||||||
lCellRef := (res.Worksheet as TsWorksheet).FindCell(res.ResRow, res.ResCol);
|
if p > 0 then
|
||||||
if lCellRef <> nil then
|
begin
|
||||||
case lCellRef^.ContentType of
|
txt := Copy(link, p+Length(HYPERLINK_SEPARATOR), Length(link));
|
||||||
cctNumber : WriteNumber(lCell, lCellRef^.NumberValue);
|
link := Copy(link, 1, p-1);
|
||||||
cctDateTime : WriteDateTime(lCell, lCellRef^.DateTimeValue);
|
end else
|
||||||
cctUTF8String: WriteText(lCell, lCellRef^.UTF8StringValue);
|
txt := link;
|
||||||
cctBool : WriteBoolValue(lCell, lCellRef^.Boolvalue);
|
WriteHyperlink(lCell, link);
|
||||||
cctError : WriteErrorValue(lCell, lCellRef^.ErrorValue);
|
WriteText(lCell, txt);
|
||||||
cctEmpty : WriteBlank(lCell, true);
|
end;
|
||||||
end
|
rtBoolean:
|
||||||
else
|
begin
|
||||||
WriteBlank(lCell, true);
|
changed := (lCell^.ContentType <> cctBool) or (lCell^.BoolValue <> res.ResBoolean);
|
||||||
end;
|
if changed then WriteBoolValue(lCell, res.ResBoolean);
|
||||||
|
end;
|
||||||
|
rtCell:
|
||||||
|
begin
|
||||||
|
if res.Worksheet = nil then
|
||||||
|
begin
|
||||||
|
if res.ResSheetName = '' then
|
||||||
|
res.Worksheet := self
|
||||||
|
else
|
||||||
|
res.Worksheet := Workbook.GetWorksheetByName(res.ResSheetName);
|
||||||
|
if res.Worksheet = nil then
|
||||||
|
begin
|
||||||
|
WriteErrorValue(lCell, errIllegalRef);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
if res.ResSheetName <> '' then
|
||||||
|
res.Worksheet := Workbook.GetWorksheetByName(res.ResSheetname);
|
||||||
|
lCellRef := (res.Worksheet as TsWorksheet).FindCell(res.ResRow, res.ResCol);
|
||||||
|
if lCellRef <> nil then
|
||||||
|
case lCellRef^.ContentType of
|
||||||
|
cctNumber : WriteNumber(lCell, lCellRef^.NumberValue);
|
||||||
|
cctDateTime : WriteDateTime(lCell, lCellRef^.DateTimeValue);
|
||||||
|
cctUTF8String: WriteText(lCell, lCellRef^.UTF8StringValue);
|
||||||
|
cctBool : WriteBoolValue(lCell, lCellRef^.Boolvalue);
|
||||||
|
cctError : WriteErrorValue(lCell, lCellRef^.ErrorValue);
|
||||||
|
cctEmpty : WriteBlank(lCell, true);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
WriteBlank(lCell, true);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
FWorkbook.UnlockFormulas;
|
FWorkbook.UnlockFormulas;
|
||||||
|
Loading…
Reference in New Issue
Block a user