Thema: Delphi TFileStream Problem

Einzelnen Beitrag anzeigen

Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: TFileStream Problem

  Alt 10. Jul 2005, 12:32
Hallo,
es handelt sich eigentlich nicht um einen Fehler. Die Huge-Strings sind hier Schuld.
Delphi-Quellcode:
var
  ini : String;
...
  SizeOf(ini); // liefert als Ergebnis 4.
..
in der Variablen ini ist nur eine Referenz (Zeiger) auf den String gespeichert.
Deshalb musst beim Schreiben und Lesen von Strings in einen Stream wie folgt vorgehen.
D.h. ich habe mir mal zwei Streamnachfahren gebastelt
Delphi-Quellcode:
interface

uses Sysutils, Classes;

Type

  TMemoryStreamExt = class(TMemoryStream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;

  TFileStreamExt = class(TFilestream)
  public
    procedure WriteStringToStream(aStr : String);
    function ReadStringFromStream : String;
  end;



implementation


{ TFileStreamExt }

procedure TFileStreamExt.WriteStringToStream(aStr : String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr); // Länge des Strings holen
  WriteBuffer(aStrLen,SizeOf(Integer)); // Länge des Strings in den Stream schreiben
  WriteBuffer(Pointer(aStr)^,aStrLen); // Den eigentlichen String in den Stream schieben
end;

function TFileStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer)); // Länge des Strings aus Stream lesen
  SetLength(Result,aStrLen); // Länge des Strinsg setzen
  ReadBuffer(Pointer(Result)^,aStrLen); // Stringdaten aus Stream lesen
end;

{ TMemoryStreamExt }

function TMemoryStreamExt.ReadStringFromStream: String;
var
   aStrLen : Integer;
begin
  ReadBuffer(aStrLen,SizeOf(Integer));
  SetLength(Result,aStrLen);
  ReadBuffer(Pointer(Result)^,aStrLen);
end;

procedure TMemoryStreamExt.WriteStringToStream(aStr: String);
var
   aStrLen : Integer;
begin
  aStrLen:=Length(aStr);
  WriteBuffer(aStrLen,SizeOf(Integer));
  WriteBuffer(Pointer(aStr)^,aStrLen);
end;


end.
I come from outer space to save the human race
  Mit Zitat antworten Zitat