Button Home/Top/Zurück


OpenArgs - Popup Kalender




Eine Möglichkeit, Daten an ein Formular weiterzugeben sind die OpenArgs.
Diese werden beim Kommando DoCmd.OpenForm als 7. Parameter (String) an das zu öffnende Formular übergeben.
In dem zu öffnenden Formular kann über Me.OpenArgs auf diesen String zugegriffen werden.
In der Access-Hilfe sind unter dem Stichwort OpenArgs-Eigenschaft einige Anwendungsbeispiele aufgeführt.

Ich werde hier als Beispiel einen Popup-Dialog für die Auswahl eines Datums vorstellen.

Bei dem Popup-Kalender geht es darum, für die Auswahl eines Datums für verschiedene Textfelder eines Dialoges, einen Popup-Kalender zu starten. Dieser sollte nach Möglichkeit das ausgewählte Datum in das Textfeld eintragen, aus dem der Dialog gestartet wurde.

Hier der Eingabedialog:

In die Felder Feld1 und Feld2 soll das Datum eingetragen werden. Über den Button ? wird der Popup-Kalender gestartet. Für die Rückgabe des Datum ist entscheidend, welches Feld (Feld1 oder Feld2) den Focus hatte, als der Button betätigt wurde.

Diese Information wird bei dem Ereignis Bei Mausbewegung des Buttons ? ermittelt.

Private Sub PbKalender_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'
' PbKalender_MouseMove()
'
' Der Mauszeiger wird über den Button "?" bewegt.
'
    On Error Goto PbKalender_MouseMoveErr
    '
    ' Prüfen, ob der Button selber den Focus hat
    '
    If Me.ActiveControl.Name <> "PbKalender" Then
        '
        ' Den Namen des Steuerelementes, welches gerade den
        ' Focus hat, merken
        '
        glbDatenfeld = Me.ActiveControl.Name
    End If
    Exit Sub
    
PbKalender_MouseMoveErr:
    On Error Goto 0
    Exit Sub
End Sub

glbDatenfeld ist eine globale Variable vom Typ String

Das Ereignis Beim Mausbewegung ist deshalb so günstig, da der Benutzer den Mauszeiger erst einmal auf den Button bewegen muß um diesen zu betätigen. Das heißt, die Information ist hier am aktuellsten.
Das Ereignis Beim Klick des Buttons ? kann nicht verwenden, weil zu diesem Zeitpunkt der Button selber das ActiveControl ist.
Zu berücksichtigen ist noch, das beim Klick auf einen Button u.a. auch das Ereignis Mausbewegung des Buttons ausgelöst wird. In der Ereignisprozedur muß als sichergestellt werden, daß nicht der Name des Buttons als aktives Steuerelement gespeichert wird.

Der Aufruf des Popup-Kalenders erfolgt in der Ereignisprozedur Beim Klick des Buttons ?.
Private Sub PbKalender_Click()
'
' PbKalender_Click()
'
' Der Button "?" wurde betätigt
'
On Error GoTo Err_PbKalender_Click
 
Dim stDocName As String
Dim stOpenArgs As String
    '
    ' Kalender-Dialog
    '
    stDocName = "DlgKalender"
    '
    ' OpenArgs zusammenbauen
    ' <Name des Formulares>;<Name des Steuerelementes das den Focus hat>
    '
    stOpenArgs = Me.Name & ";" & glbDatenfeld
    '
    ' Popup-Dialog öffnen
    '
    ' Hiermit wird festgelegt, daß es
    ' sich um einen PopUp-Dialog  -------+
    ' handelt.                           |
    '                                    V
    DoCmd.OpenForm stDocName, , , , , acDialog, stOpenArgs
 
Exit_PbKalender_Click:
    Exit Sub
 
Err_PbKalender_Click:
    MsgBox Err.Description
    Resume Exit_PbKalender_Click
 
End Sub
Der Popup-Kalender sieht so aus:


In der Ereignisprozedur Beim Anzeigen des Popup-Kalenders werden die OpenArgs ausgewertet und das Ergebnis in globalen Variablen zwischen gespeichert.
Private Sub Form_Current()
'
' Beim Anzeigen des Popup-Dialoges
'
Dim sDummy As String
Dim Pos1 As Integer
    '
    ' OpenArgs auslesen
    '
    sDummy = OpenArgs
    '
    ' Trennzeichen suchen
    '
    Pos1 = InStr(sDummy, ";")
    '
    ' Formularname aus OpenArgs ermitteln
    '
    glbFrmName = Left$(sDummy, Pos1 - 1)
    '
    ' Steuerelementname aus OpenArgs ermitteln
    '
    glbCtrlName = Right$(sDummy, Len(sDummy) - Pos1)
 
 
End Sub
Jetzt fehlt nur noch die Implementierung des Buttons OK des Popup-Kalenders. Hier ist das Kalendersteuerelement auszulesen und der Wert an das richtige Steuerelement des aufrufenden Dialoges zu übergeben. Das muß dann so aussehen:
Private Sub PbOK_Click()
    '
    ' Wert des Kalendersteuerelementes in das aufrufende Formular
    ' übertragen.
    '
    Forms(glbFrmName).Controls(glbCtrlName) = Me.ActiveXKalender
    DoCmd.Close
 
End Sub
Hierbei ist Me.ActiveXKalender das Kalendersteuerelement auf dem Popup-Dialog.

Nachfolgende Dialoglayouts zeigen, daß der Popupkalender auch in Endlosformularen funktioniert.

Endlosformular 1 Endlosformular 2


Dabei ist es unerheblich, ob der Button im Detailbereich oder im Kopfbereich des Formulars liegt.
WinZip Icon Beispiel als ZIP-File (25 KB) zum downloaden.
Access Icon Beispiel als MDB (128 KB) zum downloaden.

Button Home/Top/Zurück