
过程 教学课件PPT.ppt
69页第第7 7章章过过 程程本章要点本章要点: :FunctionFunction过程过程▲▲SubSub过程过程▲▲参数的传递参数的传递* *过程的嵌套调用过程的嵌套调用过程的递归调用过程的递归调用* *VBVB的工程结构的工程结构变量的作用域与生存期变量的作用域与生存期* *•过程的引入过程的引入::使同类的操作不重复使同类的操作不重复•((操作方法相同、参数不操作方法相同、参数不同同) )•过程过程::完成一段独立功能,可供其他过程使用完成一段独立功能,可供其他过程使用( (调用调用) )•过程又称为过程又称为子程序子程序•调用过程调用过程::调用其他过程的过程调用其他过程的过程调用过程调用过程: 调用调用Sprg1调用调用Sprg1调用调用Sprg2子过程子过程: Sprg1子过程子过程: Sprg2过程分类过程分类: : Sub过程过程Function过程过程内部过程内部过程(方法方法)事件过程事件过程自定义过程自定义过程 内部函数内部函数 自定义函数自定义函数其中,自定义函数和自定义过程统称为其中,自定义函数和自定义过程统称为通用过程通用过程7.1 7.1 FUNCTIONFUNCTION过程过程( (函数过程函数过程) )7.1.1 Function过程的定义过程的定义1. Function过程的格式过程的格式[[Public|Private][Static] Function < <函数函数过程名过程名> > ([([< <形参表形参表> >])[])[As < <类型类型> >] ][[< <语句组语句组> >] ]<<函数过程名函数过程名>=<>=<表达式表达式> >[[Exit Function] [< <语句组语句组> >] ]End Function2.2.说明说明(1) Public: 缺缺 省省 值值 。
使使 用用 Public时时 表表 示示 各各 模模 块块 的的 所所 有有其其他他过过程程都都可可以以调调用用该该Function过过程2)(2)Private: 使使用用Private时时表表示示只只有有本本模模块块中中的的其其他过程才可以调用该他过程才可以调用该Function过程3) Static: 使使 用用 Static时时 表表 示示 将将 过过 程程 中中 的的 所所 有有 局局 部部 变变 量说明为静态变量量说明为静态变量4)(4)< <函函数数过过程程名名> >::Function过过程程的的名名称称,,遵遵循循变变量量的命名规则的命名规则5)(5)< <形形参参表表> >::表表示示Function过过程程的的参参数数变变量量列列表表多个变量之间用逗号隔开。
多个变量之间用逗号隔开< <形参表形参表> >格式格式::[[ByVal|ByRef|Optional|ParamArray] <变量名变量名>[()][>[()][As <类型类型>]>] ByVal: 表示该参数按值传递表示该参数按值传递 ByRef: 缺省值表示该参数按地址传递表示该参数按地址传递Optional:表示该参数为可选参数表示该参数为可选参数 ParamArray:表示该参数是一个表示该参数是一个Variant类型的类型的Optional数组 < <变量名变量名> >::任何变量名或数组名任何变量名或数组名():():当参数为数组时使用当参数为数组时使用6)(6)As < <类型类型>: >: 声明函数值的类型声明函数值的类型7)(7)Exit Function语句语句::从从Function过程中退出过程中退出8)(8)Function过程通过赋值语句过程通过赋值语句: :< <函数过程名函数过程名>=<>=<表达式表达式> > 将函数的返回值赋给将函数的返回值赋给< <函数过程名函数过程名> >。
9)(9)Function过程的定义不能过程的定义不能嵌套嵌套3. Function过程的建立过程的建立::建立位置建立位置窗体模块窗体模块标准模块标准模块类模块类模块* *建立方法建立方法直接在代码窗口中输入直接在代码窗口中输入应写在应写在““通用通用””的位置使用菜单命令:工具使用菜单命令:工具→→添加过程添加过程先切换到代码窗口,才可以使用该菜单命令先切换到代码窗口,才可以使用该菜单命令【例【例7-17-1】编写一个计算】编写一个计算n!!的的Function过程 分析:确定参数个数、类型、函数名、类型分析:确定参数个数、类型、函数名、类型 Function Fact(N As Integer) As Long Dim I As Integer, F As Long F = 1 ' F用于保存阶乘值用于保存阶乘值For I = 1 To N F = F * I Next I Fact = F ' 给函数过程名赋值给函数过程名赋值 End Function【例【例7-27-2】编写一个】编写一个Function过程,计算下面表达式的值。
过程,计算下面表达式的值 问:应设置几个参数?问:应设置几个参数? Function F(X, Y, Z) F = Sqr(Abs(X ^ 3 + Y ^ 3 + Z ^ 3)) End Function 这里的参数和函数名都没有定义类型,默认这里的参数和函数名都没有定义类型,默认为为Variant类型7.1.27.1.2Function过程的调用过程的调用1. 调用位置:调用位置: 直接在表达式中调用直接在表达式中调用2. 调用格式调用格式: < <函数过程名函数过程名> >([< <实参表实参表> >]) 其中,其中,< <实参表实参表> >: n常量、变量或表达式常量、变量或表达式n各参数之间用逗号分隔各参数之间用逗号分隔n如果是数组,在数组名之后要跟一对空括号如果是数组,在数组名之后要跟一对空括号××【例【例7-37-3】从键盘任意输入一个整数,然后调用计算】从键盘任意输入一个整数,然后调用计算 阶阶乘的函数求该整数的阶乘值乘的函数求该整数的阶乘值设计界面和运行界面如下:设计界面和运行界面如下:Label3Text1Command1Label2设计界面设计界面运行界面运行界面代码如下:代码如下:Option Explicit' 自定义求阶乘的函数过程自定义求阶乘的函数过程FactFunction Fact(N As Integer) As Long Dim I As Integer, F As Long F = 1 For I = 1 To N F = F * I Next I Fact = F ' 给函数过程名赋值给函数过程名赋值End Function''在按钮的在按钮的Click事件过程中调用函数过程事件过程中调用函数过程Private Sub Command1_Click() Dim X As Integer X = Val(Text1.Text) Label2.Caption=Trim(Str(X)) & "的阶乘数为的阶乘数为:":"' 使用使用Fact(X)调用函数过程调用函数过程 Label3.Caption = Trim(Str(Fact(X))) End Sub【例【例7-47-4】利用】利用Function过程计算阶乘,求组合数。
设计界过程计算阶乘,求组合数设计界面如下图面如下图Text2OLE1控件控件Text1Text3Command1BackStyle: 0 - TransparentBorderStyle: 0 – NoneSizeMode: 2 - AutoSize代码如下:代码如下:''定义求阶乘的函数定义求阶乘的函数FactFunction Fact(N As Integer) As Double Dim F As Double, I As Integer F = 1 For I = 1 To N F = F * I Next I Fact = FEnd Function' “=”按钮的按钮的Click事件过程事件过程Private Sub Command1_Click() Dim M As Integer, N As Integer, C As Double N = Val(Text1.Text) M = Val(Text2.Text) ' 调用调用Fact函数求各阶乘值函数求各阶乘值C = Fact(M) / (Fact(N) * (Fact(M - N))) Text3.Text = Trim(Str(c))End Sub【例【例7-57-5】编写】编写Function过程求最大公约数,并过程求最大公约数,并通过命令按钮的单击事件过程调用该函数过程。
通过命令按钮的单击事件过程调用该函数过程Text1Text2Command1Label3Function hcf(m As Integer, n As Integer) As Integer Dim r As Integer r = m Mod n Do While r <> 0 m = n n = r r = m Mod n Loop hcf = nEnd FunctionPrivate Sub Command1_Click() Dim m As Integer, n As Integer m = Val(Text1.Text): n = Val(Text2.Text) Label3.Caption = Str(hcf(m, n))End Sub【例【例7-67-6】编写一个】编写一个Function过程,返回指定个数过程,返回指定个数的字符串,字符串以的字符串,字符串以A开始,例如,当指定个数开始,例如,当指定个数5 5时,函数返回字符串时,函数返回字符串""A B C D E"运行时单击运行时单击按钮调用该函数过程,实现在窗体上按指定的行按钮调用该函数过程,实现在窗体上按指定的行数输出如下图所示的图形。
数输出如下图所示的图形' CreateStr函数返回函数返回N个字符个字符Private Function CreateStr(N As Integer) Dim TmpStr As String, I As Integer TmpStr = "" ' StrAsc用于保存字符的用于保存字符的ASCII码码 StrAsc = Asc("A") – 1 For I = 1 To N StrAsc = StrAsc + 1 ' 生成下一字符的生成下一字符的ASCII码码 TmpStr = TmpStr & Space(1) & Chr(StrAsc) Next I CreateStr = TmpStrEnd Function' “输出图形输出图形””按钮的按钮的Click事件过程事件过程Private Sub Command1_Click() Dim N As Integer, I As Integer ''指定图形的行数指定图形的行数 N = Val(InputBox("图形的行数图形的行数","","请输入请输入","5"))","5")) Cls Print For I = 1 To N Print Tab(2 * I); ' 输出左半部分输出左半部分Print CreateStr(2 * N - 2 * I + 1); Print Spc(4); ' 左右两部分的间隔左右两部分的间隔Print CreateStr(2 * I - 1); ' 输出右半部分输出右半部分Print Next IEnd Sub7.2 7.2 SUBSUB过程过程当需要自定义过程返回一个值时,使当需要自定义过程返回一个值时,使用用Function过程很容易实现。
过程很容易实现但在实际应用中,可能希望过程不需但在实际应用中,可能希望过程不需要返回值,例如,使用过程打印一个图形;要返回值,例如,使用过程打印一个图形;或需要过程返回多个值,例如,利用过程对或需要过程返回多个值,例如,利用过程对一批数据进行排序,在这些情况下就需要使一批数据进行排序,在这些情况下就需要使用用Sub过程过程7.2.1 SUB过程的定义过程的定义1.1.Sub过程的格式过程的格式[[Private|Public][Static] Sub < <过程名过程名> >[([(< <形参表形参表> >)])][[< <语句组语句组> >] ][[Exit Sub] [< <语句组语句组> >] ] End Sub2. 说明说明(1)(1)Exit Sub用于退出用于退出Sub过程2)(2) < <过程名过程名> >不具有值的意义,在不具有值的意义,在Sub过程中不能过程中不能给给< <过程名过程名> >赋值,也不能给赋值,也不能给< <过程名过程名> >定义类型。
定义类型3)(3)Sub过程通过过程通过< <形参表形参表> >中的参数返回值中的参数返回值4)(4)Sub过程的建立方法与过程的建立方法与Function过程的建立方过程的建立方法相同【例【例7-77-7】编写计算】编写计算n!的的Sub过程分析分析::参数表中应有一个参数参数表中应有一个参数n,,还应有另一个还应有另一个参数参数F用来返回阶乘值用来返回阶乘值 Sub Fact(N As Integer, F As Long) Dim I As Integer F = 1 For I = 1 To N F = F * I Next I End Sub【【例例7-87-8】编写】编写Sub过程,打印以下图形过程,打印以下图形分析分析::打印该图形不需要返回值,因此无需引入参数打印该图形不需要返回值,因此无需引入参数 * *** ***** ******* *********Sub a() For i = 1 To 6 Print Tab(7 - i); For j = 1 To 2 * i - 1 Print "*"; Next j Print Next iEnd Sub【【例例7-97-9】编写】编写Sub过程,求三个数中的最大数和过程,求三个数中的最大数和最小数。
最小数分析分析::首先要设置三个参数,如首先要设置三个参数,如x、、y、、z,,用于用于接收三个原始数据,另外引入两个参数接收三个原始数据,另外引入两个参数max和和min,,用于返回最大和最小数用于返回最大和最小数 Sub s(x, y, z, max, min) max = x min = x If y > max Then max = y If y < min Then min = y If z > max Then max = z If z < min Then min = z End Sub7.2.27.2.2Sub过程的调用过程的调用说明说明: (1) < <过程名过程名> >: 要调用的要调用的Sub过程名2) < <实参表实参表> >: 可以是可以是常量、变量或表达式常量、变量或表达式,各参,各参数之间用逗号分隔如果是数之间用逗号分隔如果是数组参数数组参数,则要在,则要在数组名之后跟一对空括号数组名之后跟一对空括号3) 用用Call语句调用一个语句调用一个Sub过程时,如果过程本身过程时,如果过程本身没有参数,则省略没有参数,则省略< <实参表实参表> >和括号。
和括号4) 格式二省略了格式二省略了Call关键字,同时关键字,同时< <实参表实参表> >两边两边也不能带括号也不能带括号格式一格式一: Call <过程名过程名>[(< <实参表实参表> >)]格式二格式二: <过程名过程名> [<实参表实参表>]【例【例7-107-10】将求组合数一题改成用】将求组合数一题改成用Sub过程实现过程实现Sub Fact(N As Integer, F As Long) Dim I As Integer F = 1 For I = 1 To N F = F * I Next IEnd SubPrivate Sub Command1_Click() Dim M As Integer, N As Integer Dim f1 As Long, f2 As Long, f3 As Long M = Val(Text1.Text) : N = Val(Text2.Text) Call Fact(M, f1):Call Fact(N, f2):Call Fact(M - N, f3) Text3.Text = Trim(Str(f1 / (f2 * f3)))End Sub【例【例7-117-11】编写一个】编写一个Sub过程,计算过程,计算K个数的和,即个数的和,即1+2+1+2+…+ +K,,并通过命令按钮的单击事件调用该过程计算并通过命令按钮的单击事件调用该过程计算S=1+(1+2)+(1+2+3)+ …+(1+2+…+N)。
分析分析::编写一个编写一个Sub过程计算过程计算1+2+1+2+…+ +K,,设参数设参数K、、S,,参数参数S用于返回该和值用于返回该和值 Sub A1(K As Integer, S As Integer) S = 0 For J = 1 To K S = S + J Next J End SubPrivate Sub Command1_Click() Dim N As Integer, S1 As Integer, I As Integer N = Val(Text1.Text) For I = 1 To N ' 调用过程调用过程A1求求1+2+1+2+…+ +I,,和值返回到和值返回到S1中中 Call A1(I, S1)Sum = Sum + S1 Next I Text2.Text = SumEnd Sub7.3 7.3 参数的传递参数的传递参数传递参数传递是指是指调用过程与被调用过程之间的调用过程与被调用过程之间的一种数据通讯方法。
一种数据通讯方法 数据的传递方式可以是单向的,也可以是双数据的传递方式可以是单向的,也可以是双向的分别称为向的分别称为按值传递按值传递和和按地址传递按地址传递数据传递是通过数据传递是通过形参形参和和实参实参进行传递的进行传递的7.3.1 7.3.1 形参和实参形参和实参形参形参::出现在出现在Sub或或Function语句中实参实参::出现在调用程序中出现在调用程序中例如,定义如下一个过程例如,定义如下一个过程:: Sub SubTest(n As Integer,Sum As Single) … End Sub调用语句调用语句:: Call SubTest( a , s )形参形参实参实参说明说明: 一般情况下,形参表与实参表中对应参数个数、一般情况下,形参表与实参表中对应参数个数、类型、位置顺序必须一一对应类型、位置顺序必须一一对应(除非使用关键字除非使用关键字Optional或或ParamArray对形参进行了约束对形参进行了约束)形参表中的参数可以是形参表中的参数可以是: 除固定长度字符串之外的合法除固定长度字符串之外的合法 变量名、数组名变量名、数组名()实参表中的参数可以是实参表中的参数可以是: 常量、变量、表达式、数组名常量、变量、表达式、数组名()形参与实参的结合有两种方式形参与实参的结合有两种方式: 按值传递和按地址传递。
按值传递和按地址传递1.1.按值传递按值传递实参把其值传递给形参而不传递实参的地址实参把其值传递给形参而不传递实参的地址数据的传递是单向的数据的传递是单向的1)(1)当实参为常量或表达式时,数据传递总是单当实参为常量或表达式时,数据传递总是单向的例如例如::Call SubTest(10, 1+2) Sub SubTest( n As Integer,Sum As Single)7.3.2 按值传递和按地址传递按值传递和按地址传递(2)(2)实参是变量时实参是变量时,,要实现按值传递需要在要实现按值传递需要在形参之形参之前前通过关键字通过关键字ByVal来实现例如例如::Sub SS(ByVal X, ByVal Y, ByVal Z) X = X + 1: Y = Y + 1: Z = Z + 1 End Sub Private Sub Command1_Click() A = 1: B = 2: C = 3 Call SS(A, B, C) Print A, B, C End Sub运行时,单击命令按钮在窗体上打印运行时,单击命令按钮在窗体上打印::12123 32.2.按地址传递按地址传递指将实参的地址传给形参,使形参和实参具指将实参的地址传给形参,使形参和实参具有相同的地址,即形参与实参共享同一存储单有相同的地址,即形参与实参共享同一存储单元。
元1)(1)当实参为变量或数组时,形参使用关键字当实参为变量或数组时,形参使用关键字 ByRef定义定义( (或省略或省略) )表示要按地址传递表示要按地址传递2)(2)当参数是数组时,数组名之后必须使用一对当参数是数组时,数组名之后必须使用一对空的圆括号空的圆括号按地址传递可以实现调用过程与子过程之间按地址传递可以实现调用过程与子过程之间数据的双向传递数据的双向传递例例::Sub SS(ByRef X, ByRef Y, ByRef Z) X = X + 1: Y = Y + 1: Z = Z + 1 End Sub Private Sub Command1_Click() A = 1: B = 2: C = 3 Call SS(A, B, C) Print A, B, C End Sub形参形参: X Y Z实参实参: A B C存储单元存储单元运行时,单击命令按钮在窗体上打印运行时,单击命令按钮在窗体上打印: 2 3 4【例【例7-147-14】编写一个计算乘幂的】编写一个计算乘幂的Function过程,用过程,用来计算来计算x的的y次幂,其中次幂,其中y>0。
单击窗体时调用该过单击窗体时调用该过程打印程打印5 51 1、、5 52 2、、5 53 3、、5 54 4、、5 55 5的值 Function Power(x As Single, ByVal y As Integer) Dim result As Single result = 1 Do While y > 0 result = result * x y = y - 1 Loop Power = result End FunctionPrivate Sub Form_Click() Dim i As Integer For i = 1 To 5 Print Power(5, i) Next iEnd Sub思考思考: 如果取消过程如果取消过程Power中参数中参数y前的关键字前的关键字ByVal,,则会出现什么情况?则会出现什么情况?【【例例7-157-15】编写三个】编写三个Sub过程过程 LetArray过程过程::产生产生[0[0,,99]99]之间的随机整数,并之间的随机整数,并赋值给一维数组。
赋值给一维数组SortArray过程过程: :实现数组从大到小排序实现数组从大到小排序PrintArray过程过程: :实现数组的输出实现数组的输出 (1) LetArray过程过程 Sub LetArray(Value() As Integer) Dim I As Integer, N As Integer Randomize N = UBound(Value) For I = 1 To N Value(I) = Int(100 * Rnd) Next I End Sub(2) SortArray过程过程: : 实现数组从大到小排序实现数组从大到小排序Sub SortArray(Value() As Integer) Dim I As Integer, J As Integer, N As Integer, _ T As Integer N = UBound(Value) For I = 1 To N - 1 For J = I + 1 To N If Value(I) < Value(J) Then T = Value(I) Value(I) = Value(J) Value(J) = T End If Next J Next IEnd Sub(3) SortArray过程过程: : 实现数组的输出实现数组的输出 Sub PrintArray(Value() As Integer) Dim I As Integer, N As Integer N = UBound(Value) For I = 1 To N Print Value(I); If I Mod 4 = 0 Then Print ' 每行显示每行显示4 4个个数数 Next i End Sub在时间过程中调用以上在时间过程中调用以上SUB过程:过程:Private Sub Command1_Click() Dim Value(20) As Integer Call LetArray(Value()) Print "排序前:排序前:" "Call PrintArray(Value()) Call SortArray(Value()) Print "排序后:排序后:" "Call PrintArray(Value())End Sub7.4 过程的嵌套调用过程的嵌套调用•在一个过程执行期间又调用另一个过程,称为过程在一个过程执行期间又调用另一个过程,称为过程的嵌套调用。
的嵌套调用调用过程调用过程 子过程子过程S1 子过程子过程S2┇ ┇调用调用S1┇ ┇┇ ┇调用调用S2┇ ┇┇ ┇【例7-16】求:即求即求1!!+2!!+3!!+…+20!,用!,用Function过程实过程实现设计以下函数:设计以下函数:(1) 设计一个过程设计一个过程Fact求求n!!(2) 设计另一个过程设计另一个过程Sigma求求n个数的和个数的和代码如下:代码如下:Private Sub Command1_Click() Dim n As Integer n = Val(InputBox("n=")) Print Sigma(n) ' 调用调用Sigma过程过程End SubFunction Sigma(n As Integer) As Double Dim i As Integer, sum As Double sum = 0 For i = 1 To n sum = sum + Fact(i) ' 调用调用Fact过程过程Next i Sigma = sumEnd FunctionFunction Fact(n As Integer) As Double Dim I As Integer, F As Double F = 1 For I = 1 To N F = F * I Next I Fact = FEnd Function*7.5 *7.5 过程的递归调用过程的递归调用递归调用递归调用: :在过程中直接或间接调用自身。
在过程中直接或间接调用自身数学上常用于处理阶乘运算、级数运算、幂指数运算等数学上常用于处理阶乘运算、级数运算、幂指数运算等问题例:求例:求N!!Function F(N) F1 = 1 For I = 1 To N F1 = F1 * I Next I F=F1End FunctionFunction F(N)) If N = 1 Then F = 1 Else F = N * F(N - 1) End IfEnd Function【例【例7-17】】: 求求N!!Private Sub Command1_Click() Dim N As Integer N = Val(Text1.Text) Text2.Text = F(N)End SubPublic Function F(N)) If N = 1 Then F = 1 Else F = N * F(N - 1) End IfEnd FunctionF(6)6*F(5)6*5*F(4)6*5*4*F(3)6*5*4*3*F(2)6*5*4*3*2*F(1)17.6 VB工程结构VB应用程序由三种模块组成应用程序由三种模块组成: :窗体模块窗体模块( (Form) (文件扩展名文件扩展名. .frm)标准模块标准模块( (Module) (文件扩展名文件扩展名. .bas)类模块类模块( (Class) (文件扩展名文件扩展名. .cls)应用程序应用程序工程文件工程文件(.vbp)窗体模块窗体模块(.frm)文件文件类模块类模块(.cls)文件文件标准模块标准模块(.bas)文件文件事件过程事件过程Function过程过程Sub过程过程Property过程过程1.1.窗体模块包含:窗体模块包含:事件过程事件过程通用过程通用过程通用声明通用声明( (常量、变量、数组、外部过程)常量、变量、数组、外部过程)2.2.可以用文本编辑器查看窗体模块可以用文本编辑器查看窗体模块查看方法:查看方法: 右击右击. .frm文件,选择打开方式为记事本文件,选择打开方式为记事本显示:显示:描述信息及程序代码描述信息及程序代码7.6.1 窗体模块窗体模块当一个应用程序含有多个窗体时当一个应用程序含有多个窗体时, ,可能其中可能其中的几个窗体都需要调用某一段公共代码的几个窗体都需要调用某一段公共代码, ,如果在每如果在每个窗体内都包含这些代码个窗体内都包含这些代码, ,就会造成大量的代码冗就会造成大量的代码冗余余, ,这时就可以在标准模块内建立一个包含此公共这时就可以在标准模块内建立一个包含此公共代码的通用过程代码的通用过程, ,实现代码的共享。
实现代码的共享标准模块不对应于某个窗体、是纯代码模块标准模块不对应于某个窗体、是纯代码模块标准模块可以包含标准模块可以包含: :全局常量、变量、全局过程全局常量、变量、全局过程标准模块级常量、变量、通用过程标准模块级常量、变量、通用过程注注::不能包含事件过程不能包含事件过程添加添加::工程工程→→添加模块添加模块→→选选““新建新建””标签标签→→打开打开““添加模块添加模块””对话框默认名字默认名字::ModuleX7.6.2 标准模块类是具有相同或相似特征的事物的集合,类是具有相同或相似特征的事物的集合,类封装了对象的属性类封装了对象的属性( (数据成员数据成员) )和方法和方法( (处理数据处理数据的函数或过程的函数或过程) )程序员一般不对类进行操作,而程序员一般不对类进行操作,而只能对类的实例只能对类的实例——对象进行操作对象进行操作 Visual Baisc所使用的每种控件都对应着一个所使用的每种控件都对应着一个类,如类,如Button按钮控件对应着按钮控件对应着Button类,它们支类,它们支持封装和多态性,但它们不支持继承,即不能从持封装和多态性,但它们不支持继承,即不能从现有的类(控件)来创建新的类(控件)。
现有的类(控件)来创建新的类(控件)有时用户需要创建自己的类以实现特定的功有时用户需要创建自己的类以实现特定的功能,则可以通过类模块创建自己的类类模块文能,则可以通过类模块创建自己的类类模块文件的的扩展名为件的的扩展名为. .cls7.6.3 类模块类模块缺省情况下,应用程序中的第一个窗体为启动窗体,缺省情况下,应用程序中的第一个窗体为启动窗体,如果想在应用程序启动时首先显示其它窗体,那么就得在如果想在应用程序启动时首先显示其它窗体,那么就得在““工程属性工程属性””对话框中改变启动窗体的名称对话框中改变启动窗体的名称有时,有些应用程序启动时需要先做一些初始化工有时,有些应用程序启动时需要先做一些初始化工作,如装入数据文件,然后再根据数据文件的内容决定显作,如装入数据文件,然后再根据数据文件的内容决定显示哪个窗体;有时应用程序根本就不需要加载窗体(比如示哪个窗体;有时应用程序根本就不需要加载窗体(比如一些监控程序)为此,可以在标准模块中编写一个一些监控程序)为此,可以在标准模块中编写一个main过程过程,作为应用程序的入口。
作为应用程序的入口 定义定义sub main过程为启动程序的步骤:过程为启动程序的步骤: ““工程工程”→“”→“工程属性工程属性”→”→选择选择““通用通用””选项卡选项卡→→在在““启动对象启动对象””下拉列表框中选择下拉列表框中选择““Sub Main”7.6.4 SUB MAIN过程过程的建立位置不同,允许被访问的范围也不过程的建立位置不同,允许被访问的范围也不同作用域作用域::模块级、全局级模块级、全局级 1.1.模块级过程模块级过程::在过程前如果加在过程前如果加Private关键字,关键字,则这种过程只能被其所在的模块中的其他过程所则这种过程只能被其所在的模块中的其他过程所调用2.2.全局过程全局过程::在过程前如果加在过程前如果加Public关键字关键字( (或省或省略略) ),则这种过程可以被其他模块中的过程所调,则这种过程可以被其他模块中的过程所调用 调用格式调用格式::模块名模块名. .过程名过程名( (参数表参数表) ) 注意:标准模块中的全局过程名如果唯一,则注意:标准模块中的全局过程名如果唯一,则调用时可以省略模块名调用时可以省略模块名7.6.5 过程的作用域例例: :设窗体设窗体Form1中有按钮中有按钮::Command1、、 Command2 Public Sub aa() ' aa为全局过程为全局过程 MsgBox ("这是窗体这是窗体Form1中的过程中的过程")")End Sub Private Sub Command1_Click() Call aa End Sub Private Sub Command2_Click() Form2.Show End Sub可以省略可以省略添加标准模块添加标准模块Module1 ,编写以下过程,编写以下过程: Public Sub bb() ' bb为全局过程为全局过程 MsgBox ("这是标准模块中的过程这是标准模块中的过程bb") End Sub可以省略可以省略设窗体设窗体Form2中有按钮中有按钮::Command1 、、 Command2 Private Sub Command1_Click() Call Form1.aa End Sub Private Sub Command2_Click() Call Module1.bb End Sub不可以省略不可以省略可以省略可以省略7.7 变量的作用域与生存期变量的作用域变量的作用域::指变量的指变量的有效范围有效范围。
变量的生存期变量的生存期::指变量的指变量的作用时间作用时间7.7.17.7.1变量的作用域变量的作用域将变量分为将变量分为::局部变量局部变量模块级变量模块级变量全局变量全局变量模模块块级级变变量量……全局变量全局变量局局部部变变量量…………模块模块过程过程1.1.局部变量局部变量• 声明声明不声明不声明Dim A As Integer ' A每次执行过程时被初每次执行过程时被初始化始化Static C As Single ' C在应用程序执行期间在应用程序执行期间保持不变保持不变• 作用范围作用范围仅在声明的过程中起作用仅在声明的过程中起作用其他过程中即使有同名变量,也不是指同一变其他过程中即使有同名变量,也不是指同一变量量例例::Sub S() X = 1 Y = 2 Z = X + Y Print X, Y, Z End Sub Private Sub C1_Click() X = 2 Y = 3 Z = X + Y Call S Print X, Y, Z End Sub单击单击C1后运行结果后运行结果: 1 2 3 2 3 5局部变量局部变量局部变量局部变量2.2.模块级变量模块级变量• 声明声明在模块的通用声明段中用以下方法声明的在模块的通用声明段中用以下方法声明的变量。
变量 Private ' 在模块运行时被初始化在模块运行时被初始化 Dim ' 在模块运行时被初始化在模块运行时被初始化• 作用范围作用范围在该模块的所有过程中都起作用在该模块的所有过程中都起作用其他模块不能访问这些变量其他模块不能访问这些变量3.3.全局变量全局变量• 声明声明在模块的通用声明段中用以下方法声明的在模块的通用声明段中用以下方法声明的变量变量Public ' 应用程序运行时被初始化应用程序运行时被初始化• 作用范围作用范围::应用程序的所有过程应用程序的所有过程例例::Dim Z As IntegerSub S() Z = Z + 2 Print ZEnd SubPrivate Sub C1_Click() Z = Z + 2 Call S Print ZEnd Sub第一次单击第一次单击C1结果结果: 4 4第二次单击第二次单击C1结果结果: 8 8第三次单击第三次单击C1结果结果: 1212模块级变量模块级变量模块级变量模块级变量例例::Dim Z As IntegerSub S() Dim Z Z = Z + 2 Print ZEnd SubPrivate Sub C1_Click() Z = Z + 2 Call S Print ZEnd Sub第一次单击第一次单击C1结果结果: 2 2第二次单击第二次单击C1结果结果: 2 4第三次单击第三次单击C1结果结果: 26模块级变量模块级变量局部变量局部变量7.7.27.7.2变量的生存期变量的生存期静态变量静态变量::在应用程序执行期间保留不变在应用程序执行期间保留不变动态变量动态变量::在所在的模块在所在的模块( (过程过程) )运行时被初运行时被初始化始化 单击按钮打印结果单击按钮打印结果: 55 110 Static Sub SS1() ' 局部变量局部变量I,S为静态变量为静态变量 For I = 1 To 10 S = S + I Next I Print S End Sub Private Sub Command1_Click() Call SS1 Call SS1 End Sub例例::Sub S() Static Z As Integer Z = Z + 2 Print ZEnd SubPrivate Sub C1_Click() Dim Z As Integer Z = Z + 2 Call S Print ZEnd Sub第一次单击第一次单击C1结果结果: 2 2第二次单击第二次单击C1结果结果: 4 2第三次单击第三次单击C1结果结果: 6 2静态变量静态变量动态变量动态变量本章小结本章小结 1.1.函数过程的定义和调用函数过程的定义和调用 定义定义: :[[Public | Private ] [Static] Function < <函数名函数名> > [([(< <形参表形参表> >) )]][ [As < <类型类型> >] ]……[[函数名函数名==表达式表达式] ]……End Function 形参表形参表: :变量、数组名变量、数组名()() 调调用用: : 函数名函数名( (< <实参表实参表>)>) 出现在表达式可以出现的位置出现在表达式可以出现的位置2.2.Sub过程的定义和调用过程的定义和调用定义定义::[[Private | Public ] [Static] Sub <过程名过程名>([>([< <形参表形参表> >])])……End Sub调用调用::(1)(1)Call <过程名过程名> >( ([ [< <实参表实参表> >] ]) )(2)<(2)<过程名过程名>[<>[<实参表实参表>]>]注意注意::Sub过程调用与函数过程定义与调用的区过程调用与函数过程定义与调用的区别别3. 过程之间的参数传递过程之间的参数传递 按值传递按值传递: 实参为常数、表达式;实参为常数、表达式; 实参为变量,形参为实参为变量,形参为 ByVal 变量变量 按地址传递按地址传递: 实参为变量、数组;形参用实参为变量、数组;形参用 ByRef 定义的变量、数组(或省略定义的变量、数组(或省略ByRef))4. 过程的嵌套调用过程的嵌套调用*5. 过程的递归调用过程的递归调用6. VB工程结构工程结构 窗体模块窗体模块(Form) (文件扩展名文件扩展名.frm) 标准模块标准模块(Module) (文件扩展名文件扩展名.bas) Sub Main过程过程 类模块类模块(Class) (文件扩展名文件扩展名.cls)7. 过程的作用域过程的作用域 模块级过程;模块级过程; 全局级过程全局级过程8. 变量的作用域变量的作用域 局部变量(过程级);局部变量(过程级); 模块级变量;全局变量模块级变量;全局变量9. 变量的生存期变量的生存期 动态变量;动态变量; 静态变量静态变量。
