Obligement - L'Amiga au maximum

Mardi 17 octobre 2017 - 06:02  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


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


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]