Глупый вопрос по FastScript

отредактировано 06:30 Раздел: FastScript
Привет Всем!

Уверен, что для большинства вопрос покажется глупым, но хотелось бы понять, чем по большому счету FastScript так хорош. Руководство по нему я прочитал и посмотрел в работе некоторые примеры из него. Но не догнал чем же он так хорош. Можно ли эти скрипты использовать в коде дизайнера отчетов?
Пробовал самый простой пример. Написал простенькую процедурку выводящую сообщение на экран. Добавил это дело в компонент fsScript.
Запускаю на выполнение и все разумеется работает. Но можно ли это дело использовать в коде того же дизайнера отчетов. Т.е. использовать там классы, компоненты и т.д. из самого кода Делфи? Кое что я знаю можно использовать в коде дизайнера отчетов и без fastScript. Но не так уж и много. Начав читать
документацию по fastScript я предположил, что он по идее должен дать возможность использования других компонент и классов, в коде дизайнера отчетов. Если я прав, то как? Взять ту же процедуру, написанную в скрипте..в коде дизайнера я не смог ее использовать..
Понимаю что FastScript разработали не просто так..но насколько у меня сложилось (вполне предполагаю ошибочное) впечатление..это все можно сделать и в обычном коде делфи куда попроще...

Комментарии

  • отредактировано 06:30
    написал:
    Можно ли эти скрипты использовать в коде дизайнера отчетов?
    Код дизайнера отчет выполняет FastScript.
    написал:
    Но можно ли это дело использовать в коде того же дизайнера отчетов. Т.е. использовать там классы, компоненты и т.д. из самого кода Делфи?
    Безусловно. В документации описанно как добавлять классы, процедуры, функции
    написал:
    Взять ту же процедуру, написанную в скрипте..в коде дизайнера я не смог ее использовать..
    Почему? О чём вообще речь?
  • отредактировано 06:30
    >Взять ту же процедуру, написанную в скрипте..в коде дизайнера я не смог >ее использовать..

    >Почему? О чём вообще речь?

    Ну вот самый простой пример. За основу его я взял пример из руководства по FastScript. На делфийской форме есть компоненты: Button1, мемо1,frxReport1,fsPascal1,fsScript1.

    В мемо1 добаляем следующее:
    procedure test;
    Begin
    ShowMessage('ok');
    end;

    begin
    test;
    End.

    В процедуре выполняющейся по нажатии кнопки пишем следующее:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    fsScript1.AddMethod('procedure test', CallMethod);
    fsScript1.Lines := Memo1.Lines;
    fsScript1.SyntaxType := 'PascalScript';
    fsScript1.Parent := fsGlobalUnit;
    if fsScript1.Compile then
    fsScript1.Execute else
    ShowMessage(fsScript1.ErrorMsg);
    frxReport1.ShowReport;
    end;

    добавляю в код делфи :

    function TForm1.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String;var Params: Variant): Variant;
    begin
    test;
    end;

    Procedure TForm1.Test;//без этого в addmethod ничего не добавишь
    Begin
    ShowMessage('OK!')
    End;

    В коде дизайнера между "begin end" добавляю строку "test;"

    в случае с AddMethod как я понимаю указывается процедура используемая в коде делфи. тогда как быть с добавлением строк? Если в мемо1 написать только "Begin end." - все компилируется, но в дизайнере вылетает сообщение мол не знаю что такое "test". Если в fastScript.Lines добавляю то что написал как содержимое memo1 - я итоге еще до попытки запуститься в дизайнере при компиляции - кричит что метод повторно объявлен. Я так понимаю что в fsScript1.Lines должен быть код который будет выполнять fastscript. Тогда как с fsScript1.AddMethod? В этом случае я так понимаю нужна процедура из самого кода делфи. В общем запутался совсем..
  • отредактировано 06:30
    Собствено можно что бы без моих хитрых объяснений взять чисто пример из руководства по FastScript:

    procedure TForm1.DelphiFunc(s: String; i: Integer);
    begin
    ShowMessage(s + ', ' + IntToStr(i));
    end;

    { обработчик TfsCallMethodEvent }
    function TForm1.CallMethod(Instance: TObject; ClassType: TClass; const
    MethodName: String;
    var Params: Variant): Variant;
    begin
    DelphiFunc(Params[0], Params[1]);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    { делаем процедуру DelphiFunc доступной в скрипте }
    fsScript1.AddMethod('procedure DelphiFunc(s: String; i: Integer)', CallMethod);
    { компилируем скрипт с использованием PascalScript }
    fsScript1.Lines := Memo1.Lines;
    fsScript1.SyntaxType := 'PascalScript';
    fsScript1.Parent := fsGlobalUnit;
    if fsScript1.Compile then
    fsScript1.Execute else { выполнить, если компиляция успешна}
    ShowMessage(fsScript1.ErrorMsg); { вывести сообщение об ошибке }
    end;
    В Memo1 добавляем строки:
    Begin
    DelphiFunc('s',1);//неважно чего за данные...
    End.
    В итоге все работает. Но как я это дело могу использовать в самом дизайнере отчетов. Как мне там получить доступ к той же процедуре DelphiFunc?
  • vixvix
    отредактировано April 2006
    2shiva4
    Ну ты мля выдал!

    откуда fsScript1 знает что такое 'test' процедура или объект иль ещё чё, для этого этот 'test' надо описать. 'test' - это процедура, а процедура описывается так:
    fsScript1.AddMethod('procedure test', CallMethod);
    
    дальше в CallMethod пишем реакцию на ЭТУ процедуру:
    if MethodName = 'TEST' //обязательно большими буквами!!!
    then test;
    

    Короче смотри исходники FastScript!
  • отредактировано 06:30
    Нужно вызывать метод добавления не у компонента скрипта, а у TfrxReport.

    Метод 1:
    frxReport1.AddFunction()
    и добавить свой код в событие TfrxReport.OnUserFunction:
    function TForm1.frxReport1UserFunction(const MethodName: String;
    var Params: Variant): Variant;
    begin
    if MethodName = 'TEST' then test;
    end;

    Метод 2:

    frxReport1.Script.AddMethod().
  • отредактировано 06:30
    Ну последнее понятно.
    такой код я видел в документации

    fsScript1.AddMethod('procedure test', CallMethod);
    ..
    if MethodName = 'TEST' //обязательно большими буквами!!!
    then test;

    Беря первый пример до использованию процедуры в FastScript из документации видно как это работает...другое дело как я могу использовать это дело, когда пишу в коде дизайнера отчетов какие либо действия при построении отчета?
  • отредактировано 06:30
    А... теперь понятно..попробую сделать как ты сказал. После напишу о результатах. Спасибо ;)

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

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