OBJC_EDIT() possibilités et défauts

Par Olivier Landemarre

Dernière mise à jours : 26 Aout 1997

 Si vous désirez réaliser votre propre procédure de gestion des boites de dialogue à la place de la très limité fonction form_do(), si vous ne désirez pas gérer entièrement les champs éditables standard GEM alors la procédure objc_edit() est là pour vous aider.Cette procédure s'applique sur les objets GEM de type G_FTEXT ou G_FBOXTEXT avec objet->ob_flags&EDITABLE vrai (EDITABLE=0x008).

Syntaxe de objc_edit():

int objc_edit( tree, object, caractere, index, flag, newindex)

OBJECT *tree;        /* arbre d'objet contenant l'objet à éditer */

int object,              /* objet édiatble */

   caractere,           /* caractère à insérer avec scan code voir plus loins*/

   index,              /* position actuel du curseur */

   flag,                /* type de commande à effectuer (1, 2 ou 3) voir plus loins */

   *newindex;         /* retour de la nouvelle position du curseur */

objc_edit() retourne 0 si il y a erreur.

Les 3 types de commande (flag):

  1. Met le curseur à la fin du texte édité et inverse vidéo pour représenter le curseur. Cette commande est sensé être la mise en marche du curseur.

  2. Compare le caractère avec la ligne de validation caractère ou l'utilisation de touches spéciales (comme les flèches), modifie en conséquence le texte et l'affiche en même temps qu'il gère le curseur.

  3. Réalise une inversion vidéo la ou indiquée pour simuler la disparition du curseur.

Utilisation de objc_edit() en fonction de la commande:

flag = 1 : index et caractere sans importance. Dans *newindex est retourné la nouvelle position du curseur.

flag = 2 : caractere est constitué de 2 octets le poids faible contient le code ASCII et le poids fort le code clavier, cette valeur est celle obtenue pour un évenement clavier de evnt_multi(). Index contient la position ou insérer le caractere. *newindex reçoit la nouvelle position du curseur.

flag = 3 : caractere sans importance. Index la position actuelle du curseur à éteindre. *newindex reçoit la valeur index.

Les défauts de GEM pour la gestion des cuseur des champs éditables des ressources:

La gestion des champs éditables pré-supose que la boite de dialogue est bloquante pour le système comme le fait un form_do() dans un système monotâche. Mais si l'on gère soit même les boites de dialogue il est préférable que ce ne soit pas le cas. Ce qui peut laisser penser que d'autres objets ou fenêtres pouront s'afficher par dessus notre boite de dialogue, ce qui entrainera à un moment ou à autre un redraw possible de notre champs éditable en cours, mais le système ne retient pas qu'il doit redessiner le curseur! et comme le système fait des inversions vidéo pour afficher ou effacer le curseur il va apparaître des curseurs parasite dans votre champs éditable dès que vous fairez une action.

Solution: Sur les messages WM_TOPPED ou WM_NEWTOP il faut forcer le redraw de l'objet éditable au niveau de la zone du curseur puis forcer le redraw du curseur à l'aide de objc_edit() grace à la commande 3! Attention dans le cas du WM_TOPPED, il faut d'abord réaliser un wind_set(WF_TOP) puis attendre les messages redraws qui peuvent s'en suivre, les gérer puis seulement forcer le redraw et le curseur.

objc_edit() ne sait pas gérer le CTRL V ( Coller ).

Solution: Filtrer les caracteres:

char *txt=pointeur sur le texte à coller (voir gestion clipboard)

caractere = obtenu par evnt_multi()

if(caractere==12054)  /* 12054 = CTRL V */
{
 while(*txt++)
 {
   objc_edit(tree, objet, (int)*txt, index, 2, &index);
 }
}
else   /* on gère normalement */
{
 objc_edit(tree, objet, caractere, index, 2, &index);
}