VB6当中自定义过程和函数以及参数类型_第1页
VB6当中自定义过程和函数以及参数类型_第2页
VB6当中自定义过程和函数以及参数类型_第3页
VB6当中自定义过程和函数以及参数类型_第4页
VB6当中自定义过程和函数以及参数类型_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、VB6 当中自定义过程和函数以及的参数类型近日,接连看到有关在VB6中自定义过程和函数中的参数的类型问题,于是产生一种冲动,想写一篇比较全面的相关文章。文章的名就叫VB6当中自定义过程和函数的参数类型好了。一自定义过程和函数:为什么要提供让用户自己定义具有特殊功能的过程和函数呢?我们来看一个例子;在编写一个具体的应用项目的时候,可能需要在多个地方输出打印一行60个符号“*”,即:*以此作为分隔线。输出打印的代码如下:DimiAsIntegerFori=1To60Print“*”;NextiPrint由于在多处地方需要输出这行符号,所以在多个地方会出现完全相同的代码,为了减少代码重复,我们就可以

2、自己编写一个过程,该过程就是能够完成输出一行“*”号的工作;该过程的代码如下:1编写自定义过程:PrivateSubPLine()DimiAsIntegerFori=1To60Print“*”;NextiPrintEndSub从上面的代码中可以体会,过程的格式由;PrivateSubPline()开始,EndSub结束。开始部分由四部分组成;Private-定义该过程的使用范围,类似定义变量前的引导字,定义过程可以用:Private、Public、Friend三种关键字,分别表示在:窗体、模块和类模块中使用。Sub-表示为过程,相应Function表示为函数。PLine-是自定义过程的名称。(

3、)-一对括号,括号里列出需要的参数,本例无参数。即使无参数,括号也不能省。2调用自定义过程:调用格式:格式1:Call过程名(参数列表)格式2:过程名参数列表对应上例的调用语句为:CallPline()或者Pline于是,有了这个自定义过程,在代码中凡是需要输出这行符号的地方,就可以简略地用一行语句来完成。可以理解,在程序中使用该过程的地方越多,采用自定义的方式就越显示出其优越性。3带有参数的过程;这个过程的灵活性还不够,它只是能输出一行60个“*”符号。如果希望符号能够根据需要有不同的变化,比如有的地方输出的符号是等号“=”或者减号“-”等等,能够根据调用者的意愿来实现。这就需要有参数,这个

4、参数决定了输出的符号。修改过程如下:PrivateSubPline1(ByValChAsString)DimiAsIntegerFori=1To60PrintCh;NextiPrintEndSub现在这个过程的括号里,有了一个参数;ByVal-参数的传递格式,后面来具体解释。Ch-参数的名字AsString-参数的数据类型,这里是字符串。有了参数,那么调用时就需要如下来实现:CallPline1(“=”)这里,是用符号“=”去调用该过程,执行调用时,调用语句把“=”传递给参数Ch,使得过程中的Ch的值就是“=”。这样就得到输出60个等号。如果执行调用:CallPline1(“-”),就得到输出

5、60个减号。这时候你会想,能不能再给这个过程加一个参数,来决定它一行有多少个字符。既然有想法,那就赶快行动吧!修改过程如下:PrivateSubPline2(ByValChAsString,ByValnAsInteger)DimiAsIntegerFori=1TonPrintCh;NextiPrintEndSub这里多了一个整型类型的参数,可以来决定输出一行的字符的个数;如果执行调用:CallPline2(“-”,80),就得到输出80个减号。如果执行调用:CallPline2(“*”,100),就得到输出100个星号。当然,可以这样调用;DimC1AsString,C2AsString,n1

6、AsInteger,n2AsIntegerC1=“-”:C2=“*”:n1=80:n2=100CallPline2(C1,n1)CallPline2(C1,n2)CallPline2(C2,n2)至此,我们理解了编写自定义过程的意义、调用方法,也初步体会了编写的格式、方法。下面我们来举一个自定义函数的例子;程序设计中的函数的概念,来自于数学的概念,至少函数会返回一个值,在这一点上是一样的。在程序设计中,过程与函数,有相同的地方,也有不同的地方;通过上面过程的例子,可以体会过程就是通过一系列相关的操作步骤,达到一个目的(输出一行字符)。而函数也是通过一系列相关的操作步骤,达到一个目的,但是这个目

7、的是返回一个数据(值)。例如:根据三角形的底边a和高h,求三角形的面积S。VB代码如下;DimaasSingle,hasSingle,SasSinglea=Val(InputBox(“请输入三角形的底边长”)h=Val(InputBox(“请输入三角形的高”)S=a*h/2PrintS我们可以把这段代码,编写成一个求三角形面积的函数,其中底边a与高h是参数,面积S就是返回的函数值。4编写自定义函数;自定义函数如下:PrivateFunctionSJXs(ByValaAsString,ByValhAsSingle)AsSingleSJXs=a*h/2EndSub其中:Private-作用同过程声

8、明中的Private,也可以是:Private、Public、Friend三种。Function-表示是函数,其别于Sub。SJXs-函数的名称。(ByValaAsString,ByValhAsSingle)-一对括号里包含2个参数,同过程格式。AsSingle-这个表示函数的返回值的数据类型。5调用自定义函数;调用格式:函数名(参数列表)例如:调用上述求三角形面积的函数:DimaasSingle,hasSingle,SasSinglea=Val(InputBox(“请输入三角形的底边长”)h=Val(InputBox(“请输入三角形的高”)S=SJXs(a,h)PrintS到此,我们已经了解

9、了高级语言系统提供自定义过程和函数(也称为函数过程)的意义;和自定义过程和函数的代码格式,以及调用格式。通常我们习惯把过程和函数统称为子程序,把调用它们的部分称为主程序。下面我们为了方便,出现“子程序”的地方就是指针对“过程”和“函数”这个概念。二子程序的一般格式:1过程的一般格式:Private|Public|FriendStaticSub过程名(参数列表)语句组1ExitSub语句组2EndSub2函数的一般格式:Public|Private|FriendStaticFunction函数名(参数列表)As数据类型语句组1函数名=表达式ExitFunction语句组2函数名=表达式EndFu

10、nction三子程序中的参数及传递类型:1形参与实参;形参-形式参数,在定义语句中出现的参数。实参-实际参数(实在参数),在调用语句中出现的参数例如:我们前面的例子中:PrivateSubPline2(ByValChAsString,ByValnAsInteger)EndSub和PrivateFunctionSJXs(ByValaAsString,ByValhAsSingle)AsSingleSJXs=a*h/2EndSub其中:Ch、n、a、h,都叫做形参;而;CallPline1(“-”,80)CallPline1(“*”,100)CallPline2(C1,n1)CallPline2(C

11、1,n2)CallPline2(C2,n2)S=SJXs(a,h)其中:“-”、80、“*”、100、C1、C2、n1、n2、a、h,都叫做实参。2参数的类型子程序中的(参数列表)的一般格式:OptionalByVal|ByRefParamArray参数名()As数据类型=默认值格式中的关键字ByVal在前面的例子中,已经出现,现在我们来分别介绍关键字:OptionalByVal|ByRefParamArray的含义与作用:1)ByVal-该参数以传值方式进行调用;当发生调用子程序的时候,主程序将实际参数的数值(数据)根据一一对应的位置,传递给子程序的形式参数。由于是“传值”方式,所以实际参数

12、可以是表达式;例如:求三角形面积的例子;Dimxassingle,yassingle,zassingle,Sassinglex=4y=2S=SJXs(x+y,x-y)这里x+y的值传递给形式参数a,x-y的值传递给形式参数hPrintS2)ByRef-该参数以传址方式进行调用;当发生调用子程序的时候,主程序将实际参数的地址(不是数据)根据一一对应的位置,传递给子程序的形式参数。由于是“传址”方式,所以实际参数通常用变量;(如果用表达式,那么将失去传址的意义,其作用与ByVal声明一样,进行传值操作)当声明自定义子程序的时候,参数前可以选关键字ByVal或ByRef,如果省略前面的关键字,就默认

13、为是ByRef类型的;用ByRef或ByVal声明的子程序,调用时实际参数与形式参数的位置一一对应,且个数相等、数据类型一一对应一致例:交换两个变量的值;PrivateSubSwap(ByRefxasInteger,ByRefyasInteger)DimtAsIntegert=x:x=y:y=tEndSub这个过程,采用了2个传址方式的参数,当执行如下调用:DimaAsInteger,bAsIntegera=3:b=2Print交换前:a=;a;,b=;bCallSwap(a,b)Print交换后:a=;a;,b=;b3)传值与传址的区别:上面介绍了用ByVal声明的形式参数,在调用发生时,是

14、按照传递数值的方式进行的;而用ByRef声明的形式参数,在调用发生时,是按照传递地址的方式进行的;它们的根本区别,用通俗的话来说:前者是把实际参数的值传递给形式参数,然后,进入子程序中对形式参数的运算操作,不会改变实际参数的值;而后者是把实际参数的地址传递给形式参数,然后,进入子程序中对形式参数的运算操作,其实就是对实际参数的运算操作,所以会改变实际参数的值举例:例:PrivateSubCommand1_Click()DimXAsIntegerX=1CallMySub1(X)PrintX因为按照传值方式调用,所以尽管在自定义过程里,对对应的形式参数a进行了加操作,但是并不会变化,输出自定义过程

15、EndSubPrivateSubMySub1(ByvalaAsInteger)这里用Byval声明参数,所以调用将按照传值方式进行a=a+5EndSub例:PrivateSubCommand2_Click()DimXAsIntegerX=1CallMySub2(X)PrintX因为按照传址方式调用,自定义过程里对对应的形式参数a进行了加操作,其实就是对实际参数的操作,所以X变化输出自定义过程EndSubPrivateSubMySub2(ByRefaAsInteger)这里用ByRef声明参数,所以调用将按照传址方式进行a=a+5EndSub用大白话来理解并记忆:Byval定义的是传值方式,实参

16、与形参只是在调用发生前进行数值传递,传递结束,进入子过程后,它们就没有联系,调用的结果不会改变实参;ByRef定义的是传址方式,实参与形参在调用发生前进行地址传递,传递结束,进入子过程后,对形参的操作其实就是对实参的操作,调用的结果对形参的改变就是对实参的改变;于是,有人就会想到,利用这个ByRef的特点,不是用过程也可以实现函数的功能了吗?即在过程里把一个或多个结果传递到调用它的地方;(聪明的你,我就不举这个例子了吧?)Optional-该参数为可选项;假设我们想编写一个函数,用这一个函数来求出初等数学里的一些简单基本图形的面积;比如:圆、矩形/平行四边形、三角形、梯形这四类图形的面积,我们

17、归纳如下:圆:S=p*R*R需要1个参数R矩形/平行四边形:S=a*b需要2个参数三角形;S=a*b/2需要2个参数梯形:S=(a*b)*h/2需要3个参数我们设想该函数用1个Byval定义的字符形式参数,用来存放“圆”或“矩形”或“/平行四边形”或“三角形”或“梯形”,另外用1个Byval和2个Optional定义的单精度形式参数,如下;(1)求基本图形面积的自定义函数PrivateFunctionMyS(ByValXingAsString,Optionalx1AsSingle,Optionalx2AsSingle,Optionalx3AsSingle)AsSingleSelectCaseX

18、ingCase圆MyS=3.*x1*x1Case矩形,平行四边形MyS=x1*x2Case三角形MyS=x1*x2/2Case梯形MyS=(x1+x2)*x3/2CaseElseMyS=0MsgBox错误的图形名称!,求图形面积:EndSelectEndFunction(2)调用的代码举例:PrivateSubCommand2_Click()Dimx1AsSingle,x2AsSingle,x3AsSinglex1=1Print圆面积:S=;MyS(圆,x1)x1=2:x2=4:x3=10Print矩形面积:S=;MyS(矩形,x1,x2)Print平行四边形面积:S=;MyS(平行四边形,x

19、1,x2)Print三角形面积:S=;MyS(三角形,x1,x2)Print梯形面积:S=;MyS(梯形,x1,x2,x3)EndSub执行该调用,显示的效果为:说明:由Optional关键字声明的参数,只能集中出现在参数列表的最后位置。Optional关键字可以出现在Byval或ByRef前面,一起使用,来说明该参数是可选项,但是按照传值或传址方式进行调用的。)ParamArray-该参数为Variant数据类型的Optional类型的可变规模数组注意:该关键字可以提供任意数目的参数,它不能与ByVal,ByRef,或Optional一起使用。(就是不能象Optional那样出现在ByVal

20、,ByRef之前),并且它是规定以传址方式调用的。尽管它的形式参数是可变规模数组,但是调用时不能用数组名作为实际参数。比如:程序中经常会求一组数据里的最大值、最小值等。但是在不同的情况下,一组数据的个数是不同的,有时候要求求10个数据中的最大值,有时候要求100个数据中的最大值。这里就可以用ParamArray关键字进行声明,来解决这一个问题,下面以编写自定义函数,求最大值为例;(1)求一组数据中的最大值的自定义函数PrivateFunctionMyMax(ParamArrayd()AsSingleDimiAsIntegerMyMax=d(0)Fori=1ToUBound(d)Ifd(i)My

21、MaxThenMyMax=d(i)NextiEndFunction(2)调用该自定义函数PrivateSubCommand1_Click()DimxAsSingle,yAsSingle,zAsSingleDimMMaxAsSinglex=100.999:y=93.123:z=200MMax=MyMax(x,y)PrintMMaxPrintMMax=MyMax(x,y,z)PrintMMaxEndSub从调用代码中可以看到,第1次调用用了2个参数,第2次调用用了3个参数。当然,可以根据具体需要,使用任意多个参数。四归纳子程序(过程和函数)中的参数分类及使用方法:1在定义语句中的参数叫形式参数,在调用语句中的参数

温馨提示

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

评论

0/150

提交评论