控件创建术语

控件不同于用 Microsoft Visual Basic 生成的其它对象。控件不仅仅是代码;它们还具有类似窗体的可视部分,但是又与窗体不同,它们不能脱离容器而单独存在。另外,控件同时被开发者和最终用户使用,尽管意义不同。

控件的这些特点要求另外给出一些术语。

控件类与控件实例

在 Visual Basic 中开发的控件实际上是一个控件类,它是控件创建的依据。当把一个控件放在窗体上的时候,就创建了该控件类的一个实例。

为了避免混淆,注意所设计的控件类与放在窗体上的控件实例是有区别的。

控件与控件部件

控件是由控件部件,即 .ocx 文件,提供的对象。一个控件部件可以提供多种类型的控件。

一个 ActiveX 控件工程包括一个或多个 .ctl 文件,每个文件定义一个控件类。在创建这个工程时,Visual Basic 把控件部件的扩展名设置为 .ocx。

如果开发者购买并安装了控件部件,就应该能够使用定义了的(并使之成为公开的)所有控件。

容器与定位

控件实例不能单独存在。它必须放在一个容器对象上,例如 Visual Basic 窗体。把控件实例挂接到容器上的过程叫做定位─也就是说,赋予控件在容器上的一个位置

当控件实例被定位之后,它的事件就会以事件过程的形式出现在窗体的代码窗口中,并且控件能够访问容器提供的其它服务,例如 Extender 和 AmbientProperties 对象。

接口与外观

一个控件由三部分组成,其中两个是公有的,一个是私有的。控件的外观是公有的,因为用户能看到并能同它进行交互。控件的接口,包括控件所有的属性、方法和事件,也是公有的,因为任何包含该控件实例的程序都要用到它。

控件的私有部分是它的实现,即是控件工作的代码。控件实现的效果是可见的,但代码本身是不可见的。

制作者与开发者

控件的制作者把其工程编译成一个控件部件,即 .ocx 文件,该控件部件可以包括一个或多个控件。开发者使用这些控件来创建应用程序,并且把 .ocx 文件包括在安装程序内。用户将安装并使用应用程序。

这些术语是用来避免在控件的开发者和在应用程序中使用控件的开发者之间引起混淆。以后,我们将称前者为控件的制作者。

例如,只有控件的制作者才能为 UserControl 对象的 Click 事件编写程序。

如果控件的制作者在代码结束的地方发出自己的 Click 事件,那么使用该控件的开发者在应用程序里就应为这个事件写一个处理过程,当应用程序的使用者单击该控件时,处理过程将执行所需的功能。

当应用程序的使用者单击控件时,控件的制作者和开发者的代码都将得到执行。

注意 开发者并不是 ActiveX 唯一的直接使用者。可以设计这样的控件,由用户把它们放置在 Microsoft Office 等桌面应用程序的文档上。

设计时实例与运行时实例

在设计时,当 Visual Basic 用户在窗体上放置了控件时,就创建了控件类的一个实例。用户也许会把它当作该窗体的永久固定物。事实上,这仅仅是设计时实例;如果该窗体因某种原因关闭了,如单击关闭按钮、关闭工程,或是按 F5 键使工程进入运行模式,那么这个设计时实例就销毁了。

如果工程进入了运行模式,那么一旦窗体被加载,就生成了控件的运行时实例。当该窗体被卸载时,这个运行时实例就销毁了。当窗体再次出现在设计模式下时,会生成一个新的设计时实例。

在开发环境中打开包含窗体的工程之后,第一次打开该窗体的 .frm 文件时也会生成一个新的设计时实例。.frm 文件包含控件实例所有的属性值。

当模式改变时,Visual Basic 使用 .frm 文件在内存中的复本所包含的属性值来重建控件。在对工程进行编译时,控件包含的属性值也将被编译进去,以便在已编译的应用程序运行时创建控件的运行时实例。

本章后面的“理解控件的存活期和关键事件”将详细地讨论控件的存活期。