VB - 9: Schleifen

Wiederholungen programmieren...

Nun ist es natürlich lästig, für jede einzelne Bewegung auf die Form klicken zu müssen. Wir könnten dies automatisieren, indem wir den Befehl in der gewünschten Zahl wiederholen:

    Private Sub Form_Click()
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        ...
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
    End Sub
 

Solche Wiederholungen lassen sich jedoch viel eleganter realisieren, durch die Nutzung von sogenannten Schleifen. Grundsätzlich gibt es zwei Arten von Schleifen:

     For i = x to y Step z
        ...
     Next
 

Alle Befehle zwischen "For..." und "Next" werden (y / z - x) mal wiederholt. Mit x können wir einen Startwert definieren, häufig wird hier 0 oder 1 benutzt. Mit jedem Schleifendurchgang wird z zu i addiert. Läßt man "Step z" weg, wird jeweils 1 addiert. Wenn der Wert y erreicht ist, wird die Schleife verlassen und die nachfolgenden Befehle (nach "Next") werden abgearbeitet. Hinter "Next" kann zur besseren Übersicht der Schleifenzähler angegeben werden, das ist vor allem bei stark verschachtelten Schleifen sinnvoll.

Unsere Schleife könnte also so aussehen:

    Private Sub Form_Click()
      For i = 1 to 20
        Kugel.Move Kugel.Left + 100, Kugel.Top + 100
      Next i
    End Sub
 

Schleifen können auch - wie bereits angedeutet - ineinander verschachtelt werden, z.B.:

    Private Sub Form_Click()
      For i = 1 to 2
        For j = 1 to 10
          Kugel.Move Kugel.Left + 100, Kugel.Top + 100
        Next j
      Next i
    End Sub
 

Die Wirkung wäre in diesem Fall die gleiche. Die äußere Schleife wird 2mal durchlaufen, bei jedem Durchlauf wird dann die innere 10 mal durchlaufen, ingesamt also 2 * 10 = 20. Sinn macht das erst, wenn in diesen Schleifen unterschiedliche Aktionen oder Berechnungen stattfinden.

Wir bauen zur Übung in unser Programm eine kleine Animation ein, die ablaufen soll, wenn die Form zum ersten Mal angezeigt wird. Wir nutzen dazu das "Activate"-Ereignis der Form:

    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
        Next i

        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)
        Next i
      Next k

      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
      Next i
    End Sub
 

Nebenbei ist hier noch ein anderes Sprach-Element aufgetaucht: Das Apostroph innerhalb eines VB-Programmes erlaubt es, an jeder beliebigen Stelle einen Kommentar einzufügen. Alles, was in einer Zeile hinter einem Apostroph steht, wird bei der Programmausführung ignoriert (in der Entwicklungsumgebung sind Kommentare durch eine andere Farbe gekennzeichnet, standardmäßig grün). Alternativ kann ein Kommentar auch mit "Rem" (Remark) eingeleitet werden. In den ersten Basic-Versionen war dies Standard, heute wird es nur noch selten benutzt. Kommentare dienen der eigenen Erinnerung, aber auch zur Dokumentation, wenn z.B. andere an einem Projekt arbeiten sollen. Außerdem sind sie recht nützlich, wenn man einen Befehl vorrübergehend außer Kraft setzen will. Man setzt einfach ein Apostroph vor die entsprechende Zeile und schon wird der Befehl ignoriert. Auf die umgekeherte Weise kann man ihn später wieder aktivieren.

Wir benutzen hier den Schleifenzähler i bzw. k zu Berechnungen innerhalb der Schleife, das ist jederzeit möglich und vereinfacht manches, muß aber nicht sein.

Wenn wir unser Projekt jetzt so ablaufen lassen, werden wir feststellen, daß wir von der Animation nicht viel zu sehen kriegen. Sie läuft auf den heute üblichen Rechnern viel zu schnell ab. Wir müssen also die Angelegenheit verzögern. Dies könnten wir erreichen, indem wir eine oder mehrere "sinnlose" Schleifen zusätzlich einbauen. Solange wir dabei jedoch die echte Zeit nicht berücksichtigen, würde unser Projekt je nach Rechnergeschwindigkeit unterschiedlich schnell ablaufen.

Wir nutzen für die Verzögerung eine weitere Art von Schleifen und die Timer-Funktion (nicht verwechseln mit dem "Timer-Control", das wäre auch möglich, verbraucht aber mehr Resourcen, und wir wollen doch sparsam damit umgehen ).

Neben den Schleifen mit Zählern (wie oben) können wir auch Schleifen ablaufen lassen, die über Bedingungen gesteuert werden:

     Do
       ...
     Loop Until Bedingung
 

Anstelle von "Until" (bis) kann auch "While" (während) verwendet werden. Dies ist abhängig davon, wie wir unsere Bedigung formulieren. Im ersten Fall wird die Schleife solange durchlaufen, bis die Bedingung erfüllt ist, im zweiten Fall solange, bis die Bedingung nicht mehr erfüllt ist.

Wir erweitern jede unserer "For i"-Schleifen um eine (innere) "Do"-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
        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
    Next
 

Vor Eintriit in die Do-Schleife setzen wir einen Start-Wert für die Zeit. "Timer" übergibt den Wert der Sekunden seit Mitternacht. Die in der Schleife abgelaufene Zeit ergibt sich dann durch Subtraktion der Start-Zeit von der jeweils aktuellen Zeit.

Ein weiteres wichtiges Element lernen wir hierbei kennen: "DoEvents". Würden wir es weglassen, wäre das Programm so sehr mit der Abarbeitung der Schleifen beschäftigt, daß es keine Möglichkeit mehr gäbe, auf andere Ereignisse (z.B. den Wunsch ein Programm abzubrechen) zu reagieren. Durch Einfügen von DoEvents "guckt" das Programm zwischendurch, ob es evtl. noch was anderes zu tun gibt, "Multitasking" eben .

Jetzt fügen wir am Ende noch eine kleine Begrüßung für unseren Anwender hinzu und gönnen uns dann mal wieder eine Pause .

      CurrentX = 1000       'positioniert den nachfolgenden Printbefehl X-Achse
      CurrentY = 2000       'positioniert den nachfolgenden Printbefehl Y-Achse
      Print "Viel Spaß mit Mathe-Max!"
 

Beispielprojekt laden

Zu viel auf einmal? Laßt Euch ruhig Zeit, geht schrittweise vor und macht vor allem selber Experimente! "Probieren geht über Studieren" heißt die Devise!

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.