Entwickler-Ecke

Dateizugriff - Erstellen eines Lernmodus für Vokabeltrainer


Sauerbraten - Mo 24.05.10 19:23
Titel: Erstellen eines Lernmodus für Vokabeltrainer
Hallo liebes Forum.
Hab eine kleine Hürde, undzwar möchte ich ein Vokabeltrainer programmieren, wo der Nutzer über eine Eingabemaske das Deutsch und das dazugehörige Fremdwort speichert (über 2 Editfelder) und diese in ein .txt Dokument schreibt. Das Funktioniert auch ganz gut. Nur möchte ich einen Lernmodus dafür erstellen, indem ein zufälliger deutscher Begriff aus der .txt ausgelesen wird und man das entsprechende Fremdwort eigibt und auf "Überprüfen" klickt.
Wie schreibe ich dieses zufällige auslesen? Auch dass der Nutzer mal den Deutschen und dann das Fremdwort Raten muss?

By the Way: So werden Daten in der Textdatei gespeichert:

----------
der Hund
the dog
----------
die Gitarre
the guitar
----------
sich kratzen
to scratch


...also zuerst eine Line mit Strichen (zur Orientierung), dann der Deutsche Begriff und dann das Fremdwort.

Vielen Dank im Vorraus


elundril - Mo 24.05.10 19:29

Hallo und :welcome: im Delphi-Forum!

Am besten wäre es wenn du nicht immer bei einer neuen Runde das Wort aus der Textdatei lädst, sondern dir ein dynamisches Array machst von einem Datentyp (Record zb) in der du die Wortpaare speicherst. So kannst du das ganze viel effizienter Verwalten und könntest auch so was schönes implementieren wie das wörter die falsch übersetzt wurden öfter dran kommen.

lg elundril


Sauerbraten - Mo 24.05.10 20:20

^^ Ohjeh, wusste dass das kommt...
Wenn ich gesteh, bin ich noch n Delphi Neuling und hab erst dieses Schuljahr Delphi im Unterricht. Arrays hatte ich schon, aber erst vom Typ String und Integer...

Mein theoretischer Gedankengang war, dass er beim Eintreten in den Lernmodus (übers Hauptmenü) eine EOF schleife laufen lässt, in der er zählt, wie viele Zeilen die Datei hat, durch 3 teilt (Weil beim hinzufügen immer 3 zeilen erstellt werden, s.o.) und das als max. anzahl für random speichert. Und daraus die Randomzahl dann als Zeile in dem Dokument aufruft und 1 teil davon läd...
geht dass denn auch sorum? auch wenns komplizierter ist ;-)


jaenicke - Mo 24.05.10 21:56

Nimm lieber eine TStringList. Dann kannst du die Daten einfach mit = getrennt in die Datei speichern und kannst direkt auf die Daten zugreifen ohne dazu eigenen Code schreiben zu müssen...

Siehe Suche in der Delphi-Reference TSTRINGS.NAMES, Suche in der Delphi-Reference TSTRINGS.VALUEFROMINDEX, Suche in der Delphi-Reference TSTRINGS.VALUES. Zum Laden und Speichern reicht dann LoadFromFile bzw. SaveToFile.


Sauerbraten - Di 25.05.10 07:38

Cool, danke!
Und werden diese Daten auch in einer .txt Datei gespeichert? Oder im Programm selber? Könnt ihr dafür vieleicht ein Code Beispiel schreiben, für das Speichern, bzw. zufällige laden?


MaPsTaR - Di 25.05.10 10:03

Hallo, die Delphi-Hilfe [F1] hätte dir zwar das gleiche verraten können, aber okay...

Die Daten stehen vorerst im Speicher und werden dann über SaveToFile() in einer txt-Datei gespeichert.


Delphi-Quelltext
1:
2:
3:
4:
5:
  [...]
  public
    { Public-Deklarationen }
    Daten: TStringList;
  end;


Eintrag hinzufügen

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.BSaveWordClick(Sender: TObject);
begin
  Daten.Add(EDeutsch.Text + '=' + EEnglisch.Text);
end;

Speichern der Daten

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.BSpeichernClick(Sender: TObject);
begin
  Daten.SaveToFile(ExtractFilePath(ParamStr(0)) + 'de-en.txt');
end;

Du lädst nicht die einzelnen Werte zufällig, sondern erst einmal die komplette Datei:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Daten := TStringList.Create;
  Daten.NameValueSeparator := '=';
  if FileExists(ExtractFilePath(ParamStr(0)) + 'de-en.txt')
  then
    Daten.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'de-en.txt');
end;


Dann kannst du mit den von user profile iconjaenicke genannten Funktionen auf die einzelnen Einträge zugreifen.
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Siehe Suche in der Delphi-Reference TSTRINGS.NAMES, Suche in der Delphi-Reference TSTRINGS.VALUEFROMINDEX, Suche in der Delphi-Reference TSTRINGS.VALUES.




Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Daten.Free;
end;


ffgorcky - Mi 26.05.10 10:23

Entschuldigung - ich würde das deutsche und englische Wort in etwa so
to send = verschicken
direkt in eine Zeile schreiben und das ganze dann mit dem z.B. im Thread Zwei Wörter die mit ' - ' im String getrennt sind trennen [http://www.delphi-forum.de/viewtopic.php?t=51162&start=0&postorder=asc&highlight=string+split] vorgeschlagenen durch das Gleichheitszeichen trennen.
Das wäre zumindest für mich übersichtlicher.

PS: Also so wie es wohl auch user profile iconMaPsTaR gedacht hat.