|
Teil 2
Das Grundprinzip des VBEWindowControl-AddIns beruht darauf, dass die Ereignisse ItemAdded der VBProjectEvents und der VBComponentEvents ausgewertet werden. Wird ein neues Projekt angelegt oder wird einem Projekt ein Modul hinzugefügt, wird geprüft, ob dieses noch jungfräulich ist. In diesem Sinne jungfräulich ist ein Projekt oder ein Modul, wenn es noch nicht unter einem eigenen Dateinamen gespeichert worden ist. Alle übrigen Projekte und Module, also sowohl Ihre Arbeitsprojekte und -module als auch die, die Sie in Ihrem Templates-Ordner abgelegt haben, werden ignoriert. Bei letzteren gehe ich davon aus, dass die Größen und Positionen der betreffenden Module bereits bewusst festgelegt worden sind und nicht einfach auf Einheitsgrößen zurück gesetzt werden sollen. Bei den Modulen der Arbeitsprojekte wäre es dagegen mehr als nur ein schlechter Scherz, wenn dies bei jedem Öffnen eines Projektes geschehen würde.
Wird ein neues Projekt angelegt, werden alle möglicherweise darin enthaltenen Module überwacht. Ich wüsste allerdings derzeit kein leeres Vorgabe-Projekt, mit dem mehr als nur ein einziges Modul geladen wird. Aber das kann sich schließlich irgend wann einmal ändern.
Zunächst wird im OnConnection-Ereignis des AddInDesigners das übergebene Application-Objekt in der modulweit gültigen Variablen mVBE zur späteren weiteren Verwendung festgehalten. Die übrigen Parameter ignorieren wir, da sie für dieses AddIn keine Bedeutung haben. Anschließend wird die als Ereignisempfänger (mit WithEvents) deklarierte Variable eProjectEvents gesetzt.
Private mVBE As VBE
Private WithEvents eProjectEvents As VBProjectsEvents
Private Sub AddinInstance_OnConnection(ByVal Application _
As Object, ByVal ConnectMode As _
AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst _
As Object, custom() As Variant)
Set mVBE = Application
With mVBE
Set eProjectEvents = .Events.VBProjectsEvents
'...
End With
End Sub
Als nächstes werden die Einträge in die Kontextmenüs eingefügt, doch dazu später mehr.
Nach dem Laden wartet das AddIn nun darauf, dass im Ereignis eProjectEvents_ItemAdded das Öffnen oder Anlegen eines neuen Projekts gemeldet wird. Da dieses Projekt auf jeden Fall das aktive Projekt sein wird, wird zunächst der Ereignisempfänger eVBComponentsEvents installiert.
Private Sub eProjectEvents_ItemAdded(ByVal VBProject _
As VBIDE.VBProject)
Dim nVBComponent As VBComponent
Dim nDesignerWindow As Window
Dim nCodeWindow As Window
Dim nFirst As Boolean
Dim nPosSize As clsPosSize
Dim nID As String
Set eVBComponentsEvents = _
mVBE.Events.VBComponentsEvents(VBProject)
If Len(VBProject.FileName) = 0 Then
For Each nVBComponent In VBProject.VBComponents
With nVBComponent
Set nDesignerWindow = .DesignerWindow
Ist die Länge des Dateinamens des Projekts gleich 0 (d.h. das Projekt ist jungfräulich), werden in einer Schleife die Modul-Komponenten des Projekts untersucht. Wie bereits erwähnt, dürfte derzeit nur ein einziges Modul anfallen. Ergibt die Zuweisung des Funktionsaufrufs nVBComponent.DesignerWindow, dass die Komponente ein Designer-Fenster enthält, wird eine eindeutige Typen-ID ermittelt.
Diese ergibt sich jedoch noch nicht allein aus der Kennzahl des Komponenten-Typs. Diese kennzeichnet nur der VBIDE bereits bekannte Komponenten-Typen. Unbekannte Designer sind vom Typ vbext_ct_ActiveXDesigner - darunter fallen alle derzeit noch nicht bekannten oder von Dritten angebotenen Designer. Um auch diese eindeutig unterscheiden zu können, wird der String-Wert der Eigenschaft DesignerID hinzu gezogen. Aus beidem zusammen ergibt sich immer eine eindeutige ID.
If Not (nDesignerWindow Is Nothing) Then
nID = "D" & CStr(.Type) & .DesignerID
|