TStream (метод Objects)


TObject
 
-Init-
-Done-
Free
TStream
Status
ErrorInfo
CopyFrom
Error
Flush
Get
GetPos
GetSize
Put
Read
ReadStr
Reset
Seek
StrRead
StrWrite
Truncate
Write
WriteStr

    TStream - это общий абстрактный объект, обеспечивающий полиморфический ввод-вывод в/на устройство. Переопределяя виртуальные методы GetPos, GetSize, Read, Seek, Truncate и Write, вы можете создать собственные производные потоковые объекты. Сама ObjectWindows делает это, строя производные объекты TDosSteram и TEmsStream. Для буферизированных производных потоков вы должны также переопределить TStream.Flush.

Поля


Status (чтение/запись)

     Status: Integer;

    Status указывает текущее состояние потока, используя одну из констант stXXXX: stOk, stError, stInitError, stReadError, stWriteError, stGetError или stPutError.

    Если Status не равно stOk, то все операции с потоком приостанавливаются до вызова Reset.

    См. также: константы stXXXX.

ErrorInfo (чтение/запись)


     ErrorInfo: Integer;

    ErrorInfo содержит дополнительную информацию, когда Status не равно stOk. Для значений Status stError, stInitError, stReadError и stWriteError ErrorInfo содержит код ошибки DOS или EMS (если он доступен). Когда Status имеет значение stGetError, ErrorInfo содержит идентификатор объектного типа (поле ObjType в TStreamRec) незарегистрированного типа объекта. Когда Status равно stPutError, ErrorInfo содержит смещение сегмента данных таблицы виртуальных методов (поле VmLink в 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 ничего не делает и должна переопределяться в наследующих типах, где реализуются буферы.

    См. также: TBufStream.Flush.

Get


     function Get: PObject;

    Считывает объект из потока. Объект должен быть предварительно записан в поток методом TStream.Put. Get сначала считывает из потока идентификатор объектного типа (слово). Затем она находит соответствующий объектный тип, сравнивая идентификатор с полем ObjType всех зарегистрированных объектных типов (см. тип TStreamRec), и наконец вызывает конструктор Load этого объектного типа для создания и загрузки объекта. Если считываемый из потока объектный тип равен 0, Get возвращает указатель nil. Если указатель объектного типа не зарегистрирован (с помощью RegisterType), Get вызывает TStream.Error и возвращает указатель nil. В противном случае Get возвращает указатель на вновь созданный объект.

    См. также: TStream.Put, RegisterType, TStreamRec, методы Load.

GetPos (всегда переопределяется)


     function GetPos: Longint; virtual;

    Возвращает значение текущей позиции потока. Это абстрактный метод, который должен переопределяться.

    См. также: TStreamSeek.

GetSize (всегда переопределяется)


     function GetSize: Longint; virtual;

    Возвращает общий размер потока. Это абстрактный метод, который должен переопределяться.

Put


     procedure Put(P: PObject);

    Записывает объект в поток. Позднее объект может считываться из потока с помощью TStreamGet.Get. Put сначала находит запись регистрации типа объекта, сравнивая смещение таблицы виртуальных методов объекта с полем WmtLink всех зарегистрированных объектных типов (см. тип TStreamRec), затем записывает в поток идентификатор тип объекта (поле ObjType записи регистрации) и, наконец, вызывает метод Store этого объектного типа для записи объекта. Если передаваемый в Put аргумент имеет значение nil, то Put записывает в поток слово, содержащее 0. Если объектный тип P не зарегистрирован (с помощью RegisterType), Put вызывает TStreamError и с потоком ничего не делает.

    См. также: методы TStreamGet, RegisterType, TStreamRec, Store.

Read (всегда переопределяется)


     procedure Read(var Buf; Count; Word); virtual;

    Считывает из потока Stream Count байт и продвигает текущую позицию потока на Count байт. В случае ошибки Read вызывает Error и заполняет Buf Count нулевыми байтами. Это абстрактный метод, который должен переопределяться в наследующих типах.

    См. также: TStream.Write, TStream.Error.

ReadStr


     function ReadStr: PString;

    Считывает строку из текущей позиции в потоке, возвращая указатель PString. TStream.ReadStr для выделения для строки Length + 1 байт вызывает GetMem.

    См. также: TStream.WriteStr.

Reset


     procedure Reset;

    Сбрасывает для потока любой ошибочное условие, устанавливая Status и ErrorInfo в 0. Этот метод позволяет вам продолжить работу с потоком после исправления условия ошибки.

    См. также: TStream.Status, TStream.ErrorInfo, коды ошибок stXXXX.

Seek (всегда переопределяется)


     procedure Seek(Pos: Longint); virtual;

    Устанавливает текущую позицию в Pos байт от начала потока. Начальной позицией потока является 0. Это абстрактный метод, который должен переопределяться во всех потомках.

    См. также: TStream.GetPos.

StrRead


     function StrRead: PChar;

    Считывает из потока строку с завершающим нулем, считывая сначала длину строки, а затем заданное число символов. Возвращает указатель на прочитанную строку с завершающим нулем.

    См. также: TStream.StrWrite.

StrWrite

     procedure StrWrite(P: PChar);

    Записывает в поток строку с завершающим нулем, записывая сначала длину строки, а затем заданное число символов.

    См. также: TStream.StrWrite.

Truncate (всегда переопределяется)


     procedure Trancate: virtual;

    Удаляет все данные из потока от текущей позиции до конца. Это абстрактный метод, который должен переопределяться во всех потомках.

    См. также: TStream.GetPos, TStream.Seek.

Write (всегда переопределяется)


     procedure Write(var Buf; Count: Word); virtual;

    Записывает Count байт из Buf в потоки продвигает текущую позицию в потоке на Count байт. В случае ошибки Write вызывает Error. Это абстрактный метод, который должен переопределяться во всех потомках.

    См. также: TStream.Read, TStream.Error.

WriteStr


     procedure WriteStr(P: PString);

    Записывает строку P^ в поток, начиная с текущей позиции.

    См. также: TStream.ReadStr.

Тип TStreamRec (модуль Objects)


    Описание:

     TStreamRec = record
          ObjType: Word;
          VmtLink: Word;
          Load: Pointer;
          Store: Pointer;
          Next: Word;
     end;

    Назначение: Перед тем как все его типы смогут загружаться из объекта TStream или записываться в него, объектный тип ObjectWindows должен иметь зарегистрированный тип TStreamRec. Подпрограмма RegisterTypes регистрирует объектный тип, устанавливая запись TStreamRec.

    Поля в записи регистрации определены следующим образом:

Поля записи потока. Таблица 21.27
ПолеСодержимое
ObjTypeУникальный числовой идентификатор объектного типа.
VmtLinkСвязь с записью таблицы виртуальных методов объектного типа.
Load Указатель на конструктор Load объектного типа.
Store Указатель на метод Store объектного типа.
Next Указатель на следующую запись TStreamRec.

    ObjectWindows резервирует идентификаторы объектных типов (ObjType) со значением от 0 до 999 для своего внутреннего использования. Программисты могут определять свои собственные значения в диапазоне от 1000 до 65535.

    По соглашению TStreamRec для объектного типа Txxxx называется Rxxxx. Например, как показано ниже TStreamRec для типа TCalculator называется RCalculator:

     type TCalculator = object(TDialog)
            constructor Load(var S: TStream);
            procedure Store(var S: TStream);
              .
              .
              .
           end;

     const
       RCalculator: TStreamRec = (
           ObjType: 2099;
           VmtLink: Ofs(TypeOf(TCalculator)^);
           Load: @TCalculator.Load;
           Store: @TCalculator.Store);

     begin
       RegisterType(RCalculator);
        .
        .
     end;

    См. также: RegisterType.