Delphi不是解释性语言,在很多需要动态维护代码的时候很难处理,自己写一个解释器也不是现有的精力和能力可以完成的,好在Microsoft提供了一个ActiveX组件TScriptControl。这个组件可以完成简单的脚本操作,对VBScript和JavaScript都提供支持。在Delphi中将其加入即可像普通控件一样使用。
下面是一个VBScript的消息框示例:
以下内容为程序代码:
ScriptControl1.Language:='VBScript';
ScriptControl1.ExecuteStatement('MsgBox "Hello, World!"');
下面是一个JavaScript内嵌函数的示例:
以下内容为程序代码:
procedure
TForm1.Button3Click(Sender: TObject);
var
n:Integer;
Parameters:PSafeArray;
bound:TSAFEARRAYBOUND;
Index:integer;
v:Variant;
begin
//
try
n: = StrToInt(inputbox( ' demo ' , ' 请输入要计算阶乘的数 ' , ' ));
except
ShowMessage( ' 输入有误,必须输入数字,请重新运行 ' );
Exit;
end ;
ScriptControl1.Reset;
ScriptControl1.Language: = ' JScript ' ;
// 添加阶乘函数
scriptcontrol1.addCode( ' function factorial(num){ ' +
' result=1;for(ix=1;ix<=num;ix++){ ' +
' result = result*ix;};return result;}; ' );
// 参数为一维有一个元素的SafeArray
bound.lLbound: = 0 ;
bound.cElements: = 1 ;
try
Parameters : = SafeArrayCreate(VT_VARIANT, 1 , bound);
except
ShowMessage( ' 分配内存错误 ' );
Exit;
end ;
// 因为SafeArrayPutElement的第二个参数定义为const类型,
// 所以index必须定义为变量并赋值才能被调用
V: = n;
Index: = 0 ;
SafeArrayPutElement(Parameters,Index,V);
try
ShowMessage(ScriptControl1.Run( ' factorial ' ,Parameters));
finally
SafeArrayDestroy(Parameters);
end ;
end ;
var
n:Integer;
Parameters:PSafeArray;
bound:TSAFEARRAYBOUND;
Index:integer;
v:Variant;
begin
//
try
n: = StrToInt(inputbox( ' demo ' , ' 请输入要计算阶乘的数 ' , ' ));
except
ShowMessage( ' 输入有误,必须输入数字,请重新运行 ' );
Exit;
end ;
ScriptControl1.Reset;
ScriptControl1.Language: = ' JScript ' ;
// 添加阶乘函数
scriptcontrol1.addCode( ' function factorial(num){ ' +
' result=1;for(ix=1;ix<=num;ix++){ ' +
' result = result*ix;};return result;}; ' );
// 参数为一维有一个元素的SafeArray
bound.lLbound: = 0 ;
bound.cElements: = 1 ;
try
Parameters : = SafeArrayCreate(VT_VARIANT, 1 , bound);
except
ShowMessage( ' 分配内存错误 ' );
Exit;
end ;
// 因为SafeArrayPutElement的第二个参数定义为const类型,
// 所以index必须定义为变量并赋值才能被调用
V: = n;
Index: = 0 ;
SafeArrayPutElement(Parameters,Index,V);
try
ShowMessage(ScriptControl1.Run( ' factorial ' ,Parameters));
finally
SafeArrayDestroy(Parameters);
end ;
end ;
下面是一个运行过程中动态加载脚本的示例:
以下内容为程序代码:
(*
function myfunction(param){
/*
if (param == 9)
result = '999';
else
result = '???';
return result;
*/
switch(param){
case 0:
result = '000';
break;
case 9:
result = 'OK';
break;
default:
result = param;
} ;
return result;
};
* )
procedure TForm1.Button4Click(Sender: TObject);
var
szCode, szCodeTmp, szFunName: string ;
Parameters:PSafeArray;
bound:TSAFEARRAYBOUND;
Index:integer;
v:Variant;
n, nPos: integer;
szDefault: string ;
begin
szCode: = Memo1.Text;
szDefault: = ' function DefaultFun(){result = ' + '' Hello,Baby. '' + ' ;return result;}; ' ;
if szCode = ' then
begin
szCode: = szDefault;
end ;
ScriptControl1.Reset;
ScriptControl1.Language: = ' JScript ' ;
// 添加自定义函数
scriptcontrol1.addCode(szCode);
// 参数为一维有一个元素的SafeArray
bound.lLbound: = 0 ;
bound.cElements: = 1 ;
try
Parameters : = SafeArrayCreate(VT_VARIANT, 1 , bound);
except
ShowMessage( ' 分配内存错误 ' );
Exit;
end ;
V: = 9 ;
Index: = 0 ;
SafeArrayPutElement(Parameters,Index,V);
nPos: = pos( ' ( ' , szCode);
szFunName: = copy(szCode, 9 , nPos - 9 );
szFunName: = Trim(szFunName);
try
ShowMessage(ScriptControl1.Run(szFunName,Parameters));
finally
SafeArrayDestroy(Parameters);
end ;
end ;
function myfunction(param){
/*
if (param == 9)
result = '999';
else
result = '???';
return result;
*/
switch(param){
case 0:
result = '000';
break;
case 9:
result = 'OK';
break;
default:
result = param;
} ;
return result;
};
* )
procedure TForm1.Button4Click(Sender: TObject);
var
szCode, szCodeTmp, szFunName: string ;
Parameters:PSafeArray;
bound:TSAFEARRAYBOUND;
Index:integer;
v:Variant;
n, nPos: integer;
szDefault: string ;
begin
szCode: = Memo1.Text;
szDefault: = ' function DefaultFun(){result = ' + '' Hello,Baby. '' + ' ;return result;}; ' ;
if szCode = ' then
begin
szCode: = szDefault;
end ;
ScriptControl1.Reset;
ScriptControl1.Language: = ' JScript ' ;
// 添加自定义函数
scriptcontrol1.addCode(szCode);
// 参数为一维有一个元素的SafeArray
bound.lLbound: = 0 ;
bound.cElements: = 1 ;
try
Parameters : = SafeArrayCreate(VT_VARIANT, 1 , bound);
except
ShowMessage( ' 分配内存错误 ' );
Exit;
end ;
V: = 9 ;
Index: = 0 ;
SafeArrayPutElement(Parameters,Index,V);
nPos: = pos( ' ( ' , szCode);
szFunName: = copy(szCode, 9 , nPos - 9 );
szFunName: = Trim(szFunName);
try
ShowMessage(ScriptControl1.Run(szFunName,Parameters));
finally
SafeArrayDestroy(Parameters);
end ;
end ;