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 :

[Débutant] Touches F1 -> F 10 ; ECHAP,.. [TPW]


Sujet :

Turbo Pascal

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut [Débutant] Touches F1 -> F 10 ; ECHAP,..
    Bonjour,

    Existe-t-il un code représentant les touches de fonctions (F1 -> F12, Echap, ...) ? Comment s'utilise-t-il ? Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    touche := readkey;
    if (touche = xxx) then donewincrt;
    Merci beaucoup.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Hia,

    De mémoire, sous XP, la console winCrt ne reçoit rien de ces touches.

    J'ai donc refait le test:
    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
    program poubelle;
     
    uses wincrt;
     
    var
      c : char;
    begin
      InitWinCRT;
     
      Repeat
        c := ReadKey;
        if (Ord(c) >= 32) then writeln(c) else writeln('code = ',Ord(c));
      Until c = Chr(13);
     
      WriteLn;
      ReadLn;
      DoneWinCRT;
    end.
    et effectivement, aucun affichage quand on appuie sur toutes les touches spéciales.

    Comme il y a belle lurette que je n'utilise plus ces vieux compilateurs (sauf pour ce genre de test), je ne me suis jamais demandé s'il y avait un moyen de corriger ça.

    ps : prends l'habitude de faire ce genre de petit programme, ça t'évitera souvent de perdre du temps.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Merci beaucoup. Il y a au moins les touches "Echap" et "Entrée" qui sont reconnues. Je voudrais que l'on puisse sortir du programme à chaque entrée utilisateur si celui-ci le souhaite. J'ai fait ce code :
    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
     
    var
    c : char;
    capitale : string;
    entree : string;
     
    begin
    ...
    c := readkey;
        if (Ord(c) = 27) then  MenuPrincipal;
        if (ord(c) <> 27) then
        capitale := chr(ord(c));
        write(capitale);
        readln(entree);
        entree := capitale + entree;
        capitale := '';
    ...
    Les deux variables (choix et entree) n'étant pas du même type, j'ai dû convertir le Char en String. Y avait-il meilleure manière de faire ? Existe-t-il des fonctions de conversion entre un Char et un String ?
    Merci encore.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Hia,
    Citation Envoyé par dimi2 Voir le message
    Merci beaucoup. Il y a au moins les touches "Echap" et "Entrée" qui sont reconnues
    Pour moi, les touches "Echap" et "Entrée" ne font pas partie des touches spéciales.

    Citation Envoyé par dimi2 Voir le message
    Je voudrais que l'on puisse sortir du programme à chaque entrée utilisateur si celui-ci le souhaite.
    Il y a je ne sais combien d'exemples dans les différents sujets du forum.

    Citation Envoyé par dimi2 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...    capitale := chr(ord(c));
    ...
    As-tu réfléchi à ce que fait cette instruction ?

    Citation Envoyé par dimi2 Voir le message
    Les deux variables (choix et entree) n'étant pas du même type, j'ai dû convertir le Char en String. Y avait-il meilleure manière de faire ? Existe-t-il des fonctions de conversion entre un Char et un String ?
    Merci encore.
    Il suffit d'affecter le Char à String.

    Pour le reste, ce que tu cherches à faire, et surtout ce que tu as fait, reste plutôt confus.

    Tu as tendance à écrire des programmes qui utilisent des moyens détournés pour faire des choses qu'on peut faire beaucoup plus simplement, alors on en revient à la base:
    AVANT de te lancer dans le code, écris un algorithme qui résolve le problème, sans te préoccuper de la manière de le coder, mais qui soit le plus direct et clair possible.
    Si tu sautes cette étape, tu te heurteras toujours au même problème, qui te conduit à modifier au coup par coup un programme fait au pif au départ, ce qui à son tour conduit inévitablement à un programme compliqué, dans lequel tu ne t'y retrouves plus, d'où une bonne partie de tes questions.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Voici ce que je cherche à faire :

    Mon programme propose une phrase française à l'utilisateur, et ce dernier doit entrer sa traduction dans une langue étrangère. Je voudrais que l'utilisateur puisse mettre fin à l'exercice à l'occasion de chaque question posée s'il ne souhaite pas poursuivre l'exercice. Cela en appuyant sur la touche Echap.

    Le code que j'ai imaginé teste la première touche entrée :

    - si touche Echap alors retour au menu
    - si autre touche, alors considérer la touche enfoncée comme le premier caractère de l'entrée en convertissant le Char en String
    - concaténer ce String à la suite de la réponse.

    Le code marche très bien, tout se passe comme je le veux. Je n'ai plus qu'un souci : en cas de correction de la réponse entrée par l'utilisateur, ce dernier ne peut corriger que la partie entrée après le Char car ce dernier est ineffaçable. Je comprends pourquoi mais je ne sais résoudre la problème.

    J'espérais trouver une solution moins tarabiscotée, j''ai cherché des messages concernant Echap sur le forum, mais je n'ai rien trouvé concernant TPW. Idem dans la FAQ.

    Avec mes remerciements.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Jie,

    Alors montre-nous toute la hiérarchie des fonctions/procédures qui gère tout cet enchaînement, en ne laissant que le code nécessaire pour ça.

    Du peu que tu nous a montré, je perçois un problème, mais qui ne peut être confirmé qu'en ayant le tout.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Bonsoir,
    je souhaitais proposer à l'utilisateur 2 possibilités lorsqu'une traduction s'affiche :
    - soit quitter en appuyant sur la touche ECHAP
    - soit poursuivre le travail en appuyant sur la première lettre de la traduction à entrer. Puis lier cette lettre à la variable "entree" . C'est là qu'apparaît le problème : l'utilisateur ne peut corriger s'il le souhaite cette première lettre étant donné que celle-ci ne fait pas partie de la variable "entree".
    Ne parvenant pas à mes fins, j'ai choisi de proposer 2 autres possibilités à l'utilisateur : ECHAP pour quitter et AUTRE TOUCHE pour poursuivre. Ca m'ennuie parce que ça impose une manipulation de plus à l'utilisateur : appuyer sur UNE TOUCHE afin d'afficher la phrase à traduire suivante. Voici donc mon nouveau code :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    var
     
    x : integer;
    y : integer;
    phraseFrancaise : string;
    choix : char;
     
    begin
    repeat
     Readln(donnee,phraseFrancaise);
     
     
        x := WhereX;
        y := WhereY;
        writeln('           Pressez la touche "Echap" pour quitter ou sur une autre touche pour continuer');
        choix := readkey;
        if (Ord(choix) = 27) then  menu;
        if (ord(choix) <> 27) then 
            begin
        i := 1;
        j := 0;
     
        gotoxy(x,y);
        while (i <= 90) do
                begin
                gotoXY(x + j, y);
                write(' ');
                inc(i);
                inc(j);
                end;
        end;
     
     
        gotoxy(x,y);
        writeln(phraseFrancaise);
     
        readln(entree);
    Merci de l'attention que vous portez à mes questions.

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Hae,

    Désolé, mais le code montré ne correspond pas du tout à ma demande, qui est le total de la hiérarchie des procédures/fonctions gérant les enchainements des demandes d'entrées, et les sortie, éventuellement.

    Là, tu montres un vague morceau de code, on ne peut moins complet.

    Ma boule de cristal est en panne, et le problème est que dès que je la répare, elle se met en grève car je refuse de lui payer des lunettes (ben oui, elle est myope ).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Je n'ai pas de procédures ou fonctions supplémentaires à ce petit programme.
    Une boucle REPEAT affiche l'une après l'autre une phrase en langue française, L'utilisateur doit entrer sa traduction dans une langue étrangère. Le programme vérifie la validité de la réponse et signale à l'utilisateur sa réussite ou son échec.
    Je vous remercie de l'attention que vous portez à mes questions.

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Gai,
    Citation Envoyé par dimi2 Voir le message
    Je n'ai pas de procédures ou fonctions supplémentaires à ce petit programme.
    Une boucle REPEAT affiche l'une après l'autre une phrase en langue française, L'utilisateur doit entrer sa traduction dans une langue étrangère. Le programme vérifie la validité de la réponse et signale à l'utilisateur sa réussite ou son échec.
    Je vous remercie de l'attention que vous portez à mes questions.
    Alors donne au moins le code complet du programme, de préférence compilable, en l'état actuel.

    Ou dois-je une fois de plus consulter ma boule de cristal ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Bonsoir,
    Voici le code :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    program traduc;
    uses wincrt;
     
    var
    x : integer;
    y : integer;
    i : integer;
    j : integer;
    donnee : text;
    reponse : text;
    phraseFrancaise : string;
    phraseEtrangere : string;
    entree : string;
    choix : char;
     
    procedure Sortie;
    begin
    donewincrt; 
    end;
     
    begin
    Assign(donnee,'franc.txt');
    Reset(donnee);
    Assign(reponse,'etran.txt');
    Reset(reponse);
     
     
    repeat
     Readln(donnee,phraseFrancaise);
     Readln(reponse,phraseEtrangere);
     
     
        x := WhereX;
        y := WhereY;
        writeln('"Echap" pour quitter ou autre touche pour continuer');
        choix := readkey;
        if (Ord(choix) = 27) then  Sortie;
        if (ord(choix) <> 27) then 
            begin
        i := 1;
        j := 0;
     
        gotoxy(x,y);
        while (i <= 90) do
                begin
                gotoXY(x + j, y);
                write(' ');
                inc(i);
                inc(j);
                end;
        end;
     
     
        gotoxy(x,y);
        writeln(phraseFrancaise);
     
        readln(entree);
     
        if (phraseEtrangere = entree) then
     
        writeln('Reponse exacte !')
     
        else
        writeln('Erreur !');
     
        Until eof(donnee);
           close(donnee);
           close(reponse);
           Readkey;
     
        end.

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Jea,

    Leitmotiv : présentation du code:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    program traduc;
     
    uses wincrt;
     
    var
      x : Integer;
      y : Integer;
      i : Integer;
      j : Integer;
      donnee : Text;
      reponse : Text;
      phraseFrancaise : string;
      phraseEtrangere : string;
      entree : string;
      choix : Char;
     
    procedure Sortie;
    begin
      donewincrt; 
    end;
     
    begin
      Assign(donnee, 'franc.txt');
      Reset(donnee);
      Assign(reponse, 'etran.txt');
      Reset(reponse);
     
      repeat
        Readln(donnee, phraseFrancaise);
        Readln(reponse, phraseEtrangere);     
     
        x := WhereX;
        y := WhereY;
        Writeln('"Echap" pour quitter ou autre touche pour continuer');
        choix := readkey;
        if (Ord(choix) = 27) then  
          Sortie;
        if (Ord(choix) <> 27) then 
        begin
          i := 1;
          j := 0;
          gotoxy(x, y);
          while (i <= 90) do
          begin
            gotoXY(x + j, y);
            Write(' ');
            Inc(i);
            Inc(j);
          end;
        end;
     
        gotoxy(x, y);
        Writeln(phraseFrancaise);        
        Readln(entree);
     
        if (phraseEtrangere = entree) then
          Writeln('Reponse exacte !')
        else
          Writeln('Erreur !');
     
      until Eof(donnee);
     
      Close(donnee);
      Close(reponse);
      Readkey;
     end.
    C'est'y pas mieux comme ça ?

    Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (Ord(choix) = 27) then  
          Sortie;
        if (Ord(choix) <> 27) then 
        begin
    se remplace avantageusement par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (Ord(choix) = 27) then  
          Sortie
        else 
        begin
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        begin
          i := 1;
          j := 0;
          gotoxy(x, y);
          while (i <= 90) do
          begin
            gotoXY(x + j, y);
            Write(' ');
            Inc(i);
            Inc(j);
          end;
        end;
    semble être destiné à effacer la fin de la ligne, et peut être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        begin
          gotoxy(x, y);
          ClrEol;
        end;
    Sinon, je n'ai pas testé, n'ayant pas TPW sous la main.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Merci pour vos conseils.
    Concernant le programme, il fonctionne très bien.
    Reste la question de l'utilisation de la touche ECHAP que j'aimerais être à la disposition de l'utilisateur tout au long du programme. Les idées que j'ai testées ne me satisfont pas pour les raisons évoquées dans les messages précédents. Si TPW ne peut pas faire mieux, je m'en contenterai...

  14. #14
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Hei,

    On peut toujours faire mieux.

    Pour cela, il faut comme toujours bien poser le problème, et analyser tous les cas possibles.
    De là découlent les fonctions à créer, et leur enchaînement.

    Accessoirement, une application fenêtrée windows habituelle ne poserait pas ce genre de problème.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Par défaut
    Citation Envoyé par droggo Voir le message
    Accessoirement, une application fenêtrée windows habituelle ne poserait pas ce genre de problème.
    Qu'entendez-vous par "fenêtrée windows" ?

  16. #16
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Gia,
    Citation Envoyé par dimi2 Voir le message
    Qu'entendez-vous par "fenêtrée windows" ?
    Je n'ai pas dit "fenêtrée windows", mais "application fenêtrée windows".

    Toutes les applications windows (tu sais, toutes ces fenêtres ), hormis celles qui s'exécutent en mode console, ce qui est le cas de ton programme, puisqu'il utilise WinCrt, qui n'est autre qu'une simulation de console, Win 3.1, qui plus est.

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

Discussions similaires

  1. Débutant : Touche reste Préssées
    Par jejeb dans le forum C
    Réponses: 5
    Dernier message: 08/03/2006, 15h43
  2. Jeu en asm et touche echap ?
    Par piff62 dans le forum Assembleur
    Réponses: 1
    Dernier message: 08/12/2005, 10h25
  3. [Débutant] [JTextArea] Désactiver une touche
    Par picomz dans le forum Composants
    Réponses: 2
    Dernier message: 09/06/2005, 17h52
  4. [débutant] Ordre des champs de saisie par la touche tab
    Par almisuifre dans le forum C++Builder
    Réponses: 10
    Dernier message: 03/03/2005, 20h45
  5. Comment gérer la touche echap ?
    Par Adrael dans le forum C
    Réponses: 28
    Dernier message: 11/07/2003, 14h15

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