vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Verschiedenes / Sonstiges   |   VB-Versionen: VB.NET07.04.05
Forms-Collection nachgebaut (VB.NET)

Viele VB6-Umsteiger vermissen in VB.NET schmerzlich die Forms-Auflistung, mit der sich schnell alle aktuell geladenenen Formen ermitteln lassen. Wir schaffen Abhilfe :-)

Autor:   DaveSBewertung:  Views:  19.432 
ohne HomepageSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein Beispielprojekt 

Gerade VB6-Umsteiger vermissen in VB.NET schmerzlich die allseits beliebte Forms-Auflistung von VB, mit der sich schnell alle aktuell geladenen Formen ermitteln lassen. Auf diese Weise lässt sich bspw. prüfen, ob ein bestimmtes Fenster bereits geladen ist.

Um die Forms-Auflistung auch in VB.NET wieder verfügbar zu machen, bauen wir uns einfach ein kleines Klassenmodul. Jedesmal, wenn eine neue Instanz einer Form geladen und angezeigt werden soll, rufen wir die Show-Methode der Klasse auf, wobei die Klasse durch Überladen der Prozedur folgende 3 Varianten zur Auswahl anbietet:

  1. Show (frm As Form)
  2. Show (frm As Form, AllowMulti As Boolean)
  3. Show (frm As Form, AllowMulti As Boolean, owner As Form)

1. Show (frm As Form)
Durch Aufruf der 1. Variante prüft die Klasse, ob die übergebene Form bereits geladen ist. Falls ja, wird die Form nicht neu geladen!

2. Show (frm As Form, AllowMulti As Boolean)
Durch Angabe von "AllowMulti = True" teilen wir der Klasse mit, dass eine Form mehrfach geladen und angezeigt werden darf.

3. Show (frm As Form, AllowMulti As Boolean, owner As Form)
Über den "owner"-Parameter lässt sich zusätzlich noch das "Eltern"-Fenster angeben.

Sobald eine Form durch den Anwender geschlossen wird, sollte diese natürlich auch im Klassenmodul entsprechend wieder aus dem ArrayList entfernt werden. Hierzu leiten wir das "Closed"-Ereignis einfach um (siehe AddHandler-Aufruf), so dass beim Schließen autom. das Closed-Ereignis des Klassenmoduls ausgelöst wird.

Sollen alle geladenen Form-Instanzen auf einmal geschlossen werden, brauchen wir lediglich die "CloseAll"-Prozedur der Klasse aufrufen.

Weiterhin lässt sich über die Eigenschaft IsFormLoaded prüfen, ob eine bestimmte Form bereits geladen ist.

So... und hier der Code unsere VB.NET "MyForms"-Klasse:

Public Class MyForms
  Private Shared formsCollection As New ArrayList
 
  ' Prüfen, ob Form bereits geladen
  Public Shared ReadOnly Property IsFormLoaded(ByVal name As String) As Boolean
    Get
      For Each f As Form In formsCollection
        If f.Name Is name Then
          Return True
        End If
      Next
      Return False
    End Get
  End Property
 
  ' Form anzeigen (keine Mehrfach-Instanz zulassen!)
  Public Shared Sub Show(ByVal frm As Form)
    Show(frm, False, Nothing)
  End Sub
 
  ' Form anzeigen (Mehrfach-Instanz zulassen!)
  Public Shared Sub Show(ByVal frm As Form, ByVal allowMulti As Boolean)
    Show(frm, allowMulti, Nothing)
  End Sub
 
  ' Form anzeigen und Eltern-Fenster mitangeben
  Public Shared Sub Show(ByVal frm As Form, ByVal allowMulti As Boolean, ByVal owner As Form)
    Dim found As Boolean = False
 
    For Each f As Form In formsCollection
      If frm Is f Then
        found = True
        Exit For
      Else
        If Not allowMulti AndAlso frm.Name = f.Name Then
          frm.Dispose()
          Exit Sub
        End If
     End If
   Next
 
   If Not found Then
     formsCollection.Add(frm)
     AddHandler frm.Closed, AddressOf Closed
     If Not owner Is Nothing Then
       owner.AddOwnedForm(frm)
     End If
   End If
 
   frm.Show()
  End Sub
 
  ' Form aus dem ArrayList entfernen, 
  ' da diese geschlossen wurde
  Private Shared Sub Closed(ByVal sender As Object, ByVal e As System.EventArgs)
    formsCollection.Remove(sender)
  End Sub
 
  ' alle Formen schließen
  Public Shared Sub CloseAll()
    Dim tal As ArrayList = formsCollection.Clone
    For Each f As Form In tal
      f.Close()
    Next
  End Sub
End Class

Beispiel für den Aufruf:

' neue Instanz einer Form laden und anzeigen
' (merhfaches Laden und Anzeigen erlaubt!)
Dim oForm As New Form2
MyForms.Show(oForm, True)
' Prüfen, ob bestimmte Form bereits geladen
' Falls nicht, jetzt laden und anzeigen
If Not MyForms.IsFormLoaded("Form2") Then
  Dim oForm As New Form2
  MyForms.Show(oForm)
End If
' alle geladenen Formen schließen
MyForms.CloseAll()



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.