Sub过程的建立.ppt

上传人:小飞机 文档编号:5449669 上传时间:2023-07-08 格式:PPT 页数:41 大小:228.99KB
返回 下载 相关 举报
Sub过程的建立.ppt_第1页
第1页 / 共41页
Sub过程的建立.ppt_第2页
第2页 / 共41页
Sub过程的建立.ppt_第3页
第3页 / 共41页
Sub过程的建立.ppt_第4页
第4页 / 共41页
Sub过程的建立.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《Sub过程的建立.ppt》由会员分享,可在线阅读,更多相关《Sub过程的建立.ppt(41页珍藏版)》请在三一办公上搜索。

1、2023/7/8,1,第九章 过程,2023/7/8,2,9.1 Sub过程,一、Sub过程的建立1.定义Sub过程格式:StaticPravitePublic Sub过程名(参数表列)语句块Exit Sub语句块End Sub说明:Sub过程以Sub开头,以End Sub结束,之间是“过程体”或“子程序体”。格式中的参量的含义如下:Static:指定了过程中的局部变量在内存中的默认存储方式。如果使用了Static,则在每次调用过程时,过程中的所有局部变量的值保持不变;否则就会被初始化为零。对过程之外定义的变量没有作用。,2023/7/8,3,Private:表示Sub过程是私有的过程,只能被

2、本模块中的其它过程所访问,其它模块中的过程不能访问。Public:表示Sub过程是公有过程,可以在程序中的任何地方调用它。过程名:一个标准的变量名,同一模块中,不能和一般变量、数组变量或Functio过程名重名。参数表列:调用时传送给该过程的简单变量名或数组名,各名字之间用逗号分隔开。“参数表列”指明了调用时传送给过程的参数的类型和数量,每个参数的格式为:ByVal变量名()As 数据类型 其中“变量名”是一个合法的VB中的变量名或数组名。如果是数组名,则要在数组名后加上一对括号。“数据类型”指的是变量的类型。ByVal参数是可选的,如选择了,则说明该参数是传值的,没有的话就是“引用”,202

3、3/7/8,4,(2)End Sub语句标志着Sub过程的结束,每个Sub过程中必须有一个End Sub子句,当程序执行到End Sub时,就会退出该过程,并且返回到调用该过程的语句的下一条语句。在Sub过程中还可以有一个或多个Exit Sub语句可以从过程中退出。(3)Sub过程不允许嵌套。即Sub过程中不能再定义Sub过程或Function过程,不能用GoTo、GoSub或Return语句进入或退出一个Sub过程,只能通过正常调用来执行Sub过程,而且可以嵌套嵌套调用。举例9.1,2023/7/8,5,2.建立Sub过程 通用过程不属性任何一个在事件过程,只能建立在标准模块或窗体模块中。标

4、准模块的建立有二种方法:第一种方法的操作步骤是:(1)执行“工程”中的“添加模块”命令,打开“添加模块”对话框选择“新建”选项卡,双击“模块”图标,打开代码窗口。(2)执行“工具”中的“添加过程”命令,打开“添加过程”对话框。(3)在“名称”框中输入过程名。(4)在“类型”栏中选择过程的类型。(5)在“范围”栏中选择过程的适用范围,公有的或私有的。第二种方法的操作步骤是:执行“工程”中的“添加模块”命令,打开模块代码窗口,然后在窗口中键入过程的第一行开始。,2023/7/8,6,二、调用Sub过程 调用一个Sub过程,就是要执行该过程。调用执行有二种方式,一种是将过程的名字放在一个Call语句

5、中,另一种是直接将过程名字作为一个语句来使用。1.用Call语句来调用Sub过程格式:Call 过程名(实际参数)在调用时,实际参数的数量、类型都要和Sub过程定义中的参数的数量和类型都要一样。“实际参数”是传送给Sub过程的变量或常数。例:call Tryout(a,b)2.把过程名作为一个语句来使用 和前一种相比,没有了关键字Call,在实际参数中也没有了括号。Try a,b 举例说明:求素数例9.1 延迟指定时间 例9.2,2023/7/8,7,三、通用过程与事件过程控件事件过程的一般格式:Private|Public Sub 控件名_事件名(参数表)语句组End sub窗体事件的一般格

6、式:Private|Public sub Form_事件名(参数表)语句组End Sub调用的一般格式:模块名.过程名(参数表),2023/7/8,8,9.2 Function过程,一、Function过程的定义 Function过程定义的格式如下:StaticPrivatePublic Function过程名(参数表列)As 类型语句块过程名=表达式Exit Function语句块End Function说明:(1)Function过程以Function开头,以End Function结束,之间是“过程体”或“函数体”。格式中参数的含义与子过程Sub中的完全一样。,2023/7/8,9,(2

7、)调用Sub过程相当于执行一个语句,它不会返回任何值;而执行一个Function过程,一定会返回一个函数值,所以它可以相内部函数一样在表达式中使用它。在Function过程中至少有一条语句是“过程名=表达式”这样的,即将要返回的值传送给过程名。(3)过程不能嵌套,即不能在事件过程中再来定义过程(包括过程和Function过程),只能在事件过程中调用相应的过程。建立Function过程的方法和建立Sub过程的方法一样。Function BinarySearch(lower as integer,upper as integer)as boolean If lower=upper then bin

8、arysearch=true exit function else binarysearch=false end if end function,2023/7/8,10,二、调用Function过程 Function过程可以像内部函数一样来使用。Function过程本身就要返回一个值,所以实际上就是一个函数,通常称为子函数。举例:最大公约数、随机数,2023/7/8,11,声明文件,窗体模块(.frm)文件,类模块(.cls文件),标准模块(.bas文件),子程序过程(sub),函数过程(func_tion),事件过程(sub),声明部分,应用程序工程文件(.vbp),子程序过程(sub),函

9、数过程(func_tion),事件过程(sub),2023/7/8,12,9.3 参数传递,在调用一个过程时,必须要将实际参数传送到过程中去完成实际参数和形式参数的结合,然后用实际参数执行执行过程。一、形参和实参 形参是在过程定义中出现的变量名 实参是在调用过程时传送给过程的常数、变量、表达式或数组。在VB中有二种方式来传送参数,即按位置传送和指名传送。1.按位置传送 实际参数的次序必须和形式参数的次序完全一样,参数的位置、数量和类型都必须保持一致。在形参中,只能是变长的字符串(如x$、x As String),而不能用定长字符串来作为形参的定义(如x As String*8)。,2023/7

10、/8,13,Sub testsub(a as integer,array()as single,recvar as rectype,c as string)Type rectype Rand as string*12 SerialNum as longEnd typeDim recv as rectypeCall testsub(x,a(),recv,dephone),2023/7/8,14,2.指名传送 指名参数传送即将要传送的实际参数的值用“:=”的形式赋给对应的形参。这样的传送方式只认形参的名,而不认形参的传送位置。例:sub add_num(x as integer,y as inte

11、ger,z as integer)r=(x+y)*z print r end sub下面的四条调用语句都是执行相同的功能add_num 4,6,8add_num x:=4,y:=6,z:=8add_num y:=6,x:=4,z:=8add_num z:=8,y:=6,x:=4,2023/7/8,15,二、引用 在VB中有二种方式来传送参数,即传地址和传值。其中传地址习惯上称为“引用”。在默认的情况下,变量都是通过“引用”的方式来传送给过程的。如在过程中改变了参数的值,则就会改变传送给过程的实参的值。因为实际参数是存放在内存中的某个地址中,通过引用来调用一个过程时,只是将实参的地址传送给相应的

12、形参,所以,实参和形参的地址是同一个,当形参中的内容改变时,实参的内容也相应的改变了。如果在调用过程中不希望改变实参的值,则不能使用这种引用的方式,只能用传值的方式。传送地址比传值能够节省内存和提高工作效率。过程中的形参只是一个地址,系统不要为它的值分配内存空间,只需要记住它是一个地址就可。(对字符串的引用比较明显)例9.6 例9.7,2023/7/8,16,三、传值 传值就是通过传送实参的实际的值到过程中的形参,而不传送相应的地址。这种情况下,则需要将实参的值先保存在内存中的一个临时单元中,再将该单元的地址传送给形参。因为被调用的过程没有真真地访问实参变量的原始地址,也就不会改变原来实参变量

13、的值。传值是通过加上关键字ByVal来实现的。即在形参前面加上ByVal,则该形参的传送就是传送的值。传送地址的效率比传值的要高,但在传送地址方式中,形参并不是一个真真的局部变量,则有可能会对程序的正常执行带来意想不到的结果。所以在有些情况下,只能用传值的方式才能得到正确的结果。例9.3.3 例9.3.3.1,2023/7/8,17,四、数组参数的传送 在VB中允许将数组作为实参传送到过程中。例:Sub s(a(),b()End Sub 在这个过程中有二个数组形参。在用数组作形参时,应在数组名的后面加上一对括号,不要和普通变量混淆。调用此过程时可用命令 Call S(p(),q()这样,数组p

14、,q就作为实参传送给过程中的数组a,b,这种传送方式是传送地址,而不是传值。在传送地址的方式中,形参的值改变也会使实参中相应的值改变。在传送数组时,除基本的规则外,还应注意:(1)传送数组全部元素时,数组名在形参、实参表中出现,并且省略相应的上下界,但是括号不能省略。例9.8(2)如果不是整个数组传送,而只是传送单个元素时,这时就要在实参中加上指定数组元素的下标。例9.3.4(3)lboundhe ubound函数控制整个循环。例9.3.4.1例9.9,2023/7/8,18,(4)传送记录类型变量 type stockitem partnumber as string*8 descripti

15、on as string*8 unitprice as single quantity as intrgerEnd typeDim stockrecord as stockitemCall findrecord(stockrecord)Sub finfrecord(recordvar as stockitem)Endsub,2023/7/8,19,(5)单个记录元素的传送:实参表中:记录名.元素名type stockitem partnumber as string*8 description as string*8 unitprice as single quantity as intrge

16、rEnd typeSub PrintpriceTeg(desc as string,price as single)End subDim stickrecord as stockitemCall printpriceteg(stockrecord.description,stockrecord.unitprice),2023/7/8,20,例9.10 用梯形法求定积分,将积分区间a,bn等分,小区间的长度为,第i块小矩形的近似面积为:整个积分的结果为这n块小面积的累加,即:,S=h/2f(a)+2f(a+h)+2f(a+2h)+2f(a+(n-1)h)+f(b),2023/7/8,21,9.4

17、 可选参数和可变参数,一、可选参数 在前面讲的要求一个过程中的形参数量是固定的,调用时传送的实参的数量要和形参的数量相同。实际上在VB的过程中还可指定一个或多个形参是可选参数。定义可选参数用的是关键字Optional,在过程中使用可选参数时要利用函数IsMissing()来测试是否传送了可选参数。Sub Multi(fir As Integer,sec As Integer,Optional thi)n=fir*sec If Not IsMissing(thi)Then n=n*thi Print nEnd Sub 在调用时,二个或三个实参都是正确的。可选参数在过程中定义时,都有要放在参数表的

18、最后,并且必须是Variant类型。可选参数可以有多个。,2023/7/8,22,二、可变参数 格式:Sub 过程名(ParaArray 数组名)这时数组名是一个形参,只有名字和括号,而没有上下界。例如,使用可变参数来建立一个求出任意多个数乘积的过程。Sub Multi(ParaArray Num()n=1 For Each x In Num:n=n*x:next x print nEnd Sub 调用时可用节Multi 2,3,4,5 或 Multi 3,6,9,并且因为可变参数是变体类型,只能使用传送地址的方式。,2023/7/8,23,9.5 对象参数,除了一般可用变量作为形式参数外,在

19、VB中还可以使用对象作为参数,即窗体或控件作为通用过程的参数。一、窗体参数 设计一个多窗体的程序,有多个窗体,除了名字不一样外,窗体的位置、大小都有相同。一般情况下可以这样来写:Form1.Left=2000:Form1.Top=3000Form1.Width=5000:Form1.Height=3000Form2.Left=2000:Form2.Top=3000Form2.Width=5000:Form2.Height=3000,2023/7/8,24,可以用窗体作为参数,编写一个通用的过程。Sub FormSet(FormNum As Form)FormNum.Left=2000 Form

20、Num.Top=3000 FormNum.Width=5000 FormNum.Height=3000End Sub 在调用时,可以使用窗体作为实参。例:FormSet Form1 即可设置窗体Form1的位置和大小。在上述过程中,形参FormNum的类型为窗体(Form)二、控件参数 控件也可以作为过程中的形参,它的类型为Control,在过程中可以设置控件所需的属性,再用不同的控件来调用此过程。,2023/7/8,25,控件作为参数的使用比窗体要复杂一些,因为不同的控件所具有的属性并不一样,如在调用过程时,用不同的控件来作实参,而该控件产不具有该属性时,就会产生错误。为了保证实参中的控件和

21、形参中的控件是同一类型的控件,VB中提供了一个语句TypeOf来检查某个控件参数是否属于某种控件类型。格式:TypeOf 控件名称 Is 控件类型 这里的控件类型是控件的关键字。,2023/7/8,26,9.6 局部内存分配,我们前面讲过静态变量。静态变量只能出现在事件过程、Sub过程或Function过程中。只是局部变量。但在过程结束后,该变量的值仍然会保留下来。格式:Static 变量表 在程序设计中,常用于以下二种情况。(1)记录一个事件被触发的次数,即程序运行时事件发生的次数。举例9.6.1(2)用于作为开关切换的变量举例9.6.2。说明:(1)用Static语句定义的变量可以和在模块

22、定义的变量或全局变量重名。(2)过程内的该变量只是局部变量。(3)用数组作为局部变量放在该语句中时,使用前应标出其维数。sub subpro()static arr(-5 to 5)as integer end sub,2023/7/8,27,9.7 递归,递归就是过程调用过程本身。VB中的过程具有递归调用功能,递归分成二类:直接递归和间接递归。递归在阶乘运算、级数运算等某些方面特别有效。在执行递归操作时,VB将递归过程中的相关信息存放在堆栈中。32位版本的递归调用的层数没有限制。例9.13:N!例9.14最大公约数 例9.15,2023/7/8,28,2023/7/8,29,Sub f1(x

23、)x=f2(xx)*3End Sub,Sub Command1_Click()Call f1(y)End Sub,Function f2(x)f2=f3(x)+3End Sub,Function f3(x)f3=x*xEnd Sub,Sub f1(x)Call f1(y)End Sub,过程的直接调用,Sub Command1_Click()Call f1(y)End Sub,过程的递归调用,2023/7/8,30,递归过程 过程在自身定义的内部调用自己。Function fac(n As Integer)As Integer If n=1 Then fac=1 Elsefac=n*fac(n

24、-1)End If End Function,Sub Command1_Click()Print“fac(4)=”;fac(4)End Sub结果:fac(4)=24,2023/7/8,31,递推,回归,在递归处理中,用栈来实现。栈中存放形参、局部变量、返回地址。递推过程:每调用自身,当前参数压栈,直到达到递归结束条件。回归过程:不断从栈中弹出当前的参数,直到栈空。递归算法设计简单,但消耗的机时和占据的内存空间比非递归大。思考:若上述fac函数中:If n=1 Then fac=1 即仅有语句:fac=n*fac(n-1)或 n=0 程序运行将造成何结果?由此可见构成递归的结构如下:递归结束条

25、件及结束时的值;能用递归形式表示,并且递归向终止条件发展。,2023/7/8,32,例9.14:利用递归求最大公约数,Public Function gcd(m As Integer,n As Integer)As Integer If(m Mod n)=0 Then gcd=n Else gcd=gcd(n,m Mod n)End IfEnd FunctionPrivate Sub Form_Click()Print gcd(10,4)End Sub,2023/7/8,33,分析以下子过程的功能,当n=100,r=8,结果是多少?Public Sub f(ByVal n%,ByVal r%)

26、If n r Then Call f(n r,r)Print n Mod r;End Sub Private Sub Command1_Click()Call f(100,8)End Sub,显示结果 1 4 4,2023/7/8,34,9.8 Shell函数,在VB中,不但可以调用通用过程,而且可以调用各种应用程序。即凡能在Windows下运行的应用程序基本上都可以在VB中调用。Shell函数的格式:Shell(命令字符串,窗口类型)例9.16,2023/7/8,35,“命令字符串”是要执行应用程序的文件名(包括路径)它必须是可执行文件。调用某个应用程序并成功地执行后,Shell函数返回一个

27、任务标识。以异步方式执行其他程序。用该函数启动的程序还没有执行完,就可能已经执行Shell后面的语句了。,2023/7/8,36,第九章 菜单程序设计,2023/7/8,37,9.1 VB的菜单,菜单的作用有两个:一是提供人机对话的界面;二是管理应用系统,控制各功能模块的正常运行。菜单分成两种基本类型:弹出式菜单和下拉式菜单。这二种菜单是在Windows中最常见的菜单了。下拉式菜单是一种典型的窗口式菜单。窗口是屏幕上的一个特定的矩形区域,可显示也可隐藏,多个窗口之间可以互相覆盖。在Windows中下拉式菜单用的最多。在下拉式菜单中,有一个主菜单,其中包括若干个选项,每一项又可“下拉”出下一级的

28、子菜单,这样逐级下拉,用一个个窗口的形式弹出在屏幕上,选择后菜单又会出屏幕上消失。,2023/7/8,38,下拉式菜单的优点:(1)整体感强,操作一目了然,界面友好、直观,使用方便,易于学习和掌握。(2)具有导航功能,为用户在各个菜单的功能间进行导航。(3)占用屏幕空间小,通常只占用屏幕最上面的一行,在必要时才下拉出一个子菜单。一般情况下,窗体可分成三个部分:主菜单区、子菜单区和工作区。主菜单区一般只有一行,放在窗体的顶部;子菜单区为临时性的弹出区域,在选择了相应主菜单后才会显示出对应的子菜单,可多级显示子菜单,子菜单中的最后的菜单项就是一个命令或分隔条。,2023/7/8,39,9.2 菜单

29、编辑器,使用可视化语言来编写菜单,使编写工作变得简单和直观。不要计算菜单项中的位置、不要考虑如何保存或恢复屏幕,全部的设计只是在一个窗口中通过对话完成。在VB中使用菜单编辑器来设计菜单。进入菜单编辑器的方式有4种:执行“工具栏”中的“菜单编辑器”命令;直接按键Ctrl+E;单击“菜单编辑器”按钮;在窗体上按鼠标右键出现的快捷菜单中选择“菜单编辑器”命令。菜单编辑器的窗口一共分成三个部分:数据区、编辑区和菜单项显示区。数据区 包括:标题、名称(name)、索引、快捷键、帮助上下文、协调位置(对齐方式)、复选(标记)、有效(Enabled)、可见(visible)和显示窗口列表。,2023/7/8

30、,40,编辑区 包括:左右箭头(内缩符号)、上下箭头(菜单项)、下一个、插入和删除共七个按钮。菜单显示区 已经输入好的菜单全部在这里显示出来,并且可以看出菜单项所在的层次。说明:菜单项是一个总称,包括:菜单名、菜单命令、分隔线和子菜单。内缩符号表示层次。只有菜单名没有菜单项的菜单称为顶层菜单。标题栏中只有一个“-”,则表示一个分隔线。除分隔线外其它菜单项都可以接收Click事件。在输入菜单项时,如在字母前面加上“&”,则显示菜单时在该字母加一下划线,可通过Alt+带下划线的字母打开或执行相应的命令。,2023/7/8,41,9.3 用菜单编辑器建立菜单,菜单设计就包括二个部分:界面设计和编写代码。一、界面设计 主要确定主菜单项及相应的每个主菜单所对应的子菜单项的数量及具体内容,包括:主菜单及子菜单项的显示内容、名称、对应关系、层次、快捷键、分隔符等。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号