Как подключить свою функцию (например, сумму прописью)?

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, все связанные с ней функции удаляются из списка функций.