3.1 VBScript语言简介 VBScript是Visual Basic Script的简称,即 Visual Basic 脚本语言,有时也被缩写为VBS。是asp动态网页默认的编程语言,配合asp内建对象和ADO对象,用户很快就能掌握访问数据库的asp动态网页开发技术。 VBScript是微软开发的一种脚本语言,可以看作是VB语言的简化版,目前这种语言广泛应用于网页和ASP程序制作,它不能生成可执行程序,只能嵌入HTML或者其他类型的中。 在HTML中,使用Vbscript的方法如下: Program【3-1】 </SCRIPT LANGUAGE=”language” [EVENT=”event”] [FOR=“object”]> <! - - Scripting code - - > </SCRIPT> 格式中包括3个属性,其含义如下: l LANGUAGE:指定脚本代码所用的脚本编写语言。不同的浏览器所用的脚本语言是不一样的,对于Internet Explorer浏览器来说,可以使用的脚本语言有两种,即VBScript和JavaScript语言。而对于NetScape浏览器来说,目前VBScript还不能使用。 HTML不能直接运行脚本语言程序,只能通过解释器执行,LANGUAGE属性告诉HTML调用哪一个解释器。在用户建立的VBScript应用程序中,HTML调用驻留在Internet Explorer中的VBScript解释器。 l EVENT:指定与该脚本部分相关联的事情。 l FOR:指定与事件相关联的对象。 除了上面的属性外,脚本部分还含有注释标记<! - - 和 - - > ,这个标记不是必需的。但一般应该加上。因为有了这个标记后,脚本代码就可以不被那些不支持脚本的浏览器显示。 Script程序段可以出现在HTML页面的任何部分,但是为了便于集中管理VBScript代码,最好将其放在head部分,在页面中调用。 通常在HTML页面加载到客户端浏览器时,<script>标记块中的脚本代码首先执行。如上面例子中如果添加的script语句为标注中的语句,程序执行时就会弹出对话框。 但是,如果脚本代码被放置在函数或者过程中,并且没有被调用,则脚本代码不会执行。 Program【3-2】: <html> <head> <script language="vbscript"> <!-- sub btn_clk() Msgbox "用户单击了按钮!" end sub --> </script> <title>单击按钮时执行</title> </head> <body> <input type="button" name="button1" value="手式调用vbscript代码" onclick="btn_clk"> </body> 3.2 数据类型和运算符 3.2.1 数据类型 在VBScript中,只有一种数据类型,即变体(Variant)类型,但它包含了多种基本数据类型,这些基本数据类型称为子类型。变体类型的子类型包括: (1)Sting(字符串):一个字符序列,由ASCII字符组成,包括标准的ASCII字符和扩展ASCII字符。在VBScript中,字符串是放在双引号内的若干个字符,其中长度为0(不包含任何字符)的字符串称为空字符串。 字符串通常放在引号中,例如: "hello" "We are students" ""(空字符串) VBScript中字符串的长度是不确定的,可以从0到2^31个字符。 (2)Empty(空类型):声明一个变量后,如果还没有初始化,则改变量的值为Empty。这个值是自动分配的,当变量的子类型为数值时,其值为0;而对于字符串变量,其值为0长度的字符串。 Variant变量在被赋值前为空值(内部表示为Empty或0),它不同于数值0,不同于空字符串(""),也不同于Null(见下)。 当一个Variant变量为空值时,可以用在表达式中,VBScript将根据具体情况将其解释为数值0或空字符串。如果将其一个空值Variant变量赋给一个非空值Variant变量,则使后者变为空值。 一旦Variant变量被赋值,空值即不复存在。 (3)Null(空值):可以把该值赋给一个变量,使该变量不包含任何有效数据。 (4)Byte(字节):以1个字节的无符号二进制数存储,其取值范围为0到255。 (5)Boolean(布尔):是一个逻辑值,用两个字节存储,它只取两种值,即True或False。 (6)Integer(整型数):用两个字节存储。取值范围为-32768到32767。 (7)Date(日期):格式:mm/dd/yyyy或者mm-dd-yyyy。 (8)Time(时间):格式:hh:mm:ss,例如:14:44:55。 (9)Object(对象):对象型数据用来表示图形或OLE对象或其它对象。 (10)Error(错误):保存由VBScript产生的错误代码。 其它还有:Long(长整数)、Single(单精度数)、Double(双精度数)等。 3.2.2 运算符 运算(即操作)是对数据的加工。最基本的运算形式常常可以用一些简洁的符号来描述,这些符号称为运算符或操作符。被运算的对象,即数据,称为运算量或操作数。由运算符和运算量组成的表达式描述了对哪些数据、以何种顺序进行什么样的操作。运算量可以是常量,也可以是变量,还可以是函数。例如:A+3,T+Sin(a),X=A+B,PI*r*r等都是表达式,单个变量或常量也可以看成是表达式。 VBScript提供了丰富的运算符,可以构成多种表达式。 (一)算术运算符
算术运算符是常用的运算符,用来执行简单的算术运算。VBScript提供了9个算术运算符,表5.1按优先级(从高到低)列出了这些算术运算符。 表5.1 VBScript 算术运算符
在9个算术运算符中,除取负(-)是单目运算符外,其它均为双目运算符(需要两个运算量)。加(+)、减(-)、乘(*)、取负(-)等几个运算符的含义与数学中基本相同。 (二)关系运算符
关系运算符也称比较运算符,用来对两个表达式的值进行比较,比较的结果是一个逻辑值,即真(True)或假(False)。VBScript提供了6个关系运算符,见表5.3(优先级从高到低)。 表5.3 关系运算符
用关系运算符连接两个算术表达式所组成的式子叫做关系表达式。关系表达式的结果是一个Boolean类型的值,即True和False。VBScript把任何非0的值都认为是“真”,但一般以-1表示真,以0表示假。 用关系运算符既可以进行数值的比较,也可以进行字符串的比较。数值比较通常是对两个算术表达式的比较。例如: X+Y<(T-1)/2 如果X+Y的值小于(T-1)/2的值,则上述表达式的值为True,否则为False。 在应用程序中,关系运算的结果通常作为判断用,例如: X=100 If X<>200 Then MsgBox "Not equal" Else MsgBox "equal" 由于X不等于100,关系运算的结果为真,执行Then后面的操作,输出“Not equal”。 (三)逻辑运算符
逻辑运算也称布尔运算。用逻辑运算符连接两个或多个关系式,组成一个布尔表达式。VBScript的逻辑运算符有以下六种: (1) Not(非) 由真变假或由假变真,进行“取反”运算。例如: 3>9 其值为False,而 Not(3>9) 的值为True。 (2) And(与) 对两个关系表达式的值进行比较,如果两个表达式的值均为True,结果才为True,否则为False。例如: (3>8)And(5<6)结果为False (3) Or(或) 对两个表达式进行比较,如果其中一个表达式的值为True,结果就为True,只有两个表达式的值均为False时,结果才为False。例如: (3>8) Or (5<6) 结果为True (4) Xor(异或) 如果两个表达式同时为True或同时为False,则结果为False,否则为True。例如: (8>3)Xor(5<6) 结果为False (5) Eqv(等价) 如果两个表达式同时为True或同时为False,则结果为True。例如: (3>8)Eqv(10>20) 结果为True (6) Imp(蕴含) 当第1个表达式为True,且第2个表达式为False时,结果为False。 表5.4列出了6种逻辑运算的“真值” 表5.4 逻辑运算真值表
和关系运算一样,逻辑运算通常也用来判断程序流程。例如: If Num>=60 And Num<=100 Then …… (四)表达式的执行顺序
一个表达式可能含有多种运算,计算机按一定的顺序对表达式求值。一般顺序如下: 1. 首先进行函数运算(将在下一节介绍函数)。 2. 接着进行算术运算,其次序为: (1)指数(^) (2)取负(-) (3)乘、浮点除(*、/) (4)整除(\) (5)取模(Mod) (6)加、减(+、-) (7)连接(&) 3. 然后进行关系运算(=、>、<、<>、<=、>=)。 4. 最后进行逻辑运算,顺序为: (1)Not (2)And (3)Or (4)Xor (5)Eqr (6)Imp 3.3 常量和变量 前一节中介绍了VBScript中使用的数据类型。在程序中,不同类型的数据既可以以常量的形式出现,也可以以变量的形式出现。常量在程序执行期间其值时不发生变化的,而变量的值时可变的,它代表内存中指定的存储单元。 (一)常量 VBScript中的常量分为两种,一种是文字常量,一种是符号常量。 (1)文字常量 VBScript的文字常量分为两种,即字符串和数值。 1) 字符串常量 字符串常量由字符组成,可以是除双引号和回车符之外的任何ASCII字符。例如: "¥25,000,00" "Number of Employees" 2) 数值常量 数值常量共有三种表示方式,即整型数、长整型数和浮点数。 l 整型数:符合上节规定的数值串,例如:624,-4325等。 l 长整型:其组成和整型数相同,其取值范围为-2147483648到2147483647(4个字节存储),例如:784165423,-88877454等。 l 浮点数:也称实数,分为单精度浮点数和双精度浮点数。例如:235.988E-7,-56564E8等。 (2)符号常量 在VBScript中,通过关键字Const定义符号常量。例如: Const MY.CONST=100 习惯上,常量名一般由大写字幕组成。 例如: const PI=3.14159 Const current_date=”2009-9-19” Const date=#2009-9-18# (二)变量 和其它语言一样,VBScript也用变量来存储数据值。每个变量有一个名字,通过名字来引用一个变量。 (1)命名规则 变量是一个名字,给变量命名时应遵循以下规则: (1) 名字只能由字母、数字和下划线组成; (2) 名字的第一个字母必须是英文字母; (3) 名字的有效字符为255个; (4) 不能用VBScript的保留字(关键字)作变量名,但可以把保留字嵌入变量名中。 VBScript不区分变量名和其他名字中字母的大小写,Hello,HELLO,hello指的都是同一个名字,也就是说,在定义一个变量后,只要字符相同,则不管其大小写是否相同,指的都是这个变量。为了便于阅读,每个单词开头的字母一般用大小写,即大小写混合使用组成变量名(或其它名字),例如PrintText。 (2)变量的声明 在强类型语言(例如 C )中,变量必须先说明,然后才能使用。因为VBScript只有一种数据类型,即变体类型,因此,变量不必声明就可以直接使用。例如: msg="This is a string" 这里的msg是一个变量,没有事先声明而直接使用。这样使用变量比较简单,也可以节省代码,但无法对变量进行跟踪。也就是说,不容易看出一个变量是从什么地方开始的。显式地声明变量是一种良好的编程习惯,同时可以提高代码的可读性。 VBScript中通过Dim语句来声明变量并分配存储空间,其一般格式为: Dim 变量名[,变量名]... 例如: Dim msg 用一个Dim语句可以声明多个变量,例如: Dim msg1,msg2,msg3 (3)变量的作用域 变量的作用域指的是变量的有效范围,即变量的“可见性”。定义了一个变量后,为了能正确地使用变量的值,应当明确可以在程序的什么地方访问改变量。 和其它语言一样,VBScript中的变量也可以分为局部变量和全局变量。其中局部变量是过程层(Procedure-Level)变量,而全局变量是脚本层(Script-Level)变量。 1局部变量在过程(事件过程或通用过程)内定义的变量叫做局部变量,其作用域是它所在的过程,其生存期随着过程的结束而终止。局部变量通常用来存放中间结果或用作临时变量。某一过程的执行只对该过程内的变量产生作用,对其它过程中相同名字的局部变量没有任何关系。 局部变量在过程内用Dim定义,例如: Sub Button1.OnClick() Dim Tempnum … End Sub 2全局变量 从前面的例子可以看出,脚本程序可以含有多个过程,全局变量的作用域是整个脚本部分,包括各个过程。全局变量在脚本的开头声明,而且不能隐式声明。也就是说,全局变量必须先声明后使用。 Program【3-3】:下面通过一个例子说明全局变量和局部变量的作用域。 <HTML> <HEAD> <TITLE>变量作用域</TITLE> <SCRIPT LANGUAGE="VBScript"> <!-- Dim intGlob Const GLOBAL_CONST=3 SUB BUTTON1_OnClick Dim intLocal intLocal=180 intLocal=intLocal*GLOBAL_CONST Alert intLocal intGlob=intLocal End Sub SUB Button2_OnClick Dim intLocalConst intLocalConst=6 intGlob=intGlob/intLocalConst+GLOBAL_CONST Alert intGlob End Sub --> </SCRIPT> </HEAD> <BODY> <CENTER> <INPUT TYPE="Button" NAME="Button1" VALUE="按钮1"> <p> <INPUT TYPE="Button" NAME="Button2" VALUE="按钮2"> </CENTER> </BODY> </HTML> 上述程序在脚本部分声明了一个全局变量intGlob和一个全局变量GLOBAL_CONST,它们的作用域是脚本部分的各个过程。在按钮1的事件过程中,声明了一个局部常量intLocal,其作用域是本事件过程。而在按钮2的事件过程中,声明了一个局部变量intLocalConst,其作用域也是本事件过程。单击按钮1后,将计算局部变量intLocal与全局变量的乘积,并把结果赋給该局部变量,最后把局部变量的值赋給全局变量intGlob,这个值被带到了按钮2的事件过程,并参加运算。 3.4 控制语句 结构化程序的基本结构有三种,即顺序结构、选择结构和循环结构。其中顺序执行程序是最基本的,也是最简单的,在前几节中,已设计和编写了一些简单的程序(如事件过程)。除了个别程序外,这些程序一律为顺序结构,即整个程序按书写顺序依次执行。为此本节将不再讲述顺序结构,而主要介绍选择结构和循环结构。 (一) 选择结构程序设计 在大多数程序中都会包含选择结构。它的作用是,根据指定的条件是否满足,决定从给定的两组操作选择其一。在本小节中将介绍如何用VBScript实现选择结构。 (1)单行结构条件语句 单行条件语句是用If语句来实现的,其格式如下: If 条件 Then 语句1 [Else 语句2] 该语句的功能是:如果“条件”为True,则执行“语句1”,否则执行“语句2”。 If语句中的“Else部分”是可选的,当该项省略时,If语句简化为: If 条件 Then 语句 它的功能时,如果“条件”为True,则执行“语句”,否则执行下一行程序。例如: If X >=Y Then MsgBox "X>=Y" MsgBox"X<Y" 如果X>=Y,则执行MsgBox "X>=Y",否则执行下面的语句,即MsgBox"X<Y"。这里的MsgBox"X<Y"是If语句后面的语句。如果加上Else部分,则上面的语句可以改为: If X >=Y Then MsgBox "X>=Y" Else MsgBox"X<Y" (2)块结构条件语句 块结构条件语句与C、Basic等语言中的条件语句类似,一般格式如下: If 条件1 Then 语句块 1 [Else If 条件2 Then 语句块2] [Else If 条件3 Then 语句块3] …… [Else 语句块n] End If 块结构条件语句的功能是:如果“条件1”为True,则执行“语句块1”;否则如果“条件2”为True,则执行“语句块2”;……否则执行“语句块n”。 Program【3-4】:商店进行促销,购买商品的总价钱超过20打九折;超过50打八五折;超过100打八折;超过150打七五折;超过200打七折。输入总价钱,计算出折后价。 Function price(x) Dim y If x>=20 then y=x*0.9 Else if x>=50 then y=x*0.85 Else if x>=100 then y=x*0.8 Else if x>=150 then y=x*0.75 Else y=x*0.7 End function (3)多分支结构语句 在多分支结构语句中,有很多分支语句,它是块结构形式条件语句的一种变形。它的基本格式如下: Select Case 测试表达式 Case 表达式 1 [语句块1] Case 表达式 2 [语句块2] ...... Case Else [语句块n] End Select 多分支语句以Select Case开头,以End Select结束。其功能是,根据“测试表达式”的值,从多个语句块中选择符合条件的一个语句块执行。下面举个例子。 【例3-4】 从键盘上输入一个0~6的整数,然后输出相应的用中文表示的星期几。如0表示星期日,1表示星期一等。 程序代码如下: <html> <head> <title></title> <script language=vbscript> <!-- Sub Button1_OnClick msg="Enter a number(0-6):" Var=InputBox(msg) Select Case Var case 0 MsgBox"星期日" case 1 MsgBox"星期一" case 2 MsgBox"星期二" case 3 MsgBox"星期三" case 4 MsgBox"星期四" case 5 MsgBox"星期五" case 6 MsgBox"星期六" Case Else MsgBox"必须输入0到6的值" End Select End Sub --> </script> </head> <body> <input id=button1 name=button1 type=button value=Button> </body> </html> 运行上面的程序,在输入框中输入一个0到6的数值,将在信息框中显示出相应的星期几。例如输入4,则结果如图5.9所示。 图5.9 多分支结构语句举例 (二) 循环结构程序设计 循环语句产生一个重复执行的语句序列,直到指定的条件满足为止。VBScript提供了三种不同风格的循环结构,包括:计数循环(For-Next循环)、当循环(While-Wend循环)和Do循环(Do-Loop循环)。其中For-Next循环按规定的次数执行循环体,而While循环和Do循环则是在给定的条件满足时执行循环体。 (1)For循环结构 For循环也称For-Next循环或计数循环。其一般格式如下: For 循环变量=初值 To 终值 [Step 步长] [ 循环体 ] [ Exit For ] Next For循环按指定的次数执行循环体。例如: For x=1 to 100 Step 1 Sum=Sum+x Next 该例从1到100,步长为1,共执行100次Sum=Sum+x。其中x是循环变量,1是初始值,100是终值,Step后面的是步长值,Sum=Sum+x是循环体。下面举一个具体的例子。 【例5.10】 求N!(N为自然数) Sub Button1_OnClick N=InputBox("Enter N:") K=1 For i=1 To N K=K*i Next MsgBox N&"!="$K End Sub 一般情况下,For-Next正常结束,即循环变量到达终值,但有些情况下,可能需要在循环变量到达终值前退出循环,这可以通过Exit For语句来实现。在一个For-Next循环中,可以含有一个或多个Exit For语句,并且可以出现在循环体的任何位置。此外,用Exit For只能退出当前循环,即退出它所在的最内层循环。例如: For i=1 To 100 For j=1 To 100 If i*j>5000 Then MsgBox"i*j>5000" Exit For End If Next Next 在执行上述程序时,如果i*j>5000,程序将从内层循环中退出;此时外层循环也有一个Exit For语句,因而可以退出循环。 (2)While循环结构 While循环结构是当型循环语句。其格式如下: While 条件 [语句块] Wend 它的功能是:当给定的“条件”为True时,执行循环中的“语句块”(即循环体)。 While语句的执行过程是:如果“条件”为True,则执行“语句块”,当遇到Wend语句时,控制返回到While语句并对“条件”进行测试,如仍然为True,则重复上述过程,如果“条件”为False,则不执行“语句块”,而执行Wend后面的语句。 (3)Do循环结构 Do循环不仅可以不按照限定的次数执行循环体内的语句块,而且可以根据循环条件是True或False决定是否结束循环。 Do循环的格式如下: (1) Do [ 语句块 ] [ Exit Do ] Loop [While | Until 循环条件 ] (2) Do [While | Until 循环条件 ] [ 语句块 ] [ Exit Do ] Do循环语句的功能是:当指定的“循环条件”为True或直到“循环条件”变为True之前重复执行一组语句(即循环体) 例如: i=10 MsgBox"Value of i a beginning of Do while i<10 i=i+1 MsgBox"Value of i at end of loop is": i 该例中的循环条件为i<10,只要这个条件为True,就执行MsgBox语句和i=i+1。当i=10时,循环结束,执行后面的MsgBox语句。 在这个例子中,循环条件i<10求反(NOT)后为i>=10,把它作为Do…Loop Until的条件,所得的结果完全一样: Do MsgBox"Value of i is ":i i=i+1 Loop Until i>=10 MsgBox "Value of i at end of loop is":i 在格式2中,While和Until放在循环的开头,即紧跟在关键字Do之后,组成两种循环,分别叫做Do While…Loop循环和Do Until…Loop循环。它们都是先判断条件,然后在条件满足时才执行循环体,否则不执行。例如: i=10 MsgBox "value of i at beginning of loop is ":i Do While i<10 i=i+1 MsgBox "Value of i at end of loop is" :i 由于i=10,条件不为True,因此不执行循环体。两个信息框中的结果相同。 Do… i=10 Do MsgBox "value of i at beginning of loop is " :i i=i+1 loop while i<10 MsgBox "Value of i at end of loop is " :i 执行后,在第1个信息框中的结果为10,第2个信息框中的结果为11。 3.5 自定义过程 在前面几节中,已多次见过事件过程,这样的过程是当发生在某个事件(如OnClick等)时,对该事件作出响应的程序段,这种事件过程构成了VBScript应用程序的主体。有时候,多个不同的事件过程可能需要使用一段相同的程序代码,可以把这一段代码独立出来,作为一个过程,这样的过程叫做“通用过程”,它可以单独建立,供事件过程调用。 在VBScript中,通用过程分为两类,即子程序过程和函数过程,前者叫做Sub过程,后者叫做Function过程。在这一节中,将介绍通用过程的定义、调用。 在VBScript中,通用过程分为两类,即子程序过程和函数过程,前者叫做Sub过程,后者叫做Function过程。在这一节中,将介绍通用过程的定义、调用及参数传递。 (一) 过程的定义VBScript提供了与Pascal、C、Ada等语言类似的子程序调用机制,即子程序过程和函数过程。为了便于区分,在今后的叙述中,我们把Sub…End Sub定义的子程序叫做子程序过程或Sub过程,把由Function…End Function定义的函数叫做函数过程或Function过程。 1.Sub过程的定义 通用Sub过程的结构与前面见过的事件过程的结构类似。一般格式如下: Sub 过程名[(参数列表)] 语句块 [Exit Sub] [语句块] End Sub 说明: (1)Sub过程以Sub开头,以End Sub结束,在Sub和End Sub之间是描述过程操作的语句块,称为“过程体”或“子程序体”。格式中各参数含义如下: 1 过程名:是一个长度不超过255个字符的变量名,在同一个模块中,同一个变量名不能既用作Sub过程名又用作Function过程名。 2 参数列表:含有在调用时传送给该过程的简单变量名或数组元素名,各名字之间用逗号隔开。“参数列表”指明了调用时传送给过程的参数的类型和个数。 (2)End Sub标志着Sub过程的结束。为了能正确运行,每个Sub过程必须有一个End Sub语句。当程序执行到End Sub时,将退出该过程,并立即返回到调用语句下面的语句。此外,在过程体内可以用一个或多个Exit Sub语句从过程中退出。 (3)Sub过程不能嵌套。也就是说,在Sub过程内,不能定义Sub过程或Function过程,只能通过调用执行Sub过程,并且可以嵌套调用。 下面是一个Sub过程的例子: Sub caculate(x,y) x=x+100 y=y*6 MsgBox x&y End Sub 上面的过程有两个形式参数:x和y,过程可以有参数,也可以不带任何参数。没有参数的过程称为无参过程。例如: Sub Subtest() MsgBox "This is a Sub procedure" End Sub 2.Function过程的定义 Function过程定义的格式如下: Function 过程名[(参数列表)] [语句块] [过程名=表达式] [Exit Function] [语句块] End Function 说明: (1)Function过程以Function开头,以End Function结束,在两者之间是描述过程操作的语句块,即“过程体”。格式中的“过程名”、“参数列表”、“Exit Function”的含义与Sub过程中相同。 (2)调用Sub过程相当于执行一个语句,不返回值;而调用Function过程要返回一个值。因此可以像内部函数一样在表达式中使用。由Function 过程返回的值放在上述格式中的“表达式”中,并通过“过程名=表达式”把它的值赋给“过程名”。如果在Function过程中省略“过程名=表达式”,则该过程返回一个默认值;数值函数过程返回0值,字符串函数过程返回空字符串。因此,为了能使一个Function过程完成指定的操作,通常要在过程体中为“过程名”赋值。例如: Function BinarySerach(...) ...... If Lower>Upper Then BinarySearch=False Exit Function End If ...... End Function 在这个例子中,把False赋给函数名BinarySearch,表示没有要查找的值。 【例3-5】编写一个求最大公约数(GCD)的函数过程。 Function gcd(x,y) Do while y<>0 Reminder = x Mod y x=y y=reminder gcd=x End Function (二) 过程的调用调用引起过程的执行。也就是说,要执行一个过程,必须调用该过程。Sub过程调用可以作为独立的基本语句,而Function过程调用要返回一个值,通常出现在表达式中。 1. 调用Function过程 Function过程的调用比较简单,因为可以像使用VBScript内部函数一样来调用Function过程。实际上由于Function过程能返回一个值,因此完全可以把它看成是一个函数,它与内部函数(如Sqr、Abs等)没什么区别,只不过内部函数由语言系统提供,而Function过程由用户自己定义。 前面编写了求最大公约数的函数Gcd,它有两个参数。可以在下面的事件过程中调用该函数: Sub Button1_OnClick Dim a,b a=96; b=64 x=gcd(a,b) MsgBox"G.C.D="&x End Sub 上述事件过程中的“x=Gcd(a,b)”就是调用gcd函数的语句,调用时的实际参数分别为96和64,调用后的返回值放入变量x中。程序的输出结果为32。 2. 调用Sub过程 Sub过程的调用有两种方式,一种是把过程的名字放在一个Call语句中,一种是把过程名作为一个语句来使用。 1 用Call语句调用Sub过程 格式:Call过程名[(实际参数)] Call语句把程序控制传送到一个VBScript的Sub过程。用Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略;否则应给出相应的实际参数,并把参数放在括号中。“实际参数”是传送给Sub过程的变量或常数。例如: Call Tryout(a,b) 2 把过程名作为一个语句来使用 在调用Sub过程时,如果省略关键字Call,就成为调用Sub过程的第2种方式。与第1种方式相比,它有两点不同: 1) 去掉关键字Call; 2) 去掉“实际参数表”的括号。 例如: Tryout a,b 下面举两个例子。 【例5.6】 编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。 程序如下: <html> <head> <title></title> <SCRIPT LANGUAGE=vbscript> <!-- Sub Button1_OnClick Dim A,B A = InputBox("What is the length?") B = InputBox("What is the width?") Recarea A,B End Sub Sub Recarea (Rlen,Rwid) Dim Area Area=Rlen*Rwid MsgBox"Total Area is "&Area End Sub --> </SCRIPT> </head> <body> <INPUT id=button1 name=button2 type=button value=Button> </p> </body> </html> 在上面的程序中,通用过程RecArea用来计算并输出矩形的面积,它有两个行参,分别为矩形的长和宽。在OnClick事件过程中,从键盘上输入矩形的长和宽,并用它们作为实参调用RecArea过程。在该例中,用第2种方式调用Sub过程。 【例5.7】编写一个用来实现延迟指定时间(秒)的Sub过程。调用这个过程,按指定的时间间隔显示若干行信息。 用For…Next循环可以实现时间延迟,但很不精确。这里我们用VBScript的内部函数Timer来编写较为精确的时间延迟过程。 Timer函数返回系统时钟从午夜开始计算的秒数,把Timer加上需要延迟的时间(秒)作为循环结束的时间,当Timer超过这个时间则结束循环,即停止循环,即停止时间延迟。用这种方法可以得到精确的时间延迟。 程序如下: <html> <head> <title></title> <SCRIPT LANGUAGE=vbscript> <!-- Sub Button_OnClick MsgBox("Print the first line now. Wait for 5 seconds.") DelayLoop 5 MsgBox("Print the second line.Wait for 10 seconds.") Call DelayLoop(10) MsgBox("print the third line.") End Sub Sub DelayLoop(DelayTime) SecondsInDay=24*60*60 LoopFinish=Timer+DelayTime If LoopFinish>SecondsInDay Then LoopFinish=LoopFinish-SecondsInDay Do While Timer>LoopFinish End If Do While Timer<LoopFinish End Sub --> </script> </head> <body> <INPUT id=button1 name=button1 type=button value=Button> </p> </Body> </html> 用上面程序中的DelayLoop过程可以延迟指定的时间,调用时用需要延迟的时间(秒)作为实参。例如: DelayLoop 5 或此延迟5秒。在一般情况下,Timer比LoopFinish要小,因此可以用 Do While Timer < LoopFinish 来控制时间延迟。但是,如果时间延迟从午夜前开始,到午夜后才结束,则Timer从0开始起算,在这种情况下,必须用 Do While Timer > LoopFinish 来控制时间延迟。过程中对这两种情况都考虑到了。 程序运行后,单击按钮,显示第1个信息框,单击信息框中的“确定”(或OK)按钮,5秒钟后显示第2个信息框,单击“确定”按钮,再过10秒钟显示第3个信息框。 课后作业 1.设计一个程序,从键盘上输入学生的分数,程序可以计算并输出及格、不及格人数及平均分数。运行结果如图5.8所示: 图1 计算分数 源代码如下: <html> <head> <title></title> <script language=vbscript> <!-- Dim n, n1,n2,total
Sub Button1_OnClick() msg="请输入分数(-1结束)" msgtitle="输入数据" Do score=InputBox(msg,msgtitle) If score<0 Or score>100 Then Exit Sub ElseIf score<60 Then n1=n1+1 Else n2=n2+1 End If total=CSng(total)+CSng(score) n=n+1 End Sub Sub Button2_Onclick() text1.value=n2&"人" text2.value=n1&"人" text3.value=total/n End Sub --> </script> </head> <body> <p>及格: <input id=text1 name=text1 size="20"> <p>不及格: <input id=text2 name=text2 size="20"> <p>平均: <input id=text3 name=text3 size="20"> <p> <input id=button1 name=button1 type=button value=输入并计算>
<input id=button2 name=button2 type=button value=显示结果> </body> </html> 2. 从键盘上输入一个0~6的整数,然后输出相应的用中文表示的星期几。如0表示星期日,1表示星期一等。 3.从键盘上输入字符,并对输入的字符进行计数,当输入的字符为“?”时,停止计数,并输出结果。 由于需要输入的字符的个数没有指定,无法用For循环来编写程序。停止计数的条件是输入的字符为“?”,可以用While循环语句来实现。 程序如下: <html> <head> <title></title> <script language=vbscript> <!-- Sub Button1_OnClick Dim char Const ch="?" counter=0 msg="Enter a character:" char=InputBox(msg) While char<>ch counter=counter+1 char=InputBox(msg) Wend MsgBox"Number of characters entered:"&counter End Sub --> </script> </head> <body> <input id=button1 name=button1 type=button value=Button> </body> </html> 运行上面的程序,在输入对话框中输入一个字符,单击“OK”按钮后,将再次显示输入对话框,继续输入字符,直到输入“?”后停止输入,并在信息框中显示输入的字符的个数,如图5.10所示。 图2 While循环执行情况 |
|