Интерпретатор отдельно

отредактировано 15:42 Раздел: FastReport 2.xx VCL
Кто нить в курсе, почему fr_intpr.pas не удается заюзать отдельно от фастрепорта?
Интерпретатор отказывается обрабатывать управляющие конструкции,( если покопаться в кишочках - вставляя chr(0) в string строку при обработке prepare и тем самым обрезая ее).

Комментарии

  • отредактировано 15:42
    Наверное для него нужны ещё-какие-нить вещи, котрые инициализируются в других модулях ?

    Глянь к примеру:
    constructor TfrGlobals.Create;

  • отредактировано 15:42
    Спасибо, конечно, но там много чего, и потом, я не силен в Делфях, почему и спрашиваю.
    Вот мой техт, конечно, в него я впиндюрил кусочек из fr_class.pas, иначе интерпретатор вообще бы не работал, но он работает, только не хочет выполнять операторы ветвления. Там (в fr_intrp) применяется адресация по строкам скрипта, зашифрована в 2 байта, ставится при парсинге в начало строки, ну и естессно, если в стринг записать chr(0), то строка обрежется, если я не ошибаюсь. Я бы и поправил алгоритм интерпретатора, но он же рекурсивный - разбираться полгода надо, мне, во-всяком случае.
    Мабыть, я просто протупил где, не зная дельфей толком, если не трудно, поправь.



    unit Unit1;

    interface
    {$I FR.inc}
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, FR_Pars, FR_Intrp;

    type
    TInterpretator = class(TfrInterpretator)
    public
    procedure GetValue(const Name: String; var Value: Variant); override;
    procedure SetValue(const Name: String; Value: Variant); override;
    procedure DoFunction(const name: String; p1, p2, p3: Variant;
    var val: Variant); override;
    end;

    TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Button2: TButton;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure OnGetParsVariableValue(const s: String; var v: Variant);
    procedure OnGetParsFunction(const name: String; p1, p2, p3: Variant;
    var val: Variant);

    private
    { Private declarations }
    public

    { Public declarations }
    end;

    var
    Form1: TForm1;
    mypars:TfrParser;
    myvari:TfrVariables;
    myinter:TInterpretator;

    implementation

    function My_say_box(p1,p2,p3:Variant):integer;
    begin
    form1.Canvas.Pen.Color := p3;
    form1.Canvas.Rectangle(p1,p2,p1+p3,p2+p3)
    end;
    //uses FR_Pars;

    {$R *.DFM}

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    var
    retval: Variant;
    begin
    if key = #13
    then
    Label1.Caption := mypars.Calc(edit1.Text);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    mypars:=TfrParser.Create;
    mypars.OnGetValue := OnGetParsVariableValue;
    mypars.OnFunction := OnGetParsFunction;
    myvari:=TfrVariables.Create;
    myinter:=TInterpretator.Create;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    myinter.PrepareScript(memo1.Lines,memo2.Lines,memo3.Lines);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    myinter.DoScript(memo2.lines);
    end;

    procedure TForm1.Edit1Change(Sender: TObject);
    begin
    // Label1.Caption := mypars.Calc(edit1.Text);
    end;


    procedure Tform1.OnGetParsVariableValue(const s: String; var v: Variant);
    begin
    if myvari.IndexOf(s) <> -1 then
    begin
    v := myvari;
    end;
    end;

    procedure Tform1.OnGetParsFunction(const name: String; p1, p2, p3: Variant;var val: Variant);
    begin
    val:=0;
    if AnsiCompareText('SAY', Name) = 0 then
    val := My_say_box(p1,p2,p3);
    end;

    procedure TInterpretator.GetValue(const Name: String; var Value: Variant);
    begin
    if myvari.IndexOf(name) <> -1 then
    begin
    value := myvari[name];
    end;
    end;

    procedure TInterpretator.SetValue(const Name: String; Value: Variant);
    begin
    myvari[name]:=value;
    end;

    procedure TInterpretator.DoFunction(const Name: String; p1, p2, p3: Variant;
    var Val: Variant);
    begin
    val:=0;
    if AnsiCompareText('SAY', Name) = 0 then
    val := My_say_box(mypars.calc(p1),mypars.calc(p2),mypars.calc(p3));
    end;



    end.
  • отредактировано 15:42
    Возьмите нормальный, полноценный скриптовый движок (типа FastScript ;) и не мучайтесь, интерпретатор от 2.5 слишком медленный и слабый по возможностям.

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

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