建一个COM对象.docx

上传人:b****7 文档编号:9416751 上传时间:2023-02-04 格式:DOCX 页数:20 大小:23.21KB
下载 相关 举报
建一个COM对象.docx_第1页
第1页 / 共20页
建一个COM对象.docx_第2页
第2页 / 共20页
建一个COM对象.docx_第3页
第3页 / 共20页
建一个COM对象.docx_第4页
第4页 / 共20页
建一个COM对象.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

建一个COM对象.docx

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

建一个COM对象.docx

建一个COM对象

建一个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

  SetMyDog=Nothing

  SetMyDog2=Nothing

  与最前面的代码不同的是,这里的代码实际上是定义两个对象MyDog和MyDog2,这两个对象是基于CDog的相互独立的两个对象。

  按F5键运行并测试。

  结果怎样?

这一次是不是有两个对话框出现?

一个显示"BillyMoore",另一个显示"SadieMoore"。

上述定义的每个对象中除了Name外,没有任何实际的属性,因此下面过程就来添加:

  打开前面的Class1;

  声明下面的公共变量:

  PublicAgeAsInteger

  打开前面的Form1;

  将命令按钮的代码变成:

  DimMyDogAsCDog

  SetMyDog=NewCDog

  DimMyDog2AsCDog

  SetMyDog2=NewCDog

  MyDog.Name="BillyMoore"

  MyDog.Age=4

  MsgBoxMyDog.Name&"is"&MyDog.Age&"yearsold"

  MyDog2.Name="SadieMoore"

  MyDog2.Age=7

  MsgBoxMyDog2.Name&"is"&MyDog2.Age&"yearsold"

  SetMyDog=Nothing

  SetMyDog2=Nothing

  这些代码和前面差不多,只不过这里使用了Age变量。

  按F5键运行并测试。

  应该出现显示name和age内容的两个消息对话框。

  现在再试着将其中一个对象的age值设置成1,000或者30,000。

看看结果如何?

程序照样正常运行,这是因为定义的整型变量最大值可达32,767,但是实际中的狗(Dog)是不会有30,000岁的。

  那么,这种情况应该怎样处理呢?

前面已经接触到类的变量、属性以及枚举,但我们怎样才能更好的利用它们呢?

  显然,子过程就是其中的一种方式,它几乎出现所有的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

  Next

  RaiseEventAwake

EndSub

  代码中,一开始做一些1000000次无用的循环,计算机短暂停顿后,Sleep子过程激发Awake事件。

  但Awake事件产生后,我们应该让程序作相应的反应呢?

当然,利用命令按钮是最简单的,只要在代码窗口的列表中选择命令按钮对象。

  但是那样的话,我们必然需要一个控件,而且所见的内容都在表单上。

这里我们纯粹使用相应的代码,并且是不可见的。

  当然用代码来接收事件,还需要额外的操作:

  在表单代码窗口中的通用声明部分,添加下列代码:

DimWithEventsMyDogAsCDog

  该代码不同于以前的MyDog声明,它有个关键词WithEvents用来通知VisualBasic该对象可以按收任何事件,而且该对象必须接收事件。

  删除命令按钮中的所有代码;并在Command1中添加下列代码:

SetMyDog=NewCDog

MyDog.Name="Billy"

MyDog.Bark

MyDog.Sleep  

  

  该代码简单地将MyDog设置成CDog的一个新的实例,设置Name后,调用Bark,最后运行Sleep子过程。

  现在添加一些代码来相应Awake事件。

  在Form代码窗口中,从对象下拉列表中选择"MyDog";

  在"MyDog"的"Awake"事件中,添加下列代码:

  PrivateSubMyDog_Awake()

   MsgBox"Yourpoochhasawoken!

"

  EndSub

  好了,现在就可以测试了。

  按F5运行程序;

  单击Command按钮;

  这样,当小狗Bark后,开始打盹,最后结束时还被你叫醒。

真是神奇!

第一个真正的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对象来处理了。

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

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

DimrsAsRecordset

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

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

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

  在代码窗口中,将Object组合框中当前的"(General)"项改为"Class";

  在右边的组合框中,确保当前项为"Initialize";

  代码窗口中将出现:

  PrivateSubClass_Initialize()

  EndSub

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

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

  Setrs=NewRecordset

  rs.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非常相似的。

从名称来看,它们都有一个"n",但更相似的地方是当相应的对象关闭后,它们都会被激发。

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

  从Object组合框中选择"Class",从Procedure组合框中选择"Terminate";

  在"Terminate"事件中,添加下列代码:

  rs.Close

  Setrs=Nothing

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

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

  好了,本节就到这里。

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

下面,我们添加一个属性来让用户获取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,changethefieldvalue

    rs("CustomerID")=NewValue

   EndIf

  EndProperty

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

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

  PublicSubUpdate()

   rs.Update

  EndSub

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

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

 

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

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

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

  再次运行VisualBasic另一个实例;

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

  选择"注释:

Project"->"References"菜单;

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

  选中"Northwind"列表项;

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

  单击[OK]按钮;

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

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

  DimTestAsCustomers

  SetTest=NewCustomers

  MsgBoxTest.CustomerID

  SetTest=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"

  Test.Update

  MsgBoxTest.CustomerID

  SetTest=Nothing

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

  假如愿意,仍然可以按F9高亮显示"Test.CustomerID="这条语句,然后按F8单步运行来查看其工作情况。

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

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

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

  首先添加类的几个特征:

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

其相应的代码如下:

  DimWithEventsrsAsRecordset

  Publ

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

当前位置:首页 > 幼儿教育 > 家庭教育

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

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