过程,模块,函数,类,他们有什么不同?
vb的代码存储在模块中。在VB中提供了三种类型的模块:窗体模块、标准模块和类模块。
简单的应用程序可以只有一个窗体,所用的程序都驻留在窗体模块中,而当应用程序庞大复杂时,就要另外附加窗体。最终可能有几个窗体中有一些共同都要执行的代码,为了在两个窗体中不产生重复代码,可创建一个独立的模块,用它实现代码公用。该独立模块即是标准模块。此外还可以建立包含共享代码与数据的类模块。
每个标准模块、类模块和窗体模块可包含:
声明。可将常数、类型、变量和动态链接库(DLL)过程的声明放在窗体、类或标准模块的声明部分。每个模块只有一个声明部分
过程。每个模块可有多个过程,过程是划分VB代码的最小单元,每个过程是一个可执行的代码片段。VB中主要有子过程、函数过程或者属性过程等
各种模块类型
1.窗体模块
由于VB是面向对象的应用程序开发工具,所以应用程序的代码结构就是该程序在屏幕上表示的对应模型。根据定交,对象包含数据和代码。应用程序中的每个窗体都有一个相对应的窗体模块(文件扩展名为.frm)
窗体模块是VB应用程序的基础。窗体模块可以包含处理事件的过程、通用过程以及变量、常数、自定义类型和外部过程的窗体级声明。写入窗体模块的代码是该窗体所属的具体应用程序专用的;也可以引用该程序内的其它窗体和对象
每个窗体模块都包含事件过程,在事件过程中有为响应该事件而执行的程序段。窗体可包含控件。在窗体模块中,对窗体上的每个控件都有一个对应的事件过程集。除了事件过程,窗体模块还可包含通用过程,它对来自该窗体中任何事件过程的调用都作出响应。
2.标准模块
标准模块是程序中的一个独立容器,包含全局变量、Function(函数)过程和Sub过程(子过程)。
可将那些与特定窗体或控件无关的代码放入标准模块中。标准模块中包含应用程序内的允许其它模块访问的过程和声明。它们可以包含变量、常数、类型、外部过程和全局声明或模块级声明。写入标准模块的代码不必固定在特定的应用程序上;
(1)使用标准模块
在编写程序时,很可能会遇到一些使用相同变量和例程的窗体和事件过程。在缺省状态下,变量对于事件过程来说是局部的,就是说仅能在创建这些变量的事件过程中读取或者修改变量。与之相似,事件过程对于创建它们的窗体来说也是局部。为了在工程中的所有窗体和事件中共享变量和过程,需要在该工程的一个或多个标准模块中对它们进行声明和定义。
标准模块或代码模块是具有文件扩展名.bas,并包含能够在程序任何地方使用的变量和过程的特殊文件。
正如窗体一样,标准模块被单独列在Project(工程)窗口内,并可通过使用File(文件)菜单中的SaveModulelAs菜单项存盘。但是,与窗体不同,标准模块不包含对象或属性设置而只包含可在代码窗口中显示和编辑的代码。
(2)创建标准模块
如要在程序中创建新的标准模块,那么单击工具条AddForm(添加窗体)按钮上的下箭头并单击Mode(模块),或者单击Project(工程)菜单中的AddModule(添加模块)菜单项。在工程中创建一个空的标准模块的步骤如下:
S1:启动VB,打开一个新的标准工程,单击工程菜单中的AddModule菜单项,单击Open按钮。VB在工程中增加一个名为Module的标准模块。该模块对应的代码窗口被打开,对象和过程列表框的内容表明该标准模块的通用声明已被打开。在此所声明的变量与过程在整个程序都可以使用。
S2:双击工程资源管理器窗口的标题条,以便能看到整个工程资源管理器窗口,
S3:在File(文件)菜单中,单击SaveModulelAs
S4:如果D:\VB6sbs\less10文件夹未被选择时,选择该文件夹,键入MyTestMod.bas,然后按回车。该标准模块作为MyTestMod.bas文件保存到磁盘,并且可以通过Project(工程)的AddFile菜单项可将此文件通过其文件名加载到另一个工程中。
S5:双击Project(属性)窗口标题条。由于模块不包含对象,因此它惟一的属性就是Name
S6:将Name属性改为modVariables,然后按ENTER键。
(3)声明公用变量
在标准模块中声明全局变量十分简单,键入关键字Public,后跟该变量名。
缺省状态下,公用就量在模块中被声明为变体类型,但是可以通过使用As关键字来指定相应类型,可以把公用变量声明为某个指定的基本类型。
3.类模块
在VB中类模块是面向对象编程的基础。可以在类模块中编写代码建立新对象。这些新对象可以包含自定义的属性和方法。实际上,窗体正是这样一种类模块,在其上可安放控件,可显示窗体窗口
用类模块创建对象,这些对象可被应用程序内的过程调用。标准模块只包含代码,而类模块包含代码又包含数据,可视为没有物理表示的控件。
模块设计的考虑
在VB中创建应用程序的最重要的部分是设计阶段。首先需要为应用程序设计一个用户界面,这个界面的设计比较容易确定。但设计代码的结构就是一项较复杂的工作。构造应用程序的方法不同,可能会造成应用程序的性能以及代码的可维护性,可使用性不同。
VB应用程序呈层次结构。典型应用程序包括若干个模块:应用程序中每个窗体的窗体模块、共享代码的标准模块和类模块。每个模块包含若干含有代码的过程:Event过程,Sub过程或Function过程及Property过程。
在很多情况中都存在着多个对象共享的重复过程。这种情况最好创建一个共享的子过程,使大家都可以调用它。即使将来修改这些子程序,则只在一个地方修改就可进行全部修改,这将大大提高程序的可读性和可维护性。可以把所有的共享操作放在标准的模块中。
代码编辑器
VB代码编辑器是一个窗口,大多数代码都在此窗口上编写。有许多便于编写VB代码的功能。在每个模块中,对于模块中包含的每个对象,将模块中的代码再细分出与对象对应的独立部分用"对象列表框"实现各对象间的切换。对于模块,列表包含一个通用段和一个类段;对于标准模块,只有一个通用段被显示。每一段代码都可包含若干个用"过程列表框"访问的不同过程。对窗体或控件的每一个事件过程,窗体模块的过程列表都包含一个独立的段。类模块只列举本身的事件从初始化到终止。标准模块的过程列举任何事件过程,因为标准模块不支持事件。模块通用段的过程列表只包含声明段,其中放置模块级的变量、常数和DLL声明
VB代码编辑器的一些功能和用法:
1.自动完成编码
VB能自动填充语句、属性和参数,这些性能使编写代码更加方便。在输入代码时,编辑器列举适当的选择。通过"工具"菜单上的"选项"命令访问"选项"对话框,在"选项"对话框的"编辑器"选项卡上可以选择"自动列出成员特性",由它们决定是允许还禁止代各码的设置值。在代码中输入一控件名时,"自动列出成员特性"会显示出这个控件的下拉式属性表。键入属性名的前几个字母,就会从表中选中该名字,按Tab键将完成输入。当不能确认给定的控件有什么样的属性时,这个选项是非常有帮助的。即使选择了禁止"自动列出成员特性",仍可使用CTRL+J组合键得到这种性能。
"自动快速信息"功能可显示语句和函数的语法。
在代码编辑器中书签可用来标记代码的某些行,以便以后可以很容易地返回这些行。书签开关的切换以及定位到已有书签的命令可以在编辑菜单中书签选项中得到。
一个应用程序是由若干模块组成的,而每个模块又是由若干个更小的代码片段组成,将组成这些模块的代码片段称为过程。通过过程,可以将整个程序按功能进行分块,每个过程用来完成一项特定的功能。使用过程来组织代码,不仅可以使程序的结构更加清晰,而且便于查找和修改代码。当在其它工程中使用某个相同功能时,可以将过程作为可重用的代码,直接拿到该工程中使用。
1.VB是过程基本分类:
函数过程(Functi9onProcedure):函数过程用来完成特定的功能并返回相应的结果。在事件或其它过程中可按名称调用函数。函数过程能够接收参数,并且总是以该函数名返回一个值。这类过程一般用于完成计算任务。
子过程:子过程是没有返回值的函数。在事件过程或其它过程中可按名称调用子过程。子过程能够接收到参数,并可用于完成过程中的任务并返回一些数值。但是,与函数过程不同,子过程不返回与其特定子过程名相关联的值。子过程一般用于接收或处理输入数据、显示输出或者设置属性。
属性过程:属性过程用来创建和操作程序中用户定义的属性。这是一种有用的,在某种程度上相当高级的特性,它使能够定制现有的VB控件并通过创建新的对象,属性和方法来扩展VB语言
通用过程:允许把一个经常用到的过程以熟悉的名称写入某个标准模块中。
2.使用过程编程的优点
消除了重复语句行。
使程序更易阅读。
简化了程序开发
其它程序可重复使用该通用过程
扩展VB语言
子过程是在响应事件时执行的程序段。将模块中的代码分成子过程后,在应用程序中查找和修改代码变得更容易了,子过程类似于用户自定义函数,不同之处是子过程不返回与其名称相关联的值,子过程一般用来从用户那里得到输入数据、显示或打印信息,或者操纵与某一条件相关的几种属性。子过程也用来在过程调用中处理和返回若干个变量。
1.子过程的语法
(1)子过程语法
[Private|Public|FrIEnd][Static]Sub过程名[(参数表)]
[程序段]
[Exitsub]
[程序段]
EndSub
Sub语句的语法包含下面部分:
Public可选的。表示所有模块的所有其它过程都可访问这个Sub过程。如果在包含OptionPrivate的模块中使用,则这个过程在该工程外是不可使用的
Private可选的。表示只有在包含其声明的模块中的其它过程可以访问该Sub过程
Friend可选的。只能在类模块中使用。表示该Sub过程在整个工程中都可见的,但对对象实例的控件者是不可见的。
Static可选的。表示在调用之间保留Sub过程的局部就量的值。Static属性对在Sub外声明的变量不会产生影响,即使过程中也使用了这些变量。
过程名是必需。Sub的名称遵循标准的变量命名约定。
参数表是可选的。代表在调用时要传递给Sub过程的参数的变量列表。多个变量由用逗号隔开
需要说明:
如果没有使用Private,Public或Friend,Sub过程在缺省情况是公用的。如果没有使用Static,则在调用之后不会保留变量的值。Friend关键字只能在类模块中使用。不过Friend过程可以被工程的任何模块中的过程访问。Friend过程不会在其父类的灯型库中出现,且Friend过程不能被后期绑定。
2.Sub过程可以是递归的,也就是说,该过程可以调用自己来完成某个特定的任务。不过,递归可能会导致堆栈上溢。通常Static关键字和递归的Sub过程不在一起使用。
3.所有的可执行代码都必须属于某个过程,不能在别的Sub,Function或Property过程中定义Sub过程。
4.ExitSub语句使执行从一个Sub过程中退出。
5.Sub过程与Function过程的相似之处是:它们都是一个可以获取参数,执行一系列语句,以及改变其参数的值的独立过程。而与Function过程不同的是Sub过程不能用于表达式
6.可以使用过程名并后跟相应的参数列表来调用一个Sub过程。
7.在Sub过程中使用的变量分类为两类:一类是在过程内显示定义的,另一类则不是。
8.不能使用GoSub,GoTo或Return来进入或退出Sub过程
9.每次调用过程都会执行Sub和EndSub之间的语句块。可以将子过程放入标准模块、类模块和窗体模块中。
10.在过程调用中,发送到子过程的参数值和类型必须与子过程声明语句中参数值和类型相符
11.将变量传递给过程被称为传递称为引用参数,因为变量能够被过程修改并返回给程序。
(2)调用子过程
在程序中调用子过程需要指明该过程的名称,然后列出子过程所要求的参数。例如,要使用文字字符串调用AddNameToListBox过程,可以键入如下语句:AddNameToListBox"Kimberly"与之相似,通过键入如下语句可以使用变量来调用该过程AddNameToListBoxNewName$
在这两种情况下,AddNameToListBox过程在列表框中添加确定的名称。在该过程中,按值调用和按址调用肝产生相似的结果,因为在过程中并未修改该参数。
(3)使用子过程管理输入
在程序中,当信息来自于两个或多个来源,并需要采用相同格式时同,就往往使用子过程处理所输入的信息。
2.通用过程
通用过程表示如何完成一指定的任务。一旦定义了通用过程,可由其他过程来调用。建立通用过程的理由之一就是几个不同的事件过程也许要执行同样的动作。将公共语句放入通用过程,并用事件过程来调用它,这样就不必重复代码,也容易维护应用程序。
通用过程包含在标准模块中,它可由程序中任何部分调用。通用过程与事件过程不同,因为它并不与某个运行事件或使用工具箱控件创建的对象相关联。通用过程与VB的内建语句和函数类似,它们都名称调用、可接收参数、并且分别完成一特定任务。
3.事件过程
VB应用程序是事件驱动的应用程序,事件是窗体或控件所能识别的动作。在响应事件时,应用程序执行代码。VB的每一个窗体和控件都存放在一个预定义的事件集。运行应用程序时,当某个事件发生,而且在与该事件关联的过程中存在代码,则VB就会调用该事件过程。因为事件过程的过程名在对象和代码之间建立了联系,所以可以说事件过程是附加在窗体和控件上的。
每个事件对应一个事件过程,如果让控件响应事件时就要把相应的代码写入到这个事件的事件过程中。一个控件的事件过程将控件的实际名字、下划线(_)和事件名组合起来。
控件事件的语法和窗体事件的语法
PrivateSubcontrolnake_eventname(参数表)
ExitSub
EndSub
PrivateSubForm_eventname(参数表)
ExitSub
EndSub
Function过程
VB包含内置的或内部的函数,还可用Function语句编写自己的Function过程。在定义了一个函数之后,可以像调用任何一个VB的内部函数一样使用它,即可以在任何表达式,语句或函数中引用它。
函数过程是标准模块中位中Function语句与EndFunction语句之间的一系列语句。函数中的这些语句完成附某些有意义的工作,一般是处理文本,进行输入或计算一个值。通过将函数名与便条所需的参数一起置于一条程序语句中,可以调用该函数。换句话说,使用函数过程与使用内置函数(比如Time,Int或Str等)的方法完全相同。
每个函数完成一种服务,比如进行计算并返回一个值。
在标准模块中声明的函数在缺省的状态下是公用函数,它们可在任何事件中过程中使用。
1.函数过程的语法
[Public|Private|Friend][Static]FunctionName[(Arglist)][As数据类型]
[程序段]
[Name=Expression]
[ExitFunction]
[程序段]
[Name=Expression]
EndFunction
Function语句的语法包含下面部分:
Public表示所有模块的所有过程都可访问这个Function过程。如果是在包含OptionPrivate的模块中使用,则这个过程在该工程外是不可使用的。
Private表示只有包含其声明的模块的过程要以访问该Function过程。
Friend只能在类模块中使用。表示该Function过程在整个工程中都是可见的,但对于对象实例的控制者是不可见的。
Static表示在调用之间将保留Function过程的局部变量值。Static属性对在该Function外声明的变量不会产生影响,即使过程中也使用了这些变量。
Name是Function的名称;遵循标准的变量命名约定。
Arglist代表在调用时要传递给Function过程的参数变量列表,多个参数变量应用逗号隔开。
数据类型是Function过程的返回值的数据类型,可以是Byte,Boolean,Integer,Long,Currency,Single,Double,Date,Strig(不包含定长字符串),Object,Variant或任何用户定义类型。
程序段是在Function过程中执行的任何语句块。
Expression是Function的返回值。
其中的参数表,参数的语法以及语法各个部分如下:
[Option][ByVal|ByRef][PaRAMarrAy]Varname[()][As数据类型][=defaultvalue]
Optional表示参数不是必需的。如果使用了该选项,则Arglist中的后续参数都必须是可选的,而且必须都使用Optional关键字声明。如果使用了ParamArray,则任何参数都不能使用Optional声明。
ByVal表示该参数按值传递。
ByRef表示该参数按地址传递,ByRef是VB的缺省选项。
ParamArray只用于Arglist的最后一个参数,指明最后这个参数是一个Variant元素的Optional数组。
Varname代表参数的变量的名称;遵循标准的变量命名约定。
数据类型表示传递给该过程的参数的数据类型;可以是Byte,Boolean,Integer,Long,Currency,Single,Double,Date,String,Object或Variant.
defaultvalue表示任何常数或常数表达式,只对于Option参数时是合法的。如果类型为Object,则显示缺省值只能是Nothing
简要说明如下:
1.如果没有使用Public,Private或Friend显示指定,则Function过程为公用。如果没有使用Static,则局部变量的值在调用之后不会保留。Friend关键字只能在类模块中使用。但Friend过程可以被工程的任何模块中的过程访问。Friend过程不会在其父类的类型库中出现。
2.Function过程可以是递归的;也就是说,该过程调用自己来完成某个特定的任务。不过,递归可能会导致堆栈上溢。通常Static关键字和递归Function过程不在一起使用
3.所有的可执行代码都必须属于某个过程。
4.ExitFunction语句使执行立即从一个Function过程中退出。
5.与Sub过程一样,Function过程是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与子过程不同,Function过程也返回一个值到调用的过程。Sub过程与Function过程之间有三点区别:
语句或表达式的右边包含函数过程和参数,这就调用了函数
与变量完全一样,函数过程应该定义返回值的数据类型
给Functionname赋一个值,就可返回这个值。Function过程返回一个值时,该值可成为表达式的一部分
例如,下面是已知直角三角形两直角边的值,计算斜边的函数。
functionhypotenuse(Aasinteger,Basinteger)asstring
hypotenuse=sqr(A^2+B^2)
Endfunction
在VB中调用function过程的方法和调用任何内部函数的方法是一样的:
label1.caption=hypotenuse(Cint(text1.text),cint(text2.text))
strX=hypotenuse(width,height)
函数总是以该函数的名称返回给调用过程一个值。因此,函数中的最后一行语句往往是将函数的最终计算结果放入functionname中的赋值语句。例如,下文中的函数过程total1用来为某个工程计算,然后将结果赋值给total1名。
functiontotal1(cost)
t1=cost*0.05
t2=cost*0.015
total1=t1+t2
endfunction
如果没有对name赋值,则过程将返回一个缺省值:数值函数返回0,字符串函数返回一个零长度字符串(""),variat函数则返回empty。如果在返回对象引用的function过程中没有将对象引用赋给name(通过set),则函数返回nothing。
2.调用函数过程
在事件过程中调用函数Total1时,使用与下文相类似的语句:S1.Caption=TotalTax(500).该语句计算Cost值为500时Total的值,然后将结果赋值给S1对象的Caption(标题)属性。
编程和代码有什么区别?
编程包括分析实际问题,并找到其算法,最后来用代码在数据的表述和结构的基础上对算法做具体描述。而写代码则没有分析转换过程。
本回答由提问者推荐