Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
8
Добавлен:
25.12.2018
Размер:
683.01 Кб
Скачать

Vk_return: NumMemo.DoNumStr(l);

End;

End;

После запуска программы и ввода нескольких строк следует поочередно нажать клавиши Up и Down. Компонент Labell будет отображать номер те­кущей строки. Если в виртуальном конструкторе убрать строку OnNumStr:=EventNumStr, то вся работа нарушается. Это означает, что работа­ет именно делегированный обработчик.

г) Использование методов сообщений.

Некоторые события в классе TControl помимо корреспондирующих ме­тодов включают и объявление методов сообщений, с помощью которых осу­ществляется вызов корреспондирующих методов. Для этого следует объявить идентификатор пользовательского сообщения и метод сообщения в объявляемом классе. Далее следует представить реализацию метода сообщения, код которого должен включать обращение к корреспондирующему методу. Далее следует посылать сообщение любым известным способом.

Const WM_USER1=WM_APP; // Идентификатор номера сообщения Type

TNumMemo=Class(TMemo) Protected

II Дополнительно объявляем метод сообщения Procedure WMNumStr(Var Msg: TMessage); Message WM_USER1;

Реализация метода сообщения может быть очень проста:

Procedure TNumMemo.WMNumStr(Var Msg: TMessage);

Begin

Forml.NumMemo.DoNumStr(Msg.wParam);

End;

Теперь вызов корреспондирующих методов может быть заменен посыл­кой сообщений. Приведем несколько различных вариантов посылки сообще­ния о возникновении события.

Procedure TForml.FormKeyDown(Sender: TObject; Var Key: Word;

Shift: TShiftState);

Begin

Case Key Of

VK_DOWN: IfNuniMeino.NuinStr<NumMeino.Lines.Count+l Then NuniMemo.Perfornt(WM_USERl, 1, 0);

VK_UP: IfNumMemo.NuniStr>l Then

SendMessage(NumMemo.Handle, WM_USER1, -1, 0);

Vk_return: PostMessage(NumMemo.Handle, wm_user1,1, 0);

End;

End;

Более подробно использование сообщений будет рассмотрено во второй части пособия в главе, посвященной сообщениям Windows.

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

События - это свойства процедурного типа, предназначенные для созда­ния пользовательских реакций на те или иные входные воздействия. Присво­ить такому свойству значение - это указать адрес метода, который будет вы­зываться в момент наступления события (содержит также и адрес объекта с данными). Программист может написать код обработчика события, a Delphi должна адрес этого обработчика события поместить в соответствующее со­бытию поле.

Для создания обработчика событий необходимо дважды щелкнуть мы­шью по соответствующему событию компонента на странице Events инспек­тора объектов. Delphi создаст заготовку обработчика события, включая объявление метода в классе TForm и его реализацию с операторными скобками Begin End.

События имеют разные типы в зависимости от происхождения и предна­значения. Многие события Delphi возникают, когда поступает соответствую­щее сообщение Windows. Событие выполняет предварительную обработку сообщения и предоставляет информацию о том, какой объект вызвал это со­бытие, а для специфических событий и дополнительную информацию. Таким образом, вся необходимая информация для написания обработчика имеется в руках программиста.

Фактически процедуры-обработчики событий различаются набором па­раметров, при этом общим для всех является параметр Sender, указывающий на объект-источник события. Когда происходит событие, связанное с некото­рым обработчиком событий, этот обработчик событий получает сообщение для объекта, который породил это событие. Это сообщение передается обра­ботчику события через параметр Sender. По существу, когда обработчик вы­зван, Sender содержит объект, породивший событие. Поскольку все классы являются потомками от TObject, то экземпляр любого класса может быть присвоен переменной или параметру TObject (полиморфное присвоение). Ис­пользование Sender - это способ позволить объекту любого класса переда­ваться в процедуру обработки события.

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

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

Все компоненты, как правило, могут реагировать на события. Хотя мно­гие простые объекты, например текстовые метки (TLabel), способны реагиро­вать только на немногие события, однако все равно есть возможность вы­брать следующие действия:

• проигнорировать событие. В этом случае поведение объекта будет оп­ределяться обработчиком события по умолчанию и его можно переопреде­лить;

• перехватить событие (trap the event). Тогда необходимо написать соб­ственный обработчик события, изменяющий поведение объекта, принятое по умолчанию.

я) Обработчики уведомительных событий.

Самый простой тип стандартного события TNotifyEvent является уведо­мительным и не имеет других параметров, кроме Sender, указывающего на объект, вызвавший событие. Тип объявлен в модуле Classes следующим об­разом:

Type TNotifyEvent=Procedure(Sender: TObject) Of Object;

Наиболее часто используемое событие этого типа OnClick - щелчок мы­шью по компоненту предусмотрен у большинства компонентов управления. В простейшем случае обработчик этого события может выглядеть следую­щим образом:

Procedure TForml.FormClick(Sender: TObject);

Begin

ShowMessage('Щелчок мышью по форме!');

End;

б) Обработчики специфических событий.

При возникновении специфического события, операционная система пе­редает не только уведомление (сообщение) о нем, но и некоторую связанную с ним информацию. Например, когда пользователь щелкает мышкой (событие OnMouseDown), операционная система обрабатывает это событие и передает сообщение в окно, которое должно обработать данное событие. При этом дополнительная информация включает координаты нахождения мыши в момент щелчка и сведения о том, какая клавиша мыши была нажата. Это со­бытие имеет тип TMouseEvent, который объявлен в Delphi следующим обра­зом:

Type TMouseEvent^Procediu^Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer) Of Object;

Если вы хотите создать обработчик этого события, то вы должны обра­титься к инспектору объектов, найти событие OnMouseDown на странице Events и написать код обработчика этого события. Эту процедуру-обработчик можно использовать, например для вывода на поле формы координат мест

нажатия на левую клавишу мыши, если определить тело этой процедуры сле­дующим образом:

Procedure TForml.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Begin

Forml.Canvas.Font.Color:=clBIue; // Установка цвет текста Forml.Canvas.Brush.CoIor:=cIBtnFace; // Установка цвета фона Forml.Canvas.TextOut(X, Y, 'X='+IntToStr(X)+' Y='+IntToStr(Y));

End;

Как видно из приведенного примера, программист не обязан использо­вать всю предоставленную событием информацию.