【VB开源代码栏目提醒】:网学会员鉴于大家对VB开源代码十分关注,论文会员在此为大家搜集整理了“VB应用程序 第7章 过程 - CAD/CAM/CAE”一文,供大家参考学习
VB的应用程序通常由一些具有独立功能的小程序组成。
这些小程序也叫过程。
把程序分割成较小的过程一来便于程序的管理利于分工编写与调试。
二来利于程序的共享对于一个具有公共性且经常被执行的任务将其写成过程供若干程序调用省去重复编写的繁琐提高了编程的效率。
使用过程能使程序结构更清晰提高
代码的可读性和重用性便于查找及修改
代码。
vb应用程序称为工程。
工程是由若干模块构成的。
vb的模块分为三种窗体模块内容存放在以.frm为扩展名的文件中。
标准模块内容存放在以.bas为扩展名的文件中。
类模块内容存放在以.cls为扩展名的文件中。
每个模块又是由若干个更小的
代码片段组成这些组成模块的
代码片段就是过程。
在
vb中过程可以分为两大类。
一类是由系统提供的包括内部函数和事件过程。
对于事件过程
vb系统提供了它们的框架用户可以根据需要填写具体的内容。
另一类为用户自己定义的过程。
分为以下四种1. 以关键字Sub定义的子过程2. 以关键字Function定义的函数过程3. 以关键字Property定义的属性过程4. 以Event定义的事件过程通用过程过程的分类应用程序应用程序工程文件工程文件.vbp.vbp窗体模块窗体模块.frm.frm文件文件类模块类模块.cls.cls文件文件标准模块标准模块.bas.bas文件文件函数过程函数过程functionfunction子过程子过程subsub事件过程事件过程subsub子过程子过程subsub函数过程函数过程functionfunction应用
程序结构图子过程Sub … End Sub子过程是用特定格式组织起来的一段程序通常用来完成某一个特定功能。
建立了一个子过程后可以供其他过程多次调用实现程序的重复使用。
例如计算x358计算8计算5计算3求和开始无子过程有子过程计算n求和开始调用子过程建立子过程子过程的定义一般格式PrivatePublicStaticSubExitSubEndSub可选项Public表示子过程是一个公用过程所有模块的都能调用该子过程。
Private 表示只有在定义它的模块中才能调用该子过程。
Static表示该子过程为静态过程子过程中定义的变量都为静态变量。
省略时为Public 。
Arglist为形式参数列表参数之间用逗号分隔。
子过程头语句子过程尾语句过程体例1在窗体模块中编写一个输出直角三角形的子过程。
PrivateSubtr1无形式参数DimiAsIntegerjAsIntegerFori1To5Forj1ToiPrintNextjPrintNextiEndSub子过程通常建立并保存在窗体模块和标准模块中。
例2在窗体模块中编写一个计算矩形面积的子过程。
有长和宽两个参数。
PrivateSubArexyassingle有2个形式参数DimaIfx0ory0thenExitsub如果有一个参数为0立即退出子过程Endifaxy计算矩形面积Msgbox矩形面积是x×yaEndSub要执行一个子过程必须调用该子过程。
调用子过程格式格式1call格式2子过程SUB过程的调用主过程……Call str ………str 子过程…………End Sub实际参数
列表子过程名无参数子过程的调用例如Calltr1或tr1有参数子过程的调用例如Callare58或are58实际参数可以是常数、常量、变量和数组等也可以是表达式。
它们必须在数目、类型和排列次序与被调用的子过程定义的形式参数表中的参数一致。
调用子过程时
vb系统先进行参数的传送然后执行子过程体中的语句。
执行之后就转回刚调用子过程语句的下一个语句去执行。
例7-1-1单击命令按钮1、2分别调用例1、例2定义的子过程。
PrivateSubCommand1_ClickPrint输出直角三角型CallTr1’使用Call关键字的调用格式Tr1’不用Call关键字的调用格式EndSubPrivateSubtr1DimiAsIntegerjAsIntegerFori1To5Forj1ToiPrintNextjPrintNextiEndSub例1子程序打印直角三角形PrivateSubCommand2_ClickDimChKwChInputbox输入矩形的长:KwInputbox输入矩形的宽:CallAreChKw’使用Call关键字的调用格式AreCh/2Kw/2’不用Call关键字的调用格式EndSubPrivateSubArexyassingleDimaIfx0ory0thenExitsubEndifaxyMsgbox矩形面积是x×yaEndSub例2子程序计算矩形面积例例77--44用语句调用事件过程用语句调用事件过程。
。
PrivateSubCommand1_ClickPrintHelloworldCommand2_Click‘用语句调用事件过程EndSubPrivateSubCommand2_ClickPrintHowareyouEndSub事件过程的调用当在程序中需要多次用到某一公式或要处理某一函数关系而又没有现成的内部函数可以使用时用户可以自定义一些函数来使用。
自定义的函数称为函数过程。
函数过程也是用特定格式组织起来的一组
代码。
函数过程在调用结束时带回一个值该值称为函数过程的返回值。
这个值的类型称为函数过程的类型。
在
vb中要使用自己定义的函数过程来编程序需要做两件事:一是要定义函数过程二是要调用函数过程。
函数过程Function … End Function一般格式PublicPrivateStaticFunctionAs┇ExitFunctionEndFunction函数过程体中至少有一条给函数名赋值的语句最后一次给函数名赋的值就是该函数过程的返回值。
若不给函数名赋值则该函数会返回一个缺省值。
数值型函数的缺省值为0字符串型函数为 。
形式参数列表定义同子过程函数返回值的类型给函数名赋值的语句得返回值给函数名赋值的语句得返回值例3将例2的子过程用函数来实现。
在窗体模块中编写一个计算矩形面积的函数过程。
有长和宽两个参数。
PrivateFunctionArexyassingleIfx0ory0thenExitFunction‘如果有一个参数为0立即退出函数EndifArexy‘计算矩形面积赋给函数名作为函数返回值EndFunctionPrivateSubArexyassingleDimaIfx0ory0thenExitsubEndifaxyMsgbox矩形面积:aEndSub例2子程序计算矩形面积PublicFunctionfactByValnAsIntegerAsLongDimiAsIntegertAsLongt1Fori1TonttiNextiFacttEndFunction例4将求n的阶乘定义为一个函数过程。
调用函数过程的
常用格式为函数过程名实际参数表其中函数过程名用标识符表示。
实际参数表中的参数一般为常数、常量、变量、表达式等它们必须在数目、类型和排列次序上与相应函数过程定义的形式参数表中参数一致。
当系统在执行程序遇到函数过程调用时先进行参数传送然后执行函数过程体中的语句并通过函数名把函数值带回表达式进行运算。
例如yare2040sfact5fact7/fact8函数过程的调用例5单击命令按钮1调用求矩形面积的函数计算矩形面积。
单击命令按钮2调用求n的函数计算某数的阶乘。
PrivateSubCommand1_ClickDimchkwChInputbox输入矩形的长:KwInputbox输入矩形的宽:MsgBox“面积:ch×kwarechkwEndSubPrivateFunctionArexyassingle有2个形参Ifx0ory0thenExitFunctionEndifArexy计算矩形面积赋给函数名EndFunctionPrivateSubCommand2_ClickDimnasIntegernInputBoxEntern:PrintFactn调用函数过程factEndSubPublicFunctionfactByValnAsIntegerAsLongDimiAsIntegertAsLongt1Fori1Tontti求阶乘NextiFacttEndFunction例7-6先从左边文本框输入一个分数单击命令按钮后调用自定义函数Passed对该分数判断。
若该分数大于等于0且小于60则在右边文本框显示“不及格”若该分数大于等于60且小于等于100则在右边文本框显示“及格”。
否则在右边文本框显示“数据错”。
PrivateFunctionPassedByValscoreAsStringSelect Case scoreCase0To59Passed不及格Case60To100Passed及格CaseElsePassed数据错EndSelectEndFunctionPrivateSubCommand1_ClickText2PassedValText1EndSub1在工程资源管理器窗口中选定打算在其中建立自定义过程的模块2打开该模块的
代码窗口3在
代码窗口中输入自定义过程。
在
代码窗口中输入自定义过程有两种方法①在
代码窗口的原有过程如果有的话之外输入自定义过程的全部语句②使用集成环境先建立过程框架再输入过程体的语句。
在集成开发环境中建立自定义过程的步骤当调用子过程或函数过程时先要进行参数的传递。
调用过程时要把需处理的原始数据传送给形式参数。
另外执行过程中的语句之后的计算或处理结果也需要传递回调用程序。
参数传递如何把需处理的原始数据传递给过程如何把执行过程体后的结果传递回调用程序要由过程的参数传递的方式决定。
过程定义中的形式参数表ByValByRef 形式参数名 As 类型 在
VB中过程的参数传递有两种方式1.值传递方式采用这种方式的调用称为传值调用。
ByVal By Value2.地址传递方式采用这种方式的调用称为传址调用。
ByRef By Reference 形式参数和实际参数过程调用时的参数传递过程为
系统为形参分配新的内存单元然后把实参的值传到该内存单元。
执行过程体时对形式参数进行的任何操作与实际参数没有任何联系。
过程执行完毕系统收回形式参数的临时存储空间。
1.1.传值调用传值调用ByVal 参数是单向传递PrivateSubCommand1_ClickDimxyx5y10PrintxxyyNoChangexy‘调用子过程PrintxxyyEndSub例7_7传值参数测试。
PrivateSubNoChangeByValaByValbaabbabPrintaabbEndSub分配存储空间分配存储空间xy分配存储空间分配存储空间xyx555分配存储空间xyx5y10105分配存储空间xy10分配存储空间分配存储空间ab510510xy10510ab15150aabbabx、y 值不变PrivateSubCommand1_ClickDimxyx5y10PrintxxyyNoChangexy‘调用子过程PrintxxyyEndSub例7_7传值参数测试。
PrivateSubNoChangeByValaByValbaabbabPrintaabbEndSub过程调用时的参数传递过程为系统为形参分配新的内存单元然后把实参的内存地址传到该内存单元。
执行过程体时对形式参数的任何操作实际上是通过间址操作对实际参数进行。
过程执行完毕系统收回形式参数的临时存储空间。
系统默认的传递方式。
2.传址调用ByRef 参数是双向传递PrivateSubCommand1_ClickDimxyx5y10PrintxxyyChangexyPrintxxyyEndSub例7_8传址参数测试。
PrivateSubChangeByRefaByRefbaabbabPrintaabbEndSub分配存储空间分配存储空间xy分配存储空间分配存储空间xyx555分配存储空间xyx5y10105分配存储空间xy10分配存储空间分配存储空间abx 地址y 地址510xy150abaab相当于xxybab相当于yxyx、y 值改变x 地址y 地址15PrivateSubCommand1_ClickDimxyx5y10PrintxxyyChangexyPrintxxyyEndSub例7_8传址参数测试。
PrivateSubChangeByRefaByRefbaabbabPrintaabbEndSub1.当需要保护实际参数时应采用传值参数当需要获取过程的操作结果时应采用传址参数。
2. 采用传值调用实参可以是常数变量或表达式。
采用传址调用实参只能是变量、数组、自定义型变量、对象变量。
例如例7-7中调用Nochange5xy合法例7-8中调用change5xy非法3.实际参数和形式参数分配有各自的存储空间它们的使用范围和生存期是不相同与实参与形参是否同名无关。
传值调用与传址调用的分别例l7-9:计算S48/5的值。
要求调用子过程求一个数的阶乘。
SubfactByvalnAsIntegerByreffacAsLongDimiAsIntegerfac1Fori1TonfacfaciNextiPrintnfacEndSubPrivateSubCommand1_ClickDim S As single Dim f1 f2 f3Call fact4f1Call fact8f2Call fact5f3Sf1f2/f3Print s48/5 sEndSubFunctionfactByvalnAsIntegerAsLongDimiAsIntegerfact1Fori1TonfactfactiNextiPrintnfactEndFunction例l7-10:计算S48/5的值。
要求调用函数过程。
PrivateSubCommand1_ClickDimSAssingleSfact4fact8/fact5PrintS48/5SEndSub例7-1-3计算S要求定义F的函数过程由命令按钮的单击事件过程输入m、n和p的值调用F函数过程求S的值在窗体上显示计算结果。
Private Function fByVal k ByVal x As LongDim i sum As Longsum 0For i 1 To xsum sum i kNext if sumEnd Function555333212121pnmxiki1Private Sub Command1_ClickDim m n p sm InputBoxmn InputBoxnp InputBoxpPrint f1 m f3 n f5 pS f1 m f3 n / f5 pPrint s sEnd Sub如果在过程中有改变形式参数的值的语句如赋值语句则传值调用和传址调用方式会对实际参数造成不同的结果。
使用传址调用会改变实际参数的值。
一个函数如果改变实际参数的值则称这是一个有边界效应的函数或称有副作用的函数。
关于副作用Option ExplicitFunction F X Y As IntegerX X -Y If X 0 ThenF XElseF YEnd If ‘原意:xy时f为yxy时f为xEnd Function例7-9改变实际参数值的函数。
PrivateSubCommand1_ClickDimABA5B2Text1FAB2AText2FAB2AEndSubA为3F为3A为1F为17.5.1过程的作用域7.5.2变量作用域与生存期作用域即使用范围从作用域这个角度上来讲过程可以分为两种1.模块级过程文件级过程在模块的通用部分定义关键字Private作用域为它所在模块。
该过程在它所在模块使用有效。
2. 全局级过程工程级过程在模块的通用部分定义关键字Public作用域为整个应用程序。
该过程可以在整个应用程序中使用。
过程的作用域