Visio にて IDTExtensibility2 インターフェース経由で、Application.ConnectionsAdded イベントと Application.SelectionAdded イベントを利用して削除済み図形のイベントを処理した場合、例外処理が発生する

現象

Microsoft Visio 2010、Microsoft Office Visio 2007、または Microsoft Office Visio 2003 にて、IDTExtensibility2 インターフェース経由で Application.ConnectionsAdded イベントと、Application.SelectionAdded イベントを利用して、削除済み図形のイベントを処理した場合、例外処理が発生します。

状況

マイクロソフトでは、この問題について現在調査中です。詳細については、わかりしだいこの資料に掲載する予定です。

詳細

問題の再現手順

  1. 新規の共有アドイン プロジェクトを作成します。
  2. 共有アドイン内で、図形間の接続が確立された後に発生する ConnectionsAdded イベントと SelectionAdded イベントを実装します。
  3. SelectionAdded イベント時に以下のコード例の処理を実装します。
    • 追加したシェイプに、検証用図面のレイヤを設定
    • 追加したシェイプを削除
    • 処理中にエラーが発生した場合、Try~Catch で例外処理を実装します。
    コード例 :
    Dim WithEvents visApp As Visio.Application
    Dim addInInstance As Object
    <CLSCompliant(False)> _
    Public Sub OnConnection(ByVal application As Object, _
    ByVal connectMode As Extensibility.ext_ConnectMode, _
    ByVal addInInst As Object, ByRef custom As System.Array) _
    Implements Extensibility.IDTExtensibility2.OnConnection
    visApp = CType(application, Microsoft.Office.Interop.Visio.Application)
    addInInstance = addInInst

    End Sub

    Private Sub visApp_ConnectionsAdded(ByVal Connects As Microsoft.Office.Interop.Visio.Connects) Handles visApp.ConnectionsAdded
    Dim visConnect As Visio.Connect
    Dim fromSheetType As Integer
    Try
    For Each visConnect In Connects
    fromSheetType = visConnect.FromSheet.Type
    Next
    Catch ex As Exception
    MsgBox("Exception が発生しました。")
    Return
    End Try
    End Sub

    Private Sub visApp_SelectionAdded(ByVal Selection As Microsoft.Office.Interop.Visio.Selection) Handles visApp.SelectionAdded
    Dim visLayer As Visio.Layer
    Dim Shape As Visio.Shape = Selection(1)
    Try
    visLayer = visApp.ActivePage.Layers(1)
    visLayer.Add(Shape, 0)
    Shape.Delete()
    Catch ex As Exception
    MsgBox("Exceptionが発生しました。")
    End Try
    End Sub
  4. ConnectionsAdded イベント時に以下の処理を実装します。
    • Connects オブジェクトの FromSheet に設定されているシェイプの Type を取得
    • シェイプの Type 取得時にエラーが発生した場合、Try~Catch で例外処理を実装します。
  5. Visio ドキュメントを用意し、Page 上に Layers オブジェクトおよび接続ポイントを配置します。
  6. [コネクタ ツール] を選択し、コネクタを、接続ポイントに接続するようドロップすることで、図形間の接続が確立された後に発生する ConnectionsAdded イベントと SelectionAdded イベントを発生させます。
  7. 最初に発生する SelectionAdded イベントでは、例外処理が発生することなく、追加したシェイプを削除できていることを確認します。
  8. 続けて発生する ConnectionsAdded イベント内にて例外処理が発生します。
  9. 再度コネクタを、接続ポイントに接続するようドロップし、SelectionAdded イベントを発生させます。

結果

例外処理が発生します。
プロパティ

文書番号:2500481 - 最終更新日: 2016/10/04 - リビジョン: 1

フィードバック