Translate

Dienstag, 20. Dezember 2016

ACCESS: Wie lautet das Unterformular-Steuerelement in welches das aktuelle Formular sich befindet?

Das einbetten eines Formulars als Unterformular in einem Hauptformular, findet über das Unterformular-Steuerelement statt.

Nehmen wir mal an, wir möchten in Abhängigkeit von Datenzustände Eigenschaften von unserem Unterformular-Steuerelement wie z.B. Visible/Height/Width/BorderWidth ändern.
Aus dem Hauptformular ist es einfach, weil das Hauptformular ja alle seine Steuerelemente und Untersteuerelemente kennt: Me.MeinUnterformular.Visible = True
Das ändern eines Steuerelementes im Unterformular ist auch einfach.
Z.B. wird folgendermaßen das Steuerelement Nachname welches sich im Unterformular befindet deaktiviert: Me.MeinUnterformular.Form.Nachname.Enabled = False

Angenommen die Abhängigkeit der durchzuführenden Änderung befindet sich jedoch im Unterformular, dann muss aus dem Unterformular heraus auf das übergeordnete Formular zugegriffen werden.
Auch das ist mit Bordmittel direkt zu bewerkstelligen: Me.Parent.Name

Jetzt möchten wir jedoch das Unterformular-Steuerelement in welches das aktuelle Unterformular abgebildet wird ändern. Und genau dieses ist nicht bekannt.
Die folgende Funktion findet dies heraus:
Public Function ControlFromSubform(SubformOBJ As Access.Form) As Access.Subform
    Dim ctl As Access.Control
   
    On Error GoTo ErrHandler
    For Each ctl In SubformOBJ.Parent
        If ctl.ControlType = acSubform Then
            If ctl.SourceObject = SubformOBJ.Name Then
                If ctl.Form.Hwnd = SubformOBJ.Hwnd Then
                    Set ControlFromSubform = ctl
                    Exit For
                End If
            End If
        End If
    Next
ExitProc:
    Exit Function
ErrHandler:
    Resume ExitProc
End Function

Erläuterung: Die ForEach Schleife durchsucht alle Controls welche sich im Übergeordneten (Hauptformular) befinden und prüft ab, ob das Control ein Unterformular-Steuerelement ist und ob der Herkunftsobjektname dem Unterformularname entspricht.
An dieser Stelle könnten wir sagen: Treffer, wir haben es gefunden. Aber das gleiche Unterformular könnte ja mehrfach im selben Hauptformular eingebettet sein, daher müssen wir noch die WindowHandle-Nummer vergleichen. Wenn auch die stimmt, dann haben wir das richtige Unterformular-Steuerelement gefunden.
Beim Aufrufen der Funktion wird das Formular in die Variable SubformOBJ übergeben, dabei muss es sich um ein eingebettetes Formular handeln, sonst macht die Funktion keinen Sinn.
Wird ein Hauptformular übergeben, erzeugt das Objekt SubformOBJ.Parent einen Fehler, der Dank der Fehlerbehandlungsroutine sofort die Prozedur beendet und es wird Nothing als Rückgabewert geliefert (was ja völlig korrekt ist).

Anwendungsbeispiel:
Der Rahmen vom Unterformular-Steuerelement soll die Farbe Rot bekommen, wenn die Rechnung fällig ist, ansonsten die Farbe Blau. Die Information ob die Rechnung fällig ist steht im Steuerelement Rechnungfällig welches nur im Unterformular sich befindet.

Hier der Code dazu, der sich im Unterformular befindet:

    Dim cSubForm As Access.SubForm
Private Sub Form_Load()
    Set cSubForm = ControlFromSubform(Me)
End Sub


Private Sub Form_Current()
    If Not cSubForm Is Nothing Then
        If Me.Rechnungfällig = True Then
            cSubForm.BorderColor = RGB(255, 0, 0) ' Rot
        Else
            cSubForm.BorderColor = RGB(0, 0, 255) 'Blau
        End If
    End If
End Sub


Hier noch ein weitere Beispiel wo diese Funktion ihre Anwendung findet.

Fazit:
Der Programmcode von Formularen sollte möglichst autark programmiert werden (also für sich funktionieren, unabhängig von anderen Objekten). Dazu müssen ggf. 'intelligente' globale Prozeduren geschrieben werden, die sich jedoch mittelfristig auszahlen :-)

Keine Kommentare:

Kommentar veröffentlichen