 | 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'! |
| | | | | |
Zusammenfassung
Erfahren Sie, wie Sie das Registersteuerelement einsetzen und was Sie alles damit anfangen können.
Techniken
Formulare, Registersteuerelement, VBA
Voraussetzungen
Access 2000 und höher
Beispieldateien
Registersteuerelement.mdb
Shortlink
www.access-im-unternehmen.de/699
Registersteuerelemente von A-Z
André Minhorst, Duisburg
Das Registersteuerelement ist ein probates Mittel, überfüllte Formulare zu entschlacken und Eingabesteuerelemente zu strukturieren. Wir zeigen Ihnen, wie Sie das Registersteuerelement einsetzen, wie Sie auf die Ereignisse reagieren, die das Steuerelement etwa beim Wechseln der Registerseite auslöst, und wie Sie ihm ein ganz anderes Aussehen als gewohnt geben.
Das Registersteuerelement fällt in erster Linie durch die Registerlaschen auf, über die der Benutzer per Mausklick die einzelnen Registerseiten aufrufen kann. Ein Registersteuerelement fügen Sie wie jedes andere eingebaute Steuerelement über den entsprechenden Eintrag der Werkzeug-Symbolleiste (bis Access 2003) beziehungsweise den entsprechenden Ribbon-Eintrag zu einem Formular hinzu. Dazu klicken Sie den jeweiligen Eintrag an und ziehen dann im Formularentwurf einen Rahmen in der gewünschten Größe auf.
Markieren der einzelnen Registersteuerelement-Bestandteile
Auch wenn dies trivial erscheint: Es ist zumindest für Einsteiger gar nicht so einfach, das komplette Registersteuerelement oder eine der Registerseiten zu markieren. Wenn Sie einfach in die aktuell angezeigte Registerseite klicken, geschieht gar nichts: Sofern Sie nicht gerade ein auf der Registerseite enthaltenes Steuerelement anklicken, meldet das Eigenschaftsfenster, dass aktuell der Detailbereich des Formulars markiert ist. Erst ein Klick auf einen der Registerreiter markiert die entsprechende Registerseite. Das Registersteuerelement selbst markieren Sie, indem Sie entweder, soweit vorhanden, auf den freien Bereich rechts neben der letzten Registerlasche klicken oder indem Sie an einer leeren Stelle im Detailbereich beginnend einen Rahmen aufziehen, der über dem Registersteuerelement endet. Auch hier erkennen Sie am besten im Eigenschaftsfenster, welches Steuerelement aktuell markiert ist.
Hinzufügen und Entfernen von Registerseiten
Wenn Sie dem Registersteuerelement eine Seite hinzufügen möchten, gelingt dies am schnellsten über das Kontextmenü des Steuerelements selbst. Markieren Sie das Steuerelement wie oben angegeben und klicken Sie auf die rechte Maustaste, können Sie aus dem Kontextmenü den Eintrag Seite einfügen auswählen (s. Abb. 1). Eine vorhandene Registerseite entfernen Sie, indem Sie diese zuerst markieren und dann den Eintrag Seite löschen aus dem entsprechenden Kontextmenü auswählen.
Abb. 1: Über das Kontextmenü des Registersteuerelements fügen Sie Seiten hinzu oder entfernen diese.
Reihenfolge der Registerseiten einstellen
Ein weiterer Eintrag des Kontextmenüs öffnet den Dialog Seitenreihenfolge (s. Abb. 2). Mit diesem Dialog können Sie die Reihenfolge einstellen, indem Sie den zu verschiebenden Eintrag markieren und diesen mit den beiden Schaltflächen Nach oben oder Nach unten verschieben.
Abb. 2: Einstellung der Reihenfolge der Registerreiter
Wichtige Eigenschaften von Registersteuerelementen
Wie jedem anderen Steuerelement auch, sollten Sie die Name-Eigenschaft des Registersteuerelements auf einen Wert einstellen, der mit dem entsprechenden Präfix beginnt - zum Beispiel tabBeispiel. Wenn Sie per VBA auf die einzelnen Seiten zugreifen möchten, sollten Sie auch diesen entsprechende Namen geben. Hier können Sie etwa das Präfix pge (für Page) verwenden: pgeErsteSeite, pgeZweiteSeite. Wichtig ist auch die Überschrift: Mit der Eigenschaft Beschriftung (unter VBA: Caption) stellen Sie den im Registerreiter angezeigten Text ein. Genau genommen sollten Sie unbedingt eine Überschrift einstellen, denn sonst zeigt das Registersteuerelement den Namen der Seite als Beschriftung an.
Zeilenweise
Wenn das Registersteuerelement mehr Registerseiten enthält, als es Registerreiter anzeigen kann, erscheinen am rechten Rand zwei Schaltflächen, mit denen der Benutzer nach links oder rechts blättern kann (s. Abb. 3). In diesem Fall können Sie durch Einstellen der Eigenschaft Mehrere Zeilen (VBA: MultiRow) auf den Wert Ja erreichen, dass die Registerreiter auf mehrere Zeilen verteilt werden (s. Abb. 4).
Abb. 3: Die einzeilige Darstellung der Registerreiter reicht manchmal nicht aus.
Abb. 4: Registersteuerelement mit mehrspaltigem Register
Wenn Sie sehr viele Registerseiten verwenden, könnte der Platz im Registersteuerelement ein wenig eng werden. Dem können Sie mit den beiden Eigenschaften Feste Registerbreite (TabFixedHeight) und Feste Registerhöhe (TabFixedWidth) abhelfen: Legen Sie alle Beschriftungen an, ermitteln Sie die maximal notwendige Breite und stellen Sie diese als Wert der Eigenschaft Feste Registerbreite ein. Zusätzlich lässt sich auch noch über eine kleinere Schriftart und/oder eine geringere Zeilenhöhe (Eigenschaft Feste Registerhöhe) zusätzlicher Platz gewinnen.
Schaltflächen statt Registerreiter
Wenn Ihnen Schaltflächen optisch eher zusagen als Registerreiter, stellen Sie die Eigenschaft Formatvorlage auf Schaltflächen statt auf Register ein. Unter der Kombination Windows XP/Access 2007 macht dies allerdings kaum einen Unterschied, unter Access 2003 schon eher.
Sie können auch die Eigenschaft Formatvorlage auf den Wert Keine einstellen - die Registerreiter verschwinden dann vollständig. Auch dann noch ist das Registersteuerelement sinnvoll einsetzbar: Stellen Sie sich vor, Sie würden einen Assistenten etwa zum Anlegen von Kundendaten in mehreren Schritten programmieren. Sie könnten dann alle notwendigen Steuerelemente auf die einzelnen Registerseiten aufteilen und die jeweils benötigten durch einen programmatischen Wechsel der Registerseite anzeigen. Der Anwender könnte dann über Schaltflächen mit der Beschriftung Vorwärts und Rückwärts zwischen den einzelnen Stationen des Assistenten hin- und herwechseln.
Registerseiten ein- und ausblenden
Jede Registerseite kann im Entwurf über die Eigenschaft Sichtbar ein- und ausgeblendet werden, zur Laufzeit erledigen Sie dies mit der Eigenschaft Visible.
Bilder auf Registerreitern
Sie können jeden Registerreiter mit einem eigenen Bild ausstatten. Dazu wählen Sie über die Eigenschaft Bild die entsprechende Bilddatei aus. In unseren Versuchen funktionierte dies jedoch ausschließlich mit .bmp-Dateien. Diese enthalten jedoch keinen transparenten Hintergrund, sodass beim Wechseln der Registerseite und der damit verbundenen farblichen Hervorhebung der aktiven Seite unschöne Effekte entstehen. Bilder in Registerreitern sind aber ohnehin eher ungewöhnlich und in der freien Wildbahn kaum anzutreffen.
Steuerelemente auf Registerseiten platzieren
Das Platzieren eines Steuerelements auf einer Registerseite geschieht in der Regel wie bei einer Optionsgruppe. Klicken Sie die Schaltfläche für das einzufügende Element an und fahren Sie dann mit der Maus über die Zielseite des Registersteuerelements. Dieses färbt sich dann wie in Abb. 5 schwarz ein. Klicken Sie zu diesem Zeitpunkt mit der Maus, wird das Steuerelement auf der aktuellen Registerseite angelegt.
Abb. 5: Einfügen eines Steuerelements auf einer Registerseite
Wenn Sie ein Steuerelement auf einer anderen Registerseite anlegen möchten, müssen Sie diese zuvor zur aktuellen Registerseite machen. Dies können Sie allerdings auch erledigen, während Sie das anzulegende Steuerelement schon »geladen« haben - auf den Registerreitern lassen sich nämlich keine Steuerelemente ablegen.
Steuerelemente über den Registerseiten platzieren
Gegebenenfalls soll ein Steuerelement auf allen Seiten des Registersteuerelements erscheinen. Sie brauchen es dann nicht auf jeder Registerseite separat anzulegen, sondern platzieren es einfach über dem Registersteuerelement selbst. Das will natürlich nicht so einfach gelingen, denn schließlich färbt dieses beim Überfahren mit der Maus immer gleich die aktuelle Registerseite ein, um es als Ziel zu markieren. Daher gehen wir einen Umweg: Lassen Sie das Steuerelement einfach neben dem Registersteuerelement fallen und verschieben Sie es dann über das Registersteuerelement. Egal, welche Registerseite Sie anschließend aufrufen - ein oberhalb des Registersteuerelements platziertes anderes Steuerelement bleibt immer sichtbar. Und wenn ein solches Steuerelement nur auf fast allen Registerseiten sichtbar sein soll, blenden Sie es eben zur Laufzeit mit der Visible-Eigenschaft ein und aus. Für Steuerelemente, die auf jeder Registerseite die gleiche Funktion anbieten, ist das ohnehin die sinnvollste Lösung.
Register im Register
Manchmal soll es vorkommen, dass Benutzer nach einem Register im Register verlangen. Leider ist es nicht möglich, ein Registersteuerelement direkt auf einer Registerseite abzulegen. Die Betonung liegt hier auf »direkt«, denn über einen Umweg fügen Sie das Registersteuerelement doch noch auf einer Registerseite ein. Der Trick ist, dass Sie der betroffenen Registerseite ein Unterformular unterjubeln, das seinerseits das weitere Registersteuerelement enthält.
Wenn Sie dies vorhaben, erstellen Sie zunächst ein Unterformular und fügen diesem das untergeordnete Registersteuerelement hinzu. Verkleinern Sie den Detailbereich des Unterformulars bis auf die Größe des Registersteuerelements, damit sich dieses nahtlos in die übergeordnete Registerseite einfügt. Das Ergebnis sieht - ohne jegliche Schönheitsoperation - wie in Abb. 6 aus.
Abb. 6: Ein Registersteuerelement im Registersteuerelement - ein Unterformular macht's möglich
Per VBA auf Registersteuerelemente zugreifen
Früher oder später werden Sie Registersteuerelemente per VBA steuern, etwa um auf benutzergesteuerte Seitenwechsel zu reagieren. Ein gutes Beispiel ist der bereits oben erwähnte Assistent, dessen Zurück- und Weiter-Schaltflächen je nach der aktuell ausgewählten Seite aktiviert oder deaktiviert werden sollen.
Zunächst jedoch schauen wir uns an, wie wir grundsätzlich auf die Elemente eines Registersteuerelements zugreifen können. Davon ausgehend, dass der Zugriff vom Klassenmodul des Formulars ausgeht, in dem sich das Steuerelement befindet, referenzieren Sie dieses mit folgender Anweisung:
Me!<Registersteuerelementname>
Lassen Sie uns beim Laden des Formulars einige Informationen über das Registersteuerelement und die enthaltenen Seiten ausgeben. Dazu legen wir eine Ereignisprozedur an, die durch das Ereignis Beim Laden ausgelöst wird. Fügen Sie dieser Eigenschaft des Formularentwurfs im Eigenschaftsfenster den Wert [Ereignisprozedur] hinzu und klicken Sie auf die Schaltfläche mit den drei Punkten (...) neben der entsprechenden Eigenschaft. Im nun erscheinenden VBA-Editor ergänzen Sie die frisch angelegte Ereignisprozedur mit folgenden Codezeilen:
Private Sub Form_Load()
Debug.Print Me!tabBeispiel.Name
Debug.Print Me!tabBeispiel.Pages.Count
End Sub
Dies gibt beim Öffnen des Formulars den Namen des Registersteuerelements und die Anzahl der enthaltenen Registerseiten aus. Schauen wir uns nun die einzelnen Registerseiten an. Die Pages-Auflistung, mit deren Count-Eigenschaft wir oben bereits die Anzahl der enthaltenen Seiten ermittelt haben, bietet über die Items-Eigenschaft Zugriff auf alle enthaltenen Page-Objekte. Wenn Sie Informationen zu einer bestimmten Seite erhalten möchten, können Sie dies etwa so erreichen:
Debug.Print Me!tabBeispiel.Pages.Item(0).Caption
Die Zahl 0 entspricht dabei dem Index des Item-Elements. Auf ein Page-Objekt können Sie auch über den Steuerelementnamen zugreifen, also beispielsweise pgeSeite1:
Debug.Print Me!tabBeispiel.Pages.Item("pgeSeite1").Caption
Falls Sie Informationen über alle Page-Elemente eines Registersteuerelements benötigen oder diese aus anderen Gründen per VBA durchlaufen möchten, gelingt dies am besten über eine entsprechende Objektvariable, die Sie wie folgt deklarieren:
Dim objPage As Page
Die folgende For Each-Schleife durchläuft alle Elemente der Pages-Auflistung und füllt objPage jeweils mit einem Verweis auf die aktuelle Seite. Innerhalb der Schleife gibt die Prozedur die Beschriftung, den Index und den Visible-Zustand im Direktfenster aus:
For Each objPage In Me!tabBeispiel.Pages
Debug.Print objPage.Caption,
objPage.PageIndex, objPage.Visible
Next objPage
Reihenfolge der Tabs zur Laufzeit ändern
Der PageIndex gibt unter anderem die Reihenfolge der Page-Elemente im Registersteuerelement an. Diesen können Sie zur Laufzeit ändern. Um diesen Effekt direkt betrachten zu können, positionieren Sie das Access-Fenster und den VBA-Editor nebeneinander, öffnen das Formular mit dem Registersteuerelement und setzen dann folgende Anweisung im Direktfenster ab:
Forms!frmRegister!tabBeispiel.Pages.Item(1).PageIndex = 0
Dies vertauscht die Seite mit dem PageIndex 0 mit der Seite mit PageIndex 1. Generell gilt die Regel, dass der PageIndex aller Seiten, deren PageIndex größer ist als der PageIndex der Seite, deren PageIndex geändert wird, um eins in Richtung des PageIndexes der geänderten Seite rutscht.
PageIndex der aktuellen Seite ermitteln
Sie werden vermutlich auf die Anforderung treffen, dass Sie zu einem bestimmten Zeitpunkt ermitteln müssen, welche Seite des Registersteuerelements aktuell angezeigt wird. Das ist außerordentlich einfach: Sie brauchen nur den Wert des Registersteuerelements zu ermitteln. Und das geht so:
Debug.Print Forms!frmRegister!tabBeispiel.Value
Möglicherweise kennen Sie dies schon von der Optionsgruppe: Statt eines PageIndexes enthält dort jede Option einen Optionswert, wobei der Wert der aktuell markierten Option als Wert des Optionsgruppen-Steuerelements ausgelesen werden kann. Vom PageIndex aus ermitteln wir gleich noch den Namen der ausgewählten Seite:
Debug.Print Forms!frmRegister!tabBeispiel.Pages(Forms!frmRegister!tabBeispiel.Value).Name
Seiten zur Laufzeit zum Registersteuerelement hinzufügen
Was bei den meisten Steuerelementen etwas aufwendiger ist, gelingt beim Registersteuerelement ganz leicht: Sie können ihm in der Entwurfsansicht leicht per VBA-Code weitere Seiten hinzufügen und diese auch wieder entfernen.
Als Beispiel verwenden wir die Artikel und Kategorien der Südsturm-Datenbank. Fügen Sie einem leeren Formular ein Registersteuerelement hinzu und nennen Sie es tabArtikel. Stellen Sie seine Eigenschaft Mehrere Zeilen auf Ja ein. Das Registersteuerelement soll für jede Kategorie der Tabelle tblKategorien einen Registerreiter erhalten. Später soll ein Unterformular die zur aktuellen Kategorie gehörenden Artikel anzeigen.
Die einzelnen Registerseiten sollen Sie nun nicht von Hand anlegen, sondern per VBA-Code - und zwar in der Entwurfsansicht. Dies erledigt die Prozedur aus Listing 1 (in der Beispieldatenbank im Modul mdlRegister zu finden). Die Routine füllt zunächst eine Variable des Typs TabControl mit einem Verweis auf das Registersteuerelement des Formulars in der Entwurfsansicht (befindet sich das Formular nicht in der Entwurfsansicht, wird weiter unten ein Fehler ausgelöst).
Public Sub KategorieseitenAnlegen()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim objTabControl As TabControl
Dim lngKategorien As Long
Dim i As Integer
Set objTabControl = Forms!frmArtikelNachKategorien.tabKategorien
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT KategorieID, Kategoriename FROM tblKategorien " _
& "ORDER BY Kategoriename", dbOpenDynaset)
rst.MoveLast
rst.MoveFirst
lngKategorien = rst.RecordCount
Do While objTabControl.Pages.Count > lngKategorien
objTabControl.Pages.Remove objTabControl.Pages.Count - 1
Loop
Do While objTabControl.Pages.Count < lngKategorien
objTabControl.Pages.Add 0
Loop
Do While Not rst.EOF
objTabControl.Pages.Item(i).Caption = rst!Kategoriename
objTabControl.Pages.Item(i).Name = "pge" & rst!KategorieID
i = i + 1
rst.MoveNext
Loop
End Sub
Dann öffnet die Prozedur eine Datensatzgruppe und füllt diese mit den Datensätzen der Tabelle tblKategorien, wobei nur die Felder KategorieID und Kategoriename berücksichtigt werden. Nach der Ermittlung der Anzahl der enthaltenen Datensätze werden drei Do While-Schleifen durchlaufen. Die erste prüft jeweils, ob die Anzahl der im Registersteuerelement enthaltenen Page-Objekte größer ist als die Anzahl der Datensätze im Recordset. Falls ja, wird jeweils ein Page-Objekt gelöscht - bis schließlich genau ein Page-Objekt je Datensatz vorliegt. Gegebenenfalls enthält das Registersteuerelement beim Aufruf der Prozedur weniger Page-Elemente als benötigt. In dem Fall füllt die zweite Schleife die Page-Elemente auf.
Fehlt noch die dritte Do While-Schleife: Diese ändert beim Durchlaufen der Datensätze der Tabelle tblKategorien die Eigenschaften der vorhandenen Page-Elemente, indem sie die Beschriftung auf den Wert des Feldes Kategoriename und den Namen auf die Zeichenkette pge plus der KategorieID des aktuellen Datensatzes einstellt. Das Ergebnis sieht nun, egal wie das Registersteuerelement zuvor beschaffen war, wie in Abb. 7 aus.
Abb. 7: Registersteuerelement mit einer Seite je Kategorie der Kategorien-Tabelle
Nun soll noch ein Unterformular die Artikel für die aktuell ausgewählte Registerseite beziehungsweise Kategorie anzeigen. Fügen wir also zunächst jeder Seite des Registersteuerelements ein Unterformular hinzu ... oder doch nicht? Nein: Wir legen das Unterformular einfach über das Registersteuerelement - genau, wie es weiter oben bereits einmal beschrieben wurde! Die Daten sollen ohnehin immer an der gleichen Position angezeigt werden, egal, welche Kategorie der Benutzer nun über die Registerreiter ausgewählt hat.
Erstellen Sie also ein Unterformular namens sfmArtikelNachKategorien und fügen Sie diesem als Datenherkunft die Tabelle tblArtikel hinzu. Ziehen Sie alle gewünschten Felder in den Detailbereich und stellen Sie die Standardansicht auf Datenblatt ein. Speichern Sie das Unterformular und schließen Sie es. Ziehen Sie es nun vom Datenbankfenster beziehungsweise aus dem Navigationsbereich in den Entwurf des Formulars frmArtikelNachKategorien. Verschieben Sie es dann so über das Registersteuerelement, dass es so aussieht, als ob es in einer Seite des Registersteuerelements angezeigt würde.
Ereignisse des Registersteuerelements
Praktischerweise können wir hier sehr schön die Ereigniseigenschaft Bei Änderung des Registersteuerelements vorführen. Hinterlegen Sie für dieses Ereignis die folgende Prozedur:
Private Sub tabKategorien_Change()
ArtikelFiltern
End Sub
Die einzige Anweisung ruft eine weitere Prozedur auf, die so aussieht:
Private Sub ArtikelFiltern()
Dim lngKategorieID As Long
lngKategorieID = Mid(Me.tabKategorien.
Pages(Me.tabKategorien.Value).Name, 4)
With Me.sfmArtikelNachKategorien.Form
.Filter = "KategorieID = "
& lngKategorieID
.FilterOn = True
End With
End Sub
Diese Prozedur liest über Me.tabKategorien.Value den PageIndex der aktuellen Seite aus und ermittelt für die Seite mit diesem Index den Namen, der zum Beispiel pge5 lautet. Die Mid-Funktion filtert hier die 5 heraus, die dem Primärschlüsselwert der gewählten Kategorie entspricht. Mit diesem Wert filtern wir die Datenherkunft des Unterformulars, welches daraufhin die Artikel der ausgewählten Kategorie anzeigt (s. Abb. 8).
Abb. 8: Das Registersteuerelement als Werkzeug zum Filtern eines Unterformulars
Zusammenfassung und Ausblick
Das Registersteuerelement ist sehr nützlich, wenn es um das Strukturieren vieler Steuerelemente geht. In diesem Beitrag haben Sie unter anderem erfahren, wie Sie es mit Steuerelementen bestücken und es per VBA steuern und auf seine Ereignisse reagieren.
Aber es gibt noch mehr: Sie könnten ein Registersteuerelement mit ausgeblendeten Registerreitern auch komplett zweckentfremden, indem Sie es nur mit einer einzigen Registerseite ausstatten und dieses zum Gruppieren von Steuerelementen verwenden. Diese können Sie dann, unabhängig von den anderen Steuerelementen, nur durch Verschieben des Registersteuerelements an einer anderen Stelle positionieren. Auf die Steuerelemente können Sie so wie gewohnt zugreifen: Sie befinden sich technisch gesehen immer noch direkt auf dem Formular.
Auch für Assistenten lässt sich das registerreiterlose Registersteuerelement hervorragend einsetzen. Wie dies funktioniert, erfahren Sie in einer Lösung in einer der folgenden Ausgaben von Access im Unternehmen.
|