AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VB编程

ActiveX控件的创建

51自学网 http://www.wanshiok.com

(4)创建由控件工程和测试工程组成的工程组

◆启动一个新的ActiveX控件工程。
◆按下CTRL+T 组合键或者选择【工程】|【部件】菜单选项,显示【部件】对话框,在【控件】选择框中选择Microsoft Windows Common Controls 6.0。
◆ 选择【工程】|【引用】菜单选项,显示【引用】对话框,在【可用的引用】选择框中选择Microsoft ActiveX Data Objects 2.0 Library。
◆在UserControl窗口中添加一ListView控件,ListView控件的左上角位置为0,0。
◆设置ActiveX工程和UserControl控件属性值,如下表所示。

   条目             设置
  工程类型           ActiveX控件
  工程名称           DataLV
  工程描述           通过ADO,使得ListView控件能够直
                 接操作数据库
  UserControl 的Name属性    DataListView
  UserControl 的Public属性   True

◆保存这个工程。
◆选择【文件】|【添加工程】菜单选项。然后添加一个标准EXE工程。建  立该工程的目的是为了在创建ActiveX控件时不断地进行测试。

   此时已建立了一个由控件工程和测试工程组成的工程组,下面就可以正式开始创建DataListView控件。

(5)实现控件的外观

   确定控件外观的方式取决于当前控件的创建模型。如果要创建一个用户绘制控件,那么必须自己在UserControl_Paint 事件过程编写代码来完成所有的绘制工作,同时还需要确定何时绘制控件,以便在需要的时候调用UserControl的Refresh方法来产生Paint 事件。如果是改进一个现有控件,那么只需正确地将组成控件放置在UserControl上即可。

   由于DataListView控件仅包含ListView一个组成控件,那么只需简单地在UserControl1上绘出一个标准ListView控件,控件名为缺省的ListView1,即可完成外观绘制工作。

   为了在使用控件时,使ListView控件和自己绘制的空间相匹配,必须建立UserControl的Resize事件过程。Resize事件过程的代码如下:

Private Sub UserControl_Resize()
   ListView1.Left = 0
   ListView1.Top = 0
   ListView1.Width = UserControl.Width
   ListView1.Height = UserControl.Height
End Sub

   仅四行代码的Resize事件过程是简单控件的用户界面的所有必须的代码,其目的是使ListView控件和UserControl对象有相同的尺寸。

(6)实现控件的接口和功能

   这是整个创建过程中最核心、最重要也是最复杂的步骤。对于创建控件的每一属性、事件和方法均需逐一实现。

◆创建DataServerName属性

   要创建DataServerName属性值,首先需要添加一个在内部存贮属性值的局部变量。要做到这一点,在UserControl对象的Genaral Declarations通用声明语句中创建此变量。如下所示:

Dim m_DataServerName As String

   接着需要创建称为DataServerName的新属性,可以通过手工输入Get和Let过程,或者选择【工具】|【添加过程】|【类型】创建这个新属性。DataServerName属性的代码相当容易理解。当置DataServerName属性的值时,Property Get过程仅将局部变量的存贮内容取出来。当设置DataServerName属性值时,Property Let过程将为局部变量赋予一个有效值。以下是两个Property过程的代码:

Public Property Get DataServername() As String
   DataServername = m_DataServerName
End Property

Public Property Let DataServername(ByVal New_DataServerName As String)
   m_DataServerName = New_DataServerName
   PropertyChanged "DataServerName"
End Property

   需要注意的是在Property Let过程中,有一个PropertyChanged方法,它的功能是通知容器(可以理解为存放所有属性的单元)属性值已变更,需产生一个WriteProperties 事件,来保存新属性值。事实上不仅在Property Let过程需要调用PropertyChanged方法,在UserControl的代码模块中无论何时改变了ActiveX控件的某个属性值,均需调用该过程,以保存属性的变化。

   注意Property DataServerName方法的用法,此方法与ReadProperties
和WriteProperties事件在一起使用。

   此时需要使用用户控件的InitProperties事件指定此属性的初始值:

Private Sub UserControl_InitProperties()
   m_DataServerName = m_def_DataServerName
End Sub

   即使用户没有设置初始值,这些代码也会确保设置了一个初始值。

   至于DataBaseName、AdministratorName、PasseordName 属性的创建过程跟DataServername属性的创建过程完全一样,这里就不再重复叙述。

◆使用PropertyBag对象

   用户还需要为WriteProperties和ReadProperties事件创建代码,从而保护DataServername、DataBaseName、AdministratorName、PasseordName属性在设计阶段的属性值。这两个事件都使用PropertyBag 对象保存和检索DataServername、DataBaseName、AdministratorName、PasseordName属性的值。PropertyBag对象能够保持DataServername、DataBaseName、
AdministratorName、PasseordName的设计值。具体实现代码如下:

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
   m_DataServerName = PropBag.ReadProperty("DataServerName",
            m_def_DataServerName)
   m_DataBaseName = PropBag.ReadProperty("DataBaseName",
            m_def_DataBaseName)
   m_AdministratorName = PropBag.ReadProperty("AdministratorName", m_def_AdministratorName)
   m_PasswordName = PropBag.ReadProperty("PasswordName",
            m_def_PasswordName)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
   Call PropBag.WriteProperty("DataServerName", m_DataServerName,
             m_def_DataServerName)
   Call PropBag.WriteProperty("DataBaseName", m_DataBaseName,
             m_def_DataBaseName)
   Call PropBag.WriteProperty("AdministratorName",
          m_AdministratorName, m_def_AdministratorName)
   Call PropBag.WriteProperty("PasswordName", m_PasswordName,
          m_def_PasswordName)
End Sub

   由于这两个过程是针对"容器"对象的,因此所有属性值的保存和读取都通过这两个过程来实现,而不是每个属性都需要单独的两个过程。其中,PropertyBag就是"容器对象"的名称。

 
 

上一篇:在VB6中实现Kodak控件编程  下一篇:VB6中用Oracle数据控件访问Oracle