Addin-Programmierung - Seite 6
von Frank Schüler
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