READKEY |
Lecture d'une touche |
---|---|
Turbo Pascal 3+ | Crt |
Syntaxe
Function ReadKey:Char; |
Description
Cette fonction permet d'effectuer la lecture d'une touche enfoncé au clavier.
Remarques
- ATTENTION ! Il ne faut pas oublier de télécharger la mise-à-jour de l'unité Crt de Borland car une division par 0 se produit avec des machines avec un microprocesseur de 2 GHz ou plus.
- Le caractère lu n'est pas répercuté à l'écran. Si la fonction KeyPressed était True avant l'appel à ReadKey, le caractère est immédiatement renvoyé. Sinon, la fonction ReadKey attend qu'une touche soit saisie.
- Les touches spéciales du clavier de l'ordinateur génèrent des codes de balayage étendus. Les touches spéciales sont les touches de fonction, les touches de contrôle du curseur, les touches Alt, Ctrl,... Lorsqu'une touche spéciale est enfoncée, ReadKey renvoie d'abord un caractère nul (#0), puis renvoie le code d'analyse étendue. Les caractères nuls ne peuvent pas être générés de toute autre manière, vous avez donc la garantie que le prochain caractère sera un code de balayage étendu.
- Voici la liste des touches spéciales (après que ReadKey est envoyé un caractère #0) :
- La variable CheckBreak contrôle si Ctrl+Break doit abandonner le programme ou être retourné comme toute autre touche. Lorsque CheckBreak a la valeur False, la fonction ReadKey renvoie un Ctrl+G (soit un code #3) pour Ctrl+Break.
- Avec la version 3 de Turbo Pascal, il fallait utiliser le périphérique clavier pour lire un caractère :
- Read(Kbd,Variable);
Code | Touche |
---|---|
#1 | Alt+Esc |
#14 | Alt+BackSpace |
#15 | Shift+Tab |
#16 | Alt+Q |
#17 | Alt+W |
#18 | Alt+E |
#19 | Alt+R |
#20 | Alt+T |
#21 | Alt+Y |
#22 | Alt+U |
#23 | Alt+I |
#24 | Alt+O |
#25 | Alt+P |
#30 | Alt+A |
#31 | Alt+S |
#32 | Alt+D |
#33 | Alt+F |
#34 | Alt+G |
#35 | Alt+H |
#36 | Alt+J |
#37 | Alt+K |
#38 | Alt+L |
#44 | Alt+Z |
#45 | Alt+X |
#46 | Alt+C |
#47 | Alt+V |
#48 | Alt+B |
#49 | Alt+N |
#50 | Alt+M |
#53 | / (Sur le bloc numérique) |
#59 | F1 |
#60 | F2 |
#61 | F3 |
#62 | F4 |
#63 | F5 |
#64 | F6 |
#65 | F7 |
#66 | F8 |
#67 | F9 |
#68 | F10 |
#71 | Home |
#72 | ↑ |
#73 | PgUp |
#75 | ← |
#77 | → |
#79 | End |
#80 | ↓ |
#81 | PgDn |
#82 | Insert |
#83 | Delete |
#84 | Shift+F1 |
#85 | Shift+F2 |
#86 | Shift+F3 |
#87 | Shift+F4 |
#88 | Shift+F5 |
#89 | Shift+F6 |
#90 | Shift+F7 |
#91 | Shift+F8 |
#92 | Shift+F9 |
#93 | Shift+F10 |
#94 | Ctrl+F1 |
#95 | Ctrl+F2 |
#96 | Ctrl+F3 |
#97 | Ctrl+F4 |
#98 | Ctrl+F5 |
#99 | Ctrl+F6 |
#100 | Ctrl+F7 |
#101 | Ctrl+F8 |
#102 | Ctrl+F9 |
#103 | Ctrl+F10 |
#104 | Alt+F1 |
#105 | Alt+F2 |
#106 | Alt+F3 |
#107 | Alt+F4 |
#108 | Alt+F5 |
#109 | Alt+F6 |
#110 | Alt+F7 |
#111 | Alt+F8 |
#112 | Alt+F9 |
#113 | Alt+F10 |
#114 | Ctrl+PrtSc |
#115 | Ctrl+← |
#116 | Ctrl+→ |
#117 | Ctrl+End |
#118 | Ctrl+PgDn |
#119 | Ctrl+Home |
#120 | Alt+1 |
#121 | Alt+2 |
#122 | Alt+3 |
#123 | Alt+4 |
#124 | Alt+5 |
#125 | Alt+6 |
#126 | Alt+7 |
#127 | Alt+8 |
#128 | Alt+9 |
#129 | Alt+0 |
#132 | Ctrl+PgUp |
#133 | F11 |
#134 | F12 |
#135 | Shift+F11 |
#136 | Shift+F12 |
#137 | Ctrl+F11 |
#138 | Ctrl+F12 |
#139 | Alt+F11 |
#140 | Alt+F12 |
#148 | Ctrl+Tab |
#165 | Alt+Tab |
Exemples
Voici un exemple typique de l'utilisation de cette fonction :
Essayer maintenant !
on obtiendra le résultat suivant :
Presse une touche pour continuer...Il attend ensuite qu'on presse n'importe quel touche.
L'exemple suivant une est une petite application navigant dans un fichier ASCII en utilisant les touches spéciales PgUp et PgDn :
- Program VIEWASC;
-
- Uses Crt;
-
- Var
- Finish:Boolean;
- FileView:File;
- ByteReaded:Word;
- I,CurrLinePos:Integer;
- FileName:String;
- Buffer:Array[0..2048]of Byte;
- LastPos,CurrPos,LenBuf:LongInt;
-
- Function PadRight(S:String;Space:Byte):String;
- Var
- I:Byte;
- Begin
- If Length(S)<Space Then For I:=Length(S)+1 to Space do S:=S+' ';
- PadRight:=S;
- End;
-
- Function GetLastPagePos(Var F:File):LongInt;
- Var
- CurrLinePos:Integer;
- LastPos,CurrPos,LenBuf:LongInt;
- ByteReaded:Word;
- Begin
- CurrPos:=FileSize(FileView);
- FillChar(Buffer,SizeOf(Buffer),0);
- LenBuf:=2048;
- CurrLinePos:=0;
- LastPos:=CurrPos-LenBuf;
- If LastPos<0Then Begin
- LenBuf:=2048+LastPos;
- LastPos:=0;
- End;
- Seek(fileView,LastPos);
- BlockRead(FileView,Buffer,LenBuf,ByteReaded);
- For I:=ByteReaded-1 downto 0do Begin
- Case Buffer[I]of
- 13:Begin
- Inc(CurrLinePos);
- If CurrLinePos>=22Then Begin
- Break;
- End;
- End;
- 10:;
- End;
- End;
- GetLastPagePos:=LastPos+I+1;
- End;
-
- Procedure ViewFrameASCII;
- Const
- FunctionKeyValue:Array[0..9]of String[7]=(
- '','','','','','','','','','Sortir'
- );
- Var
- I:Byte;
- Pour:Byte;
- Begin
- If FileSize(FileView)=0Then Pour:=0
- Else Pour:=Trunc((CurrPos / FileSize(FileView))*100);
- GotoXY(1,1);
- TextBackground(Cyan);
- TextColor(Black);
- Write(FileName);
- ClrEol;
- GotoXY(Lo(WindMax)-3,1);
- Write(Pour:3,'%');
- For I:=0 to 8 do Begin
- GotoXY(I*7+1+2,25);
- Write(PadRight(FunctionKeyValue[I],6));
- End;
- GotoXY(67,25);
- Write(FunctionKeyValue[9]);
- ClrEol;
- TextBackground(Black);
- TextColor(LightGray);
- For I:=0 to 9 do Begin
- GotoXY(I*7+1,25);
- Write('F',I+1);
- End;
- End;
-
- Function ViewASCII:Integer;
- Var
- Pour,X,I,J:Byte;
- PosInBuffer:Word;
- Begin
- If FileSize(FileView)=0Then Pour:=0
- Else Pour:=Trunc((CurrPos / FileSize(FileView))*100);
- If Pour>=99Then Pour:=100;
- GotoXY(Lo(WindMax)-3,1);
- TextBackground(Cyan);
- TextColor(Black);
- Write(Pour:3,'%');
- TextBackground(Black);
- TextColor(LightGray);
- GotoXY(1,2);
- X:=1;
- J:=0;
- PosInBuffer:=0;
- While(J<23)and(PosInBuffer<2048)do Begin
- Case(Buffer[PosInBuffer])of
- 13:Begin
- ClrEol;
- WriteLn;
- X:=1;
- Inc(J);
- If Buffer[PosInBuffer+1]=10Then Inc(PosInBuffer);
- If J=23Then Break;
- End;
- 0..12,14..31:Begin
- Write(' ');
- Inc(X);
- End;
- Else Begin
- Inc(X);
- Write(Chr(Buffer[PosInBuffer]));
- End;
- End;
- If X=80Then Begin
- X:=1;
- Inc(J);
- If J=23Then Break;
- End;
- Inc(PosInBuffer);
- End;
- If J<23Then Begin
- Window(1,1+J,80,22);
- ClrScr;
- Window(1,1,80,25);
- End;
- ViewASCII:=PosInBuffer;
- End;
-
- BEGIN
- If ParamStr(1)='/?'Then Begin
- WriteLn('VIEWASC - Cette commande permet de visualiser un fichier ASCII');
- WriteLn;
- WriteLn('Syntaxe : VIEWASC nomdufichier');
- End
- Else
- Begin
- FileName:=ParamStr(1);
- Assign(FileView,FileName);
- Reset(FileView,1);
- CurrPos:=0;
- ClrScr;
- ViewFrameASCII;
- Finish:=False;
- Repeat
- FillChar(Buffer,SizeOf(Buffer),0);
- Seek(fileView,CurrPos);
- BlockRead(FileView,Buffer,2048,ByteReaded);
- ByteReaded:=ViewASCII;
- Case ReadKey Of
- #0:Case ReadKey of
- #1:Finish:=True;
- #68:Finish:=True; { F10 }
- #71:CurrPos:=0; { Touche Home }
- #73:Begin {PageUp}
- FillChar(Buffer,SizeOf(Buffer),0);
- LenBuf:=2048;
- CurrLinePos:=0;
- LastPos:=CurrPos-LenBuf;
- If LastPos<0Then Begin
- LenBuf:=2048+LastPos;
- LastPos:=0;
- End;
- Seek(fileView,LastPos);
- BlockRead(FileView,Buffer,LenBuf,ByteReaded);
- For I:=ByteReaded-1 downto 0do Begin
- Case Buffer[I]of
- 13:Begin
- Inc(CurrLinePos);
- If CurrLinePos>=24Then Begin
- Break;
- End;
- End;
- 10:;
- End;
- End;
- CurrPos:=LastPos+I;
- If I>1Then Inc(CurrPos);
- End;
- #79:CurrPos:=GetLastPagePos(FileView); { Touche End }
- #81:Begin {PageDown}
- If CurrPos+ByteReaded<=FileSize(FileView)Then Inc(CurrPos,ByteReaded);
- End;
- End;
- #27:Finish:=True;
- End;
- Until Finish;
- Close(FileView);
- ClrScr;
- End;
- END.
on obtiendra un résultat ressemblant à ceci :
Code source
Lien | Langage de programmation | Projet |
---|---|---|
https://github.com/gladir/corail/blob/master/VIEWASC.PAS | Free Pascal | Corail |
Référence
Aide-mémoire de Turbo Pascal versions de 3 à 6, Edition Marabout, De Groote, Virga, 1992, ISBN: 2-501-01833-8, page 342.
Dernière mise à jour : Dimanche, le 25 janvier 2015