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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erweitern Sie die Access-Benutzeroberfläche um Custom Task Panes.

Techniken

VB6, Custom Task Panes

Voraussetzungen

Access 2000 und höher

Beispieldateien

-

Shortlink

528

Custom Task Panes mit VB6

André Minhorst, Duisburg

Neben Ribbon, Formularen und Berichten liefert Access 2007 noch eine weitere Möglichkeit zum Anpassen der Benutzeroberfläche: Das Custom Task Pane. Wie Sie dieses erstellen und steuern, erfahren Sie im vorliegenden Beitrag.

Ein Custom Task Pane ist ein spezielles Fenster innerhalb der Benutzeroberfläche von Access 2007 oder einer anderen Office 2007-Anwendung und das benutzerdefinierte Pendant zu den eingebauten Task Panes, die etwa in Access die Eigenschaften oder die Feldliste enthalten.

Der Unterschied zu üblichen Formularen ist, dass Sie Task Panes am Rand des Anwendungsfensters verankern können und dass diese immer sichtbar sind (das heißt, sie werden nicht von Formularen überdeckt- tatsächlich sind Task Panes technisch von den alten Symbolleisten abgeleitet). Ihre Verwendung bietet sich beispielsweise an, um Schnittstellen zu anderen Anwendungen oder andere wichtige Funktionen ständig anzuzeigen. Denkbar ist etwa auch, die Navigation in der Datenbank komplett über ein Taskpane zu realisieren - der einbaute Navigationsbereich von Access 2007 macht es vor.

Neben Visual Basic 6 können Sie solche Custom Task Panes auch mit Visual Studio .NET und Sprachen wie VB.NET oder C# erstellen. Allerdings sind für die daraus entstehenden DLLs das .NET-Framework sowie Assemblies des Visual Studio Tools for Office auf dem Zielrechner Voraussetzung. Mit VB6 geht das wesentlich einfacher, weil man nur die DLL auf den Zielrechner kopieren und sie registrieren muss.

Vorbereitungen

Als Ausgangspunkt dient eine verschlankte Vorlage für ein Add-In-Projekt unter VB6. Dieses legen Sie zunächst über den Menüpunkt Datei/Neues Projekt und die anschließende Auswahl des Eintrags Addin an. Nun geht es ans Ausdünnen: Werfen Sie zunächst das Formular frmAddin raus und leeren Sie dann das Modul hinter dem Objekt Connect bis auf die erste Zeile Option Explicit.

Task Pane-Verbraucher

Um auf die Methoden zum Erzeugen eines Task Panes zuzugreifen, legen Sie zunächst einen Verweis auf die Bibliothek Microsoft Office 12.0 Object Library an. Gegebenenfalls müssen Sie zuvor noch die eingestellte Version 8.0 der gleichen Bibliothek entfernen. Mit der folgenden Zeile fügen Sie dem Projekt die ICustomTaskPaneConsumer-Schnittstelle hinzu:

Implements ICustomTaskPaneConsumer

Bevor Sie die Ereignisprozedur zum Erzeugen des Task Panes anlegen, brauchen Sie noch eine Objektvariable, die einen Verweis auf das zu erzeugende Task Pane aufnimmt und deren Ereignisse abfangen kann:

Public WithEvents CTP As CustomTaskPane

Dann implementieren Sie die einzige Methode der Schnittstelle ICustomTaskPaneConsumer, indem Sie die passenden Einträge aus den beiden Kombinationsfeldern im oberen Bereich des Codefensters auswählen:

Private Sub _
    ICustomTaskPaneConsumer_CTPFactoryAvailable _
    (ByVal CTPFactoryInst As Office.ICTPFactory)

End Sub

Task Pane als UserDocument-Container

Bevor Sie diese Methode mit Leben füllen, legen Sie erst noch ein UserDocument an, das die im Task Pane anzuzeigenden Steuerelemente enthält. Dazu rufen Sie den Eintrag Hinzufügen/Benutzerdokument des Kontextmenüs im Projekt-Explorer auf und wählen dann im Dialog Benutzerdokument hinzufügen das Element Benutzerdokument aus. Ändern Sie seinen Namen in aiuTask Pane. Fügen Sie außerdem eine Schaltfläche hinzu. Anschließend brauchen Sie nur noch die soeben angelegte Methode zu füllen:

Private Sub _
    ICustomTaskPaneConsumer_CTPFactoryAvailable _
    (ByVal CTPFactoryInst As Office.ICTPFactory)

    Set CTP = CTPFactoryInst.CreateCTP _
        ("MyAddin.aiuTask Pane", "AiU-Task Pane")

    CTP.Visible = True

End Sub

Dabei kommt das Objekt CTPFactoryInst als Parameter der Methode selbst. CreateCTP erzeugt das Task Pane und die Visible-Methode macht es schließlich sichtbar. Achten Sie dabei auf die genaue Schreibweise der ProgID ihres Benutzerdokuments. Sie setzt sich so zusammen: <Name des VB6-Projekts>.<Name des Benutzerdokuments>. Debugging anwerfen, Access starten, fertig - es erscheint ein Task Pane wie in Abb. 1. Wichtig ist es zu erwähnen, dass das Debuggen an dieser und anderen Stellen in Zusammenhang mit dem Erzeugen von Custom Task Panes und Ribbon-Anpassungen nicht zuverlässig funktioniert. Verwenden Sie in jedem Fall eine Fehlerbehandlung, die gegebenenfalls Fehlercode und -beschreibung ausgibt.

abb001.tif

Abb. 1: Das Access-Fenster mit einem benutzerdefinierten TaskPane

Ein- und ausblenden

Nun war das noch lange nicht alles - selbst wenn Sie das Bestücken des Task Panes mit echten Funktionen außen vor lassen. Denn irgendwie müssen Sie ja beim Arbeiten mit umfangreichen Formularen oder Berichten auch mal Platz schaffen - zum Beispiel durch Ausblenden des Task Panes. Das funktioniert sehr zuverlässig mit der Schließen-Schaltfläche rechts oben im Custom Task Pane. Leider gibt es keine passende Möglichkeit zum Wiedereinblenden des Task Panes. Also bauen Sie sich einfach eine eigene Schaltfläche, und zwar in Form eines Ribbon-Steuerelements. Am besten ist dafür eine Umschaltfläche geeignet, die das Ein- und Ausblenden gleichermaßen erledigen kann. Die zum Hinzufügen dieser Ribbon-Umschaltfläche notwendigen Schritte sehen wie folgt aus:

  • Legen Sie die Ribbon-XML-Definition aus Listing 1 als Textdatei an, speichern Sie diese unter dem Namen Ribbon.xml und fügen Sie sie als benutzerdefinierte VB-Ressource zum Projekt hinzu.
  • Listing 1: XML-Code zur Anzeige einer Umschaltfläche zum Ein- und Ausblenden des Custom Task Panes

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

            loadImage="LoadImage">

        <ribbon startFromScratch="false">

            <tabs>

                <tab idMso="TabHomeAccess">

                    <group id="grpTaskPane" label="Task Pane">

                        <toggleButton id="tglTaskPane"

                            label="Taskpane ein-/ausblenden"

                            onAction="OnAction_tglTaskPane"

                            image="Window_Sidebar.png" size="large" />

                    </group>

                </tab>

            </tabs>

        </ribbon>

    </customUI>

  • Implementieren Sie die Schnittstelle IRibbonExtensibility, indem Sie diese mit der Anweisung Implements IRibbonExtensibility bekanntgeben und die folgende Routine zum Connect-Modul hinzufügen.

Private Function _
        IRibbonExtensibility_GetCustomUI( _
        ByVal RibbonID As String) As String

    Dim bin() As Byte

    Dim sXML As String

    Dim F As Integer

    On Error GoTo Fehler

    bin = LoadResData("ribbon.xml", "CUSTOM")

    sXML = StrConv(bin, vbUnicode)

    IRibbonExtensibility_GetCustomUI = sXML

Ende:

    Exit Function

Fehler:

    MsgBox Err.Number & " " & _
        Err.Description, vbCritical, _

        "Fehler in " _
        & "IRibbonExtensibility_GetCustomUI"

    Resume Ende

End Function

Fehlt noch, dass die Umschaltfläche auch das Custom Task Pane ein- und ausblendet. Dazu hinterlegen Sie die folgende Routine, die beim Anklicken der Umschaltfläche ausgelöst wird:

Sub OnAction_tglTaskpane(control As _
        IRibbonControl, pressed As Boolean)

    CTP.Visible = pressed

End Sub

Zusätzlich zu diesen Routinen benötigen Sie - wenn Sie die Umschaltfläche mit einem Icon versehen möchten - noch einige Anpassungen, die Sie dem Beitrag Ribbon mit VB6 (Shortlink 526) entnehmen können. In der Regel kann man - wie auch bei den zahlreichen eingebauten Task Panes der Office-Anwendungen - davon ausgehen, dass diese üblicherweise erst einmal ausgeblendet sind und der Benutzer sie erst bei Bedarf einblendet. Dazu müssen Sie lediglich die folgende Zeile aus der Routine ICustomTaskPaneConsumer_CTPFactoryAvailable löschen:

CTP.Visible = True

Umschaltfläche synchronisieren

Der Ordnung halber sorgen Sie nun noch dafür, dass die Umschaltfläche auch beim Ausblenden des Custom Task Panes den richtigen Status anzeigt - also normal bei ausgeblendetem, hervorgehoben bei eingeblendetem Task Pane. Das ist nicht ganz unkompliziert, zeigt aber sehr schön, wie das Ribbon tickt. Auslöser der ganzen Aktion ist das Ausblenden des Custom Task Panes. Damit dabei überhaupt etwas geschieht, implementieren Sie die folgende Ereignisprozedur:

Private Sub CTP_VisibleStateChange(ByVal CustomTaskPaneInst As Office.CustomTaskPane)

    objRibbon.Invalidate

End Sub

Im vorliegenden Fall soll die Routine das Ribbon dazu bringen, den Status seiner Elemente auf Basis der vorhandenen get...-Attribute, hier getPressed der Umschaltfläche, zu aktualisieren. Damit dies funktioniert, muss man beim Anpassen des Ribbons einer Variablen einen Objektverweis auf das Ribbon zuweisen. Der richtige Zeitpunkt dafür ist die Ausführung der onLoad-Callbackfunktion, die Sie im XML-Dokument wie folgt festlegen:

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

Der Objektverweis soll in einer in einem Standardmodul deklarierten Variablen namens objRibbon gespeichert werden:

Public objRibbon As IRibbonUI

Die OnLoad-Funktion sieht schließlich wie folgt aus:

Function OnLoad(ribbon As IRibbonUI)

    Set objRibbon = ribbon

End Function

Damit Access den Status der Umschaltfläche auch aktualisiert, weisen Sie diesem Element in der XML-Definition das Attribut getPressed mit einer passenden Callbackfunktion zu:

<toggleButton id="tglTaskPane"
label="Taskpane ein-/ausblenden"
onAction="OnAction_tglTaskPane"
image="Window_Sidebar.png" size="large" getPressed="GetPressed_tglTaskPane" />

Und wenn Sie nun ein Objekt namens objRibbon haben, für das Sie beim Ausblenden des Task Panes per Schließen-Schaltfläche die Invalidate-Methode aufrufen, dann sorgt das getPressed-Attribut der Umschaltflächen-Definition dafür, dass die folgende Routine den Status der Umschaltfläche mit der Sichtbarkeit des Custom Task Panes synchronisiert:

Function GetPressed_tblTaskPane(control As IRibbonControl) As Boolean

    GetPressed_tblTaskPane = CTP.Visible

End Function

Zu guter Letzt noch der Hinweis, dass Sie die XML-Ribbon-Definition nach Änderungen selbstverständlich jeweils wieder aus der Liste der benutzerdefinierten Ressourcen löschen und wieder hinzufügen müssen. Nach dem Kompilieren des Projekts und dem nächsten Start von Access zeigt sich dieses im gewohnten Look, aber wenn Sie dann eine Datenbank öffnen, erscheint die neue Schaltfläche im Ribbon. Zum Einblenden des Custom Task Panes müssen Sie diese nur betätigen (s. Abb. 2).

abb003.tif

Abb. 2: Access mit Ribbon-Umschaltfläche zum Ein- und Ausblenden des Custom Task Panes

Zusammenfassung und Ausblick

Das Grundgerüst eines Custom Task Panes zu erstellen, ist kein Hexenwerk. Das Komplizierteste daran ist wohl die Synchronisierung der Ribbon-Umschaltfläche zum Ein- und Ausblenden beim Ausblenden des Task Panes per Schließen-Schaltfläche. Der Spaß beginnt freilich erst danach - nämlich wenn es an den Bau der eigentlichen Funktionen geht. Als Beispiel könnten Sie etwa mal eine Art Query Analyzer implementieren - möglicherweise kennen Sie diesen schon von älteren Versionen des SQL Servers. Es handelt sich dabei um ein Fenster, das in zwei Bereiche aufgeteilt ist und in einem Textfeld im oberen Bereich die Eingabe von SQL-Ausdrücken erlaubt, deren Ausgabe im unteren Bereich angezeigt wird.

Wie dies funktioniert, erfahren Sie in der folgenden Ausgabe in einem weiteren Beitrag namens Permanenter Access-Query-Analyzer (Shortlink 544).

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.