VB -11: Unterprogramme

Die Kunst der Delegation

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:

Beispielprojekt laden

zurück Index weiter


© Copyright 1998-2000 J.Behling EMail schreiben ABC-Ware's Homepage
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.