Visual Basic 6: Schleifen
Schleifen
[Bearbeiten]Nehmen wir an, wir wollen dass der User 100 Mal einen Wert in eine ListBox hinzufügt. Dazu müssten wir ohne Schleifen folgendes schreiben:
Private Sub Command1_Click() Dim Wert As String Wert = InputBox("Bitte einen Wert eingeben!") List1.AddItem Wert End Sub
Der User müsste nun 100 Mal auf Command1 klicken, um 100 Mal einen Wert in die Liste hinzufügen zu können. Mit Schleifen ginge das allerdings wesentlich angenehmer und eleganter.
Ein weiteres Beispiel wäre, wenn wir 10 Mal hintereinander, aus welchem Grund auch immer, eine MsgBox mit dem Inhalt der aktuellen Zeit ausgeben wollen. Dazu müssten wir ohne Schleifen folgendes Schreiben:
Private Sub Command1_Click() MsgBox time MsgBox time MsgBox time MsgBox time MsgBox time MsgBox time MsgBox time MsgBox time MsgBox time MsgBox time End Sub
Auch das geht mit Schleifen wesentlich eleganter. Denn Schleifen sind dazu da, Programmanweisungen mehrmals zu wiederholen. Dabei wird zwischen vier unterschiedlichen Typen unterschieden:
- Zählergesteuerte Schleifen
- Schleifen mit nachgestellter Bedingungsprüfung
- Schleifen mit vorangestellter Bedingungsprüfung
- Endlosschleifen mit oder ohne Ausstiegsmöglichkeit
For ... Next
[Bearbeiten]Eine For ... Next Schleife ist eine zählergesteuerte Schleife.
Syntax:
- For Zaehler = Startwert To Endwert [Step Schrittgroesse]
- Anweisung
- Next Zaehler
Code Ausschnitt für die Realisierung des ersten Beispieles:
Private Sub Command1_Click() Dim wert As String Dim i as Integer For i = 1 to 100 Step 1 wert = InputBox("Bitte einen Wert eingeben!") List1.AddItem wert next i End Sub
Der fettgedruckte Programmcode wird bei diesem Beispiel 100 Mal ausgeführt, also genau so lange, bis i den Wert 100 besitzt. Step gibt dabei an, in welchen Schritten i erhöht wird.
For i = 1 to 50 Step 0.5 wert = InputBox("Bitte einen Wert eingeben!") List1.AddItem wert next i
Hier würde der fettgedruckte Programmcode ebenfalls 100 Mal ausgeführt werden, da i bei jedem Durchlauf immer um 0,5 erhöht werden würde.
Kleine Anmerkung zu dieser Schleifenkonstruktion ^^ Hier wird versehentlich eine Endlosschleife produziert. Die Zählvariable i ist als Integer definiert und ist somit eine Ganzzahl. Wenn man diese um nullkommairgendwas erhöht dann bleibt sie gleich weil die Nachkommastellen vernachlässigt werden. Nebenbei bemerkt handelt es sich bei der Zuweisung um einen impliziten Type-cast bei dem ein Float auf Integer gecastet wird.
Das 2. Beispiel ließe sich so realisieren:
Private Sub Command1_Click() Dim i as Integer For i = 1 to 10 Step 1 MsgBox time next i End Sub
Hier würde der fettgedruckte Text 10 Mal wiederholt werden. Die Step Option ist optional und die Schleife kann man mit Exit For vorzeitig beenden.
Die For...Next Schleife wurde weiterhin früher oft als Wartefunktion benutzt, um das Programm eine Weile still zu legen.
For i = 1 To 32767: Next i
Das nennt man auch eine Schleife mit Leeranweisung, da sie keine Anweisung enthält.
Do ... Loop
[Bearbeiten]Die Do ... Loop Schleife ist eine Schleife mit nachgestellter Bedingungsprüfung sowie vorangestellter Bedingungsprüfung, je nachdem wie man sie einsetzt.
Die Syntax sieht folgendermasen aus:
mit nachgestellter Bedingungsprüfung
- Do
- Anweisungen
- Loop [While Bedingung]
Oder
- Do
- Anweisungen
- Loop [Until Bedingung]
mit vorangestellter Bedingungsprüfung
- Do [While Bedingung]
- Anweisungen
- Loop
Oder
- Do [Until Bedingung]
- Anweisungen
- Loop
Endlosschleife mit Bedingungsprüfung im Anweisungsteil
- Do
- Anweisungen
- If Bedingung Then Exit do
- Anweisungen
- Loop
Wie schon aus der Syntax zu erkennen ist, gibt es 2 Möglichkeiten mit dieser Schleife zu arbeiten, einmal mit Until und einmal mit While. Darauf achten sollte man, dass sich beide Klauseln gegensätzlich zueinander verhalten. Denn Until bedeutet Bis etwas ist und While so lange etwas ist.
Beispiel:
Do While x < 10 x = x + 1 loop
Diese Schleife wird genau so lange ausgeführt, so lange x kleiner als 10 ist. Sobald x 10 ist, wird sie beendet.
Do Until x < 10 x = x - 1 loop
Diese Schleife allerdings wird genau so lange ausgeführt bis x kleiner als 10 ist. Sobald x kleiner als 10 ist, wird sie ebenfalls beendet.
Die Benutzung von While sowie Until ist aber optional - man kann sie genauso gut weg lassen. Es ist jedoch eleganter und übersichtlicher sie zu benutzen, wenn man nicht gerade eine Endlosschleife produzieren möchte. Des Weiteren kann man auch hier die Schleife mit Exit Do vorläufig beenden.
Die Umsetzung des ersten Beispieles würde mit der Do ... Loop Schleife so aussehen:
Private Sub Command1_Click() Dim wert As String Dim i as Integer Do While i < 100 i = i + 1 wert = InputBox("Bitte einen Wert eingeben!") List1.AddItem wert loop End Sub
While ... Wend
[Bearbeiten]Die While ... Wend Schleife ist eine Schleife mit vorangestellter Bedingungsprüfung.
Die Syntax sieht so aus:
- While Bedingung
- Anweisungen
- Wend
Die While ... Wend Schleife gleicht von der Funktion und Benutzung her der Do While ... Loop Schleife. Die Bedingung gibt an, wie lange etwas ist. Erst wenn diese Bedingung nicht mehr erfüllt ist, wird die Schleife beendet.
Source-Code Beispiele:
Private Sub Command11_Click() Dim wert As String Dim x As Integer: x = 1 While x < 100: x = x + 1 wert = InputBox("Bitte einen Wert eingeben!") List1.AddItem wert Wend End Sub
Private Sub Command1_Click() Dim x As Integer: x = 1 While x < 10 x = x + 1 MsgBox Time Wend End Sub
DoEvents
[Bearbeiten]DoEvents sind bei der Nutzung von Schleifen äußerst wichtig. Ohne den Einsatz von DoEvents würde das gesamte Programm, während es sich in einer Schleife befindet, einfach einfrieren und nicht mehr auf Eingaben und Anweisungen von außen reagieren. Ein DoEvents sorgt dafür, dass das Programm immer mal nachschaut, ob noch andere Aktionen zu bearbeiten sind. Allerdings sollte DoEvents mit Bedacht (und in aller Regel nicht in der innersten Schleife) eingesetzt werden, da es eine ausgesprochene Performance-Bremse darstellt.
Gerade als Programmieranfänger vergisst man leicht, in Do-Loop-Schleifen die Bedingungsvariable zu ändern oder überprüft auf einen Wert, der nie erreicht wird. Deshalb sollte man vor dem ersten Starten des Programms immer DoEvents in jede Schleife einbauen. (eine Endlosschleife ohne DoEvents führt dazu, dass das Programm nichts mehr beendet, also auch nicht mehr gespeichert werden kann.) Einzige Möglichkeit ist dann nur mehr durch Drücken von Strg + Pause das Programm abzubrechen.