Подрограмма ???

WASWAS
отредактировано 07:25 Раздел: FastReport 2.xx VCL
День добрый всем !!!!

Может кто сталкивался с проблемкой, суть её в том что есть повторяющееся часть кода в скриптах, а вот как её оформить в виде подпрограммы,куда поместить

Delphi - 7, FR - 2.47

Комментарии

  • отредактировано August 2005
    FAQ:
    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, все связанные с ней функции удаляются из
    списка функций.
  • WASWAS
    отредактировано 07:25
    Уточняю не подключить функцию, (это уже всё работает),
    а вынести какую-то часть кода в скриптах и оформить её тоже как скрипт
    (попытаюсь на примере объяснить)

    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;



  • отредактировано 07:25
    Такое возможно только в FR3
  • WASWAS
    отредактировано 07:25
    Как не хорошо получается (FR3 - опять что то менять переписывать)
    Ну ничего Ctrl+C,Ctrl+V - исправно работает и в FR 2.47
    Спасибо за подсказку...

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.