Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
Delphi 2005 Professional
|
Probleme mit TStrings
25. Mär 2004, 01:30
hallo. Ich möchte eine TStrings-Element(von einen Memofeld) per Stream zusammen mit anderen Dateien abspeichern.
Soweit ist auch alles in ordnung. Das Auslesen funktioniert einbandfrei, wenn man vorher abspeichert!!! Wenn ich jedoch gleich bei Programmstart auslesen will, erhalte ich eine Zugriffsverletzung.
Delphi-Quellcode:
type
TRecordBuecher = record
ID : Integer;
Abkuerzung : String;
Titel : Ansistring;
Langbeschreibung : TStrings;
end;
...
procedure TBuecher.Schreiben(ID: Integer; Abkuerzung : String; Titel: Ansistring; Langbeschreibung : TStrings);
var
Stream: TStream;
I,I1: integer;
V : Integer;
Len, Len2, Len3: Longint;
Dateiversion : Integer;
begin
Dateiversion := 1;
SetLength(Buecher, length(Nachteil) + 1);
Buecher[High(Buecher)].ID := ID;
Buecher[High(Buecher)].Abkuerzung := Abkuerzung;
Buecher[High(Buecher)].Titel := Titel;
Buecher[High(Buecher)].Langbeschreibung := Langbeschreibung;
Stream := TFileStream.Create('Buecher.tdt', fmCreate);
try
Stream.Write(Dateiversion, SizeOf(Dateiversion)); //Dateiversion
Len := Length(Buecher);
Stream.Write(Len, SizeOf(Len));
for I := 0 to Length(Buecher) - 1 do
begin
Stream.Write(Buecher[I].ID, SizeOf(Buecher[I].ID));
Len := Length(Buecher[I].Abkuerzung);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Buecher[I].Abkuerzung)^, Len);
Len2 := Length(Buecher[I].Titel);
Stream.Write(Len2, SizeOf(Len));
Stream.Write(PChar(Buecher[I].Titel)^, Len2);
V := Langbeschreibung.Capacity;
Stream.Write(V, SizeOf((V)));
for I1 := 0 to Langbeschreibung.Capacity do
begin
Len3 := Length(Buecher[I].Langbeschreibung.Strings[I1]);
Stream.Write(Len, SizeOf(Len3));
Stream.Write(PChar(Buecher[I].Langbeschreibung.Strings[I1])^, Len3);
end;
end;
finally
Stream.Free;
end;
end;
procedure TBuecher.Lesen;
var
Stream: TStream;
I, I1: integer;
Len, Len1, Len2: Longint;
Dateiversion : Integer;
Test : String;
begin
if not FileExists('Buecher.tdt') then
begin
// Application.Terminate;
end
else begin
Stream := TFileStream.Create('Buecher.tdt', fmOpenRead);
try
Stream.Read(Dateiversion, SizeOf(Dateiversion));
Case Dateiversion of
1: begin
Stream.Read(Len, SizeOf(Len));
SetLength(Buecher, Len);
for I := 0 to Len - 1 do
begin
Stream.Read(Buecher[I].ID, SizeOf(Buecher[I].ID));
Stream.Read(Len1, SizeOf(Len1));
SetLength(Buecher[I].Abkuerzung, Len1);
Stream.Read(PChar(Buecher[I].Abkuerzung)^, Len1);
Stream.Read(Len1, SizeOf(Len1));
SetLength(Buecher[I].Titel, Len1);
Stream.Read(PChar(Buecher[I].Titel)^, Len1);
Stream.Read(Len1 , SizeOf(Len1));
for I1 := 0 to Len1 do
begin
Stream.Read(Len2, SizeOf(Len2));
Stream.Read(PChar(Test)^, Len2);
Buecher[I].Langbeschreibung.Add(Test); // Bei dieser Zeile kommt die Zugriffsverletzung
end;
end;
end;
end;
finally
Stream.Free;
end;
end;
end;
Marco Wer Rechtschreibfehler findet, der darf sie behalten
Carpe Diem - Nutze den Tag (und zwar den ganzen!)
|