Подключение собственных функций к отчету |
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.
|