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:
wp_xxyyzz 2024-07-17 10:46:51 +00:00
parent 96338e6a58
commit d7fad0c7b8

View File

@ -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;