VisualBasic程序设计教程(中)ppt.ppt

上传人:za****8 文档编号:15802215 上传时间:2020-09-07 格式:PPT 页数:257 大小:2.94MB
收藏 版权申诉 举报 下载
VisualBasic程序设计教程(中)ppt.ppt_第1页
第1页 / 共257页
VisualBasic程序设计教程(中)ppt.ppt_第2页
第2页 / 共257页
VisualBasic程序设计教程(中)ppt.ppt_第3页
第3页 / 共257页
资源描述:

《VisualBasic程序设计教程(中)ppt.ppt》由会员分享,可在线阅读,更多相关《VisualBasic程序设计教程(中)ppt.ppt(257页珍藏版)》请在装配图网上搜索。

1、Visual Basic程序设计教程(中),目录,第5章 数组,整型、实型、字符型等数据类型都属于简单类型,而在实际应用中,常常要遇到处理相同类型的成批相关数据的情况。例如,为了处理某系几百个学生某门课的考试成绩,若在程序中定义几百个简单变量记录这些数值,显然是十分笨拙的。程序设计语言提供了一种解决此类问题的更为有效的数据类型数组。数组是由固定数目的同类元素按一定顺序排列而成的结构类型数据。数组是程序设计中常用到的数据类型。,当数组中每个元素只带有一个下标时,称这样的数组为一维数组。在计算机内存中,数组占据了一块连续的存储区域,数组名就是这块空间的名称。区域中每个单元都有自己的地址,该地址用下

2、标表示。数组应该先定义后使用。定义数组的目的是通知计算机为其留出所需的存储空间。数组与普通变量一样,用来存放数据,且同一数组中的数据必须是同一类型的。,5.2.1 一维数组的声明,数组说明格式1: 说明符变量名下标As类型 其中: “说明符”为Visual Basic的保留字。不同的说明符可以定义数组的不同性质和作用范围。 “变量名”是数组名,是用户自定义的标识符。 “下标”用于定义数组元素的个数。下标值类型为长整型Long,下标界值范围从-2 147 483 648到2 147 483 647。此种形式默认下标下界为0。 “类型”是指数组的类型。,例如: Dim a(8) As Intege

3、r 在这里,Integer是类型名,a(8)就是一维数组说明符。以上语句说明了下面几点: 定义了一个名为a的一维数组。 括号中的8规定了a数组含有9个元素,它们是a(0),a(1),a(2),a(8)。 类型名Integer规定了a数组中每个元素都是整型,在每个元素中只能存放整型数。 每个元素只有一个下标,Visual Basic语言默认此数组第一个元素的下标值为0(称为数组下标的下界),因此,以上a数组中的最后一个元素的下标应该是8(称为数组下标的上界)。,5.2.1一维数组的声明,5.2.1一维数组的声明,Visual Basic编译程序将为a数组在内存中开辟如图5-1所示的9个连续的存储

4、单元,在图5-1中标明了每个存储单元的名字,可以用这样名字直接来引用各存储单元。,图5-1编译程序所开辟的存储单元,例如在程序中有说明: Dim Counter(10) As Integer Dim Sum(20) As Double Dim name(15) As String,5.2.1一维数组的声明,以上语句用Dim 作说明符。与说明简单变量一样,它用于说明局部数组,也就是说,它可以出现在窗体层、模块和过程中,是最常用的说明形式。 第一个语句建立了一个有11个元素的数组Counter,其下标从0到10,元素类型为Integer。它的元素有:Counter(0),Counter(1),Co

5、unter(2), ,Counter(10),带下标的数组元素也称为下标变量。 第二个语句建立了一个数组Sum,有21个元素,其下标从0到20,元素类型为Double。 第三个语句建立了一个数组name,有16个元素,其下标从0到15,元素类型为String。 如果不想让数组的下标值从0开始算起,可以用Option Base语句来改变它的起始值,例如: Option Base 1 Public Students(10) As Integer,将使数组项目变成10个(也就是由1到10)。即此数组有Students(1),Students(2),Students(3),Students(10)。

6、数组说明格式2: 说明符变量名下标 to 上界As类型 此种数组说明中,关键字to可以显式地规定下标下界。此时应满足下界上界。 例如在程序中有说明: Dim Counter(1 to 10) As Integer Dim Sum(10 to 20) As Double Dim name(-20 to -20 ) As String Counter的下标值范围从1到10,Sum的下标范围从10到20,数组name的下标等于上标,即name退化成一个简单变量了。,5.2.1一维数组的声明,5.2.2一维数组元素的引用,引用数组元素(下标变量),即在括弧中指定下标。在程序中,数组与其他变量的使用方式

7、相同,即可参与运算,可以被赋值。在引用数组时,数组名、类型、维数以及下标的范围,应与定义时一致。同一模块中,数组和变量不可同名。 数组由一组类型相同的元素组成,一维数组元素的基本引用方式如下: 数组名 (下标表达式) 如,a (0),a (i+1)等。 应该建立起以下概念: 一个数组元素实质上就是一个变量名,代表内存中的一个存储单元。一个数组占有一串连续的存储单元。 在引用数组元素之前,必须先对数组进行定义。 规定数组元素中下标表达式的值必须是整数,下标值的默认下限是0,上限是定义中的下标表达式的值。以上面定义的a数组为例,其定义的第一个数组元素是a(0),最后的一个元素是a(8)。注意,下标

8、表达式的值不得越界。 在Viaual Basic语言中,一个数组不能整体引用。例如,对于以上定义的a数组,不能用a代表a(0)到a(8)这9个元素.,1.给数组元素赋初值 利用循环结构可以给已定义的数组赋初值。 Dim A(1 To 10) As Integer 数组的每个元素是0 For i=1 To 10 A(i)=0 Next I 2.数组的输入 可通过InputBox函数输入数组中第i个元素的值,此方法适合输入少量数据。 Dim a(3) As Integer For i=0 To 3 a(i) =InputBox(输入a( Max Print Print 最高学分的学号为:; cod

9、e End Sub 【例5-2】将一个数组中的值按逆序重新存放。交换的要求是将数组第一个元素与最后一个交换,第二个与倒数第二个交换,以次类推。 如原来顺序为10,3,4,5,6,2,按要求应改为2,6,5,4,3,10。 Option Explicit Private Sub Command1_Click() Const n = 5 Dim a(n) As Integer Dim i, temp As Integer Print Enter array a:n For i = 0 To n,a(i) = InputBox(请输入第 Next i End Sub,5.2.4一维数组的应用,程序运

10、行结果如下: Enter array a: 4 5 6 7 2 3 9 array a: 4 5 6 7 2 3 9 Now,array a: 9 3 2 7 6 5 4,5.2.4一维数组的应用,数学中矩阵的各个元素要用行、列位置标识,计算机上的每一个屏幕像素要用X,Y坐标表示它的位置。类似这种数据结构,可用二维数组形式描述。在Viaual Basic中,拥有两个下标的数组就是二维数组。,5.3二维数组,5.3.1二维数组的声明,数组说明格式1: 说明符变量名下标1, 下标2As类型 其中: “说明符”为Visual Basic的保留字。不同的说明符可以定义数组的不同性质和作用范围。 “变量

11、名”是数组名,是用户自定义的标识符。 “下标1”指此数组第一 “下标2”指此数组第二维的大小。 “类型”是指数组元素的类型。数组元素类型可以是任意Visual Basic数据类型。,例如: Dim a(8,8) As Integer 在这里,Integer是类型名,a(8,8)就是数组说明符。以上语句说明了下面几点: 定义了一个名为a的二维数组。 括号中的8,8规定了a数组为含有两个下标的二维数组,它们的排列图5-2所示。,5.3.1二维数组的声明,类型名Integer规定了a数组中每个元素都是整型,在每个元素中只能存放整型数。 如下标个数有多个,则此数组为多维数组。 数组说明格式2: 说明符

12、变量名下界 to 上界, 下界 to 上界 As类型 例如在程序中有说明: Dim Counter(1 to 2,2 to 4) As Integer 则此Counter数组有6个元素,分别为Counter(1,2 )、ounter(1,3 )、 Counter(1,4 )、Counter(2,2 )、Counter(2,3 )、Counter(2,4).,5.3.1二维数组的声明,5.3.2二维数组的引用,二维数组元素的引用方式如下: 数组名 (下标表达式1,下标表达式2),1给数组元素赋初值 利用循环结构可以对已定义的数组赋初值。 例: Dim A(3,3),i,j As Integer

13、数组的每个元素是0 For i=0 To 3 For j=0 to 3 A(I,j)=0 Next j Next i 2数组的输入 可通过InputBox函数输入数组中某个元素的值,此方法适合输入少量数据。 例: Dim B(3,3),i,j As Integer For i=0 To 3 For j=0 to 3,5.3.3二维数组的基本操作,B(i, j) = InputBox(输入a( For j = 1 To n Print c(i, j); Next j Print “ Next i End Sub,5.3.4 二维数组的应用,5.3.4 二维数组的应用,则显示的输出矩阵为:,【例5

14、-4】编一个将n阶方阵转置的程序。转置是指把矩阵的元素aij和aji交换。 Option Explicit Private Sub Command1_Click( ) Form1.AutoRedraw = True Const n = 4 Dim a(1 To n, 1 To n) As Integer Dim i As Integer, j As Integer, temp As Integer For i = 1 To n For j = 1 To n a(i, j) = InputBox(输入A ( Next j Print Next i End Sub 由于转置矩阵行列交换,对角线元素

15、不变,为了防止已交换过的两个元素被再次交换,在实施交换的嵌套For循环语句中,内循环的控制变量从i+1增加到n。,5.3.4 二维数组的应用,程序运行后,窗体显示是:,5.3.4 二维数组的应用,Visual Basic 为适应各种不同的程序设计需要,允许数组有多种定义方式。,5.4.1 定义动态数组,定义数组的目的是为数组开辟所需的内存区域。前面用Dim语句说明数组时,都同时确定维数和下标个数,Visual Basic编译程序在编译时为它们分配了相应的存储空间,并且在应用程序运行期间内,数组都占有这块内存区域,这样的数组称为定长数组。 当数据规模可以预知时,使用定长数组能够增加程序的可读性和

16、提高程序的执行效率。但有时候,数组应定义多大,要在程序运行时才能决定,定义一个“足够大”的数组显然是不经济的。动态数组又叫可调数组,它提供了一种灵活有效的管理内存机制,能够在程序运行的任何时候改变数组的大小。 Visual Basic 为适应各种不同的程序设计需要,允许数组有多种定义方式。,5.4.1 定义动态数组,Dim Array( ) As Single Sub Form_Load( ) ReDim Array(4,8) End Sub 在窗体级声明了数 Array 为可变长数组,在Form_Load()事件函数中重新指明二维数组的大小为5行9列。 注意: 在静态数组声明中的下标只能是常

17、量,而在动态数组 ReDim 语句中的下标可以是常量,也可以是有了确定值的变量。 在过程中可多次使用 ReDim 来改变数组的大小,也可改变数组的维数。 每次使用 ReDim 语句都会使原来数组中的值丢失,可以在 ReDim 语句后加Preserve 参数用来保留数组中的数据,但使用 Preserve 只能改变最后一维的大小,前面几维大小不能改变。,5.4.2 与数组操作相关的几个函数,1. Lbound函数、Ubound函数 Lbound函数是用来返回数组下标的最小索引值的,Ubound函数是用来返回数组最大索引值的。例如,定义如下一个数组: Dim s(10) AS Integer Pri

18、nt Lbound(s), Ubound(s) 此时的运行结果会输出0和10两个数,因为在数组s中,s的最小下标索引是0,最大下标索引是10。 对于多维数组,也可以使用Lbound和Ubound函数,但这个函数只能求出多维数组某一维的下标最值。例如下面的例子: Option Base 1 Dim s(0 To 9, 3) Private Sub command1_click() Print Ubound(s, 2) 打印第二维的下标上界 Print LBound(s, 1) 打印第一维的下标下界,5.4.2 与数组操作相关的几个函数,Print LBound(s, 2) 打印第二维的下标下界

19、End Sub 运行结果是输出3, 0, 1 综上所述,可以看出,这两个函数的语法格式为: Lbound (数组名称,要求的数组的维数的标号 Ubound (数组名称,要求的数组的维数的标号 如果后面的参数省略不写的话,则默认为求数组的第一维下标的最值。 2. IsArray函数 IsArray函数用来判断一个变量是否属于数组,例如: Private Sub Command1_Click() Dim a(2) As Integer Print IsArray(a) End Sub 运行结果是打印出True。 或者: Private Sub Command1_Click() Dim w As I

20、nteger:Print IsArray(a) End Sub,5.4.2 与数组操作相关的几个函数,运行结果是打印出False。 3.Erase函数 Erase函数是将某个数组所占的内存空间释放掉,归还给系统。在使用了Erase函数后,这个数组的元素就不能够再被引用了,要想重新使用它,就必须使用ReDim或Array语句重新声明。 例如:下面的程序使用Array语句声明一个数组后,用Erase函数释放掉该数组所占的内存空间,输出数组元素的值,则系统会提示“下标越界“。如果重新使用Array语句声明同名数组并输出数组元素的值,则程序正常运行。 Private Sub Command1_Clic

21、k() Data = Array(1, 2, 3) Print Data(1) Erase Data Print Data(1) Data = Array(1, 2, 3) Print Data(1) End Sub,Visual Basic中使用的数组和其他高级语言中的数组是没有区别的,只是在Visual Basic 中含有一种特殊的数组控件数组。控件数组是由一组相同类型的控件组成的,它们有共同的控件名称,具有大部分相同的属性。建立控件数组时,系统会给每一个元素唯一的索引号 (Index),通过属性窗口中的Index属性,就可以知道该控件的下标是多少。控件数组的第一个元素的下标是0。控件数组

22、适用于若干个控件执行的命令有相同代码的场合,这样可以使这些控件共享这一段代码(事件过程),从而可以节约程序员编写代码的时间,使程序更加精练,结构更加紧凑。 控件数组可以在设计中创建,方法是: 在窗体上创建一个控件,对控件名称和一些属性进行设置。选中该控件用鼠标进行复制(Copy)和粘贴(Paste)操作,会出现询问是否创建控件数组的对话框,单击“是”按钮进行控件数组创建。在单击了“是”按钮后,在窗体中就会创建一个控件数组(下面的例子就是创建一个计算器中数字键和运算符号键的控件数组)。然后对这些数字键可以采用同,5.5 控件数组,一段代码来实现数字的输入,这样就可以减少程序员编写代码的任务。 对

23、于控件数组来说,它只限于一维结构,没有一个明确的上界,而且也不一定要使用连续的索引值,因为它的索引值可以被重新设置。 【例5-5】采用控件数组编写一个计算器。要求该计算器能够实现简单的加、减、乘、除运算,如图5-3所示。,图5-3 简单计算器,5.5 控件数组,程序代码如下: Private Sub Command1_Click(Index As Integer) Dim x As Integer, y As Integer, s As Integer x = Val(Text1.Text) y = Val(Text2.Text) Select Case Index Case 0 s = x

24、+ y Text3.Text = s Case 1 s = x - y Text3.Text = s Case 2 s = x * y Text3.Text = s Case 3 s = x / y Text3.Text = s End Select End Sub,思考,什么是数组? 数组元素的值怎样给定? 动态数组的优点体现在哪里? 在由控件数组构成的应用程序中如何识别是哪一个控件引发的事件?,第6章 过程,过程是现代程序设计中最重要的概念之一。从编程的角度来看,一个应用程序由若干个模块组成;每个模块由若干个更小的代码片段组成,这些代码片段被称为“过程”。当编程人员设计好应用程序的界面以后

25、,主要的任务便是构造过程。过程由代码组成,它们存储在窗体文件或模块文件中。,Visual Basic系统为每个对象预先定义好了一系列的事件,用户不能增加也不能删除。当用户对某个对象发出一个动作时,在该对象上就发生了事件,然后自动地调用与该事件相关的事件过程。处理或响应事件的步骤就是事件过程。实际上,编写Visul Baic应用程序的主要任务就是判定对象是否响应某种事件以及如何响应该事件。当想让对象响应某个事件时,就编写该事件过程的程序代码。 当用户对一个对象发出一个动作时,可能会产生多个事件。比如,当用户单击鼠标时便发生了Click、MouseDown和MouseUp事件。编写Visual B

26、asic程序时,并不要求对每个事件都编写代码,只要对感兴趣的事件过程编写代码即可。事件过程一般的格式如下: Private Sub对象名称_事件(参数列表) End Sub 对象的每个事件过程有固定的语法,所包含的参数个数也是由系统预先定义好的,不同事件过程有不同的参数。事件参数记录了事件发生时的状态,它们是编写程序必要的数据来源。,通用过程能用来完成特定的功能。以Sub关键字开始,可以在事件过程或其他过程中通过过程名称调用Sub过程。,通用过程的结构与事件过程的结构类似。一般格式如下: Private|PublicSub (参数列表) 语句块1 Exit Sub 语句块2 End Sub 例

27、如: Private Sub Subtest() PrintThis is a Sub Procedure End Sub 说明: 通用过程以Sub开头,以End Sub结束,在两者之间是描述操作的语句块,即“过程体”。在一个通用过程内不能再定义另一个通用过程,即通用过程不能嵌套定义。,6.3.1 通用过程(Sub过程)的定义,6.3.1 通用过程(Sub过程)的定义,格式中各参量的含义如下: 关键字Private(私有):表示函数过程是私有过程,只能被本模块中的其他过程访问,不能被其他模块中的过程访问。 关键字Public(公有):表示函数过程是公有过程,可以在程序的任何地方调用它。各窗体通

28、用的过程通常在标准模块中用Public定义,在窗体定义的通用过程不仅可以在本窗体模块中使用,也可以在其他窗体模块中使用。 的命名规则与变量名的命名规则相同。一个函数过程只能有一个唯一的名字,名字长度不得超过40个字符。不能与Visual Basic中的关键字同名,也不要与Windows API函数同名,更不能与同一级别的变量同名。在同一个模块中,同一名称不能既用做又用作。 类似于变量声明,在中出现的参数称为形式参数,简称为形参,各参数之间用逗号隔开。指明了调用时传送给过程的参数类型、个数和位置,它并不代表一个实际存在的变量,也没有固定的值,在调用此过程时它被一个确定的值所代替。形参的名字并不重

29、要,重要的是其所表示的关系和调用时所给定的实际参数。每个参数的格式为:,6.3.1 通用过程(Sub过程)的定义,ByVal变量名()As 数据类型 如:m As Integer 这里的“变量名”是一个合法的Visual Basic变量名或数组名。如果是数组,则要在数组名后加上一对括号。“数据类型”指的是变量的类型,可以是Integer,Long,Single,Double,String,Currency,Variant或用户定义的类型。如果省略“As数据类型”,则默认为Variant。“变量名”前面的ByVal是可选的。如果加上ByVal,则表明该参数是“传值”参数;如果没有加ByVal的参

30、数称为“引用”参数。(关于参数传递将在后面章节中作介绍),6.3.1 通用过程(Sub过程)的定义,“语句块”是Visual Basic的程序段,包括说明部分和执行部分。说明部分是对过程自身要用到的变量进行说明,这些变量局限于该过程之内,称为局部变量。执行部分是用来实现过程的功能。所有的可执行语句都必须放置在某一过程内,只有说明性语句才放在过程和函数之外。 Exit Sub语句使执行立即从该过程中退出。程序接着从调用该过程的语句之后的语句执行。在过程的任何位置都可以有Exit Sub语句,执行到哪个Exit Sub语句,哪个Exit Sub起作用。 End Sub标志着通用过程的结束。当程序执

31、行到End Sub时,将退出该过程,并立即返回到调用语句下面的语句。,6.3.2 子过程的建立,自定义子过程有两种方法。 1.利用“工具”菜单下的“添加过程”命令定义 操作步骤如下: (1)为想要编写函数的窗体/标准模块打开代码窗口。,(2)选择“工具”菜单下的“添加模块”命令,打开“添加模块”对话框(如图6-1所示)。在该对话框中选择“新建”选项卡,然后双击“模块”图标,打开模块代码窗口。,图6-1 “添加模块”对,6.3.2 子过程的建立,(3)执行“工具”菜单中的“添加过程”命令,打开“添加过程”对话框,如图6-2所示。,图6-2 “添加过程”对话框,6.3.2 子过程的建立,(4)在“

32、名称”框中输入要建立过程的名字(过程名中不允许有空格,如:Try)。 (5)在“类型”组中选取“子过程”定义通用子过程。 (6)在“范围”组中选取过程的适用范围,可以选择“公有的”或“私有的”。如果选择“公有的”,则所建立的过程可用于本工程内的所有窗体模块;如果选择“私有的”,则所建立的过程只能用于本标准模块。 (7)单击“确定”按钮,回到模块代码窗口。如图6-3所示。 (8)这时,Visual Basic建立了一个函数过程模块,在其中就可以编写代码。,图6-3 模块代码窗口,6.3.2 子过程的建立,2.利用代码窗口直接定义 操作步骤是:在代码窗口的通用代码段输入过程的名字。 例如,输入Pu

33、blic Sub Try(),按回车键后显示: Public Sub Try() End Sub 即可在Public Sub Try()和End Sub之间输入程序代码。,调用引起子过程的执行。也就是说,要执行一个过程,必须调用该过程。 子过程的调用有两种方式:一种是把过程的名字放在一个Call语句中;另一种是把过程名作为一个语句来使用。 1.用Call语句调用子过程 格式:Call (实际参数) Call语句把程序控制传送到一个Visual Basic的Sub过程。用Call语句调用一个过程时,如果过程本身没有参数,则“实际参数”和括号可以省略,否则应给出相应的实际参数,并把参数放在括号中。

34、“实际参数”是传送给Sub过程的变量或常数。实际参数如果有多个,之间用逗号分隔。实参与对应的形参名字不必相同,但是个数必须相等,而且实参的书写顺序与相应的形参的类型相符。,6.3.3 过程的调用,6.3.3 过程的调用,(1)没有参数的子过程 【例6-1】简单子过程调用。 Private Sub output() Print 没有参数的子过程 End Sub Private Sub Command1_Click() Call output 由于没有参数,系统自动省去括号 End Sub (2)带有单个参数的子过程 【例6-2】给定半径,计算圆的面积,界面如图6-4所示。,图6-4 带有一个参数

35、的过程,6.3.3 过程的调用,Private Sub output(ByVal r As Single Dim s As Single Const pi As Single = 3.14 s = pi * r 2 Label2.Caption = 半径为 x End Sub 上述事件过程中的x=gcd(a,b)就是调用gcd函数的语句。调用时的实际参数分别为96和64,调用后的返回值放入变量x中。,6.4.3 函数过程的调用,图6-6 用函数计算阶乘,【例6-5】编写程序,计算6!+8!+9!的值,界面如图6-6所示。 下面用函数过程实现求阶乘: Function fact1(n As In

36、teger) As Double Dim val As Double, i As Integer val = 1 For i = 1 To n val = val * i Next i fact1 = val End Function,6.4.3 函数过程的调用,调用函数过程fact1: Private Sub Command1_Click() Dim factval As Double, sum As Double factval = fact1(6) sum = sum + factval factval = fact1(8) sum = sum + factval factval = f

37、act1(9) sum = sum + factval Label1.Caption = 用函数过程实现 a End Sub Private Sub Command1_Click() Dim w As Integer Print 在过程调用之前w=; w Call tref(w) Print 在过程调用之后w=; w End Sub,图6-7 传值方式,6.5.2 参数传递,2.传地址 传地址方式用关键字ByRef来实现(可以省略关键词)。当形参为传地址参数(ByRef)时,Visual Basic并不为形参开辟另外的存储空间,形参直接使用实参的地址和数值。所以按地址传递参数允许被调用过程访问

38、实参,且可为调用过程带回数据。由于过程中使用的形参是实参本身,因此,如果在调用过程中改变了形参的值,则当过程结束后,实参的值也发生了相应的变化。,6.5.2 参数传递,【例6-7】检验ByRef方式实参在调用前、后的值,界面如图6-8所示。 Private Sub tref(ByRef a As Integer) a = a + 1 Print 在过程体内:a=; a End Sub Private Sub Command1_Click() Dim w As Integer Print 在过程调用之前w=; w Call tref(w) Print 在过程调用之后w=; w End Sub,图

39、6-8 传地址方式,6.5.2 参数传递,一般来说,传地址比传值更能节省内存并提高效率。因为在定义通用过程时,过程中的形参只是一个地址,系统不必为保存它的值而分配内存空间,只简单地记住它地一个地址。使用地址可以使Viaual Basic更有效地操作。但对于整数来说,这种效率不太明显,而对于字符串来说,效率会得到明显的提高。,6.5.3 有关过程之间数据传递的几点说明,究竟何时使用传值方式,何时使用传地址方式呢?下面是几条可供参考的原则: 整型、长整型和单精度参数,如果不希望修改实参的值应选择值传送方式。为了提高效率,字符串和数组应通过地址传送,用户定义的类型(如记录)和控件只能通过地址传送。

40、其他数据类型,可以用两种方式传送。但最好用传值方式传送,以避免错用参数。 最好用传值方式来传送所有变量(字符串、数组、记录类型除外),当程序编写完成并调试正确后,再把部分参数改为传地址,以提高程序运行速度。,数组可以作为函数或过程的参数,在形参表中,数组名后面应该添加一对括号,以区别于其他变量。数组在做参数时,传递类型只能是传地址。 【例6-8】数组作为函数参数,以调用过程的方式输出数组,界面如图6-9所示。 Private Sub tryout(min As Integer, max As Integer, k() As Integer) Dim i As Integer For i = m

41、in To max Print k(i) Next i End Sub,图6-9 数组作过程参数输出,Private Sub Command1_Click() Dim w(3) As Integer Dim j As Integer For j = 0 To 3 w(j) = j Next j Call tryout(1, 3, w() End Sub 数组作为参数时经常会用到求数组上下标的函数:Lbound/Ubound。,Visual Basic应用程序由若干个过程构成,这些过程一般保存在窗体文件(.frm)或标准模块(.bas)中。在过程中变量是必不可少的。变量和过程都可以出现在不同地方

42、,因此作用范围是不尽相同的。变量、过程可被访问的范围称为变量或过程的作用域。,6.7.1 变量的作用域,变量的作用域决定了可访问该变量的子过程和函数过程。变量按作用域分为局部变量、窗口/模块级变量和全局变量。 1局部变量 局部变量是指在过程内用Dim的语句声明的变量(或不加声明直接使用的变量),如图6-10所示。,图6-10 局部变量的使用,6.7.1 变量的作用域,局部变量只能在一个过程中使用,其他过程不能访问此变量。局部变量随过程的调用分配存储单元,并在声明的过程内进行数据的存取,一旦过程体结束,变量的内容自动消失,占用的存储单元释放。不同的过程中可有相同名称的变量,彼此互不相干。在下次过

43、程执行时,所有局部变量的值初始化为0或空。使用局部变量,有利于程序的调试。 2窗体/模块级变量 窗体/模块级变量指在一个窗体/模块的任何过程之外声明的变量。在代码窗口中选择左边的下拉框为“通用”,然后选择右边的下拉框为“声明”,用Dim或Private语句声明的变量,可被窗体/模块的任何过程访问。如图6-11所示。,6.7.1 变量的作用域,图6-11 非局部变量使用,3.全局变量 全局变量是指在一个窗体/模块的任何过程之外以Public关键字声明的变量,即在“通用声明”段中用公共的语句声明的变量,可被应用程序的任何过程或函数访问。全局变量的值整个应用程序中始终不会消失和重新初始化,只有当整个

44、应用程序执行结束时,才会消失。不同作用范围的3种变量声明及使用规则如表6-1所示。 注意:不能在过程中声明全局变量,只能在模块的声明段中声明全局变量。,E1与“窗体/模块级变量”一样? 已修改,6.7.1 变量的作用域,表6-1 不同作用范围的3种变量声明及使用规则,6.7.2 过程的作用域,一般Visual Basic应用程序的代码存储在3种不同的模块中,即窗体模块、标准模块和类模块。在本章只介绍窗体和标准模块文件,类模块在以后章节介绍。过程的作用域分为:窗体/模块级和全局级。 1窗体/模块级 它是在某个窗体或标准模块内定义的过程,定义的附属过程或函数过程前加Private的关键字。过程只能

45、被本窗体(在本窗体内定义)或本标准模块(在本标准模块内定义)中的过程调用。 2全局级 它是在某个窗体或标准模块中定义的附属过程或函数过程,其默认是全局的,也可在过程前加上关键字进行说明。全局级过程可供该应用程序的所有窗体和所有标准模块中的过程调用,其调用方式根据过程所处的位置不同,有两种调用方式: 在窗体定义的过程,当外部过程要调用时,应在被调用的过程名前加上所处的窗体名。 在标准模块定义的过程,如果过程名唯一,则任何外部过程都可以直接调用,否则应在被调用的过程名前加上所处的标准模块名。,6.7.2 过程的作用域,【例6-9】在下面一个窗体文件中进行不同级的变量声明。 Public a As

46、Integer Dim b As Integer Sub prod() Dim a As Integer a = a * a Form1.a = 2 b = 2 Print prod子程序中: Print 局部变量a=; a; ,全局变量a=; _ Form1.a; ,窗体/模块级变量b=; b Print End Sub 命令按钮的Click()事件代码: Private Sub Command1_Click(),6.7.2 过程的作用域,Dim a As Integer Show: Cls FontSize = 10 a = 5 Form1.a = 1 b = 1 Print 调用prod

47、前: Print 局部变量a=; a; ,全局变量a=; _ Form1.a; ,窗体/模块级变量b=; b Print Call prod Form1.a = Form1.a + 1 = b + 1 Print 调用prod后: Print 局部变量a=; a; ,全局变量a=; Form1.a; _ ,窗体/模块级变量b=; b End Sub,6.7.2 过程的作用域,一般而言,在同一模块中不同级别的变量可以用相同的变量名。在定义局部变量的过程内,局部变量起作用,在其他地方全局变量起作用。如上例定义了全局变量和局部变量都为a,在直接访问a时,局部变量被优先访问,把全局变量a屏蔽掉;若想访

48、问全局变量,则必须在全局变量名前加模块名。,在Visual Basic中定义过程时,一个过程内不能包含另一个过程,但是可以调用另一个过程。这种情况是过程的嵌套。如果一个过程调用过程本身,就是递归调用。递归调用在完成阶乘运算、级数运算和幂指数运算方面经常用到。递归分为两种类型:一种是直接递归,即在过程中调用过程本身;另一种是间接递归,即间接地调用一个过程,如第一个过程调用了第二个过程,而第二个过程又返回头来调用第一个过程。,6.8.1 过程的嵌套,Visual Basic的过程定义都是相互平行和独立的,即一个过程不能定义另一个过程。但是在一个过程中可以调用另一个过程,这种结构称为嵌套调用。如图6

49、-12所示。,从图6-12可以看出,主程序或过程遇到调用子过程语句就转去执行子过程,而本程序的余下的部分代码则等从子过程返回后才能继续执行。,图6-12嵌套调用,6.8.1 过程的嵌套,【6.10】过程的嵌套调用,运行界面如图6-13所示。 Private Sub sub1() Print sub1内部,调用sub2()过程前 Call sub2 Print sub1内部,调用完成sub2()过程后 End Sub Private Sub sub2() Print sub2内部 End Sub Private Sub Command1_Click() Print 主调程序中 Call sub1

50、 Print 主调程序完成 End Sub,6.8.1 过程的嵌套,图6-13 嵌套调用结果,6.8.2 过程的递归调用,简单地说,递归调用就是在过程中自己调用自己。递归是描述问题的一种抽象方法,最典型的数学例子就是阶乘的定义: n!=n(n-1)! (n-1)!=(n-1)(n-2)! 1!=1(1-1)! 0!=1 【例6-11】利用递归调用计算n!。程序代码如下: Function Factorial(N As Integer) As Double If N 0 Then Factorial = N * Factorial(N - 1) Else Factorial = 1 End If

51、 End Function,6.8.2 过程的递归调用,Sub Form_Click() Dim num As Integer msg$ = Factorial is: NL = Chr$(13) Picture1 Tab 10 test Print Tab(10); Form Tab 10 test Picture1.CurrentX = 1000 Picture1.CurrentY = 800 CurrentX = 1000 CurrentY = 800 Print Form CurrentX,CurrentY Test Print Tab(10); CurrentX, CurrentY

52、Picture1.Print Picture1 CurrentX,CurrentY test Picture1.Print Picture1 CurrentX,CurrentY test Picture1.Print Picture1 CurrentX,CurrentY test Picture1.Print Tab(15); Picture1.CurrentX, Picture1.CurrentY End Sub,7.1.2 图像框,1.常用属性 BorderStyle属性 Stretch属性 Picture属性 2.常用事件 图像框常用的事件有Click和DblClick事件。 【例7-2

53、】演示图片框和图像框装载图形的方法,以及相应属性对加载图形的影响。 设计如图7-3所示的界面。程序运行时要求:单击“装载图形”按钮,在图片框和图像框中同时装入指定的文件图形。当每次单击“操作图片框”按钮,图片框与其中的图形适应方式交替发生变化;每次单击“操作图像框”按钮,图像框与其中的图形适应方式也交替发生变化;单击“卸载图形”按钮,同时清除两框中的图形。,7.1.2 图像框,步骤1 设计界面 按图7-3所示设计界面。窗体标题设置为“图片框与图像框”,各控件除表7-2中指定的属性外,均采用默认值。,图7-3 图片框与图像框的操作,7.1.2 图像框,步骤2 编写代码 Dim a As Sing

54、le, b As Single Private Sub Form_Load() a = Picture1.Width: b = Picture1.Height End Sub Private Sub Command1_Click() Picture1.Picture = LoadPicture(C:WINDOWSWebWallpaperbliss.bmp) Image1.Picture = LoadPicture(C:WINDOWSWebWallpaperbliss.bmp) End Sub Private Sub Command2_Click() If Picture1.AutoSize =

55、 False Then Picture1.AutoSize = True Else Picture1.Width = a:Picture1.Height = b Picture1.AutoSize = False End If End Sub,Private Sub Command3_Click() Picture1.Picture = LoadPicture() Image1.Picture = LoadPicture() End Sub Private Sub Command4_Click() If Image1.Stretch = False Then Image1.Width = a

56、Image1.Height = b Image1.Stretch = True Else Image1.Stretch = False End If End Sub,7.1.2 图像框,如图7-4所示,单选按钮与复选框是两种属于选择类的标准控件,在应用程序中用于对选项采取开关式的选择方式。从程序员的角度来看,它们十分相似,但对于用户来说,它们的形状不同,用途也不一样。一个单选按钮或复选框在设计中是针对一个具体选项的。 单选按钮与复选框也具有部分窗体的属性,包括Caption、Enabled、Name、Visible、FontBold、FontItalic、FontName、FontSize、F

57、ontUnderline等,其用法也相同。单选按钮和复选框的默认名称分别为OptionX和CheckX(X为1,2,3,)。,图7-4 单选按钮和复选框图标,7.2.1 单选按钮,1.常用属性 Alignment属性 Value属性 Style属性 2.常用事件 单选按钮的常用事件有Click事件。,7.2.2 复选框控件,1.常用属性 Alignment属性 Style属性 Value属性 2.常用事件 复选框的常用事件有Click事件。 【例7-3】演示单选按钮和复选框的使用。 如图7-5,向工程中添加一个窗体。在窗体中创建3个单选按钮控件和3个复选框控件、1个标签控件用于显示提示信息,单

58、选按钮控件用来控制标签控件中显示的文字可以在“宋体”、“黑体”和“楷体”之间选择,复选框控件用来控制标签控件中显示的文字可在“粗体”、“斜体”和“下划线”之间选择多项。,7.2.2 复选框控件,步骤1 设计界面,图7-5 单选按钮和复选框,7.2.2 复选框控件,步骤2 编写代码 编写窗体及各命令按钮的操作代码。 Private Sub Check1_Click() Label1.FontItalic = IIf(Check1.Value = 1, True, False) End Sub Private Sub Check2_Click() abel1.FontBold = IIf(Chec

59、k2.Value = 1, True, False) End Sub Private Sub Check3_Click() Label1.FontUnderline = IIf(Check3.Value = 1, True, False) End Sub,Private Sub Option1_Click() Label1.FontName = 宋体 End Sub Private Sub Option2_Click() Label1.FontName = 黑体 End Sub Private Sub Option3_Click() Label1.FontName = 楷体_GB2312 En

60、d Sub,7.2.2 复选框控件,如图7-6所示,列表框和合框也是两个标准控件,它们在应用程序中为用户提供多个选项,以便用户直接选择。利用列表框,可以选择所需要的项目,而组合框可以把一个文本框组合为单个控制窗口。 列表框和组合框也具有部分窗体的属性,包括Enabled、Visible、FontBold、FontItalic、FontName、FontSize、FontUnderline、Height、Left、Top、Width等,其用法也相同。列表框和组合框的默认名称分别为ListX和ComboX (X为1,2,3,)。,图7-6 列表框和组合框图标,7.3.1 列表框,1.常用属性 Co

61、lumns属性List ListCount属性ListIndex属性 MultiSelect属性Selected属性 Sorted属性Style属性 Text属性 2.常用方法 AddItem方法 RemoveItem方法 Clear方法,7.3.1 列表框,3.常用事件 列表框的常用事件有Click和DblClick事件。 【例7-4】演示列表框的事件和方法。 如图7-7所示,左边的列表框中的项目按加入的先后顺序排列,右边的列表框中的选项按字母升序排列。当双击其中一个列表框中的选项时,被选中的选项将移动到另一个列表框中。当单击添加按钮时,左边列表框中将在指定位置添加选项。 步骤1 设计界面,

62、图7-7 列表框的演示,7.3.1 列表框,步骤2 编写代码,编写窗体及控件代码如下: Private Sub Form_Load() List1.AddItem 萝卜“ List1.AddItem 白菜 List1.AddItem 地瓜“ List1.AddItem 香菜 List1.AddItem 土豆“ List1.AddItem 西红柿 List1.AddItem 四季豆“ List1.AddItem 南瓜 List1.AddItem 木耳“ List1.AddItem 茄子 List1.AddItem 莴苣“ List1.AddItem 辣椒 End Sub,Private Sub

63、Command1_Click() List2.AddItem Text1.Text, Val(Text2.Text) End Sub Private Sub List1_DblClick() List2.AddItem List1.Text List1.RemoveItem List1.ListIndex End Sub Private Sub List2_DblClick() List1.AddItem List2.Text List2.RemoveItem List2.ListIndex End Sub,7.3.1 列表框,7.3.1 列表框,【例7-5】沿用上例,将List1改设为可以一

64、次多选,增加command2,其标题改为“移动”,功能是将List1中选择的多个选项移动到List2中显示。 设计步骤如下: 步骤1 设计界面 按照题目要求修改界面,如图7-8所示,特别是要将List1的MultiSelect属性设置为非0值。 步骤2 编写代码 编写各个命令按钮的click事件过程: Private Sub Command2_Click() Dim I As Integer For I = List1.ListCount - 1 To 0 Step -1 If List1.Selected(I) = True Then List2.AddItem List1.List(I)

65、List1.RemoveItem I End If Next I End Sub,7.3.2 组合框,1.常用属性 Style属性 Text属性 2.常用方法 组合框常用到的有AddItem、RemoveItem和Clear方法,其语法格式和使用方法与列表框相同 3.常用事件 组合框所响应的事件依赖于其Style属性,不过,所有形式的组合框都响应Click事件,但只有“简单组合框”才能响应DblClick事件。只有“下拉组合框”和“简单组合框”才能响应Change事件。,7.3.2 组合框,【例7-6】用组合框控制标签中的字体。 在窗体上设置三个标签、两个组合框,其中一个组合框为下拉表框,内含

66、“宋体”、“黑体”和“楷体_GB2312”三个选项,另一个组合框为下拉组合框,内含14、16和18三个选项。程序运行时,在一个组合框中选定字体,在另一个组合框中选定字号或在其文本框中输入字号,则第一个标签的文字产生相应的变化。程序运行时界面如图7-9所示。,图7-9 组合框的演示,7.3.2 组合框,设计步骤如下: 步骤1 设计界面 按照题目要求设计界面。窗体标题设置为“组合框演示”,控件属性除表7-5要求外,其他属性均采用默认值。 表7-5 控件属性,7.3.2 组合框,步骤2 编写代码 编写窗体过程和命令按钮的Click事件代码。 Private Sub Command1_Click() Label3.FontName = Combo1.Text Label3.FontSize = Val(Combo2.Text) End Sub Private Sub Form_

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