收藏 分享(赏)

第8章-变量与过程的作用范围.ppt

上传人:cjc2202537 文档编号:1041223 上传时间:2018-06-07 格式:PPT 页数:42 大小:266KB
下载 相关 举报
第8章-变量与过程的作用范围.ppt_第1页
第1页 / 共42页
第8章-变量与过程的作用范围.ppt_第2页
第2页 / 共42页
第8章-变量与过程的作用范围.ppt_第3页
第3页 / 共42页
第8章-变量与过程的作用范围.ppt_第4页
第4页 / 共42页
第8章-变量与过程的作用范围.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、第8章 变量与过程的作用范围,第8章 变量与过程的作用范围,在VB中,应用程序是由若干个过程组成的,这些过程一般保存在窗体文件(.frm)或标准模块文件(.bas)中。变量在过程中是必不可少的。根据变量或过程所处的不同位置,可被访问的范围是不相同的。变量与过程可被访问的范围称为变量与过程的作用域。,8.1 代码模块的概念 在建立VB的应用程序时,应首先设计代码的结构。VB应用程序的结构通常如图8-1所示。图8-1 VB应用程序的结构,VB将代码存储在3种不同的模块中:窗体模块(窗体)、标准模块(模块)和类模块。在这3种模块中都可以包含声明(常数、变量、动态链接库DLL的声明)和过程(Sub、F

2、unction、Property过程)。它们形成了工程的一种模块层次结构,可以较好地组织工程,同时也便于代码的维护,如图8-2所示。图8-2 工程中的模块,8.1.1 窗体模块 每个窗体对应一个窗体模块,窗体模块包含窗体及其控件的属性设置、窗体变量的说明、事件过程、窗体内的通用过程、外部过程的窗体级声明。 窗体模块保存在扩展名为.frm的文件中。默认时应用程序中只有一个窗体,因此有一个以.frm为扩展名的窗体模块文件。如果应用程序有多个窗体,就会有多个以.frm为扩展名的窗体模块文件。 如果要在文本编辑器中观察窗体模块,则还会看到窗体及其控件的描述,包括它们的属性设置值,如图8-3所示。窗体模

3、块中也可以引用该应用程序内的其他窗体或对象。 从“工程”菜单中执行“添加窗体”命令,可以添加新窗体模块。,8.1.2 标准模块 标准模块保存在扩展名为.bas的文件中,缺省时应用程序中不包含标准模块。标准模块可以包含公有或模块级的变量、常数、类型、外部过程和全局过程的全局声明或模块级声明。缺省时,标准模块中的代码是公有的,任何窗体或模块中的事件过程或通用过程都可以调用它。写入标准模块的代码不必绑在特定的应用程序上,在许多不同的应用程序中可以重用标准模块。在标准模块中可以存储通用过程,但不能存储事件过程。 从“工程”菜单中执行“添加模块”命令,可以在工程中添加标准模块。,8.1.3 类模块 在V

4、B中,类模块(文件扩展名为.cls)是面向对象编程的基础。程序员可在类模块中编写代码建立新对象,这些新对象可以包含自定义的属性和方法,可以在应用程序内的过程中使用。实际上,窗体本身正是这样一种类模块,在其上可安放控件、可显示窗体窗口。 类模块与标准模块的不同之处在于标准模块仅仅含有代码,而类模块既含有代码又含有数据,类模块可以视为没有物理表示的对象。,8.2 变量的作用范围 变量的作用范围(作用域)指变量能被某一过程识别的范围。当一个应用程序中出现多个过程或函数时,在它们各自的子程序中都可以定义自己的常量、变量。这时,自然会提出一个问题,这些常量或变量是否在程序中到处可用?回答是否定的。 在V

5、B中,可以在过程或模块中声明变量,根据声明变量的位置,变量分为两类:过程级变量(Procedure level)和模块级变量(Module level)。 按照作用范围分类,过程级变量属于局部变量,而模块级变量则属于全局变量。,8.2.1 过程级变量 在一个过程内部使用Dim或Static关键字声明变量时,只有该过程内部的代码才能访问或改变该变量的值,因此被称为“过程级变量”。过程级变量的作用范围限制在该过程内部。例如:Dim a As Integer, b As SingleStatic s As String 如果在过程中未作说明而直接使用某个变量,该变量也被当成过程级变量。用Static

6、说明的变量在应用程序的整个运行过程中都一直存在,而用Dim说明的变量只在过程执行时存在,退出过程后,这类变量就会消失。 过程级变量属于局部变量,只能在建立的过程内有效,即使是在主程序中建立的变量,也不能在被调用的子过程中使用。,【例8-1】过程级局部变量示例。Private Sub Form_Activate() Dim a As Integer, b As Integer, c As Integer 过程级局部变量 a = 5: b = 3 Print Print Tab(15); a; Tab(25); b; Tab(35); c=a*b Print 调用Prod前; Tab(14); a

7、; Tab(24); b; Tab(34); c Call Prod Print 调用Prod后; Tab(14); a; Tab(24); b; Tab(34); c Print Print 调用Sum前; Tab(14); a; Tab(24); b; Tab(34); c Call Sum Print 调用Sum后; Tab(14); a; Tab(24); b; Tab(34); cEnd SubSub Prod() 通用过程Dim a As Integer, b As Integer, c As Integer 过程级局部变量,图8-7 程序运行结果 c = a * b Print

8、Prod子过程; Tab(14); a; Tab(24); b; Tab(34); cEnd SubSub Sum() 通用过程 Dim a As Integer, b As Integer, c As Integer 过程级局部变量 c = a + b Print Sum子过程; Tab(14); a; Tab(24); b; Tab(34); cEnd Sub 程序的运行结果如图8-7所示。从上面程序的运行结果可以看出,主程序中的变量没有带到子过程中。,8.2.2 模块级变量 在模块的通用段中声明的变量属于模块级变量。模块级变量分为私有和公有。1. 私有的模块级变量 私有的模块级变量在声明

9、它的整个模块的所有过程中都能使用,但其他模块却不能访问该变量。声明方法是在模块的通用段中使用Private或Dim关键字声明变量。例如:Private s As StringDim a As Integer, b As Single 在模块的通用段中使用Private或Dim作用相同,但使用Private会提高代码的可读性。,2. 公有的模块级变量 公有的模块级变量在所有模块中的所有过程中都能使用。它的作用范围是整个应用程序,因此公有模块级变量属于全局变量。声明方法是在模块的通用段中使用Public关键字声明变量。例如:Public a As Integer, b As Single 全局变量

10、是指在所有程序(包括主程序和过程)中都可以使用的内存变量。就像在一个过程中定义的变量一样,在子过程中可以任意改变和调用全局变量,当子过程执行完后,其值又带回主程序。 把变量定义为全局变量虽然很方便,但这样会增加变量在程序中被无意修改的机会,因此,如果有更好的处理变量的方法,就不要声明全局变量。另外,用Const语句定义的符号常量也能声明为全局的。,【例8-2】公有的模块级全局变量示例。Public a As Integer, b As Integer, c As Integer 写在“(通用)”的“(声明)”中Private Sub Form_Activate() 事件过程 a = 5: b

11、= 3 Print Tab(15); a; Tab(25); b; Tab(35); c=a*b Print 调用Prod前; Tab(14); a; Tab(24); b; Tab(34); c Call Prod Print 调用Prod后; Tab(14); a; Tab(24); b; Tab(34); c Print Print Tab(15); a; Tab(25); b; Tab(35); c=a+b Print 调用Sum前; Tab(14); a; Tab(24); b; Tab(34); c Call Sum Print 调用Sum后; Tab(14); a; Tab(24

12、); b; Tab(34); cEnd Sub,图8-8 程序运行结果Sub Prod() 通用过程 c = a * b Print Prod子过程; Tab(14); a; Tab(24); b; Tab(34); cEnd SubSub Sum() 通用过程 c = a + b Print Sum子过程; Tab(14); a; Tab(24); b; Tab(34); cEnd Sub 程序的运行结果如图8-8所示。从程序的运行结果可以看出,在模块级中用Public声明的全程变量a、b、c,在各过程中都能访问和修改。,8.2.3 变量的生存期 从变量的作用空间来说,变量有作用范围;从变量

13、的作用时间来说,变量有生存期。 假设过程内部有一个变量,当程序运行进入该过程时,要分配给该变量一定的内存单元,一旦程序退出该过程,变量占有的内存单元是释放还是保留,根据变量在程序运行期间的生命周期,把变量分为静态变量(Static)和动态变量(Dynamic)。静态变量不释放内存单元,动态变量释放内存单元,有时候可能需要某些局部变量是静态变量,而其他变量则为动态变量。,【例8-3】下面程序说明了Static关键字的作用。Private Sub Form_Activate() Dim i As Integer For i = 1 To 6 TestSub Next iEnd SubSub Tes

14、tSub() Dim x As Integer, m As String图8-9 程序运行结果 Static y, n x = x + 1: y = y + 1 m = m nEnd Sub 程序的运行结果如图8-9所示。,说明:x、y、m、n都是过程TestSub中的局部变量,y、n被说明为Static变量,每次调用保持上一次的值,y、n的值会变化;x、m是动态变量,每次调用都被重新初始化为0或,它们的值总是不变。 为使过程中所有的局部变量为静态变量,可在过程头的起始处加上Static关键字。例如:Static Function RunningTotal (num) 这就使过程中的所有局部变

15、量都变为静态,无论它们是用Static、Dim或Private声明的还是隐式声明的。,8.3 过程的作用范围 过程也有作用的范围(作用域),在VB中,过程的作用域分为模块级(或称文件级)和全局级(或称工程级)。8.3.1 模块级过程 模块级过程是在某个模块(文件)内定义的过程。如果在Sub或Function前加关键字Private,则该过程只能被在本模块(文件)中定义的过程调用。即其作用域为本模块(文件)。,8.3.2 全局级过程 全局级过程是在定义过程时,在Sub或Function前加关键字Public(可以默认)。全局级过程可被整个应用程序所有模块(文件)中定义的过程调用。即其作用域为整个

16、应用程序(工程)。,8.3.3 调用其他模块中的过程 在工程中的任何地方都能调用其他模块中的全局过程。调用其他模块中的过程的各种技巧,取决于该过程是在窗体模块中、类模块中还是标准模块中。 (1) 调用窗体中的过程 所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块Form1中包含SomeSub过程,则可使用下面的语句调用Form1中的过程:Call Form1.SomeSub( arguments ),(2) 调用类模块中的过程 与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。例如,DemoClass是类Class1的实例:Dim DemoClas

17、s as New Class1DemoClass.SomeSub 不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量(在这个例子中是DemoClass),并用变量名引用它。,(3) 调用标准模块中的过程 如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。如过程仅出现在一个地方,这个过程就是唯一的。如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。 例如,若在Module1中调用Module2中的CommonName过程,要用下面的语句:Module2.CommonName( argumen

18、ts ),【例8-4】全局级过程的调用,如图8-10所示。 应用程序(工程)中包括两个窗体Forml、Form2和一个标准模块Module1。在Forml窗体中定义了一个计算矩形面积的全局级Function过程,在标准模块Module1中定义了一个计算矩形周长的全局级Function过程。 两个窗体中的命令按钮组的Click事件过程功能相同,差别是调用Function过程时所使用的名字。图8-10 不同窗体对过程的调用,Form1窗体模块中的过程代码如下:Public Function Area(x As Single, y As Single) As Single Area = x * yE

19、nd FunctionPrivate Sub Command1_Click(index As Integer) Dim a As Single, b As Single a = Val(Text1(0).Text) b = Val(Text1(1).Text) n = index If n = 0 Then Label2(0).Caption = Area(a, b) Else Label2(1).Caption = Perimeter(a, b) End IfEnd SubPrivate Sub Form_Load() Form2.ShowEnd Sub,Form2窗体模块中的过程代码如下:

20、Private Sub Command1_Click(index As Integer) Dim a As Single, b As Single a = Val(Text1(0).Text) b = Val(Text1(1).Text) n = index If n = 0 Then Label2(0).Caption = Form1.Area(a, b) Else Label2(1).Caption = Perimeter(a, b) End IfEnd Sub 标准模块Module1中的过程代码:Public Function Perimeter(x As Single, y As Si

21、ngle) As Single Perimeter = 2 * (x + y)End Function,8.4 用户定义类型8.4.1 用户定义类型的概念 假设某校的学生成绩见表8-1。表8-1 学生成绩表表中每列的数据类型相同,都是前面介绍过的基本数据类型,在每一行中却有着不同的数据类型。虽然使用VB的Variant数组允许数组内的元素有不同的数据类型,但却比较浪费内存。此时,VB允许将基本数据类型按需要组合起来,创建自定义的数据类型:用户定义类型(User Defined Type)。,用户定义类型又被称为“记录类型”,类似于C语言中的“结构”。它是一个由若干个基本类型的数据项组合而成的组

22、合项。如表8-1中的每一列都是基本类型的数据项,分别描述同一对象(学生)的不同属性,称为字段(或称为数据项),字段的名称,如学号、姓名、性别、出生日期等称为字段名(或称数据项名)。表中的记录类型就是由这7个数据项组成,其中每个学生的7个具体属性值的集合就是记录值(简称记录),表中共有3个记录值,每位学生有1个记录。如果该校有2000名学生,则该校学生成绩数据文件中就应该有2000个记录。,8.4.2 创建用户定义类型 可以用Type语句创建用户定义的类型,该语句必须置于模块的声明部分。其格式为:Private | Public Type 用户类型名 字段名1 As 类型1 字段名2 As 类型

23、2 字段名n As 类型nEnd Type,8.4.2 创建用户定义类型例如,要建立一个学生成绩处理程序,由于每一位学生都需要学号、姓名、学分和平均成绩等数据项(字段),则可以使用Type语句来定义一个名称为studentrec的记录。Private Type studentrec stunum As String * 6 学号元素为6个字符的定长字符串 names As String * 8 姓名元素为8个字符的定长字符串 credit As Integer 学分元素为整型 avg As Single 平均成绩为单精度型End Type,8.4.3 建立和使用用户定义类型变量 在使用用户定义

24、类型之前,必须用Type语句创建数据类型。1. 建立用户定义类型变量 用户定义类型被创建后,可以用Dim、Redim、Static建立一个具有这种数据类型的变量。例如定义一个具有studentrec类型的变量stu:Dim stu AS studentrec 用户定义类型也可以作为数组元素的数据类型。例如,定义一个拥有100个记录元素的数组student:Dim student(1 To 100) As studentrec,2. 使用用户定义类型变量 如果要存取用户定义类型变量中的某个字段的数据,其格式如下。用户数据类型变量名.字段名 例如,要存取用户定义类型变量stu中names这个字段的

25、数据,要写为:stu.names。【例8-5】把数据值分别赋给stu变量中的各个字段。 首先在窗体模块的通用段创建用户定义类型:Private Type studentrec stunum As String * 6 学号元素为6个字符的定长字符串 names As String * 8 姓名元素为8个字符的定长字符串 credit As Integer 学分元素为整型 avg As Single 平均成绩为单精度型End Type,编写命令按钮的Click事件代码:Private Sub Command1_Click() Dim stu As studentrec 定义一个具有student

26、rec类型的变量stu stu.stunum = 990001 stu.names = 王 平 stu.credit = 65 stu.avg = 88 Text1(0).Text = stu.stunum Text1(1).Text = stu.names Text1(2).Text = stu.credit Text1(3).Text = stu.avgEnd Sub图8-11 运行结果 程序运行结果如图8-11所示。,8.4.4 用户定义类型数组 如果一个数组中元素的数据类型是用户定义类型,则称为用户定义类型数组或记录数组(Array of records)。存取记录数组元素的某个字段数

27、据的语法为:记录数组元素.字段名 例如,存取第1、第28位学生的平均分数,要写为student(1).avgstudent(28).avg,8.4.4 用户定义类型数组【例8-6】假设某班有50位学生,每位学生一个记录,定义一个包含50个元素的用户定义数组,并给第32位学生赋值。 首先在窗体模块的通用段创建用户定义类型:Private Type studentrec stunum As String * 6 names As String * 8 credit As Integer avg As SingleEnd Type,编写命令按钮的Click事件代码:Private Sub Comma

28、nd1_Click() Dim student(1 To 50) As studentrec 定义记录数组 student(32).stunum = 960001 student(32).names = 张大力 student(32).credit = 65 student(32).avg = 88 Text1(0).Text = student(32).stunum Text1(1).Text = student(32).names Text1(2).Text = student(32).credit Text1(3).Text = student(32).avgEnd Sub,8.4.5

29、程序举例【例8-7】输入学生的姓名、学号、语文分数、英语分数、数学分数,计算每名学生的个人平均成绩,并显示学生的各科成绩,如图8-12所示。 首先在窗体的通用段创建用户定义类型并且声明变量:Private Type studentRecord name As String * 6 姓名变量定义为6个字符长度 studentNum As String * 5 学号变量定义为5个字符长度 chinese As Single 语文变量定义为单精度数 english As Single 英语变量定义为单精度数 math As Single 数学变量定义为单精度数 average As Single 平

30、均成绩定义为单精度数End TypeDim stu() As studentRecord 定义记录数组,编写窗体的Load事件代码:Private Sub Form_Load() ReDim stu(0)End Sub编写“输入”按钮Command1的Click事件代码:图8-12 显示学生成绩,Private Sub Command1_Click() n = UBound(stu) ReDim stu(n + 1) With stu(n + 1) .studentNum = Text1(0).Text .name = Text1(1).Text .chinese = Text1(2).Tex

31、t .english = Text1(3).Text .math = Text1(4).Text .average = Int(.chinese + .english + .math) / 3 * 100) / 100 cc = Format(.chinese, ) & Format(.english, ) & _ Format(.math, ) & Format(Str(.average), ) List1.AddItem Format(RTrim(.studentNum), ) & _ Format(RTrim(.name), ) & cc End With Text1(0).SetFoc

32、usEnd Sub,编写“删除”按钮Command2的Click事件代码:Private Sub Command2_Click() If List1.ListIndex = 1 Then MsgBox 请选定欲删除的项! Exit Sub End If n = List1.ListIndex + 1 For i = n To UBound(stu) 1 stu(i) = stu(i + 1) Next List1.RemoveItem n - 1 Text1(0).Text = stu(1).studentNum Text1(1).Text = stu(1).name Text1(2).Tex

33、t = stu(1).chinese Text1(3).Text = stu(1).english Text1(4).Text = stu(1).mathEnd Sub,编写列表框List1的Click事件代码:Private Sub List1_Click() n = List1.ListIndex + 1 Text1(0).Text = stu(n).studentNum Text1(1).Text = stu(n).name Text1(2).Text = stu(n).chinese Text1(3).Text = stu(n).english Text1(4).Text = stu(

34、n).mathEnd Sub,另外编写文本框组的事件代码,使之方便输入:Private Sub Text1_GotFocus(Index As Integer) Text1(Index).SelStart = 0 Text1(Index).SelLength = Len(Text1(Index).Text)End SubPrivate Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) If KeyAscii = 13 Then i = IIf(Index = 4, 0, Index + 1) Text1(i).SetFocus End IfEnd Sub,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报