【VB开源代码栏目提醒】:网学会员VB开源代码为您提供在用VB设计应用程序时 【精编】 - 医学卫生参考,解决您在在用VB设计应用程序时 【精编】 - 医学卫生学习中工作中的难题,参考学习。
第八章过程在用
VB设计应用程序时除了定义常量和变量外全部工作就是编写过程。
VB中的过程可以看作是构成程序的功能模块。
VB中的过程分为事件过程和通用过程其中通用过程又分为两类即子程序过程和函数过程前者叫做SUB过程后者叫做Function过程。
8.1 Sub过程1、定义Sub过程过程的格式如下Static Private Public Sub 过程名参数表列语句块Exit Sub语句块End Sub 说明??过程是以Sub开头以End Sub结束的一段程序在这两句之间是语句块称为“过程体”或“子程序体”。
??Static可选的。
表示在调用之间保留Sub 过程的局部变量的值即此过程中的局部变量为静态的。
Static 属性对在Sub 外声明的变量不会产生影响即使过程中也使用了这些变量。
??Private可选的。
表示Sub 过程是私有的只能被本模块中的其他过程访问不能被其他模块中的过程访问。
??Public可选的。
表示Sub 过程是公有过程可以在程序的任何地方调用它。
各窗体通用的过程一般在标准模块中用Public定义。
在窗体层使用Public定义的通用过程通常在本窗体模块中使用在其它窗体模块中使用时应该加上窗体名称作为前缀。
??过程名必需的。
Sub 的名称遵循标准的变量命名约定。
在同一个模块中同一个变量名不能既用作Sub过程名又用作Function过程名。
??参数表列由多个参数组成参数之间用逗号分隔这里的参数通常称为形式参数。
当过程被调用时调用过程的命令将数据传送给这里的参数参数格式如下??参数格式ByVal ByRef 变量名 As typeByVal ByRef值传递地址传递且默认地址传递。
值传递是调用过程时实际参数的值传给形式参数地址传递是调用过程时将实际参数的内存存放地址传过来形式参数也指向同一地址。
变量名合法的变量名或数组名如果是数组则应有一对括号。
As type 声明参数的数据类型。
缺省时为变体类型。
??Exit Sub:在运行时运行到此命令时程序返回调用此过程的下一条命令执行。
??End Sub:表示过程结束。
过程定义不可以嵌套也就是说在过程内不能定义Sub过程或Function过程也不能使用GoTo语句进入Sub过程。
过程只能通过调用来执行。
在过程程序的内部还可以调用其它过程即可以嵌套调用。
举例下面是一个例子当使用不同的参数值调用此过程会出现不同的消息框。
Private Sub msga As Integersname 超越系统Select Case aCase 1MsgBox 数据错误请注意 vbOKOnly vbInformation sname 报错Case 2MsgBox 是否继续 vbYesNo vbQuestion sname 提问End SelectEnd SubPrivate Sub Command1_Clickmsg ValText1.TextEnd Sub2、建立Sub过程通用过程不属于任何一个事件过程因此不能放在事件过程中。
多个不同的事件过程使用的一段相同的程序
代码此段
代码可以作为一个独立的过程定义即通用过程通用过程可以在标准模块中建立也可以在窗体模块中建立。
下面分别介绍在标准模块和窗体模块中建立通用过程的方法。
在标准模块中建立通用过程方法打开标准模块
代码窗口或打开窗体模块的
代码窗口使用菜单中“工具/添加过程”打开添加过程对话框按要求选择和填写内容然后单击确定就建立好一个没有语句块的过程了。
在过程中写入过程语句即可。
在窗体模块中建立通用过程方法在窗体模块的通用部分或模块中的通用部分直接输入过程关键字和过程名回车后系统自动加上End Sub新过程产生可在过程中输入程序命令。
3、调用Sub过程当使用下面两种方法调用过程时则转到指定的过程执行而实际参数的值将传递给过程中的参数表中的参数。
??用Call语句调用Sub过程格式Call 过程名实际参数 说明如果过程没有参数则参数和括号可以省略。
??把过程名作为一个语句来使用格式过程名实际参数 说明在这种格式中过程名和参数之间为空格分隔参数和参数之间使用逗号分隔如果过程没有参数则不需要参数。
例如调用上面msg过程Private Sub Command1_Clickmsg 1End Sub举例编写一个计算圆、三角形、长方形面积的程序。
分析??先选择图形使用单选钮完成单选钮单击事件发生时显示计算面积要求使用的数据对应控件例如园需要半径、三角形需要底边和高、长方形需要长和宽。
??然后调用对应的计算面积的过程。
??一共有3个计算面积的过程。
4、通用过程与事件过程事件过程??事件过程也是过程它是一种特殊的过程当Visual Basic 中的对象对一个事件的发生作出认定时便自动用相应于事件的名字调用该事件的过程。
因为名字在对象和
代码之间建立了联系所以说事件过程是附加在窗体和控件上的。
它必须放在窗体模块中。
??一个控件的事件过程将控件的在Name 属性中规定的实际名字、下划线_ 和事件名组合起来作为事件过程的名字。
??虽然可以自己直接输入控件名称和下划线和事件名称来编写事件过程但使用Visual Basic 提供的
代码过程会更方便这个过程自动将正确的过程名包括进来。
从“对象框”中选择一个对象从“事件框”中选择一个过程就可在“
代码编辑器”窗口选择一个模板。
??在开始为控件编写事件过程之前先设置控件的Name 属性这不失为一个好主意。
如果对控件附加一个过程之后又更改控件的名字那么也必须更改过程的名字以符合控件的新名字。
否则Visual Basic 无法使控件和过程相符。
过程名与控件名不符时过程就成为通用过程。
??事件过程也可以被其它过程调用。
下例中单击按钮2则程序自动执行按钮1的单击事件。
Private Sub Command1_ClickPrint 4 45End Sub-------------------------------------------------------Private Sub Command2_ClickCall Command1_ClickEnd Sub例如通用过程??通用过程是我们建立的过程它可以放在标准模块中也可以放在窗体模块中。
??为什么要建立通用过程呢理由之一就是几个不同的事件过程也许要执行同样的动作。
将公共语句放入一分离开的过程通用过程并由事件过程来调用它成为编程上策。
这样一来就不必重复
代码也容易维护应用程序。
??当过程名在同一标准模块中或同一窗体模块中不能重名。
但在不同的模块中可以重名在使用中如果有二义性过程名应该指明是哪一个模块中的过程。
例如Module1和Module2中都有公用过程aaa使用时应写出标准模块名称调用Module1中的过程aaa使用命令为Call Module1.aaa参数。
??当要调用其它模块中的过程时此过程应该是公用的Public。
??在缺省情况下应用程序中的第一个窗体被指定为启动窗体。
也许可能想先运行装入数据文件的
代码再装入窗体可以在标准模块中设置一个Main过程然后在菜单的“工程/工程属性”中设置启动对象为Sub Main这样程序运行时首先运行Main过程。
举例1、请编制一个程序5个学生的成绩放在数组st中st数组为5行5个学生、4列学号、姓名、英语成绩、计算机成绩窗体上有2个按钮当按下第一个按钮将学生成绩按照英语成绩名次顺序打印到窗体上当按下第二个按钮将学生成绩按照计算机成绩名次顺序打印到窗体上。
2、请编制一个程序共有4个窗体第一个窗体上有英语、计算机、总分复选框选定后按下显示将上面学生的内容按照复选框选定的要求将英语名次、计算机名次、总成绩名次输出到3个窗体上并且显示出来。
8.2 Function过程1、定义Function过程上一节讲的过程不直接返回值可以作为独立的语句使用。
使用Function过程要返回一个值使用方法和函数一样我们也称其为自定义函数Function不能直接当作语句使用。
Function过程的格式如下Static Private Public Function 过程名参数表列 As 类型语句块过程名表达式Exit Function语句块End Function 说明??Function过程是以Function开头以End Function结束的一段程序在这两句之间是语句块称为“过程体”或“函数体”。
??格式中的Static、Private、Public、过程名、参数表列的含义和Sub过程中的定义一样请参考上一节中的内容。
??As 类型可选的。
Function 过程的返回值的数据类型可以是Byte、布尔、Integer、Long、Currency、Single、Double、Date、String、Object、Variant或任何用户定义类型。
??Exit Function:在运行时运行到此命令时程序返回调用此函数的位置执行。
??End Function:表示Function过程结束。
Function定义不可以嵌套也不能使用GoTo语句进入Function过程。
但在Function的程序中可以调用Function过程包括它自己如果调用自己则是一个递归函数。
??过程名表达式Function过程中的此命令给出Function过程的返回值。
如果没有此命令返回一个缺省值例如类型为数值型返回0。
举例下面是一个例子当给出3门课的成绩返回平均分等级。
Private Function djcj1 As Integer _ cj2 As Integer cj3 As Integer As Stringa cj1 cj2 cj3 / 3If a 100 Thendj 数据错误ElseIf a 90 Thendj 优秀ElseIf a 80 Thendj 良好ElseIf a 60 Thendj 及格ElseIf a 0 Thendj 不及格Elsedj 数据错误End IfEnd Function---------------------------------------Private Sub Command1_ClickDim m1 As Integer m2 As Integer m3 As Integerm1 CIntText1.Textm2 CIntText2.Textm3 CIntText3.TextLabel2.Caption djm1 m2 m3End Sub2、调用Function过程??Function过程的调用比较简单它的使用方法和标准函数一样只不过标准函数是系统定义的而Function是编程人员定义的因此通常称之为自定义函数。
??下面是自定义函数的一些例子。
举例1函数的递归调用。
请编写一个函数返回n的阶乘。
Private Function jcN As Double As DoubleIf N 1 Thenjc 1Elsejc N jcN -1End IfEnd FunctionPrivate Sub Command1_ClickDim m As Double njc As Doublem CDblText1.TextIf m 170 ThenMsgBox 数据太大请输入小于等于170的数据 48 警告Text1.Text Text1.SetFocusExit SubEnd Ifnjc jcmLabel2.Caption N的阶乘为 StrnjcEnd Sub举例2使用自定义函数计算日工资计件工资每件制品工资1.8元优品增加0.2元次品减少2.8元。
首先将需要的控件设置好有输入三个件数的文本框显示工资的标签框计算按钮和退出按钮。
下面先定义常量Const Zp 1.8 每件制品得到的工资Const Yp 0.2 每件优品增加的工资Const Cp 2.8 每件次品扣除的工资日工资的计算函数Private Function GzZpSl As Integer YpSl As Integer CpSl As Integer As Double当日工资小于0按0计算mgz ZpSl Zp YpSl Yp -CpSl CpIf mgz 0 ThenGz 0ElseGz mgzEnd IfEnd Function件数的检测数据函数Private Function sjjcZpSl As Integer YpSl As Integer CpSl As Integer As Integer当制品件数小于0返回0当优品件数小于0或大于制品件数返回1当次品件数小于0或大于制品件数返回2当制品件数小于优品件数次品件数返回0没有错误返回3If ZpSl 0 ThenMsgBox 正品件数错误 48 警告sjjc 0Exit FunctionEnd IfIf YpSl 0 Or ZpSl YpSl ThenMsgBox 优品件数错误 48 警告sjjc 1Exit FunctionEnd IfIf CpSl 0 Or ZpSl CpSl ThenMsgBox 次品件数错误 48 警告sjjc 2Exit FunctionEnd IfIf ZpSl YpSl CpSl ThenMsgBox 件数错误 48 警告sjjc 0Exit FunctionEnd Ifsjjc 3End Function计算按钮的单击事件过程Private Sub Command1_ClickDim Mzp As Integer Myp As Integer Mcp As IntegerMzp CIntValText10.TextMyp CIntValText11.TextMcp CIntValText12.Textmsjjc sjjcMzp Myp McpIf msjjc 3 ThenLabel1.Caption 今日工资为 StrGzMzp Myp Mcp 元ElseText1msjjc.SetFocusEnd IfEnd Sub8.3 参数传送调用一个过程时必须把实际参数传送给过程完成形式参数与实际参数的结合然后用实际参数执行调用的过程。
1、形参与实参??形参也叫做形式参数它是在Sub、Function过程的定义中出现的变量名。
??实参也叫做实际参数它是在调用Sub、Function过程时传送给Sub和Function过程中的常数、变量、表达式或数组。
??如何将实参的数据对应传送给形参呢有2种方式。
第一种是按对应位置传送第二种是指名传送。
按位置传送按位置传送要求形参和实参的位置次序必须一致。
比如一个过程定义如下有学生学号、姓名、计算机成绩Private Sub StuStuNo As String StuName As String StuComputer As Integer......End SubCall Stu2001001001李平95Mstuno2002001001Mstuname王洪Mstucomputer88Stu MstunoMstunameMstucomputer 调用时实际参数顺序必须一致在传送时形参和实参的变量名可以不同但是参数个数、数据类型、对应位置必须一致。
在上面例子中形参和实参的对应关系如下第一个参数第二个参数第三个参数第一次过程调用2001001001李平95第二次过程调用MstunoMstunameMstucomputer过程定义StuNoStuNameStuComputer??形式参数表中为变量表变量与变量之间逗号分隔。
??要求除定长字符串之外的合法变量名也就是不可以声明如下的形参变量Private Sub StuStuno As String10StuName As String4 错误??后面有括弧的数组名括弧内不能有下标值。
??实际参数表中的各项用逗号分隔实参可以是??常数??表达式??合法的变量名??后面有括弧的数组名括弧内不能有下标值。
指名传送??所谓的指名传送就是显式地指出与形式参数结合的实参把形参和实参用“:”连接起来。
调用的时候按下面方法Call StuStuname:MstunameStuno:MstunoStuComputer:Mstucomputer Call StuStuname:李平Stuno:2001001001StuComputer:95 ??指名传送方式不受位置次序的限制。
??表面看来指名传送比按位置传送要书写更多的
代码但它增加了可读性。
??在
VB提供的“方法”中有些可以使用指名传送有些不可以请在使用时参看帮助。
2、引用地址传递??在参数的定义时可以定义参数传递的方式即是值传递还是地址传递默认方式为地址传递。
将参数地址而不是将值传递给过程的方式这就使过程访问到实际的变量。
结果过程可改变变量的真正值。
除非另作说明否则按地址传递参数。
??格式:ByRef??在过程的定义中参数前使用By Ref或缺省方式定义了地址传递。
举例Private Sub trya1 a2a1 a1 1a2 a2 1Print a1 a2End SubPrivate Sub Command1_Clickb1 1b2 2Call tryb1 b2Print b1 b2End Sub运行时单击按钮打印的内容是2323说明:??这是由于在运行过程中参数的传递是地址传递在Call Tryb1b2的调用命令中将参数b1、b2这两个参数变量存放的内存地址传递给形式参数a1和a2也就是a1和b1这两个变量同时指向一个内存地址因此当调用返回后打印b1的内容发现b1的内容也改变了并不是回传了结果而是a1和b1同时指向同一存放数据的内存地址。
当然a2和b2也是同样的。
??注意传递地址要比传递值节省空间且提高效率系统不必再为数据开辟新的内存空间在字符串的操作中尤其明显。
3、传值当使用ByVal作为过程参数的定义时参数传递的方式为值传递系统将实际参数的值放到临时内存单元中在把临时内存单元的地址传递给形式参数这样由于形式参数和实际参数没有指向同一地址在过程调用完毕实际参数的值不会随着形式参数的值变化而变化。
还是上面的例子Private Sub tryByVal a1 ByVal a2a1 a1 1a2 a2 1Print a1 a2End SubPrivate Sub Command1_Clickb1 1b2 2Call tryb1 b2Print b1 b2End Sub2312运行时单击按钮打印的内容是注意值传递虽然效率比地址传递要低但是它的形式参数不会影响到实际参数变量的内容因此在这里形式参数是真正的过程内的局部变量不会对过程产生干扰。
在某些情况下必须使用值传递。
4、数组参数的传送??在过程的定义中参数为数组则应该将数组名后加上括弧。
??在调用过程时参数为数组也应该将数组名后加上括弧。
应该注意的是??在形参和实参表中的数组名后的括弧内不能写下标的上下界。
??当在实参中数组的括弧中有下标则传递的不是数组而是指定的下标元素的内容。
??在过程中形式参数的数组的下标需要用Lbound和Ubound函数来取出5、参数传递参考??对于占用内存空间小的参数例如整型、长整型、单精度如果不希望实际参数的值被调用过程修改就使用值传递但是为了提高效率字符串和数组一般使用地址传递另外用户定义类型的参数和控件只能使用地址传递。
??在使用双精度、货币型、变体数据可以用两种方式传递但是值传递还是比较不容易出错的。
??在编程时可以先使用值传递运行通过后再改为地址传递。
??在Function过程中过程名只可以返回一个值如果需要返回多个值还是用地址传递进行操作让参数存放返回的值。
??当实参为常数和表达式时应该注意形参的数据类型的匹配问题。
??字符串和数值常数分别传送给字符串类型的形参和数值型的形参。
??当数值型数据类型不同时常数和表达式的结果将被强制类型转换。
??在使用记录类型的变量时定义过程的参数时要定义它的类型为指定的记录类型。
??在传递单个记录类型的变量元素时实参中书写方式为“记录型变量名.元素”
上一篇:
VB中文
下一篇:
关于大学英语教学