EventList.AddAdvise 方法 (Visio)

Event 对象添加到要接收其事件的源对象的 EventList 集合。 选择的事件发生时,源对象将通知接收对象。

语法

expressionAddAdvise( _EventCode_ , _SinkIUnkOrIDisp_ , _IIDSink_ , _TargetArgs_ )

表达 一个代表 EventList 对象的变量。

参数

名称 必需/可选 数据类型 说明
EventCode 必需 Integer 生成通知的事件。
SinkIUnkOrIDisp 必需 Variant 对对象上接收事件通知的 COM 接口的引用。
IIDSink 必需 字符串 保留供以后使用。 必须为“”。
TargetArgs 必需 字符串 传递给 Event 对象用以设置其 TargetArgs 属性的字符串。

返回值

Event

备注

使用 AddAdvise 方法创建的事件对象具有 visActCodeAdviseAction 属性。 这些对象不是永久的,也就是说,它们不能存储在 Visio 文档中,而且必须在运行时重新创建。

EventList 集合中包含 Event 对象的源对象建立要报告事件的范围。 为源对象和对象模型层次结构中较低的对象报告事件。 例如,若要在保存特定文档时接收通知,请将 DocumentSaved 事件的 Event 对象添加到该文档的 EventList 集合。 若要在应用程序实例中打开任何文档时收到通知,请将 Event 对象添加到 Application 对象的 EventList 集合中。

创建 Event 对象是处理 C++ 或其他非 Microsoft Visual Basic 解决方案中的事件的一种常用方法。 使用 Visual Basic WithEvents 关键字处理事件时,源对象的事件集中的所有事件都会触发。 但是,创建用于处理事件的 Event 对象时,只会向程序通知您选择的事件。 根据您的解决方案,这可能会提高性能。

EventCode 参数通常是常量的组合。 例如, visEvtMod + visEvtCellCellChanged 事件的事件代码。 事件常量由 Visio 类型库声明,并且带有 visEvt 前缀。 若要查找要创建的事件的事件代码,请参阅事件代码

传递给 AddAdvise 方法的参数可以设置 Event 对象的 EventAction (visCodeRunAddAdvise) 和 TargetArgs 属性的初始值。

从 Visio 2002 开始,可以使用事件筛选器来优化在程序中收到的事件。 可以按对象、单元格、单元格区域或命令 ID 来筛选事件。 有关使用事件筛选器的详细信息,请参阅带有 SetFilterGetFilter 前缀的方法标题。

使用 AddAdvise 方法创建的事件对象具有 visActCodeAdviseAction 属性。 这些对象不是永久的,也就是说,它们不能存储在 Visio 文档中,而且必须在运行时重新创建。

EventList 集合中包含 Event 对象的源对象建立要报告事件的范围。 为源对象和对象模型层次结构中较低的对象报告事件。 例如,若要在保存特定文档时接收通知,请将 DocumentSaved 事件的 Event 对象添加到该文档的 EventList 集合。 若要在应用程序实例中打开任何文档时收到通知,请将 Event 对象添加到 Application 对象的 EventList 集合中。

创建 Event 对象是处理 C++ 或其他非 Microsoft Visual Basic 解决方案中的事件的一种常用方法。 使用 Visual Basic WithEvents 关键字处理事件时,源对象的事件集中的所有事件都会触发。 但是,创建用于处理事件的 Event 对象时,只会向程序通知您选择的事件。 根据您的解决方案,这可能会提高性能。

EventCode 参数通常是常量的组合。 例如, visEvtMod + visEvtCellCellChanged 事件的事件代码。 事件常量由 Visio 类型库声明,并且带有 visEvt 前缀。 若要查找要创建的事件的事件代码,请参阅事件代码

传递给 AddAdvise 方法的参数可以设置 Event 对象的 EventAction (visCodeRunAddAdvise) 和 TargetArgs 属性的初始值。

从 Visio 2002 开始,可以使用事件筛选器来优化在程序中收到的事件。 可以按对象、单元格、单元格区域或命令 ID 来筛选事件。 有关使用事件筛选器的详细信息,请参阅带有 SetFilterGetFilter 前缀的方法标题。

使程序可以处理来自 Microsoft Visual Basic 或 Visual Basic for Applications 的事件通知

若要处理通知,应创建一个可实现 IVisEventProc 接口的类模块,然后创建此类要作为参数传递给 AddAdvise 方法的一个实例。

IVisEventProc 接口包含单个函数和以下声明:

Implements IVisEventProc 
 
Private Function IVisEventProc_VisEventProc( _  
    ByVal nEventCode As Integer, _  
    ByVal pSourceObj As Object, _  
    ByVal nEventID As Long, _  
    ByVal nEventSeqNum As Long, _  
    ByVal pSubjectObj As Object, _  
    ByVal vMoreInfo As Variant) As Variant  
End Function

下表列出了 VisEventProc 参数的说明。

参数 说明
nEventCode 已发生的事件。 可以为每个事件提供一个不同的对象,也可提供单个对象,该对象接收所有的通知并根据 nEventCode 在内部进行切换。
pSourceObj EventList 集合包含触发通知的 Event 对象。
nEventID Event 对象在 EventList 集合内的唯一标识符。 (与 EventList 集合的 Index 属性不同,nEventID 不会更改,因为事件对象在集合中添加或删除。)
使用以下代码从 VisEventProc 获取 Event 对象:pSourceObj .EventList.ItemFromID(nEventID )
nEventSeqNum 相对于在应用程序的调用实例中所发生事件的序列的事件的序号位置。 在 Visio 实例中发生的第一个事件的序列号为 1,第二个事件的序列号为 2,依此类推。 在某些情况下,可以将序列号与 EventInfo 属性结合使用,以获取有关事件的详细信息。
pSubjectObj 与事件有关的对象。 例如,ShapeAdded 事件的主题为 Shape 对象,该对象表示刚刚添加的形状,而 BeforeSelectionDelete 事件的主题为 Selection 对象,在该对象中要删除的形状已被选择。
vMoreInfo 有关事件主题的附加信息。 对于多数事件,附加信息是指类似于应用程序传递它所执行的加载项时所用的命令行的字符串。 如果通知中不包括附加信息,则此参数将被设置为 Nothing。 有关特定事件的通知参数的详细信息,请参阅此参考中的特定事件主题。

如果 nEventCode 标识了查询事件(带有 Query 前缀的事件),则将返回 True 以取消事件,或者返回 False 以允许事件发生。 对于其他事件,此值可为任意值。 如果不返回显式值,则 Microsoft Visual Basic for Applications (VBA) 将返回空的 Variant,Visio 将该值解释为 False

源对象与 Event 对象之间的连接会一直存在到出现以下情况之一为止:

  • 程序删除了 Event 对象。
  • 程序释放对源对象的最后一次引用。 (EventList 集合和 Event 对象在其源对象上保存引用。)
  • 应用程序终止。

从 Visio 2000 开始, VisEventProc 定义为返回值的函数。 但是,Visio 仅查看对传递查询事件代码的 VisEventProc 调用的返回值。 通过 IDispatch 提供 VisEventProc的事件对象不需要更改。 若要修改现有事件处理程序以便它们能够处理查询事件,请将 Sub 过程更改为 Function 过程并返回相应的值。 (有关查询事件的详细信息,请参阅此参考,了解以 Query.) 前缀的事件主题

示例

此示例示范如何创建类模块来处理由 Microsoft Office Visio 中的源对象(如 Document 对象)触发的事件。 该模块包含 VisEventProc 函数,它使用 Select Case 块查找三个事件:DocumentSavedPageAddedShapesDeleted。 其他事件属于默认情况 (Case Else)。 每个 Case 块构造一个字符串 ( strMessage ) ,其中包含触发的事件的名称和事件代码。 最后,该函数在“立即”窗口中显示这一字符串。

将此示例代码复制到 Microsoft Visual Basic for Applications (VBA) 或 Visual Basic 中的新的类模块中,将该模块命名为 clsEventSink。 然后,可以使用接下来的事件接收模块创建 clsEventSink 类的一个实例以及用于向该类实例发送事件引发通知的 Event 对象。

Implements Visio.IVisEventProc  
 
'Declare visEvtAdd as a 2-byte value 
'to avoid a run-time overflow error 
Private Const visEvtAdd% = &H8000 
 
Private Function IVisEventProc_VisEventProc( _  
    ByVal nEventCode As Integer, _  
    ByVal pSourceObj As Object, _  
    ByVal nEventID As Long, _  
    ByVal nEventSeqNum As Long, _  
    ByVal pSubjectObj As Object, _  
    ByVal vMoreInfo As Variant) As Variant  
 
    Dim strMessage As String 
     
    'Find out which event fired 
    Select Case nEventCode  
        Case visEvtCodeDocSave  
            strMessage = "DocumentSaved (" & nEventCode & ")"  
        Case (visEvtPage + visEvtAdd)  
            strMessage = "PageAdded (" & nEventCode & ")"  
        Case visEvtCodeShapeDelete 
            strMessage = "ShapesDeleted(" & nEventCode & ")"  
        Case Else  
            strMessage = "Other (" & nEventCode & ")"  
    End Select 
     
    'Display the event name and the event code 
    Debug.Print strMessage  
 
End Function

下面的 VBA 模块说明如何使用 AddAdvise 方法来接收事件。 该模块包含两个公共过程。

CreateEventObjects 过程创建名为 clsEventSink 的接收对象(事件处理)类的一个实例,该实例传递给 AddAdvise 方法并接收事件通知。 此外,该过程创建下面三个 Event 对象,以便将 Document 对象产生的三个事件的引发通知发送给该接收对象:DocumentSavedPageAddedShapesDeleted

DeleteEventObjects 过程在程序使用完 Event 对象后将这些对象删除。

clsEventSink 类实现 IVisEventProc 接口。

以下示例假定 Visio 应用程序窗口中有一个活动文档。

Option Explicit 
 
Private mEventSink As clsEventSink 
 
Dim vsoDocumentEvents As Visio.EventList       
Dim vsoDocumentSavedEvent As Visio.Event  
Dim vsoPageAddedEvent As Visio.Event  
Dim vsoShapesDeletedEvent As Visio.Event 
    
'Declare visEvtAdd as a 2-byte value 
'to avoid a run-time overflow error 
Private Const visEvtAdd% = &H8000  
 
Public Sub CreateEventObjects()      
 
    'Create an instance of the clsEventSink class 
    'to pass to the AddAdvise method. 
    Set mEventSink = New clsEventSink 
  
    'Get the EventList collection of the active document. 
    Set vsoDocumentEvents = ActiveDocument.EventList  
 
    'Add Event objects that will send notifications. 
    'Add an Event object for the DocumentSaved event. 
    Set vsoDocumentSavedEvent= vsoDocumentEvents.AddAdvise( _  
     visEvtCodeDocSave, mEventSink, "", "Document saved...")  
 
    'Add an Event object for the PageAdded event. 
    Set vsoPageAddedEvent= vsoDocumentEvents.AddAdvise( _  
     visEvtAdd + visEvtPage, mEventSink, "", "Page added...")  
 
    'Add an Event object for the ShapesDeleted event. 
    Set vsoShapesDeletedEvent = vsoDocumentEvents.AddAdvise( _  
     visEvtCodeShapeDelete, mEventSink, "", "Shapes deleted...")  
 
End Sub   
 
Public Sub DeleteEventObjects()  
 
    'Delete the Event object for the DocumentSaved event.    
    vsoDocumentSavedEvent.Delete  
    Set vsoDocumentSavedEvent = Nothing 
 
    'Delete the Event object for the PageAdded event. 
    vsoPageAddedEvent.Delete  
    Set vsoPageAddedEvent = Nothing 
 
    'Delete the Event object for the ShapesDeleted event.  
    vsoShapesDeletedEvent.Delete  
    Set vsoShapesDeletedEvent = Nothing 
 
End Sub

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。