Some latest news about Max Polyakov read by this website

Любой компонент, как и программа в целом, работает под управлением Windows1. Эта операционная система посылает приложению массу сообщений, связанных с действиями пользователя или особенностями выполнения кода. Большинство сообщений порождает стандартные события, рассмотренные в 9.2. Однако компонент (программа) может определять нестандартные (пользовательские) сообщения и пересылать их другим компонентам или программе, подобно тому, как это происходит с сообщениями Windows. Кроме того, возможно вам понадобится самостоятельно реализовать перехват и обработку сообщений Windows.

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

В этом разделе описывается, как перехватывать и обрабатывать компонентные сообщения и сообщения Windows.

9.4.1. Суть сообщений Windows и их передача

Сообщение Windows представляет собой следующую структуру данных: type TMessage - packed record

Msg: Cardinal; case Integer of 0: (

1 Напомню, что в книге не рассматриваются компоненты для ОС Linux. Особенности обработки сообщений {сигналов) этой ОС см. в документации Component Writer's Guide.

WParam: Longlnt; LParam: Longlnt; Result: Longlnt); 1: (

WParamLo: Word;
WParamHi: Word;
LPararoLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;

Главным полем структуры является поле Msg, в котором передается идентификатор сообщения. В модуле Messages определены идентификаторы всех действующих в 32-разрядных версиях Windows сообщений в виде констант WM_XXXX. Для них зарезервированы значения типа Cardinal от 0 до 1023 включительно. Поля WParam и LParam1 трактуются в зависимости от идентификатора сообщения. Например, для сообщения WM_KEY поле WParam содержит виртуальный код нажатой клавиши, а поле LParam - некоторую дополнительную информацию (количество повторных нажатий, скан-код клавиши и т. д.). Замечу, что большинство сообщений Windows в модуле Messages имеют специализированные типы TWMXXXX, которые содержат названия полей, соответствующие их назначению для данного сообщения. Так, для сообщения WM_KEY, связанного с нажатием клавиши, представлен следующий тип TWMKey:

TWMKey = packed record

Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longlnt;
Result: Longlnt;
end;

При манипуляциях мышью возникает сообщение WM_MOUSE, которому соответствует такой тип:

TWMMouse = packed record

Msg: Cardinal; Keys: Longint; case Integer of 0: (

XPos: Smallint; YPos: Smallint); 1: (

Pos: TSmallPoint;
Result: Longint);
end;

1 Названия полей сохранены такими же, как в ОС Windows 16, в которой поле WParam имело тип Word, a LParam - тип Longlnt.

Подготовленное ядром Windows сообщение передается методу MainWndProc, который имеют все визуальные оконные компоненты. Этот метод никак не обрабатывает полученное сообщение. Он создает защищенный блок обработки сообщения и передает сообщение для дальнейшей обработки активному компоненту, вызывая указываемый своим свойством WindowProc виртуальный метод WndProc. Этот метод производит анализ сообщения и вызывает нужный метод диспетчеризации, который, в свою очередь, вызывает обработчик пользователя (рис. 9.1).

9.4. Обработка сообщений Windows и компонентных сообщений

Рис. 9.1. Обработка сообщения Windows

Все методы WndProc умеют осуществлять обработку предназначенных для соответствующих компонентов событий, а также умалчиваемую обработку остальных. Обычно тело метода WndProc содержит несколько операторов if и один или несколько операторов case, с помощью которых анализируется поле Msg полученного сообщения и вызывается соответствующий метод диспетчеризации. Если не найден подходящий метод диспетчеризации, осуществляется умалчиваемая обработка сообщения (обычно сообщение просто игнорируется).

9.3.4. Создание метода диспетчеризации || Оглавление || 9.4.2. Изменение стандартной обработки сообщений


Искусство создания компонентов Delphi



Новости за месяц

  • Декабрь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31