![]() |
TFileStream
Hallo!
An beschriebener Stelle bekomm ich leider nen Fehler
Code:
Danköööööö :lol:
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; |
Es hänngt mit der Zeile
Code:
zusammen. Mit dieser Zeile wird eine Zugriffsverletzung ausgelöst, wannnimmer man auf MyMemos zugreift, auch wenn man z.B. nur
Strom.Read(MyMemos,sizeof(TMyMemos));
Code:
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.
ShowMessage(InttoStr(mymemos.TMemo1.Count));
|
Zitat:
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 15:26 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-2025 by Thomas Breitkreuz