У меня эта ошибка возникла после перехода на FR 4.12.0
Обращение в техподдержку дало почти нулевой результат.
Пришлось засучить рукава и разбираться самому.
Причина:
При экспорте в Excel числовых полей разработчики добавили функцию ConvertNumber,
которая преобразует строку в число. Однако они не учли, что строковое значение числового поля может быть пропущено через обработчик GetText.
В моем случае выводилась цена и добавлялся символ валюты, типа: 175 р.
В фунции ConvertNumber вызывается StrToFloat, возникает ошибка преобразования,
которая в итоге выглядит как "Variant ... Locked"
(опять привет от разработчиков, по качеству кода обработки ошибок).
Решения:
1. Убрать у числовых полей обработчики GetText.
2. Закоментировать вызов функции ConvertNumber в файле frxExportXLS.pas
(в версии 4.12.6 строка 866)
3. Пинать разрабочиков, чтоб исправили ошибку.
function ConvertNumber(s: AnsiString): Extended;
var
i, j, k: Integer;
begin
i := 1;
k := 0;
for j := 1 to Length(s) do
case s[j] of
'0'..'9', '-':
begin
s[i] := s[j];
i := i + 1;
end;
',', '.':
begin
if k = 0 then
begin
s[i] := AnsiChar(DecimalSeparator);
k := i;
i := i + 1;
end;
end;
end;
SetLength(s, i - 1);
Result := StrToFloat(string(s));
end;
Комментарии
Обращение в техподдержку дало почти нулевой результат.
Пришлось засучить рукава и разбираться самому.
Причина:
При экспорте в Excel числовых полей разработчики добавили функцию ConvertNumber,
которая преобразует строку в число. Однако они не учли, что строковое значение
числового поля может быть пропущено через обработчик GetText.
В моем случае выводилась цена и добавлялся символ валюты, типа: 175 р.
В фунции ConvertNumber вызывается StrToFloat, возникает ошибка преобразования,
которая в итоге выглядит как "Variant ... Locked"
(опять привет от разработчиков, по качеству кода обработки ошибок).
Решения:
1. Убрать у числовых полей обработчики GetText.
2. Закоментировать вызов функции ConvertNumber в файле frxExportXLS.pas
(в версии 4.12.6 строка 866)
3. Пинать разрабочиков, чтоб исправили ошибку.
2 gpi: так работает, правда пришлось заменить Result := StrToFloat(string(s)); на Result := StrToFloatDef(string(s), 0);, иначе вылетало на пустых s.