Ribbon-Guide, Teil I: Rund um das tab-Element

Mit dem Ribbon hat Microsoft dem Entwickler eine Möglichkeit an die Hand gegeben, eine optisch ansprechende Menüstruktur zu implementieren. Verschieden große Bilder und Schaltflächen, viel mehr Steuerelemente als zuvor in den Menü- und Symbolleisten und einige weitere interessante Features. Diese Beitragsreihe liefert eine Übersicht über die Möglichkeiten und wie Sie diese erreichen. Den Start machen einige grundlegende Informationen und das tab-Element.

Wenn Sie das Ribbon mit all seinen Features nutzen möchten, sind einige Vorbereitungen zu treffen. Welche Möglichkeiten sind dies genau, die sonst nicht geboten werden Zum Beispiel die Anzeige benutzerdefinierter Bilder oder die Interaktion mit dem Benutzer und das Reagieren auf Eingaben etwa durch das Aktivieren oder Deaktivieren von Schaltflächen.

Außerdem sind noch einige grundlegende Dinge zu erledigen, so zum Beispiel das Anlegen einer Tabelle zum Speichern der Ribbon-Definitionen. Diese können dann später als Anwendungsribbon (also gleich beim Start der Anwendung) oder erst beim Anzeigen eines Formulars oder Berichts angezeigt werden.

Diese Tabelle muss USysRibbons heißen und die folgenden drei Felder enthalten:

  • ID
  • RibbonName
  • RibbonXML

Im Entwurf sieht die Tabelle wie in Bild 1 aus. Die Tabelle wurde dort bereits gespeichert und ist im Navigationsbereich sichtbar. Dies ist nicht immer der Fall, sondern nur mit speziellen Einstellungen. Diese nehmen Sie vor, indem Sie mit der rechten Maustaste auf die Titelleiste des Navigationsbereichs klicken und dort den Kontextmenüeintrag Navigationsoptionen… auswählen.

pic002.png

Bild 1: Die Tabelle USysRibbons im Entwurf

Es erscheint der Dialog aus Bild 2. Dort aktivieren Sie die Option Systemobjekte anzeigen, um die Systemtabellen und auch die Tabelle USysRibbons einzublenden.

pic001.png

Bild 2: Einblenden der Systemobjekte

Desweiteren sollten Sie, um auf Fehler im Ribbon-Code aufmerksam gemacht zu werden, die Option Fehler des Benutzeroberflächen-Add-Ins anzeigen in den Access-Optionen aktivieren (s. Bild 3).

pic003.png

Bild 3: Aktivieren der Anzeige von Ribbon-Fehlern

Nach diesen grundlegenden Vorbereitungen schauen wir uns die Programmierung eines Ribbons an.

VBA und XML

Das Aussehen eines Ribbons wird nicht wie das etwa einer Menüleiste per Benutzeroberfläche zusammengeklickt oder per VBA definiert, sondern mit einem XML-Dokument. Dieses speichern Sie im Feld RibbonXML der Tabelle USysRibbons – nebst einem entsprechenden Namen im Feld RibbonName.

Wenn eine Benutzeraktion wie etwa ein Klick auf eine Ribbon-Schaltfläche etwas auslösen soll, legen Sie eine entsprechende Prozedur an. Zu den Aktionen kommen wir später, erst einmal schauen wir uns die verschiedenen gestalterischen Möglichkeiten an.

Die einfachste Konstellation, mit der sich etwas anfangen lässt, enthält ein tab-, ein group– und ein button-Element (s. Bild 4). Dies fügt den bestehenden Tabs ein weiteres hinzu, das standardmäßig hinten eingefügt wird. Klicken Sie auf das tab-Element, zeigt dieses ein group-Element mit einem button-Element an.

pic004.png

Bild 4: Einfaches Ribbon mit einer Schaltfläche

Diese Verschachtelung erhalten Sie, wenn Sie das XML-Dokument wie in Listing 1 aufbauen.

Listing 1: Definition eines einfachen Ribbons

<xml version="1.0">
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    <ribbon>
        <tabs>
            <tab id="tab1" label="tab-Element">
                <group id="grp1" label="group-Element">
                    <button label="button-Element" id="btnSchaltflaeche"/>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

Das customUI-Element bildet immer den äußeren Rahmen. Wenn Sie das Ribbon anpassen möchten, fügen Sie darunter das ribbon-Element hinzu. Dieses enthält das tabs-Element, das ein oder mehrere tab-Elemente enthalten kann. Das tab-Element nimmt das group-Element auf, das group-Element die eigentlichen Steuerelemente wie in diesem Fall das button-Element.

Access-Version

Das customUI-Element enthält einen Hinweis auf den verwendeten Namespace. Für Office 2007 lautet dieser wie folgt:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

Unter Office 2010 verwenden Sie dieses Element:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">

Der Unterschied ist, dass Access die folgende Ribbon-Definition mit einer .xsd-Datei vergleicht, welche Informationen darüber enthält, wie die Ribbon-Definition aufgebaut sein darf. In der Version für Office 2007 können Sie beispielsweise das officeMenu-Element einsetzen, in der Version für Office 2010 nicht mehr. Dafür dürfen Sie in der Version für Office 2010 das backstage-Elemeent deklarieren.

Wenn Sie eine für Access 2010 angelegte Ribbon-Definition unter Access 2007 einblenden möchten, führt dies zu einem Fehler, weil Access 2007 den Namespace nicht verarbeiten kann. Wenn Sie eine für Access 2007 vorgesehene Ribbon-Definition unter Access 2010 verwenden, wird dieses erkannt. Lediglich die benutzerdefinierten Einträge unterhalb des officeMenu-Elements werden nicht wie unter Access 2007 interpretiert, sondern im Backstage-Bereich links unten eingebaut (s. Bild 5).

pic014.png

Bild 5: Das benutzerdefinierte officeMenu-Element wird in Access 2010 unterhalb vom Hilfe-Menüpunkt im Backstage angeboten.

Das officeMenu-Element können Sie hingegen nicht in Definitionen für Access 2010 einsetzen und umgekehrt auch nicht das backstage-Element in Definitionen für Access 2007. Sie müssen also, wenn Sie diese Elemente verwenden möchten, tatsächlich zwei Versionen der Datenbank für Access 2007 und Access 2010 verteilen.

Ich habe einige wenige Alternativen zur Herstellung von Kompatibilität bezüglich der Ribbon-Definitionen getestet, mit denen ich um die Verwendung zweier Versionen einer Anwendung für die verschiedenen Access-Versionen herumkommen wollte – immerhin müsste man änderungen sonst immer gleich an zwei Datenbankdateien durchführen.

Die erste Idee war, die Tabelle USysRibbons umzubenennen – beispielsweise in _USysRibbons – und dann eine Abfrage namens USysRibbons zu erstellen, die alle Datensätze der umbenannten Tabelle _USysRibbons enthält. Dabei soll die Tabelle gleich zwei Versionen einer jeden Ribbon-Definition enthalten. Die Abfrage sollte dann etwa anhand einer VBA-Funktion ermitteln, ob gerade Access 2007 oder Access 2010 geöffnet ist, und dann die entsprechende Version der Ribbon-Definition zurückgeben. Leider scheiterte dieser Versuch bereits an einer einfachen, auf der Tabelle mit den Ribbon-Definitionen basierenden Abfrage namens USysRibbons – Access pocht nämlich anscheinend darauf, dass USysRibbons eine Tabelle und keine Abfrage ist.

Der zweite Versuch lief vielversprechender: Ich habe eine neue Datenbank erstellt und dieser eine Verknüpfung auf die Tabelle USysRibbons der eigentlichen Datenbank hinzugefügt. Und siehe da: Statt einer lokalen Tabelle USysRibbons arbeitet Access auch mit einer verknüpften Tabelle mit Ribbon-Definitionen. Auf diese Weise müssen Sie, wenn Sie für Access 2007 und 2010 kompatible Access-Anwendungen verteilen möchten, lediglich die verknüpfte Datenbank mit der richtigen Tabelle USysRibbons mitliefern. Damit sparen Sie sich die parallele Entwicklung zweier vollständiger Versionen Ihrer Anwendung.

Weitere Konstellationen

Die folgenden Abschnitte und die Abbildungen zeigen Abwandlungen von diesem Beispiel und wie Sie das XML-Dokument anpassen müssen, um die änderung zu erreichen. Um die Programmierung der Funktionen kümmern wir uns erst später.

Eingeblendete Elemente ausblenden

Die erste und naheliegendste Variante ist das Ausblenden der eingebauten Elemente. Wenn Sie eine eigene Anwendung entwickeln, werden Sie dem Kunden vermutlich nur benutzerdefinierte Steuerelemente zum Öffnen von Formularen und Berichten und zum Ausführen von Funktionen zur Verfügung stellen wollen. Dies sieht dann für das vorherige Beispiel wie in Bild 6 aus. Die entscheidende änderung nehmen Sie für das Element ribbon vor, dem Sie ein Attribut namens startFromScratch mit dem Wert true hinzufügen:

pic005.png

Bild 6: Ribbon mit ausgeblendeten eingebauten Elementen

<ribbon startFromScratch="true">

Eigenes Tab zwischen vorhandenen Tabs positionieren

Wenn Sie die eingebauten Elemente nicht ausblenden, möchten Sie vielleicht eine exklusivere Position für ein tab-Element auswählen – zum Beispiel gleich die erste (s. Bild 7). Dazu stellen Sie im Vergleich zum vorherigen Beispiel die Eigenschaft startFromScratch des ribbon-Elements auf false oder lassen dieses komplett weg:

pic006.png

Bild 7: Tab an erster Position

<ribbon startFromScratch="false">

Für das benutzerdefinierte tab-Element fügen Sie das Attribut insertBeforeMso ein. Als Wert geben Sie eine Konstante an, welche das eingebaute tab-Element bezeichnet, vor dem Ihr tab-Element angezeigt werden soll – hier TabHomeAccess für das Start-Tab:

<tab id="tab1" insertBeforeMso="TabHomeAccess" label="tab-Element">

Wenn Sie ein tab-Element explizit hinter einem eingebauten Element einfügen möchten, verwenden Sie das Attribut insertAfterMso. Woher aber erhalten Sie die Konstanten für die einzelnen tab-Elemente Der Bereich Symbolleiste für den Schnellzugriff in den Access-Optionen liefert zumindest die deutschen Bezeichnungen (siehe Bild 8, hier für Access 2010). Nachfolgend finden Sie die englischen Versionen, damit Sie diese gleich in Ihren eigenen Ribbon-Definitionen verwenden können:

  • TabPrintPreviewAccess
  • TabHomeAccess
  • TabCreate
  • TabExternalData
  • TabDatabaseTools
  • TabSourceControl
  • TabAddIns
  • TabFormToolsFormatting
  • TabControlLayout
  • TabFormToolsDesign
  • TabFormToolsLayout
  • TabReportToolsFormatting
  • TabReportToolsLayout
  • TabReportToolsPageSetupLayout
  • TabReportToolsDesign
  • TabReportToolsAlignment
  • TabReportToolsPageSetupDesign
  • TabRelationshipToolsDesign
  • TabQueryToolsDesign
  • TabMacroToolsDesign
  • TabPivotTableDesign
  • TabPivotChartDesign
  • TabTableToolsDatasheet
  • TabTableToolsDesignAccess
  • TabAdpFunctionAndViewToolsDesign
  • TabAdpStoredProcedureToolsDesign
  • TabAdpSqlStatementDesign
  • TabAdpDiagramDesign

pic007.png

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