Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mit Savedialog bestimmte Zeilen in txt Datei speichern


AlffromMelmac - Di 03.01.06 13:29
Titel: Mit Savedialog bestimmte Zeilen in txt Datei speichern
Hallo,


ich bin Delphi Anfänger und ich häng gerade an einem Problem;
Ich möchte mit dem Savedialog div. Edits in bestimmte Zeilen einer txt-File speichern;
(--> Habs über Actionlist und über Savedialog probiert);
Kann das Prog auch starten, betätige den entsprechenden Button und das Prog zeigt das Fenster an wohin ich die Datei haben will und wie sie heißen soll (Standard-Fenster halt); Alledings wenn ich speichern will, dann meldet er nach der Speicherung Listenindex überschreitet Maximum (1); Sieht jdm. meinen Fehler? Ich wollte schauen dass es ohne die add-Methode (z.B. add. edit1)b geht; Kann mir jdm. weiterhelfen?
Vielen Dank im Voraus,


P.S.: Noch der Quellcode der entsprechenden Stelle


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm2.SaveExecute(Sender: TObject); 
var 
sl: TStrings; 
zeile1, zeile2, zeile3 : string

begin 
if savedialog1.Execute then 
begin 
if Savedialog1.FileName <> '' then 
begin 
sl:= TStringList.Create; 
zeile1:= sl [1]; 
zeile2:= sl [2]; 
zeile3:= sl [3]; 
sl.Free; 
edit1.Text:= zeile1; 
edit2.Text:= zeile2; 
edit3.Text:= zeile3; 
sl.savetoFile (SaveDialog1.Filename) ; 
end
end
end;


zum Vergleich:
mit opendialog funktionierts;


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:
procedure TForm2.OeffnenExecute(Sender: TObject); 
var 
s: TStrings; 
zeile1, zeile2, zeile3 : string

begin 
If Opendialog1.Execute then 
begin 
if Fileexists (Opendialog1.FileName) then 
begin 

s:= TStringList.Create; 
s.LoadFromFile (OpenDialog1.Filename) ; 
zeile1:= s [1]; 
zeile2:= s [2]; 
zeile3:= s [3]; 
s.Free; 
edit1.Text:= zeile1; 
edit2.Text:= zeile2; 
edit3.Text:= zeile3; 
end
end
end;


Moderiert von user profile iconGausi: Beitragsformatierung überarbeitet.


matze.de - Di 03.01.06 13:35

Man könnte es so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Procedure TForm1.Save(AFileName: String);
Var
    IO: TextFile;
Begin
    AssignFile(IO, AFileName);
    ReWrite(IO);
    Try
      WriteLn(IO, 'Hallo');
      WriteLn(IO);
      WriteLn(IO, 'Die ist ein Text in einer Textdatei.');
    Finally
      CloseFile(IO);
    End;
End;


Hoffe ich hab keine Fehler.

mfg matze


Martin1966 - Di 03.01.06 13:37

Hallo! :wink2: Willkommen im Delphi-Forum!

Hast du mal genau geschaut was die Funktion SaveExecute macht? Die hast du wohl von der Load Procedure kopiert. ;-)

Ich markiere mal die Stellen die falsch sind:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm2.SaveExecute(Sender: TObject);
var
  sl: TStrings;
  zeile1, zeile2, zeile3 : string;
begin
  if savedialog1.Execute then
  begin
    if Savedialog1.FileName <> '' then
    begin
      sl:= TStringList.Create;
      zeile1:= sl [1];
      zeile2:= sl [2];
      zeile3:= sl [3];

      sl.Free;
      edit1.Text:= zeile1;
      edit2.Text:= zeile2;
      edit3.Text:= zeile3;

      sl.savetoFile (SaveDialog1.Filename) ;
    end;
  end;
end;


Weist du was du falsch gemacht hast?

Lg Martin


Gausi - Di 03.01.06 13:39

Hallo und :welcome: in der Entwickler-Ecke!

Du musst beim Speichern die Reihenfolge umdrehen:

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 TForm2.SaveExecute(Sender: TObject);    
var    
sl: TStrings;    
zeile1, zeile2, zeile3 : string;    

begin    
if savedialog1.Execute then    
begin    
if Savedialog1.FileName <> '' then    
begin    
  zeile1 := edit1.Text;    
//entsprechend zeile2, zeile3

  sl := TStringList.Create;    
  sl[1] := zeile1;    
// usw.

// Dann speichern
  sl.savetoFile (SaveDialog1.Filename) ;    

// dann wieder freigeben
  sl.Free;    
end;    
end;    
end;


Martin1966 - Di 03.01.06 13:49

user profile iconGausi hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
  sl := TStringList.Create;
  sl[1] := zeile1;    
// usw.

Das wird wohl zu eimem Fehler führen.

Besser so:

Delphi-Quelltext
1:
2:
3:
  sl := TStringList.Create;
  sl.Add (zeile1);
// usw.


lg Martin


Gausi - Di 03.01.06 14:02

Hmm. Da könntest du Recht haben. Da war ich mit meiner Fehlerkorrektur wohl etwas voreilig.


Martin1966 - Di 03.01.06 14:34

Macht ja nichts.

Deine Hauptaussage: "Du musst beim Speichern die Reihenfolge umdrehen" war ja entscheidend um das Problem zu lösen. ;-)

Lg Martin


AlffromMelmac - Di 03.01.06 14:46

Danke euch, für die schnelle Antwort;
Aber wird bei sl.Add(Zeile1) nicht nur der Inhalt von Edit1,2,3, usw. untereinander je in eine Zeile geschrieben also angehängt?
Gäbe es hier eine Möglichkeit dass z.B. edit15 klar definiert ist als Zeile 15 im Textdokument? So ähnlich wie der opendialog Vorgang (s.o.);
Grüße


Martin1966 - Di 03.01.06 15:13

user profile iconAlffromMelmac hat folgendes geschrieben:
Aber wird bei sl.Add(Zeile1) nicht nur der Inhalt von Edit1,2,3, usw. untereinander je in eine Zeile geschrieben also angehängt?

Ja.

user profile iconAlffromMelmac hat folgendes geschrieben:
Gäbe es hier eine Möglichkeit dass z.B. edit15 klar definiert ist als Zeile 15 im Textdokument?

Genauso ist es auch. Wenn Du folgendes schreibst:

Delphi-Quelltext
1:
2:
3:
4:
5:
SL.Add (Edit1.Text);  // Edit1.Text = 'Zeile1'
SL.Add (Edit2.Text);  // Edit1.Text = 'Zeile2'
SL.Add (Edit3.Text);  // Edit1.Text = ''
SL.Add (Edit4.Text);  // Edit1.Text = 'Zeile4'
SL.Add (Edit5.Text);  // Edit1.Text = 'Zeile5'

Dann sieht die Datei die du anschl. erstellst so aus:

Quelltext
1:
2:
3:
4:
5:
Zeile1
Zeile2

Zeile4
Zeile5

Wie du siehst, ist trotz des leeren Edit3 Feldes in Zeile 4 und 5 der richtige Eintrag aus den Edit-Felder 4 und 5.

Lg Martin


AlffromMelmac - Di 03.01.06 15:26

Ok, super; Danke dir; "Programmier" grad mal 2 Wochen oderso, drum hab brauch ich manchmal länger ;-)
Also danke,
Grüße,