网站高级编程VbScript与JScript--第3章VBScript语句和过程

上传人:沈*** 文档编号:157954651 上传时间:2022-10-02 格式:DOC 页数:21 大小:142.50KB
收藏 版权申诉 举报 下载
网站高级编程VbScript与JScript--第3章VBScript语句和过程_第1页
第1页 / 共21页
网站高级编程VbScript与JScript--第3章VBScript语句和过程_第2页
第2页 / 共21页
网站高级编程VbScript与JScript--第3章VBScript语句和过程_第3页
第3页 / 共21页
资源描述:

《网站高级编程VbScript与JScript--第3章VBScript语句和过程》由会员分享,可在线阅读,更多相关《网站高级编程VbScript与JScript--第3章VBScript语句和过程(21页珍藏版)》请在装配图网上搜索。

1、第3章 VBScript语句和过程前面的章节中已经详细地介绍了有关VBScript语句的数据类型、常量、变量,但是,仅仅了解这些知识还是远远不够的,也无法完成符合用户需求的页面。所以,在这一章节中我们将进一步学习VBScript的知识,主要包括VBScript的一些基本语句,如选择语句和循环语句等,以及在VBScript中使用过程的具体方法等。学习这些知识也有助于读者加深对不同程序结构的理解。3.1 VBScript语句中的基本语句对于一般程序,有三类基本的程序结构可以控制程序的流程:顺序结构,分支结构和循环结构。顺序结构的流程是按照事务完成的先后次序依次执行语句,而且总是在完成前一句语句之后

2、再执行后一句语句,并且执行过的语句不再执行,这就与分支结构和循环结构有所区别。分支结构相当于在实际生活中,我们对于判断进行选择一样,如果出现某些情况,我们将会如何做,如果不出现这些情况,我们将作如何打算。但是在程序中,分支结构并不一定只有“是”或“否”这两种选择,也可以存在多种选择的结构。循环结构是对于某一些语句进行反复执行,循环语句结束的关键往往是:当符合某些条件,或不符合某些条件,或在重复执行一定次数之后。一般而言,任何程序总是同时包含这三种结构来对程序的流程进行控制。在VBScript语句中,顺序结构最简单,一般不需要程序进行什么控制;分支结构可以使用选择语句来实现;循环结构可以使用循环

3、语句来实现。在下文中将具体介绍选择语句和循环语句。需要指出的是,在许多结构化语言中,一般来说不提供Goto语句直接在程序中跳转,因为这将会极大地损害程序的可读性,另外有一些结构化语言虽然提供了Goto语句,但是不建议使用这条语句,而是建议使用Break、Continue等跳转语句来代替,这些语句和Goto语句不同之处就在于,Goto语句是任意跳转的,而Break、Continue语句并不能任意跳转,只是实现了循环的中断退出功能。VBScript也不支持Goto语句,但在VBScript中,提供了Exit语句和On Error语句来实现程序流程的跳转。3.1.1 选择语句在VBScript中,有

4、两种条件语句:IfThenElse语句和SelectCase语句(表3.1),这两种条件语句执行的时候,先对条件进行判断,然后根据条件执行相应的脚本。IfThenElse语句只会形成两重分支,如果条件满足,执行其中的一个分支,如果条件不满足,则执行其中的另外一个分支。SelectCase语句会形成多重分支,根据条件的结果选择其中相应的分支执行。表3.1 VBScript语句中的分支语句If.Then.Else语句二值分支语句Select Case语句多值分支语句3.1.1.1 使用If.Then.Else语句VBScript中最常用的条件语句就是IfThenElse语句,一般IfThenEls

5、e语句用来检查一个布尔条件,然后根据结果为True或者False执行相应的脚本,如果为True,则执行Then后面的脚本,如果为False,则执行Else后面的脚本。IfThenElse语句有两种形式:单行形式和多行形式(也称块形式),单行形式中整条语句都需要在一行中完成,其中也包括条件和判断后执行的脚本,其语法如下所示:If condition Then statements Else elsestatements多行形式的语法如下所示:If condition Then statementsElse elsestatementsEnd If其中,condition是测试条件,stateme

6、nts是条件为True的情况下所执行的脚本,elsestatements是条件为False的情况下所执行的脚本,如果条件为Null,那么执行的脚本仍然是elsestatements。通常情况下,测试条件是使用比较运算符对值或变量进行比较的表达式。在这两种语法中,Else都是可选的,如果没有Else,则表明如果判断条件为True,执行Then后面的脚本,如果条件为False,则不执行任何脚本。注意:在多行形式中,语句结束的最后一行中有一句End If,而单行形式则不需要。对于比较短小而简单的测试,我们可以使用单行形式。例如,如果学生成绩大于60分,则判定成绩为Pass,否则判定其成绩为Fail,

7、如以下脚本所示:If Score = 60 Then Status = “Pass” Else Status = “Fail”不过,在编写脚本的过程中,多行形式比单行形式的结构化更强,更加容易阅读、维护和调试。对于上面单行形式的语句,我们可以改写为多行形式如下:If Score = 60 Then Status = “Pass”Else Status = “Fail”End If在VBScript中,还可以扩展IfThenElse语句的功能,通过添加ElseIf子句,我们可以对多个条件进行判断和分支选择,其语法如下所示:If condition Then statementsElseIf co

8、nditin-n Then elseifstatementsElse elsestatementsEnd If在条件语句中,如果条件是True时要执行多个语句,条件是False时也需要执行多个语句的时候,则就可以使用If.Then.Else语句来定义两个语句块:在Then后面的语句块在条件是True时被执行;在Else后面的语句块在条件是False时被执行。Dim nTemp1, nTemp2Dim nBigValue, nSmallValuenTemp1 = CDbl ( InputBox ( “请输入第一个数值:” ) )nTemp2 = CDbl ( InputBox ( “请输入第二个

9、数值:” ) )If ( nTemp1 nTemp2 ) ThennBigValue = nTemp1nSmallValue = nTemp2ElsenBigValue = nTemp2nSmallValue = nTemp1End If有时候,单个条件语句并不能满足在多种选择中做決定,所以用户要采用If.Then.Else 语句的变形,从多种选择中选取一种选择。这种变形形式是在原来的条件语句上加上ElseIf子句,以扩充其原有的功能,这样能让用户的程序有多种不同的流程,方便了对于程序代码行的控制。举例如下:Sub ReportValue(value) If value = 0 Then Ms

10、gBox 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语句,而不使用IfThenElse语句,尽管后者也完全能够实现这些功

11、能。Select Case语句的功能就是根据表达式的值执行几组脚本当中的一组。其语法如下所示:Select Case testexpression Case expressionlist statements Case Else expressionlist elsestatementsEnd Select其中,testexpression是语句的判断条件,可以是任何数值或者字符串表达式,expressionlist则是可能出现的表达式的值,statements和elsestatements是根据表达式结果执行的脚本。如果testexpression的表达式结果和某一个Case子句中列举的值相

12、符合,那么则执行这一个Case子句和下一个Case子句之间的脚本,如果和任何列举出的值都不符合,则执行Case Else子句和End Select之间的脚本,如果再没有Case Else语句,那么将会直接执行End Select之后的脚本。如果表达式的结果和多个Case子句中的值相符合,则只会执行第一个匹配后的语句。其实,Select Case语句提供了除了 If.Then.ElseIf 以外的另外一种条件语句的形式,可允许用户从多个语句块中作出一个选择,并执行相应的语句。Select Case 语句提供的功能和 If.Then.Else 语句类似,但它可使整个程序代码行执行起来更加的有效率,

13、而且也提高了程序的可读性。Select Case语句在其前端,即Select Case子句后有一个测试运算式,这个运算式只会被执行一次。执行完后的结果将被用来和每一个 Case子句的值作比较。如果有相符的情况时,这个Case 子句后的语句块就将被执行,注意下面这个例子:Select Case Document.Form1.CardType.Options(SelectedIndex).Text Case MasterCard DisplayMCLogo ValidateMCAccount Case Visa DisplayVisaLogo ValidateVisaAccount Case Am

14、erican Express DisplayAMEXCOLogo ValidateAMEXCOAccount Case Else DisplayUnknownImage PromptAgainEnd Select从上面的程序中可以注意到Select Case 语句只在前端执行一个运算式。而与此相反的是,If.Then.ElseIf条件语句则可在每一个ElseIf语句后面加上一个不同的比较运算式。对于这种格式的语句,只有在每一个ElseIf语句使用的都是同一个运算式时,才能用Select Case语句来取代If.Then.ElseIf语句。与If语句相同,Select Case语句也可以嵌套,只

15、是对于每一层嵌套的Select Case语句中必须有与其相对应的End Select语句。3.1.2 循环语句使用循环语句可以反复执行某段脚本,直到满足循环结束条件后才停止。如表3.2所示,在VBScript中,提供了四种循环语句:ForNext语句、DoLoop语句、WhileWend语句和For EachNext语句。在这四种循环语句中,For EachNext语句是比较特殊的一种,它不是指定循环的次数、也没有指定循环的结束条件,而是提供了枚举集合中元素的一种方法。运用循环语句,可以极大地方便我们开发脚本的工作。表3.2 VBScript语句中的循环语句Do.Loop当条件是 True 时

16、执行循环,也可以是执行到条件为 True 时,停止循环。While.Wend当条件是 True 就执行循环。For.Next使用一个计数器,让语句重复执行某个固定的次数。For Each.Next对每个集合对象中的项目或数组中的元素重复执行一次循环。3.1.2.1 ForNext语句ForNext语句在循环的过程中,可以指定循环运行的次数,当到达循环运行次数之后,退出循环。其语法如下所示:For counter = start To end Step stepsize statementsNext其中,counter是用作循环计数器的数值变量,start是循环变量的初值,end是循环变量的终值

17、,stepsize是循环变量的步长,在默认条件下stepsize=1,statements是循环内反复执行的脚本。在执行ForNext语句有以下几个步骤:1. 将初值赋给循环变量,即执行counter=start;2. 判断循环条件,如果循环步长大于等于0,则循环条件是counter=end,如果循环条件为True,则执行循环中的语句,如果循环条件为False,则跳出循环;3. 执行循环代码,再将步长累加到循环计数器上,即执行counter=counter+stepsize,然后返回步骤2判断循环条件。举个例子。下面的程序会计算从1到50所有数值相乘的结果。这个For语句指定了一个计数器I,同

18、时指定了该计数器的起始值和结束值。Next语句会使计数器的值在每次循环执行时自动递增1。使用Visual Basic的编程人员注意,在VB语句中的For语句在Next语句之后必须跟有作为计数器的变量,而在VBScript语句中,该变量不必再写了。Dim I, nResultnResult = 1For I = 1 To 50nResult = nResult * INextMsgBox “结果为:” & nResult使用Step关键字,用户就可以随自己的需要来递增或是递减计数器变量。在下面的例子中,计数器变量j会在每次循环执行后递增2。当循环执行完时,变量nResult將是2、4、6、8和1

19、0的总和。Dim j, nResultnResult = 0For j = 2 To 10 Step 2total = total + jNextMsgBox “结果为:” & nResult如果用户要使计数器变量递减时,则可以使用负的Step值。此时,结束值必须小于起始值。在下面例子中,计数器变量myNum会在每次循环执行过后递减2。当这个循环结束时,变量total的值将会是16、14、12、10、8、6、4和2的总和。Dim nStep nResultnResult = 0For nStep = 16 To 2 Step -2nResult = nResult + nStepNextMsg

20、Box “结果为:” & nResult用户可以使用Exit For语句在计数器到达其结束值之前跳离For.Next语句。因为通常用户只会希望在某些特定的情形发生时,才要跳离循环,比如像发生了错误时。所以用户应该把Exit Do语句放在If.Then.Else语句的Then子句之后的语句中。当条件是False时,循环就会照常执行。需要指出的是,VBScript和Visual Basic的Next语句在使用上有所不同,Visual Basic中,Next语句后一般要求一个循环变量,但在VBScript中,Next语句后不要求循环变量,如果后面有循环变量,反而会导致错误的出现。一般情况下,我们不建

21、议在循环执行的过程中,使用语句改变循环计数器的值,因为这样会使得脚本的可读性变差,代码的调试和维护工作都会变得困难得多。在循环中,我们还可以使用循环嵌套,不过循环嵌套的过程中,要求各重循环计数器的变量不同,例如:For I = 1 To 10 For J = 1 To 10 NextNext3.1.2.2 DoLoop语句DoLoop语句和ForNext语句有所不同,ForNext语句中,循环执行的次数是确定的,而DoLoop中,循环执行的次数则往往是不确定的,如果循环条件为True或者循环条件变为True,循环将会一直执行。DoLoop语句有两种形式:Do While/UntilLoop和D

22、oLoop While/Until。我们先来看第一种形式。Do While/UntilLoop的语法如下所示:Do While|Until condition statementsLoop其中,condition是循环执行条件,statements是循环内反复执行的脚本。Do While/UntilLoop循环的执行步骤如下所示:1. 如果是Do WhileLoop循环,则判断condition是否满足,如果满足,则进入步骤2执行循环内脚本,否则跳出循环;如果是Do UntilLoop循环,则判断condition是否不满足,如果不满足,则进入步骤2执行循环内脚本,如果满足condition,

23、则跳出循环;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 = m

24、yNum - 1 counter = counter + 1 Loop MsgBox The loop made & counter & repetitions.End SubSub 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,再执行这段脚本,我们则会

25、发现执行结果不一样了。这是由于Do UntilLoop中,在执行循环内代码前先判断循环条件是否不满足,只有在不满足的情况下,Do UntilLoop才会执行循环内脚本,而如果满足,则循环内代码一次也不会执行。在Do.Loop语句中,用户有两种方法来使用Until关键字检查条件。用户可以在进入循环前先检查条件,或在循环至少执行过一次后再检查(如下面的ChkLastUntil例子)。只要在条件是False时,循环就会执行。Sub ChkFirstUntil( ) Dim counter, myNum counter = 0 myNum = 20 Do Until myNum = 10 myNum

26、= myNum - 1 counter = counter + 1 Loop MsgBox The loop made & counter & repetitons.End SubSub 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我们再来看第二种形式。DoLoop While/Until的语法如

27、下所示:Do statementsLoop While|Until condition其中,condition是循环执行条件,statements是循环内反复执行的脚本。DoLoop While/Until循环的执行步骤如下所示:1. 执行循环中脚本;2. 对于DoLoop While循环,则判断condition是否满足,如果满足,返回步骤1执行循环内脚本,否则跳出循环;如果是DoLoop Until循环,则判断condition是否不满足,如果不满足,则返回步骤1执行循环内脚本,如果满足condition,则跳出循环。如果我们将上述脚本中的While改为Until,再执行这些脚本,我们就会

28、发现结果和Do UntilLoop的结果有所不同。这是由于在DoLoop Until循环中,首先将执行一次循环内脚本,然后再对循环条件进行判断,这也就是说,不论循环条件如何设定,DoLoop While/Until循环都将至少执行一次循环内的脚本。注意,在DoLoop循环中一定要有改变循环条件中变量的语句,否则,很有可能会陷入死循环而不能终止。就技术上来说,用户可以在Do.Loop中使用Exit Do语句来跳离循环。因为通常用户只会希望在某些特定的情形发生时,才需要跳离循环语句,比如像要避免死循环时,用户应该把Exit Do语句放在If.Then.Else语句的Then之后的语句块中。当条件是

29、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

30、 & repetitions.End Sub3.1.2.3 WhileWend语句WhileWend语句和DoLoop语句十分类似,但不如DoLoop语句那样灵活,在WhileWend语句中,如果条件为True,则执行循环内脚本。其语法如下所示:While condition statementsWend其中,conditin是循环执行条件,statements是循环内执行的脚本。WhileWend语句的执行步骤如下所示:1. 判断condition是否为True,如果为True,则进入步骤2执行循环内脚本,如果为False或者为Null,则跳出循环;2. 执行循环中脚本,然后返回步骤1。与D

31、o Loop语句不同的是,While循环语句没有任何可以跳离循环的语句,用户不能想当然地使用Exit While语句。不过,和DoLoop语句比较而言,WhileWend语句的灵活性要差一些,脚本的清晰程度则是相同的,所以我们建议,在同样的情况下,还是使用DoLoop语句。3.1.2.4 For EachNext语句For EachNext语句和上述三个循环语句都有所不同,它既不指定循环执行的次数,也不指定循环结束条件,而是对数组和集合中的元素进行枚举,当枚举结束之后才会退出循环。其语法如下所示:For Each element In group statementsNext其中,group是

32、我们进行枚举的数组或者集合,element是枚举变量的名称,statements是对于每个元素都会执行的循环脚本。For Each.Next和For.Next循环非常相似。它们的不同之处在于,For Each.Next循环是针对集合对象中的每一个对象或数组中的每一个元素重复执行一次循环,而ForEach.Next循环语句是依指定的数字重复执行循环的次数。当用户不知道集合对象中有几个元素时,For Each.Next循环语句将会特別的有用。在下面的HTML程序范例中,Dictionary对象的功能是要将文字放到数个文本框中:简单例子FORM NAME=Form3.1.2.5 Exit语句在结构化

33、程序设计的过程中,Goto语句的取消可以极大地增强程序的可读性,便于程序的阅读与维护,不过,也不可避免带来了一些不足之处。在某些循环嵌套的程序中,在合适的地方使用Goto语句能够使程序显得简洁明了,并且代码效率高,在禁止使用Goto语句的场合中,虽然不使用Goto语句也完全能够实现同样的功能,但是却使得程序的可读性和代码效率形成了一种矛盾,要么追求代码的高效率而使得程序晦涩难懂,要么追求程序结构清晰而降低了代码的效率。所以在C语言中提供了break、continue、Exit等半结构化语句,这些语句能够实现一定的跳转功能,保持代码的高效,也能够使得程序保持较强的可读性。在VBScript中也提

34、供了类似的语句,使用Exit语句能够停止程序当前正在执行的逻辑,退出循环或者当前过程。它能够退出DoLoop、ForNext循环,也能够退出Function和Sub的过程处理,关于Function定义的函数和Sub定义的过程,我们会在下一节中介绍。Exit语句有以下四种语法形式:1. Exit Do:提供了一种退出DoLoop循环的方法,Exit Do只能在DoLoop语句中使用,执行Exit Do语句之后将控制权转移到Loop语句之后。2. Exit For:提供了一种退出For循环的方法,Exit For语句只能在ForNext语句或者For EachNext循环中使用,执行Exit Fo

35、r语句之后将控制权转移到Next语句之后。3. Exit Function:执行Exit Function语句之后退出当前函数。4. Exit Sub:执行Exit Sub语句之后退出当前过程。例如,我们可以使用Exit Do语句实现一个死循环中的退出,在下面的脚本中,当循环计数器大于10之后,退出循环处理,而循环本身并不具备结束循环的功能:counter = 0Do While True counter = counter + 1 If counter 10 Then Exit DoLoop当然上面的脚本完全不需要使用Exit Do语句,但是在许多场合中,使用Exit语句之后能够显著提高脚本

36、的执行效率。3.2 VBScript语句中的过程掌握了一些基本概念后,程序设计和编制就变成了一个不断重复的过程。用户需要多次重复某些步骤,或是某些语句来完成某一所需处理的任务。出于程序的可读性、可调试性和简单性的考虑,在实际的编程过程中,我们会将这些用于实现某一特定功能,而且相对集中的语句放在一个子程序中,称为过程。在过程中的语句一般和其他过程中的语句,或和主程序(相对于子程序而言)中语句没有什么直接联系。在VBScript中,过程被分为两类:Sub过程和Function过程。前面的举例程序中我们已经接触过这两个过程,但我们没有展开介绍。下面就具体谈谈这两种类型的过程。3.2.1 Sub过程S

37、ub过程是由一些功能实现相对集中的VBScript语句组成。这些语句以Sub语句作为过程的开头,以End Sub语句作为其结束。这些语句被执行操作时并不返回任何数值,这一点和后面所谈到的Function过程有本质的区别,所以有些书上也将Sub过程称为子程序。Sub过程可以使用参数(由调用过程的主程序将所需的常量、变量或表达式传递给过程)。如果Sub过程无任何参数,则Sub语句必须包含空括号( ),该括号不能省略。比如我们希望写一段程序,用于弹出一个对话框,并在对话框上显示一段提示信息。在这个程序中,关于对话框的实现在程序的任何地方都是一致的,所不同的是相应的提示信息。我们可以写一段Sub过程,

38、来处理这一特定的功能。在这段程序中,CreateMessageBox是过程名称,strInfo是参数,整个过程包含在Sub和End Sub之中。该过程相当简单,只有三行语句。第一句定义了一个变量strComplete,该变量将用于对话框上的提示信息;第二句是根据参数的内容组织成一个完整的提示信息,并将该值赋给变量strComplete;第三句是将该信息用对话框的形式来提供给用户。以后用户在程序中的任何地方只要写:CreateMessageBox “Hello, World”或者Call CreateMessageBox (“Hello, World”)即可调用该过程。对于通过值传递的参数,在调

39、用过程的时候,VBScript会在过程内部暂时建立一个变量,并将参数值复制给这个变量,这样就可以把过程外部的数值传递到过程内部中,不过这个变量只是在过程内部有效的,在脚本中改变变量的值的时候,并不会对参数造成任何影响,当脚本结束过程调用的时候,这个变量将被删除。而对于通过地址传递的参数,在调用过程的时候,VBScript将参数的地址传递到过程中去,过程中的变量名称实际是对于这一块地址的引用,当过程中变量的值发生变化的时候,也就意味着该地址中的数据发生了变化。在脚本中调用过程有两种方法:一种是使用Call语句的显式调用,另外一种是不使用Call语句的隐式调用。这两种调用方法的效果其实是一样的,隐

40、式调用的时候,只需要在脚本中输入过程的名称和参数的名称就可以了,参数之间用逗号进行分隔,而在显式调用的时候,必须在过程名称之后加上括号,并且使得参数包含在括号中,即:CreateMessageBox “Hello, World”Call CreateMessageBox (“Hello, World”)上面的两条语句中,前面一条语句是过程的显式调用,后面是隐式调用。在过程执行的时候,如果希望满足某种条件后直接退出过程的处理逻辑,返回主程序,我们可以使用Exit Sub语句,执行Exit Sub语句,脚本的执行将立即从过程中退出,这样可以极大地方便我们脚本的编写,提高程序的灵活性。在Window

41、s操作系统中,由于采取的是一种使用消息机制来驱动程序,所以我们往往将一些对于消息或是事件的处理语句作为一个Sub过程。关于消息机制和事件驱动的概念由于不是本书的内容,这里不再赘述。如果需要了解这方面内容,可以参阅有关Windows编程的书籍。在这里我们只需要知道触发某一事件之后的代码写在哪个Sub过程中即可。请看下面这个例子。我们要放置一个按钮,按下这个按钮之后将会弹出一个对话框。这是一个简单的程序,但这个程序反映了如何使用控件和Sub过程。我们首先要在页面上放置一个按钮,代码如下:该语句定义了一个按钮,该按钮的名字为btnMsg,按钮上的文字为“提示信息”。这段语句是用于在按下按钮之后所需要

42、执行的代码。由于在VBScript中不像MFC中对于任何的Windows消息有相应的消息映射,而是简化成了一些直观的过程。这些过程往往在名称上就直接反映了其与各类消息之间的联系。例如在上述的例子中我们就可以看到关于btnMsg按钮的点击事件中的语句是写在一个名为btnMsg_onClick( )的过程中,其中btnMsg是按钮的名称,onClick说明了在该按钮点击后所需要响应的代码。我们可以根据这个例子触类旁通,知道凡是带有这样结构命名的Sub过程都是系统指定的消息函数,希望用户自定义的函数不要和该名称冲突。在该过程中,又调用了上述定义的CreateMessageBox过程,当然该语句也可以

43、写成Call CreateMessageBox(MsgInfo),注意,括号不要漏掉。3.2.2 Function过程Function过程与Sub过程相类似,也是由一系列VBScript语句所组成,这些语句是以Function语句作为该Function过程的开头标记,以End Function语句作为结束。Function过程在操作执行结束后,可以返回值,这一点和Sub过程相区别,所以有的书上将Function过程称为函数,以与子程序相对应。在本书中,仍然称作Sub过程和Function过程。Function过程可以使用参数(由调用过程的主程序将过程所需要的常量、变量或表达式传递给过程)。如果

44、Function过程无任何参数,则Function语句必须包含空括号( )。Function过程通过函数名返回一个值,这个值是在过程的语句中赋给函数名的。Function返回值的数据类型总是Variant。这一点和其他的程序中所定义的函数返回类型所不同。调用Function过程时,函数名必须用在变量赋值语句的右端或表达式中。这里有一个简单的例子,但基本上反映了Function过程的使用情况:最后对于Function过程要说明的是,Function过程的返回值是直接对于该过程名称进行赋值,而不是像其他语言中使用Return语句。3.2.3 参数说明关于过程引用的参数,这里还需要说明的是,参数作为

45、主程序和过程之间进行数据通信的途径和手段而存在。参数名可以是任何有效的变量名。使用Sub语句或Function语句创建过程时,过程名之后必须紧跟括号。括号中包含所有参数,参数间用逗号分隔。要从过程中获取数据,必须使用Function过程。请记住,Function过程可以返回值;Sub过程不返回值。但是如果我们要求一个过程返回多个数值的时候,只依靠Function过程返回的一个数值是远远不够的,在这种情况下,有些C+编程人员会使用指针参数来解决这个问题,而在VBScript语句中,并没有指针类型这个概念,但我们依然可以使用相类似的方法来解决这个问题。这时候我们只需要在过程的参数前面加上ByRef

46、的关键字,该参数如果在过程中被修改,在主程序中相对应的变量的值也将被修改;如果在参数前面什么也不加,或是加上ByVal,即使该参数在过程中被改变,也不会影响到主程序中的变量。这是因为ByRef是将变量的引用传递给过程,这样主程序和过程中调用的是同一个变量;而使用ByVal或则什么也不使用,则是将主程序中的变量的副本传递给过程,这样在过程中,该参数即使改变,也只是改变这个变量的副本,在过程结束后,这个副本将随之一起消失,那么其对于主程序的变量而言是没有一点影响的。这样我们可以使用ByRef关键字来进行主程序和过程之间多个数值的传递。看一下下面这个例子,这个例子中我们需要写一个函数,该函数是要将两

47、个数值进行相加,然后对于每个相加的加数进行自增运算。如果不使用ByRef关键字,我们是无法在一个函数中同时返回三个数值的。由于AddSum函数中使用了在每个加数前都使用了ByRef关键字,所以该加数在AddSum函数中修改其值,将直接影响到主程序中a和b的值。完整的程序如下:数值1 = 数值2 = 总和 = 该程序中的FillterNum函数是一个用于处理文本框中输入信息,约束该信息必须为数值信息,否则作为0处理。该程序中使用浏览器打开,将会出现三个文本框和一个按钮。在第一和第二个文本框中填入数值,按下按钮,在第三个文本框中将会出现上面两个文本框的数值之和,而第一和第二个文本框中的数值也会进行

48、自增操作。如果用户有兴趣,可以将AddSum函数中参数前的ByRef该为ByVal,或是干脆去掉,再看一下效果,就会对上述文字有进一步的了解。3.2.4 相关语句的语法在本章节中使用到一些语句,这些语句主要用于过程的调用和定义。3.2.4.1 Call语句调用Sub过程时,可以使用Call语句。在调用过程时,不必使用Call关键字。然而,如果使用Call关键字调用要求参数的过程,则必须用括号将argumentlist括起来。如果省略Call关键字,那么必须也同时省略argumentlist参数两边的括号。使用Call语法调用内部函数或使用用户自定义函数,函数返回值都会被放弃。Call 语句的语

49、法:Call name argumentlist各组成部分的解释见表3.3。表3.3 Call 语句语法的组成部分:组成部分描述Call可选关键字。如果指定此关键字,则必须用括号把 argumentlist 括起来。Name必选。要调用的过程名。Argumentlist可选。传递给过程的变量、数组或表达式列表,用逗号分隔每一项。3.2.4.2 Function语句该语句用于声明Function过程的名称、参数以及构成其主体的代码。如果在该语句中没有明确指定使用Public或Private,则Function过程默认为公用,即它们对于Script中的所有其他过程是可见和可用的。Function中

50、局部变量的值在对过程的调用中不被保留。此外,所有可执行的代码必须包含于过程中,用户不能在另一个Function或Sub过程中定义Function过程。使用Exit Function语句可以从Function过程中立即退出,而程序将继续执行调用Function过程的语句之后的语句。用户可在Function过程的任何位置出现任意个Exit Function语句。与Sub过程类似,Function过程是可以获取参数、执行一系列语句并改变其参数值的独立过程。与Sub过程的不同之处是:当要使用由函数返回的值时,可以在表达式的右边使用Function过程,这与内部函数的使用方式一样,例如Sqr、Cos或C

51、hr。在表达式中,可以通过使用函数名,并在其后用圆括号给出相应的参数列表来调用Function过程。有关调用Function过程的详细信息,请参阅Call语句。需要注意的是,Function过程可以是递归的,即该过程可以调用自身以完成某个给定的任务。但是,递归可能会导致堆栈溢出。如要从函数返回一个值,则将值赋给函数名即可。在过程的任意位置都可以出现任意个这样的赋值。如果没有给name赋值,则过程将返回一个默认值:数值函数返回0,字符串函数返回零长度字符串( )。如果在Function中没有对象引用被指定给name(使用Set),则返回对象引用的函数将返回Nothing。在Function过程中

52、使用的变量分为两类:一类是在过程内显式声明的,另一类则不是。在过程内显式声明的变量(使用Dim或等效方法)总是过程的局部变量。被使用但没有在过程中显式声明的变量也是局部变量,除非在该过程外更高级别的位置显式声明它们。过程可以使用没有在过程内显式声明的变量,但如果在Script级中任何定义的名称与之相同,则会发生名称冲突。如果过程中使用的未声明的变量与另一个过程、常量或变量的名称相同,则会认为过程使用的是Script级的名称。显式声明变量可以避免这类冲突。可以使用Option Explicit语句来强制显式声明变量。VBScript可能会重新排列数学表达式以提高内部效率。当Function过程修

53、改数学表达式中变量的值时,应避免在同一表达式中使用该函数。Function语句的语法:Public | Private Function name (arglist)statementsname = expressionExit Function statementsname = expressionEnd FunctionFunction 语句的语法包含表3.4所示的各部分。表3.4 Function 语句的语法组成组成部分说明Public表示Function过程可被所有Script中的所有其他过程访问。Private表示Function过程只可被声明它的Script中的其他过程访问。NameFunction的名称,遵循标准的变量命名约定。Arglist代表调用时要传递给Function过程的参数的变量列表。用逗号隔开多个变量。Statements在Function过程的主体中执行的任意语句组。ExpressionFunction的返回值。arglist参数包含下列语法和部分(表3.5):ByVal | ByRef varname( )表3.5 arglist语法的组成部分组成部分说 明ByVal表示该参数按值传递。ByRef表示该参数按引用传递。Varname代表参数变量的名称;遵循标准的变量命名约定。3.2.4.3 Sub语句该语句用于声明Sub过程的名称、参数以及构

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!