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

Du hast das Ende des frei verfügbaren Textes erreicht. Möchtest Du ...

Oder bist Du bereits Abonnent und hast Zugangsdaten? Dann logge Dich gleich hier ein:
Die Zugangsdaten findest Du im aktuellen gedruckten Heft oder in der E-Mail, die Du als Abonnent mit jeder neuen Ausgabe erhältst.

Schreibe einen Kommentar