Hallo, habe ein kleines Umwandlungsproblem und finde einfach nicht meinen Fehler.... grrrr
Einen String in einen Stream zu verwandeln scheint gut zu klappen,
die Rückumwandlung hingegen klappt nur manchmal korrekt, ich weiß nur nicht warum *heul*
Hier meine Versuche: (alles kommentiert damit man weiß warum ich was an welcher stelle mache)
Im Formular sind folgende Dinge existent:
Eine Memo, Edit und Knopf Komponente.
Delphi-Quellcode:
// pump text in einen stream
// diese methode scheint gut zu arbeiten
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) = not False then
Exit;
// falls stream inexistent ist, einen erstellen, ansonsten auf null position stellen
if (ResultStream = NIL) = not False then
ResultStream := TMemoryStream.Create
else
ResultStream.Position := 0;
try
// stream beschreiben
i := ResultStream.Write(InputString[1], Length(InputString));
finally
// entweder haben wir es geschafft, oder auch nicht :-)
if (i = Length(InputString)) = not false then
Result := not False
else
Result := False
end;
end;
// hol text aus einem stream
// hier steckt irgendwo ein fehler den ich nicht finde oder meine vorgehensweise ist falsch
function TKlasse.StreamToString ( const InputStream: TMemoryStream; var ResultString: String ): Boolean;
var
Buffer: PChar; // (ist ein PWideChar bei D2010)
begin
// falls was schiefgeht, erstmal falsen
Result := False;
// wenn stream inexistent ist oder leer ist, mach nichts
if ((InputStream <> NIL) and (InputStream.Size > 0)) = not False then
begin
try
// puffer speicher allozieren
Buffer := StrAlloc(InputStream.Size +1);
// stream position auf null setzen
InputStream.Position := 0;
// stream inhalt an puffer pointen
InputStream.Read(Buffer^, InputStream.Size);
// stringlänge anpassen
SetLength(ResultString, SizeOf(Buffer));
// puffer in string kopieren
ResultString := Copy(Buffer, 1, InputStream.Size);
// test ausgabe bevor speicher bereinigt ist
MemoBox.Lines.Add('Buffer: ' + Buffer);
MemoBox.Lines.Add('Result: ' + ResultString);
// puffer speicher freigeben
StrDispose(Buffer);
finally
// entweder haben wir es geschafft, oder auch nicht :-)
if (Length(ResultString) = InputStream.Size) = not false then
Result := not False
else
Result := False
end;
end;
end;
// hier meine Test-Methode die beides auf einmal verwendet....
procedure TKlasse.KnopfClick(Sender: TObject);
var
tmp: TMemoryStream;
s: String;
begin
MemoBox.Lines.Add('Converting "' + EditZeile.Text + '" to stream');
try
if (StringToStream( EditZeile.Text, tmp ) = not False) = not False then
if (StreamToString( tmp, s ) = not False) = not False then
MemoBox.Lines.Add(s);
finally
tmp.Free;
end;
end;