vb变量与过程的作用范围.ppt_第1页
vb变量与过程的作用范围.ppt_第2页
vb变量与过程的作用范围.ppt_第3页
vb变量与过程的作用范围.ppt_第4页
vb变量与过程的作用范围.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章变量与过程的作用范围 第8章变量与过程的作用范围 在VB中 应用程序是由若干个过程组成的 这些过程一般保存在窗体文件 frm 或标准模块文件 bas 中 变量在过程中是必不可少的 根据变量或过程所处的不同位置 可被访问的范围是不相同的 变量与过程可被访问的范围称为变量与过程的作用域 8 1代码模块的概念在建立VB的应用程序时 应首先设计代码的结构 VB应用程序的结构通常如图8 1所示 图8 1VB应用程序的结构 VB将代码存储在3种不同的模块中 窗体模块 窗体 标准模块 模块 和类模块 在这3种模块中都可以包含声明 常数 变量 动态链接库DLL的声明 和过程 Sub Function Property过程 它们形成了工程的一种模块层次结构 可以较好地组织工程 同时也便于代码的维护 如图8 2所示 图8 2工程中的模块 8 1 1窗体模块每个窗体对应一个窗体模块 窗体模块包含窗体及其控件的属性设置 窗体变量的说明 事件过程 窗体内的通用过程 外部过程的窗体级声明 窗体模块保存在扩展名为 frm的文件中 默认时应用程序中只有一个窗体 因此有一个以 frm为扩展名的窗体模块文件 如果应用程序有多个窗体 就会有多个以 frm为扩展名的窗体模块文件 如果要在文本编辑器中观察窗体模块 则还会看到窗体及其控件的描述 包括它们的属性设置值 如图8 3所示 窗体模块中也可以引用该应用程序内的其他窗体或对象 从 工程 菜单中执行 添加窗体 命令 可以添加新窗体模块 8 1 2标准模块标准模块保存在扩展名为 bas的文件中 缺省时应用程序中不包含标准模块 标准模块可以包含公有或模块级的变量 常数 类型 外部过程和全局过程的全局声明或模块级声明 缺省时 标准模块中的代码是公有的 任何窗体或模块中的事件过程或通用过程都可以调用它 写入标准模块的代码不必绑在特定的应用程序上 在许多不同的应用程序中可以重用标准模块 在标准模块中可以存储通用过程 但不能存储事件过程 从 工程 菜单中执行 添加模块 命令 可以在工程中添加标准模块 8 1 3类模块在VB中 类模块 文件扩展名为 cls 是面向对象编程的基础 程序员可在类模块中编写代码建立新对象 这些新对象可以包含自定义的属性和方法 可以在应用程序内的过程中使用 实际上 窗体本身正是这样一种类模块 在其上可安放控件 可显示窗体窗口 类模块与标准模块的不同之处在于标准模块仅仅含有代码 而类模块既含有代码又含有数据 类模块可以视为没有物理表示的对象 8 2变量的作用范围变量的作用范围 作用域 指变量能被某一过程识别的范围 当一个应用程序中出现多个过程或函数时 在它们各自的子程序中都可以定义自己的常量 变量 这时 自然会提出一个问题 这些常量或变量是否在程序中到处可用 回答是否定的 在VB中 可以在过程或模块中声明变量 根据声明变量的位置 变量分为两类 过程级变量 Procedurelevel 和模块级变量 Modulelevel 按照作用范围分类 过程级变量属于局部变量 而模块级变量则属于全局变量 8 2 1过程级变量在一个过程内部使用Dim或Static关键字声明变量时 只有该过程内部的代码才能访问或改变该变量的值 因此被称为 过程级变量 过程级变量的作用范围限制在该过程内部 例如 DimaAsInteger bAsSingleStaticsAsString如果在过程中未作说明而直接使用某个变量 该变量也被当成过程级变量 用Static说明的变量在应用程序的整个运行过程中都一直存在 而用Dim说明的变量只在过程执行时存在 退出过程后 这类变量就会消失 过程级变量属于局部变量 只能在建立的过程内有效 即使是在主程序中建立的变量 也不能在被调用的子过程中使用 例8 1 过程级局部变量示例 PrivateSubForm Activate DimaAsInteger bAsInteger cAsInteger 过程级局部变量a 5 b 3PrintPrintTab 15 a Tab 25 b Tab 35 c a b Print 调用Prod前 Tab 14 a Tab 24 b Tab 34 cCallProdPrint 调用Prod后 Tab 14 a Tab 24 b Tab 34 cPrintPrint 调用Sum前 Tab 14 a Tab 24 b Tab 34 cCallSumPrint 调用Sum后 Tab 14 a Tab 24 b Tab 34 cEndSubSubProd 通用过程DimaAsInteger bAsInteger cAsInteger 过程级局部变量 图8 7程序运行结果c a bPrint Prod子过程 Tab 14 a Tab 24 b Tab 34 cEndSubSubSum 通用过程DimaAsInteger bAsInteger cAsInteger 过程级局部变量c a bPrint Sum子过程 Tab 14 a Tab 24 b Tab 34 cEndSub程序的运行结果如图8 7所示 从上面程序的运行结果可以看出 主程序中的变量没有带到子过程中 8 2 2模块级变量在模块的通用段中声明的变量属于模块级变量 模块级变量分为私有和公有 1 私有的模块级变量私有的模块级变量在声明它的整个模块的所有过程中都能使用 但其他模块却不能访问该变量 声明方法是在模块的通用段中使用Private或Dim关键字声明变量 例如 PrivatesAsStringDimaAsInteger bAsSingle在模块的通用段中使用Private或Dim作用相同 但使用Private会提高代码的可读性 2 公有的模块级变量公有的模块级变量在所有模块中的所有过程中都能使用 它的作用范围是整个应用程序 因此公有模块级变量属于全局变量 声明方法是在模块的通用段中使用Public关键字声明变量 例如 PublicaAsInteger bAsSingle全局变量是指在所有程序 包括主程序和过程 中都可以使用的内存变量 就像在一个过程中定义的变量一样 在子过程中可以任意改变和调用全局变量 当子过程执行完后 其值又带回主程序 把变量定义为全局变量虽然很方便 但这样会增加变量在程序中被无意修改的机会 因此 如果有更好的处理变量的方法 就不要声明全局变量 另外 用Const语句定义的符号常量也能声明为全局的 例8 2 公有的模块级全局变量示例 PublicaAsInteger bAsInteger cAsInteger 写在 通用 的 声明 中PrivateSubForm Activate 事件过程a 5 b 3PrintTab 15 a Tab 25 b Tab 35 c a b Print 调用Prod前 Tab 14 a Tab 24 b Tab 34 cCallProdPrint 调用Prod后 Tab 14 a Tab 24 b Tab 34 cPrintPrintTab 15 a Tab 25 b Tab 35 c a b Print 调用Sum前 Tab 14 a Tab 24 b Tab 34 cCallSumPrint 调用Sum后 Tab 14 a Tab 24 b Tab 34 cEndSub 图8 8程序运行结果SubProd 通用过程c a bPrint Prod子过程 Tab 14 a Tab 24 b Tab 34 cEndSubSubSum 通用过程c a bPrint Sum子过程 Tab 14 a Tab 24 b Tab 34 cEndSub程序的运行结果如图8 8所示 从程序的运行结果可以看出 在模块级中用Public声明的全程变量a b c 在各过程中都能访问和修改 8 2 3变量的生存期从变量的作用空间来说 变量有作用范围 从变量的作用时间来说 变量有生存期 假设过程内部有一个变量 当程序运行进入该过程时 要分配给该变量一定的内存单元 一旦程序退出该过程 变量占有的内存单元是释放还是保留 根据变量在程序运行期间的生命周期 把变量分为静态变量 Static 和动态变量 Dynamic 静态变量不释放内存单元 动态变量释放内存单元 有时候可能需要某些局部变量是静态变量 而其他变量则为动态变量 例8 3 下面程序说明了Static关键字的作用 PrivateSubForm Activate DimiAsIntegerFori 1To6TestSubNextiEndSubSubTestSub DimxAsInteger mAsString图8 9程序运行结果Staticy nx x 1 y y 1m mnEndSub程序的运行结果如图8 9所示 说明 x y m n都是过程TestSub中的局部变量 y n被说明为Static变量 每次调用保持上一次的值 y n的值会变化 x m是动态变量 每次调用都被重新初始化为0或 它们的值总是不变 为使过程中所有的局部变量为静态变量 可在过程头的起始处加上Static关键字 例如 StaticFunctionRunningTotal num 这就使过程中的所有局部变量都变为静态 无论它们是用Static Dim或Private声明的还是隐式声明的 8 3过程的作用范围过程也有作用的范围 作用域 在VB中 过程的作用域分为模块级 或称文件级 和全局级 或称工程级 8 3 1模块级过程模块级过程是在某个模块 文件 内定义的过程 如果在Sub或Function前加关键字Private 则该过程只能被在本模块 文件 中定义的过程调用 即其作用域为本模块 文件 8 3 2全局级过程全局级过程是在定义过程时 在Sub或Function前加关键字Public 可以默认 全局级过程可被整个应用程序所有模块 文件 中定义的过程调用 即其作用域为整个应用程序 工程 8 3 3调用其他模块中的过程在工程中的任何地方都能调用其他模块中的全局过程 调用其他模块中的过程的各种技巧 取决于该过程是在窗体模块中 类模块中还是标准模块中 1 调用窗体中的过程所有窗体模块的外部调用必须指向包含此过程的窗体模块 如果在窗体模块Form1中包含SomeSub过程 则可使用下面的语句调用Form1中的过程 CallForm1 SomeSub arguments 2 调用类模块中的过程与窗体中调用过程类似 在类模块中调用过程要调用与过程一致并且指向类实例的变量 例如 DemoClass是类Class1的实例 DimDemoClassasNewClass1DemoClass SomeSub不同于窗体的是 在引用一个类的实例时 不能用类名作限定符 必须首先声明类的实例为对象变量 在这个例子中是DemoClass 并用变量名引用它 3 调用标准模块中的过程如果过程名是唯一的 则不必在调用时加模块名 无论是在模块内 还是在模块外调用 结果总会引用这个唯一过程 如过程仅出现在一个地方 这个过程就是唯一的 如果两个以上的模块都包含同名的过程 那就有必要用模块名来限定了 例如 若在Module1中调用Module2中的CommonName过程 要用下面的语句 Module2 CommonName arguments 例8 4 全局级过程的调用 如图8 10所示 应用程序 工程 中包括两个窗体Forml Form2和一个标准模块Module1 在Forml窗体中定义了一个计算矩形面积的全局级Function过程 在标准模块Module1中定义了一个计算矩形周长的全局级Function过程 两个窗体中的命令按钮组的Click事件过程功能相同 差别是调用Function过程时所使用的名字 图8 10不同窗体对过程的调用 Form1窗体模块中的过程代码如下 PublicFunctionArea xAsSingle yAsSingle AsSingleArea x yEndFunctionPrivateSubCommand1 Click indexAsInteger DimaAsSingle bAsSinglea Val Text1 0 Text b Val Text1 1 Text n indexIfn 0ThenLabel2 0 Caption Area a b ElseLabel2 1 Caption Perimeter a b EndIfEndSubPrivateSubForm Load Form2 ShowEndSub Form2窗体模块中的过程代码如下 PrivateSubCommand1 Click indexAsInteger DimaAsSingle bAsSinglea Val Text1 0 Text b Val Text1 1 Text n indexIfn 0ThenLabel2 0 Caption Form1 Area a b ElseLabel2 1 Caption Perimeter a b EndIfEndSub标准模块Module1中的过程代码 PublicFunctionPerimeter xAsSingle yAsSingle AsSinglePerimeter 2 x y EndFunction 8 4用户定义类型8 4 1用户定义类型的概念假设某校的学生成绩见表8 1 表8 1学生成绩表表中每列的数据类型相同 都是前面介绍过的基本数据类型 在每一行中却有着不同的数据类型 虽然使用VB的Variant数组允许数组内的元素有不同的数据类型 但却比较浪费内存 此时 VB允许将基本数据类型按需要组合起来 创建自定义的数据类型 用户定义类型 UserDefinedType 用户定义类型又被称为 记录类型 类似于C语言中的 结构 它是一个由若干个基本类型的数据项组合而成的组合项 如表8 1中的每一列都是基本类型的数据项 分别描述同一对象 学生 的不同属性 称为字段 或称为数据项 字段的名称 如学号 姓名 性别 出生日期等称为字段名 或称数据项名 表中的记录类型就是由这7个数据项组成 其中每个学生的7个具体属性值的集合就是记录值 简称记录 表中共有3个记录值 每位学生有1个记录 如果该校有2000名学生 则该校学生成绩数据文件中就应该有2000个记录 8 4 2创建用户定义类型可以用Type语句创建用户定义的类型 该语句必须置于模块的声明部分 其格式为 Private Public Type 用户类型名 字段名1 As 类型1 字段名2 As 类型2 字段名n As 类型n EndType 8 4 2创建用户定义类型例如 要建立一个学生成绩处理程序 由于每一位学生都需要学号 姓名 学分和平均成绩等数据项 字段 则可以使用Type语句来定义一个名称为studentrec的记录 PrivateTypestudentrecstunumAsString 6 学号元素为6个字符的定长字符串namesAsString 8 姓名元素为8个字符的定长字符串creditAsInteger 学分元素为整型avgAsSingle 平均成绩为单精度型EndType 8 4 3建立和使用用户定义类型变量在使用用户定义类型之前 必须用Type语句创建数据类型 1 建立用户定义类型变量用户定义类型被创建后 可以用Dim Redim Static建立一个具有这种数据类型的变量 例如定义一个具有studentrec类型的变量stu DimstuASstudentrec用户定义类型也可以作为数组元素的数据类型 例如 定义一个拥有100个记录元素的数组student Dimstudent 1To100 Asstudentrec 2 使用用户定义类型变量如果要存取用户定义类型变量中的某个字段的数据 其格式如下 用户数据类型变量名 字段名 例如 要存取用户定义类型变量stu中names这个字段的数据 要写为 stu names 例8 5 把数据值分别赋给stu变量中的各个字段 首先在窗体模块的通用段创建用户定义类型 PrivateTypestudentrecstunumAsString 6 学号元素为6个字符的定长字符串namesAsString 8 姓名元素为8个字符的定长字符串creditAsInteger 学分元素为整型avgAsSingle 平均成绩为单精度型EndType 编写命令按钮的Click事件代码 PrivateSubCommand1 Click DimstuAsstudentrec 定义一个具有studentrec类型的变量stustu stunum 990001 stu names 王平 stu credit 65stu avg 88Text1 0 Text stu stunumText1 1 Text stu namesText1 2 Text stu creditText1 3 Text stu avgEndSub图8 11运行结果程序运行结果如图8 11所示 8 4 4用户定义类型数组如果一个数组中元素的数据类型是用户定义类型 则称为用户定义类型数组或记录数组 Arrayofrecords 存取记录数组元素的某个字段数据的语法为 记录数组元素 字段名 例如 存取第1 第28位学生的平均分数 要写为student 1 avgstudent 28 avg 8 4 4用户定义类型数组 例8 6 假设某班有50位学生 每位学生一个记录 定义一个包含50个元素的用户定义数组 并给第32位学生赋值 首先在窗体模块的通用段创建用户定义类型 PrivateTypestudentrecstunumAsString 6namesAsString 8creditAsIntegeravgAsSingleEndType 编写命令按钮的Click事件代码 PrivateSubCommand1 Click Dimstudent 1To50 Asstudentrec 定义记录数组student 32 stunum 960001 student 32 names 张大力 student 32 credit 65student 32 avg 88Text1 0 Text student 32 stunumText1 1 Text student 32 namesText1 2 Text student 32 creditText1 3 Text student 32 avgEndSub 8 4 5程序举例 例8 7 输入学生的姓名 学号 语文分数 英语分数 数学分数 计算每名学生的个人平均成绩 并显示学生的各科成绩 如图8 12所示 首先在窗体的通用段创建用户定义类型并且声明变量 PrivateTypestudentRecordnameAsString 6 姓名变量定义为6个字符长度studentNumAsString 5 学号变量定义为5个字符长度chineseAsSingle 语文变量定义为单精度数englishAsSingle 英语变量定义为单精度数mathAsSingle 数学变量定义为单精度数averageAsSingle 平均成绩定义为单精度数EndTypeDimstu AsstudentRecord 定义记录数组 编写窗体的Load事件代码 PrivateSubForm Load ReDimstu 0 EndSub编写 输入 按钮Command1的Click事件代码 图8 12显示学生成绩 PrivateSubCommand1 Click n UBound stu ReDimstu n 1 Withstu n 1 studentNum Text1 0 Text name Text1 1 Text chinese Text1 2 Text english Text1 3 Text math Text1 4 Text average Int chinese english math 3 100 100

温馨提示

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

评论

0/150

提交评论