Die Community zu .NET und Classic VB.
Menü

Addin-Programmierung - Seite 6

 von 

Dockendes Addin
Nächste Seite >>
Manipulieren von Objekten
<< Vorherige Seite

Ereignisse abfangen  

Außer den Möglichkeiten Informationen von Objekten auszulesen und zu manipulieren, bietet die VB-IDE noch die Möglichkeit an, auf Ereignisse zu reagieren. Dafür hält die VB-IDE diverse Events bereit die nur noch ausgewertet werden müssen. Bevor man aber mit den Events arbeiten kann, müssen wir die Events in unserem AddIn zugänglich machen. Dazu erweitern wir den Code im Modul "Connect", im Deklarationsabschnitt, um folgende Zeilen.

' Implementierung der Events2 Schnittstelle
' nur in VB6 !!!
Dim nEvents2 As Events2

' Ereignisbehandlungsroutine für den Status der
' Entwicklungsumgebung (RunModus, DesignModus)
' nur in VB6 !!!
Public WithEvents VBModeEvents As VBBuildEvents
' Ereignisbehandlungsroutine für die Projekte
Public WithEvents VBProjEvents As VBProjectsEvents
' Ereignisbehandlungsroutine für die Komponenten
Public WithEvents VBCompEvents As VBComponentsEvents
' Ereignisbehandlungsroutine für die Datei
Public WithEvents VBFileEvents As FileControlEvents
' Ereignisbehandlungsroutine für die Verweise
Public WithEvents VBRefEvents As ReferencesEvents
' Ereignisbehandlungsroutine für die Controls
Public WithEvents VBCTLEvents As VBControlsEvents
' Ereignisbehandlungsroutine für die selektierten Controls
Public WithEvents VBSelCTLEvents As SelectedVBControlsEvents

Nun müssen nur noch die Events unserer Instanz des AddIns bekannt gemacht werden. Dieses bekannt machen erfolgt in der Sub "AddinInstance_OnConnection". Hinter der Zeile

' Speichern der VB-Instance
Set VBInstance = Application

fügen wir folgenden Code hinzu.

' Events instanzieren
    With VBInstance
        ' nur in VB6 !!!
        Set VBProjEvents = .Events.VBProjectsEvents
        ' in VB5/6 !!!
        Set VBCompEvents = .Events.VBComponentsEvents(Nothing)
        Set VBFileEvents = .Events.FileControlEvents(Nothing)
        Set VBRefEvents = .Events.ReferencesEvents(Nothing)
        Set VBCTLEvents = .Events.VBControlsEvents(Nothing, Nothing)
        Set VBSelCTLEvents = .Events.SelectedVBControlsEvents(Nothing, Nothing)
        ' nur in VB6 !!!
        Set nEvents2 = .Events
    End With

    ' VBBuildEvents instanzieren
    ' nur in VB6 !!!
    Set VBModeEvents = nEvents2.VBBuildEvents

Durch das Definieren der Events werden entsprechende Prozeduren hinzugefügt die nun für die Auswertung der Ereignisse genutzt werden können. Dazu habe ich in der Form eine Prozedur

Public Sub ShowMessage(Message As String)
    Text1.Text = Message
End Sub

hinzugefügt, die nur Anzeigen soll, welches Event gerade in der VB-Entwickungsumgebung aufgetreten ist. Entsprechend greife ich auf diese Prozedur von den Events-Prozeduren zu. Hier nur ein kleiner Ausschnitt aus dem Modul "Connect".

Private Sub VBCompEvents_ItemActivated(ByVal VBComponent As VBIDE.VBComponent)
    mfrmAddIn.ShowMessage "Die Komponente " & VBComponent.Name & " wurde aktiviert."
End Sub

Private Sub VBCompEvents_ItemAdded(ByVal VBComponent As VBIDE.VBComponent)
    mfrmAddIn.ShowMessage "Die Komponente " & VBComponent.Name & " wurde hinzugefügt."
End Sub

Private Sub VBCompEvents_ItemReloaded(ByVal VBComponent As VBIDE.VBComponent)
    mfrmAddIn.ShowMessage "Die Komponente " & VBComponent.Name & " wurde neu geladen."
End Sub

Private Sub VBCompEvents_ItemRemoved(ByVal VBComponent As VBIDE.VBComponent)
    mfrmAddIn.ShowMessage "Die Komponente " & VBComponent.Name & " wurde entfernt."
End Sub

Private Sub VBCompEvents_ItemRenamed(ByVal VBComponent As VBIDE.VBComponent, ByVal OldName As String)
    mfrmAddIn.ShowMessage "Die Komponente " & OldName & " wurde umbenannt in " & VBComponent.Name & "."
End Sub

Private Sub VBCompEvents_ItemSelected(ByVal VBComponent As VBIDE.VBComponent)
    mfrmAddIn.ShowMessage "Die Komponente " & VBComponent.Name & " wurde selektiert."
End Sub

Private Sub VBModeEvents_BeginCompile(ByVal VBProject As VBIDE.VBProject)
    mfrmAddIn.ShowMessage "Das Projekt " & VBProject.Name & " wird kompiliert."
End Sub

Private Sub VBModeEvents_EnterDesignMode()
    mfrmAddIn.ShowMessage "Die Entwicklungsumgebung befindet sich im DesignerModus."
End Sub

Private Sub VBModeEvents_EnterRunMode()
    mfrmAddIn.ShowMessage "Die Entwicklungsumgebung befindet sich im RunModus."
End Sub

Ein Spezielles Ereignis ist das "VBProjectsEvents". Hierbei handelt es sich um ein Ereignis im versteckten "Events2". Dieses Events2 ist nur in VB6 vorhanden und kann dazu genutzt werden, um den Status der Entwicklungsumgebung abzufragen. Um die versteckten Objekte oder Events anzuzeigen, öffnet man den Objektbrowser und klickt mit der rechten Maustaste in den Objektbrowser. Im Kontextmenü klickt man dann auf "Verborgene Elemente anzeigen". Nun werden auch die versteckten Elemente in grau dargestellt. Direkt unter dem Element "Events" befindet sich des versteckte Element "Events2" und das darin enthaltene Event "VBProjectsEvents". Da es dieses Event in VB5 nicht gibt, und man aber trotzdem wissen möchte, ob sich die Entwicklungsumgebung im Design- oder RunModus befindet, müssen wir den Status der entsprechenden Schaltflächen im Objekt "CommandBars" abfragen und auswerten. Dazu fügen wir folgenden Code in der Form hinzu.

Private Sub Timer1_Timer()
    Select Case IDEMode(VBInstance)
        Case vbext_vm_Run
            Text2.Text = "Run Mode"
        Case vbext_vm_Break
            Text2.Text = "Break Mode"
        Case vbext_vm_Design
            Text2.Text = "Design Mode"
    End Select
End Sub

Public Function IDEMode(vbInst As VBIDE.VBE) As Long
    '==================================
    'Returns the mode the IDE is in:
    '   vbext_vm_Run = "Run mode"
    '   vbext_vm_Break = "Break Mode"
    '   vbext_vm_Design = "Design Mode"
    '==================================
    Dim lMode As Long
    lMode = vbext_vm_Design
    If vbInst.CommandBars("Run").Controls("End").Enabled = True Then
        ' The IDE is at least in run mode
        lMode = vbext_vm_Run
        If vbInst.CommandBars("Run").Controls("Break").Enabled = False Then
            ' The IDE is in Break mode
            lMode = vbext_vm_Break
        End If
    End If
    IDEMode = lMode
End Function

Diese Beispiel funktioniert natürlich auch in VB6. Ein Hinweis aber noch. Die Abfrage der Buttons funktioniert in diesem Beispiel nur für VB in englischer Sprache. Für die deutsche Version von VB muss entsprechend der CommandBars-Aufruf angepasst werden.

Public Function IDEMode(vbInst As VBIDE.VBE) As Long
    '==================================
    'Returns the mode the IDE is in:
    '   vbext_vm_Run = "Run mode"
    '   vbext_vm_Break = "Break Mode"
    '   vbext_vm_Design = "Design Mode"
    '==================================
    Dim lMode As Long
    lMode = vbext_vm_Design
    If vbInst.CommandBars("Ausführen ").Controls("Beenden").Enabled = True Then
        ' The IDE is at least in run mode
        lMode = vbext_vm_Run
        If vbInst.CommandBars("Ausführen ").Controls("Unterbrechen").Enabled = False Then
            ' The IDE is in Break mode
            lMode = vbext_vm_Break
        End If
    End If
    IDEMode = lMode
End Function
Nächste Seite >>
Dockendes Addin
<< Vorherige Seite
Manipulieren von Objekten