FastReport позволяет писать и использовать собственные функции.
Как это сделать вы можете найти в: FastReport DeveloperManual-en.pdf.
в главе "Использование пользовательских функций в отчете" стр. 37, 38, 39
Надеюсь, это поможет.
Обновить
Использование пользовательских функций в отчете
FastReport имеет большое количество встроенных стандартных функций для использования в дизайне отчетов. FastReport также позволяет писать и использовать пользовательские функции. Функции добавляются с помощью интерфейса библиотеки «FastScript», которая включена в FastReport (чтобы узнать больше о FastScript, обратитесь к руководству по библиотеке).
Давайте посмотрим, как в FastReport можно добавить процедуры и/или функции. Количество и типы параметров варьируются от функции к функции. Параметры типа «Set» и «Record» не поддерживаются FastScript, поэтому они должны быть реализованы с использованием более простых типов, например, TRect может быть передан как четыре целых числа: X0, Y0, X1, Y1. Подробнее об использовании функций с различными параметрами в документации FastScript.
В форме Delphi объявите функцию или процедуру и ее код.
function TForm1.MyFunc(s: String; i: Integer): Boolean;
begin
// required logic
end;
procedure TForm1.MyProc(s: String);
begin
// required logic
end;
Создайте обработчик функции onUser для компонента отчета.
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;
Используйте метод add компонента отчета, чтобы добавить его в список функций (обычно в событии onCreate или onShow формы Delphi).
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',
'My functions',
' MyFunc function always returns True');
frxReport1.AddFunction('procedure MyProc(s: String)',
'My functions',
' MyProc procedure does not do anything');
Добавленные функции появятся в категории «Мои функции». Для регистрации функций в существующих категориях используйте одно из следующих имен категорий:
- Строковая функция ctString
- Функции даты/времени ctDate
- Функции преобразования ctConv
- Форматирование ctFormat
- Математические функции ctMath
- 'ctOther' другие функции
Если имя категории оставить пустым, функция будет помещена в корень дерева функций. Для добавления большого количества функций рекомендуется всю логику размещать в отдельном блоке библиотеки. Вот пример:
unit myfunctions;
interface
implementation
uses SysUtils, Classes, fs_iinterpreter;
// you can also add a reference to any other external library here
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
// required logic
end;
procedure MyProc(s: String);
begin
// required logic
end;
{ TFunctions }
constructor TFunctions.Create;
begin
inherited Create(AScript);
with AScript do
AddMethod('function MyFunc(s: String; i: Integer): Boolean',CallMethod,'My functions', ' MyFunc function always returns True');
AddMethod('procedure MyProc(s: String)', CallMethod,'My functions','MyProc procedure does not do anything'');
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.
Сохраните файл с расширением .pas, затем добавьте ссылку на него в разделе «uses» формы вашего Delphiproject. После этого все ваши пользовательские функции будут доступны для использования в любом компоненте отчета без необходимости написания кода для добавления этих функций в каждый «TfrxReport» и без необходимости написания дополнительного кода для обработчика функции «onUser» каждого компонента отчета.
Обновление 2
Чтобы создать пользовательскую функцию FileExists
, объявите функцию в Delphi, например:
function TForm1.FrFileExists(FileName : string):boolean;
begin
// required logic
Result := FileExists(FileName);
end;
Используйте метод add компонента отчета, чтобы добавить его в список функций (обычно в событии onCreate или onShow формы Delphi).
procedure TForm1.FormCreate(Sender: TObject);
begin
frxReport1.AddFunction('function FrFileExists(FileName:String):Boolean','My functions',
'This function returns True if file exists');
frxReport1.DesignReport; //<-- THIS SHOW REPORT DESIGNER RUNTIME
end;
Создайте обработчик функции onUser для компонента отчета.
function TForm1.frxReport1UserFunction(const MethodName: string;var Params: Variant): Variant;
begin
if MethodName = 'FrFileExists' then
Result := FrFileExists(Params[0])
end;
Вы не можете ожидать увидеть функции во время разработки Fast report IDE. Чтобы увидеть функцию во время выполнения IDE, выполните:
включить frxDesgn
в пункт использования;
используйте этот код, чтобы показать дизайнеру:
frxReport1.DesignReport; //see code On create above
Запустите проект и увидите Fast Report Ide и нашу новую функцию FrFileExists
![введите здесь описание изображения](https://i.stack.imgur.com/5ZxZJ.png)
person
Val Marinov
schedule
04.08.2015