Добавил:
ikot.chulakov@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Delphi с готовыми программами / Лабораторная работа №15 Иерархия классов, компоненты.pdf
Скачиваний:
21
Добавлен:
12.07.2020
Размер:
666.72 Кб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

может быть много, необходимо каким-то способом выделять элемент, которому данный момент передается клавиатурный ввод. Это выделение достигает передачей элементу фокуса ввода с помощью его метода:

procedure SetFocus;

Компонент с фокусом ввода имеет значение True в своем свойстве property Focused: Boolean;

Если элемент недоступен или невидим, его показанное далее свойство имеет значение

False:

property CanFocus: Boolean;

Фокус ввода передается элементу после щелчка на нем мышью или в порядке выбора его клавишей <Таb>. Чтобы элемент можно было выбирай помощью этой клавиши, следует установить в следующее его свойство значение True:

property TabStop: Boolean;

Порядок выбора элемента определяется другим свойством: property TabOrder: Integer;

Delphi следит за уникальностью и непрерывностью значений этого свойства у всех помещенных на форму доступных и видимых в данный момент и компонентов. С помощью следующего метода можно получить список всех дочерних элементов, выбираемых клавишей <Таb>:

procedure GetTabOrderList(List: TList);

Обратите внимание, что получить фокус ввода может только потомок класса

TWinControl.

Класс TGraphicControl

Класс TGraphicControl в отличие от класса TWinControl не имеет дескриптора окна и, соответственно, не может самостоятельно получать сообщения Windows. Взаимодействие потомков этого класса с Windows реализуется средствами библиотеки VCL. Преимуществом использования потомков этого класса является экономия дескрипторов окон (оконных ресурсов). Недостатком потомков класса TGraphicControl является отсутствие возможности иметь дочерние элементы (в отличие от класса TWinControl).

События

Событие представляет собой связь между некоторым происшествием, вызванным действиями пользователя, вмешательством операционной системы или логикой программы, и некоторым программным кодом, отвечающим за это происшествие. Совокупность события и кода, выполняющегося в ответ на это о событие, называется свойством-событием и реализуется как указатель на подпрограмму. Эта подпрограмма называется обработчиком события. Свойства-события позволяют реализовать различные поведенческие аспекты одного и того же компонента без необходимости его переделки, простым изменением кода обработчиков событий.

Указатель на метод

Delphi трактует событие как указатель на метод. В предыдущих лабораторных работах уже рассматривался тип указатель на метод (Лабораторная работа №11). Указатель на метод – это особый тип указателя, которым реализуется ссылка на метод экземпляра

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

класса. Указатели на методы во всем подобны обычным указателям, но еще поддерживают скрытый указатель на класс конкретного объекта. Этот указатель – не что иное, как Self – указатель на экземпляр. Когда возникает событие, этот указатель передается неявно вместе с другими параметрами обработчику события. В результате компонент как бы делегирует свойство-событие другой программе, объявляя, что именно он осуществил вызов обработчика. Поэтому этот механизм называют также механизмом делегирования методов.

Указатель на метод компонента обычно сохраняют в закрытом поле (в секции private). При возникновении события он проверяет это поле и вызывает обработчик пользователя:

if Assigned(FOnClick) then FOnClick(Self);

Важной особенностью события является возможность связать его с некоторым программным кодом – обработчиком события. Чтобы это стало возможным на этапе конструирования программы, события должны отображаться в окне Инспектора объектов. С этой целью формально они объявляются в виде свойств.

Подобно другим свойствам, свойства-события имеют внутренние поля, в которых хранятся указатели на обработчики событий. В отличие от других свойств, свойствасобытия не используют косвенные способы доступа к этим полям с помощью процедур WriteXXXX и функций GetXXXX. Вместо этого они просто ссылаются на эти поля. Например:

type

TMyControl = class(TGraphicControl) private

FOnClik: TNotifyEvent; // Поле для указателя на метод published

// Объявление свойства-события:

property OnClick: TNotifyEvent read FOnClick write FOnClick; end;

Стандартные события

Стандартными являются события, связанные с мышью и клавиатурой. Эти события определены только для визуальных компонентов. Большинство из них создается в классах TControl и TWinControl: первый класс определяет события, общие для любых визуальных компонентов, второй – только для оконных компонентов.

Обратите внимание, что в этих классах события объявлены в секции protected. Если вы наследуете от одного из этих классов и хотите сделать события доступными в окне Инспектора объектов, необходимо заново объявить их в секции published. Например:

Общие события связаны с мышью и осуществляемыми с ее помощью операциями перетаскивания и причаливания. Они создаются в классе TControl – родоначальнике визуальных компонентов и перечислены в таблице 4.

Таблица 4 – Некоторые общие свойства визуальных компонентов

Событие

Описание

 

 

OnCanResize

Возникает перед изменением размеров компонента

OnClick

Возникает при щелчке на компоненте

OnDblClick

Возникает при двойном щелчке на компоненте