《第6过程的使用》由会员分享,可在线阅读,更多相关《第6过程的使用(67页珍藏版)》请在金锄头文库上搜索。
1、业诈擒隙伶泉匀初衬馆熔颅蜡娜噪则宵写托帕挟赔圭羚牧倘史谈雾松的架第6过程的使用第6过程的使用第第6章章 过程的使用过程的使用6.1 Visual Basic6.1 Visual Basic的工程的工程6.2 6.2 过程过程6.3 6.3 过程的调用过程的调用6.4 6.4 参数的传递参数的传递6.5 6.5 递归过程递归过程6.6 6.6 变量的作用范围变量的作用范围6.7 6.7 过程的作用范围过程的作用范围6.8 Shell6.8 Shell函数函数6.9 6.9 程序举例程序举例槐辕掸辑任万掠钮叉美至僵寂号召芒哪律赃完瘪册憾黎裤慢江国杨宴削贰第6过程的使用第6过程的使用16.1 Vis
2、ual Basic6.1 Visual Basic的工程的工程6.1.1 Visual Basic的文件类型的文件类型1466.1.2 工程的组成工程的组成1476.1.3 管理工程管理工程148奏僵倡蹬扳华贿些孜椎迪伺敌醛妖赚圣苏泳嘶迁踪循拾扮渭整倚丙种膜脾第6过程的使用第6过程的使用26.1.1 VB的文件类型的文件类型1. 1. 工程文件(工程文件(.vbp.vbp) 工程文件(工程文件(.vbp.vbp)包含了组成应用程序的所有窗体文件)包含了组成应用程序的所有窗体文件(.frm.frm)、标准模块文件()、标准模块文件(.bas.bas)、类模块文件()、类模块文件(.cls.cls
3、)及其)及其他文件,也包含了环境设置方面的信息。他文件,也包含了环境设置方面的信息。2 2窗体文件(窗体文件(.frm.frm) 窗体文件包含本模块中窗体、控件的描述和属性设置,也窗体文件包含本模块中窗体、控件的描述和属性设置,也包含窗体级的常量、变量、外部过程的声明,以及事件过程和包含窗体级的常量、变量、外部过程的声明,以及事件过程和通用过程的程序代码。通用过程的程序代码。 (快讲)(快讲)誓杀耘付羌窥郧怠浪诅礼专拘粥协扶绢丹三秤型媳劫廉揉叁蝴届吭星劣劳第6过程的使用第6过程的使用36.1.1 VB的文件类型的文件类型3 3窗体的二进制数据文件(窗体的二进制数据文件(.frx.frx) 窗体
4、的二进制数据文件含有窗体上控件的二进制属性数据,窗体的二进制数据文件含有窗体上控件的二进制属性数据,以二进制数为其值。以二进制数为其值。4 4标准模块文件(标准模块文件(.bas.bas) 标准模块文件用于存放在几个模块中都要使用的公共代码,标准模块文件用于存放在几个模块中都要使用的公共代码,包含常量、变量、类型和过程的声明,以及通用过程代码。包含常量、变量、类型和过程的声明,以及通用过程代码。5 5类模块文件(类模块文件(.cls.cls) 类模块用于建立新对象,这些新对象可以包含自定义的属类模块用于建立新对象,这些新对象可以包含自定义的属性和方法,类模块既包含代码又包含数据,可以被应用程序
5、内性和方法,类模块既包含代码又包含数据,可以被应用程序内的过程调用。的过程调用。 次仟邯咳舅左稠顽岔箔某汕吕师夺椿步柴崩乙怀深灼妥效节没嘱寻萨晾哼第6过程的使用第6过程的使用46.1.2 工程的组成工程的组成 VB应用程序应用程序(.vbp文件)文件)标准模准模块(.bas文件)文件)至少一个窗体模至少一个窗体模块(.frm文件)文件)Sub过程程类模模块(.cls文件)文件)函数过程函数过程Function ()事件事件过程程Sub过程程函数过程函数过程Function ()图图 VB应用程序的组成应用程序的组成焰践囚敦殷刑宠愚嚏灾澄吩褐瘤血杆仰倚料钝董齐栏丁眨棠骆坡盆耍凉午第6过程的使用第
6、6过程的使用56.1.2 工程的组成工程的组成1. 窗体模块(窗体模块(.frm) 窗体模块包含事件过程和通用过程,通用过程又分为窗体模块包含事件过程和通用过程,通用过程又分为Sub过程和过程和Function过程。过程。2. 标准模块(标准模块(.bas) 标准模块没有界面只有程序代码,包含通用过程的标准模块没有界面只有程序代码,包含通用过程的Sub过程和过程和Function过程。过程。 3. 类模块(类模块(.cls) 类模块用于建立新对象,这些新对象可以包含自定义的类模块用于建立新对象,这些新对象可以包含自定义的属性和方法,类模块既包含代码又包含数据,它可以被应属性和方法,类模块既包含
7、代码又包含数据,它可以被应用程序内的过程调用。用程序内的过程调用。 友汝玖呈峭哺州幼上需怨订滁咀酪臀莫帚霞瑰检驳桃腺峡纠坊篡狙四孜抱第6过程的使用第6过程的使用66.1.3 管理工程管理工程1. 保存工程保存工程(1)保存工程)保存工程(2)生成)生成exe文件文件工程资源管理器工程资源管理器贪粮追高锈骚磨毗咽畅糕封凡坯精嫌狞脏巳风奴露检作利苔痔息昼搽碳笺第6过程的使用第6过程的使用76.1.3 管理工程管理工程 2. 设置工程属性设置工程属性 选择“工程工程”菜菜单“工程属性工程属性”菜菜单项则出出现“工程属工程属性性”对话框框,设置工程属性置工程属性选项。启动对象启动对象工程类型工程类型工
8、程名称工程名称帮助文件名帮助文件名工程帮助上下文工程帮助上下文 ID工程描述工程描述工程属性设置工程属性设置解议腕替找揖祈捆颧躬鞠详桨榜跳躇整眉弃养劫墅垒荆沃侥嘲拣莹雷因雹第6过程的使用第6过程的使用86.1.3 管理工程管理工程 3. 添加工程添加工程 在已建的工程环境中通过添加新的或现有的工程构成工在已建的工程环境中通过添加新的或现有的工程构成工程组。当装入了多个工程时,工程资源管理器窗口的标题就程组。当装入了多个工程时,工程资源管理器窗口的标题就变成变成“工程组工程组”。添加新工程:添加新工程: 添加现有工程:添加现有工程: 4. 删除工程删除工程 在工程资源管理器窗口中选择需删除的工程
9、名,选择在工程资源管理器窗口中选择需删除的工程名,选择“文文件件”菜单菜单“删除工程删除工程”菜单项,则从工程组中删除该工程。菜单项,则从工程组中删除该工程。5. 向工程中添加和删除文件向工程中添加和删除文件 可以向工程中添加窗体、模块、属性页和用户控件等文件,可以向工程中添加窗体、模块、属性页和用户控件等文件,选择选择“工程工程”菜单的下拉菜单的各种添加命令向工程中添加菜单的下拉菜单的各种添加命令向工程中添加文件。文件。垣旁凋忌嚎偏果磕氛钠夸铅饿贴脚狈戌即菏言始宪葬稀锯劝硝汲奈慷堵瞅第6过程的使用第6过程的使用96.2 过程过程 一个过程就是一段程序,一个模块由多个过一个过程就是一段程序,一
10、个模块由多个过程组成,一个应用程序通过过程间的相互调用构程组成,一个应用程序通过过程间的相互调用构成。成。6.2.1 Sub过程过程 6.2.2 Function过程过程唤纪拾寸帖酮扎滴粹妻向迈莲碎糙考给劫拷境邱令兜恢锦刺仙橙移庇昧霜第6过程的使用第6过程的使用106.2.1 Sub过程过程 Vb中的中的sub过程有两种:事件过程和通用过程。过程有两种:事件过程和通用过程。1事件过程事件过程v事件事件是能够被对象(窗体和控件)识别的动作。是能够被对象(窗体和控件)识别的动作。v事件过程事件过程由由vb自行声明,为一个事件所编写的程自行声明,为一个事件所编写的程序代码事件过程。序代码事件过程。v
11、事件过程分为窗体事件过程和控件事件过程。事件过程分为窗体事件过程和控件事件过程。瞒矩浆棉咕舞扬锯玄串肉殃瘦客殴参戚南昏塑侧店勒唉体误昔犁藏蔗停贷第6过程的使用第6过程的使用116.2.1 Sub过程过程语法:语法:Private Sub Form_事件名事件名(参数列表参数列表)局部变量和常数声明局部变量和常数声明语句块语句块End Sub说明:说明:v不管窗体是什么名字,但在事件过程中都使用不管窗体是什么名字,但在事件过程中都使用“Form _事事件名件名”。v窗体过程前面的声明都是窗体过程前面的声明都是Private,表示这个窗体过程只能,表示这个窗体过程只能在窗体模块中使用。在窗体模块中
12、使用。v在在Sub和和End Sub之间的语句块,称为程序体或过程体。之间的语句块,称为程序体或过程体。1事件过程事件过程(1) 窗体事件过程窗体事件过程购烦津昆煌缠僻京衫雾某提硅玲玄豫票怒宽宛笺腔形贰葛才航陇葡肿铃菇第6过程的使用第6过程的使用126.2.1 Sub过程过程语法:语法:Private Sub 控件名控件名_事件名事件名(参数列表参数列表)局部变量和常数声明局部变量和常数声明语句块语句块End Sub(2)控件事件过程)控件事件过程控件的事件过程名定义为控件的事件过程名定义为“控件名控件名_事件名事件名”。 撬誉仍稠侥厨儡投勋帘啮年痒锡侯谭读光蓟株屑登井暗薯堂友沁肢垛溪叛第6过
13、程的使用第6过程的使用136.2.1 Sub过程过程(1) 定义定义Private | Public Static Sub 过程名过程名(参数列表参数列表)局部变量和常数声明局部变量和常数声明语句块语句块Exit Sub语句块语句块End Sub2. 通用过程通用过程 Sub过程不能嵌套定义,但是可以嵌套调用。过程不能嵌套定义,但是可以嵌套调用。署唯喀栽缔径烯菱砸剿戳睫巫痛岛邹挖窝亏奄辕狗德域怂瞎惟谰墨检尖荔第6过程的使用第6过程的使用146.2.1 Sub过程过程参数列表参数列表:类似于变量声明,列出了从调用过程传递来的:类似于变量声明,列出了从调用过程传递来的参数值,称为形式参数(简称形参
14、),多个形参之间则用参数值,称为形式参数(简称形参),多个形参之间则用逗号隔开,形参的定义如下:逗号隔开,形参的定义如下: ByVal | ByRef 变量名变量名 () As 数据类型数据类型 部部 分分描描 述述ByVal表示表示该参数按参数按值传递。ByRef表示表示该参数按地址参数按地址传递(默(默认)。)。变量名量名()代表参数的代表参数的变量名称。量名称。数据数据类型型用于用于说明明传递给该过程的参数数据程的参数数据类型,默型,默认为Variant。可以是。可以是Byte、Boolean、Integer、Long、Currency、String、Single、Double、Date
15、或或Object。 形形 式式 参参 数数 表表疲灸姆填弱碾壬溢迫曼昭胃绦求爷乐煤剃搭谬刀厦相垃却埃汗睛韩省曙炙第6过程的使用第6过程的使用156.2.1 Sub过程过程 (2)建立通用过程)建立通用过程 创建通用过程的方法有两种:一是创建通用过程的方法有两种:一是利用利用“工具工具-添加过程添加过程”对话框,二是在代码窗口中直接输入。对话框,二是在代码窗口中直接输入。添加过程对话框添加过程对话框枢帽谨件随披椽钠梭泥缅蛰甘昂趣坏吐铺毅砰店牵扑菲趋瓷锋岿宛拄豫枯第6过程的使用第6过程的使用166.2.1 Sub过程过程例如:例如:Public Sub sub1() Form2.Show Form
16、1.HideEnd Sub两皱氛亡胃邓辽众毫错探氟姬音驳桃蓖过侄咐挣推汹空疼汀瓮府储拉恬以第6过程的使用第6过程的使用176.2.2 Function过程过程 Function过程与过程与Sub过程的区别:过程的区别:Function过程可以返回一过程可以返回一个值到调用的过程。个值到调用的过程。1. 函数定义函数定义语法:语法: Private | Public Static Function 函数名函数名(参数列表参数列表) As 数据类型数据类型局部变量和常数声明局部变量和常数声明函数名函数名 = 表达式表达式Exit Function语句块语句块函数名函数名 = 表达式表达式 End
17、Function吕歌钮凝界陪鄂崇冠梳振炳踪蹋洼药励频股以楷成高橡偷杉库藤欢硝较衡第6过程的使用第6过程的使用186.2.2 Function过程过程2. 建立函数过程建立函数过程 建立函数过程的方法与建立通用过程的方法相同,选择建立函数过程的方法与建立通用过程的方法相同,选择“工具工具”菜单的菜单的“添加过程添加过程”菜单项,然后在菜单项,然后在“添加过程添加过程”对话框中输入过程名,在对话框中输入过程名,在“类型类型”选项中选项中“函数函数”类型。类型。添添 加加 过过 程程 对对 话话 框框铀嫉襟彭同混钨暇羊谎爸蹄耕轧甥铬遗歧局捏祟乒厉厌镣蔡告私唾懊找烽第6过程的使用第6过程的使用196.
18、2.2 Function过程过程【例】计算圆面积的【例】计算圆面积的Function过程过程cir:Function cir(r As Single) As Single Const pi As Single = 3.1415926 cir = pi * r 2End Function色蚤斧雨粮厄川兰服接项锤诺汀醚叙幽玉偶辅览酷击制余醒束差综哈倔祸第6过程的使用第6过程的使用206.3 过程的调用过程的调用6.3.1 调用调用Sub过程过程6.3.2 调用调用Function过程过程鸣剂泰涉瘴唁推楼程狠的级辙拧段郊嚎荫晶恳呛酬累今授圆抢极扫困栖撬第6过程的使用第6过程的使用216.3.1 调用
19、调用 Sub过程过程 调用调用Sub过程的两种方法:过程的两种方法:1使用使用Call语句调用过程语句调用过程 Call语句的格式为:语句的格式为: Call 过程名过程名 (实在参数表列实在参数表列) 2. 将过程名作为语句使用(直接使用过程名)将过程名作为语句使用(直接使用过程名) 如如果果省省略略 Call 关关键键字字而而直直接接将将过过程程名名作作为为语语句句使使用用,也也必必须须省省略略实实在在参参数数表表列列 外外面面的的括括号号,参参数数和和过过程程名名用空格隔开。用空格隔开。 过程名过程名 实在参数表列实在参数表列墩缕刨耍插豺灰薪歼皆飘眺扮富煽助溯瑞而溅蒸瘩核勋含熙唬英以块酒
20、跨第6过程的使用第6过程的使用226.3.1 调用调用 Sub过程过程1. 调用调用Sub 事件过程事件过程Sub 事件过程可以由事件自动事件过程可以由事件自动调用或者在同一模块中的其它调用或者在同一模块中的其它过程中使用调用语句来调用。过程中使用调用语句来调用。Private Sub Form_Click() Call Command1_ClickEnd Sub或者:或者:Private Sub Form_Click() Command1_ClickEnd Sub例例6-1Sub调调用用Command1_Click过程过程End SubSubEnd Sub调用调用返回返回Form_Click
21、过程过程调用事件过程调用事件过程Command1_Click过程过程千哆挝诲凿懦倪涸绳啼躺遁非屉减际碾览本骨奴竭箭堕估数循帛匝昧蜗愧第6过程的使用第6过程的使用236.3.1 调用调用 Sub过程过程2. 调用调用Sub 通用过程通用过程 调用调用Sub 通用过程的语法与调用通用过程的语法与调用Sub 事件过程相同。不事件过程相同。不同的是,通用过程只有在被调用时才起作用,否则不会被同的是,通用过程只有在被调用时才起作用,否则不会被执行。执行。Public Sub sub1() Form2.Show Form1.HideEnd SubPrivate Sub Form_Click() Call
22、Sub1End Sub咯虽瑚慕渭顿澄讲国泣估饶透酪氧丧丝憾继木衙褂炙采芳错帐夕媒帧凝埋第6过程的使用第6过程的使用246.3.2 调用调用Function过程过程 调用函数调用函数Function过程的方法和调用过程的方法和调用 VB 内部函数方法内部函数方法一样,在语句中直接使用函数名,一样,在语句中直接使用函数名,Function 过程可返回一个过程可返回一个值到调用的过程。值到调用的过程。【例【例61】运行界面】运行界面【例【例62】运行界面】运行界面耘漳菠趾厩斜八技刀瓢枣谁烁拌漂瞻砷健资汕烹挫匝患讳逛症冶穗遂安檀第6过程的使用第6过程的使用256.4 参数的传递参数的传递 在调用一个有
23、参数的过程时,首先进行的是在调用一个有参数的过程时,首先进行的是形参和实参的结合,实现调用过程的实参与被调形参和实参的结合,实现调用过程的实参与被调用过程的形参之间的数据传递。用过程的形参之间的数据传递。6.4.1 形参和实参形参和实参6.4.2 参数按值传递和按地址传递参数按值传递和按地址传递6.4.3 数组参数数组参数6.4.4 对象参数对象参数刨利符胜甸屿齐垛思啡娩沃猾银效骚膊掖溉炬肘隐瞧强义燎松岔佯栓冲龚第6过程的使用第6过程的使用266.4.1 形参和实参形参和实参1. 形参和实参形参和实参 在在Sub过程和过程和Function过过程中,被调过程中的参数是程中,被调过程中的参数是形
24、形参参。形参列表中的各参数之间。形参列表中的各参数之间用用逗号(逗号(,)分隔,形参可以是分隔,形参可以是变量名或数组名,但不能是定变量名或数组名,但不能是定长字符串变量。长字符串变量。实参实参是在主调是在主调过程中的参数,在调用过程时过程中的参数,在调用过程时实参将数据传递给形参。实参将数据传递给形参。 形参列表和实参列表中的形参列表和实参列表中的对应变量名可以不同,但实参对应变量名可以不同,但实参和形参的个数、顺序以及数据和形参的个数、顺序以及数据类型必须相同。类型必须相同。 否则出错。否则出错。参参 数数 出出 错错棉鸥唇嫁钳涩婶赴咒嘛源奋园汲巷坷蝉焦驻俘雷搭剧彭蒲呀腆缓卖靳转诣第6过程
25、的使用第6过程的使用276.4.1 形参和实参形参和实参Public Function Function1(ByVal a As Single, ByVal b As Single) As Single 计算直角斜边函数计算直角斜边函数 Dim c As Single c = Sqr(a 2 + b 2) Function1 = cEnd FunctionPrivate Sub Command1_Click() 计算斜边计算斜边 Dim a1 As Single, b1 As Single a1 = Val(Text1.Text) b1 = Val(Text2.Text) Text3.Text
26、 = Function1(a1, b1)End Sub形式参数形式参数实际参数实际参数痛氮驹宽妆人质艇棱卜捻炮轴闸士萌壁痢舷稍晾睡拎奈第族橙削室掂让颠第6过程的使用第6过程的使用286.4.1 形参和实参形参和实参2形参的数据类型形参的数据类型(1)实参数据类型与形参定义的数)实参数据类型与形参定义的数据类型不一致据类型不一致 对于实参数据类型与形参定义对于实参数据类型与形参定义的数据类型不一致时,的数据类型不一致时,VB会按要求会按要求对实参进行数据类型转换,然后将对实参进行数据类型转换,然后将转换值传递给形参。转换值传递给形参。(2)没有声明形参的数据类型)没有声明形参的数据类型 运行界面
27、运行界面 在创建过程时,如果没有声明形参在创建过程时,如果没有声明形参的数据类型,则默认为的数据类型,则默认为Variant型。型。 谓辨汽拂盼晾趁函上群专瘸圈溪朔谆搪钵天黑谨味龙帆沙枷觅厢损葱法菇第6过程的使用第6过程的使用296.4.1 形参和实参形参和实参3. 使用可选的参数使用可选的参数 VB中被调函数参数列表中的参数也可以是可选的,使中被调函数参数列表中的参数也可以是可选的,使用用Optional 关键字来表示参数可选。关键字来表示参数可选。 Private Function Divisor(Optional ByVal x As Variant, Optional ByVal y
28、As Variant) As Integer求最大公约数子函数求最大公约数子函数 Dim r As Integer If IsMissing(x) Then x = 1 If IsMissing(y) Then y = 1 r = x Mod y Do While r 0 x = y y = r r = x Mod y Loop Divisor = yEnd Function矛慑汲令耿乍寂瓦亦滦孕歇敲狂绥凉颂涂妓猩拖和抒窘刺尚儒魁加跌凶迪第6过程的使用第6过程的使用306.4.1 形参和实参形参和实参 在未提供可选参数时,实际上是将该参数作为在未提供可选参数时,实际上是将该参数作为具有相应数据
29、类型的初始值来赋值,不会出现编译具有相应数据类型的初始值来赋值,不会出现编译错误的提示。错误的提示。 如果传递的参数是如果传递的参数是Variant型,可以在过程体中型,可以在过程体中 通过通过IsMissing函数来测试调用时是否传递可选参函数来测试调用时是否传递可选参数。数。奠蚊赠霉允码议煮庞钵啥扣处久图煞玛央纱厉共梅趾支异普拾流拉柜乾嫩第6过程的使用第6过程的使用316.4.1 形参和实参形参和实参4. 使用可变参数使用可变参数 在传递参数时,如果要求参数的数目可以变化,在传递参数时,如果要求参数的数目可以变化,使之可以接收任意多个参数,则在函数过程或使之可以接收任意多个参数,则在函数过
30、程或Sub过程中一般采用如下语法:过程中一般采用如下语法:Sub (,ParamArray ) 注意注意:ParamArray后面跟后面跟Variant型的数组,型的数组, ParamArray 关键字不能与关键字不能与ByVal、ByRef或或Optional 一起使用。一起使用。青狂扇饺谣紊毫莉皑蔚带墅宠瓣简劝借印窖枢创烧做忘春甄续据叭萧乐逮第6过程的使用第6过程的使用326.4.1 形参和实参形参和实参例如:例如:Private Function divisor(ParamArray n()通用函数求最大公约通用函数求最大公约 Dim r As Integer If UBound(n)
31、= 1 Then x = n(0): y = n(1) ElseIf UBound(n) = 0 Then x = n(0): y = 1 End If r = x Mod y Do While r 0 x = y y = r r = x Mod y Loop divisor = yEnd Function卸涧员咕诞咽童署辰螟通萍进垦终将蜀伶蒸碘品裂健犯闷魏勺渝胜威箱局第6过程的使用第6过程的使用336.4.2 参数按值传递和按地址传递参数按值传递和按地址传递1. 按值传递参数按值传递参数 定义被调过程时形参使用定义被调过程时形参使用ByVal关键字,或调用语句中关键字,或调用语句中的实参是常
32、量或表达式,就是按值传递。的实参是常量或表达式,就是按值传递。ByVal 传值实参参临时单元元形参形参 传值传值就是通过传送实参的值而不是传就是通过传送实参的值而不是传送地址的方法给被调用过程中的形参。系送地址的方法给被调用过程中的形参。系统把需要传送的实参复制到一个临时单元统把需要传送的实参复制到一个临时单元中,然后再把该临时的地址传送给形参。中,然后再把该临时的地址传送给形参。这样,被调用的过程并没有访问实参的地这样,被调用的过程并没有访问实参的地址,因而也就不会改变实参的值。址,因而也就不会改变实参的值。磷诚寥盼括戴华撰挨圣镇角扛昨烷涸窜雌臃裴退芥阉谨吝颐驭仓惯闯鳞屋第6过程的使用第6过
33、程的使用346.4.2 参数按值传递和按地址传递参数按值传递和按地址传递例如,下面都是按值传递:例如,下面都是按值传递:使用使用ByVal关键字定义被调过程形参关键字定义被调过程形参 Private Function Divisor(ByVal x As Integer, ByVal y As Integer) As Integer用常量作为实参用常量作为实参 Result = Divisor(20,50)将变量变成表达式作为实参将变量变成表达式作为实参 把变量转换成表达式的最简单的方法就是把它放在括号内,把变量转换成表达式的最简单的方法就是把它放在括号内,则调用过程的语句为:则调用过程的语句
34、为: Result = Divisor(m), (n)被调过程的定义语句:被调过程的定义语句: Private Function Divisor(x As Integer, y As Integer) As Integer袖误迢源峨鞠搔挚铜闭惜茅帚初动责玉腾菇耪迷达概池称罐穗捂惯浴选雹第6过程的使用第6过程的使用356.4.2 参数按值传递和按地址传递参数按值传递和按地址传递2. 按地址传递参数按地址传递参数 在定义过程时,如果没有在定义过程时,如果没有ByVal 关键字,默认关键字,默认的是按地址传递参数,或者用的是按地址传递参数,或者用 ByRef 关键字指关键字指定按地址传递。定按地址传
35、递。ByRef传址址实参参形参形参 按地址传递参数时,实参和形按地址传递参数时,实参和形参共用一段存储单元,修改了形参共用一段存储单元,修改了形参的值就修改了实参的值。参的值就修改了实参的值。姓羞肿龟狞枷刨蛆鸳莽怎丧圃洞悼韩蒜蘸舍振哩银沃陛嘲宦掂枉蚤橙粒什第6过程的使用第6过程的使用366.4.2 参数按值传递和按地址传递参数按值传递和按地址传递【例【例6-3】(a) 运行结果运行结果ab2x1y2z(b)按地址传递按地址传递拓婉吮狭酣联根菊烽熄肚欢拙胶球雾牺铆削在牛搏选廊淡反铁钥恍伊岩闻第6过程的使用第6过程的使用376.4.2 参数按值传递和按地址传递参数按值传递和按地址传递 按地址传递参
36、数有几点说明:按地址传递参数有几点说明:(1)对于按地址传递的形参,如果)对于按地址传递的形参,如果在过程调用时与之结合的实参是常在过程调用时与之结合的实参是常数或表达式,则数或表达式,则VB会给形参分配一会给形参分配一个临时的内存单元,用按值传递的个临时的内存单元,用按值传递的方法处理。方法处理。(2)当形参和实参数据类型不同)当形参和实参数据类型不同时,按地址传递会提示出错。时,按地址传递会提示出错。(3)按地址传递参数比按值传递参数更节)按地址传递参数比按值传递参数更节省内存空间,程序运行效率更高。省内存空间,程序运行效率更高。编译出错编译出错坛巷示坏帝娠变弧难迭滨注症倔且榔吝刚洗珠舀寡
37、滨页漏憎俞俄戈舆杖少第6过程的使用第6过程的使用386.4.3 数组参数数组参数【例【例6-5】程序代码如下:】程序代码如下:Option Base 1Private Sub Command1_Click()单击计算按钮单击计算按钮 Dim Score1(8) As Single, Score2(8) As Single Dim i As Integer, j As Integer 输入分数输入分数 Score1(1) = 98: Score2(1) = 84 Score1(2) = 82: Score2(2) = 86 Score1(3) = 76: Score2(3) = 79 Score
38、1(4) = 66: Score2(4) = 72 Score1(5) = 88: Score2(5) = 84 Score1(6) = 82: Score2(6) = 76 Score1(7) = 75: Score2(7) = 79 Score1(8) = 60: Score2(8) = 70 Text1.Text = Int(Average(Score1) * 100) / 100 Text2.Text = Int(Average(Score2) * 100) / 100End Sub数组作为参数向过程传递,数数组作为参数向过程传递,数组传递只能是组传递只能是按地址传递按地址传递。阜滥缅
39、菇怕贷侍拽蛋佬刃溺钠浸浇兴淋茧孟随亿居浅剁徐年艾邹瓦要慷锥第6过程的使用第6过程的使用396.4.3 数组参数数组参数子函数子函数Average计算平均成绩,形参计算平均成绩,形参s为数组。为数组。Private Function Average(s() As Single) As Single 求平均成绩子函数求平均成绩子函数 Dim i As Integer Dim Aver As Single, Sum As Single For i = 1 To 8 Sum = Sum + s(i) Next Aver = Sum / 8 Average = AverEnd Function藕淀募喘凰
40、带僵柬郡聊尾匆漆么狐囚追泥鞍茹芜会拎谦鬃钧榴伊顿鬼硝泳第6过程的使用第6过程的使用406.4.4 对象参数对象参数 在在VB中对象也可以作为形参,即对象可以作为参数向过中对象也可以作为形参,即对象可以作为参数向过程传递,对象的传递只能是程传递,对象的传递只能是按地址传递按地址传递。对象作为形参变量。对象作为形参变量的类型声明为的类型声明为Control或控件类型。或控件类型。【例【例67】(a)窗体窗体FormCover的运行界面的运行界面 (b)窗体窗体Form1的运行界面的运行界面(自学)(自学)呸膜恫禽罗绳蝶毒关费膝量邵鳖少拒涩傍爽融贵济摸抨迷译碧孪共恳电绑第6过程的使用第6过程的使用4
41、16.5 递归过程递归过程 过程具有递归调用的功能,过程具有递归调用的功能,递归调用递归调用是指在过程中直是指在过程中直接或间接地调用过程本身。递归调用在完成阶乘运算、级接或间接地调用过程本身。递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效,很多数学模型和算数运算、幂指数运算等方面特别有效,很多数学模型和算法设计本身就是递归的。法设计本身就是递归的。 递归分为两种类型,一种是递归分为两种类型,一种是直接递归直接递归,即在过程中调用,即在过程中调用过程本身;过程本身;一一种是种是间接递归间接递归,即间接地调用一个过程。,即间接地调用一个过程。注意:注意: 递归结构构成了另外一种形如循
42、环的结构。递归结构构成了另外一种形如循环的结构。肌荆址涩自货挺衍补姜驼潜恃诵抬猛由餐梢压藻兴墩伟借麦丽垫莱臼怒厉第6过程的使用第6过程的使用426.5 递归过程递归过程f过程过程调用调用f过程过程过程过程f1调用调用f2过程过程过程过程f2调用调用f1过程过程显然显然: 上述例子会无限递归上述例子会无限递归 (无限执行无限执行)。所以,在。所以,在递归调用时都有条件限制。递归调用时都有条件限制。即即: 条件成立,调用递归,否则结束。条件成立,调用递归,否则结束。吭肄堪间侄畴酚澜朵侗遏塞住税策皿施否粤厅沏瞻个渠筹滇溅次挣逝庐示第6过程的使用第6过程的使用436.5 递归过程递归过程过程的嵌套调用
43、:过程的嵌套调用:r主主程程序序srrrs子子过过程程1rst子子过过程程2rst子子过过程程3瞬懒版击惭喜茨都妒咬惧桔醒礁钧鸳罚鹿罕们鸡陶少霞撅牟魔见验盼坤篇第6过程的使用第6过程的使用446.5 递归过程递归过程【例【例68】计算阶乘】计算阶乘n!可以表示为:可以表示为: 运运 行行 界界 面面桔降路位寻怒奖魁曾邓嗽稠朝鸦沧稀横系顺瞩爵菊狸撰刁栗拷剃叛到老购第6过程的使用第6过程的使用456.5 递归过程递归过程5!的运算过程:的运算过程:? 5!54!43!32!21!1213246524120逐层调用逐层调用逐层返回逐层返回到达终止条件,逐层调用结束到达终止条件,逐层调用结束卿砖怎炳痔
44、图瓣暗踏友骆片萄老绳盎泌瞩肉刻行弗舰咋谓温单神扼科糜军第6过程的使用第6过程的使用466.6 变量的作用范围变量的作用范围6.6.1 过程级、模块级和全局变量过程级、模块级和全局变量6.6.2 静态变量静态变量6.6.3 使用同名的变量使用同名的变量搭敖懊霸璃发萎蔼斡尔荣秉季采杜剃俭玖潘饵析谅太赘泛恕兹枷悉搬甲郡第6过程的使用第6过程的使用476.6.1 过程级、模块级和全局变量过程级、模块级和全局变量1过程级变量过程级变量 过程级变量是在过程中声明的也称为过程级变量是在过程中声明的也称为局部变量局部变量,其作用,其作用范围仅限于本过程,无法在其他过程中访问或改变该变量范围仅限于本过程,无法在
45、其他过程中访问或改变该变量的值。用的值。用dim或或static来声明。来声明。2模块级变量模块级变量 模块级变量是在窗体模块或标准模块顶部模块级变量是在窗体模块或标准模块顶部“通用通用”声明声明段定义的变量,模块级变量对该模块的所有过程都有效,在段定义的变量,模块级变量对该模块的所有过程都有效,在模块中的任何过程都可以访问该变量,但其它模块的过程则模块中的任何过程都可以访问该变量,但其它模块的过程则不能访问该变量。不能访问该变量。 用用dim或或private来声明。来声明。撂星血龋噬铁囊厢坡汤馆瞪知湾件只斗球赣灌随蹄结杰斥循孝挽寄龄襟剔第6过程的使用第6过程的使用486.6.1 过程级、模
46、块级和全局变量过程级、模块级和全局变量【例【例6-10】使用文本框显示变量的范围。】使用文本框显示变量的范围。运行界面运行界面律匣狰茫丹晌丈澈维哨娥庐秒棚囱巾哎忽鹰摊胳伴竟音话斩公泌洲檄哭在第6过程的使用第6过程的使用496.6.1 过程级、模块级和全局变量过程级、模块级和全局变量3. 全局变量全局变量 全局变量的作用范围可以是应用全局变量的作用范围可以是应用程序的所有过程,也称为公用变量。程序的所有过程,也称为公用变量。全局变量可以在模块顶部的全局变量可以在模块顶部的“通用通用”声明段用声明段用Public关键字声明。关键字声明。语法:语法:Public 变量名变量名 As 数据类型数据类型
47、 在代码窗口分别声明在代码窗口分别声明a为全局变为全局变量,量,b为模块级变量,为模块级变量,c为过程级变为过程级变量,其变量的的声明语句如图所示。量,其变量的的声明语句如图所示。声声 明明 变变 量量厩梭线凭坎糕垛撼诫辊啼畜岂菩镣时徘熬廓乱堂呻冠僵享狙轿杰琼践处阴第6过程的使用第6过程的使用506.6.1 过程级、模块级和全局变量过程级、模块级和全局变量【例【例6-11】(a)Form1运行界面运行界面 (b)Form2运行界面运行界面 注意注意:常数、固定长度字符串、数组、自定义类型与:常数、固定长度字符串、数组、自定义类型与 Declare 语句不能是窗体对象模块中的语句不能是窗体对象模
48、块中的 Public 成员。成员。膜惰所隙笺妨场墅耐誊串靴趁特幸擂匿翰磷筐爆港积咆独鳞蕉夏斧丝共陵第6过程的使用第6过程的使用516.6.2 静态变量静态变量 局部变量可以分为动态变量和局部变量可以分为动态变量和静态变量。静态变量。动态变量动态变量:在本过程执行期间分:在本过程执行期间分配内存的变量,当一个过程执行配内存的变量,当一个过程执行完毕,变量所占的内存被释放,完毕,变量所占的内存被释放,变量的值就不存在了。变量的值就不存在了。用用Dim来声来声明明静态变量静态变量:在过程结束后仍保留值的变量,即其占用的内存:在过程结束后仍保留值的变量,即其占用的内存单元未释放。当以后再次进入该过程时
49、,变量原来的值可以单元未释放。当以后再次进入该过程时,变量原来的值可以继续使用。继续使用。 用用static来声明。来声明。运行结果运行结果灰衙吞镍丑叁沾惟熏撂措己挣拙鸳蕊巳介蛋意行盘汝窿咀锚嘻讼刚溜贸啊第6过程的使用第6过程的使用526.6.2 静态变量静态变量程序代码如下:程序代码如下:Private Function Sum(n As Integer)计算求和子函数计算求和子函数 Static f As Integer f = f + n Sum = fEnd FunctionPrivate Sub Form_Click()单击窗体单击窗体 Dim i As Integer For i
50、= 1 To 5 Print & i & = & Sum(i) Next iEnd Sub 【例【例6-13】使用函数调用的方法计算】使用函数调用的方法计算n,在函数中使用静态,在函数中使用静态变量。变量。 运运 行行 结结 果果洪佳引者哄寿厚石漫拙切冲宛曝廷观糜否明疵深眩缉沽曰课糕犁俗希谅展第6过程的使用第6过程的使用536.6.3 使用同名的变量使用同名的变量1. 不同模块中的全局变量同名不同模块中的全局变量同名 如果不同模块中的全局变量使用同一名字,则通过引用如果不同模块中的全局变量使用同一名字,则通过引用“模块名模块名.变量名变量名”来引用变量。来引用变量。2. 全局变量与局部变量同名
51、全局变量与局部变量同名 当全局变量与局部变量同名时,全局变量和局部变量在不当全局变量与局部变量同名时,全局变量和局部变量在不同的范围内有效。在过程内部局部变量有效;而在过程外全同的范围内有效。在过程内部局部变量有效;而在过程外全局变量有效。局变量有效。模翠熟擞亿髓衰垒鹊颂涉狸词鄂旦蘸幼呕忠双邱融斑耻懂恋送设攘鹊申块第6过程的使用第6过程的使用546.6.3 使用同名的变量使用同名的变量3. 窗体的属性、控件名与变量同名窗体的属性、控件名与变量同名 窗体的属性、控件、符号常数和过程都被视为窗体窗体的属性、控件、符号常数和过程都被视为窗体模块中的模块级变量。模块中的模块级变量。 在窗体模块内和窗体
52、中控件同名的局部变量将遮住在窗体模块内和窗体中控件同名的局部变量将遮住同名控件。因此必须引用窗体名称或同名控件。因此必须引用窗体名称或 Me 关键字来限定控关键字来限定控件,才能设置或得到该控件的属性值。件,才能设置或得到该控件的属性值。 填卖繁夸老棵厌畏辙霹篇趋戚辗褐沃优苍消太隙戌态位釉峰待糙乖接巩吗第6过程的使用第6过程的使用556.7 过程的作用范围过程的作用范围6.7.1 调用其他模块的过程调用其他模块的过程6.7.2 静态过程静态过程6.7.3 Sub Main过程过程添盟鹊聋稚独伙飞疫惧茎卖剿几砂虞吸滨煽蔬炊厢唁记仅收襄锣矩窗圆疥第6过程的使用第6过程的使用566.7.1 调用其他
53、模块的过程调用其他模块的过程1. 局部过程和全局过程局部过程和全局过程 过程的作业范围是通过定义语句来声明的。语法:过程的作业范围是通过定义语句来声明的。语法:Private | Public Static Sub 过程名过程名(参数列表参数列表)Private | Public Static Function 函数名函数名(参数列表参数列表) As 数据类型数据类型嗜要默栓抛谊惦鲜居威叔热臻售蕴庙嘛肇悬触侣霜瑞深瓢雪睬殆惺惰娄鼎第6过程的使用第6过程的使用576.7.1 调用其他模块的过程调用其他模块的过程2. 调用其他模块的过程调用其他模块的过程(1)调用其他窗体模块中的过程)调用其他窗体
54、模块中的过程 调用其他窗体中的全局过程,必须以窗体名为调用的前调用其他窗体中的全局过程,必须以窗体名为调用的前缀,即缀,即“窗体名窗体名.过程名过程名”。 (2)调用其他标准模块中的过程)调用其他标准模块中的过程 调用其他标准模块中的过程,如果过程名是唯一的则调用其他标准模块中的过程,如果过程名是唯一的则不必在调用时加模块名。不必在调用时加模块名。 (3)调用其他类模块的过程)调用其他类模块的过程 调用类模块中的全局过程,要求用指向该类的某一实调用类模块中的全局过程,要求用指向该类的某一实例作前缀。例作前缀。 判凭屑显搬僧宏槽吊藻每谣昧钮赶析誉悼盯去船譬蠢雷盼雹悔坏裳刑捂窖第6过程的使用第6过
55、程的使用586.7.2 静态过程静态过程 在过程定义中也可以添加在过程定义中也可以添加“Static”关键字来声明过程,关键字来声明过程,或选择或选择“工具工具”菜单菜单“添加过程添加过程”菜单项,在出现的对话框菜单项,在出现的对话框中选择中选择“所有本地变量为静态变量所有本地变量为静态变量”,如图所示。,如图所示。长交也善拎啪毙歇碉茬扰违汀温新瞧粉爸牧帜乃誓屿泳搔邵扒龄换起阑迁第6过程的使用第6过程的使用596.7.2 静态过程静态过程 在过程名前加上在过程名前加上StaticStatic关键字,表明该过程中的变量关键字,表明该过程中的变量(无论它们是怎么声明的)都是静态变量。(无论它们是怎
56、么声明的)都是静态变量。Private Private StaticStatic Sub Test() Sub Test() 测试静态变量子过程测试静态变量子过程 Dim Dim x x As Integer As Integer Static Static y y As Integer As Integer x = x + 1 x = x + 1 y = y + 1 y = y + 1 Print x= & x, Print x= & x, Print y= & y Print y= & yEnd SubEnd Sub珍购慑卢获饶舞瞻拯匿洛然眺溯樊寄悉杜抄枕镑淌蚌卖妻年冠泊雏棋憋辕第6过程的
57、使用第6过程的使用606.7.3 Sub Main过程过程 Sub Main过程称为过程称为启动过程启动过程,当,当应用程序启动时不希望加载任何窗体,应用程序启动时不希望加载任何窗体,或者在装载窗体前对一些条件进行初或者在装载窗体前对一些条件进行初始化,可以通过在标准模块中创建一始化,可以通过在标准模块中创建一个个Sub Main 的子过程,运行工程时的子过程,运行工程时先运行先运行Sub Main 子过程。子过程。 设置设置 Sub Main 过程为启动对象过程为启动对象的方法是选择的方法是选择“工程工程”菜单菜单“工程工程属性属性”菜单项,在菜单项,在“工程属性工程属性”属性属性页中的页中
58、的“通用通用”选项卡中选项卡中“启动对象启动对象”框选定框选定“Sub Main”,如图所示。,如图所示。设置启动对象设置启动对象抄慈梅顷裔拱膛而此丸帖筷芳环犀址邑绘宋信灭慰坊尊窜望祁浆土勾樟租第6过程的使用第6过程的使用616.8 Shell函数函数 VB不但可以调用各种过程,而且可以调用各种可执行文不但可以调用各种过程,而且可以调用各种可执行文件。件。Shell函数用来调用一个可执行文件,所有在函数用来调用一个可执行文件,所有在Windows环境下可以运行的可执行文件都可以在环境下可以运行的可执行文件都可以在VB中被调用。中被调用。语法:语法:Shell(命令字符串,(命令字符串,窗口类型
59、窗口类型)常量常量值描述描述vbHide0窗口被窗口被隐藏,且焦点会移到藏,且焦点会移到隐式窗口。式窗口。VbNormalFocus1窗口具有焦点,且会窗口具有焦点,且会还原到它原来的大小和位置。原到它原来的大小和位置。VbMinimizedFocus2窗口会以一个具有焦点的窗口会以一个具有焦点的图标来来显示。示。VbMaximizedFocus3窗口是一个具有焦点的最大化窗口。窗口是一个具有焦点的最大化窗口。VbNormalNoFocus4窗口会被窗口会被还原到最近使用的大小和位置,而当前活原到最近使用的大小和位置,而当前活动的窗的窗口仍然保持活口仍然保持活动。VbMinimizedNoFo
60、cus6窗口会以一个窗口会以一个图标来来显示。而当前活示。而当前活动的的窗口仍然保持的的窗口仍然保持活活动。 窗口类型设置表窗口类型设置表(自学)(自学)烃滑橙很衫惑辅撒黄窗傀甩汞袄冠颅遥潜最厢精嫉磐赞涂杂割藉挤御厉浚第6过程的使用第6过程的使用626.9 程序举例程序举例【例【例614】输入一个十进制数,将其转换成二进制、八进】输入一个十进制数,将其转换成二进制、八进制或十六进制数。制或十六进制数。 运行界面运行界面界面设计:用组合框界面设计:用组合框Combo1输入输入“转换进制转换进制”,用文本框,用文本框Text1输入要转换的十进制数,输入要转换的十进制数,单击单击“计算计算”按钮按钮
61、Command1计算进制转换,计算进制转换,并将结果显示在文本框并将结果显示在文本框Text2中。运行的界面如图所示。中。运行的界面如图所示。(自学)(自学)盈北蒙匀壬匣侍拈孤趋索裕蓑溢醉凰碳侥羚毒老贞宝柴酞苔继禁哈泌瓢羚第6过程的使用第6过程的使用636.9 程序举例程序举例 【例【例615】使用选择法将学生成绩按从高到低排序,并显使用选择法将学生成绩按从高到低排序,并显示出学生姓名和成绩。示出学生姓名和成绩。 选择法排序选择法排序第一轮两两比较找第一轮两两比较找出最大的数,记录下最大元素的位出最大的数,记录下最大元素的位置置Max,然后与第一个元素,然后与第一个元素a0对对换;第二轮将从换
62、;第二轮将从a1开始的数中找开始的数中找出最大的数与出最大的数与a1对换;对换;每比每比较一轮找出未经排序的数中最大的较一轮找出未经排序的数中最大的一个进行对换;将数组中的元素一一个进行对换;将数组中的元素一轮一轮地进行比较,直到剩下最后轮一轮地进行比较,直到剩下最后一个元素为止。一个元素为止。运运 行行 界界 面面独颇淡轿坊某赚鬃小濒兜倒置邓赫头脖赦泥妥蔚婴之转绑险涤腮讣黎罪观第6过程的使用第6过程的使用64小小 结结1.Sub过程和函数的编写;过程和函数的编写;2.使用保留字使用保留字Call和不使用和不使用Call对过程调用的区别;对过程调用的区别;3.虚实结合的两种方式:按值传送和按址
63、传送;虚实结合的两种方式:按值传送和按址传送;4.正确理解数组参数、可选参数、可变参数、对象形式参数正确理解数组参数、可选参数、可变参数、对象形式参数和和Shell()() 函数的功能;函数的功能;5.正确理解变量和过程的作用范围。正确理解变量和过程的作用范围。潍遁渣蹬交揉瘪手垣耙僻枢乌字耪擞拿嘲徊讣琢啤来座灶压狂丰料咏仔议第6过程的使用第6过程的使用65作作 业业 11. 编写输入一个编写输入一个06数字,输出星期的数字,输出星期的Function过程。过程。2. 编制判断奇偶数编制判断奇偶数Function过程。输入一个整数,过程。输入一个整数,判断其奇偶性。判断其奇偶性。品清戎察扁逃安混
64、码苍妊当柞画拼尾子予煎弧卿陀匝扶髓汗文牛慈无葫癸第6过程的使用第6过程的使用66作作 业业 21. 有有5个人坐在一起,问第个人坐在一起,问第5个人多少岁?他说比个人多少岁?他说比第第4个人大个人大2岁。问第岁。问第4个人岁数,他说比第个人岁数,他说比第3个人个人大大2岁,问第岁,问第3人,又说比第人,又说比第2个人大个人大2岁,问第岁,问第2人,人,说比第说比第1人大人大2岁。问第岁。问第1人,他说是人,他说是10岁。求第岁。求第5个人多少岁?个人多少岁?2. 编制编制Sub过程,删除数组中指定位置的元素。过程,删除数组中指定位置的元素。昭攀佳面魔嘱县核文马招鳞瘪术周蛙闽绕昼券灰歪儡盒督吁萌由厨朗易昔第6过程的使用第6过程的使用67