4.3 Ereignisgesteuerte Programmierung
In diesem Abschnitt wird das Verständnis für die ereignisgesteuerte Programmierung vertieft. In Windows-Programmen löst der Benutzer Ereignisse aus, die der Entwickler mit Ereignisprozeduren besetzt hat. In diesen Ereignisprozeduren wird der Programmcode zu diesem Ereignis ausgeführt.
4.3.1 Eine Ereigniskette
Sie haben auch die Möglichkeit, Ereignisse statt durch den Benutzer durch Programmcode auszulösen, indem die Ereignisprozedur mit ihrem Namen aufgerufen wird. Sie simulieren sozusagen die Tätigkeit des Benutzers. Dies kann die Programmentwicklung vereinfachen, weil dadurch die Folgen mehrerer Ereignisse zusammengefasst werden können, die aber auch nach wie vor einzeln ausgelöst werden können.
Das Programm im nachfolgenden Projekt Ereigniskette beinhaltet drei Buttons und zwei Labels. Bei Betätigung des Buttons Ereignis 1 erscheint ein Text in Label 1, bei Betätigung des Buttons Ereignis 2 erscheint ein Text in Label 2. Bei Betätigung des Buttons Ereignis 1+2 soll beides gleichzeitig passieren, siehe Abbildung 4.9. Ein weiterer Button soll zum Löschen der Label-Inhalte führen.
Abbildung 4.9 Zwei Ereignisse gleichzeitig auslösen
Der zugehörige Programmcode lautet:
Public Class Form1
Private Sub cmdEreignis1_Click(sender As Object,
e As EventArgs) Handles cmdEreignis1.Click
lblAnzeige1.Text = "Eins"
End Sub
Private Sub cmdEreignis2_Click(sender As Object,
e As EventArgs) Handles cmdEreignis2.Click
lblAnzeige2.Text = "Zwei"
End Sub
Private Sub cmdEreignis3_Click(sender As Object,
e As EventArgs) Handles cmdEreignis3.Click
cmdEreignis1_Click(sender, e)
cmdEreignis2_Click(sender, e)
End Sub
Private Sub cmdLöschen_Click(...) Handles ...
lblAnzeige1.Text = ""
lblAnzeige2.Text = ""
End Sub
End Class
Listing 4.3 Projekt »Ereigniskette«
Zur Erläuterung:
- In der Prozedur cmdEreignis3_Click() werden die beiden Ereignisse cmdEreignis1_Click und cmdEreignis2_Click per Programmcode aufgerufen. Die beiden Parameter sender und e werden dabei vom Button Ereignis 1+2 übernommen. In beiden Labels wird anschließend Text angezeigt.
4.3.2 Endlose Ereignisketten
Sie können durch Aufrufe von Ereignisprozeduren allerdings auch (unbeabsichtigt) endlose Ereignisketten auslösen. Dabei stapeln sich die Prozeduraufrufe, und das Programm endet mit der Ausnahme StackOverFlowException. Solche endlosen Ereignisketten sind natürlich zu vermeiden. Nachfolgend sind zwei Beispiele angegeben.
Beispiel im Projekt ButtonEndlos: Zwei Buttons rufen sich gegenseitig auf:
Public Class Form1
Private Sub cmdEreignis1_Click(...) Handles ...
cmdEreignis2_Click(sender, e)
End Sub
Private Sub cmdEreignis2_Click(...) Handles ...
cmdEreignis1_Click(sender, e)
End Sub
End Class
Listing 4.4 Projekt »ButtonEndlos«
Zur Erläuterung:
- Die Betätigung eines der Buttons simuliert die Betätigung des jeweils anderen Buttons.
Beispiel im Projekt TextfeldEndlos – zwei Textfelder ändern sich gegenseitig:
Public Class Form1
Private Sub txtEingabe1_TextChanged(...
) Handles txtEingabe1.TextChanged
txtEingabe2_TextChanged(sender, e)
End Sub
Private Sub txtEingabe2_TextChanged(...
) Handles txtEingabe2.TextChanged
txtEingabe1_TextChanged(sender, e)
End Sub
End Class
Listing 4.5 Projekt »TextfeldEndlos«
Zur Erläuterung:
- Die Eingabe in eines der Textfelder simuliert die Änderung des Inhalts des jeweils anderen Textfelds. Dies simuliert wiederum die Änderung des Inhalts des ersten Textfelds usw.
4.3.3 Textfelder koppeln
Eine nützliche Simulation eines Ereignisses ist dagegen das Kopieren von einem Textfeld in ein anderes Textfeld während der Eingabe. Sie können dieses Verhalten beobachten, wenn Sie in Visual Studio ein Projekt speichern.
Im Dialog Projekt speichern ist das Textfeld Projektmappenname zunächst an das Textfeld Name gekoppelt. Geben Sie im Textfeld Name etwas ein, so wird der eingegebene Text parallel in das andere Textfeld übernommen. Dieses Verhalten ändert sich allerdings, sobald Sie den Cursor in das Textfeld Projektmappenname setzen: Nun sind die beiden Textfelder wieder entkoppelt.
Das beschriebene Verhalten soll mithilfe des folgenden Programms im Projekt TextfeldKoppeln vorgeführt werden.
Public Class Form1
Dim Kopplung As Boolean
Private Sub Form1_Load(...) Handles MyBase.Load
txtName.SelectAll()
Kopplung = True
End Sub
Private Sub txtName_TextChanged(...
) Handles txtName.TextChanged
If Kopplung Then
txtProjektmappenname.Text = txtName.Text
End If
End Sub
Private Sub txtProjektmappenname_Click(...
) Handles txtProjektmappenname.Click
Kopplung = False
End Sub
End Class
Listing 4.6 Projekt »TextfeldKoppeln«
Zur Erläuterung:
- Es wird eine klassenweit gültige Variable vom Typ Boolean deklariert. Diese Variable repräsentiert den Zustand der Kopplung. Sie wird beim Ereignis Form1_Load auf True gesetzt, da dies dem Anfangszustand entspricht: Die beiden Textfelder sind gekoppelt, siehe Abbildung 4.10.
Abbildung 4.10 Gekoppelte Textfelder
- Außerdem wird mit der Methode SelectAll() der gesamte voreingetragene Inhalt des Textfelds (das Wort Standardtext) selektiert, also markiert. Dadurch erreichen Sie, dass der Inhalt durch eine Eingabe des Benutzers unmittelbar überschrieben werden kann.
- Ändert sich der Inhalt des Textfelds Name, so wird in der Ereignisprozedur txtName_TextChanged() geprüft, ob die beiden Textfelder noch gekoppelt sind. Ist dies der Fall, wird der Inhalt unmittelbar in das Textfeld Projektmappenname kopiert.
- Klickt der Benutzer in das Textfeld Projektmappenname, so wird die Kopplung gelöst, siehe Abbildung 4.11. Die Variable Kopplung wird auf False gestellt.
Abbildung 4.11 Entkoppelte Textfelder
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.