Отладчик Delphi отлично подходит для отладки линейного кода, где одна функция вызывает другие функции в предсказуемом, линейном режиме, и мы можем проделывать программу по строкам.
Я считаю, что отладчик менее полезен при работе с управляемым событиями gui-кодом, где одна строка кода может вызывать запуск новых событий, что может в свою очередь инициировать другие события. В этой ситуации подход "шаг за шагом" не позволяет мне видеть все, что происходит.
Как я обычно решаю это: 1) угадать, какие события могут быть частью проблемы, затем 2) добавить контрольные точки или вести журнал для каждого из этих событий.
Проблема заключается в том, что этот подход является случайным и требует много времени.
Есть ли переключатель, который я могу щелкнуть в отладчике, чтобы сказать "log all gui events"? Или есть какой-то код, который я могу добавить в события ловушки, что-то вроде
procedure GuiEventCalled(ev:Event)
begin
log(ev);
ev.call();
end
Конечный результат, который я ищу, это что-то вроде этого (например):
FieldA.KeyDown
FieldA.KeyPress
FieldA.OnChange
FieldA.OnExit
FieldB.OnEnter
Это приведет к догадкам из отладки Delphi gui.
Я использую Delphi 2010
[EDIT] Несколько ответов предложили способы перехвата или регистрации сообщений Windows. Другие затем отметили, что не все события Delphi - это сообщения Windows вообще. Я думаю, что это те типы событий "Non Windows Message", о которых я спрашивал; События, созданные кодом Delphi. [/EDIT]
[EDIT2] Прочитав всю информацию здесь, у меня возникла идея использовать RTTI для динамического перехвата TNotifyEvents и регистрации их в журнале событий в окне "Отладка". Сюда входят события OnEnter, OnExit, OnChange, OnClick, OnMouseEnter, OnMouseLeave. После небольшого взлома я получил его для работы очень хорошо, по крайней мере для моего использования (он не регистрирует ключевые события, но может быть добавлен). Я разместил код здесь
Чтобы использовать
- Загрузите блок EventInterceptor и добавьте его в свой проект
- Добавить блок EventInterceptor в предложение Uses
-
Добавьте эту строку где-нибудь в свой код для каждой формы, которую вы хотите отслеживать.
AddEventInterceptors (MyForm);
Откройте окно отладки, и все события, которые вызывают, будут зарегистрированы в журнале событий
[/EDIT2]