Ошибка функции Iif()

отредактировано 16:07 Раздел: FastScript
Я использую FastScript, который идёт в составе с FastReport 4 Standard Edition v4.11. RAD Studio 2010.

Пример кода (C++Script):
написал:
{
String a = iif(true, "T", "F");
ShowMessage(a);
}
Если этот код выполнить в теле отчёта, то функция работает как положено - выдаёт сообщение "T".
Однако, если этот же код выполнить при помощи TfsScript, на выходе получаем "0".
Причём сама функция IIF() в FastScript определена, в противном случае выдавалась бы ошибка "Undeclared identifier".
Я пробовал переопределить IIF(), используя TfsScript.AddMethod(), но безрезультатно - мою функцию скрипт игнорирует. В качестве временного решения я изменил название пользовательской функции на IIF2(), но это приносит неудобства конечным пользователям, которые часто путают эти две функции.

Комментарии

  • gpigpi
    отредактировано 16:07
    Вам нужно добавить функцию iif в скрипт
    Для Delphi это будет так:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, fs_synmemo, fs_ipascal, fs_iinterpreter,
      fs_iextctrlsrtti, fs_iclassesrtti, fs_ichartrtti, fs_idbctrlsrtti,
      fs_idbrtti, fs_iinirtti, fs_imenusrtti, fs_idialogsrtti, fs_iformsrtti,
      fs_igraphicsrtti, frxExportODF, frxExportTXT, frxExportHTML,
      frxExportXLS, frxExportXML, frxExportRTF, frxClass, frxDBSet, frxDCtrl,
      frxDMPExport, frxChBox, frxCross, frxRich, frxBarcode, frxOLE, frxDesgn,
      fs_tree, fs_iibxrtti, fs_iadortti, fs_ibdertti;
    
    type
      TForm1 = class(TForm)
        fsScript: TfsScript;
        fsPascal1: TfsPascal;
        script: TfsSyntaxMemo;
        Panel1: TPanel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        function CallMethod(Instance: TObject; ClassType: TClass;
      const MethodName: String; var Params: Variant): Variant;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var tmp:string;
    begin
      fsScript.Clear;
      fsScript.Parent:=fsGlobalUnit;
      fsScript.AddMethod('function IIF(Expr: Boolean; TrueValue, FalseValue: Variant): Variant',
          CallMethod);
      tmp:=script.Lines.Text;
      fsScript.Lines.Add(tmp);
    
          if not fsScript.Run then //выполняем скрипт
            ShowMessage(fsScript.ErrorMsg+'   '+ fsScript.ErrorPos);
    end;
    
    function TForm1.CallMethod(Instance: TObject; ClassType: TClass;
      const MethodName: String; var Params: Variant): Variant;
    var
      p1, p2, p3: Variant;
    begin
      if MethodName = 'IIF' then
      begin
        p1 := Params[0];
        p2 := Params[1];
        p3 := Params[2];
        try
          if p1 = True then
            Result := p2 else
            Result := p3;
        except
        end;
      end
    end;
    
    end.
    
  • отредактировано 16:07
    Спасибо, разобрался. Точнее я так и не понял, в чём была проблемма, просто скопировал определение функции из вашего примера и "перевёл" на C++. Теперь всё работает. Скорее всего до этого я просто где-то очепятался.

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

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