AV в FR 3.19

отредактировано 00:44 Раздел: FastReport 3.0
Периодически при формировании отчета вылетает ошибка Access Violation. Останов происходит на последней строке функции StrToVarType, unit fs_itools.
Появляется она не всегда, примерно один раз из 20, на разных отчетах. Единственная закономерность, которую я заметил - цепочка вызовов в момент ошибки (первые три строки всегда одни и теже):
StrToVarType
ParseMethodSyntax
TfsMethodHelper.Create (первый параметр все время разный)
TfsClassVariable.AddMethod (либо TfsScript.AddMethod)
далее варианты разные...

В предыдущих версиях такого не было. Delphi 6 UpdPack2

Комментарии

  • отредактировано 00:44
    Попробуйте последнюю версию 3.19.5.
  • отредактировано 00:44
    Именно ее и использую
  • gpigpi
    отредактировано 00:44
    Уже есть 3.19.6
  • отредактировано 00:44
    Ошибку нашел в методе TfsScript.FindLocal. Вот исправленный текст:
    function TfsScript.FindLocal(const Name: String): TfsCustomVariable;
    var
      i: Integer;
    begin
      Result := nil;
      i := FItems.IndexOf(Name);
      if i <> -1 then
    {  for i := 0 to Count - 1 do
        if AnsiCompareText(Name, TfsCustomVariable(FItems.Objects[i]).Name) = 0 then}
        begin
          if FItems.Objects[i] is TfsCustomVariable then  //Добавил эту проверку (или, как вариант, if Name='' then)
            Result := TfsCustomVariable(FItems.Objects[i]);
          Exit;
        end;
    end;
    

    IndexOf(Name) если Name='' возвращает 0, а в FItems.Objects[0] (а может быть и в Objects с другим индексом) не обязательно лежит ссылка на объект TfsCustomVariable, иногда на TFunctions, отсюда и AV.

    Вопрос к разработчикам. Какой из двух вариантов if корректнее?
  • отредактировано 00:44
    Вроде первый. Вообще интересно, при каких условиях появляется ошибка.
  • отредактировано 00:44
    Как я понял, ошибка возникает при вызове AddMethod когда добавляемый метод является процедурой. Например, AddMethod('procedure Hide', CallMethod) в модуле fs_iformsrtti. В нем вызывается конструктор TfsMethodHelper.Create, из конструктора - ParseMethodSyntax. В ParseMethodSyntax есть строка:
    Result := TfsCustomVariable.Create(Name, StrToVarType(TypeName, Script), TypeName);
    Параметр TypeName, передаваемый в StrToVarType равен ''. В StrToVarType вызывается Script.Find(TypeName), из него FindLocal(Name), который в этом случае возвращает ссылку на объект TFunctions, приведенную к TfsCustomVariable, а такое приведение некорректно. В результате StrToVarType возвращает либо "мусор" либо появляется AV.

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

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