Проблема с подключением пользовательской функции

отредактировано 08:30 Раздел: FastReport 4.0
Здравствуйте. У меня проблемка. Пользуюсь FR 4.3+Delphi 7. Прошерстил я форум и нашел как создать функцию написания прописью чисел.
function Propis(Value: Integer): string;
var
  Rend: boolean;
  ValueTemp, ValueOst: Integer;

  procedure Num(Value: byte);
  begin
    case Value of
      1: if Rend = true then Result := Result + 'один ' else Result := Result + 'одна ';
      2: if Rend = true then Result := Result + 'два ' else Result := Result + 'две ';
      3: Result := Result + 'три ';
      4: Result := Result + 'четыре ';
      5: Result := Result + 'пять ';
      6: Result := Result + 'шесть ';
      7: Result := Result + 'семь ';
      8: Result := Result + 'восемь ';
      9: Result := Result + 'девять ';
      10: Result := Result + 'десять ';
      11: Result := Result + 'одиннадцать ';
      12: Result := Result + 'двенадцать ';
      13: Result := Result + 'тринадцать ';
      14: Result := Result + 'четырнадцать ';
      15: Result := Result + 'пятнадцать ';
      16: Result := Result + 'шестнадцать ';
      17: Result := Result + 'семнадцать ';
      18: Result := Result + 'восемнадцать ';
      19: Result := Result + 'девятнадцать ';
    end
  end;

  procedure Num10(Value: byte);
  begin
    case Value of
      2: Result := Result + 'двадцать ';
      3: Result := Result + 'тридцать ';
      4: Result := Result + 'сорок ';
      5: Result := Result + 'пятьдесят ';
      6: Result := Result + 'шестьдесят ';
      7: Result := Result + 'семьдесят ';
      8: Result := Result + 'восемьдесят ';
      9: Result := Result + 'девяносто ';
    end;
  end;

  procedure Num100(Value: byte);
  begin
    case Value of
      1: Result := Result + 'сто ';
      2: Result := Result + 'двести ';
      3: Result := Result + 'триста ';
      4: Result := Result + 'четыреста ';
      5: Result := Result + 'пятьсот ';
      6: Result := Result + 'шестьсот ';
      7: Result := Result + 'семьсот ';
      8: Result := Result + 'восемьсот ';
      9: Result := Result + 'девятьсот ';
    end
  end;

  procedure Num00;
  begin
    Num100(ValueTemp div 100);
    ValueTemp := ValueTemp mod 100;
    if ValueTemp < 20 then Num(ValueTemp)
    else
    begin
      Num10(ValueTemp div 10);
      ValueTemp := ValueTemp mod 10;
      Num(ValueTemp);
    end;
  end;

  procedure NumMult(Mult: int64; s1, s2, s3: string);
  var
    ValueRes: Integer;
  begin
    if Value >= Mult then
    begin
      ValueTemp := Value div Mult;
      ValueRes := ValueTemp;
      Num00;
      if ValueTemp = 1 then Result := Result + s1
      else if (ValueTemp > 1) and (ValueTemp < 5) then Result := Result + s2
      else Result := Result + s3;
      Value := Value - Mult * ValueRes;
    end;
  end;
  
begin
  if (Value = 0) then Result := 'ноль'
  else
  begin
    Result := '';
    Rend := true;
    NumMult(1000000000000, 'триллион ', 'триллиона ', 'триллионов ');
    NumMult(1000000000, 'миллиард ', 'миллиарда ', 'миллиардов ');
    NumMult(1000000, 'миллион ', 'миллиона ', 'миллионов ');
    Rend := false;
    NumMult(1000, 'тысяча ', 'тысячи ', 'тысяч ');
    Rend := true;
    ValueTemp := Value;
    Num00;
  end;
end;

Подключаю так:
function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant;
begin
  if MethodName='PROPIS' then //имя функции в верхнем регистре
    begin
      if Params[0]<>null then
        Result := Propis(Params[0])
      else
        Result := Propis(0);
    end;
end;

И добавляю в список функций FR:
frxReport1.AddFunction('function Propis(Value: Integer): string', 'Дополнительные функции', 'Цена прописью');

Вызываю в Фаст Репорте
[Propis(500)]

Функция добавляется в список, но не работает. Т. е. вообще ничего не отображает. По идее если написать
[Propis(0)]
то сразу ж долно в превью отобразится : "ноль". Но и это не работает. Проверял на форме c Edit:
Edit1.text := Propis(500)
Работает.

В чем может быть проблема?? Подскажите пожалуйста!!

Комментарии

  • отредактировано 08:30
    что-бы функция работала в дизайнере надо предпринять шаги описанные в главе "Регистрация компонента в скриптовой системе" Руководства разработчика
    написал:
    Чтобы к нашему компоненту можно было обращаться из скрипта, необходимо зарегистрировать класс, его свойства и методы в скриптовой системе. Код регистрации по соглашению, принятому в FastReport, можно разместить в файле, имеющем такое же имя, как и файл с кодом самого компонента плюс суффикс RTTI (например, в нашем случае frxBitBtnRTTI.pas). Более подробно о регистрации классов, их методов и свойств можно прочитать в документации по скриптовой библиотеке FastScript.
    uses fs_iinterpreter, frxBitBtn, frxClassRTTI;
    
    type
      TFunctions = class(TfsRTTIModule)
      public
        constructor Create(AScript: TfsScript); override;
      end;
    
    
    constructor TFunctions.Create(AScript: TfsScript);
    begin
      inherited Create(AScript);
      with AScript do
      begin  { регистрируем класс и указываем, кто является его родителем }
        AddClass(TfrxBitBtnControl, 'TfrxDialogControl');
       { если в вашем модуле несколько элементов управления, их можно зарегистрировать тут же }
       { напр. AddClass(TfrxAnotherControl, 'TfrxDialogControl'); }
      end;
    end;
    
    initialization
      fsRTTIModules.Add(TFunctions);
    end.
    
    

    По аналогии я сделал пакет, который установил в систему и всё
  • отредактировано 08:30
    Спасибо большое за помощь. Попробую

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

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