Ribbon: Controls erkennen und ausblenden

Das Dateimenü von Access bietet eine ganze Reihe praktischer Elemente. Diese sind im Alltagsgebrauch eines Entwicklers sehr hilfreich, bieten sie doch schnellen Zugriff auf wichtige Funktionen. Wollen wir eine Anwendung entwickeln und diese an den Benutzer weitergeben, sollen jedoch unter Umständen gar nicht all diese Befehle verfügbar sein. Vielleicht wollen wir zusätzlich oder statt dieser Einträge sogar eigene Elemente hinzufügen, beispielsweise für das Speichern von Anwendungsoptionen. In diesem Fall ist der erste Schritt, einen oder mehrere der vorhandenen Einträge auszublenden. Wie das gelingt, zeigen wir in diesem Beitrag.

Genau wie die Elemente des Ribbons können wir auch die Einträge im Backstage-Bereich manipulieren, indem wir diese ausblenden, ergänzen oder ihre Funktion verändern.

Standardmäßig finden wir hier einige hilfreiche Funktionen, die wir in Bild 1 sehen – hier am Beispiel von Access in der Version, die mit Microsoft 365 geliefert wird.

Das Dateimenü von Microsoft Access

Bild 1: Das Dateimenü von Microsoft Access

In den folgenden Abschnitten schauen wir uns an, wie wir die eingebauten Elemente für die hier verwendete Access-Version ausblenden können. Das erledigen wir wie folgt:

  • Erstellen einer Tabelle zum Speichern der benötigten Ribbondefinition
  • Zusammenstellen der Ribbondefinition und Speichern der Definition in der Tabelle
  • Einstellen der Ribbondefinition als Anwendungsribbon

Tabelle für die Ribbondefinition

Die Tabelle für die Ribbondefinition legen wir unter dem Namen USysRibbons an. Sie enthält drei Felder: RibbonID (Autowert, Primärschlüsselfeld), RibbonName (kurzer Text) und RibbonXML (langer Text). Nach dem Anlegen und Speichern verschwindet diese Tabelle scheinbar im Nirwana – zumindest wird sie normalerweise nicht im Navigationsbereich angezeigt. Das ist jedoch so gewollt: Der Name der Tabelle beginnt mit USys… – und damit interpretiert Access, dass es sich um eine Systemtabelle handelt, die nicht angezeigt werden soll. Um diese zu sehen, aktivieren wir die Anzeige der Systemtabellen. Dazu klicken wir mit der rechten Maustaste auf die Titelleiste des Navigationsbereichs und wählen aus dem Kontextmenü den Eintrag Navigationsoptionen… aus. Im nun erscheinenden Dialog aktivieren wir die Option Systemobjekte anzeigen.

Nun öffnen wir die Tabelle und fügen einen neuen Datensatz wie in Bild 2 ein.

Tabelle mit der Ribbondefinition zum Leeren des Dateimenüs

Bild 2: Tabelle mit der Ribbondefinition zum Leeren des Dateimenüs

Ribbondefinition zusammenstellen

Diesem fügen wir im Feld RibbonXML den Code aus Listing 1 hinzu. Er enthält ein customUI-Element, dem direkt das backstage-Element untergeordnet ist. Unmittelbar im backstage-Element finden wir dann verschiedene Definitionen für tab– beziehungsweise button-Elemente.

<?xml version="1.0"?>
   <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <backstage>
     <tab idMso="PlaceTabHome" visible="false" />
     <tab idMso ="TabOfficeStart" visible="false" />
     <tab idMso="TabRecent" visible="false" />
     <tab idMso ="TabInfo" visible="false"/>
     <button idMso="FileSave" visible="false"/>
     <tab idMso ="TabSave" visible="false" />
     <tab idMso ="TabPrint" visible="false"/>
     <button idMso="FileCloseDatabase" visible="false"/>
     <tab idMso="TabHelp" visible="false" />
     <tab idMso="TabOfficeFeedback" visible="false" />
     <button idMso="ApplicationOptionsDialog" visible="false"/>
   </backstage>
</customUI>

Listing 1: Ausblenden der Dateimenü-Einträge

Im Gegensatz zu früheren Access-Versionen kann man im Dateimenü nicht mehr erkennen, ob es sich bei einem Eintrag um ein button– oder ein tab-Element handelt.

Der Unterschied ist, dass das button-Element direkt eine Aktion auslöst und das tab-Element den entsprechenden Bereich rechts öffnet.

Wie aber finden wir nun heraus, welche idMso zu den angezeigten Einträgen im Dateimenü gehört? Für die idMsos gibt es Excel-Tabellen mit allen Elementen. Wir haben uns ein wenig Arbeit gemacht und diese manuell ermittelt. Dabei haben wir die folgenden Zuordnungen gefunden, die zum Teil nicht gerade intuitiv zu finden sind:

  • PlaceTabHome: Startseite
  • TabOfficeStart: Neu
  • TabRecent: Öffnen
  • TabInfo: Informationen
  • FileSave: Speichern
  • TabSave: Speichern unter
  • TabPrint: Drucken
  • FileCloseDatabase: Schließen
  • TabHelp: Konto
  • TabOfficeFeedback: Feedback
  • ApplicationOptionsDialog: Optionen

Die Zuordnung kann man vereinfachen, indem man mit einem kleinen Trick arbeitet und die Excel-Tabelle mit der Liste der Ribbon-Steuerelemente nutzt. Diese haben wir aus der Excel-Datei als neue Tabelle namens tblAccessControls zur Beispieldatenbank hinzugefügt. Sie sieht nach dem Import wie in Bild 3 aus.

Daten von Ribbon-Elementen in einer Tabelle

Bild 3: Daten von Ribbon-Elementen in einer Tabelle

Was machen wir nun mit den Daten dieser Tabelle? Wir können anhand des Steuerelementtyps und des TabSets erkennen, welche Elemente infrage kommen.

Um zu identifizieren, welches Element der Tabelle welchem Element im Ribbon entspricht, wenden wir den folgenden Trick an:

Wir definieren die eingebauten Elemente so um, dass sie statt der eingebauten Bezeichnung die idMso anzeigen. Das wollen wir nicht von Hand erledigen, sondern wir verwenden eine Prozedur dazu. Diese finden Sie in Listing 2.

Public Sub CreateXMLBackstage()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim strRibbon As String
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblAccessControls WHERE TabSet = ''None (Backstage View)'' " _
         & "AND Tab IS NULL AND ControlType IN (''button'', ''tab'')", dbOpenDynaset)
     strRibbon = strRibbon & "<?xml version=""1.0""?>" & vbCrLf
     strRibbon = strRibbon & "<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"">" & vbCrLf
     strRibbon = strRibbon & "  <backstage>" & vbCrLf
     Do While Not rst.EOF
         strRibbon = strRibbon & "    <" & rst!ControlType & " idMso=""" & rst!ControlName & """ label=""" _
             & rst!ControlName & """ />" & vbCrLf
         rst.MoveNext
     Loop
     strRibbon = strRibbon & "  </backstage>" & vbCrLf
     strRibbon = strRibbon & "</customUI>" & vbCrLf
     DoCmd.Close acTable, "USysRibbons"
     db.Execute "UPDATE USysRibbons SET RibbonXML = ''" & strRibbon & "'' WHERE RibbonName = ''ClearBackstage''", _
         dbFailOnError
     If db.RecordsAffected = 0 Then
         db.Execute "INSERT INTO USysRibbons(RibbonName, RibbonXML) VALUES(''ClearBackstage'', ''" & strRibbon & "'')", _
             dbFailOnError
     End If
End Sub

[

Listing 2: Prozedur zum Zusammenstellen von neuen Bezeichnungen

Die Prozedur erstellt ein Recordset auf Basis der Tabelle tblAccessControls und ruft alle Datensätze ab, deren Feld TabSet den Wert None (Backstage View) enthält, deren Feld Tab den Wert Null hat und wo ControlType einen der Werte button oder tab enthält.

Diese Datensatzgruppe durchlaufen wir in einer Do While-Schleife und stellen innerhalb dieser Schleife Anweisungen wie diese zusammen:

<tab idMso=""TabInfo"" label=""TabInfo"" />

Zuvor haben wir in der Variablen strRibbon, in der wir die Ribbondefinition zusammenstellen, schon ein customUI– und ein backstage-Element erstellt. Nachdem wir die Schleife durchlaufen haben, ergänzen wir noch die schließenden Elemente.

Das Ergebnis schreiben wir in die Tabelle USysRibbons. Entweder ist dort bereits ein Datensatz vorhanden, dem wir im Feld RibbonName den Namen ClearBackstage zugewiesen haben – dann ist die erste Execute-Anweisung erfolgreich und die folgende Anweisung liefert für db.RecordsAffected einen Wert ungleich 0.

Konnte die Prozedur mit der ersten Anweisung keinen Datensatz bearbeiten, legen wir diesen mit der folgenden Anweisung einfach neu an.

Das Ergebnis sehen wir in Listing 3. Damit war der Großteil der Aufgabe erledigt – allerdings kommt ein Element nicht in der Excel-Tabelle vor. Dabei handelt es sich um das Element PlaceTabHome. Dieses haben wir der Tabelle tblAccessControls der Beispieldatenbank jedoch noch hinzugefügt, sodass die Prozedur von oben nun das korrekte Ergebnis liefert.

<?xml version="1.0"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <backstage>
     <tab idMso="TabInfo" label="TabInfo" />
     <tab idMso="TabOfficeStart" label="TabOfficeStart" />
     <tab idMso="TabRecent" label="TabRecent" />
     <button idMso="FileSave" label="FileSave" />
     <tab idMso="TabSave" label="TabSave" />
     <tab idMso="TabPrint" label="TabPrint" />
     <button idMso="FileCloseDatabase" label="FileCloseDatabase" />
     <tab idMso="TabHelp" label="TabHelp" />
     <button idMso="ApplicationOptionsDialog" label="ApplicationOptionsDialog" />
   </backstage>
</customUI>

Listing 3: Automatisch erstellt Ribbondefinition

Was haben wir davon? Das sehen wir, wenn wir die Datenbank nun schließen und erneut öffnen und zum Dateimenü wechseln. Dieses zeigt nun nämlich die idMso-Bezeichnungen der Steuerelemente statt der eigentlichen Beschriftungen an (siehe Bild 4).

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