Es ist durchaus denkbar, dass es sinnvoll ist, ein Form nicht gleich zu entladen, nachdem es vom Anwender geschlossen worden ist. Etwa, wenn Sie nach dem Schließen eines modal geöffneten Forms noch Werte aus Eigenschaften der Steuerelemente darauf oder aus Eigenschaften des Forms selbst auslesen möchten.
Ein solcher Zugriff nach dem Entladen würde nämlich nicht mehr die vorher vorhandenen Werte liefern, da das Form ja schon entladen war und damit auch dessen Steuerelemente und ihre Werte nicht mehr zur Verfügung stehen. Vielmehr würde das Form samt allen Steuerelementen komplett neu geladen - was in diesem Fall sicher nicht beabsichtigt wäre.
Das Ereignis QueryUnload eines Forms bietet genau die gesuchte Möglichkeit, unter bestimmten Bedingungen den bereits eingeleiteten Entladevorgang abzubrechen. Die "Ursache" für das Entladen wird im Parameter UnloadMode angeliefert. Der Wert im Falle des Schließens über die Schließen-Schaltfläche des Forms oder über den Schließen-Punkt in seinem Systemmenü ist vbFormControlMenu. In diesem Fall setzen Sie den Wert des ebenfalls übergebenen Parameters Cancel auf True und signalisieren damit den Wunsch nach einem Abbruch des Entladens. Stattdessen verbergen Sie das Form manuell mit einem Me.Hide:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Select Case UnloadMode
Case vbFormControlMenu
Cancel = True
Me.Hide
End Select
End Sub
Da der Aufruf zum modalen Anzeigen eines Forms nicht nur beim Entladen, sondern auch schon beim Verbergen des Forms zurückkehrt (es geht weiter mit der Ausführung des nachfolgenden Codes), können Sie nun an dieser Stelle die oben beschriebenen Zugriffe vornehmen und dann das Form per Code endgültig entladen. Da in diesem Fall der im QueryUnload-Ereignis im Parameter UnloadMode übergebene Wert ein anderer ist, nämlich vbFormCode, wird die "Entladehemmung" nicht wirksam - das Form wird nun tatsächlich entladen.
' ...
Form2.Show vbModal
' und nun zum Beispiel:
Debug.Print Form2.Text1.Text
Unload Form2
Eine weitere praktische Anwendung sehen Sie im Artikel "Dialog-Aufruf mit Methode".
|