Подключение собственных функций к отчету

Top  Previous  Next

FastReport имеет довольно большое количество стандартных функций, которые можно использовать в отчете. Вы также можете подключать свои собственные функции. Подключение функций производится через интерфейс скриптовой библиотеки FastScript, входящей в состав FastReport (подробнее о FastScript вы можете прочитать в руководстве по этой библиотеке).

 

Рассмотрим пример подключения процедуры и функции. Количество и тип параметров подключаемой функции может быть любым. Нельзя передавать параметры типа Set и Record, т.к. они не поддерживаются в FastScript. Такие параметры необходимо передавать в виде более простых типов, например, тип TRect передавать как X0, Y0, X1, Y1: Integer. Подробнее о добавлении функций со всевозможными параметрами вы можете прочитать в документации по FastScript.

 

 

function TForm1.MyFunc(s: String; i: Integer): Boolean;

begin

// нужная логика

end;

 

procedure TForm1.MyProc(s: String);

begin

// нужная логика

end;

 

function TForm1.frxReport1UserFunction(const MethodName: String;

var Params: Variant): Variant;

begin

if MethodName = 'MYFUNC' then

   Result := MyFunc(Params[0], Params[1])

else if MethodName = 'MYPROC' then

   MyProc(Params[0]);

end;

 

frxReport1.AddFunction('function MyFunc(s: String; i: Integer): Boolean');

frxReport1.AddFunction('procedure MyProc(s: String)');

 

Подключенную функцию можно использовать в скрипте отчета, а также обращаться к ней из объектов типа TfrxMemoView. Функция также отображается в окне "Дерево данных". В этом окне функции разбиты по категориям, и при выборе каждой функции внизу окна отображается подсказка по выбранной функции.

 

Изменим код примера, чтобы зарегистрировать функции в отдельной категории и отобразить описание функции:

 

frxReport1.AddFunction('function MyFunc(s: String; i: Integer): Boolean', 'Мои функции', 'Функция MyFunc всегда возвращает True');

frxReport1.AddFunction('procedure MyProc(s: String)', 'Мои функции', 'Процедура MyProc не делает ничего');

 

Если вы хотите зарегистрировать функции в одной из стандартных категорий, используйте следующие имена категорий:

 

'ctString' - работа со строками;

'ctDate' - работа с датой/временем;

'ctConv' - функции преобразования;

'ctFormat' - форматирование;

'ctMath' - математические функции;

'ctOther' - прочие функции.

 

Если указать пустое имя категории, функция будет помещена в корень дерева функций.

 

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

 

unit myfunctions;

 

interface

 

implementation

 

uses SysUtils, Classes, fs_iinterpreter;

 

type

TFunctions = class(TfsRTTIModule)

private

   function CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; var Params: Variant): Variant;

public

   constructor Create(AScript: TfsScript); override;

end;

 

 

function MyFunc(s: String; i: Integer): Boolean;

begin

// нужная логика

end;

 

procedure MyProc(s: String);

begin

// нужная логика

end;

 

 

{ TFunctions }

 

constructor TFunctions.Create;

begin

inherited Create(AScript);

with AScript do

begin

   AddMethod('function MyFunc(s: String; i: Integer): Boolean', CallMethod, 'Мои функции', 'Функция MyFunc всегда возвращает True');

   AddMethod('procedure MyProc(s: String)', CallMethod, 'Мои функции', 'Процедура MyProc не делает ничего');

end;

end;

 

function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; var Params: Variant): Variant;

begin

if MethodName = 'MYFUNC' then

   Result := MyFunc(Params[0], Params[1])

else if MethodName = 'MYPROC' then

   MyProc(Params[0]);

end;

 

initialization

fsRTTIModules.Add(TFunctions);

 

end.