1

在 Delphi 10.4 中,我尝试使用以下代码将 a 转换TStream为 a :string

function MyStreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');
    try
      SS.CopyFrom(aStream, 0); // Exception: TStream.Seek not implemented
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;

但是在这个代码行中,我得到一个异常“TStream.Seek not implemented”:SS.CopyFrom(aStream, 0);

为什么?我怎样才能“治愈”这段代码?

4

1 回答 1

6

该错误意味着您正在向函数传递一个TStream根本没有实现的对象Seek()。例如,如果您传入的是实际TStream对象而不是派生对象,例如TFileStream,TMemoryStream等,例如:

var
  Strm: TStream;
begin
  Strm := TStream.Create; // <-- ERROR
  try
    MyStreamToString(Strm);
  finally
    Strm.Free;
  end;
end;

TStream是一个抽象基类,它不应该直接实例化。

Seek()在这种情况下,基类中的 32 位方法TStream调用 64 位Seek()方法,但如果 64 位Seek()尚未被覆盖,则会引发“Seek not implemented”异常。TStream派生类必须 override32 位Seek()或 64 位Seek(),并且被覆盖的方法不得调用TStream它所覆盖的基方法。

因此,请确保您将有效的流对象传递给您的函数。

于 2020-07-28T19:11:22.387 回答