Nun wird es aber Zeit, daß wir auch die anderen Menüpunkte bevölkern! Dazu nehmen wir zunächst den Aufruf unserer Zählübung aus dem Activate-Ereignis heraus und packen ihn in das entsprechende Click-Ereignis des Menüs:
Private Sub mnuZaehlen_Click()
Zaehlen 'Aufruf unserer Zählübung
aktiveUebung = "Zählen" 'Uebung merken
End Sub
Damit wir beim Auswerten wissen, welche Übung gerade aktiv ist, setzen wir hier noch eine Flagge "aktiveUebung" und machen sie für das ganze Modul bekannt:
Dim aktiveUebung 'aktuelle Übungsart modulweit bekannt machen
Beim Start fordern wir dazu auf, eine Übung auszuwählen, anstatt wie bisher gleich mit dem Zählen anzufangen:
Private Sub Form_Activate()
...
MsgBox "Bitte suche eine Übung aus!", vbExclamation
End Sub
Da wir nun bei der Abfrage des Ergebnisses nicht mehr unbedingt wieder eine Zählübung aufrufen wollen, müssen wir Alternativen auswerten. Wir könnten das mit einer Folge von IF-Abfragen erledigen, eleganter in einem solchen Fall ist jedoch die "Case"-Abfrage:
Select Case Ausdruck
Case Wert1
...
[Case Wert2
...]
[Case Else
...[elsestatements]]
End Select
"Ausdruck" bezeichnet eine Variable oder Konstante, auf die geprüft werden soll. Es muß mindestens eine Auswahlmöglichkeit gegeben werden, "Wert1", es können aber auch beliebig viele sein. Soll eine Befehlsfolge für mehrere Werte durchgeführt werden, kann man diese auch zusammenfassen:
Case Wert1, Wert2, Wert3
Ein optionales "Case Else" ermöglicht eine "Sammelreaktion" auf Werte, die nicht näher spezifiziert sind.
In unserem Fall ändern wir das KeyPress-Event folgendermaßen ab:
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii <> vbKeyReturn Then Exit Sub
'Prüfen ob Enter gedrückt wurde, sonst ignorieren
If Val(txtErgebnis.Text) = x Then
MsgBox "Richtig!"
Else
MsgBox "Leider falsch!"
End If
Select Case aktiveUebung
Case "Zählen"
KugelnUnsichtbar 'Kugeln verschwinden lassen
Zaehlen 'nächste Zählübung
Case "SymbAddition"
KugelnUnsichtbar 'Kugeln verschwinden lassen
SymbAddition 'nächste symb. Addition
Case "Addition"
'Aufruf Addition 'nächste Addition
Case "Subtraktion"
'Aufruf Subtraktion 'nächste Subtraktion
Case "Multiplikation"
'Aufruf Multiplikation 'nächste Multiplikation
Case "Division"
'Aufruf Division 'nächste Division
End Select
End Sub
Den Abfragecode für die anderen Übungen schreiben wir später, ich habe daher zunächst mal Kommentare als Platzhalter hineingeschrieben.
Das Unsichtbarmachen der Kugeln lagern wir in eine eigene Prozedur aus, da wir diese öfter benötigen.
Doch nun zu unserer nächsten Rechenübung, der Addition mit Symbolen. Wir ordnen dazu zunächst auf unserer Form eine zweite Sorte von Kugeln an, zur Unterscheidung von den roten nehmen wir diesmal hellblaue. Wir nennen sie imgKugelY und weisen ihr ebenfalls einen Index 0 zu. Auch hier laden wir die restlichen Kugeln erst zur Laufzeit im Form_Load-Ereignis:
Private Sub Form_Load()
For i = 1 To 8 'rote Kugeln
Load imgKugelX(i) 'benötigte Anzahl Kugeln laden
imgKugelX(i).Left = imgKugelX(i - 1).Left + imgKugelX(i).Width * 1.2
'Kugeln positionieren
Next
For i = 1 To 8 'blaue Kugeln
Load imgKugelY(i) 'benötigte Anzahl Kugeln laden
imgKugelY(i).Left = imgKugelY(i - 1).Left + imgKugelY(i).Width * 1.2
'Kugeln positionieren
Next
End Sub
Anmerkung: Euch fällt sicher auf, daß es hier um zwei fast gleiche Befehlsfolgen handelt. Es würde sich also anbieten, auch das zu verallgemeinern und auszulagern. Das wollen wir uns für später vorbehalten...
Und hier noch die Prozedur für das Unsichtbarmachen der Kugeln:
Sub KugelnUnsichtbar
For i = 1 To 9 'alle roten Kugeln unsichtbar machen
imgKugelX(i - 1).Visible = False
Next
For i = 1 To 9 'alle blauen Kugeln unsichtbar machen
imgKugelY(i - 1).Visible = False
Next
End Sub
Sicherheitshalber werden alle Kugeln unsichtbar gemacht. Wir ersparen uns das damit Abfragen, welche Übung zuletzt aktiv war.
Jetzt fehlt noch der Code für die Additionsübung. Er sieht ganz ähnlich aus wie unsere Zählübung, nur daß wir hier beide Summanden generieren und darstellen müssen:
Sub SymbAddition()
Summand1 = Zufallszahl(1, 5) 'Summand1
x = Zufallszahl(2, 9) 'Ergebnis
Select Case x 'prüfen, ob Ergebnis vernünftig ist
Case Is < Summand1 'negativ
Summand2 = x 'Summanden vertauschen
x = Summand1
Summand1 = x - Summand2
Case Is = Summand1
x = x + 1 'Ergebnis um eins erhöhen
Summand2 = 1 'Summand2
Case Else
Summand2 = x - Summand1 'Summand2
End Select
For i = 1 To Summand1 'rote Kugeln anzeigen
imgKugelX(i - 1).Visible = True
Verzoegerung 0.05
Next
For i = 1 To Summand2 'blaue Kugeln anzeigen
imgKugelY(i - 1).Visible = True
Verzoegerung 0.05
Next
lblFrage.Visible = True 'Frage anzeigen
txtErgebnis.Text = "" 'Textfeld löschen
txtErgebnis.Visible = True 'Antwortfeld anzeigen
Me.KeyPreview = True 'Tastencodes abfragen
txtErgebnis.SetFocus 'Cursor ins Textfeld setzen
End Sub
Da das Ergebnis bei unserem Zufallszahlengenerator auch kleiner als oder gleich dem ersten Summanden sein könnte, müssen notfalls Ergebnis und Summanden vertauscht oder das Ergebnis um eins erhöht werden. Deshalb auch hier wieder eine Case-Abfrage am Anfang. Der Rest dient dann nur noch der Darstellung der roten und blauen Kugeln.
Im Prinzip können wir jetzt schon endlos Addieren üben. Ein paar kleine Schönheitsfehler hat unser Programm jedoch noch...
© Copyright 1998-2000 J.Behling
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.