




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于VB的COM编程入门教程第一节COM简介
"世上无难事,只要肯登攀",所以你要有信心成为一个COM程序员,而且你一定能。事实上,我们每次设置文本编程控件的Text属性时,就已经在使用COM,同样在DAO数据控件运行MoveNext方法时,甚至在使用VB控制字时,也都是在使用COM。那么,什么是COM呢?首先,COM是一种通信的方式。例如,就像我们的电视遥控一样。当我们按下某个频道按钮时,电视频道立马切换;而当我们按下开关按钮时,电视立即关闭等等。其实,我们并不关心它们是怎样工作的,我们只知道按下按钮就能产生某个动作就可以了。程序的原理也是一样的。当改变文本编程控件的Text属性时,我们并不知道其中的原理,也许系统内部会调用几十个API函数也说不定?但对于用户来说,则只关心文本编程控件中显示的文本就可以了。其次,COM是一种重用代码的方式。使用COM的最大好处是一旦建立COM的通信方式后,可以方便地在任何地方使用多次。例如,当用户创建一个用于显示日期和时间的COM组件后,就可用于任何程序中的任何地方。不仅VB应用程序、Excel程序可以访问,而且C++应用程序也可以访问它。所以,COM组件的代码可重用性是最主要的。再次,COM是基于实际对象的。用COM创建的大多数组件是基于实际对象的,这就意味着一旦组件被创建,其使用是相当容易的。试想一下,如果我们在计算机系统中再添加一个用户,又有哪种添加方式如Customer.Add那样简单,是添加数据处理代码包、算法,还是向应用程序添加较大的数据库DLL?很显然,COM就支持这种简单操作。所以,COM是一种通信方式、一种代码重用方式以及基于实际对象的。本教程的以后部分中将简单讨论COM和VB的相关内容,这包括类的创建,以及如何将类转换成一个实际对象。虽然,这里的内容太过简单,但却是以后COM编程的基础。第二节类的建立
在本节中,我们来实践一下。首先创建一个COM对象,然后使用它,最后再想法改进。
首先进行下面两步:
运行VisualBasic;选择"StandardEXE"工程类型;由于COM对象是基于类的,而类实际上是程序包,就像模块中的代码一样。所以:
选择"Project"->"AddClassModule";当相应的对话框出现后,选择"'ClassModule",然后单击"Open"按钮。
这样,在桌面上显示一个表单,以及包含在工程Project1中的Class1。
下面再将空的类的类名更改:
在类的属性窗口中,将类的Name属性改成CDog。
需要说明的是,为了区别起见,每个对象名的前面都有相应的前缀,例如TextBox对象前是"txt"、Form前是"frm"、类前可以大写字母"C"或小写字母"cls",但这里使用前者。
下面我们添加一些代码来测试一下:
在CDog类通用声明部分中,添加变量的声明:PublicNameAsString然后,打开Form1;
在表单中添加一个命令按钮;
打开代码窗口,为该命令按钮添加下列代码:DimMyDogAsCDog
SetMyDog=NewCDog
MyDog.Name="BillyMoore"
MsgBoxMyDog.Name
SetMyDog=Nothing下面就来解释上述代码的含义:DimMyDogAsCDog该行语句是用来通知VisualBasic为CDog对象设置一个位空间,但这时还不能使用该对象,必须等到下条语句为止:SetMyDog=NewCDog它是用来创建CDog的实例。这就意味着前面空的MyDog模板变成了现在可以使用的CDog对象。MyDog.Name="BillyMoore"
MsgBoxMyDog.Name上述代码的第一行是用来设置MyDog的Name变量,同时第二行语句是用来将该变量的内容显示在消息对话框中。最后:SetMyDog=Nothing用来将MyDog对象简单的置空。
按F5键运行并测试。
怎么样?但同时,我们可能不禁要问,标准模块和类模块究竟有什么不同?我们再来看看下面的示例:
将命令按钮的代码变成:DimMyDogAsCDog
SetMyDog=NewCDog
DimMyDog2AsCDog
SetMyDog2=NewCDog
MyDog.Name="BillyMoore"
MsgBoxMyDog.Name
MyDog2.Name="SadieMoore"
MsgBoxMyDog2.Name显示一个提示对话框。
切换到Form1后面的代码窗口;
在设置Age属性代码处的第一行语句中单击鼠标,并按F9;
MyDog.Age=4
在获取Age属性代码处的第一行语句中单击鼠标,并按F9;
MsgBoxMyDog.Name&"is"&MyDog.Age&"yearsold"
现在让我们测试一下:
按F5运行程序;
单击Command按钮;
代码应该中断在按F9添加的断点的代码行上。
当代码中断后,按F8单步运行并观察结果;
现在明白它们是怎样工作的吗?注意Age属性的"get"和"let"是怎样运行的?
在下一节中,我们不仅要讨论使用更多属性的方式,而且还讨论如何随意创建它们。第四节添加更多的属性有时候,为了更好地处理类往往需更多的属性。例如,假如你有四种不同的客户群:集团、较大、较小和新的客户类型,或者一个用于搜索的类中有三种不同的搜索方式:软盘、硬盘和网络。那么,能不能最好从选项列表中选择一个,而不是用不能理解的数字或文本来设置相关属性?
我想,答案是肯定的。因为这种处理就称为"枚举"。
打开上一节的工程,让我们添加一些代码。
在CDog类中添加下列代码:PublicEnumCoatType
BigAndShaggy=1
ShortCrewCut=2
PoodleStyleAfro=3
Unknown=4
EndEnum关键词"Enum"就是用来定义枚举的,换句话说,它是可能选项的列表。各选项都有相应的数字,也就是说BigAndShaggy表示1,ShortCrewCut等于2,等等。
需要注意的是,当将枚举项相关信息添加在数据库中时,其相应的数值是非常有用的。由于"BigAndShaggy"实际代表的是数值1,所以可以直接将其插入到数据库的数值字段中。这就意味着,可以方便使用字符串来维护数据库。
所以,我们来创建一个Dog的Coat类型列表,并另外定义一个属性,将这些类型添加在CDog类中。
在类中声明下列变量:
PrivateudtCoatAsCoatType
这个定义的私有变量用来保存即将添加的Coat类型属性,注意到udtCoat变量既不是字符串也不是整型,而是我们自己定义的枚举类型CoatType。
当类CDog打开时,选择"Tools"菜单中的"AddProcedure"命令,弹出相应的对话框;
Name编辑框中键入Coat;
选中"Property"选项按钮,然后单击[OK]。
系统自动产生下列代码框架:PublicPropertyGetCoat()AsVariant
EndProperty
PublicPropertyLetCoat(ByValvNewValueAsVariant)
EndProperty但我们需要的却不是这个框架。代码中,"Variant"变量类型是能接收和处理任何类型数据。在我们定义的CDog类中,最后的属性是Age,它只能接受整型。但现在需要属性能接收CoatType列表中的数据类型,因此需要作下列修改:
将产生的代码中所有的"Variant"改成"CoatType";
然后,添加一些实际处理属性的代码。
在属性的Get过程中,添加下列代码:Coat=udtCoat在属性的Let过程中,添加下列代码:udtCoat=vNewValue切换到Form1;
将Command按钮的代码改为:DimMyDogAsCDog
SetMyDog=NewCDog
MyDog.Name="Billy"现在开始键入:MyDog.Coat=
奇迹出现了,当你敲下"="键时,出现一个含有可能选项的列表,从中我们可以选择一个。
完成代码的键入:MyDog.Coat=ShortCrewCut
下一步,我们将获取Coat属性的值。假如现在就来简单地在消息对话框中显示属性值,则只需返回选择项的值就可以了。例如,若选择了ShortCrewCut,其属性一定返回2。不信,可以试一试!
但这里采用另外一种方法,它是用If-Then语句判断Coat:
在Command按钮已有的代码后面添加下列代码:IfMyDog.Coat=BigAndShaggyThen
MsgBox"Youhaveabig,bouncy,bushypup!"
ElseIfMyDog.Coat=PoodleStyleAfroThen
MsgBox"Yourpoochispretty,petitandpooch-like!"
ElseIfMyDog.Coat=ShortCrewCutThen
MsgBox"Yourdogisfullofoomph,oomphandmoreoomph!"
ElseIfMyDog.Coat=UnknownThen
MsgBox"Ihavenoideaaboutyourdog.Idon'tthink"&_
"youdoeither!"
EndIf这里的代码只是简单判断Coat属性值,并显示相应的消息对话框。当然,这里也可以使用"SelectCase"语句。
最后,我们添加最后一条语句来释放计算机内存:
在Command按钮已有的代码后面添加下列代码:SetMyDog=Nothing按F5运行程序,并单击Command按钮测试一下。
结果怎样?第五节子过程、函数和参数
前面已经接触到类的变量、属性以及枚举,但我们怎样才能更好的利用它们呢?
显然,子过程就是其中的一种方式,它几乎出现所有的VisualBasic程序中,所以这里来举例说明。
在CDog类中添加下列代码:PublicSubBark()
MsgBox"Woof!Woof!"
EndSub这里的子过程是最常见的,我们可以简单地使用MyDog.Bark来调用它。
下面来试一试:
将表单Form1的Command按钮的代码改成:DimMyDogAsCDog
SetMyDog=NewCDog
MyDog.Name="Billy"
MyDog.Bark
SetMyDog=Nothing需要说明的是,在键入"MyDog."会弹出相应的列表,各列表项前面都有不同颜色的小图标区分不同的类型。例如Bark子过程项前面的是黄绿色的,属性是灰色和蓝色的,这样能帮助我们识别Bark是MyDog对象的一个方法。
按F5运行并测试。
事实上,除了子过程外,我们也可以在代码中添加函数。这里我们就不举例了,你可以自己尝试一下。因为函数和一般子过程除了能在一个类中外,其工作也是相同的。但不要忘记,所有子过程和函数都可以有自己的参数。
现在,让我们设想一下,在类中有一个Sleep方法。当我们想要cat睡觉或dog打盹时,每次都得调用这个方法。
但是,我们怎么知道这些小东西什么时候醒来?这是一个非常有趣的问题,其答案是使用事件(event)。
当我们在文本编辑框中键入字符时就会产生Change事件,而当我们单击命令按钮时就会产生Click事件。同样,想知道这些小东西什么时候醒来,就需使用下一节所着重讨论的Awake事件。第六节事件
相对来说,事件的使用是比较简单的。在使用前,我们必须先定义该事件,这就意味着通知VisualBasic什么事件被调用。一个事件可能有自己的参数,例如,一个Command按钮有一个Click(单击)事件,它没有参数。另外,文本编辑框有一个KeyPress事件,它通过一个叫"KeyAscii"的值来处理相关内容。
定义一个事件是在一个类的通用声明部分添加类似下面的代码:PublicEventMyEventName(PossArgumentsAsString,EtcAsVariant)然后在代码调用RaiseEvent方法来激发一个事件。就像下面的代码一样:RaiseEventMyEventName("PossArgs","Etc")为了更好地说明上述添加和激发事件的过程,我们举一个例子。首先,定义一个事件:
在CDog类的通用声明部分添加下列代码:PublicEventAwake()在CDog类中添加Sleep子过程:PublicSubSleep()
DimiAsLong
Fori=1To1000000
DoEvents:DoEvents:DoEvents
exit
RaiseEventAwake
EndSub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技园区场地合作经营与管理协议书范本
- 餐厅装修及设备采购安装监理合同
- 软件开发采购合同知识产权保护及售后服务协议
- 书法创新活动方案
- 义捐活动策划方案
- 副科干部宿舍管理制度
- 农林牧废弃物综合利用项目环境影响评价报告
- 儿科护理急性感染性喉炎
- 学校联合教研管理制度
- 厨房过失扣分管理制度
- 火锅店员工合同协议书
- 企业如何通过激励措施促进员工参与数字化转型
- 雇人包工免责协议书
- 船舶应急部署表及船员应变卡
- 2025年下半年山东能源集团权属企业内蒙古荣信化工限公司社会招聘易考易错模拟试题(共500题)试卷后附参考答案
- 陕西邮政校招笔试题及答案
- 山东省济南市2025届高三三模历史试卷(含答案)
- 小学语文大单元整体教学设计讲座
- 风力发电场调试规程
- 2024-2025学年广东省深圳市高一数学下学期7月期末考试(附答案)
- 血管内导管相关性血流感染预防与诊治指南(2025)解读课件
评论
0/150
提交评论