Non vorrei sbagliarmi, ma mi pare che alcuni giorni fa un iscritto al forum aveva inserito una richiesta per sapere se è possibile gestire un tasto che sia abile a produrre effetti sia quando lo si preme sia quando lo si rilascia.
Non ricordo bene se la domanda sia stata posta nella parte dedicata a Gambas 2 o qui; sta però il fatto che quella domanda non la trovo più. :-\ Forse, l'amico, non avendo in breve ricevuto una risposta, avrà eliminato la domanda dal forum.
Comunque, questa interessante domanda mi ha spinto a capire se quanto richiesto sia possibile. Tornando a vedere il funzionamento dei button, ho notato che i Button scatenano gli eventi non dal momento della pressione, ma dal momento del loro rilascio.
Non sembra esserci quindi un oggetto che si comporti come il pulsante del "campanello di casa": quando premi è immeditamente abilitato a scatenare eventi, e quando non lo lasci è abilitato a scatenarne altri.
Mi spiace che il messaggio/domanda sia stato eliminato (almeno così credo); ad ogni modo io avrei risolto così:
' Per ottenere un tasto che sia abilitato, e quindi attivo, sia al momento della pressione che al momento del suo rilascio, ho operato sulle funzionalità del Mouse: MouseDown e MouseUP.
' COMPITO del Programma: il programma alla pressione del Button mediante il tasto del mouse mostra in una Label un conteggio ad incremento numerico che si arresterà solo quando il tasto del mouse non sarà rilasciato.
' (Il programma presuppone anche un Timer impostato a bassissimo "delay".)
e As Integer
Public Sub Button1_MouseDown() ' si attiva al momento della pressione sul tasto del mouse
Print "Pressione tasto !"
e = 0
Timer1.Enabled = True ' attiva il Timer
End
Public Sub Timer1_Timer() ' Timer scatena, se abilitato, in continuazione i comandi
' che seguono, sino a che esso resta abilitato (enabled = true)
e = e + 1
Label1.text = e ' mostra in Label la somma della precedente operazione
End
Public Sub Button1_MouseUp() 'si attiva al momento del rilascio del tasto premuto del mouse
Print "Rilascio tasto !"
Timer1.Enabled = False ' disabilita il Timer
End
Qualcuno ha soluzioni migliori, più veloci ed efficaci ?
Tornando a vedere il funzionamento dei button, ho notato che i Button scatenano gli eventi non dal momento della pressione, ma dal momento del loro rilascio.
Non so come hai fatto a capire che i pulsanti (Button) scatenino eventi solamente dopo che il tasto venga rilasciato. Io non simpatizzo molto con il mouse, perchè lo ritengo uno strumento che durante la compilazione delle caselle presenti in una finestra di un programma Gambas, e non solo, faccia perdere del tempo, quindi punto sempre ad un'utilizzo a tutta tasitera, il che comporta la necessità di dovere gestire gli eventi relativi a ciascun controllo, compresi i "button". Fra quelli messi a disposizione per detta classe di controlli esistono, per la tastiera, gli eventi KeyPress e KeyRelease. L'evento Keypress, viene scatenato sempre al momento della pressione del tasto, mentre l'evento KeyRelease viene scatenato sempre al momento del suo rilascio. Puoi verificarlo ponendo una riga
Print "io sono l'evento KeyPress"
dentro la sub relativa ed una riga
Print "io sono l'evento Release"
dentro la corrispondente Sub. Potrai così rscontrare quanto ho precisato sopra.
Alla luce di tutto ciò, penso che quello che tu esegui nel tuo esempio per tenere sotto controllo il mouse valga anche per tenere sotto controllo la tastiera.
:ciao:
Comunque, la cosa è anche più semplice del previsto: basta sperimentare.
Ho eliminato una routine, quella col Timer (quindi il tutto s'è abbreviato), ed ho aggiunto come caso-prova nuovamente un ciclo, ma ora con Do While....Loop:
A as integer
Public Sub Button1_MouseDown()
Do While A > -1
A = A + 1
Print A
Wait 0.001 ' WAIT mi serve, altrimenti non riesco a bloccare il ciclo cliccando.
Loop
A = 0 ' ponendo A = 0 mi consentirà una volta bloccato il loop di riavviarlo, e di scrivere A in console da 1.
End
Public Sub Button1_MouseUp()
A = -1 ' mi consente di bloccare il loop
End
Diciamo che in questo modo non ho bloccato il loop attraverso una verifica dell'evento _MouseUp, bensì mooolto più semplicemente assegnando un valore -1 alla variabile "A": valore in quel caso non "gradito" alla verifica del Do While.