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 |
+ |
Ist das erste Zeichen eines Eintrages ein Plus-Zeichen, wird |
~ |
Wenn das erste Zeichen eines Eintrages eine Tilde ist, wird |
> |
Über das Größer-Zeichen als erstes Zeichen eines Eintrages |
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.