TStream.Write()的变量必需错误

时间:2013-12-10 19:37:19

标签: delphi delphi-xe2

我正在尝试编译项目,但我猜这个错误“需要变量”

function ReadInteger(SomeTStream:TStream):integer;
  begin
    SomeTStream.Read(Result, SizeOf(Result));
  end;

Top:=ReadInteger(SomeTStream);
Left:=ReadInteger(SomeTStream);
Height:=ReadInteger(SomeTStream);
Width:=ReadInteger(SomeTStream);

然后当它试图写入时,它停在顶部和左侧。

SomeTStream.Write(Top,SizeOf(Top));
                    ^
SomeTStream.Write(Left,SizeOf(Top));}
                     ^
E2036 Variable required

我在here

中了解了这个问题

但我仍然不知道应该怎么做才能解决它。

1 个答案:

答案 0 :(得分:3)

正如错误所说的那样。参数必须是变量。但是您传递的是使用getter函数实现的属性。将属性复制到变量中并将其传递给函数。

var
  Value: Integer;
....
Value := Top;
Stream.Write(Value, SizeOf(Value));

这里的一些辅助方法最有用,可以避免在锅炉板中溺水。实际上,您已为ReadInteger添加了一个,而您只需要WriteInteger匹配的一个。

procedure WriteInteger(Stream: TStream; Value: Integer);
begin
  Stream.Write(Value, SizeOf(Value));
end;

这里发生的是Write TStream方法的声明如下:

function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

因为此函数接收到无类型参数,所以它不能通过值传递。实际传递了参数的地址,因此调用者需要提供带地址的内容。您的财产不适合账单。


顺便说一句,通常WriteRead是调用TStream的错误方法。他们不执行任何错误检查。他们把它留给你。 WriteReadabstract方法,专门的类用于提供流实现。您通常需要拨打WriteBufferReadBuffer


或许二元作家可能会有所帮助。

var
  bw: TBinaryWriter;
....
bw := TBinaryWriter.Create(Stream);
try
  bw.Write(Top);
  bw.Write(Left);
  // etc.
finally
  bw.Free;
end;