AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream

Ein Thema von Frankle · begonnen am 27. Jul 2002 · letzter Beitrag vom 27. Jul 2002
Antwort Antwort
Frankle

Registriert seit: 10. Jun 2002
18 Beiträge
 
#1

TFileStream

  Alt 27. Jul 2002, 17:01
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öööööö
-----------------------------
God Safe QUEEN
"The Show Must Go On"
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#2
  Alt 27. Jul 2002, 17: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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 27. Jul 2002, 17: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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 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