Machen wir zunächst mit der Programmierung unserer Rechenaufgaben weiter. Als nächstes geht es um die Subtraktion. Sie sieht fast genauso aus wie unsere Addition:
Private Sub mnuSubtraktion_Click(Index As Integer)
Unsichtbar 'evtl. sichtbare Kugeln unsichtbar machen
ErgebnisWert (Index) 'Zahlenbereich aus Menü-Index bestimmen
Subtraktion 'Aufruf unserer Subtraktion
aktiveUebung = "Subtraktion" 'Uebung merken
End Sub
Da unsere Subtraktion nichts anderes ist als eine Addition, nur daß nach einem anderen Wert der Gleichung gefragt wird, wollen wir die Ermittlung der Summanden verallgemeinern:
Private Sub Summe(summand1 As Integer, summand2 As Integer)
summand1 = Zufallszahl(1, MaxErgebnisWert - MinErgebnisWert) 'Summand1
x = Zufallszahl(MinErgebnisWert, MaxErgebnisWert) '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
End Sub
Die beiden Summanden übergeben wir als Argumente, x ist bereits modulweit definiert. In unseren Rechenaufgaben rufen wir jetzt nur noch das Unterprogramm "Summe" auf:
Private Sub Addition()
Dim summand1 As Integer, summand2 As Integer
Dim i As Integer
Summe summand1, summand2
lblAufgabe.Caption = Str$(summand1) & " +" & Str$(summand2) & " ="
'Aufgabe in Label schreiben
lblAufgabe.Visible = True 'Aufgabe anzeigen
txtErgebnis.Text = "" 'Textfeld löschen
txtErgebnis.Visible = True 'Antwortfeld anzeigen
Me.KeyPreview = True 'Tastencodes abfragen
txtErgebnis.SetFocus 'Cursor ins Textfeld setzen
End Sub
Private Sub Subtraktion()
Dim summand1 As Integer, summand2 As Integer
Dim i As Integer
Summe summand1, summand2
lblAufgabe.Caption = Str$(x) & " -" & Str$(summand2) & " ="
'Aufgabe in Label schreiben
x = summand1 'Ergebnis + Summand1 vertauschen für Subtraktion
lblAufgabe.Visible = True 'Aufgabe anzeigen
txtErgebnis.Text = "" 'Textfeld löschen
txtErgebnis.Visible = True 'Antwortfeld anzeigen
Me.KeyPreview = True 'Tastencodes abfragen
txtErgebnis.SetFocus 'Cursor ins Textfeld setzen
End Sub
Weil wir hier eine Subtraktionsaufgabe haben, müssen wir x (Ergebnis der Summe) mit einem Summanden vertauschen.
Und auch in SymbAddition nutzen wir das neue Unterprogramm:
Private Sub SymbAddition()
Dim summand1 As Integer, summand2 As Integer
Dim i As Integer
Summe summand1, summand2
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
Hierzu müssen wir auch noch die Grenzwerte setzen:
Private Sub mnuAddSymb_Click()
Unsichtbar 'evtl. sichtbare Kugeln unsichtbar machen
MaxErgebnisWert = 9
MinErgebnisWert = 2
SymbAddition
aktiveUebung = "SymbAddition"
End Sub
Und schon kann unser Proband auch seine Subtraktionskünste unter Beweis stellen.
Inzwischen ist Euch die MessageBox zur Ergebnisanzeige sicher genauso langweilig geworden wie mir
. Wir wollen daher diese Stelle etwas abändern und, je nachdem ob die Aufgabe richtig oder falsch beantwortet wurde, mit einem kurzen Sound quittieren.
Aber wie? VB hat auch in Version 6 noch weit und breit keine Standardsoundfunktion...
Doch wir wären nicht unter Windows, wenn wir nicht jederzeit das Betriebssystem anzapfen könnten. Schließlich kann unser Windows ja auch ständig Sound absondern, eine Soundkarte oder einen passenden Lautsprechertreiber vorausgesetzt. Solche Funktionsaufrufe ins Windows-Betriebssystem geschehen grundsätzlich über die API-Schnittstelle (dazu später mehr).
Wir müssen nur wissen, wo die Funktion versteckt ist. Wenn nicht, schlagen wir nach
. Zum Abspielen von kleinen WAV-Dateien gibt es die Funktion "sndPlaySound". Da es sich um einen API-Aufruf handelt, müssen wir die Funktion und wo sie zu finden ist, speziell deklarieren:
Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Wir werden uns mit API-Aufrufen später noch ausführlicher befassen, zunächst nur die Erklärung der wichtigsten Parameter:
Zum Aufruf der Funktion basteln wir uns im Modul "Allgemein" ein kleines Unterprogramm:
Sub Sound(WAVDatei As String)
Dim rc As Long
rc = sndPlaySound(WAVDatei, 1)
End Sub
"rc" ist hier der Rückgabewert der API-Funktion. Er sagt aus, ob der Aufruf erfolgreich war oder nicht. Jetzt müssen wir nur noch unsere "Sound"-Prozedur bei Bedarf aufrufen:
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
Sound App.Path & "\richtig.wav"
Else
Sound App.Path & "\falsch.wav"
End If
Verzoegerung 2
Dazu müssen die beiden Sounddateien "richtig.wav" und "falsch.wav" im gleichen Verzeichnis wie unser Programm stehen (App.Path). Ihr könnt hier natürlich jede beliebige Wav-Datei benutzen.
Damit das Ergebnis einen kurzen Augenblick stehen bleibt, habe ich noch eine Verzögerung von 2 Sekunden angehängt.
© Copyright 1998-2000 J.Behling
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.