Danke für den Hinweis mit SizeOf(Char) !
Das funktioniert bei mir genau so wie ich es mir gewünscht habe ohne das ich auf etwas anderes umsteigen musste.
Tschuldigung, encoding, CRLF usw ist bei mir nicht so tragend/entscheidend.
String vom Edit sollte rein, Stream mit dem sollte raus und rückwärtsrum genauso.
Nach anpassung (Danke nochmal an Michael), klappts bei mir prima!
Delphi-Quellcode:
function TKlasse.StringToStream ( const InputString: String; var ResultStream: TMemoryStream ): Boolean;
var
i: Integer;
begin
// falls was schiefgeht, erstmal falsen
Result := False;
// wenn nix reinkommt, muss auch nix rauskommen
if (Length(InputString) <= 0) then
Exit;
// falls stream inexistent ist, einen erstellen, ansonsten auf null position stellen
if (ResultStream = NIL) then
ResultStream := TMemoryStream.Create
else
ResultStream.Position := 0;
// vor dem try den zähler auf null setzen damit compiler keine warnung wirft
i := 0;
try
// stream beschreiben
i := ResultStream.Write(InputString[1], Length(InputString) * SizeOf(Char));
finally
// entweder haben wir es geschafft, oder auch nicht :-)
if (i = Length(InputString) * SizeOf(Char)) then
Result := not False
else
Result := False
end;
end;
function TKlasse.StreamToString ( const InputStream: TMemoryStream; var ResultString: String ): Boolean;
begin
// falls was schiefgeht, erstmal falsen
Result := False;
// wenn stream inexistent oder leer ist, mach nichts
if ((InputStream <> NIL) and (InputStream.Size > 0)) then
begin
try
// stream position auf null setzen
InputStream.Position := 0;
// stringlänge anpassen
SetLength(ResultString, InputStream.Size div SizeOf(Char));
// stream inhalt in string schreiben
InputStream.Read(ResultString[1], InputStream.Size);
finally
// entweder haben wir es geschafft, oder auch nicht :-)
if (Length(ResultString) = InputStream.Size div SizeOf(Char)) then
Result := not False
else
Result := False
end;
end;
end;
procedure TKlasse.btnKnopfClick(Sender: TObject);
var
tmp: TMemoryStream;
s: String;
begin
Memo.Lines.Add('Converting "' + Edit.Text + '" to stream');
try
if (StringToStream( Edit.Text, tmp )) then
if (StreamToString( tmp, s )) then
Memo.Lines.Add(s);
finally
s := '';
tmp.Free;
end;
end;