2009-07-04 44 views
5

我試圖將字符串轉換爲TStream。我的代碼給我一個「抽象錯誤」消息CopyFrom線。我在這裏遇到了一堵磚牆,關於如何解決這個問題的想法?字符串到TStream

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; 

回答

8

AStream被聲明爲OUT參數,這意味着它不會在過程的開始分配和程序負責適當的值賦給它。

如果我解釋你的代碼是正確的,你應該省略OUT,並確保AStream在調用例程時正確實例化。

更多顯示StringToStream調用的代碼可能會提供更多線索。

6

CopyFrom調用ReadBuffer,它調用Read和Read被聲明爲抽象。你傳遞給AStream什麼樣的流?如果它沒有實現Read,那麼你會在那裏得到一個抽象的錯誤。 (和編譯器應該給你,當你將它實例化一個警告。)

+0

精確。被聲明爲TStream的AStream正在調用基類的Read方法。他必須指定一個實現讀取方法的類(TStream)。 – yozey 2009-07-04 20:16:23

+5

不,Yozey被*聲明爲TStream不是導致抽象函數被調用的原因。該功能是虛擬的。抽象函數被調用是因爲一個實際的TStream對象已經被傳入(或者還沒有覆蓋那個函數的其他後代) – 2009-07-05 00:03:13

4

將AStream聲明爲out看起來不對我。嘗試刪除。

如果沒有幫助,這裏是我使用的功能:

procedure StringToStream(Stream: TStream;const S: String); 
begin 
Stream.Write(Pointer(S)^, length(S)); 
end; 
6

應遵循的程序做excactly你在找什麼。請注意,您使用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;