在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Delphi不是解释性语言,在很多需要动态维护代码的时候很难处理,自己写一个解释器也不是现有的精力和能力可以完成的,好在Microsoft提供了一个ActiveX组件TScriptControl。这个组件可以完成简单的脚本操作,对VBScript和JavaScript都提供支持。在Delphi中将其加入即可像普通控件一样使用。 下面是一个VBScript的消息框示例: ScriptControl1.Language:='VBScript'; 下面是一个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; 下面是一个运行过程中动态加载脚本的示例: 以下内容为程序代码:
(* 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;
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论