FreeBASIC – getkey

Dopo aver visto come si configura la console e aver imparato in un altro articolo ad usare la funzione multikey, oggi vedremo come ottenere il codice ASCII di alcuni pulsanti (keys) della nostra tastiera (keyboard) utilizzando la funzione getkey.

Il codice ASCII viene restituito dalla funzione getkey come valore di tipo long (vedi Tabella dei limiti dei tipi standard).

Vediamo adesso per passi come si può lavorare con questa istruzione:

  • per prima cosa è bene dimensionare una variabile ti tipo long per memorizzare il codice ASCII del pulsante premuto;
  • la funzione getkey va quindi inserita all’interno di un ciclo (per esempio il ciclo do-loop) in modo tale che il programma rimanga costantemente in ascolto dell’input da tastiera dell’utente;
  • a questo punto, all’interno del ciclo do-loop, si inserisce la struttura di controllo select case in modo tale da distinguere i vari codici ASCII che verranno ricevuti.

Una volta ricevuto un codice ASCII la memoria tampone della tastiera (keyboard buffer) viene ripulita automaticamente. Se non viene premuto alcun pulsante la funzione getkey rimane in ascolto e il programma si ferma.

Alcuni pulsanti della tastiera, come quelli funzione (F1, F2, ecc.) o quelli di spostamento del cursore, sono rappresentati da due caratteri e quindi occorrerà, per esempio, identificarli con la struttura di controllo if-then-else e poi operare uno spostamento (shift) di 8 bits in modo tale da scartare il carattere che non ci serve. Per farlo useremo l’istruzione shr.

Un sito molto utile dove trovare descritti i vari codici è theasciicode.com.ar

Per vedere un esempio pratico riporto una parte del codice di CLUMSY ripulita dalle istruzioni che al momento non ci servono:

dim as long key ''key entered

''main loop
do
  key = getkey
  if key > 255 then ''cursor keys
    key = key shr 8 ''shifts the bits to the right
    select case key
      case 59 ''F1
        ''...
      case 60 ''F2
        ''...
      case 61 ''F3
        ''...
      case 62 ''F4
        ''...
      case 63 ''F5
        ''...
      case 64 ''F6
        ''...
      case 65 ''F7
        ''...
      case 66 ''F8
        ''...
      case 67 ''F9
        ''...
      case 68 ''F10
        ''not used (problems with Ubuntu terminal)
      case 71 ''home
        ''...
      case 72 ''up
        ''...
      case 73 ''page up
        ''...
      case 79 ''end
        ''...
      case 80 ''down
        ''...
      case 81 ''page down
        ''...
      case 77 ''right
        ''...
      case 75 ''left
        ''...
      case 83 ''delete
        ''...
      case else ''none
    end select
  else ''ASCII extended
    select case key
      case 32 to 126 ''printable characters
        ''...
      case 128 to 255 ''extended ASCII characters
        ''...
      case 8 ''backspace
        ''...
      case 13 ''carriage return
        ''...
      case 27 '' quit
        exit do
      case else
        ''none
    end select
  end if

''to avoid unwanted or repeated characters,
''this loop works until the inkey buffer is empty
  while inkey <> "": wend

loop

Bene. Un altro piccolo passo è stato fatto. 😉