11.7 Ereignisse einer Form
Die meisten der von einem Form-Objekt veröffentlichten Ereignisse werden von der Basisklasse Control geerbt und sind somit auch Ereignisse aller anderen grafischen Komponenten, die Control als Basisklasse haben. An dieser Stelle eine lückenlose Liste aufzuführen, würde den Rahmen dieses Kapitels sprengen. Deshalb beschränke ich mich auf Ereignisse, die mit dem Laden und Entladen einer Form in Zusammenhang stehen.
Viele andere, hier noch nicht erwähnte Ereignisse werden durch die Interaktion mit der Maus oder durch die Tastatureingabe ausgelöst. Diese Ereignisse beschreibe ich in Kapitel 13, »Tastatur- und Mausereignisse«. Eine weitere große Gruppe bilden Ereignisse, deren Auslösung durch die Änderung einer Eigenschaft verursacht wird. Stellvertretend für diese Ereignisse seien an dieser Stelle BackColorChanged und VisibleChanged erwähnt. Auf diese Art Ereignisse gehe ich nicht näher ein.
11.7.1 Erzeugen eines Fensters
Beim Laden einer Form werden nach dem Aufruf des Konstruktors mehrere Ereignisse in der folgenden Reihenfolge ausgelöst:
- Move
- Load
- Layout
- Activated
- Paint
Die Ereignisreihenfolge ist für Sie als Entwickler nicht unwichtig, denn sie hat entscheidenden Einfluss darauf, in welchem Ereignis Sie Ihren Code schreiben. Initialisieren Sie beispielsweise Variablen im Load-Ereignis, stehen diese Werte in dem vorher ausgelösten Ereignis Move noch nicht zur Verfügung. Der Konstruktor einer Form, der in dieser Kette auch eine Rolle spielt, wird ausgeführt, bevor das erste Ereignis der Form ausgelöst wird. Das bedeutet für Sie, dass alle Komponenten der Form beim Auftreten des ersten Ereignisses bereits durch InitializeComponent initialisiert sind.
Es folgt nun eine Beschreibung der oben angeführten Ereignisse beim Laden einer Form:
- Activated wird ausgelöst, sobald das Formular den Fokus erhält. Das ist der Fall, wenn die Form geladen und angezeigt wird oder wenn eine deaktivierte Form wieder aktiv wird.
- Layout tritt jedes Mal ein, wenn ein Control neu positioniert werden muss. Zur Beschleunigung unterdrückt die Initialisierungsroutine dieses Ereignis durch den Aufruf der Methode SuspendLayout() und hebt mit ResumeLayout() die Sperre wieder auf.
- Load wird nach dem Initialisieren der Form ausgelöst, jedoch noch bevor das Formular angezeigt wird. Damit ist das Ereignis geeignet, um weitere Ressourcen bereitzustellen, beispielsweise eine Datenbankverbindung oder eine geöffnete Datei.
- Move tritt beim Verschieben einer Komponente ein.
- Paint tritt immer dann ein, wenn das Fenster neu gezeichnet werden muss. Insbesondere diesem Ereignis werden wir noch besondere Aufmerksamkeit schenken, wenn wir uns mit der grafischen Programmierung beschäftigen.
11.7.2 Größenänderung einer Form
Ereignisreihenfolgen spielen auch dann eine wichtige Rolle, wenn sich zur Laufzeit Bedingungen ändern. Verändern Sie zum Beispiel die Größe der Form oder maximieren Sie sie, kommt es zu den Ereignissen Layout, Resize, SizeChanged und Paint.
11.7.3 Schließen eines Fensters
So wie beim Laden und Anzeigen einer Form eine Ereigniskette durchlaufen wird, kommt es dazu auch beim Entladen einer Form:
- FormClosing
- FormClosed
- Deactivate
Erst daran anschließend wird der Destruktor ausgeführt (durch den Garbage Collector).
Das wichtigste Ereignis ist FormClosing, denn es bietet über dem Parameter vom Typ FormClosingEventArgs und dessen Eigenschaft Cancel die Möglichkeit, den eingeleiteten Schließvorgang der Form im letzten Moment noch einmal abzubrechen. Wird Cancel=True gesetzt, wird die Form nicht geschlossen; der Standardwert False schließt sie endgültig.
Das folgende Codefragment zeigt die typische Implementierung dieses Ereignisses. Wird die Form geschlossen und FormClosing ausgelöst, wird ein Meldungsfenster angezeigt, das den Anwender zur Bestätigung des Schließvorgangs oder zum Abbruch des Schließens auffordert. Meldungsfenster behandeln wir in Abschnitt 11.10, »Meldungsfenster mit MessageBox«. Klickt der Anwender die Nein-Schaltfläche im Meldungsfenster, kommt es zum Abbruch des eingeleiteten Schließvorgangs.
'...\WinForm\Ereignisse\FormClosing.vb |
Public Class FormClosing Private Sub FormClosing_FormClosing( _ sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing Dim dr As DialogResult = MessageBox.Show( _ "Wollen Sie die Anwendung beenden?", "Anwendungsmeldung", _ MessageBoxButtons.YesNo, MessageBoxIcon.Question, _ MessageBoxDefaultButton.Button2) ' wird im Meldungsfenster 'Nein' geklickt, ' wird der Schließvorgang abgebrochen If (dr = DialogResult.No) Then e.Cancel = True End Sub End Class
Ist der Ereignishandler von FormClosing vollständig abgearbeitet, ohne den Schließvorgang mit Cancel abzubrechen, wird FormClosed ausgelöst. Jetzt kann das Schließen der Form nicht mehr verhindert werden. Spätestens in diesem Ereignis sollten, falls erforderlich, alle Daten in einer Datei gespeichert und die von der Form beanspruchten Ressourcen wieder freigegeben werden.
Grund des Schließens
Der Parameter FormClosingEventArgs weist neben der Eigenschaft Cancel noch eine zweite typspezifische auf: CloseReason, die dem Ereignishandler die Ursache des Schließens mitteilt. Sie als Entwickler können damit im Bedarfsfall die auszuführenden Aktionen in Abhängigkeit von der Ursache steuern. CloseReason liefert eine Konstante der gleichnamigen Enumeration, deren Werte Sie Tabelle 11.12 entnehmen können.
Konstante | Beschreibung |
ApplicationExitCall |
Die Methode Application.Exit wurde aufgerufen. |
FormOwnerClosing |
Das Besitzerformular wurde geschlossen. |
MdiFormClosing |
Die übergeordnete MDI-Form wurde geschlossen. |
None |
Die Ursache für das Schließen ist unbekannt. |
TaskManagerClosing |
Die Anwendung wurde mit dem Task-Manager geschlossen. |
UserClosing |
Das Formular wurde über die Benutzeroberfläche geschlossen. |
WindowsShutDown |
Das Betriebssystem Windows wurde heruntergefahren. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.