基于VB的COM编程入门教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1基于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。2需要说明的是,为了区别起见,每个对象名的前面都有相应的前缀,例如TextBox对象前是txt、Form前是frm、类前可以大写字母C或小写字母cls,但这里使用前者。下面我们添加一些代码来测试一下:在CDog类通用声明部分中,添加变量的声明:PublicNameAsString然后,打开Form1;在表单中添加一个命令按钮;打开代码窗口,为该命令按钮添加下列代码:DimMyDogAsCDogSetMyDog=NewCDogMyDog.Name=BillyMooreMsgBoxMyDog.NameSetMyDog=Nothing下面就来解释上述代码的含义:DimMyDogAsCDog该行语句是用来通知VisualBasic为CDog对象设置一个位空间,但这时还不能使用该对象,必须等到下条语句为止:SetMyDog=NewCDog它是用来创建CDog的实例。这就意味着前面空的MyDog模板变成了现在可以使用的CDog对象。MyDog.Name=BillyMooreMsgBoxMyDog.Name上述代码的第一行是用来设置MyDog的Name变量,同时第二行语句是用来将该变量的内容显示在消息对话框中。最后:SetMyDog=Nothing用来将MyDog对象简单的置空。按F5键运行并测试。怎么样?但同时,我们可能不禁要问,标准模块和类模块究竟有什么不同?我们再来看看下面的示例:将命令按钮的代码变成:DimMyDogAsCDogSetMyDog=NewCDogDimMyDog2AsCDogSetMyDog2=NewCDogMyDog.Name=BillyMooreMsgBoxMyDog.NameMyDog2.Name=SadieMooreMsgBoxMyDog2.NameSetMyDog=NothingSetMyDog2=Nothing3与最前面的代码不同的是,这里的代码实际上是定义两个对象MyDog和MyDog2,这两个对象是基于CDog的相互独立的两个对象。按F5键运行并测试。结果怎样?这一次是不是有两个对话框出现?一个显示BillyMoore,另一个显示SadieMoore。上述定义的每个对象中除了Name外,没有任何实际的属性,因此下面过程就来添加:打开前面的Class1;声明下面的公共变量:PublicAgeAsInteger打开前面的Form1;将命令按钮的代码变成:DimMyDogAsCDogSetMyDog=NewCDogDimMyDog2AsCDogSetMyDog2=NewCDogMyDog.Name=BillyMooreMyDog.Age=4MsgBoxMyDog.Name&is&MyDog.Age&yearsoldMyDog2.Name=SadieMooreMyDog2.Age=7MsgBoxMyDog2.Name&is&MyDog2.Age&yearsoldSetMyDog=NothingSetMyDog2=Nothing这些代码和前面差不多,只不过这里使用了Age变量。按F5键运行并测试。应该出现显示name和age内容的两个消息对话框。现在再试着将其中一个对象的age值设置成1,000或者30,000。看看结果如何?程序照样正常运行,这是因为定义的整型变量最大值可达32,767,但是实际中的狗(Dog)是不会有30,000岁的。那么,这种情况应该怎样处理呢?第三节添加属性属性操作很像公共变量,但属性还有更多的控制。常用属性通常包括Get(获取)和Let(设置)两种。这两项操作能规定一个主要属性,就像下面的代码片段:PrivateintAgeAsIntegerPublicPropertyGetAge()AsIntegerAge=intAgeEndPropertyPublicPropertyLetAge(ByValvNewValueAsInteger)intAge=vNewValueEndProperty上述代码的工作方式极像Age变量的操作。当像下面语句操作变量时,MyDog.Age=44就好比运行Let属性,并将4赋给vNewValue。当像下面语句操作变量时,MsgBoxMyDog.Age是获取属性,就好比运行Get属性,并将相应的值由intAge返回。因此,我们可以这样认为:所谓Get属性,就是运行后获取某个值;所谓Let属性,就是运行后让某个属性等于某个值;但至此为止,我们仅仅说明属性工作方式与标准变量极为相似,还没有来得及对属性进行更多的控制。所以,下面就来讨论。打开上一节的工程,对CDog类进行如下修改:从CDog类中去掉Age变量;添加下列代码:PrivateintAgeAsIntegerPublicPropertyGetAge()AsIntegerAge=intAgeEndPropertyPublicPropertyLetAge(ByValvNewValueAsInteger)IfvNewValue=50ThenintAge=vNewValueEndIfEndProperty与前面的代码相比,这里只是对Let属性代码作稍加修改。下面对其作小小的测试,假想用户试图想使:MyDog.Age=30也就是运行Let属性,使vNewValue等于30。代码中,还检测vNewValue是否小于或等于50。显然,30是符合要求的,因此实例中的intAge值等于30。但如果超过50,则什么也不会发生,属性退出且没有任何赋值。当然,我们也可以对此给出相应的错误代码或是显示一个提示对话框。切换到Form1后面的代码窗口;在设置Age属性代码处的第一行语句中单击鼠标,并按F9;MyDog.Age=4在获取Age属性代码处的第一行语句中单击鼠标,并按F9;MsgBoxMyDog.Name&is&MyDog.Age&yearsold现在让我们测试一下:按F5运行程序;单击Command按钮;代码应该中断在按F9添加的断点的代码行上。当代码中断后,按F8单步运行并观察结果;现在明白它们是怎样工作的吗?注意Age属性的get和let是怎样运行的?在下一节中,我们不仅要讨论使用更多属性的方式,而且还讨论如何随意创建它们。第四节添加更多的属性有时候,为了更好地处理类往往需更多的属性。例如,假如你有四种不同的客户群:集团、较大、较小和新的客户类型,或者一个用于搜索的类中有三种不同的搜索方式:软盘、硬盘和网络。那么,能不能最好从选项列表中选择一个,而不是用不能理解的数字或文本来设置相关属性?我想,答案是肯定的。因为这种处理就称为枚举。5打开上一节的工程,让我们添加一些代码。在CDog类中添加下列代码:PublicEnumCoatTypeBigAndShaggy=1ShortCrewCut=2PoodleStyleAfro=3Unknown=4EndEnum关键词Enum就是用来定义枚举的,换句话说,它是可能选项的列表。各选项都有相应的数字,也就是说BigAndShaggy表示1,ShortCrewCut等于2,等等。需要注意的是,当将枚举项相关信息添加在数据库中时,其相应的数值是非常有用的。由于BigAndShaggy实际代表的是数值1,所以可以直接将其插入到数据库的数值字段中。这就意味着,可以方便使用字符串来维护数据库。所以,我们来创建一个Dog的Coat类型列表,并另外定义一个属性,将这些类型添加在CDog类中。在类中声明下列变量:PrivateudtCoatAsCoatType这个定义的私有变量用来保存即将添加的Coat类型属性,注意到udtCoat变量既不是字符串也不是整型,而是我们自己定义的枚举类型CoatType。当类CDog打开时,选择Tools菜单中的AddProcedure命令,弹出相应的对话框;Name编辑框中键入Coat;选中Property选项按钮,然后单击[OK]。系统自动产生下列代码框架:PublicPropertyGetCoat()AsVariantEndPropertyPublicPropertyLetCoat(ByValvNewValueAsVariant)EndProperty但我们需要的却不是这个框架。代码中,Variant变量类型是能接收和处理任何类型数据。在我们定义的CDog类中,最后的属性是Age,它只能接受整型。但现在需要属性能接收CoatType列表中的数据类型,因此需要作下列修改:将产生的代码中所有的Variant改成CoatType;然后,添加一些实际处理属性的代码。在属性的Get过程中,添加下列代码:Coat=udtCoat在属性的Let过程中,添加下列代码:udtCoat=vNewValue切换到Form1;将Command按钮的代码改为:DimMyDogAsCDogSetMyDog=NewCDogMyDog.Name=Billy6现在开始键入:MyDog.Coat=奇迹出现了,当你敲下=键时,出现一个含有可能选项的列表,从中我们可以选择一个。完成代码的键入:MyDog.Coat=ShortCrewCut下一步,我们将获取Coat属性的值。假如现在就来简单地在消息对话框中显示属性值,则只需返回选择项的值就可以了。例如,若选择了ShortCrewCut,其属性一定返回2。不信,可以试一试!但这里采用另外一种方法,它是用If-Then语句判断Coat:在Command按钮已有的代码后面添加下列代码:IfMyDog.Coat=BigAndShaggyThenMsgBoxYouhaveabig,bouncy,b

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功