Механизм чтения и записи компонентов Delphi (1)
1. Знакомство с потоковыми объектами (Stream) и объектами чтения и записи (Filer).
В объектно-ориентированном программировании важную роль играет объектно-ориентированное управление данными. В Delphi поддержка объектно-ориентированного управления данными является основной функцией.
Delphi — это интегрированная среда разработки, сочетающая объектно-ориентированный визуальный дизайн с объектно-ориентированным языком. Ядро Delphi — это компоненты. Компонент — это тип объекта. Приложения Delphi полностью состоят из компонентов, поэтому разработка высокопроизводительных приложений Delphi неизбежно потребует использования объектно-ориентированной технологии управления данными.
Управление данными объекта включает в себя два аспекта:
● Используйте объекты для управления данными.
● Управление различными объектами данных (включая объекты и компоненты)
Delphi объединяет классы объектно-ориентированного управления данными в объекты Stream (Stream) и объекты Filer (Filer) и применяет их ко всем аспектам библиотеки классов визуальных компонентов (VCL). Они предоставляют богатые функции для управления объектами в памяти, внешнем хранилище и ресурсах Windows.
Объект Stream, также известный как объект потоковой передачи, — это собирательное имя для TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream и TBlobStream. Они соответственно представляют возможность хранить данные на различных носителях. Они абстрагируют операции управления различными типами данных (включая объекты и компоненты) в памяти, внешней памяти и полях базы данных в объектные методы и в полной мере используют объектно-ориентированную технологию. Преимущество заключается в том, что приложения могут довольно легко копировать данные в различные объекты Stream.
Объекты чтения-записи (Filer) включают объекты TFiler, объекты TReader и объекты TWriter. Объект TFiler является основным объектом для чтения и записи файлов. TReader и TWriter в основном используются в приложениях. Объекты TReader и TWriter наследуются непосредственно от объектов TFiler. Объект TFiler определяет основные свойства и методы объекта Filer.
Объект Filer в основном выполняет две основные функции:
● Доступ к файлам форм и компонентам в файлах форм.
● Обеспечьте буферизацию данных для ускорения операций чтения и записи данных.
Чтобы иметь представление о потоковых объектах и объектах чтения и записи, давайте сначала рассмотрим пример.
а) Записать файл
PROcedure TFomr1.WriteData (Отправитель: TObject r);
Вар
FileStream:TFilestream;
Мой писатель: TWriter;
я: целое число
Начинать
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//Создаем объект файлового потока
Mywriter:=TWriter.create(FileStream,1024); // Связываем Mywriter с FileStream;
Mywriter.writelistbegin; // Флаг начала списка записи
Для i:=0 до Memo1.lines.count-1 выполните
Mywriter.writestring(memo1.lines[i]); //Сохраняем текстовую информацию компонента Memo в файл
Mywriter.writelistend; // отметка конца списка записи
FileStream.seek(0,sofrombeginning); //Указатель объекта файлового потока перемещается в начало потока
Mywriter.free; // Освободите объект Mywriter.
FileStream.free; // Освобождаем объект FileStream
Конец;
б) Читать файлы
процедура TForm1.ReadData(Отправитель: TObject);
Вар
FileStream:TFilestream;
Мойчитатель:TReader;
Начинать
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Связываем Myreader с FileStream;
Myreader.readlistbegin; //Читаем начальную отметку записанного списка
Memo1.lines.clear; //Очистить текстовое содержимое компонента Memo1
Пока не myreader.endoflist делаем //Обратим внимание на метод TReader: endoflist
Начинать
Memo1.lines.add(myreader.readstring); //Добавляем прочитанную строку в компонент Memo1
Конец;
Myreader.readlistend; //Читать записанную метку конца списка
Myreader.free; //Освобождаем объект Myreader
FileStream.free; // Освобождаем объект FileStream
Конец;
Вышеупомянутые два процесса: один — процесс записи, а другой — процесс чтения. Процесс записи проходит через TWriter и использует TFilestream для сохранения содержимого (текстовой информации) в Memo в виде двоичного файла, сохраняемого на диске. Процесс чтения прямо противоположен процессу записи. С помощью TReader TFilestream используется для преобразования содержимого двоичного файла в текстовую информацию и отображения ее в Memo. Запустив программу, вы увидите, что процесс чтения точно восстанавливает информацию, сохраненную в процессе записи.
На следующей диаграмме описаны отношения между объектами данных (включая объекты и компоненты), потоковыми объектами, а также объектами чтения и записи.
Рисунок (1)
Стоит отметить, что объекты чтения и записи, такие как объекты TFiler, объекты TReader и объекты TWriter, редко вызываются напрямую авторами приложений. Они обычно используются для чтения и записи состояния компонентов. Они играют очень важную роль в чтении. -Написать компонентный механизм важную роль.
Для потокового объекта Stream во многих справочных материалах есть очень подробные описания, тогда как справочные материалы по объектам TFiler, TReader и объектам TWriter, особенно механизмам чтения и записи компонентов, встречаются редко. В этой статье будет рассмотрен исходный код VCL. и механизм письма.
2. Чтение и запись объектов (Filer) и механизмы чтения и записи компонентов.
Объект Filer в основном используется для доступа к файлам форм Delphi и компонентам в файле формы, поэтому для четкого понимания объекта Filer необходимо знать структуру файла формы Delphi (файла DFM).
Файлы DFM используются для форм хранения Delphi. Форма — это ядро визуального программирования Delphi. Форма соответствует окну в приложении Delphi, визуальные компоненты формы соответствуют элементам интерфейса в окне, а невизуальные компоненты, такие как TTimer и TOpenDialog, соответствуют определенной функции приложения Delphi. Дизайн приложений Delphi фактически сосредоточен на дизайне формы. Таким образом, файлы DFM также занимают очень важное место в разработке приложений Delphi. Все элементы формы, включая свойства самой формы, включены в файл DFM.
В окне приложения Delphi элементы интерфейса связаны друг с другом отношениями владения, поэтому древовидная структура является наиболее естественной формой выражения, соответственно, компоненты в форме также организованы в соответствии с древовидной структурой; файл DFM, а также для выражения этой связи. Файлы DFM физически хранятся в текстовом формате (до версии Delphi2.0 они хранились в виде двоичных файлов), а логически связь между компонентами организована в виде древовидной структуры. Древовидная структура формы хорошо видна из этого текста. Ниже приведено содержимое файла DFM:
объект Форма1: TForm1
Слева = 197
Топ = 124
…
Пикселей на дюйм = 96
ТекстХайт = 13
объект Button1: TButton
Слева = 272
…
Заголовок = 'Кнопка1'
ТабОрдер = 0
конец
объект Panel1: TPanel
Слева = 120
…
Заголовок = 'Панель1'
ТабОрдер = 1
объект CheckBox1: TCheckBox
Слева = 104
…
Заголовок = 'CheckBox1'
ТабОрдер = 0
конец
конец
конец
Этот файл DFM генерируется TWriter через потоковый объект Stream. Конечно, существует также процесс преобразования из двоичного файла в файл текстовой информации. Этот процесс преобразования не является предметом этой статьи, поэтому такой процесс игнорируется.
Когда программа запускается, TReader считывает формы и компоненты через потоковый объект Stream, потому что, когда Delphi компилирует программу, он скомпилирует информацию файла DFM в исполняемый файл с помощью инструкции компиляции {$R *.dfm} , и что с того? Чтение TReader — это фактически информация о формах и компонентах, которая компилируется в исполняемый файл.
TReader и TWriter могут не только читать и записывать большинство стандартных типов данных в Object Pascal, но также читать и записывать расширенные типы, такие как List и Variant, и даже читать и записывать свойства и компоненты. Однако сами по себе TReader и TWriter на самом деле предоставляют очень ограниченные функции, и большую часть фактической работы выполняет очень мощный класс TStream. Другими словами, TReader и TWriter на самом деле являются просто инструментами. Они отвечают только за компоненты чтения и записи. Конкретные операции чтения и записи выполняются TStream.
Поскольку TFiler является общим предком TReader и TWriter, чтобы понять TReader и TWriter, вам следует сначала начать с TFiler.