В этой статье хотел бы поговорить о интерпретаторе MS ScriptControl. Немного поговорим о нем, то есть немного теории. В своих проектах, некоторые пользователи хотят использовать какой-нибудь другой язык программирования, например, JavaScript, VBScript, Perl и многие другие, так вот, на помощь, в данном случае, приходит MS ScriptControl. Данный интерпретатор, устанавливается, как ActiveX-компонент. В данный статье, мы рассмотрим, как установить данный компонент и как работать с ним, то есть попробуем выполнить через него простейшую JavaScript-функцию, так как я в JavaScript не силен, то мы рассмотрим функцию суммирования 2-х чисел, ну а чтобы попробовать более серьезное, необходимо будем искать или писать самому функцию. Вообще, многие выполняют JavaScript через TWebbrowser, а уже потом забирают данные, возвращаемые тем или иным скриптом. На самом деле, выполнять JavaScript в Delphi, можно не используя данный компонент, а через создания OLE-объекта, но будет использоваться все тот же интерпретатор.
Ну, а теперь давайте приступим к установке данного компонента. Выполним команду Component-ImportComponent (IDE Delphi XE), после чего появляется окно:
Здесь, мы выбираем Import ActiveX Control и жмем Next>>.
Здесь, выбираем библиотеку ActiveX — Microsoft Script Control 1.0.https://devdelphi Нажимаем кнопку Next>> и в появившемся окне необходимо выставить галочку Generate Component Wrappers.
Ну и наконец-то, нажимаем кнопку Next>> и в следующем окне, нажимаем Finish.
Далее, устанавливаем компонент на форму. На форме у меня следующие компоненты:
- TMemo
- TScriptControl
- TButton
Теперь немного поговорим о свойствах и методах, компонента TSciptControl.
Свойства:
- Language:String — задается язык, интерпретатор, который и будет выполнять, реализовывать. В стандартной установки, доступны JavaScript и VBScript.
- TimeOut:Integer — задается время выполнения скрипта, если в течение данного времени, скрипт не будет выполнен, то произойдет генерирование ошибки, если присвоить значение 1, то скрипт будет выполняться неограниченное время.
- UseSafeSubset:Boolean — если значение данного свойства равно True, то интерпретатор будет выполнять ограниченный набор действий, при выполнение скрипта, которые заданы в настройках Вашей системы.
Ну с основными свойствами разобрались, теперь приступаем к основным методам:
Методы:
- procedure AddCode — добавляет код языка, который в дальнейшем можно выполнить при помощи метода Run.
- function Eval — выполняет код, который задан в параметре и сразу же возвращает результат, то есть нет необходимо добавлять перед этим код на выполнение, указывается сразу в параметре.
- procedure AddObject — добавляет OLE-объект
- function Run — выполняет код, который был добавлен при помощь процедуры AddCode. В параметрах данной функции, указывается имя функции, которую необходимо выполнить, а также список параметров, передаваемые в данную функцию, если имеется такая необходимость.
- procedure Reset — думаю сильно объяснять тут не надо. Сбрасывает все настройки, коды и так далее, установленные в данном компоненте ранее.
Ну, что теперь давайте вернемся в наш проект и выполним простую JavaScript-функцию. На событие OnClick нашей кнопки, я написал следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
pPar:PSafeArray;
varr,res:Variant;
begin
try
ScriptControl1.Language := 'JavaScript';
ScriptControl1.AddCode(Memo1.Text);
varr:=VarArrayCreate([0, 1], varVariant);
varr[0]:=1;
varr[1]:=5;
pPar:=PSafeArray(TVarData(varr).VArray);
res:=ScriptControl1.Run('sum',pPar);
ShowMessage(IntToStr(res));
finally
end;
end;
При помощь процедуры AddCode, мы добавляем код JavaScript на исполнение, который находится в TMemo, так вот следующий код JavaScript-функции, который я добавил в компонент TMemo (как и говорил, простая функция суммирования двух чисел):
function sum(b,c) {
a = b+c;
return a;
}
Ничего сложно тут нету, задаем язык скрипта, добавляем код на исполнение, создаем список параметров, ну и в самом конце, выполняем нашу функцию, указывая имя функции и список параметров. Для того, чтобы использовать тип PsafeArray, не забудьте подключить модуль в uses — ActiveX.
Ну и напоследок, давайте рассмотрим выполнение кода, без предварительного его добавления, для этого нам потребуется функция Eval.
procedure TForm1.Button2Click(Sender: TObject);
begin
ScriptControl1.Language:='JavaScript';
ShowMessage(ScriptControl1.Eval('1+5'));
end;
Как видите, ничего сложного нету.