Autor Beitrag
beljo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: 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)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: Mi 12.04.06 09:23 
Abbruchbedingung hab ich hinbekommen,
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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..
ausblenden 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;//Anzahl der Worte;
for i := 0 to Liste.Count - 1 do   
  begin   
  //Worte der Zeile in Stringliste packen
  sLWorte.DelimitedText := Liste[i];
  //die einzelnen Worte einfuegen
  For k := 0 to sLWorte.count-1 do
    c[j+k]:=sLWorte[k];   
  //Den Index in c anpassen
  j := j+sLWorte.count;
  end;
//j enthaelt jezt die Anzahl der Worte

Obacht geben, dass nicht j >= 1000 = MAX(c) ist.

Gruss Horst
beljo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 417

Win Xp Home
delphi 2005
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 417

Win Xp Home
delphi 2005
BeitragVerfasst: Mi 12.04.06 10:17 
Welches Delphi benutzt du denn ?
beljo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: Mi 12.04.06 10:26 
Delphi 5.
Ich poste mal den Treat den ich bis jetzt habe.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 417

Win Xp Home
delphi 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 12.04.06 10:58 
Hallo,

DelimitedText ist erst ab D6 vorhanden.
Dafür kann man folgende Prozedur(in D3) als Alternative verwenden:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
BreakLines(Liste[i],slWorte,' ');					

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
nullplan001
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: Mi 12.04.06 12:16 
@Lannes
Ich habe Deinen Vorschlag übernommen und hier mein Treat
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:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 417

Win Xp Home
delphi 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: Mi 12.04.06 12:53 
:shock: :shock: :shock:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 417

Win Xp Home
delphi 2005
BeitragVerfasst: Mi 12.04.06 13:01 
Siehe oben bei mir funktioniert es auch mit Zahlenkollonnen.
beljo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 129



BeitragVerfasst: Mi 12.04.06 13:18 
ok hab mir alle Elemente angschaut, alles ok.
Danke nochmals