Entwickler-Ecke

Dateizugriff - Inhalt einer Textdatei in eine variable speichern


spoof - Mi 16.10.13 14:30
Titel: Inhalt einer Textdatei in eine variable speichern
Hallo, ich versuche eine Txt Datei einzulesen über ein Editfeld, der Inhalt soll in eine Variable gespeichert werden um so den Inhalt der Txt zu bearbeiten und bestimmte Dinge später in einer Tabelle auszugeben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 private
    { Private-Deklarationen }
    loadedfile:TStringList;
  public
    { Public-Deklarationen }
  end;


procedure TForm1.ED_FileChange(Sender: TObject);
begin

   if OD_File.Execute then
  begin
    ED_File.Text:=OD_File.FileName;
    loadedfile.LoadFromFile(OD_File.FileName);
  end;


Mein Problem ist, wenn ich die txt nun anklicke und reinladen will bringt er mir einen Fehler.
Der Fehler tritt in dieser Zeile auf:

Delphi-Quelltext
1:
loadedfile.LoadFromFile(OD_File.FileName);                    

Ich habe bisher noch nie mit TStringList gearbeitet und weiß nicht ob dort vllt der Fehler liegt.
Die Txt hat btw mehrere Tausend Zeilen, ka ob das eine Rolle spielt.

Kann mir wer sagen wie ich es hin bekomme den Inhalt der Txt in eine Variable zu bekommen?


Mathematiker - Mi 16.10.13 14:34

Hallo,
Du hast vergessen die Stringliste zu erzeugen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if OD_File.Execute then
  begin
    ED_File.Text:=OD_File.FileName;
    loadedfile:=tstringlist.create;    //erzeugen
    loadedfile.LoadFromFile(OD_File.FileName);
  end;

Natürlich wirst Du die Stringliste am Ende, wenn Du sie nicht mehr brauchst, auch wieder mit loadedfile.free freigeben müssen.

Beste Grüße
Mathematiker


spoof - Mi 16.10.13 14:49

Vielen dank, funktioniert.
Noch eine Frage zum freigeben, es wird in meinem Edit eingelesen, ich arbeite damit im Code des Buttons und in den füge ich noch ein:


Delphi-Quelltext
1:
2:
3:
4:
5:
try
->>>>>>>>mein code<......

finally
loadedfile.free;




Stimmt das so?
Btw was genau macht das freigeben und warum muss man das createn versteh ich auch nicht, ich hab doch in private eine variable erstellt?!


Mathematiker - Mi 16.10.13 15:04

Hallo,
user profile iconspoof hat folgendes geschrieben Zum zitierten Posting springen:

Noch eine Frage zum freigeben, es wird in meinem Edit eingelesen, ich arbeite damit im Code des Buttons und in den füge ich noch ein:

Delphi-Quelltext
1:
2:
3:
4:
5:
try
->>>>>>>>mein code<......

finally
loadedfile.free;

Sieht gut aus. Das müsste funktionieren.

TStringlist ist eine Klasse von der Du ein Objekt erzeugen musst. Das geschieht mit create.
TStringList wird in einigen Komponenten der VCL verwendet, z.B. im TMemo. Bei der Verwendung von VCL-Klassen, z.B. eben TMemo, wird create automatisch ausgeführt. In Deinem Fall, wenn Du eine eigene Variable festlegst, musst Du Dich selbst kümmern.
Jedes Objekt, dass Du selbst herstellst, musst Du auch mit free wieder freigeben, ansonsten drohen Speicherlecks.

Beste Grüße
Mathematiker


baumina - Mi 16.10.13 15:14

Wenn du eine Variable ausschließlich innerhalb einer procedure verwendest, macht es Sinn, diese auch nur dort lokal zu deklarieren.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.ED_FileChange(Sender: TObject);
var
  loadedfile : TStringList;  

begin
  loadedfile := TStringList.Create;  
 ....
  loadedfile.Free;
end;


Wird diese Variable im ganzen Formular benötigt, deklarierst du diese in deinem TForm. Bezeichnet diese Variable ein Objekt, macht es Sinn ein create innerhalb von FormCreate und ein free innerhalb von FormDestroy aufzurufen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
 private
    { Private-Deklarationen }
    loadedfile : TStringList;
  public
    { Public-Deklarationen }
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  loadedfile := TStringList.Create;  
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  loadedfile.Free;
end;