Для обработки сообщений Windows в Delphi существует механизм динамических методов, называемых сообщениями. Они должны быть описаны в классе как процедуры, имеющие один параметр, передаваемый по имени (через var). После описания заголовка через ";" должно идти зарезервированное слово message, после которого идет индекс — идентификатор сообщения. Описание параметра, передаваемого в процедуру через var, произвольно (в первоначальной версии Delphi параметр должен был описываться как переменная соответствующего для message типа : tWM_Size, tWM_Move, и т.д.):
type
tMyControl1=
class(tWinControl)
procedure WMSize(var message:tWMSize);message WM_Size;
{начальный вариант синтаксиса}
end;
tMyControl2=
class(tMyControl1)
procedure Resize(var Info);message WM_Size; {так тоже можно}
end;
В модуле Messages описаны обработчики практически всех необходимых сообщений Windows. Каждый обработчик имеет идентификатор — целочисленную константу. Например, WM_Size — идентификатор сообщения об изменении размера экранной формы, WM_Move — идентификатор сообщения о ее перемещении и т.д.
В обработчиках сообщений можно вызвать прародительский метод с использованием только одного слова inherited, без указания его имени: он находится автоматически по индексу.
Самый общий обработчик — метод DefaultHandler, описанный в классе tObject. При обработке сообщения обычно надо вызвать в конце обработчик для прародителя:
procedure MyMsgHandler(var message);message WM_command;
begin
MyProcessing; {некая процедура обработки сообщения}
inherited; {в отличии от конструктора, вызов в самом конце}
end;
При получении объектом от операционной системы Windows сообщения описанного типа (идентификация сообщений происходит автоматически по индексам) вызывается соответствующий обработчик. В описанном выше примере это MyMsgHandler.
Однако обычно нет необходимости обрабатывать сообщения Windows, так как имеется механизм делегирования событий, о котором сейчас пойдет речь.
При необходимости обработки сообщений в обработчике события (см. следующий параграф) надо вызвать метод application.processMessages.