Delphi. Messages. Первые наивные пробы

Решил разобраться с устройством Windows, в частности с сообщениями. Народ в сети массово отправляет к Рихтеру и Русиновичу. Книги приобрел – начал читать. Что хочу сказать – первое впечатление – информация ценнейшая для разработки под Windows. Ещё и на русском языке.  Но поскольку практика это лучший инструмент познания, решил сделать несколько простых примеров до основательного чтения этих книг. После чтения сделаю ещё несколько примеров, чтобы сравнить насколько лучше понимаю предмет.

Как отправить сообщение из приложения?

Рассмотрим на примере закрытия окна. Сообщение будет WM_CLOSE. Список всех сообщений для Windows можно посмотреть здесь.

Итак, из того, что я понял на данный момент, чтобы отправить сообщения определенному окну, часто используются функции

Оба сообщения закроют окно c Handle равным Form2.Handle Первый параметр – Handle окна, второй параметр – собственно сообщения, а третий и четвертый – дополнительные параметры, которые задействуются или нет от случая к случаю, например координаты курсора. В приведенном примере оба параметра занулены. Если поместить эти инструкции, скажем в обработчик кнопки окна, то после нажатия в ядро Windows будет направлено сообщение о закрытии окна, а Windows, соответственно просто закроет окно.

Где найти полный список сообщений?

В принципе таких ресурсов много. Вот один из них.

Слушает ли Delphi программа сообщения?

Определенно да. Вот простой пример. Поймаем сообщение нажатия правой кнопкой мыши на любом из компонентов приложения. 

Если нажмем правой клавишей мыши на любом компоненте приложения, то увидим

29

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


Как отправить “кастомное” сообщение?

Под кастомным сообщением я подразумеваю сообщение не из списка, а какое-то свое сообщение, например WM_USER+2001. Вот как можно отправить такое кастомное сообщение. Пример основан на официальной документации

30

Объявляем глобальную константу

Далее создаем и присваиваем обработчик

И последний штрих – отправляем сообщения

Ещё вариант отправки кастомного сообщения

Определяем свою константу (она должна быть прописана выше, чем метод, который её использует, то есть, например, до описания типов)

Далее определяем обработчик сообщения в методах класса формы, например, таким образом

Далее прописываем его

Далее отправляем PostMessage, скажем, по нажатию кнопки

Результат

30


Аpplication.ProcessMessages

Наконец, чтобы окончательно налепить всего в кучу про сообщения рассмотрим пример с сайта delphi-manual.ru, который очень хорошо демонстрирует работу Application.ProcessMessages.

Насколько я понял, сообщения в Windows выстраиваются в очередь. Отправка через PostMessage это постановка сообщения в конец очереди, отправка через SendMessage это отправка сообщения мимо очереди – оно будет выполнено одним из первых, не смотря на других ожидающих. Аналогичное действие у Application.ProcessMessages

Этот код с сайта delphi-manual.ru очень хорошо демонстрирует действие Application.ProcessMessages

В данном случае мы пытаемся добиться моргания текста в Edit1.Text, если не пользоваться Application.ProcessMessages, то этого моргания не будет, потому что сообщения в конце очереди, а если раскомментировать Application.ProcessMessages, то сообщения будут в начале очереди

Результат

31

This entry was posted in Delphi. Bookmark the permalink.