|
Mitunter kann es vorkommen, dass bei Operationen innerhalb einer
Ereignisprozedur eben dieses Ereignis erneut ausgelöst wird. Wenn
Sie zum Beispiel im Click-Ereignis einer ListBox die Eigenschaft
ListIndex neu setzen, wird das Click-Ereignis erneut ausgelöst und
der Code darin erneut ausgeführt, obwohl der erste Durchlauf noch
gar nicht abgeschlossen ist. Im folgenden Beispiel wird das
Click-Ereignis erneut ausgelöst, wenn beim ersten Auslösen des
Ereignisses der ListIndex einen anderen Wert als 0
hatte:
Private Sub List1_Click()
List1.ListIndex = 0
End Sub
Sie brauchen also eine Möglichkeit, den erneuten Eintritt in die
Click-Ereignisprozedur zu erkennen und abzufangen. Am besten geht
dies mit einer statischen Variable in der Prozedur. Statische
Variablen in einer Prozedur behalten nämlich ihren Wert auch über
das Ende der Abarbeitung einer Prozedur hinaus. Einfach
dimensionierte Variablen hingegen verlieren ihren Wert und sind beim
nächsten Eintritt wieder mit ihrem Standardwert initialisiert.
Zu Beginn der Prozedur prüfen Sie, ob diese statische
Sperrvariable, geben wir ihr den Datentyp Boolean und nennen sie
InProc, gesetzt (= True) oder nicht gesetzt (=
False) ist. Ist sie gesetzt, wird die Prozedur sogleich
wieder verlassen, ohne dass der übrige Code darin ausgeführt
würde. Ist sie nicht gesetzt, wird sie gesetzt. Ist die aktuelle
Abarbeitung der Prozedur abgeschlossen, wird die Sperrvariable
wieder zurückgesetzt (= False), damit beim nächsten
regulär ausgelösten Ereignis die Prozedur wieder normal und
vollständig abgearbeitet wird.
Das Rücksetzen ist absolut wichtig! Denn sollten Sie dies
vergessen, würde die Prozedur nie mehr regulär abgearbeitet!
Private Sub List1_Click()
Static InProc As Boolean
If InProc Then
Exit Sub
Else
InProc = True
End If
List1.ListIndex = 0
'... weiterer Code
InProc = False
End Sub
 |
Mit der statischen Sperrvariablen InProc
verhindern Sie, dass eine Prozedur vorzeitig erneut
abgearbeitet wird

|
Natürlich können Sie diese Technik in jeder beliebigen
Prozedur, ob Sub oder Function usw., verwenden, um einen innerhalb
der Prozedur hervorgerufenen Wiedereintritt vorübergehend zu
verhindern. |