| Autor |
Beitrag |
beljo
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 09:01
Hallo Leute,
würde gerne wissen wie man auf die Elemente einer Liste zugreifen kann.(Bin leider noch voll der Anfänger) Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var i:Integer; b:String; c:array[1..1000] of string; begin
if OpenDialog1.execute then begin Liste := TStringList.Create; Liste.LoadFromFile(opendialog1.filename); Memo1.lines.LoadfromFile(opendialog1.filename); i:=0; repeat c[i]:=(Liste[i]); i:=i+1; until EndOfList=true; Liste.Free; end; end; |
Ich lade hier ein Textfile in eine Liste und versuche die einzelnen Strings in mein Array einzulesen. Leider Lese ich die komplette Zeile an der Stelle [i] ein und nicht den ersten String.Mit dem Memofeld schaue ich mir das File an.
die Textdatei sieht so aus
a b c d
e f g h
usw. Auserdem klappt meine Abruchbedingung auch nicht (EndofList ist doch ein Boolean?).
Hoffe jemand weis Rat
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 09:23
Abbruchbedingung hab ich hinbekommen, Delphi-Quelltext 1: 2: 3: 4: 5:
| for i := 0 to Liste.Count - 1 do begin c[i]:=(Liste[i]);
end; |
Der Rest des Problems bleibt leider vorhanden 
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 12.04.06 09:39
Hallo,
Um einzelne Worte aus einem Satz zu bekommen kannst Du einer anderen Stringliste diese Zeile als delimitedtext zuweisen.
Man kann auch slWorte.delimiter noch anpassen, bei mir war es nur so, dass ' ' immer ein delimiter war, auch wenn ich nur ';' haben wollte..
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| slWorte := TStringlist.create; sLWorte.DelimitedText := Liste[i]; j := 0;for i := 0 to Liste.Count - 1 do begin sLWorte.DelimitedText := Liste[i]; For k := 0 to sLWorte.count-1 do c[j+k]:=sLWorte[k]; j := j+sLWorte.count; end; |
Obacht geben, dass nicht j >= 1000 = MAX(c) ist.
Gruss Horst
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 09:54
Danke ertmal Horst.
Aber ich muss doch DelimitedText irgenwdwo Deklarieren, oder?
Delphi kennt jedenfalls DelimitedText nicht.
Felermeldung[Error] Unit1.pas(47): Undeclared identifier: 'DelimitedText'.
Wo und wie Deklariere DelimitedText ?
|
|
der Berliner
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mi 12.04.06 10:06
Hallo
Ich glaube dein Fehler liegt bei Array Dimensionieren du hast
| Zitat: | | c:array[1..1000] of string; |
Füllst das Array aber beginnend mit Index = 0
| Zitat: | | For i:=0 to Liste.Count-1 do begin |
Schreib mal
| Zitat: | | c:array[0..1000] of string; |
Gruß
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 10:16
Nett gemeint Andre, aber das ist nicht der Fehler.
Hat ja direkt nichts damit zutun das Delphi nicht DelimitedText kennt.
Fehler bleibt vorhanden, siehe Oben
|
|
der Berliner
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mi 12.04.06 10:17
Welches Delphi benutzt du denn ?
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 10:26
Delphi 5.
Ich poste mal den Treat den ich bis jetzt habe. 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:
| procedure TForm1.Button1Click(Sender: TObject); var k,j,i:Integer; b:String; c:array[0..1000] of string; begin
if OpenDialog1.execute then begin i:=0; Liste := TStringList.Create; Liste.LoadFromFile(opendialog1.filename); Memo1.lines.LoadfromFile(opendialog1.filename); slWorte := TStringlist.create; sLWorte.DelimitedText := Liste[i]; j:=0; for i := 0 to Liste.Count - 1 do begin
sLWorte.DelimitedText := Liste[i];
For k := 0 to sLWorte.count-1 do c[j+k]:=sLWorte[k];
j := j+sLWorte.count; end; |
Sofern es nicht möglich ist mit Delphi 5 kann ich vieleicht über Delet was machen?
|
|
der Berliner
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mi 12.04.06 10:46
Also ich kann dir erstmal soviel sagen so wie du es hast funktioniert es mit delphi 2005.
j zeigt die Anzahl der Wörter einer Textdatei an.
Also scheint Die 5ver Version Delimiter noch nich zu kennen.
werde aber weiter mal darüber nachdenken wie man das auch ohne Delimiter lösen kann.
gruß
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 12.04.06 10:58
Hallo,
DelimitedText ist erst ab D6 vorhanden.
Dafür kann man folgende Prozedur(in D3) als Alternative verwenden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure BreakLines(line: String; s: TStrings; delimiter: Char); var i: Integer; begin for i := 1 to Length(line) do if line[i] = delimiter then line[i] := #13; s.Text := line; end; |
Die Prozedur ersetzt alle, im Argument Delimiter angegebenes Zeichen, durch #13.
Durch die Zuweisung des so veränderten Strings an TStrings.Text wird der String mit Hilfe des internen Parsers aufgeteilt.
Innerhalb Deine Prozedur würde der Aufruf dann so aussehen:
Delphi-Quelltext 1:
| BreakLines(Liste[i],slWorte,' '); |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
nullplan001
      
Beiträge: 212
Win 2000 Professional, Debian Linux 4.0 (Etch,Stable)
Pascal (FreePascal 2.0.2, TurboPascal 7.0), C(++) (G++/GCC 3.4.2 + MinGW), Java (JDK 1.5.0_07), PHP (PHP 5.1.4)
|
Verfasst: Mi 12.04.06 11:03
Hi all,
Wenn es nicht einfach geht, mach es komplizierter. OK, Delphi kennt kein DelimitedText, aber du kannst doch so etwas selbst schreiben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure MakeTextDelimited(str:string; Delimiter: char;var OutputArray : Array[m .. n: word] of String); var i,j, count : integer;
begin j := 1; count := m; for i := 1 to byte(str[0]) do begin if str[i] = Delimiter then begin OutputArray[count] := copy(str,j,i - j); j := i; inc(count); end; if count > n then break; end; end; |
So müsste es gehen. Falls der Compiler bei meiner Deklaration eines dynamischen Arrays rummeckern sollte: Entferne die eckigen Klammer und ihren Inhalt, setze count von Anfang an auf 1 oder 0 proklamiere, dass alle eingefügten Arrays erst ab Element Nr. 1 gefüllt werden. Statt n benutzt du sizeof(OutputArray) / 256.
Tschö,
nullplan
_________________ Ich fahr' nicht selber, weil ich festgestellt habe: ich fahre zu emotional. Bin 180 gefahren wo 30 erlaubt war... -- Jürgen von der Lippe
Zuletzt bearbeitet von nullplan001 am Do 13.04.06 09:30, insgesamt 1-mal bearbeitet
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 12:16
@Lannes
Ich habe Deinen Vorschlag übernommen und hier mein Treat 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:
| procedure BreakLines(line: String; s: TStrings; delimiter: Char); var i: Integer; begin for i := 1 to Length(line) do if line[i] = delimiter then line[i] := #13; s.Text := line; end; procedure TForm1.Button1Click(Sender: TObject); var k,j,i:Integer; b:String; c:array[0..1000] of string; begin
if OpenDialog1.execute then begin i:=0; Liste := TStringList.Create; Liste.LoadFromFile(opendialog1.filename); Memo1.lines.LoadfromFile(opendialog1.filename); slWorte := TStringlist.create; BreakLines(Liste[i],slWorte,' '); j:=0; for i := 0 to Liste.Count - 1 do begin BreakLines(Liste[i],slWorte,' '); For k := 0 to sLWorte.count-1 do c[j+k]:=sLWorte[k]; j := j+sLWorte.count; end; end; edit1.text:=C[2]; end; |
In der vorletzten Zeile will ich den Inhalt des Arrays an der Stelle [2] darstellen, nur es wird nichts angezeigt,warum???
Der Array müsste doch eigendlich "randvoll" sein,oder?
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 12:44
Liegt es vielleicht daran das in dem Textfile bzw. in der Stringlist nur Zahlen drin sind?
123123 123123 1231
12312 23 3123 123 usw.
Daran kann es Ddoch eugendlich nicht leigen da Delphi sie doch auch als Strings sieht, oder?
|
|
der Berliner
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mi 12.04.06 12:45
Also Bei mir zeigt er den 3.ten Buchstaben
wenn meine datei si aussieht:
a b c
d e f usw.
bei
123123 321321
123321 234321
Edit: Sorry mein Fehler hatte C[4] gesetzt und das ist nunmal '' .ES FUNKTIONIERT.
zeigt er auch nischt an
Gruß
Zuletzt bearbeitet von der Berliner am Mi 12.04.06 13:00, insgesamt 2-mal bearbeitet
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 12.04.06 12:47
Hallo,
Schau Dir doch alle Daten an und nicht nur c[2].
Vielleicht folgen ja auch nur mehrere ' ' aufeinander.
Gruss Horst
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 12:53
Also bei mir klappts jetzt auch, aber nur bei Dateien mit Text,
Die Dateien die ich aber einlesen will sind reine Zahlenkolonnen (siehe letzter Beitrag).
Warum werden die den nicht eingelesen????Für Delphi sind das doch alles Strings (egal ob 123 oder abc) oder????
(jedenfalls habe ich es so gelernt)
|
|
der Berliner
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mi 12.04.06 13:01
Siehe oben bei mir funktioniert es auch mit Zahlenkollonnen.
|
|
beljo 
      
Beiträge: 129
|
Verfasst: Mi 12.04.06 13:18
ok hab mir alle Elemente angschaut, alles ok.
Danke nochmals
|
|