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;
È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top