Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Базовые классы TStream и THandleStream
В основе иерархии классов потоков лежит класс Tstream. Он обеспечивает выполнение основных операций потока безотносительно к реальному носителю информации. Основными из них являются чтение и запись данных. Класс Tstream порожден непосредственно от класса TObject. Потоки также играют важную роль в чтении/записи компонентов из файлов ресурсов (DFM). Большая группа методов обеспечивает взаимодействие компонента и потока, чтение свойств компонента из ресурса и запись значений свойств в ресурс. Таблица 9.3. Свойства и методы класса Tstream
Итак, в основе операций считывания и записи данных в потоке лежа! методы Read и Write. Именно они вызываются для реального выполнения операции внутри методов ReadBuffer И WriteBuffer, ReadComponent И WriteComponent. Так как класс TStream является абстрактным, то методы Read и write также являются абстрактными. В классах-наследниках они перекрываются, обеспечивая работу с конкретным физическим носителем данных.
Метод Seek используется для изменения текущей позиции в потоке. "Точка отсчета" позиции зависит от значения параметра Origin:
Группа методов обеспечивает чтение и запись из потока ресурса компонента. Они используются при создании компонента на основе данных о нем, сохраненных в формате файлов ресурсов. Для чтения ресурса используется метод ReadComponentRes, в котором последовательно вызываются:
Класс THandleStream инкапсулирует поток, связанный с физическим носителем данных через дескриптор. Для создания потока используется конструктор constructor Create(AHandle: Integer); в параметре которого передается дескриптор. Впоследствии доступ к дескриптору осуществляется через свойство: property Handle: Integer; Класс TFileStream Класс TFileStream позволяет создать поток для работы с файлами. При этом поток работает с файлом без учета типа хранящихся в нем данных (см. выше). Полное имя файла задается в параметре FileName при создании потока: constructor Createfconst FileName: string; Mode: Word); Параметр Mode определяет режим работы с файлом. Он составляется из флагов режима открытия:
И флагов режима совместного использования:
Для чтения и записи из потока используются методы 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 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).
Таблица 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 байт вперед. Если по какой-либо причине невозможно записать все байты буфера, то генерируется ошибка. Ниже приводится фрагмент программы, демонстрирующий создание файлового потока и запись в него строки:
|