Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit TStrings (https://www.delphipraxis.net/18839-probleme-mit-tstrings.html)

Taladan 25. Mär 2004 01:30


Probleme mit TStrings
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz