Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
12 - KEYPRESSED ET READKEY

PRÉSENTATION : Implémentation des fonctions KeyPressed et ReadKey semblables aux fonctions du Turbo Pascal.
ZIP : Téléchargez le zip APERÇUS :

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<>0And 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 et 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.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -