|
Ein Form modal anzuzeigen ist einfach, aber woher weiß dieses Form dann, dass es sich in modalem Zustand befindet? Naheliegend wäre ein Test, bei dem lediglich versucht wird, das Form erneut anzuzeigen. Ist das Form bereits modal angezeigt, wird ein Laufzeitfehler ausgelöst, den Sie abfangen und somit auswerten können:
On Error Resume Next
ModalForm.Show
If Err.Number = 401 Then
Debug.Print "Modal"
Else
Debug.Print "Nicht modal"
End If
Bei einem tatsächlich modal angezeigten Form funktioniert das problemlos. Ein nicht modal angezeigtes Form wird damit jedoch in den Vordergrund geholt und aktiviert - was nicht unbedingt beabsichtigt und sinnvoll sein könnte.
Eine bessere Lösung ist die Verwaltung einer Form-eigenen Variablen, die beim modalen Anzeigen des Forms auf True gesetzt wird, und beim Verbergen oder Entladen des Forms wieder auf False zurückgesetzt wird. Da Sie allerdings keine weitere Kontrolle über den Aufruf der Show-Methode eines Forms haben, benötigen Sie eine eigene Variante der Show-Methode, etwa ShowForm genannt, die genau so wie Show aufgerufen wird. Dort können Sie nun den Modal-Wert einer privaten Variablen des Forms zuweisen und jederzeit prüfen. Legen Sie diese Variable zusätzlich noch als Eigenschaft Modal offen, können Sie den Modalitätszustand des Forms auch jederzeit von außerhalb des Forms prüfen.
Das Zurücksetzen der Variablen muss sowohl im Form_Unload-Ereignis als auch im Form_Deactivate-Ereignis erfolgen. Ersteres wird ausgelöst, wenn das Form entladen wird, etwa über die Schließen-Schaltfläche in der Titelleiste. Das Form_Deactivate-Ereignis wird hierbei allerdings nicht ausgelöst. Dieses Ereignis wird jedoch ausgelöst, wenn das Form nur verborgen, aber nicht entladen wird. Bei einem modal angezeigten Form wird die Modalität bereits mit dem Verbergen aufgehoben. Und da ein modal angezeigtes Form seinen Aktivitätszustand neben dem Entladen nur beim Verbergen und damit Aufheben der Modalität verlieren kann, ist die Auslösung dieses Ereignisses eindeutig.
Private pModal As FormShowConstants
Public Property Get Modal() As FormShowConstants
Modal = pModal
End Property
Public Sub ShowForm(Optional Modal As FormShowConstants, _
Optional Owner As Form)
pModal = Modal
Me.Show Modal, Owner
End Sub
Private Sub Form_Deactivate()
pModal = vbModeless
End Sub
Private Sub Form_Unload(Cancel As Integer)
pModal = vbModeless
End Sub
Eine weitere Möglichkeit ist, einfach zu prüfen, ob es außer dem aktiven Form kein weiteres Form gibt, dessen Enabled-Eigenschaft True ist. Denn dann ist das aktive Form zwangsläufig modal. Dabei spielt es keine Rolle, ob bei den übrigen Forms die Enabled-Eigenschaft manuell, oder aus welchem anderen Grund auch immer, auf False gesetzt worden ist. Windows selbst kennt da auch keinen Unterschied.
Public Function IsFormModal(Form As Form) As Boolean
Dim nTestForm As Form
If Forms.Count = 1 Then
Exit Function
End If
For Each nTestForm In Forms
If Not (nTestForm Is Form) Then
If nTestForm.Enabled Then
Exit Function
End If
End If
Next
IsFormModal = True
End Function
Die Einschränkung, dass ein Form nur dann als modal betrachtet wird, wenn mehr als ein Form geladen ist, entspricht den Visual Basic-Gegebenheiten. Sie können das erste und einzige Form modal laden (Form1.Show vbModal) - es wird dennoch nicht modal. Denn während der Versuch, ein weiteres Form zu laden (modal oder nicht), wenn bereits ein Form tatsächlich geladen ist, mit einer Fehlermeldung quittiert wird, können Sie nach dem ersten und einzigen ersten Form problemlos ein weiteres Form (modal oder nicht) laden.
Auf gleiche Weise können Sie auch herausfinden, ob überhaupt irgend ein Form modal geladen ist, und welches dieses ist. Hierbei gilt allerdings auch die Annahme, dass bei mehreren geladenen Forms das einzige nicht gesperrte Form schlicht modal ist, während beim Antreffen mehrerer nicht gesperrter Forms keines modal ist. Logischerweise wird kein modales Form gefunden, falls sämtliche Forms gesperrt sein sollten.
Public Function GetModalForm() As Form
Dim nEnabledForm As Form
Dim nTestForm As Form
If Forms.Count = 1 Then
Exit Function
End If
For Each nTestForm In Forms
If nTestForm.Enabled Then
If nEnabledForm Is Nothing Then
Set nEnabledForm = nTestForm
Else
Exit Function
End If
End If
Next
Set GetModalForm = nEnabledForm
End Function
|