 |
|
 |
|
 |
12 - KEYPRESSED ET READKEY
|
|
|
|
PRÉSENTATION :
Implémentation des fonctions KeyPressed et ReadKey semblables aux fonctions du Turbo Pascal.
NOTES :
Ces deux fonctions sont utilisables pour les applications en mode console.
KeyPressed permet de savoir si une touche est appuyée, sans la lire et sans bloquer l'application.
ReadKey permet de lire une touche du clavier, si aucune touche est en attente, alors ReadKey attend la prochaine touche appuyée.
Pour ne pas bloquer l'application il faut appeler ReadKey seulement si KeyPressed est à True.
CODE :
// Fonction donnant TRUE si une touche est en attente
// elle ne prend en compte que les touches donnant un caractère, donc
// elle ne fonctionne pas avec les touches de fonctions
Function KeyPressed:Boolean;
Const TailleBuf =20;
Var Zone :Array[1..TailleBuf] Of TInputRecord;
EnAttente :Cardinal;
i :Cardinal;
Begin
// Demande de la liste des évènements en attente
PeekConsoleInput(STD_INPUT_HANDLE,Zone[1],TailleBuf,EnAttente);
Result:=False;
i:=1;
While Not Result And (i<=EnAttente) And( i<=TailleBuf ) Do
Begin
Result:= (Zone[i].EventType=1) // C'est un évènement clavier
And (Zone[i].Event.KeyEvent.bKeyDown) // C'est une touche appuyée
And (Zone[i].Event.KeyEvent.AsciiChar<>#0); // ce n'est pas une touche de controle
Inc(i);
End;
// Si il n'y a pas de touche, le buffer est vidé car windows
// à une limite très basse d'évènements en attente
If (EnAttente<>0) And Not Result Then ReadConsoleInput(STD_INPUT_HANDLE,Zone[1],EnAttente,i);
End;
// Fonction qui retourne lit un caractère émit par le clavier.
// si aucun caractère n'est en attente, cette fonction est bloquante
// et attend qu'un caractère soit saisi.
Function ReadKey:Char;
Var Zone : TInputRecord;
Lus : Cardinal;
Begin
Result:=#0;
Repeat
// Lecture du buffer des évènement
ReadConsoleInput(STD_INPUT_HANDLE,Zone,1,Lus);
If (Lus=1) // Un évènement est lu
And (Zone.EventType=1) // C'est un évènement clavier
And (Zone.Event.KeyEvent.bKeyDown) // C'est un appui
And (Zone.Event.KeyEvent.AsciiChar<>#0) // C'est bien un caractère
Then Result:=Zone.Event.KeyEvent.AsciiChar; // => mémorisation du code
Until Result<>#0;
End;
|
| |
 |
|
 |
Les sources présentées sur cette page sont libres de droits
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ©
2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être
faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à
trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.