Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Amiga E - fenêtre de requête pour assignation
(Article écrit par Yann Armand et Pierre Girard et extrait d'Amiga News - novembre 1995)
|
|
On laisse la théorie ce mois-ci pour nous atteler à un petit utilitaire. Nous allons rajouter un "FileRequester" (une fenêtre de
requête) à la commande "assign".
Description
Nous ne savons pas ce qu'il en est pour vous, mais nous supportons assez mal de devoir écrire les chemins d'accès à la main pour
nos assignations, alors que l'Amiga possède de superbes fenêtres de requête pour voyager à travers l'arborescence de nos disques.
Réparons ça tout de suite grâce à RAssign qui gérera trois syntaxes :
- RAssign, nous renvoie la liste des volumes assignés.
- RAssign <nom du volume>, ouvre une fenêtre de requête et assigne le chemin résultant au volume.
- RAssign <nom du volume> REMOVE, supprime le volume de la liste des assignations.
Structure du programme
Comme nous commençons à en prendre l'habitude, nous déclarons les variables à utiliser, puis traitons les arguments. Si besoin est,
nous ouvrons la bibliothèque asl.library et appelons une fenêtre de requête (FileRequester). Comme on travaille proprement, on
ferme la bibliothèque. Et enfin, nous exécutons la commande Assign du Workbench avec les bons arguments.
Attention, la commande RAssign que nous créons n'est pas un remplacement mais un complément de la commande Assign du Workbench.
Il ne faut donc pas supprimer Assign de votre répertoire C.
Déclaration des variables
Pour utiliser une fenêtre de requête, il nous faut une structure filerequester qui nous sera attribuée par la bibliothèque ASL.
Nous créons donc un pointeur sur un objet filerequester :
DEF reqfile:PTR TO filerequester
|
La fonction ReadArgs de la bibliothèque DOS renverra son résultat dans le LONG rdargs, et la liste des arguments dans le
tableau args. Le tableau volume recevra les arguments chaînes de caractères et la chaîne commande contiendra la ligne de
commande qui exécutera la commande Assign.
Traitement des arguments
Nous allons, comme le mois dernier, utiliser la fonction ReadArgs() de la dos.library avec la chaîne de formatage : "/M,REMOVE/S"
ce qui veut dire que nous allons récupérer comme arguments (dans le tableau args[]) :
- Un tableau de chaîne de caractères (/M) args[0].
- Un commutateur (/REMOVE) args[1].
Commençons par copier "Assign" dans la ligne de commande.
Nous affectons le tableau de chaîne à volume. Si la première chaîne de caractère est nulle (volume[0]=NIL) il n'y a pas de
volume à assigner. Nous sautons jusqu'au ENDIF, et exécutons la ligne de commande ("Assign"), ce qui nous donne la liste des
volume assignés.
Si la seconde chaîne de caractères (volume[1]) n'est pas nulle, c'est qu'il y a trop d'arguments. On sort du programme (Raise
(ER_ARGS)).
Si le second argument (args[1]) n'est pas nul, l'utilisateur a activé le commutateur REMOVE. Nous ajoutons à la suite de la
ligne de commande le nom du volume (volume[0]) et sautons jusqu'au ENDIF. ce qui provoque l'exécution de la commande "Assign
<nom du volume>", retirant le volume de la liste des assignations.
Dans tous les autres cas (RAssign <nom du volume>) nous utilisons une fenêtre de requête pour choisir le chemin du volume à
assigner.
La fenêtre de requête ASL
Première chose à faire, nous ouvrons la bibliothèque pour avoir accès à ses fonctions. Nous demandons ensuite au système de nous
allouer un objet filerequester dont nous stockons l'adresse dans le pointeur reqfile. Affichons notre fenêtre de requête avec
AslRequest qui va modifier l'objet reqfile en fonction des choix de l'utilisateur. Le champ reqfile.drawer contient le chemin
d'accès choisi. Nous terminons donc en ajoutant à la ligne de commande le nom du volume (volume[0]), un espace et le chemin.
Nous ne le répèterons jamais assez, mais il faut toujours rendre au système ce que nous lui avons demandé. Nous rendons donc
l'objet filerequester avec FreeAslRequest().
Gestion des erreurs
Comme on ne va pas aller se coucher sans avoir appris quelque chose, nous avons utilisé ce mois-ci la gestion des exceptions
fournies par l'Amiga E.
En effet, quand on met un HANDLE juste après le PROC, on autorise l'interruption de la procédure pendant son exécution grâce à
la fonction Raise(<code d'erreur>). Lorsque un Raise() est rencontré, on saute jusqu'à l'instruction EXCEPT qui délimite,
jusqu'au ENDPROC, la portion de code qui n'est exécutée qu'en cas d'excèption.
De plus, l'instruction Raise(<code d'erreur>) affecte une variable (exception) avec le code d'erreur. Dans notre cas nous
créons une énumération des trois causes d'erreurs possibles ENUM ER_LIB, ER_ARGS, ER_REQ, qui dénote respectivement des
erreurs pour une bibliothèque, sur les arguments et sur la fenêtre de requête.
Nous retrouvons quatre Raise() dans le programme.
Trois en ce qui concerne des appels fondamentaux au système, exemple :
IF (aslbase:=OpenLibrary('asl.library',38))=0 THEN Raise(ER_LIB)
|
...déclenche une erreur de code ER_LIB si la bibliothèque asl.library n'est pas ouverte correctement. Et un dans le traitement des
arguments, si il y en a trop.
Dans la section EXCEPT, nous fermons la bibliothèque ASL, si elle est ouverte. Ensuite, nous traitons les différents cas d'erreurs
avec un SELECT (voir cet article) sur la variable exception.
Pour finir
Voilà, nous espérons que cette petite commande va beaucoup vous plaire et que dorénavant vous agrémenterez vos programmes de
jolies fenêtre de requête. Tous les champs de l'objet "filerequester" sont détaillés dans l'autodoc de l'asl.library mais vous
pouvez aussi les découvrir grâce au code source.
Showmodule library/asl.m
/* Complément d'assign avec requester */
MODULE 'asl','libraries/asl'
MODULE 'utility/tagitem'
MODULE 'dos/var'
ENUM ER_LIB,ER_ARGS,ER_REQ
PROC main() HANDLE
DEF reqfile:PTR TO filerequester
DEF commande[100]:STRING
DEF rdargs:LONG,volume[2]:ARRAY OF LONG
DEF args[2]:ARRAY OF LONG
args[0]:=0 /* initialisation du tableau de
pointeur des arguments */
args[1]:=0
/*Traitement des arguments */
IF (rdargs:=ReadArgs('/M,REMOVE/S',args,NIL))=
0 THEN Raise(ER_ARGS)
StrCopy(commande,'Assign ')
volume:=args[0]
IF volume[0]=NIL
ELSEIF volume[1]
WriteF('trop d''arguments ')
Raise(ER_ARGS)
ELSEIF args[1]
StrAdd(commande,volume[0])
ELSE /* utilisation du FileRequester */
IF (aslbase:=OpenLibrary('asl.library',
38))=0 THEN Raise(ER_LIB)
IF (reqfile:=AllocFileRequest())=0
THEN Raise(ER_REQ)
AslRequest(reqfile,0)
StrAdd(commande,volume[0])
StrAdd(commande,' ')
StrAdd(commande,reqfile.drawer)
FreeAslRequest(reqfile)
CloseLibrary(aslbase)
ENDIF
Execute(commande,0,0)
EXCEPT
IF aslbase THEN CloseLibrary(aslbase)
SELECT exception
CASE ER_REQ
WriteF('impossible d''alouer le requester')
CASE ER_LIB
WriteF('impossible d''ouvrir la
reqtools.library')
CASE ER_ARGS
WriteF('Usage: volume [REMOVE]')
ENDSELECT
ENDPROC
|
|