必须先创建新的类模块,并声明包含事件的 AcadApplication 类型的对象,然后才能使用应用程序层事件。例如,假设创建一个称为 EventClassModule 的新类模块。该模块包含带有 VBA 关键字 WithEvents 的应用程序声明。
创建新类并声明包含事件的 Application 对象的步骤
- 在 VBA IDE 中,插入类模块。在“插入”菜单中,选择“类模块”。
- 在“工程”窗口中,选择该新类模块。
- 在“特性”窗口中,将类名改为 EventClass-Module。
- 使用 F7 键或通过依次选择菜单选项“查看”“代码”来打开该类的“代码”窗口。
- 在该类的“代码”窗口中,添加以下行:
Public WithEvents App As AcadApplication
声明包含事件的新对象之后,新对象将出现在该类模块的“对象”下拉列表中,用户可以在该类模块中为新对象编写事件过程。(在“对象”框中选中新对象时,该对象的有效事件会显示在“过程”下拉列表框中。)
然而,在运行这些过程之前,必须将类模块中的声明对象与 Application 对象相连接。可以在任何模块中使用以下代码完成此操作。
- 在主模块的“代码”窗口中,向声明部分添加以下行:
Dim X As New EventClassModule
- 在相同窗口中,添加以下子例程:
Sub InitializeEvents()
Set X.App = ThisDrawing.Application
End Sub
- 在主模块的代码中,添加对 InitializeEvents 子例程的调用:
Call InitializeEvents
运行 InitializeEvents 过程之后,类模块中的 App 对象会指向指定的 Application 对象,并且类模块中的事件过程会在事件发生时运行。
本例在将文件拖放到 AutoCAD 中时,会中断加载进程,并显示一个消息框,其中包含被拖放文件的名称以及“是”/“否”/“继续”按钮,以确定是否继续加载或显示文件。如果用户选择取消操作,那么该决定会通过 BeginFileDrop 事件的 Cancel 参数返回,并且不加载文件。
Public WithEvents ACADApp As AcadApplication
Sub Example_AcadApplication_Events()
' 本例初始化公有变量 (ACADApp)
' 该变量用于中断 AcadApplication 事件
'
' 必须先运行此过程!
' 可以从 ThisDocument 对象获取应用程序,
' 但是这将需要打开图形,
' 因此选择从系统抓取。
Set ACADApp = GetObject(, "AutoCAD.Application.17")
End Sub
Private Sub ACADApp_BeginFileDrop _
(ByVal FileName As String, Cancel As Boolean)
' 本例中断 Application BeginFileDrop 事件。
'
' 此事件在将图形文件拖放到 AutoCAD 中
' 时触发。
'
' 触发本样例事件的步骤:
' 1) 确保运行初始化
' 链接到此事件的公有变量(名为 ACADApp)的样例。
'
' 2) 将 AutoCAD 图形文件拖放到 AutoCAD
' 拖放到 AutoCAD 应用程序
' 中。
' 使用 Cancel 变量停止拖动文件的加载,
' 使用 FileName 变量通知用户要拖动
' 的文件。
If MsgBox("AutoCAD is about to load " & FileName & vbCrLf _
& "Do you want to continue loading this file?", _
vbYesNoCancel + vbQuestion) <> vbYes Then
Cancel = True
End If
End Sub