Функции

EduEdu
отредактировано 23:49 Раздел: FastReport 3.0
Я передаю данные из Делфей в Fast Report через OnGetValue (из массива). Мне нужно создать функцию F([a]) в Report'e, чтобы в зависимости от [а] (где [a] - элемень массива, переданный из Делфей) менялся текст в Report'овском Memo.

Function f(a:string):string;
begin
If a='...' then f:='...'; //Если можно Memo1:='...';
If a='...' then f:='...'; //Или F:='...', а в Memo '[f([a])]' - не знаю
...
end;

Не бейте за язык, но как правильно писать не знаю.
Где писать функцию, где обращение к ней?
Помогите, пожалуйста.

Комментарии

  • отредактировано 23:49
    Используйте событие onUserFunction. Подробности в документации.
  • EduEdu
    отредактировано 23:49
    Вот содержимое Unit'a:

    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
    frxReport1.AddFunction('Function FSigh0(a:string):string;','Primex','');
    frxReport1.LoadFromFile('Report.fr3');
    frxReport1.ShowReport;
    end;

    procedure TForm1.frxReport1GetValue(const ParName: string; var ParValue: Variant);
    var i:integer;
    begin
    i:=1;
    while Form1.StringGrid1.Cells[0,i]<>'' do
    if ParName = Form1.StringGrid1.Cells[0,i] then
    ParValue := Form1.StringGrid1.Cells[1,i]
    end;

    Function FSigh0(a:string):string;
    begin
    If a='100' then Result:='да' else Result:='нет';
    end;

    function TForm1.frxReport1UserFunction(const MethodName: String;var Params: Variant): Variant;
    begin
    if MethodName='FSigh0' then
    Result:=FSigh0(Params);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    //
    Form1.StringGrid1.Cells[0,0]:='переменная';
    Form1.StringGrid1.Cells[1,0]:='значение';
    Form1.StringGrid1.Cells[0,1]:='s';
    Form1.StringGrid1.Cells[1,1]:='100';
    end;


    Событиям OnGetValue и OnUserFunction были поставлены соответствующие процедура и функция. В самом отчете один объект Memo c текстом 'Результат = [FSigh0('100')]'. Делфи все это откомпилировала и запустила, но в отчете только 'Результат =', а не 'Результат = да'.

    В документации было написано, что функция появится в списке functions. Это имелось ввиду на стадии программирования? У меня в списке функций моей не появилось и раздела 'Primex' тоже.

    И как посчитать значение функции от s в Мемо [FSigh0(s)] или [FSigh0()]?
  • отредактировано 23:49
    function TForm1.frxReport1UserFunction(const MethodName: String;var Params: Variant): Variant;
    begin
    if SameText(MethodName,'FSigh0') then Result:=FSigh0(Params[0]);
    end;
    
    MethodName передаётся в верхнем регистре, поэтому в твоём варианте функция не будет вызываться.
    И Params это массив параметров.

    в Мемо [FSigh0()]

    в общем читаем справку или ищем топик FAQ на форуме
  • EduEdu
    отредактировано 23:49
    Спасибо, заработало.

    Только если у функции 2 параметра в Мемо писать:

    [FSigh0(<a,b>)] или [FSigh0(<a>,)] или по-другому?
  • отредактировано 23:49
    [FSigh0(<a>,[b])]
    
  • отредактировано 23:49
    В догонку по этой теме...
    Версия 3.11
    Простейший код
     if SameText(MethodName,'TEST') then
        Result:=Params[0];
    
    вызывает ошибку: "Could not convert variant of type (Array Variant) into type (String)"
  • отредактировано 23:49
    Этот код не имеет никакого отношения к FR, это уже Delphi
    if SameText(MethodName,'TEST') then
       Result:=VarToStr(Params[0]); // при условии что Result:String
    
  • отредактировано 23:49
    ranc написал:
    В догонку по этой теме...
    Версия 3.11
    Простейший код
     if SameText(MethodName,'TEST') then
        Result:=Params[0];
    
    вызывает ошибку: "Could not convert variant of type (Array Variant) into type (String)"
    Если у вас Delphi6 - необходимо поставить Update2
  • отредактировано 23:49
    написал:
    Если у вас Delphi6 - необходимо поставить Update2
    Delphi7 + Update 1.1
  • отредактировано 23:49
    Таже проблема:
    написал:
    вызывает ошибку: "Could not convert variant of type (Array Variant) into type (String)"

    //так подключаю
    function TFDataModule.frxReportKartUserFunction(const MethodName: String;
    var Params: Variant): Variant;
    begin
    if SameText(MethodName,'SUMPROPIS') then Result := SumNumToFull(Params[0])
    end;

    //так добавляю
    frxReportKart.AddFunction('function SumPropis(S: real): string','Дополнительные','Сумма прописью');
    frxReportKart.ShowReport();

    // так использую в самом отчете
    [sumpropis([<frxDBDatasetKart."KartOfficeSumma">])]

  • gpigpi
    отредактировано 23:49
    написал:
    // так использую в самом отчете
    [sumpropis([<frxDBDatasetKart."KartOfficeSumma">])]
    а так?
    [sumpropis(<frxDBDatasetKart."KartOfficeSumma">)]
  • отредактировано 23:49
    так все замечательно прокатило.
    благодарю!

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

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