《【教学课件】第八章子过程和函数.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第八章子过程和函数.ppt(34页珍藏版)》请在三一办公上搜索。
1、第八章 子过程和函数,子程序和函数如何编写和使用子程序和函数的作用域VB内部函数介绍,VB模块,模块的两层含义:l工程中的资源:一个应用程序就是一个工程,窗体模块(.frm)、类模块(.cls)、标准模块(.bas)。这是一种高层次的模块划分,它们以独立的文件方式管理。l子程序和函数:一个窗体模块或标准模块也是由一些功能单元组成的,这就是子程序和函数,统称为过程(Procedure)。相对来说这是一种较低层次的模块划分。VB中提供的一些函数(比如上一章的UBound)以及事件过程就是这层含义。,VB文件的内容,每一类型的文件都可以包含过程和通用声明:过程:可以是子过程、函数过程或事件过程。每一
2、种过程都由代码组成。声明:在模块级通用声明部分放置常量、变量、动态链接库等的声明。,窗体模块文件*.frm,工程中的每个窗体都有一个与之相应的窗体模块文件窗体文件中包含:窗体本身及窗体上放置的所有控件的属性设置窗体级变量、常量、类型声明和外部过程 的声明所有相关的事件过程及窗体级通用过程说明:同一窗体模块内的通用过程与事件过程可以相互调用若窗体模块内的通用过程被声明为公有的,可以被其它窗体模块或标准模块中的过程调用。调用方法为:窗体名.过程名,如From1.Test。,标准模块文件*.bas,标准模块中的代码可以被工程中的所有模块,包括窗体模块、其它标准模块,所共享。标准模块中包含:通用过程没
3、有事件过程公共或模块级的变量、常量、外部过程和全局过程的声明说明:标准模块存放于独立的文件中,其扩展名为.bas。标准模块中通用过程缺省为公有(Public),即工程中的任一模块均可共享、调用。,类模块文件*.cls,类模块包含用来创建对象的类定义包含类的属性和方法的定义,子过程和函数,VB中的过程:事件过程(Private Sub 对象名_事件名)Sub过程,又称通用过程,或子过程Function过程,称函数,通用过程,一、定义和调用通用过程定义 Private|Public Static Sub 过程名(参数列表).End Sub 参数列表:ByVal 参数名 As 类型,调用Call C
4、hangeColor(3)ChangeColor 2,事件过程,二、定义和调用事件过程事件过程是VB事件驱动编程的重要机制。当VB中的某对象的某个事件被触发时,便自动调用对象的事件过程进行处理。定义事件过程使用的是固定格式,不需要人工书写:Private Sub 对象名_事件名(参数列表)事件响应代码End Sub事件过程除了由系统自动来调用之外,也可以将它看作一个普通的子程序在程序中用代码来调用,调用语法没有特殊之处。如:Call cmdAdd_Click,函数,三、定义和调用函数定义 Private|Public Static Function 过程名(参数列表).End Function
5、过程的区别:函数有数据类型,即返回值的类型,缺省为Variant给函数名本身赋值,即为返回值如果象调用过程一样调用函数,则放弃返回值,退出子过程和函数,End Sub:退出子过程End Function:退出函数可以在子过程体内或函数体内任何位置使用上述语句,用来结束子过程或函数,子过程和函数的参数,VB默认的参数是按地址传递(ByRef),意味着如果过程内的参数值改变了,则调用过程时使用的变量其值也随之改变Sub Main()Dim x As Integerx=1 Call Test(x)x的值改变了End SubPrivate Sub Test(num As Integer)num=num
6、+1End Sub按值传递,则用ByVal关键字,如:,数组作为参数示例,【例】编写子程序,实现在所有学生名单数组中查找给定的名字,输出查找结果。Sub Find(one As String,all()As String)Dim i As Integer,max As Integermax=Ubound(all)取数组上界For i=LBound(all)To max If Trim(one)=Trim(all(i)Then 去两端空格 MsgBox 找到啦 Exit Sub 完成查找 End IfNextMsgBox 没有找到End Sub,函数的返回值,退出函数之前必须完成返回值的确定,对
7、函数名自身赋一个值,该值就是函数的返回值。函数赋值语句可以出现函数的任意位置,该语句并不代表退出函数。如果没有给定返回值,函数会根据返回值的数据类型自动返回一个缺省值,如数值函数会返回0,字符串函数返回一个零长度字符串(“”)。,函数示例1,【例】编写函数可以实现温度值从华氏转换为摄氏和从摄氏转换为华氏。Function change(source As Integer,isCtoF As Boolean)As Integer If isCtoF Then change=(source*9/5)+32 Else change=(source-32)*5/9 End IfEnd Function
8、 按下【摄氏-华氏】按钮 Private Sub Command1_Click()lblResult.Caption=华氏温度=&change(CInt(text1.Text),True)End Sub 按下【华氏-摄氏】按钮Private Sub Command2_Click()lblResult.Caption=摄氏温度=&change(CInt(text1.Text),False)End Sub,函数示例2,【例】写一个函数,用来确定某年是否是闰年。Function isLeapYear(y As Integer)As Boolean If y Mod 40 or(y Mod 100=0
9、 and y Mod 4000)Then isLeapYear=False Else isLeapYear=True End IfEnd Function按下按钮Private Sub Command1_Click()Dim year As Integer year=CInt(text1)If isLeapYear(year)Then lblResult=year&年是闰年 Else lblResult=year&年不是闰年 End IfEnd Sub,子过程和函数的作用域,过程定义时使用Private和Public关键字限定过程的作用域。Private:表示该过程是私有的、局部的。只有与该过
10、程处于同一模块文件中的其它过程才可以访问,之外的模块不能使用。Public:表示该过程是公有的、全局的。工程中的所有模块都可以使用它。如果不指定作用域,过程会缺省为Public。编写程序时,一般将一个工程公用的过程集中存放到标准模块文件(.bas)中,并使用Public关键字。,使用可选参数,可选的参数在调用函数时可以不填写,函数能照常可以工作。Sub Test(num As Integer,Optional Temp As Boolean)如果不指定,则布尔型参数的默认值为False,字符串型参数的默认值为“”,数值型参数默认值为0 可以在参数列表中指定缺省值,如:Optional Temp
11、 As Boolean=True 可以用IsMissing函数,判断是否提供了参数,前提是该参数类型为Variant,【例】修改查找姓名的子程序,增加查找起始位置和查找方向。,可选参数示例,可以编写两个查找的子过程,但因为都是查找,模块化设计中通常只定义一个子过程,通过不同的参数来区分修改查找子过程,参数start指定查找起始位置,参数direction为True表示向后正向查找,反之向前查找:Sub Find(one As String,all()As String,Optional start As Integer=0,Optional direction As Boolean=True)
12、,Dim stuNames()As String 按下【正向查找】按钮Private Sub Command1_Click()If txtPos=then Call Find(txtName,stuNames)从第1个元素向后查Else Call Find(txtName,stuNames,CInt(txtPos)从指定元素向后查End IfEnd Sub 按下【反向查找】按钮Private Sub Command2_Click()If txtPos=then Call Find(txtName,stuNames,False)从第1个元素向前查Else Call Find(txtName,st
13、uNames,CInt(txtPos),False)从指定元素向前查End IfEnd Sub,可选参数示例,子过程定义如下:Sub Find(one As String,all()As String,Optional start As Integer=0,Optional direction As Boolean=True)Dim i As Integer,min As Integer,max As Integer min=LBound(all)max=Ubound(all)If start max or start min Then MsgBox 指定的起始位置超出范围!Exit Sub
14、End IfIf direction then 向后查 For i=start To max If one=all(i)Then MsgBox 找到啦 Exit Sub End If Next,Else 向前查 For i=start To min Step-1 If one=all(i)Then MsgBox 找到啦 Exit Sub End If NextEnd IfMsgBox 没有找到End Sub,可选参数示例,使用不定数量的参数,使用ParamArray关键字Sub Test(ParamArray Temp()用动态数组方式指定只能用于参数列表中的最后一个参数只能指定为Varian
15、t类型不能与ByVal,ByRef,Optional关键字一起使用,【例】编写计算任意个数字总和的 Sum 函数Private Sub cmdSum()Print Sum(1,3,5,7,9)计算5个数的总和 Print Sum(32,128,256)计算3个数的总和End SubFunction Sum(ParamArray intNums()As IntegerDim x,Result As Integer For Each x In intNums Result=Result+x Next x Sum=ResultEnd Function,不定数量参数的示例,数值处理,函数:Abs:取绝
16、对值Sgn:判正负数(返回值分别为-1,0,1)Sqr:取平方根Round:四舍五入取整Val:将串转换为十进制数,如Val(“&H123”)Hex/Oct:转换为八/十六进制数Rnd:生成一个小于1的随机小数,数值格式化处理,格式化:Format语句结果Format(1234.567,”#,#0.00”)1,234.57Format(0.234,”#.#%”)23.4%Format(12345.67,”#.#E+”)1.235E+4Format(12345.67,”#.#E-”)1.235E4,字符串处理,字符串函数有三种类型:返回字符串类型,如Mid$()返回Variant类型,如Mid(
17、)按照字节计算,而不是字符,如MidB,基本字符串操作,1.混合字符串的长度Len(“姓名”)返回2LenB(“姓名”)返回4(字节数)2.大小写转换s1=LCase(“Chinese”)返回chinese s2=UCase(“Chinese”)返回CHINESE3.删除空格s1=LTrim(s1)删除左端空格s1=RTrim(s1)删除右端空格s1=Trim(s1)删除两端空格,基本字符串操作,4.搜索子串的位置pos1=Instr(1,“vb97_1.ppt”,“.”)pos2=Instr(“vb97_2.ppt”,“vb”,1)忽略大小写5.获取子串s1=Left(“vb97_1.ppt
18、”,pos1)s2=Right(temp,pos2)s3=Mid(temp,3,4)从第三位开始取4个字符6.替换子串Replace(source,find,replace,strat,count,comparemethod)s1=Replace(s1,“teh”,“the”)将s1串中的所有the替换为the,基本字符串操作,7.切分字符串Arr()=Split(source,delimiter,limit,comparemethod)如:Dim arrWord()As StringarrWord=Split(“you are my best friends”)结果是:数组arrWord被动
19、态赋值为5个单词8.组合字符串(与Split功能相反)string=Join(sourceArray,delimiter)如:Print Join(arrWord,“”),字符串格式处理,9.格式化FormatFormat(“abcde”,”)右对齐Format(“abcde”,“!”)左对齐Format(“abcde”,”&”)大写Format(“abcde”,”&”)小写Format(“01064884680”,”&-&-&)表示字符,不足补空格&表示字符,不足补0,基本字符串操作,10.字符串比较Like运算符If strValue Like“AB#”如“AB123”,“AB097”If
20、 strValue Like“ABC*XYZ”如“ABCFDKJKXYZ”If strValue Like“1?X”如“1KKJX”,“1AB3X”If strValue Like“A-C#”如“A432”,“C599”If strValue Like“AEIOUA-ZA-Z”如“ECD”If strValue Like“!0-9?如“D3J”,“ZLJ”,基本字符串操作,11.字符串转换类型CInt:转换为整型数CLng:转换为长整型数CSng:转换为单精度浮点数CDbl:转换为双精度浮点数CCur:转换为货币CDate:转换为日期CStr:转换为字符串Chr:Ascii码转换为字符 Asc:字符转换为Ascii码,日期操作,1.取当前日期Now2.取日期中的年Year3.取日期中的月Month4.取日期中的日Day5.取星期数Weekday:返回1-7,即vbMondayvbSunday,