Delphi — объектно-ориентированный визуальный инструмент разработки программного обеспечения от компании Borland. Delphi сочетает в себе преимущества Visual C++ и Visual Basic: простой в использовании, мощный и обладает уникальными преимуществами, особенно в проектировании интерфейсов, программировании баз данных и сетевом программировании.
Сообщения в Delphi
Сообщение — это уведомление, отправленное Windows, которое сообщает приложению о том, что произошло событие. В Delphi в большинстве случаев сообщения Windows инкапсулируются в события VCL. Однако, если нам нужно написать свои собственные элементы управления, перехватывать или фильтровать сообщения, нам придется углубиться в механизм обработки сообщений.
В Delphi сообщения определяются в виде записей TMessage. Откройте файл Message.pas, мы увидим, что Tmessage определен следующим образом:
тип
TMessage = упакованная запись
Сообщение: Кардинал;
случай Целое число
0: (WParam: Лонгинт;
ЛПарам: Лонгинт;
Результат: Лонгинт);
1: (WParamLo: Слово;
WParamHi: Слово;
ЛПарамЛо: Слово;
LParamHi: Слово;
РезультатЛо: Слово;
РезультатПривет: Слово);
конец;
Среди них Msg — это постоянное значение, которое отличается от других сообщений. Эти константные значения могут быть предопределенными константами в модулях Windows или определяемыми пользователем константами. Wparam обычно представляет собой постоянное значение, связанное с сообщением, или может быть дескриптором окна или элемента управления. LParam обычно является указателем на данные в памяти.
Результатом является возвращаемое значение обработки сообщения. Wparam, Lparam и Result являются 32-битными. Если вы хотите получить доступ к нижним 16 битам или старшим 16 битам, вы можете использовать WparamLo, WparamHi, LParamLo, LparamHi, ResultLo и ResultHi соответственно.
В дополнение к общему Tmessage в Delphi для каждого окна определяется специальная запись сообщения. Мы можем просмотреть файл Message.pas и вот запись сообщения клавиатуры:
TWMKey = упакованная запись
Сообщение: Кардинал;
Код символа: Слово;
Не используется: Слово;
Ключевые данные: Лонгинт;
Результат: Лонгинт;
Сообщения, связанные с клавиатурой, такие как записи WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP и WM_SYSCHAR, также определяются как TWMkey. В файле Message.pas есть следующий оператор:
TWMChar=TWMkey;
TWMkey; TWMKeyUp=TWMSys;
-KeyDown=TWMkeyUp=;
TWMkey;TWMSysChar=TWMkey;TWMSysChar=TWMkey;
отправка сообщений
Обработка сообщений определяет, как приложение реагирует на сообщения Windows. В Delphi каждое сообщение имеет свой собственный процесс обработки. Оно должно быть методом объекта и может передавать только одну запись Tmessage или другую специальную запись сообщения. После объявления метода должна следовать команда сообщения, за которой следует сообщение в диапазоне от 0. до Константы между 32767.
Все сообщения, о которых мы упоминали ранее, являются стандартными сообщениями Windows (WM_X). Кроме того, существуют внутренние сообщения VCL, сообщения уведомлений и пользовательские сообщения.
Внутренние сообщения VCL обычно начинаются с «CM_» и используются для управления вещами внутри VCL. Если вы измените значение свойства или некоторые другие характеристики компонента, вам необходимо уведомить другие компоненты об изменении через внутренние сообщения. Например, сообщение активации фокуса ввода отправляется активированному или деактивированному компоненту, чтобы принять или отказаться от фокуса ввода.
Существуют также уведомления. Что-то происходит с дочерним элементом управления в окне, и родительское окно должно быть уведомлено. Это достигается с помощью уведомлений. Он работает только со стандартными элементами управления окнами, такими как кнопки, списки, поля редактирования и т. д. Откройте файл Message.pas. После стандартного окна Windows идет объявление уведомления:
константа
{$EXTERNALSYM BN_CLICKED}
БН_КЛИКЕД = 0;
{$EXTERNALSYM BN_PAINT}
БН_ПАИНТ = 1;
{$EXTERNALSYM BN_HILITE}
БН_ХИЛИТ = 2;
Выше приведены уведомления о кнопке, которые соответственно указывают, что пользователь нажал кнопку, что кнопку следует перерисовать и что пользователь выделил кнопку.
Пользователи также могут определять свои собственные сообщения, отправлять сообщения самим себе и писать процедуры обработки сообщений. Постоянное значение сообщения — от WM_USER+100 до $7FFF. Этот диапазон зарезервирован Windows для пользовательских сообщений.
Существует три метода отправки сообщений Delphi:
1. Выполните объектный метод класса Tcontrol. Вы можете отправлять сообщения в любую форму или элемент управления, вам нужно только знать экземпляр формы или элемента управления. Его заявление следующее:
функция Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint
2. Функции Windows API SendMessage() и Postmessage(). Его заявление следующее:
функция SendMessage (hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
функция SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
Функция PostMessage добавляет сообщение в очередь сообщений приложения. Цикл сообщений приложения извлечет зарегистрированное сообщение из очереди сообщений и затем отправит его в соответствующее окно.
Функция SendMessage может отправлять сообщения непосредственно оконной процедуре через очередь сообщений. Таким образом, SendMessage используется, когда Windows необходимо немедленно вернуть значение, а PostMessage используется, когда различным приложениям необходимо последовательно обрабатывать сообщения. Perform по сути аналогичен SendMessage, они отправляются непосредственно в оконную процедуру. Функциям SendMessage и Postmessage необходимо знать только дескриптор окна для отправки сообщений, чтобы они могли отправлять сообщение в форму, отличную от Delphi, но Perform должен знать экземпляр формы или элемента управления.
Механизм обработки сообщений VCL
В исходном коде приложения Delphi есть оператор application.Run. Его функция — запустить цикл обработки сообщений и затем вызвать Application.PROcessMessage. Эта функция находит сообщение в очереди сообщений приложения. Когда сообщение извлекается из очереди сообщений, запускается событие Application.OnMessage. Таким образом, прежде чем сама Windows обработает сообщение, она ответит на обработку события OnMessage. Это превосходит любую обработку сообщений и принимает только зарегистрированные сообщения, то есть сообщения, отправленные PostMessage, как упоминалось выше. Процесс обработки, реагирующий на событие Application.OnMessage, должен иметь тип TmessageEvent, который объявляется следующим образом:
тип TMessageEvent = процедура (var Msg: TMsg; var Handled: Boolean) объекта;
Где TMsg — это запись сообщения, определенная в Windows, мы можем объявить ее следующим образом:
Процедура OnMyMessage(var Msg:TMsg;var Handled:Boolean);
Затем назначьте этот метод событию Application.OnMessage:
Application.OnMessage :=OnMyMessage;
Событие OnMessage будет захватывать все сообщения, отправленные в приложение, что является очень загруженным событием, поэтому нецелесообразно устанавливать точки останова во время обработки события OnMessage для обработки сообщений.
Метод, используемый объектом VCL для получения сообщений, называется MainWndProc. Это статический метод, определенный в классе Twincontrol, и его нельзя перегрузить. Он не обрабатывает сообщение напрямую. Когда сообщение покидает MainWndProc, оно передается методу WndProc объекта. Метод WndProc — это виртуальный метод, определенный в классе Tcontrol, который вызывает метод Dispatch. Dispatch ищет соответствующий метод обработки на основе входящего сообщения. Если в конце концов он не может его найти, он продолжает поиск метода обработки сообщения в родительском классе, пока он не будет найден, он вызывает Defaulthandler. Метод Defaulthandler выполняет окончательную обработку сообщения, а затем передает сообщение функции Windows DefWindowProc или другим оконным процедурам по умолчанию.