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 02.01.2001

Diese Seite wurde zuletzt aktualisiert am 02.01.2001
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...

Modalitäts-Bewusstsein

Zurück...


Anzeige

(-hg) mailto:hg_showformmodal@aboutvb.de

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

Beispiel-Projekt ShowFormModal (showformmodal.zip - ca. 3,6 KB)

Modul modIsFormModal (modIsFormModal.bas - ca. 1 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
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