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.