Потоки. Базовые классы TStream и THandleStream.
Потоки – очень удачное средство для унификации ввода/вывода для различных носителей. Потоки представляют собой специальные объекты-наследники абстрактного класса Tstream. Сам Tstream "умеет" открываться, читать, писать, изменять текущее положение и закрываться. Поскольку для разных носителей эти вещи происходят по-разному, конкретные аспекты реализованы в его потомках. Наиболее часто используются потоки для работы с файлами на диске и памятью.
Многие классы VCL имеют унифицированные методы LoadFromstream и saveTostream, которые обеспечивают обмен данными с потоками. От того, с каким физическим носителем работает поток, зависит место хранения данных.
Базовые классы 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;
