Как подключить свою функцию (например, сумму прописью)?
Question: Как подключить свою функцию (например, сумму прописью)?
Answer:
Используйте обработчик TfrReport.OnUserFunction. Вот простой пример такого обработчика (определяется функция SumPropis):
1 2 3 4 5 |
procedure TForm1.frReport1UserFunction(const Name: String; p1, p2, p3: Variant; var val: Variant); begin if AnsiCompareText('SUMPROPIS', Name) = 0 then val := My_Convertion_Routine(frParser.Calc(p1)); end; |
Теперь функцию можно использовать в любом месте отчета (текст, скрипт) в форме SumPropis(Value).
(но такой подход работает только для одного компонента TfrReport. А если я хочу сделать свою функцию доступной везде?)
Самый простой вариант - сделать обработчик события OnUserFunction общим для всех компонентов. Если этот вариант не подходит, придется писать библиотеку функций.
Простой пример того, как это сделать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
type TMyFunctionLibrary = class(TfrFunctionLibrary) public constructor Create;override; procedure DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: Variant);override; end; constructor TMyFunctionLibrary.Create; begin inherited Create; with List do begin Add('DATEPROPIS'); Add('SUMPROPIS'); end; end; procedure TMyFunctionLibrary.DoFunction(FNo: Integer; p1, p2, p3: Variant; var val: Variant); begin val := 0; case FNoof 0: val := My_DateConvertion_Routine(frParser.Calc(p1)); 1: val := My_SumConvertion_Routine(frParser.Calc(p1)); end; end; |
Регистрация библиотеки осуществляется процедурой
frRegisterFunctionLibrary(TMyFunctionLibrary);
Удаление библиотеки осуществляется процедурой
frUnRegisterFunctionLibrary(TMyFunctionLibrary);
(а как зарегистрировать функцию в списке функций (диалог "Вставка функции")?)
Используйте процедуру frAddFunctionDesc (модуль FR_Class):
1 |
frAddFunctionDesc('SUMPROPIS', 'Мои функции','SUMPROPIS(<Число DESIGNTIMESP=10415>)/Возвращает сумму прописью.');
|
Обратите внимание: символ "/" в описании функции обязателен! Он отделяет описание синтаксиса от описания самой функции.
FuncLib - это ссылка на библиотеку функций (может быть nil, если библиотека не используется). Когда библиотека удаляется процедурой frUnRegisterFunctionLibrary, все связанные с ней функции удаляются из списка функций.