今天主要是看了这篇文章VB-Helper:坚守脚本,之所以看这篇文章,主要是在维护以前开发的系统中,我被各种原先丑陋的设计搞得心烦,但是在下一个版本Release之前,这个产品还要维护下去,而且如果我们从头来重做一个,短期内也是不现实的。
Microsoft Script 控件允许用户为任意 Script 引擎编写和运行 Script。Script 控件提供 VBScript 和 Jscript(TM) 两种 Script 引擎。此外,您可向 Script 控件添加任何 Automation 对象的对象模型。添加后,Script 引擎可使用 Automation 对象的公用方法和属性。把应用程序的对象模型与 Script 引擎相结合,可以创建 Script 应用程序,运行宏来控制该应用程序。
创建 Script 控件实例
Microsoft Script 控件可作为控件或独立的 Automation 对象创建。此特性允许任何宿主应用程序以任意 Script 语言使用 Script 控件。
以下示例可放置于任意窗体中。注意,没有声明变量 sc 为 ScriptControl 类型,因为没有也不必在工程中引用控件。只要 Script 控件存在并已注册,以下代码就能正常运行:
2 Dim sc
3 Dim strProgram As String
4 strProgram = "Sub Main" & vbCrLf & _
5 "MsgBox ""嗨,你好!""" & vbCrLf & _
6 "End Sub"
7 Set sc = CreateObject("ScriptControl")
8 sc.language = "VBScript"
9 sc.addcode strProgram
10 sc.run "Main"
11End Sub
如果您在工程引用中对 Script 控件进行了显式的引用。就可以使用下列的代码创建该 Script 控件的实例:
Dim sc As ScriptControl
显示用户界面元素
AllowUI 属性决定是否允许 Script 引擎显示用户界面元素。可应用于 Script 控件自身,如控制超时信息的显示,也可应用于使用 ActiveX(TM) 编写界面的 Script 引擎。例如,在试图显示“Hello World”消息框时,以下代码将产生错误:
2Dim strX As String
3strX = "Sub Hello" & vbCrLf & _
4"MsgBox ""Hello World""" & vbCrLf & _
5"End Sub"
6ScriptControl1.AddCode strX
7ScriptControl1.Run "Hello" ' 不允许使用 UI !
创建 Script 代码
Microsoft Script 控件允许您创建运行 Script 语言(如 VBScript 或 Jscript 语言)的应用程序。假设,例如在窗体中有一个按钮,并且当您按下该按钮时希望执行某段 VBScript 代码。该按钮的名称为 Run NameMe,并且您希望脚本代码执行一个名为 NameMe 的过程。方法是当用户单击“运行 NameMe”按钮时,VBScript Script 引擎执行NameMe 过程。
运行 NameMe”按钮用 Script 控件的 Run 方法运行 Script。下面的代码应该出现在 Run NameMe 按钮的 Click 事件中:
'该 Script 控件的名称是 ScriptControl1。
2 ScriptControl1.Run "NameMe"
3End Sub
要创建此 Script 所需的其余代码,请选择一种 Script 语言,添加代码,然后运行该过程。
1 选择 Script 语言
第一步是为 Script 控件设置正确的 Script 语言。Script 控件被创建为一个页面上的控件时,Language 属性自动地被初始化为"VBScript"。当 Script 控件被创建为一个 Automation 对象时, Language 属性则没有被初始化,并且必需有代码编写者来设定。要设置 Language 属性为 Jscript,请使用“Properties”窗口。也可在代码中使用 Language 属性,如下所示:
ScriptControl1.Language = "JScript"
Script 控件也可使用其他 Script 语言。
2 向过程添加代码
请先使用 AddCode 方法向 Script 控件添加完整的过程,然后运行 NameMe 过程。如您添加的过程不完全(没有 End Sub 或 End Function),将发生错误。以下是向 Script 控件添加过程代码示例:
2' 添加 NameMe 过程。
3Private Sub Form_Load()
4 Dim strCode As String
5 strCode = _
6 "Sub NameMe()" & vbCrLf & _
7 " Dim strName " & vbCrLf & _
8 " strName = InputBox(""姓名?"")" & vbCrLf & _
9 " MsgBox ""您的姓名是:"" & strName" & vbcrLf & _
10 "End Sub"
11 ScriptControl1.AddCode strCode
12End Sub
另外,您可从 TextBox 控件添加过程代码:
2 ' 此代码包含在 frmScript 窗体里名为 txtScript 的文本框中。
3 ScriptControl1.AddCode frmScript.txtScript.Text
4End Sub
您可向过程或函数添加参数。
2 ' 创建函数。
3 Dim strFunction As String
4 strFunction = _
5 "Function ReturnThis(x, y)" & vbCrLf & _
6 " ReturnThis = x * y" & vbCrLf & _
7 "End Function"
8 ' 添加代码,然后运行此函数。
9 ScriptControl1.AddCode strFunction
10 MsgBox ScriptControl1.Run("ReturnThis", 3, 25)
11End Sub
3 运行过程
Run 方法运行已添加到 Script 控件的任何完整过程。以下代码运行三个已定义的过程:
2ScriptControl1.Run "AddName"
3ScriptControl1.Run "Quit"
执行 Script 语句和计算结果
可以使用 ExecuteStatement 方法执行一个脚本语句。您可使用 Eval 方法计算 Script 代码行。
在下列代码中,ExecuteStatement 方法用于把 100 赋给变量 x。后面的两行代码使用 Eval 方法测试 x = 100 和 x = 100/2。第二行代码返回 True;第三行代码返回 False。
2 ScriptControl1.ExecuteStatement "x = 100"
3 MsgBox ScriptControl1.Eval("x = 100") ' 结果为 True
4 MsgBox ScriptControl1.Eval("x = 100/2") ' 结果为 False
5End Sub
使用 Error 属性
Script 控件错误有两个来源:Script 控件自身或 Control 正要运行的 Script。要调试 Script 代码,请使用 Error 属性,它返回 Error 对象的引用。Script 控件可用 Error 对象返回错误编号和描述信息,以及 Script 中出现错误的行号。
请运行以下代码显示一个示例。此示例中,Script 控件使用 Error 属性显示错误信息:
2 ' 以下 Script 代码产生被零除的错误。
3 Dim strCode As String
4 strCode = _
5 "Sub DivideByZero()" & vbCrLf & _
6 "Dim prime" & vbCrLf & _
7 "prime = 3" & vbCrLf & _
8 "MsgBox prime/0" & vbCrLf & _
9 "End Sub"
10 On Error GoTo scError
11 With ScriptControl1
12 .AddCode strCode
13 .Run "DivideByZero"
14 End With
15 Exit Sub
16scError:
17 ' 用 Error 对象通知用户所出现的错误以及该错误所在的行。
18 Debug.Print ScriptControl1.Error.Number & _
19
20":" & ScriptControl1.Error.Description & _
21 "行号:" & ScriptControl1.Error.Line
22 Exit Sub
23End Sub
ScriptControl的确是一个简单的解决办法,这种方式给程序提供了简单的脚本定制功能,因此可以将一些业务规则封装到单个模块中,通过动态加载的方式,轻松实现了业务逻辑的变化,因此我觉得还是不错,只是以前把这块给忽略了。
其实VB6的确已经被淘汰了,但是有些时候它偏偏就留下很多好的东西,而这些恰恰是我不知道的。