Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TFileStream (https://www.delphipraxis.net/478-tfilestream.html)

Frankle 27. Jul 2002 16:01


TFileStream
 
Hallo!
An beschriebener Stelle bekomm ich leider nen Fehler
Code:
procedure tmainform.load_memos;
type
 TMyMemos=record
  Tmemo1: TStringlist;
  Tmemo2: TStringlist;
  Tmemo3: TStringlist;
 end;
var
 Strom: TFilestream;
 MyMemos: TMyMemos;
 i: integer;
begin
with MyMemos do
 begin
 Tmemo1:=TStringlist.Create;
 Tmemo2:=TStringlist.Create;
 Tmemo3:=TStringlist.Create;
 end;

 try
 Strom:=TFileStream.Create('./data/news.fk',fmOpenRead);
 Strom.Read(MyMemos,sizeof(TMyMemos));
  {anzeigen}
{Hier tritt EAccessViolation auf}
  for i:=0 to mymemos.Tmemo1.Count do
   begin
   ueberw_memo.Lines[i]:=mymemos.Tmemo1.Strings[i];
   enD;
  for i:=0 to mymemos.Tmemo2.Count do
   begin
   kauf_memo.Lines[i]:=mymemos.Tmemo2.Strings[i];
   enD;
  for i:=0 to mymemos.Tmemo3.Count do
   begin
   verkauf_memo.Lines[i]:=mymemos.Tmemo3.Strings[i];
   enD;
 finally
 strom.free;
 with mymemos do
  begin
  Tmemo1.free;
  tmemo2.free;
  tmemo3.free;
  end;
 end;
end;
Danköööööö :lol:

Chewie 27. Jul 2002 16:17

Es hänngt mit der Zeile
Code:
Strom.Read(MyMemos,sizeof(TMyMemos));
zusammen. Mit dieser Zeile wird eine Zugriffsverletzung ausgelöst, wannnimmer man auf MyMemos zugreift, auch wenn man z.B. nur
Code:
ShowMessage(InttoStr(mymemos.TMemo1.Count));
schreibt. Ich kenn mich mit Records nicht so gut aus, aber es wird wohl dadran liegen, dass du TFilestream.Read direkt auf den record anwendest und nicht auf ein Unterobjekt des Records.

jbg 27. Jul 2002 16:22

Zitat:

Code:
Strom.Read(MyMemos,sizeof(TMyMemos));

So leicht kann man keine TStringList lesen geschweigedenn schreiben.
Das was du mit dieser Codezeile machst, ist die Zeiger auf die die Felder von MyMemos zeigen einzulesen (3 * 4 Bytes). Und diese zeigen irgendwo hin, weshalb eine Schutzverletzung auftritt.
Um mehrere StringListen in einen Stream zu schreiben und zu lesen kannst du so vorgehen:
Code:
procedure WriteStringsToStream(Stream: TStream; List: TStrings);
var
  S: string;
  Len: Integer;
begin
  S := List.Text;
  Len := Length(S);
  Stream.Write(Len, SizeOf(Len));
  if Len > 0 then Stream.Write(S[1], Len);
end;

procedure ReadStringsFromStream(Stream: TStream; List: TStrings);
var
  S: string;
  Len: Integer;
begin
  Stream.Read(Len, SizeOf(Len));
  SetLength(S, Len);
  if Len > 0 then Stream.Read(S[1], Len);
  List.Text := S;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr.

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