【VB开源代码栏目提醒】:网学会员为广大网友收集整理了,VB8 过程 - 讲义教程,希望对大家有所帮助!
中国药科大学计算机教研室第八章过程第八章过程武小川xiaochuan_wu163.com中国药科大学计算机教研室2掌握函数和过程的使用掌握参数的传递——按值传递和按地址传递掌握变量的作用域局部变量和全局变量掌握递归算法会创建多窗体应用程序中国药科大学计算机教研室38.1 Sub过程8.2 Function过程8.3 过程调用8.4 参数传递8.5 递归过程8.6 变量的作用域8.7 程序示例8.8 多窗体程序设计中国药科大学计算机教研室4基本思想将一个大的程序按功能分割成一些小模块特点各模块相对独立、功能单一、结构清晰、接口简单控制了程序
设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下逐步分解分而治之中国药科大学计算机教研室5子程序过程事件过程通用过程公有过程Public私有过程Private窗体事件过程控件事件过程过程函数过程属性过程中国药科大学计算机教研室6当对象识别某事件后进行的操作处理——以
代码的形式存储在事件过程中。
分类窗体事件过程控件事件过程8.1.1 事件过程中国药科大学计算机教研室71 定义事件过程1 定义事件过程形式PrivateSubForm_事件名参数列表局部变量和常数声明语句块EndSub完全由系统决定用户无权修改窗体的事件过程名中不使用其具体名称而固定用Form窗体事件固定有“Private‖关键字说明它是模块级的中国药科大学计算机教研室82 窗体的Initialize、Load、Activate、Gotfocus事件2 窗体的Initialize、Load、Activate、Gotfocus事件Initialize初始化事件——配置窗体时触发Load加载事件——窗体装入内存时触发Activate激活事件——窗体被激活时触发Gotfocus事件得到焦点事件——窗体成为当前焦点时触发窗体上无可视控件时触发窗体的Gotfocus事件窗体上有可视控件时触发控件的Gotfocus事件执行次序InitializeLoadActivateGotfocus中国药科大学计算机教研室9注意注意窗体的Initialize、Load事件发生在窗体被显示之前其中可放臵系统初始化命令但其中语句有所限制窗体加载后只要不被卸载就不会再执行Initialize、Load事件但Activate事件会多次发生当访问另一窗体上的“非可视”数据或调用其中定义的全局过程时只会触发该窗体的Initialize事件而Load事件不触发当访问另一窗体上的“可视”数据时会同时触发该窗体的Initialize和Load事件。
中国药科大学计算机教研室103 定义控件的事件过程3 定义控件的事件过程一般形式PrivateSub控件名_事件名参数列表局部变量和常数声明语句块EndSub由系统决定用户无权修改控件的事件过程名中必须使用其具体名称控件事件固定有“Private‖关键字说明它是模块级的中国药科大学计算机教研室114 建立事件过程4 建立事件过程打开“
代码编辑器”窗口先选定某对象再选定事件过程编辑
代码对象过程cnmmn-mnPrivate Sub Command1_Clickn ValText1.Textm ValText2.Textk nt 1For i 1 To kt t iNext is tk mt 1For i 1 To kt t iNext is s / tk n -mt 1For i 1 To kt t iNext is s / tText3.Text StrsEnd Sub共同
代码计算k能不能简化中国药科大学计算机教研室13函数定义计算kPrivate Sub Command1_ClickDim m As Integer n As IntegerDim i As Integer k As IntegerDim t As Long s As Longn ValText1.Textm ValText2.Texts factn / factm factn -mText3.Text StrsEnd SubPrivate Function factk As Integer As LongDim i As Integerfact 1For i 1 To kfact fact iNext iEnd Function函数调用三次中国药科大学计算机教研室14在以下两种情况下经常使用自定义过程1应用程序中出现较频繁的处理仅仅是每次处理的数据不同而已2程序中比较复杂的算法独立出来增强程序的可读性“过程”的引入使得整个程序的结构更加清晰模块化更强。
过程的引入中国药科大学计算机教研室15完成某一特定功能的程序段——通用过程自定义必须显式调用方可执行分为公有过程Public私有过程Private中国药科大学计算机教研室161 通用Sub过程的定义1 通用Sub过程的定义一般形式PrivatePublicstaticSubEndSub说明1 以Sub开头End Sub结束中间是过程体——包括变量声明和语句块2 以Private为前缀的过程是模块级的以Public为前缀的过程是应用程序级的缺省默认是Public3 Static 选项说明过程中的局部变量是静态变量4 过程名的命名规则和变量名相同在同一个模块中过程名必须是唯一的中国药科大学计算机教研室175 参数
列表中的参数称为形式参数可以没有但无参数时圆括号不能省略有多个参数时参数之间用逗号间隔6 参数说明格式OptionalByValByRef As a 若参数是数组则在变量名后面加一对圆括号但无维界定义b ByVal指明参数传递方式是传值c ByRef指明参数传递方式是传地址为缺省值d 若参数是字符型的必须是不定长字符串e Optional参数是可选的必须定义在必选参数后面。
7当过程调用结束即执行到End Sub语句系统自动返回调用程序的调用语句处执行调用语句的下一条语句8过程不能嵌套定义但可嵌套调用9 Exit Sub语句的功能是提前退出过程调用返回调用语句。
说明续中国药科大学计算机教研室18例: Private Sub Exchangex As Integery As IntegerDim Temp As IntegerTempx : xy : yTempEnd Sub该通用过程实现交换功能包含两个参数均是ByRef形式的参数。
中国药科大学计算机教研室192 建立通用Sub过程方法一在“
代码编辑窗口”的“通用”中自行输入方法二进入
代码编辑器窗口执行“工具”菜单的“添加过程”在“添加过程”对话框中输入定义过程的名称、类型和范围后单击“确定”按钮系统会自动在
代码窗口添加自定义过程的框架。
中国药科大学计算机教研室20Function过程的特点是返回一个值因此我们通常也称之为自定义函数。
通常我们利用Function过程得到一个数值或一个字符串或一个逻辑值。
格式PrivatePublic Function 参数列表 As End Function函数名表达式函数返回值的类型中国药科大学计算机教研室211以Function开头以End Function结束中间是函数体2函数名命名规则、参数列表的表示都和Sub过程相同3As 数据类型函数过程将由函数名返回一个值值的类型由As 数据类型定义★4函数体中一定要有对函数名赋值的语句——函数名表达式否则返回相应类型的初值★见例8-15函数体内可有Exit Function语句——无条件退出函数过程返回主
程序。
6Function过程不能嵌套定义但可嵌套调用。
说明中国药科大学计算机教研室22Private Function fByval x As Integer As Integerf 3x3-2x26x-1End Function162323xxxxf例定义函数函数返回值的类型函数名表达式中国药科大学计算机教研室23例8-1编写一个求n的函数。
Private Function FactByval n As Integer As LongDim K As IntegerFact1If n0 Or n1 ThenExit FunctionElseFor K1 To NFactFactKNext KEnd IfEnd Function函数名表达式函数类型传值的参数中国药科大学计算机教研室248.3.1 事件过程的调用事件过程由一个发生在
VB中的事件来自动调用或由同一个模块中的其他过程显式调用。
例见P163总之事件过程可以由发生的事件自动激活以响应系统或用户的活动也可以被其他过程调用而激活。
中国药科大学计算机教研室258.3.2 Sub过程调用必须在事件过程或其它通用过程中显示调用。
Private Sub sub1……Call Sub2实参表……End SubPrivate Sub sub2形参表……过程语句……End Sub①②③④⑤主调程序被调过程注意一个过程或函数可以被调用多次中国药科大学
计算机教研室26格式一Call 格式二 功能对已定义的过程进行调用。
如P165中国药科大学计算机教研室271调用的过程必须是已经定义的否则
系统会出现“子程序或函数未定义”的信息提示2实在参数可以是常量、变量或表达式3实在参数的数目及类型要和定义时必选参数保持一致否则系统会出现“参数不可选”的信息提示参数之间用逗号间隔4若子程序没有参数则格式一中的括号可以省略5格式一和格式二的区别在于格式二的参数表无须括号而是和过程名之间用空格隔开说明中国药科大学计算机教研室28例8-2 试编写一个找出任意一个正整数的因子的程序P165中国药科大学计算机教研室29定义子程序factor求因子该子程序定义了两个参数来传递求因子实现前的原始数据和返回功能实现后的结果数据Option ExplicitPrivate Sub Command1_ClickDim inta As Integer st As Stringinta Text1Call factorinta stText2 stEnd Sub调用过程factorPrivate Sub factorByVal n As Integer s As StringDim i As IntegerFor i 1 To n -1If n Mod i 0 Then s s StriNext iEnd Sub定义过程程序说明优点程序即Sub过程的使用不仅可以缩短程序的长度还能够使程序的结构更加清楚。
中国药科大学计算机教研室30Private Sub valuea As Integer min As IntegerDim i As Integer min a1For i 2 To UBoundaIf ai min Then min aiNext iEnd Sub 例:定义一个通用过程用以求一维数组中的最小值中国药科大学计算机教研室318.3.3 调用Function 过程格式实参表功能返回一个函数值。
说明1一般情况下函数的调用出现在赋值语句中并且在赋值号的右侧2若函数没有参数函数名后的括号不能省略3虽然
VB允许象调用Sub过程那样调用Function过程但这样调用时系统不返回函数值建议大家不要使用这种调用方法。
Call factx Fact x这两种方法均放弃函数的返回值例如中国药科大学计算机教研室32Private Function min a As Integer As IntegerDim i As Integer min a1For i 2 To UBoundaIf ai min Then min aiNext iEnd Sub例:用函数实现求一维数组中的最小值对比前例Sub函数名表达式函数类型中国药科大学计算机教研室33Private Function PrimeN As Integer As BooleanDim i As IntegerPrime False For i 2 To N-1If N Mod i 0 Then Exit ForNext i If i N then Prime TrueEnd Function 例:定义函数用以判断一个数是否是素数函数名表达式可省略因Prime的初始值就是false中国药科大学计算机教研室34例S12…10Private Sub Form_ClickDim S As Long i As IntegerFor i 1 To 10Next iPrint ‖S SEnd SubPrivate Function Factn As Integer As LongDim i As IntegerFact 1For i 1 To nFact Fact iNext iEnd Function函数名表达式函数调用: S S Facti对比p171中国药科大学计算机教研室35例8-3利用函数过程编写一个求两个正整数的最大公约数的程序Private Function GcdByVal A As Integer ByValB As Integer As IntegerDim R As IntegerR A Mod BDo While R 0A BB RR A Mod BLoopGcd BEnd Function使用赋值语句调用函数P166Private Sub Form_Click ?? 主调过程Dim N As Integer M As Integer G As IntegerN InputBox输入NM InputBox输入MG GcdN MPrint N 和 M 的最大公约数是 GEnd Sub中国药科大学计算机教研室368.3.4 调用其他模块中的过程1、调用其他窗体模块中的公有过程格式Call .功能调用其他窗体模块中定义的公有过程。
Private Sub Form_ClickDim a As Integera 10Print Form1.FactaEnd Sub在Form2中调用中国药科大学计算机教研室372、调用标准模块中的公有过程格式Call .功能调用其他标准模块中定义的公有过程。
说明a 若公有过程唯一则直接调用不加模块名。
b 若存在同名的公有过程则调用本模块中过程直接调用不加模块名调用其它模块中过程必须加模块名。
c 被调用的函数和过程必须是公有的d 函数也可以这样调用。
中国药科大学计算机教研室383. 调用类模块中的过程格式dim democlass as new class1call democlass.clssub 实参表 注意调用类模块中的共有过程须用该类的某一实例修饰过程。
不做要求中国药科大学计算机教研室398.4.1形参和实参形参过程定义时在过程名后面的圆括号里的一系列变量过程被调用执行时系统才给形参分配存储空间可以是除定长字符串外的任一简单变量可以是数组变量名后接括号St As String 3 ×St As String 3 √St As String √中国药科大学计算机教研室40实参主调程序中调用语句中出现在过程名后面圆括号里的变量是实参可以是常量、变量或表达式过程调用传递参数时实参按“位臵”和形参结合实参和形参要求个数一样位臵对应类型一致否则会出错定长字符串变量可以作为实参中国药科大学计算机教研室41形参实参变量变量、常量、表达式、数组元素数组数组参数结合P168中国药科大学计算机教研室42Private Sub Form_ClickDim x as single st as sting5 Dim a5 as integerCall test x2 true a st End subPrivate sub testa as singleloc as booleaanarray1 as integerchr1 as string…End sub举例表达式常量数组定长字符串中国药科大学计算机教研室43Private Sub Form-clickDim x as integer y as integerx10:y100Call ExamSub y x Print ―x‖ x ―y‖ yEnd SubPrivate Sub ExamSub x as integery as integerxx10 : yy-10End Sub过程的先后顺序无所谓调用子过程时进行的实际操作是yy10xx-10举例写出下列程序执行的结果中国药科大学计算机教研室448.4.2 按值传递参数格式ByVal 传递方式调用时系统为形参分配一个临时存储单元并将实参的值存储到该临时单元中。
若在被调用的过程体中改变了形参的值只是改变了临时存储单元中的数据对实参的值无任何影响。
中国药科大学计算机教研室45Private Sub Form_ClickDim M As Integer N As IntegerM 15: N 20Call Value_changeM NPrint M M N NEnd SubPrivate Sub Value_changeByVal x As Integer ByVal y As Integerx x 20y y 20Print X x Y yEnd Sub参数传值传递举例中国药科大学计算机教研室46传值是单向的实在参数形式参数调用时实参将值传递给形参两者就无任何关联。
过程中形参的值发生变化对实参无任何影响。
中国药科大学计算机教研室478.4.3 按地址传递参数格式ByRef 传递方式系统在调用执行过程时为形参分配临时存储单元并将实参的内存单元地址传送给形参存储在临时存储单元中在被调用的过程体中一切对形参的操作都是直接对地址保存在形参中的内存单元中的数据进行的而实参就是保存在此内存单元中的数据所以任何对形参的操作也就是对实参的操作按地址传递时形式参数和实在参数共用同一“内存单元”。
中国药科大学计算机教研室48Private Sub Form_ClickDim M As Integer N As IntegerM 15: N 20Call ValueM NPrint M M N NEnd SubPrivate Sub Valuex As Integer y As Integerx x 20y y 20Print X x Y yEnd Sub参数传址传递举例:对比前例中国药科大学计算机教研室49传地址是双向的实在参数形式参数中国药科大学计算机教研室50Private Sub Form_ClickDim Sum As Integer I As IntegerFor I 5 To 1 Step -1Sum Sum FactINext IPrint Sum SumEnd SubPrivate Function Factn As Integer As IntegerFact 1Do While n 0Fact Fact nn n -1LoopEnd Function举例计算54321修改方法一在形参n前加ByVal方法二将调用语句中facti改为fact i P171