字符串到TStream

时间:2009-07-04 16:50:54

标签: delphi string tstream

我正在尝试将字符串转换为TStream。我的下面的代码在 CopyFrom 行上给出了一条“抽象错误”消息。我在这里碰壁砖,有关如何解决这个问题的想法吗?

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;

4 个答案:

答案 0 :(得分:8)

AStream被声明为OUT参数,这意味着它不会在过程开始时分配,并且过程负责为其分配适当的值。

如果我的代码解释正确,则应省略OUT并确保在调用例程时正确实例化AStream。

显示StringToStream调用的更多代码可能会提供更多线索。

答案 1 :(得分:7)

以下程序应该完全符合您的要求。请注意,您对AStream的使用负责释放在此过程中创建的实例。返回父类(在本例中为tStream)而不是特定的后代是完全正确的。

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

您也可以将其编码为函数:

Function StringToStream(const AString: string): TStream;
begin
  Result := TStringStream.Create(AString);
end;

答案 2 :(得分:6)

CopyFrom调用ReadBuffer,它调用Read,Read被声明为abstract。你传递给AStream的是什么样的流?如果它没有实现Read,那么你会得到一个抽象错误。 (当你实例化它时,编译器应该给你一个警告。)

答案 3 :(得分:4)

声明AStream对我来说是错误的。尝试删除。

如果这没有帮助,这是我使用的功能:

procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;