Autor |
Beitrag |
Thunfisch
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 23.06.11 11:22
Hallo  (ist glaube ich mein erster Post)
Ich habe Informatik in der Schule im 4. Jahr aber mache erst seit einem 3/4 Jahr Delphi.
Wir sollten uns gegen Schluss des Schuljahres ein Projekt aussuchen, was wir dann selbst verwirklichen.
Ich habe mir einen Vokabeltrainer vorgenommen
Da ich (grade mal) mit txt-dateien umgehen kann, speicher ich die eingegebenen Vokabeln in einer txt-Datei.
Mein Problem besteht beim Auslesen:
Ich möchte, dass man die ausgelesene Vokabel zum Abfragen benutzen kann sowie dass man aus den ganzen Vokablen bspw. 20 random ausliest.
Meine Lösung dafür wäre, dass ich alle Vokabeln auslese und dann in ein Array speicher. Aber wie ich die einzelnen Eigenschaften der Vokabeln abspeichern kann ist mir ein Rätsel.
Hier nochmal ein Beispiel aus meiner Vokabel.txt :
1#fisch#fish#chicken
2#Haus#House#House
3#Haus#House#House
4#Hallo#hi#hi
5#Brother#Bruder#Bruder
6# Frieden#Peace# war
7#Mutter#mother#UNBEKANNT
8#Maus#Mouse#Mouse
9#Auto#Car#
ID;#;Deutsch;#;Englisch1;#;Englisch2
# soll als Trennzeichen dienen
MFG Thunfisch
PS: ich benutze delphi 6 !
|
|
MaxWurzel
      
Beiträge: 77
Erhaltene Danke: 10
|
Verfasst: Do 23.06.11 11:38
Du kannst z.B. ein record benutzen
Delphi-Quelltext 1: 2: 3: 4: 5:
| type Vokabel = record deutsch: string; englisch1: string; englisch2: string; end; |
[quote="[user]5#Brother#Bruder#Bruder
ID;#;Deutsch;#;Englisch1;#;Englisch2
quote]
?
|
|
Thunfisch 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 23.06.11 11:44
Jo fast genau den benutze ich
Aber mir gehts ja mehr ums Auslesen
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Do 23.06.11 11:52
Hast du Probleme beim Auslesen der Zeilen aus deiner .txt Datei oder beim Auslesen der einzelnen Eigenschaften?
Für letzteres gibt es die Funktionen Pos und PosEx, damit kannst du in deiner Zeile nach den Trennzeichen suchen und dir dann mithilfe von Copy die passenden Stringteile auslesen lassen.
|
|
MaxWurzel
      
Beiträge: 77
Erhaltene Danke: 10
|
Verfasst: Do 23.06.11 12:08
Du kannst die txt-Datei in eine Stringlist laden
Delphi-Quelltext 1: 2: 3: 4:
| var vokabelliste: TStringlist;
vokabelliste := TStringlist.Create; vokabelliste.LoadFromFile(xxx.txt); |
und dann auf die Zeilen mit
Delphi-Quelltext 1:
| vokabelliste.Strings[i] |
zugreifen.
Für diesen Beitrag haben gedankt: Thunfisch
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Do 23.06.11 12:36
Also, wenn es es ums Auslesen geht werfe ich mal ein paar Begriffe in den Raum:
Einlesen kannst du die Datei wie MaxWurzel schreibt, die Wörter dann wie folgt.
(Situation: Du hast z.B. die erste Zeile der Textdatei in einen String s geladen)
- s[i] gibt dir das Zeichen an i-ter Position zurück
- pos('ch',s) gibt dir die Position des ersten Vorkommens von "ch" wieder, wenn es in s vorhanden ist (-1 wenn nicht)
- posex('ch', s, 3) wie pos, jedoch sucht es erst ab Position 3
- copy(s,2,5) gibt dir den Bereich des String zwischen der Position 2 und 5 wieder (kopiert also den Bereich)
Wenn du dir damit Gedanken machst hast du genug Möglichkeiten wie du die Wörter einliest.
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
Für diesen Beitrag haben gedankt: Thunfisch
|
|
Thunfisch 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 23.06.11 13:34
Super
Vielen Dank an euch
Läuft jetzt sogut wie alles
Thunfisch
|
|
Stundenplan
      
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: Do 23.06.11 15:46
Webo hat folgendes geschrieben : | copy(s,2,5) gibt dir den Bereich des String zwischen der Position 2 und 5 wieder (kopiert also den Bereich) |
Nicht ganz. Copy(s, 2, 5) kopiert dir den Bereich ab Position 2 mit der Länge 5!
Viele Grüße,
Stundenplan.
Für diesen Beitrag haben gedankt: Thunfisch
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Do 23.06.11 16:19
Hey,
als Ergänzung: dafür gibts es auch vorgefertigte Methoden. z.B. über eine Stringlist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var List: TStringList;
List := TStringList.Create; try List.Delimiter := '#'; List.DelimitedText := '1#fisch#fish#chicken'; List[0] List[1] finally List.Free; end; |
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
Für diesen Beitrag haben gedankt: Thunfisch
|
|
Webo
      
Beiträge: 577
Erhaltene Danke: 14
Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
|
Verfasst: Do 23.06.11 16:34
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 23.06.11 16:52
Bergmann89 hat folgendes geschrieben : | als Ergänzung: dafür gibts es auch vorgefertigte Methoden. z.B. über eine Stringlist: |
Die Stringlist trennt aber auch bei Leerzeichen, wenn keine Anführungszeichen gesetzt sind. Erst bei neueren Delphiversionen gibt es dagegen StrictDelimiter, aber das kam erst mit Delphi 2006 oder so, evtl. auch schon D7. Aber bei D6, das er nutzt, gab es das auf jeden Fall noch nicht.
|
|
Thunfisch 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 23.06.11 19:13
Habe mir grade ne neuere Version von meinem Lehrer zukommen lassen.
Die ist 7.0 - kann ich damit StrictDelimiter benutzen?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 23.06.11 19:28
Jetzt zu Hause habe ich gerade nachgeschaut, nein, wie ich schon dachte geht es da noch nicht. StrictDelimiter wurde mit Delphi 2006 eingeführt, Delphi 1-7 und 2005 kannten das noch nicht.
Es selbst zu machen ist aber ohnehin die bessere Übung. 
|
|
Thunfisch 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 28.06.11 22:21
Bergmann89 hat folgendes geschrieben : | Hey,
als Ergänzung: dafür gibts es auch vorgefertigte Methoden. z.B. über eine Stringlist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var List: TStringList;
List := TStringList.Create; try List.Delimiter := '#'; List.DelimitedText := '1#fisch#fish#chicken'; List[0] List[1] finally List.Free; end; |
MfG Bergmann. |
Dazu habe ich nochmal eine Frage:
Bei List.DelimitedText := '1#fisch#fish#chicken'; was genau muss ich da eintragen? Nimmt der diesen String dann als Muster? Oder sollte ich da Variablen eintragen? (Vok.deutsch, Vok.Id , usw.?)
Sorry wenn ich den Thread unnötigerweise pushe, aber einen neuen Thread zu erstellen erschien mir überflüssig.
Mfg Thunfisch 
|
|
MDX
      
Beiträge: 595
Erhaltene Danke: 4
Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
|
Verfasst: Di 28.06.11 23:18
Mhm, also für die Trennung von einer Vokabel in die "drei" Sprachen kannst du auch Explode nutzen...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; var SepLen: Integer; F, P: PChar; ALen, Index: Integer; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); ALen := Limit; SetLength(Result, ALen);
Index := 0; P := PChar(S); while P^ <> #0 do begin F := P; P := AnsiStrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); if Index >= ALen then begin Inc(ALen, 5); SetLength(Result, ALen); end; SetString(Result[Index], F, P - F); Inc(Index); if P^ <> #0 then Inc(P, SepLen); end; if Index < ALen then SetLength(Result, Index); end; |
|
|
Thunfisch 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 28.06.11 23:43
Das ist mir um ehrlich zu sein ein bisschen zu kompliziert :/
Da würde ich lieber die obengenannte Problemlösung nehmen ..
|
|
MDX
      
Beiträge: 595
Erhaltene Danke: 4
Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
|
Verfasst: Di 28.06.11 23:51
Mh eigentlich ganz easy, du deklarierst einfach:
Delphi-Quelltext 1:
| type TSTringdynarray = array of String; |
Dann deklarierst du eine Variable als Array und machst dann einfach:
Delphi-Quelltext 1:
| Variable:=Explode(String,'#'); |
dann hast du zum Beispiel Deutsch in Variable[0]; und Englisch1 in Variable[1];
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 29.06.11 05:55
Thunfisch hat folgendes geschrieben : | Bei List.DelimitedText := '1#fisch#fish#chicken'; was genau muss ich da eintragen? |
Den String, den du auseinander nehmen willst.
Aber wie gesagt: Es dürfen bei dieser Methode keine Leerzeichen drin vorkommen, sonst wird bei deinem Delphi dort auch getrennt.
|
|
Thunfisch 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 29.06.11 15:42
Es kommen keine Leerzeichen vor
Dafür habe ich schon gesorgt
@ Jaenicke
Kann ich da auch Tstringarray[i] eintragen?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| function TForm1.StrToVokabelInfo(Str: String): TVokabelInfo;
var temp: TVokabelInfo; i, j: Integer; tempID: String; begin j := 1;
for i := 1 to Length(Str) do begin if Str[i] = '#' then Inc(j);
if j = 1 then begin if Str[i] <> '#' then begin tempID := TempID + Str[i]; end; end;
if j = 2 then begin if Str[i] <> '#' then begin temp.Deutsch := temp.Deutsch + Str[i]; end; end;
if j = 3 then begin if Str[i] <> '#' then begin temp.Englisch := temp.Englisch + Str[i]; end; end;
end;
temp.ID := STRTOINT(tempID);
if ADMIN then ShowMessage('Vokabel ' + IntToStr(temp.Id) + ', deutsch: ' + temp.Deutsch + ', englisch: ' + temp.Englisch); |
Kann mir einer sagen, wo da der fehler ist  ?
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 29.06.11 16:22
|
|