IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

Lire une touche au clavier sans interrompre le programme [Turbo Pascal]


Sujet :

Turbo Pascal

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Lire une touche au clavier sans interrompre le programme
    Voilà je débute et je bloque sur un problème probablement tout con...

    Je voudrais savoir quelle touche du clavier (touches fléchées) est activée SANS interrompre le programme.
    Avec readkey je connais la touche activée mais le programme s'arrête tant qu'une touche n'est pas frappée.
    Avec keypressed le programme ne s'arrête pas dans l'attente d'une touche mais impossible de savoir quelle est celle qui a été activée.

    Et je voudrais pouvoir faire ça avec les units normales de Turbo Pascal...

    Merci de votre aide.

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Je te donne le feu vert pour nous mettre un petit bout de code !

    Merci

    @++ Mathieu
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  3. #3
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    j ai rencontrer le meme probleme
    on le resou en general comme sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    repeat
    ...
    ...
    if keypressed then begin
    case readkey of 
    ...
    end;
    end;
    ...
    ...
     
    until  false ;
    attention dans mon exemple , la boucle est infinis , et suppose que pour sotir une certaine touche doit etre presser suivit d un break !!
    ------
    Edité par pascail, changement de la syntaxe.
    Si vous cherchez Charly, il est dans son hamac au bord de la plage, avec un vert de jus de mangue a la main et une paye de couleur rouge pétante. surement en train de faire la sciéste, c'est pour cela qu'il n'a pas pu editer son message ...
    6*8 =42

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par charly
    j ai rencontrer le meme probleme
    on le resou en general comme sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    repeat
    ...
    ...
    if jeypressed then begin
    case readkey of 
    ...
    end;
    end;
    ...
    ...
     
    until  false ;
    Simple et efficace, ça fonctionne parfaitement. Merci !!

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par charly
    j ai rencontrer le meme probleme
    on le resou en general comme sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    repeat
    ...
    ...
    if jeypressed then begin
    case readkey of 
    ...
    end;
    end;
    ...
    ...
     
    until  false ;
    Désolé charles, je n'avais pas vu !
    Quand je t'ai dit de préciser que la boucle était infinie, je n'avais pas vu la grosse erreur de syntaxe, fait par une simple faute de frappe :
    C'est KeyPressed et pas JeyPressed
    Je te laisse éditer charles.

    @++ Mathieu
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Un magnifique code made in Charly...
    Il vaut mieux éviter la solution du break et faire une condition de sortie convenable... Il n'est pas très conseillé d'utiliser le break, on est pas en basic, on est en turbo pascal !!
    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Je n'ai jamais été pour les boucles infinies ... Mais j'ai quand même laissé, même si y'a du begin et du end ; en trop !

    @++ Mathieu
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  8. #8
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    et je l ai fais en 5 minutes ,et la boucle infinis , je l aime pas non plus , mais j ai pas le coeur , de faire un prog entier juse pour expliquer la lecture de touche sans interrupt de touche !!

    l autre solution ( convernable ) c est de faie un " until sortie = true "
    et de faire sortie:=true quand on appuiy sur un touche particuliaire
    voila l erreur est rectifier !!
    6*8 =42

  9. #9
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Voici le code illustré par Charly :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    uses crt;
    var sortie:boolean;
    var ch:char;
    begin
    sortie:=false;
    repeat
    if keypressed then
    begin
    ch:=readkey;
    case ch of
    'a' : begin
          write('Aurevoir');
          sortie:=true;
          end;
    'b' : write('Salut');
    end;
    end;
    until sortie;
    end.
    Voilà...
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    C'est bien gentil tout ça, mais la question traitait des "touches flêchées". Pour lire une touche flêchée, il faut lire deux fois ReadKey ! En fait, ReadKey renvoie 0 pour les touches spéciales (touches flêchées, page haut/bas, début/fin, etc.), puis envoie un nouveau code. Ce que je préfère, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function LitTouche : char;
    var c: char;
    begin
      c := ReadKey;
      if c=#0 then begin
        c := ReadKey;
        c := chr(ord(c)+128); 
      end;
      LitTouche := c;
    end;
    Pour les touches spéciales, on ajoute 128 à sa valeur.

    Sinon, tu peux reprogrammer le pilote clavier comme ça tu auras un tableau donnant la liste des touches enfoncées et la liste des touches relachées. Cool non ? Il faut savoir qu'en fait le clavier envoie trois type d'instructions au PC :
    - Touche enfoncée (scancode)
    - Touche relachée (scancode)
    - Tampon clavier plein (= tu t'es endormi la tête sur le clavier :-/ )

    Je parle de scancode car les touches sont identifiées par un code de touche (scancode) et non un code ASCII ... Il faut refaire la convertion à la main. En plein y'a les touches "modificatrices" (ALT, CTRL, MAJ, ...). Donc bcp de boulot.
    ---
    Sinon, y'a plus simple : tu utilises mon unité SClavier dite "Super Clavier" :-) Le code source est fourni, donc tu peux toujours l'adapter à tes besoins. Il y a un exemple à la fin du code source de l'unité, sinon regarde la page "Périphériques".
    http://pascal.developpez.com/peripherique/
    (programme Clav_INT)

    Voilà voilà.
    @+ Haypo

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par haypo
    C'est bien gentil tout ça, mais la question traitait des "touches flêchées". Pour lire une touche flêchée, il faut lire deux fois ReadKey ! En fait, ReadKey renvoie 0 pour les touches spéciales (touches flêchées, page haut/bas, début/fin, etc.), puis envoie un nouveau code. Ce que je préfère, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function LitTouche : char;
    var c: char;
    begin
      c := ReadKey;
      if c=#0 then begin
        c := ReadKey;
        c := chr(ord(c)+128); 
      end;
      LitTouche := c;
    end;
    Pour les touches spéciales, on ajoute 128 à sa valeur.
    Je me suis contenté d'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      repeat
        if keypressed then begin
          case readkey of
            chr(72):barremonte;
            chr(80):barrebas;
            'q':Stop;
          end;
        end;
      until fin = 1;
    Bon faudrait que je potasse un peu plus ton exemple.

    Citation Envoyé par haypo
    Sinon, y'a plus simple : tu utilises mon unité SClavier dite "Super Clavier" :-) Le code source est fourni, donc tu peux toujours l'adapter à tes besoins. Il y a un exemple à la fin du code source de l'unité, sinon regarde la page "Périphériques".
    http://pascal.developpez.com/peripherique/
    (programme Clav_INT)
    Vi vi
    Mais je voulais utiliser les units de base.

  12. #12
    Membre actif

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 107
    Points : 279
    Points
    279
    Par défaut
    Allelouia, tout marche, youpi !!!

    Bon, ok, je sort ...
    Chaque jour, l'homme crée des choses plus grandes, meilleures et sûres, et chaque jour, la nature crée des idiots plus performants. Pour l'instant, je pense que la nature gagne.

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai un peu modifier mon source pour utiliser ta fonction LitTouche.
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    repeat
        if keypressed then begin
          case LitTouche of
            'È':barremonte;
            'Ð':barrebas;
            'q':Stop;
          end;
        end;
      until fin = 1;
    Cela fonctionne bien, mais je comprends mal ce qu'il y a de faux dans celui que ce que j'avais au départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      repeat
        if keypressed then begin
          case readkey of
            chr(72):barremonte;
            chr(80):barrebas;
            'q':Stop;
          end;
        end;
      until fin = 1;

  14. #14
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Un peu de théorie s'impose...

    Le clavier est composé de deux types de touches différents : les touches standards, et les touches dites étendues.

    les touches étendues ont un vilain défaut : avant de s'identifier clairement, elles "préviennent" de leur arrivée, en envoyant un code de touche étendue.

    Avec ReadKey, celà se traduit par la lecture préalable d'un caractère #0 avec le code de la touche en lui-même.

    Parmi les touches étendues, on va notament retrouver les touches de direction, les touches de fonction et le pavé Inser, Suppr et comparses.

    Si tu le désires, je dispose d'un programme qui donne tout le nécessaire : code ASCII de la touche, est-ce que la touche est étendue ou non, et scancode. Si tu le veux...


    En attendant, pour "attraper" une touche étendue, il faut faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    case ReadKey of
    #00: case ReadKey of { Touche étendue }
         #72: WriteLn('Haut !');
         #80: WriteLn('Bas !');
         #75: WriteLn('Gauche !');
         #77: WriteLn('Droite !');
         end;
    end;
    until ...
    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. forcer une touche du clavier à prendre la valeur d'une autre
    Par agderf dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/01/2006, 16h08
  2. Simuler un e pression sur une touche du clavier
    Par Furius dans le forum VBScript
    Réponses: 13
    Dernier message: 11/12/2005, 17h53
  3. Simuler l’appuie sur une touche du clavier
    Par Furius dans le forum C++
    Réponses: 2
    Dernier message: 26/09/2005, 17h15
  4. [CF][C#/PPC] Comment être à l'écouter d'une touche du clavier ?
    Par freddyboy dans le forum Windows Mobile
    Réponses: 6
    Dernier message: 18/05/2005, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo