Entrée pressée, traitement lancé
ven 18 septembre 2020Dans un programme qui pilote un écran DSPF, il est souvent utile de savoir quelle touche l’utilisateur vient d’actionner. Pour les touches de fonction, les indicateurs DDS rendent service, mais pour Entrée, la méthode la plus simple consiste à s’appuyer sur l’INFDS du fichier écran.
Contexte
Sur IBM i, l’INFDS d’un fichier WORKSTN contient des informations de retour très pratiques après un échange avec l’écran. IBM documente une zone de feedback dédiée, et c’est là que l’on retrouve l’AID byte, à la position 369 de l’INFDS.
Cet octet permet d’identifier la touche pressée par l’utilisateur, sans dépendre uniquement des indicateurs DDS.
C’est une technique classique, robuste, et surtout facile à relire dans un programme RPG.
Le principe
L’idée est simple : après un EXFMT ou une lecture d’écran équivalente, le programme examine la valeur stockée en position 369. Si cette valeur correspond au code hexadécimal de la touche Entrée, alors on lance le traitement attendu.
Dans l’article d’origine, cette touche est associée à la valeur X'F1', ce qui correspond à l’usage présenté pour la détection de Entrée.
Cette méthode peut aussi servir pour d’autres touches de fonction, à condition de comparer l’AID byte à la bonne constante.
Exemple RPG
Voici une version plus lisible du code, en RPG free-form :
**free
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-f Ecran01 workstn infds(DSInfds);
dcl-ds DSInfds qualified;
AID char(1) pos(369);
end-ds;
dcl-c AID_Entree const(x'F1');
exfmt Ecran01;
select;
when DSInfds.AID = AID_Entree;
exsr TraiterEntree;
other;
// Autres touches : F3, F5, Page Up, Page Down...
endsl;
*inlr = *on;
return;
begsr TraiterEntree;
// Traitement après appui sur Entrée
endsr;IBM confirme bien l’usage de la zone de feedback de l’INFDS pour les fichiers d’écran, ce qui rend ce type de détection fiable et documenté.
L’intérêt de cette version est aussi pédagogique : le nom de la zone INFDS est explicite, et la constante AID_Entree montre tout de suite l’intention du code.
Les autres touches
La position 369 ne sert pas seulement pour Entrée. L’article d’origine liste plusieurs codes hexadécimaux pour les touches de fonction et certaines touches de navigation, ce qui permet de bâtir un petit tableau de constantes réutilisables dans l’application.
On peut par exemple regrouper ces valeurs dans un module dédié ou dans un copier/source commun, afin d’éviter de dupliquer les constantes dans plusieurs programmes RPG.
C’est une amélioration utile si le développeur veut aller plus loin qu’un simple exemple isolé.
Bien sûr, la position 369 permet de tester d’autres touches, voici une liste des valeurs possibles :
dcl-c F1 const(x'31'); dcl-c F2 const(x'32'); dcl-c F3 const(x'33'); dcl-c F4 const(x'34'); dcl-c F5 const(x'35'); dcl-c F6 const(x'36'); dcl-c F7 const(x'37'); dcl-c F8 const(x'38'); dcl-c F9 const(x'39'); dcl-c F10 const(x'3A'); dcl-c F11 const(x'3B'); dcl-c F12 const(x'3C'); dcl-c F13 const(x'B1'); dcl-c F14 const(x'B2'); dcl-c F15 const(x'B3'); dcl-c F16 const(x'B4'); dcl-c F17 const(x'B5'); dcl-c F18 const(x'B6'); dcl-c F19 const(x'B7'); dcl-c F20 const(x'B8'); dcl-c F21 const(x'B9'); dcl-c F22 const(x'BA'); dcl-c F23 const(x'BB'); dcl-c F24 const(x'BC'); * Page Down/Roll Up dcl-c RollUp const(x'F5'); dcl-c PageDown const(x'F5'); * Page Up/Roll Down dcl-c RollDown const(x'F4'); dcl-c PageUp const(x'F4'); * Enter dcl-c Enter const(x'F1'); dcl-c Help const(x'F3'); dcl-c Print const(x'F6');
Conclusion
Si vous voulez détecter précisément la touche Entrée sur un écran IBM i, l’INFDS reste une solution simple et propre. La lecture de l’AID byte en position 369 permet d’identifier la touche pressée et d’orienter le traitement RPG sans bricolage supplémentaire.
C’est une approche classique, bien documentée, et facile à intégrer dans un programme écran existant.
Voir l’article original (mais le site n’existe plus 🙁 ).

