Au menu ce moi-ci : la gestion des champs éditables. Vaste et sensible sujet
puisque cette partie du GEM n'est vraiment pas à l'aise pour le multitâche et les
boîtes de dialogue en fenêtres.
C'est-y quoi un champ éditable ? Ben un objet GEM (donc manipulable avec un
éditeur de ressource classique et surtout par les fonctions GEM du GFA). C'est là
où vous rentrez vos chaînes de texte ou quelques chiffres au clavier.
Je disais plus haut que cette gestion était difficile avec des dialogues non bloquants. Ça m'a valu quelques déboires et gros bugs pour la programmation de Blaise (l'éditeur de texte pour POV si ça ne vous dit rien) et les remontrances J.J.A dans STMAG. Je vous livre donc mon expérience, que vous étudirez en détails dans le source fourni dans le dossier BONUS. L'article que vous êtes en train de survoler se bornera ici à décrire les fonctions et les deux ou trois avertissements dont :
Attention les bugs !
Avant on bloquait l'AES avec les WIND_UPDATE, dessinait le formulaire avec FORM_DIAL et on appelait la fonction FORM_DO qui gérait tout : boutons dialogue, boutons radio, et surtout champs éditables. Maintenant que nous sommes grands, il faut manier OBJC_EDIT directement :
il y a une variable de retour : 0 indique une erreur, mais s'il erreur il y a c'est plutôt un crash très sérieux. Donc pas la peine de s'en occuper, on fait donc un void ou ~ (pour les amateurs du C, les paramètres sont disposés différemment).
ad_tree% | adresse de l'arbre, obtenue avec RSRC_GADDR si vous n'avez pas suivi l'épisode précédent. vous verrez dans mon code que j'utilise un tableau. |
index_objet& | index de l'objet GEM dans l'arbre. Si vous vous plantez et que vous donnez un index qui ne
correspond pas à un champ éditable : 2 bombes. Si cela vous ennuie, vous pouvez augmenter la sécurité en testant avec OB_TYPE la nature de l'objet avant de faire l'appel à OBJC_EDIT. Cela vous évite beaucoup de déboires mais cette solution de facilité ne facilite pas les débugages. J'utilise dans l'exemple fourni une VARIABLE. pas une constante déguisée ni de chiffre brut qui correspond à l'objet. C'est là toute la difficulté. si bien sûr vous n'avez qu'un champ éditable, utilisez la constante-index. |
char& | Ici c'est une valeur du caractère ASCII qui sera
inséré dans la chaîne. Cette valeur sera récupérée
à partir du EVNT_MULTI général. Les docs m'indiquent même qu'on peut fournir un scan-code, c'est à dire directement la valeur sans bidouillage. On peut employer les valeurs ASCII en dessous de 32, dont 27=Esc qui efface le champ éditable entier ou Del ou Backspace ou les (shift)+flèches... Le GEM c'est bien ! |
old_pos& | C'est l'anciennce position du curseur dans le champ éditable, si vous gérez donc plusieurs champs éditables dans votre formulaire, il faut donc un tableau pour pouvoir avoir les valeurs quelque part à 1 dimension. Si vous gérez plusieurs formulaires avec champs éditables, votre tableau sera à 2 dimensions comme vous verrez dans le source. |
flag& | type de la manipulation que vous voulez faire à l'objet :
|
new_pos& | nouvelle position du curseur, ce n'est pas forcément +1, car avec char&=27 par exemple, ce sera 0. |
Les fonctions maison
La difficulté
L'objet édité doit donc être en premier plan. Forcément, quand on tape au clavier, c'est pour le programme qui a fenêtre au premier plan. Sauf...
Avant vous étiez prévenu de tout. Vous l'êtes encore, mais il existe de nouveaux messages AES. Dans l'offset 2 du buffer recevant les messages AES, vous étiez prévenu avec WM_TOPPED (code 21) qu'il fallait activer votre fenêtre pour la mettre au premier plan. Remarque : WM_NEWTOP (code 29), bien que documenté est inutilisé.
Avec la gestion du multitâche et l'arrivée des fenêtres "non activables" (pas besoin de cliquer une première fois si elle est en arrière plan pour accéder à son contenu), de nouveaux messages sont apparus :
Donc, on prend la peine d'interroger les fonctions maison (1er object éditable) quand ces messages AES arrivent.
Dur, dur d'être apprenti !
Les champs éditables...
Lors de l'initialisation de votre programme, videz cette chaîne ou déposez un chaîne de texte par défaut avec CHAR{{OB_SPEC(..)}}=machin$, comme on l'a vu auparavant (pointeur sur pointeur, souvenez-vous !).
Text: 012345 (01~23~45 avec RSC3) Template: ~~/~~/~~ Validation: 999999 (99~99~99 avec RSC3)C'est joli tout plein, car vous ne pourrez insérez que des chiffres et sans taper le slash ! Cool, non ? La seule contrainte est de manipuler vos chaînes sous la forme "010398" pour le 1er Mars 1998 lorsque vous voulez écrire ou récupérer avec CHAR{{OB_SPEC()}} la chaîne éditée.
Au revoir !
Rajah Lone
écrit à la bourre le 19 Septembre 1998