Dynamische Ribbons

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Ein Menü ist ein wichtiges Element bei der Steuerung einer Softwareanwendung. Unter Office gibt es seit der Version 2007 eine neue Variante der bis dato verwendeten Menü- und Symbolleisten: das Ribbon. Auch wenn es noch Schlupflöcher gibt, die den Einsatz der alten Menüs in .mdb-Dateien unter Access 2007 erlauben, werden Sie sich als Access-Entwickler früher oder später mit dem Programmieren des Ribbons beschäftigen müssen. Wir zeigen, wie Sie das Ribbon mit Leben füllen.

“Sie werden sich mit dem Programmieren des Ribbons beschäftigen müssen” – das hört sich sehr danach an, als ob die Beschäftigung mit dem Ribbon nicht unbedingt auf uneingeschränkte Gegenliebe stößt.

In der Tat ist es wohl mit vielem Neuen, für das man lieb gewonnene Gewohnheiten und Techniken aufgeben muss: Sie können in wenigen Sekunden ganze Menüs und Symbolleisten mit dem Anpassen-Dialog zusammenklicken Sie haben tolle Klassen, die Menüstrukturen aus Tabellen einlesen, um diese zur Laufzeit zusammenzustellen Vergessen Sie es, denn nun heißt es wie bei Peter Fox: "Hey, alles glänzt, so schön neu!"

In der Tat bietet das Ribbon ganz andere Möglichkeiten als die alten Menüs. So kann man Befehle zu dritt untereinander anordnen oder wahlweise einen Befehl mit einer großen Schaltfläche auf dem gleichen Platz anzeigen und es gibt eine ganze Reihe neuer Steuerelemente. Für den Entwickler am wichtigsten ist aber die Technik, und auch die ist rundum erneuert, was sich vor allem in der Definition des Aussehens des Ribbons per XML widerspiegelt.

Im gleichen XML-Dokument, das auch die äußerlichen Merkmale festlegt, geben Sie auch an, was beim Verwenden der enthaltenen Steuerelemente geschehen soll oder ob bereits der Aufbau des Ribbons teilweise durch VBA-Routinen unterstützt werden soll.

Für alle Neulinge in der Ribbon-Welt sei an dieser Stelle vermerkt, dass eine ausführliche Einführung wohl leicht ein komplettes Heft wie das vorliegende füllen könnte. Wir können daher nicht bei Adam und Eva anfangen, lassen Sie aber auch nicht im Ribbon … – Verzeihung, Regen stehen. Im Buch Access 2007 – Das Grundlagenbuch für Entwickler (ISBN 978-3-8273-2459-7) gibt es ein komplettes Kapitel von 60 Seiten zu diesem Thema, das unter http://www.access-entwicklerbuch.de/2007/download/AEB2007_Kapitel12.pdf kostenlos zum Download bereitsteht. Dort erhalten Sie die für das Verständnis dieses Beitrags notwendigen Grundkenntnisse wie etwa zum Aufbau eines XML-Dokuments zur Definition eines Ribbons, die wir an dieser Stelle aus Platzgründen nicht wiederholen möchten.

In diesem Beitrag wollen wir die Grundlagen für den Einsatz der sogenannten Callback-Funktionen liefern und mit einigen Beispielen zeigen, wie Sie das Ribbon nicht nur als Ergebnis eines statischen XML-Konstrukts verwenden, das beim Klicken auf die Steuerelemente die eine oder andere Funktion aufruft. Stattdessen erfahren Sie hier, welche Callback-Funktionen wann aufgerufen werden und wie Sie selbst die Aktualisierung des Ribbons auslösen können.

In loser Folge werden wir Ihnen dann in weiteren Beiträgen das Ribbon und die interessantesten Techniken näherbringen – zum Beispiel, indem wir Ihnen zeigen, wie Sie die verschiedenen Typen von Kombinationsfeldern füllen oder wie Sie am einfachsten Bilder im Ribbon anzeigen.

Aufbau der Beispieldatenbank

Sie finden die nachfolgend beschriebenen Beispiele in der Beispieldatenbank. Wenn Sie diese dennoch selbst nachvollziehen möchten, hier einige kurze Hinweise:

  • Sie benötigen eine Tabelle namens USysRibbons mit den Feldern ID (Autowert), Ribbonname (Text) und RibbonXML (Memo). Darin speichern Sie die Ribbon-Definitionen.
  • Die Tabelle USysRibbons ist nach dem Speichern bei Verwendung von Standardeinstellungen nicht mehr sichtbar, weil sie infolge der Verwendung des Präfix USys eine Systemtabelle wird. Sie brauchen diese nicht sichtbar zu machen. Kopieren Sie stattdessen das Formular frmRibbons aus der Beispieldatenbank in Ihre Datenbank. Damit können Sie die Ribbon-Definitionen prima anpassen.
  • Sie benötigen ein Modul namens mdlRibbons, das die Callback-Funktionen für die Ribbons aufnimmt.
  • Wenn Sie benutzerdefinierte Bilder im Ribbon anzeigen möchten, die Sie in einer Tabelle in der Datenbank speichern (was empfehlenswert ist), importieren Sie auch noch das Modul mdlRibbonImages. Es enthält eine Methode PicFromField, mit der Sie in OLE-Feldern gespeicherte Images leicht in ein StdPicture-Objekt füllen können, das dann für die Anzeige des Bildes im Ribbon verwendet werden kann.
  • Um Bilder in einer Tabelle der Datenbank zu speichern, um diese für das Ribbon bereitzustellen, brauchen Sie erstens eine passende Tabelle. Diese nennen wir USysImages; Sie können sich diese von der Beispieldatenbank holen und in Ihre eigene Anwendung kopieren.
  • Irgendwie müssen die Bilddateien ja auch noch in die Tabelle USysImages gelangen. Das erledigen Sie über die Routine ImageHinzufuegen und einige abhängige Funktionen aus dem Modul mdlTools der Beispieldatenbank. Die Routine rufen Sie einfach auf, indem Sie diese im VBA-Fenster markieren und auf F5 drücken – es erscheint dann ein Datei öffnen-Dialog, mit dem Sie auch gleich mehrere Bilder auf einen Rutsch importieren können. Beachten Sie dabei, dass die Bilder möglichst transparente Bereiche untersützen sollten und die Zieltabelle USysImages vorhanden sein muss.
  • Fügen Sie Ihrer Datenbank einen Verweis auf die Bibliothek Microsoft Office 12.0 Object Library hinzu.
  • Stellen Sie in den Access-Optionen im Bereich Erweitert die Option Fehler in Benutzeroberflächen von Add-Ins anzeigen auf Ja ein.

Ribbons testen

Normalerweise müssen Sie, das können Sie in der oben angeführten Literatur im Detail nachlesen, die Datenbankanwendung jeweils mindestens einmal neu starten, wenn Sie eine änderung an der Ribbon-Definition vorgenommen haben. Unser Testformular frmRibbons verkürzt diesen Aufwand merklich: Sie brauchen dort nur die gewünschte Ribbon-Definition einzutragen (die dann ja ohnehin in der Tabelle USysRibbons landet, sofern diese vorliegt) und auf die Schaltfläche Anzeigen zu klicken – schon zeigt Access die Ribbon-Anpassungen an (siehe Bild 2).

pic001.png

Bild 1: Ribbon mit einer einfachen Schaltfläche

pic002.png

Bild 2: Das Formular frmRibbons hilft beim Testen neuer Ribbon-Definitionen.

Knöpfchen drücken

Um dies nicht auszulassen, starten wir mit dem einfachsten aller Callback-Attribute: onAction. Es ist beispielsweise im button-Element zu finden, wie es das folgende XML-Dokument zu Bild 1 zeigt (siehe Beispieldatenbank, USysRibbons, Ribbonname: EinfacherCallback):

<xml version="1.0">
<customUI xmlns="..." loadImage="loadImage">
<ribbon startFromScratch="true">
<tabs>
<tab id="tabButton"
label="onAction-Beispiel">
<group id="grpButton"
label="onAction-Beispiel">
<button id="btnBeispiel"
image="alarmclock_preferences.png"
label="Klick mich!"
onAction="OnAction" size="large"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Das onAction-Attribut im button-Element enthält den Namen der VBA-Prozedur, die beim Klick auf dieses Element aufgerufen wird. Dazu muss die Routine eine spezielle Syntax aufweisen, die so aussieht:

Sub OnAction(control As IRibbonControl)
    MsgBox control.ID
    End Sub

Diese Routine schreiben Sie in das bereits vorbereitete Standardmodul mdlRibbons und sorgen so dafür, dass beim Klick auf die Schaltfläche der Name derselben, hier btnBeispiel, in einem Meldungsfenster angezeigt wird. Üblicherweise gibt es mehr als eine Schaltfläche mit dem onAction-Attribut. Beim Anlegen der Callback-Funktionen gibt es nun mehr möglichkeiten als bei herkömmlichen Ereignisprozeduren:

  • Sie legen für jedes onAction-Callback-Attribut eine eigene Callback-Funktion an und benennen sie beispielsweise nach dem Schema <Steuerelementname>_OnAction, hier also etwa btnBeispiel_OnAction.
  • Andererseits liefert eine solche Callback-Funktion den Namen des aufrufenden Elements mit. Sie könnten also eine Callback-Funktion mit einer Select Case-Anweisung ausstatten und je nach aufrufendem Steuerelement die richtigen Anweisungen ausführen.

Letzteres würde so aussehen:

Sub OnAction(control As IRibbonControl)
    Select Case control.ID
    Case "btnBeispiel"
    'tu was
    Case ...
    End Select
    End Sub

Wie man hier vorgeht, hängt sicher von den persönlichen Vorlieben ab. Die Verwendung einer eigenen Callback-Funktion je Steuerelement hätte den Vorteil, dass man diese leicht separat herauslösen und anderweitig verwenden könnte – auch weil dann die entsprechenden Attribute der Steuerelemente mit dem passenden Callback-Funktionsnamen ausgestattet sind.

Statischer und dynamischer Aufbau

Auch wenn Ribbon-Aktionen wie ein Mausklick auf eine Schaltfläche letztlich per VBA-Routine (oder auch per Makro) ausgeführt werden müssen, können Sie das Ribbon komplett statisch, also mit reinem XML-Code aufbauen.

Sie können aber an vielen Stellen durch einfache Callback-Funktionen Werte von Eigenschaften der Steuerelemente und des Ribbons selbst (im XML-Slang: Attribute) dynamisch zuweisen.

Ein Beispiel ist das folgende (wir lassen nun die immer wiederkehrenden Elemente der Ribbon-Definition weg, soweit diese keine wesentlichen Informationen liefern).

Das erste Bezeichnungsfeld wird statisch mit dem Ausdruck Bezeichnungsfeldtext gefüllt, das zweite bezieht seine Bezeichnung aus der Callback-Funktion GetLabel (siehe Beispieldatenbank, Tabelle USysRibbons, Ribbon GetLabelBeispiel):

...
<group id="grpBeispielLabel" label="Bezeichnungsfelder">
<labelControl id="lblBeispielStatisch" label="Bezeichnungsfeldtext"/>
<labelControl id="lblBeispielDynamisch" getLabel="GetLabel"/>
</group>
...

GetLabel sieht dabei wie folgt aus und liefert über den Parameter label schlicht eine entsprechende Zeichenkette für das Steuerelement mit dem Namen lblBeispielDynamisch zurück:

Sub GetLabel(control As IRibbonControl, _
    ByRef label)
    Select Case control.ID
    Case "lblBeispielDynamisch"
    label = "Dies ist ein dynamisch µ
    erzeugtes Label."
    End Select
    End Sub

Auf die gleiche Weise können Sie die Werte für all jene Attribute zur Laufzeit zuweisen, deren Name mit get… beginnt und die einen Text erwarten, also getDescription, getItemLabel, getItemScreentip, getItemSupertip, getKeytip, getLabel, getScreentip, getSupertip, getText und getTitle. Es gibt noch einige weitere Attribute, die auf die gleiche Weise bedient werden können, aber Informationen auf Basis anderer Datentypen verlangen – mehr dazu später.

Dynamik auf Wunsch

Zunächst nutzen wir das Beispiel des Bezeichnungsfeldes, um zu zeigen, wie Sie ein Attribut eines Ribbon-Elements zur Laufzeit ändern können.

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

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar