65.9K
CodeProject 正在变化。 阅读更多。
Home

VBA 复合控件对象模型

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2011 年 2 月 26 日

Ms-PL

4分钟阅读

viewsIcon

29234

downloadIcon

471

一种管理复杂、事件驱动的控件交互的方法

screenshot.JPG

引言

VBA Composite Control 对象模型封装了 Visual Basic for Applications 中控件和对象之间的事件驱动交互。通过封装复杂的控件交互,可以使用标准的 Office ActiveX 控件和其他对象来创建具有自定义特殊效果或增强功能的新“控件”(例如,向 TabControl 添加 RecordSource)。

背景

该项目最初是出于使用 WithEvents 关键字在 Microsoft Access 中创建 ActiveX 控件的动态回调的兴趣而开发的。

您可以在 Microsoft Access Team Blog 上找到我关于该项目的原始博客。

您还可以访问为该项目建立的 Codeplex 站点

到目前为止,该项目完全用 Microsoft Access VBA 开发。然而,我们努力使代码尽可能通用,以便在支持 VBA 的其他 Microsoft Office 产品或第三方应用程序中实现。

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

Using the Code

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

简而言之,对象模型由以下元素组成

接口

接口使得可以将各种复合控件类强制转换为通用类型,公开核心成员,并消除了依赖后期绑定 VBA 数据类型(ObjectVariant)以及缓慢的 VBA 调用函数(CallByName()Application.Run() 等)的需要。使用接口来促进早期绑定可以实现比后期绑定技术大一个数量级的性能提升。

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

  • iControl_Base - 定义所有复合控件类共有的基本属性(NameIDControlType)。
  • iControl - 定义 cControlcControl_EventHandler 类特有的成员。
  • iControl_EventHandler - 定义 cControl_EventHandler 类特有的成员。
  • iCallback - 定义 cCallback 类特有的成员。

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

对象模型的核心类包括

  • cCompositeControl - 顶层管理类。
  • cCompositeControlManager - 在 cCompositeControls 对象中实例化,此类创建/初始化 cControlcControl_EventHandler 对象。
  • cControl - 对象模型的工作引擎。此类封装了任何对象的事件驱动交互,无论是 ActiveX 控件、复合控件还是其他!
  • cControl_EventHandler - cControl 类的一个特例。cControl_EventHandler 类充当声明事件的委托者。
  • cControlChild_Event - cControl_EventHandler 类的一个子类。此类提供实际的委托,在与其关联的事件触发时执行注册到类实例的回调。
  • cCallback - 提供回调函数的类,这些回调函数可以注册到 cControlChild_Event 类委托者。

支持模块

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

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

关注点

为了使对象模型工作,实现了一些来自 OOP 的关键思想。首先是委托的概念。它奏效了,而且效果很好。其次是实现了接口以允许对类进行“强制转换”。这种将类强制转换为更通用接口类型的能力,使得对象模型能够与几乎任何类型的对象交互,同时规避了与未知对象类型交互通常所需的速度较慢的后期绑定技术。

历史

Alpha 版本发布的改进包括大量实现了接口,减少/重组了代码模块,以及更健壮的对象监视器开发工具的实现。另请注意,Beta 版本中缺少 cControl_Binder 类,待更健壮的实现(cDataSource 类)开发完成后再进行。

VBA Composite Control 对象模型 - CodeProject - 代码之家
© . All rights reserved.