Пользовательская функция в отчете вызывает ошибку

Раздел: FastReport VCL

Добрый день.

Помогите разобраться.

В коде Delphi

регистрирую функцию:

  AReport.AddFunction('function GetOtchetID_NS: Integer', sGroupName, '');

описываю в обработчике пользовательских функций:

function TPrintOtchet.ReportFunctionX(const AMethodName: string; var AParams: Variant): Variant;

begin

 Result := Null;

if AnsiSameText(AMethodName, 'GetOtchetID_NS') then

 begin

   Result := 12;

 end;

end;

В скрипте отчета использую:

procedure Page1OnBeforePrint(Sender: TfrxComponent);

var

 ID_NS: Integer;

begin

ID_NS := [GetOtchetID_NS];

end;

И получаю ошибку:

Could not convert variant of type (Array Variant) into type (Integer)

Но, если эту функцию разместить в frxMemo (отчета), то ошибки нет - отображается 12

Подскажите в чем проблема?

Комментарии

  • отредактировано 22 Mar

    если в скрипте отчета писать:

    procedure Page1OnBeforePrint(Sender: TfrxComponent);

    var

     ID_NS: Variant;

    begin

    ID_NS := [GetOtchetID_NS];

    end;

    то работает...

    ---

    еще: не важно как писать при этом ID_NS := [GetOtchetIDNS] или ID_NS := GetOtchetIDNS

    ---

    под отладкой увидел следующее, что функция возвращает в отчет значение

    unit: fs_iinterpreter

    function TfsSetExpression.GetValue: Variant;

    var

     i: Integer;

    begin

     Result := VarArrayCreate([0, Count - 1], varVariant);

     for i := 0 to Count - 1 do

      if Items[i] = nil then

       Result[i] := Null else

       Result[i] := Items[i].Value;

    end;

    действительно создается Array Variant

  • var

     ID_NS: Integer;

    procedure Page1OnBeforePrint(Sender: TfrxComponent);

    begin

    ID_NS := GetOtchetID_NS;

    end;

    также работает если переменную объявить глобально, и задать ей явный тип (Integer)

    the magic...

  • Попробуй код исправить так

    if MethodName = 'GETOTCHETID_NS' then

    В MethodName имена методов приходят в верхнем регистре.

  • Спасибо.

    Это учтено:

    if AnsiSameText(AMethodName, 'GetOtchetID_NS')

    Проблема не в коде приложения, а в коде скрипта отчета...

  • Очень странно: перезапуск Delphi или ПК проблему устранил...

    Так и не понял в чем было дело...

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

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