Translate

Freitag, 6. Februar 2015

ACCESS: (Haupt-) Formular aus einem Steuerelement (Control) ermitteln

Heute möchte ich aufzeigen, wie es möglich ist aus einer Objektvariable die ein Steuerelement (Control) speichert, das Formular herauszufinden in welches sich das Steuerelement befindet.

Auch hier scheint die Aufgabe recht trivial, in dem einfach das Objekt Parent verwendet wird. Eine allgemeine Prozedur könnte so sehen:

Public Function ParentformOfControl(ctl As Access.Control) As Access.Form
    Set ParentformOfControl = ctl.Parent
End Function

So einfach ist es leider dann doch nicht, da allgemeine Prozeduren mit allen Eventualitäten umgehen können sollten. Und dies ist mit der oben aufgezeigten Lösung nicht der Fall.
Angenommen, unser Steuerlelement befindet sich in einer RegisterSeite von einem Registersteuerelement, dann zeigt CTL.Parent nicht auf das Formular, sondern auf das Registersteuerelement. In diesem Fall würden wir CTL.Parent.Parent benötigen.
In einem anderen Fall brauchen wir ggf. sogar CTL.Parent.Parent.Parent

Daher setzen wir einfach eine Schleife ein, die bis zum Form-Objekt dreht:

Public Function ParentformOfControl(ctl As Access.Control) As Access.Form
    Dim c As Object
   
    Set c = ctl
    Do
       Set c = c.Parent
    Loop Until Left(TypeName(c), 5) = "Form_"
    Set ParentformOfControl = c
End Function

Und wenn wir schon dabei sind, können wir unsere kleine Routine gleich so erweitern, dass diese auch in der Lage ist das Hauptformular zu ermitteln (optional):

Public Function ParentformOfControl(ctl As Access.Control _
                                   , Optional MainForm As Boolean) As Access.Form
    Dim c As Object
   
    On Error Resume Next
    Set c = ctl
    Do
       Set c = c.Parent
       If Not Err.Number = 0 Then Exit Do
    Loop Until Left(TypeName(c), 5) = "Form_" And MainForm = False
    Set ParentformOfControl = c
End Function

Hinweis: Da es nicht feststellbar ist, ob es noch ein weiteres übergeordnetes Objekt existiert, können wir dies nur mit der Fehlerabfangmethode lösen. Nicht elegant, aber es funktioniert ;-)
Andere Fehler haben wir nicht zu erwarten das hier eine Fehlerbehandlung benötigt wird. Schlimmsten Fall liefert unsere Funktion ParentformOfControl den Wert Nothing zurück, was wiederum in der aufrufenden Prozedur behandelt werden kann.

Fazit:
Einfach scheinende Aufgaben, sind in der Praxis dann oft doch nicht so trivial.
Wirklich komplex ist es jedoch auch nicht und es lohnt sich!
Beim Programmieren von allgemein gültigen Funktionen, ist darauf zu achten, dass diese anschließend alle zu erwartenden Fälle behandeln können.

Keine Kommentare:

Kommentar veröffentlichen