|
Modale MDI-Kind-Forms werden von Visual Basic nicht zugelassen. Wenn Sie verhindern möchten, dass ein anderes MDI-Kind-Form aktiviert wird, während ein bestimmtes MDI-Kind-Form geöffnet und aktiv ist, müssen Sie die Sperre der übrigen MDI-Kind-Forms selbst vornehmen. Auch die Sperre der übrigen Funktionen der Anwendungen, etwa Menüs des MDI-Haupt-Forms oder weitere Forms der Anwendung (beispielsweise ToolBoxen und dergleichen) bleibt Ihnen selbst überlassen.
Der einfachste Weg ist, das MDI-Haupt-Form mit einer eigenen Methode (ChildModal, siehe unten) zu versehen, die von den modal anzuzeigenden MDI-Kind-Forms jeweils beim Laden und Entladen aufgerufen wird. Beim Laden werden alle übrigen MDI-Kind-Forms gesperrt, also deren Enabled-Eigenschaft auf False gesetzt. Beim Entladen werden sie wieder freigegeben.
Soll sich die Modalität nicht nur auf die übrigen MDI-Kind-Forms beschränken, werden auch alle weiteren Forms gesperrt bzw. wieder freigegeben.
Ausgenommen bleibt in jedem Fall das MDI-Haupt-Form. Denn würde dieses gesperrt, würde automatisch auch das modal anzuzeigende MDI-Kind-Form mit gesperrt - nichts ginge mehr. Statt dessen sorgen Sie mit einer privaten Sperr-Variable im MDI-Haupt-Form gezielt für eine Sperre von Funktionen, die während der Anzeige des modalen MDI-Kind-Forms nicht ausgeführt werden sollen bzw. dürfen.
Beim Aufruf der Methode ChildModal im MDI-Haupt-Form übergibt das aufrufende MDI-Kind-Form im ersten Parameter eine Referenz auf sich selbst, damit es beim Durchlaufen der vorhandenen, geladenen Forms ausgenommen werden kann. Schließlich soll es selbst ja nicht gesperrt werden.
Im zweiten Parameter Modal wird angegeben, ob die Modalität gesetzt oder aufgehoben wird. Da dieser Parameter optional und auf True voreingestellt ist, können Sie ihn beim Setzen der Modalität der Einfachheit halber auch weglassen.
Im weiteren optionalen Parameter NotifyMDIMain legen Sie fest, ob die Ausführung von Funktionen des MDI-Haupt-Forms durch Setzen der Sperr-Variablen mChildModal unterbunden werden soll.
Im letzten, ebenfalls optionalen Parameter AppModal legen Sie fest, ob die Modalität für die ganze Anwendung gelten soll.
Private mChildModal As Boolean
Public Sub ChildModal(Child As Form, _
Optional ByVal Modal As Boolean = True, _
Optional ByVal NotifyMDIMain As Boolean = True, _
Optional ByVal AppModal As Boolean = False)
Dim nForm As Form
If AppModal Then
mChildModal = Modal
For Each nForm In Forms
If Not (nForm Is Me) Then
If Not (nForm Is Child) Then
nForm.Enabled = Not Modal
End If
End If
Next
Else
If NotifyMDIMain Then
mChildModal = Modal
End If
For Each nForm In Forms
If Not (nForm Is Me) Then
If nForm.MDIChild Then
If Not (nForm Is Child) Then
nForm.Enabled = Not Modal
End If
End If
End If
Next
End If
End Sub
Die Aufrufe für die einfache Modalität in Bezug auf die übrigen MDI-Kind-Forms sehen in einem MDI-Kind-Form beispielsweise so aus, wenn auch zugleich die Funktionen des MDI-Haupt-Forms gesperrt werden sollen:
Private Sub Form_Load()
mdiMain.ChildModal Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
mdiMain.ChildModal Me, False
End Sub
Die Aufrufe für eine Modalität in Bezug auf die gesamte Anwendung sehen wie folgend aus:
Private Sub Form_Load()
mdiMain.ChildModal Me, , , True
End Sub
Private Sub Form_Unload(Cancel As Integer)
mdiMain.ChildModal Me, False, , True
End Sub
Wenn beispielsweise während der Anzeige eines modalen MDI-Kind-Forms keine weiteren MDI-Kind-Forms angelegt werden dürfen, könnte das Click-Ereignis eines entsprechenden Menü-Punktes so aussehen:
Private Sub mnuChild_Click()
Dim nForm As frmChild
If mChildModal Then
Beep
Exit Sub
End If
Set nForm = New frmChild
nForm.Show
End Sub
Und das Entladen des MDI-Haupt-Forms (und damit meist Beenden der gesamten Anwendung) während der Anzeige eines modalen MDI-Kind-Forms können Sie zum Beispiel durch folgenden Code verhindern:
Private Sub MDIForm_QueryUnload(Cancel As Integer, _
UnloadMode As Integer)
Select Case UnloadMode
Case vbFormCode, vbFormControlMenu
Beep
Cancel = mChildModal
End Select
End Sub
|