Section courante

A propos

Section administrative du site

Les unités standard

Sur vos disquettes KICK-PASCAL vous trouverez des unités intégrées que vous pourrez utiliser dans vos programmes. Cette collection d'unités est constamment enrichie par le grand public. C'est pourquoi, il est difficile de documenter toutes les unités fournies avec le Kick-Pascal. Suit maintenant une description des unités standards les plus courantes; vous trouverez la documentation pour le reste sous forme de fichier ASCII sur le disque Source.

Crt et PASCALCrt

Dans sa partie d'initialisation, l'unité Crt ouvre une fenêtre de taille appropriée sur l'écran ainsi qu'un périphérique console et définit l'entrée/sortie standard sur cette fenêtre avec "SetStdIO". Cette unité vous évite donc beaucoup de travail de routine si vous souhaitez ouvrir une fenêtre séparée pour les entrées et sorties d'un programme.

De plus, Crt fournit certaines procédures et fonctions que vous avez peut-être déjà manquées : Avec "ReadKey" et "KeyPressed", il est enfin possible d'interroger une pression sur une touche (sur l'Amiga, cela n'est pas facilement possible via l'EA standard, étant un "CON:", ou du moins agit comme si, possible). Vous pouvez utiliser la fonction «WindowClosed» pour demander si le symbole de fermeture de la fenêtre a été enfoncé. Vous pouvez également facilement interroger d'autres événements, et comme vous connaissez le port Rast et le port utilisateur de la fenêtre, vous pouvez même afficher des graphiques ou utiliser des gadgets et des menus dans la fenêtre de sortie (avec les unités "Intuition" et "Graphics").

Même si vous n'avez pas besoin de toutes ces fonctionnalités, vous pouvez utiliser l'unité "Crt" pour rendre vos programmes démarrables depuis le Workbench : "Uses Crt" provoque l'ouverture automatique d'une fenêtre au démarrage du programme et la redirection des entrées/sorties standard. - sinon les programmes fonctionnent exactement comme avant. Alors que "Crt" a été programmé en assembleur pour garder le code aussi compact que possible, "PASCALCrt" (dans le sous-répertoire "Windows") est une implémentation par ailleurs complètement identique de l'unité "Crt" en langage de programmation Pascal. Cet ensemble est également à votre disposition sous forme de code source afin que vous puissiez le modifier si nécessaire.

Les procédures et fonctions suivantes sont définies dans chacune des deux unités :

Function KeyPressed:Boolean;

La fonction KeyPressed devient "true" lorsqu'une touche est enfoncée ou est déjà dans le tampon du clavier ou qu'un message arrive sur le port utilisateur de la fenêtre de sortie ou est déjà présent.

Exemple :

  1. Repeat
  2.  Write('Bonjour');
  3. Until KeyPressed;

Le fragment de programme affiche en continu "Bonjour" jusqu'à ce qu'une touche soit enfoncée ou que le symbole de fermeture de la fenêtre soit cliqué.

Procedure WaitForKey;

La procédure attend qu'une touche soit enfoncée ou qu'un événement se produise. S'il y a déjà une touche dans le tampon ou si un message est présent sur le port utilisateur de la fenêtre, il n'y a bien sûr pas d'attente.

WaitForKey ne consomme aucun temps de calcul lors de l'attente, il est donc similaire à des constructions douteuses ("attente occupée") telles que :

  1. Repeat Until KeyPressed;

en tout cas préférable.

Function ReadKey:Char;

Cette fonction lit un caractère du clavier. Il s'agit d'attendre une touche ou un événement (message) en appelant «WaitForKey». Si aucune touche n'a été enfoncée mais qu'un message a été reçu à la place, ReadKey renvoie la valeur chr(0).

Exemple :

  1. Uses Crt;
  2.  
  3. Var
  4.  c:Char;
  5.  
  6. BEGIN
  7.  Repeat
  8.   C:=ReadKey;
  9.   WriteLn('Ascii-code',Ord(c):4);
  10.  Until C=Chr(13)
  11. END.

Le programme récupère les caractères du clavier et affiche leur code ASCII jusqu'à ce que le code de la touche Return soit lu. ReadKey ne provoque pas d'écho, c'est-à-dire qu'un caractère lu n'est pas automatiquement affiché à l'écran.

Function MessageReceived(Mask:LongInt):Boolean;

Si "KeyPressed" devient true, il peut y avoir deux raisons : soit une touche a été enfoncée, soit un message a été reçu sur le port utilisateur de la fenêtre de sortie. Ces messages contiennent des informations sur divers événements, par exemple, appuyer sur le gadget de fermeture de la fenêtre, sélectionner un menu déroulant,... Si un tel message est présent, "ReadKey" renvoie la valeur Chr(0), et vous pouvez utiliser "MessageReceived" pour déterminer de quel type de message il s'agissait.

Les constantes suivantes sont définies dans la partie interface de l'unité "Crt" :

  1. Const
  2.  NEWSIZE          = $00000002; { Change la taille de la fenêtre }
  3.  REFRESHWINDOW    = $00000004; { Reconstruire le contenu de la fenêtre }
  4.  MOUSEBUTTONS     = $00000008; { Appuyer/relâcher un bouton de la souris }
  5.  MOUSEMOVE        = $00000010; { Mouvement de la souris }
  6.  GADGETDOWN       = $00000020; { Gadget cliqué }
  7.  GADGETUP         = $00000040; { Gadget relâché }
  8.  REQSET           = $00000080;
  9.  MENUPICK         = $00000100; { Menu sélectionné }
  10.  _CLOSEWINDOW     = $00000200; { Ferme le gadget }
  11.  RAWKEY           = $00000400; { Frappe, code de touche }
  12.  REQVERIFY        = $00000800;
  13.  REQCLEAR         = $00001000;
  14.  MENUVERIFY       = $00002000;
  15.  NEWPREFS         = $00004000; { Change les préférences }
  16.  DISKINSERTED     = $00008000; { Insère une disquette }
  17.  DISKREMOVED      = $00010000; { Enlève une disquette }
  18.  WBENCHMESSAGE    = $00020000;
  19.  ACTIVEWINDOW     = $00040000; { Fenêtre activée }
  20.  NACTIVEWINDOW    = $00080000; { Fenêtre désactivée }
  21.  DELTAMOVE        = $00100000; { Changement de gadgets }
  22.  VANILLAKEY       = $00200000; { Frappe au clavier, code ASCII }
  23.  INTUITICKS       = $00400000;

Ces numéros sont appelés «drapeaux IDCMP» («IDCMP» = «Intuition Direct Communication Message Port»).

Vous pouvez avec :

  1. If MessageReceived(NEWSIZE)Then ...

demander si la taille de la fenêtre a été modifiée. Puisque chaque signal correspond à un bit, vous pouvez également demander si l'un des nombreux signaux a été reçu en effectuant un OR entre les codes :

  1. Repeat
  2.  { ... }
  3. Until MessageReceived(DISKREMOVED or _CLOSEWINDOW);

Cette boucle s'exécute jusqu'à ce qu'une disquette soit retirée de l'unité de disque ou que la fenêtre soit fermée.

Mais vous devez d'abord indiquer au système d'exploitation les événements que vous souhaitez connaître à l'aide des procédures «SetIDCMP» et «AddIDCMP». Par défaut, seul le drapeau "_CLOSEWINDOW" est positionné à l'ouverture de la fenêtre. Cependant, "MessageReceived" ne récupère pas le message - vous devez utiliser la fonction "ReadKey" pour lire le caractère Chr(0) afin que l'unité "Crt" sache que vous avez évalué le message.

Une évaluation des événements de la fenêtre et/ou du clavier pourrait ressembler à ceci :

  1. Uses Crt;
  2. Var 
  3.  C:Char;
  4.  
  5. BEGIN
  6.  AddIDCMP(MOUSEBUTTONS);
  7.  Repeat
  8.   C:=ReadKey;
  9.   If C=Chr(0)Then Begin
  10.    If MessageReceived(MOUSEBUTTONS)Then WriteLn('Clic !');
  11.    If MessageReceived(_CLOSEWINDOWS)Then WriteLn('Au revoir !');
  12.   End
  13.    Else
  14.   Begin
  15.    { Évaluer la touche, par exemple donc : }
  16.    Write(C);
  17.  End;  
  18.  Until(MessageReceived(_CLOSEWINDOW))or(c=#x);
  19. END.

Bien entendu, les deux parties sont facultatives, c'est-à-dire que si vous souhaitez évaluer uniquement les touches ou uniquement les messages, vous pouvez ignorer les autres événements. La seule difficulté est que vous devez également utiliser la fonction "ReadKey" pour la gestion des messages, sinon l'unité "Crt" ne peut pas savoir quand vous avez évalué un message et souhaitez le suivant.

Procedure SetIDCMP(Mask:LongInt);

Cette procédure définit les drapeaux IDCMP de la fenêtre de sortie (voir sous "MessageReceived"). Seul «_CLOSEWINDOW» est défini par défaut au début.

Procedure AddIDCMP(Mask:LongInt);

Contrairement à SetIDCMP, définissant les drapeaux IDCMP, la procédure AddIDCMP ajoute uniquement de nouveaux drapeaux. Le paramètre est donc lié en OR aux drapeaux précédents. Ainsi, «AddIDCMP(0)» est une instruction vide (ne faisant rien), tandis que «SetIDCMP(0)» effacerait tous les drapeaux.

Procedure SubIDCMP(Mask:LongInt);

C'est le pendant de "AddIDCMP" : les drapeaux passés en paramètres sont supprimés du masque IDCMP de la fenêtre.

Function WindowClosed:Boolean;

Cette fonction est l'abréviation de "MessageReceived(_CLOSEWINDOW)". Vous pouvez l'utiliser pour demander facilement si le gadget de fermeture de la fenêtre a été cliqué. Mais il en va de même pour "MessageReceived" : Les événements doivent être récupérés avec la fonction "ReadKey" pour que l'unité "Crt" sache qu'ils ont été traités.

Exemple :

  1. Uses Crt;
  2. Var 
  3.  C:Char;
  4. BEGIN
  5.  Repeat
  6.   C:=ReadKey;
  7.  Until WindowClosed;
  8. END.

Sans l'appel «ReadKey», cela constituerait une boucle sans fin, car le message correspondant ne serait jamais récupéré sur le port utilisateur de fenêtre; De plus, ce serait une «attente chargée» faisant perdre du temps de calcul.

Function CrtMessage:Ptr;

Si un appel à "MessageReceived" entraîne la réception d'un message, cette fonction renvoie un pointeur vers celui-ci (sinon "NIL"). Vous pourrez alors les attendre de plus près.

Exemple :

  1. Uses Crt,Intuition;
  2.  
  3. Var
  4.  C:CHar;
  5.  M:^IntuiMessage;
  6. BEGIN
  7.  AddIDCMP(MOUSEBUTTONS);
  8.  Repeat
  9.   C:=ReadKey;
  10.   If MessageReceived(MOUSEBUTTONS)Then Begin
  11.    M:=CrtMessage;
  12.    WriteLn('Position : ',M^.MouseX:5,M^.MouseY:5);
  13.   End;
  14.  Until WindowClosed;
  15. END.

Si vous cliquez avec le bouton gauche de la souris dans la fenêtre de sortie, ce programme donnera les coordonnées exactes de la position.

Function CrtWindow:Ptr;

Cette fonction renvoie le descripteur de fenêtre de la fenêtre Crt. Vous en avez besoin à de nombreuses fins, par exemple si vous souhaitez ajouter un gadget ou un menu à la fenêtre.

Function CrtRastPort:Ptr;

Cette fonction vous donnera un pointeur vers le RasPort de la fenêtre Crt. Ce pointeur est principalement nécessaire pour les commandes graphiques. Exemple :

  1. Uses Crt,Graphics;
  2.  
  3. Var
  4.  Saisir:Char;
  5.  I:Integer;
  6.  x1,x2,y1,y2:Real;
  7. BEGIN
  8.  Write(#e'0 p');
  9.  SetAPen(CrtRastPort,1);
  10.  For i:=1 to 200 do Begin
  11.   x1:=320+300*Sin(I/25);
  12.   x2:=320+300*Sin(I/20);
  13.   y1:=120+100*Cos(I/32);
  14.   y2:=120+100*Cos(I/40);
  15.   Move(CrtRastPort,Round(x1),Round(y1));
  16.   Draw(CrtRastPort,Round(x2),Round(y2))
  17.  End;
  18.  Repeat Saisir:=ReadKey Until WindowClosed
  19. END.

Ce programme génère un joli motif en utilisant trois fonctions de la bibliothèque graphique (étant définie dans l'unité "Graphics").

Function CrtUserPort:Ptr;

Renvoie un pointeur vers le UserPort de la fenêtre Crt.

Function NameOfProgram:String;

Cette fonction renvoie le nom de la fenêtre Crt. En général, le nom sous lequel le programme a été chargé en tant que fichier exécutable depuis le Workbench ou depuis le CLI est utilisé ici. Cependant, s'il a été démarré depuis l'environnement de développement KICK-PASCAL, il existe deux cas particuliers : si KICK-PASCAL a été démarré depuis la CLI, la fenêtre de la console contient l'instruction CLI correspondante au démarrage du workbench, "KICK-PASCAL" est ; utilisé par défaut.

Function CrtConsole:Ptr;

Avec cette fonction, vous obtenez le descripteur du périphérique console étant ouvert par l'unité "Crt" pour la fenêtre d'entrée/sortie. Si vous ouvrez une deuxième fenêtre dans votre programme et y redirigez temporairement l'entrée/sortie standard avec "SetStdIO", vous pourrez ensuite la réinitialiser à la fenêtre Crt normale avec "SetStdIO(CrtConsole)".

Function TextLines:Integer;

Cette fonction indique combien de lignes de texte il y a de l'espace dans la fenêtre de sortie.

Function TextColms:Integer;

Homologue de «TextLines» : renvoie le nombre de colonnes de texte dans la fenêtre.

Exemple :

  1. Uses Crt;
  2. BEGIN
  3.  WriteLn('La taille de la fenêtre est de ',TextColms,'*',TextLines,' caractères');
  4.  WaitForKey;
  5. END.

Function WhereX:Integer;

Avec cette fonction, vous pouvez interroger la position actuelle du curseur. Il renvoie la colonne dans laquelle se trouve le curseur.

Function WhereY:Integer;

Analogue à "WhereX", renvoie la colonne dans laquelle se trouve actuellement le curseur.

Procedure WindowTitles(WindowName,ScreenName:String);

L'unité "Crt" donne à la fenêtre le nom sous lequel le programme a été lancé. Ce nom ainsi que le nom du WorkBench peuvent être modifiés à l'aide de la procédure "WindowTitles". Le titre du workbench ne change que tant que la fenêtre Crt est active.

Mettre un paramètre à "Nil" ne correspond pas à un nom. La valeur "(Str(-1)" garantit que le nom précédent est conservé.

Exemples :

  1. WindowTitles('Test',Str(-1));

La fenêtre s'appelle «Test», le nom de l'écran du Workbench reste le même :

  1. WindowTitles(Filename,'Editeur');

Le nom de la fenêtre correspond au contenu de la variable "Filename" (dans cette exemple, est une variable de chaîne de caractères), tandis que l'écran du Workbench reçoit le nom "Editeur" lorsque la fenêtre Crt est active. Attention : Si vous modifiez le contenu de la variable chaîne de caractères, le nom de la fenêtre ne sera pas mis à jour automatiquement (comment le système d'exploitation le saura-t-il), seulement la prochaine fois que la barre de titre sera actualisée. Vous devez donc appeler à nouveau la procédure "WindowTitles" chaque fois que vous l'attribuez à la variable.

  1. WindowTitles(Str(-1),Nil);

Le nom de la fenêtre reste le même, l'atelier devient sans nom.

Printer

Cette unité est écrite en PASCAL et est extrêmement courte : Dans la partie interface, seule une variable fichier texte appelée "Lst" est définie et ouverte en écriture dans la partie d'initialisation sous le nom "PRT:". Si cela échoue, le programme se termine avec un message d'erreur correspondant.

Ainsi, en incluant cette unité, vous pouvez facilement déclarer :

  1. Write(Lst,...);

afin de sortie des données vers l'imprimante.

Les unités du système AMIGA

Le système inclut des fichiers indispensables pour une utilisation professionnelle sur l'Amiga. Ils contiennent d'innombrables déclarations de constantes, de types de données et de fonctions de bibliothèque et permettent ainsi un accès complet au système d'exploitation Amiga.

Le problème avec ces fichiers d'inclusion est qu'il peut y en avoir un grand nombre et que leur traduction prend un temps considérable. Afin d'accélérer un peu cela, des unités ont été créées pour les fichiers d'inclusion les plus importants. Leur partie interface est essentiellement constituée de fichiers d'inclusion, tandis que leur partie implémentation est en grande partie vide (dans certains cas, de petites initialisations peuvent être entendues dans la partie d'initialisation).

En raison de la taille énorme de ces fichiers d'inclusion, tous les identificateurs y étant définis ne peuvent pas être mentionnés (et certainement pas expliqués) à ce stade.

Exec1 et Exec

Exec est la partie la plus interne du système d'exploitation Amiga. C'est pourquoi certaines des inclusions d'Exex sont également utilisées par d'autres parties du système d'exploitation, tandis que d'autres ne sont nécessaires que si vous souhaitez vraiment programmer Exex directement.

Pour cette raison, deux unités Exec ont été définies : Premièrement, «Exec1», contenant les fichiers d'inclusion suivants dans sa partie interface :

exec/lists.h
exec/nodes.h
exec/ports.h
exec/semaphores.h
exec/tasks.h

L'unité Exec1 est alors également utilisé par presque toutes les autres unités système. Tout le reste est ensuite défini dans «Exec», à savoir le contenu des fichiers inclusions suivants :

exec/alerts.h
exec/devices.h
exec/execbase.h
exec/errors.h
exec/interrupts.h
exec/io.h
exec/libraries.h
exec/memory.h
exec/resident.h

De plus, l'unité «Exec1» est ici intégrée avec «USES», de sorte que les définitions de cette unité sont alors automatiquement disponibles.

GraphTypes et Graphics

Les inclusions "Graphics" sont essentiellement contenus dans deux fichiers : "Graph-Types" et "Graphics". Le premier contient les types de données les plus importants dans la zone graphique, à savoir le contenu des fichiers suivants :

graphics/gfx.unit.h
graphics/clip.h
graphics/view.h
graphics/layers.h
graphics/rastport.h
graphics/text.h

Le fichier "gfx.unit.h" est identique à "gfx.h", mais ne contient que l'entête de la fonction "RasSize" y étant déclarée (comme elle doit l'être dans la partie interface des unités). Le corps de cette fonction se trouve dans la partie implémentation de l'unité. De plus, cette unité utilise l'unité «Exec1» décrite ci-dessus.

L'unité "Graphics" utilise "Exec1" et "Graphtypes". Dans la partie interface, il n'y a que le fichier d'inclusion "graphics.unit.lib", différant de "graphics.lib" en ce sens que la procédure "OpenGfx" est manquante. Au lieu de cela, la bibliothèque graphique est ouverte dans la partie initialisation de l'unité. Si vous utilisez l'unité "Graphics", vous n'êtes pas obligé d'ouvrir ou de fermer cette bibliothèque vous-même.

Veuillez noter cependant que ces deux unités ne représentent pas toutes les inclusions graphiques. Donc si vous, par exemple, si vous souhaitez travailler avec Gels, vous devez également appeler le fichier "graphics/gels.h" comme fichier d'inclusion.

Intuition

Les fichiers d'inclusion suivants se trouvent dans la partie interface de l'unité «Intuition» :

intuition/intuition.h
intuition/screens.h
intuition.lib

Les unités «Exec1» et «Graphtypes» sont également utilisées. Le contenu des fichiers «intuitionbase.h» et «intuition/preference.h» ne fait donc pas partie de l'unité Intuition. La bibliothèque d'intuition est ouverte dans la partie initialisation de l'unité.

Custom

L'unité "Custom" correspond au fichier d'inclusion "hardware/custom.h" et définit ainsi la structure des registres des puces personnalisées. L'unité exporte également une variable :

  1. Var
  2.  cc:Custom ABSOLUTE $DFF000;

Cela permet d'adresser les registres de la puce directement via cette variable. Un exemple extrêmement imaginatif (mais au moins court) :

  1. Uses Custom;
  2.  
  3. Var 
  4.  I:Integer;
  5. BEGIN
  6.  For I:=0 to MaxInt do cc.Color[0]:=I;
  7. END.

Ce petit programme change constamment la couleur d'arrière-plan pendant un certain temps.

ExecSupport et ExecIO

Entre la programmation directe du matériel et l'accès à celui-ci via des bibliothèques, il existe un autre niveau dans Amiga, des périphériques pour programmer l'imprimante ou les unités de disquettes : Les Périphériques.

Il s'agit principalement de tâches s'exécutant en permanence (mais sont bien entendu à l'état d'attente lorsqu'elles n'ont rien à faire et ne consomment donc aucun temps de calcul). D'autres tâches peuvent donner des ordres aux périphériques via des messages, étant ensuite - si possible - exécutés par le périphérique concerné.

Un périphérique est directement pris en charge par KICK-PASCAL : le périphérique console s'occupant de la saisie et de la sortie de texte sous les fenêtres. Le système d'exploitation Amiga comprend également les périphériques suivants en standard :

Pourquoi je vous dis tout cela ? Eh bien, le système d'exploitation Amiga "manque" de certaines routines rendant principalement les périphériques de programmation plus pratiques, à savoir les fonctions de support Exec. Ils sont inclus dans le "AMIGA ROM Kernel Reference Manual: Exec" en tant que texte source - mais, comme prévu, en "C". Ces fonctions - outre "CreateTask" - sont à votre disposition en tant qu'utilisateur de KICK-PASCAL sous la forme d'une unité : elle s'appelle "ExecSupport".

Il existe également une unité appelée «ExecIO» contenant tout ce dont vous avez besoin pour la programmation du périphérique.

Mais d'abord à «ExecSupport». Les procédures et fonctions suivantes sont implémentées ici :

Procedure NewList(list:p_List);

Initialise la structure de liste pointée par le paramètre.

Function CreatePort(name:String;pri:Byte):p_MsgPort;

Crée un port de message avec le nom et la priorité spécifiés par "pri" et renvoie un pointeur vers celui-ci. Petite particularité, Unit ExecSupport mémorise les ports créés par cette fonction et les supprime automatiquement à la fin du programme (à l'aide d'un ExitServer correspondant), si cela ne s'est pas déjà produit.

Procedure DeletePort(port:p_MsgPort);

Un port de message créé avec "CreatePort" est supprimé. Comme déjà indiqué ci-dessus, cette procédure ne doit pratiquement jamais être utilisée directement dans votre programme, puisque tous les ports de messages créés sont automatiquement supprimés à la fin du programme.

Function CreateStdIO(ioReplyPort:p_MsgPort):Ptr;

Cette fonction crée une structure de requête d'entrée/sortie standard et renvoie un pointeur vers celle-ci. Un pointeur vers un port de message est requis comme paramètre, par exemple elle peut avoir été créé précédemment avec «CreatePort». Si la structure n'a pas pu être configurée, la fonction se termine avec un message d'erreur. Comme pour "CreatePort", toutes les structures d'entrée/sortie configurées sont automatiquement libérées à la fin du programme si cela n'a pas déjà été fait.

Procedure DeleteStdIO(ioStdReq:Ptr);

En contrepartie de "CreateStdIO", cette procédure supprime une structure de requête d'entrée/sortie "normale". Cependant, ces structures sont automatiquement supprimées à la fin du programme, vous utiliserez donc rarement directement "DeleteStdIO".

Function CreateExtIO(ioReplyPort:p_MsgPort;Size:Long):Ptr;

Certains périphériques nécessitent une structure de demande d'entrée/sortie étendue pour inclure certaines entrées spécifiques au périphérique. Avec la fonction "CreateExtIO", vous pouvez créer de telles structures de n'importe quelle taille (le paramètre "size" correspond à la taille totale en octets) de manière analogue à "CreateStdIO". Les champs supplémentaires sont initialisés avec des zéros.

Cette fonction se termine également avec un message d'erreur en cas d'échec et mémorise en interne les structures ayant été configurées afin qu'elles soient automatiquement supprimées à la fin du programme.

Procedure DeleteExtIO(ioExt:Ptr);

Cette procédure supprime une structure créée avec "CreateExtIO".

Procedure BeginIO(ioReq:Ptr);

L'appel de cette procédure correspond à une entrée dans une fonction interne dont dispose chaque périphérique et démarre généralement une opération d'entrée/sortie. "BeginIO" est très similaire à la fonction Exec "SendIO", mais "BeginIO" est plus directe, c'est-à-dire sans "superstructure" Exec supplémentaire. En général, vous devez utiliser "SendIO", tandis que "BeginIO" ne peut être utilisé que dans certains cas particuliers.

D'ailleurs, l'unité «ExecSupport» utilise l'unité «Exec1».

Comme déjà mentionné, il existe une autre unité appelée «ExecIO». Il utilise les unités «Exec1» et «ExecSupport» et contient les fichiers d'inclusions suivants nécessaires à la programmation du périphérique dans la partie interface :

'exec/libraries.h'
'exec/devices.h'
'exec/io.h'

Il exporte également deux procédures :

Procedure Open_Device(DevName:Str;Unit:Long;IOReq:Ptr;Flags:Long);

Cette procédure est la même que la fonction OpenDevice Exec, à deux différences près :

Procedure Close_Device(ioRequest:Ptr);

Elle diffère de la procédure Exec "CloseDevice" uniquement en ce que la liste générée par "Open_Device" permet de vérifier si le périphérique a bien été ouvert et que cette procédure peut être exécutée car tous les périphériques sont fermés automatiquement à la fin du programme.

L'units Menus

L'unité "Menus", écrite en PASCAL, permet de gérer facilement les menus déroulants. Il utilise l'unité "Crt" et ne se soucie que des menus de la fenêtre de sortie Crt.

Il se trouve dans le sous-répertoire «Windows», il doit donc être appelé avec :

  1. FROM Windows USES Menus;

Les procédures et fonctions suivantes sont fournies :

Procedure ClearMenu;

Une barre de menus déjà créée est complètement supprimée. D'ailleurs, le serveur de sortie d'une unité garantit que cette fonction est appelée à la fin du programme.

Procedure AddMenu(x:Integer;Name:str;Enable:Boolean);

x : Position horizontale du menu.

Name : Titre du menu.

Enable : indique si le menu doit être sélectionnable.


Un nouveau menu sera ajouté à la barre de menu. Le menu créé en premier porte le numéro 0, le second le numéro 1,...

Procedure AddItem(y:Integer;Flag:Word;Name:Str;Com:Char);

y : Position verticale de l'élément de menu (en pixels).

Flag : Drapeaux de menu (voir ci-dessous).

Name : Titre du menu

Com : caractère clavier équivalent à l'élément de menu.

Après avoir créé un menu avec "AddMenu", vous pouvez ajouter les différents éléments de menu en utilisant plusieurs fois "AddItem". "y" est la position verticale (les éléments de menu sont toujours les uns sous les autres), "Name" est la chaîne de caractères de texte et avec "Com", vous pouvez ajouter un raccourci clavier à cet élément de menu si un espace ou chr(0) est spécifié. Ici, il n'y a pas d'équivalent clavier.

Le paramètre "Flag" peut être utilisé pour spécifier certaines propriétés spéciales du menu. Un «0» correspond à un élément de menu normal, et quatre autres valeurs possibles sont définies comme paramètres dans la partie interface du périphérique :

Définition Description
CheckOff=$001; Le menu est marqué d'une coche lorsqu'il est sélectionné. Il n'est pas activé initialement.
CheckOn=$101; Comme "CheckOff", mais la coche est active dès le début.
ToggleOff=$009; Chaque fois que vous sélectionnez l'élément de menu, la coche change. Initialement, l'élément de menu ne doit pas être sélectionné.
ToggleOn=$109; Comme "ToggleOff", mais l'élément de menu est initialement coché.

Procedure AddSubItem(y:Integer;Flag:Word;Name:Str;Com:Char);

y : position verticale de l'élément de sous-menu (en pixels).

Flag : drapeaux de menu (voir ci-dessous).

Name : Titre du sous-menu

Com : caractère de clavier équivalent à l'élément de sous-menu.

Cette procédure est exactement la même que "AddItem", mais elle ajoute un élément de sous-menu au dernier élément de menu créé avec "AddItem".

Procedure MutualExclude(exc:LongInt);

exc : masque de bits

Une «exclusion mutuelle» est définie pour le dernier élément de menu ou sous-menu créé avec «AddItem» ou «AddSubItem». Il s'agit d'un masque de bits désactivant automatiquement les éléments de menu cochés. Le paramètre est un masque de bits dans lequel sont définis les bits pour lesquels l'élément de menu correspondant doit être désactivé lorsque le dernier élément de menu créé est sélectionné.

Procedure MenuOff;

Les éléments de menu marqués d'une coche entraînent la désactivation automatique de l'élément de menu. Le paramètre est un masque de bits dans lequel les bits sont mis à 1 si l'élément de menu correspondant doit être désactivé lors de la sélection du dernier élément de menu créé.

Procedure MenuOn;

Une barre de menu ayant été désactivée avec «MenuOff» sera à nouveau activée.

Function MenuPicked:Boolean;

Cette fonction devient «true» lorsqu'un élément de menu a été sélectionné par l'utilisateur.

Function PickedItem:Integer;

Analogue à «PickedMenu», «PickedItem» fournit le numéro de l'élément de menu.

Function PickedSubItem:Integer;

Comme "PickedItem", "PickedSubItem" renvoie le numéro de l'élément de sous-menu éventuellement sélectionné. ou la valeur -1 si aucun élément de sous-menu n'a été sélectionné (par exemple si l'élément de menu sélectionné n'a aucun sous-menu).

Procedure NextPicked;

Avec le bouton gauche de la souris, vous pouvez sélectionner plusieurs éléments de menu en même temps. Intuition ne fournit alors qu'un message et il faut essentiellement parcourir une liste de menus sélectionnés. La procédure «NextPicked» est utilisée à cet effet : vous pouvez ainsi indiquer au périphérique que vous avez évalué un seul événement de menu et que vous souhaitez traiter le suivant. Après avoir appelé "NextItem", vous pouvez utiliser "MenuPicked" pour demander si un autre menu a été sélectionné.

Exemple d'évaluation de menu :

  1. WaitForKey;
  2. If MenuPicked Then Begin
  3.  Case PickedMenu of
  4.   { Évaluer les menus }
  5.  End
  6. End;

Avec ce fragment de programme, vous ne voyez que le premier élément de menu dans plusieurs sélections. Il est donc plus correct de faire ceci :

  1. WaitForKey;
  2. While MenuPicked do Begin
  3.  Case PickedMenu of
  4.   { Évaluer les menus }
  5.  End;
  6.  NextPicked
  7. End;

Function MenuChecked(Menu,Item,SubItem:Integer):Boolean;

Menu : numéro de menu

Item : numéro de l'élément de menu

SubItem : numéro du sous-élément de menu ou -1

Avec cette fonction, vous pouvez demander si la coche est cochée pour un élément de menu.

Function RightButtonPressed:Boolean;

La fonction indique si le bouton droit de la souris a été enfoncé sans qu'un élément de menu soit sélectionné.

Function MouseClicked:Boolean;

Cette fonction renvoie "true" si le bouton gauche de la souris a été cliqué dans la fenêtre de sortie.

Function IntuiMessageReceived:Boolean;

Est "true" si un message d'intuition est arrivé dans la fenêtre Crt. Il peut s'agir d'un message concernant la fermeture de la fenêtre, la sélection d'un menu, le clic de souris,..., en fonction des drapeaux IDCMP que vous avez définis.

Function MouseX:Integer;

Chaque fois qu'un IntuiMessage a été reçu, vous pouvez utiliser cette fonction pour interroger la coordonnée X de la position de la souris, par exemple après que "MouseClicked" soit rempli.

Function MouseY:Integer;

Comme "MouseX", cette fonction renvoie la coordonnée Y correspondante.

Sur votre disque source KICK-PASCAL vous trouverez un exemple de programme utilisant la plupart des fonctions des unités "Menus".



Dernière mise à jour : Mercredi, le 17 juillet 2024