La valeur du VTIME en DOS (fonction SCR_term_vkey() ou variable d'environnement SCR_VTIME) indique le nombre de 18èmes de secondes d'attente maximum avant de retourner une touche clavier. Cette valeur est fixée par défaut à 6, soit 1/3 de seconde.
La gestion des touches dans le driver est légèrement modifiée : lorsqu'une séquence de touches tapée au clavier
la touche correspondante est retournée par la fonction SCR_get_key().
Donc, si on a défini BREAK "^A^B^C", il faut taper les trois touches ^A^B^C pour que BREAK soit reconnu. Par contre, la définition ESCAPE "^[^[" retourne ESCAPE après SCR_vtime dixièmes de secondes.
Si on trouve dans le driver les définitions suivantes :
ESCAPE "^["
Alt_A "^[a"
Lorsqu'on frappe la touche ESC, il y a un temps d'attente de SCR_VTIME 18ème de seconde avant que ESCAPE soit retourné par SCR_get_key(). De cette façon, si un 'a' est pressé pendant ce délai, SCR_get_key() retourne ALT_A.
Si on trouve dans le driver la seule définition de ESCAPE, et qu'aucune définition de SPECIAL_KEYS ne commence par ^[, SCR_get_key() retourne ESCAPE sans délai.
La définition de la touche F1 est dorénavant distincte de la touche HELP. Cela permet sur les terminaux disposant d'une touche HELP spécifique d'utiliser les deux touches.
En DOS, comme F1 est la touche d'aide standard, il suffit de définir dans le driver :
HELP "\000;"
et de supprimer la définition de la touche F1.
Attention, la fonction SCR_get_key() retourne SCR_HELP_KEY et non plus SCR_F1 qui sont dorénavant différentes! Par conséquent, certains programmes doivent être modifiés : si par exemple on a dans un menu
OPTION "Help F1" {Record {F1}}
il faut le remplacer par
OPTION "Help F1" {Record {HELP}}
C'est en effet la touche HELP (SCR_HELP_KEY) qui déclenche l'appel à l'aide dans les objets de SCR/AL1.
Les drivers ansidos, ansixen et ansioliv ont été changés en ce sens.
Les icônes définies sur les bords des fenêtres (PAGE, HELP, MESSAGES, etc) sont supprimées lorsque la souris n'est pas définie sur le système (Unix sauf HP sous X-Window).
Une nouvelle variable globale int SCR_ERR_LANG permet de spécifier la langue de l'application. Elle est par exemple utilisée pour déterminer les réponses aux questions : Yes, Oui, Ja et No, Non, Neen. Elle vaut 0 pour l'anglais (défaut), 1 pour le français, et 2 pour le néerlandais, 3 pour l'allemand, ...
On peut la spécifier dans le programme scr4 par le paramètre -el :
scr4 ... -el 1 pour le français.
En fait, comme il est expliqué à la section suivante, les textes définis dans le fichier scr_err.txt sont dorénavant multilingues et extraits en fonction de cette variable. Dans le futur, d'autres textes pourront donc être distingués de la sorte.
Le fichier des messages scr_err.txt change de format : les lignes peuvent contenir plus d'un message, permettant ainsi le choix de la langue :
Num|message anglais|message français|message langue 2|...
La variable globale SCR_ERR_LANG détermine le numéro de la langue à extraire (0, 1, ...).
Deux nouvelles fonctions complètent les anciennes en prenant la langue comme paramètre supplémentaire:
char *SCR_get_err_txt_lang(FILE *fd, int msgnb, int langnb)
char *SCR_err_txt_lang(int msgnb, int langnb)
Un "magic number" est positionné en fin de fichier lorsque celui-ci est le résultat de la commande scr4_app. Cela permet à la fonction SCR_get_app_pos() de vérifier que la position trouvée a bien été placée par la commande scr4_app. Si ce n'est pas le cas, la fonction SCR_get_app_pos() retourne -1L.
Un bit field dans chaque PAGE permet de savoir si la PAGE a été quittée par l'action ABORT :
pg->pg_abort
qui vaut 1 si c'est le cas. Cette valeur est remise à 0 en début d'édition de la PAGE.
La fonction C PG_edit() consomme l'action ABORT et retourne -1. La PAGE quittée par ABORT est marquée comme telle (pg->pg_abort != 0). De plus cette fonction retourne également -1 si la Begin_FN de la PAGE retourne une valeur non nulle.
ACTIONS PG_EDIT et PG_REEDIT
Note : cette modification est une conséquence de la précédente.
Ces actions retournent une valeur non nulle en cas de ABORT exécuté dans la PAGE éditée. Par conséquent, les actions suivantes changent de comportement :
OPTION "Edition" {PG_edit pg_select C_FN {...}}
Auparavant, la C_FN s'exécutait quel que fut l'action terminant l'édition de la PAGE. Maintenant, elle ne s'exécute plus en cas de {ABORT} dans la PAGE.
Deux attributs définis dans les ISAM et éventuellement importés dans les PAGE peuvent poser problème : TODAY et REQUIRED. En effet, si lors de la saisie d'un enregistrement, ces valeurs peuvent être importées, lors d'un SCAN, le contraire est préférable.
Cette valeur n'était pas importée dans la PAGE. Il est maintenant possible de l'importer soit de façon globale pour toutes les PAGE, soit localement :
GLOBAL {IMPORT_REQUIRED YES ou NO}
indique que pour toutes les PAGES dont la définition suit, les valeurs REQUIRED ou COMPULSORY sont importées (ou non) des ISAM vers les PAGES.
On peut modifier le comportement localement dans la PAGE :
PAGE {
...
IMPORT_REQUIRED YES ou NO
...
}
détermine le comportement pour la seule PAGE en cours de définition.
En l'absence de définition, REQUIRED ou COMPULSORY n'est PAS importé pour maintenir la compatibilité.
Contrairement à REQUIRED, cette valeur était importée par défaut. Cela reste le cas, mais on peut annuler ce comportement localement ou globalement par la directive IMPORT_TODAY :
GLOBAL {IMPORT_TODAY NO ou YES}
Au sein d'une PAGE :
PAGE {
...
IMPORT_TODAY NO ou YES
...
}
Pour rappel (mais ceci se trouve déjà décrit dans la fonction PG_edit()), les opérations en fin de champ s'exécutent dans l'ordre suivant :
Depuis la version 4.05, en raison de la définition des boutons dans les PAGE, WRAP OFF ne fonctionne plus que si la PAGE ne contient qu'un seul champ. Pour faire comme avant, il suffit de placer la END_FN suivante sur le champ qui termine la PAGE :
END_FN {RECORD {F10}}
Après vérification, ces champs reçoivent une valeur dans la PAGE dès le début de l'affichage de la PAGE.
Les anciennes fonctions SCR_confirme et PG_display_error sont réintégrées dans SCR v4. Pour les utiliser à la place des nouvelles, on peut procéder de plusieurs façons :
Notez que les PAGES scr_err et scr_conf doivent être définies pour que ces fonctions opèrent correctement.
Deux variables globales permettent de positionner différemment les boîtes de message notamment utilisées par SCR_confirme() et PG_display_error(). Ces variables sont :
Comme indiqué ci-dessus, deux paramètres -v3cnf et -v3err sont ajoutés à scr4_e. Ils remplacent respectivement les fonctions SCR_confirme() et PG_display_error() de la version 4 par leur définition antérieure.
De plus, le record de référence des MPAGE peut être accédé directement : des générés dans le fichier .h. Voir la discussion sur les MPAGE plus bas dans le texte.
Le message d'aide de SCR4 est complètement revu pour en améliorer la lisibilité.
Le commentaire de la PAGE affichée à l'aide de PG_SLIDE (fn PG_display_slide()) n'est pas affiché dans la zone de commentaire. Par contre, la fonction C PG_display_slide_cmt(PAGE *pg, char *cmt) permet d'afficher le commentaire cmt pendant l'attente d'une touche. Cette dernière fonction est utilisée par la fonction SCR_v3_confirme().
Il est possible de forcer un SCROLLBAR dans un MENU. Cela peut notamment s'avérer utile lorsque l'on ignore le nombre d'options qu'il devra contenir.
Un scrollbar est forcé dans un MENU statique en plaçant le mot-clé SBAR dans sa définition.
Pour le forcer dans un MENU dynamique, il faut fixer l'élément mn->mn_sbar à 1.
Correction pour éviter des pertes de place lors de la lecture du fichier d'aide.
Suppression de &DE (paragraphe de description) si pas de commentaire avant la fonction.
Les commentaires sont acceptés dans la partie header de la fonction et conservés tels quels dans le manuel extrait.
, endif et else
Correction dans le cas d'imbrications multiples.
Remise de reread et de check égalité des records avant rewrite. Cette erreur pouvait poser de graves problèmes dans les index de ctree v4, nécessitant parfois un rebuild des index.
Correction de l'affichage si une BEGIN_FN, RESET_FN ou DISPLAY_FN affiche un message à l'aide de SCR_MessageBox() (SCR_confirme(), PG_display_error()).
Locking (en Xenix uniquement pour l'instant) du fichier .num de façon à éviter les interférences multi-utilisateurs. Après 10 essais de locking (minimum 10 secondes), la fonction retourne -1L.
Cette fonction indique si le contenu actuel de la PAGE pg correspond au record courante de l'ISAM is. Elle est utile par exemple lorsqu'on veut confirmer l'abandon de l'édition d'une PAGE.
Lorsque la condition de recherche de IS_search() est SCR_LE ou SCR_LAST, les fonctions IS_next() et IS_prev() se comportent de façon inverse à l'habitude : IS_next lit le record précédent dans l'ordre de l'index et IS_prev le suivant.
Cette modification a été apportée pour permettre de visualiser dans les MPAGE un fichier dans l'ordre inverse sans avoir pour antant à gérer un index descendant. Prenons par exemple une MPAGE :
MPAGE {
ISAM index_name LE
...
}
L'affichage sera alors inverse de celui que l'on a habituellement, permettant par exemple d'afficher une liste de commandes en commençant par la dernière.
La longueur minimum des champs numériques est ramenée à 1 caractère.
La condition de recherche (GE, EQ, LE, ...) peut se trouver dans la définition d'une SMPAGE :
SMPAGE {
ISAM is
INDEX idx EQ
}
La discussion sur les MPAGE (plus bas) reprend plus de détail sur les conditions de recherche.
Sauvegarde la valeur de PG_ABORT avant d'appliquer les CODES pour éviter de l'annuler cette valeur en cas de READ_FN dans l'ISAM lu.
Suppression de l'application des CODES en fin d'édition (comme pour un champ normal)
Création des conditions de recherche SCR_EQ1, SCR_EQ2, ... SCR_EQ6. Ces conditions sont exploitables dans les fonctions de recherche comme IS_search() ou OBJ_search().
Ces mêmes conditions sont définies dans les sources SCR (MPAGE, PAGE, ...) avec comme nom EQ1, EQ2...
Les champs qui contiennent un CODE avec condition de recherche EQ sont transformés en condition EQ1. De cette façon, la vérification de l'égalité ne se fait que pour le premier champ de l'index, les autres champs n'étant pas encore encodés.
Suppression de l'application forcée des codes.
La fonction IS_search() change automatiquement de recherche si le numéro de l'index est négatif :
IS_search(is, -1, x)
équivaut à
IS_search(is, 0, SCR_DB)
L'attribut FLD_COND peut être ajouté à un champ de PAGE. Celui-ci n'est utilisé que dans le cas des APG et des SPG des MPAGE. Voir plus bas pour plus d'information sur les MPAGES.
Lors de la lecture d'un ISAM, il est possible de savoir si le record lu correspond à un record de référence ou aux valeurs définies dans une PAGE.
Les fonctions utiles sont documentées :
Ces fonctions peuvent être utilisées par exemple comme critère d'une MPAGE.
De nombreuses améliorations ont été apportées aux MPAGES, tout en gardant la compatibilité de comportement avec les versions antérieures :
Les critères ne fonctionnaient pas correctement dans certains cas. En particulier, lorsque le critère retournait 1 (record à sauter), on était aléatoirement confronté au problème "ISAM FILE HAS BEEN CORRUPTED". Cette erreur est corrigée et les MPAGES avec CRITERION peuvent servir à la visualisation ou à l'édition d'un ISAM.
Deux attributs peuvent être ajoutés au champ d'une APG ou d'une SPG (voir plus bas) : FLD_IDX et FLD_COND. Ces attributs seront ajoutés à des champs MENU indiquant l'index de recherche et la condition de recherche. L'utilisateur peut ainsi choisir lui-même l'ordre de visualisation et la condition de recherche.
0 pour SCR_GE,
1 pour SCR_LE, (ordre descendant)
2 pour SCR_EQ
On peut ajouter dans la définition d'une MPAGE une page supplémentaire : la SPG (SCANPAGE). Celle-ci permet de déterminer les records à afficher et ceux à sauter. Cette fonctionnalité peut être combinée aux CRITERION.
1. SPG (ScanPage) non définie
Si aucune SPG n'est définie, le comportement est semblable à ce qu'il était auparavant, à ceci près que deux champs MENU peuvent être définis dans la APG : ces champs auront comme attribut FLD_IDX ou FLD_COND.
Cela permet donc à l'utilisateur de définir lui-même l'index et la condition de recherche. A noter que SCR_LE permet d'afficher les records dans l'ordre inverse.
2. SPG (ScanPage) définie
Si SPG est définie, elle peut être indentique à la APG ou non. Elle servira à définir l'index, la condition de recherche et la sélection de records à afficher.
Concrètement, on a deux possiblités : soit on définit une PAGE dont la END_FN ou une FNKEY lance MP_EDIT_ISAM. Dans la MPAGE, on indiquera cette PAGE comme SPG.
Alternativement, on définira la SPG indentique à la APG et l'utilisateur conservera sous les yeux les informations de sélection.
Si SPG == APG, MP_EDIT_ISAM démarre par l'édition de la APG. Sinon, la APG ne servira qu'à afficher le contenu de l'enregistrement courant de la MPAGE.
Comme les SCAN peuvent mettre un certain temps à l'affichage, on affiche maintenant les LPG dès qu'elles sont lues, sans donc attendre la lecture de tout l'écran.
L'utilisateur peut presser ESCAPE en cours de lecture du fichier, ce qui lui permet de stopper une lecture trop longue en raison des restrictions de la SPG. De plus, un compteur de lecture peut être incrémenté dans un champ de la APG si on le souhaite pour rendre la lecture plus dynamique. Ce champ est de type NATURAL est a comme attribut FLD_COUNT.
On peut indiquer dans les SMPAGES directement l'ordre de sélection (EQ, LE, GE, EQ1,...).
La recherche dans une MPAGE démarre sur base d'un record dit de référence. L'image de ce record est constitué à partir des valeurs de la APG ou de la SPG selon le cas. S'il n'y a ni APG, ni SPG, le programmeur peut lui-même fixer les valeurs de ce record. Cette fonctionnalité n'est pas neuve, mais pour en faciliter l'usage, on a généré dans le fichier .h des Ainsi, si on a une MPAGE sans APG ni SPG, on peut démarrer la recherche de la façon suivante en C :
MP_set_index(my_mp, 2); /* Date */
MP_set_cond(my_mp, SCR_GE);
my_mp_DATE = 19950101L;
MP_edit_isam(my_mp);
En supposant que la MPAGE ait un CRITERION défini comme suit :
CRITERION {C_FN return(CritMyMp());}
et que cette fonction soit :
CritMyMp()
{
if(my_isam_CHAFF < 10000) return(1);
if(my_isam_DATE > 19951231L) return(-1);
return(0);
}
On aura dans l'affichage uniquement les records de 1995 dont le chiffre d'affaire (CHAFF) est supérieur ou égal à 10000.
PAGE adp_scanadr {
...
FNKEY {
ESCAPE {ABORT}
F10 {MP_EDIT_ISAM amp_adr2}
}
Defaults {ISAM af_adr}
Screen {
+=============================================+
| SELECTION DES ADRESSES |
|---------------------------------------------|
| LANGUE : $langue |
| Parti : $pp |
| Code : de $code1 à $code2 |
|---------------------------------------------|
| Index : $index |
| Ordre : $order |
+=============================================+
}
FIELD ISF CODE NAME CODE1
FIELD ISF CODE NAME CODE2
FIELD NAME index FLD_IDX MENU amx_adr2 {
Title "Index"
OPTION "Fichier" OPTION "Code"
OPTION "Nom" OPTION "Parti"
}
FIELD NAME order FLD_COND MENU amx_order {
Title "Ordre"
OPTION "GE" OPTION "LE" OPTION "EQ"
OPTION "EQ1" OPTION "EQ2" OPTION "EQ3"
}
}
SMPAGE amp_adr2 {
TITLE " Adresses "
FOOTNOTE ""
ISAM af_adr GE
"FNKEY {F4 {ABORT}} SPG adp_scanadr "
APG
- "Code : " code
- "Nom : " name
- "Parti : " pp
LPG
- "Code" code
- "L" langue
- "Nom" name 25
- "Prénom" fname 25
- "Parti" pp
}
SMPAGE amp_adr3 {
TITLE " Adresses "
ISAM af_adr
"FNKEY {F4 {ABORT}} SPG ap_amp_adr3 " /* Nom implicite */
APG
- "Code : de " code "FIELD Prompt \"à \"
ISF code line = col + 10"
- "Nom : " name
- "Parti : " pp
"FIELD Prompt \"Index : \" FLD_IDX
MENU amx_adr2 line = col + 10"
- "Langue : " langue
"FIELD Prompt \"Ordre : \" FLD_COND
MENU amx_order line = col + 10"
LPG
- "Code" code
- "L" langue
- "Nom" name 25
- "Prénom" fname 25
- "Parti" pp
}
La fonction SCR_compress (utilisée notamment pour les index de CTREE et les SCAN) ne remplace plus le caractère 0xFF par ' '.
Copyright © 1998-2015 Jean-Marc Paul and Bernard PAUL - Envoyez vos remarques ou commentaires à bernard@xon.be