Autor Beitrag
Thunfisch
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 77
Erhaltene Danke: 10



BeitragVerfasst: Do 23.06.11 11:38 
Du kannst z.B. ein record benutzen
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 23.06.11 11:44 
Jo fast genau den benutze ich ;)

Aber mir gehts ja mehr ums Auslesen
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 77
Erhaltene Danke: 10



BeitragVerfasst: Do 23.06.11 12:08 
Du kannst die txt-Datei in eine Stringlist laden
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var vokabelliste: TStringlist;

vokabelliste := TStringlist.Create;
vokabelliste.LoadFromFile(xxx.txt);

und dann auf die Zeilen mit
ausblenden Delphi-Quelltext
1:
vokabelliste.Strings[i]					

zugreifen.

Für diesen Beitrag haben gedankt: Thunfisch
Webo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: 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 user profile iconMaxWurzel 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 23.06.11 13:34 
Super :D

Vielen Dank an euch :)
Läuft jetzt sogut wie alles


Thunfisch
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Do 23.06.11 15:46 
user profile iconWebo hat folgendes geschrieben Zum zitierten Posting springen:
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, 25) kopiert dir den Bereich ab Position 2 mit der Länge 5! :idea:

Viele Grüße,
Stundenplan.

Für diesen Beitrag haben gedankt: Thunfisch
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: Do 23.06.11 16:19 
Hey,

als Ergänzung: dafür gibts es auch vorgefertigte Methoden. z.B. über eine Stringlist:

ausblenden 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//Zugriff auf ID
  List[1//Zugriff auf Deutsch
  {...}
finally
  List.Free;
end;


MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Thunfisch
Webo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 577
Erhaltene Danke: 14

Win 7, Debian
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop)
BeitragVerfasst: Do 23.06.11 16:34 
user profile iconStundenplan hat folgendes geschrieben Zum zitierten Posting springen:

Nicht ganz. ;-) Copy(s, 25) kopiert dir den Bereich ab Position 2 mit der Länge 5! :idea:

Stimmt, jetzt wo du es sagst 8) Gut, dass immer wer aufpasst ...

_________________
Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 23.06.11 16:52 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 28.06.11 22:21 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,

als Ergänzung: dafür gibts es auch vorgefertigte Methoden. z.B. über eine Stringlist:

ausblenden 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//Zugriff auf ID
  List[1//Zugriff auf Deutsch
  {...}
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Di 28.06.11 23:18 
Mhm, also für die Trennung von einer Vokabel in die "drei" Sprachen kannst du auch Explode nutzen...

ausblenden volle Höhe 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:
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 < 0then 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 = nilor ((Limit > 0and (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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Di 28.06.11 23:51 
Mh eigentlich ganz easy, du deklarierst einfach:

ausblenden Delphi-Quelltext
1:
type TSTringdynarray = array of String;					


Dann deklarierst du eine Variable als Array und machst dann einfach:

ausblenden Delphi-Quelltext
1:
Variable:=Explode(String,'#');					


dann hast du zum Beispiel Deutsch in Variable[0]; und Englisch1 in Variable[1];
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.06.11 05:55 
user profile iconThunfisch hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 29.06.11 15:42 
Es kommen keine Leerzeichen vor
Dafür habe ich schon gesorgt :D

@ Jaenicke
Kann ich da auch Tstringarray[i] eintragen?


ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
function TForm1.StrToVokabelInfo(Str: String): TVokabelInfo;
// Auslesen des VokabelStrings aus der Textdatei
// + Eintragen in Temporären Record mit anschließendem Eintragen in den globalen geladenen Vokabelrecord

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 :D?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.06.11 16:22 
user profile iconThunfisch hat folgendes geschrieben Zum zitierten Posting springen:
Kann mir einer sagen, wo da der fehler ist :D?
Der Fehler ist, dass du die Fehlerbeschreibung vergessen hast. :zwinker:

Jedenfalls hat j den Wert 1. Da du den nie änderst, können die anderen if-abfragen auf j = 2 und j = 3 nie true ergeben.