Visio® の Event オブジェクトは、イベントとアクションのペアを確立します。アドオンを実行するため、またはイベントの発生をプログラムの中のオブジェクト (シンク オブジェクトまたはイベント シンクとも言います) に通知するためです。これを実現するには、処理したいイベントを記述し、Visio が行うアクションも記述した Event オブジェクトを作成します。イベントが発生したとき Event オブジェクトが起動し、そのアクションが開始されます。
はじめに、ユーザーのソリューションが要求する Event オブジェクトのタイプを決定しなければなりません。何をソース オブジェクトにするか。どんなイベントを受け取る必要があるか。ユーザーのソリューションは、受け取ったイベントにどのように反応するか。これらのことを決定した後、アドオンを実行する、または通知を受け取る Event オブジェクトを作成します。
注 Microsoft Visual Basic 5.0 および Visual Basic for Applications (VBA) 5.0 より前のバージョンでは、これが Visio でイベント ハンドラを作成する唯一の方法でした。VBA 以外の言語でソリューションを開発しているとき、これが多くの場合、最も適切な技法です。しかし Visual Basic または VBA のバージョン 5.0 以上でソリューションを開発している場合は、イベントに対応するコードを作成する方法もあります。Visio でイベントに対応するコードを作成する方法の詳細については、「セクション 2 イベントに対応するコードの作成」を参照してください。
このセクションの内容...
Event オブジェクトを作成する前に、以下のことを決定する必要があります。
スコープは、Event オブジェクトをその EventList コレクションに追加するソース オブジェクトを決定します。EventList コレクションを持つどのオブジェクトでもイベントのソースとなることができます。パフォーマンスを良くするために、指定したスコープの中で Event オブジェクト を起動できるオブジェクトのうちの、最も低い階層の中のオブジェクトの EventList コレクションに追加します。
処理するイベントを指定するには、そのイベント コードを Add または AddAdvise メソッドに提供します。イベント コードは、Visio のタイプ ライブラリの中の visEvt という接頭辞が付いているコードです。イベント コードは 2 つ以上のコードの組み合わせになっている場合があります。たとえば、ShapeAdded イベントのイベント コードは visEvtAdd と visEvtShape の組み合わせです。コードを組み合わせることによって、1 つの Event オブジェクトで複数のイベントの 1 つのインタレストを指定することもできます。たとえば、イベント コード visEvtAdd + visEvtPage + visEvtShape は、ShapeAdded と PageAdded の両方を指定します。
Event オブジェクトが起動したとき、Event オブジェクトのイベント コードが複数のイベントを指定している場合でも、Visio エンジンは実際に発生したイベントのイベント コードを渡します。最後の例の後にページが追加されたとき、Visio エンジンはイベント コード visEvtAdd + visEvtPage を渡します。
Set evt = evtList.AddAdvise(visEvtAdd + visEvtShape, sinkObj, "", "")
以下の要因によってオーバーフロー条件が発生します。
visEvtAdd は 4 バイト値であり、Visual Basic および VBA はそれを正の値と見なしますから、visEvtAdd+visEvtShape は -32768+64 = -32832 として扱われます。これは 2 バイト符号付きの数値の有効な値の範囲を超えています。
visEvtAdd が値 &H8000 を持つ 2 バイト値として明示的に宣言されている場合、Visual Basic および VBA はそれを負の値と見なし、visEvtAdd+visEvtShape は -32768+64 = -32704 として扱われます。これは 2 バイトの符号付きの数値の有効な値の範囲内です。
プログラムの中で visEvtAdd を 2 バイト値として宣言するためには、次のステートメントを追加します。
Global Const visEvtAdd% = &H8000
visEvtAdd を使用する代わりに、プロジェクトに Visconst.bas を追加する方法もあります。Visconst.bas ファイルの場所については、「はじめに」 の「セクション 3 オンラインリファレンス情報」を参照してください。VBA プロジェクトにファイルを追加するには、[ファイル] メニューから [ファイルのインポート] を選択します。Visual Basic プロジェクトにファイルを追加するには、[プロジェクト] メニューから [ファイルの追加] を選択します。
アクションによって、どのメソッドを使って Event オブジェクト Add または AddAdvise を作成するかが決まります。ソース オブジェクトを決定した後、Event オブジェクトをソース オブジェクトの EventList コレクションに追加することができます。
Add および AddAdvise メソッドの詳細については、Visio 製品付属のオンラインヘルプ 「開発者用リファレンス ([ヘルプ] メニューから [開発者用リファレンス] を選択)」を参照してください 。
Event オブジェクトを作成した後、そのプロパティを照会することによってその Event オブジェクトに関する情報を取得することができます (詳細については Visio 製品付属のオンラインヘルプ 「開発者用リファレンス」を参照してください)。また、Application オブジェクトの EventInfo プロパティによって、発生したイベントについてのより詳細な情報を取得できます。たとえば、ShapesDeleted イベントが起動した後、EventInfo プロパティによって削除された図形の名前を調べることができます。
1 つの EventInfo プロパティが多くのイベントによって使用されますから、EventInfo を取得するときは処理したいイベントを指定しなければなりません。そのためにはイベントの順序番号 (Visio が、対応するシンク オブジェクト上で VisEventProc を呼び出すときに 3 番目の引数として渡す番号) を渡すか、または最後のイベントを指定する場合は visEvtIDMostRecent を渡します。指定したイベントに関する追加的情報がない場合は、EventInfo は空の文字列を返します。
特定のイベントによって渡される情報の詳細については、Visio 製品付属のオンラインヘルプ 「開発者用リファレンス」でそのイベントを検索してください。
アドオンを実行する Event オブジェクトは、EventList コレクションの Add メソッドを使って作成されます。アドオンを実行する Event オブジェクトを作成するには、以下の引数を指定して Add メソッドを起動します。
Event オブジェクトが起動したとき Visio アプリケーションは、アドオンが EXE ファイルのときは引数文字列をコマンド行引数として渡し、アドオンが Visio ライブラリ (VSL) によって提供された場合には引数文字列を VAOV2LSTRUCT 構造体の "lpCmdLineArgs" フィールドとして渡します。
たとえば、次のコードは Showargs.exe という名前のアドオンを実行する Event オブジェクトを作成し、コマンド行引数として文字列 "/args=Shape Added!" を渡します。Event オブジェクトは図面の EventList コレクションに追加されます。
Private Sub Form_Load()
Dim eventsObj As Visio.EventList
Dim docObj As Visio.Document
'Create a new drawing
'A Visio instance has already been assigned to g_appVisio.
Set docObj = g_appVisio.Documents.Add("")
'Get the EventList collection of this document
Set eventsObj = docObj.EventList
'Add an Event object that will run an add-on when the event fires
eventsObj.Add visEvtShape + visEvtAdd, visActCodeRunAddon, _
"SHOWARGS.EXE", "/args=Shape added!"
End Sub
図面のいずれかのページに図形が追加されたとき、ShapeAdded イベントが起動します。このイベントが発生したときに開始されるアクションは、アドオン Showargs.exe の実行です。これは追加された図形と文字列「"Shape added!"」を表示します。
アドオンを実行する Event オブジェクトは、ソース オブジェクトの PersistsEvents プロパティが True に設定されている場合は Visio の図面とともに保存できます。これを "イベントの持続性" と言います。Event オブジェクトは、以下の条件が満たされているとき、図面とともに保存できます。
持続可能な Event オブジェクトが実際に持続するかどうかはその Persistent プロパティの設定によって決まります。Event オブジェクトが持続可能である場合、Visio のインスタンスはそれを図面とともに保存しなければならないと想定します。したがって Persistent プロパティの初期値は True です。Visio のインスタンスが Event オブジェクトを保存しないようにするには、その Persistent プロパティを False に設定します。
注 Event オブジェクトの Persistent プロパティの変更を試みる前に、その Persistable プロパティが True であることを確認してください。持続可能でないイベントの Persistent プロパティを設定するとエラーが発生します。
通知を送る Event オブジェクトは、EventList コレクションの AddAdvise メソッドを使って作成します。この Event オブジェクトはすでに実行しているプログラムに通知を送ることができます。このタイプの Event オブジェクトを作成する方法は、単にアドオン オブジェクトを実行する Event オブジェクトの作成とは異なります。
次の図は、プログラムが Visio アプリケーションのオブジェクトと相互動作してイベント通知を受け取る方法を示しています。
クライアント イベント シンクと Visio ソース イベントの相互動作
この図では pSource は Visio インスタンスの中のソース オブジェクトの参照です。これは pEvtList に割り当てられているソース オブジェクトの EventList コレクションへの参照を取得するために使用します。
プログラムは pEvtList.AddAdvise を使って pEvt に割り当てられている Event オブジェクトを作成します。プログラムは、AddAdvise によって、Event オブジェクトが起動したときに Visio インスタンスが通知を送るシンク オブジェクトへの参照を渡します。
シンク オブジェクトは、Visio インスタンスによって送られた通知を受け取るために定義されたVisio オブジェクトではないオブジェクトです。シンク オブジェクトはプログラム可能でなければなりません (オートメーションの IDispatch インターフェースをサポートしなければなりません)。また、VisEventProc という名前のオブジェクトを宣言していなければなりません。シンク オブジェクトには、プログラムで利用できる追加機能を付与することができます。
ユーザーのソリューションをさまざまな方法で構成できます。たとえば、以下のようなクラスを作成できます。
Microsoft VBA または Visual Basic でシンク オブジェクトを作成するには
一般的には、オブジェクトの Public プロパティを True に設定しますが、これは必須ではありません。必要に応じて、Initialize や Terminate のような定義済みのメソッドをコード化するか、自分のメソッドをクラスに追加することができます。
注 AddAdvise メソッドを使用する Visual Basic プロジェクトは、Standard EXE プロジェクトではなく ActiveX EXE プロジェクトとして設定しなければなりません。なぜなら、そのようなプロジェクトは public オブジェクト (シンク オブジェクト) を宣言しなければならないからです。シンク オブジェクトとして使用するクラスの Instancing プロパティは通常は MultiUse に設定しなければなりません。
クラス モジュールで、Visio から受け取った通知を処理するために VisEventProc という名前のイベント プロシージャを作成します。プログラムが認識できる任意の方法で VisEventProc プロシージャにコードを書き込みます。Visio ではイベント ハンドラの設計方法は自由です。プロシージャの中でどんな分岐のテクニックを使用しても構いません。また、プログラムが処理するイベントの数と種類によっては、それぞれのイベントに別々のシンク オブジェクトを定義することもできます。Event オブジェクトが起動したとき、Visio インスタンスは対応するシンク オブジェクトの VisEventProc プロシージャを呼び出します。
VisEventProc プロシージャは以下のパラメータを使って宣言しなければなりません。
Public Sub VisEventProc( _ eventCode As Integer, _ 'The event code of the event that caused the Event sourceObj as object, _ 'A reference to the source object whose EventList 'collection contains the Event object that fired. eventID As Long, _ 'The unique identifier of the Event object within its 'EventList collection. Unlike the Index property, the 'identifier does not change as objects are added or 'removed from the collection. You can access the Event 'object from within the VisEventProc procedure by using 'source.EventList.ItemFromID(id). seqNum As Long, _ 'The sequence of the event relative to events that have 'fired so far in the instance of Visio. subjectObj As Object, _ 'A reference to the subject of the event, which is the 'object to which the event occurred moreInfo As Variant 'Additional information, if any, that accompanies the ) 'notification. For most events, this argument will be 'Nothing. End Sub
シンク オブジェクトの定義が完了したら、次に、そのイベントを受け取るソース オブジェクトの EventList コレクションに含める Event オブジェクトを作成します。
通知を送る Event オブジェクトを作成するには
シンク オブジェクトの 1 つのインスタンスを複数の Event オブジェクトに使用するか、シンク オブジェクトの複数のインスタンスを使用することができます。
AddAdvise には 2 つの追加の引数があります。3 番目の引数は将来の使用のために予約されており、Null 文字列 ("") でなければなりません。4 番目の引数で、イベント ハンドラのための引数の文字列を指定できます。Visio のインスタンスはこれを Event オブジェクトの TargetArgs プロパティに割り当てます。プログラムが通知を受け取ったとき、VisEventProc はそれを呼び出した Event オブジェクトからこれらの引数を取得できます。
VBA または Visual Basic プロジェクトでシンク オブジェクトを定義し、イベント通知を設定するには
クラス モジュールで次の Implements ステートメントを使用した場合、[オブジェクト] ボックスから IVisEventProc、[プロシージャ] ボックスから VisEventProc を選択することができます。
Implements Visio.IVisEventProc
Implements キーワードの詳細については、Visual Basic のマニュアルを参照してください。
以下の VisEventProc プロシージャで Select Case ブロックを使って DocumentSaved、PageAdded、および ShapesDeleted イベントをチェックします。その他のイベントはデフォルト ケース (Case Else) に分類されます。各 Case ブロックは、起動したイベントの名前とイベント コードを含む文字列 (strDumpMsg) を構成します。最後に、このプロシージャはメッセージ ボックスに文字列を表示します。
Public Sub VisEventProc(eventCode As Integer, sourceObj As Object, eventID As Long, _
seqNum As Long, subjectObj As Object, moreInfo As Variant)
Dim strDumpMsg As String
'Find out which event fired
Select Case eventCode
Case visEvtCodeDocSave
strDumpMsg = "Save(" & eventCode & ")"
Case (visEvtPage + visEvtAdd)
strDumpMsg = "Page Added(" & eventCode & ")"
Case visEvtCodeShapeDelete
strDumpMsg = "Shape Deleted(" & eventCode & ")"
Case Else
strDumpMsg = "Other(" & eventCode & ")"
End Select
'Display the event name and code
frmEventDisplay.EventText.Text = strDumpMsg
End Sub
このプロシージャを呼び出す Event オブジェクトを作成するプログラムの例については、「通知を送る Event オブジェクト: 例」を参照してください。
たとえば、シンク オブジェクトを作成したときに、プロジェクトに挿入したクラス モジュールを "CEventSamp" と呼んだとします。以下のコードは、シンク オブジェクト "CEventSamp" のインスタンスを作成し、DocumentSaved、PageAdded、ShapesDeleted イベントの通知を送る Event オブジェクトを作成します。
'Create an instance of the sink object class CEventSamp
Dim g_Sink As CEventSamp
Dim docObj As Visio.Document
Private Sub Form_Load()
Dim eventsObj As Visio.EventList
'Create an instance of the CEventSamp class
'g_Sink is global to the form.
Set g_Sink = New CeventSamp
'Create a new drawing
'A Visio instance has already been assigned to g_appVisio
Set docObj = g_appVisio.Documents.Add("")
'Get the EventList collection of this document
Set eventsObj = docObj.EventList
'Add Event objects that will send notifications
'Add an Event object for the DocumentSaved event
eventsObj.AddAdvise visEvtCodeDocSave, g_Sink, "", "Document Saved..."
'Add an Event object for the ShapesDeleted event
eventsObj.AddAdvise visEvtCodeShapeDelete, g_Sink, "", "Shape Deleted..."
'Add an Event object for the PageAdded event
eventsObj.AddAdvise (visEvtPage + visEvtAdd), g_Sink, "", "Page Added..."
End Sub
PageAdded、 ShapesDeleted または DocumentSaved イベントが起動したとき、Visio インスタンスはシンク オブジェクト g_sink 上で VisEventProc を呼び出します。対応する VisEventProc プロシージャの例については、「VisEventProc のプロシージャ: 例」を参照してください。
AddAdvise メソッドによって作成された Event オブジェクトは、以下のいずれかが起こるまで持続します。
Visio インスタンスが終了するとき、BeforeQuit イベントが発行されます。プログラムはこのイベントを処理するために、ソース オブジェクトのすべての参照を解放し、他のすべてのクリーンアップ作業を実行します。Visio インスタンスは BeforeQuit を発行した後、プログラムの中のシンク オブジェクトへのすべての参照を解放します。