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.