【VB开源代码栏目提醒】:网学会员VB开源代码为您提供VB应用程序结构 - 培训资料参考,解决您在VB应用程序结构 - 培训资料学习中工作中的难题,参考学习。
第七章
VB应用程序结构
学习目标1、掌握Sub过程、Function过程、Event过程和通用过程2、理解
VB应用程序的结构3、了解程序调试技术学习要点模块、过程、程序调试模块
VB提供了三种类型的模块窗体模块、标准模块和类模块。
不论何种模块都可包含声明、过程窗体模块文件扩展名frm。
是
VB应用程序的基础。
可以包含处理事件的过程、通用过程以及其变量、常数、自定义类型和外部过程的窗体级声明。
窗体的事件过程是为响应该事件而执行的程序段。
窗体的通用过程是对来自该窗体中任何事件过程的调用作出响应。
标准模块是程序中一个独立容器包含全局变量、Function过程和Sub过程。
文件扩展名为.bas。
一个过程可能用来响应几个不同窗体对象中的事件则应该将这个过程放在标准模块中。
标准模块中包含应用程序内的允许其它模块访问的过程和声明。
标准模块的使用使用标准模块能够实现在整个程序中共享变量和过程。
标准模块包含能够在程序任何地方使用的变量和过程的特殊文件。
只包含可在
代码窗口中显示和编辑的
代码。
声明公用变量在标准模块中声明全局变量只需键入关键字public后跟变量名。
可以用AS指定变量的类型。
标准模块的创建、保存和删除。
注意删除操作并未将该模块从硬盘中删除但删除了该模块与当前工程之间的链接。
类模块在
VB中类模块文件扩展名为.cls是面向对象编程的基础。
它既包含
代码又包含数据。
可以在类模块中编写
代码建立新对象。
这些新对象可以包含自定义的属性和方法。
用类模块创建对象这些对象可被应用程序内的过程调用。
模块化
设计VB应用程序呈层次结构。
典型应用程序包含若干模块应用程序中每个窗体的窗体模块、共享
代码的标准模块和类模块。
每个模块包含若干含有
代码的过程Event过程、Sub过程或Function过程及Property过程。
过程组成模块的
代码片段称为过程。
VB中过程基本分为函数过程、子过程、属性过程、通用过程使用过程编写程序的优点消除了重复语句行、使程序更易于阅读、简化了程序开发、其它程序可重复使用该通用过程和扩展
VB语言。
函数过程用来完成特定的功能并返回相应的结果。
其它过程可按名称调用函数过程。
这类过程一般用于完成计算任务。
函数过程能接受参数并总是以该函数名返回一个值。
子过程是没有返回值的函数。
本书又称Sub过程。
其它过程可以按名称调用子过程。
子过程能接收参数并可用于完成过程中的任务并返回一些数值。
与函数过程不同子过程不返回与其特定子过程名相关的值。
子过程一般用于接收或处理输入数据。
属性过程和通用过程用来创建和操作程序中用户定义的属性。
它能定制现有的
VB控件并通过创建新的对象属性和方法来扩展
VB语言。
通用过程允许把一个经
常用到的过程以熟悉的名称写入某个标准模块中。
子过程语法PrivatePublicFriendStaticsub过程名参数 程序段 Exit Sub 程序段 End Sub子过程的参数说明一Public:表示所有模块的所有其它过程都可以访问这个sub过程。
Private:只有在包含其声明的模块中的其它过程可以访问该过程。
Friend:只能在类模块中使用。
该SUB过程在整个工程中都是可见的。
Static:表示在调用之间保留SUB过程的局部变量的值。
Static属性对在SUB外声明的变量不会产生影响。
子过程的参数说明二过程名是必需的。
参数表是可选的。
SUB过程可以是递归的。
所有的可执行
代码都必须是属于某个过程不能在别的SUB、Function或Property过程中定义Sub过程。
Exit Sub从一个Sub过程中退出。
程序接着从调用该Sub过程的语句下一条语句执行。
与Function过程不同的是Sub过程不能用于参数是表达式。
子过程的参数说明三可以使用过程名并跟相应的参数列表来调用一个sub过程。
SUB过程中使用的变量分为两类一类是在过程内显式定义的另一类则不是。
避免出现变量重名引起冲突。
不能使用GosubGoto或Return来进入或退出sub过程。
每次调用过程都会执行sub和End Sub之间的语句块、类模块和窗体模块中。
子过程的参数说明四在过程调用中发送到子过程的参数值和类型必须与子过程声明语句中参数数值和类型相符。
将变量传递给过程被称为传递引用参数因为变量能够被过程修改并返回给程序。
将文字值传递给过程被称为传递传值参数。
子过程的调用在程序中调用子过程需要指明该过程的名称然后列出该子过程所要求的参数。
可以使用文字字符串调用子过程。
可以使用变量调用子过程。
通用过程建立的理由之一就是几个不同的事件过程也许要执行同样的动作。
将公共语句放入通用过程并由事件过程来调用它这样就不必重复
代码。
通用过程包含在标准模块中可由程序中任何部分调用。
通用过程与事件过程不同因为它并不与某个运行事件或使用工具箱控件创建的对象相关联。
事件过程
VB应用程序是事件驱动的应用程序事件是窗体或控件所能识别的动作。
在响应事件时应用程序执行
代码。
VB的每一个窗体和控件都存在一个预定义的事件集。
一个控件的事件过程将控件的实际名字、下划线和事件名组合起来。
一个窗体事件过程将FORM、下划线和事件名组合起来。
Function过程可用Function 语句编写自己的过程。
定义一个函数后可以在任何表达式、语句或函数中引用它函数过程位于unction和End Function之间的在标准模块中声明的函数在缺省状态下是共用函数。
函数过程的语法语法PrivatePublicFriendStaticFunction nameArglistAs 数据类型 程序段 nameexpression Exit Function 程序段 nameexpression End Subunction过程说明一Name是function过程的名称。
rglist代表在调用时要传递给Function过程的参数变量列表多少个参数变量应用逗号隔开。
数据类型是过程返回值的数据类型。
Expression 是function的返回值。
unction过程说明二Function过程可以是递归的。
所有的可执行
代码都必须是属于某个过程不能在别的SUB、Function或Property过程中定义Function过程。
Exit Function语句使执行一个Function过程中退出。
程序接着从调用该Function过程的语句下一条语句执行。
unction过程说明三与SUB过程一样Function过程也是一个独立的过程可读取参数、执行一系列的语句并改变参数。
与子过程不同Function过程返回一个值到调用的过程。
Function与子过程的区别语句或表达式的右边包含函数过程名和参数这就调用了函数。
与变量完全一样函数过程应该定义返回值的数据类型。
给functionname 赋一个值就可返回这个值。
Function过程返回一个值时该值可成为表达式的一部分。
函数值的返回一Function HypotenuseA as integer B as integer HypotenuseSqrA2B2 end function Label1.captionHypotenuseCinttext1.text_Cinttext2.text strxHypotenusewidthheightFunction过程返回一个值该值成为表达式的一部分。
函数值的返回二Function Totalcost T1cost0.05 T2cost0.015 Total1T1T2 End Function 以函数的名称返回给调用过程一个值。
函数返回的缺省值要从函数返回一个值只需将该值赋给函数名即可。
如果没有对name赋值则过程将返回一个缺省值数值函数返回“0”字符串函数返回一个零长度字符串“”Variant函数则返回Empty. 如果在返回对象引用的Function过程中没有将对象引用赋给name通过set则函数返回Nothing.过程的使用创建过程选择过程调用过程调用函数过程调用其它模种的过程创建新过程要创建新的通用过程在“
代码”窗口输入过程头并按下回车键。
过程头以Sub 或Function打头再接一个名字。
如Sub UpdateForm Function GetCoord 选择现有过程查看现有“通用过程”或“事件过程”在“
代码”窗口的“对象框”中选择适当的对象然后在“过程框”中选择事件。
查看其它模块中的过程1、“视图”菜单中选取“对象浏览器”。
2、在“工程/库”框中选择工程。
3、在“类/模块“
列表中选择模块并在“成员”列表中选择过程。
4、单击右键在弹出菜单中选取“查看定义”查看选中的过程。
调用过程——Sub过程Call MyProcFirstArgument SecondArgumentMyProc FirstArgumentSecondArgument说明当使用CALL语法时参数必须在括号内。
若省略Call关键字则必须去掉参数两边的括号。
调用过程——函数过程在表达式上写上函数过程的名字。
用Call调用。
用函数名再带上参数的形式调用。
注意当用后两种方法调用时则函数放弃了返回值。
调用窗体模块中的过程调用其它模块中的过程的各种方法取决于该过程是在窗体模块中、类模块中还是标准模块中。
所有窗体模块的外部调用必须指向包含此过程的窗体模块。
如call Form1.SomeSub调用Form1中的SomeSub过程。
调用类模块中的过程在类模块中调用过程要调用与过程一致并且指向类实例的变量。
例如DemoClass是类Class1的实例Dim DemoClass as New Class1 DemoClass.SomeSub注意在引用一个类的实例时不能用类名作限定符。
必须首先声明类的实例为对象变量并用变量来引用它。
使用标准模块中的过程如果过程名是唯一的则不必在调用时加模块名。
无论在模块外还是内结果总会引用这唯一过程。
如果两个以上的模块都包含同名的过程那就必须使用模块名进行限定。
如在Module1中调用Module2中同名的CommonName过程Module2.CommonNameGosub……Return语句在一个过程中利用Gosub…Return语句可以调用该子过程中的某段子程序执行完毕后再返回。
语法Gosub line Line Return注意Gosub和return必须放在同一过程中。
一个子程序中可以包含一个以上的Return语句但是当碰到第一个Return语句时程序就会返回到紧接在刚刚执行的GoSub语句之后的语句继续执行。
不能使用Gosub…Return来进入或退出Sub过程。
Gosub…Return实例Sub GosubDemo Dim Num NumInputBox“Enter a positive number to be divided by 2.” if Num0 Then Gosub MyRoutine Debug.print Num Exit sub MyRoutine: NumNum/2 Return End sub过程参数传递过程通常需要某些程序当前状态的信息才能完成它的
工作。
程序当前状态信息也包含在调用过程时传递到过程内的变量。
当将变量传递到过程时成变量为参数。
过程的参数类型缺省为Variant 数据类型。
不过也可以声明参数为其它数据类型。
按地址传递参数按地址传递参数使得过程通过变量的内存地址去访问实际变量的内容。
将变量传递给过程时在过程中可改变变量的值。
按地址传递参数在
VB中是缺省的。
当变量通过地址传递时对变量的任何修改都被传递给调用过程。
地址传递参数实例Sub CostPlusInterestcostTotal CostCost1.05 TotalIntCost End Sub …. Price100 Total0 CostPlusInterest PriceTotalPrint price “at 5 interest is ” Total程序的运行结果是105 at 5interest is 105按值传递参数按值传递参数传递的只是变量的副本。
如果过程执行过程中改变了这个值则所作变动只影响副本而不会影响变量本身。
使用ByVal关键字指出参数是按值来传递的。
如Sub CostPlusInterestByVal CostTotal 此时程序运行的结果是100 at 5 interest is 105使用可选的参数在过程的参数列表中列入Optional关键字就可以指定过程的参数为可选的。
如果指定了可选参数则参数表中此参数后面的其它参数也必是可选的并且要用optional关键字来声明。
在未提供某个可选参数时实际上将该参数作为具有Empty值的变体来赋值。
程序的调试目的帮助程序员找出程序中的错误并及时修改。
一个程序员无论如何小心规划自己的工程如何仔细绘制流程图然后再编写
代码也无法保证应用程序一次能运行成功。
程序示例Private sub form_load dim j as integer j1 for I1 to 10 step 1 jjI print j next end subVB6中的错误类型语法错误是由于指令或者程序没有遵守
VB6的语法规则时发生的一类错误通常是由于录入的错误引起的。
执行错误当
VB执行到一条不能执行的语句时就会产生一个执行错误然后自动进入中断模式加亮错误语句。
逻辑错误是由于编程中的逻辑错误引起的不过逻辑错误仍然会输出一个结果只不过这个输出的结果与预期的结果会不符合。
语法错误示例Private sub form_load dim I j as double I2.71828 j3.14159 msgbo “ij“ I jVbdefaultbutton3”
VB6语法错误”End sub执行错误示例Private sub form_load dim I as integer form1.autoredrawtrue I100 do while I0 II-21 print sqrI loop End sub 逻辑错误示例Private sub form_load dim I as double dim j as double form1.autoredrawtrue j1 for I1 to 20 jjI II1 if intI mod 20 then print end if print j next End sub