Autore Topic: [RISOLTO] Simulazione di pulsante attivo in pressione e in rilascio  (Letto 1598 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
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ì:

Codice: gambas [Seleziona]
' 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 ?
« Ultima modifica: 03 Settembre 2013, 20:44:16 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Simulazione di pulsante attivo in pressione e in rilascio
« Risposta #1 il: 04 Luglio 2011, 23:47:24 »
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
Codice: [Seleziona]
Print "io sono l'evento KeyPress"
dentro la sub relativa ed una riga
Codice: [Seleziona]
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:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Simulazione di pulsante attivo in pressione e in rilascio
« Risposta #2 il: 05 Luglio 2011, 10:42:48 »
Non so come hai fatto a capire che i pulsanti (Button) scatenino eventi solamente dopo che il tasto venga rilasciato.

La mia affermazione, ovviamente, si basa su una prova empirica, da me svolta, identica a quella che hai proposto tu per il key....; ho notato che il print - o qualsiasi altra cosa - avveniva solo al momento del rilascio del tasto del mouse, e quindi virtualmente del button.

Non ho approfondito abbastanza, ma mi sto ponendo questo problema più generale ed astratto: stando ancora all'interno di una routine appartenente all'oggetto A, come intercettare un evento operato su un oggetto B ? Restando al caso della simulazione di un pulsante attivo, se per esempio io determino l'evento del MouseDown su un button, ed avvio nella relativa routine conseguentemente - mettiamo il caso - un evento ciclico infinito, posso interromperlo mediante un IF posto nel mezzo del ciclo che verifichi il sopraggiunto accadimento di un altro evento, esterno (mentre ancora è in pieno svolgimento la routine del MouseDown), per esempio un MouseUp ?  Ad una primissima considerazione a me sembrerebbe di no, ma.......
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Simulazione di pulsante attivo in pressione e in rilascio
« Risposta #3 il: 05 Luglio 2011, 11:30:20 »
Observer....

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Simulazione di pulsante attivo in pressione e in rilascio
« Risposta #4 il: 05 Luglio 2011, 12:18:40 »
Observer....

E' la seconda volta che sento da te questo termine. Un po' mistico, un po' cosmico... ;D

Potresti brevemente descriverlo e fare - magari - un altrettanto breve esempio di codice... per la gioia di tutti gli utenti del forum.  :P

Aggiungo, comunque, che primi aiuti giungono indirettamente da Milio qui:

http://www.gambas-it.org/smf/index.php?topic=1529.0

http://www.gambas-it.org/smf/index.php?topic=1495.0

« L'Observer e' una Classe che osserva gli eventi dell'oggetto a lui legato. In questo caso andrebbe ad intercettare gli eventi della Classe... »
« Ultima modifica: 05 Luglio 2011, 12:58:18 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Simulazione di pulsante attivo in pressione e in rilascio
« Risposta #5 il: 05 Luglio 2011, 18:07:41 »
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:

Codice: gambas [Seleziona]
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.
« Ultima modifica: 03 Settembre 2013, 20:43:19 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: [RISOLTO] Simulazione di pulsante attivo in pressione e in rilascio
« Risposta #6 il: 06 Luglio 2011, 16:24:18 »
Più che altro perchè A non è stata inizializzata:

Codice: [Seleziona]
A = 0

Riguardo ai miei veloci spunti nel forum, in genere sono indicazioni sulla strada da prendere, senza fornire esempi immediati, ma che portano alla decisione "appunto" di sperimentare, magri dopo una veloce letta al quel poco di documentazione che c'è...  ;D

Con l'occasione butto giù un'altro suggerimento, molto utile se compreso, ovvero quello di scaricarsi i sorgenti di Gambas, e leggersi il codice delle librerie scritte in puro Gambas (es. l'ide stesso). La cosa, posso sottolineare, è molto utile per l'apprendimento di alcune cosette di questo linguaggio, tenendo conto che le librrie sono scritte dagli stessi che manutengono Gambas...

... è un suggerimento... utilissimo...  ;D

Ritornando all'oggetto Observer, questo ti permette appunto di intercettare gli eventi di un determinato oggetto senza sopvrapposizioni sulla normale gestione. Ad ogni modo può anche, volendo, operare a modo di controller master, e decidere delle sorti dell'evento stesso.
La sua particolare caratteristica lo rende diverso dalla sua controparte, gestita dal metodo Attach dell'oggetto Object che, invece, assegna in modo autorevole gli eventi ad un particolare gestore (es. una Form). Comunque, i due sistemi possono essere usati in modo congiunto per una gestione più dinamica del sistema eventi.