Obligement - L'Amiga au maximum

Vendredi 29 mars 2024 - 08:16  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

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

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des 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,
ALL


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


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : C - Les gadgets booléens et les gadgets de chaînes
(Article écrit par Pascal Amiable et extrait d'Amiga News Tech - mai 1991)


Deuxième aspect de notre voyage au coeur d'Intuition, nous allons étudier ce mois-ci les gadgets, et plus particulièrement deux types de gadgets : les booléens et les gadgets de chaînes.

Après l'article, un tantinet théorique, du mois dernier, et comme nous en savons désormais assez pour écrire une petite application, nous allons définir quelles seront les fonctionnalités du produit à réaliser et quels seront les moyens à mettre en oeuvre pour le faire. Le programme que nous allons réaliser est un simple convertisseur de formats de nombres. Trois formats seront traités : le décimal, l'hexadécimal et l'octal.

Nous allons donc créer trois gadgets booléens qui nous permettront d'indiquer au programme sous quel format sera saisi le nombre à convertir. La saisie du nombre se fera quant à elle par l'intermédiaire d'un gadget de saisie de chaînes de caractères. La taille maximum du texte saisi doit correspondre à la taille maxi prise par un mot long en octal, soit 11 caractères. Une fois le texte saisi, celui-ci est converti dans les différents formats et affiché dans la fenêtre à côté des gadgets respectifs.

L'utilisation d'un tel programme est très simple. Au lancement, la fenêtre et les gadgets apparaissent, ainsi que le texte "Décimal" indiquant le mode de saisie par défaut du programme (il s'attend à recevoir un nombre décimal). Dès lors, deux choix s'offrent à l'utilisateur :
  • Saisir un nombre décimal pour qu'il soit traité.
  • Changer de format de saisie en cliquant sur "octal" ou "hexa".
Dans le cas où un nombre est saisi dans un format ne correspondant pas, le programme n'interprète pas l'entrèe et montre son mécontentement en faisant clignoter l'écran.

Réalisation

La première chose qu'il nous faut faire, c'est ouvrir une fenêtre liée à un écran. L'écran que nous allons utiliser pour accrocher notre fenêtre est celui du Workbench. Par rapport à l'article du mois dernier, nous indiquerons donc dans le champ "NewWindow.Type" WBENCHSCREEN à la place du CUSTOMSCREEN de la dernière fois.

Nous devons ensuite définir nos gadgets. Cette opération s'effectue en renseignant une liste chaînée de structures "Gadget". Voici le détail de la structure "Gadget" avec un rapide commentaire pour chaque champ.

C

Le chaînage s'effectue en associant au gadget N, l'adresse du gadget N+1 dans le champ "NextGadget". Lorsqu'il s'agit du dernier gadget de la liste, ce champ est mis à NULL. Une fois cette liste correctement renseignée, il ne reste plus qu'à la lier à la fenêtre. On indique l'adresse du premier gadget de la liste dans le champ "NewWindow.Gadget" et là, miracle, lorsque l'on demandera à Intuition d'ouvrir la fenêtre à l'aide de la fonction OpenWindow(), elle affichera automatiquement les gadgets.

Voyons un peu les caractéristiques du gadget booléen. Un gadget est défini comme booléen (oui/non) à partir du moment où l'on indique BOOLGADGET dans le champ GadgetType. Dans le cas qui nous intéresse, on veut que le gadget nous prévienne dès qu'il est activé et qu'il arrête d'être actif dès que l'on n'appuie plus dessus. On prendra soin de positionner pour ce faire le drapeau GADGIMMEDIATE dans le champ Activation de notre gadget.

Voilà, notre gadget est prêt à l'emploi : dès que l'on cliquera dessus, Intuition nous enverra un message de classe GADGETDOWN (message->Class = GADGETDOWN) nous indiquant qu'un des gadgets de la liste a été sélectionné. Que faut-il faire maintenant ? Savoir quel gadget a été sélectionné bien sûr !

Nous avons plusieurs méthodes pour arriver à ce résultat :

La première consiste, lorsque l'on a reçu le message GADGETDOWN d'Intuition, à balayer la liste des gadgets et à vérifier quel gadget possède le drapeau SELECTED, par exemple.

C

Deuxième méthode, dans la structure IntuiMessage envoyée par Intuition, il y a un champ "IAddress" qui contient l'adresse de l'émetteur du message. Il suffit de tester si ce champ équivaut à l'adresse d'un des gadgets dans la liste.

C

Pour éviter une série de "if" à rallonge, il est possible d'utiliser le champ "GadgetID" de la structure gadget. Pour chaque gadget, nous allons stocker dans ce champ son numéro. Comme avec la méthode précédente, nous sommes capable de récupérer l'adresse du gadget, nous pouvons sans problème récupérer son numéro et remplacer ainsi la lourde structure à base de if, else if, par un switch beaucoup plus simple à gérer.

C

Ayant l'habitude d'en faire le moins possible pour arriver au résultat, j'ai rapidement trouvé le switch lourd à gérer. Or, on peut s'en passer avec un peu d'astuce. Dans la structure Gadget, nous avons un champ dénommé UserData. Ce champ pouvant contenir, ce que l'on peut veut, pourquoi ne pas lui faire contenir l'adresse de la fonction qui va être appelée lorsque le gadget sera activé ? Ce qui donne :

C

Il ne faut pas oublier de déclarer les fonctions avant de déclarer le gadget, sinon le compilateur risque de vous injurier (à juste titre d'ailleurs). Le "cast" peut sembler un peu compliqué mais en le décomposant, on comprend très vite :
  • (struct Gadget *)message->IAddress correspond à l'adresse du gadget.
  • ((struct Gadget *)message->IAddress)->UserData correspond au champ UserData du gadget, qui est de type APTR.
  • Pour le transformer en type fonction "void", il faut le caster en pointeur de fonction, donc ((void(*)())((struct Gadget *)message->IAddress)->UserData)).
  • Enfin, pour exécuter la fonction, il ne reste plus qu'à récupérer son adresse qui se trouve dans UserData, d'où l'on obtient (*((void(*)())((struct Gadget *)message->IAddress)->UserData))().
Simple, non ? (non, pas trop, je vous l'accorde). Pour le reste des détails, je vous renvoie au programme accompagnant cet article.

Concentrons-nous maintenant sur la structure particulière du gadget de saisie de chaînes de caractères. Pour créer un tel gadget, il faut indiquer dans le champ GadgetType STRGADGET et associer au champ "SpecialInfo", une structure StringInfo correctement remplie. La voici commentée.

C
C

La gestion de ce gadget est dans notre cas différente de celle d'un gadget booléen. En effet, il faut récupérer la chaîne de caractères une fois la touche [Entrée] pressée, ce qui correspond à un évènement GadgetUp (c'est donc dans ce cas que l'on doit effectuer la conversion). Malheureusement, lorsque l'on se prépare à saisir une chaîne, l'évènement GadgetDown est aussi généré. On fait donc la différence entre les deux cas avec le nombre de caractères présents dans le "buffer" (tampon mémoire). En effet, avec l'apparition du GadgetDown, le nombre de caractères vaut 0 alors qu'avec GadgetUp, on a saisi tous les caractères, ce nombre est donc différent de zéro. Ce n'est pas plus difficile que cela (Cf. le programme).

Conclusion

Une rapide conclusion car la place me manque. Pour comprendre le reste, je vous invite à étudier le programme commenté qui suit cet article, ainsi que l'Intuition Manual que vous êtes sûr de trouver chez tout bon distributeur Amiga (par exemple chez MAD, 42, rue Lamartine, 75009 Paris). Le mois prochain, nous étudierons les gadgets proportionnels, avec comme support un autre utilitaire (c'est la surprise).

C
C
C
C


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