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.