Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы IT / ЛабаDelphi10.doc
Скачиваний:
54
Добавлен:
06.02.2015
Размер:
259.58 Кб
Скачать

2 Класс tApplication

В Delphiсуществует 3 наиболее очевидных варианта обработки сообщений, один из них методWndProcмы рассмотрели. Также существует классTApplicationподдерживающий генерирование множества событий, для которых можно создавать обработчики. ОбъектApplicationклассаTApplicationтакже может отлавливать сообщенияWindowsкоторые множеством проходят через класс обработки событийTApplicationOnMessage. Как и остальные объекты, он имеет обработчики событий по умолчанию. Но в его арсенале имеется обработчик событияOnMessageполучения сообщения.

onMessageобъектаApplicationв данном случае является свойством процедурного типа которое объявлено в классеTApplicationследующим образом:

property OnMessage: TMessageEvent read FOnMessage write FOnMessage;

а тип TMessageEventимеет следующий вид :

TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;

Поэтому гипотетический прототип метода обработки события onMessageобъектаApplicationвыглядит так:

procedure Application.Message (var Msg: TMsg; var Handled: Boolean);

Таким образом, чтобы отловить любое шныряющее к вашему приложению сообщение Windows, достаточно создать свою собственную процедуру с любым именем, например ApplicOnMessage с теми же параметрами.

То есть, процедуру:

procedure ApplicOnMessage(var Msg: TMsg; var Handled: Boolean),

описать её, а затем просто установить ссылку для обработчика события Application.OnMessage на определенную вами процедуру ApplicOnMessage.

Это делается очень просто Application.OnMessage:= ApplicOnMessage;

Теперь при получении любого сообщения объектом Applicationбудет вызываться ваш метод обработки сообщенийApplicOnMessage(varMsg:TMsg;varHandled:Boolean).

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

{ Messagestructure} // Структура типаTMSG. Она описана в модулеWindows.

PMsg = ^TMsg;

tagMSG= packed record

hwnd: HWND;

message: UINT;

wParam: WPARAM;

lParam: LPARAM;

time: DWORD;

pt: TPoint;

end;

{$EXTERNALSYM tagMSG}

TMsg = tagMSG;

MSG = tagMSG;

{$EXTERNALSYMMSG}

Запись MSG типа TMsg включает информацию о дескрипторе окна посылающего сообщения, идентификаторе сообщения, параметрах сообщения, времени отправления сообщения (в миллисекундах) и координатах курсора. Значения всех этих переменных зависят от специфики получаемого сообщения.

Параметр Handled. Если обработчик события предназначен для обработки сообщений, тогда этому параметру нужно присвоитьTrue, а если не предполагается их обрабатывать тогдаFalse.

Задание 2.1. С помощью объекта Applicationпопробуем отловить и обработать некоторые сообщения.Будем определять, какой кнопкой мыши щелкнули на форме и выведем координаты мыши основываясь на информации поля Pt в сообщении типа TMsg.

Создайте новый проект. Скиньте 2 компонента Label, туда будем выводить информацию о координатах мыши. В секцииPublicсоздайте прототип обработчика сообщений

procedure ApplicOnMessage(var Msg: TMsg; var Handled: Boolean);

и нажмите Ctrl+Shift+C

Перед вами появится заготовка данного обработчика. Но прежде чем там, что-то писать нужно, настроить метод Application.OnMessage на ApplicOnMessage. Лучше это сделать в самом начале при создании формы. Поэтому в обработчике onCreateнапишите:

Application.OnMessage:= ApplicOnMessage;

// настраиваем метод Application.OnMessageна свой обработчикApplicOnMessage

Затем перейдите в обработчик ApplicOnMessageон должен выглядеть следующим образом:

procedure TForm1.ApplicOnMessage(var Msg: TMsg; var Handled: Boolean);

varKoord:TPoint;// Самостоятельно определяем переменнуюKoordтого же типа что //и полеptпеременнойMsg

// Тип TPointописывает точку всего с двумя координатамиXиY

begin

ifMsg.message=WM_RBUTTONDOWN// Если щелкнули правой кнопкой, то

then begin

ShowMessage('Щелкнули правой кнопкой');

Koord:=Msg.pt; // присваиваем переменнойKoordполеptсообщенияMsg

label2.Caption:=IntToStr(Koord.X)+' '+IntToStr(Koord.Y);//Выводим координаты //мыши

end;

Запустите программу. Щелкайте правой кнопкой мыши. На другие кнопки мыши программа не должна реагировать. Вернитесь в РП.

Задание 2.2. Запрограммируем обработку сообщения колёсика мыши. Будем при вращении колесика уменьшать или увеличивать видимую площадь картинки.

Подключите модуль Jpegв разделе описания модулей, для правильного отображения графических файлов.

Сбросьте на форму Image1. Далее загрузите в него какой-нибудь средних размеров рисунок. Для этого щелкните на его свойствеPictureпоявится окошко

Рис. 2Picture Editor компонентаImage1

А затем щелкните Load. Загрузите средних размеров рисунок.

Нужно сказать, что для события WM_MOUSEWHEEL

параметры wParamиlParamзаписиMsgимеют:

во – первых:одинаковое значение

во – вторых:если вращаем колесико вперед то положительное значение

если вращаем колесико назад то отрицательное значение

Далее в обработчике ApplicOnMessageдопишите к уже написанному следующее:

if Msg.message=WM_MOUSEWHEEL then begin // Если крутим колесико, то

ifMsg.wParam>0then//Если в поле положительное значение (крутим вперед), то

begin

Image1.Width:=Image1.Width+7; //увеличиваем размеры видимой площади картинки

Image1.Height:=Image1.Height+7;

end

else//Иначе, (если в поле отрицательное значение (крутим назад))

begin

Image1.Width:=Image1.Width-7; //уменьшаем размеры видимой площади картинки

Image1.Height:=Image1.Height-7;

end

end;

Запустите программу. Программа должна работать правильно. Вернитесь в РП.

Соседние файлы в папке Лабы IT