Debugger Delphi doskonale nadaje się do debugowania kodu liniowego, gdzie jedna funkcja wywołuje inne funkcje w przewidywalny, liniowy sposób, a my możemy przechodzić przez linię programu po linii.Czy istnieje sposób rejestrowania każdego zdarzenia GUI w Delphi?
Uważam, że debugger jest mniej przydatny, gdy mamy do czynienia z kodem GUI sterowanym zdarzeniem, gdzie pojedynczy wiersz kodu może powodować wyzwalanie nowych zdarzeń, co z kolei może powodować inne zdarzenia. W tej sytuacji podejście "krok po kodzie" nie pozwala mi zobaczyć wszystkiego, co się dzieje.
Sposób, w jaki zwykle rozwiązuję to: 1) odgadnąć, które zdarzenia mogą być częścią problemu, następnie 2) dodać punkty przerwania lub zalogować się do każdego z tych zdarzeń.
Problem polega na tym, że takie podejście jest przypadkowe i czasochłonne.
Czy jest przełącznik, który można uruchomić w debugerze, aby powiedzieć "log all gui events"? Czy jest jakiś kod mogę dodać do wydarzeń pułapkę, coś
procedure GuiEventCalled(ev:Event)
begin
log(ev);
ev.call();
end
Efektem końcowym szukam jest coś takiego (na przykład):
FieldA.KeyDown
FieldA.KeyPress
FieldA.OnChange
FieldA.OnExit
FieldB.OnEnter
będzie to trwać przez cały zgadywanie z debugowania GUI Delphi.
używam Delphi 2010
[edytuj] Kilka odpowiedzi sugerowane sposoby przechwytywać lub rejestrowania komunikatów Windows. Inni wskazywali, że nie wszystkie zdarzenia Delphi są w ogóle komunikatem Windows. Wydaje mi się, że to właśnie tego rodzaju zdarzenia o charakterze "wiadomości z systemu Windows" były o to pytane; Zdarzenia tworzone przez kod Delphi. [/ EDIT]
[EDIT2] Po przeczytaniu wszystkich informacji tutaj, wpadłem na pomysł, aby użyć RTTI do dynamicznego przechwytywania TNotifyEvents i rejestrowania ich w dzienniku zdarzeń w oknie debugowania. Obejmuje to zdarzenia OnEnter, OnExit, OnChange, OnClick, OnMouseEnter, OnMouseLeave. Po odrobinie hackowania udało mi się to całkiem dobrze, przynajmniej na mój użytek (nie zapisuje kluczowych zdarzeń, ale można to dodać). ja pisał kod here
Aby korzystać
- Pobierz Jednostka EventInterceptor i dodać go do swojego projektu
- Dodaj EventInterceptor Jednostka klauzuli używa
Dodaj tę linię gdzieś w Twój kod dla każdego formularza, który chcesz śledzić.
AddEventInterceptors (MyForm);
Otwórz okno debugger oraz wszelkie zdarzenia, które są nazywane będą rejestrowane w dzienniku zdarzeń
[/ EDIT2]
+1 do opublikowania własnego rozwiązania z kodem tutaj! –