Ошибка "variant Or Safe Array Is Locked" при экспорте в Msexcel

mvbmvb Казань
отредактировано 16:21 Раздел: FastReport 4.0
Ошибка "Variant or safe array is locked" при экспорте в MSExcel

Комментарии

  • отредактировано 16:21
    У меня эта ошибка возникла после перехода на FR 4.12.0
    Обращение в техподдержку дало почти нулевой результат.
    Пришлось засучить рукава и разбираться самому.

    Причина:
    При экспорте в Excel числовых полей разработчики добавили функцию ConvertNumber,
    которая преобразует строку в число. Однако они не учли, что строковое значение
    числового поля может быть пропущено через обработчик GetText.

    В моем случае выводилась цена и добавлялся символ валюты, типа: 175 р.
    В фунции ConvertNumber вызывается StrToFloat, возникает ошибка преобразования,
    которая в итоге выглядит как "Variant ... Locked"
    (опять привет от разработчиков, по качеству кода обработки ошибок).

    Решения:
    1. Убрать у числовых полей обработчики GetText.
    2. Закоментировать вызов функции ConvertNumber в файле frxExportXLS.pas
    (в версии 4.12.6 строка 866)
    3. Пинать разрабочиков, чтоб исправили ошибку.

  • gpigpi
    отредактировано 16:21
    Попробуйте изменить frxExportXLS.pas
      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;
    
  • mvbmvb Казань
    отредактировано 16:21
    2 kordima, gpi: спасибо!

    2 gpi: так работает, правда пришлось заменить Result := StrToFloat(string(s)); на Result := StrToFloatDef(string(s), 0);, иначе вылетало на пустых s.
  • mvbmvb Казань
    отредактировано 16:21
    2 года прошло и ошибка вернулась, благо уже известно где править...
    Result := StrToFloatDef(string(s), 0);
    
  • RiginsRigins киров
    отредактировано 16:21
    Спасибо a11.png

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.