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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Базовые классы 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;

Класс TFileStream

Класс TFileStream позволяет создать поток для работы с файлами. При этом поток работает с файлом без учета типа хранящихся в нем данных (см. выше).

Полное имя файла задается в параметре FileName при создании потока:

constructor Createfconst FileName: string; Mode: Word);

Параметр Mode определяет режим работы с файлом. Он составляется из флагов режима открытия:

  • fmCreate — файл создается;
  • fmOpenRead — файл открывается для чтения;
  • fmopenwrite — файл открывается для записи;
  • fmOpenReadWrite — файл открывается для чтения и записи.

И флагов режима совместного использования:

  • fmShareExciusive — файл недоступен для открытия другими приложениями;
  • fmShareDenyWrite — другие приложения могут читать данные из файла;
  • fmShareDenyRead — другие приложения могут писать данные в файл;
  • fmShareDenyNone — другие приложения могут производить с файлом любые операции.

Для чтения и записи из потока используются методы Read и write, унаследованные от класса THandleStream:

procedure TForml.CopyBtnClick(Sender: TObject);

var Streaml, Stream2: TFileStream;

IntBuf: array[0..9] of Integer/begin

if Not OpenDlg.Execute then Exit;

try

Streaml:= TFileStream.Create(OpenDlg.FileName, fmOpenRead);

Streaml.ReadBuffer(IntBuf, SizeOf(IntBuf));

try

Stream2:= TFileStream.Create('TextFile.tmp', fmOpenWrite);

Stream2.Seek(0, soFromEnd);

Stream2.WriteBuffer(IntBuf, SizeOf(IntBuf));

finally

Stream2.Free;

end;

finally

Streaml.Free;

end;

end;

Обратите внимание, что в данном фрагменте кода функция seek используется для записи данных в конец файлового потока.

При необходимости копирования одного файла в другой целиком используется метод CopyFrom, унаследованный от класса Tstream:

procedure TForml.CopyBtnClick(Sender: TObject);

var Streaml, Stream2: TFileStream;

begin if Not OpenDlg.Execute then

Exit;

try

Streaml:= TFileStream.Create(OpenDlg.FileName, fmOpenRead);

Stream2:= TFileStream.Create('Sample.tmp1, fmOpenWrite);

Stream2.Seek{0, soFromEnd);

Stream2.CopyFrom(Streaml, Streaml.Size);

finally

Streaml.Free;

Stream2.Free;

end;

end;

Обратите внимание, что в данном случае идя определения размера передаваемого потока необходимо использовать свойство stream, size, которое дает реальный объем данных, содержащихся в потоке. Функция sizeof (stream) в этом случае даст размер объекта потока, и не более того.

Класс TMemoryStream

Класс TMemoryStream обеспечивает сохранение данных в адресном пространстве. При этом методы доступа к этим данным остаются теми же, что и при работе с файловыми потоками. Это позволяет использовать адресное пространство для хранения промежуточных результатов работы приложения, а также при помощи стандартных методов осуществлять обмен данными между памятью и другими физическими носителями.

Свойство

property Memory: Pointer;

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

procedure SetSize(NewSize: Longint); override;

Для очистки памяти потока используется метод

procedure Clear;

Чтение/запись данных в память выполняется привычными методами Read и Write.

Также запись данных в память может осуществляться методами:

  • procedure LoadFromFile(const FileName: string); — из файла;
  • procedure LoadFromStream(Stream: TStream); — из другого потока.

Дополнительно можно использовать методы записи данных в файл или поток:

procedure SaveToFile(const FileName: string);

procedure SaveToStream(Stream: TStream);

http://www.cyberguru.ru/programming/delphi/delphi-components-part1-page5.html

http://www.cyberguru.ru/programming/delphi/delphi-components-part1-page5.html

 

Классы для представления потока данных

В среде Delphi существует иерархия классов для хранения и последовательного ввода-вывода данных. Классы этой иерархии называются потоками. Потоки лучше всего представлять как файлы. Классы потоков обеспечивают различное физическое представление данных: файл на диске, раздел оперативной памяти, поле в таблице базы данных (таблица 3.1).

Класс Описание
TStream Абстрактный поток, от которого наследуются все остальные. Свойства и методы класса TStream образуют базовый интерфейс потоковых объектов.
THandleStream Поток, который хранит свои данные в файле. Для чтения-записи файла используется дескриптор (handle), поэтому поток называется дескрипторным. Дескриптор — это номер открытого файла в операционной системе. Его возвращают низкоуровневые функции создания и открытия файла.
TFileStream Поток, который хранит свои данные в файле. Отличается от ThandleStream тем, что сам открывает (создает) файл по имени, переданному в конструктор.
TMemoryStream Поток, который хранит свои данные в оперативной памяти. Моделирует работу с файлом. Используется для хранения промежуточных результатов, когда файловый поток не подходит из-за низкой скорости передачи данных.
TResourceStream Поток, обеспечивающий доступ к ресурсам в Windows-приложении.
TBlobStream Обеспечивает последовательный доступ к большим полям таблиц в базах данных.

 

Таблица 3.1. Классы потоков

Потоки широко применяются в библиотеке VCL и наверняка вам понадобятся. Поэтому ниже кратко перечислены их основные общие свойства и методы.

Общие свойства:

Position: Longint — текущая позиция чтения-записи.

Size: Longint — текущий размер потока в байтах.

Общие методы:

CopyFrom (Source: TStream; Count: Longint): Longint — копирует Count байт из потока Source в свой поток.

Read (var Buffer; Count: Longint): Longint — читает Count байт из потока в буфер Buffer, продвигает текущую позицию на Count байт вперед и возвращает число прочитанных байт. Если значение функции меньше значения Count, то в результате чтения был достигнут конец потока.

ReadBuffer (var Buffer; Count: Longint) — читает из потока Count байт в буфер Buffer и продвигает текущую позицию на Count байт вперед. Если выполняется попытка чтения за концом потока, то генерируется ошибка.

Seek (Offset: Longint; Origin: Word): Longint — продвигает текущую позицию в потоке на Offset байт относительно позиции, заданной параметром Origin. Параметр Origin может иметь одно из следующих значений: 0 — смещение задается относительно начала потока; 1 — смещение задается относительно текущей позиции в потоке; 2 — смещение задается относительно конца потока.

Write (const Buffer; Count: Longint): Longint — записывает в поток Count байт из буфера Buffer, продвигает текущую позицию на Count байт вперед и возвращает реально записанное количество байт. Если значение функции отличается от значения Count, то при записи была ошибка.

WriteBuffer (const Buffer; Count: Longint) — записывает в поток Count байт из буфера Buffer и продвигает текущую позицию на Count байт вперед. Если по какой-либо причине невозможно записать все байты буфера, то генерируется ошибка.

Ниже приводится фрагмент программы, демонстрирующий создание файлового потока и запись в него строки:

var Stream: TStream; S: AnsiString; StrLen: Integer; begin // Создание файлового потока Stream:= TFileStream.Create('Sample.Dat', fmCreate);... // Запись в поток некоторой строки StrLen:= Length(S) * SizeOf(Char); Stream.Write(StrLen, SizeOf(Integer)); // запись длины строки Stream.Write(S, StrLen); // запись символов строки... // Закрытие потока Stream.Free;end;

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 461; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.37.169 (0.014 с.)