QBasic – Le clavier
On a déjà vu que l’on peut à tout moment connaitre l’état d’une touche du clavier avec INKEY$.
Pour ceux qui n’auraient pas suivis à ce moment là, petit rappel.
INKEY$
L’instruction
INKEY$ renvoi une chaîne de caractère contenant l’état du clavier.- Si aucune touche n’est enfoncée,
INKEY$renvoi une chaîne vide. - Si l’utilisateur presse une touche au moment de l’appel de
INKEY$, le carctère frappé est
renvoyé. C’est à dire que si par exemple, l’utilisateur appui sur la touche ‘P’ alors que
le verouillage majuscule est activé,INKEY$renvera un P majuscule. Au contraire, si le
verouillage est inactif, ce sera un p minuscule. Cette remarque est également
valable pour le pavé numérique.
Grâce à
INKEY$, on peut facilement suspendre l’execution d’un programme jusqu’à l’appui sur unecertaine touche par l’utilisateur.
Exemple :
PRINT « Appuyez sur une touche pour continuer »
DO
LOOP UNTIL LEN(INKEY$) ‘ Variante avec LEN(INKEY$) au lieu de INKEY$ <> « »
L’interception d’évenements
QBasic ne s’arrête pas là avec le clavier. En effet, il possible de traiter les évenements en
provenance du clavier avec une structure semblable à celle étudiée précédement avec la manette
de jeu ou avec la minuterie.
Déja, on peut commencer par affecter une procédure à une touche de fonction. Vous savez, ce sont
les touches situées en haut du clavier : F1, F2…F12.
Pour préciser le sous-programme à executer par chaque touche, on utilise la structure suivante :
ON KEY(numero%) GOSUB Sousprogramme
numero% représente le numéro de la touche de fonction à associer à la procédure.Le numéro 1 représente la touche F1; le 2, la F2 etc… jusqu’à F10. Pour F11 et F12, lire plus
loin.
Dans notre exemple, on va se limiter à l’utilisation des touches F1 et F2. La première va nous
servir à ouvrir un fichier, et la deuxième à quitter le programme.
ON KEY(1) GOSUB Lire ‘ Assignation du sous programme aux touches
ON KEY(2) GOSUB Quitter
KEY(1) ON ‘ Activation de la touche
KEY(2) ONDO ‘ On rentre dans une boucle sans fin
LOOPLire: ‘ Lecture du fichier
CLS
INPUT « Entrez le nom et le chemin du fichier à ouvrir : « , Fichier$CLS
PRINT Fichier$
OPEN Fichier$ FOR INPUT AS #1
DO
LINE INPUT #1, Texte$
PRINT Texte$
LOOP UNTIL EOF(1) = – 1
CLOSE #1
RETURNQuitter: ‘ Quitter
END
RETURN
Comme pour la manette de jeu et les minuteries, il ne faut pas oublier d’activer les touches
avec KEY ON. Bien entendu, KEY STOP et KEY OFF existent et ont le même emplois :
- KEY OFF désactive l’intercéption d’évenements pour la touche précisée.
- KEY STOP stoppe de façon provisoire l’intercéption d’évenements. Toute fois, si la
touche est préssée après l’appel deKEY STOP, les sous-programmes correspondants sont quand
même executés lors de la réactivation de la touche avecKEY ON.
Ce petit programme de lecture de fichier est bien, mais on peut mieux faire. Comment ? Et bien
en affichant un petit menu en bas de l’écran avec le récapitulatif des commandes associées à chaque
touche. Pour cela, il nous faut d’abord affecter une chaîne de caractère à chaque touche utilisée.
La syntaxe est :
KEY Numero%, Texte$
Où
Numero% représente la touche de fonction et Texte$ la chaîne de caractère.Ensuite, il faudra afficher le menu. Et là, rien de plus simple, on utilise KEY ON. Au
final, notre programme complet sera :
ON KEY(1) GOSUB Lire ‘ Assignation du sous programme aux touches
ON KEY(2) GOSUB Quitter
KEY(1) ON ‘ Activation de la touche
KEY(2) ONKEY 1, « Lire un fichier » ‘ Affectation d’un texte au touche de fonction
KEY 2, « Quitter »KEY ON ‘ Affichage du menu
DO ‘ On rentre dans une boucle sans fin
LOOPLire: ‘ Lecture du fichier
CLS
INPUT « Entrez le nom et le chemin du fichier à ouvrir : « , Fichier$CLS
PRINT Fichier$
OPEN Fichier$ FOR INPUT AS #1
DO
LINE INPUT #1, Texte$
PRINT Texte$
LOOP UNTIL EOF(1) = – 1
CLOSE #1
RETURNQuitter: ‘ Quitter
END
RETURN
Lors de l’execution du programme vous remarquer que l’affichage des textes est limité à 6 caractères
maximum.
Vous remarquez aussi que le menu n’est pas éffacé, même lors de l’appel à
CLS.Si on avez voulu masquer le menu, on aurrait fait appel à KEY OFF.
Petite chose : les touches F11 et F12 ne sont pas associées aux touches 11 et 12, mais respectivement
au touches numéros 30 et 31.
Mais alors qu’elles touchent peuvent bien représenter les numéros à partir de 11 ?
- 11, flêche HAUT
- 12, flêche GAUCHE
- 13, flêche DROITE
- 14, flêche BAS
Ensuite, de 15 jusqu’à 25, ce sont des touches qui peuvent être définies par l’utilisateur. Ça
peut dans certains cas (les jeux ?) s’averer bien pratique.
Pour définir une touche, on procéde ainsi :
- D’abord, on choisi un numéro libre.
- Si on veut qu’une touche soit associée à une certaine combinaison, par exemple avec ALT
pour activer un menu plus élaboré que celui vu ci-dessus, il faut utiliser le code ASCII
approprié :
- CHR$(0) : aucune touche n’est associée
- CHR$(1) : touche majuscule gauche
- CHR$(3) : touche majuscule droite
- CHR$(4) : touche Control (CTRL)
- CHR$(8) : touche ALT
- CHR$(32) : vérouillage minuscule
- CHR$(64) : vérouillage majuscule
- Pour finir, grâce au précieux tableau des codes de balyage clavier inclu dans l’aide en
ligne de QBasic, on regarde le code de la touche choisie.
Maintenant, on combien c’est trois étapes et on écrit :
KEY Numero%, CHR$(Combinaison%) + CHR$(Balayage%)
Pour affecter un évenement à la touche P, dont le code de balayage est 25, sans combinaison de
touche, on va donc écrire :
KEY 15, CHR$(0) + CHR$(25) ‘ Définition de la touche
ON KEY(15) GOSUB Boom ‘ Affectation du sous programme ‘Bug’ à la touche P
KEY(15) ON ‘ Activation de la touchePRINT « Appuyez sur la touche P pour entendre un Boom »
DO
LOOPBoom: ‘ ET boom !
SOUND 37, 5
END
RETURN
Il faut que le verouillage numérique et majuscules soit inactif pour que cet exemple fonctionne.