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