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
Hauptmenü
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.
Start
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:
Richtig
- Falls er die richtige Übersetzung eingegeben hat, wird diese Vokabel aus den Listen entfernt. Er wird in diesem Test nicht mehr danach gefragt.
Falsch
- 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
Nächste Vokabel
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.9 Projekt »Vokabeln«, Initialisierung
Zur Erläuterung:
Zwei Listen
- 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.
Zufallsgenerator
- 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.Jet.OLEDB.4.0;" & "Data Source=C:\Temp\lernen.mdb" 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.10 Projekt »Vokabeln«, Testbeginn
Zur Erläuterung:
Datenbank
- Eine Verbindung zur Access-Datenbank C:\Temp\lernen.mdb wird geöffnet.
- Es wird eine Auswahlabfrage gesendet, die alle Datensätze der Tabelle vokabel anfordert.
OleDbReader
- 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.
Button deaktivieren
- 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.
Nächste Vokabel
- 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.11 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.
Test bestanden
- 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.
Button (de)aktivieren
- 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.12 Projekt »Vokabeln«, Eingabe prüfen
Zur Erläuterung:
Richtige Antwort
- 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.
Elemente löschen
- Es erfolgt eine Meldung. Frage und Antwort werden mithilfe der Methode RemoveAt() aus ihren jeweiligen Listen gelöscht, sodass die Listen irgendwann leer sind.
Falsche Antwort
- 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.13 Projekt »Vokabeln«, Benutzermenü
Zur Erläuterung:
Beenden
- 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.
Sprachen wählen
- 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.
Anleitung
- 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.