11.2 Lernprogramm Vokabeln
In diesem Abschnitt wird ein kleines, erweiterungsfähiges Vokabel-Lernprogramm (Projekt Vokabeln) vorgestellt. Es beinhaltet:
- eine Datenbank als Basis
- ein Hauptmenü
- die Nutzung einer ArrayList
- einen Zufallsgenerator
- eine Benutzerführung, abhängig vom Programmzustand
- Lesen einer Textdatei
11.2.1 Benutzung des Programms
Nach dem Start erscheint die Benutzeroberfläche (siehe Abbildung 11.2).
Abbildung 11.2 Benutzeroberfläche
Das Hauptmenü besteht aus:
- Menü Allgemein, dieses Menü wiederum besteht aus
- Menüpunkt Test beenden: vorzeitiger Testabbruch
- Menüpunkt Programm beenden
- Menü Richtung: zur Auswahl und Anzeige der Richtung für Frage und Antwort
- Menüpunkt deutsch – englisch
- Menüpunkt englisch – deutsch (dies ist die Voreinstellung)
- Menüpunkt deutsch – französisch
- Menüpunkt französisch – deutsch
- Menü Hilfe
- Menüpunkt Anleitung: eine kurze Benutzer-Anleitung
Der Benutzer kann entweder die Richtung für Frage und Antwort wählen oder sofort einen Vokabeltest in der Voreinstellung englisch – deutsch starten.
Nach der Betätigung des Buttons Test starten erscheint die erste Vokabel, der Button wird deaktiviert, und der Button Prüfen/Nächster wird aktiviert, wie in Abbildung 11.3 zu sehen.
Abbildung 11.3 Test läuft, eine Vokabel erscheint
Nachdem der Benutzer eine Übersetzung eingegeben und den Button betätigt hat, wird seine Eingabe geprüft und es erscheint ein Kommentar:
- Falls er die richtige Übersetzung eingegeben hat, wird diese Vokabel aus den Listen entfernt. Er wird in diesem Test nicht mehr danach gefragt.
- Falls er nicht die richtige Übersetzung eingegeben hat, wird mit dem Kommentar die korrekte Übersetzung angezeigt, sodass der Benutzer sie erlernen kann, siehe auch Abbildung 11.4.
Abbildung 11.4 Falsche Antwort
Anschließend erscheint die nächste Vokabel. Diese wird aus der Liste der noch vorhandenen Vokabeln ausgewählt. Enthalten die Listen keine Vokabeln mehr, weil alle Vokabeln einmal richtig übersetzt wurden, ist der Test beendet. Der Button Test starten wird wieder aktiviert und der Button Prüfen/Nächster wird deaktiviert.
Der Benutzer kann eine andere Richtung wählen und wiederum einen Test beginnen.
11.2.2 Erweiterung des Programms
Dieses Programm kann als Basis für ein größeres Projekt dienen. Es gibt viele Möglichkeiten zur Erweiterung des Programms:
- Der Benutzer soll die Möglichkeit zur Eingabe weiterer Vokabeln haben.
- Der Entwickler fügt weitere Sprachen und Richtungen für Frage und Antwort hinzu.
- Der Benutzer kann die Test-Auswahl auf eine bestimmte Anzahl an Vokabeln begrenzen.
- Der Entwickler kann die Vokabeln in Kategorien unterteilen.
- Der Benutzer kann Tests nur noch mit Fragen aus einer (oder mehreren) Kategorien machen.
- Es kann zu einer Frage mehrere richtige Antworten geben.
- Der Entwickler kann das Programm als ASP.NET Anwendung internetfähig machen.
- Der Entwickler fügt eine Zeitsteuerung per Timer hinzu. Der Benutzer hat dann nur noch eine bestimmte Zeitspanne für seine Antwort.
Viele andere Erweiterungen sind denkbar.
11.2.3 Initialisierung des Programms
Zu Beginn werden die klassenweit gültigen Variablen vereinbart und die Form1_Load-Prozedur durchlaufen:
Imports System.IO
Public Class Form1
' Liste der Fragen
Dim frage As New ArrayList
' Liste der Antworten
Dim antwort As New ArrayList
' Zufallszahl für ein Element der beiden Listen
Dim zufallszahl As Integer
' Richtung der Vokabel-Abfrage
Dim richtung As Integer
Private Sub Form1_Load(...) Handles MyBase.Load
' Initialisierung des Zufallsgenerators
Randomize()
' Startrichtung Englisch – Deutsch
richtung = 2
End Sub
[...]
End Class
Listing 11.8 Projekt »Vokabeln«, Initialisierung
Zur Erläuterung:
- Die beiden Listen frage und antwort beinhalten im weiteren Verlauf des Programms die Fragen und zugehörigen Antworten je nach gewählter Testrichtung. Die Zusammengehörigkeit von Frage und Antwort ergibt sich daraus, dass die beiden zusammengehörigen Elemente der beiden Listen mit dem gleichen Index angesprochen werden.
- Der jeweils aktuelle Index wird im weiteren Verlauf des Programms per Zufallsgenerator bestimmt und in der Variablen zufallszahl gespeichert.
- Die Richtung für Frage und Antwort kann der Benutzer über das Benutzermenü auswählen.
- Der Zufallsgenerator wird initialisiert, damit er nicht immer mit dem gleichen Wert beginnt.
- Falls der Benutzer keine andere Richtung für Frage und Antwort auswählt, wird mit der Richtung englisch – deutsch begonnen.
11.2.4 Ein Test beginnt
Nachdem der Benutzer den Button Start betätigt hat, beginnt der Test. Der Code der zugehörigen Ereignisprozedur lautet:
Public Class Form1
[...]
Private Sub cmdStart_Click(...) Handles ...
Dim con As New OleDb.OleDbConnection
Dim cmd As New OleDb.OleDbCommand
Dim reader As OleDb.OleDbDataReader
con.ConnectionString =
"Provider=Microsoft.ACE.OLEDB.12.0;" &
"Data Source=C:\Temp\lernen.accdb"
cmd.Connection = con
cmd.CommandText = "select * from vokabel"
frage.Clear()
antwort.Clear()
Try
con.Open()
reader = cmd.ExecuteReader()
' Speicherung in den Listen gemäß
' der ausgewählten Richtung
Do While reader.Read()
If richtung = 1 Or richtung = 3 Then
frage.Add(reader("deutsch"))
ElseIf richtung = 2 Then
frage.Add(reader("englisch"))
Else
frage.Add(reader("französisch"))
End If
If richtung = 2 Or richtung = 4 Then
antwort.Add(reader("deutsch"))
ElseIf richtung = 1 Then
antwort.Add(reader("englisch"))
Else
antwort.Add(reader("französisch"))
End If
Loop
reader.Close()
con.Close()
' Buttons und Menü (de)aktivieren
cmdStart.Enabled = False
cmdPrüfen.Enabled = True
mnuRichtung.Enabled = False
txtAntwort.Enabled = True
' Erste Vokabel erscheint
Nächste_Vokabel()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
[...]
End Class
Listing 11.9 Projekt »Vokabeln«, Testbeginn
Zur Erläuterung:
- Eine Verbindung zur Access-Datenbank C:\Temp\lernen.accdb wird geöffnet.
- Es wird eine Auswahlabfrage gesendet, die alle Datensätze der Tabelle vokabel anfordert.
- Die zurückgegebenen Datensätze werden einem OleDbReader übergeben. Beim Auslesen des Readers werden die beiden Listen frage und antwort mithilfe der Methode Add() mit den Inhalten der jeweiligen Felder gefüllt, abhängig von der jeweils eingestellten Richtung für Frage und Antwort.
- Der Button Test starten und das Menü für die Richtung werden deaktiviert, damit sie nicht versehentlich während eines Tests bedient werden können.
- Der Button Prüfen/Nächster und das Eingabetextfeld werden aktiviert, damit der Benutzer seine Antwort eingeben und überprüfen lassen kann.
- Die Prozedur Nächste_Vokabel() dient zum Aufruf einer zufällig ausgewählten Vokabel aus der Liste frage.
11.2.5 Zwei Hilfsprozeduren
Die beiden Hilfsprozeduren Nächste_Vokabel() und Test_Init() werden von verschiedenen Stellen des Programms aufgerufen:
Public Class Form1
[...]
Sub Nächste_Vokabel()
' Falls keine Vokabel mehr in der Liste: Ende
' Falls noch Vokabeln in der Liste: Nächste
If frage.Count < 1 Then
MessageBox.Show(
"Gratuliere! Alles geschafft")
Test_Init()
Else
zufallszahl = Rnd() * (frage.Count – 1)
lblFrage.Text = frage(zufallszahl)
txtAntwort.Text = ""
End If
End Sub
Sub Test_Init()
' Buttons und Menü (de)aktivieren
cmdStart.Enabled = True
cmdPrüfen.Enabled = False
mnuRichtung.Enabled = True
txtAntwort.Enabled = False
' Felder leeren
lblFrage.Text = ""
txtAntwort.Text = ""
End Sub
[...]
End Class
Listing 11.10 Projekt »Vokabeln«, Hilfsprozeduren
Zur Erläuterung der Prozedur Nächste_Vokabel():
- Bei einer richtigen Antwort werden Frage und Antwort aus der jeweiligen Liste gelöscht. Daher sind die Listen nach einiger Zeit leer. Mithilfe der Eigenschaft Count wird dies geprüft.
- Sind die Listen leer, so erscheint eine Erfolgsmeldung über den bestandenen Test. Der Startzustand der Benutzeroberfläche wird wiederhergestellt.
- Sind die Listen noch nicht leer, wird eine Zufallszahl ermittelt. Der zugehörige Begriff wird eingeblendet, und das Eingabefeld wird gelöscht.
Zur Erläuterung der Prozedur Test_Init():
- Die Prozedur dient zum Wiederherstellen des Startzustands der Benutzeroberfläche.
- Der Button Test starten und das Menü für die Richtung werden aktiviert, damit ein Test gestartet bzw. eine neue Richtung gewählt werden kann.
- Der Button Prüfen/Nächster und das Eingabetextfeld werden deaktiviert, damit sie nicht versehentlich außerhalb eines Tests bedient werden können.
- Die alten Einträge werden aus den beiden Feldern für Frage und Antwort gelöscht.
11.2.6 Die Antwort prüfen
Nachdem der Benutzer den Button Prüfen/Nächster betätigt hat, wird die eingegebene Antwort überprüft. Der Code der zugehörigen Ereignisprozedur lautet wie folgt:
Public Class Form1
[...]
Private Sub cmdPrüfen_Click(...) Handles ...
' Falls richtig beantwortet:
' Vokabel aus Liste nehmen
If txtAntwort.Text = antwort(zufallszahl) Then
MessageBox.Show("Richtig")
frage.RemoveAt(zufallszahl)
antwort.RemoveAt(zufallszahl)
' Falls falsch beantwortet:
' richtige Antwort nennen
Else
MessageBox.Show(
"Falsch, richtige Antwort ist " &
vbCrLf & "'" &
antwort(zufallszahl) & "'")
End If
' Nächste Vokabel erscheint
Nächste_Vokabel()
End Sub
[...]
End Class
Listing 11.11 Projekt »Vokabeln«, Eingabe prüfen
Zur Erläuterung:
- Steht im Text-Eingabefeld dasselbe wie in dem Element der Liste antwort, das zum Element der Liste frage gehört, so war die Antwort korrekt.
- Es erfolgt eine Meldung. Frage und Antwort werden mithilfe der Methode RemoveAt() aus ihren jeweiligen Listen gelöscht, sodass die Listen irgendwann leer sind.
- Bei einer falschen Antwort erfolgt eine Meldung, die auch die richtige Übersetzung beinhaltet. Frage und Antwort werden nicht gelöscht. Auf diese Weise kann die gleiche Frage später erneut gestellt werden.
- Es wird die nächste Frage gestellt, und die beschriebene Prozedur beginnt von vorn.
11.2.7 Das Benutzermenü
In insgesamt sieben kurzen Ereignisprozeduren und mithilfe einer Hilfsprozedur wird die Bedienung des Benutzermenüs realisiert:
Public Class Form1
Private Sub mnuEndeTest_Click(...) Handles ...
' Abbruch mit Rückfrage
If MessageBox.Show(
"Test wirklich abbrechen?",
"Vokabel", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) =
DialogResult.Yes Then
Test_Init()
End If
End Sub
Private Sub mnuEndeProgramm_Click(...) Handles ...
' Beenden mit Rückfrage
If MessageBox.Show(
"Programm wirklich beenden?",
"Vokabel", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) =
DialogResult.Yes Then
Me.Close()
End If
End Sub
Private Sub mnuDE_Click(...) Handles ...
' Richtung wird geändert
richtung = 1
Check_False()
mnuDE.Checked = True
lblRichtung.Text = "deutsch/englisch"
End Sub
Private Sub mnuED_Click(...) Handles ...
richtung = 2
Check_False()
mnuED.Checked = True
lblRichtung.Text = "englisch/deutsch"
End Sub
Private Sub mnuDF_Click(...) Handles ...
richtung = 3
Check_False()
mnuDF.Checked = True
lblRichtung.Text = "deutsch/französisch"
End Sub
Private Sub mnuFD_Click(...) Handles ...
richtung = 4
Check_False()
mnuFD.Checked = True
lblRichtung.Text = "französisch/deutsch"
End Sub
Sub Check_False()
mnuDE.Checked = False
mnuED.Checked = False
mnuDF.Checked = False
mnuFD.Checked = False
End Sub
Private Sub mnuAnleitung_Click(...) Handles ...
Dim fs As FileStream
Dim sr As StreamReader
Dim dateiname As String = "hilfe.txt"
Dim ausgabe As String
If Not File.Exists(dateiname) Then
MessageBox.Show("Die Datei " &
dateiname & " existiert nicht")
Exit Sub
End If
fs = New FileStream(dateiname,
FileMode.Open)
sr = New StreamReader(fs)
ausgabe = ""
Do Until sr.Peek() = –1
ausgabe &= sr.ReadLine() & vbCrLf
Loop
sr.Close()
MessageBox.Show(ausgabe)
End Sub
End Class
Listing 11.12 Projekt »Vokabeln«, Benutzermenü
Zur Erläuterung:
- Im Hauptmenü Allgemein besteht die Möglichkeit, einen Test abzubrechen bzw. das Programm zu beenden. Zur Sicherheit wird in beiden Fällen noch einmal eine Rückfrage gestellt, damit kein Test versehentlich abgebrochen wird.
- Im Hauptmenü Richtung können insgesamt vier Ereignisprozeduren zur Auswahl der Richtung von Frage und Antwort
aufgerufen werden.
- Es wird jeweils die klassenweit gültige Variable richtung auf einen neuen Wert gesetzt. Beim nächsten Start eines Tests werden dann die entsprechenden Inhalte aus der Datenbank in den beiden Listen frage und antwort gespeichert.
- Anschließend wird dafür gesorgt, dass nur die soeben ausgewählte Richtung im Benutzermenü mit einem Häkchen versehen ist.
- Im Hauptmenü Hilfe wird über den Menüpunkt Anleitung eine kleine Benutzeranleitung eingeblendet. Dabei wird der Text der Anleitung aus einer Datei gelesen. Die Existenz der Datei wird zuvor geprüft.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.