Entrée pres­sée, trai­te­ment lancé

ven 18 septembre 2020 0 Par Ibmiiste

Dans un pro­gramme qui pilote un écran DSPF, il est sou­vent utile de savoir quelle touche l’utilisateur vient d’actionner. Pour les touches de fonc­tion, les indi­ca­teurs DDS rendent ser­vice, 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 infor­ma­tions de retour très pra­tiques après un échange avec l’écran. IBM docu­mente une zone de feed­back dédiée, et c’est là que l’on retrouve l’AID byte, à la posi­tion 369 de l’INFDS.
Cet octet per­met d’identifier la touche pres­sée par l’utilisateur, sans dépendre uni­que­ment des indi­ca­teurs DDS.
C’est une tech­nique clas­sique, robuste, et sur­tout facile à relire dans un pro­gramme RPG.

Le prin­cipe

L’idée est simple : après un EXFMT ou une lec­ture d’écran équi­va­lente, le pro­gramme exa­mine la valeur sto­ckée en posi­tion 369. Si cette valeur cor­res­pond au code hexa­dé­ci­mal de la touche Entrée, alors on lance le trai­te­ment atten­du.
Dans l’article d’origine, cette touche est asso­ciée à la valeur X'F1', ce qui cor­res­pond à l’usage pré­sen­té pour la détec­tion de Entrée.
Cette méthode peut aus­si ser­vir pour d’autres touches de fonc­tion, à condi­tion de com­pa­rer l’AID byte à la bonne constante.

Exemple RPG

Voi­ci une ver­sion 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 feed­back de l’INFDS pour les fichiers d’écran, ce qui rend ce type de détec­tion fiable et docu­men­té.
L’intérêt de cette ver­sion est aus­si péda­go­gique : le nom de la zone INFDS est expli­cite, et la constante AID_Entree montre tout de suite l’intention du code.

Les autres touches

La posi­tion 369 ne sert pas seule­ment pour Entrée. L’article d’origine liste plu­sieurs codes hexa­dé­ci­maux pour les touches de fonc­tion et cer­taines touches de navi­ga­tion, ce qui per­met de bâtir un petit tableau de constantes réuti­li­sables dans l’application.
On peut par exemple regrou­per ces valeurs dans un module dédié ou dans un copier/source com­mun, afin d’éviter de dupli­quer les constantes dans plu­sieurs pro­grammes RPG.
C’est une amé­lio­ra­tion utile si le déve­lop­peur veut aller plus loin qu’un simple exemple isolé.

Bien sûr, la posi­tion 369 per­met de tes­ter d’autres touches, voi­ci 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');

Conclu­sion

Si vous vou­lez détec­ter pré­ci­sé­ment la touche Entrée sur un écran IBM i, l’INFDS reste une solu­tion simple et propre. La lec­ture de l’AID byte en posi­tion 369 per­met d’identifier la touche pres­sée et d’orienter le trai­te­ment RPG sans bri­co­lage sup­plé­men­taire.
C’est une approche clas­sique, bien docu­men­tée, et facile à inté­grer dans un pro­gramme écran existant.

Voir l’ar­ticle ori­gi­nal (mais le site n’existe plus 🙁 ).