Строка для 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;