Il debugger Delphi è ottimo per il debug di codice lineare, in cui una funzione chiama altre funzioni in modo prevedibile e lineare e possiamo scorrere il programma riga per riga.C'è un modo per registrare ogni evento di gui in Delphi?
Trovo che il debugger sia meno utile quando si ha a che fare con il codice GUI event driven, in cui una singola riga di codice può causare l'attivazione di nuovi eventi, che a loro volta possono attivare altri eventi. In questa situazione, l'approccio 'passo attraverso il codice' non mi permette di vedere tutto ciò che sta accadendo.
Il modo in cui risolvo questo è 1) indovinare quali eventi potrebbero essere parte del problema, quindi 2) aggiungere punti di interruzione o registrazione a ciascuno di questi eventi.
Il problema è che questo approccio è casuale e richiede tempo.
C'è un interruttore che posso sfogliare il debugger per dire 'registra tutti gli eventi di gui'? O c'è qualche codice che posso aggiungere a intercettare gli eventi, qualcosa come
procedure GuiEventCalled(ev:Event)
begin
log(ev);
ev.call();
end
Il risultato finale che sto cercando è qualcosa di simile (per esempio):
FieldA.KeyDown
FieldA.KeyPress
FieldA.OnChange
FieldA.OnExit
FieldB.OnEnter
Questo sarebbe prendere tutto il congettura dal debug di Delphi.
Sto usando Delphi 2010
[EDIT] alcune risposte hanno suggerito modi per intercettare o registrare i messaggi di Windows. Altri hanno poi sottolineato che non tutti gli eventi di Delphi sono messaggi di Windows. Penso che sia questo tipo di eventi "Non Windows Message" di cui stavo chiedendo; Eventi creati dal codice Delphi. [/ EDIT]
[EDIT2] Dopo aver letto tutte le informazioni qui, ho avuto un'idea di utilizzare RTTI per intercettare dinamicamente TNotifyEvents e registrarli nel registro eventi nella finestra Debug. Ciò include gli eventi OnEnter, OnExit, OnChange, OnClick, OnMouseEnter, OnMouseLeave. Dopo un po 'di hacking, ho funzionato abbastanza bene, almeno per il mio utilizzo (non registra eventi Key, ma potrebbe essere aggiunto). Ho postato il codice here
Per utilizzare
- Scarica l'Unità EventInterceptor e aggiungerlo al progetto
- aggiungere l'unità EventInterceptor alla clausola uses
Aggiungere questa linea da qualche parte in il tuo codice per ogni modulo che desideri monitorare.
AddEventInterceptors (MyForm);
Aprire la finestra debugger e tutti gli eventi che sono chiamati verranno registrati nel registro eventi
[/ EDIT2]
+1 per pubblicare la propria soluzione con il codice qui! –