Главная » Delphi » Обработка сообщений

0

Обработка  сообщений (handling) означает, что  приложение тем  или  иным  образом реагирует на получаемые от операционной системы сообщения. В стандартном прило жении Windows обработка сообщений выполняется в процедурах окна.  Но Delphi, час тично обрабатывая сообщения, упрощает работу программиста, позволяя вместо  одной процедуры для обработки всех типов  сообщений создавать независимые процедуры для обработки сообщений каждого  типа.  Любая  процедура обработки сообщений должна отвечать трем требованиям.•   Процедура должна быть методом  класса.

•   Процедура должна  принимать по ссылке  (определенный как var) один  параметр типа TMessage или любого другого типа специализированного сообщения.

•    Объявление  процедуры  должно  содержать  ключевое  слово  message,  за  кото

рым должна следовать константа, задающая  тип обрабатываемого сообщения.

Вот пример объявления процедуры, обрабатывающей сообщение WM_PAINT:

procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

НА ЗАМЕТКУ

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

В качестве примера напишем простую процедуру  обработки сообщения WM_PAINT, которая вместо перерисовки окна будет подавать звуковой сигнал.

Создайте новый пустой  проект. Добавьте в  окне  редактора  заголовок функции

WMPaint, поместив его в раздел private объект TForm1:

procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

Теперь  в  раздел   implementation модуля  добавьте  определение  процедуры. В этом случае указание  ключевого слова message не требуется. Не забудьте  опреде лить  область  видимости новой  процедуры, указав с помощью точечного оператора (.) на принадлежность к методам  класса TForm1.

procedure TForm1.WMPaint(var Msg: TWMPaint);

begin

Beep;

inherited;

end;

Обратите внимание на  использование в процедуре ключевого слова  inherited (унаследованный), которое  позволяет передать сообщение обработчику, принадле жащему базовому  классу. В данном  случае по ключевому  слову inherited сообщение передается обработчику сообщения WM_PAINT класса TForm.

НА ЗАМЕТКУ

В отличие от вызова обычных унаследованных методов, в данном случае имя базового метода не указывается. Дело в том, что при обработке сообщений имя метода не име- ет значения, так как Delphi отыскивает процедуру обработки сообщения по значению, задаваемому в интерфейсе класса ключевым словом message.

В листинге 3.1 приведен пример простой формы, в которой будет обрабатываться сообщение WM_PAINT. Подготовить данный проект очень  просто —  достаточно соз дать новый  проект и добавить код процедуры WMPaint в описание объекта TForm.

Листинг 3.1. GetMess — пример обработки сообщения

unit GMMain; interface uses

SysUtils, Windows, Messages, Classes, Graphics, Controls,

Forms, Dialogs;

type

TForm1 = class(TForm)

private

procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMPaint(var Msg: TWMPaint);

begin

MessageBeep(0);

inherited;

end;

end.

Каждый  раз,  получая  сообщение WM_PAINT, приложение будет вызывать процеду ру WMPaint. Она  просто проинформирует об этом  звуковым  сигналом, издаваемым с помощью процедуры MessageBeep(), а затем  передаст управление унаследованному обработчику данного сообщения.

Процедура MessageBeep() — отладчик для бедных

Упомянув процедуру MessageBeep(), позволим себе небольшое отступление от основной темы. Эта процедура является одним из самых простых и полезных элементов интерфейса API Win32. Она очень проста в использовании: достаточно лишь передать ей некоторую за- ранее определенную константу — и система Windows пошлет звуковой сигнал на динамик компьютера (или, при наличии звуковой платы, воспроизведет соответствующий файл

.WAV). “Ну и что?” — спросите вы. Хоть это и не очевидно с первого взгляда, но процедура

MessageBeep() очень удобна для отладки программ.

Если необходимо быстро, без привлечения отладчика и задания точек останова, уточ-

нить, достигает ли программа в ходе своего выполнения некоторого места в ее коде, поместите туда вызов процедуры MessageBeep(). Эта процедура не требует переда- чи  ей  в  качестве  параметра  дескриптора  окна  или  некоторого  другого  ресурса Windows, поэтому ее можно вызвать практически из любого места программы. Если компьютер имеет звуковую плату, можно передавать этой процедуре несколько зара- нее определенных значений параметра (они описаны в интерактивной справочной сис-теме Win32 API) и определять по воспроизводимой мелодии, что же именно произош-

ло.

Если не хочется каждый раз писать такое длинное название процедуры, используйте про- цедуру Beep() из модуля SysUtils, которая представляет собой вызов процедуры Mes- sageBeep() с параметром 0.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии