Gambas-it

Archivi (sola lettura) => Domande tecniche (Gambas 2) => Topic aperto da: fsurfing - 28 Febbraio 2008, 21:03:38

Titolo: acquisizione tasti
Inserito da: fsurfing - 28 Febbraio 2008, 21:03:38
ciao a tutti,

chi di voi sa come si fa ad acquisire la pressione di un tasto della tastiera?

per esempio freccia avanti?


grazie in anticipo a tutti!!
Titolo: Re: acquisizione tasti
Inserito da: Pixel - 28 Febbraio 2008, 23:05:11
Codice: [Seleziona]
SELECT CASE key.Code

      CASE key.Right
      Message.Info("Premuto il tasto freccia a destra")

      CASE key.Esc
      Message.Info("Premuto il tasto Esc")

END SELECT


Ecc...ecc..

Ciao
Titolo: Re: acquisizione tasti
Inserito da: fsurfing - 29 Febbraio 2008, 10:50:12
grazie mille !
però ho un dubbio:

questo codice dovrei metterlo dentro un evento keypress di un form ,ad esempio :


Codice: [Seleziona]
PUBLIC SUB area_KeyPress()


  DIM n AS Integer
 
      n=griglia.Find(3)

  SELECT CASE Key.Code
 
          CASE key.Up
                  IF n > 24 THEN
                   griglia.Fill(0, n, 1)
                   griglia.Fill(3, n - 25, 1)
                  ENDIF
  END SELECT
               
               
               
               

END



ma se invece volessi acquisire i tasi durante un evento timer?

 :-)  :-)
Titolo: Re: acquisizione tasti
Inserito da: giulio - 29 Febbraio 2008, 11:41:38
Citazione

fsurfing ha scritto:
grazie mille !
però ho un dubbio:

questo codice dovrei metterlo dentro un evento keypress di un form ,ad esempio :


Codice: [Seleziona]
PUBLIC SUB area_KeyPress()


  DIM n AS Integer
 
      n=griglia.Find(3)

  SELECT CASE Key.Code
 
          CASE key.Up
                  IF n > 24 THEN
                   griglia.Fill(0, n, 1)
                   griglia.Fill(3, n - 25, 1)
                  ENDIF
  END SELECT
               
               
               
               

END



ma se invece volessi acquisire i tasi durante un evento timer?

 :-)  :-)


In che senso nell'evento timer? :-)

Esattamente cosa vorresti fare o ottenere?
Titolo: Re: acquisizione tasti
Inserito da: Pixel - 29 Febbraio 2008, 14:03:10
Concordo con la perplessità di giulio.
Siccome l'evento keypress verifica la pressione di un tasto relativa ad un oggetto presente nella form, mi risulta alquanto strano associarlo ad un oggetto timer.

Se vuoi scrivere un unico codice da associare a più oggetti è sufficiente creare una SUB che chiami (per esempio) EventiTastiera in cui inserisci il codice di cui sopra ed all'interno di ogni oggetto che vuoi controllare esegui una "chiamata" alla SUB.

Ciao
Titolo: Re: acquisizione tasti
Inserito da: fsurfing - 29 Febbraio 2008, 18:17:00
grazie mille per l' aiuto :-D


la mia idea era che a tot periodi di tempo venga controllata la pressione di un tasto,

Citazione
Se vuoi scrivere un unico codice da associare a più oggetti è sufficiente creare una SUB che chiami (per esempio) EventiTastiera in cui inserisci il codice di cui sopra ed all'interno di ogni oggetto che vuoi controllare esegui una "chiamata" alla SUB.



ho provato ma gambas mi da errore dicendo che non ci sono keypress event ...



per ora utilizzo i vostri consigli ed utilizzo l' evento keypress del form

ciao ciao e grazie ancora
Titolo: Re: acquisizione tasti
Inserito da: Pixel - 29 Febbraio 2008, 22:04:28
Questo è quello che intendevo io:

Chiamate principali negli oggetti

Codice: [Seleziona]
PUBLIC SUB TreeView1_KeyPress()
MainFrame.keyEvent(key.Code)
END

PUBLIC SUB TextArea1_KeyPress()
  MainFrame.keyEvent(key.Code)
END


Sub principale unica di gestione dell'evento nel modulo principale (MainFrame)

Codice: [Seleziona]
PUBLIC SUB keyEvent(Code AS Variant)
 
  SELECT CASE key.Code
CASE key.Right
Message.Info("Premuto il tasto freccia a destra")

CASE key.Esc
Message.Info("Premuto il tasto Esc")

END SELECT
 
END


Ciao
Titolo: Re: acquisizione tasti
Inserito da: giulio - 29 Febbraio 2008, 22:33:51
Citazione

pixel ha scritto:
Questo è quello che intendevo io:

Chiamate principali negli oggetti

Codice: [Seleziona]
PUBLIC SUB TreeView1_KeyPress()
MainFrame.keyEvent(key.Code)
END

PUBLIC SUB TextArea1_KeyPress()
  MainFrame.keyEvent(key.Code)
END


Sub principale unica di gestione dell'evento nel modulo principale (MainFrame)

Codice: [Seleziona]
PUBLIC SUB keyEvent(Code AS Variant)
 
  SELECT CASE key.Code
CASE key.Right
Message.Info("Premuto il tasto freccia a destra")

CASE key.Esc
Message.Info("Premuto il tasto Esc")

END SELECT
 
END


Ciao


pixel, SELECT CASE Code :-)
Titolo: Re: acquisizione tasti
Inserito da: Pixel - 29 Febbraio 2008, 22:37:28
Si.. funziona lo stesso ma è giusta la tua osservazione :oops:

Ciao
Titolo: Re: acquisizione tasti
Inserito da: fsurfing - 29 Febbraio 2008, 23:03:11
grazie mille! proprio quello che cercavo!!!! :good:


ciao ciao
Titolo: Re: acquisizione tasti
Inserito da: giulio - 29 Febbraio 2008, 23:04:47
Citazione

pixel ha scritto:
Si.. funziona lo stesso ma è giusta la tua osservazione :oops:

Ciao


Eh sì funziona lo stesso :uhm: Ho fatto un test e funziona pure così:

PUBLIC SUB TextArea1_KeyPress()
  MainFrame.keyEvent()
END

PUBLIC SUB keyEvent()
 
SELECT CASE key.Code
CASE key.Right
Message.Info("Premuto il tasto freccia a destra")

CASE key.Esc
Message.Info("Premuto il tasto Esc")

END SELECT
 
END

Probabilmente la variabile key.code viene memorizzata a livello globale
dall'applicazione. E' come se in cima alla classe fosse
dichiarato un teorico:

PUBLIC key.code AS Variant

che cambia ogni volta che un evento keypress è intercettato. Non so se è
un bene o un male (o un bug?)  :uhm:   

ciao
Titolo: Re: acquisizione tasti
Inserito da: Pixel - 01 Marzo 2008, 13:20:34
Citazione

giulio ha scritto:
Non so se è
un bene o un male (o un bug?)  :uhm:   

Personalmente noto una certa ridondanza nei comandi utilizzabili all'interno di Gambas, potrebbe essere uno di questi casi, comunque un chiarimento da parte di Benoit si potrebbe anche chiedere :-D
Ciao
Titolo: Re: acquisizione tasti
Inserito da: md9327 - 02 Marzo 2008, 02:46:33
Penso che, dato che il singolo computer viene utilizzato contemporaneamente da un singolo individuo, probabilmente hanno pensato che memorizzare a livello globale l'ultimo tasto premuto era la soluzione più facile.
In effetti in altri linguaggi, nell'evento viene creato anche uno specifico oggetto che contiene tutte le informazioni necessarie all'individuazione di cosa ha generato l'evento e perchè, come ad esempio la gestione degli eventi del mouse, che fà la fotografia dello stato generale del mouse in quel momento, in modo che l'applicazione sà se per caso è stato premuto il tasto destro piuttosto che il sinistro.
Anche il fatto di nominare gli eventi è una scelta di semplificazione, con la prima parte del nome del metodo che rispecchia fedelmente il nome dell'oggetto da cui può scatenarsi l'evento, e nella seconda parte la tipologia dell'evento stesso (es. click, dblclick, ecc.).
La gestione degli eventi è di per sè una cosa molto complicata, e ha a che fare molto son il sistema su cui gira; in gambas hanno semplificato di molto la cosa, e questo gli fà molto onore, perchè poi semplifica molto il lavoro.
Titolo: Re: acquisizione tasti
Inserito da: koko - 06 Giugno 2008, 15:26:18
Mi intrometto nella discussione sperando di non andare troppo OffTopic.

Che voi sappiate, è possibile,tramite gambas, 'intercettare' eventi di keypress che non vengano indirizzati ad alcun controllo del/dei form del progetto gambas in esecuzione?

In pratica mi riferisco alla gestione di hotkey globali;
vorrei, tanto per intenderci,che la mia applicazione eseguisse dei comandi specifici alla pressione di una combinazione dei tasti mentre navigo con firefox.
Titolo: Re: acquisizione tasti
Inserito da: md9327 - 07 Giugno 2008, 02:24:15
Se parli di intercettare comandi all'interno di un'applicazione Gambas, anche se non legati ad un controllo specifico, la cosa si fà attraverso l'oggetto Application, che viene avviato come statico, ed è sempre e comunque l'oggetto che contiene la tua applicazione.

Se vuoi intercettare comandi da altri programmi, esterni a gambas, credo la cosa sia un pò complicata.

Puoi spiegare meglio cosa intendi fare e ottenere ?
Titolo: Re: acquisizione tasti
Inserito da: koko - 07 Giugno 2008, 10:27:46
Intendevo un mediaplayer che registrasse delle hotkey globali.
Un hook della tastiera in pratica.
Esempio, il mio mediaplayer scritto in gambas sta suonando una playlist mentre io navigo con firefox.
Senza abbandonare la finestra di firefox, vorrei poter battere ctrl-s e vorrei che il mediaplayer gambas stoppasse la riproduzione.
Titolo: Re: acquisizione tasti
Inserito da: fsurfing - 07 Giugno 2008, 10:40:07
forse l' unica soluzione è utilizzare un key logger tipo lkl e poi leggere il file  su cui il logger salva i tasti digitati
Titolo: Re: acquisizione tasti
Inserito da: - 15 Agosto 2008, 15:52:45
Qulacuno sa come rilevare il keypress di tasti speciali della tastiera ( i controlli multimediali play,pause, aprimail ecc ecc ) ???

Con PRINT key.code mi vien sempre fuori "0"
Titolo: Re: acquisizione tasti
Inserito da: leo72 - 28 Agosto 2008, 00:06:26
Beh, sei fortunato. A me l'evento KeyPress i 3 tasti speciali (www, e-mail e Cerca) della mia tastiera Logitech (un po' vecchiotta, a dir la verità) non vengono neanche visti da Gambas.
Eppure Ubuntu me li riconosce perché premendoli si aprono le corrispondenti applicazioni.
Titolo: Re: acquisizione tasti
Inserito da: md9327 - 28 Agosto 2008, 00:12:20
Bè, i tasti esistono e sono pure associati a speciali codici; le impostazioni per abilitarli sono date dal desktop manager, e non tutti danno possibilità di modificarli.
Titolo: Re: acquisizione tasti
Inserito da: leo72 - 28 Agosto 2008, 00:34:48
Il problema quindi è che Gambas non intercetta questi tasti speciali, che escono un po' dallo standard. Così parrebbe, per lo meno.
Titolo: Re: acquisizione tasti
Inserito da: - 28 Agosto 2008, 13:01:51
:-o  :-?  :evil:  :muro:

Speravo vivamente di sbagliare qualcosa ..... bella fregatura , mi ero già immaginato il mio mediacenter ..... proverò a vedere se con qualche app bash ( tipo xbindkeys ) riesco a lanciare verso gambas la cosa ( la vedo dura ... )
Titolo: Re: acquisizione tasti
Inserito da: leo72 - 28 Agosto 2008, 18:11:20
Beh, prima di sbattere la testa sul muro ( :muro: ) perché non chiedi a Benoit sulla mailing-list ufficiale?  :leggo:
Titolo: Re: acquisizione tasti
Inserito da: - 30 Agosto 2008, 14:26:27
eh beh ... come si fa ? :eh:
Titolo: Re: acquisizione tasti
Inserito da: leo72 - 30 Agosto 2008, 17:03:14
Ti iscrivi alla mailing-list:
https://lists.sourceforge.net/lists/listinfo/gambas-user
e poi invii una e-mail a gambas-user@lists.sourceforge.net
Titolo: Re: acquisizione tasti
Inserito da: - 29 Settembre 2008, 19:09:02
Se a qualcuno intesessa ho risolto il problema così :

ho configurato xbindkeys (piccola app bash per l'acquisizione dei tasti) settando i tasti che mi servivano invece che con il comando con "echo xyz"

ho lanciato xbindkeys con SHELL "xbindkeys -n" AS "processo" (-n evita che vada come daemon e che quindi l'output vada smarrito )

poi ho fatto :

PUBLIC SUB processo_read ()
DIM comando as string
LINE INPUT, #LAST , comando

IF comando = "xyz" THEN ...


END

Non è bellissima come cosa però funziona meravigliosamente !!!!

Sono o non sono un piccolo genio ???  :-)
Titolo: Re: acquisizione tasti
Inserito da: md9327 - 30 Settembre 2008, 17:15:14
Sicuramente è una soluzione...

Forse non sei un genio, ma sicuramente hai la capacità di cercare comunque di trovare la soluzione ad un problema. Se poi la soluzione è drastica, oppure è poco ortodossa, l'importante è che funziona.

La programmazione è così...

Magari nel futuro scopri come si fà direttamente in Gambas... il che, di norma, accade sempre dopo aver trovato soluzioni alternative... :-P
Titolo: Re: acquisizione tasti
Inserito da: Ceskho - 30 Settembre 2008, 18:52:01
Io penso che le soluzioni alternative sono delle belle trovate...perchè manifestano la reale capacità di un programmatore....mica esiste un comando per tutti o mica tutti possono conoscere tutti i comandi da cima a fondo...
Titolo: Re: acquisizione tasti
Inserito da: md9327 - 02 Ottobre 2008, 02:00:49
Non solo, dimostra anche che possono esistere strade alternative, e la programmazione non è fatta solo di 0 e 1. :-)
Titolo: Re: acquisizione tasti
Inserito da: koko - 03 Ottobre 2008, 09:15:19
Grazie per la dritta su xbindkeys, proverò ad utilizzarla ;-)
Titolo: Re: acquisizione tasti
Inserito da: koko - 03 Ottobre 2008, 11:10:24
Funziona alla grande, anche per permettere all'utente di configurarsi i propri:
Codice: [Seleziona]

  DIM xbindkeys_output AS String
  DIM outputS AS String[]
  DIM hotkey AS String
  SHELL "touch /tmp/xbindkeysrc"
  SHELL "xbindkeys -k -f /tmp/xbindkeysrc" TO xbindkeys_output
  outputS = Split(xbindkeys_output, "\n", "", TRUE)
  hotkey = Trim(outputS[outputS.count - 1])
  Return hotkey
Titolo: Re: acquisizione tasti
Inserito da: guglielmofede - 28 Dicembre 2009, 19:09:52
SALVE,

ma come si fa funzionare la rilevazione di un tasto?
Esempio io vorrei fare terminare un programmino con la pressione di ESC.

Grazie....
Titolo: Re: acquisizione tasti
Inserito da: fsurfing - 28 Dicembre 2009, 22:27:55
Codice: [Seleziona]


PUBLIC SUB Form_KeyPress()

    IF key.code = key.Esc THEN FMain.CLOSE

end


nell' esempio vado a leggere l' evento key_press di fmain, ma puoi leggere tale evento da tutti gli oggetti compatibili :)