Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stream Problem... (https://www.delphipraxis.net/72499-stream-problem.html)

igel457 1. Jul 2006 16:26


Stream Problem...
 
Hallo,

ich stehe gerade auf dem Schlauch. Ich habe eine Klasse geschrieben die ihre Daten (strings) in einen Stream Speichert. Leider kommt dabei nur Müll raus...

Delphi-Quellcode:
procedure WriteString(astring:string;astream:TStream);
var c:integer;
    s:string;
begin
  s := astring;
  c := sizeof(s);
  showmessage(s+' '+inttostr(c)); //<-- hier zeigt er das richtige an
  astream.Write(c,sizeof(c));
  astream.Write(s,c);
end;

procedure TGameData.SaveToStream(AStream:TStream);
begin
  WriteString(name,astream);
  WriteString(map,astream);
  WriteString(ip,astream);
  WriteString(id,astream);
  astream.Write(typ,sizeof(typ));
end;
Ich speichere diese Daten in einen MemoryStream und dann auf Festplatte. Wenn ich mir das mit einem Hexeditor anschaue steht da aber nur Müll drin.

Woran könnte das liegen? Bei der Zeile "Showmessage" Zeigt er das richtige an. An den Daten kann es also nicht liegen...

Ich denke es liegt an der Prozedur "WriteString"...

Ich hoffe ihr könnt mir helfen,
igel457

Dax 1. Jul 2006 16:28

Re: Stream Problem...
 
Zitat:

Zitat von igel457
Ich denke es liegt an der Prozedur "WriteString"...

Gut gedacht ;)
Denk dran: strings und Dynamische Arrays sind im Grunde genommen das selbe. Das bedeutet, das ein String nur ein Zeiger auf den Speicherbereich ist, in dem der String wirklich steht. Also kannst du es nicht so machen wie es bei dir steht, sondern musst den Startindex mitgeben:
Delphi-Quellcode:
procedure WriteString(astring:string;astream:TStream);
var c:integer;
    s:string;
begin
  s := astring;
  c := sizeof(s);
  showmessage(s+' '+inttostr(c)); //<-- hier zeigt er das richtige an
  astream.Write(c,sizeof(c));
  astream.Write(s[1],c);
end;

igel457 1. Jul 2006 16:36

Re: Stream Problem...
 
Danke für die super-schnelle Antwort.
Ich hatte es auch vorher schon einmal damit ausprobiert, da hatte ich aber eine Zugriffsveletzung als Ergebniss. Das kam aber daher, dass ein Element 0 Zeichen lang war. SizeOf gibt hier aber 1 zurück. Verwende ich length anstatt SizeOf, dann funktioniert es...

Danke! :bouncing4:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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