- •9 Разработка компонентов в среде Delphi
- •9.1. Выбор класса-предка
- •9.1.1. Класс tControl
- •9.1.4. Класс tCustomControl
- •9.2. Создание модуля компонента и тестового приложения
- •Разработка тестового приложения
- •9.3.1. Простые свойства
- •9.3.6. Массив свойств
- •9.3.7. Перекрытие и переопределение свойств
- •9.3.8. Создание событий
- •9.3.9. Создание методов
- •Что такое событие? в чем отличие создания свойства от события?
9 Разработка компонентов в среде Delphi
Все компоненты Delphi являются частью иерархии, которая называется Visual Component Library (VCL). Общим предком всех компонентов является класс TComponent (рис. 9.1.1), в котором собран минимальный набор общих для всех компонентов Delphi свойств.
Свойство ComponentState содержит набор значений, указывающих на текущее состояние компонента. Приведем некоторые значения свойства:
csDesigning |
компонент находится в режиме проектирования |
sDestroyingKOMnoHeHT |
сейчас будет разрушен; |
csLoading |
компонент загружается из файла формы; |
csReading |
компонент считывает значения из файла формы; |
csWriting |
компонент записывает значения своих свойств в поток; |
csUpdating |
компонент вносит изменения, чтобы отразить изменения в родительской форме. |
Класс TComponent вводит концепцию принадлежности. Каждый компонент имеет свойство Owner (владелец), ссылающееся на другой компонент как на своего владельца. В свою очередь, компоненту могут принадлежать другие компоненты, ссылки на которые хранятся в свойстве Components. Конструктор компонента принимает один параметр, который используется для задания владельца компонента. Если передаваемый владелец существует, то новый компонент добавляется к списку Components владельца. Свойство Components обеспечивает автоматическое разрушение компонентов, принадлежащих владельцу. Свойство ComponentCount показывает количество принадлежащих компонентов, a Componentlndex — номер компонента в массиве Components.
В классе TComponent определено большое количество методов. Наибольший интерес представляет метод Notification. Он вызывается всегда, когда компонент вставляется или удаляется из списка Components владельца. Владелец посылает уведомление каждому члену списка Components. Этот метод переопределяется в порождаемых классах для того, чтобы обеспечить действительность ссылок компонента на другие компоненты. Например, при удалении компонента Tablel с формы свойство DataSet компонента DataSourcel, равное Tablel, устанавливается в Nil.
Процесс разработки компонента включает пять этапов:
выбор класса-предка;
создание модуля компонента;
добавление в новый компонент свойств, методов и событий;
тестирование;
регистрацию компонента в среде Delphi;
9.1. Выбор класса-предка
На рис. 9.1.1 изображены базовые классы, формирующие структуру VCL. В самом верху расположен TObject, который является предком для всех классов в Object Pascal. От него происходит TPersistent, обеспечивающий методы, необходимые для создания потоковых объектов. Потоковый объект — объект, который может запоминаться в потоке. Поток представляет собой объект, способный хранить двоичные данные (файлы). Поскольку Delphi реализует файлы форм, используя потоки, то TComponent порождается от TPersistent, предоставляя всем компонентам способность сохраняться в файле формы.
Класс TComponent представляет собой вершину иерархии компонентов и является первым из четырех базовых классов, используемых для создания новых компонентов. Прямые потомки TComponent — невизуальные компоненты.