Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Класс TComponent. Основные методы и свойства.Содержание книги
Поиск на нашем сайте
TComponent
Класс TComponent является базовым классом для всех компонентов среды Delphi. Именно он обеспечивает, с одной стороны, возможность размещения их в палитре компонентов, а с другой – возможность сохранения свойств в поток (благодаря наличию среди предков TPersistent). Именно он вводит понятия имени компонента (свойство Name) и свойства Tag, которое резервируется для нужд пользователя (честно говоря, в основном используется для латания дыр в проектировании системы классов). Далее следует отметить реализацию интерфейса IUnknown. Благодаря этому каждый компонент может реализовывать интерфейсы.
Одним из наиболее важных и часто используемых свойств TComponent является ComponentState. Оно отображает состояния компонента в контексте взаимодействия с интегрированной средой разработки и состояния потокового ввода/вывода свойств. В таблице 1 приведены возможные значения этого свойства: csAncestor Компонент был размещен на форме, являющейся предком текущей формы. Устанавливается только если флаг csDesigning установлен. csDesigning Компонент находится в режиме проектирования (design time). Данный флаг установлен при проектировании формы в IDE Delphi csDestroying Компонент сейчас будет разрушен csFixups Компонент связан с компонентом на другой форме, которая еще не загружена. Флаг сбрасывается после загрузки всех необходимых форм csFreeNotification Один или несколько компонентов должны быть извещены при разрушении данного объекта. Флаг устанавливается вызовом метода FreeNotification. csInline Компонент является контейнером и может редактироваться во время проектирования и внедрен в форму. Данный флаг используется для идентификации фреймов во время загрузки и сохранения формы. csLoading Компонент загружается из файла формы csReading Компонент считывает значения своих свойств из потока csWriting Компонент записывает значения своих свойств в поток csUpdating Компонент требует обновления, для актуализации изменений, произведенных с ним в родительском классе. Устанавливается только при установке флага csAncestor csDesignInstance Данный компонент является корневым компонентом дизайнера форм. Например, фрейм в режиме проектирования. Однако, фрейм уже размещенный на форме, выступает как обычный компонент и не является корневым объектом.
Распространенной практикой использования свойства ComponentState является определение, манипулируют ли компонентом во время выполнения программы или во время ее проектирования. Например, компонент TImage использует это свойство для того, чтобы нарисовать пунктирную границу вокруг элемента управления на этапе проектирования. Следующий фрагмент кода иллюстрирует, как это происходит:if csDesigning in ComponentState then with inherited Canvas do begin Pen.Style:= psDash; Brush.Style:= bsClear; Rectangle(0, 0, Width, Height); end; …… {Продолжение рисования }
Класс TComponent развивает концепцию принадлежности (ownership), которая заложена в TPersistent и распространяется на все компоненты. Суть понятия принадлежности заключается в том, что определенный компонент отвечает за уничтожение других компонентов, которыми он владеет. Это освобождает разработчика от многих рутинных действий. Например, форма при уничтожении не «забывает» уничтожить все компоненты, которые на ней находятся. В свою очередь, заканчивая работу, приложение разрушает работы все свои формы.
Данная концепция реализуется с помощью двух свойств: Owner, который ссылается на другой компонент, как на своего владельца. В свою очередь любой компонент может сам выступать в роли владельца. Components – массив, содержащий ссылки на компоненты, которыми владеет данный класс.
Конструктор компонента принимает параметр Owner, указывающий на владельца. Если передаваемый в конструкторе владелец существует, то ссылка на созданный конструктором компонент сохраняется в массиве Components владельца. Этот механизм позволяет осуществлять разрушение компонентов, принадлежащих владельцу. Код для автоматического разрушения размещен в деструкторе TComponent, и, следовательно, используется всеми наследниками данного класса.
Компонент-владелец может быть не задан. В этом случае реализация корректного уничтожения компонента ложится на разработчика.
Еще одним довольно полезным методом является Notification (уведомление). Этот метод вызывается каждый раз, когда компонент вставляется или удаляется из списка владельца. Метод Notification перекрывается в потомках TComponent, чтобы обеспечить действительность ссылок на внешние компоненты.
Обеспечение метода Notification особенно актуально на этапе проектирования. В качестве примера приведем код метода Notification компонента метки. Данный код должен обеспечить корректировку свойства FocusControl метки. Свойство FocusControl указывает на оконный элемент управления, с которым ассоциирована метка.procedure TCustomLabel.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = FFocusControl) then FFocusControl:= nil; end;
Данный код при вызове, обнаружив, что удаляется внешний компонент, на который ссылается свойство FocusControl, обнуляет указатель на него. Если этого не делать, то после удаления внешнего компонента свойство FocusControl будет содержать указатель на несуществующий компонент.
TComponent предоставляет возможность получения сообщений об удалении любого компонента. Для указания того, что ваш компонент должен получать извещение об удалении другого компонента, в TComponent существует метод FreeNotification. Единственный параметр метода AComponent:TComponent указывает на тот компонент, извещение об удалении которого вы хотите обработать. Другой метод – RemoveFreeNotification(AComponent: TComponent) – позволяет отписаться от получения извещений об удалении компонента, переданного в качестве параметра метода.
Метод Loaded – инструмент для корректной инициализации компонента после окончания чтения значений свойств из потока. Этот виртуальный метод вызывается сразу после того, как все значения свойств загружены в компонент. Вызов Loaded происходит раньше, чем форма отобразится. Это позволяет избежать ненужной перерисовки компонента. Особенно часто этот метод используется для компонентов манипулирования данными. В самом деле, до тех пор, пока не будет инициализированы все свойства, например DBGrid, смысла в отображении данных на нем абсолютно нет.
Удачным примером использования Loaded является метод пользовательского класса TCustomRadioGroup (элемент группы переключателей):procedure TCustomRadioGroup.Loaded; begin inherited Loaded; ArrangeButtons; end;
В данном методе сразу после загрузки группы переключателей производится их выравнивание.
Теперь, рассмотрев свойства и методы класса TComponent, попробуем построить на его базе несколько реальных компонентов. Это так называемые невизуальные компоненты, назначение которых – инкапсулировать некоторый часто используемый код. Классическим примером такого компонента является всем известный TTimer. Псевдовизуальные компоненты (в их число входят диалоги, компоненты для настройки хинтов и т.д.) также являются подмножеством невизуальных компонентов и, следовательно, также являются прямыми потомками TComponent.
На этапе проектирования приложения они отображаются в виде пиктограммы на форме, а на этапе выполнения программы вообще не видны пользователю. Главная причина создания невизуальных компонентов – это возможность удобной визуальной настройки их свойств в Object Inspector. Внутри себя данные компоненты могут инкапсулировать практически любые участки кода. Основные типы задач, выполняемых невизуальными компонентами это: Создание классов-оберток функций API Windows. Создание диалогов Инкапсуляция участков кода, выполняющих какие-либо функции и имеющих набор входных параметров, влияющий на их поведение.
С первого взгляда компоненты диалогов могут показаться визуальными, однако на самом деле они инкапсулируют формы диалогов и представляют удобный интерфейс настройки свойств этих форм.
В пределах раздела построения невизуальных компонентов мы рассмотрим два примера: компонент-регулятор уровня громкости звука и компонент-диалог поиска записи в наборе данных.
|
||||
Последнее изменение этой страницы: 2017-02-21; просмотров: 236; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.237.229 (0.007 с.) |