Programmation Basic VB PDF
Programmation Basic VB PDF
Cours
Rédaction
Jean-Yves Février
Coordination pédagogique
Christine Guillebault
Direction pédagogique
Bruno Viale
Directeur de publication
Jean-Luc Faure
Impression
Cned
Institut de Poitiers-Futuroscope
Ces cours sont strictement réservés à l’usage privé de leurs destinataires et ne sont pas destinés à une utilisation collective. Les personnes qui s’en
serviraient à d’autres usages, qui en feraient une reproduction intégrale ou partielle, une traduction, sans le consentement du Centre national
d’enseignement à distance s’exposeraient aux poursuites judiciaires et aux sanctions pénales prévues par la loi n° 92-597 du 1er juillet 1992.
Pour tout document publié sans contact pris avec les éditeurs ou ayants droit, leurs droits sont réservés au Centre national d’enseignement à
distance, institut de Poitiers-Futuroscope. Document protégé par les dispositions du Code de la propriété intellectuelle.
Séquence 1
Introduction
1. Objet de ce cours et pré-requis
Si vous lisez ces lignes, c’est que vous vous êtes inscrit auprès du CNED pour apprendre à
programmer dans le langage Visual Basic (VB).
La programmation est une discipline informatique permettant d’écrire des programmes qui
s’exécuteront sur des ordinateurs. Ces programmes ont pour objet l’automatisation des tâches
lourdes et répétitives qui, sinon, seraient faites à la main. Cela va de la facturation à la gestion
des stocks en passant par le suivi d’un cheptel ou autre. Je pourrais même parler de jeux et de
sites internet, mais ces thèmes sont hors sujet : nous nous limiterons à l’informatique orientée
vers des thèmes de gestion.
Il y a deux niveaux de maîtrise de la programmation :
– les bases sont constituées de l’apprentissage de l’algorithmique. Cela vous permet de
comprendre la logique des programmes et de pouvoir les écrire de façon théorique ;
– il faut ensuite passer de l’algorithmique à la programmation concrète. Cette étape est
beaucoup plus simple que la précédente car elle consiste uniquement en une phase de
traduction de votre algorithme dans un langage de programmation réel, tel le C, VB,
Delphi…
Le cours que vous avez entre les mains correspond au second niveau. Vous devez donc
connaître l’algorithmique pour en tirer partie.
Attention, l’objet du cours n’est pas de faire de vous des développeurs professionnels. Pour
cela, il faudrait suivre une formation d’informatique. Mon objectif est ici de former des gens
motivés qui souhaitent apprendre à écrire correctement des programmes pour leur propre
compte.
1
Par exemple l’interface Windows, apparue avec Windows 95 sorti en 1995. Attention, Windows n’est pas le seul, il existe aussi les
systèmes Unix également dotés d’une interface graphique et d’autres systèmes encore.
3984 TG 3
Séquence 1 Introduction
L’objet des langages de programmation est d’écrire des programmes. Il est évident que
l’interface du programme (ce que l’on voit à l’écran) doit être conforme aux standards du
moment. Un développement réalisé maintenant sans exploiter l’interface graphique qui
apporte un confort formidable à l’utilisateur, cela n’a aucun sens.
Les langages de programmation se doivent donc de permettre au développeur (à savoir vous)
d’exploiter les différents constituants de l’interface graphique du système d’exploitation ; cela
passe de la souris aux fenêtres en passant par les contrôles.
Comme ces constituants viennent du système d’exploitation et pas du langage, on les
retrouvera à l’identique dans tous les langages. Une zone de texte reste une zone de texte, que
ce soit avec Delphi, VB, Visual C, Visual J++…
Cela dit, la façon de manipuler ces différents constituants dépendra de la syntaxe et de la
philosophie du langage de programmation utilisé. Et c’est cela que nous étudierons avec VB.
Pour bien comprendre, je vous propose la métaphore suivante : toutes les voitures proposent
le concept de boîte de vitesses, mais sa mise en œuvre dépend du constructeur et du modèle :
la boîte peut être manuelle, automatique, sous la forme de boutons sur le volant…
Finalement, ce cours va aborder quatre choses :
– la traduction des instructions algorithmiques sous VB ;
– les concepts algorithmiques poussés (fichiers par exemple) que nous aborderons
directement sous VB, sans passer par la phase algorithmique qui n’apporterait pas
grand chose ;
– les spécificités de VB ;
– la façon de manipuler l’interface graphique sous VB. J’en profiterai pour vous
présenter les différents constituants de cette interface ;
– la présentation du meilleur ami du développeur, le débuggeur.
1
Ne vous inquiétez pas si ces concepts de zone de texte et de contrôles ne vous parlent pas. Nous les étudierons en détail dans la suite de
ce cours.
3984 TG 4
Séquence 1 Introduction
3 A. Organisation
Le fascicule de cours contient différentes choses :
− neuf séquences de cours correspondant aux différents savoirs à acquérir ;
− quarante-deux exercices intégrés aux séquences de cours. Vous devez faire ces
exercices quand vous arrivez dessus puis aller consulter la correction. Attention, ces
exercices permettent de vérifier votre assimilation du cours. Leur corrigé, très détaillé,
ne doit pas être négligé : j’y présente des situations, des techniques, des idées et des
raisonnements qui ne sont pas anecdotiques et font partie intégrante du cours. S’ils
n’y sont pas physiquement, c’est uniquement pour conserver une certaine lisibilité au
document ;
− trois séries d’exercices jouant le rôle de travaux dirigés. Elles sont placées à des
endroits stratégiques du cours ; vous devez évidemment les faire au moment où vous
arrivez dessus.
Les fascicules de correction comprennent :
− la correction des 42 exercices intégrés aux séquences ;
− la correction des séquences de TD.
En plus de vous donner la solution des exercices, j’ai essayé de détailler ces corrections pour
envisager les différentes solutions possibles, les erreurs à éviter… Plus que des corrections, ce
sont de véritables éléments de cours. Il ne faut donc pas les prendre à la légère !
3984 TG 5
Séquence 1 Introduction
3 B. Notations
Pour vous aider à identifier les différents constituants du cours, j’ai utilisé les représentations
suivantes :
– tout ce qui est précédé d’un caractère cœur (♥) doit être appris par cœur. Cela
correspond aux définitions ou explications qu’il est absolument nécessaire de
connaître pour s’en sortir en programmation. Quand je dis apprendre, ce n’est pas
retenir pour l’heure qui suit afin d’épater les convives au prochain repas. Il s’agit
d’une vraie leçon, dont vous devez vous souvenir tout au long de votre vie
d’informaticien ;
– les exercices intégrés dans les séquences et destinés à vérifier votre compréhension
sont numérotés et encadrés par un crayon (comme : Exercice 1). Il faut donc les
faire au fur et à mesure de la lecture du cours. Leur correction se trouve dans le
fascicule Correction des exercices.
4. Quelques conseils
Le seul conseil utile que je puisse vous donner est de garder à l’esprit la fable de La Fontaine
Le lièvre et la tortue : il ne sert à rien de travailler comme un fou ; travaillez plutôt dès
maintenant quelques heures par semaine ré-gu-li-è-re-ment (j’aurais pu écrire régulièrement
ou RÉGULIÈREMENT, mon but étant juste d’insister sur le mot).
La difficulté de l’enseignement par correspondance réside dans le fait que, par définition,
vous êtes seul face au cours, personne n’est là pour vous guider, insister sur l’essentiel ou
établir la progression du cours.
Pour vous aider à suivre un rythme correct, disons que chaque séquence correspond à un
travail d’environ 6 à 8 heures.
Attention à l’environ ! Vous avez sans doute le souvenir de vos études où, pour obtenir un
même résultat, certains travaillaient toute la soirée et d’autres se contentaient d’être présents
en cours. Il en est de même ici. Les 7 heures ne sont qu’un ordre de grandeur signifiant juste
que 15 minutes, ce n’est pas assez, mais 25 heures, c’est trop.
Retenez qu’il vaut mieux passer 10 heures sur une séquence et la comprendre parfaitement,
que faire exactement 420 minutes (7 heures) en passant à côté de l’essentiel.
De plus, le cours contient des dizaines de petits exercices à faire au fur et à mesure. Plus vous
passerez du temps dessus (et c’est conseillé), plus vous risquez de dépasser les 7 heures.
3984 TG 6
Séquence 2
Contenu
Les différentes phases dans l’écriture et l’exécution d’un programme
L’interface utilisateur de VB
Les commandes principales
Capacités attendues
Maîtriser les notions clés de source, exécutable et compilation
Savoir manipuler les commandes essentielles de VB
Utiliser l’aide
3984 TG 7
Séquence 2 À quoi sert le programme VB ?
1
Je ne souhaite pas vous faire un cours théorique d’architecture des ordinateurs. Je suis donc un peu imprécis,
car ce qui m’intéresse ici, ce n’est pas tant la façon dont les informations sont stockées que la conséquence,
pour nous, de ce mode de stockage.
2
Pourquoi précisément cette succession de 0 et de 1 et pas, par exemple 11001100 ? C’est hors sujet ici,
l’important, c’est que le codage fonctionne. Pour les curieux, je précise quand même qu’il s’agit d’un
3984 TG 8
Séquence 2 À quoi sert le programme VB ?
1 B 2. Les instructions
Un programme informatique possède deux composantes : d’une part, les informations, les
données qu’il manipule et, d’autre part, le programme lui-même, à savoir les différentes
instructions.
Nous venons d’étudier la façon dont les différentes informations manipulées par l’ordinateur
étaient stockées dans sa mémoire. Voyons maintenant comment les instructions sont stockées.
En fait, il n’y a pas de mystère : comme toute chose manipulée par l’ordinateur, les
instructions seront stockées sous la forme de 0 et de 1.
Voyons l’instruction algorithmique suivante :
si Nombre > 1
alors
Nom := "Teckels"
sinon
Nom := "Teckel"
fin-si
Comment coder cette instruction avec des 0 et des 1 ? Ce n’est pas possible, car cette
instruction est complexe. Attention, pas complexe dans le sens compliqué, mais complexe car
constituée de plusieurs éléments. En effet, l’instruction if présentée ci-dessus est écrite sur
cinq lignes. Cette instruction contient deux instructions :
– une affectation en ligne 2 ;
– une autre affectation en ligne 4.
changement de base. Nous comptons en base 10 et manipulons donc les chiffres de 0 à 9. La base 2 (appelée
base binaire) ne possède que les chiffres 0 et 1. Ainsi, les nombres 0, 1, 2, 3, 4, 5… en base 10 correspondent
respectivement aux nombres 0, 1, 10, 11, 100, 101… en base 2. Si vous continuez à compter comme cela,
vous vous rendrez compte que 73 en base 10, c’est 1001001 en base 2. Je rajoute un 0 devant ce nombre car
les bits sont manipulés par paquets de 8. Ce calcul mathématique, pas très facile pour nous, est très simple
pour l’ordinateur. Pour retrouver la valeur initiale, il suffit de faire l’opération inverse pour passer de la base
2 à la base 10.
1
Comment ai-je obtenu cette suite de 0 et de 1 ? C’est toujours hors programme ! En fait, tout caractère
manipulable par l’ordinateur (lettres, chiffres, ponctuations…) est associé à un nombre entier compris entre 0
et 255 appelé code ASCII. Pour convertir un caractère en une suite de 0 et de 1, on prend le code ASCII du
caractère et c’est ce code, exprimé en base 10, qui est converti comme précédemment en base 2.
Les codes ASCII des lettres T, e, c, k et l sont respectivement 84, 101, 99, 107 et 108. 84 en base 10, c’est
01010100, 101 en base 10 c’est 01100101 en base 2… d’où les 0 et 1 donnés ci-dessus.
Pour retrouver le texte initial, on prend les bits par paquets de 8, on converti chaque paquet en base 10 et on
cherche la lettre ayant ce nombre comme code ASCII.
2
Là, je ne vous expliquerai pas comment j’ai fait. Je peux juste vous avouer que j’ai eu du mal et que j’ai
employé le mode de représentation du type real dans le langage Turbo pascal version 7 datant de 1992. Il y a
peu de chances que ce format qui est employé dans VB 6 !
3984 TG 9
Séquence 2 À quoi sert le programme VB ?
Cette notion d’instruction en contenant d’autres n’est pas neuve : on la retrouve dans le test
(si) et les boucles (pour, répéter et tant que).
Une instruction complexe ne peut pas être comprise directement par l’ordinateur. Impossible
donc de la traduire directement en 0 et 1 sans l’étape préalable de compilation.
1
Je suppose évidemment que les mots crayon, manteau, enfiler… sont connus.
3984 TG 10
Séquence 2 À quoi sert le programme VB ?
1 D. La phase de compilation
C’est là tout l’enjeu des langages de programmation et de leur évolution : les premiers
langages (assembleur par exemple) étaient très proches de l’ordinateur, mais pas du
développeur. Ce langage était simpliste mais pas agréable à utiliser.
Ensuite, les langages plus évolués, dits procéduraux (le C, le Pascal…) ont vu le jour. Ils
s’adressent exclusivement aux développeurs et apportent de l’abstraction qui permet d’écrire
des programmes proches du raisonnement intellectuel.
C’est pour cette raison que le monde des langages de programmation est en perpétuelle
évolution : les chercheurs tentent perpétuellement d’améliorer la qualité des langages pour
qu’ils soient les plus proches possible de notre perception de la réalité. C’est dans cet ordre
d’esprit que les langages modernes (Delphi, C++, Java, un petit peu VB…) sont orientés
objet1.
Le problème, c’est que plus le langage de programmation est proche de nous, plus il est aisé à
utiliser pour nous, mais plus il s’éloigne du langage assembleur compris par l’ordinateur.
Pour passer de l’un à l’autre, à savoir du langage de développement au langage compris par le
processeur, on utilise un compilateur. Vous aurez compris que plus le langage de
développement s’améliore, plus le compilateur doit être sophistiqué pour combler le fossé qui
s’élargit entre le langage du développeur et le langage assembleur.
Voici un petit schéma récapitulant les choses :
programme dans programme en
le langage de assembleur
programmation compilateur
pouvant être
choisi exécuté
Le problème de notre vocabulaire actuel, c’est que l’on ne cesse de parler de programmes.
S’agit-il du résultat de la compilation ou du programme écrit par le développeur ?
Pour préciser les choses, nous allons introduire un peu de vocabulaire :
Le programme source (ou source2) est le programme écrit dans le langage de programmation
choisi par le développeur.
Lorsque le source est compilé, on obtient le programme exécutable (ou exécutable) qui est
directement compréhensible par le processeur.
Notre schéma précédent peut donc se réécrire ainsi :
source compilateur exécutable
1
Cette notion d’objet sous VB est hors sujet pour nous.
2
Ce sera le source (pour programme source) et non la source.
3984 TG 11
Séquence 2 À quoi sert le programme VB ?
1
Si nous nous plaçons dans le cadre automobile, un bug sera par exemple une voiture qui accélère quand vous
débrayez. Un bug, c’est donc plus précisément une erreur de conception. La technicité des algorithmes fait
que ce qui est impensable dans la majorité des domaines reste toléré, voire accepté en informatique. Cela dit,
moins il y a de bugs, mieux c’est !
3984 TG 12
Séquence 2 À quoi sert le programme VB ?
3. Interface VB
3 A. Vue d’ensemble
Tout au long de ce cours, nous allons étudier les différents éléments constituant VB, à savoir :
– les instructions VB, soit l’écriture du source ;
– comment exécuter le source tapé (et donc comment le compiler) ;
– comment débugguer le source s’il contient des erreurs.
Avant tout, lançons VB et découvrons l’affichage :
VB est lancé, mais vous avez en plein milieu de l’écran une fenêtre appelée Nouveau projet
qui vous propose des options pas forcément très claires.
Vous devrez demander à votre meilleur ami (le bouton Aide présent sur la fenêtre) pour avoir
des explications détaillées. Je vais juste vous dire l’essentiel, à savoir que cette fenêtre permet
de choisir le type d’application que vous voulez réaliser : une DLL, un programme
exécutable…
Vous pouvez (et je vous le conseille) cocher la case Ne plus afficher cette boîte de dialogue
pour que VB choisisse automatiquement EXE standard qui est le seul choix à faire.
Le jour où vous voudrez écrire une DLL, vous pourrez toujours le faire en passant par la boîte
de dialogue de la commande Fichier/Nouveau projet1.
Barre de menus, commandes permettant d’agir sur le source (le menu Projet permet
d’ajouter des éléments au source, Exécuter permet de l’exécuter…).
Navigation dans
le projet (feuilles
et modules).
La boîte à outils
contient tous les Fenêtre contenant la
contrôles regroupés feuille (vierge pour
par thèmes. Par le moment).
défaut, seuls les
contrôles généraux
(les plus fréquents) Propriétés du
sont affichés. contrôle sélectionné
(ici, la feuille).
1
Sous-entendu menu Fichier, commande Nouveau projet.
3984 TG 13
Séquence 2 À quoi sert le programme VB ?
1
Certaines versions de VB ne disposent pas de l’aide en ligne. Dans le cadre d’un développement personnel, il
est impensable de s’en passer.
3984 TG 14
Séquence 2 À quoi sert le programme VB ?
3 B 2. La barre de menus
Je vais vous présenter rapidement les différents menus.
Barre de menus
Fichier
Classique sous Windows, ce menu permet d’ouvrir, enregistrer, fermer ou imprimer des
projets mais aussi d’enregistrer ou d’imprimer des modules ou des feuilles.
Édition
Toujours aussi classique, permet d’annuler ou refaire une action, de faire du couper, copier et
coller, de chercher du texte… Les commandes de fin de ce menu permettent également
d’accéder à des outils d’aide à la frappe du source.
Affichage
Classique… vous permet de définir les fenêtres à afficher. Dans d’autres applications, ce
menu est souvent un sous-menu de Édition. Ce n’est pas le cas ici du fait de sa longueur. Il
mérite bien un menu à lui tout seul.
Projet
Tout ce qui concerne la gestion du projet est ici :
– ajout ou suppression de feuilles ou de module au projet ;
– ajout de composants à la boîtes à outils pour bénéficier d’autre chose que les
composants standards ;
– options liées au projet.
Il est possible d’ouvrir plusieurs projets à la fois, de même que sous Word, vous pouvez
travailler sur plusieurs documents simultanément. Les ressources nécessaires pour la gestion
d’un projet font qu’il n’est guère réaliste d’en ouvrir plusieurs à la fois.
Format
Ce menu vous aidera à aligner les contrôles sur vos feuilles.
Débogage
Lorsqu’un programme ne fonctionne pas comme il le devrait, vous devez vous creuser la
tête… en utilisant un outil qui vous aidera à traquer les bugs, le débogueur. (Voir la séquence
6.)
Exécution
Pour exécuter votre application, ce qui est tout de même sa finalité.
Requête et Schéma
Pour l’accès aux bases de données, hors sujet pour nous.
3984 TG 15
Séquence 2 À quoi sert le programme VB ?
Outils
Pour ajouter automatiquement l’en-tête d’un sous-programme, ce qui est d’un intérêt limité,
mais aussi pour paramétrer le comportement du programme VB (éditeur, compilateur…).
Compléments
Sans objet pour nous.
Fenêtre
Menu classique sous Windows… permet de naviguer dans les différentes fenêtres ouvertes.
?
C’est l’aide… sans conteste votre meilleur ami !
3984 TG 16
Séquence 2 À quoi sert le programme VB ?
1
Attention à l’erreur classique qui ne fait pas très sérieux : il faut bien distinguer une icône (peinture religieuse
sur un panneau de bois) de un icone, dessin représentant ce qu’il désigne. En informatique, nous manipulons
bien des icones : le bouton pour imprimer symbolise une imprimante…
3984 TG 17
Séquence 2 À quoi sert le programme VB ?
3 C. Le travail sous VB
Une façon de voir les choses, c’est de vous dire que programmer sous VB revient à :
– pêcher dans la palette des composants les éléments (contrôles ou autre) dont on a
besoin ;
– écrire du code ;
– exploiter quelques icones pour tester son programme puis l’enregistrer.
Évidemment, ces différentes étapes ne sont parfois pas si simples.
3984 TG 18
Séquence 3
Contenu
Les différentes phases dans l’écriture et l’exécution d’un programme
L’interface utilisateur de VB
Les commandes principales
Capacités attendues
Maîtriser les notions clés de source, exécutable et compilation
Savoir manipuler les commandes essentielles de VB
Utiliser l’aide
3984 TG 19
Séquence 3 Un 1er programme sans prétention
1. Présentation
1 A. Objet de la séquence
Vous avez compris que nous allons enfin écrire un programme. Stop au baratin intéressant
mais improductif, place à l’écriture de code !
L’objet de ce programme est triple :
– apprendre concrètement comment utiliser VB pour développer une application ;
– découvrir les contrôles Windows et leur mode de fonctionnement (modèle objet) ;
– écrire du code pour découvrir le fonctionnement événementiel de VB et les
instructions VB correspondant à l’algorithmique que vous connaissez.
Cette séquence très courte est juste une sensibilisation à ces trois concepts clés (le modèle
objet, la programmation événementielle et le langage de VB). Les séquences qui suivent
rentreront dans le détail.
1 B 2. Illustration
Première situation :
Seconde situation :
3984 TG 20
Séquence 3 Un 1er programme sans prétention
2. Réalisons l’application
2 A. Création de la feuille (réalisation de l’interface)
Une fois VB lancé, accédez à la feuille Form1 (ouverte automatiquement), diminuez sa
longueur et sa largeur avec la souris (la feuille est une fenêtre Windows comme une autre)
puis placez deux zones de texte et un bouton dessus.
Comment ? C’est tout simple : vous cliquez dans la boîte à outils pour sélectionner le contrôle
que vous voulez, puis vous dessinez le contrôle dans la feuille là où vous souhaitez qu’il soit
placé. Euh, dessiner ? Oui : vous placez votre curseur souris devenu une croix sur la feuille,
vous cliquez et laissez appuyé et vous déplacez le curseur pour définir la taille du contrôle.
2. Je me place sur la
feuille, là où la zone de
texte doit apparaître.
Notez que mon curseur
est une croix.
3. Je clique, je déplace la
souris de
ici vers là…
J’obtiens la taille en
Twips de mon contrôle.
4. … et je lâche. Ma
zone de texte est
créée.
3984 TG 21
Séquence 3 Un 1er programme sans prétention
Qu’y a-t-il dans ma zone de texte ? Le mot Text1. À quoi sert-il ? C’est le nom de ma zone de
texte, composé de deux parties :
– Text (pour TextBox), c’est le nom VB de ce que les règles d’ergonomie Windows
appellent zone de texte. L’aide de VB sur TextBox indique d’ailleurs que c’est un
contrôle de saisie monoligne par défaut1, définition savante de la zone de texte ;
– 1 (pour… un) indique que c’est la première zone de texte de la feuille.
Vous savez qu’en programmation tout élément (variable, type, procédure ou fonction)
possède un nom. L’intérêt, c’est qu’il suffit d’utiliser son nom pour accéder à un élément2.
Les contrôles n’échappent pas à la règle : pour les manipuler, il faut leur donner un nom.
D’ailleurs, notre application contiendra deux zones de texte. Nous sommes donc obligés
d’avoir deux noms distincts pour pouvoir accéder à l’une ou à l’autre.
Lorsque vous déclarez des variables, la syntaxe vous oblige à mentionner son nom et son
type. Ici, lorsque l’on ajoute un contrôle, toute la manipulation se fait à la souris, aucun nom
ne vous est demandé. C’est pourquoi VB utilise un nom par défaut (Edit1) histoire que tout
composant en possède un. Certes, Edit1 est plus parlant que Teckel ou ARR778M_U. Au
moins, on sait que c’est une zone de texte. Mais c’est comme si la variable entière contenant
votre âge était nommée Entier1…
Bref, le nom du contrôle proposé par défaut n’est pas acceptable. Lorsque l’on a posé les
différents contrôles sur la feuille, il faut se dépêcher de les renommer. Nous ferons cela tout à
l’heure.
Pour le moment, ajoutez une seconde
zone de liste et un bouton (il est ici,
juste en-dessous de la zone de texte).
Vous aurez noté les noms des contrôles : Text1, Text2 et Command14. Nous allons comme
promis les renommer.
Ici, il ne sera pas évident de trouver des noms beaucoup plus parlants puisque l’application est
sommaire. Si nous avions un bouton permettant de quitter l’application, on l’appellerait
Quitter. De même, si une zone de texte servait à saisir une adresse, nous l’appellerions
1
Ceci signifie que si vous placez une zone de texte sur une feuille, elle sera monoligne donc ne permettra de
saisir qu’une (éventuellement très longue) ligne de texte. Si vous voulez modifier ce comportement et
pouvoir saisir plusieurs lignes, vous devrez paramétrer le contrôle (nous verrons cela).
2
C’est pourquoi nous avons tous un nom et un prénom qui nous identifient. Comme cette identification n’est
pas parfaite (homonymes), il en existe d’autres : l’identifiant fiscal unique, le numéro de Sécurité sociale,
votre numéro de client chez EDF…
3
Classique sous Windows : vous cliquez sur un contrôle de la feuille, vous maintenez appuyé et vous pouvez
déplacer le contrôle. Quand vous lâchez le bouton de la souris, le contrôle est positionné où vous êtes.
4
Command1, c’est pour CommandButton numéro 1.
3984 TG 22
Séquence 3 Un 1er programme sans prétention
Adresse1. Ici, j’appellerai le bouton Exécution2. Quant aux zones de texte, je vous propose
Départ et Arrivée.
Comment les renommer ? C’est très simple : vous les sélectionnez un par un dans la feuille en
cliquant dessus, puis vous allez dans l’inspecteur d’objets. Dans l’onglet Propriétés, vous
cherchez la propriété3 Name (elles sont en anglais et dans l’ordre alphabétique) et vous
remplacez la valeur par défaut (en bleu) par le nom choisi :
1. Je sélectionne une
zone de texte.
3. Je cherche la
propriété Name.
4. Je vais modifier
sa valeur par défaut.
La barre d’état de la
fenêtre fournit une petite
explication sur la propriété
sélectionnée.
Une fois la valeur modifiée, on obtient :
Le nom a
bien été
changé
Là, nous nous
sommes fait
avoir !
Il semblerait que ce qui est affiché dans la zone de texte ne soit pas son nom puisque je l’ai
changé et Départ (nouveau nom de ma zone de texte) contient toujours fièrement Text1.
Exercice 1
Nous allons régler le problème… dès que possible. En attendant, changez le nom du
bouton en Exécuter et celui de la seconde zone de texte en Arrivée.
1
Il existe une pratique consistant à inclure le type du contrôle dans son nom. Par exemple, tous les boutons
commenceraient par B et les zones de texte par ZDT. Ainsi, on n’utiliserait pas Quitter et Adresse mais
BQuitter et ZDTAdresse. Je n’y suis pas favorable car l’écriture est alourdie et, si votre interface est correcte,
il ne doit pas y avoir d’ambiguïté : Quitter, qui est un verbe, ne doit faire référence qu’à un bouton. Adresse
doit logiquement correspondre à un contrôle permettant de saisir une chaîne de caractères, à savoir une zone
de texte.
2
VB accepte l’utilisation des caractères accentués dans les identificateurs (nom de variable, de sous-
programme…). Nous serions bien bêtes de ne pas en profiter !
3
Nous découvrirons cette notion de propriété dans la séquence suivante.
3984 TG 23
Séquence 3 Un 1er programme sans prétention
Exercice 2
En sélectionnant le bouton, cherchez sa propriété Caption. Observez sa valeur.
Essayez de mettre Teckel dans Caption pour voir ce qui se passe dans la feuille.
Exercice 3
Le problème a été réglé pour le bouton. Cherchez une propriété Caption associée aux
zones de texte. Si vous ne la trouvez pas, lisez l’aide sur Caption puis tentez de
chercher une propriété de la zone de texte Départ contenant Text1 et changez-la en
Départ (idem pour Arrivée).
Bien. Continuons notre programme (remettez Caption à Exécuter.
Nous avons donc la feuille suivante :
Cette application a deux problèmes majeurs (à ce stade, ce ne sont plus des bugs) :
– il y a Départ et Arrivée d’écrit dans les zones de texte. Or, je voudrais que les zones
soient initialement vides et que l’utilisateur puisse taper ce qu’il veut dedans ;
– dans ma copie d’écran, le curseur est sur le bouton. Ce n’est pas par accident : j’ai
frénétiquement essayé de cliquer dessus, mais il ne se passe rien.
Exercice 4
Pouvez-vous me dire l’origine de chacun de ces problèmes ? Essayez de résoudre le
premier.
2 C. Corrigeons l’interface
2 C 1. La manipulation
Exercice 5
Réglez le problème du contenu des zones de texte (la solution est dans la correction de
l’exercice précédent).
3984 TG 24
Séquence 3 Un 1er programme sans prétention
Les zones de texte sont vierges. Ainsi, ce n’était pas leur nom qu’elles contenaient, mais bien
leur valeur (leur contenu en somme), sachant que, par défaut, leur contenu était égal à leur
nom.
Si vous n’avez pas compris cette phrase, relisez-là.
2 C 2. Point théorique
Il est sans doute bon de faire un point concernant les propriétés Name, Caption et Text. Vous
avez peut-être l’impression que Caption et Text sont équivalentes. Ce n’est pas le cas :
– Name est une variable1 contenant le nom du contrôle ;
– Caption est une variable contenant ce qui est écrit dans le bouton. L’utilisateur de
votre programme ne peut pas modifier ce texte (le bouton ne s’édite pas) ;
– Text est une variable contenant le… contenu d’une zone de texte. Lorsque l’utilisateur
modifie le contenu d’une zone de texte (c’est la finalité de ce contrôle), le
programmeur récupère la valeur saisie en lisant la variable Text.
Dit autrement, Caption définit une valeur fixe, comme si vous graviez votre nom sur votre
porte d’entrée. Au contraire, Text reflète une valeur changeante (par exemple le numéro de la
page que vous lisez).
Vous me trouvez sans doute pointilleux mais cela est très important à assimiler puisque ce
sont ces détails, et bien d’autres, qui font la qualité de l’interface graphique.
2 D. Écrivons le code
2 D 1. L’événement
Bien. Arrivé là, votre interface est correcte (les zones de texte sont initialement vides), mais il
ne se passe toujours rien lorsque l’on clique sur le bouton.
Nous allons donc devoir dire ce qui doit se passer lorsque l’on clique sur le bouton.
Ce qui doit se passer, c’est facile : nous utiliserons une alternative classique (le si
algorithmique).
En revanche, comment dire que notre alternative doit être exécutée lorsque l’on clique sur le
bouton ? Cela, c’est de la programmation événementielle. Nous verrons cela en détail dans la
séquence suivante. Pour le moment, je vais juste vous dire que l’on peut écrire du code qui
sera exécuté lorsque des événements précis arrivent.
Par exemple, le fait de cliquer sur un bouton est un événement (il se passe quelque chose dans
le monde palpitant de l’interface graphique).
1
Pour le moment, une propriété n’est rien de plus qu’une variable.
3984 TG 25
Séquence 3 Un 1er programme sans prétention
Pour écrire du code, nous devons ouvrir la fenêtre contenant du code. Oui, c’est un peu
évident, mais bon… L’idée est qu’actuellement, vous avez sous les yeux uniquement la
feuille. Or, la feuille, c’est du graphisme ; il n’y a pas de place pour le code.
Il y a trois façons pour afficher la fenêtre du code :
– passer par la commande (nous l’avons vue incidemment) ;
– utiliser l’icone ;
– faire un clic droit sur un des contrôles et choisir code (c’est la solution la moins
rapide).
La meilleure solution, c’est l’icone. Je vous rappelle qu’elle se trouve dans la fenêtre Projet :
Cliquer ici
affiche la
Cliquer ici
fenêtre code
affiche l’objet
de l’objet
sélectionné là
sélectionné
là
Cette fenêtre Projet n’est pas grosse mais elle est cruciale. En effet, toute la navigation dans le
projet se fait à partir d’elle :
– lorsque vous chargez un projet, vous n’avez rien à l’écran. Il faut passer par cette
fenêtre pour sélectionner l’objet (feuille ou module1) que vous souhaitez visualiser ;
– en conception, vous passerez constamment d’une feuille à une autre, d’un bout de
code à un autre grâce à elle ;
– vous aurez noté que les deux boutons présentés représentent une bascule puisque l’un
permet d’afficher un objet et l’autre le code lié à cet objet.
La feuille étant sélectionnée, j’ai appuyé sur le bouton affichant le code. Voici ce qui est
apparu :
Cette zone de Cette zone de liste
liste permet permet d’accéder aux
d’accéder à tous différents événements
les contrôles de Ici, il y aura le code… quand nous l’aurons écrit du contrôle choisi
la feuille, elle dans la précédente
comprise. zone.
Pour voir les différents événements qui peuvent arriver à un bouton2, vous allez d’abord
sélectionner le bouton Exécuter dans la liste de gauche :
2 D 2. La procédure événementielle
En cliquant sur Exécution, il se passe quelque chose d’assez curieux : ma fenêtre se remplit
(enfin, remplit est sans doute excessif) de code, comme l’atteste la copie d’écran qui suit.
1
Module ? terme technique… nous le verrons plus tard.
2
Nous verrons que ces événements sont définis par Windows. Impossible d’en ajouter. On peut juste espérer
que tous ceux dont nous avons besoin sont bien présents.
3984 TG 26
Séquence 3 Un 1er programme sans prétention
Attention, une procédure événementielle est avant tout une procédure. Si je la dis
événementielle, c’est parce qu’elle est déclenchée par l’arrivée d’un événement, mais c’est
avant tout une procédure comme une autre. Dit autrement, tout procédure devient
événementielle si vous la liez à un événement.
Cela vous permet de voir par la bande que la déclaration d’une procédure ressemble à ce que
l’on voit en algorithmique : au lieu du mot clé procédure, on met sub (on y gagne, c’est plus
court). Vient ensuite son nom puis ses paramètres.
D’ailleurs, quels paramètres mettre ? Nous ne nous en préoccupons pas, c’est VB qui les
définit. Ils varient en fonction de l’événement (le click ne possède aucun paramètre).
Ah, je n’ai pas parlé du mot private. Nous y reviendrons.
3984 TG 27
Séquence 3 Un 1er programme sans prétention
Votre curseur a été positionné entre les lignes Private sub et End Sub. Pourquoi ? Car c’est ici
que nous allons écrire le code.
Il faut comprendre cela car d’une part c’est simple et d’autre part vous devez maîtriser un
minimum votre code. Cela dit, tout est réalisé automatiquement par VB, donc pas de souci !
2 D 3. Testons l’application
Exercice 6
Comme la procédure événementielle est définie, vous pouvez tester votre programme
en l’exécutant. Que se passe-t-il ?
Exercice 7
Vous connaissez la propriété permettant d’accéder (en lecture ou en écriture) au
contenu d’une zone de texte. Vous connaissez la façon d’accéder à un champ d’un
enregistrement (opérateur « . »).
Sachant que vous pouvez considérer un contrôle comme un enregistrement et la
propriété comme un champ, écrivez le code algorithmique (un si) faisant ce que je
veux.
Il faut maintenant transcrire le code algorithmique en code VB. Là, c’est moi qui vais tout
faire puisque vous ne connaissez pas encore le langage.
Version algorithmique :
si [Link] = ""
alors
[Link] := "l’autre zone de texte est vide"
sinon
[Link] := "l’autre zone de texte est remplie"
fin-si
Version VB :
01 if Dé[Link] = "" then
02 Arrivé[Link] = "l'autre zone de texte est vide"
03 else
04 Arrivé[Link] = "l'autre zone de texte est remplie"
05 End If
Que faut-il retenir ? Nous verrons toutes les instructions VB dans la séquence 5. Notons juste
ici que :
– ligne 1, le mot clé then doit être sur la même ligne que le if, sinon VB râle (la ligne
devient rouge pour indiquer une erreur de syntaxe) ;
– lignes 2 et 4, l’affectation sous VB se note « = » ;
– VB possède des terminateurs d’instruction (End If ligne 5).
Exercice 8
Écrivez le code VB dans la procédure événementielle (entre le Private sub et le End
Sub). Testez le programme. Cela doit marcher.
3984 TG 28
Séquence 3 Un 1er programme sans prétention
3 B. Expliquons le problème
VB veut bien faire. C’est un maladroit qui veut bien faire. Son idée est de décharger au
maximum le fardeau du pauvre développeur. Il ne demande donc pas à ce dernier de déclarer
les variables utilisées, suivant en cela le fonctionnement des antédiluviens basics.
De prime abord, cela semble merveilleux : VB déclare pour vous toutes les variables, plus de
soucis de type…
En fait, ce n’est pas merveilleux pour deux raisons :
– si vous ne déclarez pas une variable, VB va la déclarer pour vous lorsqu’il traitera une
instruction la contenant. Il essayera de déterminer son type au mieux, mais cela ne sera
pas parfait. Votre application ne sera donc pas pleinement efficace. Mais ce n’est pas
encore le plus grave ;
– le plus grave, ce sont les fautes de frappes. Supposons que vous ayez une variable
TauxTVARéduit dans votre programme. Supposons aussi que, par accident, vous
l’écriviez une fois [Link] VB arrivera sur l’instruction
correspondante, il va se dire « tiens, une nouvelle variable. Bonjour, nouvelle variable.
Je vais te déclarer pour le gentil programmeur. » Bref, là où vous croyiez faire un
traitement sur votre variable TauxTVARéduit, VB le fera sur une autre variable qui n’a
rien à voir. Le problème, c’est que cette erreur est très pernicieuse : vous verrez que
votre programme bug, donc vous chercherez une erreur de logique (d’algorithme)
mais pas une mauvaise écriture, à un moment donné, d’une variable.
Imaginez maintenant que vous deviez déclarer les variables. Arrivé à TauxTVAReduit, VB se
dirait « tiens, une variable non déclarée ; j’avertis le gentil programmeur et je m’arrête. ».
Vous voyez donc immédiatement qu’il s’agit d’une faute de frappe et vous la corrigez.
Dans le programme ci-dessus, Jean, Aime, Février, Teckels, Yves et Les sont des variables
non déclarées donc automatiquement référencées par VB et initialisées à 0.
1
Vous voyez la différence ? J’ai changé le « é » en « e ».
3984 TG 29
Séquence 3 Un 1er programme sans prétention
3 C. Résolvons le problème
Tout cela pour dire que je vous conseille très très fortement de vous obliger à déclarer les
variables. Comment ? En allant dans Outils/Options…, onglet Éditeur, cochez la case
Déclaration des variables obligatoire.
Tous les nouvelles fenêtres de code contiendront l’instruction magique Option Explicit
obligeant le développeur à déclarer explicitement ses variables.
Le problème, c’est que cette modification ne s’applique pas au code déjà écrit.
Démonstration :
Mon code actuel ne contient
pas la ligne magique.
là !
Maintenant, si vous exécutez le code, VB vous indiquera un beau message d’erreur. En effet,
il n’acceptera pas de traiter les variables Jean, Aime, Février, Teckels, Yves et Les puisqu’elles
n’ont pas été déclarées.
3984 TG 30
Séquence 4
Objets et événements
Dans la séquence précédente, nous avons réalisé un petit programme sommaire
mais exploitant l’ensemble des éléments de VB.
Contenu
Principe de base de la programmation objet.
Syntaxe.
Capacités attendues
Savoir utiliser des objets.
3984 TG 31
Séquence 4 Objets et événements
1. Le concept d’objet
Lisez très attentivement cette partie. Relisez-la. Imprégniez-vous-en. Pourquoi ? Parce qu’elle
contient des réflexions assez générales mais qui sont très importantes pour la compréhension
des objets.
1 B. Représentation de l’information
1 B 1. Variables d’un type de base
Nous venons de voir qu’un programme gérait de l’information. Nous allons maintenant
étudier comment il la représente (stocke).
Les applications sont conçues pour l’homme. Je veux dire par là que les informations
manipulées ont un sens pour les humains. Plus encore, ces informations sont des informations
venant de notre monde : des âges, des noms, des prix, des clients, des factures…
La programmation structurée traditionnelle (langages Basic, C, Pascal…) manipule des
variables typées (une variable est d’un type donné). Ces variables sont simples (elles n’ont
qu’une valeur) et sont d’un des types de base suivants : entier, réel, chaîne de caractères,
caractère ou booléen (les langages modernes rajoutent des types tels date…). Cela suffit pour
manipuler les concepts simples du monde réel : les noms, les prix, les dates…
En revanche, lorsque l’on veut manipuler des informations plus complexes comme des
clients, factures, commandes ou règlements, les types de base sont insuffisants : un client ne
se limite pas à une chaîne de caractères ou à un entier !
Un autre exemple d’information complexe ? Eh bien, une zone de texte ! Vous avez vu dans
la séquence précédente qu’une zone de texte possédait de nombreuses caractéristiques : son
contenu, son nom, sa position…
Ces informations complexes, il faut pouvoir les représenter correctement et efficacement. La
solution réside dans les types structurés.
3984 TG 32
Séquence 4 Objets et événements
1 B 4. … aux objets
Résumons-nous : les structures permettent de représenter des concepts du monde réel (le
client, la zone de texte, le bouton…), par opposition aux variables simples qui ne représentent
que des données.
Nous souhaitons donc manipuler par programmation des concepts évolués : clients, factures,
contrôles… Nous cherchons à les voir comme un tout cohérent et non comme un ensemble de
données (c’est la raison même des structures). Il est intéressant d’aller plus loin : un concept
évolué (un objet du monde réel) n’est pas qu’un ensemble de données de base, de même
qu’un humain n’est pas juste un ensemble d’organes.
Ce que j’essaie d’expliquer, c’est qu’une variable de base n’a pas de fonction dans la vie
réelle, elle ne fait rien : mon âge, mon adresse, mon poids… ce sont des informations, rien
d’autre.
Au contraire, une entité est définie par sa fonction dans le système d’information (si l’on
distingue le client, c’est que le client sert à quelque chose). Par exemple :
− le client passe une commande, règle une facture, peut déménager…
− une facture peut être émise, payée, annulée…
− un produit peut être commandé, en rupture de stock…
− une zone de texte peut être remplie, vidée, modifiée…
− un bouton peut être cliqué.
3984 TG 33
Séquence 4 Objets et événements
Ainsi, ce qui distingue les entités des variables simples, ce sont les fonctions que ces entités
réalisent.
C’est à ce stade de nos cogitations que l’on va introduire le concept d’objet. Je vous résume
nos réflexions :
♥ Une entité du monde réel est constituée de deux choses indissociables : de l’information
♥ (des données) et des fonctions (des traitements).
Je vais reprendre mon débat du paragraphe précédent avec les solutions correctes ou efficaces.
Pour le moment, nous représentons un client ou une zone de texte avec une structure. Les
traitements seront des sous-programmes classiques (procédures ou fonctions). Cette solution
est correcte.
Oui, juste correcte, car on éclate en deux notre concept du monde réel qui formait pourtant un
tout : d’un côté les données, de l’autre les traitements.
Par exemple, si l’on possède un type structuré Facture, on aura sans doute envie de savoir si
une facture donnée est ou non payée (évidemment, la structure possède les champs adéquats
pour pouvoir répondre à cela). On aura donc une fonction de ce type :
fonction Payée (f : Facture) : booléen
Notre objectif n’est pas de construire de nouveaux objets, mais juste de savoir utiliser
(manipuler) ceux que VB nous propose, à savoir les contrôles. C’est pourquoi nous supposons
que les données et les traitements sont déjà fournis.
Je possède des données et des traitements que je souhaite associer pour définir un objet.
Comment faire ? C’est pour le moment un problème purement syntaxique.
Vous vous attendez sans doute à ce que je vous sorte une nouvelle syntaxe dévolue aux
objets. Eh bien, vous avez raison. Enfin, à moitié : nous allons reprendre quasiment celle des
structures, en changeant juste le mot de structure en objet.
2 B. Vocabulaire
L’objet est un concept moderne représentant la pointe en matière de programmation. C’est
très efficace, mais n’a pas vraiment d’intérêt pour les programmes que vous pourriez écrire,
raison pour laquelle nous n’étudierons pas ensemble comment faire sous VB pour définir des
objets.
En revanche, l’application VB est suffisamment importante pour mettre en œuvre des objets.
J’ai dit qu’il y avait les contrôles Windows, mais en fait toute l’infrastructure VB est bâtie
avec des objets.
Ce que j’attends de vous est la maîtrise des concepts de base et du vocabulaire objet pour
comprendre le principe de fonctionnement des objets que vous manipulerez au travers de VB
et qui se résument, je le répète, aux contrôles Windows.
Nous venons de voir l’analogie entre les structures et les objets. Pour identifier correctement
les concepts, on ajoute du vocabulaire.
♥ L’équivalent du concept du monde réel est appelé une classe.
Attention, une classe est analogue à un type informatique, à savoir que c’est une définition
abstraite (c’est l’Homme par rapport à un homme). Par exemple le type entier est analogue à
la classe Client ou à la classe TextBox (type correspondant aux zones de texte).
♥ On dit qu’une variable est d’un type donné et qu’un objet est une instance d’une classe
♥ donnée. Les notions variable et type deviennent instance et classe.
♥ Ainsi, de même que i est une variable de type entier (bref, i est un entier), on dira que
♥ l’objet Cl1 est une instance de la classe Client ou que les contrôles Départ et Arrivée sont
♥ des instances de la classe TextBox (ce qui se dit plus simplement Départ et Arrivée sont des
♥ zones de texte).
♥ Enfin, les données constituant la classe sont appelées des propriétés et les traitements sont
♥ des méthodes. Les propriétés et les méthodes sont les membres de la classe.
Nous retrouvons le terme propriété utilisé dans la séquence précédente.
3984 TG 35
Séquence 4 Objets et événements
Comme je l’ai dit précédemment, une classe est pour le moment une structure regroupant des
données et des traitements. Enfin, habituons-nous à utiliser le vocabulaire correct : la classe
est une structure regroupant propriétés et méthodes.
Les propriétés seront déclarées exactement comme les champs dans une structure ; c’est
normal puisque les concepts sont équivalents.
Les méthodes (procédures et fonctions) sont un concept nouveau. Il nous faut une nouvelle
syntaxe. Elle sera simple : chaque méthode sera définie par son en-tête (la première ligne
contenant le nom du sous-programme). Le corps de la méthode (en clair, les instructions entre
les début et fin du sous-programme) sera défini plus loin.
Voici donc la syntaxe de déclaration de la classe (version algorithmique et non VB). Notez
l’analogie avec la structure !
♥ type
♥ NomClasse = Classe
♥ // propriétés de la classe
♥ variable1 : type
♥ variable2 : type
♥ …
♥ variablen : type
♥ // méthodes de la classe
♥ procédure NomProcédure1 (paramètres)
♥ …
♥ procédure NomProcéduren (paramètres)
♥ fonction NomFonction1 (paramètres) : type
♥ …
♥ fonction NomFonctionn (paramètres) : type
♥ fin classe
J’ai d’abord défini les données, puis les procédures et enfin les fonctions. En réalité, il n’y a
pas plus d’ordre que dans la définition des structures. Par souci de lisibilité, la norme impose
de présenter d’abord les données puis les traitements.
Une fois la classe déclarée, c’est comme si elle avait toujours existé. On peut donc déclarer
des instances de cette classe.
La déclaration est tout à fait classique :
♥ var
♥ Objet : Classe
Ce code déclare un objet Objet comme étant une instance de la classe Classe. (Il s’agit
toujours de syntaxe algorithmique, nous verrons dans la séquence suivante comment déclarer
des variables sous VB.)
3984 TG 36
Séquence 4 Objets et événements
2 D. Exemple
2 D 1. Partons d’une structure Client
Je déclare une structure Client avec ses champs :
type
Client = structure
Nom : chaîne
Prénom : chaîne
Adresse : chaîne
CodePostal : chaîne
Ville : chaîne
DatePremièreCommande : date
fin structure
début
saisir "Entrez la nouvelle adresse", Adresse
saisir "Entrez le nouveau code postal", Code
saisir "Entrez la nouvelle ville", Ville
DéménagerCl (Cli, Adresse, Code, Ville)
fin
Cette classe est un peu folklorique : je ne l’ai écrite que pour illustrer la syntaxe. Si vous
deviez l’utiliser dans une application, il faudrait la compléter, bref faire un travail d’analyse.
Notez que les deux méthodes n’ont aucun paramètre faisant référence à un objet Client. Est-ce
normal ? Oui ! En effet, ces méthodes sont les méthodes d’un objet donné (enfin, plus
précisément, comme ces méthodes font partie de la classe, chaque instance de la classe
possède les méthodes). On appellera donc les méthodes à partir d’un objet qui jouera
implicitement le rôle du paramètre : une méthode étant appelée à partir d’un objet, la méthode
s’applique à cet objet.
3984 TG 37
Séquence 4 Objets et événements
Comme prévu, la définition de la classe ne donne que l’en-tête des méthodes. Il faut écrire le
sous-programme lui-même. Le voici :
procédure Client.Déménager (NewAdr : chaîne, NewCode : chaîne, NewVille : chaîne)
début
Adresse := NewAdresse
CodePostal := NewCode
Ville := NewVille
fin
début
saisir "Entrez la nouvelle adresse", Adresse
saisir "Entrez le nouveau code postal", Code
saisir "Entrez la nouvelle ville", Ville
Cli.Déménager (Adresse, Code, Ville)
fin
3984 TG 38
Séquence 4 Objets et événements
3. Les événements
3 A. Généralités
Nous allons reprendre de façon plus formelle ce que nous avions commencé dans la séquence
précédente.
Tout système d’exploitation graphique (Windows et autres) propose à l’utilisateur deux outils
pour fournir de l’information au système : le clavier et la souris. Voici un bref descriptif de
leur rôle :
– le clavier est l’élément le plus naturel pour saisir du texte. Si, au lieu d’utiliser le
clavier, vous deviez cliquer à la souris les différents caractères que vous voulez taper
pour créer un document sous Word, vous seriez bien malheureux !
– la souris n’est pas faite pour taper du texte. Elle est en revanche idéale pour
sélectionner des commandes (clic sur les barres d’outils et de menus), pour lancer des
applications (clics sur des icones…).
Un système graphique est :
– intéressant pour son ergonomie (la simplicité et le confort de la manipulation de ses
différents composants) ;
3984 TG 39
Séquence 4 Objets et événements
J’ai un petit
morceau de Je manipule
bureau sous Word ici.
la main
La navigation entre les différentes applications est permise par la fonction multi-tâche du
système d’exploitation.
3984 TG 40
Séquence 4 Objets et événements
Ainsi, lorsque vous utilisez une application, vous avez l’impression de communiquer avec
elle : vous activez une commande (en cliquant sur un bouton ou un menu) et l’application
répond en exécutant le traitement souhaité.
En fait, c’est une illusion. La communication se fait par le truchement du système
d’exploitation : c’est ce dernier qui va détecter que l’utilisateur a cliqué sur un contrôle d’une
application et qui va envoyer un message à l’application pour lui dire « l’événement X vient
de se produire sur le contrôle Y »1 (je résume un peu).
Vous devez retenir deux choses de cette explication :
– d’une part, nous sommes dans un cadre de travail action/réaction : le système réagit à
des événements qui se produisent. La plupart du temps, c’est l’utilisateur qui
déclenche les événements avec la souris ou le clavier. La réaction du système, c’est
l’exécution de code ;
– d’autre part, c’est le système d’exploitation qui perçoit chaque événement et qui le
communique à l’application concernée.
Le fait que les événements transitent par le système d’exploitation explique pourquoi vous ne
pouvez pas ajouter vos propres événements dans une application2. Supposons que vous
vouliez créer l’événement TripleClic qui se déclencherait lorsqu’un utilisateur clique trois fois
rapidement sur un contrôle. Comment faire ? C’est impossible au sein de votre application car
pour que le programme soit averti de la survenue d’un triple clic, il faudrait que le système
d’exploitation l’en avertisse. Or, ce dernier ne connaît pas la notion de triple clic. Il est donc
incapable de détecter sa survenue3.
3 C. Soyons précis
3 C 1. Avec le vocabulaire
Pour que le programme sache quoi faire en réponse à un événement, il faut qu’il sache :
– quel est cet événement (clic, mise à jour, survol souris…) ;
– quel est le contrôle concerné (sur quel contrôle on vient de cliquer, ou quel contrôle
vient d’être mis à jour ou survolé par le curseur…).
Du coup, l’événement sera toujours associé à un contrôle. Partant du principe qu’un
événement seul (on a cliqué dans l’application) n’est pas informatif, ma définition de
l’événement va inclure le contrôle.
Je vous propose la définition suivante :
♥ Un événement est quelque chose de répertorié arrivant à un contrôle.
Deux remarques :
– les termes quelque chose ne font pas très professionnels, mais quoi utiliser d’autre ?
Le terme événement est tellement explicite…
– le mot répertorié signifie que seuls existent pour le système (et donc seuls sont pris en
compte) les événements qui sont définis dedans. La seule chose à faire, c’est donc
d’espérer que les développeurs de Windows aient pensé à tous les événements dont
nous pourrions avoir besoin.
1
Par exemple « l’événement clic vient de se produire sur le contrôle OK » (OK est un bouton).
2
Attention, je parle bien d’événement, pas du code lié à un événement (nous allons aborder cela).
3
En fait, c’est encore pire que cela : comme il connaît l’événement double clic, le système préviendra
l’application que le double clic a eu lieu dès que vous aurez cliqué deux fois sur les trois que compte votre
triple clic. Ce dernier sera donc détecté comme deux événements : un double clic suivi d’un clic.
3984 TG 41
Séquence 4 Objets et événements
3 C 3. La programmation événementielle
Faire un programme événementiel revient donc à écrire le bon code dans les bons
événements.
Voilà. Avec ce savoir, nous pouvons travailler efficacement dans VB. Le moment est donc
venu de découvrir les instructions du langage basic.
1
En réalité, c’est un peu plus subtil (si vous ne saisissez pas ce qui suit, cela n’a aucune importance). Click
n’est pas une méthode mais une propriété d’un type un peu spécial : elle ne contient pas un entier ou une
chaîne, mais une procédure (enfin, l’adresse en mémoire d’une procédure). Et quelle procédure ? Eh bien, la
procédure événementielle que vous avez éventuellement écrite. Donc soit il y a une adresse (si vous avez
écrit la procédure) soit il y a la constante NIL représentant conventionnellement l’absence d’adresse.
Ainsi, lorsque l’événement Click d’un bouton se produit, l’application va voir si sa propriété Click possède
une adresse. S’il n’y en a pas (donc Click vaut NIL), il ne se passe rien. Sinon, la procédure stockée à
l’adresse trouvée est exécutée.
3984 TG 42
Séquence 5
VB : présentation du langage
Il est temps de découvrir le langage VB pour pouvoir écrire de vrais programmes !
Contenu
Description du langage VB : instructions, types et sous-programmes.
L’interface utilisateur de VB.
Capacités attendues
Savoir traduire un algorithme sous VB.
3984 TG 43
Séquence 5 VB : présentation du langage
1. Introduction
1 A. Approche de VB
Je pourrais vous écrire un livre sur ce langage, mais ce n’est pas notre propos. Je me contenterai
donc de vous en montrer juste assez pour que vous puissiez vous en servir. Cela tiendra en trois
grandes parties :
– la traduction sous VB des différents concepts de l’algorithmique ;
– les erreurs classiques d’un débutant VB ;
– les modules.
VB est un langage de développement événementiel au même titre que Delphi, Visual C++… Vous
avez donc accès aux feuilles et à tous les contrôles visuels de Windows. Vous pouvez également
travailler en mode console (texte) sans utiliser le mode graphique.
1 B. L’autonomie avec VB
Lorsque vous allez lire cette séquence, vous vous direz avec raison qu’il n’y a pas de difficulté
majeure dans VB. Cela dit, je suis prêt à parier que vos premiers programmes auront de très
nombreuses erreurs de compilation. C’est normal puisque ce type d’erreur révèle un problème de
syntaxe. Et la syntaxe, c’est justement ce dont on ne se préoccupait pas en algorithmique.
Si j’étais avec vous, je regarderais un quart de seconde votre écran pour vous aider à identifier votre
erreur et je vous dirais d’un air désabusé « manque un End If », « manque End If » voire « End
If ! »1.
Seulement voilà, si vous lisez ce cours, c’est que je ne suis pas derrière vous. Autonomie,
débrouillardise et autonomie seront vos mots d’ordre. N’hésitez pas à consulter l’aide en ligne du
langage : mettez votre curseur texte sur un mot du langage (pour cela, déplacez-le avec les flèches
ou cliquez dessus), puis faites F1. Vous obtenez l’aide relative au mot ou à l’instruction.
1
Où toute autre phrase laconique expliquant la grosse erreur de syntaxe faite.
3984 TG 44
Séquence 5 VB : présentation du langage
2 B 2. Application événementielle
Cas général
Une application événementielle est à la norme Windows : les différents traitements sont lancés par
l’utilisateur par le biais du déclenchement d’événements (le plus employé étant le clic souris sur un
bouton). Des événements internes à l’application, donc non directement déclenchés par l’utilisateur,
permettent aussi d’exécuter du code.
Le code est toujours écrit avec un langage procédural classique (le Pascal, le Basic, le C…). Cela
signifie que le code associé aux événements l’est sous la forme d’une procédure. Ainsi, lorsque l’on
dit que le clic sur le bouton Valider déclenche l’enregistrement des données, cela veut dire que le
développeur a associé à l’événement clic du bouton Valider la procédure réalisant l’enregistrement.
Vous conservez la faculté d’écrire des sous-programmes (procédures et fonctions) utilisées par les
procédures événementielles.
1
Sachant que VB (dans sa version 6 tout du moins) ne propose qu’une partie du formalisme objet. Il est donc
impropre de parler de langage objet.
3984 TG 45
Séquence 5 VB : présentation du langage
Bref, passer d’une application algorithmique classique à une application graphique événementielle,
c’est changer l’habillage et l’organisation, soit l’ergonomie. Le code reste le même.
L’interface est réalisée dans des feuilles utilisant pour les saisies et les affichages les contrôles
Windows classiques (zone de texte, de liste, case à cocher…).
Tous les langages de programmation événementiels (Delphi, VB, Visual C++…) fonctionnent ainsi.
Il faut distinguer deux choses : l’aspect événementiel (les feuilles, contrôles, événements) et le
langage de programmation sous-jacent (le Pascal pour Delphi, le Basic pour VB, le C++ pour
Visual C++…).
J’insiste : tous les contrôles Windows et leurs événements associés se retrouvent dans ces langages.
Mieux encore, ils sont toujours accessibles de la même façon, sous la forme d’objets (voir la
séquence précédente). Ainsi, activer un contrôle, changer sa couleur ou sa taille1 se fera exactement
de la même façon sous Access, VB, Delphi…
L’organisation d’une application événementielle est toujours la même : l’aspect graphique
(l’interface) est constitué d’un ensemble de feuilles contenant des contrôles. Comme le code est
déclenché par la survenue d’un événement associé à un contrôle ou à une feuille (on clique sur tel
bouton, on ferme telle fenêtre), on associe à chaque feuille tout le code qui le concerne.
Finalement,
♥ Une feuille = des contrôles + le code associé aux événements de la feuille et de ses contrôles
♥ Un programme événementiel = un ensemble de feuilles
Cas de VB
Ce qui précède est commun à tous les langages de programmation événementiels2. Cependant, dès
que la notion de programmation pointe sa petite tête, les caractéristiques du langage hôte
interviennent.
C’est le cas dans l’équation suivante :
Une feuille = des contrôles + le code associé aux événements de la feuille et de ses contrôles
Les différentes instructions seront évoquées dans la suite de cette séquence. Je souhaite vous parler
ici de l’organisation des programmes : comment assembler le code à la feuille ? Peut-on écrire du
code indépendant de toute feuille ? Nous verrons tout cela dans le paragraphe 2C.
1
Changer la taille, la couleur ou l’emplacement d’un contrôle lors de l’exécution de l’application est aisé à réaliser
mais viole toutes les règles d’ergonomie ! Ne vous y amusez pas.
2
événementiels ou événementielle ? Pour moi, c’est un langage permettant de mettre en œuvre la programmation
événementielle. C’est donc un langage événementiel de programmation, soit un langage de programmation
événementiel.
3984 TG 46
Séquence 5 VB : présentation du langage
2 C. Les modules
2 C 1. Définition
Les modules sont utiles pour regrouper du code indépendamment de toute feuille. Vous vous
demandez sans doute à quoi cela peut servir puisque notre but est justement d’écrire du code lié aux
contrôles des feuilles.
Par exemple, si vous développez du code pour gérer des comptes bancaires (un type Compte et des
sous-programmes pour ouvrir, approvisionner et fermer un compte), il est intéressant de tout
regrouper dans un module qui pourra être utilisé dans n’importe quel programme manipulant des
comptes bancaires.
En fait, vous aurez compris que le module permet de regrouper du code utilisé dans plusieurs
feuilles (voire dans plusieurs projets).
Comment utiliser un module dans une application ? Il suffit de l’ajouter dans le projet grâce à la
commande Projet/Ajouter un module. Vous aurez deux onglets permettant d’en créer un nouveau
ou de faire référence à un module déjà existant.
Pour fixer les idées, j’ai ajouté un nouveau module à mon application. Voici ce qui se passe alors :
Le bouton Objet est
Voici la fenêtre du désactivé puisqu’un
module que nous venons module n’est associé
d’ajouter. On voit bien à aucune feuille.
que c’est un module car
la zone de liste des objets
Le projet s’est doté d’une
ne contient rien, ni
rubrique Modules dans
contrôle ni feuille.
laquelle trône notre
(Notez Option Explicit
nouveau module.
suite à notre précédent
paramétrage !)
1
Dit autrement, l’algorithmique ne s’est pas encore adaptée à l’événementiel.
3984 TG 47
Séquence 5 VB : présentation du langage
Il faut bien comprendre que le code associé à une feuille n’est pas différent de celui que l’on trouve
dans un module (enfin, procédures événementielles mises à part).
En fait, le code du module est stocké dans un fichier séparé d’extension .bas (pour BASic), tandis
que le code lié à la feuille est directement stocké dans le fichier de cette dernière à la suite de la
description de ses contrôles.
Pour preuve, voici le fichier [Link] décrivant notre feuille :
01 VERSION 5.00
02 Begin [Link] Form1
03 Caption = "Form1"
04 ClientHeight = 1860
05 ClientLeft = 60
06 ClientTop = 345
07 ClientWidth = 4725
08 LinkTopic = "Form1"
09 ScaleHeight = 1860
10 ScaleWidth = 4725
11 StartUpPosition = 3 'Windows Default
12 Begin [Link] Arrivée
13 Height = 315
14 Left = 1695
15 TabIndex = 2
16 Top = 930
17 Width = 2610
18 End
19 Begin [Link] Exécution
20 Caption = "Exécuter"
21 Height = 345
22 Left = 375
23 TabIndex = 1
24 Top = 915
25 Width = 1110
26 End
27 Begin [Link] Départ
28 Height = 300
29 Left = 345
30 TabIndex = 0
31 Top = 240
32 Width = 1740
33 End
34 End
35 Attribute VB_Name = "Form1"
36 Attribute VB_GlobalNameSpace = False
37 Attribute VB_Creatable = False
38 Attribute VB_PredeclaredId = True
39 Attribute VB_Exposed = False
40 Option Explicit
41
42
43 Private Sub Exécution_Click()
44 If Dé[Link] = "" Then
45 Arrivé[Link] = "l'autre zone de texte est vide"
46 Else
47 Arrivé[Link] = "l'autre zone de texte est remplie"
48 End If
49 End Sub
3984 TG 48
Séquence 5 VB : présentation du langage
– lignes 43 à 49, il y a notre procédure événementielle liée au bouton Exécution défini plus
haut.
Cette démonstration n’avait d’autre objet que vous prouver que le code lié à une feuille est
indissociable de la feuille elle-même puisque les deux constituent un seul fichier. Attention, il n’est
pas question de modifier directement ce fichier, il n’est pas fait pour cela. Pour travailler sur la
feuille et son code, ouvrez le fichier sous VB.
2 C 2. Rôle
VB exploite la notion de module, que vous fassiez de la programmation événementielle ou console.
Un module, c’est quoi ? C’est un concept simple et intuitif que l’on retrouve sous une forme plus ou
moins proche dans tous les langages de développement (fichiers inclus, librairies, unités…).
Je tourne autour du pot… Un module est tout simplement un ensemble de types, de variables et de
sous-programmes (procédures et fonctions). En fait, c’est l’équivalent d’un programme, à la grosse
différence près que le module ne possède pas forcément de programme principal. (Concrètement,
un module sera un fichier source sur votre disque, tout comme un programme.)
L’intérêt d’un module, c’est d’être utilisé par un programme. Cela permet la réutilisabilité du code :
si vous vous spécialisez dans la conception d’activités bancaires, vous aurez toujours besoin du type
Compte et des sous-programmes ouverture, fermeture, crédit et débit.
La solution la moins efficace consiste à réécrire (ou ajouter par copier/coller) ces type et sous-
programmes dans chaque programme que vous allez écrire. Cette solution n’est pas terrible car si
vous souhaitez modifier le type Compte ou la procédure ouverture, vous devrez modifier chacun
des programmes déjà écrits.
Le bonne idée, c’est de mettre les sous-programmes et le type Compte dans un module appelé
banque (ou n’importe quel autre nom intuitif). Chacun des projets en ayant besoin fera référence à
ce module. C’est alors comme si son contenu était inclus dans le programme.
Vous commencez sans doute à mieux cerner l’intérêt des modules : vous pouvez vous écrire (ou
acheter) des modules variés : un gérant les graphiques, un autre les sons, la souris, les calculs
scientifiques et financiers… En fonction des programmes que vous écrirez, vous utiliserez un ou
plusieurs de ces modules. Tout ce passe comme si vous vous dotiez d’extensions de VB.
3984 TG 49
Séquence 5 VB : présentation du langage
Clic droit
ici
3984 TG 50
Séquence 5 VB : présentation du langage
4 B. Types
4 B 1. Types intégrés
Voici les mots-clé définissant les différents types :
ALGORITHMIQUE VB
entier integer
réel single
booléen boolean
chaîne string
date date
Vous remarquerez que l’on se contente de traduire en anglais.
4 B 2. Types structurés
On utilise beaucoup les types personnalisés pour créer des types structurés (également appelés types
enregistrement). Rappelons brièvement ce que sont ces types.
Supposons que je veuille manipuler des clients (enfin, des variables modélisant des clients) dans un
programme. J’ai établi qu’un client, c’est :
– un numéro ;
– un nom ;
– un prénom ;
– une adresse ;
– un téléphone ;
– la date à laquelle il est devenu client.
Si je veux manipuler un client appelé Client1, je n’ai pas d’autre choix que de déclarer une variable
par propriété énumérée ci-dessus. Cela donne :
var
NumClient_Client1 : entier
NomClient_Client1 : chaîne
PrénomClient_Client1 : chaîne
AdrClient_Client1 : chaîne
TélClient_Client1 : chaîne
DateClient_Client1 : date
3984 TG 51
Séquence 5 VB : présentation du langage
– enfin, la modélisation de la réalité n’est pas très efficace. En effet, dans cette réalité, un
client n’est pas juste la réunion des six caractéristiques que j’ai énumérées : un client, c’est
un client.
Je souhaiterais pouvoir définir un type Client contenant toutes les caractéristiques qui m’intéressent.
Je pourrais alors déclarer mes variables client ainsi :
var
Client1, Client2, Client3, Client4 : Client
Pour faire cela, on introduit le concept de type structuré, à savoir type contenant d’autres variables.
En algorithmique, on le définit ainsi :
type
nom = structure
variable1 : type1
variable2 : type2
...
variablen : typen
fin structure
Les variables constituant le type sont appelées des champs. Toute variable d’un type structuré
possède tous les champs définis dans le type. L’ordre des champs dans la structure n’a aucune
importance.
Notre type Client sera défini ainsi :
type
Client = structure
Num : entier
Nom : chaîne
Prénom : chaîne
Adr : chaîne
Tél : chaîne
DateClient : date
fin-structure
Il devient inutile de suffixer chaque champ par _Client car nous sommes dans la structure. Pour
accéder au champ Nom de la variable Cl1 (de type Client), j’écrirai [Link].
Traduire cela sous VB ne sera pas très difficile : allez dans l’aide de VB et cherchez le mot clé type.
Cela vous donnera la syntaxe à utiliser.
Exercice 10
Définissez le type Client ci-dessus, cette fois avec la syntaxe VB. Ne le faites pas encore
dans un programme, écrivez-le à la main.
Exercice 11
Nous allons tester cela sous VB. Nous restons en mode console. Faites-en une nouvelle
comme nous l’avons vu ci-dessus puis déclarez le type Client après Option Explicit.
Exécutez votre programme. Si tout est correct, il ne se passera rien puisqu’il n’y a pas de
code. Si vous avez une erreur quelconque, le compilateur vous la signalera. Essayez alors de
la corriger avant d’aller lire la correction.
4 C. Variables
Une variable est déclarée en donnant son nom et son type, le mot-clé as séparant les deux. Toutes
les déclarations sont précédées du mot-clé dim (indiquant justement que l’on déclare des variables).
Les déclarations de variables sont faites après celles des types (s’il y en a) et avant tout sous-
programme (si l’on déclare des variables globales).
3984 TG 52
Séquence 5 VB : présentation du langage
Exercice 12
Déclarez i et j (deux entiers) et Cl (un client du type précédent) dans notre programme.
Exécutez-le pour vérifier que la syntaxe est correcte.
Lorsque plusieurs déclarations de variable se suivent, on peut les déclarer sur une ligne avec un seul
mot-clé dim et en les séparant par des virgules.
En reprenant l’exercice précédent, on obtient :
dim i as integer, j as integer, Cl as Client
Attention à l’erreur classique sous VB : la déclaration de plusieurs variable d’un coup avec le même
type n’est pas possible comme cela se fait sous Delphi et C.
Ainsi, l’écriture suivante est incorrecte :
dim i, j as integer
En effet, vous croyez déclarer deux entiers i et j ? Eh bien non ! Vous déclarez une variable j qui est
entière et une variable i sans type (donc de type variant).
Je vous conseille de déclarer toujours vos types avant les variables. Cela ne changera rien au
fonctionnement du code mais il est plus logique de déclarer les choses avant de les utiliser.
La règle est donc de déclarer tous les types puis les variables.
Le côté fastidieux ne vous échappe pas : il faut écrire « Client1. » de nombreuses fois. Si la
structure était incluse dans une autre et/ou dans un tableau, on aurait une expression encore plus
longue à répéter. Non seulement c’est long à écrire, mais ce n’est pas très lisible.
Tous les langages possèdent une instruction permettant de factoriser un nom de structure. Sous VB,
c’est with.
La syntaxe est la suivante :
With NomStructure
// les champs de la structure NomStructure
// n’ont pas à être préfixés par « NomStructure. »
// mais seulement par le « . » rappelant qu’ils viennent d’une structure
End With
1
Une chaîne s’encadre avec le caractère guillemet (« " », touche 4 du clavier). Comme la chaîne est vide, elle
commence par un guillemet, puis se termine immédiatement, d’où un autre guillemet.
3984 TG 53
Séquence 5 VB : présentation du langage
With Client1
.Num = 0
.Nom = ""
.Prénom = ""
.Adr = ""
.Tél = ""
.DateClient = 0
End With
4 E. Tableaux
4 E 1. Déclarations
La syntaxe du VB est intéressante car vous pouvez spécifier vos indices de trois façons :
− en donnant l’indice de début et celui de fin ;
− en donnant l’indice de fin, le premier ayant implicitement l’indice 0 ;
− en donnant l’indice de fin, le premier ayant implicitement l’indice 1 ;
Sous VB, nous utiliserons des parenthèses pour encadrer les indices.
Voici la syntaxe générale de déclaration de tableau appelé NomTableau et contenant des éléments
de type type, les indices allant de IndiceDébut à IndiceFin :
dim NomTableau(IndiceDébut to IndiceFin) as type
revient à :
dim Tab3(0 to 50) as integer
revient à :
dim Tab4(1 to 50) as integer
Conseil :
Bon, je vous conseille de toujours utiliser la syntaxe explicite en mentionnant les deux bornes. C’est
plus clair.
3984 TG 54
Séquence 5 VB : présentation du langage
La borne implicite est toujours possible. Par exemple, t2 peut être déclaré ainsi :
option base 1
dim t2(10, 10) as integer
Exercice 13
Continuons notre programme console avec les clients. Définissez un tableau contenant 10
clients.
1
Je ne résiste pas au plaisir de vous citer un passage du livre Poésie de l’informatique de Milan Goldoniok :
Oh, variable locale à la procédure,
Tellement éphémère est ton règne,
Sitôt commencée, sitôt terminée la procédure,
Sitôt née, sitôt morte la variable.
3984 TG 55
Séquence 5 VB : présentation du langage
4 F 3. Public et private
Nous avons établi que les variables locales à un sous-programme ne peuvent être, justement, que
locales à ce sous-programme. On ne précise donc jamais leur portée.
Pour définir un élément local au module (donc utilisable dans le module où est la déclaration
uniquement), on précède sa déclaration du mot clé private.
Pour définir un élément global au projet (donc utilisable dans tous les modules du projet), on
précède sa déclaration du mot clé public.
Lorsque l’on précise la portée d’une variable avec l’un de ces mots clé, il remplace dim.
Si la portée de l’élément n’est pas définie, il sera public donc accessible dans tout le projet.
Les règles de programmation conseillent de ne rendre les éléments publics que lorsque c’est
nécessaire. Il est donc préférable de mettre systématiquement private, sauf de façon motivée lorsque
l’on veut que l’élément soit global.
Reprenons notre programme avec le client. Comme je n’ai qu’un module, des déclarations
publiques n’ont pas trop de sens. Je déclare donc tout en privé :
01 Option Explicit
02
03 Private Type Client
04 Num As Integer
05 Nom As String
06 Prénom As String
07 Adr As String
08 Tél As String
09 DateClient As Date
10 End Type
11
12 Private i As Integer, j As Integer, Cl As Client
13 Private TabCl(1 To 10) As Client
14
15 Private Sub main()
16 With Cl
17 .Num = 0
18 .Nom = ""
19 .Prénom = ""
20 .Adr = ""
21 .Tél = ""
22 .DateClient = 0
23 End With
24 End Sub
1
\ et mod correspondent à la division entière. \ est le quotient, mod le reste. Par exemple :
– 5\2=2;
– 5 mod 2 = 1.
3984 TG 56
Séquence 5 VB : présentation du langage
se traduit par
MsgBox (expression1 & expression2 & expressionn)
En fait, MsgBox ne prend qu’un paramètre à afficher. Pour en afficher plusieurs, je les concatène
avec l’opérateur &. Cette instruction possède d’autres paramètres (voir l’aide).
Par exemple, les instructions suivantes sont équivalentes :
MsgBox ('Bonjour' & ' les ' & 'amis');
MsgBox ('Bonjour les amis')
Ne vous inquiétez pas si ce n’est pas clair, dès que vous ferez un programme, et cela ne va pas
traîner, cela deviendra évident.
Notez dès maintenant que tous les appels de sous-programmes internes à VB ont leurs paramètres
mis entre parenthèses.
Nous verrons que les sous-programmes définis par l’utilisateur ne doivent pas avoir leurs
paramètres encadrés de parenthèses quand on les appelle.
5 B. Saisie
L’instruction
saisir chaîne, variable
se traduit par :
variable = InputBox (chaîne)
Vous aurez noté que l’instruction algorithmique Saisir devient une fonction sous VB.
Exercice 14
Écrivez et testez un programme VB permettant de saisir puis d’afficher le nom de deux
clients :
– un client stocké dans une variable indépendante Cl de type Client ;
– le 5e client de notre tableau TabCl.
Vous devez évidemment partir de notre programme console de l’exercice précédent. Les
lignes de code doivent être écrites entre le Private Sub Main et le End Sub.
5 C. Affectation
On utilise le caractère « = », à ne pas confondre avec le comparateur « = » (ces deux mots clé sont
donc homonymes).
3984 TG 57
Séquence 5 VB : présentation du langage
6. Instructions de contrôle
En algorithmique, on a toujours un mot de début et un de fin pour chacune de ces instructions : si…
fin si, tant que… fin tant que, pour… fin pour.
Ce principe est le même avec VB.
Nous allons voir tout cela.
6 A. Les tests
6 A 1. le si
If booléen then
instruction1
instruction2
…
instructionn
else
instruction1
instruction2
…
instructionn
End If
Notez que :
– le mot clé then doit être sur la même ligne que le if ;
– la branche else est facultative.
Exercice 15
Sachant que les chaînes de caractères se comparent exactement comme des nombres (c’est
l’ordre alphabétique qui est utilisé), modifiez le programme précédent pour qu’il vous
demande deux noms (celui du client autonome et celui du 5e du tableau) puis qu’il affiche les
deux noms dans l’ordre alphabétique.
6 A 2. Le selon cas
C’est l’instruction select case. Je vous laisse le soin d’étudier l’aide pour découvrir sa syntaxe.
6 B. Les boucles
Nous sommes encore très proches de l’algorithmique. Ce n’est donc pas très difficile.
6 B 1. Pour
L’instruction algorithmique
pour variable de entier1 à entier2 pas entier3
instruction1
instruction2
…
instructionn
fin pour
3984 TG 58
Séquence 5 VB : présentation du langage
Exercice 16
Écrivez un programme affichant successivement les nombres 2, 4, 6, 8 puis 10.
6 B 2. Répéter
L’instruction algorithmique
répéter
instruction1
instruction2
…
instructionn
jusqu’à booléen
6 B 3. Tant que
L’instruction algorithmique
tant que booléen faire
instruction1
instruction2
…
instructionn
fin tant que
se traduit en VB ainsi :
Do While booléen
instruction1
instruction2
…
instructionn
Exit Do
3984 TG 59
Séquence 5 VB : présentation du langage
se traduit en VB ainsi :
Do Until booléen
instruction1
instruction2
…
instructionn
Exit Do
3984 TG 60
Séquence 5 VB : présentation du langage
7. Les sous-programmes
Les procédures et les fonctions s’écrivent avant le programme principal (sub Main) partant du
principe qu’il est plus logique de déclarer avant d’utiliser. C’est donc un conseil et non une
obligation.
7 A. Paramètres
Chaque paramètre est suivi de « as » et de son type puis d’une virgule (« , ») si l’on a d’autres
paramètres. On met le mot-clé ByVal si le paramètre est passé par valeur. (Par défaut, il est passé
par adresse. Le mot clé ByRef explicitant le passage par adresse est donc facultatif.)
Exemple :
(a as integer, ByVal i as integer, ByVal j as integer, k as integer, l as integer)
Ici, a, k et l sont passés par adresse (j’omets le ByRef qui n’apporte rien) et i et j par valeur.
J’insiste sur le fait qu’il n’est pas possible de regrouper le mode de passage ou le type du paramètre.
Ainsi,
(ByVal i, j as integer, ByRef a, k, l as integer)
n’a rien à voir avec la déclaration précédente puisque ici :
– i est un variant passé par valeur ;
– j est un entier passé par adresse ;
– a et k sont des variants passés par adresse ;
– l est un entier passé par adresse.
Soyez donc très prudent sur ces déclarations : elles ne correspondent pas à ce que vous pensez ou
souhaitez mais elles ne produiront pas d’erreur puisqu’elles sont valides.
Lorsque vous passez un tableau en paramètre, vous ne devez pas mentionner sa taille. Vous écrirez
donc par exemple ByRef T() as integer. Les tableaux ne peuvent pas être passés par valeur.
7 B. Procédures
On remplace procédure par sub et c’est tout ! Vous définirez les paramètres comme ci-dessus et
n’oublierez pas de précéder la déclaration de private ou public.
La syntaxe sera :
Private Sub Nom (paramètres)
Dim
// variables locales
instruction1
instruction2
…
instructionn
End Sub
La procédure commence par Sub et se termine par End Sub. Vous noterez que j’ai sauté une ligne
entre les déclarations de variables et le code. Ce n’est pas obligatoire mais améliore la lisibilité.
Exercice 17
Dans notre petit programme console, écrivez une procédure permettant de saisir un client
quelconque (l’utilisateur doit saisir une valeur pour chaque champ).
3984 TG 61
Séquence 5 VB : présentation du langage
Exercice 18
Écrivez une autre procédure permettant d’afficher un client passé en paramètre. Écrivez
ensuite un programme principal testant la procédure de saisie et celle d’affichage.
7 C. Fonctions
7 C 1. La syntaxe
Pour la traduction anglaise, ce sera function au lieu de fonction ; la variable résultat sera le nom de
la fonction et non plus Résultat. Pour les paramètres, voir 7.A !
La syntaxe sera :
Private Function Nom (paramètres) as type
dim
// variables locales
instruction1
instruction2
…
instructionn
Nom = …
End Function
Attention, initialiser le nom de la fonction pour déterminer son résultat est une convention. Le nom
ne correspond pas à une vraie variable. Je vous conseille donc de ne faire qu’une affectation au nom
de la fonction, quitte à utiliser une variable intermédiaire pour calculer le résultat à renvoyer.
i = Teckel(3, True)
MsgBox (Teckel(i, False))
End Sub
7 D 2. La procédure
VB propose deux techniques pour appeler une procédure définie par l’utilisateur :
– avec le mot clé call, le nom de la procédure et les paramètres sans parenthèse ;
– avec le nom de la procédure et les paramètres entre parenthèses.
Démonstration.
Private Sub Apprécier(Race As String, b As Boolean)
If b Then
MsgBox ("J'aime les " & Race)
Else
3984 TG 62
Séquence 5 VB : présentation du langage
Exercice 19
Écrivez une fonction renvoyant le nombre de jours écoulés depuis qu’un client passé en
paramètre est client. Vous aurez besoin de la fonction Date renvoyant la date du jour. Vous
devrez sans doute aller consulter l’aide pour savoir comment réaliser des calculs sur les dates.
Testez votre fonction dans notre programme précédent.
7 E. Les limitations
Certaines fonctions algorithmiques deviennent des procédures sous VB. En effet, une fonction VB
ne sait renvoyer qu’un type de base (entier, réel, booléen…). Pour renvoyer des tableaux ou des
structures, on utilise raisonnablement une fonction en algorithmique mais il faut écrire une
procédure en VB, cette dernière possédant au moins un paramètre passé par adresse pour
représenter le résultat.
Exercice 20
Ah, nous avons oublié de travailler sur notre tableau de clients. Je vous demande donc
d’écrire sous VB (toujours dans le même programme) :
– une procédure SaisieClientTableau permettant de saisir un client du tableau (lequel ?
ce sera un paramètre) ;
– une procédure AffichageClientTableau affichant un client du tableau (lequel ? ce sera
un paramètre).
Vous testerez vos sous-programmes en saisissant puis en affichant le 5e client du tableau.
3984 TG 63
Séquence 5 VB : présentation du langage
8 B. Le programme
Lorsque vous affichez une chaîne de caractères avec l’instruction MsgBox, elle s’affiche assez
sobrement :
writeln ('Salut')
s’affichera ainsi :
Je suis en train d’écrire un programme affichant pas mal de choses et j’aimerais disposer d’un
affichage plus visuel. Nous serions en programmation événementielle, la question ne se poserait pas
puisque je pourrais changer la couleur, la police, la taille ou la mise en forme de mon texte sans
problème. Dans cette séquence, nous nous limitons à une application console ; je n’ai donc aucun
effet visuel à ma disposition. Je vais faire le maximum en ajoutant une étoile avant et après mon
texte (un espace séparant les étoiles et le texte pour plus de lisibilité).
Je vais donc écrire une procédure MsgBoxÉtoile qui, lorsqu’on écrira :
MsgBoxÉtoile ('Salut')
affichera à l’écran
Notez qu’un paramètre devant être d’un type donné, ma procédure ne pourra afficher qu’un seul
type de données. Je choisis d’afficher des chaînes de caractères.
3984 TG 64
Séquence 5 VB : présentation du langage
Encore une fois, je vous concède que cette mise en relief est d’un autre âge. S’il y a bien un
domaine dans la vie où l’on ne peut pas dire sans monstrueuse hypocrisie que c’était mieux avant,
c’est bien l’informatique1.
Exercice 21
Finalement, ce n’est pas moi, mais vous qui allez écrire cette procédure (c’est trivial).
Écrivez ensuite un programme appelant cette procédure et affichant un texte saisi par
l’utilisateur en l’encadrant d’étoiles.
Finalement, mon affichage est sympathique, mais je sens ma fibre artistique réclamer encore plus.
Mon objectif est de transformer MsgBoxÉtoile pour obtenir ce genre de résultat :
MsgBoxÉtoile ('Salut')
affichera à l’écran
Exercice 22
Alors là, c’est un peu moins simple à réaliser car le nombre d’étoiles à afficher en haut et en bas
dépend de la longueur de la chaîne passée en paramètre. Je vous donne donc une information et
une consigne :
− VB possède une fonction len (ch : string) : integer prenant en paramètre une chaîne de
caractères et renvoyant sa longueur ;
− je vous demande d’écrire une fonction LigneÉtoile renvoyant une chaîne constituée d’un
nombre d’étoiles passé en paramètre. Vous utiliserez LigneÉtoile dans MsgBoxÉtoile en
concaténant les lignes d’étoiles au message à afficher.
Vous testerez tout cela avec votre programme précédent.
Bien.
L’affichage obtenu est tellement sublime que j’ai envie de m’en servir dans tous mes programmes
console. Cela sera en quelque sorte ma griffe. Comment faire ? Il y a deux techniques :
– par un copier/coller, j’ajoute systématiquement les deux procédures LigneÉtoile et
MsgBoxÉtoile à tous mes programmes. C’est un peu fastidieux et, si je veux un jour
modifier ce style d’affichage pour réaliser un encadrement double par exemple, je devrai
reprendre les programmes un à un ;
– seconde solution, je vais créer un module Étoile contenant mes deux procédures. Tout projet
voulant s’en servir n’aura qu’à référencer ce module. Pour modifier mon encadrement, je
n’aurai qu’à modifier le nouveau module (et tout de même à recompiler les programmes qui
s’en servent). Attention aux priorités !
Je ne vous cache pas que nous allons mettre en œuvre la seconde solution.
1
Quoique, en se forçant, on y arrive : l’informatique sous Dos, très rustique, plantait beaucoup moins que les savantes
horlogeries, subtiles et souvent déréglées, de la programmation Windows.
3984 TG 65
Séquence 5 VB : présentation du langage
8 C. Le module
Exercice 23
Ajoutez un nouveau module au projet et déplacez-y le code nécessaire. Le programme s’en
trouve nettement raccourci !
Exercice 24
Modifiez le module Etoile en conséquence et recompilez le programme : cela marche.
Voilà. Vous savez créer, utiliser et modifier un module. Nous nous en resservirons plus tard.
3984 TG 66
Séquence 5 VB : présentation du langage
9. Compléments
9 A. Débuggeur
On retrouve les fonctionnalités habituelles : la pose de point d’arrêt, l’évaluation ou la modification
de variables en cours d’exécution, les modes pas à pas et pas à pas approfondi. Tout cela se trouve
dans le menu Débogage.
Des outils encore plus pointus sont également disponibles dans ce menu : points d’arrêt
conditionnels, points de suivi… nous verrons cela dans la séquence suivante.
9 B. Exercice d’application
Exercice 25
Vous allez écrire un programme résumant toute cette séquence. Il s’agit de trier un tableau
de vingt entiers. Je vous demande de faire des sous-programmes pour :
− saisir le tableau. Pour pouvoir tester rapidement le programme, vous initialiserez les
éléments avec des valeurs aléatoires en utilisant la fonction Rnd (voir l’aide VB pour
la syntaxe) ;
− afficher le tableau ;
− trier le tableau. Je vous laisse le choix de la méthode. Comme vous êtes sensé
connaître tout ce qui est algorithmique, ce savoir ne doit pas vous échapper.
N’hésitez pas à reprendre les sous-programmes des exercices précédents si vous en avez
besoin. N’oubliez pas qu’il faut impérativement définir un type tableau.
Faites tout dans un seul module.
3984 TG 67
Séquence 6
Le débuggeur
Le débuggeur est un outil indispensable que nous allons découvrir maintenant.
Contenu
Le débuggeur
Capacités attendues
Savoir l’utiliser
3984 TG 69
Séquence 6 Le débuggeur
1. Le débuggeur
1 A. Les phases finales du cycle de développement
Le préfixe dé est privatif. Ainsi, défaire signifie « Changer une chose de manière qu’elle cesse
d’être faite (Le petit Robert) ».
De la même façon, débuguer signifie enlever les bugs. L’outil adapté à cette fonction est le
débuggeur1.
Au fait, qu’est-ce qu’un bug ? Je vous passe la justification historique du terme. En
informatique moderne, un bug est un terme poli pour évoquer une erreur de conception. Il y
en a de toutes sortes :
− une instruction oubliée (on ne contrôle pas si le tableau est vide avant de le
manipuler) ;
− un test erroné (i <= 0 au lieu de i < 0) ;
− l’accès possible à une commande depuis l’interface graphique alors que cette
commande est illogique dans le contexte ;
− …
Pour résumer, tout ce qui entraîne un disfonctionnement du programme par rapport au cahier
des charges est un bug.
Si l’on emploie un terme poli (bug est moins agressif qu’erreur), c’est parce que le bug est
assez fréquent. Même un très bon programmeur en fait. Allons plus loin encore : lorsque les
erreurs les plus évidentes ont été corrigées, il devient trop coûteux de chercher les bugs
pointus. On livre alors le produit au client qui, à l’usage, détectera les bugs. Vous
développerez ensuite des patchs (mises à jour) corrigeant les bugs détectés (et hélas, en
introduisant parfois d’autres).
C’est la même chose pour ce cours que vous êtes en train de lire. Après l’avoir écrit, je l’ai
relu attentivement trois fois. Au vu du nombre de pages, vous reconnaîtrez que ces trois
relectures sont un travail en soi ! À quoi servent-elles ? À débusquer toutes les erreurs :
− algorithmes faux (contenant des bugs) ;
− fautes de français (orthographe, grammaire) et phrases peu claires ;
− renvois erronés…
À la première relecture, je fais quatre ou cinq corrections par page. À la seconde, une par
page. À la troisième, une toutes les deux à trois pages.
Si je faisais une quatrième relecture, je trouverais certainement une faute toutes les dix pages
(d’autant qu’il arrive fréquemment que la correction d’une erreur en entraîne une autre). Je ne
fais pas cette nouvelle relecture car j’estime qu’elle n’est pas rentable : le temps que j’y
passerais est trop long pour ne trouver qu’une quarantaine de fautes sur l’ensemble du cours.
Attention, le fait qu’il y ait ne serait-ce qu’une faute dans tout le support m’ennuie. Mais bon.
Avoir quatre ou cinq fautes par page, c’est lamentable. En avoir une toutes les dix pages, c’est
une coquille tout à fait excusable.
Revenons à notre programme. Sous traitement de texte, on parlera de coquilles (et non
d’erreurs) si elles sont raisonnablement peu nombreuses. De même, dans un programme, on
parlera de bugs et non d’erreurs si, dans l’ensemble, le programme fonctionne correctement.
En revanche, si un traitement central de l’application est manifestement erroné, cela ne va pas
du tout.
1
En français, on parle de bogues que l’on élimine en déboguant le programme avec un débogueur. C’est le
débogage.
3984 TG 70
Séquence 6 Le débuggeur
3984 TG 71
Séquence 6 Le débuggeur
2. Utilisation du débuggeur
Le débuggeur est un outil systématiquement associé aux compilateurs modernes (C, Delphi,
Java, VB…). Je vais vous présenter celui de VB 6, sachant que vous retrouverez exactement
les mêmes fonctionnalités dans tous les autres langages.
Le débuggeur est toujours disponible, aucune manipulation particulière n’est nécessaire.
2 A. Le programme support
Créez un nouveau projet et faites-en une application console. Tapez alors le code suivant dans
le module.
Voici le programme :
Option Explicit
For i = 1 To 50
T(i) = Rnd
Next
End Sub
Inf05= 0
Sup05= 0
For i= 1 To 50
IfT(i) < 0.5 Then
Inf05 = Inf05 + 1
Else
Sup05 = Sup05 + 1
End If
Next
End Sub
Sub Main()
Dim Nbr1 As Integer, Nbr2 As Integer
Dim T(1 To 50) As Single
Call Init(T)
Call Compte(Nbr1, Nbr2, T)
MsgBox ("Nbr < 0,5 = " & Nbr1 & " Nbr > 0,5 = " & Nbr2)
End Sub
Notez que c’est une application console donc le programme principal est la procédure Main
(en gras).
Que fait ce programme ? Rien de bien original, il remplit un tableau de 50 valeurs réelles
aléatoires comprises entre 0 et 1 (procédure Init) puis affiche les nombres de valeurs
inférieures à 0,5 et supérieures à 0,5 du tableau (procédure Compte).
Arrivé à ce stade de votre formation, vous devez comprendre ce source sans aucune difficulté.
Exécutez le programme pour vérifier qu’il fonctionne. La somme des deux nombres affichés
doit être égale à 50.
3984 TG 72
Séquence 6 Le débuggeur
Posez un point d’arrêt sur une instruction quelconque. Il sera explicitement signalé par une
ligne et une pastille rouge :
Pastille matérialisant
le point d’arrêt
Une troisième façon de poser un point d’arrêt consiste à cliquer dans la bande verticale grise à
gauche du source (là où est actuellement la pastille) sur la ligne d’une instruction.
Pourquoi la commande s’appelait Basculer et non simplement Pose ? Tout simplement car
pour enlever un point d’arrêt, il suffit de répéter la manœuvre de pose. Vous êtes sur une
instruction, faites F9, le point d’arrêt est posé, refaites F9, le point d’arrêt est supprimé.
Exécutez le programme avec le même point d’arrêt que moi. Que se passe-t-il ? On ne le voit
sans doute pas très bien sur cette copie d’écran monochrome :
mais sur votre écran, cela doit être visible. En surimpression du point d’arrêt en rouge, il y a
du jaune fluo. La pastille contient une flèche jaune.
Le surlignage en jaune fluo avec sa petite flèche indique la ligne (l’instruction) qui va être
exécutée. Ici, on vient d’exécuter Inf05 = 0 et on va exécuter Sup05 = 0. Le point d’arrêt a
joué son rôle : il a interrompu l’exécution.
2 C 1. Info-bulle
Pour avoir rapidement la valeur d’une variable, il me suffit de placer le curseur dessus et
d’attendre quelques instants. Sa valeur s’affiche dans une info-bulle :
Je n’ai évidemment accès qu’aux variables disponibles là où je suis (soit ici aux variables
locales à la procédure et à ses paramètres).
Mettez votre curseur sur le T de T(i) pour obtenir sa valeur. Voici ce que vous obtenez :
3984 TG 73
Séquence 6 Le débuggeur
2 C 2. L’espion
L’info-bulle est pratique pour avoir ponctuellement et rapidement une valeur. On peut mettre
en place un mécanisme plus lourd, l’espion. Il va espionner (suivre) une variable tout au long
du programme en vous affichant en permanence sa valeur.
Pour placer un espion, cliquez sur la variable à espionner puis menu Débogage/Ajouter un
espion… Vous obtenez cette fenêtre :
Si vous lancez la commande
sans être sur une variable,
vous n’avez qu’à remplir cette
zone de texte.
C’est également utile si
l’expression proposée n’est
pas ce que vous souhaitez.
Je vous laisse le soin d’étudier les différents types d’espions. Celui qui m’intéresse est
Expression espionne. Faites OK. Vous obtenez alors une nouvelle fenêtre Espions :
Cette fenêtre contient tous les espions du programme (pour le moment, il n’y en a qu’un).
Pour changer la valeur de la variable espionnée, cliquez sur sa valeur (ici 0) et changez-la.
Faites les opérations suivantes :
− définissez un espion sur Sup05 ;
− modifiez les valeurs d’Inf05 et Sup05 pour qu’elles valent 5 ;
− définissez un espion sur i ;
− définissez un espion sur T(i) ;
− définissez un espion sur T.
Vous aurez sans doute besoin de définir vous-même la valeur Expression dans la fenêtre
Ajouter un espion pour certains d’entre eux. Autre technique : vous sélectionnez l’expression
à espionner et vous définissez un espion express (raccourci Shift+F9).
Voici alors l’état de la fenêtre Espions :
variables (et c’est vrai puisque le tableau T contient 50 éléments). Pour avoir le contenu
complet, vous pouvez cliquer sur le +.
Vous en profiterez pour changer les valeurs de T(1) et T(2) qui vaudront respectivement 0,01
et 0,99. Attention, il faudra taper ces valeurs au format américain, soit 0.01 et 0.99. La
différence ? Un point et non une virgule pour indiquer les décimales.
Voici le résultat :
Vous pouvez réduire T en cliquant sur le – qui le précède. Vous retrouverez le + avec les
variables structurées.
Ces quatre modes d’avance sont assez parlants. Consultez l’aide pour plus de détails. Ce qui
m’intéresse ici est le plus classique, le mode Pas à pas détaillé qui s’arrête sur chaque
instruction. Notez son raccourci clavier F8.
Appuyez donc sur F8 et observez les changements.
Dans le source :
La ligne surlignée est descendue d’une instruction. Cela signifie que Sup05 = 0 a été exécutée
et que l’instruction en attente est maintenant la boucle For.
Dans la fenêtre Espions :
Les espions reflètent fidèlement la valeur de leur expression sous-jacente. On peut donc
suivre au jour le jour (ou plutôt instruction après instruction) leur valeur.
On voit que Sup05 vaut maintenant 0. C’est normal : il valait 5, puis on a exécuté Sup05 = 0.
Sa valeur a donc été mise à 0.
3984 TG 75
Séquence 6 Le débuggeur
Faites encore F8. L’exécution de la boucle For a lieu, ce qui initialise i à 1. L’espion T(i) peut
alors afficher une valeur :
Continuez à exécuter l’application instruction par instruction, tout en surveillant d’un œil le
code source et la ligne courante surlignée qui bouge (observez notamment ce qui se passe
lorsqu’une itération de For a été faite) et d’un autre œil la fenêtre des espions. Vérifiez la
mise à jour de Inf05 et Sup05 en fonction de T(i).
3. Conclusion
Vous savez maintenant utiliser le débuggeur. Lorsqu’un de vos programmes ne fonctionne
pas comme il le devrait, essayez de localiser l’erreur à la main. C’est très formateur !
Si cette recherche ne donne rien, exploitez le débuggeur.
Il est évident qu’un bon développeur doit parfaitement maîtriser l’usage de cet outil. N’hésitez
donc pas à le mettre en avant lors de l’épreuve pratique. C’est bien utile pour illustrer le
fonctionnement d’un programme.
3984 TG 76
Travaux dirigés 1 : travail sur
l’interface
L’objet des exercices qui suivent est de mettre en œuvre de façon systématique les
concepts vus dans le cours pour que cela devienne un automatisme.
Plus que de simples exercices d’application, ils sont plutôt un complément de cours.
Ne les bradez pas !
Enfin, faites les exercices dans l’ordre, la difficulté étant croissante.
Nous allons travailler de nouveau sur notre programme avec les clients. Cette fois, nous
ferons moderne avec une interface graphique.
Votre travail consistera avant tout à générer le formulaire et à faire du copier/coller du code
que nous avions écrit dans les différents événements.
Exercice 1 : Affichage
Faites une interface graphique permettant à l’utilisateur de saisir les différentes
caractéristiques d’un client.
Il vous faudra autant de zones de texte que de champs dans la structure.
3984 TG 77
Travaux dirigés 1 Travail sur l’interface
3984 TG 78
Séquence 7
Les contrôles
Nous allons étudier les principaux contrôles visuels proposés par VB.
Contenu
Rôle des différents contrôles.
Exploiter les contrôles indépendants.
Capacités attendues
Savoir créer tout type de feuille.
3984 TG 79
Séquence 7 Les contrôles
1 A. Rappels
Nous avons vu que tous les objets et en particulier les contrôles possèdent des propriétés accessibles
par l’inspecteur d’objets. Certaines propriétés sont communes à tous les contrôles, d’autres sont
spécifiques à un seul. Voici quelques exemples de ce que l’on peut paramétrer pour chaque
contrôle :
– sa taille et sa position dans la feuille (propriétés Top, Left, Height et Width). On ne modifie
jamais à la main ces propriétés : c’est en déplaçant ou en redimensionnant le contrôle à la
souris qu’elles sont mises à jour ;
– la couleur du fond ou de la police (propriétés BackColor et ForeColor) ;
– le fait qu’il soit visible ou non (propriété Visible) ;
– le fait que l’on puisse modifier le contenu de sa zone de saisie (propriété Locked1).
Lorsque vous posez un contrôle sur une feuille, ses différentes propriétés sont initialisées à des
valeurs par défaut. (Par exemple, tous ont par défaut leur propriété Visible à True et Locked à
False.) Vous devez alors modifier les propriétés selon vos souhaits pour obtenir le contrôle adapté à
vos besoins.
Il est temps de rentrer dans le détail des contrôles. Pour chacun d’eux, nous allons voir :
− dans quel cas l’utiliser. En effet, chaque contrôle a une forme ou une caractéristique propre
qui le rend plus efficace dans la saisie d’un type de données ; par exemple, pour saisir une
valeur booléenne (oui ou non), on peut demander à l’utilisateur de taper au clavier soit oui,
soit non. C’est lamentable, mais techniquement, c’est correct. On peut également utiliser une
case à cocher, qui est le composant fait pour cela ;
− comment il fonctionne ;
− comment le paramétrer (c’est-à-dire remplir ses propriétés).
Je vous préviens que je ne compte absolument pas être exhaustif. Il est possible de faire plusieurs
pages par contrôle. Mais ce que je dirais alors, vous le trouverez dans l’aide. Je ne vais donc donner
que les éléments essentiels.
De même, nous n’allons pas voir tous les contrôles de VB, mais seulement ceux de base.
Vous devrez compléter ce cours par la pratique et l’étude de l’aide. Un exemple ? Chaque contrôle
(en fait, chaque objet : feuille, contrôle…) possède de très nombreuses propriétés. Nous verrons
celles qui sont essentielles, mais pour toutes les autres, vous devrez consulter l’aide pour découvrir
leur rôle. L’idée n’est pas d’apprendre par cœur toutes les propriétés, mais de savoir trouver dans
l’aide celles dont on a besoin.
Attention ! Si vous ne le faites pas, vous ne percevrez pas tout le potentiel des contrôles. Des choses
qui vous sembleront impossibles à faire pourront l’être par des propriétés que vous ne connaissez
pas. Comprenez bien que les propriétés caractérisent les objets. De façon naturelle, on peut donc se
douter que toutes les caractéristiques intéressantes (utiles) sont représentées par des propriétés.
Notez que les contrôles ne sont pas inventés par VB : tous proviennent du système d’exploitation
Windows. Ainsi, quelle que soit l’application Windows utilisée (Word ou une application VB que
vous avez développée), on retrouve une interface uniforme. Lorsque vous voyez une liste
1
Locked signifie verrouillé.
3984 TG 80
Séquence 7 Les contrôles
modifiable, vous savez que vous devez choisir une valeur parmi une liste (par exemple, la liste
modifiable pour saisir une police sous Word). Lorsque vous voyez une case à cocher, vous savez
que vous pouvez ou non activer quelque chose (par exemple l’exposant dans la boîte de dialogue
Police sous Word).
Vous n’avez qu’à cocher les cases qui vous intéressent (oui, les noms ne sont pas toujours très
parlants) pour ajouter ceux qui vous intéressent. Avec Parcourir, vous pouvez ajouter n’importe
3984 TG 81
Séquence 7 Les contrôles
quel ocx présent sur votre disque. Notez que vous aurez peut-être sur votre écran une liste différente
de la mienne : cela dépend un peu de la configuration de votre système.
Allez faire un tour dans l’onglet Objets à insérer : cela vous permet d’ajouter des contrôles
Document Word, Classeur Excel… L’intérêt ? Eh bien, au lieu d’avoir une bête zone de texte dans
une feuille, vous pouvez disposer d’un document Word avec toutes les commandes Word de mise
en page !
Voici une sélection de divers composants (un fichier ocx peut contenir plusieurs contrôles) de
Microsoft que vous devez avoir avec VB 6. Je vous conseille de les ajouter et de les tester à vos
moments perdus pour bien voir ce que vous avez à votre disposition. Nous n’allons étudier que les
contrôles de base et ceux indiqués ci-dessous constituent souvent des variantes qui peuvent être
extrêmement utiles.
groupe bouton
zone de liste
zone de liste
modifiable
Les autres contrôles ne sont pas inintéressants… je vous laisse le plaisir de les étudier vous-même !
3984 TG 82
Séquence 7 Les contrôles
Notez que saisir une date avec un TextBox est possible (la preuve) mais c’est une très mauvaise idée
puisque ce contrôle autorise la frappe de n’importe quel caractère. Dans cette situation, il faut
utiliser un MaskEdBox1.
1
Ce contrôle, que nous pourrions traduire en boîte d’édition avec masque, est référencé comme Microsoft Masked
Edit Control… à ajouter avec Projet/Composants…
2
Cette procédure est en fait la procédure événementielle liée à l’événement Click du contrôle bouton. Or, tout
contrôle possède un événement Click. Cela signifie donc que tout contrôle peut exécuter du code lorsque vous
cliquez dessus. Le bouton est-il donc inutile ? Absolument pas, au contraire : son rôle est juste de lancer du code. Il
doit donc être utilisé lorsque vous voulez lancer du code sans rapport avec un autre contrôle.
3984 TG 83
Séquence 7 Les contrôles
Il est hors de question d’utiliser un autre contrôle, même si techniquement une zone de texte dans
laquelle on saisirait oui ou non permettrait la saisie. La leçon à retenir, c’est que tout contrôle peut,
si l’on se donne du mal, permettre de saisir tout type d’information. Mais, pour chacun de ces types,
un seul contrôle est naturellement adapté (est fait pour cela).
Autre exemple issu de Word (menu Format/Police…) :
Nous utilisons des cases à cocher (et non des boutons d’option) car les choix ne sont pas exclusifs :
du texte peut être à la fois en indice et en petites majuscules.
Cela dit, certains choix sont exclusifs deux à deux : on ne peut pas être à la fois Exposant et Italique
ou Barré et Barré double. Suis-je donc en train de renier tous mes principes ?
En appliquant strictement les règles d’emploi des contrôles, voici ce que l’on obtiendrait :
Que penser de cette présentation new style ? Ma foi, elle est nulle ! Certes, elle apporte beaucoup
d’informations sur le format d’affichage. Le texte peut être :
– soit barré, soit barré double, soit pas barré du tout (les boutons d’option grisés dans un
groupe indiquent qu’aucun choix n’est fait) ;
– soit en exposant, soit en indice, soit ni l’un ni l’autre ;
– soit normal, soit en petites majuscules, soit en majuscules ;
– soit en relief, soit en empreinte, soit ombré et/ou en contour.
Cela dit, ces informations sont d’un intérêt très limité et se paient au prix fort :
– la feuille a triplé de taille ;
– elle est beaucoup plus dense que la version originale ;
– j’ai dû utiliser des termes assez artificiels (position, aspect, autre) ou redondants (barré,
majuscules) pour nommer les groupes ;
– le choix assez complexe présenté dans le groupe Aspect m’a obligé à inclure un groupe dans
un autre et à mettre des cases à cocher. La sémantique est correcte : on peut être à la fois
Ombré et Contour. mais pas si on est Relief ou Empreinte. C’est donc académiquement
exact… mais très lourd.
Conclusion ? Eh bien, il faut respecter exactement les règles, y compris celle disant que toute règle
se transgresse si l’on possède une bonne raison !
Si la fenêtre Format/Police… de Word ne suit pas les règles d’ergonomie habituelles, c’est parce
que le faire n’apporterait rien, si ce n’est une feuille illisible.
3984 TG 84
Séquence 7 Les contrôles
J’ai dit que le groupe d’options contenait des boutons d’option. Vous devez en effet vous limiter à
ce seul contrôle car son fonctionnement est normalisé en ce sens : une seule option peut être choisie.
Si vous utilisez un groupe tout court, vous pourrez utiliser n’importe quel autre contrôle à l’intérieur
et obtenir ceci :
3984 TG 85
Séquence 7 Les contrôles
Ainsi, ne faites jamais les types de groupe d’options ci-dessus. Le fait que vous les trouviez plus
sympas n’est surtout pas un argument ! Le plus simple est donc d’utiliser systématiquement les
groupes d’options. Comme vous n’avez pas le choix du contrôle contenu, vous éviterez toute erreur.
Exercice 26
Réalisez une feuille contenant ce groupe d’options. L’option Poche doit être sélectionnée
par défaut (agissez sur sa propriété Value). La feuille doit aussi contenir un bouton. Lorsque
l’on clique dessus, il doit afficher avec MsgBox le choix actuel (Poche, Broché ou Relié).
Vous utiliserez une variable globale au module stockant le choix courant. Elle sera modifiée
à chaque clic sur un des boutons et c’est elle que le bouton affichera. Comment faire pour
que cette variable soit initialisée correctement à Poche ?
3984 TG 86
Séquence 7 Les contrôles
Comment régler notre problème au démarrage ? Il faudrait que la variable FormatLivre soit
initialisée à Poche (pour être cohérent vis-à-vis du choix par défaut) au démarrage de l’application
ou, au moins, avant que l’utilisateur ait eu l’opportunité de cliquer sur le bouton Format.
Il n’est pas possible d’initialiser une variable dès sa déclaration. Les lignes suivantes ne
fonctionneront pas sous VB : Quel drame, je ne marche pas !
On peut définir des constantes, mais une constante, cela est constant, n’est-ce pas, cela ne varie pas,
donc cela ne nous servirait pas à grand-chose.
Nous allons chercher un événement qui se déclenche au démarrage de l’application. Il sera donc lié
à la feuille.
Exercice 27
Cherchez, dans les différents événements liés à la feuille, celui qui pourrait régler notre
problème et utilisez-le.
Le principe va être de créer un groupe de contrôles. Attention à ne pas confondre ce groupe avec le
groupe d’options :
– le groupe (frame sous VB) est un contrôle visuel servant de conteneur de contrôles. Si ces
contrôles sont des boutons d’option, on parle de groupe d’options ;
– le groupe de contrôles est un concept algorithmique. Il revient à créer un tableau contenant
des contrôles, cela permettant d’accéder aux différents contrôles grâce à un indice. (Et qui
dit indice dit boucle !)
La première étape consiste à créer la feuille avec le groupe d’options :
3984 TG 87
Séquence 7 Les contrôles
Nous allons maintenant définir le groupe de contrôles. L’aide VB nous informe qu’un groupe de
contrôles est, je cite, « [un] ensemble de contrôles qui partagent les mêmes nom,type et procédures
d'événement. Chaque contrôle du groupe possède un numéro d'index qui lui est propre et permet de
déterminer quel contrôle reconnaît un événement donné ».
L’idée est la suivante :
– nos quatre boutons d’option vont être regroupés dans l’équivalent d’un tableau appelé par
exemple ChoixDurée ;
– je vais affecter un indice (numéro d’index) à chaque bouton d’options. Je pourrais utiliser 1,
2, 3 et 4, voire les nombres de 0 à 3 pour émuler la notion de tableau, mais je peux faire
mieux : je vais affecter à chaque bouton sa durée en mois puisque c’est ce qui m’intéresse
(ainsi, le bouton Semestriel aura comme indice 6) ;
– les événements qui s’appliquaient avant aux contrôles individuels s’appliquent maintenant
au groupe, à charge au code de réagir selon le contrôle du groupe sur lequel l’événement a
eu lieu. En fait, les contrôles individuels ne sont plus accessibles, seul le groupe est défini
dans la fenêtre du code (liste modifiable de gauche). Bien entendu, la procédure
événementielle aura comme paramètre l’indice du contrôle du groupe qui a subi
l’événement.
Exercice 28
Eh bien, faites-le ! Je souhaite maintenant que le clic sur un des boutons d’option affiche
avec un MsgBox la durée en mois de l’abonnement.
3984 TG 88
Séquence 7 Les contrôles
De plus, le groupe est un contrôle volumineux et ne possède aucune aide à la sélection de l’option.
Il ne faut donc pas l’employer pour choisir parmi 20 valeurs, mêmes stables : il occuperait tout
l’écran et l’utilisateur passerait dix minutes à chercher la valeur qu’il souhaite. Dans ce cas, vous
utiliserez la zone de liste modifiable ou la zone de liste tout court.
1
Sorted signifie trié.
3984 TG 89
Séquence 7 Les contrôles
Ces caractéristiques permettent de choisir entre le groupe d’options et la zone de liste : ce sera le
groupe s’il y a peu d’options, la liste s’il y en a beaucoup.
Une dernière remarque :
ListIndex indique le numéro de l’option sélectionnée. Que se passe-t-il si la zone de liste
permet de sélectionner plusieurs éléments ? Vous trouverez la façon de s’en sortir dans l’aide.
1 K 2. Manipulation
Il ne s’agit pas ici de la manipulation faite par l’utilisateur du programme, mais celle faite par vous,
développeur.
Nous allons voir comment gérer les différents paramétrages que ce contrôle possède. Comme
d’habitude, je ne peux que vous renvoyer vers l’aide pour plus d’informations.
Propriétés de base
La zone de liste modifiable est avant tout une zone de liste. Tout cela pour dire que nous retrouvons
les propriétés List, ListIndex et Sorted dans leur rôle habituel.
Une propriété propre à la zone de liste modifiable est Style. Vous verrez dans l’aide que la valeur de
cette propriété détermine le style (bah oui) de la liste, à savoir :
– si l’on peut ou non saisir une valeur dans la zone de texte autre qu’une valeur présente dans
la liste ;
– si la liste se referme ou reste constamment ouverte.
1
Certains emploient à tort le nom zone de liste déroulante. Certes, elle se déroule, mais ce n’est pas sa fonction !
3984 TG 90
Séquence 7 Les contrôles
Par défaut, style vaut 0 – Dropdown Combo. On peut donc saisir la valeur dans la zone de texte ou
la sélectionner dans la liste.
Propriétés avancées
L’utilisation de la zone de texte peut produire deux situations :
– l’utilisateur a tapé une valeur qui était présente dans la liste ;
– l’utilisateur a tapé une valeur qui n’est pas présente dans la liste. Et là, nous avons un
problème.
Enfin, un problème… tout dépend de ce que nous voulons. La zone de liste peut avoir plusieurs
comportements différents selon son paramétrage. On peut souhaiter que :
– l’utilisateur n’ait pas le droit de saisir une valeur qui n’est pas présente dans la liste (on parle
de choix fermés). Dans ce cas, on modifiera simplement la valeur de Style ;
– l’utilisateur peut saisir une valeur qui n’est pas présente dans la liste (choix ouvert) ;
– l’utilisateur peut saisir une valeur qui n’est pas présente dans la liste et, dans ce cas, la
valeur qu’il a saisie est automatiquement ajoutée à la liste.
Nous allons voir comment mettre en œuvre ces trois configurations.
Exercice 29
Dans une feuille, placez une zone de liste modifiable. Mettez trois valeurs dans List (sans
originalité Valeur 1, Valeur 2 et Valeur 3). Ne paramétrez aucune autre propriété de la liste.
Ajoutez un bouton à la feuille pour afficher, lorsque l’on clique dessus, le numéro de
l’élément sélectionné dans la liste (c’est toujours la propriété ListIndex).
Que vaut ListIndex lorsque vous saisissez un élément présent dans la liste ? Et si cet élément
n’est pas présent ?
Lorsque l’élément n’est pas présent, est-il ajouté automatiquement ?
Programmation
Nous allons maintenant programmer la zone de liste modifiable pour régler les problèmes soulevés
dans la correction de l’exercice.
Reprenons le cas de la saisie d’une valeur qui n’était pas dans la liste :
Il est impossible de connaître la valeur saisie en passant par List puisqu’elle n’y figure pas. Eh bien,
dans ce cas, il suffit d’utiliser la propriété Text de la zone de liste. Cette propriété donne le contenu
de la zone de texte associée à la liste.
Maintenant, comment ajouter la valeur tapée pour qu’elle y figure à la prochaine ouverture de la
liste ? Ce n’est pas très difficile : la propriété List de la liste est un objet possédant notamment la
méthode AddItem pour lui ajouter une chaîne.
Exercice 30
Programmez la liste précédente pour qu’elle ajoute automatiquement la valeur saisie si elle
n’est pas dans la liste. Vous avez en somme trois choses à faire :
1. Identifier le bon moment pour faire cet ajout (en clair, trouver l’événement adéquat).
2. Récupérer la valeur saisie (facile).
3. L’ajouter à List (pas difficile).
3984 TG 91
Séquence 7 Les contrôles
2. Les feuilles
2 A. Introduction
La première partie de cette séquence était réservée aux contrôles dont la finalité était la saisie ou
l’affichage de valeurs, chacun étant spécialisé dans un type de données.
Nous étions tellement concentrés sur ces contrôles que nous n’avons pas pris le temps d’étudier le
plus évident d’entre eux, à savoir la feuille, servant de contenant aux différents contrôles.
Nous allons maintenant voir comment faire pour gérer les feuilles. Nous aborderons trois points :
– comment créer ou supprimer des feuilles ;
– comment ouvrir ou fermer une feuille ;
– comment communiquer d’une feuille à une autre.
En fait, nous allons aborder des applications possédant plus d’une feuille.
Vous obtenez une nouvelle feuille. Attention, dès que vous manipulez plus d’une feuille, faites
l’effort de les nommer plus clairement que Form1 ou Form2.
Je suis ici !
3984 TG 92
Séquence 7 Les contrôles
Exercice 31
Exécutez votre application avec les deux feuilles (comme elles sont vides, cela ira vite).
Accédez à la seconde feuille… si vous y arrivez. Conclusion ?
La conclusion de l’exercice, c’est que créer une feuille n’a rien à voir avec le fait de l’afficher1. En
fait, la création correspond à la réservation de la mémoire et à l’initialisation des différentes
propriétés.
Exercice 32
Dans la feuille Form1, placez un bouton qui, quand on appuie dessus, ouvre Form2. Dans
Form2, placez un bouton qui, quand on clique dessus, ferme Form2.
Si vous avez un problème… essayez de le résoudre !
1
Ce qui est finalement logique : il ne serait pas raisonnable d’avoir dès le lancement d’une application toutes ses
feuilles et boîtes de dialogue ouvertes !
2
J’ai bien conscience que cela ne va impressionner personne de plus de 3 ans. Et encore, avec les jeunes de
maintenant…
3984 TG 93
Séquence 7 Les contrôles
Ce n’est pas forcément très évident pour vous car on comprend mieux cela avec une pratique de la
programmation objet qui n’est pas notre propos ici.
Je vais donc vous proposer une petite métaphore (c’est un peu ma spécialité). Je suis chez moi. Je
demande à ma femme où est Nina, notre petit teckel sympa. Si elle me répond « dans le jardin », il
n’y a pas d’ambiguïté : comme nous sommes chez nous, le jardin sans plus de précision est notre
jardin. En revanche, si Nina a creusé un petit tunnel et s’ébat avec le westie du voisin, ma femme
me répondrait « dans le jardin du voisin ».
Un autre exemple : si je suis dans la cuisine avec ma femme et qu’elle me demande d’allumer la
lumière, je ferais preuve d’un esprit assez retord si j’allais allumer celle du perron. En effet, il est
implicite que ma femme voulait plus de lumière dans la cuisine. En revanche, si nous sommes dans
la cuisine et que nous attendons du monde, ma femme pourra me demander d’allumer la lumière du
perron.
Concrètement, il n’est pas toujours évident de savoir quand préfixer par la feuille et quand ne pas le
faire. Deux solutions s’offrent à vous :
1. Vous préfixez systématiquement par le nom de la feuille. C’est un peu lourd, mais cela
fonctionnera. (De même que si, dans la cuisine, je demande à ma femme d’allumer la
lumière de la cuisine, elle comprendra.)
2. Vous essayez d’optimiser votre code et tentez de ne préfixer par le nom de la feuille que
quand c’est nécessaire. Dans ce cas, lorsque vous avez oublié de préfixer, vous aurez une
erreur . Vous n’avez alors qu’à ajouter le nom de la feuille et tout ira bien.
3984 TG 94
Séquence 8
Les fichiers
Comment sauvegarder des données ? Nous allons le voir maintenant.
Contenu
Les différents types de fichiers :
– leur rôle ;
– leur syntaxe.
Capacités attendues
Utiliser tous les types de fichiers.
3984 TG 95
Séquence 8 Les fichiers
1. Introduction
Qu’avons-nous vu jusqu’à maintenant ? Les différentes instructions VB et la manipulation des
contrôles.
Avec du temps et de l’expérience, vous pouvez écrire n’importe quel programme. Le fait que nous
n’ayons fait ensemble que des petites applications un peu ridicules et courtes n’a aucune
importance. Les concepts sont connus, reste à vous entraîner.
Cela dit, si vous écrivez une grosse application maintenant, vous allez être très frustrés. Pourquoi ?
Prenons l’exemple de VB. Lorsque vous écrivez un programme, vous souhaitez bien entendu le
sauvegarder pour pouvoir l’utiliser plusieurs fois. De même, sous Word, il y a des documents que
vous tapez puis imprimez sans les sauvegarder (un courrier par exemple), mais d’autres que vous
souhaitez conserver sur disque pour un usage ultérieur (votre CV…).
Lorsque vous utilisez une application quelconque (par exemple un programme que vous savez
réalisé sous VB), c’est le même problème :
– certaines informations ne sont pas sauvegardées ;
– d’autres, au contraire, doivent l’être.
Par exemple, vous êtes entrepreneur et souhaitez gérer votre comptabilité sur ordinateur. À chaque
décaissement (paiement d’une facture) ou encaissement, vous souhaitez mettre à jour votre
comptabilité. Deux solutions s’offrent à vous :
– si vous avez la possibilité d’enregistrer votre comptabilité, l’application va reprendre le
dernier solde qu’elle avait calculée, imputera votre décaissement ou encaissement et
enregistrera le nouveau solde qui sera pris en compte à la prochaine utilisation du
programme ;
– si rien n’est sauvegardé, l’application démarre sans aucune information. Vous devez alors
saisir tous les mouvements comptables ayant eu lieu depuis la création de l’entreprise puis,
enfin, saisir le nouveau décaissement ou encaissement. Et, comme vous ne pouvez rien
sauvegarder, il faudra refaire tout cela lors du prochain mouvement. Ce n’est évidemment
pas une solution acceptable.
En fait, la majorité des programmes exploitent des informations permanentes, c’est-à-dire stockées
dans un fichier. Le fichier est utilisé en lecture pour récupérer des données d’initialisation puis en
écriture pour sauvegarder les données finales.
Cette séquence va nous apprendre à manipuler les fichiers avec VB. Nous pourrons donc stocker
des informations qui demeureront même après fermeture de l’application ou extinction de
l’ordinateur.
3984 TG 96
Séquence 8 Les fichiers
2. Ce qu’est un fichier
2 A. Définition intemporelle
J’aurais tendance à vous dire que tout est fichier. En effet, un fichier est un ensemble d’informations
cohérentes.
Pourquoi cohérentes ? Si je prends une partie de votre CV, le code source d’un programme VB et
que je parsème le tout de quelques formules de calcul réalisées avec un tableur, j’ai un ensemble
d’informations. Mais elles ne riment à rien.
Plus simplement, si je mélange un texte de chanson avec une lettre de réclamation à un fournisseur,
j’obtiens également un résultat sans signification.
Un fichier contiendra donc des informations cohérentes. Par exemple, un fichier peut être :
– votre CV ;
– le texte d’une chanson ;
– une image ;
– un programme exécutable ([Link] par exemple) ;
– …
Toutes les informations stockées sur un disque le sont sous la forme de fichiers. Bref, sur votre
disque dur, vous n’avez que des fichiers, qui peuvent contenir des programmes, des données ou
autre.
Nous allons apprendre à manipuler les fichiers de données (un fichier programme ne se manipule
pas, il s’exécute et c’est tout).
Nous verrons deux types de fichiers : les fichiers texte1 et les fichiers binaires. Qu’est-ce que c’est
que cela ? Poursuivez votre lecture et vous le saurez !
1
Ce sont des fichiers de type texte, d’où texte et non textes.
3984 TG 97
Séquence 8 Les fichiers
Il faut bien distinguer le fichier physique du fichier logique. Que sont ces nouvelles notions ? Rien
de terrible : le fichier physique, c’est le fichier qui est sur le disque. Le fichier logique est en
quelque sorte la variable que VB utilise pour accéder au fichier physique.
VB utilise la notion de descripteur de fichier pour gérer le fichier logique. Ce terme barbare de
descripteur correspond en fait juste à un entier identifiant le fichier physique sur lequel on travaille.
Nous dirons donc plus simplement qu’il s’agit de numéros de fichiers car ce terme fait moins peur.
Par exemple, si j’accède à trois fichiers client, facture et commande, ils seront identifiés par les
nombres 1, 2 et 3 dans mon application. Ainsi, pour ajouter un client au fichier physique client, je
l’ajouterai par programmation au fichier logique 1.
Enfin, 1, 2 ou 3 ou 27, 19 et 42… la seule contrainte est qu’un numéro ne soit associé qu’à un seul
fichier.
Pour l’anecdote, notez que le numéro doit être compris entre 1 et 511 inclus.
2 C 2. Utilisation
Comme vous devez associer un numéro à tout fichier physique, il est raisonnable de déclarer une
variable descripteur (numéro de fichier) entière pour chaque fichier.
Par exemple, je vais déclarer un numéro pour mon fichier client :
dim FichierClient as integer
Comprenez bien que FichierClient n’est pas le fichier lui-même, c’est juste une variable qui nous
permettra d’y accéder.
Je vous ai dit que l’on pouvait associer n’importe quelle valeur entière aux numéros de fichiers, la
seule contrainte étant de ne pas utiliser deux fois la même.
Au lieu d’affecter vous-même une valeur (par exemple FichierClient = 4), il est plus sage d’appeler
la fonction FreeFile qui fournit à la demande des valeurs entières pas encore utilisées.
Pour initialiser le numéro, vous écrirez donc :
FichierClient = FreeFile
3984 TG 98
Séquence 8 Les fichiers
1
Attention, dans ce cas, ne modifiez surtout pas le fichier et quittez sans sauvegarder, sinon vous altéreriez de façon
définitive le fichier.
3984 TG 99
Séquence 8 Les fichiers
Ouvrez le programme sous VB puis exécutez-le en ajoutant dans la zone de liste une valeur
quelconque. Vérifiez que la valeur est bien ajoutée. Quittez VB. Ouvrez de nouveau le programme
et exécutez-le1. La valeur ajoutée est-elle encore présente ? Non.
Démonstration :
J’exécute mon programme :
Je tape une valeur qui n’est pas dans la liste et je vérifie qu’elle est ajoutée :
Je quitte VB puis, je recharge et re-exécute le programme… Nina le petit teckel n’est plus dans la
liste :
En fait, il n’y a rien d’anormal à cela : les valeurs Valeur 1, Valeur 2 et Valeur 3 sont toujours
présentes car elles sont définies dans le source du programme. En revanche, Nina le petit teckel est
une donnée qui n’a été stockée qu’en mémoire lorsque je l’ai ajoutée à List. Quand l’application se
termine, la mémoire qu’elle utilisait est libérée. Notre valeur disparaît donc2.
Une application du fichier texte pourrait être de stocker le contenu de la propriété List (soit les
différentes chaînes) dans un fichier texte lorsque l’on quitte l’application et, au démarrage, d’aller
lire les chaînes stockées pour les placer dans List. Ainsi, chaque chaîne ajoutée resterait dans la
zone de liste pour les utilisations futures.
C’est un tellement bel exemple que nous le traiterons dans le TD à venir.
1
Ou lancez deux fois de suite le programme exécutable créé par VB.
2
En pratique, elle n’est pas effacée, mais c’est tout comme car son contenu a perdu toute signification.
3984 TG 100
Séquence 8 Les fichiers
3 C 1. Déclaration et initialisation
Déclarer un fichier revient à créer une variable descripteur chargée de stocker son numéro de
fichier. Nous l’avons fait dans le paragraphe 2C.
Nous affectons ensuite au descripteur une nouvelle valeur avec FreeFile.
3 C 2. Association
Déclarer une variable est une chose, l’initialiser est autre chose. Les variables fichier n’échappent
pas à la règle. Le problème, c’est de savoir ce que signifie initialiser un fichier.
En fait, c’est naturel : notre objectif est de manipuler un fichier présent sur le disque. Avoir
initialisé le descripteur avec FreeFile lui a juste attribué un numéro unique. Aucune association n’a
encore été faite entre notre descripteur et un fichier physique (réel) présent sur un disque.
C’est le rôle de l’instruction Open, à qui on fournira un descripteur initialisé (par FreeFile) et un
chemin d’accès de fichier physique.
Voici sa syntaxe pour le moment1 :
Open CheminAccès as #Descripteur
Voir ci-dessous pour comprendre ce que
le petit # vient faire.
Voici un exemple :
Dim JeNaiPasIntérêtÀLeModifierCeluiLà as integer
Open "C:\[Link]" as #JeNaiPasIntérêtÀLeModifierCeluiLà
Que vient faire ce caractère # entre as et le descripteur ? Mon dieu qu’il est étrange, ce petit dièse !
En fait, c’est une abréviation américaine : là où nous abrégeons « numéro 4 » en « n° 4 », les
américains abrègent en « # 4 ». Bref, le dièse est synonyme de numéro.
Or, je vous rappelle que le descripteur est un numéro de fichier. Il faut donc lire l’instruction Open
ci-dessus comme « ouvrir le fichier CheminAccès sous le numéro Descripteur ».
Je vous avoue que le dièse est facultatif : si vous ne le mettez pas, VB comprendra tout autant votre
instruction. Je l’avais donc directement omis dans la première version de ce cours.
Le problème, c’est que certaines des instructions qui suivent nécessitent le # qui n’est plus
facultatif. Prenons l’exemple de l’instruction Print # permettant d’écrire dans un fichier. Le dièse
est obligatoire. Pourquoi ? Parce que si vous l’omettez, vous faites appel à l’instruction Print tout
court qui existe et écrit dans la feuille courante, ce qui n’a rien à voir !
Ainsi, j’avais deux possibilités :
– ne parler du # que lorsqu’il est obligatoire. Mais alors, vous vous mélangeriez les pinceaux
et ne sauriez plus quand l’utiliser et quand l’omettre ;
– en parler pour chaque instruction, qu’il soit facultatif ou obligatoire. Ainsi, pas de question à
se poser : on met le dièse et c’est tout !
Open permet en fait :
– de faire le lien entre le descripteur et le fichier physique ;
– de définir le mode d’accès au fichier : ajouterons-nous des données, nous contenterons-nous
de les lire…
Vous devrez donc fournir trois paramètres à Open :
– un descripteur ;
– le chemin d’accès d’un fichier ;
1
J’insiste : pour le moment. En effet, la syntaxe est incomplète car Open contient aussi le mode d’ouverture.
3984 TG 101
Séquence 8 Les fichiers
– le mode d’ouverture.
Nous allons voir tout cela.
Sous VB, les mots clé correspondant aux différents modes d’ouverture sont les suivants :
Ouverture d’un fichier texte
MODE D’OUVERTURE MOT CLE VB
création Output
lecture Input
ajout Append
lecture/écriture néant
Voici un exemple d’ouverture permettant de lire mon fichier [Link] :
Dim JeNaiPasIntérêtÀLeModifierCeluiLà as integer
Open "C:\[Link]" for Input as #JeNaiPasIntérêtÀLeModifierCeluiLà
Au fait, en anglais, Input correspond à entrée et Output à sortie. Or, quand vous ouvrez un fichier
en Input, c’est pour extraire des données, donc pour les sortir du fichier. Incohérence ? Non, tout
dépend du point de vue. En effet, récupérer des données venant du fichier, c’est sortir les données
du fichier pour les récupérer dans l’application. Elles entrent donc dans l’application.
Le mode d’accès est donc vis-à-vis de l’application et non du fichier. (C’est un truc
mnémotechnique pour ne pas se tromper de mode.)
Notez que l’on ne peut pas modifier une ligne dans le fichier (l’accès en lecture/écriture n’existe
pas). La seule façon d’écrire dans le fichier texte, c’est d’ajouter des lignes à la fin.
Les fichiers binaires permettront la modification. Pourquoi cela n’est-il pas possible dans les
fichiers textes ? Nous le verrons ci-dessous.
Comment passer d’un mode d’ouverture à l’autre ? Par exemple, nous sommes en mode lecture et
nous voulons passer en mode ajout sur le même fichier. Comment faire ? Il suffit de fermer le
fichier (nous allons voir comment) puis de le rouvrir dans le nouveau mode.
Je vous avoue qu’Open propose d’autres options en plus de ce que nous venons de voir. Pour les
découvrir, un réflexe : F1. (Elles n’ont pas d’intérêt à notre niveau, raison pour laquelle je n’en
parle pas.)
3984 TG 102
Séquence 8 Les fichiers
3 C 4. Fermeture du fichier
Quand vous avez fini de lire un livre, vous le fermez. Eh bien, lorsque vous avez fini d’accéder à un
fichier, vous le fermerez également avec l’instruction Close :
Close #descripteur
Numéro = FreeFile
Open … for … as #Numéro
…
// accès au fichier (voir ci-dessous)
…
Close #Numéro
En d’autres termes :
– on assigne le fichier physique au fichier logique et on ouvre le fichier (Open) ;
– on lit et/ou écrit dans le fichier (voir ci-dessous) ;
– on ferme le fichier (Close).
Ne pas fermer le fichier n’entraînera pas forcément un plantage, mais causera à coup sûr des
problèmes : perte de données, consommation excessive de mémoire… Bref, n’oubliez pas !
3 C 6. Exemple
Nous allons écrire un programme console créant un fichier texte nombres à la racine du disque dur
et contenant les nombres de 1 à 10 000 (un nombre par ligne). L’intérêt de ce programme ? Il n’y en
a aucun.
Le principe est le suivant :
– on assigne le fichier ;
– on l’ouvre en création (il est en effet supposé ne pas exister) ;
– on fait une boucle de 1 à 10 000, chaque valeur étant écrite dans le fichier ;
– on ferme le fichier.
Exercice 34
Faites ce programme.
3984 TG 103
Séquence 8 Les fichiers
Un fichier texte peut contenir 10 lignes, 200 lignes, un million de lignes ou éventuellement aucune1.
Bref, on ne peut pas connaître sa taille. Pour le parcourir, on est obligé d’utiliser une boucle tant
que. Le principe est simple : on dira « tant que l’on n’est pas en fin de fichier, on avance d’une
ligne ».
Comment savoir si l’on est en fin de fichier ? En utilisant la fonction Eof2, qui prend un fichier en
paramètre et renvoie un booléen (vrai si l’on est en fin de fichier, faux sinon) :
fonction Eof (descripteur) : booléen
Aïe, cette fois, nous sommes coincés : Eof n’accepte pas le #. Eh oui…
Exercice 35
Complétez le programme précédent pour qu’après avoir fermé le fichier il l’ouvre de
nouveau pour lire tous les éléments qu’il contient. Comme il n’est pas question de les
afficher, insérez un compteur s’incrémentant à chaque lecture. Vous afficherez la valeur du
compteur en fin de lecture (il doit valoir 10 000).
Exercice 36
Faites le programme. Je veux que l’utilisateur puisse rentrer les chemins de source et cible.
Pour savoir si une ligne contient sub ou function, vous utiliserez la fonction VB InStr (voir
l’aide).
Exercice 37
Juste en passant, un petit exercice… La correction de l’exercice précédent n’est pas très
efficace car le traitement du balayage dans le fichier source est effectué deux fois de façon
identique (seul le mot cherché change). Je vous demande d’optimiser ce programme en
créant un sous-programme de balayage qui sera appelé deux fois. Prêtez une attention toute
particulière aux paramètres. Je veux que tous les accès aux fichiers soient réalisés dans le
nouveau sous-programme.
Vous aurez besoin de Dir (voir l’aide) pour un maximum d’efficacité.
1
Si vous créez un fichier puis le fermez juste après, il sera vide.
2
Eof pour End Of File (fin de fichier).
3984 TG 104
Séquence 8 Les fichiers
3984 TG 105
Séquence 8 Les fichiers
4 C 2. Initialisation
Que le fichier soit texte ou binaire, il faut toujours associer le fichier logique (la variable) au fichier
physique. C’est toujours Open qui s’y colle, mais là, vous aurez une syntaxe un peu différente car il
y aura plus à dire.
1
Voir séquence 2, paragraphe 1B1.
2
Dans le paragraphe 3.1, je vous avais dit que votre ordinateur pouvait biper en affichant un caractère binaire. C’est
pour une raison simple (enfin…) : le bip est un caractère de contrôle (non visuel) ayant le code ASCII 7. Ce qui veut
dire que si vous affichez caractère de code ASCII 65, vous verrez un A. Si vous affichez celui de code 7, vous
verrez… rien, mais vous entendrez un bip. Bref, les caractères en informatique sont un peu plus étendus que ceux
dans la vraie vie. Claudel a écrit « l’œil écoute ». J’aurais pu lui répondre « le caractère parle ».
3984 TG 106
Séquence 8 Les fichiers
En effet, le fichier texte contient des lignes de texte et c’est tout, tandis que le fichier binaire
contient des informations de même nature, tout comme un tableau1.
Ainsi, un fichier binaire sera un fichier d’entiers, un fichier de clients (client étant un type structuré
défini par l’utilisateur) voire un fichier de tableaux de 10 réels.
On voit qu’il existe un nombre infini de types de fichiers binaires puisque n’importe quel type de
données peut être stocké dans un fichier : non seulement les types de base (entier, réel, caractère…)
mais aussi les types définis par l’utilisateur (tableau, structures). La seule exception est le fichier :
vous ne pouvez pas définir de fichier contenant des fichiers.
Le fait de ne pouvoir stocker que des éléments de même type semble contraignant. Nous verrons en
4C6 que cela permet l’accès direct.
Avec un fichier texte, l’instruction de lecture lisait tous les caractères d’une ligne. Elle s’arrêtait
donc en arrivant sur un caractère de fin de ligne. L’écriture se faisait de la même façon : tous les
caractères de la chaîne passée en paramètre étaient écrits.
Maintenant, c’est différent : la notion de fin de chaîne ou de ligne n’existe que pour les chaînes et
les lignes. Comment faire ici ? Eh bien, comme tous les éléments sont de même type, ils occupent la
même place en mémoire donc sont constitués du même nombre d’octets. Lors de l’ouverture du
fichier avec Open, on précisera le nombre d’octets occupés par un élément du fichier. L’écriture ou
la lecture se fera alors sur le nombre d’octet spécifié. Ainsi, si vous mettez une valeur qui ne
correspond pas à la taille des éléments, le fichier sera totalement corrompu2.
En clair, VB vous fait confiance quant à la taille des enregistrements. En fait, il n’a pas le choix :
pour lui, un fichier n’est qu’une suite de bits (huit bits formant un octet), il n’en connaît pas le
contenu. Si vous dites que les éléments font quatre octets, il lira ou écrira les octets par paquets de
quatre. Si vous dites qu’ils font seize octets, il y accédera seize par seize.
Voici la nouvelle syntaxe d’Open.
Open CheminAccès for Mode as #Descripteur Len=taille
Taille est la taille en octets des éléments constituant le fichier. Cette information n’est d’ailleurs pas
évidente à obtenir : si je déclare un type Client personnalisé, pouvez-vous me dire facilement le
nombre d’octets qu’il occupe ? Je ne pense pas.
C’est pourquoi vous utiliserez avec profit l’instruction Len qui vous renvoie :
– le nombre de caractères de la chaîne passée en paramètre (cela ne nous intéresse pas ici) ;
– la taille en octets de la variable passée en paramètre.
Il n’y a pas d’ambiguïté entre ces deux résultats puisqu’un caractère occupe toujours un octet.
Ainsi, le nombre de caractères d’une chaîne, c’est sa taille en octets.
Par exemple :
– len (i) vaut 2 si i est une variable entière ;
– len (r) vaut 4 si r est une variable réelle ;
– len (Cl) vaut… tout dépend de ce que vous avez mis dans le type Client (je suppose bien
entendu que Cl est de type Client).
1
D’ailleurs, tableau et fichier binaire sont deux concepts totalement identiques, l’un étant stocké en mémoire, l’autre
sur disque.
2
Par exemple, si vous manipulez un fichier de réels en indiquant comme taille d’éléments celle d’un entier, vous ne
stockerez que la moitié du réel. Attention, pas la moitié au sens division par 2, mais juste les deux premiers octets
des quatre que constituent un réel, puisqu’un entier est codé sur deux octets. Inversement, si vous lisez un fichier de
réels comme si c’était un fichier d’entiers, vous aurez deux fois plus de données car un réel = 4 octets = 2 * 2 octets
= 2 entiers.
3984 TG 107
Séquence 8 Les fichiers
En résumé, len est très simple à utiliser et fournir vous-même une taille en octets ne peut que mener
à la catastrophe. Je souhaite donc tellement que vous utilisiez systématiquement len que je vais
l’intégrer dans la nouvelle syntaxe d’Open, qui devient :
Open CheminAccès for Mode as #Descripteur Len=Len(variable)
Attention, n’oubliez pas que le paramètre de len est une variable de même type que les éléments du
fichier.
Ch est une variable chaîne de caractères de longueur 30, donc ne pouvant contenir au maximum que
30 caractères.
Tous vos types structurés devront contenir des chaînes de longueur fixe, la longueur étant
quelconque (j’ai mis 30, on peut évidemment mettre une autre valeur).
4 C 5. Fermeture du fichier
Rien n’a changé, c’est toujours Close.
4 C 6. Accès direct
Pour le moment, le fichier binaire manque d’intérêt par rapport au fichier texte. En effet, au prix de
quelques petites manipulations, nous pouvons convertir toute donnée sous la forme d’une chaîne de
caractères et ainsi la stocker dans un fichier texte.
En fait, le fichier binaire possède une caractéristique essentielle : il permet l’accès direct.
Pour accéder au contenu d’un fichier texte, la seule façon est de l’ouvrir puis de le lire en partant du
début. Si nous voulons la dernière ligne d’un fichier qui en contient un million, nous sommes
obligés de lire les neuf cent quatre-vingt-dix-neuf premières, qui ne nous intéressent pas, avant
d’accéder à la dernière.
Pourquoi est-ce ainsi ? C’est le corollaire de la souplesse du fichier texte. Il permet de stocker des
éléments ayant une taille variable. En effet, un fichier texte est en fait un fichier contenant des
lignes. Ces lignes sont de taille variable (sur une ligne, je peux avoir 5 caractères et sur la suivante,
200). L’application n’a donc aucun moyen de savoir où se situe la ligne cherchée dans le fichier. Il
doit donc toutes les parcourir.
3984 TG 108
Séquence 8 Les fichiers
Une métaphore ?
Eh bien, imaginions que vous cherchiez une maison dans une rue, en ne connaissant que son
numéro. Impossible de se dire « bon, je suis au numéro 12, je cherche le numéro 715, je vais donc
avancer de 823,45 mètres et je serai rendu ». En effet, les maisons et les terrains ayant des tailles
variables, vous ne pouvez pas connaître la distance entre deux maisons1. Vous êtes donc obligé de
parcourir toute la rue jusqu’à arriver devant le 715 cherché (et alors vous apercevoir qu’il n’y a
personne…).
Dans un fichier binaire, c’est le contraire. Toutes les données stockées sont de même type donc
occupent la même place en mémoire (donc sur le disque). Ainsi, connaissant la position du premier
élément du fichier, il suffit de réaliser une opération mathématique simple pour savoir où se trouve
l’élément numéro 56 (ou 34, ou 567…).
Une métaphore ?
En fait, c’est exactement ce qui se passe avec les tableaux. Les fichiers binaires sont d’ailleurs
l’équivalent des tableaux, ceux-ci étant en mémoire et ceux-là sur disque ; dans les deux cas, les
éléments sont stockés de façon contiguë.
Comme un tableau ne contient que des éléments de même type, chacun occupe la même place en
mémoire. Il est donc très simple d’accéder directement à l’élément que l’on souhaite2.
Comme fichiers binaires et tableaux sont similaires (voire équivalents), la notion d’indice existe
pour les deux notions. C’est très utile lorsque l’on sait que pour lire ou écrire un élément, il faut être
positionné dessus (donc que l’indice corresponde au numéro de l’élément).
Nous allons voir que les instructions permettant de lire ou d’écrire dans un fichier permettent en
même temps de se positionner au bon endroit.
1
Sauf dans le cas où les maisons sont numérotées en système métrique, le numéro de la maison correspondant à la
distance en mètres séparant la maison du début de la rue. J’ai habité 3 ans dans une telle rue et il m’en a fallu 2 pour
comprendre cela et ainsi ne plus être choqué par le fait que j’habitais au 319 et mon voisin au 326 alors que nos
maisons étaient mitoyennes.
2
Supposons un tableau d’entiers. Un entier occupe 2 octets en mémoire. Dans ce cas, si le premier débute à l’octet
456, il se termine à l’octet 457. Le deuxième élément du tableau sera donc dans les octets 458 et 459, le troisième en
460 et 461 et le ie en (456+(i–1)*2) et (457+(i–1)*2).
3984 TG 109
Séquence 8 Les fichiers
Le premier élément d’un fichier possède le numéro 1. Notez bien que si nous manipulons un fichier
d’entiers, les données lues ou écrites ne peuvent être que des entiers. Et idem pour tout type. La
variable lue ou écrite sera donc d’un type cohérent avec le contenu du fichier.
Seconde version, on n’indique pas de position. L’accès se produira là où l’on est :
Put #descripteur,, ChaîneÉcrite
Get #descripteur,, ChaîneLue
Attention, les deux virgules qui se suivent ne sont pas une erreur : elles permettent d’indiquer au
compilateur l’absence du deuxième paramètre.
4 C 8. Exemple
Nous allons écrire un programme console créant un fichier binaire nombres à la racine du disque
dur et contenant les nombres entiers de 1 à 10 000. L’intérêt de ce programme ? Toujours aucun.
Exercice 38
Faites ce programme. (C’est l’exercice 34, sauf que cette fois nous manipulons un fichier
binaire et non plus texte.)
Exercice 39
Complétez le programme précédent pour qu’après avoir fermé le fichier il l’ouvre de
nouveau pour afficher son 5 555e élément.
Pour connaître le nombre d’éléments stockés, on écrira Lof (descripteur)/Len (Variable), variable
étant une variable du même type que les éléments du fichier.
Ce résultat est forcément un nombre entier si vous n’avez pas fait d’erreur.
1
Enfin, très précisément, ce n’est pas integer mais long, type entier codé sur 4 octets donc n’étant pas limité à la
valeur 32 767 comme l’integer.
3984 TG 110
Séquence 8 Les fichiers
Exercice 40
Nous allons mettre tout cela en œuvre. Définissez un type Client (nom, adresse et
téléphone). Stockez dans un fichier trois clients que vous aurez saisis.
Attention, dans un fichier, on ne peut pas stocker une chaîne de caractères de longueur
quelconque, puisque tous les éléments du fichier doivent avoir la même taille. Vous
définirez donc des chaînes de longueur fixe pour chaque champ de client.
Les différents champs de client ne seront pas des chaînes tout court, mais des chaînes de
longueur définie (laquelle ? À vous de voir). Revoyez éventuellement le paragraphe 4C3.
Exercice 41
Écrivez un autre programme parcourant le fichier que nous venons de créer et affichant les
clients dans l’ordre inverse (le dernier puis l’avant-dernier jusqu’au premier).
Modifiez ensuite l’adresse du 2e client qui vient de déménager (vous mettrez une nouvelle
valeur quelconque).
Affichez de nouveau le contenu du fichier, cette fois du premier au dernier élément.
Pour tous ces traitements, vous utiliserez les routines de manipulation de l’indice. Votre
code doit donc être valable que le fichier contienne trois clients ou cinq cents.
Attention, ce n’est pas si simple…
Exercice 42
Écrivez un programme créant un fichier de 5 entiers, fermant le fichier puis lui ajoutant 5
autres entiers.
3984 TG 111
Travaux dirigés 2 : Fichiers !
L’objet des exercices qui suivent est de mettre en œuvre de façon systématique les
concepts vus dans le cours pour que cela devienne un automatisme.
Plus que de simples exercices d’application, ils sont plutôt un complément de cours.
Ne les bradez pas !
Enfin, faites les exercices dans l’ordre, la difficulté étant croissante.
Pour réaliser cela, quelques ajustements vont être nécessaires. Avant toute chose, vous
ajouterez deux boutons, l’un permettant d’accéder au client précédent, l’autre au suivant.
Ensuite, il va falloir modifier légèrement l’organisation de notre code.
Dans la correction de l’exercice précédent, les accès au fichier étaient cachés dans chaque
sous-programme : les deux ouvraient le fichier, faisaient ce qu’ils avaient à faire puis le
fermaient. Impossible donc de connaître la position courante dans le fichier et de travailler en
conséquence.
Deux solutions sont possibles :
– en utilisant les événements adéquats, on peut ouvrir le fichier à l’ouverture du
programme, le maintenir ouvert tout au long du programme (les différents sous-
programmes pourront alors y accéder directement et l’indice courant sera connu) et le
fermer en quittant le programme ;
– on conserve le fonctionnement actuel (ouverture puis fermeture à chaque accès) mais
on ajoute une variable accessible tout au long du programme et indiquant l’indice de
l’élément actuellement affiché.
Je vous demande de mettre en œuvre la première solution (en n’oubliant pas les boutons de
déplacement). Elle n’est pas difficile puisque nous avons vu que le fichier était constamment
ouvert en mode Random.
3984 TG 114
Séquence 9
Contenu
Tout ce qui s’applique aux barres de menus et d’outils.
Capacités attendues
Créer des menus.
3984 TG 115
Séquence 9 Mise en forme de l’application
1 B. La barre de menus
1 B 1. Comment faire
L’ergonomie Windows impose que toute commande de l’application soit accessible par la barre de
menu. VB vous propose le « créateur de menus » pour la concevoir très simplement :
1 B 2. Démonstration
Je vais créer un menu Fichier contenant la commande Quitter et un menu Édition contenant
Couper, Copier et Coller avec leur raccourci habituel.
Je vais vous présenter cette construction en trois étapes. Elles n’ont rien d’obligatoire, vous pouvez
travailler dans un ordre différent du mien.
3984 TG 116
Séquence 9 Mise en forme de l’application
1re étape
Je crée Fichier :
Je clique alors sur Suivant pour entrer les autres commandes. Allez, je suis un rebelle et vais toutes
les rentrer successivement dans n’importe quel ordre. Je les organiserai après.
Voici l’exemple de Couper. Notez que je lui affecte le traditionnel raccourci Ctrl+X :
2e étape
Une fois toutes les commandes rentrées, je les réorganise pour qu’elles soient dans l’ordre (chaque
menu de gauche à droite et, juste après chaque menu, ses différentes commandes).
Comment faire ? C’est très facile, je clique sur chaque commande puis je la fais monter ou
descendre avec les flèches.
3984 TG 117
Séquence 9 Mise en forme de l’application
3e étape
Pour le moment, je n’ai que des menus et aucune commande. Pour dire que Quitter est une
commande de Fichier, je vais sélectionner cette commande et la décaler d’une indentation vers la
droite avec la flèche :
CLIC !
Les « … » précédant Quitter sont éloquents, non ? Pour avoir des sous-menus (soit des menus dans
des menus), il suffirait de rajouter un niveau d’indentation.
Je m’occupe de toutes les commandes et j’obtiens :
4e étape
Eh bien, j’ai terminé. Je peux cliquer sur OK et contempler mon formulaire automatiquement doté
de son menu :
3984 TG 118
Séquence 9 Mise en forme de l’application
1 B 3. Le code
Le problème, c’est que mes menus ne font rien : je les ai créés mais aucun code ne leur est affecté.
Comment faire ? Eh bien, il suffit de sélectionner une commande en mode création du formulaire en
cliquant dessus. VB génère alors l’événement Click associé et vous propose d’entrer le code :
Notez que vous pouvez passer par la liste modifiable de droite pour accéder directement aux
différentes commandes. Chacune n’a qu’un événement, le click :
Si je sélectionne une
de ces commandes,
j’active son click.
Pour quitter une application, on utilise l’instruction End. Je vais m’en servir dans le code de la
commande Quitter :
Option Explicit
1 C 1. Le composant
La barre d’outils n’est pas un composant standard de VB. Il faut installer le groupe de contrôles
ActiveX Microsoft Windows Common Controls grâce à la commande Projet/Composants… :
3984 TG 119
Séquence 9 Mise en forme de l’application
Une fois la manipulation faite, vous accédez à quelques nouveaux contrôles, dont ToolBar (barre
d’outils) dont nous avons besoin :
Prenez ce contrôle ToolBar et placez-le sur votre feuille. Il s’installera automatiquement là où il doit
être :
La barre est
là.
Si vous sélectionnez la barre d’outils, vous avez accès à ses propriétés, dont (Personnalisé) qui
lance un assistant quand vous cliquez sur les « … » :
3984 TG 120
Séquence 9 Mise en forme de l’application
Cette boîte de dialogue est très riche, d’autant qu’elle possède trois onglets. Mais bon, elle est facile
d’emploi. Enfin… elle n’est pas trop difficile serait plus exact.
Une barre d’outils doit proposer des commandes par l’intermédiaire de boutons contenant un icone1.
Votre application doit donc stocker des images qui seront distribuées à la barre d’outils.
1 C 2. La liste d’icones
Pour stocker des images, rien ne vaut le composant ImageList (liste d’images), qui a été installé en
même temps que ToolBar :
Placez un ImageList dans votre feuille puis accédez à sa propriété (Personnalisé). C’est maintenant
une habitude, vous cliquez sur « … » et obtenez une boîte de dialogue. Allez dans l’onglet Images.
Vous obtenez :
Il faut ensuite récupérer des images sur le disque, d’où qu’elles viennent (d’Internet, de VB ou de
dessins faits vous-même).
Ne possédant pas plus de talent graphique que de cheveux, je vais me contenter de récupérer des
icones fournis par Microsoft (sur mon disque, elles se trouvent dans C:\Program Files\Microsoft Visual
Studio\Common\Graphics\Bitmaps\OffCtlBr\Small\Color). Je récupère [Link], [Link] et [Link] :
1
À ne pas confondre avec une icône, peinture sur bois religieuse.
3984 TG 121
Séquence 9 Mise en forme de l’application
Les images sont maintenant disponibles pour générer la barre d’outils. Je retourne donc à la
propriété (Personnalisé) de cette dernière.
Voici les différentes modifications à faire. Je ne vous présente que ce qui est nécessaire. Pour aller
plus loin, étudiez dans l’aide les autres rubriques paramétrables.
Mon premier bouton sera Couper. L’icone correspondant est le 2e dans ma liste d’image.
Key permettra de
distinguer facilement les
différents boutons lors
de l’écriture du code.
Vous noterez que je laisse la propriété Caption vide. En effet, une barre d’outils n’est pas sensée
contenir de texte.
3984 TG 122
Séquence 9 Mise en forme de l’application
Le travail est fini. Vous pouvez fermer la fenêtre et admirer votre œuvre :
mode conception mode exécution
Testez votre œuvre. N’y a-t-il rien qui vous gène ? Les commandes couper, copier et coller, que ce
soit en barre de menu ou en barre d’outils, ne fonctionnent pas encore puisque aucun code n’a été
écrit.
01 Option Explicit
02
03 Private Sub Coller_Click()
04 MsgBox ("Code de Coller")
05 End Sub
06
3984 TG 123
Séquence 9 Mise en forme de l’application
3984 TG 124
Séquence 9 Mise en forme de l’application
Vous noterez que la norme MDI impose que la feuille MDI container contienne la barre de menus,
la fenêtre fille ne gardant que sa barre d’outils (je n’ai rien fait en ce sens, c’est VB qui l’a fait
automatiquement).
Pour créer une application MDI ou SDI, vous pouvez passer par la commande Fichier/Nouveau
projet. Vous obtenez alors la boîte suivante :
Ne choisissez plus EXE standard mais Assistant Création d’applications. Il vous proposera de
réaliser le canevas d’une application MDI ou SDI au choix. Faites-le puis étudiez le code !
3984 TG 125
Travaux dirigés 3 :
Application complète
Résumons notre savoir des séquences 1 à 9 :
– nous savons tout faire ;
– euh, c’est tout.
3984 TG 127
Travaux dirigés 3 Application complète
Travail à faire :
1. Dans un nouveau projet, ajoutez un module. Comme un module n’est lié à aucune
feuille, il ne contiendra que du code et des déclarations. C’est là que vous définirez les
fichiers et les types. L’intérêt, c’est que toute feuille du projet y aura accès
directement.
2. Définissez au bon endroit les types Client et Appel puis deux descripteurs de fichier,
l’un pour stocker les clients, l’autre les appels.
3. Enregistrez ce module sous le nom Declarations.
4. (Rappel : compilez votre programme en l’exécutant. S’il y a des erreurs, corrigez-les.)
1
Et là, surprise, le client 2, c’est moi ! Non, en fait, c’est un homonyme.
3984 TG 128
Travaux dirigés 3 Application complète
3984 TG 129
Travaux dirigés 3 Application complète
L’élément Annuler
est actif
par défaut
3984 TG 130
Travaux dirigés 3 Application complète
Si je clique sur la ligne 3 pour sélectionner mon homonyme, la grille se referme et le numéro
est automatiquement affiché. Le focus passe à la zone de texte Raison :
3984 TG 131