Регистрация польз.функций в 2.47

BopBop
отредактировано 05:32 Раздел: FastReport 2.xx VCL
Во всех Help-ах написан пример регистрации своих функций в библиотеке функций
frAddFunctionDesc('SUMPROPIS', 'Мои функции',
'SUMPROPIS(<Число>)/Возвращает сумму прописью.');
в версии 2.4 это чудесно работает, а в 2.47 выдается ошибка "несоответствие типов frFunctionLibrary and String;
В чем проблема - изменены параметры функции ??? ;)

Комментарии

  • bakhbakh Санкт-Петербург
    отредактировано 05:32
    Есть такой крутой файл - fr_class.int...
    Так в нём написано буквально следующее:
    ================================================
    procedure frAddFunctionDesc(FuncLibrary: TfrFunctionLibrary;
    FuncName, Category, Description: String);
    ================================================
  • BopBop
    отредактировано 05:32
    Так как теперь зарегистрировать свою функцию, насколько я понял frFunctionLibrary Это целий класс, зачеим он мне (раньше все было намного проще).
    Нужент конкретный пример кода.
  • bakhbakh Санкт-Петербург
    отредактировано 05:32
    Bop написал:
    Нужент конкретный пример кода.
    Простота не признак правильности... ;)
    Думаю, что будет понятно, хотя мог чего-то ненужного вставить... ;)
    unit MyFunction;
    
    interface
    
    uses
      Classes, SysUtils, FR_Class, FR_Const, FR_Utils;
    
    {$I FR.inc}
    
    ...
    
    type
      TMyFunctionLibrary = class(TfrFunctionLibrary)
      public
        constructor Create; override;
        procedure DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: Variant); override;
      end;
    
     procedure Register;
    
    implementation
    
    {$R fr_myfn.res}
    
    ...
    
    { TMyFunctionLibrary }
    
    {--------------------------------------------------------------------}
    { Create library                                                     }
    {--------------------------------------------------------------------}
    constructor TMyFunctionLibrary.Create;
    begin
    
     inherited Create;
    
     with List do begin
       Add('Something');
     end; { with }
    
     AddFunctionDesc('Something', rsString, 'Some Description');
    
      { some personal initializations }
    
    end; { Create }
    
    {--------------------------------------------------------------------}
    { Processing the call function                                       }
    {--------------------------------------------------------------------}
    procedure TMyFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: Variant);
    var
      cStr :String;
    
    begin
    
     val := 0;
    
     case FNo of
       0: val := Something(frParser.Calc(p1));
     end; { case }
    
    end; { DoFunction }
    
    {--------------------------------------------------------------------}
    { Convert from typeString into type TfrCharSet                       }
    {--------------------------------------------------------------------}
    function Something(cStr :String) :String;
    begin
    
      Result := DoSomething;
    
    end; { Something }
    
    procedure Register;
    begin
     RegisterComponents('FastReport', [TfrMyFunctionLibrary]);
    end;
    
    
    initialization
      frRegisterFunctionLibrary(TMyFunctionLibrary);
    
    finalization
      frUnRegisterFunctionLibrary(TMyFunctionLibrary);
    
    
    end.
    
  • отредактировано 05:32
    Реальный пример кода:
      TfrPDFunctionLibrary = class (TfrFunctionLibrary)
      public
       constructor Create; override;
       procedure DoFunction(FNo: Integer; p1, p2, p3: Variant;
         var val: Variant); override;
      end;
    
    constructor TfrPDFunctionLibrary.Create;
    begin
     inherited Create;
     with List do
      begin
        Add('VALUETOTEXT');
        Add('GETDOCNAME');
        Add('GETFIOPADEG');
        Add('GETDOLPADEG');
        Add('GETSEX');
        Add('MONEYTOTEXT');
      end;
     AddFunctionDesc('VALUETOTEXT','Дополнительные','VALUETOTEXT(<Число>, <Род>, <Выводить дробную часть>)/Возвращает число прописью. Значение рода: 0 - мужской, 1 - женский, 2 - средний. Выводить дробную часть: 0 - нет, 1 - да.');
     AddFunctionDesc('GETDOCNAME','Дополнительные','GETDOCNAME(<Тип документа>, [Во множественном числе])/Возвращает название типа документа.');
     AddFunctionDesc('GETFIOPADEG','Дополнительные','GETFIOPADEG(<Фамилия Имя Отчество>, <Падеж>)/Склоняет ФИО по падежам. Падеж должен иметь значение от 1 до 6.');
     AddFunctionDesc('GETDOLPADEG','Дополнительные','GETDOLPADEG(<Должность>, <Падеж>)/Склоняет должность по падежам. Падеж должен иметь значение от 1 до 6.');
     AddFunctionDesc('GETSEX','Дополнительные','GETSEX(<Отчество>)/Возвращает пол человека по его отчеству. Результат функции: 0 - мужской, 1 - женский, 2 - неопределён.');
     AddFunctionDesc('MONEYTOTEXT','Дополнительные','MONEYTOTEXT(<Число>, <Валюта>)/Возвращает число прописью в указанной валюте');
    end;
    
    procedure TfrPDFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: Variant);
    var R:Integer;
    begin
     try
     case FNo of
      0:begin
         R:=frParser.Calc(p2);
         if R in [0..2] then
          begin
           if frParser.Calc(p3)=1 then
            Val:=FloatToText(frParser.Calc(p1),R)
           else
            Val:=ValueToText(Trunc(frParser.Calc(p1)),R,['','','','','','','','','',''],True);
          end;
        end;
      1:Val:=GetDocName(frParser.Calc(p1),frParser.Calc(p2)=1);
      2:Val:=GetFIOFromStr(frParser.Calc(p1),'',frParser.Calc(p2));
      3:Val:=GetAppointment(frParser.Calc(p1),frParser.Calc(p2));
      4:case GetSex(frParser.Calc(p1)) of
         'м':Val:=0;
         'ж':Val:=1;
        else
         Val:=2;
        end;
      5:Val:=MoneyToText(frParser.Calc(p2),frParser.Calc(p1),frParser.Calc(p3)=0);
     end;
     finally
     end;
    end;
    
    initialization
     frRegisterFunctionLibrary(TfrPDFunctionLibrary);
    
    finalization
     frUnRegisterFunctionLibrary(TfrPDFunctionLibrary);
    

  • отредактировано 05:32
    Здравствуйте.
    Помогите разобраться, как зарегистрировать свою библиотеку функций так, чтобы она была доступна в дизайнере во время разработки?

    У меня есть unit с библиотекой функций (прописан в путях);
    У меня есть unit c моим классом TfrMyFunctionLibrary = class (TfrFunctionLibrary) - сделан по примеру Vano (лежит в /Source FR);
    Регистрация моего класса прописана в разделе initialization unit'а класса.
    frUnRegisterFunctionLibrary вручную не вызывается.


    В run-time всё работает, есть закладка 'Дополнительные' с моими функциями, они отрабатывают...

    Но в design-time закладки нет, функции не отрабатывают (в preview), но синтаксических ошибок тоже нет, т.е. писать их можно.

    Подскажите, пожалуйста, как правильно регистрировать (и можно ли)

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

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