Obligement - L'Amiga au maximum

Mardi 03 juin 2025 - 20:17  

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 : Pascal - Le gadget d'édition
(Article écrit par Olivier Garrigues et extrait d'Amiga News Tech - juin 1992)


Dernier épisode de la saga du Pascal, où l'on disséquera les pointeurs et implémentera un nouveau type de gadget, le gadget Éditeur.

Les pointeurs sont des objets qui désignent des adresses. Nous avons déjà vu le type pointeur par excellence, à savoir le type ADDRESS. Tous les pointeurs pointent sur un type bien défini. L'utilité principale en Pascal (et surtout avec PCQ) est de permettre l'allocation dynamique de données, et ce de manière bien plus simple qu'en C.

L'opérateur ^

Pour définir un type pointeur sur un objet de type quelconque, nous écrivons :

VAR pointeur : ^TypeObjet;

...ou bien, pour définir un type :

TYPE TypePointeur = ^TypeObjet ;
VAR pointeur : TypePointeur ;

Normalement, Pascal autorise la définition d'un type pointeur avant celle de l'objet pointé, mais PCQ ne l'accepte pas.

La deuxième utilisation du circonflexe est justement de permettre d'accéder à l'objet pointé. Si l'on écrit "pointeur^", on obtient l'objet lui-même. Ainsi, pointeur^ ne sera pas du type TypePointeur, mais du type TypeObjet, et toutes les opérations possibles sur ce type seront applicables sur pointeur^.

Il existe également deux procédures, New() et Dispose(), qui permettent respectivement d'allouer la mémoire nécessaire au type désigné par le pointeur passé en argument et de la rendre au système. En cas d'impossibilité d'allocation, un "run-time error" un peu gênant interrompt le programme.

PCQ 1.2b

Dans cette nouvelle version, nous avons un petit optimisateur et de nouvelles fonctionnalités. L'optimisateur est assez rapide et il reconnaît plusieurs formes évitant l'utilisation de la pile pour transférer, par exemple, une valeur de D0 à D1. Le nouveau compilateur utilise plus de registres pour les calculs (jusqu'à présent, il ne connaissait que D0, D1, A0 et A1). Des corrections ont été apportées aux bogues découverts (comme sur les constantes réelles, la parité d'adresse des éléments de tableaux), ainsi que l'inclusion unique des fichiers Include et l'adaptation plus proche du Pascal : la boucle "for" est exécutée 0 fois si la borne d'origine est plus grande que la borne finale (ceci peut provoquer des incompatibilité d'exécution avec des sources de la version 1.1c).

Au sujet des fichiers Include, Patrick Quaid les a modifiés pour qu'ils ressemblent plus aux originaux de Commodore (une plus grande logique dans la structure sur disque). Au niveau de l'utilisation, je peux dire que tous ces ajouts ralentissent la compilation, mais les nouvelles fonctionnalités sont trop intéressantes pour les laisser de côté. Je vous conseille de vous procurer cette version le plus rapidement possible.

Le gadget "Texte"

Notre système préféré dispose de gadgets booléens, de chaînes, d'entiers et d'image, mais rien pour éditer un texte dans un rectangle et sur plusieurs lignes (pour une seule ligne, utilisez un StringGadget). Ce à quoi je vous propose de remédier.

Pour réaliser notre projet, il nous faut nous donner quelques contraintes et diviser le problème en sous-problèmes :
  • Le texte à éditer sera contenu dans une zone rectangulaire car le gadget utilise le console.device.
  • Le texte est une suite de caractères dont la fin est indiquée par (au hasard) le caractère '\0' ; une fin de ligne est marquée par '\n'.
  • Il est possibile de sélectionner du texte par la souris ou le clavier pour le copier-coller.
  • Les touches fléchées déplacent le curseur et il est possible de programmer les touches de fonction, "Esc" et "Help".
  • Le formatage des lignes de texte se fait par une procédure. Un problème se pose du fait que PCQ ne connaît pas les pointeurs de fonctions, mais la directive de compilation $A est là !
  • Plusieurs textes peuvent être affichés en même temps. Bien sûr, un seul texte est éditable à la fois.
  • Il est possible d'ajouter des menus précalculés.
Pour débuter, il nous faut des outils : un gadget digne de ce nom doit est relié à une fenêtre. Nous commencerons donc par mettre au point deux fonctions permettant l'ouverture d'une fenêtre et l'ajout d'un gadget. Ces fonctions renverront un pointeur respectivement sur une fenêtre (windowptr tel qu'il est défini dans intuition.i) et sur un gadget (GadgetPtr).

Comment ouvrir une fenêtre ?

En premier lieu, nous devons savoir de quels arguments nous avons besoin pour ouvrir une fenêtre assez simplement : ses mesures (largeur et hauteur), les drapeaux système et IDCMP, un titre et un titre pour l'écran (il est toujours bon de savoir où l'on se trouve).

Pour faire joli, on peut centrer la fenêtre. Comme on n'est pas des Américains, on pense aux autres standards d'affichage et au Workbench 2.0, qui permet d'ouvrir des écrans plus grands. Il faut donc récupérer la hauteur et la largeur de l'écran Workbench.

Mon idée de départ était la suivante : puisque PCQ ouvre l'intuition.library, on doit pouvoir obtenir assez facilement un pointeur sur celle-ci. Or ce n'est pas le cas et de plus, nous n'avons pas (dans la version 1.1) de structure IntuitionBase. Pour éviter de grossir inutilement le programme, un seul recours : l'assembleur.

Magouille en assembleur

Cette petite fonction renvoie un pointeur sur le premier écran, normalement le "Workbench Screen" mais par doute et par pédagogie, je vous donne une seconde fonction qui renvoie un pointeur sur l'écran du Workbench.

Pascal
Pascal

La deuxième fonction permet d'obtenir directement un pointeur sur la structure de l'écran Workbench (ou "NIL" s'il est pas ouvert - on ne sait jamais). Elle possède un défaut : je me base sur une chaîne de caractères qui ne peut assurer une compatibilité à 100% avec d'autres versions du système (en effet, je cherche le mot "Workbench" dans le titre par défaut de l'écran). Enfin, j'utilise la fonction ObtainFirstScreen définie ci-dessus.

Par ailleurs, il faut inclure deux fichiers dans les lignes du programme. Pour cela, Il suffit de mettre les deux lignes suivantes après l'instruction contenant le symbole "Program" (première ligne) :

{$I "inc:Stringlib.i" traitement des chaînes de caractères }
{$I "inc:Screen.i"    travail sur les structures screens   }

Remarques :
  • Il faut modifier les fichiers includes : ceux-ci s'appellent entre eux, mais le chemin d'accès n'est pas totalement relatif. Je vous conseille de remplacer "Include/" par "inc:".
  • Pour la version 2, on écrit plutôt :
{$I "include:Utils/Stringlib.i"  }
{$I "include:Intuition/Screen.i" }

La fonction est de la forme suivante :

Pascal

Ces deux fonctions permettent de construire la fonction "fenetre" qui nécessite, en plus, le fichier "include:intuition/intuition.i". Mais avec PCQ 1.1, ce fichier est directement inclus avec "screen.i" et, comme il ne fait pas de test sur les inclusions multiples, il ne faut pas l'inclure sous peine d'erreurs de duplications :

Pascal
Pascal

Une autre idée pourrait être d'ouvrir une fenêtre plein écran, avec comme paramètres le nombre de pixels à laisser de chaque côté.

Les gadgets

Nous aurons besoin de deux types de gadget : les gadgets booléens (non étendus) et les gadgets proportionnels, d'une implémentation plus difficile.

Le rôle du gadget est d'obtenir une zone graphique sensible au curseur : nous pourrons obtenir la position de la souris, et si on active, ou pas, notre zone de texte.

Les gadgets font intervenir plusieurs structures (RECORDS). La première est la structure Border, qui permet de faire des dessins vectoriels. Dans notre cas, il faudra calculer les quatre points nécessaires au tracé d'un cadre. La seconde est la structure IntuiText que nous n'utiliserons pas car nous voulons une zone vide d'écriture parasite : nous afficherons notre texte par le console.device. Enfin, pour le gadget proportionnel, une troisième structure est nécessaire, la Propinfo.

Hélas pour les possesseurs de la version 1.1, aucune définition du gadget n'est donnée (pour la version 1.2, pas de problème, elle est dans "intuition.i"). Mais votre serviteur, par pure bonté, vous la donne sous la forme d'une déclaration de type :

Pascal

Dans le cadre de notre projet, nous voulons une procédure qui puisse ajouter un gadget à une fenêtre afin d'afficher un texte sur n colonnes et m lignes, avec (dans un futur proche) des barres de défilement.

Pascal
Pascal

Un petit programme d'exemple suit. Nous continuerons le mois prochain à développer nos routines de gestion d'un gadget de texte, avec notamment une étude rapide du console.device.

Pascal
Pascal
Pascal
Pascal


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