为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

《VB程序设计》第四章第六节变量和过程的作用范围

2017-10-16 13页 doc 68KB 19阅读

用户头像

is_686908

暂无简介

举报
《VB程序设计》第四章第六节变量和过程的作用范围《VB程序设计》第四章第六节变量和过程的作用范围 《VB程序设计》第四章第六节 变量和过程的作用范围 第六节 变量和过程的作用范围 一、变量的作用范围 变量的作用范围是指变量有效的范围。根据定义变量的位置和定义变量的语句的不同,在VB中变量可以分为过程级变量、模块级变量和全局变量。 1.过程级变量 过程级变量只有在声明它们的过程中才有效,也称为局部变量。用户无法在其他过程中访问或改变该变量的值。用Dim或者Static 关键字来声明它们。 语法: Dim 变量名 As 数据类型 Static 变量名 As 数...
《VB程序设计》第四章第六节变量和过程的作用范围
《VB程序设计》第四章第六节变量和过程的作用范围 《VB程序设计》第四章第六节 变量和过程的作用范围 第六节 变量和过程的作用范围 一、变量的作用范围 变量的作用范围是指变量有效的范围。根据定义变量的位置和定义变量的语句的不同,在VB中变量可以分为过程级变量、模块级变量和全局变量。 1.过程级变量 过程级变量只有在声明它们的过程中才有效,也称为局部变量。用户无法在其他过程中访问或改变该变量的值。用Dim或者Static 关键字来声明它们。 语法: Dim 变量名 As 数据类型 Static 变量名 As 数据类型 对任何临时的计算;采用局部变量是最佳选择。例如,有十来个不同的过程,每个过程都包含变量名为i的变量。只要每个i都被声明为局部变量,那么每个过程只识别它自己的变量i,改变它自己的变量i的值,而不会影响别的过程中的变量i。 在Sub过程中显式定义的变量(使用Dim语句)都是局部变量,而没有在过程中显式定义的变量 ,除非其在该过程外 更高级别的位置显式定义过,否则也是局部变量。可以使用Option Explicit 语句来强制显式定义变量。 2.模块级变量 按照默认规定,模块级变量对该模块的所有过程都有效,在模块中的任何过程都可以访问该变量,但其他模块的过程则不可用。可在窗体模块和模块顶部用Dim或者Private关键字声明模块级变量。 语法: Dim 变量名 As 数据类型 Private 变量名 As 数据类型 通过在代码窗口单击过程列表框的“通用”后,在窗体模块(Form1)中声明模块级变量Temp。 3.全局变量 全局变量的作用范围可以是应用程序的所有过程,也称为公用变量。全局变量可以在模块顶部的声明段用Public关键字声明模块级变量。 语法: Public 变量名 As 数据类型 通过菜单“工程”来添加模块,然后在添加的标准模块(Modulel)的顶部声明全局变量Max。 [例Ex_FormArgu2]在[例Ex FormArgu1]人员管理系统中在进入窗体 frmSecond后分别计算正式员工或临时员工的平均工资,计算平均工资与[例Ex _AverScore]中相同。 Frmsecond窗体的运行界面如图4-6-1(b)所示。 (a) (b) 图 4-6-1 标准模块文件Modulel.bas程序代码如下: Option Explicit Public salary1(5) As Single, salary2(8) As Single Private Sub frmselect(f As Form, cmdcap As String) '传递窗体参数 f.Caption=cmdcap & "人员管理" End Sub Private Sub labselect(l As Control, cmdcap As String) '传递窗体参数 l.Caption="欢迎进入" & Chr(13) & cmdcap & "人员管理" l.FontSize=16 l.FontBold=True l.Visible=True frmsecond.Show frmfirst.Hide End Sub Private Sub cmdemployee_click(index As Integer) '单击不同按钮 '将按钮的文本传递给frmsecond窗体标题 Call frmselect(frmsecond, cmdemployee(index).Caption) Call labselect(frmsecond.Label1, cmdemployee(index).Caption) frmsecond.Show frmfirst.Hide End Sub Private Sub Form_Load() salary1(0)=1900: salary1(1)=1970: salary1(2)=1915 '设置初始值 salary1(3)=1600: salary1(4)=1655 salary2(0)=2675: salary2(1)=2780: salary2(2)=2715 salary2(3)=2540: salary2(4)=2990: salary2(5)=2770 salary2(6)=2895: salary2(7)=2765 End Sub Private Function average(stuarray() As Single, n As Integer) As Single '求平均值 Dim i As Integer Dim aver As Single, sum As Single For i=1 To n - 1 sum=sum + stuarray(i) Next aver=sum / n average=aver End Function Private Sub cmdstart_Click() If "正式"=Mid(frmsecond.Caption, 1, 2) Then txts1.Text=Int(average(salary2(), 8) * 100) / 100 '求正式员工的平均工资 ElseIf "临时"=Mid(frmsecond.Caption, 1, 2) Then txts1.Text=Int(average(salary1(), 5) * 100) / 100 '求临时员工的平均工资 End If End Sub Private Sub Command2_Click() Me.Hide frmfirst.Show txts1.Text=" " End Sub 在标准模块中声明的全局变量,在应用程序中的任何一个过程中可以直接用该变量名来引用它,例如,Salary1和Salary2数组。而在某个窗体模块中声明的全局变量,当其他窗体模块引用它时,必须用定义它的窗体模块名为前缀。例如,窗体Form1模块中定义了变量Max ,在窗体Form2中要引用,必须使用“Form1.Max”。 注意: 常数、固定字符串、数组、自定义类型都不能作为窗体模块声明的全局变量。 二、静态变量 变量除了使用范围外 ,还有存活期 ,也就是变量能够保持其值的时期。模块级变量和全局变量的存活期是整个应用程序的运行期间。 对于在过程中用Dim 声明的过程级变量仅当本过程执行期间存在,当一个过程执行完毕,它的过程级值就不存在了,过程级变量所占的内存也被释放。当下一次执行该过程时,所有局部变量将重新初始化。静态变量是在过程结束后仍保留变量的值,即其占用的内存单元未释放。 将过程级变量定义成静态变量可以在过程中使用Static关键字来声明变量,其用法和Dim语句完全一样。通常Static关键字和递归的Sub过程不能在一起使用。 [例Ex_Plus]用函数调用的方法计算?n。 Private Static Function Fac(n As Integer) Dim f as Integer f=f+n Fac=f End Function Private Sub Form_Click() Dim I As Integer For I=1 To 5 Print ″?″;I & ″=″& Fac(i) Next i End Sub 程序分析: ?过程定义语句“Private Static Function Fac (n As Integer)”是为了使过程中所有的过程级变量为静态变量。在过程头前加上Static关键字时,无论过程中的变量是用 Static、Dim或Private声明的还是隐式声明的,都会变成静态变量。 ?被调函数Fac是计算?n的值,局部变量f为静态变量,在每次调用Fac函数结束时变量f的值保留为?i,再与下次的i+1相加。 ?如果不用Static声明变量f,则以前的和不会保留,每次调用时函数中f的初值为0。 ?如果在模块的声明段定义f,则f成为模块级变量,也会收到同样效果。但是,由于其他过程也可以访问和改变模块级变量的值,因此运算结果也许不可靠,代码将难于维护。 三、过程的作用范围 1.过程的作用范围 与变量的作用范围相同,过程也有其作用范围,即过程的有效范围。Sub过程和Function过程的作用范围是通过定义语句来声明的。 语法: [Private|Public][Static] Sub 过程名([参数列表] ) [Private|Public][Static] Function 函数名([参数列表]) [As数据类型] ?Public表示是全局过程(公用过程),所有模块的其他过程都可访问这个过程。按照默认规定,所有模块中的子过程为Public,因此在应用程序中可随处调用。 ?Private表示是局部过程(私用过程),只有本模块中的过程才可以访问。 2.过程的外部调用 外部调用是指调用其他模块中的全局过程,调用其他模块中的过程的方法取决于该过程所属的模块是在窗体模块、标准模块还是类模块。 (1)窗体模块中的过程 外部调用窗体中的全局过程,必须以窗体名为调用的前缀。 语法: Call 窗体名.全局过程名[(实参列表)] 例如,在窗体Form2中定义一个全局过程Subl,在窗体Form1中调用Form2中的Sub1过程的语句: Call Form2.Sub1(实参列表) (2)标准模块中的过程 标准模块(.bas)中的过程,如果过程名是惟一的,则不必在调用时加模块名。如果有两个以上的模块包含同名的过程,则调用本模块内过程时不必加模块名而调用其他模块的过程时必须以模块名为前缀。 语法: Call[标准模块名].全局过程名[(实参列表)] 例如,对于Module1和Module2中名为Sub1的过程,从Module1中调用Module2中的Sub1语句如下: Call Module2.Subl(实参列表) 而不加Module2前缀时,则运行Module1中的Sub1过程。 (3)调用类模块的过程 调用类模块中的全局过程,要求用指向该类的某一实例作前缀。首先声明类的实例为对象变量,并以此变量作为过程名前缀,不可直接用类名作为前缀。 语法: Call 变量.过程名([实参表列]) 例如,类模块为Class1,类模块的过程Class Sub,变量名为ExaClass,调用过程的语句如下: Dim ExaClass As NewClass1 Call ExaClass.Class Sub([实参表列]) 四、使用同名的变量 在不同的范围内应用程序可能会使用到多个同名的变量,例如可能有几个同名的局部变量,局部变量与模块变量同名,局部变量、模块变量与全局变量同名等情况出现。 1.不同模块中的全局变量使用同一名字 不同模块中的全局变量使用同一名字,则通过引用“模块名.变量名”。 例如,在—个新工程中插入一个标准模块Module1,并在窗体Form1上添加两个命令按钮Command1和Command2。在标准模块Module1中声明全局变量Max,在窗体模块Form1中声明全局变量Max。 标准模块文件Module1.bas程序代码如下: Option Explicit Public Max As Integer ′声明Module1的Max Sub Test( ) ′声明局部过程Test Max=1 End Sub 窗体模块文件Form1.frm程序代码如下: Option Explicit Public Max As Integer '声明FormI的Max变量。 Sub Test() '声明局部过程Test Max=3 End Sub Private Sub Command1_Click() Module1.Test ′调用Module1中的Test '显示Module1的Max MsgBox "Max=" & Module1.Max, vbOKOnly, "Module1中的Max" End Sub Private Sub Command2_Click() Test '调用Form1中的Test。 '显示Form1的Max。 MsgBox "Max=" & Max, vbOKOnly, "Form1中的Max" End Sub 运行结果,单击Command1显示如图4-6-2(a),单击Command1显示(b)。 (a) (b) 图 4-6-2 程序分析: ?在Form1模块中调用本模块的Test过程时不必指定Form1.Test,使用Max的值时也不必指定Form1.Max。 ?在Form模块中调用Module1的Test过程时必须指定Module1.Test,使用Max的值时也不必指定Module1.Max。 2.全局变量与局部变量同名 当全局变量与局部变量同名时,全局变量和局部变量在不同的范围内有效。在过程内局部变量有效;而在过程外全局变量有效。 例如,定义Temp为全局变量,然后在过程中又定义Temp为局部变量。 单击Command1按钮时,在窗体显示Form1.Temp为1和Temp的值为2。 程序代码如下: Option Explicit Public Temp As Integer Sub Test() Dim Temp As Integer Temp=2 'Temp的值为2。 Print "Form1.Temp=" & Form1.Temp 'Form1.Temp的值为2 Print "Temp=" & Temp ' Temp的值为2。 End Sub Private Sub Command1_Click() Test End Sub Private Sub Form_Load() Temp=1 '将Form1.Temp的值设置成1 End Sub 3.窗体的属性、控件名与变量同名 窗体的属性、控件、符号常数和过程都被视为窗体模块中的模块级变量。窗体属性名、控件名与模块级变量、常数和过程名相同是不合法的,因为它们的作用范围相同。因此,在窗体模块中应尽量使变量名和窗体中的控件名不一样,养成对不同的变量使用不同的名称的编程习惯。 在窗体模块内,和窗体中控件同名的局部变量将遮住同名控件。因此必须引用窗体名称或Me关键字来限定控件,才能设置或得到该控件的属性值。 例如:在窗体有一个文本框Text1,也有一个局部变量Text1。 Option Explicit Private Sub Form_Click() Dim Text1 Text1="Variable" ' 变量值为"Variable" Me.Text1="Control" ' 控件必须用Me限定。 Me.Text1.Top=0 ' 设置文本框的位置。 End Sub [例Ex_Divisor2]用辗转除法求两个自然数的最大公约数,从窗体的文本框输入两个自然数。 窗体中使用了3个文本框、2个按钮和4个标签。其对象属性设置如表4-6-1所示。 表 4-6-1 对 象 对象名 属性名 属性值 Form frmDivisor Caption 求最大公约数 cmdStart Caption 计算 CommandButton cmdClose Caption 关闭 TxtM Caption 空 TxtN Caption 空 TextBox TxtResult Caption 空 Locked True TabStop False LabM Caption M: LabN Caption Label LabResult Caption 最大公约数= Label1 Caption 请输入自然数M与N 计算的结果显示在txtResult文本框中。由于文本框txtResult显示计算结果不能让用户修改,因此属性Locked和TabStop要进行相应设置。
/
本文档为【《VB程序设计》第四章第六节变量和过程的作用范围】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索