Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String to TStream

I'm attempting to convert a string to a TStream. My code below gives me an "Abstract Error" message on the CopyFrom line. I'm against a brick wall here, any ideas on how to solve this?

procedure StringToStream(const AString: string; out AStream: TStream);
var
  SS: TStringStream;
begin
  SS := TStringStream.Create(AString);
  try
    SS.Position := 0;
    AStream.CopyFrom(SS, SS.Size);  //This is where the "Abstract Error" gets thrown
  finally
    SS.Free;
  end;
end;
like image 409
Greg Bishop Avatar asked Jul 04 '09 16:07

Greg Bishop


2 Answers

AStream is declared as OUT parameter, which means it isn't assigned at the beginning of the procedure and the procedure is responsible to assign a proper value to it.

If I interpret your code correct, you should omit the OUT and make sure AStream is instantiated properly when you call the routine.

Some more code showing the call of StringToStream may give some more clues.

like image 166
Uwe Raabe Avatar answered Oct 04 '22 21:10

Uwe Raabe


The following procedure should do excactly what your looking for. Please note that your usage of AStream is responsible for freeing the instance that is created in this procedure. It is perfectly fine to return the parent class (in this case tStream) rather than the specific descendant.

procedure StringToStream(const AString: string; out AStream: TStream);
begin
  AStream := TStringStream.Create(AString);
end;

You can also code this as a function:

Function StringToStream(const AString: string): TStream;
begin
  Result := TStringStream.Create(AString);
end;
like image 20
skamradt Avatar answered Oct 04 '22 21:10

skamradt