Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Auf Tabwechsel im Ribbon reagieren

Microsoft hat bei der Entwicklung des Ribbons einige wichtige Ereignisse vergessen - so zum Beispiel eines, das beim Anklicken eines bestimmten Ribbon-Tabs ausgelöst wird. Mit ein wenig Bastelarbeit können Sie ein solches Ereignis jedoch nachbauen.

Beispieldatenbank

Die Beispieldatenbank zu diesem Artikel finden Sie unter dem folgenden Link.

Aus getLabel mach clickTab

Der Hintergrund dieser Lösung ist, dass jedes Tab wohl mindestens ein group-Element enthalten wird. Und ein group-Element kann, wenn es sichtbar wird, eine getEnabled-Callback-Funktion aufrufen, um sein Label zu erfragen.

Dies nutzen wir aus, indem wir in dieser Callbackfunktion gleichzeitig eine Verbindung zum übergeordneten tab-Element herstellen und den gewünschten Code ausführen.

Im Beispiel soll ein Klick auf tab1 im Formular frmTabs den Namen des aktuellen Tabs ausgeben, ein Klick auf tab2 ebenfalls.

Die Ribbon-Definition sieht so aus:

<?xml version="1.0"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="OnLoad_NeuesRibbon">
<ribbon startFromScratch="true">
<tabs>
<tab id="tab1" label="tab1">
<group id="grp1" tag="group 1" getLabel="getLabel"/>
</tab>
<tab id="tab2" label="tab2">
<group id="grp2" tag="group 2" getLabel="getLabel"/>
</tab>
</tabs>
</ribbon>
</customUI>

Die Ribbon-Definition ruft beim Laden eine Callback-Funktion auf, die einen Verweis auf das Ribbon-Objekt in einer Variablen speichert:

Dim objRibbon_NeuesRibbon As IRibbonUI
Sub onLoad_NeuesRibbon(ribbon As IRibbonUI)
    Set objRibbon_NeuesRibbon = ribbon
End Sub

Dies ist notwendig, damit die getLabel-Funktion das aktuell nicht sichtbare group-Element beim Wechseln des Tabs "invalidieren" kann und dieses beim nächsten Erscheinen ebenfalls wieder die getEnabled-Funktion aufruft.

Diese Funktion sieht wie folgt aus und erledigt in Abhängigkeit vom aufrufenden group-Element nur zwei Dinge - die Anzeige des Namens des übergeordneten tab-Elements im Formulartextfeld und das "Invalidate" des group-Element im jeweils anderen tab-Element:

Sub getLabel(control As IRibbonControl, ByRef label)
    Select Case control.Id
        Case "grp1"
            DoCmd.OpenForm "frmTabs"
            Forms!frmTabs!txtTab = "Tab 1"
            objRibbon_NeuesRibbon.InvalidateControl "grp2"
        Case "grp2"
            DoCmd.OpenForm "frmTabs"
            Forms!frmTabs!txtTab = "Tab 2"
            objRibbon_NeuesRibbon.InvalidateControl "grp1"
    End Select
    label = control.Tag
End Sub

Wenn mehr als ein tab-Element im Spiel sind, braucht man natürlich entsprechend mehr Case-Zweige und es müssen in jedem Case-Zweig alle gerade nicht sichtbaren group-Elemente "invalidiert" werden.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.