《《VB程序设计》第四章第六节 变量和过程的作用范围.doc》由会员分享,可在线阅读,更多相关《《VB程序设计》第四章第六节 变量和过程的作用范围.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VB程序设计第四章第六节变量和过程的作用范围第六节变量和过程的作用范围一、变量的作用范围变量的作用范围是指变量有效的范围。根据定义变量的位置和定义变量的语句的不同,在VB中变量可以分为过程级变量、模块级变量和全局变量。1.过程级变量过程级变量只有在声明它们的过程中才有效,也称为局部变量。用户无法在其他过程中访问或改变该变量的值。用Dim或者Static 关键字来声明它们。语法:Dim 变量名 As 数据类型Static 变量名 As 数据类型对任何临时的计算;采用局部变量是最佳选择。例如,有十来个不同的过程,每个过程都包含变量名为i的变量。只要每个i都被声明为局部变量,那么每个过程只识别它自己
2、的变量i,改变它自己的变量i的值,而不会影响别的过程中的变量i。在Sub过程中显式定义的变量(使用Dim语句)都是局部变量,而没有在过程中显式定义的变量 ,除非其在该过程外 更高级别的位置显式定义过,否则也是局部变量。可以使用Option Explicit 语句来强制显式定义变量。2.模块级变量按照默认规定,模块级变量对该模块的所有过程都有效,在模块中的任何过程都可以访问该变量,但其他模块的过程则不可用。可在窗体模块和标准模块顶部用Dim或者Private关键字声明模块级变量。语法:Dim 变量名 As 数据类型Private 变量名 As 数据类型通过在代码窗口单击过程列表框的“通用”后,在
3、窗体模块(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标准模
4、块文件Modulel.bas程序代码如下: Option ExplicitPublic salary1(5) As Single, salary2(8) As SinglePrivate Sub frmselect(f As Form, cmdcap As String)传递窗体参数f.Caption=cmdcap & 人员管理End SubPrivate Sub labselect(l As Control, cmdcap As String)传递窗体参数l.Caption=欢迎进入 & Chr(13) & cmdcap & 人员管理l.FontSize=16l.FontBold=Truel
5、.Visible=Truefrmsecond.Showfrmfirst.HideEnd SubPrivate Sub cmdemployee_click(index As Integer)单击不同按钮将按钮的文本传递给frmsecond窗体标题Call frmselect(frmsecond, cmdemployee(index).Caption)Call labselect(frmsecond.Label1, cmdemployee(index).Caption)frmsecond.Showfrmfirst.HideEnd SubPrivate Sub Form_Load()salary1(
6、0)=1900: salary1(1)=1970: salary1(2)=1915 设置初始值salary1(3)=1600: salary1(4)=1655salary2(0)=2675: salary2(1)=2780: salary2(2)=2715salary2(3)=2540: salary2(4)=2990: salary2(5)=2770salary2(6)=2895: salary2(7)=2765End SubPrivate Function average(stuarray() As Single, n As Integer) As Single求平均值Dim i As I
7、ntegerDim aver As Single, sum As SingleFor i=1 To n - 1sum=sum + stuarray(i)Nextaver=sum / naverage=averEnd FunctionPrivate Sub cmdstart_Click()If 正式=Mid(frmsecond.Caption, 1, 2) Thentxts1.Text=Int(average(salary2(), 8) * 100) / 100求正式员工的平均工资ElseIf 临时=Mid(frmsecond.Caption, 1, 2) Thentxts1.Text=Int(
8、average(salary1(), 5) * 100) / 100求临时员工的平均工资End IfEnd SubPrivate Sub Command2_Click()Me.Hidefrmfirst.Showtxts1.Text= End Sub在标准模块中声明的全局变量,在应用程序中的任何一个过程中可以直接用该变量名来引用它,例如,Salary1和Salary2数组。而在某个窗体模块中声明的全局变量,当其他窗体模块引用它时,必须用定义它的窗体模块名为前缀。例如,窗体Form1模块中定义了变量Max ,在窗体Form2中要引用,必须使用“Form1.Max”。注意:常数、固定字符串、数组、自
9、定义类型都不能作为窗体模块声明的全局变量。二、静态变量变量除了使用范围外 ,还有存活期 ,也就是变量能够保持其值的时期。模块级变量和全局变量的存活期是整个应用程序的运行期间。对于在过程中用Dim 声明的过程级变量仅当本过程执行期间存在,当一个过程执行完毕,它的过程级值就不存在了,过程级变量所占的内存也被释放。当下一次执行该过程时,所有局部变量将重新初始化。静态变量是在过程结束后仍保留变量的值,即其占用的内存单元未释放。将过程级变量定义成静态变量可以在过程中使用Static关键字来声明变量,其用法和Dim语句完全一样。通常Static关键字和递归的Sub过程不能在一起使用。例Ex_Plus用函数
10、调用的方法计算n。Private Static Function Fac(n As Integer)Dim f as Integerf=f+nFac=fEnd FunctionPrivate Sub Form_Click()Dim I As IntegerFor I=1 To 5Print ;I & =& Fac(i)Next iEnd Sub程序分析:过程定义语句“Private Static Function Fac (n As Integer)”是为了使过程中所有的过程级变量为静态变量。在过程头前加上Static关键字时,无论过程中的变量是用Static、Dim或Private声明的还是
11、隐式声明的,都会变成静态变量。被调函数Fac是计算n的值,局部变量f为静态变量,在每次调用Fac函数结束时变量f的值保留为i,再与下次的i+1相加。如果不用Static声明变量f,则以前的和不会保留,每次调用时函数中f的初值为0。如果在模块的声明段定义f,则f成为模块级变量,也会收到同样效果。但是,由于其他过程也可以访问和改变模块级变量的值,因此运算结果也许不可靠,代码将难于维护。三、过程的作用范围1.过程的作用范围与变量的作用范围相同,过程也有其作用范围,即过程的有效范围。Sub过程和Function过程的作用范围是通过定义语句来声明的。语法:Private|PublicStatic Sub
12、 过程名(参数列表 )Private|PublicStatic Function 函数名(参数列表) As数据类型Public表示是全局过程(公用过程),所有模块的其他过程都可访问这个过程。按照默认规定,所有模块中的子过程为Public,因此在应用程序中可随处调用。Private表示是局部过程(私用过程),只有本模块中的过程才可以访问。2.过程的外部调用外部调用是指调用其他模块中的全局过程,调用其他模块中的过程的方法取决于该过程所属的模块是在窗体模块、标准模块还是类模块。(1)窗体模块中的过程外部调用窗体中的全局过程,必须以窗体名为调用的前缀。语法:Call 窗体名.全局过程名(实参列表)例如
13、,在窗体Form2中定义一个全局过程Subl,在窗体Form1中调用Form2中的Sub1过程的语句:Call Form2.Sub1(实参列表)(2)标准模块中的过程标准模块(.bas)中的过程,如果过程名是惟一的,则不必在调用时加模块名。如果有两个以上的模块包含同名的过程,则调用本模块内过程时不必加模块名而调用其他模块的过程时必须以模块名为前缀。语法:Call标准模块名.全局过程名(实参列表)例如,对于Module1和Module2中名为Sub1的过程,从Module1中调用Module2中的Sub1语句如下:Call Module2.Subl(实参列表)而不加Module2前缀时,则运行M
14、odule1中的Sub1过程。(3)调用类模块的过程调用类模块中的全局过程,要求用指向该类的某一实例作前缀。首先声明类的实例为对象变量,并以此变量作为过程名前缀,不可直接用类名作为前缀。语法:Call 变量.过程名(实参表列)例如,类模块为Class1,类模块的过程Class Sub,变量名为ExaClass,调用过程的语句如下:Dim ExaClass As NewClass1Call ExaClass.Class Sub(实参表列)四、使用同名的变量在不同的范围内应用程序可能会使用到多个同名的变量,例如可能有几个同名的局部变量,局部变量与模块变量同名,局部变量、模块变量与全局变量同名等情况
15、出现。1.不同模块中的全局变量使用同一名字不同模块中的全局变量使用同一名字,则通过引用“模块名.变量名”。例如,在个新工程中插入一个标准模块Module1,并在窗体Form1上添加两个命令按钮Command1和Command2。在标准模块Module1中声明全局变量Max,在窗体模块Form1中声明全局变量Max。 标准模块文件Module1.bas程序代码如下:Option ExplicitPublic Max As Integer 声明Module1的MaxSub Test( ) 声明局部过程TestMax=1End Sub窗体模块文件Form1.frm程序代码如下:Option Expl
16、icitPublic Max As Integer 声明FormI的Max变量。Sub Test() 声明局部过程TestMax=3End SubPrivate Sub Command1_Click()Module1.Test 调用Module1中的Test显示Module1的MaxMsgBox Max= & Module1.Max, vbOKOnly, Module1中的MaxEnd SubPrivate Sub Command2_Click()Test 调用Form1中的Test。显示Form1的Max。MsgBox Max= & Max, vbOKOnly, Form1中的MaxEnd
17、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为局部变量。单击Co
18、mmand1按钮时,在窗体显示Form1.Temp为1和Temp的值为2。程序代码如下:Option ExplicitPublic Temp As IntegerSub Test()Dim Temp As IntegerTemp=2 Temp的值为2。Print Form1.Temp= & Form1.Temp Form1.Temp的值为2Print Temp= & Temp Temp的值为2。End SubPrivate Sub Command1_Click()TestEnd SubPrivate Sub Form_Load()Temp=1 将Form1.Temp的值设置成1End Sub3
19、.窗体的属性、控件名与变量同名窗体的属性、控件、符号常数和过程都被视为窗体模块中的模块级变量。窗体属性名、控件名与模块级变量、常数和过程名相同是不合法的,因为它们的作用范围相同。因此,在窗体模块中应尽量使变量名和窗体中的控件名不一样,养成对不同的变量使用不同的名称的编程习惯。在窗体模块内,和窗体中控件同名的局部变量将遮住同名控件。因此必须引用窗体名称或Me关键字来限定控件,才能设置或得到该控件的属性值。例如:在窗体有一个文本框Text1,也有一个局部变量Text1。Option ExplicitPrivate Sub Form_Click()Dim Text1Text1=Variable 变量
20、值为VariableMe.Text1=Control 控件必须用Me限定。Me.Text1.Top=0 设置文本框的位置。End Sub例Ex_Divisor2用辗转除法求两个自然数的最大公约数,从窗体的文本框输入两个自然数。窗体中使用了3个文本框、2个按钮和4个标签。其对象属性设置如表4-6-1所示。表 4-6-1对象对象名属性名属性值FormfrmDivisorCaption求最大公约数CommandButtoncmdStartcmdCloseCaptionCaption计算关闭TextBoxTxtMTxtN TxtResultCaptionCaptionCaptionLockedTabStop空空空TrueFalseLabelLabMLabNLabResultLabel1CaptionCaptionCaptionCaptionM:最大公约数=请输入自然数M与N计算的结果显示在txtResult文本框中。由于文本框txtResult显示计算结果不能让用户修改,因此属性Locked和TabStop要进行相应设置。