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

0

В отличие от событий Delphi, обработка сообщений является обязательной и не мо жет  выполняться или  не выполняться по усмотрению программиста. Обычно, если  в программе объявлено о проведении собственной обработки сообщений, то система Windows  ожидает выполнения некоторых связанных с ней  предопределенных дейст вий.  Чаще  всего компоненты VCL выполняют большую часть  обработки своими  встро енными средствами, для доступа к которым программисту достаточно лишь вызвать об работчик базового класса  с помощью директивы inherited. Общая  схема  выглядит примерно так: собственно в обработчике сообщения должны  выполняться лишь те дей ствия, которые нужны  для приложения, а для выполнения всех  остальных действий, необходимых системе Windows,  следует  с  помощью директивы  inherited вызвать унаследованный метод.

НА ЗАМЕТКУ

Однако простого вызова унаследованного обработчика сообщения в некоторых случа- ях может оказаться недостаточно. При обработке сообщений Windows на подпрограм- му их обработки в определенных случаях могут быть наложены дополнительные огра- ничения. Например, при обработке сообщения WM_KILLFOCUS передача фокуса ввода другому элементу управления вызовет аварийное прекращение работы приложения.

Для демонстрации важности вызова  унаследованного обработчика попробуйте уб рать  директиву  inherited из  метода  WMPaint() рассмотренного ранее примера. Процедура обработки при этом будет выглядеть так:

procedure TForm1.WMPaint(var Msg: TWMPaint);

begin

MessageBeep(0);

end;

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

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

Возврат результата обработки сообщения

При  обработке определенных сообщений, Windows ожидает возврата некоторого результирующего значения.  Классическим примером может  служить  сообщение WM_CTLCOLOR. От  обработчика этого  сообщения Windows  ожидает получить дескрип тор  кисти  (brush handle), с помощью которой должно  быть  прорисовано диалоговое окно  или элемент управления. (Для своих  компонентов Delphi предоставляет свойство Color, обеспечивающее выполнение упомянутых  действий, так что пример имеет лишь иллюстративный характер.) Можно  и самостоятельно вернуть  требуемый дескриптор кисти  из процедуры обработки сообщений, назначив соответствующее значение полю Result записи TMessage (или  записи сообщения другого типа)  после  вызова  унаследо ванного обработчика (inherited). Например, при обработке сообщения WM_CTLCOLOR необходимый тип кисти можно указать Windows следующим образом:

procedure TForm1.WMCtlColor(var Msg: TWMCtlColor);

var

BrushHand: hBrush;

begin

inherited;

{Создать дескриптор кисти и назначить его переменной BrushHand}

Msg.Result := BrushHand;

end;

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

По теме:

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