Suivez-nous sur X
|
|
|
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
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
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
|
|