收藏 分享(赏)

VB应用程序由若干个过程组成。过程保存在模块文件中。有.ppt

上传人:tangtianxu1 文档编号:3499825 上传时间:2018-11-06 格式:PPT 页数:45 大小:762KB
下载 相关 举报
VB应用程序由若干个过程组成。过程保存在模块文件中。有.ppt_第1页
第1页 / 共45页
VB应用程序由若干个过程组成。过程保存在模块文件中。有.ppt_第2页
第2页 / 共45页
VB应用程序由若干个过程组成。过程保存在模块文件中。有.ppt_第3页
第3页 / 共45页
VB应用程序由若干个过程组成。过程保存在模块文件中。有.ppt_第4页
第4页 / 共45页
VB应用程序由若干个过程组成。过程保存在模块文件中。有.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、第 7 章,过程,本章主要内容,第7章 过 程,退出,通用过程,参数传递,嵌套调用,过程、变量的作用域,程序举例,多窗体与Sub Main过程,Function过程,Sub过程,前面已经使用了很多过程,例如 按钮事件过程、窗体装载事件过程等。过程是完成某种特殊功能的一组独立的程序代码。VB应用程序是由过程组成的。两大类过程:事件过程Sub过程通用过程 Function过程事件过程是VB应用程序的主体通用过程是独立于事件过程之外,可供其他过程调用的程序段,Private Sub Command1_Click() End Sub,Private Sub Form_Load() End Sub,过程

2、有两个重要作用:一是把一个复杂的任务分解为若干个小任务,可以用过程来表达,从而使任务更易理解,更易实现,将来更易维护;二是代码重用,使同一段代码多次复用。,过程的作用,过程调用示例 把相同的任务编成相对独立的“子过程”当事件过程需要执行这个任务时,可使用调用语句(如Call)实行调用。子过程执行完后,会返回事件过程中调用语句Call的后续语句继续执行通用过程又分为Sub(子程序)过程和Function(函数)过程,7.1 通用过程,例7.1 Sub过程的示例Private Sub Form_Load()ShowCall mysub1(30)Call mysub2Call mysub2Call

3、mysub2Call mysub1(30)End Sub程序运行结果 ,Private Sub mysub1(n)Print String(n, “*“) End Sub Private Sub mysub2()Print “*“; Tab(30); “*“ End Sub,7.1.1 Sub过程,例7.1,参数n,无参数,1. Sub过程定义格式: PrivatePublic Static Sub 过程名(参数表) 语句块 Exit Sub End Sub2. 调用Sub过程有以下两种方法:(1) 使用Call语句。格式: Call 过程名(实参表)(2) 直接使用过程名,格式: 过程名实参

4、表例如,调用名为mysub1的过程: Call mysub1(30) mysub1 30,Sub过程的定义和调用,因为计算5!和10!都要用到阶乘n! (n!123n) 所以把计算n!编成Sub过程采用Print直接在窗体上输出结果,程序代码: Private Sub Form_Load()ShowDim y As Long, s As LongCall Jc(5, y)s = yCall Jc(10, y) Print “5! + 10! =“; s + y End Sub程序运行结果: 5! + 10! 3628920,Private Sub Jc(n As Integer, t As L

5、ong)Dim i As Integert = 1For i = 1 To nt = t * iNext i End Sub注意参数n及t的调用情况,例7.2 计算5! + 10!,例7.2,1. Function过程定义格式: Private | Public | Static Function 函数名(参数表) As 数据类型 语句块 函数名表达式 Exit FunctionEnd Function2. Function过程的调用方法:一般采用直接调用的方法 像使用VB内部函数一样,只需写出函数名和相应的参数即可例如: s = Max(a, b)Print Max(s, c),7.1.2

6、Function过程 能从过程中直接返回一个值,Function max(m, n) As Single End Function,Function过程,返回值,分析:在前面例7.2中,因为Sub过程名不能返回值,所以需要在形参表中引入另一个参数t来返回阶乘值。如果改成用Function过程实现,则阶乘值可由函数名返回,因此只需要设置一个参数n.Private Sub Form_load()Dim s As LongShows = jc(5) + jc(10) 把函数作为表达式的一部分进行调用Print “5! + 10! =“; s End Sub Function jc(n As Inte

7、ger) As Long 返回值的数据类型为LongDim i As Integer, t As Longt = 1For i = 1 To nt = t * iNext ijc = t 返回值赋给函数名 End Function从中可以看到Sub过程与Function过程在定义和调用上的区别。,例7.3 将例7.2中的求n!的Sub过程改成Function过程,例7.3,把求两个数中的大数编成Function过程,过程名为Max本例采用InputBox函数输入三个数,判断出最大数后采用Print直接输出在窗体上。 Private Sub Form_Load()ShowDim a As Sin

8、gle, b As Single, c As SingleDim s As Singlea = Val(InputBox(“输入第一个数“)b = Val(InputBox(“输入第二个数“)c = Val(InputBox(“输入第三个数“)s = max(a, b)Print “最大数是:“; max(s, c) End Sub,Function max(m, n) As SingleIf m n Thenmax = mElsemax = nEnd If End Function,例7.4 输入三个数,求出它们的最大数,例7.4,调用,调用,通用过程(Sub/Function)过程可以保存

9、在两种模块中:窗体模块(.frm)和标准模块(.bas)(1) 在窗体模块中创建通用过程:可以在代码窗口中直接键入来创建Sub过程选择“工具”菜单中的“添加过程”命令(2) 在标准模块中创建通用过程:选择“工程”菜单中的“添加模块”命令保存为一个独立的“.bas”文件举例:把例7.3的函数max(m, n)存放在模块文件中,创建通用过程的方法,Private Sub Form_Load()Showp = 1: m = 5Call Sub1(p)Call Sub1(m)End SubPrivate Sub Sub1(x)If x 1 Then x = x - 1x = x * 4Print x;

10、End SubA. 4 15 B. 4 16C. 4 4 D. 4 20,请回答问题:下列程序段的输出结果?,想一想,思考题,答案:B,在窗体上已经建立了一个文本框Txt1和一个 命令按钮Comd1,运行程序后单击命令按钮,则 在文本框Txt1中显示的内容是Dim a As Integer 模块级变量Private Sub Comd1_Click() Dim b As Integer, c As Integera = 1: b = 10Call MySub(b, c)Txt1.Text = a + b + cEnd SubSub MySub(x, y)y = x Mod 7 + aa = 3E

11、nd SubA. 16 B. 17 C. 15 D. 9,请回答问题,想一想,思考题,答案:B,参数传递可以实现调用过程和被调过程之间的信息交换两种方式:按值传递和按地址传递7.2.1 形参与实参形式参数(简称形参)在被调过程中的参数。出现在Sub过程和Function过程中形式参数可以是变量名和数组名 实际参数(简称实参)在调用过程中的参数。过程调用时实参数据会传递给形参形参表和实参表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相同,7.2 参数传递,定义过程和调用过程的示例:调用过程:Call Mysub(100, “计算机“ , 1.5)定义过程:Sub Mysub(

12、t As Integer,s As String,y As Single) “形实结合”是按照位置结合的,即第一个实参值(100)传送给第一个形参t,第二个实参值(“计算机”)传送给第二个形参s,第三个实参值(1.5)传送给第三个形参y。 数组可以作为形参出现在过程的形参表中,1. 按地址传递:关键字ByRef (或缺省)。形参与实参使用相同的内存地址单元,这样通过过程就可以改变变量本身的值2. 按值传递:按值传递(关键字ByVal)。传递参数值而不是传递它的地址,在通用过程中对形参的任何操作都不会影响实参,7.2.2 按地址传递和按值传递,按地址传递 t = 10 示例 Call test2

13、(t)Print t ( t 值为5) t与s是 Sub test2(s As Integer) 同一个变量 s = s - 5End Sub,调用时, t 值传给 s,返回时, s 值传给 t 双向传值,按值传递 x = 10 示例 Call test1(x)Print x (x 值为10) y与x是 Sub test1(ByVal y As Integer) 不同变量 y = y + 5End Sub,调用时, x 值传给 y,返回时, y 值不传给 x 单向传值,设置两个通用过程Test1和Test2,分别按值传递和按地址传递Private Sub Form_Load()Dim x As

14、 IntegerShowx = 5Print “执行test1前,x=“; xCall test1(x)Print “执行test1后,test2前,x=“; xCall test2(x)Print “执行test2后,x=“; x End Sub,Sub test1(ByVal t As Integer)t = t + 5 End Sub Sub test2(s As Integer)s = s - 5 End Sub,运行结果 执行Test1前,x=5 执行Test1后,Test2前,x=5 执行Test2后,x=0,例7.5 参数传递方式示例,例7.5,按值传递,按地址传递,在一个过程(

15、Sub过程和Function过程)中调用另外一个过程。例7.6 输入两个数n、m,求组合数Cnm 的值Cnm =,n!m!(n-m)!,7.3 嵌套调用,例7.6,Private Sub Form_Load()Showm = Val(InputBox(“输入m的值“)n = Val(InputBox(“输入n的值“)If m n ThenMsgBox “输入数据错误“, 0, “检查错误“EndEnd IfPrint “组合数是:“; Calcomb(n, m)End SubPrivate Function Calcomb(n, m)Calcomb = Jc(n) / (Jc(m) * Jc(

16、n - m)End FunctionPrivate Function Jc(x)t = 1For i = 1 To xt = t * iNext iJc = tEnd Function,程序中,采用了过程的嵌套调用方式。在事件过程Form_Load()中调用了Calcomb过程,而在Calcomb过程中调用了三次jc过程。,调 用,调 用,过程的嵌套调用,a=Calcomb(n,m),b=Jc(n),事件过程 Form_Load,Function过程 Calcomb(n,m),Function过程 Jc(x),7.4.1 代码模块的概念 应用程序包括窗体文件(.frm)、模块文件(.bas)和

17、类模块(.cls),7.4 过程、变量的作用域,模块级和全局级。根据使用的关键字不同,过程有不同的作用域。(1)模块级过程。在窗体模块或标准模块中用关键字Private定义的过程,其作用域仅仅是其所在的模块(窗体模块或标准模块),在其他模块中无效。(2)全局级过程。在窗体模块或标准模块中用关键字Public(或省略关键字)定义的过程,其作用域是整个应用程序的所有模块。当全局级过程是在窗体模块中定义时,在其他模块中调用时要指出窗体模块的名字,即:“窗体模块名.全局级过程名(实参表)”;当全局级过程是在标准模块中定义时,在其他模块中可以直接调用,即:“全局级过程名(实参表)”。,7.4.2 过程的

18、作用域,局部变量、模块级变量和全局变量1. 局部变量 在一个过程内部用Dim或Static声明的变量称为局部变量。只能在本过程中有效。在一个窗体中,不同过程中定义的局部变量可以同名。例如,在一个窗体中定义 Private Sub Command1_Click()Dim Sum As IntegerSum = 1. . . End SubPrivate Sub Command2_Click()Dim Sum As SingleSum = 1.5. . . End Sub,这两个过程中同名变量Sum没有任何联系,7.4.3 变量的作用域,它们互不相识,模块级变量可以在一个窗体的不同过程中使用在窗体

19、模块的声明部分中声明该变量Dim n As IntegerPrivate Sub Command1_Click()n=1End Sub Private Sub Command2_Click()n=n+1End Sub如果用Private或Dim来声明,则该变量只能在本窗体(或本模块)中有效,在其他窗体或模块中不能引用该变量。 以Public声明的变量,允许在其他窗体和模块中引用,如form1.a,2. 模块级变量,全局变量可以被应用程序中任何一个窗体和模块直接访问。全局变量要在标准模块文件(.bas)中的声明部分用Global或Public语句来声明。格式: Global 变量名 As 数据类

20、型 Public 变量名 As 数据类型,3. 全局变量,生存期,即变量能够保持其值的时间 动态变量和静态变量(见书P157)1. 动态变量程序运行进入变量所在的过程时,才为变量分配内存单元,退出过程时,该变量占用的内存单元自动释放,其值消失。当再次进入该过程时,所有的动态变量将重新初始化。使用Dim关键字在过程中声明的局部变量属于动态变量2. 静态变量退出该过程时变量值被保留,即变量所占的内存单元没有释放。当以后再次进入该过程时,原来的变量值可以继续使用使用Static关键字在过程中声明的局部变量属于静态变量,7.4.4 变量的生存期,Private Sub Dim a As Integer

21、 a是动态变量Static b As Integer b是静态变量x = a + 1 每次进入过程时, a值为0y = b + 1 每次进入过程时, b保持上次的值 End Sub,Static sub test() private sub c1_click()Dim t as integer call testt=2*t+1 End subPrint t End subPrivate sub form_click() private function fn(t as integer)s=fn(1)+fn(2)+fn(3) static mprint s m=m+t End sub fn=me

22、nd function,7.5.1 多窗体处理在多窗体程序中,每个窗体可以有自己的界面和程序代码,完成不同的操作 1. 添加窗体 通过“工程”菜单中的“添加窗体”命令来实现 2. 删除窗体 选择“工程”菜单中的“移除”命令 3. 保存窗体 选择“文件”菜单中的“保存”或“另存为”命令 4. 设置启动窗体 在“工程属性”对话框中设置,7.5 多窗体与Sub Main过程,Load语句:把一个窗体装入内存UnLoad语句:清除内存中指定的窗体Show方法:显示一个窗体Hide方法:隐藏窗体。即不在屏幕上显示,但仍在内存中,因此它与UnLoad的作用是不一样的例如: Load Form1Form1.

23、Show 注意:语句和方法的使用格式不同。调用对象的方法:对象名.方法名,5. 有关语句和方法,创建3个窗体和1个标准模块 (1)主窗体(Form1)本窗体上建立了“输入数据”(Command11) 、“计算”(Command12)和“结束”(Command13)三个命令按钮 设置为启动窗体,例7.8 多窗体应用示例 计算两数之和及积,例7.8,启动 窗体,主窗体,输入两个数,计算,定义全局变量,Private Sub Command11_Click() 主窗体“输入数据”按钮单击后进入“输入数据”窗体Form1.Hide 隐藏主窗体Form2.Show 显示“输入数据”窗体 End Sub

24、Private Sub Command12_Click() 主窗体“计算”按钮单击后进入“计算”窗体Form1.Hide 隐藏主窗体Form3.Show 显示“计算”窗体 End Sub Private Sub Command13_Click() 主窗体“结束”按钮Unload Form1Unload Form2Unload Form3End End Sub,先卸载所有已打开的窗体,(2)“输入数据”窗体(Form2)这是在主窗体上单击了“输入数据”按钮后弹出的窗体,用于输入运算数x和y。窗体上建立了2个文本框(Text21和Text22)和1个“返回”命令按钮(Command21) Priv

25、ate Sub Command21_Click() “输入数据”窗体的“返回”按钮X = Val(Text21.Text)Y = Val(Text22.Text)Form2.Hide 隐藏“输入数据”窗体Form1.Show 显示主窗体End Sub,(3)“计算”窗体(Form3)这是在主窗体上单击了“计算”按钮后弹出的窗体。窗体上建立了1个文本框和2个命令按钮。用户可以单击“加法”(Command31) 或“乘法”(Command32)命令按钮,使之按要求进行计算。Private Sub Command31_Click() “计算”窗体的“加法”按钮Text31.Text = X + Y

26、End Sub Private Sub Command32_Click() “计算”窗体的“乘法”按钮Text31.Text = X * Y End Sub Private Sub Command33_Click() “计算”窗体的“返回”按钮Form3.Hide 隐藏“计算”窗体Form1.Show 显示主窗体 End Sub,Text31,(4)标准模块(Modulel)由于在各窗体之间需要使用公共变量来传送数据,所以建立一个标准模块Modulel,对用到的全局变量X和Y进行声明 运行程序后,首先显示主窗体。在主窗体上,用户可通过“输入数据”和“计算”两个按钮来选择进入不同的窗体,例如单击

27、“输入数据”按钮,则主窗体消失,显示“输入数据”窗体。在“输入数据”窗体或“计算”窗体上,单击“返回”按钮,又可以隐藏当前窗体和重现主窗体,程序一般从启动窗体的Form_Load过程开始执行有时在程序启动时不加载任何窗体,而是首先执行一段程序代码,此时可把要执行的程序代码放在Sub Main过程中,并指定Sub Main为“启动对象”。应用程序在运行时会先执行Sub Main过程Sub Main过程存放在标准模块中。在一个工程中只能有一个Sub Main过程设置Sub Main过程为“启动对象”的方法:在“工程属性”对话框的“通用”选项卡中,从“启动对象”下拉列表框中选中“Sub Main”,

28、7.5.2 Sub Main过程,例7.9,例7.10 输入一个十进制正整数,将其转换成二进制数、八进制数和十六进制数。(1)分析:模仿十进制正整数转换成二进制数的方法(即“除2取余”),采用逐次“除r取余”法(r为2,8或16),即用r去除d(十进制数)取余数,商赋给d,如此不断地用r去除d取余数,直至商为0为止,将每次所得的余数逆序排列(以最后余数为最高位),即得到所转换的r进制数。将进制转换处理段定义为Function过程,过程名为fntran,并设置两个参数,将参数d设置为按值传递(ByVal)方式。,7.6 程序举例,Private Sub Command1_Click() “转换”

29、Dim d As Longd = Val(Text1.Text)Text2.Text = fntran(d, 2) 调用函数fntran,转换为二进制数Text3.Text = fntran(d, 8) 调用函数fntran,转换为八进制数Text4.Text = fntran(d, 16) 调用函数fntran,转换为十六进制数 End Sub Function fntran(ByVal d As Long, r As Integer) As StringDim t As String, n As Integert = “Do While d 0 直到商为0n = d Mod r 取余数d

30、= d r 求商If n 9 Then 超过9转换成对应的AF十六进制数表示形式t = Chr(n + 55) & t 换码为字母,反序加入Elset = n & t 反序加入End IfLoopfntran = t End Function,例7.10,例7.11 将判断一个数是否为素数编成一个函数,然后通过调用该函数求5001000数中的所有素数,把这些素数显示在列表框中。(1)分析:素数也称质数,就是只能被1和它本身整除,而不能被其他整数整除的整数。例如 2,3,5,7 是质数,而 4,6,8,9 则不是。判断某数m是否是素数的算法是:对于m,从k = 2,3,4,m-1依次判别能否被k

31、整除,只要有一个能整除,m就不是素数,否则m是素数。,例7.11,Function FnPrime(m As Integer) As BooleanDim k As Integer, f As Booleanf = True 设置f来表示判断状态,初值为TrueFor k = 2 To m - 1 从k = 2,3,4,m-1依次判断If m Mod k = 0 Then 判m是否能被k(2m-1中的一个数)整除f = False 如m能被k整除,则置f为FlaseEnd IfNext kFnPrime = f 返回函数值 End Function Private Sub Command1_C

32、lick() “求素数“按钮Dim t As IntegerList1.Clear 清除列表框中的内容For t = 500 To 1000If FnPrime(t) Then 调用函数,根据t是否素数返回函数值真或假List1.AddItem t 若是素数,则存入列表框中End IfNext tLabel1.Caption = “5001000数中共有“ & List1.ListCount & “个素数“ End Sub,分析:为了得到一个圆大小变动的动画效果,先在某一位置上绘制一个圆,显示一段时间(延时)后抹除,接着在下一位置上依此处理,直到指定位置为止。延时:利用 Timer函数,该函数

33、返回系统时钟从午夜开始计算的秒数(带两位小数) Private Sub Delay(d) 功能:延时d秒t = Timer() + dDo While Timer() t 利用空循环实现延迟LoopEnd Sub,例7.12 绘制一个圆,使之从小变大,再从大变小,例7.12,系统提供的当前时间数,设定的时间数,了解Timer的作用,抹除方法:采用底色(背景色)来掩盖图形,采用Circle方法可以画一个圆,Private Sub Form_Load()ShowForm1.BackColor = QBColor(15) 设置背景颜色Call Pict(30, 1600, 30) 从小变大Call

34、Pict(1600, 30, -30) 从大变小 End SubPrivate Sub Pict(a, b, c) 显示延迟抹除 For i = a To b Step c 在i位置上处理Call Plot(i, 4) 显示圆Delay 0.1 延迟0.1秒Call Plot(i, 15) 抹除Next i End Sub Private Sub Plot(r, clr)Form1.Circle (2400, 1600), r, QBColor(clr) 画圆 End Sub,a及b为半径的开始值及结束值,c为每次半径增量,r、clr分别为圆半径和颜色值,在窗体上建立3个文本框,使之以不同效果

35、显示文字“2008年世界奥运会在中国北京市隆重举行” 第一个文本框Text1从左到右逐字显示,直到把整行文字显示出来;第二个文本框Text2使文字从左到右作水平移动;第三个文本框Text3以闪动方式显示文字设计界面 运行界面,例7.13 动态文字,例7.13,Dim txt As String, n As Integer, k As Integer Private Sub Form_Load()n = 0txt = “年世界奥运会将在中国北京市举行“k = Len(txt)Text1.ForeColor = RGB(255, 0, 0) 红色Text2.ForeColor = RGB(0, 0

36、, 0) 黑色Text3.ForeColor = RGB(0, 0, 255) 蓝色 End Sub,Private Sub Timer1_Timer()n = n + 1 模块级变量n是关键参数If n = k ThenText1.Text = Left(txt, n) 逐次取n个汉字,n每次加 1Text2.Text = Space(2 * (k - n) + Left(txt, n)Elsen = 0Text1.Text = “Text2.Text = “End IfIf n Mod 2 = 0 Then 以2个定时时间为1个周期,显示及清除交替进行Text3.Text = txt n为偶数时显示ElseText3.Text = “ n为奇数时清除End If End Sub,每次减少2空格 1个汉字占2个字符位置,每次增加 1个汉字,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 往来文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报