Flexible Popup-Menüs für Formulare

Access bietet zwar die Möglichkeit, benutzerdefinierte Popup-Menüs einzusetzen, das setzt aber voraus, dass zunächst über die Funktion ANSICHT-SYMBOLLEISTEN- ANPASSEN ein entsprechendes Kontextmenü definiert und einem Formular über dessen Eigenschaften „Kontextmenü = Ja“ und „Kontextmenüleiste = Name“ zugeordnet wird. In vielen Fällen ist das aber zu umständlich und zu wenig flexibel, da zum Beispiel die Deaktivierung eines Eintrages abhängig vom Kontext recht aufwändig zu programmieren ist. Ein häufiger Wunsch vieler Entwickler ist deshalb eine einfachere Methode für die Anzeige und Auswertung eines Kontextoder Popup-Menüs. Diesem Wunsch kann durch den Einsatz entsprechender API-Funktionen entsprochen werden:

Declare Function CreatePopupMenu Lib „user32“ () As Long

Declare Function AppendMenu Lib „user32“ Alias „AppendMenuA“ (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long

Declare Function DestroyMenu Lib „user32“ (ByVal hMenu As Long) As Long

Declare Function TrackPopUpMenu Lib „user32“ Alias „TrackPopupMenu“ (ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, ByVal nReserved As Long, ByVal hWnd As Long, lprc As tRect) As Long

Declare Function GetMessage Lib „user32“ Alias „GetMessageA“ (lpMsg As tMsg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long

Declare Function GetCursorPos Lib „user32“ (lpPoint As tPoint) As Long

‚ Ein Abschnitt ist immer eine Zeile

Ähnlich wie beim Zugriff auf die Zwischenablage sind für die Anzeige eines Popup-Menüs mehrere Aufrufe notwendig: „CreatePopupMenu()“ legt zunächst die leere Basisstruktur eines Popup-Menüs an und liefert als Ergebnis einen Handle auf diese Struktur.

Über diesen Handle können nun die Funktionen „AppendMenu()“ und „TrackPopupMenu()“ die anzuzeigenden Einträge aufbauen, anzeigen und den ausgewählten Eintrag als Ergebnis liefern. „Destroy- Menu()“ gibt anschließend die Datenstruktur des Popup-Menüs wieder frei.

Statt dieser Einzelaufrufe können Sie die von uns vorbereitete Funktion „DoPopup()“ aus dem Modul „modPopup“ der Beispieldatenbank POPUP.MDB einsetzen. Die Funktion erwartet als Parameter eine Zeichenkette, in der die zur Auswahl stehenden Einträge definiert sind. Als Ergebnis liefert die Funktion die Nummer des gewählten Eintrages.

Ein Aufruf der Funktion könnte zum Beispiel wie folgt aussehen:

Die einzelnen anzuzeigenden Einträge werden zunächst durch das Pipe- Zeichen getrennt. Über weitere Sonderzeichen können Sie spezielle Einträge in das Popup-Menü aufnehmen lassen oder Anzeigezustände steuern:

Result = DoPopup(„1. Eintrag|2. Eintrag|=|3.Eintrag|=|+4. Eintrag|~5. Eintrag|>6. Eintrag|7. Eintrag“)

Beispiel:

Private Sub Detailbereich_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim Result As Long, strMsg

If Button = RIGHT_BUTTON Then
Result = DoPopup(„1. Eintrag|2. Eintrag|=|3.Eintrag|=|+4. Eintrag|~5. Eintrag|>6. Eintrag|7. Eintrag“)
Select Case Result
Case 0
strMsg = „keinen Eintrag ausgewählt…“
Case Else
strMsg = „Eintrag “ + CStr(Result) + “ ausgewählt…“
End Select
MsgBox „Sie haben “ + strMsg, vbOKOnly + vbInformation, „DoPopup():“
End If

End Sub

Sonder-zeichen:

Bedeutung:

=

Ein einzelnes Gleichheitszeichen fügt hinter dem vorhergegangenen
Eintrag eine Trennlinie (Separator) ein – dadurch
lassen sich Einträge logisch gliedern.

+

Ist das erste Zeichen eines Eintrages ein Plus-Zeichen, wird
vor den Eintrag ein Häkchen gesetzt – so können Sie Ja/Neinbzw.
Ein-/Aus-Zustände darstellen.

~

Wenn das erste Zeichen eines Eintrages eine Tilde ist, wird
der Eintrag deaktiviert (ausgegraut) dargestellt.

>

Über das Größer-Zeichen als erstes Zeichen eines Eintrages
veranlassen Sie einen „Spaltenumbruch“ – alle folgenden
Einträge werden dann in einer Spalte neben den vorhergegangenen
Einträgen dargestellt. So lässt sich ein Popup-
Menü ebenfalls logisch gliedern oder vom Aufbau her statt
in die Länge in die Breite ziehen.

So binden Sie den Aufruf von „DoPopup()“ ein

Der Aufruf von „DoPopup()“ erfolgt über die Eigenschaft „Bei Maustaste Ab“ (MouseDown) eines Objektes wie des Detailbereichs oder eines Textfeldes. Die folgende Prozedur reagiert beispielsweise auf einen Rechtsklick in ein Textfeld und fügt die aus dem Popup-Menü ausgewählte Versandart in das Textfeld ein:

Private Sub txtVersandart_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Result As Long, strResult As String

If Button = RIGHT_BUTTON Then
Result = DoPopup(„UPS|DPD|Post/Normal|Post/Express|=|Abholung“)
Select Case Result
Case 1: Me.txtVersandart = „UPS“
Case 2: Me.txtVersandart = „DPD“
Case 3: Me.txtVersandart = „Post/Normal“
Case 4: Me.txtVersandart = „Post/Express“
Case 5: Me.txtVersandart = „Abholung“
End Select
End If

End Sub

ACHTUNG! Wichtig in den Prozeduren, über die „DoPopup()“ aufgerufen werden soll, ist die Abfrage

If Button = RIGHT_BUTTON Then…

Andernfalls würde das Popup-Menü auch dann angezeigt werden, wenn Sie mit der linken Maustaste beispielsweise in ein Textfeld klicken, um den Cursor für eine Änderung zu positionieren.

Mithilfe der Funktion „DoPopup()“ können Sie zum
Beispiel „Ausfüllhilfen“ in Formularen zur Verfügung stellen


Speichern Sie das Modul „modPopup“ ab.