Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.23.8. Сообщения (все оконные объекты)

WndProc( Msg )- один из немногочисленных виртуальных методов в TControl, так же может использоваться для переопределения основной процедуры обработки сообщений, при наследовании нового оконного объекта от TControl;

OnMessage - пользовательский обработчик любых оконных сообщений, поступающих к окну объекта. В KOL возможно назначить такой обработчик любому оконному объекту, в том числе апплету, форме или контролу, и обработать любые оконные сообщения, отправленные системой, своим кодом или другими приложениями, какие понадобится. (См. так же AttachProc и AttachProcEx).

М

ногие программисты, начиная работать в KOL, бывают озадачены тем, что не функционирует привычный для Delphi способ обработки произвольных сообщений, путем объявления (например, в декларации объекта формы) динамического обработчика с использованием директивы message. Так вот, он и не должен работать (и даже компилироваться). Данная директива не поддерживается простыми объектами языка Паскаль, а только классами, произведенными от TObject.

Однако, нет ничего проще, чем назначить обработчик события OnMessage, и написать код для обработки требуемого сообщения. Причем, такой способ позволяет расширить функциональность любого оконного объекта, и не только формы (и для этого вовсе нет необходимости производить нового наследника). Справа приведен пример гипотетического обработчика, который обрабатывает только несколько оконных сообщений, позволяя прочим быть обработанными прежним образом.

procedure TForm1.Form1Message(

Sender: PObj; var Msg: TMsg;

var Rslt: Integer ): Boolean;

begin

Result := false;

case Msg.message of

WM_USER+100: // ваш код

...

end;

end;

Обработчик события OnMessage должен возвратить (Result) булевский флажок, который разрешает дальнейшую обработку данного сообщения (тем самым, у него есть возможность предотвратить передачу сообщения другим обработчикам, если дальнейшая обработка не нужна или вредна). Самому же отправителю сообщения (например, системе, если это обычное сообщение окна) результат возвращается в виде целого числа через параметр Rslt, не путайте их, пожалуйста.

Способ обработки сообщений, предлагаемый событием OnMessage, не только не хуже, но и удобней, чем механизм динамических сообщений в VCL. Например, такой обработчик можно с легкостью добавить к любому визуальному объекту на форме (MCK). И при этом нет необходимости наследовать свой класс визуального объекта, а затем придумывать способ замещения своим объектом объекта на форме (что особенно неприятно, когда речь идет об объекте, используемом в качестве родителя, или точнее, владельца лежащего на нем дочерних визуальных объектов).

Perform( msgcode, wParam, lParam ) - отправляет окну объекта сообщение для немедленного исполнения;

Postmsg( msgcode, wParam, lParam ) - ставит сообщение в очередь окна объекта, само исполнение не начинается, пока не будет выбрано в порядке очереди;

AttachProc( proc ) - прикрепляет к списку динамических обработчиков сообщений окна указанную процедуру. В KOL это основной способ расширения функциональности существующих оконных объектов, и один из наиболее важных инструментов экономии размера кода, так как позволяет присоединить требуемый свойством обработчик сообщений только при наличии обращения к некоторому свойству или при назначении обработчика некоторого события. Кроме того, таким способом можно прикрепить несколько обработчиков, которые вызываются последовательно, от последнего прикрепленного к первому, пока один из них возвратит флаг «больше не обрабатывать» (Result = FALSE).

AttachProcEx( proc, flag ) - аналогично предыдущему, позволяет так же указать, чтобы данный обработчик продолжал функционировать после того момента, когда уже начался процесс завершения приложения (в большинстве случаев требуется, наоборот, прекратить обработку всех сообщений с того момента, когда приложение стало закрываться, но есть и исключения из этого правила);

IsProcAttached( proc ) - проверяет, что указанная процедура присоединена к списку динамических обработчиков сообщений окна;

DetachProc( proc ) - удаляет указанную процедуру из списка динамических обработчиков.