ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 10.01.2000

Diese Seite wurde zuletzt aktualisiert am 10.01.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Zurück...


Anzeige

(-hg) mailto:hg_mdinotify@aboutvb.de

Von Haus aus bietet Visual Basic so gut wie keine direkte Verbindung und Kommunikation eines MDI-Forms mit seinen MDI-Child-Forms. Zwar können Sie innerhalb einer Anwendung jederzeit aus der MSDN Library - VB Form, FormsForms-Sammlung das MDI-Form und die MDI-Child-Forms herausfischen und einen Menüpunkt im MDI-Form über das Setzen der Eigenschaft MSDN Library - VB WindowListWindowList dazu bringen, eine Liste der geöffneten Child-Forms aufzunehmen. Aber das ist dann eigentlich schon alles.


MDI-Child-Forms melden sich beim MDI-Form ausdrücklich an und ab

Das Grundprinzip einer Verbindungsstruktur ist recht einfach. Jedes Child-Form meldet sich in seinem Form_Load-Ereignis beim MDI-Form über dort eingefügte, zusätzliche öffentliche Methoden an (OnChildOpen) und in seinem Form-Unload-Ereignis wieder ab (OnChildClose).

Private Sub Form_Load()
  MDIForm.OnChildOpen Me
End Sub

Private Sub Form_Unload(Cancel As Integer)
  MDIForm.OnChildClose Me
End Sub

Allerdings muss das Child-Form dazu das MDI-Form kennen. Sie können natürlich den Namen des MDI-Forms verwenden, den Sie diesem in Ihrer Anwendung individuell gegeben haben. Wenn Sie Ihre Child-Forms jedoch projektübergeifend wiederverwenden wollen, ist ein universellerer Zugriff sinnvoller. Entweder deklarieren Sie dazu in einem Standard-Modul eine öffentliche (und damit global verfügbare) Variable wie etwa MDIForm, die vom MDI-Form in seinem Form_Load-Ereignis gesetzt wird (Set MDI-Form = Me). Oder Sie schreiben in ein Standard-Modul eine öffentliche Funktion des (beispielsweise gleichfalls MDIForm genannt), in der das MDI-Form aus der allgemeinen Forms-Sammlung herausgesucht wird. Da ein MDI-Form in einer Anwendung sowieso nur ein einziges Mal vorhanden sein kann und auch meistens als eines der ersten Forms geladen wird, steht es nahe am Anfang der Sammlung und wird daher ohne spürbaren Performance-Verlust sofort gefunden.

Public Function MDIForm() As Form
  Dim nForm As Form
  
  For Each nForm In Forms
    If TypeOf nForm Is MDIForm Then
      Set MDIForm = nForm
      Exit Function
    End If
  Next 'nForm
End Function

Das MDI-Form hält die sich anmeldenden Child-Forms in einer eigenen Sammlung (Collection pChildForms) fest, gibt diesem Child-Form eine eindeutige Identitätsnummer, die dort in der öffentlichen Variablen namens ID gespeichert wird, und entfernt es beim Abmelden wieder aus dieser Collection. Die ID wird automatisch immer weiter hochgezählt und dürfte als Datentyp Long für die gesamte Laufzeit einer Anwendung ausreichend dimensioniert sein.

Im Child-Form:

Public ID As Long

Im MDI-Form:

Private mChildFormsIDs As Long

Private pChildForms As Collection

Private Sub MDIForm_Load()
  Set pChildForms = New Collection
End Sub

Public Sub OnChildClose(ChildForm As Form)
  pChildForms.Remove CStr(ChildForm.ID)
End Sub

Public Sub OnChildOpen(ChildForm As Form)
  mChildFormsIDs = mChildFormsIDs + 1
  pChildForms.Add ChildForm, CStr(mChildFormsIDs)
  ChildForm.ID = mChildFormsIDs
End Sub

Die geöffneten und damit angemeldeten Child-Forms können über eine Eigenschaft ChildForms (im MDI-Form) und der ID als Schlüssel jederzeit abgefragt werden:

Public Property Get ChildForm(ByVal ID As Long) As Form
  On Error Resume Next
  Set ChildForm = pChildForms(CStr(ID))
End Property

Diesen Benachrichtigungsmechanismus können sie beliebig erweitern. Versehen Sie das MDI-Form einfach mit weiteren öffentlichen OnChild...-Methoden, die dann von den Child-Forms entsprechend aufgerufen werden. Aus dem Form_Activate-Ereignis eines Child-Forms könnten Sie beispielsweise OnChildActivate aufrufen, um dem MDI-Form den Wechsel des gerade aktiven ChildForms mitzuteilen. Das MDI-Form weiß zwar über seine Eigenschaft ActiveForm immer, welches Child-Form gerade aktiv ist - eine Benachrichtigung über einen Wechsel bekommt es von Visual Basic jedoch nicht.

Public Sub OnChildActivate(ChildForm As Form)
  ' Zum Beispiel:
  lblActive.Caption = "ChildForm" & ChildForm.ID
End Sub

Enthält Ihre Anwendung neben dem MDI-Form und seinen Child-Forms noch weitere Forms, die ebenfalls geladen sind (etwa Werkzeugfenster und dergleichen), können Sie nun die pChildForms-Collection verwenden, um ausschließlich auf die Child-Forms zuzugreifen, anstelle diese jedes Mal aus der allgemeinen Forms-Sammlung herausfischen zu müssen. Beispiel:

Dim nChildForm As Form

For Each nChildForm In pChildForms
  ' ...
Next


Beispiel-Projekt MDINotifyTest (mdinotify.zip - ca. 3,3 KB)






Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer