VBCOM基础讲座之创建第一个COM对象.docx

上传人:b****8 文档编号:27641745 上传时间:2023-07-03 格式:DOCX 页数:20 大小:57.28KB
下载 相关 举报
VBCOM基础讲座之创建第一个COM对象.docx_第1页
第1页 / 共20页
VBCOM基础讲座之创建第一个COM对象.docx_第2页
第2页 / 共20页
VBCOM基础讲座之创建第一个COM对象.docx_第3页
第3页 / 共20页
VBCOM基础讲座之创建第一个COM对象.docx_第4页
第4页 / 共20页
VBCOM基础讲座之创建第一个COM对象.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

VBCOM基础讲座之创建第一个COM对象.docx

《VBCOM基础讲座之创建第一个COM对象.docx》由会员分享,可在线阅读,更多相关《VBCOM基础讲座之创建第一个COM对象.docx(20页珍藏版)》请在冰豆网上搜索。

VBCOM基础讲座之创建第一个COM对象.docx

VBCOM基础讲座之创建第一个COM对象

VisualBasicCOM基础讲座之简介

"世上无难事,只要肯登攀",所以你要有信心成为一个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对象,它将被用于那些ActiveX程序中。

具体步骤如下:

启动VisualBasic;

我们将看到一个"NewProject"对话框,其中有几个与ActiveX相关的选项图标。

下面来解释一下:

ActiveXDLL——创建一个包含类的.DLL程序,这是我们将要采用的选项;

ActiveXEXE——创建一个包含类的.EXE程序,以后将讨论这个类型;

ActiveXControl——添加一个工程,允许自己创建用于toolbox中的控件。

这里不去讨论它。

ActiveXDocumentEXE——创建一个基于Web页的.EXE程序,这里也不去讨论。

ActiveXDocumentDLL——创建一个基于Web页的.DLL程序,由于与我们的主题甚远,所以自然也不去讨论它。

顺便说明一下,如果在工程列表中没有上述选项,那么你可能使用了VisualBasic的学习版。

当然,在上述那么多选项中,我们真正感兴趣的是ActiveXDLLs和ActiveEXEs。

等会再来讨论后一种,这里先看看第一种!

选中"ActiveXDLL"项;单击[OK]按钮;这样,一个ActiveXDLL工程就建立好了。

我们之所以创建ActiveXDLL是准备将它作为一个前端服务器,它基于Northwind数据库中的Customers表的(Northwind数据库是随

VisualBasic一起发行的,位于VB98文件夹中)。

这也就是说,我们后面一定会处理Customers信息,但那时我们仅仅需要对类的调用,而不想过多地停留在数据处理代码的纠缠中。

当然,我们得首先创建这个类。

虽然COM能使编程更容易一点,但这个类的构造还是比较困难的。

尽管如此,在深入数据库之前,先来对ActiveX程序中的名称作一些修改。

将类的Name属性改为"Customers";

选择"Project"->"ProjectProperties"菜单,在弹出的对话框中,将工程名改为

"Northwind";

现在再来使类与数据库相连:

选择"Project"->"References"菜单;

在弹出的对话框中,选择"MicrosoftActiveXDataObjects2.1Library",单击[OK]

按钮;该"引用"允许用户处理一个数据库,当然现在都使用COM对象来处理了。

下面将围绕相应的记录集而展开:

在我们的类中添加下列代码:

这是一个用于访问数据库的记录集对象。

当然,当其他开始使用该类时,我们希望记录集对象能和数据库建立连接,而当类使用结束后,与数据库的连接能断开。

基于这种思想,其代码如下:

在代码窗口中,将Object组合框中当前的"(General)"项改为"Class";在右边的组合框中,确保当前项为"Initialize";代码窗口中将出现:

当类刚开始时,所有这里面的代码都会被执行,类似于表单中的Form_Load事件

在"Initialize"事件中键入下列代码:

Setrs=NewRecordsetrs.ActiveConnection="Provider=Microsoft."&_"Jet.OLEDB.4.0;DataSource=C:

\ProgramFiles\"&_

"MicrosoftVisualStudio\VB98\Nwind.mdb;"&_"PersistSecurityInfo=False"

rs.Open"select*fromcustomers",,adOpenKeyset,adLockOptimistic

这里不需要任何与该类相关的代码,它只是使用VisualBasic通用的ADO数据库处理代码,该类中的代码是用来如何与数据库建立连接的。

需要说明的是,如果Northwind数据库Nwind.mdb不在C:

\ProgramFiles\MicrosoftVisualStudio\VB98文件夹,那么必须将ActiveConnection字符串内容作适当修改!

当类开始时,rs对象负责与数据库建立连接,但当类对象结束后或程序关闭它时,我们应该使该连接断开。

编程时,我们使用Terminate事件,它与Form_Unload非常相似的。

下面来加入数据库关闭的代码:

从Object组合框中选择"Class",从Procedure组合框中选择"Terminate";在"Terminate"事件中,添加下列代码:

这就是我们添加的又一段简单代码,它只是简单地关闭数据库,然后将rs设置为Nothing。

这样,rs就会被有效删除。

好了,本节就到这里。

下一节中,我们将继续添加代码用来处理数据中的记录集。

VBCOM基础讲座之添加属性和方法

面,我们添加一个属性来让用户获取CustomerID字段的值,其相应的示例代码如下:

PublicPropertyGetCustomerID()AsString

CustomerID=rs("CustomerID")

EndProperty

PublicPropertyLetCustomerID(NewValueAsString)rs("CustomerID")=NewValue

EndProperty

显然,该属性的Get操作只是简单地返回"CustomerID"字段的值,相应地,Let操作是将"CustomerID"字段设置一个新值。

换句话说,属性中有两个部分:

"getting"和"letting",事实上可能还有另外一个"setting"操作。

但对于不同场合来说,我们总需要Get和Let来进行读和写的操作。

这里所引起注意的是,在上述属性过程中,应该对某些值进行必要的检测。

例如,在调用Let属性时,用户可能有如下操作:

ObjectName.CustomerID="HALFI"

该Let属性操作后,"CustomerID"等于新的字符串"HALFI"。

但当查看Northwind数据库内容时,我们会发现"CustomerID"字段的字符长度不能超过5。

如果用户有这样的操作:

ObjectName.CustomerID="HALFISTORE"

则出现数据库操作错误。

虽然,可以通过错误句柄来处理这个问题,但是如果能在代码中检测NewValue的长度岂不更好?

如果该值超过5个字符,我们既可以通过裁剪取共前5个字符,也可以忽略这个新的字符串而弹出一个错误提示。

但这里,我们采用后一种措施。

在我们的类中添加下列代码:

PublicPropertyGetCustomerID()AsString

CustomerID=rs("CustomerID")

EndProperty

PublicPropertyLetCustomerID(NewValueAsString)

'IfthelengthofNewValueisgreaterthanfive

IfLen(NewValue)>5Then

'...thenraiseanerrortotheprogram

'usingthisclass

Err.RaisevbObjectError+1,"CustomerID",_"CustomerIDcanonlybeuptofive"&_"characterslong!

"

Else

'...otherwise,changethefieldvaluers("CustomerID")=NewValue

EndIf

EndProperty

好了,在完成下列步骤之前,我们已经为添加方法花费了不少时间。

在我们的类中添加下列代码:

该Update方法只是简单地调用记录集对象的Update方法来更新记录。

下一步,我们将用一个很小的样例程序来测试这个属性和方法,在测试时还将使用特定的技巧来追踪类和程序的运行。

VBCOM基础讲座之类的测试

现在就来测试前面创建的类。

启动

按F5运行程序;在弹出的属性对话框中,选中"WaitforComponentstoStart"(工程时等待创建部件),然后按[OK]按钮;

这时,类就会被激活,其他程序就可使用它的功能。

再次运行VisualBasic另一个实例;

创建一个新的"StandardEXE"工程;

选择"'Project"->"References"菜单;

浏览对话框中可引用的列表项,可以发现一些额外的组件。

选中"Northwind"列表项;

Northwind就是前面创建的ActiveX工程。

单击[OK]按钮;

现在添加一些代码来使用上述工程:

在Form1表单中添加一个命令按钮;为命令按钮添加下列代码:

DimTestAsCustomersSetTest=NewCustomersMsgBoxTest.CustomerIDSetTest=Nothing

该代码首先创建一个新的Customers对象,然后显示CustomerID信息,最后将Test对象置为Nothing,并关闭它。

按F5键运行测试程序;

需要说明的是,当运行时出现"invalidreference"错误提示时,肯定哪些地方有问题。

这时可按下面步骤重新来一次:

(1)在测试工程中去掉Northwind引用;

(2)重新启动Northwind工程;

(3)在测试工程中添加Northwind引用,再运行!

单击表单中的命令按钮;这时运行时可能需要几秒钟,毕竟还要做一些如数据库连接等工作。

但是,除了一开始

的停留外,后面的调用就快得多了。

程序将显示包含"ALFKI"的消息对话框

关闭测试程序。

现在,我们来看看程序背后究竟发生什么。

将插入符移动到MsgBoxTest.CustomerID这条语句上;按F9;

该语句显示为红色,用来标记一个断点。

当代码运行时,它会停留在这里。

按F8将单步

运行此语句,并移动到下一句代码上。

按F5再次运行测试程序;

单击命令按钮;

流程将停留在MsgBox这条命令上。

按F8,慢慢单步执行各条语句;

将会看到系统在两个VisualBasic中来回切换,显示出不同属性的处理过程。

结束后,关闭测试程序。

下面再对前面的工程进行测试。

这一次,我们不仅获取CustomerID的值,而且还设置这个值。

将命令按钮的代码改为:

DimTestAsCustomers

SetTest=NewCustomers

Test.CustomerID="KARLY"

该代码首先设置"CustomerID"字段,然后更新记录集,最后显示出CustomerID属性,其结果应该是设置的"KARLY"。

假如愿意,仍然可以按F9高亮显示"Test.CustomerID="这条语句,然后按F8单步运

行来查看其工作情况。

至此,我们已经成功地创建并测试一个简单的基于数据库的类。

但是,还没有对

customerID的字符串长度作测试,如果其长度超过5个字符,看看会发生什么?

下一步,我们将扩充并改进这个数据库类

首先添加类的几个特征:

其他的属性、一些方法甚至一两个事件。

其相应的代码如下:

DimWithEventsrsAsRecordset

PublicEventRecordsetMove()

PrivateSubClass_Initialize()

Setrs=NewRecordset

rs.ActiveConnection="Provider=Microsoft."&_"Jet.OLEDB.4.0;Data

Source=C:

\ProgramFiles\"&_"MicrosoftVisualStudio\VB98\Nwind.mdb;"&_"PersistSecurityInfo=False"

rs.Open"select*fromcustomers",,adOpenKeyset,adLockOptimisticEndSub

PrivateSubClass_Terminate()

rs.Close

Setrs=Nothing

EndSub

PublicPropertyGetCustomerID()AsString

CustomerID=rs("CustomerID")

EndProperty

PublicPropertyLetCustomerID(NewValueAsString)

'IfthelengthofNewValueisgreaterthanfive

IfLen(NewValue)>5Then

'...thenraiseanerrortotheprogram

'usingthisclass,byrunning

'Err.RaisevbObjectError+OurErrorNumber

Err.RaisevbObjectError+1,"CustomerID",_"CustomerIDcanonlybeuptofive"&_"characterslong!

"

Else

'...otherwise,changethefieldvaluers("CustomerID")=NewValue

EndIf

EndProperty

PublicPropertyGetCompanyName()AsVariant

CompanyName=rs("CompanyName")

EndProperty

PublicPropertyLetCompanyName(ByValNewValueAsVariant)rs("CompanyName")=NewValue

EndProperty

PublicPropertyGetContactName()AsVariant

ContactName=rs("ContactName")

EndProperty

PublicPropertyLetContactName(ByValNewValueAsVariant)rs("ContactName")=NewValue

EndProperty

PublicPropertyGetContactTitle()AsVariant

ContactTitle=rs("ContactTitle")

EndProperty

PublicPropertyLetContactTitle(ByValNewValueAsVariant)rs("ContactTitle")=NewValue

EndProperty

PublicPropertyGetAddress()AsVariant

Address=rs("Address")

EndProperty

PublicPropertyLetAddress(ByValNewValueAsVariant)rs("Address")=NewValue

EndProperty

PublicPropertyGetCity()AsVariant

City=rs("City")

EndProperty

PublicPropertyLetCity(ByValNewValueAsVariant)rs("City")=NewValue

EndProperty

PublicPropertyGetRegion()AsVariant

Region=rs("Region")

EndProperty

PublicPropertyLetRegion(ByValNewValueAsVariant)rs("Region")=NewValue

EndProperty

PublicPropertyGetPostalCode()AsVariant

PostalCode=rs("PostalCode")

EndProperty

PublicPropertyLetPostalCode(ByValNewValueAsVariant)rs("PostalCode")=NewValue

EndProperty

PublicPropertyGetCountry()AsVariant

Country=rs("Country")

EndProperty

PublicPropertyLetCountry(ByValNewValueAsVariant)rs("Country")=NewValue

EndProperty

PublicPropertyGetPhone()AsVariant

Phone=rs("Phone")

EndProperty

PublicPropertyLetPhone(ByValNewValueAsVariant)rs("Phone")=NewValue

EndProperty

PublicPropertyGetFax()AsVariant

Fax=rs("Fax")

EndProperty

PublicPropertyLetFax(ByValNewValueAsVariant)

rs("Fax")=NewValue

EndProperty

PublicSubAddNew()

rs.AddNew

EndSub

PublicSubUpdate()

rs.Update

EndSub

PublicSubCancelUpdate()

Ifrs.EditMode=adEditInProgressOr_rs.EditMode=adEditAddThenrs.CancelUpdate

EndIf

EndSub

PublicSubMoveNext()

rs.MoveNext

EndSub

PublicSubMovePrevious()rs.MovePrevious

EndSub

PublicSubMoveFirst()rs.MoveFirst

EndSub

PublicSubMoveLast()

rs.MoveLast

EndSub

PublicFunctionFindByCustomerID(CustomerIDAsString)AsBoolean'UsestheFindmethodtolocatecustomers'withamatchingCustomerID.

'ReturnsTruevalueiscustomer(s)found

DimvarBookmarkAsVariant

rs.MoveFirst

rs.Find("CustomerID='"&CustomerID&"'")

Ifrs.EOF=TrueThen

FindByCustomerID=Falsers.Bookmark=varBookmark

Else

FindByCustomerID=True

EndIf

EndFunction

PublicPropertyGetEOF()AsBoolean

'Exampleofaread-onlyproperty

NoPropertyLetshere

EOF=rs.EOF

EndProperty

PublicPropertyGetBOF()AsBoolean

'Anotherexampleofaread-onlyproperty

BOF=rs.BOF

EndProperty

PrivateSubrs_MoveComplete(ByValadReasonAsADODB.EventReasonEnum_,

ByValpErrorAsADODB.Error,adStatusAsADODB.EventStatusEnum,_

ByValpRecordsetAsADODB.Recordset)

'ReactstotherecordsetMoveComplete

'method-raiseseventwitheachmoveRaise

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1