Строка для TStream

Я пытаюсь преобразовать строку в TStream. Мой код ниже дает мне сообщение "Абстрактная ошибка" в строке CopyFrom. Я против кирпичной стены, есть идеи, как это решить?

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 ответа

Решение

AStream объявлен как параметр OUT, что означает, что он не назначен в начале процедуры, и процедура отвечает за присвоение ему правильного значения.

Если я правильно интерпретирую ваш код, вы должны опустить OUT и убедиться, что AStream правильно создается при вызове подпрограммы.

Еще немного кода, показывающего вызов StringToStream, может дать некоторые подсказки.

Следующая процедура должна делать именно то, что вы ищете. Обратите внимание, что использование 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;

CopyFrom вызывает ReadBuffer, который вызывает Read, а Read объявляется абстрактным. Какой поток вы передаете AStream? Если он не реализует Read, вы получите абстрактную ошибку там. (И компилятор должен дать вам предупреждение, когда вы создаете его экземпляр.)

Объявление AStream как out выглядит неправильно для меня. Попробуйте удалить из.

Если это не помогает, вот функция, которую я использую:

procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;
Другие вопросы по тегам