VB6.0中用户类和数据源类的设计和使用技术

本文介绍Visual Basic 6.0中自定义类的设计与使用方法,涵盖属性、方法、事件及数据源类等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---- Visual Basic 6.0是面向对象的编程语言,允许开发人员设计自定义类。用户自定义类(Class)是VB 6.0中实现软件重用的最基本方法,也是设计和使用Active X EXE/DLL部件的技术基础。在VB 6.0中可以用手工的方式直接设计类,也可用类设计器设计类,而且,VB 6.0提供了类向导(如数据源类向导,复杂数据源类向导)供快速设计复杂类。本文基本上以笔者设计的通讯电源电压监控为例介绍定义和使用类(特别是类的自定义事件)的方法(包括属性、方法、自定义事件),并将讨论包含两个外部数据成员的数据源类的定义、使用技术。

---- 二、自定义类的设计和使用

---- 2.1 自定义类的设计

---- 手工设计自定义类分以下四步:

---- 第一步、设计类的属性或属性过程(Property)

---- 在VB 6.0中有两种类型的属性,即用向类模块中添加Public变量的方法定义的一般属性,和用向类模块中添加Property GET/LET/SET过程的方法定义的属性过程,一般使用属性过程。属性过程分只读(Property GET)、只写(Property LET/SET)、读写(Property GET和LET/SET)属性过程三种,SET用于定义对象类型属性过程,而LET用于定义非对象类型属性过程。GET/LET/SET的含义是:当读取/使用(即Access存取)该属性值时,执行Property Get中的代码;当写入/修改(即Assign指派)该属性值时,执行Property Let或Set中的代码。因为在存取或指派属性值时能执行一段代码,我们就可以在属性过程中增加许多代码(如检验代码),这正是属性过程的优点。

---- 例如:下面代码定义了两个属性CurVolume和PreviousVolume

Option Explicit
Public PreviousVolume As Integer
    '定义了属性PreviousVolume
    '下述代码定义属性过程CurVolume
Dim mVolume As Integer
    '为属性CurVolume定义临时存贮区
Public Property Get CurVolume() As Integer
   '读属性CurVolume
  CurVolume = mVolume
End Property
Public Property Let CurVolume(ByVal vNewValue As Integer)
   '写属性CurVolume
  If vNewValue < 0 Then
     MsgBox ("电压值为负,无法写入!")
  Else
     mVolume = vNewValue
  End If
End Property

---- 关于属性过程有几点说明:

读写属性过程的Property GET名称和LET/SET名称必须相同,且Property GET的参数个数比LET/SET的参数个数少一个,但Property GET的类型和LET/SET的最后一个参数的类型相同。例如:下例定义了一个数组属性mintNa(0 TO 99)
Option Explicit
Private mintN As Integer
Private mintNa(100) As String
Public Property Get NumberOfTeeth
(ByVal Newvalue As Integer) As String
    NumberOfTeeth = mintNa(Newvalue)
End Property
Public Property Let NumberOfTeeth(ByVal Newvalue As
Integer, ByVal x As String)
    mintNa(Newvalue) = x
End Property

由于窗体为类,故可以为窗体添加属性过程。

属性过程的作用域有三种:
---- Private:本类模块中有效

---- Public:本类模块和其他模块中均有效

---- Friend:主要用于Active X部件设计。对本工程中而言,相当于Public;对其他工程/应用而言,相当于Private

---- 第二步、设计类的方法(Method)

---- 向类模块中添加Sub 或 Function 过程即可。例如:下例定义了一个公用方法

Public Sub VolumeCheck()
    If CurVolume < 200 Or CurVolume > 240 Then
        MsgBox ("引发事件VolumeWarn")
        RaiseEvent VolumeWarn
    End If
End Sub

---- 第三步、设计类的事件(Event)

---- 在VB6中,设计和使用类模块中的自定义事件很特殊,不易理解。具体而言,向类模块中添加自定义事件有三步:

---- (1)在类模块的声明部分,用Public Event 定义一个事件,事件可以有参数。例如,下例定义了两个事件:

Option Explicit
Public Event VolumeWarn()
Public Event PercentDone(ByVal pERcent As
 Integer, ByRef Cancel As Boolean)

---- (2)在该类模块的某一个模块中,用Raise Event引发该事件。例如,公用模块VolumeCheck引发事件VolumeWarn(如果属性CurVolume之值在200~240V范围之外则引发该事件):

Public Sub VolumeCheck()
    If CurVolume < 200 Or CurVolume > 240 Then
        MsgBox ("引发事件VolumeWarn")
        RaiseEvent VolumeWarn
    End If
End Sub

---- 如果该事件被引发,那么将执行为该事件编写的事件代码。问题是:事件代码在哪儿编写?不是在该类模块中编写,而是在事件源(引发该事件的对象)中编写,在事件源的声明部分用WITHEVENT声明该类。

---- (3)在事件源中编写事件代码。例如,在项目中的Test窗体中引发该事件(即Test为事件源),那么:

首先在Test窗体的声明部分用WITHEVENT声明该类(Private WithEvents xVolume As ClsVolumeCheck),代码编辑窗口的左边将出现该WITHEVENT变量xVolume

然后在代码编辑窗口的左边选择WITHEVENT变量,在右边选择VolumeWarn模块,于是产生一个空模块(如下图):


在右边的VolumeWarn模块中为该事件编写的事件代码:
Private Sub xVolume_VolumeWarn()
        MsgBox ("电压不正常!")     '处理电压代码
    ' ..............
End Sub

---- 从上可以发现,不同的事件源所编写的自定义事件代码可以不相同。如何使用事件将在后面讲述。

---- 第四步、编写类的Initalize和Terminate事件代码

---- 为该类编写初始化和中断事件。

---- 2.2 自定义类的使用

---- 使用自定义类分四步:

---- 第一步、在适当的模块中(如通用)声明类变量。若类中有自定义事件,则使用用WITHEVENT声明该类,并为自定义事件编写事件代码(如前述的设计类的事件的第(3)步)。例如:

Private WithEvents xVolume  As ClsVolumeCheck
Private yVolume  As cls多态接口  
Private zVolume  As cls抽象类

---- 第二步、在适当的模块中(如Form_Load模块)对类变量赋值。例如:

Private Sub Form_Load()
        Set xVolume = New ClsVolumeCheck
End Sub

---- 第三步、在适当的模块中(如Form_Load模块)使用类的Public或Friend属性、方法。例如:

Private Sub Command1_Click()
  xVolume.CurVolume = Text1.Text 
   '对xVolume的CurVolume属性赋值
  Call xVolume.VolumeCheck
   '调用xVolume的VolumeCheck过程
End Sub

---- 由于ClsVolumeCheck类中的VolumeCheck过程中有RaiseEvent VolumeWarn语句,故Call xVolume.VolumeCheck时可能引发事件VolumeWarn。当200 >Text1.Text >240时,将引发事件VolumeWarn,并执行在本窗体中为该类编写的事件代码:

Private Sub xVolume_VolumeWarn()
  MsgBox ("电压不正常!")
   '处理电压代码
End Sub

---- 第四步、释放类对象变量。这一点非常重要,当不用类对象变量时一定要释放它,以释放内存资源。例如:

Private Sub Form_QueryUnload(Cancel As Integer,
 UnloadMode As Integer)
   Set xVolume = Nothing
End Sub

---- 三、数据源类的设计与使用

---- 数据源类是一个从外部源获取数据的类,这些数据将被其他对象所使用的,数据识别类不是必须有可视的外在表示,也不局限于某个特定的数据接口(如DAO 或者RDO)。数据识别类可以作为任何类型数据的数据源,包括传统的 ODBC 源、ActiveX Data Objects (ADO),或者任何 OLE DB 提供程序。

---- 3.1创建步骤

---- 第一步、增加一个新类,设置类的DataSourceBehavior 属性为vbDataSource,则类就可以作为其他对象的数据源;增加ActiveX Data Objects 2.0 Library的引用。

---- 第二步、设计数据源类的Initialize事件代码、GetDataMember过程模块;

---- 第三步、为数据源类设计一些Public方法。

---- 例如下面的代码定义了一个包含两个外部数据成员的数据源类:

Option Explicit
Public Event MoveComplete() 
'公共事件
Dim WithEvents adoEmployeesRS As Recordset
   '第一个外部数据成员
Dim WithEvents adoVolumeRS As Recordset  
  '第二个外部数据成员

Private Sub Class_Initialize()
 '类的初始化事件
  Dim db As Connection
  Set db = New Connection
  db.CursorLocation = adUseClient
  db.Open "PROVIDER=Microsoft.Jet.OLEDB.3.51;
Data Source=C:/Program Files/Microsoft
Visual Studio/VB98/Nwind.mdb;"
     '创建一个具体的ADO连接
  Set adoEmployeesRS = New Recordset
  adoEmployeesRS.Open "select Address,BirthDate,City
from Employees", db, adOpenStatic, adLockOptimistic
 '创建第一个具体的外部源所对应的
  ADO Recordset(adoEmployeesRS)
  DataMembers.Add " Employees"
  Set adoVolumeRS = New Recordset
  adoVolumeRS.Open "select Address,City,CompanyName from
 Customers", db, adOpenStatic, adLockOptimistic
 '创建第二个具体的外部源所对应的
  ADO Recordset(adoVolumeRS)
  DataMembers.Add " Customers "
End Sub

Private Sub Class_GetDataMember(DataMember As String,
Data As Object) '读数据源时发生
  Select Case DataMember
  Case "Employees"   '第一个ADO Recordset
     Set Data = adoEmployeesRS
 Case  "Customers" '第二个ADO Recordset
    Set Data = adoVolumeRS
  End Select
End Sub
'下面设计一些方法:
Private Sub adoPrimaryRS_MoveComplete()
  RaiseEvent MoveComplete
End Sub
Public Sub RequeryEmployees ()
  adoPrimaryRS.Requery
  DataMemberChanged "Employees"
End Sub
Public Sub RequeryCustomers ()
  adoVolumeRS.Requery
  DataMemberChanged "Customers"
End Sub

---- 3.2 如何在窗体模块中使用数据源类

---- 可以使用下面两种方法之一完成数据源和数据消费者(如TextBox)之间的绑定:

---- 方法一、利用数据属性来完成绑定。

---- 假设Form中有两个下面文本框控件数组(txtFieldsEmployees,txtFieldsCustomers)将分别用于显示两个外部数据成员的三个字段数据,其代码为:

Option Explicit
Private WithEvents PrimaryCLS As clsEmployeesCustomers

Private Sub Form_Load()
  Set PrimaryCLS = New clsEmployeesCustomers
  Dim oText As TextBox  
'绑定文本框控件数组txtFieldsEmployees到数据提供者
  For Each oText In Me.txtFieldsEmployees
    oText.DataMember = "Employees"    '设置DataMember
    Set oText.DataSource = PrimaryCLS  '设置DataSource
  Next
  txtFieldsEmployees (0).DataField = "Address"   '设置DataField
  txtFieldsEmployees (1).DataField = "BirthDate"
  txtFieldsEmployees (2).DataField = "City"
'绑定文本框控件数组txtFieldsCustomers到数据提供者
  For Each oText In Me.txtFieldsCustomers
    oText.DataMember = "Customers"
    Set oText.DataSource = PrimaryCLS
  Next
  txtFieldsCustomers (0).DataField = "Address"
  txtFieldsCustomers (1).DataField = "City"
  txtFieldsCustomers (2).DataField = "CompanyName"
End Sub

Private Sub cmdRefresh_Click()    '调用公用方法
  On Error GoTo RefreshErr
  PrimaryCLS.RequeryEmployees
  PrimaryCLS.RequeryCustomers
  Exit Sub
RefreshErr:
  MsgBox Err.Description
End Sub

---- 方法二、利用BindingCollection来完成绑定。

---- 第一步、增加BindingCollection的引用,BindingCollection 是某个数据源和一个或多个数据使用者之间的绑定的集合。

---- 第二步、设计窗体声明、Load代码。

---- 第三步、在窗体的其他模块中使用数据源类的Public方法。

---- 例如下面的代码使用上面的包含两个外部数据成员的数据源类:

Option Explicit
Private WithEvents PrimaryCLS As clsEmployeesCustomers
Private objBC As BindingCollection   '定义一个绑定集合objBC
Private Sub Form_Load()
    Set PrimaryCLS = New clsEmployeesCustomers
    Set objBC = New BindingCollection   '对绑定集合objBC赋值

    objBC.DataMember = "Employees"  '设置objBC 的DataMember
    Set objBC.DataSource = PrimaryCLS '设置objBC 的DataSource
    objBC.Add txtFieldsEmployees(0), "text", "address"
  '使用objBC绑定集合的.Add方法绑定txtFieldsEmployees(0)
文本框的Text属性到Employees 记录集的address字段
    objBC.Add txtFieldsEmployees(1), "text", "BirthDate"
  '绑定txtFieldsEmployees(1)到BirthDate
    objBC.Add txtFieldsEmployees(2), "text", "City"
     '绑定txtFielldsEmployees(1)到City

    objBC.DataMember = "Customers"
    Set objBC.DataSource = PrimaryCLS
    objBC.Add txtFieldsCustomers(0), "text", "address"
    objBC.Add txtFieldsCustomers(1), "text", "CompanyName"
    objBC.Add txtFieldsCustomers(2), "text", "City"
End Sub

下面是我编的一个数据库类:
Option Explicit
Private conn As New ADODB.Connection
Private cmd As New ADODB.Command
Private conStr As String '用于存储连接字符串
'调用系统的方法打开连接
Public Sub connOpen()
   If conn.State <> adStateOpen Then conn.Open
End Sub
'调用系统的方法关闭连接
Public Sub connClose()
   If conn.State = adStateOpen Then conn.Close
  
End Sub
'CommandText属性便于读写SQL语句
Public Property Get CommandText() As String
   CommandText = cmd.CommandText
End Property
Public Property Let CommandText(ByVal cmdText As String)
   cmd.CommandText = cmdText
End Property
'ConnectionString属性便于读出连接字符串
Public Property Get ConnectionString() As String
    ConnectionString = conStr
End Property
'初始化类的成员数据
Private Sub Class_Initialize()
   conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + App.Path + "/data/ManPowerManage.mdb;Persist Security Info=False"
   conn.ConnectionString = conStr
End Sub
'执行SQL语句返回记录集
Public Function Execute() As ADODB.Recordset
   cmd.ActiveConnection = conn
   Set Execute = cmd.Execute
End Function

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值