Aufmerksame Beobachter haben es schon bemerkt. In unserem Beispiel taucht eine Befehlsfolge mehrfach auf:
DoEvents
'Möglichkeit für das Programm auf andere Ereignisse zu reagieren
start = Timer
Do 'Zeitverzögerung
Zeit = Timer - start
Loop Until Zeit >= 0.05
Immer wenn Befehle sich wiederholen, bietet es sich an, diese in ein Unterprogramm zu legen. Das hat mehrere Vorteile: - Der Code wird übersichtlicher, man muß sich nicht mit Nebensächlichkeiten belasten. - Man muß solche Prozeduren nur einmal schreiben und kann sie immer wieder verwenden, von jeder beliebigen Stelle des Programms. - Man muß auch bei Änderungen nur einmal im Unterprogramm ändern.
Bisher hat die Entwicklungsumgebung ganz nebenbei für uns das Gerüst für unsere Unterprogramme (denn unsere Ereignis-Prozeduren sind nichts anderes) erstellt. Wir haben nur das entsprechende Ereignis ausgewählt. Wir können aber genauso einfach eigene Prozeduren erzeugen. Wir schreiben einfach an eine freie Stelle (nicht zwischen ein vorhandenes "Sub "/"End Sub"!)
Sub Verzoegerung
Die Entwicklungsumgebung fügt automatisch eine Zeile
End Sub
dazu. Dazwischen schreiben wir jetzt unsere Befehlszeilen, die wir auslagern wollen:
Sub Verzoegerung
DoEvents
'Möglichkeit für das Programm auf andere Ereignisse zu reagieren
start = Timer
Do 'Zeitverzögerung
Zeit = Timer - start
Loop Until Zeit >= 0.05
End Sub
An den Stellen, wo vorher diese Befehlsfolge stand, fügen wir jetzt einen Aufruf für unser Unterprogramm ein:
Private Sub Form_Activate()
For k = 1 To 5 'äußere Schleife
For i = 1 To 20
'erste innere Schleife, Kugel bewegt sich nach rechts unten
Kugel.Move Kugel.Left + 3 * i, Kugel.Top + 20 * i / k
Verzoegerung
Next
For i = 1 To 20
'zweite innere Schleife, Kugel bewegt sich nach rechts oben
Kugel.Move Kugel.Left + 3 * i, Kugel.Top - 20 * i / (k + 1)
Verzoegerung
Next
Next
For i = 1 To 20
'abschließende separate Schleife, Kugel bewegt sich ein letztes Mal nach unten
Kugel.Move Kugel.Left + i, Kugel.Top + 20 * i / k
Verzoegerung
Next
CurrentX = 1000 'positioniert den nachfolgenden Printbefehl X-Achse
CurrentY = 2000 'positioniert den nachfolgenden Printbefehl Y-Achse
Print "Viel Spaß mit Mathe-Max!" 'druckt Text direkt auf die Form
End Sub
Hinweis: Prozeduren können auf zwei Arten aufgerufen werden, mit dem Schlüsselwort "Call", z.B.
Call Verzoegerung
oder durch einfache Eingabe des Namens:
Verzoegerung
Die Wirkung ist die gleiche, es gibt jedoch einen Unterschied in der Schreibweise, wenn man mit dem Aufruf einen oder mehrere Werte übergeben will
Call Verzoegerung (wert1, wert2)
Verzoegerung wert1, wert2
Im ersten Fall muß immer eine Klammer um die Argumentliste gesetzt werden, im zweiten Fall kann eine Klammer geschrieben werden, muß aber nicht (wie hier gemacht).
Und damit kommen wir gleich zu einer weiteren Möglichkeit, unser Unterprogramm zu verallgemeinern. Damit wir evtl. später das gleiche Unterprogramm für eine Verzögerung mit unterschiedlicher Dauer benutzen können, setzen wir eine Variable ein:
Sub Verzoegerung(ByVal Dauer)
start = Timer
Do 'Zeitverzögerung
'Möglichkeit für das Programm auf andere Ereignisse zu reagieren
DoEvents
Zeit = Timer - start
Loop Until Zeit >= Dauer
End Sub
Bei der Übergabe von Variablen gibt es zu beachten: Wir können die Variable als reinen Wert übergeben, dann fügen wir ein "ByVal" vor den Variablennamen (s.o.) oder wir übergeben sie als Referenz, das ist der Standard, wenn wir keinen Zusatz angeben.
Ich habe in unserem Beispiel jetzt noch eine Kleinigkeit an der Reihenfolge verändert: Ich hab den Befehl "DoEvents" in die Zeitschleife geschrieben. Das ist eine Sicherheitsmaßnahme, falls wir unsere Zeitschleife vielleicht länger machen wollen. Der Benutzer hat dann die Möglichkeit, auch während einer längeren Wartezeit das Programm abzubrechen.
Damit unser Beispiel funktioniert, müssen wir jetz beim Aufruf natürlich auch einen Wert für Dauer übergeben:
Private Sub Form_Activate()
For k = 1 To 5 'äußere Schleife
For i = 1 To 20
'erste innere Schleife, Kugel bewegt sich nach rechts unten
Kugel.Move Kugel.Left + 3 * i, Kugel.Top + 20 * i / k
Verzoegerung 0.005
Next
For i = 1 To 20
'zweite innere Schleife, Kugel bewegt sich nach rechts oben
Kugel.Move Kugel.Left + 3 * i, Kugel.Top - 20 * i / (k + 1)
Verzoegerung 0.005
Next
Next
For i = 1 To 20
'abschließende separate Schleife, Kugel bewegt sich ein letztes Mal nach unten
Kugel.Move Kugel.Left + i, Kugel.Top + 20 * i / k
Verzoegerung 0.005
Next
CurrentX = 1000 'positioniert den nachfolgenden Printbefehl X-Achse
CurrentY = 2000 'positioniert den nachfolgenden Printbefehl Y-Achse
Print "Viel Spaß mit Mathe-Max!" 'druckt Text direkt auf die Form
End Sub
Ihr findet das Beispiel zum Probieren wie immer hier:
© Copyright 1998-2000 J.Behling
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.