Подрограмма ???
День добрый всем !!!!
Может кто сталкивался с проблемкой, суть её в том что есть повторяющееся часть кода в скриптах, а вот как её оформить в виде подпрограммы,куда поместить
Delphi - 7, FR - 2.47
Может кто сталкивался с проблемкой, суть её в том что есть повторяющееся часть кода в скриптах, а вот как её оформить в виде подпрограммы,куда поместить
Delphi - 7, FR - 2.47
Комментарии
2.22. Как подключить свою функцию (например, сумму прописью)?
Используйте обработчик TfrReport.OnUserFunction. Вот простой пример такого
обработчика (определяется функция SumPropis):
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 общим
для всех компонентов. Если этот вариант не подходит, придется писать
библиотеку функций. Простой пример того, как это сделать:
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 FNo of
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):
frAddFunctionDesc(FuncLib, 'SUMPROPIS', 'Мои функции',
'SUMPROPIS(<Число>)/Возвращает сумму прописью.');
Обратите внимание: символ "/" в описании функции обязателен! Он отделяет
описание синтаксиса от описания самой функции.
FuncLib - это ссылка на библиотеку функций (может быть nil, если библиотека
не используется). Когда библиотека удаляется процедурой
frUnRegisterFunctionLibrary, все связанные с ней функции удаляются из
списка функций.
а вынести какую-то часть кода в скриптах и оформить её тоже как скрипт
(попытаюсь на примере объяснить)
if A=1 then
begin
n:=5;
M[n]:=M[n]+[DialogForm.quMAIN."MON_L"];
end;
if A=2 then
begin
n:=6;
M[n]:=M[n]+[DialogForm.quMAIN."MON_L"];
end;
Вот эта часть повторяется
M[n]:=M[n]+[DialogForm.quMAIN."MON_L"];
Вот как сделать (синтаксис приблизительный, переменные глобальные)
procedure P1 (n);
begin
M[n]:=M[n]+[DialogForm.quMAIN."MON_L"];
end;
if A=1 then
begin
P1(5);
end;
if A=2 then
begin
P1(6);
end;
Ну ничего Ctrl+C,Ctrl+V - исправно работает и в FR 2.47
Спасибо за подсказку...