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

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

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:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2008.

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

Bauen Sie sich ein eigenes Meldungsfenster, das Sie nach eigenen Wünschen gestalten können.

Techniken

Formulare, VBA

Voraussetzungen

Access 2000 und höher

Beispieldateien

MsgBox.zip

Shortlink

558

Meldungsfenster im Eigenbau

André Minhorst, Duisburg

Wenn sich mal wieder ein Access-Einsteiger in einem Forum oder einer Newsgroup nach Möglichkeiten erkundigt, das Aussehen des mit der MsgBox-Funktion angezeigten Meldungsfensters anzupassen, gibt es nur ein müdes Lächeln und den Hinweis, dass man sich da wohl schon auf die Hinterbeine setzen und ein eigenes Meldungsfenster bauen müsse - natürlich als Formular. Diese Arbeit nehmen wir Ihnen nun ab - mit dem Access-im-Unternehmen-Meldungsfenster.

Meldungsfenster braucht man wirklich oft, und entgegen dem Namen dient es ja nicht nur zur Anzeige von Meldungen, sondern auch zum Realisieren einfacher Dialoge. So stellen Meldungsfenster nicht nur die OK-Schaltfläche zum Schließen der Meldung bereit, sondern auch noch einige andere Kombinationen wie OK und Abbrechen oder Ja und Nein. Und da MsgBox nicht nur eine Methode, sondern - wie einleitend erwähnt - eine Funktion ist, liefert es auch einen Rückgabewert, der einer Konstanten für die vom Benutzer ausgewählten Schaltflächen entspricht und ganz einfach ausgewertet werden kann.

Nun haben Entwickler und Anwender manchmal sehr spezielle Anforderungen und Wünsche, die sich hier und da auch auf die Gestaltung des Meldungsfensters beziehen. In der Tat liefert dieses nur mäßige Möglichkeiten der Anpassung und diese beschränken sich auf die Auswahl des angezeigten Symbols, des Meldungstextes, des Fenstertitels und der zur Verfügung stehenden Schaltflächen. Selbst die Breite des Meldungsfensters kann nur über die breiteste Textzeile beeinflusst werden.

Wer also etwa auf sehbehinderte Benutzer Rücksicht nehmen und mit einer entsprechenden Schriftgröße aufwarten möchte, kommt mit dem herkömmlichen Meldungsfenster nicht weit - außer, er stellt die Schriftgröße direkt systemweit um (Systemsteuerung|Anzeige|Darstellung|Schriftgrad).

Also legen Sie selbst Hand an und bauen Ihr eigenes Meldungsfenster.

Gleicher Aufruf, anderes Meldungsfenster

Der Clou bei der MsgBox-Funktion ist der folgende: Sie können eine eigene öffentliche Funktion namens MsgBox programmieren und damit die eingebaute MsgBox-Funktion überschreiben. Probieren Sie es einfach einmal mit der folgenden einfachen Funktion aus:

Public Function MsgBox()

    Debug.Print "MsgBox überschrieben"

End Function

Wenn Sie nun im Direktfenster den Befehl MsgBox absetzen, erscheint dort lediglich der erwartete Text:

MsgBox

MsgBox überschrieben

Natürlich fehlt zum MsgBox-Ersatz noch einiges mehr, aber Sie können das Meldungsfenster, das Sie auf den folgenden Seiten kennen lernen, zumindest auch nachträglich in bestehende Anwendungen einbauen und davon profitieren.

Funktionen des selbst gebauten Meldungsfensters

Was soll Ihr eigenes Meldungsfenster nun bieten, was das vorherige nicht konnte? Es gibt da eine Menge Möglichkeiten:

  • Auswahl eigener Hintergrund- und Textfarben
  • Auswahl neuer Symbole
  • Andere Schriftart und -größe
  • Gemischte Formatierung

Die Hintergrund- und Textfarben können Sie entweder, wie nachfolgend als einfachere Variante vorgestellt, direkt in das als Meldungsfenster missbrauchte Formular einstellen. Es gibt natürlich auch die Möglichkeit, solche und andere Informationen in einer Optionen-Tabelle oder an anderer Stelle zu speichern und vom Benutzer über einen Optionen-Dialog einstellen zu lassen. Letzteres würde jedoch den Rahmen hier sprengen, sodass wir es bei dem Einstellen einer anwendungsweiten Farbe für Schrift und Hintergrund belassen.

Statt der üblicherweise verwendeten Symbole wie jene aus Abb. 1 können Sie also durchaus eigene Symbole einsetzen. Im vorliegenden Falle nehmen wir allerdings mit den üblichen Symbolen vorlieb.

pic001.tif

Abb. 1: Die Symbole des Meldungsfensters

Mit Schriftart und -größe verhält es sich wie mit den Farben: Sie können diese vom Benutzer einstellen lassen oder aber eigene Einstellungen vorgeben - auch hier verwenden wir aus Gründen der Übersicht die einfachere Variante.

Fehlt noch die gemischte Formatierung: Es ist klar, dass man für völlig flexible Formatierungen ein RTF-Steuerelement oder das in Access 2007 neu eingeführte Richtext-Feld verwenden müsste. Dies ist aber nicht das Ziel: Ein Meldungsfenster soll den Benutzer kurz über einen Sachverhalt informieren beziehungsweise eine Entscheidung über die weitere Vorgehensweise einholen und keine Sammlung bunter und verschieden formatierter Buchstaben sein.

Was völlig in Ordnung ist und bis Access 97 auch möglich war, ist der Einsatz einer fett gedruckten ersten Zeile als Überschrift. In Access 97 wurde diese erste Zeile von den folgenden durch das Klammeraffe-Zeichen (@) getrennt, auch weitere Zeilenumbrüche mit nachfolgender Leerzeile konnten hiermit eingefügt werden. Diese Möglichkeiten soll auch unser Meldungsfenster nachbilden.

Aussehen des Meldungsfensters

Als Meldungsfenster verwenden Sie ein einfaches Formular. Dieses versorgen Sie mit folgenden Steuerelementen:

  • picCritical, picExclamation, picInformation, picQuestion: Bildsteuerelemente, die Eigenschaften Links und Oben erhalten den Wert 0,2cm.
  • lblHeader: Bezeichnungsfeld für die Überschrift, Schriftbreite: Fett
  • lblText: Bezeichnungsfeld für den eigentlichen Text
  • cmd1, cmd2, cmd3: Schaltflächen, die nach Bedarf eingeblendet und mit verschiedenen Texten beschriftet werden. Das Formular selbst soll frmMsgBox heißen. Stellen Sie dort die Eigenschaften Bildlaufleisten, Datensatzmarkierer, Navigationsschaltflächen und Trennlinien auf Nein ein. Die Schaltflächen platzieren Sie im Fußbereich des Formulars.

Die Größe und Position der Bezeichnungsfelder und der Schaltflächen ist zunächst unerheblich, diese Eigenschaften werden später per Code an den enthaltenen Text angepasst. Stellen Sie jedoch die Sichtbarkeit der Schaltflächen mit der Eigenschaft Visible auf False ein. Außerdem sollten Sie die Eigenschaft Textausrichtung der beiden Bezeichnungsfelder auf Zentriert setzen.

Bilder hinzufügen

Für die Symbole fügen Sie einfach vier Bildsteuerelemente hinzu und füllen diese mit Bilddateien in entsprechender Hintergrundfarbe - in der Beispieldatenbank sind diese weiß.

Die Schaltflächen

Das selbst gebaute Meldungsfenster soll die gleichen Schaltflächen-Kombinationen bieten wie das Original-Meldungsfenster. Abb. 2 zeigt im Überblick, welche Konstante welche Schaltflächenkombination erzeugt. Zählt man einmal durch, kommt man auf sechs verschiedene Schaltflächen: Abbrechen, Ignorieren, Ja, Nein, OK und Wiederholen.

pic002.tif

Abb. 2: Die im Meldungstext angezeigten Konstanten erzeugen die jeweiligen Schaltflächen.

Maximal zeigt ein Meldungsfenster jedoch nur drei Schaltflächen gleichzeitig an - vier, wenn man die mögliche Hilfe-Schaltfläche mitzählt (diese lassen wir jedoch weg - einen Meldungstext sollte man schon so formulieren, dass der Benutzer die für ihn richtige Schaltfläche intuitiv auswählt). Wie viele Schaltflächen legen wir also an? Es gibt zwei naheliegende Varianten:

  • Sie legen für jeden Befehl eine eigene Schaltfläche an und blenden jeweils die nicht benötigten Schaltflächen aus. Der Vorteil ist, dass man die Antwort des Benutzers direkt anhand der angeklickten Schaltfläche ermitteln kann.
  • Sie legen nur so viele Schaltflächen an, wie gleichzeitig angezeigt werden sollen. Lässt man die Hilfe-Schaltfläche weg, wären dies drei. Da die Bezeichnungen der Schaltflächen generisch wären, müsste man die Bedeutung der jeweiligen Schaltfläche entweder aus der dynamisch zugewiesenen Beschriftung entnehmen oder man schreibt die Antwortkonstante irgendwo anders hin - beispielsweise in die Tag-Eigenschaft der Schaltfläche.

Die hier zum Einsatz kommende Variante haben wir schon vorweggenommen - wir setzen auf die Minimalanzahl an Schaltflächen, nämlich drei.

Aufruf des Meldungsfensters

Um das Formular als alternatives Meldungsfenster aufzurufen, brauchen Sie eine öffentliche Funktion namens MsgBox, die genau die gleichen Parameter wie die eigentliche Funktion liefert.

Dass Sie nicht alle Parameter auswerten (HelpFile und Context bleiben außen vor), spielt keine Rolle; aus Kompatibilitätsgründen müssen diese Parameter aber zumindest in der Parameterliste der Funktion enthalten sein, damit bereits in einer Anwendung vorhandene Aufrufe keine Fehler auslösen.

Die folgende Funktion prüft zunächst, ob der Parameter Title angegeben wurde, und legt gegebenenfalls einen eigenen Fenstertitel fest. Danach steht dem Öffnen des Formulars als modaler Dialog nichts mehr im Wege. Einzige Aufgabe dieses Aufrufs ist es, die Parameter mit dem OpenArgs-Argument zu übergeben, was in Form einer durch das Pipe-Zeichen (|) getrennten Zeichenkette geschieht. Diese enthält den Zahlenwert für die Konstanten (Schaltflächen, Symbol, Standardschaltfläche), die Meldung sowie den Fenstertitel.

Function MsgBox(Prompt, Optional Buttons _

    As VbMsgBoxStyle = vbOKOnly, _

    Optional Title, _

    Optional HelpFile, _

    Optional Context) As VbMsgBoxResult

    On Error Resume Next

    If IsMissing(Title) Then Title = _

    "Access im Unternehmen-Meldungsfenster"

    DoCmd.OpenForm "frmMsgbox", , , , , _

    acDialog, CStr(Buttons) & "|" _

    & CStr(Prompt) & "|" & CStr(Title)

    MsgBox = Forms!frmMsgbox.RetVal

    DoCmd.Close acForm, "frmMsgbox"

End Function

Damit der Benutzer auch die möglichen Konstanten per IntelliSense vorgesetzt bekommt, deklarieren Sie den Parameter Buttons einfach als VbMsgBoxStyle - das ist der gleiche Datentyp (eine Enumeration), der auch von der Original-MsgBox-Anweisung verwendet wird (s. Abb. 3).

pic003.tif

Abb. 3: Den Datentyp VbMsgBoxStyle der Original-MsgBox-Funktion können Sie auch im eigenen Meldungsfenster-Aufruf einsetzen.

Der Hintergrund, warum das MsgBox-Formular mit dem Parameter WindowMode:=acDialog aufgerufen werden soll, ist folgender: Erstens soll das Formular wie das Original den Fokus erhalten und den Zugriff auf die anderen Elemente der Anwendung verhindern, solange es geöffnet ist.

Und zweitens gibt es ja einen Antwortwert: die durch den Benutzer angeklickte Schaltfläche, die von der MsgBox-Funktion ausgewertet und zurückgegeben werden muss.

Und damit kommen wir direkt zur Funktion des Meldungsfenster-Formulars selbst: Die Schaltflächen sollen es nämlich nicht schließen, sondern nur unsichtbar machen, damit die aufrufende Funktion noch die gedrückte Schaltfläche ermitteln kann.

Funktionen des Meldungsfenster-Formulars

Der Großteil der Funktionen des Meldungsfensters läuft beim Öffnen des Formulars ab. Ist es nämlich einmal mit dem richtigen Symbol, den Texten und den passenden Schaltflächen bestückt, braucht es nur noch das Anklicken einer der Schaltflächen durch den Benutzer auszuwerten.

Die Routine, die durch das Ereignis Beim Öffnen des Formulars ausgelöst wird, ist dementsprechend relativ lang. Sie können diese in der Beispieldatenbank in voller Länge begutachten. Im Folgenden beschreiben wir die einzelnen darin enthaltenen Funktionen.

Öffnungsargumente auseinandernehmen

Die erste Aufgabe ist es, die in einem zusammengesetzten Ausdruck und durch das Pipe-Zeichen (|) getrennten Parameter auseinanderzunehmen und entsprechenden Variablen zuzuordnen. Dazu schreibt die Routine zunächst die in der Eigenschaft OpenArgs des Formulars enthaltene Zeichenkette in eine passende Variable:

Dim strOpenArgs As String

strOpenArgs = CStr(Nz(Me.OpenArgs))

Es kann passieren, dass ein Benutzer das Formular frmMsgBox direkt aus dem Datenbankfenster heraus aufruft. In dem Fall wird kein Öffnungsargument übergeben, was auf einfache Weise ermöglicht, das Formular erst gar nicht anzuzeigen:

If Len(strOpenArgs) = 0 Then

    Cancel = True

    Exit Sub

End If

Dabei fragt die obige Bedingung einfach ab, ob strOpenArgs einen Wert (Variant) mit einer Länge größer 0 enthält und bricht in diesem Fall den Öffnungsvorgang ab; in allen anderen Fällen läuft die Routine weiter.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

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:

Verwandte Beiträge:

Modale Dialoge mal anders

Formularposition speichern und wiederherstellen

Validieren mit Klasse

Benutzerverwaltung

Transparenz und andere Effekte in Formularen

Zugriff auf Formulare

Formulare für die Dateneingabe

Formulare im Blickpunkt

Kontextmenüs von A bis Z

Unterformulare: Daten anlegen und löschen

Projektzeitmanager

Kein Datensatz- und Positionswechsel bei Requery

Fortschrittsanzeige

Vertikale Menüleisten

Änderungsdaten protokollieren

Auswahlfelder im Ribbon

Alphabetisches Register

Datenbank nach Vorlage

Zoomfenster im Eigenbau

© 2003-2015 André Minhorst Alle Rechte vorbehalten.