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

  • 相关阅读:
    spring-schedule
    数字电路
    面试题
    CMOS集成门电路
    TTL特殊门电路
    TTL反相器的外部特性
    TTL集成门电路工作原理和电压传输特性
    半导体器件的开关特性和分立元件门电路
    逻辑函数的公式化减法
    php 获取当前文件名称
  • 原文地址:https://www.cnblogs.com/Duiker/p/231049.html
Copyright © 2020-2023  润新知