VB中类的使用.docx
- 文档编号:9573441
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:15
- 大小:23KB
VB中类的使用.docx
《VB中类的使用.docx》由会员分享,可在线阅读,更多相关《VB中类的使用.docx(15页珍藏版)》请在冰豆网上搜索。
VB中类的使用
VB中类的使用
第一天:
类的概念
当您第一次看到“类”这个概念时,可能会觉得摸不着头脑。
我们先看一点我们熟悉的东西:
在VB控件工具箱中的CommandButton,这是VB中的按钮控件,是我们在VB程序中经常用到的基本控件。
我们在学习VB的类之前,单纯地就把它看成一个控件,其实,用类的观点,它就是一个类。
我们知道,所有CommandButton都有相同的属性选项,尽管对于画到窗体上去的每个按钮,这些属性的值可能不同;它们也都有相同的事件,尽管我们对画到窗体上的每个按钮的这些事件地处理可能不同;它们也都有不同的方法,尽管我们调用每个画到窗体上的按钮的方法的目的不同。
但,所有的窗体中的按钮都是CommandButton这一类控件。
我们新建一个窗体,从控件工具箱中选中CommandButton并画到窗体上,这时,窗体上就有了一个我们非常熟悉的Command1这个按钮。
我们看看Command1这个东西,按照类的观点,它现在不能再叫做一个CommandButton控件(类)了,而叫做一个按钮,是CommandButton这个控件(类)的实例。
所谓实例就是被具体化的类的一个形态,它有自己的属性,如高度和宽度,有自己的位置和大小,有自己的Caption和Name;它有自己的方法,如Move,当我们用这个方法时,谁都知道,只会移动Command1;它有自己的事件,如Click事件,当我们对Command1_Click进行代码编写后,只有Command1会调用我们对这个事件编写的代码。
每当我们在这个窗体上新画一个CommandButton,就新产生一个CommandButton的实例,每个新产生的按钮,都有自己的个性,但它们不会有CommandButton这个类所包含的属性项目以外的选择,比如Command1绝对不会有Max属性。
我们再看第二个例子,这个例子我想跳出VB的范围,回到生活中来。
比如我们常说,程序员是一类人,在这里,我们把程序员这类人就叫做一个类。
这个类有一些属性,比如Name(姓名)、EmpolderTool(使用的开发工具);这个类有一些方法,比如Empolder(开发)、Study(学习);也同样有一些事件,比如EmpolderSucceed(开发成功)、EmpolderLost(开发失败)。
我们现在来创建一个程序员类的实例,好让他可以做点事情。
(要记住,没有实例化的类,只是一种概念上的东西,这种东西是什么也不能做的,就象日常生活中我们所见到的一样:
程序员可以开发软件,但软件是由明确的属于这个类的一个实例开发出来的,比如求伯君写的WPS,求伯君是程序员这个类的一个实例,而不是这个类本身)。
下面的代码是标准的VB代码,但却是还没有实际意义的代码——因为您不要指望这段VB代码中的程序员类能为您写出一个VB程序来。
[vb]OptionExplicit
‘定义一个对象变量,并指定这个变量属于这个类
‘WithEvents使这个对象能响映事件
DimWithEventsMyDeveloperAscDeveloper
PrivateSubForm_Load()
SetMyDeveloper=NewcDeveloper‘这句一定要,这是初始化这个对象
WithMyDeveloper
.Name="求伯君"‘这个程序员叫做求伯君
.EmpolderTool="C++"‘这个程序员用C++进行开发
.Empolder‘调用Empolder方法使这个程序员进行开发工作
EndWith
EndSub
‘如果开发失败,则产生EmpolderLost这个事件
PrivateSubMyDeveloper_EmpolderLost()
WithMyDeveloper
.Study‘如果开发失败,就让这个程序员进行学习
.Empolder‘学习后再次进行开发
EndWith
EndSub
‘如果开发成功,则这个程序员成为一个优秀的程序员
PrivateSubMyDeveloper_EmpolderSucceed()
MsgBox"开发成功了!
"&&_
"成为了一个优秀的程序员",vbInformation,"恭喜"
EndSub
[/vb]
我不知道该不该拿求伯君他老人家来举例,但我想,他老人家开发WPS时一定没有我写这段代码这样简单。
如果这段代码您有什么不明白,没有关系,我在以后的例子中会进一步说明的,或者您也可以查查MSDN,当类,不要去查Study、.Empolder、EmpolderTool、cDeveloper这些东西,因为cDeveloper这个类和它的属性、方法和事件本来就是我想出来的,在MSDN中根本找不到对这些内容的支持。
您最多能找到WithEvents这些肉容的帮助。
好了,我举了两个例子,您对类的概念应该有些认识了吧。
它就是一类对象的抽象后的集合——我不知道这个定义是否是标准的,但我是这样理解的,好在这种理解并没对我在实际编写含有类模块的程序时遇到过什么麻烦。
第二天:
建立一个简单的类
在《第一天:
类的概念》中我们讲了类的概念。
今天我们就再来看看如何创建上次用过的那个cDeveloper类是怎样创建的。
首先:
我们新建一个工程,然后在“工程浏览器”中按鼠标右键,在弹出菜单中选择“添加”,在添加菜单项的下级菜单中选择“添加类模块”。
在弹出的“添加类模块”对话框中双击“VB类生成器”。
接着,我们会看见类生成器对话框。
现在我们点击工具栏上的第一个按钮,也就是添加新类的按钮。
这时,会出现类模块生成器对话框。
在这个对话框的属性选项卡上的“名称”(Name)文本框中输入cDeveloper——在这个文本框下面还有一个“基于”(BasedOn)文本框,这里我们先不去管它,以会我会讲到它的。
在这个对话框的“特性”选项卡中,有一个“描述”文本框,我们可以在里面输入对这个类的说明,比如:
“这是一个程序员类”。
然后我们按确定按钮退出“类模块生成器”对话框。
再接着我们看看原来的“类生成器”对话框中左边的树型浏览器中在原来的工程下面多了一个“cDeveloper”项。
选中这个项,点击对话框工具栏上的第三个按钮(添加属性),这时会弹出“属性生成器”对话框。
在这个对话框中的“属性”选项卡中的“名称”文本框中,我们输入:
DeveloperName(这里有一点要注意,在“第一天”的例子中,我用的是Name属性,为什么在这里要用DeveloperName呢?
因为Name是VB的保留字,如果您在这里输入了Name,VB会提示您出错的)。
然后在“名称”文本框下面的“数据类型”下拉列表中选择”String”项(注意,一定要选择,如果您是输入的,因为大小写的原因,最后生成的代码可能会有问题)。
下面的“声明”栏中的选项先不要管它,以后再说。
在这个对话框中的“特性”选项卡中的“描述”文本框中,您可以输入对这个属性的说明,比如:
“这是程序员的姓名”。
然后按确定按钮关闭这个“属性生成器”对话框。
进行了上面的操作后,我们会发现,在“类生成器”对话框右边的属性选项卡中多了一项我们才添加的这个DeveloperName属性(您的“类生成器”对话框右边的选项卡可能没有选中“属性”这一页)。
重复上面添加属性的操作,添加一个EmpolderTool属性,数据类型还是为String。
到这时为止,我们的cDeveloper类就有了两个属性了。
下面我们要为它添加两个方法.Study和Empolder。
要添加这两个方法,我们要点击“类生成器”对话框上的每四个按钮(添加新方法)。
点击后会出现“方法生成器”对话框。
在这个对话框中的“属性”选项卡中的名称文本框中,我们输入“Study”(这个文本框下面的内容(包括参数)我们先不去管它)。
然后点确定关闭这个“方法生成器”对话框。
重复上面添加方法的操作,添加一个Empolder方法。
最后,我们就剩添加两个事件了。
让我们点击“类生成器”工具栏上的第五个按钮(添加新事件),我们就会看到“事件生成器”对话框。
我们在这个对话框中的名称文本框中输入“EmpolderSucceed”,下面的参数现在不用管它,以后介绍。
重复添加新事件的操作,在我们的类中添加“EmpolderLost”事件。
现在我们的工作完成了,只要选择类生成器的“文件”菜单中的更新工程,这个cDeveloper类和它的属性、方法和事件就被添加到我们的工程中了,我们可以从“工程”浏览框中看到这个新加入的cDeveloper类模块。
双击这个类模块,我们可以看见VB为这个类模块添加了下面这些代码:
[vb]OptionExplicit
‘localvariable(s)toholdpropertyvalue(s)
PrivatemvarDeveloperNameAsString‘localcopy
PrivatemvarEmpolderToolAsString‘localcopy
‘Tofirethisevent,useRaiseEventwiththefollowingsyntax:
‘RaiseEventEmpolderLost[(arg1,arg2,...,argn)]
PublicEventEmpolderLost()
‘Tofirethisevent,useRaiseEventwiththefollowingsyntax:
‘RaiseEventEmpolderSucceed[(arg1,arg2,...,argn)]
PublicEventEmpolderSucceed()
PublicSubEmpolder()
EndSub
PublicSubStudy()
EndSub
PublicPropertyLetEmpolderTool(ByValvDataAsString)
‘usedwhenassigningavaluetotheproperty,ontheleftsideofanassignment.
‘Syntax:
=5
mvarEmpolderTool=vData
EndProperty
PublicPropertyGetEmpolderTool()AsString
‘usedwhenretrievingvalueofaproperty,ontherightsideofanassignment.
‘Syntax:
EmpolderTool=mvarEmpolderTool
EndProperty
PublicPropertyLetDeveloperName(ByValvDataAsString)
‘usedwhenassigningavaluetotheproperty,ontheleftsideofanassignment.
‘Syntax:
=5
mvarDeveloperName=vData
EndProperty
PublicPropertyGetDeveloperName()AsString
‘usedwhenretrievingvalueofaproperty,ontherightsideofanassignment.
‘Syntax:
DeveloperName=mvarDeveloperName
EndProperty
[/vb]
我使用的是英文版的VB6,所以如果您使用的是中文版的VB6,见到的代码中的注释部份和我的不同,您的是中文的注释。
第一句:
OptionExplicit。
你也可能没有,但最好请您加上,这是强制声明的选项,有了这一句之后,您的所有的变量都必须显示地声明后才能使用,这能一定程度上保证您的代码的正确性。
您如果觉得跟着我用类生成器生成这个类太繁锁,没关系,您只要象添加窗体一样新添加一个类,并双击打开它,然后把上面的这段代码Copy到它里面也可以,反正以后我会对这些生成的代码进行说明的,当您熟悉这些代码的涵义后,用代码而不用类生成器有时反而更简单。
对于这个生成的类,现在还只能对他的属性赋值,他还什么也不能做,这并不奇怪,因为我们还要添加代码告诉他该怎么做,该怎么响应事件。
下次,在学习如何添加代码来完善我们的cDeveloper的功能前,先要解决掉一些细节问题。
第三天、解决一些细节问题
在《第二天》中,我们用“类生成器”生成了一个cDeveloper类,这个类还什么也不能做,因为我们还没知诉他怎么做,这时,的cDeveloper类还象一个小婴儿,还只有一个人的样子,我们还要细心地一行一行代码地告诉他如何成为一个程序员。
在我们进一步写代码之前,我们先看看下面的一些问题——在看这些问题时,请您先把我们的类忘掉,一会儿再来说它。
下面的这些问题对您也许太简单,但我认为,讲讲这些问题对理解类模块涵义的是有好处的。
问题一、子过程
您如果建立过子过程,一定知道下面语法的意义
[vb]PublicSubname[(ParameterList)]
[statements]
[ExitSub]
[statements]
EndSub
这是创建一个子过程的语法规则,用这个规则,您可以很简单地创建一个子过程,请看下面的代码
OptionExplicit
PrivateSubForm_Load()
Quotient100,30
EndSub
PublicSubQuotient(dblDividendAsDouble,dblDivisorAsDouble)
DimdblQuotientAsDouble
dblQuotient=dblDividend/dblDivisor
MsgBox"您提供的两参数相除的结果是:
"&dblQuotient
EndSub
[/vb]
在上的代码中,Quotient是我们创建的一个子过程。
为什么要创建这个子过程本来并不是我们在这里要讨论的问题,但我还是在这里再说几句。
您也许会说把这个子过程中的内容放在Form_Load中一样可以而且还可以更简化代码。
的确的,如果您的整个程序中只调用一次这种简单运算时,可以不象这样写,但如果有很多地方要用到这同一功能,而且这个功能也并不象上面代码中的简单的数学计算,而是一个相当复杂的功能时,根据程序模块化的原则,因该象上面一样把这些可重用的代码写成单独的模块,建立子过程和下面要提到的函数过程就是这其中的两种基本方法。
问题二、函数过程
我现在要对上面的代码进行一些修改:
[vb]PrivateSubForm_Load()
MsgBox"您提供的两参数相除的结果是:
"&Quotient(100,30)
EndSub
PublicFunctionQuotient(dblDividendAsDouble,dblDivisorAsDouble)AsDouble
Quotient=dblDividend/dblDivisor
EndFunction
‘我们可以看到,Quotient现在已经可以返回一个值了,因为它已不再是子过程,而是一个函数过程了。
‘函数过程的语法可以写成下面这样:
PublicFunctionname[(ParameterList)]AsDataType
[statements]
[ExitFunction]
[statements]
EndFunction[/vb]
问题三、变量的作用范围。
当我们用Private声明一个变量时,这个变量是模块级(modulelevel)的变量,只有这个模块中的代码可以访问这个变量,对于模块外的调用,是不可用的。
Optional.Keywordusedatmoduleleveltodeclareconstantsthatareavailableonlywithinthemodulewherethedeclarationismade.Notallowedinprocedures
当我们用Public声明一个变量时,这个变量是也是模块级的变量,但他可以从所有的过程中所有的模块中调用。
我们常称Public声明的变量为全局变量。
Optional.Keywordusedatmoduleleveltodeclareconstantsthatareavailabletoallproceduresinallmodules.Notallowedinprocedures.
下面,我们来重新回到我们建立的cDeveloper类模块上来。
看看《第二天》中生成的那段代码吧:
我把由类生成器生成的注释删除,只留下实际的代码。
[vb]OptionExplicit
‘下面这两句是用Private定义的cDeveloper类模块的内部变量,在这个类模块以外是无法访问这两个变量的,这两个变量是用来存储DeveloperName和EmpolderTool的值的。
PrivatemvarDeveloperNameAsString
PrivatemvarEmpolderToolAsString
‘下面这两句是定义的两个事件,语法很简单,不是吗?
如果这个事件象MouseMove这种事件一样是要带参数的,可以用PublicEventEventName(Parameter1asParameterType,Parameter2asParameterType)这种方式来声明这个事件。
PublicEventEmpolderLost()
PublicEventEmpolderSucceed()
‘下面分别声明的是两个方法,通过上面的讨论,您可以看出来,这其实就是一个子过程。
当您的方法是要返回值的时候,您就要把下而的子过程改写成一个函数过程,也就是把其中的Sub改成Function,并且声明返回值的类型,您也可以在“()”中加入要传递进去的参数。
PublicSubEmpolder()
EndSub
PublicSubStudy()
EndSub
[/vb]
下面的语句可以分为两种:
一种是PropertyLet语句,当你对这个类的实例指定属性值时,这些PropertyLet语句会把您指定的值保存到这个实例的相应的内部变量(前面提到的)中。
相当于=strMyString
另一种是ProportyGet语句,当您读取这个类的实例的属性值时,这些PropertyGet语句会把您保存在它的相应的内部变量中的值读出并返回给您。
相当于strMyString=
这两种语句对于同一属性来说一般是成对出现的。
这是一种理想情况,就是说这个属性可读可写。
您有没有注意到,在VB中,有些控件的属性是只读的,比如我们用=“cmd”这一句对Command1按钮的Name属性赋值时,是不会成功的。
要让我们的类也有只读属性要怎么做呢?
只要删除这个属性相关的PropertyLet语句就可以了。
[vb]PublicPropertyLetEmpolderTool(ByValvDataAsString)
mvarEmpolderTool=vData
EndProperty
PublicPropertyGetEmpolderTool()AsString
EmpolderTool=mvarEmpolderTool
EndProperty
PublicPropertyLetDeveloperName(ByValvDataAsString)
mvarDeveloperName=vData
EndProperty
PublicPropertyGetDeveloperName()AsString
DeveloperName=mvarDeveloperName
EndProperty[/vb]
当然,除了ProportyGet和PropertyLet语句以外,您也可能会见到另一种ProportySet语句,那是当您的类的属性的数据类型为Variant或者别的对象变量(比如)时会用到的。
从上面的讨论,我们可以得出下面的结论:
其实类模块就是由:
一些变量、一些事件声明语句、一些Sub过程(为了和一般的Sub过程相区别,为了表明这是我们自定义的过程,我把它们叫做子过程)或一些函数过程、PropertyLet语句、PropertyGet语句组成。
这次,我们了解了类生成器给我们生成的这些东西的意义了,下次,我们将着手添加代码,让这个类能真的做点事。
第四天、建立能做点事的类
下面是我们在《第二天》里建立的cDeveloper类的代码框架,我将在这段代码里直接加上一些新的代码,让它能做一点事件。
请注意比较下面的代码与《第二天》中的代码有什么不同。
[vb]
OptionExplicit
‘localvariable(s)toholdpropertyvalue(s)
PrivatemvarDeveloperNameAsString‘localcopy
PrivatemvarEmpolderToolAsString‘localcopy
‘Tofirethisevent,useRaiseEventwiththefollowingsyntax:
‘RaiseEventEmpolderLost[(arg1,arg2,...,argn)]
PublicEventEmpolderLost()
‘Tofirethisevent,useRaiseEventwiththefollowingsyntax:
‘RaiseEventEmpolderSucceed[(arg1,arg2,...,argn)]
PublicEventEmpolderSucceed()
PublicSubEmpolder()
DimintSucceedAsInteger‘Msgbox返回的是Integer变量,所以这里定义为Integer变量,您当然也可以定义它为Long,因为Long的存储空间大于Integer.
MsgBox"现在进行开发"
intSucceed=MsgBox("开发成功了吗?
",vbYesNo+vbQuestion+vbDefaultButton2,"问题")
IfintSucceed=vbYesThen‘vbYes是一个VB常量,它的值是一个Integer型的数据.
RaiseEventEmpolderSucceed‘如果开发成功,则激发EmpolderSucceed事件
Else
RaiseEventEmpolderLost‘如果没有开发成功,则激发EmpolderLost事件
EndIf
EndSub
PublicSubStudy()
MsgBoxmvarDeveloperName&":
请您进一步学习您的"&mvarEmpolderTool&"开发工具",vbInformation,"注意"
‘在这里,您看到了对mvarDeveloperName和mvarEmpolderTool的调用,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 使用