资源描述
第3章 VBScript语句和过程
前面的章节中已经详细地介绍了有关VBScript语句的数据类型、常量、变量,但是,仅仅了解这些知识还是远远不够的,也无法完成符合用户需求的页面。所以,在这一章节中我们将进一步学习VBScript的知识,主要包括VBScript的一些基本语句,如选择语句和循环语句等,以及在VBScript中使用过程的具体方法等。学习这些知识也有助于读者加深对不同程序结构的理解。
3.1 VBScript语句中的基本语句
对于一般程序,有三类基本的程序结构可以控制程序的流程:顺序结构,分支结构和循环结构。顺序结构的流程是按照事务完成的先后次序依次执行语句,而且总是在完成前一句语句之后再执行后一句语句,并且执行过的语句不再执行,这就与分支结构和循环结构有所区别。分支结构相当于在实际生活中,我们对于判断进行选择一样,如果出现某些情况,我们将会如何做,如果不出现这些情况,我们将作如何打算。但是在程序中,分支结构并不一定只有“是”或“否”这两种选择,也可以存在多种选择的结构。循环结构是对于某一些语句进行反复执行,循环语句结束的关键往往是:当符合某些条件,或不符合某些条件,或在重复执行一定次数之后。一般而言,任何程序总是同时包含这三种结构来对程序的流程进行控制。在VBScript语句中,顺序结构最简单,一般不需要程序进行什么控制;分支结构可以使用选择语句来实现;循环结构可以使用循环语句来实现。在下文中将具体介绍选择语句和循环语句。
需要指出的是,在许多结构化语言中,一般来说不提供Goto语句直接在程序中跳转,因为这将会极大地损害程序的可读性,另外有一些结构化语言虽然提供了Goto语句,但是不建议使用这条语句,而是建议使用Break、Continue等跳转语句来代替,这些语句和Goto语句不同之处就在于,Goto语句是任意跳转的,而Break、Continue语句并不能任意跳转,只是实现了循环的中断退出功能。VBScript也不支持Goto语句,但在VBScript中,提供了Exit语句和On Error语句来实现程序流程的跳转。
3.1.1 选择语句
在VBScript中,有两种条件语句:If…Then…Else语句和Select…Case语句(表3.1),这两种条件语句执行的时候,先对条件进行判断,然后根据条件执行相应的脚本。If…Then…Else语句只会形成两重分支,如果条件满足,执行其中的一个分支,如果条件不满足,则执行其中的另外一个分支。Select…Case语句会形成多重分支,根据条件的结果选择其中相应的分支执行。
表3.1 VBScript语句中的分支语句
If...Then...Else语句
二值分支语句
Select Case语句
多值分支语句
3.1.1.1 使用If...Then...Else语句
VBScript中最常用的条件语句就是If…Then…Else语句,一般If…Then…Else语句用来检查一个布尔条件,然后根据结果为True或者False执行相应的脚本,如果为True,则执行Then后面的脚本,如果为False,则执行Else后面的脚本。
If…Then…Else语句有两种形式:单行形式和多行形式(也称块形式),单行形式中整条语句都需要在一行中完成,其中也包括条件和判断后执行的脚本,其语法如下所示:
If condition Then statements [Else elsestatements]
多行形式的语法如下所示:
If condition Then
statements
[Else
elsestatements]
End If
其中,condition是测试条件,statements是条件为True的情况下所执行的脚本,elsestatements是条件为False的情况下所执行的脚本,如果条件为Null,那么执行的脚本仍然是elsestatements。通常情况下,测试条件是使用比较运算符对值或变量进行比较的表达式。在这两种语法中,Else都是可选的,如果没有Else,则表明如果判断条件为True,执行Then后面的脚本,如果条件为False,则不执行任何脚本。
注意:在多行形式中,语句结束的最后一行中有一句End If,而单行形式则不需要。
对于比较短小而简单的测试,我们可以使用单行形式。例如,如果学生成绩大于60分,则判定成绩为Pass,否则判定其成绩为Fail,如以下脚本所示:
If Score >= 60 Then Status = “Pass” Else Status = “Fail”
不过,在编写脚本的过程中,多行形式比单行形式的结构化更强,更加容易阅读、维护和调试。对于上面单行形式的语句,我们可以改写为多行形式如下:
If Score >= 60 Then
Status = “Pass”
Else
Status = “Fail”
End If
在VBScript中,还可以扩展If…Then…Else语句的功能,通过添加ElseIf子句,我们可以对多个条件进行判断和分支选择,其语法如下所示:
If condition Then
statements
ElseIf conditin-n Then
elseifstatements
Else
elsestatements
End If
在条件语句中,如果条件是True时要执行多个语句,条件是False时也需要执行多个语句的时候,则就可以使用If...Then...Else语句来定义两个语句块:在Then后面的语句块在条件是True时被执行;在Else后面的语句块在条件是False时被执行。
Dim nTemp1, nTemp2
Dim nBigValue, nSmallValue
nTemp1 = CDbl ( InputBox ( “请输入第一个数值:” ) )
nTemp2 = CDbl ( InputBox ( “请输入第二个数值:” ) )
If ( nTemp1 > nTemp2 ) Then
nBigValue = nTemp1
nSmallValue = nTemp2
Else
nBigValue = nTemp2
nSmallValue = nTemp1
End If
有时候,单个条件语句并不能满足在多种选择中做決定,所以用户要采用If...Then...Else 语句的变形,从多种选择中选取一种选择。这种变形形式是在原来的条件语句上加上ElseIf子句,以扩充其原有的功能,这样能让用户的程序有多种不同的流程,方便了对于程序代码行的控制。举例如下:
Sub ReportValue(value)
If value = 0 Then
MsgBox value
ElseIf value = 1 Then
MsgBox value
ElseIf value = 2 then
Msgbox value
Else
Msgbox "Value out of range!"
End If
用户可以根据需要加上多个ElseIf子句以提供其它选项。但是,有时ElseIf子句用得太多,也常常会变成一种麻烦。经常我们所采用的方法是使用可以进行多种选择的Select Case语句。
3.1.1.2 使用Select Case 语句
如果需要实现多重分支选择,一般我们使用Select Case语句,而不使用If…Then…Else语句,尽管后者也完全能够实现这些功能。Select Case语句的功能就是根据表达式的值执行几组脚本当中的一组。其语法如下所示:
Select Case testexpression
Case expressionlist
statements…
Case Else expressionlist
elsestatements
End Select
其中,testexpression是语句的判断条件,可以是任何数值或者字符串表达式,expressionlist则是可能出现的表达式的值,statements和elsestatements是根据表达式结果执行的脚本。
如果testexpression的表达式结果和某一个Case子句中列举的值相符合,那么则执行这一个Case子句和下一个Case子句之间的脚本,如果和任何列举出的值都不符合,则执行Case Else子句和End Select之间的脚本,如果再没有Case Else语句,那么将会直接执行End Select之后的脚本。如果表达式的结果和多个Case子句中的值相符合,则只会执行第一个匹配后的语句。
其实,Select Case语句提供了除了 If...Then...ElseIf 以外的另外一种条件语句的形式,可允许用户从多个语句块中作出一个选择,并执行相应的语句。Select Case 语句提供的功能和 If...Then...Else 语句类似,但它可使整个程序代码行执行起来更加的有效率,而且也提高了程序的可读性。
Select Case语句在其前端,即Select Case子句后有一个测试运算式,这个运算式只会被执行一次。执行完后的结果将被用来和每一个 Case子句的值作比较。如果有相符的情况时,这个Case 子句后的语句块就将被执行,注意下面这个例子:
Select Case Document.Form1.CardType.Options(SelectedIndex).Text
Case "MasterCard"
DisplayMCLogo
ValidateMCAccount
Case "Visa"
DisplayVisaLogo
ValidateVisaAccount
Case "American Express"
DisplayAMEXCOLogo
ValidateAMEXCOAccount
Case Else
DisplayUnknownImage
PromptAgain
End Select
从上面的程序中可以注意到Select Case 语句只在前端执行一个运算式。而与此相反的是,If...Then...ElseIf条件语句则可在每一个ElseIf语句后面加上一个不同的比较运算式。对于这种格式的语句,只有在每一个ElseIf语句使用的都是同一个运算式时,才能用Select Case语句来取代If...Then...ElseIf语句。
与If语句相同,Select Case语句也可以嵌套,只是对于每一层嵌套的Select Case语句中必须有与其相对应的End Select语句。
3.1.2 循环语句
使用循环语句可以反复执行某段脚本,直到满足循环结束条件后才停止。如表3.2所示,在VBScript中,提供了四种循环语句:For…Next语句、Do…Loop语句、While…Wend语句和For Each…Next语句。在这四种循环语句中,For Each…Next语句是比较特殊的一种,它不是指定循环的次数、也没有指定循环的结束条件,而是提供了枚举集合中元素的一种方法。运用循环语句,可以极大地方便我们开发脚本的工作。
表3.2 VBScript语句中的循环语句
Do...Loop
当条件是 True 时执行循环,也可以是执行到条件为 True 时,停止循环。
While...Wend
当条件是 True 就执行循环。
For...Next
使用一个计数器,让语句重复执行某个固定的次数。
For Each...Next
对每个集合对象中的项目或数组中的元素重复执行一次循环。
3.1.2.1 For…Next语句
For…Next语句在循环的过程中,可以指定循环运行的次数,当到达循环运行次数之后,退出循环。其语法如下所示:
For counter = start To end Step stepsize
statements
Next
其中,counter是用作循环计数器的数值变量,start是循环变量的初值,end是循环变量的终值,stepsize是循环变量的步长,在默认条件下stepsize=1,statements是循环内反复执行的脚本。
在执行For…Next语句有以下几个步骤:
1. 将初值赋给循环变量,即执行counter=start;
2. 判断循环条件,如果循环步长大于等于0,则循环条件是counter<=end,如果循环步长小于0,则循环条件是counter>=end,如果循环条件为True,则执行循环中的语句,如果循环条件为False,则跳出循环;
3. 执行循环代码,再将步长累加到循环计数器上,即执行counter=counter+stepsize,然后返回步骤2判断循环条件。
举个例子。下面的程序会计算从1到50所有数值相乘的结果。这个For语句指定了一个计数器I,同时指定了该计数器的起始值和结束值。Next语句会使计数器的值在每次循环执行时自动递增1。使用Visual Basic的编程人员注意,在VB语句中的For语句在Next语句之后必须跟有作为计数器的变量,而在VBScript语句中,该变量不必再写了。
Dim I, nResult
nResult = 1
For I = 1 To 50
nResult = nResult * I
Next
MsgBox “结果为:” & nResult
使用Step关键字,用户就可以随自己的需要来递增或是递减计数器变量。在下面的例子中,计数器变量j会在每次循环执行后递增2。当循环执行完时,变量nResult將是2、4、6、8和10的总和。
Dim j, nResult
nResult = 0
For j = 2 To 10 Step 2
total = total + j
Next
MsgBox “结果为:” & nResult
如果用户要使计数器变量递减时,则可以使用负的Step值。此时,结束值必须小于起始值。在下面例子中,计数器变量myNum会在每次循环执行过后递减2。当这个循环结束时,变量total的值将会是16、14、12、10、8、6、4和2的总和。
Dim nStep nResult
nResult = 0
For nStep = 16 To 2 Step -2
nResult = nResult + nStep
Next
MsgBox “结果为:” & nResult
用户可以使用Exit For语句在计数器到达其结束值之前跳离For...Next语句。因为通常用户只会希望在某些特定的情形发生时,才要跳离循环,比如像发生了错误时。所以用户应该把Exit Do语句放在If...Then...Else语句的Then子句之后的语句中。当条件是False时,循环就会照常执行。
需要指出的是,VBScript和Visual Basic的Next语句在使用上有所不同,Visual Basic中,Next语句后一般要求一个循环变量,但在VBScript中,Next语句后不要求循环变量,如果后面有循环变量,反而会导致错误的出现。
一般情况下,我们不建议在循环执行的过程中,使用语句改变循环计数器的值,因为这样会使得脚本的可读性变差,代码的调试和维护工作都会变得困难得多。
在循环中,我们还可以使用循环嵌套,不过循环嵌套的过程中,要求各重循环计数器的变量不同,例如:
For I = 1 To 10
For J = 1 To 10
……
Next
Next
3.1.2.2 Do…Loop语句
Do…Loop语句和For…Next语句有所不同,For…Next语句中,循环执行的次数是确定的,而Do…Loop中,循环执行的次数则往往是不确定的,如果循环条件为True或者循环条件变为True,循环将会一直执行。
Do…Loop语句有两种形式:Do While/Until…Loop和Do…Loop While/Until。
我们先来看第一种形式。Do While/Until…Loop的语法如下所示:
Do { While|Until} condition
statements
Loop
其中,condition是循环执行条件,statements是循环内反复执行的脚本。
Do While/Until…Loop循环的执行步骤如下所示:
1. 如果是Do While…Loop循环,则判断condition是否满足,如果满足,则进入步骤2执行循环内脚本,否则跳出循环;如果是Do Until…Loop循环,则判断condition是否不满足,如果不满足,则进入步骤2执行循环内脚本,如果满足condition,则跳出循环;
2. 执行循环中脚本,然后返回步骤1。
在Do...Loop语句中,需用While关键字来检查条件。用户可以在进入循环之前就先检查条件,或在循环至少执行过一次之后再检查,比如下面的ChkLastWhile例子。在ChkFirstWhile程序中,如果myNum不是设成20,而是设成9,那么在循环中的语句就永远不会被执行。在ChkLastWhile程序中,循环里的语句只会被执行一次。因为它的条件已经是False了。
Sub ChkFirstWhile()
Dim counter, myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
Sub ChkLastWhile()
Dim counter, myNum
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
而如果我们将上述脚本中的While改为Until,再执行这段脚本,我们则会发现执行结果不一样了。这是由于Do Until…Loop中,在执行循环内代码前先判断循环条件是否不满足,只有在不满足的情况下,Do Until…Loop才会执行循环内脚本,而如果满足,则循环内代码一次也不会执行。
在Do...Loop语句中,用户有两种方法来使用Until关键字检查条件。用户可以在进入循环前先检查条件,或在循环至少执行过一次后再检查(如下面的ChkLastUntil例子)。只要在条件是False时,循环就会执行。
Sub ChkFirstUntil( )
Dim counter, myNum
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "The loop made " & counter & " repetitons."
End Sub
Sub ChkLastUntil()
Dim counter, myNum
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "The loop made " & counter & " repetitions."
End Sub
我们再来看第二种形式。Do…Loop While/Until的语法如下所示:
Do
statements
Loop { While|Until} condition
其中,condition是循环执行条件,statements是循环内反复执行的脚本。
Do…Loop While/Until循环的执行步骤如下所示:
1. 执行循环中脚本;
2. 对于Do…Loop While循环,则判断condition是否满足,如果满足,返回步骤1执行循环内脚本,否则跳出循环;如果是Do…Loop Until循环,则判断condition是否不满足,如果不满足,则返回步骤1执行循环内脚本,如果满足condition,则跳出循环。
如果我们将上述脚本中的While改为Until,再执行这些脚本,我们就会发现结果和Do Until…Loop的结果有所不同。这是由于在Do…Loop Until循环中,首先将执行一次循环内脚本,然后再对循环条件进行判断,这也就是说,不论循环条件如何设定,Do…Loop While/Until循环都将至少执行一次循环内的脚本。
注意,在Do…Loop循环中一定要有改变循环条件中变量的语句,否则,很有可能会陷入死循环而不能终止。就技术上来说,用户可以在Do...Loop中使用Exit Do语句来跳离循环。因为通常用户只会希望在某些特定的情形发生时,才需要跳离循环语句,比如像要避免死循环时,用户应该把Exit Do语句放在If...Then...Else语句的Then之后的语句块中。当条件是False时,循环就会照常执行,而当条件为True时,即满足离开循环的条件时,将执行Exit Do语句。
在下面的例子中,myNum将会被指定成一个会造成无限循环的值。其中的If...Then...Else语句将会检查这个条件,以避免无限死循环的发生。
Sub ExitExample()
Dim counter, myNum
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
MsgBox "The loop made " & counter & " repetitions."
End Sub
3.1.2.3 While…Wend语句
While…Wend语句和Do…Loop语句十分类似,但不如Do…Loop语句那样灵活,在While…Wend语句中,如果条件为True,则执行循环内脚本。其语法如下所示:
While condition
statements
Wend
其中,conditin是循环执行条件,statements是循环内执行的脚本。
While…Wend语句的执行步骤如下所示:
1. 判断condition是否为True,如果为True,则进入步骤2执行循环内脚本,如果为False或者为Null,则跳出循环;
2. 执行循环中脚本,然后返回步骤1。
与Do … Loop语句不同的是,While循环语句没有任何可以跳离循环的语句,用户不能想当然地使用Exit While语句。
不过,和Do…Loop语句比较而言,While…Wend语句的灵活性要差一些,脚本的清晰程度则是相同的,所以我们建议,在同样的情况下,还是使用Do…Loop语句。
3.1.2.4 For Each…Next语句
For Each…Next语句和上述三个循环语句都有所不同,它既不指定循环执行的次数,也不指定循环结束条件,而是对数组和集合中的元素进行枚举,当枚举结束之后才会退出循环。其语法如下所示:
For Each element In group
statements
Next
其中,group是我们进行枚举的数组或者集合,element是枚举变量的名称,statements是对于每个元素都会执行的循环脚本。
For Each...Next和For...Next循环非常相似。它们的不同之处在于,For Each...Next循环是针对集合对象中的每一个对象或数组中的每一个元素重复执行一次循环,而ForEach...Next循环语句是依指定的数字重复执行循环的次数。当用户不知道集合对象中有几个元素时,For Each...Next循环语句将会特別的有用。
在下面的HTML程序范例中,Dictionary对象的功能是要将文字放到数个文本框中:
<HTML>
<HEAD>
<TITLE>简单例子</TITLE>
</HEAD>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub btnFill_OnClick
Dim d ‘定义一个对象变量
Set d = CreateObject("Scripting.Dictionary") ‘建立一个Dictionary对象
d.Add "0", "Sanders" ‘将有关信息放入该对象之中
d.Add "1", "Shirley"
d.Add "2", "Winfred"
For Each I in d
Document.Form.Elements(I).Value = D.Item(I)
‘将文字放入文本框之中
Next
End Sub
-->
</SCRIPT>
<BODY>
<CENTER>
<FORM NAME="Form"
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Button" NAME=btnFill VALUE="填入信息"><p>
</FORM>
</CENTER>
</BODY>
</HTML>
3.1.2.5 Exit语句
在结构化程序设计的过程中,Goto语句的取消可以极大地增强程序的可读性,便于程序的阅读与维护,不过,也不可避免带来了一些不足之处。在某些循环嵌套的程序中,在合适的地方使用Goto语句能够使程序显得简洁明了,并且代码效率高,在禁止使用Goto语句的场合中,虽然不使用Goto语句也完全能够实现同样的功能,但是却使得程序的可读性和代码效率形成了一种矛盾,要么追求代码的高效率而使得程序晦涩难懂,要么追求程序结构清晰而降低了代码的效率。所以在C语言中提供了break、continue、Exit等半结构化语句,这些语句能够实现一定的跳转功能,保持代码的高效,也能够使得程序保持较强的可读性。
在VBScript中也提供了类似的语句,使用Exit语句能够停止程序当前正在执行的逻辑,退出循环或者当前过程。它能够退出Do…Loop、For…Next循环,也能够退出Function和Sub的过程处理,关于Function定义的函数和Sub定义的过程,我们会在下一节中介绍。
Exit语句有以下四种语法形式:
1. Exit Do:提供了一种退出Do…Loop循环的方法,Exit Do只能在Do…Loop语句中使用,执行Exit Do语句之后将控制权转移到Loop语句之后。
2. Exit For:提供了一种退出For循环的方法,Exit For语句只能在For…Next语句或者For Each…Next循环中使用,执行Exit For语句之后将控制权转移到Next语句之后。
3. Exit Function:执行Exit Function语句之后退出当前函数。
4. Exit Sub:执行Exit Sub语句之后退出当前过程。
例如,我们可以使用Exit Do语句实现一个死循环中的退出,在下面的脚本中,当循环计数器大于10之后,退出循环处理,而循环本身并不具备结束循环的功能:
counter = 0
Do While True
counter = counter + 1
If counter > 10 Then Exit Do
Loop
当然上面的脚本完全不需要使用Exit Do语句,但是在许多场合中,使用Exit语句之后能够显著提高脚本的执行效率。
3.2 VBScript语句中的过程
掌握了一些基本概念后,程序设计和编制就变成了一个不断重复的过程。用户需要多次重复某些步骤,或是某些语句来完成某一所需处理的任务。出于程序的可读性、可调试性和简单性的考虑,在实际的编程过程中,我们会将这些用于实现某一特定功能,而且相对集中的语句放在一个子程序中,称为过程。在过程中的语句一般和其他过程中的语句,或和主程序(相对于子程序而言)中语句没有什么直接联系。在VBScript中,过程被分为两类:Sub过程和Function过程。前面的举例程序中我们已经接触过这两个过程,但我们没有展开介绍。下面就具体谈谈这两种类型的过程。
3.2.1 Sub过程
Sub过程是由一些功能实现相对集中的VBScript语句组成。这些语句以Sub语句作为过程的开头,以End Sub语句作为其结束。这些语句被执行操作时并不返回任何数值,这一点和后面所谈到的Function过程有本质的区别,所以有些书上也将Sub过程称为子程序。Sub过程可以使用参数(由调用过程的主程序将所需的常量、变量或表达式传递给过程)。如果Sub过程无任何参数,则Sub语句必须包含空括号( ),该括号不能省略。
比如我们希望写一段程序,用于弹出一个对话框,并在对话框上显示一段提示信息。在这个程序中,关于对话框的实现在程序的任何地方都是一致的,所不同的是相应的提示信息。我们可以写一段Sub过程,来处理这一特定的功能。
<SCRIPT LANGUAGE="VBScript">
<!--
Sub CreateMessageBox( strInfo )
Dim strComplete
StrComplete = “提示信息:” & strInfo & “!”
MsgBox strComplete
End Sub
-->
</SCRIPT>
在这段程序中,CreateMessageBox是过程名称,strInfo是参数,整个过程包含在Sub和End Sub之中。该过程相当简单,只有三行语句。第一句定义了一个变量strComplete,该变量将用于对话框上的提示信息;第二句是根据参数的内容组织成一个完整的提示信息,并将该值赋给变量strComplete;第三句是将该信息用对话框的形式来提供给用户。
以后用户在程序中的任何地方只要写:
CreateMessageBox “Hello, World”
或者
Call CreateMessageBox (“Hello, World”)
即可调用该过程。
对于通过值传递的参数,在调用过程的时候,VBScript会在过程内部暂时建立一个变量,并将参数值复制给这个变量,这样就可以把过程外部的数值传递到过程内部中,不过这个变量只是在过程内部有效的,在脚本中改变变量的值的时候,并不会对参数造成任何影响,当脚本结束过程调用的时候,这个变量将被删除。
而对于通过地址传递的参数,在调用过程的时候,VBScript将参数的地址传递到过程中去,过程中的变量名称实际是对于这一块地址的引用,当过程中变量的值发生变化的时候,也就意味着该地址中的数据发生了变化。
在脚本中调用过程有两种方法:一种是使用Call语句的显式调用,另外一种是不使用Call语句的隐式调用。这两种调用方法的效果其实是一样的,隐式调用的时候,只需要在脚本中输入过程的名称和参数的名称就可以了,参数之间用逗号进行分隔,而在显式调用的时候,必须在过程名称之后加上括号,并且使得参数包含在括号中,即:
CreateMessageBox “Hello, World”
Call CreateMessageBox (“Hello, World”)
上面的两条语句中,前面一条语句是过程的显式调用,后面是隐式调用。
在过程执行的时候,如果希望满足某种条件后直接退出过程的处理逻辑,返回主程序,我们可以使用Exit Sub语句,执行Exit Sub语句,脚本的执行将立即从过程中退出,这样可以极大地方便我们脚本的编写,提高程序的灵活性。
在Windows操作系统中,由于采取的是一种使用消息机制来驱动程序,所以我们往往将一些对于消息或是事件的处理语句作为一个Sub过程。关于消息机制和事件驱动的概念由于不是本书的内容,这里不再赘述。如果需要了解这方面内容,可以参阅有关Windows编程的书籍。在这里我们只需要知道触发某一事件之后的代码写在哪个Sub过程中即可。
请看下面这个例子。我们要放置一个按钮,按下这个按钮之后将会弹出一个对话框。这是一个简单的程序,但这个程序反映了如何使用控件和Sub过程。我们首先要在页面上放置一个按钮,代码如下:
<INPUT id=btnMsg name=btnMsg type=button value="提示信息">
该语句定义了一个按钮,该按钮的名字为btnMsg,按钮上的文字为“提示信息”。
<SCRIPT LANGUAGE="VBScript">
<!--
Sub btnMsg_onClick()
Dim MsgInfo
MsgInfo = “Hello, World”
CreateMessageBox MsgInfo
End Sub
-->
</SCRIPT>
这段语句是用于在按下按钮之后所需要执行的代码。由于在VBScript中不像MFC中对于任何的Windows消息有相应的消息映射,而是简化成了一些直观的过程。这些过程往往在名称上就直接反映了其与各类消息之间的联系。例如在上述的例子中我们就可以看到关于btnMsg按钮的点击事件中的语句是写在一个名为btnMsg_onClick( )的过程中,其中btnMsg是按钮的名称,onClick说明了在该按钮点击后所需要响应的代码。我们可以根据这个例子触类旁通,知道凡是带有这样结构命名的Sub过程都是系统指定的消息函数,希望用户自定义的函数不要和该名称冲突。在该过程中,又调用了上述定义的CreateMessageBox过程,当然该语句也可以写成Call CreateMessageBox(MsgInfo),注意,括号不要漏掉。
3.2.2 Function过程
Function过程与Sub过程相类似,也是由一系列VBScript语句所组成,这些语句是以Function语句作为该Funct
展开阅读全文