Onuserfunction в консольном приложении

отредактировано 10:46 Раздел: FastReport 4.0
Приветствую!
Подскажите, есть консольное приложение, где я создаю frxReport. Этому созданному объекту мне нужно добавить анализ на неопознанную функцию. Вот кусок:
...
...
function frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant;
begin
if MethodName='SUMMAPROPIS' then
   begin
   .......
   end;
end;

...
...

frxMem:=TfrxDBDataset.Create(nil);
frxReport1:=TfrxReport.Create(nil);
frxReport1.AddFunction('function SummaPropis(s : Real; v : String):String');
frxReport1.OnUserFunction:=frxReport1UserFunction;
...

У меня ругается на строчку frxReport1.OnUserFunction:=frxReport1UserFunction;

Ошибка следующая:

[DCC Error] phprep.dpr(292): E2009 Incompatible types: 'method pointer and regular procedure'

В интернете полно решений подобной ошибки, что мол нужно создать свой класс, в нем прописать функцию и т.д. и везде решения связаны с наличием TForm.
Тут же формы нет.

Как мне в данном конкретном случае присвоить событию определенную свою функцию?

Заранее спасибо за ответ.

Комментарии

  • отредактировано 10:46
    var
      m: TMethod;
    ....
    
      m.Code := @frxReport1UserFunction;
      m.Data :=  nil;
      frxReport1.OnUserFunction  :=    TfrxUserFunctionEvent(m);
    
  • отредактировано 10:46
    написал: »
    var
      m: TMethod;
    ....
    
      m.Code := @frxReport1UserFunction;
      m.Data :=  nil;
      frxReport1.OnUserFunction  :=    TfrxUserFunctionEvent(m);
    

    теперь ошибка уже не при компилляции а при выполнении:
    Memo8:Privileged instruction

    В Memo8 вбита функция: [SUMMAPROPIS(<frxMem."col3">,'RUR')]

    Проверил пошагово - в OnUserFunction программа попадает, но MethodName пустой (а я ожидаю SUMMAPROPIS).

    п.с. в отчете больше функций никаких нет.
  • отредактировано 10:46
    yurmala написал: »
    теперь ошибка уже не при компилляции а при выполнении:
    Memo8:Privileged instruction

    В Memo8 вбита функция: [SUMMAPROPIS(<frxMem."col3">,'RUR')]

    Проверил пошагово - в OnUserFunction программа попадает, но MethodName пустой (а я ожидаю SUMMAPROPIS).

    п.с. в отчете больше функций никаких нет.
    Забыл написать, что в функцию нужно добавить еще один параметры в самое начало, т.к. вызов методов характеризуется неявной передачей указателя на Self(TMethod.Data) в качестве первого параметра.

    function frxReport1UserFunction(Self: TObject; const MethodName: String; var Params: Variant): Variant;

    Иначе будет смещение параметров и стека, что приведет к AV.
  • отредактировано 10:46
    написал: »
    Забыл написать, что в функцию нужно добавить еще один параметры в самое начало, т.к. вызов методов характеризуется неявной передачей указателя на Self(TMethod.Data) в качестве первого параметра.

    function frxReport1UserFunction(Self: TObject; const MethodName: String; var Params: Variant): Variant;

    Иначе будет смещение параметров и стека, что приведет к AV.

    спасибо, все заработало.

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

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