Глупый вопрос по FastScript
Привет Всем!
Уверен, что для большинства вопрос покажется глупым, но хотелось бы понять, чем по большому счету FastScript так хорош. Руководство по нему я прочитал и посмотрел в работе некоторые примеры из него. Но не догнал чем же он так хорош. Можно ли эти скрипты использовать в коде дизайнера отчетов?
Пробовал самый простой пример. Написал простенькую процедурку выводящую сообщение на экран. Добавил это дело в компонент fsScript.
Запускаю на выполнение и все разумеется работает. Но можно ли это дело использовать в коде того же дизайнера отчетов. Т.е. использовать там классы, компоненты и т.д. из самого кода Делфи? Кое что я знаю можно использовать в коде дизайнера отчетов и без fastScript. Но не так уж и много. Начав читать
документацию по fastScript я предположил, что он по идее должен дать возможность использования других компонент и классов, в коде дизайнера отчетов. Если я прав, то как? Взять ту же процедуру, написанную в скрипте..в коде дизайнера я не смог ее использовать..
Понимаю что FastScript разработали не просто так..но насколько у меня сложилось (вполне предполагаю ошибочное) впечатление..это все можно сделать и в обычном коде делфи куда попроще...
Уверен, что для большинства вопрос покажется глупым, но хотелось бы понять, чем по большому счету FastScript так хорош. Руководство по нему я прочитал и посмотрел в работе некоторые примеры из него. Но не догнал чем же он так хорош. Можно ли эти скрипты использовать в коде дизайнера отчетов?
Пробовал самый простой пример. Написал простенькую процедурку выводящую сообщение на экран. Добавил это дело в компонент fsScript.
Запускаю на выполнение и все разумеется работает. Но можно ли это дело использовать в коде того же дизайнера отчетов. Т.е. использовать там классы, компоненты и т.д. из самого кода Делфи? Кое что я знаю можно использовать в коде дизайнера отчетов и без fastScript. Но не так уж и много. Начав читать
документацию по fastScript я предположил, что он по идее должен дать возможность использования других компонент и классов, в коде дизайнера отчетов. Если я прав, то как? Взять ту же процедуру, написанную в скрипте..в коде дизайнера я не смог ее использовать..
Понимаю что FastScript разработали не просто так..но насколько у меня сложилось (вполне предполагаю ошибочное) впечатление..это все можно сделать и в обычном коде делфи куда попроще...
Комментарии
Безусловно. В документации описанно как добавлять классы, процедуры, функции
Почему? О чём вообще речь?
>Почему? О чём вообще речь?
Ну вот самый простой пример. За основу его я взял пример из руководства по 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? В этом случае я так понимаю нужна процедура из самого кода делфи. В общем запутался совсем..
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?
Ну ты мля выдал!
откуда fsScript1 знает что такое 'test' процедура или объект иль ещё чё, для этого этот 'test' надо описать. 'test' - это процедура, а процедура описывается так: дальше в CallMethod пишем реакцию на ЭТУ процедуру:
Короче смотри исходники FastScript!
Метод 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().
такой код я видел в документации
fsScript1.AddMethod('procedure test', CallMethod);
..
if MethodName = 'TEST' //обязательно большими буквами!!!
then test;
Беря первый пример до использованию процедуры в FastScript из документации видно как это работает...другое дело как я могу использовать это дело, когда пишу в коде дизайнера отчетов какие либо действия при построении отчета?