6

文字列をTStreamに変換しようとしています。以下のコードでは、 CopyFrom行に「AbstractError」メッセージが表示されます。私はここでレンガの壁に反対しています、これを解決する方法について何かアイデアはありますか?

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;
4

4 に答える 4

8

次の手順は、探していることを正確に行う必要があります。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;
于 2009-07-06T16:18:06.257 に答える
8

AStream は OUT パラメータとして宣言されます。つまり、プロシージャの開始時に割り当てられず、プロシージャが適切な値を割り当てる必要があります。

私があなたのコードを正しく解釈した場合、OUT を省略し、ルーチンを呼び出すときに AStream が適切にインスタンス化されていることを確認する必要があります。

StringToStream の呼び出しを示すいくつかのコードから、さらに手がかりが得られる場合があります。

于 2009-07-04T18:36:28.573 に答える
6

CopyFrom は Read を呼び出す ReadBuffer を呼び出し、Read は抽象宣言されます。AStream に渡すストリームの種類は何ですか? Read を実装していない場合は、抽象的なエラーが発生します。(そして、コンパイラは、インスタンス化するときに警告を表示する必要があります。)

于 2009-07-04T17:14:36.713 に答える
4

AStream を out として宣言するのは、私には間違っているように見えます。アウトを外してみる。

それでも問題が解決しない場合は、次の関数を使用します。

procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;
于 2009-07-04T18:38:31.053 に答える