我才知道的VB6宝贝

今天主要是看了这篇文章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 控件存在并已注册,以下代码就能正常运行:

 1Private Sub Command1_Click()
 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”消息框时,以下代码将产生错误:

1ScriptControl1.AllowUI = False
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。

1Private Sub RunNameMe_Click()
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 控件添加过程代码示例: 

 1' 当 ScriptRun app 加载时,以下代码向 Control
 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 控件添加过程代码:

1Private Sub Form_Load()
2 ' 此代码包含在 frmScript 窗体里名为 txtScript 的文本框中。
3 ScriptControl1.AddCode frmScript.txtScript.Text
4End Sub

您可向过程或函数添加参数。

 1Private Sub EvalFunc()
 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"325)
11End Sub

3 运行过程

Run 方法运行已添加到 Script 控件的任何完整过程。以下代码运行三个已定义的过程:

1ScriptControl1.Run "FindName"
2ScriptControl1.Run "AddName"
3ScriptControl1.Run "Quit"

执行 Script 语句和计算结果

可以使用 ExecuteStatement 方法执行一个脚本语句。您可使用 Eval 方法计算 Script 代码行。

在下列代码中,ExecuteStatement 方法用于把 100 赋给变量 x。后面的两行代码使用 Eval 方法测试 x = 100 和 x = 100/2。第二行代码返回 True;第三行代码返回 False。

 

1Private Sub TryThis()
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 属性显示错误信息:

 1Private Sub MyError()
 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的确已经被淘汰了,但是有些时候它偏偏就留下很多好的东西,而这些恰恰是我不知道的。

posted on 2005-09-06 12:34  Duiker  阅读(1427)  评论(1编辑  收藏  举报

导航