COM-Add-In-Ribbons mit dem XML-Designer

Wenn Sie in Visual Studio ein COM-Add-In für Access erstellen (wie im Beitrag „Access-Add-In mit VSTO“), können Sie zwei Möglichkeiten nutzen, um Ribbons für das Add-In hinzuzufügen. Der erste Weg nutzt einen grafischen Editor und wird bereits im genannten Beitrag beschrieben. Allerdings erlaubt dieser nicht, alle verfügbaren Elemente und Techniken zu nutzen. Genau genommen können Sie damit nur Tabs, Groups und die darin enthaltenen Steuer-elemente hinzufügen. Wenn Sie, wie Sie es von Access gewohnt sind, in die Vollen gehen wollen und etwa auch das Backstage anpassen oder eingebaute Ribbon-Schaltflächen mit neuen Funktionen versehen wollen, finden Sie im vorliegenden Artikel die richtigen Techniken.

Voraussetzungen

Um die in diesem Beitrag beschriebenen Techniken verwenden zu können, benötigen Sie ein COM-Add-In, das mit Access gestartet wird. Die Grundlagen dazu finden Sie im Beitrag Access-Add-In mit VSTO (www.access-im-unternehmen.de/1092). Der Beitrag beschreibt die Vorgehensweise für C#, Sie finden im Download aber auch ein für den Einsatz mit Access angepasstes COM-Add-In-Projekt. Auf diesem setzt dieser Beitrag auf. Außerdem verwenden wir Visual Studio 2015 in der Community Edition, die für einzelne Entwickler kostenlos verfügbar ist.

Hinweis

Alle wichtigen Grundlagen und Informationen sowie Listen der Callback-Funktionen für den Backstage-Bereich des Ribbons finden Sie auf der Internetseite mit dem Titel Einführung in die Office 2010-Backstage-Ansicht für Entwickler (aktueller LInk: https://msdn.microsoft.com/de-de/library/ee691833(office.14).aspx).

Die Grundlagen für den Ribbon-Teil finden Sie unter dem Titel Anpassen der Multifunktionsleisten-Benutzeroberfläche von Office (2007) für Entwickler – Teil 1 und den folgenden Teilen (aktueller Link: https://msdn.microsoft.com/de-de/library/aa338202.aspx).

Ribbon zum Add-In hinzufügen

Wie bereits erwähnt, gibt es zwei Möglichkeiten, ein Ribbon zu einem COM-Add-In auf Basis der VSTO-Vorlagen hinzuzufügen. Der erste Eintrag namens Menüband (Visueller Designer) liefert einen Designer, mit dem Sie das Ribbon per Drag and Drop aus der Toolbox zusammenstellen können. Dafür stehen aber nur die wichtigsten Elemente zur Verfügung. Wer bereits unter Access Ribbons definiert hat, wird hier einiges vermissen. In diesem Fall wählt man besser den Eintrag Menüband (XML) und gibt beispielsweise den Namen Ribbon_Access.vb an (s. Bild 1). Dies fügt zwei Klassen namens Ribbon_Access.vb und Ribbon_Access.xml zum Projekt hinzu. Damit die in der Datei Ribbon_Access.xml enthaltene Ribbon-Definition auf die Host-Anwendung, in diesem Fall Access, angewendet wird, kopieren Sie die noch auskommentierte Methode CreateRibbonExtensibilityObject aus dem Modul Ribbon_Access.vb in das Klassenmodul ThisAddIn.vb und entfernen die Kommentarzeichen:

Hinzufügen eines Ribbons mit der Vorlage Menüband (XML)

Bild 1: Hinzufügen eines Ribbons mit der Vorlage Menüband (XML)

Protected Overrides Function _
         CreateRibbonExtensibilityObject() _
         As Microsoft.Office.Core.IRibbonExtensibility
     Return New Ribbon_Access()
End Function

Diese Methode wird beim Starten des Add-Ins automatisch ausgeführt.

Die XML-Definition des Ribbons sieht standardmäßig wie folgt aus:

<xml version="1.0" encoding="UTF-8">
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
   <ribbon>
     <tabs>
       <tab idMso="TabAddIns">
         <group id="MyGroup"
                label="My Group">
         </group>
       </tab>
     </tabs>
   </ribbon>
</customUI>

Wenn Sie das Add-In nun starten, erscheinen allerdings keine neuen Elemente im Ribbon von Access. Der Grund ist einfach: Die automatisch erstellte Ribbon-Definition aus der Datei Ribbon_Access.xml versucht, eine Gruppe unterhalb eines Tab-Elements mit der idMso mit dem Wert TabAddIns anzulegen. Warum wird dieses Tab dann von der Vorlage als Ausgangspunkt für die Ribbon-Definition festgelegt Ganz einfach: Weil es offiziell gar keine VSTO-Vorlage für Access-Add-Ins gibt, haben wir ja, wie im Beitrag Access-Add-In mit VSTO beschrieben, ein Excel-Add-In in ein Access-Add-In umgewandelt. Und unter Excel gibt es sehr wohl ein Ribbon-Tab namens TabAddIns. Wenn wir also einfach das eingebaute group-Element TabAddIns durch ein benutzerdefiniertes Element ersetzen, sollte es funktionieren.

Benutzerdefiniertes Tab mit Gruppe und Schaltfläche hinzufügen

Ein eingebautes tab-Element verwendet die für dieses Element festgelegte idMso (übersicht der idMsos für alle Elemente siehe Datei AccessControl.xlsx aus dem Download von der Seite http://go.microsoft.com/fwlink/LinkID=181052), um festzulegen, dass die darunter abgebildeten group-Elemente unterhalb des eingebauten Elements mit der angegebenen idMso angelegt werden sollen. Gegebenenfalls möchten Sie auch noch Elemente in eine eingebaute Gruppe einfügen, dann würden Sie auch für die Gruppe die entsprechende idMso angeben.

Wir wollen aber ein neues tab-Element erstellen, weshalb wir nicht die Eigenschaft idMso angeben, sondern mit id den Namen unseres benutzerdefinierten Elements. Dieses soll tabAddIn heißen. Darunter wollen wir zwei Gruppen anlegen, die jeweils eine Schaltfläche enthalten. Die erste Gruppe soll Befehle erhalten, die sich auf die Access-Anwendung selbst beziehen, die zweite Befehle, die sich auf die aktuell geöffnete Datenbank beziehen. Für den zweiten Teil arbeiten wir im Beitrag Datenzugriff per VSTO-Add-In (www.access-im-unternehmen.de/1094) noch eine Lösung heraus, mit der wir dafür sorgen können, dass die Elemente der zweiten Gruppe nur aktiviert sind, wenn Access gerade eine Datenbankanwendung geladen hat. Die Definition unseres Ribbons sieht somit wie in Listing 1 aus.

Wenn wir das Add-In nun starten, sollten die neuen Elemente in Access wie in Bild 2 erscheinen.

Die neuen Ribbon-Elemente im Tab COM-Add-In

Bild 2: Die neuen Ribbon-Elemente im Tab COM-Add-In

Prozedur für die Buttons anlegen

Wir legen nun zunächst eine Prozedur an, die durch einen Klick auf eine der Schaltflächen ausgelöst wird. Wie unter Access haben wir in der XML-Definition des Ribbons mit dem Attribut onAction den Namen der aufzurufenden Methode angegeben, in diesem Fall onAction.

Die Signatur der verschiedenen Callback-Funktionen, die hier nicht beschrieben werden, finden Sie in den weiter oben unter Hinweis angegebenen Quellen. Wir wollen zunächst einfach nur den Namen des aufrufenden Steuer-elements in einem Meldungsfenster ausgeben. Dazu fügen Sie dem Klassenmodul Ribbon_Access.vb zunächst den Verweis auf folgenden Namespace hinzu:

Imports System.Windows.Forms

Danach legen wir in der Klasse Ribbon_Access.vb in dem Bereich, der mit #Region „Menübandrückrufe“ gekennzeichnet ist, die folgende Methode an:

Sub OnAction(control As Office.IRibbonControl)
     MessageBox.Show(control.Id.ToString())
End Sub

Wenn Sie das Add-In nun zum Debuggen starten und auf eine der beiden Schaltflächen klicken, erscheint die entsprechende MessageBox. Wir wollen nun eine Select Case-Bedingung einbauen, die prüft, welche Schaltfläche die Methode ausgelöst hat, und davon abhängig entweder den Text Anwendungsbefehl oder Datenbankbefehl ausgeben:

Public Sub onAction(ctl As Office.IRibbonControl)
     Select Case ctl.Id
         Case "btnAnwendungsbefehl"
             MessageBox.Show("Anwendungsbefehl")
         Case "btnDatenbankbefehl"
             MessageBox.Show("Datenbankbefehl")
     End Select
End Sub

Damit hätten wir schon einmal die grundlegende Funktion des Ribbons geklärt – die Anzeige von Schaltflächen und deren Implementierung.

Bilder im Ribbon

Nun schauen wir uns an, wie Sie unter Visual Studio benutzerdefinierte Bilder für die Schaltflächen hinterlegen. Dazu öffnen Sie die Datei My Project aus dem Projektmappen-Explorer. Dies zeigt die Eigenschaften des Projekts an, wobei wir über den Eintrag Ressourcen in der Navigation auf der linken Seite zum gleichnamigen Bereich gelangen (s. Bild 3).

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