Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - For Next Schleife funktioniert nicht richtig [done]


cromos - Sa 23.08.03 16:42
Titel: For Next Schleife funktioniert nicht richtig [done]
Hallo.

ich möchte den Inhalt eines ListView in einer CSV-Datei schreiben, damit Exel diese Lesen kann.

mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 index:=ListView1.Items.Count - 1;
      For il := 0 to Index do
        begin
          TestStr := ListView1.Items.Item[il].Caption + ';' 
           + Listview1.Items.Item[il].SubItems[0] + ';' 
           + Listview1.Items.Item[il].SubItems[1] + ';' 
           + Listview1.Items.Item[il].SubItems[2] + ';'
           + Listview1.Items.Item[il].SubItems[3] + ';'
           + Listview1.Items.Item[il].SubItems[4];
          
          SaveStringToFile(ProgrammOrdner + 'test.csv', Teststr);
          label6.Caption := TestStr;
          index := Index +1;
        end;

schreibt er immer nur den letzten Eintrag rein.

Wo ist der Fehler?

Moderiert von user profile iconTino: Titel geändert; Delphi-Tags hinzugefügt.


MSCH - Sa 23.08.03 17:07
Titel: Re: For??
cromos hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
 index:=ListView1.Items.Count - 1;
-->      For il := 0 to Index do
-->          index := Index +1; wech damit !!
        end;


anders:

Delphi-Quelltext
1:
2:
3:
4:
5:
  asignFile(F,'Test.csv');
     For il := 0 to istView1.Items.Count - 1 do begin
       writeln(F,...,...,....,);
     end;
  Closefile(F);

1. schau dir mal dein code an !
2. siehe die Ergänzung

grez
msch

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


cromos - Sa 23.08.03 19:15

Keine Ahnung was Du meinst. Werde nicht wirklich schlau daraus.
Was soll denn da anders ein?

Was meinst du mit

Zitat:

writeln(F,...,...,....,);


Was kommt da hin?
Als was wird F Deklariert? In der OH steht das es String sein muss.
Bekomme aber ein Fehler "Inkompatible Datentypen"

:?:


MSCH - Sa 23.08.03 20:01

erstens erhöhst du die ForSchleifenendbedingung "Index" innerhalb der Schleife. Zweitens sicherst du nur einen String "Teststring" via unbekannter Procedure SaveStringToFile(). Imho überschreibst du damit immer den vorhergehenden Satz und behälst somit nur den letzten.

F ist eine Textvariable
Writeln (F, ...,..,..) sollte andeuten, dass du via WriteLn in die Textdatei anfügst und zwar den Text (....). also
writeln(F,ListView.Item.Caption,';',ListView.Item.SubItem[1]..u.s.w.).

ok?
grez
msch


cromos - So 24.08.03 12:04

Also,
danach sollte es so richtig sein???!!!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var TestStr : String;
var F : TextFile;
var il : integer;
begin
ProgrammOrdner:=ExtractFilePath(application.ExeName);
TestStr := ListView1.Items.Item[il].Caption + ';' 
  + Listview1.Items.Item[il].SubItems[0] + ';' 
  + Listview1.Items.Item[il].SubItems[1] + ';' 
  + Listview1.Items.Item[il].SubItems[2] + ';'
  + Listview1.Items.Item[il].SubItems[3] + ';'
  + Listview1.Items.Item[il].SubItems[4];

assignFile(F,ProgrammOrdner + 'Test.csv');
     For il := 0 to ListView1.Items.Count - 1 do begin
       writeln(F,TestStr);
     end;
  Closefile(F);
end;


Tut aber nicht. Ausser

Exception
:?:

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Tryer - So 24.08.03 12:13

Vielleicht solltest Du "il" initialisieren.
Ansonsten ist die Aussage "nix ausser Exception" etwas schwach, es gibt nämlich mehr als eine ;)

MfG,
Tryer


cromos - So 24.08.03 12:15

Wenn ich es so mache:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
writeln(F,ListView1.Items.Item[il].Caption,';',
    Listview1.Items.Item[il].SubItems[0],';',
    Listview1.Items.Item[il].SubItems[1],';',
    Listview1.Items.Item[il].SubItems[2],';',
    Listview1.Items.Item[il].SubItems[3],';',
    Listview1.Items.Item[il].SubItems[4]
  );

bekomme ich auch ein Exception. E/A Fehler 103 oder sowas in der Art.

Wieso?

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


MSCH - So 24.08.03 12:16

es fehlt Rewrite(F) bzw. Append(F)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var TestStr : String
var F : TextFile; 
var il : integer; 
begin 
ProgrammOrdner:=ExtractFilePath(application.ExeName); 
assignFile(F,ProgrammOrdner + 'Test.csv'); 
rewrite(F); // überschreibt wenn vorhanden !!
For il := 0 to ListView1.Items.Count - 1 do begin 
  TestStr := ListView1.Items.Item[il].Caption + ';' 
    + Listview1.Items.Item [il].SubItems[0] + ';' 
    + Listview1.Items.Item[il].SubItems[1] + ';' 
    + Listview1.Items.Item[il].SubItems[2] + ';'
    + Listview1.Items.Item[il].SubItems[3] + ';'
    + Listview1.Items.Item[il].SubItems[4]; 
       writeln(F,TestStr); 
     end
  Closefile(F); 
end;


grez
msch


cromos - So 24.08.03 12:18

Zitat:

Vielleicht solltest Du "il" initialisieren.


Was meinst Du damit?


cromos - So 24.08.03 12:22
Titel: Es hat Funktioniert
Ja, so klappt das ganze.

Also lag es nur an

Quelltext
1:
rewrite(F);                    



Vielen Dank für die Hilfe.

Gruss
Cromos


kat1 - Mo 25.08.03 18:54

Ich wäre aber vorsichtig mit der Verwendung von ReWrite. Existiert das File schon, wird es einfach gelöscht, ohne dass Du eine Warnung erhältst, und überschrieben.

Vielleicht solltest Du noch eine Abfrage einbauen:


Delphi-Quelltext
1:
2:
if FileExists('test.csv'then
 ....

und dort eine Fehlermeldung produzieren.


cromos - Di 26.08.03 00:21

Zitat:

Ich wäre aber vorsichtig mit der Verwendung von ReWrite. Existiert das File schon, wird es einfach gelöscht, ohne dass Du eine Warnung erhältst, und überschrieben.


Ist in diesem Fall egal. Ich gehe ja über einen FileSave Dialog.

Gruss
Cromos