Listenfeldbeschriftung per Assistent

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

André Minhorst, Duisburg

Die Beschriftung von Listenfeldern ist erforderlich, sobald die Anzahl der angezeigten Felder größer als eins ist. Um ein solches Feld zu beschriften, gibt es zwei Möglichkeiten: Entweder Sie verwenden die eingebaute Funktion zur Anzeige von überschriften oder Sie legen selbst Hand an und erstellen entsprechende Bezeichnungsfelder oberhalb des Listenfeldes. In welchen Fällen dies erforderlich ist und wie Sie sich die Arbeit auf Dauer durch Verwendung eines Assistenten wesentlich vereinfachen können, zeigt Ihnen der vorliegende Beitrag.

Die Beschriftung eines Listenfeldes kann auf zwei Arten erfolgen. Das Listenfeld selbst enthält die Eigenschaft Spaltenüberschriften. Wenn Sie ihren Wert auf Ja setzen, fügt Access dem Listenfeld eine Zeile mit überschriften hinzu (siehe Bild 1). Dabei verwendet Access die Feldnamen bzw. eventuell vorhandene Alias-Namen aus der Datensatzherkunft des Listenfeldes.

Bild 1: Listenfeld mit eingebauten überschriften

Die zweite Möglichkeit ist die Platzierung eigener überschriften oberhalb des Listenfeldes (siehe Bild 2). Die Methode ist z. B. sinnvoll, wenn die Formatierung der überschriften des Listenfeldes dem Design der übrigen Steuerelemente entsprechen soll.

Wenn Sie schon einmal Formulare mit vielen Steuerelementen optisch aufbereitet haben, wissen Sie, dass dies eine recht mühselige Arbeit sein kann. Die manuelle Beschriftung von Listenfeldern ist da keine Ausnahme, ganz im Gegenteil: Die überschriften müssen genau an die in der Eigenschaft Spaltenbreiten angegebenen Maße angepasst werden. Und ob Sie nun die entsprechenden Maße für die Eigenschaften Links und Breite der einzelnen Bezeichnungsfelder eintragen oder die Bezeichnungsfelder nach Augenmaß positionieren: spätestens nach dem Hinzufügen einer Spalte zum Listenfeld ist die ganze Arbeit für die Katz.

Bild 2: Listenfeld mit manuell erstellten überschriften

Wesentlich angenehmer wäre die Aufgabe, wenn sie mit wenigen Knopfdrücken zu erledigen wäre. Und da Sie im Beitrag Assistenten und Add-Ins mit Access in der vorliegenden Ausgabe von Access im Unternehmen ohnehin nachlesen können, wie Sie einen Assistenten in Access integrieren, erstellen Sie sich einen eigenen Assistenten zum Beschriften von Listenfeldern.

Hinweis

Den fertigen Listenfeldbeschrifter finden Sie auf der Heft-CD unter den Dateinamen Listenfeldbeschrifter97.mda und Listenfeldbeschrifter2000.mda.

Wenn Sie einen Assistenten selbst programmieren, können Sie auch selbst seinen Funktionsumfang bestimmen. Das ist der große Vorteil gegenüber fertigen Assistenten und Add-Ins, die entweder so viele Funktionen haben, dass Sie den überblick verlieren, oder die entscheidenden Funktionen vermissen lassen.

Genauso ist es beim Funktionsumfang des Assistenten, der im Rahmen des vorliegenden Beitrags vorgestellt wird: Er wird möglicherweise nicht hundertprozentig Ihren Wünschen entsprechen, aber Sie können ja ohne weiteres Funktionen hinzufügen oder überflüssige entfernen.

Die als Beispieldatenbank auf der Heft-CD befindliche Add-In-Datenbank enthält die folgenden Funktionen:

  • Auswahl des gewünschten Formulars und Listenfeldes
  • Auswahl von Schriftgröße, -farbe, -format
  • Bild 3: Benutzeroberfläche des Listenfeldbeschrifter-Dialogs

  • Auswahl von Hintergrundfarbe und -art
  • Auswahl der Rahmenfarbe und -art
  • wahlweise übernahme oder Anpassung des Feldnamens, der als überschrift dienen soll
  • automatische überprüfung, ob die Zeichenkette zu lang für die Spaltenbreite ist
  • Der hier vorgestellte Assistent besteht im Wesentlichen aus einem Formular, das als Dialog zur Einstellung der gewünschten Eigenschaften der Listenfeldbeschriftungen dient (siehe Bild 3). Sie können den Assistenten nach der Fertigstellung und Registrierung über den Eintrag Extras/Add-Ins/Listenfeldbeschrifter aktivieren.

    Der obere Bereich des Assistenten enthält eine Beispielbeschriftung zur Vorschau auf die aktuellen Einstellungen. Die beiden Kombinationsfelder dienen zur Auswahl des Formulars und des Listenfeldes. Alle anderen Steuerelemente dienen zur Einstellung der verschiedenen Eigenschaften.

    Dabei verwendet der Assistent – soweit möglich – vom System zur Verfügung gestellte Dialogfenster. Das ist bei der Auswahl der Schriftart und bei der Rahmen- und der Hintergrundfarbe der Fall.

    Nach dem Festlegen der Einstellungen und einem Mausklick auf die Schaltfläche Fertig stellen erfolgt die Erstellung der Bezeichnungsfelder. Der Assistent verwendet die Namen oder – falls vorhanden – die Alias-Namen der Felder der Datensatzherkunft des Listenfeldes.

    Der Assistent zeigt für jede überschrift eine Inputbox zur übernahme oder zur Anpassung der überschrift an. Nach der übernahme der überschrift überprüft der Assistent, ob die Breite des zu erstellenden Bezeichnungsfeldes größer als die Breite der entsprechenden Spalte des Listenfeldes ist, und fragt ggf. nach einer kürzeren überschrift.

    In den folgenden Abschnitten erfahren Sie, wie Sie das Formular mit den Steuerelementen zur Festlegung der Eigenschaften der Listenfeldbeschriftungen erstellen und welche Funktionalität sich dahinter verbirgt.

    Hinweis

    Der Quellcode ist aufgrund seines Umfangs teilweise verkürzt dargestellt. Die ungekürzte Version des Quellcodes finden Sie in den entsprechenden Datenbanken auf der beiliegenden Heft-CD.

    Das FormularfrmListenfeldbeschrifter

    Neben einigen VBA-Modulen ist das Formular frmListenfeldbeschrifter das einzige Objekt der Datenbank (siehe Bild 4).

    Bild 4: Das Formular frmListenfeldBeschriften in der Entwurfsansicht

    Anzeige einer Beispielbeschriftung

    Das Bezeichnungsfeld lblBeschriftung bietet dem Anwender eine Vorschau einer überschrift mit den aktuellen Einstellungen.

    Auswahl des Formulars

    Das Kombinationsfeld cboFormular soll alle Formulare der Datenbank anzeigen, die den Assistenten aufruft.

    Normalerweise können Sie als Datenherkunft des Kombinationsfeldes einfach eine auf der Tabelle MSysObjects basierende Abfrage verwenden. Die Tabelle MSysObjects enthält alle Objekte einer Access-Datenbank. Wenn das Feld Type dieser Tabelle den Wert -32768 hat, handelt es sich bei dem Objekt um ein Formular.

    Hier ruft allerdings eine Datenbank (die Datenbank mit dem anzupassenden Listenfeld) eine Funktion einer anderen Datenbank (der Add-In-Datenbank) auf. Wenn im Klassenmodul des Formulars frmListenfeldbeschrifter der Add-In-Datenbank nun eine auf einer Systemtabelle basierende Abfrage ausgeführt wird, bezieht sich diese Abfrage logischerweise auf die Tabelle MSysObjects der Add-In-Datenbank.

    Das können Sie umgehen, indem Sie das Kombinationsfeld per Code füllen. Dazu stellen Sie zunächst die Eigenschaft Herkunftstyp auf Wertliste ein. Den Rest übernimmt die Prozedur aus Quellcode 1, die beim öffnen des Formulars frmListenfeldbeschriftung aufgerufen wird.

    Interessant ist in diesem Fall der erste Teil bis zur Zuweisung der Wertliste an die Eigenschaft RowSource des Kombinationsfeldes. Die Prozedur verwendet die CurrentDB-Funktion, um die aktuell im Datenbankfenster angezeigte Datenbank zu ermitteln, und füllt anschließend das Recordset rst mit den Namen aller Formulare dieser Datenbank. In einer Do While-Schleife durchläuft die Prozedur alle Einträge und setzt einen String zusammen, der eine Liste der durch Semikola getrennten Formularnamen der Datenbank enthält.

    Praxis-Tipp

    Wenn Sie per Code auf eine Tabelle der Add-In-Datenbank verweisen möchten, können Sie dies über die Funktion CodeDB erledigen, die bis auf die Zieldatenbank mit CurrentDB identisch ist.

    Private Sub Form_Open(Cancel As Integer)
        Dim db As Database
        Dim rst As Recordset
        Dim strRowsource As String
        Set db = CurrentDb
        Set rst = db.OpenRecordset("SELECT Name FROM " _        "MSysObjects WHERE Type=-32768", dbOpenDynaset)
        Do While Not rst.EOF
            strRowsource = strRowsource & rst!Name & ";"
            rst.MoveNext
        Loop
        Me.cboFormular.RowSource = Left(strRowsource, _        Len(strRowsource) - 1)
        Me.cboRahmenbreite = Me.cboRahmenbreite.ItemData(0)
        Me.cboSpezialeffekt = _        Me.cboSpezialeffekt.ItemData(0)
    End Sub

    Quellcode 1

    Private Sub cboFormular_AfterUpdate()
        Dim Formular As Form
        Dim Steuerelement As Control
        Dim strListenfelder As String
        If Not IstFormularGeoeffnet(Me.cboFormular) Then
            If MsgBox("Das Formular wird jetzt in der " _            "Entwurfsansicht geöffnet.", vbOKCancel _                + vbExclamation, _
                    "Listenfeldbeschrifter") = vbOK Then
                DoCmd.OpenForm Me.cboFormular, acDesign
            End If
        End If
        Set Formular = Forms(Me.cboFormular)
        For Each Steuerelement In Formular.Controls
            If Steuerelement.ControlType = acListBox Then
                strListenfelder = strListenfelder & ";" _                & Steuerelement.Name
            End If
        Next Steuerelement
        If Len(strListenfelder) > 0 Then
            strListenfelder = Mid(strListenfelder, 2, _            Len(strListenfelder) - 1)
        End If
        Me.cboListenfelder.RowSource = strListenfelder
        Me.SetFocus
        Me.cboListenfelder.SetFocus
    End Sub

    Quellcode 2

    Die beiden weiteren Anweisungen setzen die Kombinationsfelder zur Auswahl von Rahmenbreite und Spezialeffekt auf den ersten Wert der entsprechenden Datensatzherkunft der Kombinationsfelder.

    Auswahl des Listenfeldes

    Nach der Auswahl des Formulars soll das Kombinationsfeld cboListenfelder alle Listenfelder des ausgewählten Formulars zur Auswahl anbieten.

    Da der Inhalt dieses Kombinationsfeldes für jedes Formular anders ist, wird seine Datensatzherkunft nach jeder Auswahl eines neuen Formulars aktualisiert. Diese Aufgabe übernimmt die Prozedur aus Quellcode 2, die durch das Ereignis Nach Aktualisierung des Kombinationsfeldes cboFormulare ausgelöst wird.

    Die Prozedur überprüft zunächst, ob das im Kombinationsfeld cboFormular ausgewählte Formular geöffnet ist. Falls nicht, öffnet es das Formular nach Bestätigung durch den Benutzer in der Entwurfsansicht. Anschließend liest es die Namen aller Steuerelemente aus der Auflistung Controls aus, deren Eigenschaft ControlType den Wert acListbox hat, und schreibt sie durch Semikola getrennt in eine Stringvariable. Danach entfernt die Prozedur das abschließende Semikolon der Stringvariablen und weist sie der Datensatzherkunft des Kombinationsfeldes cboListenfelder zu.

    Private Sub cmdSchriftartAuswaehlen_Click()
        With Me.lblBeschriftung
            ShowFont .FontName, .FontItalic, .FontBold, _           .FontSize, .ForeColor, .FontUnderline
        End With
    End Sub

    Quellcode 3

    Auswahl der Eigenschaften

    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