TStream Objects
+-----------+ | TObject | +-----+-----+ +====+====+ | TStream | +==+===+==+ +-------+ +------+ +----+-------+ +-----+------+ | TDosStream | | TEmsStream | +----+-------+ +------------+ +----+-------+ | TBufStream | +------------+
TStream - это общий абстрактный обект, обеспечивающий полиморфический В/В в и/из устройства памяти. Вы можете создать порожденный объект потока, перекрывая виртуальные методы GetPos, GetSize, Read, Seek, Truncate и Write. Turbo Vision делает это в порожденных потоках TDosStream и TEmsStream. Для порожденного буферизованного потока Вы должны так же перекрыть TStream.Flush.
Поля
Status Status: Integer; Чтение/Запись Указывает текущий статус потока:
Таблица 13.1. Коды ошибок потока.
------------------------------------------------- Коды ошибок TStream ------------------------------------------------- stOk Нет ошибок stError Ошибка доступа stInitError Нельзя инициализироввать поток stReadError Чтение за концом файла stWriteError Нельзя расширить поток stGetError Get для незарегистрированного типа stPutError Put для незарегистрированного типа -------------------------------------------------
Если Status <> stOK, все операции над потоком будут запрещены до тех пор, пока не будет вызван Reset.
ErrorInfo ErrorInfo: Integer; Чтение/Запись Содержит дополнительнительную информацию когда Status не stOK. Для значений Status: stError, stInitError, stReadError, stWriteError, ErrorInfo содержит код ошибки DOS или EMS, если такой существует. Когда Status stGetError, ErrorInfo содержит IDE типа объекта (поле ObjType в TStreamRec) не зарегистрированного типа объекта. Когда Status - stPutError, ErrorInfo содержит смещение VMT в сегменте данных (поле VmtLink в TStreamRec) не зарегистрированного типа объекта.
Методы
CopyFrom procedure CopyFrom(var S: TStream; Count: Longint); Копирует Count байт из потока S в вызывающий поток. Например:
NewStream := New(TEmsStream, Init(OldStream^.GetSize)); OldStream^.Seek(0); NewStream^.CopyFrom(OldStream, OldStream^.GetSize);
См. так же: TStream.GetSize, TObject.Init
Error procedure Error(Code, Info: Integer); virtual; Перекрывается: Иногда Вызывается, если возникла ошибка потока. По умолчанию TStream.Error сохраняет Code и Info в полях Status и ErrorInfo. Затем, если глобальная переменная StreamError не nil, вызывает процедуру, заданную в StreamError. После возникновения ошибки, все операции над потоком запрещены до тех пор, пока не будет вызван Reset.
См. так же: TStream.Reset, StreamError переменная
Flush procedure Flush; virtual; Перекрывается: Иногда Абстрактный метод, который должен быть перекрыт, если Ваш порожденный тип реализует буфер. Этот метод может выталкивать любые буфера, очищая буфер чтения и записывая буфер вывода. По умолчанию TStream.Flush ничего не делает.
См. так же: TDosStream.Flush
Get function Get: PObject; Читает объект из потока. Объект должен быть предварительно записан в поток через TStream.Put. Get вначале читает ID типа объекта (слово) из потока. Затем он находит соответствующий тип объекта, сравнивая ID с полем ObjType всех зарегистрированных типов объектов (см. тип TStreamRec). Наконец вызывает констрактор Load этого типа объекта для создания и загрузки объекта. Если ID типа объекта, считанного из потока, равен 0, Get возвращает указатель nil; если ID типа объекта не зарегистрирован (используя RegisterType) Get вызывает TStream.Error и возвращает указатель nil; иначе Get возвращает указатель на вновь созданный объект.
См. так же: TStream.Put, RegisterType, TStreamRec, Load методы
GetPos function GetPos: Longint; virtual; Перекрывается: Всегда Возвращает текущую позицию в потоке. Этот абстрактный метод должен всегда перекрываться.
См. так же: TStream.Seek
GetSize function GetSize: Longint; virtual; Перекрывается: Всегда Возвращает размер потока. Это абстрактный метод и должен перекрываться.
Put procedure Put(P: PObject); Записывает объект в поток. Объект позже можно считать из потока, используя TStream.Get. Put вначале находит регистрационную запись типа этого объекта, сравнивая смещение VMT объекта с полем VmtLink всех зарегистрированных типов объектов (см. тип TStreamRec). Затем записывает ID типа объекта (поле ObjType регистрационной записи) в поток, и наконец вызывает метод Store этого типа объекта для записи объекта. Если аргумент Р, переданный в Put - nil, Put записывает в поток слово, содержащее 0. Если тип объекта в Р не зарегистрирован (испольуя RegisterType), Put вызывает TStream.Error и ничего не пишет в поток.
См. так же: TStream.Get, RegisterType, TStreamRec, Store методы
Read procedure Read(var Buf; Count: Word); virtual; Перекрывается: Всегда Это абстрактный метод и должен перекрываться во всех порожденных типах. Read должен читать Count байт из потока в Buf и перемещать текущую позицию потока на Count байт. Если произошла ошибка, Read должен вызывать Error и заполнять Buf Count байтами, равными 0.
См. так же: TStream,Write, TStream.Error
ReadStr function ReadStr: PString; Читает строку из текущей позиции потока, возвращая указатель PString. TStream.ReadStr вызывает GetMem для распределения (Length+1) байт для строки.
См. так же: TStream.WriteStr
Reset procedure Reset; Сбрасывает ошибочное условие потока, устанавливая Status и ErrorInfo в 0. Этот метод позволяет Вам продолжать обработку потока после ошибочной ситуации, которую Вы скорректировали.
См. так же: TStream.Status, TStream.ErrorInfo, sfXXXX коды ошибок
Seek procedure Seek(Pos: Longint); virtual; Перекрывается: Всегда Это абстрактный метод и должен перекрываться во всех потомках. TStream.Seek устанавливает текущую позицию в Pos байт, начиная от начала потока. Начало потока - позиция 0.
См. так же: TStream.GetPos
Truncate procedure Truncate; virtual; Перекрывается: Всегда Это абстрактный метод и должен перекрываться во всех потомках. TStream.Truncate удаляет все данные в потоке от текущей позиции до конца.
См. так же: TStream.GetPos, TStream.Seek
Write procedure Write(var Buf; Count: Word); virtual; Перекрывается: Всегда Это абстрактный метод и должен перекрываться во всех потомках. Write записывает Count байт из Buf в поток и перемещает текущую позицию потока на Count байт. Если возникла ошибка, Write должен вызывать Error.
См. так же: TStream.Read, TStream.Error
WriteStr procedure WriteStr(P: PString); Записывает строку P^ в поток, начиная с текущей позиции.
См. так же: TStream.ReadStr