Obligement - L'Amiga au maximum

Mardi 21 novembre 2017 - 16:49  

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 : Blitz Basic - gestionnaire d'adresse
(Article écrit par Mathieu Chènebit et extrait d'Amiga News - novembre 1996)


Tout d'abord, je vous prie de bien vouloir m'excuser. En effet, nous ne pourrons pas programmer une interface graphique pour Lha du simple fait que certaines commandes dont je me suis servi lors de la création de ce programme sont dans des bibliothèques additionnelles non fournies en standard avec le Blitz Basic. Nous allons donc nous attaquer à la création d'un (petit) gestionnaire d'adresses, programme qui peut s'avérer fort utile.

Pourquoi un gestionnaire d'adresses ?

Tout simplement, parce que par le biais de ce petit programme, nous allons pouvoir étudier les gadgets gadtools du mois dernier sur un exemple concret, et de plus nous allons voir (très sommairement) l'accès séquentiel à un fichier ASCII. Tout d'abord, un peu de théorie.

Nos adresses seront donc contenues dans un fichier ASCII séparé, que nous placerons dans le tiroir S: de votre partition système par exemple (l'emplacement est à votre guise). Nous allons créer plusieurs champs de données (nom, adresse, numéro de téléphone...) qui seront séparés le plus simplement du monde par un caractère retour chariot (touche entrée). Nous aurions pu mettre toutes les données relatives à une personne sur une même ligne, mais séparés par un caractère "|" par exemple, mais je pense finalement que tout cela est bien se donner de la peine pour pas grand-chose. Réfléchissons maintenant ce à quoi va ressembler notre interface graphique : je propose qu'on mette un (superbe ;-) ListView à gauche contenant les noms des personnes, et, à droite, les différents gadgets dans lesquels on placera les informations relatives à ces personnes (des GTString pour que l'on puisse les modifier): nom, adresse, numéro de téléphone, adresse électronique.

Tout d'abord, nous allons créer une table du type .liste (donc définie grâce à un NewType) qui contiendra dans des champs différents toutes les informations relatives à une même personne, et une table liste qui contiendra la position dans le ListView et le texte (dans notre cas, ce sera le nom) qui y figurera.

Pour accéder à notre fichier ASCII, il faut déjà l'ouvrir en lecture avec une commande spécifique "ReadFile". Si cette fonction retourne 0, alors on s'arrête, ca ne sert à rien d'aller plus loin (notez que si vous voulez améliorer le programme, vous n'aurez qu'à mettre un requester si Address Manager ne peut accéder à la base de données, ou bien encore, mettre le chemin d'accès à votre fichier ASCII dans les types d'outil, ce qui le rendra paramétrable).

On entre ensuite dans une boucle très importante : c'est en effet elle qui va capturer les informations contenues dans le fichier ASCII et les copier dans votre table MaListe. La fonction Edit$ s'arrête en effet lorsque qu'elle arrive au nombre de caractères maximum indiqué ou lorsqu'elle trouve un code de retour chariot. On répète cette boucle jusqu'à ce qu'on arrive à la fin du fichier. Ensuite, on ouvre notre fenêtre et on crée nos gadgets avec les instructions gadtools appropriées comme nous avons vu le mois dernier.

On entre enfin dans notre boucle de gestion des événements. Si le gadget 5 est enfoncé ("Quitter"), alors on déclenche le code de rupture de la boucle. Si c'est le bouton 6 (le ListView), on assigne à une variable le code du champ (comprenez le nom de la personne) du ListView ayant provoqué ce code et on initialise nos quatre GTString à l'aide de notre table MaListe.

Enfin, et pour terminer, on passe au plus dur (si on peut dire) : la sauvegarde de notre fichier (ce qui n'est guère qu'à des fins d'exemples, puisque je vous rappelle que nous ne pouvons ni rajouter, ni supprimer des entrées) ASCII.

Pour commencer, on saisit les gadgets dernièrement modifiés (dans un vrai programme - lisez fonctionnel - il faudrait le faire à chaque fois qu'une action est commise), et on remet à jour notre ListView. Pour cela, on fait un GTChangeList, on se place à la première case de notre table liste, on passe toutes les entrées jusqu'à celle qui nous intéresse ("e"). Là, on l'initialise avec le contenu de notre gadget 1 et on se place à la dernière case (indispensable si vous ajoutez un bouton "Ajouter" par exemple).

Ensuite, on ouvre de nouveau notre fichier, mais en écriture. Puis on fait un NPrint (lequel aura été préalablement redirigé sur notre fichier avec FileOutput) pour chaque champ de chaque personne. Pour finir, on referme notre fichier et on redirige les Entrées/Sorties vers leur position initiale. Voilà, c'est tout pour cette fois. Bonne programmation !

WBStartup:NoCli
WbToScreen 0

NEWTYPE .liste  
                        ; NewType concernant les champs
                        ; relatifs à une même personne:  
                        ; adresse, numéro de téléphone,
                        ; adresse EMail ...
    nom$
    adresse.s   ; "s" et "$" signifient la même chose: 
                        ; variable de type chaîne de caractères
    tel.l
    mail.s
End NEWTYPE

NEWTYPE .liste2     
                        ; NewType pour le table liste 
                        ; de notre ListView
    pos.w
    nom2$
End NEWTYPE

Dim MaListe.liste(100)      
                        ; 101 personnes maxi (mettez 1000
                        ; si vous avez un carnet d'adresse
                        ; particulièrement bien fourni :-)
Dim List MaListe2.liste2(100)

succes=ReadFile(0,"S:annuaire")  
                        ; Si le fichier existe et qu'il peut être 
                        ; ouvert, succes retournera -1
If succes=0 Then End

FileInput 0     ; Pour lire l'information contenue 
                        ; par ce fichier ...

Repeat              ; on rentre dans la boucle dite
                        ; de "saisie"
    a$=Edit$(120) 
                        ; on prend une chaîne de caractère
                        ; pour chaque champ d'une personne
    b$=Edit$(120)
    t$=Edit$(80)
    m$=Edit$(120)
    MaListe(n)\nom=a$,b$,Val(t$),m$  
                        ; on les copie à leur emplacement 
                        ; respectif dans la table MaListe ...
    If AddItem(MaListe2())  
                        ; et on les ajoute à la table liste pour
                        ; qu'ils figurent dans le ListView
        MaListe2()\pos=n,a$
    EndIf
    n+1
Until Eof(0)    ; jusqu'à ce qu'on arrive à la fin 
                        ; du fichier
CloseFile 0     ; on referme notre fichier
n-1                     ; "n" a une entrée de trop (dernier 
                        ; passage dans la boucle)
compteur=n

; on passe maintenant à la construction de notre 
; interface graphique (GUI)

FindScreen 0
Window 0,0,0,450,150,$140E,"Address Manager",1,2  ; une belle fenêtre ...

GTString 0,1,280,-10,150,12,"Nom :",$1,150
GTString 0,2,280,10,150,12,"Adresse :",$1,150
GTInteger 0,3,280,30,150,12,"Telephone :",$1,0
GTButton 0,4,40,100,100,14,"Sauver",$10
GTButton 0,5,280,100,100,14,"Quitter",$10
GTListView 0,6,0,-10,180,100,"",0,MaListe2()  
                            ; le ListView avec sa table liste
GTString 0,7,280,50,150,12,"EMail :",$1,150
AttachGTList 0,0        ; A laquelle on rattache une  
                                        ; belle liste gadtools
; boucle de gestion des évènements

Repeat
ev.l=WaitEvent
    If ev=$40                   ; gadget relâché
        If GadgetHit=6          ; notre ListView
            e=EventCode     ; "e" est le numéro de l'élément 
                                        ; du ListView ayant provoqué 
                                        ; le code $40 
            GTSetString 0,1,MaListe(e)\nom  
                                        ; on initialise nos 4 gadgets à
                                        ; partir de notre table MaListe
            GTSetString 0,2,MaListe(e)\adresse
            GTSetInteger 0,3,MaListe(e)\tel
            GTSetString 0,7,MaListe(e)\mail
        EndIf
        If GadgetHit=5          ; on se casse 
            ev=$200
        EndIf
        If GadgetHit=4              ; bouton "sauver"
            MaListe(e)\nom=GTGetString(0,1)  
                            ; tout d'abord, on saisit les champs 
                            ; suceptibles d'avoir été modifiés
            MaListe(e)\adresse=GTGetString(0,2)  
                            ; dans leur gadgets respectifs
            MaListe(e)\tel=GTGetInteger(0,3)
            MaListe(e)\mail=GTGetString(0,7)
            GTChangeList 0,6  
                            ; on change la liste pour 
                            ; remettre à jour le ListView
            ResetList MaListe2()
            For var=0 To e
                Ok=NextItem(MaListe2())
            Next
            MaListe2()\pos=e,GTGetString(0,1)
            LastItem MaListe2()
            GTChangeList 0,6,MaListe2()
            succes=WriteFile(0,"S:annuaire")  
                            ; on réouvre notre fichier, 
                            ; mais en écriture cette fois-ci
            If succes=0 Then End
            FileOutput 0  ; commande de redirection 
                            ; des commandes qui "écrivent" 
                            ; quelque chose (Print, NPrint ...)
            m=0
            Repeat      ; on recommence une boucle dans 
                            ; laquelle on place depuis le début 
                            ; nos adresses et autres 
                NPrint MaListe(m)\nom
                NPrint MaListe(m)\adresse
                NPrint MaListe(m)\tel
                NPrint MaListe(m)\mail
                m+1
            Until compteur=m-1
            CloseFile 0
            DefaultOutput
        EndIf
    EndIf
Until ev=$200

Free Window 0   ; on nettoie tout et on s'en va
Free GTList 0
Forbid_
End


[Retour en haut] / [Retour aux articles]