Bilder per COM-Add-In hinzufügen

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.

Hinzufügen eines Bildes als Inhalt eines Bildsteuerelements oder für andere Belange

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.

Download der twinBASIC-Entwicklungsumgebung

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.

Aktivieren der Sicherheit der Zip-Datei

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.

Verweis auf die Access-Bibliothek hinzufügen

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

[

Listing 1: Implementierung der Methoden der Schnittstelle IDTExtensibility2

Implementierung der Schnittstelle IRibbonExtensibility

Die zweite Schnittstelle erlaubt das Implementieren einer Funktion, die ebenfalls beim Start von Access ausgelöst wird und die es uns ermöglicht, eine Ribbon-Definition zurückzugeben, die dann von Access angewendet wird. Das einzige Element dieser Schnittstelle haben wir in Listing 2 abgebildet. Hier stellen wir die oben beschriebene Anpassung des Ribbons in der Variablen strXML zusammen und geben diese als Funktionsergebnis zurück.

Private Function GetCustomUI(ByVal RibbonID As String) As String Implements IRibbonExtensibility.GetCustomUI
     Dim strXML As String
     strXML &= "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & vbCrLf
     strXML &= "  <commands><command onAction=""onAction"" idMso=""SharedImageBrowse""/></commands>"
     strXML &= "</customUI>" & vbCrLf
     Return strXML
End Function        

Listing 2: Die Funktion, die eine Ribbondefinition entgegennimmt

Diese sorgt, wie bereits beschrieben, nicht für das Hinzufügen eines neuen Elements zum Ribbon, sondern sie legt fest, dass beim Anklicken der Schaltfläche Bild einfügen die mit dem Attribut onAction angegebene Prozedur ausgeführt wird.

Diese Prozedur hinterlegen wir in der Klasse wie folgt:

Public Sub OnAction(control As IRibbonControl, _
         ByRef CancelDefault)
     BilderImportieren True
End Sub

Hier rufen wir vor allem die Prozedur BilderImportieren auf, der wir den Wert True für den Parameter bolBeiVorhandenNummerieren zuweisen. Diesen Parameter kann man auch auf False einstellen, aber in diesem Fall haben wir uns dafür entschieden, die von Access standardmäßig vorgegebene Verhaltensweise nachzubauen.

Die Prozedur onAction enthält zwei Parameter. Der erste namens control liefert einen Verweis auf das auslösende Steuerelement. Da das COM-Add-In nur ein Steuerelement im Ribbon abbilden soll, werten wir diesen Parameter nicht aus. Der zweite Parameter heißt CancelDefault und nimmt einen Boolean-Wert entgegen, der angibt, ob die eingebaute Funktion des Steuerelements ebenfalls ausgeführt werden soll. Das ist hier nicht der Fall – sonst würden zwei Dateiauswahl-Dialoge nacheinander angezeigt werden. Da der Standardwert dieses Parameters True lautet, brauchen wir diesen nicht zu ändern.

Wichtig bei der Definition des Parameters CancelDefault ist, dass wir diesen nicht mit einem Datentyp versehen – beispielsweise Boolean -, auch wenn er ohne Datentyp im Editor markiert wird. Damit würde das COM-Add-In nicht funktionieren.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar