Как вставить пользовательскую ф-цию?

отредактировано April 2006 Раздел: FastReport 3.0
Вопрос в следующем, как все-таки правильно подключать пользовательскую функцию?
При раскладе приведенном ниже, функция SSS не появляется в дереве функций отчета. При придварительном промотре - ошибка, но при выполнениии отчета все работает замечательно.

Заранее всем спасибо.
FR 3.20.25 & BDS2006


Function SSS(Number: Integer): string;
begin
Result:=IntToStr(Number+10);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
frxReport1.AddFunction('function SSS(Number: integer): string');
end;

function TForm1.frxReport1UserFunction(const MethodName: string;
var Params: Variant): Variant;
begin
if MethodName='SSS' then
Result:=SSS(Params[0]);
end;

Комментарии

  • LexLex
    отредактировано 18:40
    Попробуй FR3.21 там были какие-то исправления с пользовательскими функциями
  • gpigpi
    отредактировано 18:40
    в design-time подключённая таким образом пользовательская функция работать не будет, она подключается в run-time
  • отредактировано April 2006
    gpi написал:
    в design-time подключённая таким образом пользовательская функция работать не будет, она подключается в run-time
    Читаю DeveloperManual-ru.pdf (стр.40), и что вижу:
    ...Этот способ несколько проще. Описания функций теперь добавляются с
    помощью метода TfrxReport.AddFunction с единственным параметром. Вызов
    функций реализуется в обработчике события TfrxReport.OnUserFunction.
    Оба способа подключения равноценны. Подключенную функцию можно
    использовать в скрипте отчета, а также обращаться к ней из объектов типа
    TfrxMemoView. Функция также отображается в окне "Дерево данных". В этом окне функции разбиты по категориям, и при выборе каждой функции внизу окна отображается подсказка по выбранной функции.
    Изменим код наших примеров, чтобы зарегистрировать функции в
    отдельной категории и отобразить описание функции:....

    Может надо как-то по другому????
  • gpigpi
    отредактировано 18:40
    написал:
    Функция также отображается в окне "Дерево данных".
    Это относится к дизайнеру, вызванному в рантайме
  • отредактировано 18:40
    Спасибо. Успокоили и озадачили.
  • SvetkinSvetkin СПб
    отредактировано 18:40
    Как же тогда подключить функцию в design-time???????

    помогите плиз, а то только пересел на FS и пока толком многого не понимаю...
  • отредактировано 18:40
    Нужно создать свой модуль (см. ниже), затем подключить его в uses и можно использовать функции в design-time.
    unit functions;
    interface
    uses SysUtils, Classes, fs_iinterpreter;
    
    implementation
    
    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(str:string):string;
    begin
    // TO DO
    end;
    
    constructor TFunctions.Create(AScript: TfsScript);
    begin
    inherited Create(AScript);
    with AScript do
    AddMethod('function Func(str:string):string', CallMethod, 'My functions', 'Func');
    end;
    
    function TFunctions.CallMethod(Instance: TObject; ClassType: TClass;
    const MethodName: String; var Params: Variant): Variant;
    begin
    if MethodName = 'FUNC' then Result := MyFunc(Params[0]);
    end;
    
    initialization
    fsRTTIModules.Add(TFunctions);
    end.
    
  • SvetkinSvetkin СПб
    отредактировано 18:40
    Подключить в коде отчета или приложения???????
  • отредактировано 18:40
    В Delphi в коде приложения.
  • отредактировано June 2006
    написал:
    Нужно создать свой модуль (см. ниже), затем подключить его в uses и можно использовать функции в design-time.
    unit functions;
    interface
    uses SysUtils, Classes, fs_iinterpreter;
    .....
    
    Спасибо за ответ.
    Но все равно - у меня не получается. Видать руки - крюки.
    На форме лежит Button1 и frxReport1. Больше нигда и ничего не прописано - все по умолчанию.
    В run-time - все нормально отрабатывает!
    В design-time - фигушки, ошибка.
    Если можно - примерчик на PM или мыло. Заранее спасибо.
    unit Unit2;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, frxClass;
    type
      TForm2 = class(TForm)
        Button1: TButton;
        frxReport1: TfrxReport;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form2: TForm2;
    implementation
    uses functions;
    {$R *.dfm}
    procedure TForm2.Button1Click(Sender: TObject);
    begin
     frxReport1.PrepareReport(True);
     frxReport1.ShowPreparedReport;
    end;
    end.
    
  • SvetkinSvetkin СПб
    отредактировано 18:40
    Я прошу прощение за наивность, но я думал что смогу перевести на С++...

    ... к сожалению ничерта не получается, может кто объяснит доходчиво как это сделать в builder-ре
  • отредактировано 18:40
    Svetkin написал:
    Я прошу прощение за наивность, но я думал что смогу перевести на С++...

    ... к сожалению ничерта не получается, может кто объяснит доходчиво как это сделать в builder-ре
    Не удевительно в BCB нет initialization, нужно использовать void __stdcall __LateVCLInit(void).
    Вот небольшой пример, чтобы функции появились нужно:
    1) Запустить BCB ;)
    2) В меню Component -> Install Componenet... -> перейти на вкладку InTo New Package
    3) в Unit File Name выбрать DLLFunctions.cpp
    4) в Packages file name c:\program files\borland\cbuilder6\Lib\myfunctions.bpk - где myfunctions.bpk - имя нового пакета.
    5) Ok -> предложит собрать и установить пакет нужно согласится.
    6) После установки пакета выйти из BCB.
    7) Открыть BCB и загрузить Project1.bpr.
    8) Двойной клик по frxReport, если все сделали правельно появятся новые функции.
  • отредактировано 18:40
    написал:
    Спасибо за ответ.
    Но все равно - у меня не получается. Видать руки - крюки.
    На форме лежит Button1 и frxReport1. Больше нигда и ничего не прописано - все по умолчанию.
    В run-time - все нормально отрабатывает!
    В design-time - фигушки, ошибка.
    Если можно - примерчик на PM или мыло. Заранее спасибо.

    Тоже что и для BCB В меню Component -> Install Componenet... -> перейти на вкладку InTo New Package, в unit name имя фашего pas файла с функциями, а в package file name путь и имя нового пакета (путь должен быть прописан в library path).
  • SvetkinSvetkin СПб
    отредактировано 18:40
    TO -=Den-=

    Спасибо огромное за подробный ответ, наконец-то начинает складываться, хоть какая-то картина, но есть небольшая незадача...

    на последнем этапе компиляции выскакивает такая ошибка:

    Cannot debug project unless a host application is defined. Use the Run|Parameters... dialog box.
    ??????????????
  • отредактировано 18:40
    Вы пытаетесь запустить созданный пакет, а нужно сделать Build и Install.
  • SvetkinSvetkin СПб
    отредактировано 18:40
    TO -=Den-=

    Огромное спасибо заработало!!!!!!!!! ;)
  • SvetkinSvetkin СПб
    отредактировано 18:40
    Правильно ли я понимаю, что подключив функции по выше изложенной методике в design-time, меня не избовляет от включения их же в коде исполняемого файла????7

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

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