Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 字符串到TStream_Delphi_String_Tstream - Fatal编程技术网

Delphi 字符串到TStream

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

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

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);终于自由了;结束;结束;这似乎解决了这个问题。再次,非常感谢!