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 :

[TP]Code ASCII.


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 4
    Points : 4
    Points
    4
    Par défaut [TP]Code ASCII.
    Salut à tous,

    J'aimerais savoir comment avoir le code ASCII de flêche de direction, des touches de fonction, des touches telles que suppr, inser, page de haut, ctrl?
    J'ai écris un programme pascal, mais à chaque fois, il me donne comme code ascii 0 (zero).

    Merci et bonne année 2004.
    "La vie est un combat."

  2. #2
    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
    ce sont des touches etendu , elle renvoie d'abors 0 et ensuite un autre code il me semble , c'est vieu pour moi tout ca mais un petit coup d'oeuil sur la fonction recherché du forum a touche étendue , et je suis sur que tu auras ton bonheur
    6*8 =42

  3. #3
    tintin22
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    repeat
        ch:=readkey;
        writeln(ord(ch));
    until ch =#27; {touche escape}
    ...
    j'ai pas testé

  4. #4
    tintin22
    Invité(e)
    Par défaut
    ahh oui c vrai j'avais oublié

  5. #5
    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
    Faut toujours avoir ce genre de programme sous la main... Celui-là est un que j'avais fait il y a longtemps, quand je rehcerchait les codes clavier de tout mon clavier. Libre de droit, et en couleurs !

    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
     
    Uses Crt;
     
    Var
       Ch : Char;
       Ext : Boolean;
       PortX : Word;
       Base : Byte;
       S: string;
     
    Procedure WriteIt(Value: Byte);
    const
      Hex: array[0..15] of Char = '0123456789ABCDEF';
    Begin
    If Not Ext Then TextColor(8)
    Else TextColor(4);
    if Value and $F0 = 0 then Write('0');
    If Not Ext Then TextColor(7)
    Else TextColor(12);
    if Value and $F0 <> 0 then Write(Hex[(Value shr 4) and 15]);
    Write(Hex[Value and 15]);
    If Not Ext Then TextColor(8)
    Else TextColor(4);
    Write('h');
    TextColor(7);
    Ext := False;
    End;
     
    Procedure OutChar(X, Y : Byte; Value : Char);
    Var
       Scr : Array[0..24, 0..79] Of Record
                                    Ch : Char;
                                    Color : Byte;
                                    End Absolute $B800:$0000;
    Begin
    Scr[Y - 1, X - 1].Color := 9;
    Scr[Y - 1, X - 1].Ch := Value;
    End;
     
    {$B+}
     
    Begin
    ClrScr;
    TextColor(7);
    Repeat
    Base := Port[$60];
    Repeat
    PortX := Port[$60];
    Until (KeyPressed) Or (PortX <> Base);
    Ch := ReadKey;
    If Ch = #0 Then
       Begin
       Ext := True;
       Ch := ReadKey;
       End
    Else Ext := false;
    Write('Caractère : ');
    OutChar(13, WhereY, Ch);
    WriteLn;
    Write('Ascii     : ');
    WriteIt(Ord(Ch));
    Str(Ord(Ch), S);
    Write('(' + S + ')':9);
    Write('       Keyboard : ');
    WriteIt(Port[$60] and $FF);
    WriteLn;
    WriteLn;
    Until Ch = #27;
    End.
    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  6. #6
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Attention, la fonction ORD ne fonctionne pas pour cette conversion,
    il faut l'inverse de la fonction CHR en fait:
    -> CHTOBY convertit un caractère en son code Ascii.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FUNCTION ChToBy(mch:String):Byte;
    VAR xch:Byte;
    BEGIN
     ChToBy:=0; IF(mch='')THEN Exit;
     FOR xch:=0 TO 255 DO
      IF(Copy(mch,1,1)=Chr(xch))THEN ChToBy:=xch;
    END;
    Par exemple, Writeln(ChToBy('A')); affichera le code "65".

    Note: Type String en entrée car je m'en sert aussi pour transyper String[1] en Char:
    ch:=Chr(ChToBy( Copy(st,x,1) ));

    à+
    De retour parmis vous après 10 ans!!

  7. #7
    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
    Citation Envoyé par Sub0
    Note: Type String en entrée car je m'en sert aussi pour transyper String[1] en Char:
    ch:=Chr(ChToBy( Copy(st,x,1) ));
    String[1] est un char, pourquoi utiliser ça ?
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  8. #8
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    essaye donc de faire ch:=Copy(st,x,1);
    De retour parmis vous après 10 ans!!

  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
    Ben oui ca ne marche pas, car copy renvoie une string...
    Mais pour convertir un seul caractère d'une chaîne str, situé à la position x, on fait ch:=str[x];
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Oui, j'ai découvert cette méthode d'indexation des chaînes avec Delphi... Avec cette solution, on pourrait donc optimiser la fonction ChToBy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FUNCTION ChToBy(ch:Char):Byte;
    VAR x:Byte;
    BEGIN ChToBy:=0;
     FOR x:=0 TO 255 DO
      IF(ch=Chr(x))THEN BEGIN ChToBy:=x;Break;END;
    END;
    à+
    De retour parmis vous après 10 ans!!

  11. #11
    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
    Pourquoi cette boucle de 0 à 255 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function ChToBy(S: string): Byte;
    begin
    ChToBy := Ord(S[1]);
    end;
    La fonction Ord est la fonction inverse de Chr, je ne vois pas trop pourquoi il ne faudrait pas s'en servir. Elle fonctionne aussi avec Delphi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Si X est un Char (ou WideChar, etc...) et Y un Byte...
     
    X = Chr(Ord(X));
    Y = Ord(Chr(Y));
    Et en effet, on ne fait pas Ch := Copy(st, x, 1); mais bien Ch := st[x]...

    C'est original de reconstruire les fonctions intégrées au Pascal depuis la "nuit des temps"

    A+
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  12. #12
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Ouais, tu peux te moquer sur ce détail.
    J'ai découvert la méthode d'indexation des chaînes avec Delphi.
    car les bouquins de TP7 n'en parle pas j'ai bien l'impression,
    ou alors j'ai pas fait le rapprochement avec le type PChar...

    En ce qui concerne le fonction Ord:
    Le type caractère (char) correspond à la suite des caractères utilisés en informatique, rangés suivant l'ordre du jeu ASCII. L'appel de la fonction Ord(car), où Car est une valeur de type caractère, retourne le rang de Car (sa valeur ASCII). Une constante chaîne de caractères de longueur 1 peut indiquer une valeur constante de type caractère. toutes les valeurs de type caractère peuvent être générées avec la fonction standard Chr.
    J'avais eu un problème lors de l'utilisation de la fonction ORD pour obtenir table ASCII.
    Peut-être à cause des tables Windows, je ne sais plus.
    Bref, la fonction ChToBy résolvait le problème, et je suis assuré qu'elle est bien l'inverse de cette manière.
    Faudrait regarder la source asm des fonctions pour voir le lien qui les unit, à+
    De retour parmis vous après 10 ans!!

  13. #13
    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
    PChar c'est encore différent... Ce sont ce qu'on appelle les chaînes à zéro terminal (null-terminated strings pour les francophobes ). Les caractères sont stockés les uns à la suite et la chaîne est terminée par un 0 comme le nom l'indique... Ce format est le standard de base utilisé en C et dérivés (enfin il me semble). En tout cas, c'est pas le format pascal Les PChars se gèrent avec les pointeurs aussi, ce qui en fait quelque chose d'assez sympa pour les programmeurs pascal... Quoiqu'il en soit, les PChars sont gérées avec l'unité Strings de TP7 (ouf !).
    Bon voilà, je sais pas pourquoi je vous ai dit tout ça, surtout que j'oublie de dire la moitié des choses (désolé )

    a+
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

Discussions similaires

  1. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  2. [Hardware portable] Comment entrer un code Ascii?
    Par l.sage dans le forum Ordinateurs
    Réponses: 13
    Dernier message: 11/08/2005, 13h04
  3. code ascii en telnet
    Par Jeh dans le forum Modules
    Réponses: 3
    Dernier message: 02/02/2004, 17h01
  4. fonction redonnant le code ascii d'un entier ???
    Par abignon dans le forum MFC
    Réponses: 4
    Dernier message: 29/01/2004, 12h32
  5. [mx2004]Convertir un code ASCII en une lettre
    Par caramel dans le forum Flash
    Réponses: 3
    Dernier message: 28/01/2004, 16h26

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