MSScriptControl.ScriptControl组件的用法实例
Microsoft(R)Script控件使用户可以创建运行任何ActiveX(R)scripting引擎,例如Microsoft(R)VisualBasic(R)ScriptingEdition或Microsoft(R)JScript(TM)的应用程序。用户可以将任何Automation对象的对象模型添加到Script控件中,这样该对象的方法和属性就可以为scripting引擎所使用。通过将某个应用程序的对象模型和某个scripting引擎加以综合,用户就可以创建一个结合了两方面优点的scripting应用程序。应用程序不但具有scripting语言的简单化特点,而且综合了一种更高级、具有完整特性的专业应用程序的对象、方法,以及属性。
创建Script控件的实例
MicrosoftScript控件可作为一个控件或者作为一个独立的Automation对象创建出来。该特性可以使得用任何语言书写的应用程序都可以用ScriptControl宿主任何兼容的scripting语言。
下面的示例可使用任意格式。请注意变量sc并未声明为类型ScriptControl,因为该控件不是,也不必要是工程中所引用的。只要Script控件出现并进行注册,下面的代码就可正常工作:
PrivateSubCommand1_Click() Dimsc DimstrProgramAsString strProgram="SubMain"&vbCrLf&_ "MsgBox""HelloWorld"""&vbCrLf&_ "EndSub" Setsc=CreateObject("ScriptControl") sc.language="VBScript" sc.addcodestrProgram sc.run"Main" EndSub
如果用户在自己的工程中的引用中对Script控件进行显式引用,那么用户就可以用下面的代码创建Script控件的一个
实例:
DimscAsScriptControl
显示用户接口元素AllowUI属性决定了scripting引擎是否可以显示用户接口元素。这可以应用于Script控件本身,例如显示超时消息。
这也可以应用于使用ActiveXscripting接口的scripting引擎。例如,下面的代码将在试图显示HelloWorld消息框时产生一个错误:
ScriptControl1.AllowUI=False DimstrXAsString strX="SubHello"&vbCrLf&_ "MsgBox""HelloWorld"""&vbCrLf&_ "EndSub" ScriptControl1.AddCodestrX ScriptControl1.Run"Hello"'没有允许的UI!
创建Scripting代码
MicrosoftScript控件使用户可以创建一个运行scripting语言,例如VBScript或JScript的应用程序。例如,假设用户在窗体上有一个按钮,用户希望在按下该按钮时运行某些VBScript代码。该按钮称为RunNameMe,而用户希望scripting代码运行一个叫NameMe的过程。意图是当用户单击RunNameMe按钮时,VBScriptscripting引擎执行NameMe过程。
这个RunNameMe按钮使用ScriptControl的Run方法来执行脚本。下面就是应当出现在RunNameMe按钮的Click事件中的代码:
'ScriptControl的名字是ScriptControl1。 PrivateSubRunNameMe_Click() ScriptControl1.Run"NameMe" EndSub
为了创建该脚本所需要代码的其余部分,请选择一种scripting语言,并将代码添加到某个过程中,然后运行该过程。
选择一种Scripting语言
第一步是为ScriptControl配置正确的scripting语言。当在某页上作为控件创建ScriptControl时,Language属性就被自动初始化为"VBScript"。当作为一个Automation对象来创建ScriptControl时,则Language属性留作未初
始化的状态,而必须由代码作者对其进行设置。
若要将Language属性设置为JScript,可使用Properties窗口。用户也可以在代码中使用Language属性,如下所
示:
ScriptControl1.Language="JScript"
其他scripting语言,例如PERL和REXX,都不是由Microsoft所提供的,也可以为Script控件所用。
将代码添加到某个过程中
在用户运行NameMe过程之前,可使用AddCode方法将完整的过程添加到Script控件中。如果用户试图将一个不完整的过程(一个没有EndSub或者EndFunction的过程)添加进去,则将会出错。下面的代码将过程代码添加到Script
Control中:
'当ScriptRun应用程序加载时,添加下面的代码 '将NameMe过程添加到Control中。 PrivateSubForm_Load() DimstrCodeAsString strCode="SubNameMe()"&vbCrLf&_ "DimstrNameAsString"&vbCrLf&_ "strName=InputBox(""Name?"")"&vbCrLf&_ "MsgBox""Yournameis""&strName"&vbcrLf&_ "EndSub" ScriptControl1.AddCodestrCode EndSub
另外,用户也可以从某个TextBox控件添加过程代码:
PrivateSubForm_Load() '该代码包含在名为frmScript的窗体上 '名为txtScript的Textbox中。 ScriptControl1.AddCodefrmScript.txtScript.Text EndSub
用户可以将参数添加到某个过程或者函数中。
PrivateSubEvalFunc() '创建函数。 DimstrFunctionAsString strFunction=_ "FunctionReturnThis(x,y)"&vbCrLf&_ "ReturnThis=x*y"&vbCrLf&_ "EndFunction" '添加代码,然后运行该函数。 ScriptControl1.AddCodestrFunction MsgBoxScriptControl1.Run("ReturnThis",3,25) EndSub
运行过程
Run方法运行任何已被添加到Script控件中的完整过程。下面的代码段运行三个已定义过程:
ScriptControl1.Run"FindName" ScriptControl1.Run"AddName" ScriptControl1.Run"Quit"
执行Scripting语句,并计算结果,用户可以用ExecuteStatement方法执行一条scripting语句。用户可以用eval方法计算某个表达式值。在下面的示例
中,用ExecuteStatement方法将值100赋给变量x。下面的两行用eval方法来测试语句x=100和x=100/2。第二行返回True;而第三行则返回False。
PrivateSubTryThis() ScriptControl1.ExecuteStatement"x=100" MsgBoxScriptControl1.Eval("x=100")'返回True MsgBoxScriptControl1.Eval("x=100/2")'返回False EndSub
使用Error属性
Script控件错误有两个可能来源:Script控件自身,或者该控件试图运行的script。为了对scripting代码进行调试,可使用Error属性,该属性返回对Error对象的引用。利用Error对象,Script控件可以返回错误数目和对它的
描述,以及错误在script中出现的行号。
运行下面的代码,查看Script控件发现错误的一个示例:
PrivateSubMyError() '下面的代码被零除导致 '一个错误。 DimstrCodeAsString strCode=_ "SubDivideByZero()"&vbCrLf&_ "Dimprime"&vbCrLf&_ "prime=3"&vbCrLf&_ "MsgBoxprime/0"&vbCrLf&_ "EndSub" OnErrorGoToscError WithScriptControl1 .AddCodestrCode .Run"DivideByZero" EndWith ExitSub scError: '使用Error对象向用户通告 '错误,以及出错行。 Debug.PrintScriptControl1.Error.Number&_ ":"&ScriptControl1.Error.Description&_ "inline"&ScriptControl1.Error.Line ExitSub EndSub