Есть ли способ регистрировать каждое событие графического интерфейса в Delphi?

Отладчик 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. После небольшого взлома я заставил его работать довольно хорошо, по крайней мере, для моего использования (он не регистрирует ключевые события, но это можно добавить). Я разместил здесь код

Для использования

  1. Загрузите EventInterceptor Unit и добавьте его в свой проект
  2. Добавьте EventInterceptor Unit в предложение Uses
  3. Добавьте эту строку где-нибудь в код для каждую форму, которую вы хотите отслеживать.

    AddEventInterceptors (MyForm);

Откройте окно отладчика, и любые вызываемые события будут регистрироваться в журнале событий

[/ EDIT2]

15
задан awmross 14 January 2011 в 04:57
поделиться