数组

一组可顺序索引并具有相同固有数据类型的元素。数组中的每个元素具有唯一的标识索引号。更改数组中的一个元素不影响其他元素。


Automation 对象

通过 Automation 接口，显露于其他应用程序或编程工具的对象。


类

对象的正式定义。类是运行时创建对象实例的模板。类定义了对象属性及用于控制对象行为的方法。


集合

包含一组相关对象的对象。只要集合发生变化，对象在集合中的位置就可能发生变化。因此，集合内任何特定对象的位置并不固定。


表达式

关键字、运算符、变量和常数（字符串常数、数字常数或对象常数）的组合。表达式可用于执行运算、处理字符或测试数据。


标识符

引用常数或变量的表达式元素。


成员

集合、对象或用户定义类型的元素。


模块

一组声明和过程。


数值表达式

可作为数字进行计算的任意表达式。表达式的元素可为下列内容的任意组合：关键字、变量、常数以及运算结果为数字的运算符。


对象

可作为单元的代码和数据的组合。例如，控件、窗体或应用程序部件。每个对象由类定义。


过程

具有一定名称，作为一个单元执行的语句序列。例如，Function 和 Sub 都是过程。


属性

具有一定名称的对象特性。属性定义了对象特征（如，大小、颜色及在屏幕上的位置）或对象状态（例如启用或禁用）。


运行时错误

代码运行时发生的错误。语句进行无效操作时会发生运行时错误。


作用域

定义变量、过程或对象的可见性。例如，声明为 Public 的变量对于所有模块中的全部过程都可见。在过程中声明的变量仅在该过程内可见，在某一次调用结束后，下一次调用之前，将失去变量值。


字符串表达式

计算结果为连续字符序列的任意表达式。字符串表达式的元素可包含返回下列内容的函数：字符串、字符串文字、字符串常数或字符串变量。


无法执行; Script 正在运行
无法执行；Script 正在运行

在 Script 运行时，试图访问一个或多个 ScriptControl 对象成员。Script 运行期间大部分属性都是只读的，并且也不能访问影响 ScriptControl 对象成员的方法，如包含 AddCode 和 AddObject 的方法。


无法设置 UseSafeSubset 属性

无法设置 UseSafeSubset 属性。ScriptControl 对象的宿主应用程序强行将其置于安全模式，或者是 Script 引擎不支持此安全特性。另一种可能是，Script 引擎确实支持安全特性，但并非任何时候都可以更改 UseSafeSubset 属性。请先设置 UseSafeSubset 属性，然后调用方法或设置 Language 属性。


执行 Script 超时

Script 的执行时间超过 Timeout 属性指定的时间，Script 中止运行。


未设置 Language 属性

试图使用某方法或属性，但只有将 ScriptControl 对象的 Language 属性设为有效语言，才允许使用此方法或属性。


选定的 Script 引擎不支持此成员

试图访问某方法或属性，但 Language 属性指定的 Script 引擎不支持此方法或属性。


对象已经无效

试图访问某对象，但由于已重置 ScriptControl，此对象不再有效。


Error 对象 (Script Control)
Error 对象

包含有关编译或运行时错误的信息。

说明

ScriptControl Error 对象提供的属性比标准 Microsoft(R) Visual Basic(R) Err 对象属性多。增加的属性允许您在出现可检测到的错误时向用户提供反馈信息。

Visual Basic Err 对象和 ScriptControl Error 对象的另一重要区别是 Error 对象不是全局的，也就是说，一个 Error 对象不能处理所有 ScriptControl 错误。每个 ScriptControl 都有自己的 Error 对象。在 Visual Basic 中仅有一个 Err 对象。

每次更改 ScriptControl Language 属性或调用 Reset、AddCode、Eval 或 ExecuteStatement 方法时，ScriptControl Error 对象属性重新设置为零或零长度字符串 ("")。使用 Clear 方法显式地重新设置 Error 对象属性。

当调用 ScriptControl 出现错误时，Visual Basic Err 对象的属性值设置为与 ScriptControl Error 对象的属性值相同。当在 ScriptControl 代码中发生运行时错误时，只有 ScriptControl Error 对象属性包含改正信息。


Module 对象 (Script Control)
module 对象

Module 对象是 ScriptControl 的成员，其中定义了所有的过程、类型和数据声明。

说明

所使用的 Script 引擎确定模块包含的内容。

使用 AddCode 方法向 Module 对象添加 Script 代码，包括由所使用的 Script 引擎定义的过程。

ScriptControl 自动与 Global 模块一起提供。向 ScriptControl 本身添加的 Script 代码总是进入 Global 模块。在 Global 模块中的 Script 代码对 ScriptControl 中所有其他模块都可用。

其他模块可以使用 Add 方法添加到 Modules 集合中。在除 Global 模块外的其他模块中添加的 Script 代码都只在本模块内有效。


Modules 集合 (Script Control)
Modules 集合

Modules 集合包含 ScriptControl 对象中的所有模块，包括 Global 模块。

说明

Modules 集合提供将 ScriptControl 中所有模块作为单个对象引用的简便方法。

使用 Add 方法可添加单个模块。使用 Item 方法可从 Modules 集合中返回特定模块，可使用 For Each...Next 语句枚举整个集合的模块。

在 Modules 集合中使用 GlobalModule 作为索引总是可找到 Global 模块。其他的模块可以通过模块名或号码被索引。


Procedure 对象 (Script Control)
Procedure 对象

Procedure 对象是由所使用的 Script 引擎定义的代码逻辑单元。

说明

Procedure 对象在模块中提供指向过程的入口。

使用 AddCode 方法向指定模块的 Procedures 集合添加单个 Procedure 对象。


Procedures 集合 (Script Control)
Procedures 集合

Procedures 集合包含在特定 Module 对象中定义的所有过程。

说明

Procedures 集合提供将 Module 对象中的所有过程作为单个对象引用的简便方法。

使用 AddCode 方法在指定模块中添加单个过程。添加到 ScriptControl 中的单个过程包含在 Global 模块的 Procedures 集合中。

使用 Item 方法从 Procedures 集合中返回特定过程，可用 For Each...Next 语句枚举整个集合的过程。

过程可以通过过程名或号码被索引。


ScriptControl 对象

使 Script 在应用程序中可用。

说明

ScriptControl 对支持 ActiveX(TM) Script 的宿主 Script 引擎提供简单接口。ScriptControl 对象支持项目如下：

•	任何支持 ActiveX Script 的 Script 语言。

•	列出可用宏的“运行宏”对话框。

•	编译 Script 并显示有关可能发生的错误的详细信息的能力。

•	在执行 Script 时，捕获并显示运行时错误的能力。

•	向 Script 显露对象模块功能的能力。

•	向 Script 显露全局函数的能力。

•	“立即”窗口。

•	按照 Script 的功能和时间限制，限制 Script 执行的能力。


AllowUI 属性 (Script Control)
AllowUI 属性

设置或返回 Boolean 值，指明是否允许正在运行的 Script 或者 ScriptControl 本身显示用户界面元素。可读写。

语法

object.AllowUI [= value]

AllowUI 属性的语法有以下部分：

部分	描述
object	必选。可以是“应用于”列表中列出的任何对象或对此对象的引用。
value	可选。Boolean 值，允许显示用户界面元素时为True，否则为 False。
说明

AllowUI 属性应用于 ScriptControl 本身或 Scirpt 引擎显示的用户界面元素。

例如，在 VBScript 中，如果 AllowUI 为 False，则 MsgBox 语句不起作用。请注意如果 AllowUI 为 False，则无法提醒用户发生了 TimeOut 事件。


CodeObject 属性 (Script Control)
CodeObject 属性

返回对象，该对象用于调用指定模块的公用成员。只读。

语法

object.CodeObject

object 是特定模块的名称或对此模块的引用。

说明

模块中公用成员的名称由在应用程序中使用 ScriptControl 的程序员提供。


Column 属性 (Script Control)
Column 属性

返回列位置，指明在 Script 代码中发生错误的大概位置。只读。

语法

Error.Column

说明

Column 属性和 Line 属性用于判断导致错误的 Scirpt 代码的大概位置。如果没有可用的列信息，则 Column 属性设置为零。

注意   不是所有的 Error 对象属性在任何时候都有效。当某个属性不适用于某个特定错误时，其值将为 0 或零长度字符串 ("")。


Count 属性 (Script Control)
Count 属性

返回集合中项的数目。只读。

语法

object.Count

object 可以是“应用于”列表中列出的任何集合或对此集合的引用。


Description 属性 (Script Control)
Description 属性

返回与错误相关的简短描述性字符串。只读。

语法

Error.Description

说明

使用 Description 属性提醒用户您不能或不想处理的错误。Description 属性提供内置系统错误信息。

注意   不是所有的 Error 对象属性在任何时候都有效。当某个属性不适用于某个特定错误时，其值将为 0 或零长度字符串 ("")。


Error 属性 (Script Control)
Error 属性

返回 Error 对象，其中包含所发生的最后一个错误的相关详细信息。只读。

语法

ScriptControl.Error

说明

返回的 Error 对象用于编译和运行时错误。

注意   不是所有的 Error 对象属性在任何时候都有效。当某个属性不适用于某个特定错误时，其值将为 0 或零长度字符串 ("")。


HasReturnValue 属性 (Script Control)
HasReturnValue 属性

如果过程有返回值则返回 True，否则返回 False。只读。

语法

object.HasReturnValue

object 是特定过程的名称或对此过程的引用。


HelpContext 属性 (Script Control)
HelpContext 属性

返回 Microsoft Windows Help 文件中某主题的上下文 ID 号。只读。

语法

Error.HelpContext

说明

HelpContext 属性用于自动显示由 HelpFile 属性指定的帮助主题。

注意   应该在应用程序中编写处理典型错误的例程。在使用对象进行程序设计时，可使用对象的帮助文件提高处理错误的能力，或在不能修复错误时为用户显示有用信息。

注意   不是所有的 Error 对象属性在任何时候都有效。当属性不适用于某个特定错误时，其值将为 0 或零长度字符串 ("")。


HelpFile 属性 (Script Control)
HelpFile 属性

返回字符串表达式，该表达式是 Microsoft Windows Help 文件的完整有效路径。只读。

语法

Error.HelpFile

说明

如果在 HelpFile 属性中指定了帮助文件，则当用户单击错误消息框中的帮助按钮（或按 F1 键）时自动调用该文件。如果 HelpContext 属性包含指定文件的有效上下文 ID，则自动显示该主题。如果没有指定帮助文件，则显示 Visual Basic 的帮助文件。

注意   应该在应用程序中编写处理典型错误的例程。在使用对象进行程序设计时，可以使用对象的帮助文件提高处理错误的能力，或在不能修复错误时为用户显示有用信息。

注意   不是所有的 Error 对象属性在任何时候都有效。当某个属性不适用于某个特定错误时，其值将为 0 或零长度字符串 ("")。


Language 属性 (Script Control)
Language 属性

设置或返回正在使用的 Script 语言名称。可读写。

语法

ScriptControl.Language [= language]

设置 Language 属性时，language 可以是 VBScript、JScript(TM) 或其他任何适当的 Script 语言。

说明

如果您在运行代码中重新设置 Language 属性，所有模块中的所有现存代码都将被删除，有效率地重新开始使用 Script 控件。


Line 属性 (Script Control)
Line 属性

返回行位置，指明 Script 代码中发生错误的大概位置。只读。

语法

Error.Line

说明

Line 属性和 Column 属性用于判断导致错误的 Scirpt 代码的大概位置。如果没有可用的行信息，则 Line 属性设置为零。

注意   不是所有的 Error 对象属性在任何时候都有效。当属性不适用于某个特定错误时，其值将为 0 或零长度字符串 ("")。


Modules 属性 (Script Control)
Modules 属性

为 ScriptControl 对象返回模块集合。只读。

语法

ScriptControl.Modules

说明

至少有一个模块。如果未显式声明模块，则存在一个隐式的  Global 模块，用于所有已添加的 Script 代码。可用 GlobalModule 常数作为 Modules 集合的索引访问 Global 模块。


Name 属性 (Script Control)
Name 属性

返回模块、过程或对象的名称。只读。

语法

object.Name

object 是“应用于”列表中列出的任何对象或对此对象的引用。

说明

在使用 Add 或 AddObject 方法将 object 添加到 ScriptControl 时，建立 object 的名称。


NumArgs 属性 (Script Control)
NumArgs 属性

返回过程所需要的参数数目。只读。

语法

object.NumArgs

object 是 Procedure 对象或对此对象的引用。


Number 属性 (Script Control)
Number 属性

返回指明运行时错误的数值。Number 是 Error 对象的默认属性。只读。

语法

Error.Number

说明

错误编号仅应用于运行时错误。


Procedures 属性 (Script Control)
Procedures 属性

返回在指定模块中定义的过程集合。只读。

语法

object.Procedures

object 是 Module 对象或对此对象的引用。


SitehWnd 属性 (Script Control)
SitehWnd 属性

设置或返回窗口的 hWnd，通过执行 Script 代码，此窗口用于显示对话框和其他用户界面元素。可读写。

语法

ScriptControl.SitehWnd [= value]

value 参数可以是 0 或有效 hWnd 的编号。

说明

如果 ScriptControl 作为控件（而不是 Automation 对象）使用，则 SitehWnd 属性的默认值是控件包容器的 hWnd。如果 ScriptControl 作为 Automation 对象创建，则默认 SitehWnd 为 0，表示桌面窗口。无论在哪种情况下，用户都可以在任何时候将该值修改为有效的 hWnd 值。


Source 属性 (Script Control)
Source 属性

返回字符串表达式，指明所发生错误的类型。只读。

语法

Error.Source

说明

对于 Microsoft Internet Explorer，字符串表达式由 Source 属性返回，指明错误的类型可为：

•	Microsoft JScript 编译错误。

•	Microsoft JScript 运行时错误。

•	Microsoft VBScript 编译错误。

•	Microsoft VBScript 运行时错误。


State 属性 (Script Control)
State 属性

设置或返回 ScriptControl 对象的模式。可读写。

语法

ScriptControl.State [= state]

参数 state 可以是以下常数：

常数	值	描述
Initialized	0	Script 引擎执行代码而不吸收事件。该事件是由使用 AddObject 方法添加的对象生成的。
Connected	1	Script 引擎吸收事件。该事件是由使用 AddObject 方法添加的对象生成的。


Text 属性 (Script Control)
Text 属性

返回字符串，其中包含语法错误前后的 Script 代码段。只读。

语法

Error.Text

说明

Text 属性返回的 Script 代码字符串用作所发生错误的上下文。


Timeout 属性 (Script Control)
Timeout 属性

设置或返回时间（毫秒），此时间后用户可选择中止 Script 代码的执行或允许代码继续执行。可读写。

语法

ScriptControl.Timeout [= value]

如果使用 NoTimeout 常数 (-1) 指定 value，则不使用超时设置。当 value 为 0 时，一旦确定正在运行的 Script 终止 Windows 消息进程超过了大约 1/10th 秒，就会发生 Timeout 事件。value 大于 0 时，表示必须在经过 value 毫秒数后才能发生 Timeout 事件。

说明

发生超时时，ScriptControl 检查所有当前运行 ScriptControl 对象的 AllowUI 属性，确定是否允许显示用户界面元素。

如果所有当前运行控件的 AllowUI 属性均为 True，则在发生超时时，通过对话框提醒用户。选择 End 将使 ScriptControl 停止执行所有的 Script 引擎，直到从调用层次中删除所有引擎。选择 Continue 将在另一个超时期间（所有当前运行的 Script 引擎的 Timeout 属性最小值）继续执行 Script 代码。在每个超时期间结束时将显示对话框，再次要求用户操作。

如果 AllowUI 属性为 False，则在发生超时，Script 将中止执行，而不通知用户所发生的一切。


UseSafeSubset 属性 (Script Control)
UseSafeSubset 属性

设置或返回 Boolean 值，指明宿主应用程序是否有保密性要求。如果宿主应用程序需要安全控制，则 UseSafeSubset 为 True，否则为 False。可读写。

语法

ScriptControl.UseSafeSubset [=value]

如果 value 为 True，则不允许访问某些对象和过程。

说明

当前使用的 Script 引擎决定是否设置 UseSafeSubset 属性，以及何时进行设置。如果没有指定语言（Language 属性），则可在任意时间设置 UseSafeSubset 属性。

Script 引擎宿主可能将对 Script 引擎提出安全性要求。例如，Microsoft Internet Explorer 仅允许 Script 引擎创建和使用已标记为 safe for scripting 的外部对象。另一些宿主可能毫无安全性要求。UseSafeSubset 属性告知 ScriptControl 其宿主 Script 引擎所要求的安全级别。如果 UseSafeSubset 为 True，则 Script 引擎仅允许创建或使用已标记为 safe for scripting 的对象。有关如何设置对象为 safe for scripting 的详细信息，请在 http://www.micrososft.com 查找 "IObjectSafety" 或 "safe for scripting"。

如果 ScriptControl 包含在要求安全控制的宿主中，则 UseSafeSubset 属性被强制设置为 True，并变为只读属性。


AllowUI 属性示例

下面举例说明如何使用 AllowUI 属性：

Private Sub Command1_Click()

   Dim sc, p1

   p1 = "Sub Main" & vbNewLine & _

        "   MsgBox ""启用用户界面。""" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = False

   sc.Language = "VBScript"

   sc.AddCode p1

   On Error Resume Next

   sc.Run "Main"

   If sc.error.Number = 70 Then

      MsgBox "禁用用户界面。单击“确定”以启用用户界面，然后继续。"

      sc.AllowUI = True

      sc.Run "Main"

   End If

End Sub


CodeObject 属性示例

下面举例说明如何使用 CodeObject 属性：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m, o

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   sc.AllowUI = True

   Set m = sc.Modules.Add("Module1") ' 新建模块。

   ' 在 Module1 中添加三个过程。

   m.AddCode "Sub Sub1 : MsgBox ""Sub1"": End Sub"

   m.AddCode "Sub Sub2 : MsgBox ""Sub2"": End Sub"

   m.AddCode "Sub Sub3 : MsgBox ""Sub3"": End Sub"

   ' 设置 CodeObject 引用。

   Set o = m.CodeObject

   ' 运行 Module1 的公用成员。

   o.Sub2

End Sub


Column 属性示例

下面举例说明如何使用 Column 属性：

Private Sub Command1_Click()

   Dim sc, p1, Msg

   ' 创建一个会导致错误的 Script。

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 添加 Script 到 ScriptControl。

   sc.AddCode p1

   ' 设置错误处理。

   On Error Resume Next

   ' 运行 Script 代码。

   sc.Run "Main"

   ' 处理错误。

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & "第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & " 行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

     ' 显示错误信息。

      MsgBox Msg

   End If

End Sub


Count 属性示例

下面举例说明如何使用 Count 属性：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 初始化伪随机数发生器。

   Randomize

   ' 在 Global 模块中添加过程。

   For i = 1 To Int((10 * Rnd + 1))

      Code = "Sub Sub" & i & ": MsgBox Sub" & i

      Code = Code & ": End Sub"

      sc.AddCode Code

   Next

   ' 添加一些模块。

   For i = 1 To Int((10 * Rnd + 1))

      ' 添加一个模块。

      Set m = sc.Modules.Add("Module" & CStr(i))

      ' 添加一些过程。

      For j = 1 To Int((10 * Rnd) + 1)

         ' 创建过程的模板。

         Code = "Sub Sub" & j & ": MsgBox Sub" & j

         Code = Code & ": End Sub"

         ' 向模块添加一个过程。

         m.AddCode Code

      Next

    Next

    ' 创建模块与过程的报告。

    Report = "您的 ScriptControl 代码包含 "

    Report = Report & sc.Modules.Count & " 个模块。"

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' 显示信息。

    MsgBox Report

End Sub


Description 属性示例

下面举例说明如何使用 Description 属性。

Private Sub Command1_Click()

   Dim sc, p1, Msg

   ' 创建一个会导致错误的 Script。

   p1 = "Sub Main" & vbNewLine & _

        " ' " & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 添加 Script 到 ScriptControl。

   sc.AddCode p1

   ' 设置错误处理。

   On Error Resume Next

   ' 运行 Script 代码。

   sc.Run "Main"

   ' 处理错误。

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & "第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & "行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      ' 显示错误信息。

      MsgBox Msg

   End If

End Sub


HasReturnValue 属性示例

下面举例说明如何使用 HasReturnValue 属性。

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m, Code, ProcName

   ' 初始化伪随机代码发生器。

   Randomize

   ' 设置 ScriptControl 的引用。

   Set sc = CreateObject("ScriptControl")

   ' 初始化 ScriptControl 语言。

   sc.Language = "VBScript"

   ' 在 Global 模块中添加一些过程。

   Code = "Sub Proc1(a): MsgBox ""Proc1 "" & a "

   Code = Code & ": End Sub"

   sc.AddCode Code

   Code = "Sub Proc2(a,b): MsgBox ""Proc2 "" & (a + b)"

   Code = Code & " : End Sub"

   sc.AddCode Code

   Code = "Function Proc3(a,b): Proc3= a * b"

   Code = Code & ":  End Function"

   sc.AddCode Code

   ' 生成一个从 1 到 3 之间的数字以供本示例选用随机过程名。

   ProcName = "Proc" & Int(3 * Rnd + 1)

   ' 设置 Global 模块的引用。

   Set m = sc.Modules("Global")

   ' 检查 ProcName 是否有返回值。

   If m.Procedures(ProcName).HasReturnValue Then

      ' 有返回值时执行代码。

      m.ExecuteStatement ("x = " & ProcName & "(2, 3)")

      MsgBox ProcName & " 返回 " & m.Eval("x") & "."

   Else

      MsgBox ProcName & " 没有返回值。"

   End If

End Sub


Language 属性示例

下面举例说明如何使用 Language 属性：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, p1, Msg

   ' 创建一个会导致错误的 Script。

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 添加 Script 到 ScriptControl 。

   sc.AddCode p1

   ' 设置错误处理。

   On Error Resume Next

   ' 运行 Script 代码。

   sc.Run "Main"

   ' 处理错误。

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & " 第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & "行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      ' 显示错误信息。

      MsgBox Msg

   End If

End Sub


Line 属性示例

下面举例说明如何使用 Line 属性：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, p1, Msg

   ' 创建一个会导致错误的 Script。

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 添加 Script 到 ScriptControl。

   sc.AddCode p1

   ' 设置错误处理。

   On Error Resume Next

   ' 运行 Script 代码。

   sc.Run "Main"

   ' 处理错误。

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & " 第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & "行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      ' 显示错误信息。

      MsgBox Msg

   End If

End Sub


Modules 属性示例

下面举例说明如何使用 Modules 属性：

Private Sub Command1_Click()

' 创建变量

   Dim sc, m, mc, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 获得 ScriptControl Modules 集合。

   Set mc = sc.Modules

   ' 初始化伪随机数发生器

   Randomize

   ' 在 Global 模块中添加一些过程。

   For i = 1 To Int((10 * Rnd + 1))

   ' 创建过程的模板。

   Code = "Sub Sub" & i & ": MsgBox Sub"

   Code = Code & i & ": End Sub"

      sc.AddCode Code

   Next

   ' 添加一些模块。

   For i = 1 To Int((10 * Rnd + 1))

      ' 添加一个模块。

      Set m = mc.Add("Module" & CStr(i))

      ' 添加一些过程。

      For j = 1 To Int((10 * Rnd) + 1)

         ' 创建过程的一个模板。

         Code = "Sub Sub" & j & ": MsgBox Sub"

         Code = Code & j & ": End Sub"

         ' 向模块添加一个过程。

         m.AddCode Code

      Next

    Next

    Report = "您的 ScriptControl 代码包含 "

    Report = Report & sc.Modules.Count & " 个模块。 "

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' 显示报告。

    MsgBox Report

End Sub


Name 属性示例

下面举例说明如何使用 Name 属性：

Private Sub Command1_Click()

' 创建变量

   Dim sc, m, mc, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 获得 ScriptControl Modules 集合。

   Set mc = sc.Modules

   ' 初始化伪随机数发生器

   Randomize

   ' 在 Global 模块中添加一些过程。

   For i = 1 To Int((10 * Rnd + 1))

   ' 创建过程的模板。

   Code = "Sub Sub" & i & ": MsgBox Sub"

   Code = Code & i & ": End Sub"

      sc.AddCode code

   Next

   ' 添加一些模块。

   For i = 1 To Int((10 * Rnd + 1))

      ' 添加一个模块。

      Set m = mc.Add("Module" & CStr(i))

      ' 添加一些过程。

      For j = 1 To Int((10 * Rnd) + 1)

         ' 创建过程的模板。

         Code = "Sub Sub" & j & ": MsgBox Sub"

         Code = Code & j & ": End Sub"

         ' 向模块添加一个过程。

         m.AddCode code

      Next

    Next

    Report = "您的 ScriptControl 代码包含 "

    Report = Report & sc.Modules.Count & " 个模块。 "

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' 显示报告。

    MsgBox Report

End Sub


NumArgs 属性示例

下面举例说明如何使用 NumArgs 属性：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m, Code, ProcName, ArgCount, Msg

   Randomize

   ' 设置 ScriptControl 的引用。

   Set sc = CreateObject("ScriptControl")

   ' 初始化 ScriptControl 语言。

   sc.Language = "VBScript"

   ' 在 Global 模块中添加一些过程。

   Code = "Sub Proc1(a): MsgBox ""Proc1 "" & a "

   Code = Code & ": End Sub"

   sc.AddCode code

   Code = "Sub Proc2(a,b): MsgBox ""Proc2 "" & (a + b)"

   Code = Code & " : End Sub"

   sc.AddCode code

   Code = "Function Proc3(a,b): Proc3= a * b"

   Code = Code & ":  End Function"

   sc.AddCode code

   ' 生成一个从 1 到 3 之间的数字以供本示例选用随机过程名。

   ProcName = "Proc" & Int(3 * Rnd + 1)

   ' 设置 Global 模块的引用。

   Set m = sc.Modules("Global")

   ' 检查参数数目

   ArgCount = m.Procedures(ProcName).NumArgs

   Msg = ProcName & " 要求提供 " & ArgCount

   Msg = Msg & " 个参数。"

   MsgBox Msg

End Sub


Number 属性示例

下面举例说明如何使用 Number 属性：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, p1, Msg

   ' 创建一个会导致错误的 Script。

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 在 ScriptControl 中添加 Script。

   sc.AddCode p1

   ' 设置错误处理。

   On Error Resume Next

   ' 运行 Script 代码。

   sc.Run "Main"

   ' 处理错误。

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & " 第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & "行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      ' 显示错误信息。

      MsgBox Msg

   End If

End Sub


Procedures 属性示例

下面举例说明如何使用 Procedures 属性：

Dim sc

Sub Main()

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = True

End Sub

Private Sub Command1_Click()

   ' 创建变量。

   Dim m, i, j, pc, code, report

   If Not IsObject(sc) Then Main

   ' 获得 ScriptControl Modules 集合。

   Set mc = sc.Modules

   ' 在 Global 模块中添加一些过程。

   Randomize ' 初始化伪随机数发生器

   For i = 1 To Int((10 * Rnd + 1))

      code = "Sub Sub" & i & ": MsgBox Sub" & i & ": End Sub"

      sc.AddCode code

   Next

   ' 添加一些模块。

   For i = 1 To Int((10 * Rnd + 1))

      ' 添加一个模块。

      Set m = mc.Add("Module" & CStr(i))

      ' 添加一些过程。

      For j = 1 To Int((10 * Rnd) + 1)

         ' 创建添加过程的一个模板。

         code = "Sub Sub" & j & ": MsgBox Sub" & j & ": End Sub"

         ' 向模块添加一个过程。

         m.AddCode code

      Next

    Next

    For Each m In sc.Modules

       ' 设置 Procedures 集合的引用。

       Set pc = m.Procedures

       ' 添加此模块的过程记数。

       ProcCount = ProcCount + pc.Count

    Next

    ' 归纳结果。

    report = "您的 ScriptControl 代码包含 "

    report = report & sc.Modules.Count & " 个模块和 " & ProcCount & " 个过程。"

    ' 显示报告

    MsgBox report

    ' 重置 ScriptControl

    sc.Reset

End Sub


SitehWnd 属性示例

下面举例说明如何使用 SitehWnd 属性：

Private Sub Command1_Click()

  Dim sc

  Set sc = CreateObject("ScriptControl")

  sc.Language = "VBScript"

  ' 获得窗体的 hWnd。

  sc.SitehWnd = Form1.hWnd

  sc.AddCode "MsgBox ""嗨，你好"""

End Sub


Source 属性示例

下面举例说明如何使用 Source 属性：

Private Sub Command1_Click()

   Dim sc, p1

   p1 = "Sub Main" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   sc.AddCode p1

   On Error Resume Next

   sc.Run "Main"

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & " 第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & "行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      Msg = Msg & "。这是 "

      Msg = Msg & sc.Error.Source

      Msg = Msg & " 错误 "

      MsgBox Msg

      sc.Error.Clear

   End If

End Sub


State 属性示例

下面举例说明如何使用 State 属性：

'  为 ScriptControl 创建模块级变量。

Dim sc

Sub Main()

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = True

End Sub

Function ToggleState()

  ' 如果未初始化 ScriptControl，则进行初始化。

  If Not IsObject(sc) Then Main

  sc.State = sc.State Xor 1

End Sub


Text 属性示例

下面举例说明如何使用 Text 属性：

Private Sub Command1_Click()

  Dim sc

  Set sc = CreateObject("ScriptControl")

  sc.Language = "VBScript"

  On Error Resume Next

  sc.AddCode "Sub Sub1: MsgBox ""Sub1"": End Sub"

  ' 添加导致语法分析错误的不完整代码。

  sc.AddCode "Sub Sub2"

  ' 报告语法分析错误的上下文。

  MsgBox sc.Error.Text

End Sub


Timeout 属性示例

下面举例说明如何使用 Timeout 属性：

Private Sub Command1_Click()

   Dim sc, p1, Msg

   p1 = "Sub Main" & vbNewLine & _

        "    For i = 1 to 100000" & vbNewLine & _

        "        x = x + i" & vbNewLine & _

        "    Next" & vbNewLine & _

        "    Msgbox ""完成"" " & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 设置限时 1 秒。

   sc.Timeout = 1000

   sc.AddCode p1

   ' 设置错误处理。

   On Error Resume Next

   sc.Run "Main"

   ' 处理错误。

   If sc.Error.Number <> 0 Then

      Msg = "Script 错误！" & vbNewLine

      Msg = Msg & " 在您的 Script 代码中，"

      Msg = Msg & " 第 "

      Msg = Msg & sc.Error.Line

      Msg = Msg & "行，第 " & sc.Error.Column

      Msg = Msg & "列出现错误 " & sc.Error.Number

      Msg = Msg & " (" & sc.Error.Description & ")"

      MsgBox Msg

    End If

End Sub


UseSafeSubset 属性示例

下面举例说明如何使用 UseSafeSubset 属性：

' 为 ScriptControl 创建模块级变量。

Dim sc

Sub Main()

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

sc.AllowUI = True

    sc.addcode("function create() { fs = CreateObject('scripting.filesystemobject'); } ")

    sc.codeobject.create

sc.UseSafeSubset = True

    ToggleState

    sc.codeobject.create

End Sub

Sub ToggleState()

  ' 如果未初始化 ScriptControl，则进行初始化。

  If Not IsObject(sc) Then Main

  sc.State = sc.State Xor 1

End Sub


Add 方法 (Script Control)
Add 方法

向 Modules 集合添加新模块。

语法

ScriptControl.Modules.Add(name[, object])

Add 方法的语法有以下部分：

部分	描述
name	必选。要添加的模块的字符串名称。
object	可选。与此模块关联的对象的名称。
说明

可选择是否有对象与添加的模块关联。如果指定此类对象，则可在该对象及其附属对象后编写事件处理代码。


AddCode 方法 (Script Control)
AddCode 方法

向模块添加指定代码。

语法

object.AddCode code

AddCode 方法的语法有以下部分：

部分	描述
object	必选。要添加代码的对象或对此对象的引用。可以是“应用于”列表中列出的任何对象。
code	必选。字符串，包含要添加到对象中的代码。
说明

对于如 Sub...End Sub、Function...End Function、If...Then...Else 和 Select Case 的代码块，必须将整个代码块作为 code 参数提供给 AddCode 方法。不能把块中的代码分开，用多个 AddCode 方法添加。要分隔代码块中的每条语句，可使用冒号 (:) 或嵌入的新行字符 (vbNewLine)。

可多次调用 AddCode 方法。


AddObject 方法 (Script Control)
AddObject 方法

使主机对象模型对 Script 引擎可用。

语法

ScriptControl.AddObject(name, object[, addmembers])

AddObject 方法的语法有以下部分：

部分	描述
name	必选。ScriptControl 代码中的名称，根据此名称识别添加的对象。
object	必选。运行时显露的主机对象的名称。
addmembers	可选。Boolean 值。当 ScriptControl 及其成员可全局访问 object 成员时为 True，否则为 False（默认）。
说明

用 AddObject 方法使主机对象对 Script 引擎可用。AddObject 方法使 ScriptControl 用户能向 Script 代码提供一组 name/object 对。Script 引擎可用任何方式显露 name。在 VBScript 和 Jscript(TM) 中，每个 name 都显露为某个名称，该名称可通过添加到 ScriptControl 的代码进行全局访问。


Clear 方法 (Script Control)
Clear 方法

清除 Error 对象的所有属性。

语法

Error.Clear

说明

每次执行 Reset、AddCode、Eval 或 ExecuteStatement 方法时，都清除 Error 对象的属性。在其他环境中，用 Clear 方法清除 Error 对象的属性。


Eval 方法 (Script Control)
Eval 方法

计算表达式并返回结果。

语法

object.Eval(expression)

Eval 方法的语法有以下部分：

部分	描述
object	必选。要计算表达式的对象或对此对象的引用。可以是“应用于”列表中列出的任何对象。
expression	必选。字符串，包含要计算的表达式。
说明

Eval 方法的上下文由 object 参数决定。如果 object 是模块，则上下文限制在已命名模块中。如果 object 是 ScriptControl，则上下文为 Global 模块。

特别在VBScript 需要注意的是：形如 x = y 的表达式有两种解释。第一种解释为将 y 值赋值给 x。第二种解释为 x 与 y 具有相同的值。Eval 方法总是用第二种解释，而 ExecuteStatement 方法总是用第一种解释。

注意   在 JScript(TM) 中，赋值与比较不会混淆，因为赋值运算符 (=) 与比较运算符 (==) 是不同的。


ExecuteStatement 方法 (Script Control)
ExecuteStatement 方法

执行指定的语句。

语法

object.ExecuteStatement statement

ExecuteStatement 方法的语法有以下部分：

部分	描述
object	必选。提供要执行语句的上下文的对象或对此对象的引用。可以是“应用于”列表中列出的任何对象。
statement	必选。字符串，包含要执行的语句。
说明

ExecuteStatement 方法的上下文由 object 参数决定。如果 object 是模块，则上下文限制在已命名模块中。如果 object 是 ScriptControl，则上下文为 Global 模块。

特别需要注意的是：形如 x = y 的表达式有两种解释。第一种解释为将 y 值赋值给 x。第二种解释为 x 与 y 具有相同的值。ExecuteStatement 方法总是用第一种解释，而 Eval 方法总是用第二种解释。

注意   在 JScript(TM) 中，赋值与比较不会混淆，因为赋值运算符 (=) 与比较运算符 (==) 是不同的。


Item 方法 (Script Control)
Item 方法

按位置或键返回集合的特定成员。

语法

object.Item(index)

Item 方法的语法有以下部分：

部分	描述
object	必选。可以是“应用于”列表中列出的任何集合，或对此集合的引用。
index	必选。表达式，指定集合成员的位置。如果是数值表达式，则 index 必须是数值，该数值在 1 到集合的 Count 属性所指定的值之间。如果是字符串表达式，则当成员添加到集合中时，index 必须与指定成员的名称相对应。用 GlobalModule 常数访问总是存在于 Modules 集合中的特定 Global 模块。
说明

集合中成员的顺序通常并非一成不变。但成员添加后，直到删除之前，集合中成员并不会改变次序。


Reset 方法 (Script Control)
Reset 方法

放弃所有已经添加到 ScriptControl 中的 Script 代码和对象。

语法

ScriptControl.Reset

说明

ScriptControl 中的 State 属性重置为 Initialized (0)。这意味着所有的代码将被丢弃、所有的模块被破坏、并且所有对外部对象的引用都不再有效。


Run 方法 (Script Control)
Run 方法

运行指定过程。

语法

object.Run(procedureName, arg1, arg2, _, argn))

Run 方法的语法有以下部分：

部分	描述
object	必选。所要运行过程的对象或对此对象的引用。可以是“应用于”列表中列出的任何对象。
procedureName	必选。所要运行过程的字符串名称。
arg1 - argn	必需的，任何提供给被运行的过程的参数。
说明

有如下两种方法运行过程：

•	用 Run 方法。应以字符串形式指定过程名。事先不知道过程名时，此方法很有用。

•	用 CodeObject 属性并直接调用。事先知道所有过程名时，可使用此方法。


Add 方法示例

下面举例说明如何使用 Add 方法：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 添加模块。

   Set m = sc.Modules.Add("Module1")

   ' 向模块添加代码。

   m.AddCode "Sub Main : MsgBox ""嗨，你好！"" : End Sub"

   ' 运行 Script。

   m.Run "Main"

End Sub


AddCode 方法示例

下面举例说明如何使用 AddCode 方法：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 添加模块。

   Set m = sc.Modules.Add("Module1")

   ' 向模块添加代码。

   m.AddCode "Sub Main : MsgBox ""嗨，你好！"" : End Sub"

   ' 运行 Script。

   m.Run "Main"

End Sub


AddObject 方法示例

下面举例说明如何使用 AddObject 方法：

Private Sub Command1_Click()

   Dim p1, sc

   ' 创建 FileSystemObject 实例。

Set fs = CreateObject("Scripting.FileSystemObject")

   ' 初始化 ScriptControl。

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = False

   ' 向 ScriptControl 添加 FileSystemObject

   sc.AddObject "FileSystem", fs, True

   ' 定义 Script 代码

   p1 = "Sub Sub1" & vbNewLine & _

        "  Dim Msg" & vbNewLine & _

        "  Msg = ""您有 """ & vbNewLine & _

        "  Msg = Msg & FileSystem.Drives.Count" & vbNewLine & _

        "  Msg = Msg & "" 个已连接的驱动程序""" & vbNewLine & _

        "  MsgBox Msg" & vbNewLine & _

        "End Sub"

   ' 添加代码

   sc.AddCode p1

   ' 运行代码

   sc.Run "Sub1"

End Sub


Clear 方法示例

下面举例说明如何使用 Clear 方法：

Private Sub Command1_Click()

   Dim sc, p1, msg

   p1 = "Sub Main" & vbNewLine & _

        "   On Error Resume Next" & vbNewLine & _

        "   X = 1/0" & vbNewLine & _

        "End Sub"

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   sc.AddCode p1

   On Error Resume Next

   sc.Run "Main"

   If sc.Error.Number Then

      msg = "Script 错误！" & vbNewLine

      msg = msg & " 您的 Script 代码中 "

      msg = msg & " 第 "

      msg = msg & sc.Error.Line

      msg = msg & "行、第 " & sc.Error.Column

      msg = msg & "列出现错误 " & sc.Error.Number

      msg = msg & " (" & sc.Error.Description & ")"

      msg = msg & " occurred at Line: "

      msg = msg & sc.Error.Line

      msg = msg & ", Column: " & sc.Error.Column

      msg = msg & " of your scripting code.

      MsgBox msg

      sc.Error.Clear

   Else

      MsgBox "未出现错误。"

   End If

End Sub


Eval 方法示例

下面举例说明如何使用 Eval 方法：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 添加模块。

   Set m = sc.Modules.Add("Module1")

   ' 向模块添加代码。

   m.AddCode "Private x"

   m.AddCode "x = 1"

   ' 显示表达式的计算值。

   MsgBox m.Eval("x = y")' 显示 False

End Sub


ExecuteStatement 方法示例

下面举例说明如何使用 ExecuteStatement 方法：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc, m

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 添加模块。

   Set m = sc.Modules.Add("Module1")

   ' 向模块添加代码。

   m.AddCode "Private x"

   m.AddCode "x = 1"

   ' 执行赋值语句。

   m.ExecuteStatement("x = 3")

   ' 显示 x 值。

   MsgBox m.Eval("x")

End Sub


Item 方法示例

下面举例说明如何使用 Item方法：

Private Sub Command4_Click()

   ' 创建变量。

   Dim sc, m, i, j, Code, Report

   Set sc = CreateObject("ScriptControl")

   sc.Language = "VBScript"

   ' 初始化伪随机数发生器。

   Randomize

   ' 在 Global Module 中添加过程。

   For i = 1 To Int((10 * Rnd + 1))

      Code = "Sub Sub" & i & ": MsgBox Sub" & i

      Code = Code & ": End Sub"

      sc.AddCode Code

   Next

   ' 添加模块。

   For i = 1 To Int((10 * Rnd + 1))

      ' 添加模块。

      Set m = sc.Modules.Add("Module" & CStr(i))

      ' 添加过程。

      For j = 1 To Int((10 * Rnd) + 1)

         ' 创建过程的模板。

         Code = "Sub Sub" & j & ": MsgBox Sub"

         Code = Code & j & ": End Sub"

         ' 向模块添加过程。

         m.AddCode Code

      Next

    Next

    ' 创建模块与过程的报告。

    Report = "您的 ScriptControl 代码包含 "

    Report = Report & sc.Modules.Count & " 个模块。"

    For Each m In sc.Modules

       Report = Report & vbNewLine & m.Name

       For i = 1 To m.Procedures.Count

          Report = Report & vbNewLine & Space(10)

          Report = Report & m.Procedures.Item(i).Name

       Next

    Next

    ' 显示信息。

    MsgBox Report

End Sub


Reset 方法示例

下面举例说明如何使用 Reset 方法：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc

    Set sc = CreateObject("ScriptControl")

    sc.Language = "VBScript"

    sc.AllowUI = True

    sc.UseSafeSubset = True

    ' 设置错误处理。

    On Error Resume Next

    ' 添加 Script 代码。

    sc.AddCode "Sub Main " : MsgBox ""您好，世界！"" : End Sub"

    ' 运行代码

    sc.Run "Main

    ' 重置 ScriptControl。

    sc.Reset

    ' 请重新运行。

    Sc.Run "Main"

    If Err.Number = 438 Then MsgBox "Sub Main 不存在。"

End Sub


Run 方法示例

下面举例说明如何使用 Run 方法：

Private Sub Command1_Click()

   ' 创建变量。

   Dim sc

   Set sc = CreateObject("ScriptControl")

   sc.AllowUI = True

   sc.Language = "VBScript"

   ' 向 ScriptControl 添加 Script 。

   sc.AddCode "Sub Main : MsgBox ""嗨，你好！"" : End Sub"

   ' 运行 Script 代码。

   sc.Run "Main"

End Sub


Error 事件 (Script Control)
Error 事件

出现运行时错误时，发生此事件。

语法

Private Sub ScriptControl_Error

说明

调用由 CodeObject 属性返回的对象时，在事件吸收或直接调用 Script 引擎期间，可能发生 Error 事件。有关特定错误的详细信息，可用 ScriptControl Error 对象的不同属性查找。


Timeout 事件 (Script Control)
Timeout 事件

当超出了 Timeout 属性指定的时间且用户在结果对话框中选定了 End 时，发生此事件。

语法

Private Sub ScriptControl_Timeout

说明

如果存在多个 ScriptControl 对象，则只有最初的 ScriptControl 对象发生 Timeout 事件。


ScriptControl 常数

ScriptControl 对象使用两类不同的常数：应用于 ScriptControl 对象库的常数和定义 ScriptControl 状态的常数。

ScriptControl 常数

ScriptControl 对象库使用的常数定义如下：

常数	值	描述
GlobalModule	Global	Script 引擎至少支持一个称为 Global 的模块，此模块在 ScriptControl Language 属性设置为有效语言时创建。GlobalModule 作为索引用于 ScriptControl Modules 集合以检索此特殊模块。
NoTimeout	-1	用于设置 ScriptControl Timeout 属性，使 Script 引擎的执行无超时。
ScriptControl 状态

用于指明 ScriptControl 状态的常数定义如下：

常数	值	描述
Initialized	0	初始化 Script 引擎。用 AddObject 方法添加对象而产生事件时，Script 引擎将执行代码而不吸收事件。
Connected	1	用 AddObject 方法添加对象而产生事件时，Script 吸收事件。


向 Script 控件添加对象模型

Script 控件的一个重要特性是，它能向控件 Automation 对象的对象模型。这可以包括 ActiveX_ .dll 和 ActiveX .exe 文件，以及其他的对象。实现此特性后，可通过 Script 引擎调用或访问对象的公用方法和属性。换句话说，Script 控件可表现为宏引擎，这个宏引擎可调用部件的公用方法或设置部件的属性。

下图是上述概念的一个简单示例。

包含 Script 控件的应用程序运行 frmScript 窗体中的 Script。用 VBScript 编写的 Script 调用在 MyDLL.dll 部件中定义的 Multiply 函数。Script 把函数的结果赋给变量，然后把此变量加 2 并显示最终结果。

使用 AddObject 方法

AddObject 方法的语法要求一个字符串和要添加的对象。在 Script 中调用对象时，字符串是此对象的名称。例如，以下代码段向 Script 控件添加名为 MyClass 的类模块。对象名称设置为 MyScriptObject：

Option Explicit

' 为 MyClass 对象声明对象变量。

Private objMyClass As New MyClass

Private Sub Form_Load()

' Script 控件的名称是 scDemo。

scDemo.AddObject "MyScriptObject", objMyClass

End Sub

随后，当您编写 Script 调用此对象的方法或属性时，该 Script 必须使用名称 MyScriptObject。例如，如果类模块有名为 TaxIt 的公用函数和名为 Rate 的公用属性，则 Script 可包含以下代码：

' 以下为 VBScript 代码。

Sub RunObject()

Dim NewRate

NewRate = InputBox("Rate:",,.09)

' 设置对象属性。

MyScriptObject.Rate = NewRate

Dim price

price = InputBox("Price:",,100)

' 执行调用 TaxIt 函数的操作。

MsgBox MyScriptObject.TaxIt(price)

End Sub

用 Run 方法运行 Script：

ScriptControl1.Run "RunObject"


创建简单 Script 工程

请按以下步骤构造名为 SimpleScript 的 Visual Basic 工程样例，了解如何向 Script 控件添加部件对象模型。

 创建 SimpleScript 工程

1 在“文件”菜单中，单击“新建工程”。

2 在“新建工程”对话框中，双击“标准 Exe”图标。

3 按 F4 键打开“属性”窗口。双击 Name 属性，把窗体名称改为 frmSimpleScript。

4 双击 Caption 属性，设置为“简单 Script 示例”。

5 在“工程”菜单中，单击“添加类模块”。

6 在“添加类模块”对话框中，双击“类模块”图标。

  您将向 Script 控件添加对象模型。

7 在“属性”窗口中，双击 Name，把名称改为 MyClass。

8 向类模块添加以下代码：

Option Explicit

Private ObjRate As Double

Public Property Get Rate() As Double

    Rate = ObjRate

End Property

Public Property Let Rate(newRate As Double)

    ObjRate = newRate

End Property

Public Function TaxIt(price) As Double

    TaxIt = price + (price * ObjRate)

End Function

9 向窗体添加 CommandButton1、TextBox1 和 ListBox1 控件，并按下表设置属性值。

控件	属性	值
CommandButton1	Name	CmdAddCode
	Caption	AddCode
	Height	255
	Left	0
	Top	240
	Width	1215
TextBox1	Name	TxtScript
	MultiLine	True
	ScrollBars	2 - Vertical
	Height	1575
	Left	1320
	Top	240
	Width	4335
ListBox1	Name	1stProcedures
	Height	645
	Left	1320
	Top	2150
	Width	4335
10 用右键单击“工具箱”并单击“部件”以显示“部件”对话框。双击“Microsoft Script Control 5.0”，然后单击“确定”。

11 在“工具箱”中，双击“ScriptControl”图标，将其添加到窗体中。

12 重命名 Script 控件为 scDemo。

13 把下列代码粘贴到窗体的“声明”区域中。

Option Explicit

Private MyObject As New MyClass

Private Sub Form_Load()

' 向 Script 控件添加 MyObject。

' 此代码向控件添加对象模型。

scDemo.AddObject "objScript", MyObject

' 向 TextBox 控件添加 Script。

txtScript.Text = _

"Sub SetRate()" & vbCrLf & _

"  Dim Rate" & vbCrLf & _

"  Rate = InputBox(""TaxtRate:"",,.086)" & _

vbCrLf & _

"  objScript.Rate = Rate" & vbCrLf & _

"End Sub" & vbCrLf & vbCrLf & _

"Sub TotalPrice()" & vbCrLf & _

"  Dim price, ttl" & vbCrLf & _

"  price = InputBox(""Price:"",,100)" & _

vbCrLf & _

"  ttl =objScript.TaxIt(price)" & vbCrLf & _

"  MsgBox ttl" & vbCrLf & _

"End Sub"

End Sub

Private Sub cmdAddCode_Click()

' 向控件添加 TextBox 中的代码。

scDemo.AddCode txtScript.Text

' 清除 ListBox，并添加 Procedures 集合中各个过程的名称。

lstProcedures.Clear

Dim p As Procedure

For Each p In scDemo.Procedures

lstProcedures.AddItem p.Name

Next

End Sub

Private Sub lstProcedures_Click()

' 运行 ListBox 中的过程。

scDemo.Run lstProcedures.Text

End Sub

 运行 SimpleScript 工程

1.eb按 F5 键。

2.a5击“AddCode”。ListBox 控件用刚添加的过程名称填充。

3.0 在 ListBox 控件中，单击“SetRate”。对话框显示税率的默认值为 8.6。更改税率或单击“OK”。

4.0 在 ListBox 控件中，单击“TotalPrice”。对话框显示价格的默认值为 100。更改数值并单击“OK”，然后显示价格和税额的总和。

 编辑 TextBox 控件中的代码

可以修改代码，然后重新添加到控件。

1.0 在 TextBox 控件中，更改“MsgBox”的“SetRate”默认值为 4.2。

2.f7“AddCode”。

3.0 在 ListBox 控件中，单击“SetRate”。现在默认值已改变。

 在 TextBox 控件中添加过程

不妨尝试在 Textbox 控件中插入自己的代码。

1.f9到 Textbox 中：

Sub VariableTax()

   Dim Years, results, ttlInterest

   Dim i, principal, payment, interest, mortgage

   principal = InputBox("Borrow:",,100000)

   Years = InputBox("How long:",,15)

   results = "Payment" & vbtab & "Intrest" & vbcrlf

   For i = 1 to Years * 12

    interest =  (principal * objScript.Rate) / 12

    principal = principal - interest

    ttlInterest = ttlInterest + interest

    results = results & i & vbtab & formatNumber(interest,2) & vbcrlf

    Next

    MsgBox results

    MsgBox "Total Interest Paid:" & "$" & formatNumber(ttlInterest,2)

  End Sub

1.a5击“AddCode”。

2.a5击“SetRate”，更改税率，然后单击“OK”。

3.a5击“VariableTax”运行新过程。


使用 Microsoft Script 控件

Microsoft Script 控件允许用户为任意 Script 引擎编写和运行 Script。Script 控件提供 VBScript 和 Jscript(TM) 两种 Script 引擎。此外，您可向 Script 控件添加任何 Automation 对象的对象模型。添加后，Script 引擎可使用 Automation 对象的公用方法和属性。把应用程序的对象模型与 Script 引擎相结合，可以创建 Script 应用程序，运行宏来控制该应用程序。

创建 Script 控件实例

Microsoft Script 控件可作为控件或独立的 Automation 对象创建。此特性允许任何宿主应用程序以任意 Script 语言使用 Script 控件。

以下示例可放置于任意窗体中。注意，没有声明变量 sc 为 ScriptControl 类型，因为没有也不必在工程中引用控件。只要 Script 控件存在并已注册，以下代码就能正常运行：

Private Sub Command1_Click()

Dim sc

Dim strProgram As String

strProgram = "Sub Main" & vbCrLf & _

"MsgBox ""嗨，你好！""" & vbCrLf & _

"End Sub"

Set sc = CreateObject("ScriptControl")

sc.language = "VBScript"

sc.addcode strProgram

sc.run "Main"

End Sub

如果您在工程引用中对 Script 控件进行了显式的引用。就可以使用下列的代码创建该 Script 控件的实例：

Dim sc As ScriptControl

显示用户界面元素

AllowUI 属性决定是否允许 Script 引擎显示用户界面元素。可应用于 Script 控件自身，如控制超时信息的显示，也可应用于使用 ActiveX(TM) 编写界面的 Script 引擎。例如，在试图显示“Hello World”消息框时，以下代码将产生错误：

ScriptControl1.AllowUI = False

Dim strX As String

strX = "Sub Hello" & vbCrLf & _

"MsgBox ""Hello World""" & vbCrLf & _

"End Sub"

ScriptControl1.AddCode strX

ScriptControl1.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。

Private Sub RunNameMe_Click()

ScriptControl1.Run "NameMe"

End 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 控件添加过程代码示例：

' 当 ScriptRun app 加载时，以下代码向 Control

' 添加 NameMe 过程。

Private Sub Form_Load()

Dim strCode As String

strCode = _

   "Sub NameMe()" & vbCrLf & _

" Dim strName " & vbCrLf & _

" strName = InputBox(""姓名？"")" & vbCrLf & _

   " MsgBox ""您的姓名是："" & strName" & vbcrLf & _

"End Sub"

ScriptControl1.AddCode strCode

End Sub

另外，您可从 TextBox 控件添加过程代码：

Private Sub Form_Load()

' 此代码包含在 frmScript 窗体里名为 txtScript 的文本框中。

ScriptControl1.AddCode frmScript.txtScript.Text

End Sub

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

Private Sub EvalFunc()

' 创建函数。

Dim strFunction As String

strFunction = _

"Function ReturnThis(x, y)" & vbCrLf & _

" ReturnThis = x * y" & vbCrLf & _

"End Function"

' 添加代码，然后运行此函数。

ScriptControl1.AddCode strFunction

MsgBox ScriptControl1.Run("ReturnThis", 3, 25)

End Sub

3	运行过程

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

ScriptControl1.Run "FindName"

ScriptControl1.Run "AddName"

ScriptControl1.Run "Quit"

执行 Script 语句和计算结果

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

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

Private Sub TryThis()

    ScriptControl1.ExecuteStatement "x = 100"

    MsgBox ScriptControl1.Eval("x = 100")  ' 结果为 True

    MsgBox ScriptControl1.Eval("x = 100/2")  ' 结果为 False

End Sub

使用 Error 属性

Script 控件错误有两个来源：Script 控件自身或 Control 正要运行的 Script。要调试 Script 代码，请使用 Error 属性，它返回 Error 对象的引用。Script 控件可用 Error 对象返回错误编号和描述信息，以及 Script 中出现错误的行号。

请运行以下代码显示一个示例。此示例中，Script 控件使用 Error 属性显示错误信息：

Private Sub MyError()

' 以下 Script 代码产生被零除的错误。

Dim strCode As String

strCode = _

"Sub DivideByZero()" & vbCrLf & _

"Dim prime" & vbCrLf & _

"prime = 3" & vbCrLf & _

"MsgBox prime/0" & vbCrLf & _

"End Sub"

On Error GoTo scError

With ScriptControl1

.AddCode strCode

.Run "DivideByZero"

End With

Exit Sub

scError:

' 用 Error 对象通知用户所出现的错误以及该错误所在的行。

Debug.Print ScriptControl1.Error.Number & _

":" & ScriptControl1.Error.Description & _

"行号：" & ScriptControl1.Error.Line

Exit Sub

End Sub


使用 Modules 集合

使用 Modules 和 Procedures

Microsoft(R) Visual Basic(R) 中，代码是按模块编写的。每个模块包含一组具有一定逻辑关系的函数和过程。Modules 集合中的每个 Module 对象与每个要管理的 Script 之间有一一对应关系。每个 Module 对象包含一批 Procedure 对象，这些对象 Procedure 都可用 Run 方法运行。

向 Global 模块添加过程

Script 控件包含一个默认的 Module 对象，即 Global 模块。其他模块可调用包含在 Global 模块中的所有过程。例如，以下代码返回默认模块 (Global) 的名称：

' 命名 Script 控件为 scDemo.

MsgBox scDemo.Modules(1).Name ' 返回“Global”

如果仅使用一个 Module 对象，则无须指定模块，直接调用 AddCode 方法向 Global 模块添加代码即可，如下所示：

' 添加包含在文本框控件中的代码，

' 该控件名为 txtMyScript。

scDemo.AddCode txtMyScript.Text

类似地，调用 Script 控件的 Run 方法，可运行添加到默认 Global 模块的任何代码：

' 运行名为 RunThis 的过程。

scDemo.Run "RunThis"

添加模块和属性

和任何集合对象一样，可用 Add 方法添加模块，并在添加时命名每个模块。然后，可用名称指定 Module 对象并调用其过程。

下面的示例先向集合添加名为 Numbers 的模块，然后把 Textbox 控件中的过程添加到集合中的 Module 对象。最后，运行模块中的过程。

scDemo.Modules.Add "Numbers"

scDemo.Modules("Numbers").Procedures.Add _

txtMyScript.Text

' 运行名为 Factors 过程。

scDemo.Run scDemo.Modules("Numbers"). _

Procedures("Factors")

清除 Modules 集合

可用 Reset 方法清除 Modules 集合中所有的 Module 对象。清除后只剩下 Global 模块对象，集合的 Count 属性重置为 1。同时，所有过程（包括保存在 Global 模块中的过程)都被清除along with any variables。

使用 CodeObject 属性

在 Module 对象中填充过程后，可用 CodeObject 属性而不是 Run 方法来直接调用过程。如下例所示：

Dim modX As Module

Set modX = scDemo.Modules.Add("myMod")

Dim strX As String

strX = "Sub Hello" & vbCrLf & _

"MsgBox ""嗨，你好！""" & vbCrLf & _

"End Sub"

modX.AddCode strX

Dim objX As Object

' 设置变量为 CodeObject，然后调用过程。

Set objX = modX.CodeObject

objX.Hello