das mit der Länge war schon mein Problem.
Ich hab dann mal bei Lazarus geschaut und da folgendes gefunden:
stream.WriteAnsiString(s)
Fehlt leider in Delphi!
allerdings konnte ich das Problem folgendermaßen lösen
(Miniprogramm: Formular mit 2 Buttons):
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
ButtonSchreiben: TButton;
ButtonLesen: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ButtonSchreibenClick(Sender: TObject);
procedure ButtonLesenClick(Sender: TObject);
private
s1,s2:
string;
stream: TMemoryStream;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
stream:= TMemoryStream.Create;
s1:= '
1234567890'+#13+'
zeile2 äöü';
s2:= '
x';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
stream.Free;
end;
procedure TForm1.ButtonSchreibenClick(Sender: TObject);
var
L: integer;
begin
//stream.WriteAnsiString(s1); // gibt es in Lazarus und ist folgendermaßen umgesetzt:
{ L:= Length(s1);
Stream.Write(L, SizeOf(L));
Stream.Write(Pointer(s1)^, L);}
L:= Length(s1);
Stream.
Write(L, SizeOf(L));
Stream.
Write(PChar(s1)^, L*SizeOf(Char));
end;
procedure TForm1.ButtonLesenClick(Sender: TObject);
var
L: integer;
// P: PByte;
begin
stream.Position:= 0;
// h:= stream.ReadAnsiString; // gibt es in Lazarus und ist folgendermaßen umgesetzt:
{ Stream.Read(L,SizeOf(L));
SetLength(s2, L);
if L>0 then begin
Stream.Read(Pointer(s2)^, L);
P:= Pointer(s2) + L; // <- geht nicht in Delphi (in Lazarus aber schon)
p^:=0;
end; }
Stream.
Read(L, SizeOf(L));
SetLength(s2, L);
Stream.
Read(PChar(s2)^, L*SizeOf(Char));
showmessage('
#' +s2 + '
#');
end;
end.
Allerdings verstehe ich nicht, daß sich die FreePascal Lösung nicht in Delphi kompilieren läßt. (PByte + integer) In Lazarus geht das ohne Problem.
Allerdings ist es jetzt auch in Delphi so, daß der String den man reinschreibt auch wieder rauskommt.
Vielleicht kann es ja mal jemand brauchen.