字符串到TStream

Gre*_*hop 6 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;
Run Code Online (Sandbox Code Playgroud)

Uwe*_*abe 8

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

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

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


ska*_*adt 8

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

procedure StringToStream(const AString: string; out AStream: TStream);
begin
  AStream := TStringStream.Create(AString);
end;
Run Code Online (Sandbox Code Playgroud)

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

Function StringToStream(const AString: string): TStream;
begin
  Result := TStringStream.Create(AString);
end;
Run Code Online (Sandbox Code Playgroud)


Mas*_*ler 6

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

  • 不,Yozey,*声明*作为TStream不是导致抽象函数被调用的原因.该功能是虚拟的.调用抽象函数是因为传入了一个实际的TStream对象(或者还没有覆盖该函数的其他一些后代). (5认同)