Работа с Windows и компонентни съобщения

Сайт на Delphi: ежедневни Delphi-новини, документация, статии, преглед, интервю, компютърен хумор.

Всеки компонент, както и програмата като цяло, работи под Windows1. Тази операционна система изпраща много съобщения до приложението, свързани с действия на потребителя или функции за изпълнение на код. Повечето съобщения генерират стандартните събития, обсъдени в 9.2. Въпреки това, компонент (програма) може да дефинира нестандартни (персонализирани) съобщения и да ги препраща към други компоненти или програма, подобно на това, което правят съобщенията на Windows. Освен това може да се наложи сами да приложите прихващането и обработката на съобщенията на Windows.

Delphi също дефинира набор от компонентни съобщения, които компонентите обменят. С тези съобщения те се уведомяват взаимно за промяна в текущото състояние.

Този раздел описва как да прихващате и обработвате компонентни и Windows съобщения.

9.4.1. Същността на Windows съобщенията и тяхното предаване

Съобщението на Windows е следната структура от данни: тип TMessage - пакетиран запис

Msg: кардинал; case Цяло число от 0: (

1 Нека ви напомня, че книгата не обхваща компоненти за Linux OS. Характеристики на обработка на съобщения

WParam: LongInt; LParam: LongInt; Резултат: LongInt); 1: (

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

TWMKey = пакетиран запис

При манипулиране на мишката се появява съобщение WM_MOUSE, което съответства на следния тип:

TWMMouse = опакован запис

Msg: кардинал; Ключове: Longint; case Цяло число от 0: (

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

1 Имената на полетата са същите като в Windows 16, в която полето WParam е от тип Word, а LParam е от тип LongInt.

Съобщението, подготвено от ядрото на Windows, се предава на метода MainWndProc, който имат всички компоненти на визуален прозорец. Този метод не обработва полученото съобщение по никакъв начин. Той създава защитен блок за обработка на съобщения и предава съобщението на активния компонент за по-нататъшна обработка чрез извикване на виртуалния метод WndProc, определен от неговото свойство WindowProc. Този метод анализира съобщението и извиква съответния метод за изпращане, който от своя страна извиква потребителския изход (Фигура 9-1).

Ориз. 9.1. Обработка на Windows съобщение

Всички методи на WndProc могат да обработват събития, предназначени за съответните компоненти, както и обработка по подразбиране на останалите. Обикновено тялото на метода WndProc съдържа няколко израза if и един или повече оператора case, които анализират полето Msg на полученото съобщение и извикват подходящия метод за изпращане. Ако не бъде намерен подходящ метод за планиране,безшумна обработка на съобщението (обикновено съобщението просто се игнорира).