2009-07-04 6 views
5

Bir dizeyi bir TStream'e dönüştürmeyi deniyorum. Aşağıdaki kodum bana CopyFrom satırında bir "Özet Hata" mesajı veriyor. Burada bir tuğla duvara karşıyım, bunun nasıl çözüleceğine dair herhangi bir fikir var mı?Dize 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; 

cevap

8

AStream, OUT parametresi olarak bildirilir, yani yordamın başlangıcında atanmamış olduğu anlamına gelir ve prosedür, uygun bir değer atamaktan sorumludur. o.

Kodunuzu doğru olarak yorumlarsam, ÇIKIŞ'ı çıkarmanız ve yordamı çağırdığınızda AStream öğesinin doğru şekilde başlatıldığından emin olmanız gerekir.

StringToStream çağrısını gösteren bazı diğer kodlar daha fazla ipucu verebilir.

+0

Kuyu, açıkça bir yöntem çağırdığında soyut bir hata alırsa AStream * atanır * Muhtemelen bazı alt sınıflar yerine bir TStream olarak başlatılmıştır –

+1

Haklısınız ve AStream için verilen değerin gerçek beyanının tam olarak TStream olması gerektiğinden (aksi takdirde derleyici şikayette bulunur) yüksek bir olasılık vardır. Aslında bazı kalıtsal sınıf yerine soyut TStream bir örneğidir. Ama bunun dışında hala bir out parametresi yapmak için akıllıca bir karar değildir. –

+0

Yardım teklif eden herkese teşekkürler. Ben sadece bir TStream ile diyordum, Şimdi fark ettiğim şey çok anlamlı değil, prosedürü bir TMemoryStream ile çağırmaya karar verdim ve prosedürü değiştirdim (rem outing out): yordamı StringToStream (const AString: string; AStream: TMemoryStream); var SS: TStringStream; başlangıç ​​ SS: = TStringStream.Create (AString); SS.Position: = 0; AStream.CopyFrom (SS, SS.Size); nihayet SS.Free; sonu; sonu; Bu, sorunu çözmüş görünüyor. Yine, çok teşekkürler! –

6

CopyFrom çağrılarıYazıcıyı Oku, hangi oku Okuma ve Okuma özet olarak bildirilir. AStream'e ne tür bir akış iletiyorsunuz? Oku uygulanmazsa, orada soyut bir hata alırsınız. (Ve derleyici, bunu başlattığınızda size bir uyarı vermelidir.)

+0

. TStream olarak bildirilen AStream, temel sınıfın Okuma yöntemini çağırıyor. Okuma yöntemini uygulayan bir sınıf (TStream) belirtmek zorundadır. – yozey

+5

Hayır, Yozey, * bir TStream olarak ilan edilmek, soyut işlevin çağrılmasına neden olan şey değildir. Bu işlev sanal. Soyut bir işlev, gerçek bir TStream nesnesinin (veya bu işlevi henüz geçersiz kılmayan başka bir alt öğe tarafından iletilmiş olması nedeniyle çağrılır.) –

4

AStream'in dışarı bildirildiğini bildirmek yanlış görünüyor. Çıkarmayı dene. Bu işe yaramazsa

, burada kullandığım fonksiyonudur:

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

Aşağıdaki prosedür aradığın şeyi excactly yapmalıdır. Lütfen, bu işlemde oluşturulan örneği serbest bırakmak için AStream kullanımınızın sorumlu olduğunu unutmayın. Ebeveyn sınıfını (bu durumda tStream) belirli altçiden değil, döndürmek mükemmeldir.

procedure StringToStream(const AString: string; out AStream: TStream); 
begin 
    AStream := TStringStream.Create(AString); 
end; 

Ayrıca bir fonksiyonu olarak kodlayabiliriz: Tam

Function StringToStream(const AString: string): TStream; 
begin 
    Result := TStringStream.Create(AString); 
end;