单机类模块编程简介 这篇文章中的信息适用于: Microsoft Access 2000 本文的发布号曾为 CHS209968 高级用户:要求具有高级编程、互操作性和多用户技巧。 本文适用于 Microsoft Access 数据库 (.mdb) 和 Microsoft Access 项目 (.adp)。 概要 本文讲述在 Microsoft Access 2000 中如何提出单机类模块概念及如何实施它。类模块是在 Microsoft Access 7.0 中引入的,其中窗体和报表后面的类模块可以允许用户创建程序来定义对象的自定义方法和属性。 Access 2000 支持单机类模块,允许您创建不提供用户界面的类实例,除非您通过编程提供用户界面。 更多信息 类模块有以下几个特点: ●Initialize 事件 ●自定义功能 ●Terminate 事件 每个类模块均有使用周期,使用周期的定义是在代码中持续引用类的时间长度。 Initialize 事件 创建类实例时 Initialize 事件发生。例如,用于设置默认值和初始化变量的事件。 自定义功能 可以创建在您的类中内部使用的“私有”变量、属性和方法(函数),以及供其它用户实施您的类的“公用”变量、属性和方法。 Terminate 事件 当明确卸载您的类实例或对类的引用超出范围时,Terminate 事件发生。 使用类模块的程序示例 请参考下列引用名为 clsTest 类模块的样例程序: Function CreateClass1() As Boolean Dim cls As New clsTest Dim varResult As Variant MsgBox cls.ClassState, vbInformation, "Class Example" varResult = cls.AddInvoice("ALFKI") MsgBox cls.ClassState, vbInformation, "Class Example" Set cls = Nothing CreateClass1 = True End Function 该示例: 新建 clsTest Class 对象的实例。 调用 Class 对象的 AddInvoice 方法,并传递有效的 Customer ID(客户 ID)。 通过将 cls 对象设置为 Nothing 来卸载 Class 对象。 在样例代码中并不能清楚地看到该代码实现的细节。例如,不能确定创建 Class 对象时所发生的操作,也不能确定关闭该类时 AddInvoice 方法执行的操作或所发生的操作。这就是类模块编程技术的要点;在调用 Class 对象时,可以将所发生的复杂操作隐藏在后台。面向类的编程技术有很多优点,将在本文中详细说明。 创建样例类模块和支持代码 注意事项:执行本文中的步骤将会修改样例数据库 Northwind.mdb。需要备份 Northwind.mdb 文件,并在数据库备份上执行这些步骤。 每次创建 Class 对象时,就会在该类中发生可捕获的 Initialize 事件,它类似于窗体中的 Open 事件。Initialize 事件位于要编写类以执行操作的地方。对于 C++ 程序员来说,它类似于 Constructor。 请执行这些步骤创建 clsTest 类模块示例: 打开样例数据库 Northwind.mdb。 在插入菜单上,单击类模块。 将类模块另存为 clsTest。 在“声明”部分键入以下行: Private This_ClassState As String Private This_frm As Form 在模块窗口的对象框中选择类。 初始化是在过程框中自动选择的。 添加以下程序: Private Sub Class_Initialize() This_ClassState = "Initialized" End Sub 添加下列自定义属性函数: Public Property Get ClassState() As String ClassState = This_ClassState End Property clsTest 的 Initialize 事件中的代码设置名为 ClassState 的只读属性的默认值。ClassState 将 Class 对象的当前状态返回到调用方。该代码并不是为了使用目的,而只是说明在实施类模块时可以使用的技术。 下列程序说明如何从 Class 对象中检索 ClassState 属性: Function GetClass1State() As String Dim cls As New clsTest Dim varResult as String varResult = cls.ClassState Set cls = Nothing GetClass1State = varResult End Function 该程序从 Class 对象中返回 Initialized,说明当计划类的结果功能时要使用的概念。您可以定义类所执行的操作,此外,可以考虑如何在您的类中实现接口。这与设计窗体以便从美学角度愉悦用户的概念是一样的,不过在这种情况中,目标观众是使用 Visual Basic for Applications 编程的人员。 创建一个程序用作 clsTest 类模块的 AddInvoice 方法。该代码类似于标准模块中的代码: 在 clsTest 类模块中创建下列程序: Function AddInvoice(custID As String) As Boolean On Local Error GoTo AddInvoice_Err Dim Msg As String Dim lngOrderID As Long Dim varResult As Variant Set This_frm = Form_Orders This_frm.Modal = True This_frm.Visible = True DoCmd.GoToRecord acForm, This_frm.Name, acNewRec This_frm.CustomerID = custID varResult = This_frm.SetShipTo This_ClassState = "RecordActive=" & CStr(This_frm.OrderID) AddInvoice = True AddInvoice_End: Exit Function AddInvoice_Err: Msg = "Error #: " & Format$(Err.Number) & vbCrLf Msg = Msg & Err.Description Err.Raise vbObjectError, "clsTest.AddInvoice", Msg Resume AddInvoice_End End Function 该程序使用简单编程技术打开“订单”窗体,添加新记录并显示记录进行编辑。使用数据访问对象 (DAO) 时,有许多可以用于该代码的增强功能。例如,您可以修改代码来检索客户的最后订单并复制它,而不用打开“订单”窗体。为了说明目的,本示例使用窗体本身来添加新记录。 注意:错误处理事件使用 Err 对象的 Raise 方法。该操作允许类的调用方(而不是用户)来处理任何错误。 该程序使用简单编程技术打开“订单”窗体,添加新记录并显示记录进行编辑。使用数据访问对象 (DAO) 时,有许多可以用于该代码的增强功能。例如,您可以修改代码来检索客户的最后订单并复制它,而不用打开“订单”窗体。为了说明目的,本示例使用窗体本身来添加新记录。 保存并关闭 clsTest 类模块。 该程序使用简单编程技术打开“订单”窗体,添加新记录并显示记录进行编辑。使用数据访问对象 (DAO) 时,有许多可以用于该代码的增强功能。例如,您可以修改代码来检索客户的最后订单并复制它,而不用打开“订单”窗体。为了说明目的,本示例使用窗体本身来添加新记录。 在“设计”视图中打开“订单”窗体。 该程序使用简单编程技术打开“订单”窗体,添加新记录并显示记录进行编辑。使用数据访问对象 (DAO) 时,有许多可以用于该代码的增强功能。例如,您可以修改代码来检索客户的最后订单并复制它,而不用打开“订单”窗体。为了说明目的,本示例使用窗体本身来添加新记录。 在视图菜单中,单击代码,然后键入下列程序: Public Function SetShipTo() As Boolean Call CustomerID_AfterUpdate SetShipTo = True End Function “订单”窗体的类模块中需要有该程序,才能支持 clsTest 类模块示例。该程序调用 CustomerID 控件的 AfterUpdate 事件。需要更新窗体上的“收货者”信息,这是当用户从 CustomerID 列表中选择“客户”时通过用户界面触发的。由于 CreateClass1() 样例程序在代码中设置了 CustomerID 值,因此能提供一种触发 AfterUpdate 事件和更新“收货者”信息的方式。 该程序使用简单编程技术打开“订单”窗体,添加新记录并显示记录进行编辑。使用数据访问对象 (DAO) 时,有许多可以用于该代码的增强功能。例如,您可以修改代码来检索客户的最后订单并复制它,而不用打开“订单”窗体。为了说明目的,本示例使用窗体本身来添加新记录。 关闭并保存“订单”窗体。 类模块也支持 Terminate 事件。当 Class 对象超出范围,或通过将对象变量设置为 Nothing 从内存中卸载它时,该事件触发。Terminate 事件非常重要,因为您使用它来清除类本身初始化的任何对象或引用对象。对于 C++ 程序员,这类似于 Destructor 执行下列步骤,在关闭“订单”窗体和卸载 This_frm 变量的 clsTest 类模块中创建 Terminate 事件: 在“设计”视图中打开 clsTest 类模块。 在模块窗口的对象框中选择类。 在模块窗口的过程框中选择终止。 添加以下程序: Private Sub Class_Terminate() DoCmd.Close acForm, This_frm.Name Set This_frm = Nothing MsgBox "Class Terminated", vbInformation, "Class Example" End Sub 测试样例类模块 执行下列步骤测试 clsTest 类模块的功能: 新建一个标准模块并将它保存为 Module1。 键入以下程序: Function CreateClass1() As Boolean Dim cls As New clsTest Dim varResult As Variant MsgBox cls.ClassState, vbInformation, "Class Example" varResult = cls.AddInvoice("ALFKI") MsgBox cls.ClassState, vbInformation, "Class Example" Set cls = Nothing CreateClass1 = True End Function 要测试该函数,请在“立即”窗口中键入下列代码行,然后按 ENTER: ?CreateClass1() 注意该函数可以执行下列操作: 显示一个消息框,表示类已经被“初始化”。 打开“订单”窗体并显示 CustomerID ALFKI 的空白发票。 显示一个消息框表示 RecordActive= OrderId,其中 OrderID 是自动分配给新订单的编号。 关闭“订单”窗体。 显示一个消息框,表示类已经被“中断”。 参考 有关类模块的详细信息,请单击帮助菜单上的 Microsoft Access 帮助,在“Office 助手”或“操作向导”中输入创建与窗体或报表不相关的类模块,然后单击搜索查看该主题。 |
|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )
GMT+8, 2024-4-29 12:19 , Processed in 0.067549 second(s), 16 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.