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