第 6 章 过 程

45
6 6 第 第 第 第

Upload: bond

Post on 15-Jan-2016

101 views

Category:

Documents


0 download

DESCRIPTION

第 6 章 过 程. 6.1.1 过程的概念 过程是一段程序代码,是相对独立的逻辑模块。 一个完整的 VB 应用程序由若干过程和模块组成。 常用的 VB 过程有: Sub 过程和 Function 过程。 Sub 过程 ( 子过程 ) :完成一定的操作和功能,无返回值,通过程序调用和事件触发而执行,分为事件过程和通用过程。 Function 过程 ( 函数过程 ) :相当于用户自定义的函数,通过程序调用才能被执行,并且可将数据处理的结果返回。 一个过程的代码长度不要超过 64K 。. 6.1 过程. 6.1 过程. 6.1.2 过程的优点 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 6 章  过 程

第第 66 章 章 过 程过 程

Page 2: 第 6 章  过 程

6.1 6.1 过程过程 6.1.1 6.1.1 过程的概念过程的概念 过程是一段程序代码,是相对独立的逻辑模块。过程是一段程序代码,是相对独立的逻辑模块。 一个完整的一个完整的 VBVB 应用程序由若干过程和模块组成。应用程序由若干过程和模块组成。 常用的常用的 VBVB 过程有:过程有: SubSub 过程和过程和 FunctionFunction 过程。过程。

SubSub 过程过程 (( 子过程子过程 )) :完成一定的操作和功能,无返:完成一定的操作和功能,无返回值,通过程序调用和事件触发而执行,分为事件回值,通过程序调用和事件触发而执行,分为事件过程和通用过程。过程和通用过程。

FunctionFunction 过程过程 (( 函数过程函数过程 )) :相当于用户自定义的:相当于用户自定义的函数,通过程序调用才能被执行,并且可将数据处函数,通过程序调用才能被执行,并且可将数据处理的结果返回。理的结果返回。

一个过程的代码长度不要超过一个过程的代码长度不要超过 64K64K 。。

Page 3: 第 6 章  过 程

6.1.26.1.2 过程的优点过程的优点     1.1. 消除了重复消除了重复语句行。你可以只定义一次过程,而在程序语句行。你可以只定义一次过程,而在程序

任意多次执行这一过程。任意多次执行这一过程。     2.2. 使程序更易阅读。由一系列小程序段组成的程序比大段、使程序更易阅读。由一系列小程序段组成的程序比大段、

大段的程序更容易理解和区分。大段的程序更容易理解和区分。     3.3. 简化简化了程序开发。把程序分成一些合乎逻辑的单位更易了程序开发。把程序分成一些合乎逻辑的单位更易

于设计、编写和调试。于设计、编写和调试。     4.4. 其它程序可其它程序可重复使用重复使用该通用过程。你可以轻易地将标准该通用过程。你可以轻易地将标准

模块过程纳入其它编程项目中。模块过程纳入其它编程项目中。     5.5. 扩展扩展 Visual BasicVisual Basic 语言。过程往往能够完成单个语言。过程往往能够完成单个 VisuVisu

al Basical Basic 关键字无法完成的任务。关键字无法完成的任务。    

6.1 6.1 过程过程

Page 4: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程(子过程)过程(子过程) 过程定义格式:过程定义格式: [Private|Public]Sub [Private|Public]Sub 过程名过程名 (( 参数表参数表 )) 语 句语 句 [exit sub][exit sub] End SubEnd Sub

PrivatePrivate 表示模块级子过程,表示模块级子过程, PublicPublic 表示全局级子过程表示全局级子过程 (( 缺省缺省值值 ) ) 。。

过程名过程名符合符合 VBVB 标识符标识符的命名约定 的命名约定 参数表可以是空表,也可以放置若干个变量参数表可以是空表,也可以放置若干个变量 (( 形式参数形式参数 ) ) 。如:。如:

Public Sub Sum(X As Integer, Y As Integer, Z As Integer) Public Sub Sum(X As Integer, Y As Integer, Z As Integer) SubSub 过程分为:事件过程和通用过程过程分为:事件过程和通用过程

Page 5: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程过程 1. 1. 事件过程事件过程 这类过程与对象有关,对象事件触发后被调用。这类过程与对象有关,对象事件触发后被调用。 事件过程的过程名由系统自动指定。事件过程的过程名由系统自动指定。 建立对象的事件过程:建立对象的事件过程:

(1) (1) 进入代码窗口进入代码窗口 方法方法 11 :双击对象:双击对象 方法方法 22 :“视图→:“视图→代码窗口”代码窗口”(2) (2) 选择选择“对象”和“事件过程”“对象”和“事件过程”,,系统系统 自动形成该事件过程的头和尾自动形成该事件过程的头和尾

(3) (3) 编写该事件的程序代码编写该事件的程序代码

“ 对象”

“ 事件过程”

Page 6: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程过程 2. 2. 通用通用 SubSub 过程 过程 这类过程不与对象相关,是用户创建的一段共享代码。这类过程不与对象相关,是用户创建的一段共享代码。 过程的名称由用户自己命过程的名称由用户自己命 建立通用建立通用 SubSub 过程:过程:

(1) (1) 建立过程框架建立过程框架 方法方法 11 ::在模块的“通用”段中输入在模块的“通用”段中输入 过程名,按回车后系统自动添加过程名,按回车后系统自动添加 End SubEnd Sub 。。

方法方法 22 ::“工具“工具→→添加过程” 添加过程”

(2) (2) 编写该过程的程序代码编写该过程的程序代码

Page 7: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程过程

[[ 例例 11] ] 定义一个无参数的定义一个无参数的 subsub 过程过程 print_Line()print_Line() ,,用于在窗体上打印一行虚线。用于在窗体上打印一行虚线。

Private Sub Private Sub Print_LinePrint_Line()() Dim I As IntegerDim I As Integer Print Tab(10);Print Tab(10); For I = 1 To For I = 1 To 2525 Print "-";Print "-"; Next INext I PrintPrint End SubEnd Sub

定长

Page 8: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程过程 3. 3. 过程的调用方法 过程的调用方法 (1) (1) 通用通用 SubSub 过程的两种调用方式过程的两种调用方式 (p114)(p114) ::

Call Call 过程名过程名 (( 参数表参数表 )) 过程名 参数表过程名 参数表

(2) (2) 事件过程的调用事件过程的调用 一般由事件的触发而引起一般由事件的触发而引起 (( 单击、窗体加载等单击、窗体加载等 )) 也可以象通用也可以象通用 SubSub 过程那样调用,如:过程那样调用,如: Private Sub Form_DblClick()Private Sub Form_DblClick() CallCall Command1_Click Command1_Click End SubEnd Sub

Page 9: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程过程

[[ 例例 11] ] 在窗体上打印一组学生的成绩表,并在需要的在窗体上打印一组学生的成绩表,并在需要的地方打印虚线地方打印虚线。。

'' 表格横线用通用过程表格横线用通用过程 Print_LinePrint_Line 绘出,在主程序中多次调用绘出,在主程序中多次调用 Private Sub Private Sub Print_LinePrint_Line()() Dim I As IntegerDim I As Integer Print Tab(10);Print Tab(10); For I = 1 To For I = 1 To 2525 Print "-";Print "-"; Next INext I PrintPrint End SubEnd Sub

Page 10: 第 6 章  过 程

Private Sub Command3_Click()Private Sub Command3_Click()

Dim math(1 To 5) As IntegerDim math(1 To 5) As Integer

Dim phy(1 To 5) As IntegerDim phy(1 To 5) As Integer

Dim chem(1 To 5) As Integer, i As IntegerDim chem(1 To 5) As Integer, i As Integer

For i = 1 To 5 'For i = 1 To 5 ' 用随机函数生成表中数据用随机函数生成表中数据 math(i) = Int(Rnd * 100 + 1)math(i) = Int(Rnd * 100 + 1)

phy(i) = Int(Rnd * 100 + 1)phy(i) = Int(Rnd * 100 + 1)

chem(i) = Int(Rnd * 100 + 1)chem(i) = Int(Rnd * 100 + 1)

Next iNext i

print_line 'print_line ' 调用画线子过程调用画线子过程 Print Tab(10); "Print Tab(10); " 数学数学 "; Tab(20); ""; Tab(20); " 物理物理 "; Tab(30); ""; Tab(30); " 化学化学 ""

print_line 'print_line ' 调用画线子过程调用画线子过程 For i = 1 To 5 'For i = 1 To 5 ' 打印表中数据,并统计各科总分打印表中数据,并统计各科总分 Print Tab(10); math(i); Tab(20); phy(i); Tab(30); chem(i)Print Tab(10); math(i); Tab(20); phy(i); Tab(30); chem(i)

Next iNext i

print_line 'print_line ' 调用画线子过程调用画线子过程End SubEnd Sub

Page 11: 第 6 章  过 程

6.2 6.2 过程过程-- SubSub 过程过程 [[ 例例 2]2] 定义一个通用子过程定义一个通用子过程 Print_LinePrint_Line 用于打印不同用于打印不同

长度的虚线,参数长度的虚线,参数 nn (整型)用于指定虚线的长度(整型)用于指定虚线的长度

将将 Print_LinePrint_Line 过程改写如下:过程改写如下: Private Sub Private Sub Print_LinePrint_Line((n As Integern As Integer)) Dim I As IntegerDim I As Integer Print Tab(10);Print Tab(10); For I = 1 To For I = 1 To nn Print "-";Print "-"; Next INext I PrintPrint End SubEnd Sub

调用语句为: Print_Line 实参 或 Call Print_Line( 实参 )例如, Print_Line 30 或 Call Print_Line(30)

n 为形参

调用过程时,实参将值交给形参,由形参带入子过程中执行。

Page 12: 第 6 章  过 程

Private Sub Print_Line(n As Integer) Dim i As Integer Print Tab(10); For i = 1 To n Print "-"; Next i PrintEnd Sub

Private Sub Command1_Click()Dim i As IntegerFor i = 1 To 5 Print call Print_Line (10 * i)Next iEnd Sub

10

n=10

执行结束返回主调过程

开始执行

4.Sub4.Sub 函数的调用过程函数的调用过程

形参

实参子 过 程 执 行 结 束 后 ,子 过 程 执 行 结 束 后 ,返回到主调程序返回到主调程序

Page 13: 第 6 章  过 程

调用语句中,实参可以是常量、变量、表调用语句中,实参可以是常量、变量、表达式、数组达式、数组

Private Sub Private Sub Print_LinePrint_Line((n As In As Integernteger)) Dim I As IntegerDim I As Integer Print Tab(10);Print Tab(10); For I = 1 To For I = 1 To nn Print "-";Print "-"; Next INext I PrintPrint End SubEnd Sub

Call Print_Line(30)

N=30Call Print_Line(n)

A=3:b=7Call Print_Line(a*b+10)

Page 14: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程1.1. 参数的种类参数的种类形参形参 (( 形式参数形式参数 )) :在:在子过程定义子过程定义时,括号中给出的参时,括号中给出的参

数数

例如:例如: Private Sub Private Sub Print_LinePrint_Line((n As Integern As Integer))实参实参 (( 实际参数实际参数 )) :运行时,调用子过程时括号中的参:运行时,调用子过程时括号中的参

数数

例如 :例如 : call Print_Line (call Print_Line (10 * i10 * i))

Page 15: 第 6 章  过 程

2.2. 参数的数据类型参数的数据类型[Private|Public]Sub [Private|Public]Sub 过程名过程名 (( 参数表参数表 )) 参数的数据类型可以是任意数据类型参数的数据类型可以是任意数据类型 ,, 省略数据类型,缺省为省略数据类型,缺省为 variavaria

ntnt 型。型。 参数表中的参数可以是空、一个或者多个。如果有多个参数,用逗参数表中的参数可以是空、一个或者多个。如果有多个参数,用逗号隔开号隔开

例如: Private Sub Print_Line( ) Private Sub Print_Line(n As Integer) Private Sub add(a As Integer, b As Intege

r)

6.5 6.5 传递参数传递参数-- SubSub 过程过程

Page 16: 第 6 章  过 程

[[ 例例 3]3] 定义一个拥有多个参数的定义一个拥有多个参数的 subsub 过程过程 cacal(a as single,b as single,op as string)l(a as single,b as single,op as string) 完完成计算功能,参数成计算功能,参数 aa 、、 bb 是两个操作数,是两个操作数,opop 是运算符。点击“计算”按钮,调用是运算符。点击“计算”按钮,调用 cacall 过程。过程。

Page 17: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程

44 、调用时,形参与实参应一一对应、调用时,形参与实参应一一对应 (( 个数,个数,位置,数据类型位置,数据类型 ))

如果不对应,后果很严重

Private Sub Print_Line( )Call Print_Line

Private Sub Print_Line(n As Integer) Call Print_Line(30)

Private Sub plus(a As Integer, b As Integer) Call plus(10,30) Call plus (a,b)

Page 18: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程 调用语句中,实参可以是常量、变量、或调用语句中,实参可以是常量、变量、或

表达式表达式

Private Sub Private Sub Print_LinePrint_Line((n As In As Integernteger)) Dim I As IntegerDim I As Integer Print Tab(10);Print Tab(10); For I = 1 To For I = 1 To nn Print "-";Print "-"; Next INext I PrintPrint End SubEnd Sub

Call Print_Line(30)

N=30Call Print_Line(n)

A=3:b=7Call Print_Line(a*b+10)

Page 19: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程 当实参是变量时,实参和形参的数据类型当实参是变量时,实参和形参的数据类型必须保持一致,必须保持一致,除非形参是除非形参是 variantvariant 型型。。

Private Sub Private Sub Print_LinePrint_Line((n As In As Integernteger)) Dim I As IntegerDim I As Integer Print Tab(10);Print Tab(10); For I = 1 To For I = 1 To nn Print "-";Print "-"; Next INext I PrintPrint End SubEnd Sub

Din n as integern=30Call Print_Line(n)

Din n as singleN=30.33Call Print_Line(n)

Page 20: 第 6 章  过 程

Private Sub Print_Line(n As Integer) Dim i As Integer Print Tab(10); For i = 1 To n Print "-"; Next i PrintEnd Sub

Private Sub Command1_Click()Dim i As Integer, n as integern=10For i = 1 To 5 Print call Print_Line ( n)Next iEnd Sub

10

n=10

执行结束返回主调过程

开始执行

5.5. 形参和实参可以同名形参和实参可以同名

Page 21: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程6.Sub6.Sub 子过程的参数还可以是数组子过程的参数还可以是数组 [[习题习题 1].1].

定义一个子过程,求数组中的最小值。定义一个子过程,求数组中的最小值。

Page 22: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程

Private Sub Form_Click() Print Dim a(1 To 10), amin As Integer, i% For i = 1 To 10 a(i) = Int(Rnd * 101 + 100) Print a(i); Next i Print s a() End Sub

Public Sub s(b())Dim i% min = b(LBound(b)) For i = LBound(b) + 1 To UBound(b) If b(i) < min Then min = b(i) Next i Print Print "min="; minEnd Sub

Page 23: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程 按地址传递参数按地址传递参数(( 11 )在形式参数前可以使用)在形式参数前可以使用 byRefbyRef 和和 byValbyVal

关键字,关键字, byRefbyRef 表示按地址传递表示按地址传递(( 22 )缺省情况下表示按地址传递)缺省情况下表示按地址传递(( 33 )对变量的改动会被传回调用程序)对变量的改动会被传回调用程序(( 44 )参数是数组时,只可以是按地址传递参)参数是数组时,只可以是按地址传递参

数数

Page 24: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程

Public Sub Swap(x, y)

Dim t t = x x = y y = tEnd Sub

Private Sub Form_Click() Dim a, b a = 10 b = 20 Call Swap (a, b)Print a,b End Sub

【例】编写一个两个数交换的【例】编写一个两个数交换的 subsub 过程过程 Swap (x,y) Swap (x,y) ,,供多次调用。供多次调用。

按地址传递

改变了 a 和 b 的值

Page 25: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程 按值传递参数按值传递参数(( 11 )在形参前使用)在形参前使用 byRValbyRVal 表示按值传递表示按值传递(( 22 )传递参数时,传递的是变量的副本,)传递参数时,传递的是变量的副本,

过程执行结束,变量值释放。过程执行结束,变量值释放。

Page 26: 第 6 章  过 程

6.5 6.5 传递参数传递参数-- SubSub 过程过程

Public Sub Swap(byVal x, byVal y)

Dim t t = x x = y y = tEnd Sub

Private Sub Form_Click() Dim a, b a = 10 b = 20 Call Swap (a, b)Print a,b End Sub

【例】编写一个两个数交换的【例】编写一个两个数交换的 subsub 过程过程 Swap (x,y) Swap (x,y) ,,供多次调用。供多次调用。

按值传递

会输出什么?

Page 27: 第 6 章  过 程

例例 6-76-7 :以下是一个药品价格计算的子过程,子过程名为:以下是一个药品价格计算的子过程,子过程名为 OldToNewOldToNew ,,参数参数 oldold 为原来药品价格,参数为原来药品价格,参数 NewNew 为新的药品价格。为新的药品价格。

   Sub OldToNew(oldSub OldToNew(old ,, neww)neww)   old = old * 1.05 'old = old * 1.05 ' 药品价格上涨药品价格上涨 5%5%   neww = Int(old) 'neww = Int(old) ' 取整以后得到新的药品价格取整以后得到新的药品价格   End SubEnd Sub   ··········   Private Sub Form_Load()Private Sub Form_Load()   price = 100price = 100   new1 = 0new1 = 0   OldToNew price , new1OldToNew price , new1   Print “Print “ 原来价格为:”原来价格为:” ; price; "; price; "药品价格上涨药品价格上涨 5%5% 后后 ,,价格为:价格为: "; n"; new1ew1   End SubEnd Sub

Page 28: 第 6 章  过 程

因为因为 oldold 是传址变量,对是传址变量,对 oldold 的修改自动地造成了对的修改自动地造成了对 priceprice 的相同修改 。的相同修改 。

将参数传递语句修改为:    Sub OldToNew(ByVal old , neww)

当使用 ByVal声明 old 参数时,程序就会产生如图所示的正确结果:

Page 29: 第 6 章  过 程

例例 6-26-2 ,, 6-36-3 编写一个子过程编写一个子过程 del(s1,s2)del(s1,s2) ,将字符串,将字符串 s1s1 中出中出现现 s2s2 子字符串删去,结果还是存放在子字符串删去,结果还是存放在 s1s1 中。中。例如:例如: s1=”123456789abc”,s2=”abc”s1=”123456789abc”,s2=”abc”结果:结果: s1=”123456789”s1=”123456789”子过程定义如下:子过程定义如下:Public Sub del(s1 As String, s2 As String)Public Sub del(s1 As String, s2 As String)Dim i%Dim i%i = InStr(s1, s2)i = InStr(s1, s2)ls2 = Len(s2)ls2 = Len(s2)Do While i > 0Do While i > 0 ls1 = Len(s1)ls1 = Len(s1) s1 = Left(s1, i - 1) + Mid(s1, i + ls2)s1 = Left(s1, i - 1) + Mid(s1, i + ls2) i = InStr(s1, s2)i = InStr(s1, s2)LoopLoopEnd SubEnd Sub

Page 30: 第 6 章  过 程

6.3.16.3.1 函数过程的定义函数过程的定义FunctionFunction 过程的建立与过程的建立与 SuSubb 过程的建立相似,过程的建立相似,定义函定义函数过程有两种方法:数过程有两种方法:1.1.利用利用“工具”菜单“工具”菜单下的下的“添加过程”来定义。  “添加过程”来定义。  

6.3 6.3 函数过程函数过程

Page 31: 第 6 章  过 程

2 利用代码窗口直接定义。 函数过程形式: [public]|[private]Function 函数过程名 ([ 参数列表 ]) [As 类型 ] 局部变量或常数定义 语句块 [Exit Function] 函数过程体 语句块 函数名 = 返回值 End Function

Private 、 Public及参数表的含义同 Sub 子过程

函数过程名:命名规则同变量名

Function 过程具有函数值,类型缺省为变体型函数名 = 返回值: 在函数体内至少对函数名赋值一次。 [Exit Function] : 表示退出函数过程。

Page 32: 第 6 章  过 程

4.2 4.2 过程过程-- FunctionFunction 过程过程[[ 例例 ] ] 计算 计算

Private Sub Command1_Click()Private Sub Command1_Click() Dim I As IntegerDim I As Integer DimDim e As Single, F As Long e As Single, F As Long For I = 0 To 10For I = 0 To 10 F = F = FactorialFactorial((II) ) '' 计算 计算 I!I! e = e + 1 / Fe = e + 1 / F Next INext I Print "e="; ePrint "e="; eEnd SubEnd Sub

!10

1...

!3

1

!2

1

!1

11 e

Function Factorial(X As Integer) As Long Dim I As Integer, T As Long T = 1 For I = 1 To X ' 计算 X! T = T * I Next I Factorial = TEnd Function

计算阶乘的函数过程

Page 33: 第 6 章  过 程

Private Sub Command1_Click()Private Sub Command1_Click() Dim I As IntegerDim I As Integer Dim e As Single, F As LongDim e As Single, F As Long For I = 0 To 10For I = 0 To 10 F = F = FactorialFactorial((II) ) e = e + 1 / Fe = e + 1 / F Next INext I Print "e="; ePrint "e="; eEnd SubEnd Sub

Function Factorial(X As Integer) As Long Dim I As Integer, T As Long T = 1 For I = 1 To X T = T * I Next I Factorial = TEnd Function

12 传递参数,调用函数

3

4 带回返回值

5 继续执行

Page 34: 第 6 章  过 程

6.3 6.3 函数过程函数过程

6.3.2 function6.3.2 function 的调用方法:的调用方法: [[ 例例 fufun1]n1] 将将 FunctionFunction 返回值赋给一个变量返回值赋给一个变量 将将 FunctionFunction 过程过程的返回值放在表达式中的返回值放在表达式中 可作为其他过程的参数可作为其他过程的参数 像像 subsub 过程一样调用(忽略返回值时)过程一样调用(忽略返回值时) 想一下已经学过的 msgbox 函数

Page 35: 第 6 章  过 程

6.3 6.3 函数过程函数过程 函数过程与函数过程与 subsub 过程的区别:过程的区别:

函数过程返回一个与函数名相关联的值,在子过程体函数过程返回一个与函数名相关联的值,在子过程体内不能对子过程名赋值。内不能对子过程名赋值。

函数过程有类型,子过程没有。函数过程有类型,子过程没有。 调用时,子过程调用是一句独立的语句。调用时,子过程调用是一句独立的语句。 函数过程可参与表达式运算,或作为其他过程的参数。函数过程可参与表达式运算,或作为其他过程的参数。 一般当过程有一个返回值,使用函数过程较直观; 反之若过程无返回值,或有多个返回值,使用子过程较直观。 [ 例 返回值 ]

子过程究竟可不可以返回值?

Page 36: 第 6 章  过 程

使用过程注意事项:1. 确定自定义的过程是子过程还是函数过程

函数过程名有值,子过程名无值。

2 .过程中形参的个数和传递方式的确定

过程中参数的作用是实现过程与调用者的数据通信。

(1) 只须从主调程序获得初值,值传递。

(2) 将结果返回给主调程序,地址传递。

3. 实参与形参结合时对应问题

个数、类型、位置、次序一一对应。

数组只能是地址传递。

Page 37: 第 6 章  过 程

例例 6-1 66-1 6-- 22 编写一个函数,实现一个编写一个函数,实现一个 1010 进制整数转换成为进制整数转换成为 22 到到 1616 任意进制整任意进制整数的功能。数的功能。

界面如图。界面如图。

函数过程定义如下:函数过程定义如下:

Function TranDec$(m%, r%)Function TranDec$(m%, r%)Dim StrDtoR$Dim StrDtoR$Dim iB%, mr%Dim iB%, mr%StrDtoR = ""StrDtoR = ""Do While m <> 0Do While m <> 0mr = m Mod rmr = m Mod rm = m \ rm = m \ rIf mr >= 10 ThenIf mr >= 10 ThenStrDtoR = Chr(mr - 10 + 65) & StrDtoR StrDtoR = Chr(mr - 10 + 65) & StrDtoR ''余数余数 >=10 >=10 转换为转换为 AA~~ F,F,最先求出最先求出

的余数位数最低的余数位数最低ElseElseStrDtoR = mr & StrDtoR StrDtoR = mr & StrDtoR ''余数余数 <10 <10 直接连接,最先求出的余数位数最低直接连接,最先求出的余数位数最低End IfEnd IfLoopLoopTranDec = StrDtoRTranDec = StrDtoREnd FunctionEnd Function

Page 38: 第 6 章  过 程

调用其他模块中的过程调用其他模块中的过程 在工程中的任何地方都能调用其它模块中的在工程中的任何地方都能调用其它模块中的公用过程公用过程。公用过程三种形式:。公用过程三种形式:

一一 .. 窗体中的过程窗体中的过程  所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块   所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块

Form1 Form1 中包含 中包含 SomeSub SomeSub 过程,则可使用下面的语句调用 过程,则可使用下面的语句调用 Form1 Form1 中的过中的过程:程:

       Call Form1.SomeSub(arguments)Call Form1.SomeSub(arguments)

二二 .. 类模块中的过程类模块中的过程  与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类  与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类

实例的变量。实例的变量。  但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须  但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量首先声明类的实例为对象变量 ,, 并用变量名引用它。并用变量名引用它。

三三 .. 标准模块中的过程标准模块中的过程  从其它模块调用公共过程名时必须指定那个模块。例如,若在   从其它模块调用公共过程名时必须指定那个模块。例如,若在 Module1 Module1 中中

调用 调用 Module2 Module2 中的 中的 CommonName CommonName 过程,要用下面的语句:过程,要用下面的语句: Module2.CommonName (arguments)Module2.CommonName (arguments)

Page 39: 第 6 章  过 程

使用可选参数——参数传递使用可选参数——参数传递 可选参数可选参数 在过程的参数列表中,参数前使用在过程的参数列表中,参数前使用 optionoption

alal 关键字就表示此参数可选。关键字就表示此参数可选。 如果指定了可选参数,则此参宿后面的其如果指定了可选参数,则此参宿后面的其他参数也必须是可选的。他参数也必须是可选的。

也可以给可选参数指定缺省值。也可以给可选参数指定缺省值。

Page 40: 第 6 章  过 程

6.6 6.6 过程的嵌套过程的嵌套     VBVB 的过程定义都是平行的关系,或者说是相对独立的存在,这在前几节的的过程定义都是平行的关系,或者说是相对独立的存在,这在前几节的学习中我们应该可以感受的到:定义一个过程的时候,一个过程内部不能再定义学习中我们应该可以感受的到:定义一个过程的时候,一个过程内部不能再定义另外一个过程。这里我们所说的过程嵌套,应该是过程的嵌套调用。另外一个过程。这里我们所说的过程嵌套,应该是过程的嵌套调用。

6.6.16.6.1 过程的嵌套调用过程的嵌套调用  在过程的调用中,可以使用嵌套调用。由于  在过程的调用中,可以使用嵌套调用。由于 VBVB采用面向对象的程序设计技采用面向对象的程序设计技术,采用事件驱动的编程机制,所以程序的执行大多从事件过程开始。比如:在术,采用事件驱动的编程机制,所以程序的执行大多从事件过程开始。比如:在事件过程的执行过程中需要调用过程一,则系统此时会立刻去执行过程一,若在事件过程的执行过程中需要调用过程一,则系统此时会立刻去执行过程一,若在过程一的执行过程中中需要调用过程二,则系统此时会立刻去执行过程二(若在过程一的执行过程中中需要调用过程二,则系统此时会立刻去执行过程二(若在过程二的执行过程中中需要调用过程三的话依次类推),直到过程二执行完毕,过程二的执行过程中中需要调用过程三的话依次类推),直到过程二执行完毕,系统将回到过程一执行调用过程二语句下面的语句,过程一执行完毕,系统将回系统将回到过程一执行调用过程二语句下面的语句,过程一执行完毕,系统将回到事件过程执行调用过程一语句下面的语句。一般来说,过程一和过程二,可以到事件过程执行调用过程一语句下面的语句。一般来说,过程一和过程二,可以是子过程,也可以是函数过程。过程嵌套调用的执行原理如图所示(其中带圆圈是子过程,也可以是函数过程。过程嵌套调用的执行原理如图所示(其中带圆圈的数值为执行步骤): 的数值为执行步骤):

事件过程···

Call 过程一···

End Sub

Sub 过程一···

Call 过程二 (y)···

End Sub

Sub 过程二 (n)·········End Sub

④ ⑤

⑦⑧⑨

Page 41: 第 6 章  过 程

变量、过程的作用域作用域:变量、过程随所处的位置不同,可被访问的范围。 1. 过程的作用域 窗体 / 模块级:加 Private 关键字的过程,只能被定义的窗体或模块中的过程调用。 全局级:加 Public 关键字(缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。

Page 42: 第 6 章  过 程

2. 变量的作用域 局部变量:在过程内用声明的变量,只能在本过程中使用。 窗体 / 模块级变量:在“通用声明”段中用 Dim 语句或用 Private 语句 声明的变量 , 可被本窗体 / 模块的任何过程访问。 全局变量:在“通用声明”段中用 Public 语句声明的变量,可被本应用程序的任何过程或函数访问。

Page 43: 第 6 章  过 程

例如在下面一个标准模块文件中不同级的变量声明:Public Pa As integer ' 全局变量Private Mb As string *10 ' 窗体 / 模块级变量Sub F1( ) Dim Fa As integer ' 局部变量

…End Sub

Sub F2( ) Dim Fb As Single ' 局部变量

…End Sub

Page 44: 第 6 章  过 程

若在不同级声明相同的变量名 ,系统按局部、窗体 /模块、全局次序访问如 : Public Temp As integer ' 全局变量 Sub Form_Load() Dim Temp As Integer ' 局部变量 Temp=10 ' 访问局部变量 Form1.Temp=20 ' 访问全局变量必须加窗体名 Print Form1.Temp, Temp ' 显示 20 10 End Sub

Page 45: 第 6 章  过 程

3. 静态变量局部变量声明: Dim 声明,随过程的调用而分配存贮单元,每次调用都对变量初始化 ;过程体结束,变量的内容自动消失,存储单元释放。 Static 声明,每次调用过程,变量保持原来的值。

例 Private Sub Form_Click() Dim i% , isum% For i = 1 To 5

isum = sum(i)Print isum

Next i End Sub

Private Function sum(n As Integer) Dim j As Integer j = j + n sum = j

End Function

Static j As Integer ,结果?结果为: 1 , 2 , 3 , 4 , 5