Domanda
sto cercando di convertire una stringa in un TStream. Il mio codice qui sotto mi dà un messaggio di "errore astratta" sulla Linea CopyFrom. Io sono contro un muro di mattoni qui, tutte le idee su come risolvere questo?
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;
Soluzione
Astream viene dichiarata come parametro OUT, che significa che non è assegnato all'inizio della procedura e la procedura è responsabile per assegnare un valore adeguato ad esso.
Se interpreto il codice corretto, si dovrebbe omettere l'OUT e fare in modo Astream viene istanziato correttamente quando si chiama la routine.
Alcuni più codice che mostra la chiamata di StringToStream può dare qualche più indizi.
Altri suggerimenti
La seguente procedura dovrebbe fare esattamente centrale quello che cercate. Si prega di notare che l'utilizzo di Astream è responsabile di liberare l'istanza che viene creata in questa procedura. E 'perfettamente bene per restituire la classe padre (in questo caso TStream), piuttosto che il discendente specifica.
procedure StringToStream(const AString: string; out AStream: TStream);
begin
AStream := TStringStream.Create(AString);
end;
È anche possibile codificare questo come una funzione:
Function StringToStream(const AString: string): TStream;
begin
Result := TStringStream.Create(AString);
end;
CopyFrom chiamate LeggiBuffer, che chiama lettura e lettura è dichiarata astratta. Che tipo di flusso stai passando AFLUSSO? Se non implementa Leggi, si otterrà un errore astratta lì. (E il compilatore dovrebbe darvi un messaggio di avviso quando si crea un'istanza di esso.)
Dichiarare Astream come fuori sembra sbagliato per me. Provare a rimuovere il fuori.
Se questo non aiuta, qui è la funzione che uso:
procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;