Visual Basic COM基础讲座之(一)
2007-04-13 17:09
387 查看
Visual Basic 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编程的基础。
VB COM基础讲座之类的建立
在本节中,我们来实践一下。首先创建一个COM对象,然后使用它,最后再想法改进。
首先进行下面两步:
运行Visual Basic;选择 "Standard EXE"工程类型;由于COM对象是基于类的,而类实际上是程序包,就像模块中的代码一样。所以:
选择"Project"->"Add Class Module";当相应的对话框出现后,选择"注释:Class Module",然后单击"Open"按钮。
这样,在桌面上显示一个表单,以及包含在工程Project1中的Class1。
下面再将空的类的类名更改:
在类的属性窗口中,将类的Name属性改成CDog。
需要说明的是,为了区别起见,每个对象名的前面都有相应的前缀,例如Text Box对象前是"txt"、Form前是"frm"、类前可以大写字母"C"或小写字母"cls",但这里使用前者。
下面我们添加一些代码来测试一下:
在CDog类通用声明部分中,添加变量的声明:
Public Name As String
然后,打开Form1;
在表单中添加一个命令按钮;
打开代码窗口,为该命令按钮添加下列代码:
Dim MyDog As CDog
Set MyDog = New CDog
MyDog.Name = "Billy Moore"
MsgBox MyDog.Name
Set MyDog = Nothing
下面就来解释上述代码的含义:
Dim MyDog As CDog
该行语句是用来通知Visual Basic为CDog对象设置一个位空间,但这时还不能使用该对象,必须等到下条语句为止:
Set MyDog = New CDog
它是用来创建CDog的实例。这就意味着前面空的MyDog模板变成了现在可以使用的CDog对象。
MyDog.Name = "Billy Moore"
MsgBox MyDog.Name
上述代码的第一行是用来设置MyDog的Name变量,同时第二行语句是用来将该变量的内容显示在消息对话框中。最后:
Set MyDog = Nothing
用来将MyDog对象简单的置空。
按F5键运行并测试。
怎么样?但同时,我们可能不禁要问,标准模块和类模块究竟有什么不同?我们再来看看下面的示例:
将命令按钮的代码变成:
Dim MyDog As CDog
Set MyDog = New CDog
Dim MyDog2 As CDog
Set MyDog2 = New CDog
MyDog.Name = "Billy Moore"
MsgBox MyDog.Name
MyDog2.Name = "Sadie Moore"
MsgBox MyDog2.Name
Set MyDog = Nothing
Set MyDog2 = Nothing
与最前面的代码不同的是,这里的代码实际上是定义两个对象MyDog和MyDog2,这两个对象是基于CDog的相互独立的两个对象。
按F5键运行并测试。
结果怎样?这一次是不是有两个对话框出现?一个显示"Billy Moore",另一个显示"Sadie Moore"。
上述定义的每个对象中除了Name外,没有任何实际的属性,因此下面过程就来添加:
打开前面的Class1;
声明下面的公共变量:
Public Age As Integer
打开前面的Form1;
将命令按钮的代码变成:
Dim MyDog As CDog
Set MyDog = New CDog
Dim MyDog2 As CDog
Set MyDog2 = New CDog
MyDog.Name = "Billy Moore"
MyDog.Age = 4
MsgBox MyDog.Name & " is " & MyDog.Age & " years old"
MyDog2.Name = "Sadie Moore"
MyDog2.Age = 7
MsgBox MyDog2.Name & " is " & MyDog2.Age & " years old"
Set MyDog = Nothing
Set MyDog2 = Nothing
这些代码和前面差不多,只不过这里使用了Age变量。
按F5键运行并测试。
应该出现显示name和age内容的两个消息对话框。
现在再试着将其中一个对象的age值设置成1,000或者30,000。看看结果如何?程序照样正常运行,这是因为定义的整型变量最大值可达32,767,但是实际中的狗(Dog)是不会有30,000岁的。
那么,这种情况应该怎样处理呢?
VB COM编程基础之子过程函数和参数
前面已经接触到类的变量、属性以及枚举,但我们怎样才能更好的利用它们呢?
显然,子过程就是其中的一种方式,它几乎出现所有的Visual Basic程序中,所以这里来举例说明。
在CDog类中添加下列代码:
Public Sub Bark()
MsgBox "Woof! Woof!"
End Sub
这里的子过程是最常见的,我们可以简单地使用MyDog.Bark来调用它。
下面来试一试:
将表单Form1的Command按钮的代码改成:
Dim MyDog As CDog
Set MyDog = New CDog
MyDog.Name = "Billy"
MyDog.Bark
Set MyDog = Nothing
需要说明的是,在键入"MyDog."会弹出相应的列表,各列表项前面都有不同颜色的小图标区分不同的类型。例如Bark子过程项前面的是黄绿色的,属性是灰色和蓝色的,这样能帮助我们识别Bark是MyDog对象的一个方法。
按F5运行并测试。
事实上,除了子过程外,我们也可以在代码中添加函数。这里我们就不举例了,你可以自己尝试一下。因为函数和一般子过程除了能在一个类中外,其工作也是相同的。但不要忘记,所有子过程和函数都可以有自己的参数。
现在,让我们设想一下,在类中有一个Sleep方法。当我们想要cat睡觉或dog打盹时,每次都得调用这个方法。
但是,我们怎么知道这些小东西什么时候醒来?这是一个非常有趣的问题,其答案是使用事件(event)。
当我们在文本编辑框中键入字符时就会产生Change事件,而当我们单击命令按钮时就会产生Click事件。同样,想知道这些小东西什么时候醒来,就需使用下一节所着重讨论的Awake事件。
VB COM基础讲座之事件
相对来说,事件的使用是比较简单的。在使用前,我们必须先定义该事件,这就意味着通知Visual Basic什么事件被调用。一个事件可能有自己的参数,例如,一个Command按钮有一个Click(单击)事件,它没有参数。另外,文本编辑框有一个KeyPress事件,它通过一个叫"KeyAscii"的值来处理相关内容。
定义一个事件是在一个类的通用声明部分添加类似下面的代码:
Public Event MyEventName(PossArguments As String, Etc As Variant)
然后在代码调用RaiseEvent方法来激发一个事件。就像下面的代码一样:
RaiseEvent MyEventName("PossArgs", "Etc")
为了更好地说明上述添加和激发事件的过程,我们举一个例子。首先,定义一个事件:
在CDog类的通用声明部分添加下列代码:
Public Event Awake()
在CDog类中添加Sleep子过程:
Public Sub Sleep()
Dim i As Long
For i = 1 To 1000000
DoEvents: DoEvents: DoEvents
exit
RaiseEvent Awake
End Sub
代码中,一开始做一些1000000次无用的循环,计算机短暂停顿后,Sleep子过程激发Awake事件。
但Awake事件产生后,我们应该让程序作相应的反应呢?当然,利用命令按钮是最简单的,只要在代码窗口的列表中选择命令按钮对象。
但是那样的话,我们必然需要一个控件,而且所见的内容都在表单上。这里我们纯粹使用相应的代码,并且是不可见的。
当然用代码来接收事件,还需要额外的操作:
在表单代码窗口中的通用声明部分,添加下列代码:
Dim WithEvents MyDog As CDog
该代码不同于以前的MyDog声明,它有个关键词WithEvents用来通知Visual Basic该对象可以按收任何事件,而且该对象必须接收事件。
删除命令按钮中的所有代码;并在Command1中添加下列代码:
Set MyDog = New CDog
MyDog.Name = "Billy"
MyDog.Bark
MyDog.Sleep
该代码简单地将MyDog设置成CDog的一个新的实例,设置Name后,调用Bark,最后运行Sleep子过程。
现在添加一些代码来相应Awake事件。
在Form代码窗口中,从对象下拉列表中选择"MyDog";
在"MyDog"的"Awake"事件中,添加下列代码:
Private Sub MyDog_Awake()
MsgBox "Your pooch has awoken!"
End Sub
好了,现在就可以测试了。
按F5运行程序;
单击Command按钮;
这样,当小狗Bark后,开始打盹,最后结束时还被你叫醒。真是神奇!
"世上无难事,只要肯登攀",所以你要有信心成为一个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编程的基础。
VB COM基础讲座之类的建立
在本节中,我们来实践一下。首先创建一个COM对象,然后使用它,最后再想法改进。
首先进行下面两步:
运行Visual Basic;选择 "Standard EXE"工程类型;由于COM对象是基于类的,而类实际上是程序包,就像模块中的代码一样。所以:
选择"Project"->"Add Class Module";当相应的对话框出现后,选择"注释:Class Module",然后单击"Open"按钮。
这样,在桌面上显示一个表单,以及包含在工程Project1中的Class1。
下面再将空的类的类名更改:
在类的属性窗口中,将类的Name属性改成CDog。
需要说明的是,为了区别起见,每个对象名的前面都有相应的前缀,例如Text Box对象前是"txt"、Form前是"frm"、类前可以大写字母"C"或小写字母"cls",但这里使用前者。
下面我们添加一些代码来测试一下:
在CDog类通用声明部分中,添加变量的声明:
Public Name As String
然后,打开Form1;
在表单中添加一个命令按钮;
打开代码窗口,为该命令按钮添加下列代码:
Dim MyDog As CDog
Set MyDog = New CDog
MyDog.Name = "Billy Moore"
MsgBox MyDog.Name
Set MyDog = Nothing
下面就来解释上述代码的含义:
Dim MyDog As CDog
该行语句是用来通知Visual Basic为CDog对象设置一个位空间,但这时还不能使用该对象,必须等到下条语句为止:
Set MyDog = New CDog
它是用来创建CDog的实例。这就意味着前面空的MyDog模板变成了现在可以使用的CDog对象。
MyDog.Name = "Billy Moore"
MsgBox MyDog.Name
上述代码的第一行是用来设置MyDog的Name变量,同时第二行语句是用来将该变量的内容显示在消息对话框中。最后:
Set MyDog = Nothing
用来将MyDog对象简单的置空。
按F5键运行并测试。
怎么样?但同时,我们可能不禁要问,标准模块和类模块究竟有什么不同?我们再来看看下面的示例:
将命令按钮的代码变成:
Dim MyDog As CDog
Set MyDog = New CDog
Dim MyDog2 As CDog
Set MyDog2 = New CDog
MyDog.Name = "Billy Moore"
MsgBox MyDog.Name
MyDog2.Name = "Sadie Moore"
MsgBox MyDog2.Name
Set MyDog = Nothing
Set MyDog2 = Nothing
与最前面的代码不同的是,这里的代码实际上是定义两个对象MyDog和MyDog2,这两个对象是基于CDog的相互独立的两个对象。
按F5键运行并测试。
结果怎样?这一次是不是有两个对话框出现?一个显示"Billy Moore",另一个显示"Sadie Moore"。
上述定义的每个对象中除了Name外,没有任何实际的属性,因此下面过程就来添加:
打开前面的Class1;
声明下面的公共变量:
Public Age As Integer
打开前面的Form1;
将命令按钮的代码变成:
Dim MyDog As CDog
Set MyDog = New CDog
Dim MyDog2 As CDog
Set MyDog2 = New CDog
MyDog.Name = "Billy Moore"
MyDog.Age = 4
MsgBox MyDog.Name & " is " & MyDog.Age & " years old"
MyDog2.Name = "Sadie Moore"
MyDog2.Age = 7
MsgBox MyDog2.Name & " is " & MyDog2.Age & " years old"
Set MyDog = Nothing
Set MyDog2 = Nothing
这些代码和前面差不多,只不过这里使用了Age变量。
按F5键运行并测试。
应该出现显示name和age内容的两个消息对话框。
现在再试着将其中一个对象的age值设置成1,000或者30,000。看看结果如何?程序照样正常运行,这是因为定义的整型变量最大值可达32,767,但是实际中的狗(Dog)是不会有30,000岁的。
那么,这种情况应该怎样处理呢?
VB COM编程基础之子过程函数和参数
前面已经接触到类的变量、属性以及枚举,但我们怎样才能更好的利用它们呢?
显然,子过程就是其中的一种方式,它几乎出现所有的Visual Basic程序中,所以这里来举例说明。
在CDog类中添加下列代码:
Public Sub Bark()
MsgBox "Woof! Woof!"
End Sub
这里的子过程是最常见的,我们可以简单地使用MyDog.Bark来调用它。
下面来试一试:
将表单Form1的Command按钮的代码改成:
Dim MyDog As CDog
Set MyDog = New CDog
MyDog.Name = "Billy"
MyDog.Bark
Set MyDog = Nothing
需要说明的是,在键入"MyDog."会弹出相应的列表,各列表项前面都有不同颜色的小图标区分不同的类型。例如Bark子过程项前面的是黄绿色的,属性是灰色和蓝色的,这样能帮助我们识别Bark是MyDog对象的一个方法。
按F5运行并测试。
事实上,除了子过程外,我们也可以在代码中添加函数。这里我们就不举例了,你可以自己尝试一下。因为函数和一般子过程除了能在一个类中外,其工作也是相同的。但不要忘记,所有子过程和函数都可以有自己的参数。
现在,让我们设想一下,在类中有一个Sleep方法。当我们想要cat睡觉或dog打盹时,每次都得调用这个方法。
但是,我们怎么知道这些小东西什么时候醒来?这是一个非常有趣的问题,其答案是使用事件(event)。
当我们在文本编辑框中键入字符时就会产生Change事件,而当我们单击命令按钮时就会产生Click事件。同样,想知道这些小东西什么时候醒来,就需使用下一节所着重讨论的Awake事件。
VB COM基础讲座之事件
相对来说,事件的使用是比较简单的。在使用前,我们必须先定义该事件,这就意味着通知Visual Basic什么事件被调用。一个事件可能有自己的参数,例如,一个Command按钮有一个Click(单击)事件,它没有参数。另外,文本编辑框有一个KeyPress事件,它通过一个叫"KeyAscii"的值来处理相关内容。
定义一个事件是在一个类的通用声明部分添加类似下面的代码:
Public Event MyEventName(PossArguments As String, Etc As Variant)
然后在代码调用RaiseEvent方法来激发一个事件。就像下面的代码一样:
RaiseEvent MyEventName("PossArgs", "Etc")
为了更好地说明上述添加和激发事件的过程,我们举一个例子。首先,定义一个事件:
在CDog类的通用声明部分添加下列代码:
Public Event Awake()
在CDog类中添加Sleep子过程:
Public Sub Sleep()
Dim i As Long
For i = 1 To 1000000
DoEvents: DoEvents: DoEvents
exit
RaiseEvent Awake
End Sub
代码中,一开始做一些1000000次无用的循环,计算机短暂停顿后,Sleep子过程激发Awake事件。
但Awake事件产生后,我们应该让程序作相应的反应呢?当然,利用命令按钮是最简单的,只要在代码窗口的列表中选择命令按钮对象。
但是那样的话,我们必然需要一个控件,而且所见的内容都在表单上。这里我们纯粹使用相应的代码,并且是不可见的。
当然用代码来接收事件,还需要额外的操作:
在表单代码窗口中的通用声明部分,添加下列代码:
Dim WithEvents MyDog As CDog
该代码不同于以前的MyDog声明,它有个关键词WithEvents用来通知Visual Basic该对象可以按收任何事件,而且该对象必须接收事件。
删除命令按钮中的所有代码;并在Command1中添加下列代码:
Set MyDog = New CDog
MyDog.Name = "Billy"
MyDog.Bark
MyDog.Sleep
该代码简单地将MyDog设置成CDog的一个新的实例,设置Name后,调用Bark,最后运行Sleep子过程。
现在添加一些代码来相应Awake事件。
在Form代码窗口中,从对象下拉列表中选择"MyDog";
在"MyDog"的"Awake"事件中,添加下列代码:
Private Sub MyDog_Awake()
MsgBox "Your pooch has awoken!"
End Sub
好了,现在就可以测试了。
按F5运行程序;
单击Command按钮;
这样,当小狗Bark后,开始打盹,最后结束时还被你叫醒。真是神奇!
相关文章推荐
- Visual Basic COM基础讲座之属性
- Visual Basic COM基础讲座之事件
- Visual Basic COM基础讲座之(二)
- Visual Basic COM基础讲座之
- Visual Basic COM基础讲座之简介
- Visual Basic COM基础讲座之(三)
- Visual Basic COM基础讲座之类的建立
- Visual Basic COM基础讲座之兼容性
- Visual Basic COM基础讲座之(四)
- Visual Basic COM基础之更多属性
- Visual C++.NET编程基础讲座之二
- Visual C++.net 基础讲座一
- Visual C++.NET编程基础讲座之三
- Visual C++.net基础讲座二
- Visual C++.net基础讲座三
- Visual.Basic语法基础之一
- Visual Basic.Net基础概念和语法
- 浏览器是怎样工作的(一):基础知识 转载http://ued.ctrip.com/blog/how-browsers-work-i-basic-knowledge.html
- HOW TO:从 Visual Basic 6.0 调用 Visual Basic .NET 程序集以及从 Visual Basic .NET 调用 Visual Basic COM 组件
- Visual Basic.net语法基础