Für Datum, Uhrzeit, Währung et cetera ist dies ein alter Hut: Der Benutzer kann das gewünschte Anzeigeformat in der Systemsteuerung systemweit festlegen. Für andere, anwendungsspezifische Zahlenwerte legt üblicherweise der Entwickler die Formatierung fest. Der Kunde oder Benutzer kann höchstens Vorgaben machen. Wie wäre es aber, wenn Sie den Benutzer Ihrer Anwendung selbst Formate festlegen lassen Wir zeigen, wie das funktioniert.
Wenn Sie dem Benutzer Ihrer Anwendung die Möglichkeit bieten wollen, dass dieser Zahlenformatierungen ähnlich wie in der Systemsteuerung von Windows festlegen kann (siehe Bild 1), brauchen Sie prinzipiell folgende Elemente:
Bild 1: ändern der Zahlenformate in der Systemsteuerung von Windows XP
- eine oder mehrere Tabellen, welche die Formatangaben speichern,
- ein Formular, mit dem der Benutzer die änderungen vornimmt,
- und Techniken, mit denen Sie den betroffenen Zahlenwerten die Formate zuweisen – diese treten überall auf, wo die Zahlen angezeigt werden, also beispielsweise in Abfragen, Formularen und Berichten.
Datenmodell
Bevor wir die Tabellen erstellen, formulieren wir die Wünsche an unsere Formatierungs-Lösung. Am besten verwenden wir für die Formatausdrücke die gleichen Regeln, die auch die Format-Funktion von VBA einsetzt – dazu später mehr.
Damit ein nachträgliches Ergänzen der Formatvorgaben später durch einfaches Anlegen weiterer Datensätze erfolgen kann, können wir bereits drei Felder für unsere Tabelle vormerken:
- FormatID: Primärschlüsselfeld
- Formatbezeichnung: Bezeichnung des Formats
- Formatdefinition: Formatierungsausdruck, kompatibel zur Format-Funktion von VBA
Um den praktischen Nutzen zu erweitern, soll der Benutzer außerdem einen Beispielausdruck eingeben können, der im Formular zur Definition der Formatausdrücke zu Testzwecken eingesetzt wird.
Die Tabelle sieht im Entwurf nun wie in Bild 2 aus und heißt tblFormate.
Bild 2: Die Tabelle zum Speichern der Formatangaben in der Entwurfsansicht
Formular zum Definieren der Eingabeformate
Das Formular besitzt die Abfrage qryFormate als Datenherkunft. Diese Abfrage erledigt etwa mehr als nur die Sortierung der Formate nach der Formatbezeichnung: Sie steuert auch noch ein Feld bei, das den Beispielausdruck mit dem im Feld Formatdefinition angegebenen Ausdruck formatiert (siehe Bild 3).
Bild 3: Diese Abfrage sortiert die Formatierungsangaben nach dem Alphabet und fügt eine formatierte Fassung des Beispielausdrucks hinzu.
Das Formular sieht schließlich wie in Bild 4 aus. Es zeigt die Daten in der Endlosansicht an, weshalb Sie die Eigenschaft Standardansicht auf Endlosformular einstellen.
Bild 4: Das Formular zur Anzeige der Formatangaben in der Entwurfsansicht
Wenn Sie nun in die Formularansicht wechseln und eine Formatbezeichnung, eine Formatdefinition sowie einen Beispielausdruck eingeben, passiert natürlich noch nichts Weltbewegendes.
Es gibt an dieser Stelle ja auch nur eine Anforderung: Das Feld Beispielausdruck soll in dem Format angezeigt werden, das im Feld Formatdefinition angegeben wurde. Perfekt wäre es natürlich, wenn der Benutzer gleich beim Eingeben des Formatausdrucks ein Ergebnis sähe.
Dazu brauchen wir ein paar Zeilen VBA-Code, der durch das Ereignis Bei änderung des Felds mit der Formatdefinition ausgelöst wird. Vorher jedoch stellen wir die Namen der Textsteuerelemente um, indem wir jedem das Präfix txt voranstellen (also txtFormatID, txtFormatbezeichnung und so weiter).
Die Ereignisprozedur sieht wie folgt aus:
Private Sub txtFormatdefinition_Change() Me!txtBeispielausdruck.Format = Nz(Me!txtFormatdefinition.Text) End Sub
Wenn Sie nun einen Ausdruck in das Textfeld txtBeispielausdruck eingegeben haben und den Wert im Textfeld txtFormatdefinition ändern, wird der Inhalt von txtFormatierterBeispielausdruck entsprechend formatiert.
Sie werden allerdings feststellen, dass sich die Einfügemarke bei jeder änderung an das Ende des in txtFormatdefinition enthaltenen Texts bewegt, was auf Dauer stört.
Erweitern wir die Prozedur also so, dass die Einfügemarke nach dem ändern des Formats wieder dort landet, wo sie sich vorher befunden hat:
Private Sub txtFormatdefinition_Change() Dim intSelStart As Integer intSelStart = Me!txtFormatdefinition.SelStart Me!txtFormatierterBeispielausdruck.Format = Nz(Me!txtFormatdefinition.Text) Me!txtFormatdefinition.SelStart = intSelStart End Sub
Die neu hinzugefügten Zeilen lesen vor dem ändern des Formats mit der Eigenschaft SelStart des Steuerelements die Position der Einfügemarke aus und schreiben diese anschließend wieder zurück.
Wenn Sie das Steuerelement txtBeispieleingabe mit dem gleichen Komfort ausstatten möchten, verwenden Sie eine ähnliche Ereignisprozedur, die durch die entsprechende Ereigniseigenschaft von txtBeispieleingabe ausgelöst wird und wie folgt aussieht:
Private Sub txtBeispielausdruck_Change() Dim intSelStart As Integer intSelstart = Me!txtBeispielausdruck.SelStart DoCmd.RunCommand acCmdSaveRecord Me.txtBeispielausdruck.SetFocus Me!txtBeispielausdruck.SelStart = intSelstart End Sub
Der kleine, notwendige Unterschied ist der, dass wir dem Textfeld txtFormatierterBeispielausdruck nicht einfach den Wert von txtBeispielausdruck zuweisen können.
Das Textfeld ist bereits an das Feld FormatierterBeispielausdruck der Datenherkunft gebunden und kann daher nicht durch eine Wertzuweisung geändert werden.
Dies erledigen wir indirekt, indem wir den aktuellen Datensatz nach der Eingabe jedes einzelnen Buchstabens in txtBeispielausdruck speichern und so für eine Aktualisierung von txtFormatierterBeispielausdruck sorgen. Auch hier ist das vorherige Merken und anschließende Wiederherstellen der Cursor-Position nötig. In der Formularansicht sieht frmFormate nun wie in Bild 5 aus.
Bild 5: Das Formular zur benutzerdefinierten Definition von Formaten in Aktion