Wussten Sie, dass DoEvents tatsächlich keine Anweisung ist, sondern eine Funktion? Sie gibt die Anzahl der gerade sichtbaren Forms einer Anwendung zurück. Die Betonung liegt hier auf "sichtbar", im Gegensatz zu Anzahl der geladenen Forms, die von Forms.Count geliefert wird.
Eine eingängige Hilfsfunktion (damit Sie sich nicht an die DoEvents-Funktion für diesen Fall zu erinnern brauchen), die die Anzahl der sichtbaren Forms zurückgibt, könnte also lauten:
Public Function VisibleFormsCount() As Integer
VisibleFormsCount = DoEvents
End Function
Allerdings ist die Verwendung von DoEvents mit Vorsicht zu genießen - der ursprüngliche Zweck von DoEvents wird dabei trotzdem ausgeführt, nämlich die zwischenzeitliche Ausführung anderer anstehender Ereignisse oder von anderem Code zu ermöglichen. Wenn Sie diese Funktion unbedacht aufrufen, kann das somit unvorhersehbare und unerwünschte Seiteneffekte haben.
Besser ist also doch noch der "klassische" Weg. Sie prüfen bei jedem einzelnen geladenen und damit in der Forms-Collection enthaltenen Form, ob es sichtbar ist, und zählen einfach mit:
Public Function VisibleFormsCountSafe() As Integer
Dim nForm As Form
Dim nCount As Integer
For Each nForm In Forms
If nForm.Visible Then
nCount = nCount + 1
End If
Next
VisibleFormsCountSafe = nCount
End Function
Wenn Sie sich nicht mit der bloßen Anzahl zufrieden geben wollen, sondern gleich eine Collection der sichtbaren Forms zur Verfügung haben wollen, sammeln Sie diese gleich in einer Collection, statt nur zu zählen:
Public Function VisibleForms() As Collection
Dim nForm As Form
Dim nVisibleForms As Collection
Set nVisibleForms = New Collection
With nVisibleForms
For Each nForm In Forms
If nForm.Visible Then
.Add nForm
End If
Next
End With
Set VisibleForms = nVisibleForms
End Function
Da wir nun schon einmal beim Zählen und Sammeln sind, lassen wir noch ein paar weitere nützliche Funktionen dieser Gattung folgen. So etwa das Zählen oder Sammeln von geladenen Instanzen ein und derselben Form-Klasse. Sie können entweder eine gerade greifbare Instanz eines Forms als Parameter übergeben, oder den Namen, der für alle Instanzen in der Forms-Collection gleich lautet. Damit die Groß-/Kleinschreibung keine Probleme bereitet, oder damit Sie auch mittels eines Suchmusters Forms mit verwandten Namen ausfindig machen können, wird der Namensvergleich über den Operator Like durchgeführt. Um damit einen von Schreibweise unabhängigen Vergleich vorzunehmen, muss in dem Modul die Direktive "Option Compare Text" gesetzt sein.
Option Compare Text
Public Function FormInstancesCount(Form As Variant) _
As Integer
Dim nFormName As String
Dim nForm As Form
Dim nCount As Integer
If IsObject(Form) Then
If TypeOf Form Is Form Then
nFormName = Form.Name
End If
ElseIf VarType(Form) = vbString Then
nFormName = Form
End If
If Len(nFormName) Then
For Each nForm In Forms
If nForm.Name Like nFormName Then
nCount = nCount + 1
End If
Next
End If
FormInstancesCount = nCount
End Function
Public Function FormInstances(Form As Variant) _
As Collection
Dim nFormName As String
Dim nForm As Form
Dim nFormInstances As Collection
Set nFormInstances = New Collection
If IsObject(Form) Then
If TypeOf Form Is Form Then
nFormName = Form.Name
End If
ElseIf VarType(Form) = vbString Then
nFormName = Form
End If
If Len(nFormName) Then
With nFormInstances
For Each nForm In Forms
If nForm.Name Like nFormName Then
.Add nForm
End If
Next
End With
End If
Set FormInstances = nFormInstances
End Function
Nun folgen noch ein paar ähnliche Funktionen zum Umgang mit MDI-Child-Forms. Um diese aus der Forms-Collection herauszufiltern, ist eine doppelte Prüfung notwendig. Zum einen wird geprüft, ob bei einem Form die MDIChild-Eigenschaft auf True gesetzt ist. Da aber auch das MDI-Hauptform in der Forms-Collection enthalten ist, muss zuvor der Typ des gerade zu prüfenden Forms untersucht werden. Denn der Versuch, beim MDI-Form eine MDIChild-Eigenschaft abzufragen, würde in einem Laufzeitfehler enden.
Public Function MDIChildFormsCount() As Integer
Dim nForm As Form
Dim nCount As Integer
For Each nForm In Forms
If Not TypeOf nForm Is MDIForm Then
If nForm.MDIChild Then
nCount = nCount + 1
End If
End If
Next
MDIChildFormsCount = nCount
End Function
Public Function MDIChildForms() As Collection
Dim nForm As Form
Dim nMDIChildForms As Collection
Set nMDIChildForms = New Collection
With nMDIChildForms
For Each nForm In Forms
If Not TypeOf nForm Is MDIForm Then
If nForm.MDIChild Then
.Add nForm
End If
End If
Next
End With
Set MDIChildForms = nMDIChildForms
End Function
Public Function MDIChildFormInstancesCount _
(Form As Variant) As Integer
Dim nFormName As String
Dim nForm As Form
Dim nCount As Integer
If IsObject(Form) Then
If TypeOf Form Is Form Then
nFormName = Form.Name
End If
ElseIf VarType(Form) = vbString Then
nFormName = Form
End If
If Len(nFormName) Then
For Each nForm In Forms
If Not TypeOf nForm Is MDIForm Then
If nForm.MDIChild Then
If nForm.Name Like nFormName Then
nCount = nCount + 1
End If
End If
End If
Next
End If
Set MDIChildFormInstancesCount = nCount
End Function
Public Function MDIChildFormInstances(Form As Variant) _
As Collection
Dim nFormName As String
Dim nForm As Form
Dim nMDIChildFormInstances As Collection
Set nMDIChildFormInstances = New Collection
If IsObject(Form) Then
If TypeOf Form Is Form Then
nFormName = Form.Name
End If
ElseIf VarType(Form) = vbString Then
nFormName = Form
End If
If Len(nFormName) Then
With nMDIChildFormInstances
For Each nForm In Forms
If Not TypeOf nForm Is MDIForm Then
If nForm.MDIChild Then
If nForm.Name Like FormName Then
.Add nForm
End If
End If
End If
Next
End With
End If
Set MDIChildFormInstances = nMDIChildFormInstances
End Function
|