次の方法で共有


EventList.AddAdvise メソッド (Visio)

ユーザーが受け取るイベントを含むソース オブジェクトの EventList コレクションに、Event オブジェクトを追加します。 選択したイベントが発生すると、ソース オブジェクトがシンク オブジェクトに通知します。

構文

expression. AddAdvise( _EventCode_ , _SinkIUnkOrIDisp_ , _IIDSink_ , _TargetArgs_ )

EventList オブジェクトを表す変数。

パラメーター

名前 必須 / オプション データ型 説明
EventCode 必須 Integer 通知を作成するイベントです。
SinkIUnkOrIDisp 必須 バリアント型 イベント通知を受け取るオブジェクトについての COM インターフェイスへの参照です。
IIDSink 必須 String 将来使用するために予約されています。 "" の必要があります。
TargetArgs 必須 String TargetArgs プロパティを設定するために Event オブジェクトに渡される文字列。

戻り値

イベント

注釈

AddAdvise メソッドで作成されたイベント オブジェクトには、visActCodeAdviseAction プロパティがあります。 永続的なものではありません。つまり、Visio ドキュメントと共に保存することはできず、実行時に再作成する必要があります。

Event オブジェクトを含む EventList コレクションのソース オブジェクトは、イベントの報告対象のスコープを確立します。 イベントは、ソース オブジェクトと、オブジェクト モデルの階層に含まれる下位のオブジェクトに報告されます。 たとえば、特定のドキュメントが保存されたときに通知を受信するには、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 によってイベントをフィルター処理することができます。 イベント フィルターの使用に関する詳細については、SetFilter または GetFilter というプレフィックスが付いたメソッドのトピックを参照してください。

AddAdvise メソッドで作成されたイベント オブジェクトには、visActCodeAdviseAction プロパティがあります。 永続的なものではありません。つまり、Visio ドキュメントと共に保存することはできず、実行時に再作成する必要があります。

Event オブジェクトを含む EventList コレクションのソース オブジェクトは、イベントの報告対象のスコープを確立します。 イベントは、ソース オブジェクトと、オブジェクト モデルの階層に含まれる下位のオブジェクトに報告されます。 たとえば、特定のドキュメントが保存されたときに通知を受信するには、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 によってイベントをフィルター処理することができます。 イベント フィルターの使用に関する詳細については、SetFilter または GetFilter というプレフィックスが付いたメソッドのトピックを参照してください。

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 への引数の説明を示します。

Arg1 と Arg2 の値 説明
nEventCode 発生したイベントです。 イベントごとに個別のオブジェクトを使用するか、またはすべての通知を受け取ってから nEventCode に基づいて内部的に切り替える単一のオブジェクトを使用することができます。
pSourceObj 通知をトリガーした Event オブジェクトがEventList コレクションに含まれているオブジェクト。
nEventID EventList コレクション に含まれる Event オブジェクトの一意識別子です。 (EventList コレクションの Index プロパティとは異なり、Event オブジェクトがコレクションに追加またはコレクションから削除されるため、nEventID は変更されません)。
次のコードを使用して、VisEventProc から Event オブジェクトを取得します。pSourceObj .EventList.ItemFromID(nEventID )
nEventSeqNum アプリケーションの呼び出しインスタンスで発生したイベントのシーケンスに関連したイベントの序数位置です。 Visio インスタンスで発生する最初のイベントのシーケンス番号は 1、2 番目のイベントのシーケンス番号は 2 のように割り当てられます。 場合によっては、シーケンス番号を EventInfo プロパティと組み合わせて使用して、イベントに関する詳細情報を取得できます。
pSubjectObj イベントの対象となるオブジェクトです。 たとえば、ShapeAdded イベントの対象は、追加されたばかりの図形を表す Shape オブジェクトで、BeforeSelectionDelete イベントの対象は、削除する図形を選択する Selection オブジェクトです。
vMoreInfo イベントの対象についての追加情報です。 多くのイベントでは、アプリケーションが実行対象のアドオンを渡すコマンド ラインに類似した文字列が対象になります。 通知が詳細情報を含まない場合、このパラメーターは Nothing に設定されます。 特定のイベントの通知パラメーターの詳細については、このリファレンスの特定のイベント トピックを参照してください。

クエリ イベント (Query というプレフィックスが付くイベント) が nEventCode によって識別された場合、クエリ イベントを取り消すには True を返し、クエリ イベントを発生させるには False を返します。 明示的な値を返さない場合、Microsoft Visual Basic for Applications (VBA) は空の Variant を返します。 明示的な値が返されない場合、Microsoft Visual Basic for Applications (VBA) は空のバリアント型 (Variant) を返します。これは Visio によって False と解釈されます。

ソース オブジェクトと Event オブジェクトの間の接続は、次のいずれかの状況が発生するまで継続します。

  • プログラムが Event オブジェクトを削除する。
  • プログラムは、ソース オブジェクトへの最後の参照を解放します。 ( EventList コレクションと Event オブジェクトは、ソース オブジェクトに対する参照を保持します)。
  • アプリケーションを終了します。

Visio 2000 以降、 VisEventProc は値を返す関数として定義されています。 ただし、Visio では、クエリ イベント コードが渡された VisEventProc への呼び出しからの戻り値のみを確認します。 IDispatch を介して VisEventProc を提供するイベント オブジェクトには、変更は必要ありません。 クエリ イベントを処理できるように既存のイベント ハンドラーを変更するには、 Sub プロシージャを Function プロシージャに変更し、適切な値を返します。 (クエリ イベントの詳細については、 Query でプレフィックスが付いたイベント トピックについては、このリファレンスを参照してください)。

この例では、たとえば Document オブジェクトのような Microsoft Office Visio のソースオブジェクトが発生させるイベント処理用のクラス モジュールを作成する方法を示します。 このモジュールは、関数 VisEventProc で構成され、DocumentSavedPageAdded、さらに ShapesDeleted の 3 つのイベントをチェックする Select Case ブロックを使用します。 他のイベントは、既定のケース (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 メソッドを使用してイベントをシンクする方法を示します。 このモジュールには、2 つのパブリック プロシージャが含まれています。

CreateEventObjects プロシージャは、AddAdvise メソッドに渡され、イベントの通知を受け取る clsEventSink という名前のシンク オブジェクト (イベント処理) クラスのインスタンスを作成します。 さらに、このプロシージャでは、Document オブジェクトがソースとする 3 つのイベントの発生の通知をシンク オブジェクト (DocumentSavedPageAddedShapesDeleted) に送信する 3 つの Event オブジェクトを作成します。

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 のサポートおよびフィードバックを参照してください。