Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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 байт вперед. Если по какой-либо причине невозможно записать все байты буфера, то генерируется ошибка. Ниже приводится фрагмент программы, демонстрирующий создание файлового потока и запись в него строки:
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2017-02-21; просмотров: 617; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.21 (0.006 с.) |