14.3 Zugriff auf die Subfenster 

14.3.1 Alle Subfenster 

Sehen Sie sich noch einmal die Anweisung an, mit der neue Subfenster erstellt und angezeigt werden:
Dim frm As New Subfenster(Me)
frm.Show()
Wird das erste Subfenster erzeugt, kann dieses mit frm angesprochen werden. Mit dem Erzeugen des zweiten Subfensters wird die Objektvariable frm »umgebogen« und zeigt auf die Startadresse des zweiten Subfensters. Das erste wird zwar nicht mehr unter frm referenziert, ist aber weiterhin im Hauptfenster zu sehen, weil das Objekt nicht zerstört worden ist. Wie können Sie auf die einzelnen Subfenster zugreifen?
Damit das Hauptfenster die Subfenster anzeigen kann, verwaltet es die Referenzen aller geöffneten Subfenster in einem Array, auf das Sie über die Eigenschaft MdiChildren des MDI-Hauptfensters zugreifen können.
Public ReadOnly Property MdiChildren As Form() |
Die Eigenschaft bietet sich dann an, wenn für alle Subfenster dieselben Operationen ausgeführt werden müssen – beispielsweise, um die darin enthaltenen Daten vor dem Schließen der Anwendung zu speichern.
Das Schließen von Subfenstern hinterlässt keine Lücken oder Nullreferenzen, sodass ein Durchlauf durch das ganze Array exakt alle gerade geöffneten Fenster erfasst.
For Each kind As Form in Me.MdiChildren
' Anweisungen
Next
Die Überprüfung auf Nothing ist nicht notwendig.
14.3.2 Aktive Subfenster 

In der Menüleiste eines MDI-Hauptfensters findet man normalerweise immer die Menüpunkte Speichern und Speichern unter..., um die Eingaben im aktiven Subfenster zu sichern. Die Eigenschaft ActiveMdiChild des MDI-Hauptfensters speichert die Referenz auf das selektierte MDI-Subfenster. Nehmen wir an, dass das Subfenster eine Textbox enthält; mittels MultiLine=True sowie Dock=DockStyle.Fill füllt sie den gesamten Clientbereich. Mit
Dim frm As Subfenster = CType(Me.ActiveMdiChild, Subfenster)
besorgen Sie sich die Referenz auf das aktive Subfenster. Die Typumwandlung mit CType sollte eigentlich zwingend sein, da ActiveMdiChild vom Typ Form und nicht vom Typ Subfenster ist.
Hinweis |
Der Zugriffsmodifizierer der Steuerelemente des Subfensters, auf die vom Hauptfenster aus zugegriffen wird, muss Friend oder Public sein. Im Eigenschaftsfenster können Sie die Zugriffsmodifizierer auch mit der Eigenschaft Modifiers passend einstellen. |
Je nach Art des Zugriffs auf ActiveMdiChild kann es erforderlich sein zu prüfen, ob überhaupt ein Subfenster geöffnet ist. Wenn aktuell kein MDI-Subfenster geöffnet ist, hat die Eigenschaft ActiveMdiChild den Wert Nothing. Das sollten Sie unbedingt prüfen.
If Me.ActiveMdiChild IsNot Nothing Then
Dim frm As SubForm = CType(Me.ActiveMdiChild, SubForm)
frm.textBox1.Text = "......."
End If
14.3.3 Subfenster eines bestimmten Typs 

MDI-Anwendungen haben meistens nur einen Subfenstertyp, aber das ist nicht zwingend. Daher müssen Sie davon ausgehen, dass zur Laufzeit mehrere Typen innerhalb des Hauptfensters geöffnet sein können und dass das von MdiChildren zurückgelieferte Array mehrere Typen enthalten kann. Soll gezielt auf das Steuerelement eines untergeordneten Fensters zugegriffen werden, muss daher zuerst der Typ mit dem Is-Operator überprüft werden.
For Each kind As Form in Me.MdiChildren
If TypeOf kind Is Subfenster Then
CType(kind,Subfenster).textBox1.Text = "......."
Else If TypeOf kind Is Subfenster2 Then
' Anweisungen
End If
Next
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.