M Y D E L P H I 7 . R U Самоучитель программирования  
 
  • Главная
  •  

     

    Базовые классы TStream и THandleStream

    В основе иерархии классов потоков лежит класс Tstream. Он обеспечивает выполнение основных операций потока безотносительно к реальному носителю информации. Основными из них являются чтение и запись данных.

    Класс Tstream порожден непосредственно от класса TObject.

    Потоки также играют важную роль в чтении/записи компонентов из файлов ресурсов (DFM). Большая группа методов обеспечивает взаимодействие компонента и потока, чтение свойств компонента из ресурса и запись значений свойств в ресурс.

    Таблица 9.3. Свойства и методы класса Tstream

    Объявление

    Описание

    property Position: Longint;

    Определяет текущую позицию в потоке

    property Size: Longint;

    Определяет размер потока в байтах

    function CopyFrom( Source: TStream; Count: Longint) : Longint;

    Копирует из потока Source Count байты, начиная с текущей позиции. Возвращает число скопированных байтов

    function Read(var Buffer; Count: Longint) : Longint; virtual; abstract;

    Абстрактный класс, перекрываемый в наследниках. Считывает из потока Count байты в буфер Buffer. Возвращает число скопированных байтов

    procedure Read3uffer (var Buffer; Count: Longint) ;

    Считывает из потока Count байты в буфер Buffer. Возвращает число скопированных байтов

    function Seek (Off set: Longint; Origin: Word): Longint; virtual; abstract;

    Абстрактный класс, перекрываемый в наследниках. Смещает текущую позицию в реальном носителе данных на Offset байтов в зависимости от условия Origin (см. ниже)

    function Write (const Buffer; Count: Longint): Longint; virtual; abstract;

    Абстрактный класс, перекрываемый в наследниках. Записывает в поток Count байты из буфера Buffer. Возвращает число скопированных байтов

    procedure WriteBuffer (const Buffer; Count: Longint);

    Записывает в поток Count байты из буфера Buffer. Возвращает число скопированных байтов

    function ReadComponent (Instance: TComponent): TComponent;

    Передает данные из потока в компонент instance, заполняя его свойства значениями

    function ReadComponentRes (Instance: TComponent) : TComponent;

    Считывает заголовок ресурса компонента Instance и значения его свойств из потока.

    procedure ReadResHeader;

    Считывает заголовок ресурса компонента из потока

    procedure WriteComponent (Instance: TComponent) ;

    Передает в поток значения свойств компонента Instance

    procedure WriteComponentRes (const ResName: string; Instance: TComponent) ;

    Записывает в поток заголовок ресурса компонента Instance и значения его свойств

    Итак, в основе операций считывания и записи данных в потоке лежа! методы Read и Write. Именно они вызываются для реального выполнения операции внутри методов ReadBuffer И WriteBuffer, ReadComponent И WriteComponent. Так как класс TStream является абстрактным, то методы Read и write также являются абстрактными. В классах-наследниках они перекрываются, обеспечивая работу с конкретным физическим носителем данных.

    Метод Seek используется для изменения текущей позиции в потоке. "Точка отсчета" позиции зависит от значения параметра Origin:

    •  soFromBeginning — смещение должно быть положительным и отсчитывается от начата потока;
    •  soFromCurrent — смещение относительно текущей позиции в потоке;
    •  soFromEnd — смещение должно быть отрицательным и отсчитывается от конца потока.

    Группа методов обеспечивает чтение и запись из потока ресурса компонента. Они используются при создании компонента на основе данных о нем, сохраненных в формате файлов ресурсов. Для чтения ресурса используется метод ReadComponentRes, в котором последовательно вызываются:

    •  метод ReadResHeader — для считывания заголовка ресурса компонента из потока;
    •  метод ReadComponent — для считывания значений свойств компонента. Для записи ресурса в поток применяется метод writeComponentRes.

    Класс THandleStream инкапсулирует поток, связанный с физическим носителем данных через дескриптор.

    Для создания потока используется конструктор

    constructor Create(AHandle: Integer);

    в параметре которого передается дескриптор. Впоследствии доступ к дескриптору осуществляется через свойство:

    property Handle: Integer;