2013-12-10 23 views
0

我試圖編譯項目,但我想這個錯誤「變量所需」變量所需誤差TStream.Write()

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

瞭解問題但我依然不知道應該做些什麼來解決它。

+3

我們需要看到Top,Left,height和Width的聲明。我猜他們是一個對象的屬性。如果是這樣,那麼當調用Stream.Write –

+1

屬性不能通過引用傳遞時,您將需要使用本地或成員變量。 – kludg

回答

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; 

這是怎麼回事是,TStreamWrite方法聲明如下所示:

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; 
+2

- *「物業不符合法案」* - 我想這是問題的吸氣劑。例如,您可以傳遞「標記」。 –

+0

@SertacAkyuz是對的。我總是認爲編譯器拒絕了所有的屬性。只有一個具有功能的獲得者是它? –

+0

是的,我甚至測試了只寫屬性,並且失敗了。我的意思是它指的是支持領域,當它可以。 –