Delphi 字符串到TStream
我正在尝试将字符串转换为TStream。下面的代码在CopyFrom行上给出了一条“抽象错误”消息。我反对这堵砖墙,有什么办法解决这个问题吗Delphi 字符串到TStream,delphi,string,tstream,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; AStrea
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;
CopyFrom调用ReadBuffer,ReadBuffer调用Read,Read被声明为抽象。你要把什么样的溪流送到阿斯特拉姆?如果它不实现读取,您将在那里得到一个抽象错误。(当你实例化它时,编译器应该给你一个警告。)AStream被声明为OUT参数,这意味着它在过程开始时没有被赋值,过程负责给它赋值 如果我对代码的解释正确,那么应该省略OUT,并确保在调用例程时正确实例化AStream
更多显示StringToStream调用的代码可能会提供更多线索。将AStream声明为out在我看来是错误的。试着把它拿出来 如果这没有帮助,下面是我使用的函数:
procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;
下面的程序应该完全符合您的要求。请注意,您使用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;
精确地声明为TStream的AStream正在调用基类的Read方法。他必须指定一个实现read方法的类(TStream)。不,Yozey,被声明为TStream并不是导致调用抽象函数的原因。该功能是虚拟的。调用抽象函数是因为传入了实际的TStream对象(或者其他尚未重写该函数的子体。很明显,如果AStream调用某个方法时出现抽象错误,则AStream会被赋值。它可能被实例化为TStream而不是某个子体类。你是对的。而AStream的实际值声明必须是TStream(否则编译器会抱怨),很有可能它实际上是抽象TStream的一个实例,而不是某个继承类。但除此之外,将其作为out参数仍然不是一个明智的决定。感谢所有提供帮助的人。我只是用一个TStream调用它,现在我意识到这没有多大意义。我改为调用该过程将过程更改为(删除out):过程StringToStream(const AString:string;AStream:TMemoryStream);var SS:TStringStream;begin SS:=TStringStream.Create(AString);try SS.Position:=0;AStream.CopyFrom(SS,SS.Size);终于自由了;结束;结束;这似乎解决了这个问题。再次,非常感谢!