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