Пользовательская функция

LedLed
отредактировано 03:45 Раздел: FastReport 3.0
У меня есть функция перевода числа в строку, но я не знаю как её вставить
Подскажите плз...

Комментарии

  • gpigpi
    отредактировано 03:45
    Пример для Delphi
    function TMainForm.Report_3UserFunction(const MethodName: String;
      var Params: Variant): Variant;
    begin
         if MethodName='SUMMAPROPIS' then
           begin
             if Params[0]<>null then
               Result := SummaPropis(Params[0])
             else
               Result := SummaPropis(0);
           end;
    end;
    
    procedure TMainForm.FormShow(Sender: TObject);
    begin
        Report_3.AddFunction('function SummaPropis(summa: Double):String');
    end;
    
  • LedLed
    отредактировано 03:45
    ну так где это писать?опишите плз подробнее
  • gpigpi
    отредактировано 03:45
    1 - обработчик события OnUserFunction frxReport
    2 - в обработчике формы OnShow описываем пользовательскую функцию
    3 - в скрипте отчёта вызываем пользовательскую функцию
    SummaPropis(<frxDBDataset1."SUMMA">);
  • LedLed
    отредактировано August 2006
    AnsiString triada(AnsiString in, int tn)
    {
    if (in == "   ") return "";
    if (in == "000") return "";
    AnsiString out = "";
    AnsiString sotni[9] = 
    {"сто", "двести", "триста", "четыреста", "пятьсот",
    "шестьсот", "семьсот", "восемьсот", "девятьсот"};
    AnsiString dubl[10] = 
    {"десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать",
    "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"};
    AnsiString des[8] = 
    {"двадцать", "тридцать", "сорок", "пятьдесят",
    "шестьдесят", "семьдясят", "восемьдясят", "девяносто"};
    AnsiString ed[9] = {"один", "два", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
    AnsiString edj[9] = {"одна", "две", "три", "четыре", "пять", "шесть","семь", "восемь", "девять"};
    AnsiString ind[5] = {"", " тысяч", " миллион", " миллиард", " триллион"};
    AnsiString post;
    if (in[1] != ' ') if (in[1] != '0')
            { out = out + sotni[StrToInt(in[1])-1]; }
    if (in[2] == '1')
            { out = out + " " + dubl[StrToInt(in[3])]; }
    if (in[2] != '1') if (in[2] != ' ') if (in[2] != '0')
            { out = out + " " + des[StrToInt(in[2])-2]; }
    if (in[3] != '0') if (in[2] != '1')
            {
            if (tn == 1)
                    out = out + " " + edj[StrToInt(in[3])-1];
            if (tn != 1)
                    out = out + " " + ed[StrToInt(in[3])-1];
            }
    if (tn>0) if (in[2] != '1')
            {
            if (tn==1) switch (in[3])
                    {
                    case '1': post = ind[tn] + "а"; break;
                    case '2': post = ind[tn] + "и"; break;
                    case '3': post = ind[tn] + "и"; break;
                    case '4': post = ind[tn] + "и"; break;
                    default : post = ind[tn] + ""; break;
                    }
            if ((tn==2)||(tn==3)||(tn==4)) switch (in[3])
                    {
                    case '1': post = ind[tn] + ""; break;
                    case '2': post = ind[tn] + "а"; break;
                    case '3': post = ind[tn] + "а"; break;
                    case '4': post = ind[tn] + "а"; break;
                    default : post = ind[tn] + "ов"; break;
                    }
            }
    else
            {
            switch (tn)
                    {
                    case 1  : post = ind[tn]; break;
                    default : post = ind[tn] + "ов"; break;
                    }
            }
    out = out + post;
    return out;
    }
    AnsiString summa(AnsiString in)
    {
    AnsiString out;
    AnsiString trs[5];
    AnsiString tro[5];
    AnsiString buf;
    int n,s;
    div_t dr;
    
    while (in.Length() < 15)
            {
            in = " " + in;
            }
    for (n=0;n<5;n++) trs[n] = in;
    trs[0] = trs[0].Delete(1,in.Length()-3);
    trs[1] = trs[1].Delete(1,in.Length()-6).Delete(4,4);
    trs[2] = trs[2].Delete(1,in.Length()-9).Delete(4,6);
    trs[3] = trs[3].Delete(1,in.Length()-12).Delete(4,9);
    trs[4] = trs[4].Delete(1,in.Length()-15).Delete(4,12);
    
    for (n=0;n<5;n++)
            {
            tro[n] = triada(trs[n],n);
            }
    out = " "+tro[4]+" "+tro[3]+" "+tro[2]+" "+tro[1]+" "+tro[0]+" ";
    out = out.Trim();
    return out;
    }
    
    это сама функция я её записал в
    1 - обработчик события OnUserFunction frxReport

    а что писать в OnShow и где он находиться я понять немогу ;)
    Событие OnShow формы моего проекта чтоли?
  • gpigpi
    отредактировано August 2006
    написал:
    Событие OnShow формы моего проекта чтоли?
    Да, в событии главной формы проекта
    И ещё. Подключённая таким образом пользовательская функция не доступна в design-time.
  • LedLed
    отредактировано 03:45
    ну то что будет не доступна в design-time то это я уже прочитал,
    а вот что писать в OnShow?
  • gpigpi
    отредактировано 03:45
    procedure TMainForm.FormShow(Sender: TObject);
    begin
    frxReport1.AddFunction('function SummaPropis(summa: Double):String');
    end;
  • LedLed
    отредактировано 03:45
    function TMainForm.Report_3UserFunction(const MethodName: String;
    var Params: Variant): Variant;
    всместо MethodName рлставить имя своей функции?
    а вместо Params параметры?
  • gpigpi
    отредактировано 03:45
    Да, только в примере из моего проекта отчёт называется Report_3, а форма - MainForm, поэтому и название обработчика
    function TMainForm.Report_3UserFunction(const MethodName: String;
    var Params: Variant): Variant;
  • LedLed
    отредактировано 03:45
    Что-то не получаетсья выдает ошыбку что моя функция не
    являэться членом Form1
  • gpigpi
    отредактировано August 2006
    у frxReport в инспекторе объектов создайте обработчик пользовательской функции
    пример из Delphi, но в билдере, думаю, аналогично
  • LedLed
    отредактировано August 2006
    это я понимаю ;) )
    я когда саму функцию свою вставляю то выдает ошыбку...
  • LedLed
    отредактировано 03:45
    ну вот как например должна выглядить пользовательская функция для перевода числа в пропись, сам код функции которая переводит число в пропись выше. Форма у меня Form1, ФР frxReport2
  • gpigpi
    отредактировано 03:45
    Обратись к -=Den=- из саппорта. Он подскажет

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

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