VBA中的事件驱动交互封装

在Visual Basic for Applications (VBA)中,封装事件驱动的交互是一种提高代码复用性和维护性的有效方法。通过封装复杂的控件交互,可以使用标准的OfficeActiveX控件和其他对象来创建具有自定义特效或增强功能的“控件”(例如,为TabControl添加RecordSource)。

此外,可以访问为这个项目建立的Codeplex网站。到目前为止,这个项目完全在Microsoft AccessVBA中开发。然而,已经努力使代码尽可能通用,以便于在其他支持VBA的Microsoft Office产品或第三方应用程序中实现。

最终,代码完全位于VBA中。也就是说,项目的一个主要要求是所有功能都必须完全在VBA代码中维护。不允许使用插件、DLL或其他第三方解决方案。这包括避免添加项目引用和限制使用WinAPI。这个决定的主要原因是使对象模型适合在对宏有限制性IT政策的环境中实现。

使用代码

由于这个项目更多的是关于开发一个对象模型,而不是创建小部件,所以以有意义的方式引用代码示例有点困难。Codeplex教程提供了一些深入开发复合控件和事件处理程序的例子。

简要地说,对象模型由以下元素组成:

接口使得可以将各种复合控件类转换为通用类型,暴露核心成员,消除依赖于后期绑定VBA数据类型(Object和Variant)和慢速VBA调用函数(CallByName、Application.Run等)的需要。使用接口来促进早期绑定可以实现比后期绑定技术快一个数量级的性能提升。

在对象模型中实现的接口包括:

  • iControl_Base - 定义所有复合控件类共有的基本属性(Name、ID和ControlType)。
  • iControl - 定义特定于cControl和cControl_EventHandler类的成员。
  • iControl_EventHandler - 定义特定于cControl_EventHandler类的成员。
  • iCallback - 定义特定于cCallback类的成员。

对象模型存在于其类中。类层次结构的特点是结构浅,有助于简化内存管理和减少代码模块。此外,对象模型被设计为模块化,核心只扩展所需的类。

对象模型中核心的类包括:

  • cCompositeControl - 顶级管理类。
  • cCompositeControlManager - 在cCompositeControls对象中实例化,此类创建/初始化cControl和cControl_EventHandler对象。
  • cControl - 工作马。此类封装了任何类型对象之间的事件驱动交互,无论是ActiveX控件、复合控件还是其他东西!
  • cControl_EventHandler - cControl类的一个特殊情况。cControl_EventHandler类充当声明事件的委托人。
  • cControlChild_Event - cControl_EventHandler类的一个子类。此类提供实际的委托,当它关联的事件被触发时,执行与类实例注册的回调。
  • cCallback - 类提供可以与cControlChild_Event类委托人注册的回调函数。

支持模块作为跨类调用的函数的存储库,或者特定于类的函数,不需要包含在类中。使用支持模块可以减少类中的代码量,从而减少内存需求和整体加载时间。支持模块特定于各个类,以鼓励模块化,只有两个模块作为通用存储库,用于存储函数、枚举、数据类型和常量。

支持模块中还包含创建函数。简单地说,创建函数是特定于复合控件类型的公开可用函数。这种类型的函数的实现封装了在Form级别创建/初始化/配置复合控件所需的代码。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485