Meine Version eines Vokabeltrainers würde so aussehen:
Delphi-Quellcode:
// Record für eine Vokabel (englisch, deutsch, richtig/falsch)
type
TVokabel = record
eng: String;
de: String;
Correct: Boolean;
end;
// dyn. Array für alle Vokabeln aus der Datei
var
Vokabeln : array of TVokabel;
procedure TForm1.FormCreate(Sender: TObject);
var
sl: TStringList;
Loop: Cardinal;
resourcestring
rsEng = 'Englisch';
rsDe = 'Deutsch';
rsCorrect = 'richtig / falsch';
begin
StringGrid1.Cells[0,0] := rsEng;
StringGrid1.Cells[1,0] := rsDe;
StringGrid1.Cells[2,0] := rsCorrect;
sl := TStringList.Create;
try
// Vokabel-Datei in Stringliste laden
sl.LoadFromFile(ExtractFilepath(ParamStr(0))+'lektion.txt');
// StringGrid anpasen
StringGrid1.RowCount := sl.Count+1;
// dyn. Array auf richtige Größe setzen
SetLength(Vokabeln, sl.Count);
// Datei durchgehen
for Loop := 0 to Sl.Count-1 do
begin
// Zeilen die nicht dem Format: eng=de entsprechen überspringen
if pos('=', sl.Strings[Loop]) = 0 then
Continue;
// Vokablen zu weisen
Vokabeln[Loop].eng := copy(sl.Strings[Loop], 0, pos('=',
sl.Strings[Loop])-1);
Vokabeln[Loop].de := copy(sl.Strings[Loop], pos('=', sl.Strings[Loop])+1,
length(sl.Strings[Loop]));
// englischen schon eintragen
StringGrid1.Cells[0, Loop+1] := Vokabeln[Loop].eng;
end;
finally
// StringListe freigeben
FreeAndNil(sl);
end;
end;
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
// Nur editieren zu lassen, wenn in der zweiten Spalte
if StringGrid1.Col = 1 then
StringGrid1.Options := StringGrid1.Options+[goEditing]
else
StringGrid1.Options := StringGrid1.Options-[goEditing];
end;
procedure TForm1.btnCheckClick(Sender: TObject);
var
Loop: Cardinal;
Wrong: Cardinal; // Anzahl falsche Vokabeln
PercWrong: Double; // falsche Vokabeln in Prozent
resourcestring
rsWrong = 'falsch';
rsRight = 'richtig';
rsPercWrong = 'Es sind %.2f%% der Vokabeln falsch beantwortet worden.';
begin
// auswerten
Wrong := 0;
for Loop := 0 to length(Vokabeln)-1 do
begin
// Vergleichen, natürlich nur sehr einfach. Es wird nicht berücksichtigt,
// wenn Begriffe mehrere Bedeutungen haben (läßt auch der Aufbau der
// Vokabel-Datei nicht zu).
if StringGrid1.Cells[1,Loop+1] <> Vokabeln[Loop].de then
begin
// 'falsch' in die entsprechende Zeile schreiben
StringGrid1.Cells[2,Loop+1] := rsWrong;
// Vokabel im Array als falsch markieren
Vokabeln[Loop].Correct := False;
// Anzahl der falsche Vokabeln hochzählen
Inc(Wrong);
end
else
begin
// 'richtig' eintragen
StringGrid1.Cells[2,Loop+1] := rsRight;
// Vokabel im Array als richtig markieren
Vokabeln[Loop].Correct := True;
end;
end;
// falschen in Listbox anzeigen
Listbox1.Items.Clear;
for Loop := 0 to length(Vokabeln)-1 do
begin
// wenn Vokabel als falsch markiert in Listbox übernehmen
if Vokabeln[Loop].Correct = False then
Listbox1.Items.Add(Vokabeln[Loop].eng)
end;
// Messagebox-Auswertung mit Prozent
PercWrong := Wrong * 100 / length(Vokabeln);
ShowMessage(Format(rsPercWrong, [PercWrong]));
end;
Im Anhang das ganze Projekt.
PS: Da ich keine Lust hatte einen kompletten Vokabeltrainer zu machen, ist der natürlich sehr einfach. Er berücksichtigt nicht, dass eine Vokabel mehrere Übersetzungen haben könnte und es geht nur in eine Richtung. Auch ist ein Editieren der Vokabelliste aus dem Programm nicht möglich. Sollte aber, entsprechenden Fleiß vorrausgesetzt, ausbaufähig sein. Das Ausbauen beschränkt sich eigentlich nur noch auf Tipparbeit und Ideen, die umgestzt werden wollen.
PPS: Ich übernehme keine Garantie auf Effektivität und Schönheit des Quellcodes, der ist innerhalb einer Stunde mal so entstanden.