我正在尝试编译项目,但我猜这个错误“需要变量”
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
中了解了这个问题但我仍然不知道应该怎么做才能解决它。
答案 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;
因为此函数接收到无类型参数,所以它不能通过值传递。实际传递了参数的地址,因此调用者需要提供带地址的内容。您的财产不适合账单。
顺便说一句,通常Write
和Read
是调用TStream
的错误方法。他们不执行任何错误检查。他们把它留给你。 Write
和Read
是abstract
方法,专门的类用于提供流实现。您通常需要拨打WriteBuffer
和ReadBuffer
。
或许二元作家可能会有所帮助。
var
bw: TBinaryWriter;
....
bw := TBinaryWriter.Create(Stream);
try
bw.Write(Top);
bw.Write(Left);
// etc.
finally
bw.Free;
end;