Obligement - L'Amiga au maximum

Lundi 24 juillet 2017 - 18:43  

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 - utilisation d'une AppIcon
(Article écrit par Yann Armand et Pierre Girard et extrait d'Amiga News - novembre 1995)


Description

Ce mois-ci, un petit programme qui va vous rendre bien des services. Il peut, en effet, lancer vos fichiers texte ou image directement depuis le Workbench, et avec l'utilitaire que vous souhaitez !

Une AppIcon : quèsaco ?

Une AppIcon est une icône qui ne renvoie pas directement à un programme, mais qui peut exécuter une action quand on "lâche" une autre icône dessus. Il existe d'autres types d'éléments graphiques qui sont "App" (menus, fenêtre de requête...). Essayez donc de déposer une icône dans une fenêtre de requête Reqtools et vous verrez ce qui se passe ! Mais, entrons tout de suite dans le vif du sujet.

Le programme

Après la description générale de ce qu'est une AppIcon, nous allons maintenant nous intéresser à un petit programme pratique, dérogeant ainsi à la règle que nous nous étions fixée, d'alterner entre les exemples concrets et la théorie. Attention, le programme de ce mois-ci ne fonctionne qu'avec un système 2.04 ou plus. Il ouvre une AppIcon et exécute une action quand on dépose une icône sur celle-ci. Ce n'est pas clair ? Par exemple, tapons au clavier : "AppIcon c:muchmore". Une AppIcon apparaît alors, représentant l'icône de Muchmore et chaque fois que l'on dépose, depuis le Workbench, un fichier texte dessus, l'AppIcon invoque Muchmore et affiche le texte. Il est à noter qu'il faut donner le chemin complet d'accès à Muchmore. De plus, le programme à invoquer doit absolument posséder une icône (nom.info), car notre programme duplique celle-ci pour afficher l'AppIcon.

Description

Attention ! Cet article et ceux à venir ne seront peut-être pas aussi "propres" que ceux des mois précédents. En effet, toutes les procédures "propres" sont longues et nous préfèrerons désormais privilégier les routines essentielles. C'est ainsi que ce mois-ci, il aurait été mieux de faire une procédure Main() HANDLE suivie d'un EXCEPT pour gérer les erreurs (cf Amiga News du mois dernier), car le CleanUp(0) du début n'est vraiment pas beau.

Nous passons sur le chargement des modules qui doit dorénavant vous être familier, vous chercherez vous-même leur utilisation. Étant donné la taille du programme, nous inclurons toute la routine dans une procédure Main(). Le programme se lance à partir du Shell et requiert un argument que nous stockons dans la variable "programme". Si cet argument est absent, le programme quitte en catastrophe avec la fonction CleanUp() du E. Ensuite, nous procédons à l'ouverture des différentes bibliothèques avant de créer un port message (myport) qui va nous permettre de déterminer si une icône a été déposée sur notre AppIcon.

Les deux lignes suivantes représentent le coeur de notre programme. La fonction AddAppIconA() ajoute une AppIcon au Workbench. La syntaxe exacte est "AddAppIconA(id, userdata, text, msgport, lock, diskobj, taglist)". Les variables "id" et "userdata" sont destinées à l'utilisateur (qui peut donner un numéro d'identification...). "Text" détermine le nom de l'AppIcon et "msgport" est le nom du port message à utiliser. "Lock" est inutilisé (NULL) et "diskobj" est un pointeur sur une structure DiskObject. Pour initialiser cette structure, nous utilisons, à la ligne suivante, la fonction GetDiskObject() de l'icon.library. Celle-ci renvoie dans la variable "diskobj" la structure DiskObject de l'icône du programme appelé. Les tags sont ensuite initialisés avec le type MTYPE_APPICON ainsi qu'avec TAG_DONE qui termine l'initialisation. Le reste du programme est assez classique et ne mérite que peu d'explications.

Le traitement des données se fait à l'intérieur d'une boucle REPEAT-WHILE qui ne se termine que quand le message reçu correspond à "Ctrl-C" (testé par CheckSignal (SIGBREAK_CTRL_C)). Il convient tout d'abord de faire un WaitPort() pour attendre un message. Quand un message est présent (une icône lâchée ou un double-clic sur l'AppIcon), un GetMsg(myport) se charge de le stocker dans la variable "appmsg". La ligne suivante nous permet d'utiliser les arguments récupérés (de l'icône déposée sur l'AppIcon) comme des arguments Workbench. La fonction CurrentDir() de la dos.library "pose" un lock sur le répertoire de l'icône, ce qui va nous permettre de réaliser les opérations qui nous intéressent, sans avoir à nous soucier du chemin complet pour accéder à l'icône. L'ancien lock (répertoire courant) est stocké dans la variable "old_lock". Pour expliquer la syntaxe, il faut savoir que la structure wbarg contient seulement deux entrées : un pointeur sur un "lock" et une chaîne de caractères liée à ce "lock" (qui correspond ici au nom de l'icône).

On lance !

Il ne nous reste plus qu'à créer notre ligne de commande. Nous stockons le nom du programme dans la chaîne de caractères "commande". Il faut ensuite ajouter un espace, puis le nom de l'icône (wb_args.name), et ceci grâce à la fonction StrAdd() du E. La commande entière est alors exécutée à l'aide de la fonction Execute() de la bibliothèque DOS.

On remet tout en ordre

Tout d'abord, nous revenons à l'ancien répertoire avec CurrentDir(old_lock). Ensuite, il nous faut renvoyer le message à l'aide d'un ReplyMsg(appmsg), et ceci est indispensable, sinon notre programme reste bloqué. Si un "Ctrl-C" ou une erreur a lieu, il faut quand même fermer l'AppIcon, le port message et les différentes bibliothèques.

Conclusion

Ce programme est réduit à sa plus simple expression. Il peut être amélioré par exemple en mettant un ">nil:" dans la commande pour ne pas avoir de retour de texte dans la fenêtre Shell. Pour sortir du programme, il faut faire un "Ctrl-C", mais celui-ci ne prend pas effet immédiatement, car le waitport() est en attente. Nous vous conseillons de faire un "Ctrl-C" et, par exemple, de double-cliquer sur l'AppIcon.

Le mois prochain, nous verrons comment améliorer sensiblement ce petit programme qui peut devenir, il est vrai, très pratique.

/* AppIcon : Ajoute une AppIcon aux programmes 
    qui n'en possèdent pas*/
OPT OSVERSION=37
MODULE 'workbench/workbench' 
MODULE 'workbench/startup'
MODULE 'dos/dos'
MODULE 'utility/tagitem'
MODULE 'wb'
MODULE 'icon'
MODULE 'exec/ports'
MODULE 'exec/nodes'

DEF old_lock,testctrl_c
DEF myport,appicon,res: PTR TO mp
DEF diskobj: PTR TO diskobject
DEF appmsg: PTR TO appmessage
DEF wb_args: PTR TO wbarg
DEF commande[200]: STRING
DEF programme[200]: STRING

PROC main()
IF StrCmp(arg,'',1) THEN CleanUp(0) ELSE StrCopy(programme,arg)
    IF workbenchbase:=OpenLibrary('workbench.library',37)
        IF iconbase:=OpenLibrary('icon.library',37)
            IF myport:=CreateMsgPort()
                IF diskobj:=GetDiskObject(programme)
                    IF appicon:=AddAppIconA(0,0,'Display me',myport,NIL, 
                                                diskobj,[MTYPE_APPICON,TAG_DONE])
                        REPEAT
                        res:=WaitPort(myport)
                            IF appmsg:=GetMsg(myport)
                                wb_args:=appmsg.arglist
                                old_lock:=CurrentDir(wb_args.lock)
                                StrCopy(commande,programme)
                                StrAdd(commande,' ')
                                StrAdd(commande,wb_args.name,ALL)
                                Execute(commande,NIL,stdout)
                                CurrentDir(old_lock)
                                testctrl_c:=CheckSignal(SIGBREAKF_CTRL_C)
                                    WHILE appmsg:=GetMsg(myport) DO Reply-
                                                                                         Msg(appmsg)
                            ENDIF
                        UNTIL testctrl_c<>0
                        RemoveAppIcon(appicon)
                    ENDIF
            ENDIF
            DeleteMsgPort(myport)
            ENDIF
            CloseLibrary(iconbase)
        ENDIF
        CloseLibrary(workbenchbase)
    ENDIF
ENDPROC


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