Свойства и события компонентов

Суть визуального программирования заключается в том, что вы из набора компонентов библиотеки LCL переносите на форму нужные вам визуальные компоненты, настраиваете их под собственные потребности и формируете дизайн вашей программы. Компоненты так же как и форма являются некоторыми графическими объектами. И каждый компонент реализован в виде класса. Например, компонент Label (надпись) реализован в виде класса. Название компонента соответствует имени класса. То есть когда мы ведем речь о компоненте Label, мы подразумеваем класс TLabel.

Компоненты бывают видимыми и невидимыми. При проектировании форма выступает в роли контейнера для компонентов. При этом на форму можно разместить и невидимые компоненты.

Свойства и события компонентов также отображаются в инспекторе объектов. Чтобы увидеть их, достаточно выделить требуемый компонент на форме.

Свойство является важным атрибутом компонента. Для пользователя (программиста) свойство выглядит как простое поле какой-либо структуры, содержащее некоторое значение. Однако, в отличие от «просто» поля, любое изменение значения некоторого свойства любого компонента сразу же приводит к изменению визуального представления этого компонента, поскольку свойство инкапсулирует в себе методы (действия), связанные с чтением и записью этого поля (которые, в свою очередь, включают в себя необходимую перерисовку). Свойства служат двум главным целям. Во-первых, они определяют внешний вид формы или компонента. А во-вторых, свойства определяют поведение формы или компонента.

Виды свойств

Существует несколько типов свойств, в зависимости от их «природы», т.е. внутреннего устройства.

  • Простые свойства — это те, значения которых являются числами или строками. Например, свойства Left и Top принимают целые значения, определяющие положение левого верхнего угла компонента или формы. Свойства Caption и Name представляют собой строки и определяют заголовок и имя компонента или формы.

  • Перечислимые свойства — это те, которые могут принимать значения из предопределенного набора (списка). Простейший пример — это свойство типа Boolean, которое может принимать значения True или False.

  • Вложенные свойства — это те, которые поддерживают вложенные значения (или объекты). Object Inspector изображает знак «+» слева от названия таких свойств. Имеется два вида таких свойств: множества и комбинированные значения. Object Inspector изображает множества в квадратных скобках. Если множество пусто, оно отображается как []. Установки для вложенных свойств вида «множество» обычно имеют значения типа Boolean. Наиболее распространенным примером такого свойства является свойство Style с вложенным множеством булевых значений. Комбинированные значения отображаются в Инспекторе Объектов как коллекция некоторых величин, каждый со своим типом данных. Некоторые свойства, например, Font, для изменения своих значений имеют возможность вызвать диалоговое окно. Для этого достаточно щелкнуть маленькую кнопку с тремя точками в правой части строки Инспектора Объектов, показывающей данное свойство.

Синтаксис определения свойств

Type
 TMyClass=class
 private
   FProp: integer;
   procedure SetProp(const Value: integer);
   function GetProp: integer;
 public
   property Prop: integer read FProp write FProp;
   property Prop1: integer read GetProp write SetProp;
 end;

Назначение свойств и их влияние на результат

Lazarus позволяет легко манипулировать свойствами компонент как в режиме проектирования (design time), так и в режиме выполнения программы (run time).

В режиме проектирования манипулирование свойствами осуществляется с помощью Дизайнера Форм (Forms Designer) или, как Вы уже видели, на страничке «Properties» Инспектора Объектов. Например, для того чтобы изменить свойства Height (высоту) и Width (ширину) кнопки, достаточно «зацепить» мышкой за любой ее угол и раздвинуть до нужного представления. Того же результата можно добиться, просто подставив новые значения свойств Height и Width в окне Object Inspector.

С другой стороны, в режиме выполнения пользователь (программист) имеет возможность не только манипулировать всеми свойствами, отображаемыми в Инспекторе Объектов, но и управлять более обширным их списком.

Управление объектом через свойства

Все изменения значений свойств компонент в режиме выполнения должны осуществляться путем прямой записи строк кода на языке Паскаль. В режиме выполнения невозможно использовать Object Inspector. Однако, доступ к свойствам компонентов довольно легко получить программным путем. Все, что Вы должны сделать для изменения какого-либо свойства — это написать простую строчку кода аналогично следующей:

MyComponent.Width := 35;

Вышеприведенная строка устанавливает ширину (Width) компонента в значение 35. Если свойство Width компонента еще не было равно 35 к моменту выполнения данной строки программы, Вы увидите, как компонента визуально изменит свою ширину.

Таким образом, нет ничего магического в Инспекторе Объектов. Object Inspector просто является удобным способом выполнения в режиме проектирования того, что может быть осуществлено программным путем в режиме выполнения. Более того, как уже было сказано выше, у компонента могут быть свойства, не отображаемые в окне Инспектора Объектов.

Объектно-ориентированный язык Паскаль, лежащий в основе Lazarus, в качестве базового имеет принцип соответствия визуальных компонент тем вещам, которые они представляют. Разработчики Lazarus поставили перед собой цель, чтобы, например, представление компонента Button (кнопка), инкапсулирующее некий код, соответствовало визуальному изображению кнопки на экране и являлось как можно более близким эквивалентом реальной кнопки, которую Вы можете найти на клавиатуре. И именно из этого принципа родилось понятие свойства.

Если Вы измените свойства Width и Height компонента Button, кнопка соответствующим образом изменит свои ширину и высоту. Вам нет необходимости после изменения свойства Width указывать объекту, чтобы он перерисовал себя, хотя при обычном программировании именно так Вы и должны поступать. Свойства — это более чем просто данные. Напротив, они делают эти данные «живыми», и все это происходит перед Вашими глазами! Свойства дают Вам иллюзию, как будто Вы имеете дело с реальными объектами, а не с их программным представлением.

События компонентов

Свойства объекта определяют его внешний вид (размер, шрифт, цвет и т.д.), а совокупность событий определяют поведенческую сторону объекта. Обработчиком события является процедура, которая выполняет те или иные действия в ответ на наступление события. Т.е. с помощью этой процедуры (обработчика события) реализуется реакция объекта на событие, например на щелчок мыши.

Таким образом, задача программиста сводится к тому, чтобы определить необходимые свойства объектов в его приложении и написать обработчики тех событий, на которые должен реагировать тот или иной объект приложения.

Создание процедур на основе событий

Обработчики событий

Инспектор объектов позволяет определить обработчики событий, на которые должна реагировать форма или ее компоненты. Во вкладке События в левой колонке приведен список всех событий для данного объекта. Не обязательно разрабатывать обработчики для всех событий. Как мы уже отмечали, если для некоторого события отсутствует его обработчик, то приложение просто не будет реагировать на это событие. Создайте новый проект в Lazarus. В инспекторе объектов откройте вкладку События. Выберите событие OnCreate, рис. 1. Это событие возникает при создании окна приложения. Щелкните по кнопке с троеточием. В редакторе кода появится заготовка кода процедуры обработчика данного события, рис. 2.

Рис. 1. Вкладка «События»

Рис. 2. Заготовка кода процедуры обработчика события

Обратите внимание, Lazarus автоматически присвоил процедуре имя FormCreate, присоединив к нему имя класса TForm1. В инспекторе объектов также появилось имя процедуры FormCreate–обработчика события OnCreate.

Перейдите в редактор исходного кода, в обработчике события FormCreate введите следующий код:

Form1.Caption:='Моё первое графическое приложение';

Запустите свое приложение. Вы увидите, что в строке заголовка окна вместо стандартного Form1, появился ваш текст.

Из этого примера мы можем сделать один очень важный вывод. Оказывается свойства объекта можно изменять динамически во время выполнения приложения. Для доступа к свойству объекта необходимо указать имя этого объекта (в нашем случае формы Form1) и через точку имя свойства (Caption).

Далее, в инспекторе объектов выберите событие OnClick. В обработчике события введите код:

Form1.Caption:='Зачем ты на меня нажал?';

Запустите приложение. Щелкните мышью по окну вашего приложения. Вы видите, что в строке заголовка окна текст меняется. Т.е. можно воочию убедиться, что ваше приложение на самом деле реагирует на нажатие мыши.

Выберите теперь, например, событие OnDblClick. Если вы раскроете раскрывающийся список, то вы увидите список уже имеющихся обработчиков событий, рис. 3.

Рис. 3. Список уже имеющихся обработчиков событий

Если вам нужно, чтобы ваше приложение реагировало на какое-то событие точно таким же образом, как и на некоторое другое событие, и обработчик этого события уже имеется, то вы можете просто выбрать из списка нужный вам обработчик события. В нашем примере для события OnDblClick вы можете выбрать обработчик FormClick или FormCreate. Этим можно избежать неоправданного дублирования кода.