2017-07-07 5 views
0

Ich hänge ein Arcobjects-Kartenereignis an ein vb.net-Formular, um auf Kartenauswahländerungen zu warten. Alles funktioniert gut, aber Benutzer melden diesen Fehler gelegentlich beim Öffnen des Formulars. Ich kann kein Muster sehen, um den Fehler zu reproduzieren und es scheint zufällig zu sein."COM-Objekt, das von seinem zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden" Fehler im Zusammenhang mit vb.net Formularereignis

Es stammt aus der Form Load() Methode „COM-Objekt, das vom zugrunde liegenden RCW getrennt wurde, kann nicht verwendet werden“, wo ich die Veranstaltung am Einhaken.

Kann mir jemand helfen zu verstehen, was ich falsch gemacht habe? Ich hole das Map-Auswahlereignis im FormClosing() Event ab, was meiner Meinung nach der richtige Ansatz ist.

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 

Antwort

0

Ok, ich denke, ich habe dies über die Verwendung des ActiveViewChanged-Ereignisses gelöst. Anstatt das Ereignis bei jedem Laden von Formularen oder bei einem neuen Dokumentereignis erneut zu starten, habe ich versucht, zu überwachen, wann das ActiveViewChanged-Ereignis ausgelöst wurde, und jedes Mal das SelectionChanged-Ereignis neu zu hooken. Es stellt sich heraus, dass dies jedes Mal ausgelöst wird, wenn ein neues Dokument geöffnet wird (nicht sicher warum). Wie auch immer, das Problem scheint verschwunden zu sein. Hier ist ein Beispielcode:

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

Der Ansatz, den Sie zum Erstellen und Zerstören Ihrer Handler verwenden, ist gültig. Sie können eine RCW COM-Ausnahme empfangen, wenn das Kartendokument geändert wird, während das Formular geöffnet ist. Da Sie die FocusMap verwenden, um die Handles zu erstellen, wenn das Dokument geändert wird, ist das FocusMap, was bedeutet, dass Sie Ihre Handler für das neue Kartendokument neu erstellen müssen.

+0

Ich nehme diesen Ansatz bereits, aber leider bleibt das Problem bestehen. Mein Formular ist auch an Dokumentereignisse angehängt, so dass es nie geöffnet bleibt, wenn das Dokument geändert wird. Jedes Mal, wenn das Kartendokument geändert wird, muss der Benutzer das Formular erneut laden, sodass FormLoad() die Handler für das neue Dokument immer neu erstellt. Ich vermutete, dass es mit der Änderung der Kartendokumente zusammenhing, also werde ich ein wenig genauer hinschauen. – Courlu

+0

Gibt es eine Chance, dass Sie eine Ressource mit 'Marshal' oder' ComReleaser' entsorgen? – Jumpercables

+0

Nein, ich entsende immer nur Suchcursor, aber nichts mit dieser Form oder diesem Ereignis. – Courlu

Verwandte Themen