Bonjour,
Existe-t-il un code représentant les touches de fonctions (F1 -> F12, Echap, ...) ? Comment s'utilise-t-il ? Par exemple :
Merci beaucoup.Code:
1
2
3 touche := readkey; if (touche = xxx) then donewincrt;
Version imprimable
Bonjour,
Existe-t-il un code représentant les touches de fonctions (F1 -> F12, Echap, ...) ? Comment s'utilise-t-il ? Par exemple :
Merci beaucoup.Code:
1
2
3 touche := readkey; if (touche = xxx) then donewincrt;
Hia,
De mémoire, sous XP, la console winCrt ne reçoit rien de ces touches.
J'ai donc refait le test:
et effectivement, aucun affichage quand on appuie sur toutes les touches spéciales.Code:
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.
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. :)
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 :
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 ?Code:
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 := ''; ...
Merci encore.
Hia,
Pour moi, les touches "Echap" et "Entrée" ne font pas partie des touches spéciales. :)
Il y a je ne sais combien d'exemples dans les différents sujets du forum.
As-tu réfléchi à ce que fait cette instruction ?
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.
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.
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. :)
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 :
Merci de l'attention que vous portez à mes questions.Code:
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);
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 :)).
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.
Bonsoir,
Voici le code :
Code:
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.
Jea,
Leitmotiv : présentation du code:
C'est'y pas mieux comme ça ?Code:
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.
Ceci
se remplace avantageusement parCode:
1
2
3
4 if (Ord(choix) = 27) then Sortie; if (Ord(choix) <> 27) then begin
ceciCode:
1
2
3
4 if (Ord(choix) = 27) then Sortie else begin
semble être destiné à effacer la fin de la ligne, et peut être remplacé parCode:
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;
Sinon, je n'ai pas testé, n'ayant pas TPW sous la main.Code:
1
2
3
4 begin gotoxy(x, y); ClrEol; end;
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...
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. :)
Gia,
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.