Im Beitrag “Bilder für Buttons und Co. schnell hinzufügen” haben wir eine Prozedur und eine Funktion vorgestellt, mit der Sie mehrere Bilder für die Anzeige in Schaltflächen et cetera gleichzeitig zu einer Access-Datenbank hinzufügen können. Allerdings ist es unpraktisch, eine solche Funktion in jede Datenbank kopieren zu müssen, in der wir sie sehen wollen. Also bauen wir uns ein COM-Add-In, mit dem wir nicht eine weitere Schaltfläche mit der neuen Funktion zum Ribbon hinzufügen – sondern gleich die vorhandene Schaltfläche mit der neuen Funktion belegen! Der Benutzer braucht sich also gar nicht umzugewöhnen und kann wie gewohnt Bilder zur Anwendung hinzufügen.
Hinweis
Die hier verwendete Entwicklungsumgebung twinBASIC ist für die Erstellung von DLLs für 32-Bit-Office kostenlos, bei der 64-Bit-Version wird ein Splash-Screen eingeblendet.
Die 64-Bit-Version kann unter folgendem Link erworben werden (in einer Zeile):
https://shop.minhorst.com/access-tools/364/twinbasic-professional-edition-jahreslizenz?c=78
Der Download enthält jedoch die 64-Bit-DLL zum Einsatz auf Ihrem System inklusive Setup.
Ausgangssituation
Wenn wir wie in Bild 1 auf den Ribbonbefehl Durchsuchen… klicken, erscheint ein Dateiauswahldialog, mit dem allerdings nur eine Bilddatei gleichzeitig ausgewählt werden kann. Im Beitrag Bilder für Buttons und Co. schnell hinzufügen (www.access-im-unternehmen.de/1436) haben wir eine Funktion vorgestellt, mit der wir auf die gleiche Weise mehrere Bilddateien zur Datenbank und somit zur Tabelle MSysResources hinzufügen können.
Bild 1: Hinzufügen eines Bildes als Inhalt eines Bildsteuerelements oder für andere Belange
Funktion per Ribbonanpassung “überschreiben”
Diese Funktion wollen wir nun so in Access integrieren, dass sie durch Anklicken der Schaltfläche Durchsuchen… statt der eingebauten Funktion ausgelöst wird. Das können wir durch eine entsprechende Ribbon-Definition erreichen, in der wir in einem command-Element einen Verweis auf das entsprechende Steuerelement und einen Aufruf einer alternativen Prozedur angeben.
Die Ribbon-Definition sieht wie folgt aus:
<customUI xmlns="http://schemas.microsoft.com/ office/2006/01/customui"> <commands> <command onAction="onAction" idMso="SharedImageBrowse"/> </commands> </customUI>
Die hier angegebene Prozedur für das Attribut onAction können wir wie folgt definieren:
Public Sub OnAction(control As IRibbonControl, _ ByRef CancelDefault) BilderImportieren True End Sub
Diese ruft die Prozedur BilderImportieren auf, die wir im oben genannten Beitrag beschrieben haben.
Wenn wir diese Ribbondefinition in der Anwendung unterbringen, zum Beispiel für ein Formular oder als Anwendungsribbon, steht die Funktion zwar zur Verfügung und überschreibt auch die eingebaute Funktion des Ribbon-Steuerelements, aber diese hilft uns dann auch nur in der aktuellen Anwendung weiter. Und wer sucht schon in den eingebauten Steuerelementen des Ribbons nach benutzerdefinierten Funktionen? Deshalb machen wir es einen Schritt professioneller und bauen die Funktion in ein COM-Add-In ein, das die Funktion fortan in jeder Access-Instanz zur Verfügung stellt – egal, welche Anwendung wir darin geöffnet haben.
Einbau in ein COM-Add-In
Den Einbau der beiden Routinen aus dem oben genannten Artikel in ein COM-Add-In beziehungsweise dessen Erstellung erfolgt mit dem Tool twinBASIC, das wir schon in einigen Beiträgen erwähnt haben. Interessant als Zusatzinformation zu dem, was Sie im vorliegenden Beitrag lesen, dürfte der Beitrag twinBASIC – COM-Add-Ins für Access (www.access-im-unternehmen.de/1306) sein.
Download und Installation von twinBASIC
Da twinBASIC mittlerweile eine andere Plattform als Entwicklungsumgebung verwendet, weisen wir nochmal auf den Download und die Installation hin.
Der Download der jeweils neuesten Version erfolgt über diesen Link:
https://github.com/twinbasic/twinbasic/releases
Hier erweitern Sie für die gewünschte Version den Bereich Assets (siehe Bild 2) und laden die Datei herunter, beispielsweise twinBASIC_IDE_BETA_277.zip.
Bild 2: Download der twinBASIC-Entwicklungsumgebung
Anschließend stellen Sie die Option Zulassen für die heruntergeladene Datei auf Ja ein (siehe Bild 3). Die Eigenschaft finden Sie im Eigenschaften-Dialog der Datei, den Sie mit dem entsprechenden Kontextmenü-Befehl öffnen.
Bild 3: Aktivieren der Sicherheit der Zip-Datei
Danach extrahieren Sie die in der Zip-Datei enthaltenen Dateien in ein Verzeichnis Ihrer Wahl.
Anschließend können Sie durch einen Doppelklick auf die Datei twinBASIC.exe direkt mit der Anwendung arbeiten – es ist keine Installation nötig.
Neues COM-Add-In anlegen
Wir legen nach dem Start von twinBASIC dort ein neues Projekt auf Basis der Vorlage Sample 5. MyCOMAddin an, das auf der Seite Samples der Startseite von twinBASIC angezeigt wird.
Dieses Projekt enthält alles, was man für das Erstellen eines eigenen COM-Add-Ins braucht – angefangen von einer Ribbon-Anpassung mit einem individuellen tab-Element plus Button, der die ebenfalls integrierte Prozedur auslöst.
Wir wollen unser Projekt amvAddPictures benennen und auch die einzige Klasse des Projekts erhält diesen Namen. Der eindeutige Klassen-Identifizierer wurde von twinBASIC automatisch vergeben. Die Klasse implementiert zwei Schnittstellen, nämlich IDTExtensibility2 und IRibbonExtensibility:
[ ClassId ("061EF79E-7E28-4BF7-870F-01AF336670CD") ] Class amvAddPictures Implements IDTExtensibility2 [ WithDispatchForwarding ] Implements IRibbonExtensibility ... mehr Code End Class
Implementieren der Schnittstelle IDTExtensibility2
Die Schnittstelle IDTExtensibility2 gibt die Methoden vor, die zu verschiedenen Ereignissen beim Öffnen, Schließen et cetera der Access-Anwendung ausgeführt werden. Uns interessiert nur eine davon, nämlich OnConnection. Diese wird nämlich genau dann ausgelöst, wenn der Benutzer eine Access-Instanz öffnet und liefert einige interessante Parameter. Auch hier interessiert uns nur einer, nämlich Application. Dieser liefert einen Verweis auf die aufrufende Anwendung, in diesem Fall Access.Application. Da die Funktionen eines COM-Add-Ins meist auf die aktuelle Access-Instanz zugreifen sollen, speichern wir den Verweis auf diese Instanz in einer Objektvariablen, die wir wie folgt deklarieren:
Private objAccess As Access.Application
Für die Verwendung dieser Klasse benötigen wir, ähnlich wie im VBA-Editor beim Zugriff auf die Objekte anderer Bibliotheken, einen Verweis.
Diesen fügen wir über die Projekteigenschaften hinzu, die wir über den Eintrag Settings im Projektexplorer öffnen können. Hier scrollen wir zum Bereich COM Type Library / ActiveX References, wo wir im unteren Feld nach Access suchen und den gewünschten Eintrag anhaken (siehe Bild 4). Damit diese Änderung wirksam wird, müssen wir das Projekt speichern, schließen und erneut öffnen.
Bild 4: Verweis auf die Access-Bibliothek hinzufügen
Schnittstellen implementieren
Die Methoden der Schnittstelle implementieren wir darunter wie in Listing 1. Wir bilden hier auch die weiteren, nicht mit Anweisungen gefüllten Methoden ab, da diese auf jeden Fall im Projekt implementiert werden müssen.
Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, ByVal AddInInst As Object, _ ByRef custom As Variant()) Implements IDTExtensibility2.OnConnection Set objAccess = Application End Sub Sub OnDisconnection(ByVal RemoveMode As ext_DisconnectMode, ByRef custom As Variant()) _ Implements IDTExtensibility2.OnDisconnection End Sub Sub OnAddInsUpdate(ByRef custom As Variant()) Implements IDTExtensibility2.OnAddInsUpdate End Sub Sub OnStartupComplete(ByRef custom As Variant()) Implements IDTExtensibility2.OnStartupComplete End Sub Sub OnBeginShutdown(ByRef custom As Variant()) Implements IDTExtensibility2.OnBeginShutdown End Sub