必须先创建新的类模块,并声明包含事件的 AcadObject 类型的对象,然后才能使用对象层事件。例如,假设创建一个称为 EventClassModule 的新类模块。该模块包含带有 VBA 关键字 WithEvents 的应用程序声明。
- 在 VBA IDE 中,插入类模块。在“插入”菜单中,选择“类模块”。
- 在“工程”窗口中,选择该新类模块。
- 在“特性”窗口中,将类名改为 EventClass-Module。
- 使用 F7 键或通过依次选择菜单选项“查看”“代码”来打开该类的“代码”窗口。
- 在该类的“代码”窗口中,添加以下行:
Public WithEvents Object As AcadCircle
声明包含事件的新对象之后,新对象将出现在该类模块的“对象”下拉列表中,用户可以在该类模块中为新对象编写事件过程。(在“对象”框中选中新对象时,该对象的有效事件会显示在“过程”下拉列表框中。)
然而,在运行这些过程之前,必须将类模块中声明的对象与 Circle 对象相连接。可以在任何模块中使用以下代码完成此操作。
- 在主模块的“代码”窗口中,向声明部分添加以下行:
Dim X As New EventClassModule
- 在同一个窗口中,创建称为“MyCircle”的圆,然后将其初始化并使其包含事件:
Sub InitializeEvents()
Dim MyCircle As AcadCircle
Dim centerPoint(0 To 2) As Double
Dim radius As Double
centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
radius = 5#
Set MyCircle = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)
Set X.Object = MyCircle
End Sub
- 在主模块的代码中,添加对 InitializeApp 子例程的调用:
Call InitializeEvents
运行 InitializeEvents 过程之后,类模块中的 Circle 对象会指向创建的 Circle 对象,并且类模块中的事件过程会在事件发生时运行。
在多段线刷新时显示闭合多段线的面积注意在 VBA 中编写代码时,必须为所有对象(为 Modified 事件启用的)都提供一个事件处理程序。否则,VBA 可能会异常终止。本例创建包含事件的优化多段线。然后,多段线的事件处理程序会在每次更改多段线时显示新的面积。要触发事件,只需在 AutoCAD 中修改多段线的大小。请记住,必须在激活事件处理程序之前运行 CreatePLineWithEvents 子例程。
Public WithEvents PLine As AcadLWPolyline
Sub CreatePLineWithEvents()
' 本例创建一条优化多段线
Dim points(0 To 9) As Double
points(0) = 1: points(1) = 1
points(2) = 1: points(3) = 2
points(4) = 2: points(5) = 2
points(6) = 3: points(7) = 3
points(8) = 3: points(9) = 2
Set PLine = ThisDrawing.ModelSpace. _
AddLightWeightPolyline(points)
PLine.Closed = True
ThisDrawing.Application.ZoomAll
End Sub
Private Sub PLine_Modified _
(ByVal pObject As AutoCAD.IAcadObject)
' 调整多段线大小时,该事件被触发。
' 如果多段线被删除,仍会触发 modified 事件,
' 所以使用了错误处理程序以避免
' 从已删除对象读取数据。
On Error GoTo ERRORHANDLER
MsgBox "The area of " & pObject.ObjectName & " is: " _
& pObject.Area
Exit Sub
ERRORHANDLER:
MsgBox Err.Description
End Sub