SysUtils.LoadPackage заменяет обработчик Aplication.OnMessage - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть основная форма, где я устанавливаю обработчик для события Application.OnMessage. (Код этого обработчика размещен в основной форме). Затем во время работы программы могут быть вызовы SysUtils.LoadPackage, который загружает некоторый пакет bpl. И после того, как это загружено, обработчик Application.OnMessage изменяется.

Я не мог найти, что делает это. По крайней мере, в коде нет такого кода, который идет Application.OnMessage :=.

Еще одна вещь: в отладчике перед LoadPackage я вижу обработчик OnMessage, описанный как Main.TMainForm.AppMessage. Все остальные обработчики (такие как OnMinimize, OnModalBegin и т. Д.) Равны нулю. А после LoadPackage все события имеют обработчики, описанные как Vcl.AppEvnts.TMultiCaster.DoMessage.

1 Ответ

0 голосов
/ 13 ноября 2018

В рассматриваемом пакете используется внутренний экземпляр TApplicationEvents, который является мультикастером, который перехватывает события TApplication и делегирует их каждому экземпляру TApplicationEvents в приложении, что позволяет нескольким формам, компонентам и т. Д. Получать один и тот жесобытия приложения, не наступая друг другу на ноги, пытаясь назначить обработчики для TApplication напрямую.

Таким образом, чтобы сосуществовать с пакетом, решение состоит в том, чтобы добавить TApplicationEvents к вашему MainForm и назначить обработчикк его событию OnMessage вместо непосредственного назначения обработчика для события TApplication.OnMessage.

...