第07章VB子过程与函数.ppt_第1页
第07章VB子过程与函数.ppt_第2页
第07章VB子过程与函数.ppt_第3页
第07章VB子过程与函数.ppt_第4页
第07章VB子过程与函数.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章 子过程和函数,子程序和函数 如何编写和使用 子程序和函数的作用域 VB内部函数介绍,VB模块,模块的两层含义: l工程中的资源: 一个应用程序就是一个工程,窗体模块(.frm)、类模块(.cls)、标准模块(.bas)。这是一种高层次的模块划分,它们以独立的文件方式管理。 l子程序和函数: 一个窗体模块或标准模块也是由一些功能单元组成的,这就是子程序和函数,统称为过程(Procedure)。相对来说这是一种较低层次的模块划分。VB中提供的一些函数(比如上一章的UBound)以及事件过程就是这层含义。,VB文件的内容,每一类型的文件都可以包含过程和通用声明: 过程:可以是子过程、函数过程

2、或事件过程。每一种过程都由代码组成。 声明:在模块级通用声明部分放置常量、变量、动态链接库等的声明。,窗体模块文件*.frm,工程中的每个窗体都有一个与之相应的窗体模块文件 窗体文件中包含: 窗体本身及窗体上放置的所有控件的属性设置 窗体级变量、常量、类型声明和外部过程 的声明 所有相关的事件过程及窗体级通用过程 说明: 同一窗体模块内的通用过程与事件过程可以相互调用 若窗体模块内的通用过程被声明为公有的,可以被其它窗体模块或标准模块中的过程调用。调用方法为:窗体名.过程名,如From1.Test。,标准模块文件*.bas,标准模块中的代码可以被工程中的所有模块,包括窗体 模块、其它标准模块,

3、所共享。 标准模块中包含: 通用过程 没有事件过程 公共或模块级的变量、常量、外部过程和全局过程的声明 说明: 标准模块存放于独立的文件中,其扩展名为 .bas 。 标准模块中通用过程缺省为公有(Public),即工程中的任一模块均可共享、调用。,类模块文件*.cls,类模块包含用来创建对象的类定义 包含类的属性和方法的定义,7.1 子过程和函数,模块化的程序设计思想: 将程序分解成小的程序模块单元(子程序或函数),每个模块可以实现小的功能目标,它们组合起来实现大一些的功能目标。 按层次分解,主程序调用一个或多个下级子程序,这些被调用的子程序又可以调用更下层的子程序。 VB中的模块: 事件过程

4、(Private Sub 对象名_事件名) Sub过程,又称通用过程,或子过程 Function过程,称函数,7.2 子过程,VB中的子程序分事件过程和通用过程两类: 事件过程 事件过程是VB事件驱动编程的重要机制。当VB中的某对象的某个事件被触发时,便自动调用对象的事件过程进行处理。因为事件过程的名称中包含了对象名和事件名,所以程序能够实现自动对应和调用。 通用过程 除事件过程以外的子程序都称为通用过程,通用过程由程序员自行定义和编写。一般存放到一个标准模块(文件扩展名为.BAS)中。,通用过程,定义和调用通用过程 定义 Private | Public Static Sub 过程名(参数列

5、表) . End Sub 参数列表:ByVal 参数名 As 类型, 调用 Call ChangeColor(3) ChangeColor 2,事件过程,定义和调用事件过程 事件过程是VB事件驱动编程的重要机制。当VB中的某对象的某个事件被触发时,便自动调用对象的事件过程进行处理。 定义事件过程使用的是固定格式,不需要人工书写: Private Sub 对象名_事件名(参数列表) 事件响应代码 End Sub 事件过程除了由系统自动来调用之外,也可以将它看作一个普通的子程序在程序中用代码来调用,调用语法没有特殊之处。如: Call cmdAdd_Click,7.3 函数,定义和调用函数: 定义

6、 Private | Public Static Function 过程名(参数列表) . End Function 过程的区别: 函数有数据类型,即返回值的类型,缺省为Variant 给函数名本身赋值,即为返回值 如果象调用过程一样调用函数,则放弃返回值,退出子过程和函数,End Sub:退出子过程 End Function:退出函数 可以在子过程体内或函数体内任何位置使用上述语句,用来结束子过程或函数,子过程和函数的参数,VB默认的参数是按地址传递(ByRef ),意味着如果过程内的参数值改变了,则调用过程时使用的变量其值也随之改变 Sub Main() Dim x As Integer

7、x = 1 Call Test(x)x的值改变了 End Sub Private Sub Test (num As Integer) num = num+1 End Sub 按值传递,则用ByVal关键字,如:,数组作为参数示例,【例】编写子程序,实现在所有学生名单数组中查找给定的名字,输出查找结果。 Sub Find(one As String, all() As String) Dim i As Integer, max As Integer max = Ubound(all) 取数组上界 For i = LBound(all) To max If Trim(one) = Trim(all

8、(i) Then 去两端空格比较 MsgBox 找到啦 Exit Sub 完成查找 End If Next MsgBox 没有找到 End Sub,函数的返回值,退出函数之前必须完成返回值的确定,对函数名自身赋一个值,该值就是函数的返回值。 函数赋值语句可以出现函数的任意位置,该语句并不代表退出函数。 如果没有给定返回值,函数会根据返回值的数据类型自动返回一个缺省值,如数值函数会返回0,字符串函数返回一个零长度字符串 (“”)。,函数示例1,【例】编写函数可以实现温度值从华氏转换为摄氏和从摄氏转换为华氏。 Function change(source As Integer, isCtoF As

9、 Boolean) As Integer If isCtoF Then change = (source * 9 / 5) + 32 Else change = (source - 32) * 5 / 9 End If End Function 按下【摄氏-华氏】按钮 Private Sub Command1_Click() lblResult.Caption = 华氏温度= & change(CInt(text1.Text), True) End Sub 按下【华氏-摄氏】按钮 Private Sub Command2_Click() lblResult.Caption = 摄氏温度= &

10、change(CInt(text1.Text), False) End Sub,函数示例2,【例】写一个函数,用来确定某年是否是闰年。 Function isLeapYear(y As Integer) As Boolean If y Mod 40 or (y Mod 100=0 and y Mod 4000) Then isLeapYear = False Else isLeapYear = True End If End Function 按下按钮 Private Sub Command1_Click() Dim year As Integer year = CInt(text1) If

11、isLeapYear(year) Then lblResult = year & 年是闰年 Else lblResult = year & 年不是闰年 End If End Sub,7.4 子过程和函数的作用域,过程定义时使用Private和Public关键字限定过程的作用域。 Private:表示该过程是私有的、局部的。只有与该过程处于同一模块文件中的其它过程才可以访问,之外的模块不能使用。 Public:表示该过程是公有的、全局的。工程中的所有模块都可以使用它。如果不指定作用域,过程会缺省为Public。编写程序时,一般将一个工程公用的过程集中存放到标准模块文件(.bas)中,并使用Pub

12、lic关键字。,7.5 高级用法,函数参数定义为可选项 参数中使用Optional关键字 函数参数的数量可变 参数中使用ParamArray关键字,使用可选参数,可选的参数在调用函数时可以不填写,函数能照常可以工作。 Sub Test( num As Integer, Optional Temp As Boolean) 如果不指定,则布尔型参数的默认值为False,字符串型参数的默认值为“”,数值型参数默认值为0 可以在参数列表中指定缺省值,如: Optional Temp As Boolean = True 可以用IsMissing函数,判断是否提供了参数,前提是该参数类型为Variant,

13、【例】修改查找姓名的子程序,增加查找起始位置和查找方向。,可选参数示例,可以编写两个查找的子过程,但因为都是查找,模块化设计中通常只定义一个子过程,通过不同的参数来区分 修改查找子过程,参数start指定查找起始位置,参数direction为True表示向后正向查找,反之向前查找: Sub Find(one As String, all() As String, Optional start As Integer=0, Optional direction As Boolean = True),Dim stuNames() As String 按下【正向查找】按钮 Private Sub Co

14、mmand1_Click() If txtPos = then Call Find(txtName, stuNames) 从第1个元素向后查 Else Call Find(txtName, stuNames, CInt(txtPos) 从指定元素向后查 End If End Sub 按下【反向查找】按钮 Private Sub Command2_Click() If txtPos = then Call Find(txtName, stuNames, ,False) 从第1个元素向前查 Else Call Find(txtName, stuNames, CInt(txtPos), False)

15、 从指定元素向前查 End If End 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 End If

16、 If 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 Next End If MsgBox 没有找到 End Sub,可选参数示例,使用不定数量的参数,使用ParamArray关键字 Sub Test( ParamArray Temp() ) 用动态数组方式指定 只能用于参数列表中的最后

17、一个参数 只能指定为Variant类型 不能与ByVal, ByRef, Optional关键字一起使用,【例】编写计算任意个数字总和的 Sum 函数 Private Sub cmdSum() Print Sum(1, 3, 5, 7, 9) 计算5个数的总和 Print Sum(32,128,256) 计算3个数的总和 End Sub Function Sum(ParamArray intNums() As Integer Dim x, Result As Integer For Each x In intNums Result = Result + x Next x Sum = Resul

18、t End Function,不定数量参数的示例,7.6 VB内部函数,VB本身提供了丰富的内部函数 数字计算类 字符串操作类 日期操作类 数据类型转换类,数值处理,函数: Abs:取绝对值 Sgn:判正负数(返回值分别为-1,0,1) Sqr:取平方根 Round:四舍五入取整 Val:将串转换为十进制数,如Val(“&H123”) Hex/Oct:转换为八/十六进制数 Rnd:生成一个小于1的随机小数,数值格式化处理,格式化:Format 语句结果 Format(1234.567,”#,#0.00”)1,234.57 Format(0.234,”#.#%”)23.4% Format(123

19、45.67,”#.#E+”)1.235E+4 Format(12345.67,”#.#E-”)1.235E4 Format还可以用于日期的格式化,字符串处理,字符串函数有三种类型: 返回字符串类型,如Mid$() 返回Variant类型,如Mid() 按照字节计算,而不是字符,如MidB,基本字符串操作,1. 混合字符串的长度 Len(“姓名”) 返回2 LenB(“姓名”) 返回4(字节数) 2. 大小写转换 s1 = LCase(“Chinese”)返回chinese s2 = UCase(“Chinese”)返回CHINESE 3. 删除空格 s1 = LTrim(s1) 删除左端空格

20、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”, 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 String arrWord = Split(“you are my best friends”) 结果是:数组arrWord被动态赋值为5个单词 8. 组合字符串(与Split功能相反) string=Join(sourceArray,delimiter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论