2017-07-07 77 views
0

arcbjectsマップイベントをvb.netフォームにフックしてマップ選択の変更を待ちます。これはすべて正常に機能しますが、フォームを開くときにこのエラーが発生することがあります。私はエラーを再現するためのパターンを見ることができず、それはランダムであるようです。"基盤となるRCWから分離されたCOMオブジェクトは使用できません" vb.netフォームイベントに関連するエラー

を「基になるRCWから分割されたCOMオブジェクトを使用することができません」それはフォームロード()私はイベントをフックしています方法に由来します。

誰かが私が間違ったことを理解するのを助けることができますか?私はFormClosing()イベントで地図選択イベントのフックを外していますが、これは正しいアプローチだと思います。

Public Class MyForm 

    Private _activeViewEvents As IActiveViewEvents_Event 

    Private Sub FormLoad(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     _activeViewEvents = TryCast(pMxDoc.ActiveView.FocusMap, IActiveViewEvents_Event) 
     AddHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged  
    End Sub 

    Private Sub SelectionChanged 
     'do something when selection is changed 
    End Sub 

    Private Sub FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 
     RemoveHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged 
    End Sub 

End Class 

答えて

0

これで、ActiveViewChangedイベントを使用して解決したと思います。各フォームのロードまたは新しいドキュメントイベントでイベントを再調査する代わりに、ActiveViewChangedイベントが発生したときにリッスンし、毎回SelectionChangedイベントを再試行しました。これは、新しい文書が開かれるたびに1回以上呼び出されることを示しています(理由は分かりません)。とにかく、問題はなくなっているようです。ここにいくつかのコード例があります:

Public Class MyForm 

Private _activeViewEvents As IActiveViewEvents_Event 
Private _docEvents As IDocumentEvents_Event 

Private Sub FormLoad(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    AddHandler _docEvents.ActiveViewChanged, AddressOf ActiveViewChanged 
End Sub 

Private Sub ActiveViewChanged() 
    Dim maps = pMxDoc.Maps 
    For i = 0 to maps.Count - 1 'remove handlers from all maps 
     RemoveActiveViewEvents(maps.Item(i)) 
    Next 
    SetupActiveViewEvent(pMxDoc.ActiveView.FocusMap) 'only add handler to active map 
End Sub 

Private Sub RemoveActiveViewEvents(map As IMap) 
    _activeViewEvents = CType(map, IActiveViewEvents_Event) 
    RemoveHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged 
End Sub 

Private Sub SetupActiveViewEvents(map As IMap) 
    _activeViewEvents = CType(map, IActiveViewEvents_Event) 
    AddHandler _activeViewEvents.SelectionChanged, AddressOf SelectionChanged 
End Sub 

Private Sub SelectionChanged 
    'do something when selection is changed 
End Sub 

End Class 
1

ハンドラの作成および破棄の手法は有効です。フォームが開いている間にマップ文書が変更されると、RCW COM例外を受け取ることができます。 FocusMapを使用してハンドルを作成しているので、ドキュメントが変更されたときにはFocusMapもあります。つまり、新しいマップドキュメントのハンドラを再作成する必要があります。

+0

私はすでにこのアプローチを採用していますが、残念ながら問題は解決しません。また、私のフォームはドキュメントイベントにフックされるので、ドキュメントが変更されたときに開いたままになることはありません。地図のドキュメントが変更されるたびに、ユーザーはフォームをリロードする必要があるため、FormLoad()は常に新しいドキュメントのハンドラーを再作成します。私はマップドキュメントの変更に関連していると思っていましたが、少し深く見ていきます。 – Courlu

+0

'Marshal'や' ComReleaser'を使ってリソースを廃棄する可能性はありますか? – Jumpercables

+0

いいえ、私は検索カーソルを処分するだけですが、このフォームやイベントには関係しません。 – Courlu

関連する問題