Inhaltsverzeichnis

12.2.7 Form – Form in Form

Die Frage „Ist es möglich ein Formular in ein anderes Formular einzubetten (FormInForm), dessen Auswahl beliebig geändert werden kann?“ lässt sich generell mit JA beantworten, wobei die Detailantworten unterschiedlich ausfallen:

B1

In diesem Kapitel werden Ihnen Projekte vorgestellt, in denen die Antworten 2 und 3 praktisch umgesetzt werden. Die Entwicklung eigener Steuer-Elemente wird im → Kapitel 12.2.8 beschrieben. Es werden auch die dazu gehörenden Projekte vorgestellt.

12.2.7.1 Projekt 1

In allen vorgestellten Projekten, auch jenen im Kapitel 12.2.8, wird das folgende Vorgehen umgesetzt:

Um das Augenmerk auf das Einfügen eines Formulars in ein (Haupt-)Formular zu legen, fällt die Funktionalität des (Haupt-)Formulars spartanisch aus. Sie beschränkt sich auf das Sichtbarmachen der Hintergrund-Farbe des eingefügten Formulars über einen SwitchButton und einen Button, mit dem das (Haupt-)Formular geschlossen werden kann. Das eingefügte Formular zeigt entweder einen Text in einer TextArea oder ein Bild in einer PictureBox an. Die Umschaltung erfolgt mit dem Button 'Ansicht wechseln' auf dem eingefügten Formular. Ein eingefügtes Formular besitzt keine Titelzeile mit dem Fenster-Titel und den üblichen Schaltflächen, da es kein Top-Level-Fenster ist. Daher verfügt das eingefügte Formular über ein Menü, um hier zu zeigen, dass das eingefügte Formular sein eigener Event-Observer ist und Sie deshalb seine Ereignisse – wie zum Beispiel _Close() – im Quelltext der Klasse selbst managen können.

Abbildung 12.2.7.1.1: Haupt-Fenster mit eingefügtem Fenster in Aktion

Abbildung 12.2.7.1.2: Haupt-Fenster mit markiertem Fenster (links)

Abbildung 12.2.7.1.3: Haupt-Fenster mit umrandetem, aber leerem Container (Panel) Im Zusammenhang mit der Entwicklung von Projekten, bei denen Formulare in ein (Haupt-)Formular eingefügt werden, konnten diese Erfahrungen gesammelt werden:

Aus dem Quelltext der Klasse für das eingefügte Formular FEmbedded ist nur dieser Ausschnitt für den Konstruktor interessant:

Public Sub _new(iColor As Integer) 
  TextArea1.Background = iColor 
End ' _new(...)

So wird das Formular FEmbedded in das Formular FMain eingefügt:

Private hFEmbedded As FEmbedded
 
Public Sub Form_Open()  
  FMain.Center()
' Weitere Initialisierungen ...
  SwitchButton1.Value = False  
  hFEmbedded = New FEmbedded(&HE1EAF6, panEmbedder)  
End ' Form_Open()

Kommentar:

hFEmbedded = New FEmbedded(&HE1EAF6, panEmbedder) 

Zuerst wird das Argument für die Farbe notiert (obligatorischer Parameter) und dann erst das Argument für den Parent-Container (optionaler Parameter). Beachten Sie, dass Sie das Fenster FEmbedded nicht öffnen müssen! Es wird automatisch geöffnet, wenn es in den Container (Panel) auf dem (Haupt-)Formular FMain eingefügt wird.

12.2.7.2 Projekt 2

Im zweiten Projekt erfahren Sie, wie Sie zwei unterschiedliche Formulare in ein (Haupt-)Formular einfügen und sie auch wieder aus ihrem Container auf dem (Haupt-)Formular entfernen.

Abbildung 12.2.7.2.1: Drei Top-Level-Fenster

Abbildung 12.2.7.2.2: (Haupt-)Fenster mit eingefügtem Fenster 1

Abbildung 12.2.7.2.3: (Haupt-)Fenster mit eingefügtem Fenster 1 und 2

Abbildung 12.2.7.2.4: (Haupt-)Fenster mit den zwei entfernten Fenstern 1 und 2

Für einen Test in der Projekt-Erprobung können Sie sich die Anzahl der Top-Level-Fenster, deren Titel und Fensterhöhe sowie die Namen der Steuer-Elemente auf dem (Haupt-)Formular anzeigen lassen:

FMain
Anzahl der geöffneten Fenster = 3

1. Fenster: Caption      = MAIN FORM
1. Fenster: Fenster-Höhe = 301
------------------------------------------
2. Fenster: Caption      = FORM 1
2. Fenster: Fenster-Höhe = 126
------------------------------------------
3. Fenster: Caption      = Form 2
3. Fenster: Fenster-Höhe = 126
------------------------------------------
panContainer
HBox1

Das Einfügen der beiden Fenster im Projekt 2 erfolgt jeweils durch eine der beiden Prozeduren im Event-Handler Form_Open() von FMain:

Public Sub Form_Open()
' Wenn dieses Fenster geschlossen wird, werden alle Projekt-Fenster automatisch beendet
  Application.MainWindow = FMain
  ...
' Form1 und Form2 in FMain einfügen - Button-Texte setzen
  btnEMUNForm1_Click()
  btnEMUNForm2_Click()
End
 
Public Sub btnEMUNForm1_Click()
  If btnEMUNForm1.Value Then
     Form1.Reparent(panContainer, 0, 0) ' Einfügen
     btnEMUNForm1.Text = ("Unembed F1")
  Else
     Form1.Reparent(Null) ' Entfernen
     btnEMUNForm1.Text = ("Embed F1")
  Endif
End
 
Public Sub btnEMUNForm2_Click()  
  If btnEMUNForm2.Value Then
     Form2.Reparent(panContainer, 0, 0) ' Einfügen
     btnEMUNForm2.Text = ("Unembed F2")
  Else
     Form2.Reparent(Null) ' Entfernen
     btnEMUNForm2.Text = ("Embed F2")
  Endif 
End

Download