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.