Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Evento Keydown

Su un form inserisco un controllo commadbutton a cui associo un evento
keydown.
Il problema e' che l'evento keydown deve essere generato alla pressione del
*tasto invio*, ma cio' non accade perche' in tal caso viene generato
l'evento click del commandbutton.
Come si potrebbe risolvere il problema?
Il problema mi si e' presentato facendo  un piccolo programma di una
calcolatrice, dove volendo *gestire da tastiera* i vari pulsanti command
button e ad es. dovendo eseguire l'operazione : "2*3=", alla pressione del
tasto invio quando il commandbutton del pulsante 3 ha il fuoco, voglio
generare l'evento keydown che mi da il risultato dell'operazione.
PS:Spero di essere stato abbastanza chiaro
Ciao e grazie a tutti
Pino

Come si potrebbe risolvere il problema?
 
1. Gestendo l' evento KeyDown del form che contiene il bottone
(n.b. : KeyPreview = True);
-- oppure:
2. Proprieta' Default del command button messa a True (niente codice
nel keydown del bottone, quindi);
hth, hal


 >generare l'evento keydown che mi da il risultato dell'operazione.
Ti ringrazio hal, ma nel caso del programma che ti ho descritto
i tuoi suggerimenti non mi risolvono il problema.Quando il *pulsante 3 ha il
fuoco*, l'evento keydown ad esso associato, deve essere in grado di
intercettare qualsiasi tasto possa premere compreso il *tasto invio*.
Ad es. quando il pulsante 3 ha il fuoco posso scegliere di premere un tasto
operatore "* /... " , un altro numero.., ed in questi casi l'evento keydown
non da problemi, tranne il caso del *tasto invio* che non viene intercettato
dall'evento keydown.
Ciao e grazie
Pino

dall'evento keydown.
In questo caso e' utile la soluzione 1:
Metti la KeyPreview del form a True e gestisci il keydown da li'.
A seconda dei tasti, verifichi qual e' il controllo attivo ed agisci di conseguenza.
Funziona al 100 %.
ciao, hal

 Metti la KeyPreview del form a True e gestisci il keydown da li'.
[cut]
Anche in questo caso l'evento keydown tramite una routine Form_Keydown
presenta lo stesso problema con *il tasto invio*, esso non viene
intercettato.In particolare se sul form sono presenti dei commandbutton,
come nel mio caso, la pressione del tasto invio fa generare l'evento click
del commandbutton che in quel momento ha lo stato attivo.
Una conferma di quanto dico, la trovo sulla guida in linea, dove alla fine
della descrizione della proprietą *Keypreview* c'e' la seguente nota:
[begin]
 Nota   Alcuni controlli intercettano gli eventi della tastiera in modo che
il form non sia in grado di riceverli. Un esempio č fornito dal tasto INVIO
quando lo stato attivo č su un controllo CommandButton e dai tasti di
DIREZIONE quando lo stato attivo č su un controllo ListBox.
[end]
Dove sbaglio???
Ciao e grazie
Pino

 DIREZIONE quando lo stato attivo è su un controllo ListBox.
Potrei dire una sciocchezza visto l'ora tarda...e il fatto di non provare
prima di postare.
Ma ad es. potresti inserire nell'evento Keydown del Form il seg. codice:
If command1.Value=True Or command2.Value=True Or....Or Command(n).Value=True
<tuo codice> Endif
Non so se sia la risposta giusta, ma anche io sto studiando ed approfitto
dei post per rispondere ed imparare a mia volta.
Ciao.

Dove sbaglio???
Ma porc... ho capito solo adesso :-(
Per il poco che ne so, non sbagli. Credo che neanche subclassando il form 
riusciresti ad aver ragione di quel command button.
L' unica idea che mi viene (magari l' avrai anche gia' provata, pero' funziona)
e' mettere il codice del Click in MouseUp e gestire il Click come se fosse un
return (ovviamente badando a non farsi imbrogliare da vb).
Ecco un esempio:
' codice da inserire nel form
Option Explicit
' flag che ci dice se l' utente ha cliccato sul bottone
Private m_Click As Integer
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      ' l' utente ha premuto il bottone
      m_Click = 1
End Sub
Private Sub Command1_Click()
    ' se l' utente non ha premuto il bottone
    ' allora ha premuto l' invio
    If (m_Click = 0) Then Me.Caption = "return"
End Sub
Private Sub Command1_MouseUp(Button As Integer, Shift As Integer, _
                                                        X As Single, Y As Single)
    If (m_Click) Then
        ' l' utente ha fatto clic sul bottone
        m_Click = 0
        Me.Caption = "MouseUp --> Click"
    End If
End Sub
Non e' il massimo, ma e' semplice e mi pare che vada.
hth, hal

 L' unica idea che mi viene (magari l' avrai anche gia' provata, pero'
funziona)
[cut]
No non l'avevo provata, ne' ci avevo pensato, ma funziona in modo
*eccellente*!!!, complimenti.
Programmi da molto tempo.?
Una possibile alternativa e' quella di utilizzare il componente aggiuntivo
*Microsoft Forms 2.0 Object Library*, che e' l'elenco dei controlli presenti
in VBA.
Utilizzando il commandbutton di questa libreria l'evento keydown intercetta
il tasto invio.
Misteri dell'informatica e di Bill !!!!............:-)))
Ciao e grazie
Pino

il tasto invio.
I MsForms 2.0 non sono redistribuibili, percio' mettiti il cuore in pace ;-)
Good coding !
ciao, hal

 I MsForms 2.0 non sono redistribuibili, percio' mettiti il cuore in pace
;-)
Significa che non posso generare degli ".exe" per scopi commerciali?
Ciao
Pino

Significa che non posso generare degli ".exe" per scopi commerciali?
No, significa che non possono essere inclusi nel setup dell' applicazione.
Se poi il cliente li ha gia' installati ...
ciao, hal