Buongiorno,
possibile fare in modo che la window possa intercettare gli eventi di tastiera
( KeyDown, KeyUp ) prima che questi vengano generati dai rispettivi controlli
presenti nella windows stessa, anche se hanno il focus ?
P.S.:
In un “vecchio linguaggio” c’era la propriet KEYPREVIEW
Credo che gli eventi KeyDown e KeyUp dei controlli abbiano la priorit sulla window ed in qualche modo “rubino” l’evento alla window stessa. L’unico modo che che mi viene in mente per gestire la cosa :
- creare 2 metodi a livello di window, per esempio windowKeyDown e windowKeyUp
- implemetare in ogni controllo presente sulla window gli eventi KeyDown e KeyUp nei quali per prima cosa si richiama il rispettivo metodo a livello di window.
Mi rendo conto che la cosa, soprattutto se la window ha molti controlli, risulta essere un po’ macchinosa, ma al momento non mi viene in mente nient’altro.
Infatti questo che hai indicato il metodo che attualmente ho adottato.
Concordo che la cosa macchinosa ( con molti controlli ) e anche poco elegante.
Per non mi arrendo e continuo a cercare alternative
Se vuoi costruire un sistema che invii prima l’evento alla finestra e se non lo gestisce allora scatena l’evento del controllo ti conviene creare una sottoclasse del controllo e una interfaccia.
Per ogni evento che vuoi prima propagare a livello superiore un evento, definisci un nuovo evento identico per il controllo (c’ la possibilit di farlo dopo aver implementato l’evento) per la gestione normale e definisci anche un’interfaccia che la tua finestra andr ad implementare. In questo modo non necessario fare lavori enormi e puoi gestire quando e come vuoi sfruttare questa “deviazione” al meccanismo normale.
Ciao Antonio,
ho usato il seguente approccio:
ho creato, per ogni controllo che utilizzo, la relativa sottoclasse dove ho implementato l’evento KeyDown il quale invoca un delegate per la cattura del tasto e le relative azioni da svolgere:
sottoclasse NewTextField - super TextField
nella sottoclasse NewTextField ho un delegate CatchKeyDown( Key as String ) as Boolean
nella sottoclasse NewTextField ho definito l’evento KeyDown e nel relativo gestore dell’evento invoco il delegate ( se impostato ).
Nell’evento Open della Window imposto, sui controlli dove mi serve, l’indirizzo del metodo che voglio richiamare per fare il controllo:
NewTextField1.CatchKeyDown = AddressOff ControlKey
NewTextField2.CatchKeyDown = AddressOff ControlKey
NewTextField3.CatchKeyDown = AddressOff ControlKeyFind
…
I metodi ControlKey e ControlKeyFind hanno come parametro la key passata dall’evento KeyDown del controllo e restituiscono un false o true per fare in modo che il tasto premuto venga o meno elaborato dal controllo.
Pu andare ?
Pu andare.
Verifica che alla chiusura tutto venga rilasciato correttamente.