6

我正在尝试将字符串转换为 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

4 回答 4

8

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

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

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

于 2009-07-04T18:36:28.573 回答
8

以下过程应该完全符合您的要求。请注意,您对 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;
于 2009-07-06T16:18:06.257 回答
6

CopyFrom 调用 ReadBuffer,后者调用 Read,Read 被声明为抽象。您将哪种流传递给 AStream?如果它没有实现 Read,你会在那里得到一个抽象错误。(当你实例化它时编译器应该给你一个警告。)

于 2009-07-04T17:14:36.713 回答
4

将 AStream 声明为 out 在我看来是错误的。尝试删除输出。

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

procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;
于 2009-07-04T18:38:31.053 回答