Hi
Um einen Vokabeltrainer zu schreiben würde ich folgendermaßen vorgehen:
Zuerst brauchst du eine Datenablage, also, wo deine Vokabeln hinterlegt werden. Wenn du schon mal mit der BDE oder einer Datenbank gearbeitet hast, ist das gar kein Problem. Ansonsten schau mal mithilfe der Suche nach Adressbuch. Oder über meinen Namen, ein paar hilfreiche Hinweise zum einfachen Erstellen von Datenbanktabellen hab ich da schon gegeben.
(ok, bevor wieder Mecker kommt, keine BDE, weil nicht stabil. Doch wenn du nix anderes hast, ist’s immer noch besser als garnüscht. Und ich hab noch nie Probleme gehabt... )
Mach dir zuerst einmal Gedanken, welche Vokabeln du hinterlegen willst. Mithilfe der Datenbank ist es ganz einfach, auch mehrere Sprachen einzurichten.
Dazu gehst du folgendermaßen vor
| lfdNr | deutsch | englisch | franz | spanisch | ED_W | DE_W | DF_W | FD_W | DS_W | SD_W | etc
Nun, das ist vielleicht etwas zuviel des guten, daher reicht auch deutsch – englisch mit ED_W(ertung) und DE_W(ertung) Daher beschreibe ich in der Folge die Arbeit mit einem Dateisystem.
Dazulegst du dir eine Recordstruktur an.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Type R_Vokabel =RECORD Deutsch : String; Englisch : String; DE_Wertung: Integer: ED_Wertung: Integer; End; |
Und unter Var dann die Deklaration der eigentlichen Recordvariable
MyVokabelsatz : R_Vokabel;
Nun die Erklärung zum Datensatz: die Vokabeln deutsch und englisch sollten klar sein, aber DE_W und ED_W sind integervariablen, die eine Stufung aufgrund richtiger Antworten ermöglichen. Je höher die Zahl, umso öfter ist diese Vokabel richtig beantwortet worden.
Damit legst du fest, wie oft diese Vokabeln dir wieder zur Abfrage vorgelegt werden und du kannst einen Wert bestimmen, ab welchem du glaubst, es reicht ...
Allerdings kannst du sie auch als String behandeln, um vielleicht ein paar Umwandlungen zu sparen.
Und nun schauen wir mal, was dein Programm so alles können muß :
Die Dateneingabe
Zuerst brauchst du eine Eingabemöglichkeit, wo du die Vokabeln zusammenhängend erfaßt und die Wertung mit 0 abgelegt wird. Wenn du der Meinung bist, diese Vokabel soll erfasst aber nicht abgefragt werden, dann setz einfach die Wertung hoch. Editieren solltest du auch können und löschen, damit auch eine Nacharbeit bei fehlerhafter Eingabe möglich ist.
Daher macht sich‘s immer gut, für jedes Feld ein Editfeld zu spendieren.
Also, ED_Deutsch, ED_Englisch, ED_EDWert (Für deutsch -> Englischwertung) und ED_DEWert, wobei das „ED_“ in der Namensgebung auf ein Editfeld hinweist. Damit behältst du auch bei umfangreichen Formularen den Überblick. Nun kannst du hinter jedes Editfeld eine Combobox legen, die du mit den Werten aus den bereits gespeicherten Daten füllst. Lediglich den Bereich zum Aufklappen der Combobox läßt du sichtbar. Wenn du diese nun aufklappst, kannst du den Wert des Eintrages, den du korrigieren willst, auswählen und in der Ereignisroutine der Combobox schreibst du nun alle Einträge, auch die der anderen Comboboxen in die zugehörigen Editfelder. Und damit wir auch unserer Übersichtlichkeit Rechnung tragen, bekommen die Comboboxen entsprechend Namen CB_deutsch, CB_englisch, CB_DEWert und CB_Ed_Wert, analog zu den Editfeldern
Ins OnClick der Comboboxen schreibst du nun entsprechend zur Combobox
Delphi-Quelltext
1: 2: 3: 4:
| Ed_deutsch.Text:=CB_deutsch.Items[CB_deutsch.ItemIndex]; Ed_englisch.Text:= CB_englisch.Items[CB_deutsch.ItemIndex];Ed_DEWert.Text:= CB_DEWert.Items[CB_deutsch.ItemIndex];Ed_EDWert.Text:= CB_EDWert.Items[CB_deutsch.ItemIndex]; |
Nun kann der fehlerhafte Eintrag in den Editfeldern korrigiert und dann über ein Butten abgespeichert werden.
Entweder. Du speicherst mit erneutem Einlesen der Daten, oder du schreibst die Inhalte der Editfelder in die Combobox zurück. Neue Werte könntest du auf demselben Weg erfassen, indem du nach der Übernahme der Werte die Editfelder leerst und die Wertefelder auf 0 setzt. Nun mußt du nur noch wissen, was ist Korrektur, was ist neu. Das könntest du lösen, indem du in der onClick –Methode der Comboboxen ein Korrekturflag setzt
Korrflag:=True;
In der onClick-Metode deines Übernahmebuttons fragst du das Korrflag ab:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| If Korrflag then Begin CB_deutsch.Items[CB_deutsch.ItemIndex]:=Ed_deutsch.Text; CB_englisch.Items[CB_deutsch.ItemIndex]:= Ed_englisch.Text; CB_DEWert.Items[CB_deutsch.ItemIndex]:= Ed_DEWert.Text; CB_EDWert.Items[CB_deutsch.ItemIndex]:= Ed_EDWert.Text;End else Begin CB_deutsch.Items.Add(Ed_deutsch.Text); CB_englisch.Items.Add( Ed_englisch.Text); CB_DEWert.Items.Add( Ed_DEWert.Text); CB_EDWert.Items.Add( Ed_EDWert.Text); End Ed_deutsch.Text:=‘‘; Ed_englisch.Text:=‘‘; Ed_DEWert.Text:=‘0‘; Ed_EDWert.Text:=‘0‘; Korrflag:=false; |
Für die Löschfunktion nimmst du ein separates Button.
Damit wäre grob gesehen deine Datenerfassung fertig.
Schreib dir für die Schreib- und Leseaufgaben eigene Proceduren. Damit kannst du in einem kleinen Programmteil die Routinen prüfen. Außerdem kannst du per Button zwischendurch speichern, wenn du die Eingaben wie hier beschrieben zuerst nur in den Comboboxen ablegst.
Nun zum Trainer selbst.
Fast das selbe Bild, wie im Editor, allerdings nur optisch. Zuerst lädst du deine Vokabeldatei, dabei brauchst du nun etwas mehr als nur 4 Listen.
Da ich davon ausgehe, du speicherst deine Daten in eine Datei und Speicherplatz dank der Speicherhersteller ja genügend vorhanden ist, dürfen wir daher auch ein wenig großzügig sein.
Also laden wir alle Records wie beim Editor in Comboboxen. Benennen wir sie mit der Erweiterung Trainer, also
Cb_DeutschTrainer
Cb_EnglischTrainer
Cb_DEWertTrainer
Cb_EDWertTrainer
Diese machst du später unsichtbar, kannst sie aber auch zum Nachschlagen bei schweren Vokabeln sichtbar lassen und im Notfall aufklappen.
Nun nehmen wir 3 neue Comboboxen und holen uns aufgrund der Bewertung die Vokabeln, die noch geübt werden müssen.
Diesen geben wir die Erweiterung Auswahl
CB_deuschAuswahl
CB_englischAuswahl
und der dritten den Namen CB_Index für die Position in der Originaldatei.
Sagen wir mal, du willst alle Vokabeln nacharbeiten, die eine Wertung Deutsch-> Englisch schon 2 mal positiv bearbeitet wurden, also setzt du in einem Editfeld die Wertung auf 2. Dieses Editfeld nennen wir ED_suche.
Dann lassen wir die Vokabellisten durchlaufen und da alle gleich lang sind, reicht eine für die Auswahlschleife
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| For i:=0 to Cb_deutschTrainer.Items.Count-1 do Begin If Cb_DEWertTrainer=Ed_Suche.Text then Begin Cb_Index.Items.Add(IntToStr(i)); CB_deuschAuswahl.Items.Add(Cb_DeutschTrainer.Items[i]); CB_englischAuswahl.Items.Add(Cb_englischTrainer.Items[i]); End; End; |
Cb_Index wird unsichtbar dargestellt. Du kannst natürlich auch die Listen zur Kontrolle sichtbar lassen, und erst später ausblenden.
Cb_DeutschAuswahl und CB_EnglischAuswahl bleiben sichtbar, allerdings kommt auch hier über das Textfeld ein Editfeld, welches die Information abdeckt.
Arbeiten mit dem Trainer
Öffnest du nun die Liste mit den englischen Vokabeln, so wird der ausgewählte Eintrag ins Editfeld geschrieben, das Editfeld auf der anderen Seite machst du leer. Zusätzlich setzt du einen Richtungsmerker, um deine Wertung bei richtiger Antwort hochzusetzen.
So könnte die OnClick Methode von Cb_DeutschAuswahl aussehen
Delphi-Quelltext
1: 2: 3: 4: 5:
| AuswahlIndex:= Cb_DeutschAuswahl.ItemIndex; ED_Deutschauswahl.Text:=Cb_DeutschAuswahl.Items[AuswahlIndex]; Reftext:=Cb_EnglischAuswahl[AuswahlIndex]; ListZeiger:=StrToInt(Cb_Index[AuswahlIndex]); Richtung :=12; |
Nun wird interessant. Der Listzeiger beinhaltet die Datensatznummer der Gesamtdatei und damit ist ein Ändern der Wertung direkt möglich. Da unser Editfeld für die Englischvokabel ja leer ist, schreiben wir da die Antwort hinein. Danach betätigen wir ein Button „prüfen“
Diese OnClick-Ereignismethode sieht dann so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| If Richtung =12 then Begin If ED_englischAuswahl.Text=Reftext then Begin Merker :=StrToInt(Cb_DEWert.Items[Listzeiger]); Merker:=Merker+1; Cb_DEWert.Items[ListZeiger]:=IntToStr(Merker); Cb_Index.Items.Delete(AuswahlIndex); Cb_DeutschAuswahl.Items.Delete(AuswahlIndex); Cb_englischAuswahl.Items.Delete(AuswahlIndex);
End end else begin If ED_deutschAuswahl.Text=Reftext then Begin Merker :=StrToInt(Cb_EDWert.Items[Listzeiger]); Cb_EDWert.Items[ListZeiger]:=IntToStr(Merker); Cb_Index.Items.Delete(AuswahlIndex); Cb_DeutschAuswahl.Items.Delete(AuswahlIndex); Cb_englischAuswahl.Items.Delete(AuswahlIndex); End; End; |
Statt Merker zu benutzen könnte die Zeile z.B. auch so aussehen:
Cb_EDWert.Items[ListZeiger]:=IntToStr(StrToInt(Cb_EDWert.Items[ListZeiger])+1);
Nun noch ein paar Worte zur Gestaltung, wobei der Folgende Vorschlag nur eine von vielen Möglichkeiten zeigt, diese dafür aber sehr einfach ist
Du ziehst auf deine blanke Form 3 Panels. Auf eines Der Panels, welches du über die gesamte breite deiner Form ziehst, mit einer Höhe von ca. 2cm.
Darauf setzt du ein Button für schließen, eines für Trainer und eines für Editor.
Schließen ist klar, MyForm.Close in der OnClick-Methode. Evtl. vorher noch die Listen (Records ) abspeichern
Klickst du auf Trainer:
Delphi-Quelltext
1: 2:
| PN_Editor.Visible:=False; PN_Trainer.Visible:=True; |
Und natürlich ist der Klick auf Editor
Delphi-Quelltext
1: 2:
| PN_Trainer.Visible:=False; PN_Editor.Visible:=True; |
Damit ist auch klar, die beiden anderen Panels werden übereinander gelegt, benannt entsprechend mit dem Präfix „PN_“ .Zuerst wirst du sie etwas versetzt halten müssen, damit du sie dir beim Programmieren nach vorn holen kannst. Es ist auch wichtig, das die Elemente des Trainers auch auf dem Panel PN_Trainer sind ebenfalls die Elemente des Editors auf dem Panel PN_Editor.
Nun, das war viel Stoff, aber ich hoffe, eine nicht all zu schwere Anleitung und Vorgehensweise beschrieben zu haben und dabei verständlich geblieben bin.
Gruß oldmax
Zier dich nich so, ich krieg dich schon....