' ***********************************************
' * BARE BACK                                   *
' * Comment créer un vrai menu d'exécutables    *
' * lançable directement depuis le WorkBench ®  *
' *---------------------------------------------*
' * Ajouter les fonctions Wait() & GetMessage() *
' * pour une meilleure convivialité             *
' *                                             *
' * CODE GFA   4.0  Pierre Philippe Launay      *
' * RECHERCHE  Cathy Lardy                      *
' * COPYRIGHT  © Mai 1992 ANNABELLA 10          *
' ***********************************************
main                             ! Une seule commande
PROCEDURE main                   ! Plan du codage
  configuration                  ! Amigados ou WorkBench
  ecran                          ! Ouverture d' une mini fenêtre
  chargeur                       ! Mise en place du menu
  DO                             ! Boucle sans fin DO...LOOP
    ON MESSAGE GOSUB menu        ! Evènement IDCMP page 181
    ON MENU GOSUB menu           ! Evènement souris page 167
    ON MENU                      ! Recherche de l'évènement
  LOOP                           ! Revient sur DO
RETURN
PROCEDURE configuration          ! Sous AmigaDOS CLI la syntaxe est
  menu$=_dosCmd$                 ! ArtioDactyl_BenchMenu MENU.ASCII
  IF menu$=""                    ! MENU.ASCII est omis : oubli ou bien WB
    FILESELECT "Artiodactyl Bench Menu"," Menu ",DIR$(0),menu$
  ELSE                           ! Sinon on ne part pas du CLI
    IF NOT EXIST(menu$)          ! Erreur dans le nom du fichier de menu
      FILESELECT "Artiodactyl Bench Menu"," Menu ",DIR$(0),menu$
    ENDIF                        ! Fin du test des Erreur de Saisie
  ENDIF                          ! Fin du test IF...ELSE...ENDIF
  IF menu$<>""                   ! Si le nom du fichier est écrit
    IF NOT EXIST(menu$)          ! Mais que ce nom n' existe pas
      fin                        ! haha
    ENDIF                        !
  ELSE                           ! Sinon, l'absence de nom signale
    fin                          ! une grosse erreur de l'Amiga???
  ENDIF                          ! Ou une volonté de l'utilisateur
RETURN                           ! Alors on arrête tout
PROCEDURE ecran                  ! Ouvre une structure console
  OPENS 0                        ! Activation écran WorkBench
  SETWPEN 1,2                    ! Colorisation du titre
  OPENW #0,515,0,70,10,&H200,&H100A  titre$="In AmigaNews by Pierre Philippe Launay 06 1992"
  TITLEW #0,"ABM"+SPACE$(3),titre$
RETURN
PROCEDURE chargeur               ! Mise en place du menu
  OPTION BASE 1                  ! On commence le décompte à partir de 1
  OPEN "I",#0,menu$              ! Ouvre le fichier d'environnement menu
  texte$=INPUT$(LOF(#0),#0)
  FOR return%=1 TO LEN(texte$)
    IF MID$(texte$,return%,1)=CHR$(10) ! Ce code ascii est un saut de ligne
      INC entree%                ! Décompte des nombres de Return
    ENDIF                        ! pour connaître le nombre d' entrée
  NEXT return%                   ! Y a t'il encore du répondant
  CLR texte$                     ! Plus propre
  SEEK #0,0                      ! Repositionnement de la tête de lecture
  DIM menu$(entree%+5),cle$(entree%+5)
  RECALL #0,menu$(),entree%,entree%
  CLOSE #0                       ! Fermeture du canal ouvert avec OPEN
  FOR menu%=1 TO entree%         ! Lecture des raccourcis clavier
    virgule%=INSTR(menu$(menu%),",")
    IF virgule%                  ! virgule signifie ici un raccourci
      cle$(menu%)=RIGHT$(menu$(menu%),1)
      menu$(menu%)=LEFT$(menu$(menu%),PRED(virgule%))+SPACE$(5)
    ENDIF                        ! Cle$() pour les raccourcis
  NEXT menu%                     ! Revient à FOR si menu% inférieur à entree%
  menu$(ADD(entree%,2))="Système"
  menu$(ADD(entree%,3))="Quitter"+SPACE$(4)
  MENU menu$()                   ! Activation du menu
  MENU KEY ADD(entree%,2),ASC("Q")
  FOR menu%=1 TO entree%         ! Boucle pour menu%=1 jusqu' à entree%
    IF cle$(menu%)<>""           ! S' il y a un raccourci clavier
      MENU KEY PRED(menu%),ASC(cle$(menu%))
    ENDIF                        ! Fin du test IF...ENDIF
  NEXT menu%                     ! Reva sur FOR si menu% inférieur à entree%
  maxi%=ADD(entree%,2)           ! Menu Quitter
  DEC entree%                    ! Entree% est diminuée de 1
RETURN
PROCEDURE menu                   ! To spill the beans
  IF MENU(1)=&H200               ! Si clic sur le Gadget fermeture
    fin                          ! Ho no! Wie ? Sie waren krank ?
  ELSE                           ! Sinon tout va bien
    SELECT MENU(0)               ! Sélection de l'entrée
    CASE 1 TO entree%            ! AmigaDOS en action
      entree$=TRIM$(menu$(SUCC(MENU(0))))
      IF INSTR(entree$,"!")      ! Est-ce un sous-menu ?
        entree$=RIGHT$(entree$,PRED(LEN(entree$)))
      ENDIF                      ! Fin du test Sous-menu
      resultat%=@exec("Run >Nil: <Nil: "+entree$)
    CASE maxi%                   ! Quitter
      fin                        ! Rehono!
    ENDSELECT                    ! Fin des sélections possibles
  ENDIF
RETURN
PROCEDURE fin                    ! Libération du système
  CLOSEW #0                      ! Fermeture de la fenêtre
  END                            ! END Obligatoire sous WB 2.0
RETURN
FUNCTION exec(commande$)         ! Appuyez sur Help pour plier
  nul$="NIL:"+CHR$(0)            ! Nulle part
  handle%=Open(V:nul$,1004)      ! Ouverture en lecture-écriture
  IF handle%                     ! Si Nulle part existe...
    commande$=commande$+CHR$(0)  ! Transmission à l' AmigaDOS
    exec%=Execute(V:commande$,handle%,handle%)
    close%=Close(handle%)        ! Fermeture du canal
  ENDIF                          ! Remarque : créer une fonction
  RETURN (exec%)                 ! est ici une erreur car...
ENDFUNC


Les erreurs à éviter quelque soit le langage utilisé :
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Il ne faut pas utiliser la fonction SetTaskPri car elle va ralentir soit
  votre codage soit les autres. Préférez lui une attente d'évènements du
  style "hé BareBack, je te parle ici présentement". Ainsi, soit on a activé
  la fenêtre de BareBack et dans ce cas on continu le déroulement de
  BareBack, soit la fenêtre n'est pas activée et dans ce cas, on n'attend
  pas le codage de BareBack. Cette facilité se fait tout simplement avec les
  fonctions Wait() et GetMessage().
- Il ne faut pas utiliser un type de variables autres que les entiers longs.
  L'utilisation de variable de type Réel (pas de suffixe), Octet (suffixe |),
  Mot (suffixe &) va amener un plantage à la compilation ou sous les cartes
  accélératrice.
- Si vous utilisez OPTION BASE et OPTION MAT, il faudra répéter ces
  commandes avant chaque ligne de déclaration de tableau ou de matrice.
- Préferez les titres de fenêtre avec un titre fenêtre et un titre écran
  (TITLEW #1,fenetre$,ecran$). TITLEW utilise en effet la fonction système
  SetWindowTitle() qui plante souvent quand le titre écran est nul.
- N'imposez pas la commande RUN dans la procédure exec.
- Préferez la commande système Execute au lieu de la commande GFA EXEC qui
  utilise la fonction système mais avec des restrictions intollérables.
- Ne pas oublier de fermer la fenêtre quand vous quittez le codage
  BareBack sinon cela provoque un gourou sur les A500+ et parfois sur les
  A600.

Exercice DEBUTANT :
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Décrivez ce que fait la ligne :
  OPENW #0,515,0,70,10,&H200,&H100A,
  titre$="In AmigaNews by Pierre Philippe Launay 06 1992"
- Pourquoi faut-il préférer les idcmp et les flags en base hexadécimale ?
- Pourquoi ajoutter CHR$(0)  à de nombreux endroit du codage (voir une
  précédante Annabella) ?
- Pourquoi ne ferme-t'on pas l'écran 0 en partant ? (essayez !)

Exercice INITIÉ :
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Pourquoi faut-il utiliser ici la commande :
  RECALL #0,menu$(),entree%,entree%
- A quoi sert la première partie de la procédure chargeur ?

Exercice GFA PRO à réaliser :
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
- Ce codage utilise 10 octets de façon impromptu. Il écrit sur 10 octets
  non réservés. C'est un bug de la commande OPEN. Réalisez une version de
  ce codage en utilisant les fonction Open() et Close() qui ne provoque pas
  ce bug.
- SETWPEN ne fonctionne pas sous WorkBench 2.x. Remplacez cette commande
  comme il est indiqué sur une présente Annabella.

Pierre Philippe Launay
