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