启用对象层事件

AutoCAD ActiveX/VBA

 
启用对象层事件
 
 
 

必须先创建新的类模块,并声明包含事件的 AcadObject 类型的对象,然后才能使用对象层事件。例如,假设创建一个称为 EventClassModule 的新类模块。该模块包含带有 VBA 关键字 WithEvents 的应用程序声明。

创建新类并声明包含事件的 Circle 对象的步骤

  1. 在 VBA IDE 中,插入类模块。在“插入”菜单中,选择“类模块”。
  2. 在“工程”窗口中,选择该新类模块。
  3. 在“特性”窗口中,将类名改为 EventClass-Module。
  4. 使用 F7 键或通过依次选择菜单选项“查看”“代码”来打开该类的“代码”窗口。
  5. 在该类的“代码”窗口中,添加以下行:
Public WithEvents Object As AcadCircle

声明包含事件的新对象之后,新对象将出现在该类模块的“对象”下拉列表中,用户可以在该类模块中为新对象编写事件过程。(在“对象”框中选中新对象时,该对象的有效事件会显示在“过程”下拉列表框中。)

然而,在运行这些过程之前,必须将类模块中声明的对象与 Circle 对象相连接。可以在任何模块中使用以下代码完成此操作。

将声明的对象与 Automation 对象相连接的步骤

  1. 在主模块的“代码”窗口中,向声明部分添加以下行:
    Dim X As New EventClassModule
  2. 在同一个窗口中,创建称为“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
  3. 在主模块的代码中,添加对 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