Vous êtes sur la page 1sur 84

VISUAL BASIC 6

DESS IAIE, ISTIA, Universit dAngers 2003/2004, 30h Jean-Louis Boimond 1 2 2.1 2.2 3 3.1 3.2 3.3 3.4 3.5 4 4.1 4.2 4.3 4.4 5 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 6 6.1 6.2 6.3 7 7.1 7.2 INTRODUCTION ENVIRONNEMENT DE DVELOPPEMENT INTGR Prsentation de lEnvironnement de Dveloppement Intgr (EDI) Un premier exemple : Affichage dune ligne de texte INTRODUCTION LA PROGRAMMATION DE VISUAL BASIC La programmation oriente objet Programmation vnementielle Deux exemples Rgles de priorit des oprateurs arithmtiques Oprateurs de comparaison STRUCTURES DE CONTRLE Structures de slection Structures de rptition Oprateurs logiques Types de donnes PROCDURES ET FONCTIONS Introduction Les modules Les procdures Sub Les procdures Function Appel par valeur, appel par rfrence Exit Sub et Exit Function Dure de vie dune variable Porte dune variable, dune procdure, dune fonction Les constantes Paramtres optionnels Fonctions mathmatiques de Visual Basic Module standard LES TABLEAUX Leurs dclarations Les tableaux dynamiques Passage de tableaux dans les procdures LES CHANES Concatnation avec & (esperluette) et + Comparaison de chanes
page 1

7.3 7.4 7.5 7.6 7.7 7.8 8 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 9 9.1 9.2 9.3 9.4 10 11 11.1 11.2 11.3 12 12.1 12.2 12.3 12.4

Manipulation de caractres dans une chane Left$, Right$, InStr, InStrRev, Split, Join LTrim$, RTrim$ et Trim$ String$ et Space$ Autres fonctions de traitement de chanes Fonctions de conversion INTERFACE UTILISATEUR GRAPHIQUE : LES BASES Le contrle Label Le contrle TextBox Le contrle CommandButton Les contrles ListBox, ComboBox Les contrles Frame, CheckBox, OptionButton Les menus La fonction MsgBox Le contrle Timer BASE DE DONNES : ACCS Introduction de l'ADO Data Control 6.0 et du DataGrid Control 6.0 Survol du langage SQL Description de l'ADO Data Control 6.0 et du DataGrid Control 6.0 L'objet Recordset MULTIPLE DOCUMENT INTERFACE RSEAUX, INTERNET ET WEB Le contrle WebBrowser Le contrle Internet Transfer Le contrle Winsock PROGRAMMATION ORIENTE OBJET Les modules de classe Accs aux membres d'une classe : Public, Private Composition : Objets en tant que variables d'instance d'autres classes Evnements et classes ________________________________________________

Annexes : A : Code de compilation B : Types de projet C : Elments cls de Windows : Fentres, vnements et messages D : Description du modle vnementiel E : Description (notamment) des paramtres de MoveComplete F : Les types de variables objet G : Traitement de fichiers avec danciennes instructions et fonctions dE/S de fichiers Bibliographies : 1) MSDN Library Visual Studio 6.0
page 2

2) Visual Basic 6: How to Program, H.M. Deitel, P.J. Deitel, T.R. Nieto, Prentice Hall, Upper Saddle River, New Jersey 07458, 1015 pages, www.prenhall.com/deitel 3) Visual Basic 6, Peter Wright, Eyrolles, 767 pages, www.eyrolles.com 4) Visual Basic 6, M. Franke, Micro Application, Paris, 493 pages, www.microapp.com 5) Visual Basic 6 : Le guide du programmeur, G. Frantz, Edition OEM, 1272 pages, www.oemweb.com 6) Programmer avec Visual Basic, Alain Godon, cours M2AI - ISTIA, 2001/2002, 28 pages 7) Visual Basic version 5, Roland Guihur, oct. 1999, 47 pages 8) T.P. de Visual Basic, Serge Tah, Innovation - ISTIA ________________________________________________

page 3

INTRODUCTION

Visual Basic sest dvelopp partir du langage BASIC (Beginners All-purpose Symbolic Instruction Code, Larousse : " Langage de programmation conu pour lutilisation interactive de terminaux ou de micro-ordinateurs ", 1960). Le but du langage BASIC tait daider les gens apprendre la programmation. Son utilisation trs rpandue conduisit de nombreuses amliorations. Avec le dveloppement (1980-1990) de linterface utilisateur graphique (Graphical User Interface - GUI) de Windows Microsoft, BASIC a naturellement volu pour donner lieu Visual Basic (1991). Depuis, plusieurs versions ont t proposes, Visual Basic 6 est apparue en 1998. Visual Basic est un langage de programmation existant actuellement en trois versions (Learning, Professional, Entreprise). Les programmes (aussi appeles applications) sont crs dans un environnement de dveloppement intgr (Integrated Development Environment - IDE), ceci dans le but de crer, excuter et dboguer les programmes dune manire efficace. Ce langage est rput pour permettre un dveloppement rapide dapplications. Outre une interface utilisateur graphique, il dispose de caractristiques telles que la manipulation dvnements, un accs Win32 API, la programmation oriente objet, la gestion derreurs, la programmation structure. C'est un langage interprt, notons que les ditions Professional et Entreprise permettent une compilation en code natif (code machine) (voir annexe A pour plus de dtails). 2 ENVIRONNEMENT DE DVELOPPEMENT INTGR (EDI)

Lenvironnement de dveloppement intgr de Visual Basic permet de crer, excuter et dboguer des programmes Windows dans une seule application ( savoir Visual Basic). 2.1 Prsentation de lEnvironnement de Dveloppement Intgr (EDI)

Au dmarrage de Visual Basic, la bote de dialogue suivante, intitule Nouveau projet (cf. barre de titre), saffiche. Elle permet de choisir le type de projet que lon souhaite crer.

Double-cliquer sur loption EXE Standard (surligne par dfaut) de longlet Nouveau afin de crer un projet (ensemble de fichiers permettant de crer une application Windows). Certaines options de cette bote de dialogue sont brivement dcrites en annexe B. Linterface de lEDI de Visual Basic saffiche (voir la recopie dcran dans la figure suivante).

page 4

Cet environnement, situ dans une fentre intitule Projet1 - Microsoft Visual Basic [cration] (cf. barre de titre), est form dune barre de menu, dune barre de contrles et de plusieurs fentres.
!"

Le tableau suivant rcapitule les menus accessibles partir de la barre de menu, situe en haut de lcran. En dessous sont situs, dans une barre d'outils, les raccourcis graphiques (icnes) reprsentant les commandes les plus courantes. Description Contient des options pour ouvrir, fermer, crire, des projets. Contient des options telles que couper, copier, coller, etc. Contient des options concernant lEDI. Contient des options pour ajouter au projet des particularits telles que des feuilles. Contient des options pour aligner et verrouiller les contrles dune feuille. Contient des options pour dboguer le programme. Contient des options pour excuter, stopper, un programme. Contient des options pour manipuler des donnes rcupres dune base de donnes. Contient des options pour diter des bases de donnes. Contient des options pour particulariser lEDI. Contient des options pour utiliser, installer et dsinstaller des complments (programmes visant augmenter la performance de Visual Basic). Contient des options pour disposer les fentres lcran. Contient des options pour obtenir de laide.

Menu Fichier Edition Affichage Projet Format Dbogage Excution Requte Schma Outils Complments Fentres Aide
!"

La barre de contrles, situe dans la partie gauche de lcran, contient des contrles permettant de raliser lInterface Utilisateur Graphique (IUG) (i.e., la partie de la feuille visible par lutilisateur). Ces derniers permettent une programmation acclre. La figure et le tableau suivants rsument les contrles contenus dans cette barre.
page 5

Contrle Curseur PictureBox (zone dimage) Label (tiquette) TextBox (zone de saisie) Frame (cadre) CommandButton (bouton) CheckBox (case cocher) OptionButton (case option) ListBox (liste) ComboBox (liste combine) HScrollBar VScrollBar Timer (horloge) DriveListBox DirListBox FileListBox Shape Line Image (dessin) Data OLE
!"

Description Permet dinteragir avec les contrles de la feuille (en fait, ce nest pas un contrle). Permet laffichage dun fichier image (bmp, ico, wmf, ). Permet laffichage dun texte non modifiable directement par lutilisateur. Permet lutilisateur dentrer du texte. Permet de regrouper dautres contrles tels que des cases option. Ce contrle est reprsent par un bouton que lutilisateur peut presser, ou cliquer, pour excuter une action sous-jacente. Permet de fournir un bouton de choix (checked ou unchecked). Les cases option sont utilises en groupe (dans le mme cadre), sachant que seulement une case peut tre slectionne (True) la fois. Permet laffichage de diffrents items (lments). Permet de combiner les fonctionnalits des zones de saisie et des listes. Une barre de dfilement horizontale. Une barre de dfilement verticale. Permet la rptitivit de tches (ce contrle est non visible pour lutilisateur). Permet un accs aux diffrents disques du systme. Permet un accs des rpertoires. Permet daccder aux fichiers dun rpertoire. Permet de dessiner des cercles, des rectangles, des carrs ou des ellipses. Permet de dessiner des lignes. Similaire au contrle PictureBox avec des capacits moindres. Permet la connexion une base de donnes. Permet dinteragir avec dautres applications Windows.

L'EDI d'un projet EXE Standard contient les fentre suivantes : - Projet1 Form1 (Form) - Prsentation des feuilles
page 6

- Proprits Form1 - Projet Projet1 La fentre Projet1 Form1 (Form) contient une feuille (en anglais form) vierge nomme, par dfaut, Form1, dans laquelle le programme de lIUG sera conu. LIUG est la partie visible du programme (boutons, cases cocher, cases option, zones de saisie, etc.), elle permet : - un utilisateur de fournir des donnes (appeles entres) au programme, - au programme de restituer des rsultats (appels sorties) lutilisateur. La fentre Prsentation des feuilles (en anglais Form Layout) permet de spcifier - laide de la souris - la position souhaite de la feuille (dans le cas prsent Form1) sur lcran lors de lexcution du programme. La fentre Proprits Form1 dcrit les proprits (taille, position, couleur, etc.) dune feuille ou dun contrle. Dans le cas prsent, sont listes les proprits lies la feuille Form1. Chaque type de contrle a son propre ensemble de proprits. Certaines proprits, telles que Height et Width sont communes aux feuilles et aux contrles, alors que dautres proprits sont uniques une feuille, ou un contrle. La fentre Projet Projet1 est l'explorateur de projets, elle regroupe par type les diffrents fichiers composant le projet en cours. La barre de menu de cette fentre comporte 3 boutons : Code afin de visualiser la fentre contenant le code du programme, Afficher lobjet pour faire apparatre la feuille, Basculer les dossiers cache, ou montre, le dossier Feuilles. Par dfaut, le projet a pour nom Projet1 et est constitu dune seule feuille, nomme Form1. Un premier exemple : Affichage dune ligne de texte

2.2

Ralisons un programme qui crit le texte " Premier exemple " l'cran. Ce programme, de part sa simplicit, se fait sans crire une seule ligne de code. En fait, nous allons utiliser les techniques de la programmation visuelle dans laquelle, travers diffrentes manipulations (tel quun clic de souris), vont tre fournies les informations suffisantes Visual Basic pour quil puisse automatiquement gnrer le code de notre programme. Voici la dmarche. Nous allons ajouter un contrle Label sur lIUG dune feuille : Le fait de doublecliquer sur ce contrle fait apparatre un contrle Label, nomm de manire standard Label1, au centre de lIUG de la feuille. Lutilisation de la souris permet de le positionner et de le dimensionner volont (la grille, visible en mode cration, permet un alignement des contrles, cf. onglet Gnral du menu Outils | Options). La proprit Caption du contrle Label1, visible dans la fentre des proprits (fentre Proprits Label1), dtermine le texte affich par ce contrle. Il suffit donc de remplacer le texte " Label1 ", mis par dfaut, par celui souhait ( savoir " Premier exemple "). Remarques : - La proprit Caption ne doit pas tre confondue avec la proprit Name du contrle, bien que leurs contenus soient par dfaut les mmes ! - Le fait de prfixer le Name de chaque Label avec les lettres (minuscules) lbl permet une meilleure identification des contrles Label. Il en sera de mme pour les autres contrles. Cette convention, largement adopte, permet une meilleure " lisibilit " du programme. Attention : Avant de tenter une excution, il est prudent de sauvegarder le projet (cf. menu Fichier | Enregistrer le projet sous ). En ce qui concerne notre exemple, la sauvegarde du projet, nomm Projet1 par dfaut, donne lieu la cration de deux fichiers (texte) :

page 7

- l'un, avec l'extension .frm, pour mmoriser les proprits de la feuille, nomme Form1 par dfaut. En fait, chaque lment du projet (feuille ou module) va correspondre un fichier (.frm ou .bas). - l'autre, avec l'extension .vbp, pour mmoriser les paramtres des variables d'environnement et des noms de fichiers des lments constituant le projet. Jusqu' prsent, nous avons travaill dans le mode cration de l'EDI (i.e., le programme n'est pas excut). En plaant l'EDI en mode excution (obtenu en cliquant le bouton Excuter, ou en activant le menu Excution | Excuter), le programme est excut (avec une possible interaction via le programme de l'IUG). Il s'ensuit alors que : - la fentre de l'EDI est intitule Projet1 - Microsoft Visual Basic [excution] (cf. barre de titre), - la plupart des fentres utilisables dans le mode cration sont indisponibles (c'est le cas, par exemple, de la fentre Proprits). Notons l'apparition d'une fentre nomme Excution, habituellement utilise pour dboguer le programme. 3 INTRODUCTION A LA PROGRAMMATION DE VISUAL BASIC

La ralisation dune application sappuie essentiellement sur lassociation de deux lments : Les objets et les vnements. 3.1 La programmation oriente objet

Visual Basic permet le dveloppement orient objet. Au lieu de rsoudre un problme en le dcomposant en problmes plus petits, il sagit de le scinder sous forme dobjets qui existent chacun indpendamment les uns des autres. Chaque objet possde certaines caractristiques (appeles proprits) et fonctions quil serait en mesure deffectuer (appeles mthodes). A titre dillustration, la feuille " Form1 " est un objet ayant, entre autres, une proprit appele " Caption " qui permet de spcifier le texte affich dans la barre de titre de la feuille, et deux mthodes appeles " Show " et " Hide " qui permettent respectivement dafficher et de cacher la feuille. Trs brivement, on peut dire que les objets " encapsulent " les donnes (les attributs) et les mthodes (les comportements), sachant que les donnes et les mthodes sont intimement lies. Les objets ont la proprit de " cacher l'information ", au sens o la communication d'un objet avec un autre ne ncessite pas de connatre comment ces objets sont " implments " ( titre d'illustration, il est possible de conduire une voiture sans connatre en dtail son fonctionnement mcanique). Alors que dans un langage procdural, la fonction joue le rle de l'unit de programmation (les fonctions en langage objet sont appeles mthodes), l'unit de programmation en langage objet est la classe partir laquelle les objets sont " instancis " (crs) (tout objet appartient une classe). En fait, la communication avec un objet se fait notamment travers ses proprits et ses mthodes. Une proprit a une valeur que le programmeur peut consulter, ou modifier ; une mthode est une procdure permettant d'agir sur les objets d'une classe. Le programmeur peut faire rfrence la proprit prop, respectivement la mthode meth, de l'objet obj en crivant obj.prop, respectivement obj.meth. De nombreuses classes sont prdfinies dans Visual Basic. Par exemple, chaque icne de contrle, situ dans la barre de contrles de l'EDI, reprsente en fait une classe. Lorsqu'un contrle est dplac vers une feuille, Visual Basic cre automatiquement un objet de cette classe, vers lequel votre programme pourra envoyer des messages ; ces objets pouvant aussi gnrer des vnements. Les versions rcentes de Visual Basic permettent le dveloppement de ses propres classes (et contrles). 3.2 Programmation vnementielle
page 8

Visual Basic permet la cration dIUG, sous une forme standard dans l'environnement Windows, par simple pointage et cliquage de la souris, ce qui a pour intrt dliminer lcriture du code permettant de gnrer lIUG dune feuille, de fixer ses proprits, de crer les contrles contenus dans lIUG. Il sagit pour le programmeur de crer lIUG dune feuille et dcrire le code dcrivant ce qui se produit lorsque lutilisateur interagit avec lIUG (clic, double-clic, appuie sur une touche, etc.). Ces actions, appeles vnements (en anglais events), sont relies au programme via le systme dexploitation de Microsoft Windows (voir l'annexe C pour plus de prcisions). En fait, il est possible pour chacun des contrles contenus dans lIUG de rpondre, de manire approprie, aux diffrents vnements auxquels sont sensibles les contrles. Pour cela, il va correspondre chacun de ces vnements une procdure de rponse (en anglais event procedure), dans laquelle le programmeur insrera des lignes de code appropri. Une telle programmation de code en rponse ces vnements est dite programmation vnementielle. Ainsi, ce nest plus le programmeur mais lutilisateur qui matrise lordre dexcution du programme (le programme ne dicte plus la conduite de lutilisateur). Dans un programme Visual Basic, tous les contrles (zones de texte, boutons de commande, etc.) possdent un ensemble dvnements prdfinis auxquels on peut lier du code (pour ne pas ragir un vnement prdfini, il suffit de ne pas crire de code correspondant). A titre dillustration, lvnement appel " Load " de la feuille " Form1 " est dclench chaque premier chargement de la feuille (ici " Form1 "), juste avant son affichage. Il sert habituellement fixer les valeurs des proprits de la feuille, ou excuter du code lors de son apparition. Voir l'annexe D pour plus de prcisions. En bref, un programme (une application) Visual Basic est cr partir d'un projet constitu, notamment, de feuilles, lesquelles comprennent : - une IUG compose de contrles, - les procdures de rponses aux vnements associes ces contrles. Notons quune feuille peut aussi contenir des procdures et des dclarations locales la feuille, sans lien direct avec un contrle contenu dans lIUG. Nous verrons par la suite, quen plus des feuilles, un projet peut tre constitu de modules. 3.3 Deux exemples

3.3.1 criture dune ligne de texte sur une feuille LIUG consiste en deux boutons : Ecrire et Sortir. Il sagit dcrire la ligne " Deuxime exemple " autant de fois que lutilisateur clique sur le bouton Ecrire. Le fait de cliquer sur le bouton Sortir permet de terminer lexcution du programme. Les recopies dcran qui suivent montrent, gauche, la feuille avant un clic sur le bouton Ecrire, droite, la feuille aprs plusieurs clics sur ce bouton.

page 9

Le tableau qui suit liste les objets et certaines de leurs proprits (seules les proprits ayant t modifies sont listes). Objet Form Proprit Valeur de la proprit Name frmExemple2 Caption Ecrire du texte sur une feuille Font CommandButton Ecrire Name Caption Font CommandButton Sortir TabIndex Name Caption Font TabIndex MS Sans Serif Gras 12 pt cmdDisplay Ecrire MS Sans Serif Gras 12 pt 0 cmdExit Sortir MS Sans Serif Gras 12 pt 1 Description Identification de la feuille. Spcification du texte affich dans la barre de titre de la feuille. Spcification de la police de caractres de la feuille. Identification du bouton Ecrire. Texte qui apparat sur le bouton. Spcification de la police caractres du texte Caption. Numro dordre de Tab. Identification du bouton Sortir. Texte qui apparat sur le bouton. Spcification de la police caractres du texte Caption. Numro dordre de Tab. de

de

La proprit TabIndex permet de contrler lordre dans lequel les contrles, constituant l'IUG, reoivent le focus (i.e., deviennent actifs). Le contrle, ayant une valeur de TabIndex gale 0, a le focus au dpart. Le code programme qui suit permet : - dafficher dans la feuille le texte " Deuxime exemple " avec la police de caractres souhaite lors dun clic sur la touche Ecrire (cf. la procdure de rponse lvnement, nomme cmdDisplay_Click). - de terminer le programme lors dun clic sur la touche Sortir (cf. la procdure de rponse lvnement, nomme cmdExit_Click). ___________________________________________________ Private Sub cmdDisplay_Click() ' A chaque fois que le bouton "Ecrire" est cliqu, ' le message "Deuxime exemple" est affich sur la feuille Print "Deuxime exemple" End Sub Private Sub cmdExit_Click() End ' Termine l'excution du programme End Sub ___________________________________________________ Private Sub et End Sub marquent respectivement le dbut et la fin dune procdure. Le code que le programmeur veut excuter lors dun clic sur la touche Ecrire, est plac entre le dbut et la fin de la procdure, i.e., Private Sub cmdDisplay_Click() et End Sub. ' A chaque fois que le bouton "Ecrire" est cliqu, ' le message "Deuxime exemple" est affich sur la feuille
page 10

sont des lignes de commentaires. La ligne Print "Deuxime exemple" affiche le texte " Deuxime exemple " sur la feuille (en cours) en utilisant la mthode Print. En toute rigueur, il faudrait faire prcder la mthode Print du nom de la feuille, soit la ligne frmExemple2.Print "Deuxime exemple" (nom de lobjet.nom de la proprit)

Notons que cette mthode nest pas la plus approprie lorsque la feuille contient des contrles, il serait prfrable dcrire le texte dans un contrle de type TextBox (dtaill au 8.2). La ligne End situe dans la procdure cmdExit, termine lexcution du programme (i.e., place lEDI en mode cration). 3.3.2 Addition dentiers A partir dentiers introduits par lutilisateur, il sagit dafficher leur somme successive. LIUG consiste en deux tiquettes (Label), deux zones de saisie (TextBox) et deux boutons (CommandButton), cf. la recopie dcran dans la figure suivante.

Le tableau qui suit liste les objets et certaines de leurs proprits (seules les proprits ayant t modifies sont listes). Objet Form CommandButton Ajouter CommandButton Sortir Proprit Name Caption Name Caption Name Valeur de la proprit frmExemple3 Programme daddition cmdAjouter Ajouter cmdSortir Description Identification de la feuille. Spcification du texte affich dans la barre de titre de la feuille. Identification du bouton Ajouter. Texte qui apparat sur le bouton. Identification du bouton Sortir.
page 11

Label Label TextBox

Caption Name Caption Name Caption Name Font MaxLength

Sortir lbl1 Entrer un entier lbl2 La somme est txtEntree MS Sans Serif Gras 12 pt 5

TextBox

TabIndex Text Name Font Text Enabled

0 (vide) txtSomme MS Sans Serif Gras 12 pt 0 False

Texte qui apparat sur le bouton. Identification du label. Texte qui apparat dans le label. Identification du label. Texte qui apparat dans le label. Identification du TextBox. Spcification de la police de caractres. Limite le nombre maximum de caractres (la valeur 0, mise par dfaut, indique quil ny a pas de limite). Numro dordre de Tab. Texte affich. Identification du TextBox. Spcification de la police de caractres. Texte affich. Autorisation / non autorisation.

Le contrle TextBox permet lutilisateur, via la proprit Text, dentrer du texte (cf. TextBox txtEntree), il permet aussi dafficher du texte (cf. TextBox txtSomme). La proprit Enabled du contrle TextBox txtSomme positionne False fait que ce contrle ne ragit aucun vnement, il sensuit que le texte reprsentant la somme est de couleur grise. Le code du programme est le suivant : ___________________________________________________ Dim sum As Integer Private Sub cmdAjouter_Click() sum = sum + txtEntree.Text txtEntree.Text = "" txtSomme.Text = sum End Sub Private Sub cmdSortir_Click() End End Sub ___________________________________________________ La ligne Dim sum As Integer dclare une variable, nomme sum, de type entier (2 octets, entre 32768 et 32767), initialise par dfaut 0.

page 12

Remarque : La dclaration des variables dans Visual Basic est facultative, une variable non dclare sera par dfaut de type Variant (cf. 4.4). Toutefois, il est conseill, pour des raisons d'aide la mise au point de programmes, de rendre obligatoire la dclaration des variables. Pour cela, il faut la prsence dans la partie " dclaration gnrale " de la ligne suivante : Option Explicit Cette ligne peut tre soit tape directement dans la partie " dclaration gnrale ", soit introduite automatiquement par Visual Basic en ouvrant, avant toute programmation, le menu Outils | Options, puis en cliquant l'onglet nomm Editeur et en cochant la case Dclaration des variables obligatoire (case non coche par dfaut). La ligne sum = sum + txtEntree.Text ajoute le texte de txtEntree la variable sum, puis place le rsultat dans la variable sum. Avant lopration daddition (+), la chane de caractres situe dans la proprit Text est convertie implicitement en une valeur entire. La ligne txtSomme.Text = sum met le contenu de la variable sum dans txtSomme.Text, Visual Basic convertit implicitement la valeur entire contenue dans sum en une chane de caractres. Remarque : De manire plus rigoureuse que les conversions implicites (qui peuvent donner lieu des mprises), il existe des fonctions Visual Basic permettant de convertir une chane de caractres en une valeur entire, et rciproquement (cf. fonctions Val et Str$). 3.4 Rgles de priorit des oprateurs arithmtiques

Les oprations arithmtiques sont effectues selon un ordre fix par les rgles de prcdence doprations suivantes : Opration () parenthses ^ exponentielle - ngation * ou / multiplication et division \ division entire Mod modulo (17 Mod 3 = 2 car 17 = 3*5 + 2) + ou - addition et soustraction Ordre dvaluation Evalu en 1er. Sil y a plusieurs paires de parenthses " de mme niveau ", elles sont values de gauche droite. Evalu en 2e. Sil y en a plusieurs, elles sont values de gauche droite. Evalu en 3e. Sil y en a plusieurs, elles sont values de gauche droite. Evalu en 4e. Sil y en a plusieurs, elles sont values de gauche droite. Evalu en 5e. Sil y en a plusieurs, elles sont values de gauche droite. Evalu en 6e. Sil y en a plusieurs, elles sont values de gauche droite. Evalu en dernier. Sil y en a plusieurs, elles
page 13

sont values de gauche droite. 3.5 Oprateurs de comparaison Equivalent dans Visual Basic a=b c<>d e>f g<h i >= j k <= l

Dans lalgbre standard a=b c!d e>f g<h i"j k#l

Ces oprateurs permettent au programme de prendre une dcision base sur la vrification, ou non, (True ou False) d'une condition.

STRUCTURES DE CONTRLE

Afin de concevoir un programme, nous allons dcrire les diffrents types de blocs de construction possibles et rappeler les principes de la programmation structure. Nimporte quel problme informatique peut-tre rsolu en excutant une srie dactions dans un ordre spcifique, une telle procdure est appele un algorithme. Lorsque les instructions dun programme sont excutes lune la suite de lautre, dans lordre o elles ont t crites, l'excution est dite squentielle. Certaines instructions permettent au programmeur de spcifier que la prochaine instruction excuter peut tre diffrente de celle qui est situe dans la squence, ces instructions effectuent un transfert de contrle. Durant les annes 1960, lutilisation de linstruction de transfert de contrle goto fut bannie comme tant la source de nombreux problmes de programmation (difficults vis--vis de la comprhension, du test, de la modification dun programme). La programmation dite structure (" sans goto ") fut prsente comme une alternative. En fait tous les programmes peuvent tre construits par combinaison de seulement trois structures de contrle : La structure en squence, la structure de slection et la structure de rptition. Visual Basic propose : - trois types de structures de slection : If/Then, If/Then/Else, Select Case, - six types de structures de rptition : While/Wend, Do While/Loop, Do/Loop While, Do Until/Loop, Do/Loop Until, For/Next. La figure suivante rcapitule les diffrentes structures de contrle de Visual Basic.

page 14

Squence structure If/Then

Slection structure Select Case

T F F

T T

. . .

structure If/Then/Else
F T

. . .
T F

Rptition structure While/Wend


T F

structure Do While/Loop
T F

structure Do/Loop While

T F

structure Do Until/Loop
F T

structure Do/Loop Until

structure For/Next

F T F

La connexion arbitraire de telles structures peut induire des programmes non structurs. Les rgles suivantes permettent la construction de programmes structurs (le symbole rectangle peut tre utilis pour indiquer une action, y compris lentre/sortie) : 1. Commencer avec le diagramme (flowchart) suivant :

2. Tout rectangle (action) peut tre remplac par deux rectangles en squence.

page 15

3. Tout rectangle (action) peut tre remplac par une structure de contrle (squence, If/Then, If/Then/Else, Select Case, While/Wend, Do While/Loop, Do/Loop While, Do Until/Loop, Do/Loop Until, For/Next). 4. Les rgles 2 et 3 peuvent tre appliques autant de fois que ncessaire et dans nimporte quel ordre.

4.1

Structures de slection Structure de type If/Then If note >= 10 Then lblNote.Caption = "Accept" End If

Structure de type If/Then/Else If note >= 10 Then lblNote.Caption = "Accept" Else lbl.Caption = "Refus" End If

Structure de type Select Case

Cette structure permet de ne pas utiliser des If imbriqus. Les conditions sont examines dans lordre dcriture, ds quune condition est vrifie, les suivantes ne sont pas examines. Select Case code_d_acces Case Is < 1000 Message = "Accs refus" Case 1542, 1645 To 1689 Message = "Personnel technique" Case Else Message = "Accs refus" End Select 4.2 Structures de rptition Structure de type While/Wend Private Sub cmdBouton_Click() Dim produit As Integer produit = 2 While produit <= 1000 Print produit produit = produit * 2 Wend End Sub Structure de type Do While/Loop
page 16

Cette structure se comporte comme la prcdente. Private Sub cmdBouton_Click() Dim produit As Integer produit = 2 Do While produit <= 1000 Print produit produit = produit * 2 Loop End Sub Structure de type Do/Loop While

Cette structure est similaire la prcdente si ce n'est que la condition de test de la boucle est faite aprs que le corps de la boucle ait t excut. Private Sub cmdBouton_Click() Dim compteur As Integer compteur = 1 Do Print compteur & Space$(2) ; compteur = compteur + 1 Loop While compteur <= 10 End Sub Structure de type Do Until/Loop Private Sub cmdBouton_Click() Dim produit As Integer produit = 2 Do Until produit > 1000 Print produit produit = produit * 2 Loop End Sub Au contraire des trois prcdentes structures, les instructions, situes dans le corps de la boucle, sont excutes autant de fois que la condition de test de la boucle est fausse. Structure de type Do/Loop Until

' permet d'crire 1 2 3 4 10

Cette structure est similaire la prcdente si ce n'est que la condition de test de la boucle est faite aprs que le corps de la boucle ait t excut. Private Sub cmdBouton_Click() Dim compteur As Integer compteur = 1 Do Print compteur & Space$(2) ; compteur = compteur + 1 Loop Until compteur = 10
page 17

End Sub Structure de type For/Next

A titre dexemple, rcrivons la portion de programme suivante qui utilise la structure Do While/Loop : Private Sub cmdBouton_Click() Dim compteur As Integer compteur = 3 Do While compteur <= 20 Print compteur compteur = compteur + 2 Loop End Sub En fait linitialisation, la condition de rptition et lincrmentation sont incluses dans la structure dentte For : Private Sub cmdBouton_Click() Dim compteur As Integer For compteur = 3 To 20 Step 2 Print compteur Next compteur la prsence du nom de la variable compteur est facultative End Sub Remarque : L'incrment, ici gal 2, peut-tre ngatif. Par dfaut, sa valeur est unitaire. Remarque : Les instructions Exit Do et Exit For permettent la sortie immdiate de ces structures (Exit For est rserve la structure For/Next). 4.3 Oprateurs logiques

Liste des oprateurs permettant deffectuer des oprations logiques partir dexpressions valeurs boolennes True (vraie) ou False (fausse) : Not Expression E1 And E2 E1 Or E2 E1 Xor E2 4.4 Etablit la ngation logique de Expression True si les conditions E1 et E2 sont True True si lune au moins des conditions E1, E2 est True True si seulement une seule des deux conditions E1, E2 est True

Types de donnes Les types de donnes dcrivent linformation quune variable stocke. Les types prdfinis dans Visual Basic sont lists dans le tableau ci-dessous. Occupation mmoire 2 octets 1 octet 8 octets 8 octets Porte des valeurs True ou False 0 255 (28) -922 337 203 685 477.580 8 922 337 203 685 477.580 7 1er janvier 100 au 31 dcembre 9999 0:00:00 23:59:59
page 18

Type Boolean Byte Currency Date

Double Integer Long Object Single String String*n Variant

-1.797 693 134 862 32 E308 4.940 656 458 412 47 E-324 4.940 656 458 412 47 E-324 1.797 693 134 862 32 E308 2 octets -32 768 32 767 (216, sign) 4 octets -2 147 483 648 2 147 483 647 (232, sign) 4 octets Pointeur sur un objet (voir chp. 12, annexe F) 4 octets -3.402 823 E38 -1.401 298 E-45 1.401 298 E-45 3.402 823 E38 10 octets + taille de la La longueur (variable) de la chane est compose dau plus 2 chane 147 483 648 caractres Taille de la chane La taille de la chane, fixe par n, est comprise entre 1 et 65536 16 octets Une valeur parmi celles listes au-dessus, mise part String*n

8 octets

Currency est un type de donnes, stock sur 8 octets, qui permet, notamment, des calculs montaires prcis dans le cas de nombres de moins de 4 dcimales. Variant est le type de donnes par dfaut pour les variable dont le type nest pas explicitement dclar et stocke nimporte quel type de donnes (except String*n), y compris les types dfinis par le programmeur (voir ci-dessous). Ce type de donnes peut-tre intressant : - dans le cadre de la conception d'une interface utilisateur, au sens o il permet de prendre en compte des donnes dont on ne connat pas le type. Par exemple, la question " entrer votre ge ", un utilisateur peut introduire un nombre, mais aussi du texte (" vingt-deux " au lieu de 22) ; le fait de stocker cette information dans une variable Variant permet, via les fonctions VarType() ou TypeName(), de connatre son type. - pour construire des structures de donnes (listes chanes, arbres), sachant que le code manipulant de telles structures peut tre crit indpendamment du type de donnes des lments stocks. Visual Basic permet la cration de ses propres types de donnes. Il sagit de regrouper sous un seul type des collections de variables non ncessairement de mme type (au contraire des tableaux). Il suffit de rpertorier, entre les instructions Type et End Type, lensemble des variables pour dfinir un nouveau type, voir l'exemple ci-dessous. Type Client Nom As String*15 Prnom As String*15 Age As Integer End Type Le type Client tant dfini, il est possible de dclarer une nouvelle variable base sur ce type, par exemple : Dim Untel As Client Untel.Nom = "Dupond" Untel.Prnom = "Lon" Untel.Age = 40 Usuellement, ces types de donnes sont utiliss dans le cas de manipulation de fichiers accs direct (fichiers constitus denregistrements de longueur fixe). Remarque : Les dfinitions Type doivent tre prives (Private) quand elles sont dclares dans des modules feuilles, elles peuvent tre publiques (Public) ou prives quand elles sont dclares dans des modules code.
page 19

5 5.1

PROCDURES ET FONCTIONS Introduction

Lexprience montre que le fait de fractionner un programme (important) en plusieurs parties facilite bien souvent son dveloppement et sa maintenance. Cette approche, applicable, notamment, dans le cadre de Visual Basic, est appele " diviser et conqurir ". 5.2 Les modules

Un projet est constitu de modules, tels que des modules feuilles, ou des modules standards (encore appels modules codes). A la diffrence dun module feuille, un module standard ne comporte pas d'IUG, il est uniquement compos de codes de programme. En dehors de dclarations, les modules sont constitus de procdures, quatre types de procdures existent : - les procdures vnementielles, en anglais event procedures, en rponse des vnements (appui sur une touche du clavier, clic de souris, etc.) ; - les procdures Visual Basic, en anglais Visual Basic procedures, (Print, VarType, etc.), fournies par Microsoft pour effectuer des tches courantes (le but cherch tant de rduire le temps de dveloppement) ; - les procdures conues par le programmeur (car non fournies par Visual Basic). Elles sont de deux types : Les procdures Sub et les procdures Function. Un programmeur peut crire des procdures pour excuter des tches spcifiques pouvant tre utilises diffrents endroits dans un programme. A des fins de rutilisation ventuelle (en anglais, on parle de software reusability), chaque procdure devra tre limite la rsolution dune tche bien dfinie, il est de coutume que la taille dune procdure ne dpasse pas une demie page. Lappel une procdure se fait en spcifiant le nom de la procdure et en fournissant les informations (on parle de paramtres dentre) ncessaires la procdure " appele " pour raliser le travail demand (restitu au programme " appelant " via des paramtres de sortie). 5.3 Les procdures Sub

Voici un exemple de procdure Sub qui dtermine la plus petite valeur parmi trois nombres entiers et laffiche dans un Label (voir la recopie dcran dans la figure qui suit) : _________________________________ Ce programme permet de trouver le minimum parmi trois nombres entiers Option Explicit Force les variables tre explicitement dclares Private Sub cmdPlusPetit_Click() Dim valeur1 As Long, valeur2 As Long, valeur3 As Long valeur1 = txtUn.Text valeur2 = txtDeux.Text valeur3 = txtTrois.Text Call Minimum(valeur1, valeur2, valeur3) ou Minimum valeur1, valeur2, valeur3 End Sub Private Sub Minimum (min As Long, y As Long, z As Long)
page 20

If y < min Then min = y End If If z < min Then min = z End If lblPlusPetit.Caption = "La plus petite valeur est" & min End Sub _________________________________

Le corps de la procdure Minimum est plac entre lentte et End Sub. A chaque appel de cette procdure (cf. instruction Call Minimum(valeur1, valeur2, valeur3), ou de manire quivalente, Minimum valeur1, valeur2, valeur3), le corps de la procdure est immdiatement excut, puis lexcution du programme se poursuit par linstruction situe immdiatement aprs lappel de la procdure. Toutes les enttes des procdures contiennent des parenthses, ventuellement vides ou contenant une liste de dclarations de variables, appele liste des paramtres qui comprend des paramtres dentre et de sortie. En fait, une procdure peut modifier le contenu des variables passes en paramtre (cest le cas du paramtre min de la procdure Minimum). Remarques : - Le fait que les procdures oprent sur des donnes, explique que leurs noms correspondent bien souvent des verbes. Il serait dailleurs prfrable de renommer la procdure Minimum par RechercherLeMinimum. - Par convention, une procdure dbute par une lettre majuscule (par exemple : Envoyer). 5.4 Les procdures Function

Les procdures Function partagent les mmes caractristiques que les procdures Sub si ce n'est que les procdures Function retournent une valeur, appele valeur de retour. La plupart des procdures fournies par Visual Basic sont de ce type, par exemple, la fonction VarType (Name) (retourne un entier indiquant le type de la variable Name de type Variant). Voici un exemple de procdure Function qui multiplie deux valeurs relles et affiche le rsultat dans un Label (voir la recopie dcran dans la figure qui suit) : _________________________________ Ce programme permet de multiplier deux nombres
page 21

Option Explicit Force les variables tre explicitement dclares Private Sub cmdMultiplier_Click() Dim valeur1 As Single, valeur2 As Single valeur1 = Val(txt1.Text) La fonction Val convertit une chane en un nombre valeur2 = Val(txt2.Text) lblMultiplication.Caption = "Le rsultat de la multiplication est : " & _ Multiplication(valeur1, valeur2) End Sub Private Function Multiplication (x As Single, y As Single) As Single Multiplication = x*y End Function _________________________________

La valeur, retourne par la fonction Multiplication, est place dans le nom de la fonction (on parle de pseudo-variable). 5.5 Appel par valeur, appel par rfrence

Le passage des paramtres dune procdure peut se faire par valeur (en anglais by value) ou par rfrence (en anglais by reference). Dans les deux exemples prcdents, chacun des arguments a t pass par rfrence, ce qui est le mode de passage par dfaut. Avec un tel mode de passage, le programme " appelant " donne la procdure " appele " la possibilit daccder directement aux donnes de " lappelant " et donc de modifier ces donnes. Quand un argument est pass par valeur, une copie de la valeur de largument est faite et passe la procdure " appele ". Cette dernire peut manipuler cette copie, mais ne peut pas manipuler la donne dorigine de " lappelant ". Notons que ce mode de passage amoindrit les performances vis--vis du temps dexcution et de lespace mmoire, dans le cas dun grand nombre de paramtres passer. Lentte de la fonction suivante dclare deux variables : Function Calcul (ByVal x As Long, y As Boolean) As Double La fonction Calcul reoit x par valeur et y par rfrence, cette entte peut aussi scrire :

page 22

Function Calcul (ByVal x As Long, ByRef y As Boolean) As Double 5.6 Exit Sub et Exit Function

Le fait dexcuter linstruction Exit Sub (respectivement Exit Function) dans une procdure Sub (respectivement Function) provoque une sortie immdiate de la procdure. Le contrle est retourn " lappelant " et linstruction situe immdiatement en squence aprs lappel est excute. 5.7 Dure de vie dune variable

Une variable possde diffrents attributs : Un nom, un type, une taille et une valeur. A cela sajoutent dautres attributs : Une dure de vie (en anglais storage class), une porte (en anglais scope). Lattribut dure de vie dune variable dtermine la priode durant laquelle elle existe en mmoire, certaines existent brivement, dautres sont rgulirement cres et dtruites, dautres existent tout au long de la dure dexcution du programme. Les variables locales (i.e., dclares dans une procdure ou une fonction) non statiques (aussi appeles variables automatiques) sont dfinies par dfaut et sont cres quand la procdure devient active. Ces variables existent (seulement) jusqu la fin dexcution de la procdure. Le mot cl Static est utilis pour dclarer des variables locales statiques. De telles variables sont toujours connues seulement dans la procdure dans laquelle elles ont t dclares (on dit quelles ont la mme portes), mais la diffrence des variables automatiques, les variables statiques conservent leurs valeurs (i.e., celles acquises lors de la dernire sortie de la procdure). Ces variables sont implicitement initialises zro lors du premier appel de la procdure. Ce type de variables permet de ne pas dclarer des variables globales lorsquune seule procdure en a besoin. Exemple : Private Sub Exemple_Click () Static N As Integer N est une variable entire statique Dim M As Integer M est une variable entire non statique N=N+1 M=M+1 End Sub Lors du premier appel de cette procdure, les variables N et M sont gales 0, aussi lors de la premire sortie de cette procdure, les variables N et M sont gales 1. Lors du second appel, la variable N est gale 1 (valeur acquise lors de la prcdente sortie) alors que la variable M est toujours gale 0. Aussi lors de la seconde sortie de cette procdure, la variable N est gale 2 alors que la variable M est toujours gale 1. 5.8 Porte dune variable, dune procdure, dune fonction

Ltendue dun identificateur (nom dune variable, ou nom dune procdure dfinie par le programmeur) est la rgion dans laquelle lidentificateur peut-tre rfrenc. Par exemple, une variable dclare en local dans une procdure peut seulement tre rfrence dans cette procdure. Les trois portes dun identificateur sont la porte locale (en anglais local scope), la porte au niveau module (en anglais module scope) et la porte au niveau public (en anglais public scope). La porte locale sapplique des variables dclares dans le corps dune procdure. Les variables locales peuvent tre rfrences partir de lendroit o elles ont t dclares jusqu la sortie de la procdure (ou de la fonction), i.e., End Sub (ou End Function).
page 23

La porte au niveau module, aussi appele porte au niveau priv (en anglais Private scope), sapplique des variables dclares dans la partie " dclaration gnrale du module " via le mot cl Dim. Ces variables peuvent seulement tre rfrences dans le module dans lequel elles ont t dclares. La porte au niveau public fait rfrence des variables dclares en public dans un module. De telles variables sont accessibles pour tous les modules. Remarque : Quand une variable est dclare au niveau module et a le mme nom quune variable dclare en local, celle qui est dclare au niveau module est " cache " tant que la variable dclare en local est active. Une alternative cette source derreur consiste ne pas utiliser des noms de variables dupliques. 5.9 Les constantes

Visual Basic permet la cration de variables dont la valeur ne peut pas changer durant l'excution d'un programme. Ces variables, particulires, sont appeles des variables constantes1 et sont souvent utilises pour amliorer la " lisibilit " d'un programme. La dclaration d'une variable constante se fait l'aide du mot cl Const : Syntaxe [Public | Private] Const constname [As type] = expression Private est utilis au niveau module pour dclarer les constantes uniquement disponibles dans le module dans lequel la dclaration est effectue. Ce mot cl n'est pas autoris dans les procdures. Public est utilis au niveau module pour dclarer des constantes disponibles pour toutes les procdures de l'ensemble des modules. Ce mot cl n'est pas autoris dans les procdures. Remarque : Utiliser le mot cl Dim avec Const dans une dclaration est une erreur de syntaxe. A titre d'exemple, on peut donner les lignes suivantes : Const pi As Double = 3.14159 ' il est obligatoire d'assigner une valeur Const Deux_pi As Double = pi*2 Public Const RG = "Rouge" En fait, de nombreuses constantes sont reconnues dans Visual Basic, elles sont gnralement prfixes par les lettres vb. Par exemple, dans le cadre d'une bote de dialogue, la constante vbOK (renvoye par la fonction MsgBox) permet de dtecter un appui (un clic) sur le bouton OK. 5.10 Paramtres optionnels

Il est possible de crer des procdures qui acceptent un ou plusieurs paramtres optionnels. Ces paramtres sont spcifis dans lentte de la procdure via le mot cl Optional. Considrons, par exemple, la procdure suivante : Private Sub Ajout (x As Integer, Optional y As Integer = 1) x=x+y End Sub Lentte de cette procdure indique que le second argument peut ne pas tre demand lors dun appel de la procdure Ajout, auquel cas il sera gal 1. Considrons les appels suivants :
1

oxymoron : Figure de style qui runit deux mots en apparence condratictoires (silence loquent).
page 24

Call Ajout Call Ajout (a) Call Ajout (a, b) Le premier appel gnre une erreur de syntaxe car un argument au minimum est rclam. Le second appel est valide, largument optionnel nest pas fourni. Au retour de la procdure, la variable entire a est incrmente par dfaut de 1. Le troisime appel est aussi valide, la variable entire b est fournie en tant quargument optionnel. Au retour de la procdure, la variable entire a est incrmente par dfaut de b. 5.11 Fonctions mathmatiques de Visual Basic

Certaines fonctions de calcul mathmatique sont disponibles : Fonction Abs (x) Atn (x) Cos (x) Exp (x) Int (x) Description Exemple Valeur absolue de x Abs (-2) est gal 2, Abs (3) est gal 3 Arc tangente (en radians) de x Atn (1) est gal pi/4 Cosinus (en radians) de x Cos (0) est gal 1 x Fonction exponentielle e Exp (1.0) est gal 2.71828 Retourne le plus grand entier infrieur ou Int (-5.3) est gal 6 gal x Int (0.893) est gal 0 Int (76.45) est gal 76 Fix (x) Partie entire de x Fix (-5.3) est gal 5 Fix (0.893) est gal 0 Fix (76.45) est gal 76 Log (x) Logarithme nprien de x Log (2.718282) est gal 1.0 Round (x, y) Retourne une valeur approche de x avec y Round (4.84) est gal 4 dcimales (si y est omis, x est retourn Round (5.73839, 3) est gal 5.738 comme tant un entier) Sgn (x) Signe de x Sgn (-19) est gal 1 Sgn (0) est gal 0 Sgn (3.4) est gal 1 Sin (x) Sinus (en radians) de x Sin (0) est gal 0 Sqr (x) Racine carr de x Sqr (9.0) est gal 3 Tan (x) Tangente (en radians) de x Tan (0) est gal 0 5.12 Module standard

Un module standard (ou module code) na pas dIUG (au contraire des modules feuilles, en anglais form modules), il contient uniquement du code. Les procdures que le programmeur souhaite utiliser dans de nombreux projets (on parle de briques logicielles) sont souvent places dans des modules standards. Comme pour un module feuille, un module code admet une partie " dclaration gnrale ". Par dfaut, les variables dun module et les procdures vnementielles sont prives (Private) au module dans lesquelles elles ont t dfinies : Une variable, ou une procdure, prive peut seulement tre utilise dans le module o elle a t dclare. Si le programmeur souhaite permettre un autre module lutilisation dune variable, ou procdure, le mot cl Public doit tre utilis dans la dclaration : Les variables, ou procdures, publiques sont accessibles dans chacun des modules du projet. Remarques :

page 25

Les modules standards sont tous placs dans un classeur nomm Modules, alors que les feuilles sont places dans un classeur nomm Feuilles (cf. figure suivante).

- Les noms des fichiers de modules standards se terminent par .bas. - Visual Basic ne propose pas de module standard par dfaut dans un projet, il faut lajouter manuellement (voir le menu Projet | Ajouter un module). - Un projet peut avoir plusieurs modules codes (aussi bien que plusieurs modules feuilles). A titre dexemple, le programme suivant contient un module feuille et un module code. Le fait de cliquer sur le bouton Ecrire de la feuille (voir la saisie dcran dans la figure qui suit) appelle la procdure ModuleEcrire, dclare en public et situe dans un module standard. _______________ .frm _______________________ Utilisation dun module code Option explicit Private Sub cmdEcrire_Click () La procdure ModuleEcrire est dfinie dans le module code (modModule.bas) Call ModuleEcrire End Sub _______________ .bas _______________________ modModule.bas Option Explicit Public Sub ModuleEcrire () frmFeuille.Print "ModuleEcrire" End Sub ____________________________________________

page 26

LES TABLEAUX

Un tableau peut se reprsenter comme tant un groupe conscutif (une srie) demplacements mmoires de mme nom et de mme type (voir 4.4). La rfrence un emplacement particulier, ou lment dans le tableau, se fait travers le nom du tableau et sa position (son index) dans le tableau. Le traitement des variables contenues dans un tableau peut alors se faire l'aide de boucle. Par exemple, soit un tableau, mono dimensionnel, nomm Nombre contenant 6 lments de type entiers : Nombre (0) Nombre (1) Nombre (2) Nombre (3) Nombre (4) Nombre (5) 55 22 15 1 89 56

Notons quil existe deux catgories de tableaux : Les tableaux statiques (en anglais, static arrays) dont le nombre maximum dlments est fix, et les tableaux dynamiques (en anglais, dynamic arrays, aussi appel redimmable arrays) dont le nombre dlments peut varier durant le droulement du programme. 6.1 Leurs dclarations

Les tableaux peuvent tre dclars comme Public uniquement dans un module code. Les tableaux actifs au niveau dun module sont dclars dans la partie " dclarations gnrales " du module via le mot cl Dim ou Private. Les tableaux actifs au niveau local sont dclars dans une procdure via le mot cl Dim ou Static. La dclaration Dim Nombre (5) As Integer dclare un tableau Nombre constitu de six entiers. Les fonctions LBound (Nombre) et UBound (Nombre) retournent respectivement lindice le plus petit et lindice le plus grand du tableau, lindice tant de type Long. Par dfaut, le plus petit indice dun tableau est gal 0. Le fait de spcifier une valeur pour le plus grand indice dun tableau, dans notre exemple 5, indique que le tableau est statique. Par dfaut, les six entiers du tableau sont gaux 0, la ligne Nombre (0) = 55
page 27

permet de fixer la valeur 55 llment du tableau Nombre dindice 0. La dclaration Dim Tab (-5 To 4) As String dclare un tableau Tab constitu de 10 chanes de caractres, LBound (Tab) et UBound (Tab) sont respectivement gaux 5 et 4. Les tableaux peuvent tre multi-dimensionnels, la dclaration Dim Tab3 (50 To 100, 8, 7 To 15) dclare un tableau Tab de dimension 3, LBound (Tab, 3) est gal 7, UBound (Tab, 1) est gal 100. 6.2 Les tableaux dynamiques

Les tableaux dont la taille peut augmenter, ou diminuer, en cours dexcution sont appels tableaux dynamiques. Aucune taille nest donne lors de la dclaration dun tel tableau. Par exemple, la ligne Dim TabDynamique () As Double dclare le tableau TabDynamique comme tant un tableau dynamique constitu de rels doubles. La taille dun tableau dynamique est spcifie en cours dexcution laide du mot cl ReDim (notons que la dimension du tableau ne peut pas tre modifie). Par exemple, la ligne ReDim TabDynamique (10) alloue 11 lments TabDynamique. Le fait dexcuter ReDim provoque la perte des valeurs contenues dans le tableau. Toutefois, les valeurs dj dans le tableau peuvent tre conserves en plaant le mot cl Preserve aprs ReDim. Le mot cl Erase Tab permet, en cours dexcution, de supprimer de la mmoire le tableau dynamique Tab. 6.3 Passage de tableaux dans les procdures

Pour passer tous les lments dun tableau en paramtre une procdure, il suffit de spcifier le nom du tableau suivi d'une paire de parenthses vide. Par exemple, si le tableau TemperatureMensuelle est dclar comme suit : Dim TemperatureMensuelle (12) As Integer l'appel Call ModifierTableau (TemperatureMensuelle ( )) passe tous les lments du tableau TemperatureMensuelle la procdure ModifierTableau. Les tableaux sont automatiquement passs par rfrence l'appel peut donc modifier la valeur des lments du tableau fourni par l'appelant. Pour passer un lment d'un tableau une procdure, utiliser l'lment du tableau comme paramtre, par exemple :
page 28

Call PasserUnElement (TemperatureMensuelle (4)) Pour une procdure recevant un tableau, la liste des paramtres de la procdure doit spcifier le passage d'un tableau. Par exemple, l'entte de la procdure ModifierTableau devra s'crire comme suit : Private Sub ModifierTableau (a( ) As Integer) ainsi, ModifierTableau s'attend recevoir un tableau d'entier dans le paramtre a (la taille du tableau n'est pas spcifie entre les parenthses).

LES CHANES

Chaque caractre est reprsent en interne par un nombre entier, compris entre 0 et 255 (par exemple, 65 reprsente la lettre A). Cet ensemble de valeurs entires est appel lensemble des caractres American National Standards Institute (ANSI). Les 128 premiers caractres ANSI (de 0 127) correspondent aux valeurs de lAmerican Standard Code for Information Interchange (ASCII). Les valeurs ANSI de 128 255 reprsentent un ensemble de caractres spciaux, daccents, de fractions, etc. Une chane est une srie de caractres formant une entit. Une chane dans Visual Basic a un type de donne String. Deux types de chanes sont possibles : Les chanes de longueur variable (en anglais, variable-length strings), les chanes de longueur fixe (en anglais, fixed-length strings). Par dfaut, les variables String sont de longueur variable, exemple : Dim ch As String ch = "02 41 abc" la variable ch est dclare de type String, elle contient la chane "02 41 abc". La chane (NomVariable) de longueur fixe (TailleChane) est dclare comme suit : Dim NomVariable As String * TailleChane La fonction Len (pour length) est utilise pour dterminer la longueur d'une chane, par exemple, Len ("02 41 abc") est gal 11. 7.1 Concatnation avec & (esperluette) et + ch1 = "Pro" ch2 = "gramme" ch3 = ch1 & ch2 ch4 = ch1 + ch2 ch3 et ch4 contiennent la chane "Programme". Les oprateurs & et + sont quivalents dans le cas o les oprandes sont des chanes. L'utilisation de l'opration + entre des oprandes de type diffrent, par exemple, la ligne ch = "bonjour" + 22 provoque une erreur car Visual Basic tente de convertir la chane "bonjour" en un nombre, de manire l'additionner (+) 22. Pour cette raison, il est prfrable d'utiliser l'opration & pour concatner des chanes.
page 29

7.2

Comparaison de chanes

Il est frquent de devoir comparer deux chanes. Pour cela, on dispose de la fonction StrComp et des oprateurs <, <=, >, >=, =, <>. La comparaison entre deux chanes est base sur les diffrentes valeurs ANSI codant les chanes. La fonction StrComp (ch1, ch2) retourne 0 lorsque les chanes ch1 et ch2 sont gales, -1 si la chane ch1 est infrieure ch2, 1 si la chane ch1 est suprieure ch2. A titre d'exemple, StrComp ("A", "B") est gal 1 car le code ANSI de la lettre A (= 65) est infrieur celui de la lettre B (= 66). Une option permet d'tre case-sensitive ou case-insensitive. 7.3 L'oprateur Like fournit un autre moyen de comparer deux chanes. Manipulation de caractres dans une chane

Visual Basic fournit diffrents moyens permettant la manipulation de caractres dans une chane. La fonction Mid$ (ch, pos, nb) retourne une sous-chane de la chane ch constitue de nb caractres partir du caractre indiqu par la position pos (la position du premier caractre est gale 1). Par exemple : sous_ch = Mid$ ("programme", 2, 3) ' sous_ch = "rog"

Cette fonction permet aussi de remplacer une portion de chane par une autre. Par exemple, les lignes ch = "Bonjour monsieur" Mid$ (ch, 9, 1) = "M" change le contenu de ch en "Bonjour Monsieur". 7.4 Left$, Right$, InStr, InStrRev, Split, Join

La fonction Left$ (ch, nb) retourne une chane compose de nb caractres situs dans la partie gauche de la chane ch, la fonction Right$ (ch, nb) fait de mme pour la partie droite de la chane. A titre d'exemple, considrons les lignes suivantes ch = "Bonjour madame" ch1 = Left$ (ch, 7) ch2 = Right$ (ch, 6)

' ch1 = "Bonjour" ' ch2 = "madame"

La fonction InStr (pos, source, rech) retourne, si possible, un nombre entier reprsentant la position dans la chane de base source de la chane cherche rech, cette recherche dbutant partir de la position pos. Si la chane rech n'est pas dtecte, la fonction InStr renvoie une valeur nulle. A titre d'exemple, considrons les lignes suivantes ch = "Bonjour madame" i = InStr (1, ch, "on") j = InStr (2, ch, "on") k = InStr (3, ch, "on")

'i=2 'j=2 'k=0

La fonction InStrRev a un mode de fonctionnement similaire celui de InStr, si ce n'est que la recherche dbute partir de la fin de la chane (i.e., de droite gauche dans la chane de base).
page 30

La fonction Split (expression, dlimiteur) retourne dans un tableau (en fait un vecteur) des sous-chanes de caractres. L'extraction des sous-chanes de la chane expression se fait au vue du dlimiteur, par exemple : Dim tableau() As String tableau = Split ("ab" "c" "d1f", " ") retourne les sous-chanes "ab" dans tableau(0), "c" dans tableau(1) et "d1f" dans tableau(2). La fonction Join (tableau source, dlimiteur) est la fonction duale de Split. Elle retourne une chane joignant les sous-chanes contenues dans le tableau (en fait un vecteur) tableau source, les sous-chanes tant spares par un dlimiteur. Par exemple, Dim ch As String ch = Join (tableau, ".") retourne la chane "ab.c.d1f" dans la variable ch. 7.5 LTrim$, RTrim$ et Trim$

Les fonctions LTrim$, RTrim$ et Trim$ (en anglais, le verbe trim signifie couper, tailler) tent les (ventuels) espaces situs respectivement gauche, droite, la fois gauche et droite, d'une chane. A titre d'exemple, considrons les lignes suivantes ch = " Bonjour " ch1 = LTrim$ (ch) ch2 = RTrim$ (ch) ch3 = Trim$ (ch) 7.6 String$ et Space$

' ch1 = "Bonjour " ' ch2 = " Bonjour" ' ch3 = "Bonjour"

La fonction String$ (nb, ascii) retourne une chane de nb caractres dont le code ASCII est spcifi par ascii. A titre d'exemple, considrons les lignes suivantes ch1 = String$ (4, "A") ch1 = String$ (4, 66) ' ch1 = "AAAA" ' ch1 = "BBBB"

La fonction Space$(nb) retourne une chane compose de nb caractres d'espace. 7.7 Autres fonctions de traitement de chanes

La fonction Replace (source, ch__remplacer, ch_de_remplacement) retourne une chane dans laquelle la sous-chane ch__remplacer a t remplace plusieurs fois par la sous-chane ch_de_remplacement. La fonction StrReverse (ch) retourne une chane contenant des caractres dont l'ordre a t invers par rapport la chane ch. Les fonctions UCase$ (ch) et LCase$ (ch) convertissent tous les caractres de la chane ch respectivement en majuscules (en anglais, upper-case letters) et minuscules (en anglais, lower-case letters). Les caractres qui ne sont pas des lettres demeurent inchangs. 7.8 Fonctions de conversion Asc et Chr$
page 31

La fonction Asc (ch) retourne un nombre entier correspondant au code ASCII du premier caractre de la chane ch. Rciproquement, la fonction Chr$ (ascii) retourne le caractre correspondant au code ASCII donn (nombre entier ascii). IsNumeric, Val, Str$, Hex$ et Oct$

La fonction IsNumeric (ch) retourne True si la chane ch peut reprsenter un nombre numrique. La fonction Val (ch) convertit la chane ch en une valeur numrique (la lecture de la chane s'arrte au premier caractre ne faisant apparemment pas partie d'un nombre). A titre d'exemple, considrons les lignes suivantes Dim ch1 As String, ch2 As String Dim x As Integer, y As Double, z As Double ch1 = " 2.35 a" x = Val (ch1) 'x=2 y = Val (ch1) ' y = 2.35 ch2 = "a12" z = Val (ch2) 'z=0 La fonction Str$ (valeur) convertit une valeur numrique en chane. Il est possible de convertir des valeurs numriques en chane sous une forme hexadcimale (base 16), ou octale (base 8), via les fonctions Hex$ et Oct$ respectivement. Visual Basic fournit plusieurs autres fonctions permettant de convertir une chane en un autre type de donne.

INTERFACE UTILISATEUR GRAPHIQUE : LES BASES

Les Interfaces Utilisateurs Graphiques (IUG) sont construites partir de contrles. Un contrle est un objet (un objet s'utilise travers ses proprits, ses mthodes et ses vnement associs) avec lequel un utilisateur interagit via la souris, ou le clavier. Les contrles Visual Basic sont de deux types : - les contrles intrinsques, aussi appels contrles standards, disponibles par dfaut dans la barre de contrles de l'EDI. Une description rapide de ces contrles est donne au 2.1. - les contrles ActiveX. Ces contrles sont mis disposition dans la barre de contrles, en ouvrant le menu Projet | Composants, puis en cliquant l'onglet nomm Contrles et en cochant la case correspondant au contrle ActiveX insrer. A titre d'exemple, des contrles ActiveX sont disponibles dans le cadre des bases de donnes, des rseaux, sachant que certains des contrles sont spcifiques aux diffrentes versions (Learning, Professional, Enterprise) de Visual Basic. Une description complte des contrles disponibles dans Visual Basic est accessible dans l'aide en ligne (taper sur la touche F1). Dcrivons ici quelques-uns des contrles les plus utiliss, travers une description de leurs proprits, mthodes et vnements associs. 8.1 Le contrle Label

Les contrles label (en franais, tiquette) servent afficher du texte l'cran, en mode cration ou excution. Ce texte est non modifiable directement par l'utilisateur.
page 32

Ses proprits En dehors de la proprit Name (par dfaut, Label1, Label2, ) qui permet de diffrencier les objets entre eux, la principale proprit du contrle Label est Caption (notons que le texte par dfaut correspond celui mis par dfaut dans la proprit Name) qui permet l'affichage (si ncessaire) d'un texte. Comme pour un module feuille, les proprits BackColor et ForeColor dterminent respectivement la couleur du fond et celle du texte affich dans le contrle Label. La proprit Font permet de spcifier la police utilise pour afficher le texte (nom, style (standard, italique, ), taille, ). La proprit Alignment permet au choix de cadrer le texte affich droite, gauche ou au centre. La proprit Enabled permet d'activer, ou non, le contrle lors de l'excution de l'application. La proprit Visible permet, par exemple en rponse un vnement, de cacher (False), ou non (True), le contrle. Ses mthodes Nous retiendrons seulement la mthode Move qui permet le dplacement du Label. Ses vnements associs Parmi les vnements lis la souris, on peut retenir les vnements : MouseDown, MouseUp, MouseMove, Click, DblClick. Remarques : - Les vnements MouseDown et MouseUp se produisent, dans l'ordre, lorsque l'utilisateur enfonce (MouseDown), ou relche (MouseUp), un bouton de la souris. - L'vnement MouseMove, gnr continuellement lorsque le pointeur de la souris se dplace sur des objets. La gnration de cet vnement s'intercale entre MouseDown et MouseUp. - L'vnement Click se produit lorsque l'utilisateur clique un bouton de la souris puis le relche sur un objet. Lorsque l'on effectue un clic, la squence d'vnements gnrs est, dans l'ordre, MouseDown, MouseUp, Click. - L'vnement DblClick se produit lorsque l'utilisateur appuie sur, et relche, un bouton de la souris deux fois de suite sur un objet. Lorsque l'on effectue un double clic, la squence d'vnements gnrs est, dans l'ordre, MouseDown, MouseUp, Click, DblClick, MouseUp. 8.2 Le contrle TextBox

Le contrle TextBox (en franais, zone de saisie) permet, via une zone l'cran, un utilisateur l'introduction, ou l'affichage, d'informations. Le tableau ci-dessous regroupe les principales proprits, mthodes et vnement associs ces contrles. Proprit, mthode, vnement Proprit Enabled MaxLength MultiLine PasswordChar Text Mthode SetFocus Description

Spcifie si l'utilisateur peut, ou non, agir sur le contrle. Spcifie le nombre maximal de caractres pouvant tre entrs (la valeur 0, mise par dfaut, indique qu'il n'y a pas de limite). Permet quand elle est True d'entrer du texte sur plusieurs lignes. Spcifie le caractre affich la place des caractres entrs. Spcifie le texte entr. Place le focus sur le contrle.
page 33

Evnement Change

Evnement appel chaque fois que le contenu de la zone est modifi (par l'utilisateur ou par le programme). Click, DblClick, MouseDown, Evnements lis la souris. MouseMove, MouseUp GotFocus, LostFocus Evnements gnrs lors de la rception, resp. de la perte, du focus. KeyDown, KeyPress, KeyUp Evnements lis au clavier (gnrs dans l'ordre : Touche presse, appuye, relache). 8.3 Le contrle CommandButton

Les contrles CommandButton sont reprsents par des boutons, appels aussi " boutons-poussoirs ", qu'un utilisateur peut cliquer pour excuter une action. La proprit Caption permet d'crire un texte sur le bouton. La proprit Enabled indique si le bouton est actif (True), ou non (False). Suite un clic sur un bouton (actif), l'vnement Click est appel. 8.4 Les contrles ListBox, ComboBox

Les listes permettent de visualiser une liste de diffrents items (lments). Pour raliser des listes, Visual Basic propose deux types de contrles : ListBox (liste) ou ComboBox (liste combine, ce contrle permet de combiner une liste avec une zone de saisie). Le contrle ListBox

Quand une liste (ListBox) contient plus d'items qu'elle ne peut en afficher, une barre de dfilement (en anglais, scrollbar) verticale apparat automatiquement. Proprit, mthode, vnement Proprit Columns Description

Enabled List ListCount ListIndex

MultiSelect

Selected

(entier) Spcifie si le contrle a une barre de dfilement horizontal, si oui, spcifie le nombre de colonnes. Une valeur gale 0 indique qu'il n'y a pas de dfilement horizontal, une valeur suprieure 0 spcifie le nombre de colonnes dans lesquelles les items sont lists horizontalement. (boolen) Spcifie si l'utilisateur peut, ou non, agir sur le contrle. (tableau de String) Contient les lments de la liste, le plus petit indice du tableau est gal 0, le plus grand indice est gal ListCount - 1. (entier) Contient le nombre d'lments de la liste. (entier de -1 ListCount - 1) (pour les listes slection simple) Contient l'indice de l'lment actuellement slectionn. La valeur - 1 signifie qu'aucun lment n'est slectionn. (entier de 0 2) Spcifie si l'utilisateur peut slectionner plus d'un item la fois. Une valeur gale : - 0 autorise la slection d'un seul lment la fois (slection simple), - 1 autorise plusieurs choix, chaque clic slectionne/dslectionne un item (slection multiple), - 2 autorise un choix tendu d'items possibilit d'utiliser les touches shift et contrle (slection multiple tendu). (tableau de boolens) (pour les listes slection multiple) L'lment d'indice i est actuellement slectionn si Selected (i) est True.
page 34

SelCount Sorted Text Mthode AddItem

(entier) (pour les listes slection multiple) Indique le nombre d'lments slectionns. (boolen) Permet d'avoir une liste dont les lments sont tris par ordre alphabtique. (String) Spcifie l'lment slectionn, correspond List (ListIndex). AddItem item [, index] permet d'ajouter (en fin de liste) l'lment item dans la liste. Le paramtre optionnel index permet d'insrer l'lment item dans la liste l'indice index. Enlve tous les lments de la liste. RemoveItem index permet d'enlever l'lment d'indice index de la liste. Evnement activ chaque fois qu'un lment de la liste est slectionn.

Clear RemoveItem Evnement Click

Le contrle ComboBox

La liste combine permet l'affichage d'une liste ( slection simple) et d'une zone de saisie. Elle permet l'utilisateur de slectionner un lment dans une liste, ou d'entrer une donne dans une zone de saisie. Il existe trois types de listes combines, dfinis par la valeur (entire) de la proprit Style : - 0 (VbComboDropDown) (Valeur par dfaut.) Liste droulante modifiable. Comprend une zone de saisie avec, ct, une flche droulante (drop down) permettant de faire apparatre une liste, dite droulante. L'utilisateur peut slectionner une option dans la liste, ou taper ce qui convient dans la zone de texte. - 1 (VbComboSimple) Liste modifiable simple. Comprend une zone de texte et une liste non droulante (toujours visible). L'utilisateur peut slectionner une option de la liste, ou taper ce qui convient dans la zone de texte. La taille d'une liste modifiable simple inclut les parties texte et liste. Par dfaut, une liste modifiable simple est dimensionne de sorte que la liste ne s'affiche pas. Augmenter la valeur de la proprit Height pour afficher une plus grande partie de la liste. - 2 (VbComboDrop-DownList) Liste droulante (sans saisie possible). Ce type de liste permet seulement l'utilisateur de slectionner une option dans la liste droulante (semblable 0 mais la saisie est interdite). On retrouve des proprits et mthodes similaires celles des contrles TextBox. 8.5 Les contrles Frame, CheckBox, OptionButton

Les contrles Frame (en franais, cadre) permettent de regrouper (souvent de manire fonctionnelle) plusieurs contrles dans un cadre afin d'en faire un groupe identifiable. Un tel contrle est souvent coupl aux cases option. La proprit Caption permet de donner un intitul au cadre, les proprits Enabled et Visible permettent de rendre le cadre respectivement inactif (de mme pour les contrles qu'il contient), et non visible - cach - (de mme pour les contrles qu'il contient). Les contrles CheckBox (en franais, case cocher) peuvent tre slectionns, ou non. Ils sont habituellement utiliss pour exprimer des attributs optionnels, par exemple l'attribut Mari d'une personne. La proprit Value permet de savoir si une case est dslectionne - non coche - (0, vbUnChecked), ou slectionne (1, vbChecked), ou indisponible - la case est alors ombre - (2, vbGrayed) (cette valeur ne peut tre fixe que par programmation). L'vnement Click est appel lorsqu'une case cocher est slectionne, ou dslectionne.
page 35

Les contrles OptionButton (en franais, case option) fonctionnent sensiblement selon le mme principe, mais par groupe. Dans un mme groupe, seule une case option peut tre slectionne la fois, i.e., les cases option d'un mme groupe sont exclusives les unes par rapport aux autres. Les cases option forment un groupe lorsqu'elles sont dans le mme cadre. La proprit Value permet de savoir si une case option est slectionne - pointe - (True), ou dslectionne (False). L'vnement Click est appel lorsqu'une case option est slectionne, ou dslectionne. 8.6 Les menus

Visual Basic fournit un moyen simple de crer des menus via l'diteur de menus (Menu Editor), voir le menu Outils | Crateur de menus. L'diteur de menus est, en fait, une manire d'affecter les proprits d'un menu. Une fois un menu cr, ses proprits et ses vnements associs sont visibles dans les fentres Proprits et Code. La bote de dialogue de l'diteur de menus contient les zones de saisies Caption et Name, pour indiquer respectivement le nom du menu visible par l'utilisateur (par exemple, pour entrer le menu Fichier, entrer &Fichier), et le nom de la variable utilise par le programmeur (par exemple, mnuFichier). Il est bien sr possible de crer : - des menus droulants (listes droulantes d'options qui n'apparaissent qu' la suite d'un clic sur un titre de menu) ; - des menus imbriqus (cinq niveaux de retrait au maximum). 8.7 La fonction MsgBox

La fonction MsgBox (bote de message) permet d'afficher, de manire standard sous Windows, une bote de dialogue fournissant un message destination de l'utilisateur propos de l'tat d'excution du programme. La bote de message MsgBox peut, selon sa configuration, afficher un message (un texte), un icne de mme que des boutons (ces derniers permettant de fournir des informations au programme). A titre d'exemple, le programme suivant permet - par un appui sur un bouton de commande - de faire apparatre une bote de message (voir la figure qui suit). Selon la rponse (appui sur bouton Yes ou No) de la bote de message, le contenu de la variable en retour de la fonction MsgBox est affich dans la fentre. ____________________ Option Explicit Private Sub CmdExemple_Click() Dim r As Integer r = MsgBox("Message", vbYesNo + vbInformation + vbApplicationModal, _ "Exemple") ' vbYesNo permet l'affichage des boutons Yes et No ' vbInformation permet l'affichage de l'icne information ' vbApplicationModal indique que la bote de message est modale (i.e., lutilisateur ' ne peut pas interagir sur une fentre tant que la bote de message nest pas ferme) ' r = 6 (vbYes) si le bouton Yes a t press ' r = 7 (vbNo) si le bouton No a t press Print r End Sub ____________________
page 36

8.8

Le contrle Timer

Le contrle Timer (minuterie) pilote le systme d'horloge, il permet le dclenchement de certaines actions intervalles rguliers. La proprit Enabled permet de lancer, ou d'arrter, l'horloge, tandis que la proprit Interval permet de dfinir le nombre de millisecondes (compris entre 0 et 64 767 (~ 64,8 sec)) entre les vnements de la minuterie. Le seul vnement disponible est Timer, il se produit lorsque l'intervalle de temps prdfini est coul. Cet vnement est donc priodique, il suffit de lui associer une procdure pour que celle-ci soit dclenche priodiquement. Notons que ce contrle n'est pas visible en mode excution.

BASE DE DONNES : ACCS

L'utilisation de fichiers de type squentiel est approprie dans le cas d'applications exploitant la plupart des informations contenues dans le fichier. L'emploi des fichiers accs direct est plus adapt des applications nutilisant qu'une faible partie des donnes du fichier, et o il est important de pouvoir localiser rapidement une donne. Visual Basic fournit de nombreuses manipulations sur de tels fichiers, qui, faute de temps, ne sont pas abordes dans ce cours. Le principal inconvnient li l'utilisation des fichiers (squentiels ou accs direct) vient de ce qu'ils permettent simplement un accs aux donnes, sans possibilit de recherche plus efficace. Au contraire, les systmes de bases de donnes2 vont organiser les donnes de manire faciliter la demande de requtes appropries la recherche des donnes souhaites. Dans ce chapitre, nous abordons la gestion des bases de donnes relationnelles. L'accs aux informations dans de telles bases, largement utilises, peut se faire dans l'environnement de Visual Basic via l'utilisation de requtes3 SQL (Structured Query Language, ce langage permet d'effectuer des requtes, i.e., de rechercher des informations satisfaisant un critre donn).

Une base de donnes est une collection de donnes. Un systme de base de donnes regroupe les donnes, le matriel sur lequel les donnes rsident, le logiciel (appel moteur de base de donnes) qui contrle le stockage - l'extraction - de donnes, et les utilisateurs. 3 Requte se traduit par query en anglais. page 37

Les bases de donnes relationnelles sont des reprsentations logiques de donnes qui permettent d'tablir des relations entre les donnes, ceci sans se soucier de l'implantation physique des structures de donnes. Une base de donnes relationnelle est compose de tables (voir la figure suivante titre d'exemple).

Table : EMPLOYES Numro 10235


Un enregistrement Deux champs

Nom H. Dupond P. Pichon S. Vartan H. Lebrun

Dpartement Salaire Localit 74 62 49 73 10 250 Annecy 9 823 Calais 15 234 7 852 Angers Chambry

985 567 12563

Cls primaires

Une colonne

Les lignes d'une table sont appeles des enregistrements (en anglais, records), ou lignes (en anglais, rows). Dans l'exemple, la table EMPLOYES est constitue de 4 enregistrements. Chaque colonne d'une table reprsente un champ diffrent. Dans l'exemple, la valeur du champ Numro de chacun des enregistrements est appele la cl primaire, au sens o elle permet de rfrencer les donnes dans la table. Dans Visual Basic, une table est manipule comme un objet Recordset. 9.1 Introduction de l'ADO Data Control 6.0 et du DataGrid Control 6.0

Une fois un contrle ADO Data Control mis en place (connect une table d'une base de donnes), il est possible de lier ce contrle plusieurs contrles, dits dpendants, permettant l'affichage et la manipulation de donnes, le tableau suivant liste quelques-uns de ces contrles. Contrle CheckBox ComboBox DataCombo DataGrid DataList Hierarchical FlexGrid Image ImageCombo Label Listbox MaskedEdit Microsoft Chart MonthView PictureBox Description Peut tre rattach un champ boolen d'une table. Peut tre li une colonne d'une table. Similaire ComboBox, il permet de passer un champ donn un autre contrle de donnes. Permet l'affichage et la manipulation d'une table, ou d'un rsultat d'une requte. Similaire au ListBox, il permet de passer un certain champ un autre contrle de donnes. Ce contrle est similaire au DataGrid, mais l'utilisateur peut seulement visualiser les donnes travers un FlexGrid. Affiche des images sous diffrents formats. Similaire ComboBox, il peut afficher des images dans une liste. Peut tre utilis pour afficher la valeur d'un champ d'une table. Peut tre li une colonne d'une table. Similaire TextBox, il permet de contrler le format de donnes dans un champ. Permet la reprsentation d'un tableau de donnes sous forme d'un graphe. Affiche des dates dans un format appropri. Une version plus labore du contrle Image.
page 38

RichTextBox TextBox

Permet d'afficher, ou d'entrer, un texte format. Permet d'afficher, ou d'entrer, un texte.

Ces contrles dpendants sont lis au contrle ADO Data Control via les proprits DataSource, DataField et ventuellement DataFormat, afin de spcifier le nom du contrle Data, un champ de la base de donnes, et ventuellement le format des donnes. Le contrle ADO Data Control est un moyen de contrler l'accs une base de donnes, le contrle DataGrid affiche sous la forme d'une table, et permet la manipulation par un utilisateur, des donnes demandes partir d'une base de donnes. Prenons comme exemple la feuille prsente par la figure suivante. Sa construction se fait en utilisant les contrles ADO Data Control et DataGrid, elle ne ncessite aucune programmation pour tablir la connexion avec, par exemple, la table Authors de la base de donnes Biblio.mdb (accessible dans le rpertoire \Microsoft Visual Studio\VB98). Notons qu'il existe trois autres tables : Publishers, Title Author et Titles (utiliser le logiciel Access pour visualiser Biblio.mdb).

Le contrle ADO Data Control permet de connecter l'application une base de donnes, et rend possible la visualisation et la manipulation des donnes par diffrents contrles. Le contrle DataGrid permet un accs ais un enregistrement. Il est ncessaire d'ajouter ces contrles dans la barre de contrles (ces contrles ne sont pas intrinsques). Pour cela, slectionner Composants partir du menu Projet afin d'afficher la bote de dialogue Composants. Aprs avoir gliss ces deux contrles ( savoir Microsoft ADO Data Control 6.0 (OLEDB) et Microsoft Data Grid Control 6.0 (OLEDB), sur une feuille, il est possible de visualiser leurs proprits. Celles qui sont relatives au contrle ADO Data Control sont, notamment, accessibles via un clic droite sur le contrle, suivi d'une slection de Proprits du contrle ADODC, ce qui permet l'affichage d'une bote de dialogue, intitule Pages de proprits.
page 39

Les tapes suivantes permettent de crer une connexion la base de donnes Biblio.mdb (cette procdure se ramne crer une source de donnes OLE4 DB) : 1. Dans le cadre Source de la connexion, slectionner l'option Utiliser une chane de connexion et cliquer sur le bouton Crer pour afficher la bote de dialogue Data Link Properties (une chane de connexion comprend, notamment, le fournisseur de la base de donnes, la localisation et le nom de la base de donnes). Biblio.mdb est une base de donnes de Microsoft Access. 2. Dans l'onglet Provider, slectionner Microsoft Jet 3.51 OLE DB Provider. 3. Dans l'onglet Connection, on introduit, dans le champ Select or enter a database name, le rpertoire et le nom de la base de donnes. 4. Cliquer sur le bouton Test Connection afin de dterminer si la connexion est tablie. 5. Dans l'onglet RecordSource de la bote de dialogue Pages de proprits, slectionner, dans le champ Type de commande, 2 adCmdTable pour spcifier qu'une table dans la base de donnes va tre la source des donnes. Slectionner Authors, dans le champ Nom de procdure stocke ou de table, pour spcifier que les donnes seront retrouves partir de la table Authors dans la base de donnes. Une fois la chane de connexion spcifie, il reste, avant de pouvoir excuter l'application, fixer les valeurs des proprits comme indiques dans le tableau suivant : Contrle Adodc1 DataGrid1 Proprit Caption DataSource AllowUpdate Valeur Table Authors de Biblio.mdb. Slectionner Adodc1. Slectionner False pour empcher une modification par l'utilisateur.

A titre d'essai, on pourra mettre : - une valeur True la proprit AllowUpDate de DataGrid1 pour permettre une modification de la base de donnes (au pralable, penser effectuer une copie du fichier Biblio.mdb modifiable loisir, ce qui sous-entend de changer le contenu du champ Select or enter a database name), - un nom de table diffrent dans la proprit RecordSource pour permettre l'affichage de cette table. 9.2 Survol du langage SQL

A titre d'exemple, nous allons considrer la base de donnes Biblio.mdb. Elle regroupe quatre tables, intitules Authors, Publishers, Title Author et Titles. La table Authors regroupe trois colonnes contenant, pour chaque auteur, dans le champ : - Au_ID : Son numro (unique) d'identification ID, ce numro est la cl primaire pour cette table, - Author : Son nom, - Year Born : Son anne de naissance. La table Publishers regroupe dix colonnes contenant, pour chaque diteur, dans le champ : - PubID : Son numro (unique) d'identification ID, ce numro est la cl primaire pour cette table, - Name : Son nom, - Company Name : Son nom tendu, - Address : Le nom de sa rue,
4

Object Linking and Embedding (OLE) est une technologie - sur laquelle s'appuient les technologies ActiveX - qui permet d'associer des applications entre elles. Par exemple, il est possible d'insrer une feuille Excel dans un document Word, ceci sans avoir explicitement ouvert le logiciel Excel. OLE permet notamment une application de contrler d'autres applications (cette fonction s'appelle Automation). page 40

- City : Sa ville, - State : Son tat, - Zip : Son code postal, - Telephone : Son numro de tlphone, - Fax : Son numro de fax, - Comments : D'ventuels commentaires. La table Title Author regroupe deux colonnes contenant dans le champ : - ISBN : Le numro ISBN d'un ouvrage, - Au_ID : Le numro ID de l'auteur, ou d'un auteur, de cet ouvrage. Cette table permet de lier les ouvrages leurs auteurs (notons qu'un ouvrage peut tre crit par plusieurs auteurs, et qu'un auteur peut crire plusieurs ouvrages). La table Titles regroupe huit colonnes contenant, pour chaque livre, dans le champ : - Title : Son titre, - Year Published : Son anne de parution, - ISBN : Son numro ISBN, ce numro est la cl primaire pour cette table, - PubID : Son numro d'identification ID, ce numro doit correspondre avec un numro ID dans la table Publishers, - Description : Son prix, - Notes : D'ventuelles notes, - Subject : Des mots-cls sur le contenu du livre, - Comments : Une description du livre. La figure suivante montre les relations entre ces tables. Le champ indiqu en gras dans chaque table est la cl primaire de la table.

table Publishers PubID Name Company Name Address City State Zip Telephone Fax Comments

table Titles Title Year Published ISBN PubID Description Notes Subject Comments

table Title Author ISBN Au_ID

table Authors Au_ID Author Year Born

Le langage SQL permet la dfinition et l'extraction de donnes partir de bases de donnes relationnelles. Dans le cadre de ce cours, nous ferons rfrence au langage SQL qu'aux travers des instructions listes dans le tableau suivant : Mot-cl SQL SELECT FROM WHERE ORDER BY Description Slectionne (retrouve) des champs partir d'une, ou plusieurs tables. Pour indiquer les tables contenant les champs (associ SELECT). Critre de slection pour dterminer les enregistrements retrouver. Critre pour mettre en ordre les enregistrements.
page 41

INNER JOIN ON

Permet de lier (fusionner) des tables entre elles.

Instructions SELECT, FROM

Le format de base d'une requte SELECT est : SELECT * FROM TableName L'astrisque (*) indique que tous les champs de la table TableName sont slectionns. Par exemple, la slection de tous les champs de la table Authors utilise la requte : SELECT * FROM Authors Pour slectionner seulement les colonnes Au_ID et Author, on utilise la requte : SELECT Au_ID, Author FROM Authors Instruction WHERE

Le langage SQL permet la slection d'enregistrements satisfaisant un critre dit de slection en utilisant le l'instruction optionnelle WHERE. Le format de base d'une requte SELECT avec un critre de slection est : SELECT * FROM TableName WHERE critre Par exemple, la slection des champs de la table Authors pour lesquels l'anne de naissance (Year Born) de l'auteur est suprieure, ou gale, 1950, se fait travers la requte : SELECT * FROM Authors WHERE [Year Born] >= 1950 La requte : SELECT * FROM Authors WHERE Author Like 'a_r%' permet de localiser les champs de la table Authors pour lesquels le nom de l'auteur (Author) commence avec la lettre a, laquelle est suivie d'un caractre quelconque (spcifi par _), lequel est suivi de la lettre r, laquelle est suivie d'un nombre quelconque de caractres (spcifi par %). Instruction ORDER BY

Le rsultat d'une requte peut tre visualis selon l'ordre alphabtique, ou dans le sens inverse, en utilisant l'instruction optionnelle ORDER BY. Par exemple, pour obtenir l'affichage des champs de la table Authors dans l'ordre alphabtique des noms d'auteurs (Author), on utilise la requte : SELECT * FROM Authors ORDER BY Author ASC ASC (pour ASCending) spcifie l'ordre alphabtique (croissant), DESC (pour DESCending) spcifie l'ordre alphabtique inverse.
page 42

Notons que les instructions prcdentes peuvent se combiner pour ne former qu'une requte. Par exemple, pour localiser les enregistrements de tous les auteurs dont le nom commence par la lettre a, et ceci par ordre alphabtique, on utilise la requte : SELECT * FROM Authors WHERE Author Like 'a%' ORDER BY Author ASC Une requte dans Visual Basic consiste en une (longue) chane. Instruction INNER JOIN ON

Il est souvent ncessaire de fusionner des donnes issues de plusieurs tables, ceci est possible en utilisant le mot-cl INNER JOIN dans l'instruction FROM d'une requte SELECT. INNER JOIN runit les enregistrements appartenant deux, ou plusieurs, tables en testant les valeurs assorties (en accord) dans un champ qui est commun aux tables considres. Le format de base est : SELECT * FROM Table1 INNER JOIN Table2 ON Table1.field = Table2.field La partie " ON Table1.field = Table2.field " spcifie les champs considrs dans les tables qui devront tre compars afin de dterminer les enregistrements retenus. Par exemple, pour fusionner le champ Author de la table Authors avec le champ ISBN de la table Title Author, dans un ordre alphabtique par Author, de manire disposer du, ou des, numro(s) ISBN du, ou des, livre(s) crit(s) par chacun des auteurs (cf. figure suivante), on utilise la requte : SELECT Author, ISBN FROM Authors INNER JOIN [Title Author] ON Authors.Au_ID = [Title Author].Au_ID ORDER BY Author ASC

On peut se reprsenter la fusion effectue dans l'exemple prcdent, ainsi :


page 43

1. On commence par le premier enregistrement de la table Authors. 2. On cherche le champ Au_ID. 3. On va dans la table Title Author pour trouver le, ou les, enregistrement(s) dont le champ Au_ID correspond celui trouv dans l'tape 2. 4. On considre l'enregistrement suivant dans la table Authors, puis on repasse l'tape 2. Remarque : La base de donnes Biblio.mdb contient une requte prdfinie, intitule All Titles, qui permet, pour chaque ouvrage, l'affichage de son titre, son numro ISBN, l'auteur (nom, prnom), son anne de parution, et le nom de l'diteur, via la requte (visible sous Access) suivante :

SELECT Titles.Title, Titles.ISBN, Authors.Author, Titles.[Year Published], Publishers.[Company Name] FROM Publishers INNER JOIN (Authors INNER JOIN ([Title Author] INNER JOIN Titles ON [Title Author].ISBN = Titles.ISBN) ON [Title Author].Au_ID = Authors.Au_ID) ON Titles.PubID = Publishers.PubID ORDER BY Titles.Title

table Publishers PubID Name Company Name Address City State Zip Telephone Fax Comments

table Titles Title Year Published ISBN PubID Description Notes Subject Comments

table Title Author ISBN Au_ID

table Authors Au_ID Author Year Born

Notons que la requte produit, s'il y a lieu, un enregistrement pour chacun des auteurs d'un mme ouvrage. 9.3 Description de l'ADO Data Control 6.0 et du DataGrid Control 6.0

Le tableau suivant dcrit quelques proprits, mthodes et vnements associs au contrle ADO Data Control 6.0.

page 44

Proprit, mthode, vnement Proprit ConnectionString UserName Password RecordSource CommandType LockType Mode MaxRecords ConnectionTimeout Mthode Refresh

Description

Spcifie une chane contenant des paramtres permettant de se connecter la base de donnes. Spcifie le nom de l'utilisateur lors d'une connexion la base de donnes. Spcifie le mot de passe lors d'une connexion la base de donnes. Spcifie une chane contenant une requte, ou un nom de table (utilis pour extraire des donnes). Spcifie le type de commande utilise dans le RecordSource (adCmdTable pour une table, adCmdText pour une requte). Spcifie la faon de bloquer les enregistrements pour empcher des utilisateurs de modifier des donnes en mme temps. Spcifie les droits de connexion (lecture seule, criture seule, lire/crire, etc.). Spcifie le nombre maximum d'enregistrements retourner dans un objet Recordset. Spcifie le temps d'attente d'une connexion avant de gnrer une erreur. Rafrachit les donnes dans un objet Recordset la suite d'un changement d'une proprit dans le contrle ADO Data Control. Dclench lors d'une tentative d'accs aprs le dernier enregistrement du Recordset. Appel avant qu'une opration change la valeur d'un, ou plusieurs, champ(s). Appel aprs le changement de la valeur d'un, ou plusieurs, champ(s). Appel avant qu'une opration change la valeur d'un, ou plusieurs, enregistrement(s). Appel aprs le changement de la valeur d'un, ou plusieurs, enregistrement(s). Appel avant qu'une opration change l'objet Recordset. Appel aprs un changement de l'objet Recordset. Appel avant une opration changeant la position courante dans le Recordset. Appel aprs un changement de la position courante dans le Recordset.

Evnement EndOfRecordset WillChangeField FieldChangeComplete WillChangeRecord RecordChangeComplete WillChangeRecordset RecordsetChangeComplete WillMove MoveComplete

Une particularit fondamentale du contrle ADO Data Control est de pouvoir excuter des requtes SQL en cours d'excution via la proprit RecordSource, ce qui permet un changement dynamique des donnes manipules par ce contrle. A titre d'exemple, on va crer un programme permettant l'excution de requtes SQL, introduites via un contrle TextBox par l'utilisateur, et visualises l'aide d'un contrle DataGrid (cf. la saisie dcran dans la figure suivante).

page 45

Ce programme est list ci-dessous. ___________________________ ' Demande de requtes sur la base de donnes Biblio.mdb ' travers le contrle ADO Data Control Option Explicit Private Sub Form_Load() ' affichage du texte de la requte mise par dfaut txtRequte.Text = Adodc1.RecordSource Adodc1.Caption = Adodc1.RecordSource End Sub Private Sub cmdRequte_Click() On Error Resume Next ' l'excution reprend l'instruction qui suit immdiatement la dernire instruction
' ayant appele la procdure contenant la routine de gestion d'erreur cmdRequte.Enabled = False ' dsactivation (temporaire) du bouton

Adodc1.RecordSource = txtRequte.Text Call Adodc1.Refresh ' soumission de la requte la base de donnes, i.e., rafrachissement du Recordset;
' l'achvement de la requte, les rsultats sont automatiquement affichs dans le ' contrle DataGrid

Adodc1.Caption = Adodc1.RecordSource End Sub


' signification des paramtres en annexe E Private Sub Adodc1_MoveComplete( _ ByVal adReason As ADODB.EventReasonEnum, _ ByVal pError As ADODB.Error, _
page 46

adStatus As ADODB.EventStatusEnum, _ ByVal pRecordset As ADODB.Recordset) ' ractivation du bouton pour permettre une nouvelle requte cmdRequte.Enabled = True End Sub ___________________________ Les proprits, fixes lors de la phase de cration de l'application, sont donnes dans le tableau qui suit. Contrle Adodc1 Proprit ConnectionString RecordSource Valeur Spcifie la chane de connexion. Cliquer le bouton de cette proprit. Slectionner 1 - adCmdText dans le champ CommandType, et introduire "SELECT * FROM Authors" dans le champ CommandText (SQL). Adodc1 Requte dfinie par l'utilisateur. True 2 - Vertical

DataGrid1 DataSource cmdRequte Caption txtRequte Multiline ScrollBars

Relativement au contrle DataGrid : 1. La proprit AllowAddNew mise True ( False par dfaut) permet d'utiliser la dernire ligne du contrle DataGrid pour entrer un nouvel enregistrement. 2. Si la proprit AllowDelete est True (mise False par dfaut), l'utilisateur peut dtruire un enregistrement en cliquant le rectangle gris situ gauche de la ligne pour slectionner la ligne dans la table, et en appuyant sur la touche Suppr du clavier. 3. La proprit AllowUpdate mise True ( False par dfaut) permet l'utilisateur de modifier les donnes. 9.4 L'objet Recordset

Recordset est en fait un objet sur lequel s'appuie un contrle Data pour manipuler les enregistrements d'une base de donnes. L'objet Fields permet de manipuler des colonnes de donnes dans un Recordset. Par exemple, [Data control].Recordset.Fields ("Nom_d_un_champ") retourne un objet Fields reprsentant la valeur dans l'enregistrement courant de la colonne Nom_d_un_champ. Il existe d'autres proprits de l'objet Fields, notamment, Attributes, Size, Type et Value. La proprit Bookmark d'un Recordset peut tre utilise pour pointer vers l'enregistrement courant. Pour cela, il suffit de dclarer une variable de type Variant et de lui assigner la valeur de Bookmark. Par exemple, en supposant que Localisation_bookmark est de type Variant, l'instruction Localisation_bookmark = [Data control].Recordset.Bookmark mmorise l'emplacement de l'enregistrement courant.

page 47

Les proprits BOF et EOF permettent de savoir si on se trouve au dbut, respectivement la fin, du jeu d'enregistrements, i.e., avant le premier enregistrement, respectivement aprs le dernier enregistrement. Un objet Recordset possde cinq mthodes Move qui permettent de se dplacer au sein d'un jeu d'enregistrements, savoir : Description Permet de se positionner sur le premier enregistrement. Permet de se positionner sur le dernier enregistrement. Permet de se positionner sur l'enregistrement suivant. Permet de se positionner sur l'enregistrement prcdent. Permet de se dplacer de n enregistrements (vers l'avant ou l'arrire, selon le signe de n).

Mthode MoveFirst MoveLast MoveNext MovePrevious Move n

Les quatre premires mthodes se rapportent aux quatre boutons dessins sur le contrle Data (voir la figure qui suit).

Illustration : A titre d'exercice, raliser un programme dont le comportement correspond Ex_Recordset.exe.

10

MULTIPLE DOCUMENT INTERFACE

Dans les chapitres prcdents, ont t dveloppes des applications dites Single Document Interface (SDI). Quand une application SDI telle que Notepad s'excute, seul un document la fois est affich (Notepad est un diteur de texte trs simple permettant l'dition d'un seul document (en fait un fichier text) la fois). Au contraire, une application telle que Word permet l'dition de plusieurs documents en mme temps, chacun de ces documents ayant sa propre fentre. Word est un exemple d'application dite Multiple Document Interface (MDI), i.e., une application dans laquelle plusieurs documents peuvent tre ouverts en mme temps. Notons qu'un document n'est pas ncessairement un fichier texte (text), cela peut-tre un fichier image (bitmap), un fichier compress, etc. Chaque fentre contenue dans une application MDI est appele fentre fille (en anglais : child), alors que la fentre de l'application - qui est unique - est appele fentre mre (on parle aussi de fentre parente, ou conteneur). Une fentre fille se comporte comme n'importe quelle fentre, except qu'elle ne peut que rester l'intrieur de la fentre mre (ce qui augmente la cohrence de l'application). Notons qu'une fentre mre peut contenir des fentres filles ayant chacune une fonctionnalit propre, par exemple, une fentre fille peut permettre l'dition d'une image, alors qu'une autre va permettre d'diter un texte. Une fentre MDI fille est reprsente dans Visual Basic avec une feuille MDI (en anglais : MDI form). A partir d'un projet de type EXE Standard, Visual Basic cre automatiquement une feuille Form1, l'ajout au projet d'une feuille MDI mre, nomme par dfaut MDIForm1, se fait en slection Projet | Ajouter une feuille MDI (notons qu'un projet ne peut contenir qu'une seule feuille MDI mre). La cration d'une application MDI sous-entend l'utilisation de plusieurs feuilles (au minimum une feuille mre et une feuille fille). En fait, une feuille fille est une feuille standard (telle que Form1) pour laquelle la proprit MDIChild est mise - en mode cration - True (l'ajout de feuille supplmentaire se fait en slectionnant Projet | Ajouter une feuille). Au contraire des feuilles standards, une feuille MDI mre peut seulement contenir des contrles :
page 48

- disposant d'une proprit Align, c'est le cas des contrles PictureBox (notons que rien n'empche ces derniers de contenir des contrles n'ayant pas la proprit Align, par exemple, des CheckBox, des ComboBox). La proprit Align dcrit o un contrle est localis (au sommet, gauche, etc.) ; - ou, non visibles en mode excution, par exemple un contrle Timer (contrle minuterie). Comme pour les feuilles standards, les feuilles mres, ou filles, peuvent contenir des menus (la cration d'un menu est facilite par l'emploi de la bote de dialogue Crateur de menus, accessible partir du menu Outils. Le menu de la feuille mre est affich seulement si la fentre fille active (i.e., ayant le focus) ne comporte pas de menu. Si la fentre fille active a un menu, il apparatra dans la fentre mre, au dtriment du menu de la fentre mre. Notons que le fait d'agrandir au maximum (clic sur le bouton Agrandir) une fentre fille fait que son Caption est automatiquement combin avec le Caption de la fentre mre. Lorsqu'un programme contient plusieurs feuilles, on utilise la bote de dialogue Projets | Proprits du projet pour spcifier un objet de dmarrage. Cet objet est souvent la feuille MDI mre dans le cas d'une application MDI. Ainsi en mode excution, la feuille mre est automatiquement charge en premier et affiche, cette feuille pouvant ensuite grer les feuilles filles. Pour certaines applications, il est parfois difficile d'identifier la feuille active au dpart. Aussi, Visual Basic fournit une procdure, intitule Main (procdure place dans un module standard (i.e., dans un fichier .bas) dont l'entte est : Private Sub Main ()), qui, une fois positionne via la bote de dialogue Projets | Proprits du projet pourra tre l'objet de dmarrage. Il est souvent utile de permettre la cration dynamique de feuilles. En utilisant des variables objets, il est possible de crer plusieurs copies, ou instances, d'une mme feuille, chaque nouvelle instance possdant les mmes proprits, mthodes et vnements associs. Par exemple, la procdure vnementielle suivante permet l'affichage d'une feuille qui est une copie de la feuille Form1. Private Sub mnuFNouveau_Click () Dim NouvelleFeuille As Form Set NouvelleFeuille = New Form1 NouvelleFeuille.Show End Sub

' voir annexe F

Notons que la variable objet NouvelleFeuille, de type Form, est locale la procdure mnuFNouveau. Mais, mme si cette variable n'existe plus en dehors de la procdure, la feuille cre continue d'exister. Par contre, elle ne peut plus tre rfrence par le nom NouvelleFeuille. Une solution consiste utiliser le mot cl Me, ce mot cl permet de rfrencer une feuille, pour autant qu'elle soit active (ayant le focus). Il est aussi possible d'accder une feuille active en utilisant la proprit ActiveForm. Notons que si un objet MDIForm est actif, cette proprit spcifie la feuille MDI fille active.

11

RSEAUX, INTERNET ET WEB

Les applications rseaux, dcrites ici, utilisent une communication base sur un modle d'interaction client-serveur. L'application qui tablit le contact (de manire active) s'appelle le client, alors que celle qui attend (passivement) un contact s'appelle le serveur. Dans le cas o la connexion, rclame par le client, est accepte (par le serveur), alors le client et le serveur communiquent via des sockets5. Ainsi, la gestion de rseaux par une application est semblable celle de transferts de donnes dans un fichier un programme peut lire partir d'un socket, ou crire sur un socket, aussi simplement que s'il s'agissait de lire, ou d'crire, dans un fichier.
5

Un socket est dfini par un couple adresse IP numro de port.


page 49

Deux formes de communication sont supportes par les protocoles de transport : Avec ou sans connexion. Dans le premier cas, deux applications doivent tablir une connexion avant de pouvoir s'en servir pour transmettre des donnes. A titre d'exemple, TCP (Transmission Control Protocol) fournit aux applications une interface oriente connexion : Une application doit d'abord demander TCP d'ouvrir une connexion avec une autre application, ensuite les deux applications peuvent s'changer des donnes. A la fin de la communication, la connexion doit tre close. Cette communication est similaire celle d'une conversation tlphonique. L'autre choix consiste en une interface sans connexion qui permet une application d'envoyer tout moment un message n'importe quelle destination. Dans chacun de ses messages, l'application mettrice doit en spcifier la destination. A titre d'exemple, UDP (User Datagram Protocol) fournit un transport sans connexion. Cette communication est similaire des envois de lettres par la poste. Le protocole UDP ne garantit pas une bonne rception des paquets : Des paquets peuvent se perdre, se dupliquer, ou arriver hors dlai, ce qui ncessite l'utilisation de programmes supplmentaires pour traiter ces problmes. Visual Basic fournit plusieurs contrles permettant le dveloppement d'applications orientes rseaux. Le tableau qui suit dcrit les trois principaux contrles, dtaills par la suite. Contrle WebBrowser Description Permet aux applications de disposer d'un navigateur Web6, de visualiser des documents et de transfrer des fichiers. Ce contrle permet des dveloppements semblables Internet Explorer. Permet aux applications d'utiliser les protocoles HTTP (HyperText Transfer Protocol) ou FTP (File Transfer Protocol). Permet la programmation d'applications client-serveur travers UDP ou TCP.

Internet Transfert Winsock

11.1

Le contrle WebBrowser

Internet utilise plusieurs protocoles. Le protocole HTTP, omniprsent travers le Web, utilise des URLs (Universal Resource Locators7) comme rfrences externes pour localiser des ressources sur Internet. Visual Basic permet la manipulation d'URL travers le contrle WebBrowser. Ce contrle, non intrinsque, est accessible travers le composant Microsoft Internet Controls. A titre d'exemple, on propose le programme suivant qui correspond une version rudimentaire dun navigateur Web. En fait, il sagit dun simple interprteur HTML8 pour laffichage des documents. ______________________________ ' Utilisation du contrle WebBrowser pour faire un navigateur Web (lmentaire) Option Explicit Private Sub Form_Load() ' Affiche la page par dfaut (home page) lors de l'enregistrement de la feuille Call WebBrowser1.GoHome
6 7

Un navigateur est un programme interactif qui permet de visualiser des informations issues du Web. Les URLs permettent aux navigateurs d'extraire le protocole utilis pour accder l'lment, le nom de l'ordinateur qui hberge l'lment, et le nom de ce dernier. Par exemple, le fait qu'une URL commence par http:// indique au navigateur un accs l'lment l'aide du protocole HTTP. 8 La plupart des documents Web sont crits en langage HTML (HyperText Markup Language), en plus du texte, un document contient des balises qui en dfinissent la structure et le formatage. page 50

End Sub Private Sub cmdGo_Click() ' Aller l'URL spcifie dans txtURL.Text (si txtURL.Text est non vide !!) On Error Resume Next If txtURL.Text <> "" Then Call WebBrowser1.Navigate(txtURL.Text) End If End Sub Private Sub cmdBack_Click() ' Aller la page prcdente contenue dans la liste Historique On Error Resume Next Call WebBrowser1.GoBack End Sub Private Sub cmdForward_Click() ' Aller la page suivante contenue dans la liste Historique On Error Resume Next Call WebBrowser1.GoForward End Sub Private Sub cmdHome_Click() ' Aller la page par dfaut (home page) On Error Resume Next Call WebBrowser1.GoHome End Sub Private Sub Form_Resize() ' Dimensionnements de txtURL et WebBrowser1 On Error Resume Next WebBrowser1.Width = ScaleWidth - WebBrowser1.Left WebBrowser1.Height = ScaleHeight - WebBrowser1.Top txtURL.Width = ScaleWidth - txtURL.Left End Sub Private Sub WebBrowser1_DocumentComplete( _ ByVal pDisp As Object, URL As Variant) ' Affichage de l'URL dans txtURL.Text une fois le transfert de la page termine txtURL.Text = URL End Sub ______________________________ La figure qui suit est une recopie dcran du navigateur Web.

page 51

Les valeurs des proprits de la page et des contrles constituant l'application sont indiques dans le tableau suivant : Contrle frmWebBrowser lblURL txtURL cmdGo cmdBack cmdForward cmdHome WebBrowser1 Remarques : - La mthode GoHome de WebBrowser1, appele dans la procdure Form_Load, permet le chargement de la page par dfaut (cette page correspond celle par dfaut dans Internet Explorer, spcifie dans Internet Explorer via le cadre Page de dmarrage de la bote de dialogue Outils | Options Internet). - L'affichage de l'URL, effectu dans la procdure vnementielle WebBrowser1_DocumentComplete une fois la page affiche, peut tre diffrent de lURL introduite par l'utilisateur (quelquefois un serveur Web redirige les URLs vers d'autres emplacements). - Lis au contrle WebBrowser, il existe d'autres proprits, mthodes et vnements, tels que : pour les proprits : Busy, LocationName, LocationURL, Offline, pour les mthodes : GoSearch, Refresh, Stop, pour les vnements : DownloadBegin, DownloadComplete, ProgessChange. 11.2 Le contrle Internet Transfer Proprit Caption WindowState Caption Text Caption Caption Caption Caption Valeur Exemple de navigateur Web 2 Maximized (permet un agrandissement maximal) URL : (vide) Aller l'URL Prcdente Suivante Dmarrage Valeurs par dfaut

Le contrle Internet Transfer opre un niveau plus bas que celui du contrle WebBrowser, il supporte deux des protocoles les plus connus : HTTP (HyperText Transfer Protocol) et FTP (File Transfer Protocol).

page 52

A la diffrence du contrle WebBrowser qui permet l'affichage d'une page Web, le contrle Internet Transfer fournit uniquement le document HTML (accessible par son URL), ceci pour, par exemple, parser (en franais, effectuer une analyse grammaticale) le texte en vue d'une dtection spcifique. Le protocole FTP permet le transfert de fichier entre ordinateurs via Internet. Le contrle Internet Transfer permet un transfert synchrone (le programme attend la fin du transfert) ou asynchrone (l'excution du programme se poursuit et un vnement se produit pour indiquer au programme la fin du transfert). Ce contrle, non intrinsque, est accessible travers le composant Microsoft Internet Transfer Control 6.0. Ralisation dun client HTTP travers la mthode OpenURL

Dans le programme suivant, l'utilisateur introduit ladresse URL dun serveur HTTP. Le fait de cliquer sur le bouton Aller l'URL provoque l'affichage du document, au format HTML, spcifi par lURL (cf. la saisie dcran dans la figure suivante). ______________________________ ' Utilisation du contrle Internet Transfer pour afficher le contenu d'un fichier ' travers une connexion HTTP Option Explicit Private Sub cmdGo_Click() ' Aller l'URL spcifie dans txtURL.Text (si txtURL.Text est non vide !!) On Error Resume Next If txtURL.Text <> "" Then txtOutput.Text = "Recherche du fichier ..." txtOutput.Text = Inet1.OpenURL(txtURL.Text) End If End Sub Private Sub Form_Resize() ' Dimensionnements de txtURL et txtOutput On Error Resume Next txtOutput.Width = ScaleWidth - txtOutput.Left txtOutput.Height = ScaleHeight - txtOutput.Top txtURL.Width = ScaleWidth - txtURL.Left End Sub ______________________________

page 53

Les proprits des contrles sont dcrites dans le tableau qui suit. Contrle frmHTTP lblURL txtURL cmdGo txtOutput Inet1 Remarques : - L'instruction txtOutput.Text = Inet1.OpenURL(txtURL.Text) utilise la mthode OpenURL du contrle Internet Transfer pour transfrer le document spcifi par l'URL. Le transfert se fait de manire synchrone, en effet le programme attend tant que le transfert n'est pas termin. - En fait, pour afficher un document HTML, il serait prfrable dutiliser, la place dun contrle TextBox, un contrle RichTextBox, ceci pour permettre de prendre en compte une dition sous UNIX. Conseil : Lors de lutilisation de la mthode OpenURL, ou de la mthode Execute (dcrite par la suite), il n'est pas ncessaire de dfinir la proprit Protocol. En effet, le contrle Internet Transfer active automatiquement le protocole appropri, tel qu'il est dtermin par la partie protocole de l'URL. Proprit Caption Caption Text Caption Multiline ScrollBars Valeur Utilisation du protocole HTTP URL (vide) Aller l'URL True 3 Both Valeurs par dfaut

Ralisation dun client FTP travers la mthode Execute

Dans le programme suivant, on permet l'utilisateur d'introduire des commandes FTP (crites en MAJUSCULE). Au pralable, l'utilisateur introduit l'adresse URL du serveur FTP, le nom de l'utilisateur (anonymous permet un accs anonyme, minimal des fichiers) et un mot de passe (lors d'un accs anonyme, utilis guest ou son adresse de courrier lectronique). Le fait de cliquer sur le bouton Excution de la commande FTP provoque l'excution de la commande FTP. La figure qui suit est une recopie dcran de lapplication. Relativement la commande GET, l'instruction suivante :
page 54

GET /rep1/fic.txt C:\temp\essai.txt permet d'obtenir la copie du fichier distant fic.txt, situ dans le rpertoire rep1. Le contenu du fichier est plac dans le fichier local ayant pour nom essai.txt, situ dans le rpertoire (bien sr existant) C:\temp. Les proprits, associes aux diffrents contrles, sont dcrites dans le tableau qui suit. ______________________________ ' Transfert d'un fichier texte via FTP Option Explicit Dim command_get As Boolean Dim fichier As String Private Sub cmdGo_Click() Inet1.URL = txtSite.Text Inet1.UserName = txtUserName.Text Inet1.Password = txtPassword.Text txtLog.Text = _ txtLog.Text & vbCrLf & "COMMANDE FTP : " & txtCommand.Text & vbNewLine If InStr(1, UCase$(txtCommand.Text), "GET") <> 0 Then command_get = True Commande FTP relative GET Dim fin As Integer fin = InStrRev(txtCommand.Text, " ") fichier = Mid$(txtCommand.Text, fin + 1, Len(txtCommand.Text) - fin) ' Debug.Print fichier Else command_get = False Commande FTP non relative GET End If Call Inet1.Execute(, txtCommand.Text) End Sub Private Sub Inet1_StateChanged(ByVal State As Integer) Select Case State Case icResolvingHost txtLog.Text = txtLog.Text & "Recherche adresse IP de l'ordinateur hte" & vbCrLf Case icHostResolved txtLog.Text = txtLog.Text & "Adresse IP de l'ordinateur hte trouve" & vbCrLf Case icConnecting txtLog.Text = _ txtLog.Text & "En cours de connexion" & vbCrLf Case icConnected txtLog.Text = _ txtLog.Text & "Connexion tablie" & vbCrLf Case icRequesting txtLog.Text = txtLog.Text & "Envoie d'une demande" & vbCrLf Case icRequestSent txtLog.Text = txtLog.Text & "Demande effectivement envoye" & vbCrLf Case icReceivingResponse txtLog.Text = _ txtLog.Text & "Rception d'une rponse" & vbCrLf
page 55

Case icResponseReceived txtLog.Text = _ txtLog.Text & "Rception effective d'une rponse" & vbCrLf Case icDisconnecting txtLog.Text = _ txtLog.Text & "En cours de dconnexion" & vbCrLf Case icDisconnected txtLog.Text = _ txtLog.Text & "Dconnexion effective avec l'ordinateur hte" & vbCrLf Case icError txtLog.Text = txtLog.Text & "Erreur : " & vbCrLf & _ "Code : " & Inet1.ResponseCode & vbCrLf & Inet1.ResponseInfo Case icResponseCompleted Dim data As Variant txtLog.Text = txtLog.Text & _ "Excution de la demande termine, toutes les donnes ont t reues" & vbCrLf If command_get = False Then ' Extraction de donnes ' (utiliser icByteArray, plutt que icString, lors de la ' rception dun fichier binaire) data = Inet1.GetChunk(1024, icString) Do While LenB(data) > 0 txtLog.Text = txtLog.Text & vbCrLf & data & vbCrLf ' Extraction de donnes data = Inet1.GetChunk(1024, icString) Loop txtLog.Text = txtLog.Text & vbCrLf & data & vbCrLf Else ' Ecriture de donnes dans un fichier (voir annexe G pour plus de dtails) ' Ouverture du fichier : Open Nom_du_fichier For Mode As Identificateur Open fichier For Binary Access Write As #1 identificateur = 1 ' Extraction de donnes data = Inet1.GetChunk(1024, icString) Do While LenB(data) > 0 ' Ecriture : Put #identificateur, numro_denregistrement, variable Put #1, , data ' Extraction de donnes data = Inet1.GetChunk(1024, icString) Loop Put #1, , data Close #1 ' Fermeture du fichier End If End Select txtLog.SelStart = Len(txtLog.Text) End Sub ______________________________

page 56

Contrle frmFTP lblSite txtSite lblUserName txtUserName lblPassword txtPassword txtCommand cmdGo txtLog Inet1 Remarques :

Proprit Caption Caption Text Caption Text Caption Text PasswordChar Caption Caption Multiline Protocol

Valeur Protocole FTP Site FTP (vide) UserName anonymous Password (vide) * (permet la cration dun champ de mot de passe) (vide) Excution de la commande FTP True 2 - icFTP

- Contrairement la mthode OpenURL, la mthode Execute fonctionne selon un mode asynchrone, en effet l'excution du programme peut se poursuivre durant le service demand au serveur.
page 57

- L'application est automatiquement prvenue d'une rponse de la part du serveur via la procdure vnementielle Inet1_StateChanged. La structure Select Case se base sur des constantes de la forme icState pour indiquer l'tat courant (State) du contrle. Ces changements d'tat sont indiqus dans le contrle TextBox intitul txtLog. - L'tat icResponseCompleted indique que la requte faite auprs du serveur est termine, il s'ensuit une phase de sauvegarde dans un fichier. L'instruction data = Inet1.GetChunk(1024, icString) (en franais chunk signifie gros morceau) permet de rcuprer des donnes dans un segment de taille 1024. La constante icString permet de rcuprer une chane de caractres, alors que la constante icByteArray permettrait de rcuprer les donnes sous forme d'un tableau d'octets (utilis dans le cas de fichiers binaires).

Rappels de quelques commandes FTP Description Change le dossier en cours par celui spcifi dans file1. Retour au dossier parent. quivaut "CD..". Ferme la connexion FTP en cours. Supprime le fichier spcifi dans file1. Dossier. Recherche le dossier spcifi dans file1. Les caractres gnriques sont autoriss mais l'hte distant dicte la syntaxe. Si l'argument file1 est omis, la liste complte du dossier de travail en cours est renvoye. Utiliser la mthode GetChunk pour renvoyer la liste du dossier. Rcupre le fichier distant spcifi dans file1 et cre le nouveau fichier local spcifi dans file2. Liste. Recherche le dossier spcifi dans file1. Les caractres gnriques sont autoriss mais l'hte distant dicte la syntaxe. Utiliser la mthode GetChunk pour renvoyer les fichiers du dossier. Cre le dossier spcifi dans file1. Copie un fichier local spcifi dans file1 vers l'hte distant spcifi dans file2. Impression du dossier de travail. Renvoie le nom du dossier en cours. Utiliser la mthode GetChunk pour renvoyer les donnes. Termine la connexion en cours pour l'utilisateur. Rcupre le fichier distant spcifi dans file1 et cre le nouveau fichier local spcifi dans file2. quivaut GET. Donne au fichier distant spcifi dans file1 le nouveau nom spcifi dans file2. Supprime le dossier distant spcifi dans file1. Copie d'un fichier local spcifi dans file1, vers l'hte distant spcifi dans file2. quivaut PUT. Renvoie la taille du dossier spcifi dans file1.

Commande CD file1 CDUP CLOSE DELETE file1 DIR file1

GET file1 file2 LS file1

MKDIR file1 PUT file1 file2 PWD QUIT RECV file1 file2 RENAME file1 file2 RMDIR file1 SEND file1 file2 SIZE file1

Remarque : Certaines des commandes listes ci-dessus ne sont pas autorises si l'utilisateur ne possde pas les droits correspondants sur le serveur hte. Par exemple, souvent, les sites FTP anonymes n'autorisent pas la suppression de fichiers ou de dossiers.

11.3

Le contrle Winsock
page 58

Le contrle Winsock permet des applications client-serveur de communiquer via les protocoles TCP ou UDP. Nous n'utiliserons dans cette section que le protocole TCP. Construction d'un serveur TCP lmentaire

Plusieurs tapes sont effectuer pour construire un serveur : - L'tape 1 consiste ajouter un contrle Winsock la feuille. Ce contrle, non intrinsque, est accessible travers le composant Microsoft Winsock Control 6.0. - On spcifie dans l'tape 2 le numro de port, utilis lors de connexions avec des clients, travers la proprit LocalPort du contrle Winsock. Chaque client fera une requte au serveur via ce port. - L'tape 3 permet au serveur d'attendre une demande de connexion par un client travers la mthode Listen du contrle Winsock. Le serveur est inform dune demande de connexion par un client travers l'excution de la procdure vnementielle ConnectionRequest. - L'tape 4 consiste accepter la connexion entrante travers la mthode Accept du contrle Winsock. Une fois cette mthode appele, des donnes peuvent tre transmises entre le serveur et le client. Avant d'accepter la connexion, vrifier que l'tat (State) du contrle Winsock correspond sckClosed. Dans le cas contraire, il s'agit d'appeler la mthode Close pour fermer la prcdente connexion. Si la connexion entrante est refuse, l'homologue (client) reoit l'vnement Close. - L'tape 5 est relative la phase de communication entre le serveur et le client. La procdure vnementielle DataArrival du contrle Winsock est excute lorsque des donnes parviennent au serveur. L'instruction tcpServer.GetData (message) place les donnes dans la chane de caractres message (2 arguments optionnels permettent de spcifier le type de donnes reues et la longueur maximale autorise des donnes). Afin d'envoyer des donnes au client, on utilise la mthode SendData du contrle Winsock. Par exemple, linstruction tcpServer.SendData (message) permet de transmettre les donnes contenues dans message. - L'tape 6 se produit lorsque la transmission des donnes est termine. Le fait que le client ferme la connexion provoque l'excution de la procdure vnementielle Close du contrle Winsock. La connexion serveur devra tre ferme via l'instruction tcpServer.Close. Un contrle Winsock doit tre attribu chaque connexion avec un client. Le fait de pouvoir disposer dans Visual Basic de tableau de contrles permet la cration de serveurs capables de grer simultanment plusieurs connexions, ceci sans crer a priori un ensemble suffisant de contrles Winsock. Construction d'un client TCP lmentaire

Plusieurs tapes sont effectuer pour construire un client : - L'tape 1 consiste ajouter un contrle Winsock la feuille (accessible travers le composant Microsoft Winsock Control 6.0). - Dans l'tape 2, le contrle Winsock ct client doit pouvoir localiser : - l'ordinateur distant sur lequel un contrle envoie, ou reoit, des donnes. Vous pouvez fournir soit un nom d'hte, par exemple "www.microsoft.com", soit une adresse IP sous forme de chane ponctue, telle que "127.0.1.1". Ce nom est plac dans la proprit RemoteHost du contrle Winsock ; - le numro de port distant auquel la connexion doit tre faite. Ce numro est plac dans la proprit RemotePort du contrle Winsock. - Dans l'tape 3, la connexion au serveur est demande via un appel de la mthode Connect du contrle Winsock. En cas de succs, la procdure vnementielle Connect du contrle Winsock s'excute ; en cas d'erreur, la procdure vnementielle Error du contrle Winsock s'excute. - L'tape 4 est relative la phase de communication entre le serveur et le client.
page 59

Comme du ct serveur, la procdure vnementielle DataArrival du contrle Winsock est excute lorsque des donnes parviennent au client. L'instruction tcpClient.GetData (message) place les donnes dans message. Des donnes sont envoyes au serveur en utilisant la mthode SendData du contrle Winsock. Par exemple, linstruction tcpClient.SendData (message) envoie au serveur des donnes contenues dans message. - L'tape 5 se produit lorsque la transmission des donnes est termine. Le fait que le serveur ferme la connexion provoque l'excution de la procdure vnementielle Close du contrle Winsock. La connexion client devra tre ferme via l'instruction tcpClient.Close. Exemple d'interaction client-serveur avec le contrle Winsock

L'application client-serveur, considre ici, utilise le protocole TCP. Dans cette application, l'utilisateur ct client et l'utilisateur ct serveur communiquent entre eux travers des contrles TextBox. Notons que si le client ferme la connexion, le serveur attend une autre connexion. La figure qui suit est une recopie d'cran de l'application propose.

Le programme qui suit correspond au serveur TCP ; les proprits associes aux diffrents contrles sont dcrites dans le tableau qui suit. ______________________________ ' Serveur lmentaire bas sur le protocole TCP Option Explicit Private Sub Form_Load() ' Rend le bouton cmdSend non actif jusqu' ' l'tablissement d'une connexion cmdSend.Enabled = False ' Positionne le port local tcpServer.LocalPort = 5000 ' Attente d'une demande de connexion Call tcpServer.Listen
page 60

End Sub Private Sub Form_Resize() On Error Resume Next Call cmdSend.Move(ScaleWidth - cmdSend.Width, 0) Call txtSend.Move(0, 0, ScaleWidth - cmdSend.Width) Call txtOutput.Move(0, txtSend.Height, ScaleWidth, _ ScaleHeight - txtSend.Height) End Sub Private Sub Form_Terminate() ' Fermeture (si ce n'est pas dj fait) de la connexion ' ct serveur (il s'ensuit du ct client un appel ' automatique de la procdure vnementielle Close) Call tcpServer.Close End Sub Private Sub tcpServer_ConnectionRequest( _ ByVal requestID As Long) ' S'assurer que la prcdente connexion ct serveur ' a t ferme, ceci avant d'accepter une nouvelle connexion If tcpServer.State <> sckClosed Then Call tcpServer.Close End If ' Rend le bouton cmdSend actif du fait de ' l'tablissement d'une connexion cmdSend.Enabled = True ' Connexion accepte du ct du serveur Call tcpServer.Accept(requestID) ' Affichage de l'adresse IP et du numro de port du client txtOutput.Text = _ "Connection partir de l'adresse IP client : " & _ tcpServer.RemoteHostIP & vbCrLf & _ "Port client #: " & tcpServer.RemotePort & vbCrLf & vbCrLf End Sub Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long) Dim message As String ' Rception des donnes envoyes par le client Call tcpServer.GetData(message) txtOutput.Text = _ txtOutput.Text & message & vbCrLf & vbCrLf txtOutput.SelStart = Len(txtOutput.Text) '(la proprit SelStart renvoie ou dfinit le point ' de dpart du texte slectionn, ou indique la position ' du point d'insertion si aucun texte n'est slectionn) End Sub Private Sub tcpServer_Close() ' Le client a ferm la connexion ' Rend le bouton cmdSend non actif du fait de
page 61

' la fermeture de la connexion cmdSend.Enabled = False ' Fermeture de la connexion ct serveur (il s'ensuit ' du ct du client un appel automatique la procdure ' vnementielle Close) Call tcpServer.Close txtOutput.Text = txtOutput.Text & _ "Connexion ferme ct client." & vbCrLf & vbCrLf txtOutput.SelStart = Len(txtOutput.Text) ' Attente d'une nouvelle demande de connexion Call tcpServer.Listen End Sub Private Sub tcpServer_Error(ByVal Number As Integer, _ Description As String, ByVal Scode As Long, _ ByVal Source As String, ByVal HelpFile As String, _ ByVal HelpContext As Long, CancelDisplay As Boolean) Dim result As Integer result = MsgBox(Source & " : " & Description, _ vbOKOnly, "Erreur TCP/IP") End End Sub Private Sub cmdSend_Click() ' Envoie de donnes vers le client Call tcpServer.SendData("SERVEUR >>> " & txtSend.Text) txtOutput.Text = txtOutput.Text & _ "SERVEUR >>> " & txtSend.Text & vbCrLf & vbCrLf txtSend.Text = "" txtOutput.SelStart = Len(txtOutput.Text) End Sub ______________________________

Contle frmTCPServer tcpServer txtSend txtOutput cmdSend

Proprit Caption Protocol Text Multiline Caption

Valeur Serveur TCP 0 sckTCPProtocol (par dfaut) (vide) True Envoie de texte

Le programme qui suit correspond au client TCP ; les proprits associes aux diffrents contrles sont dcrites dans le tableau qui suit. ______________________________ ' Client lmentaire bas sur le protocole TCP Option Explicit
page 62

Private Sub Form_Load() ' Rend le bouton cmdSend non actif jusqu' ' l'tablissement d'une connexion cmdSend.Enabled = False ' Positionne l'adresse IP du serveur tcpClient.RemoteHost = _ InputBox("Entrer l'adresse IP du serveur", _ "Adresse IP", "localhost") If tcpClient.RemoteHost = "" Then tcpClient.RemoteHost = "localhost" End If tcpClient.RemotePort = 5000 ' Numro de port du serveur ' Demande de connexion au serveur : ' connexion tablie --> vnement tcpClient_Connect ' erreur --> vnement tcpClient_Error Call tcpClient.Connect End Sub Private Sub Form_Terminate() ' Fermeture (si ce n'est pas dj fait) de la connexion ct ' client (il s'ensuit du ct serveur un appel automatique ' de la procdure vnementielle Close) Call tcpClient.Close End Sub Private Sub Form_Resize() On Error Resume Next Call cmdSend.Move(ScaleWidth - cmdSend.Width, 0) Call txtSend.Move(0, 0, ScaleWidth - cmdSend.Width) Call txtOutput.Move(0, txtSend.Height, ScaleWidth, _ ScaleHeight - txtSend.Height) End Sub Private Sub tcpClient_Connect() ' Affichage d'un message (numros IP et port du client) signalant ' l'tablissement d'une connexion cmdSend.Enabled = True txtOutput.Text = "Connect l'adresse IP : " & _ tcpClient.RemoteHostIP & vbCrLf & "Port serveur #: " & _ tcpClient.RemotePort & vbCrLf & vbCrLf End Sub Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long) Dim message As String ' Rception des donnes envoyes par le serveur Call tcpClient.GetData(message) txtOutput.Text = txtOutput.Text & message & vbCrLf & vbCrLf txtOutput.SelStart = Len(txtOutput.Text) End Sub Private Sub tcpClient_Close() ' Le serveur a ferm la connexion
page 63

' Rend le bouton cmdSend non actif jusqu' ' l'tablissement d'une connexion cmdSend.Enabled = False ' Fermeture de la connexion ct client (il s'ensuit du ct ' serveur un appel automatique de la procdure vnementielle Close) Call tcpClient.Close txtOutput.Text = _ txtOutput.Text & "Connexion ferme ct serveur." & vbCrLf txtOutput.SelStart = Len(txtOutput.Text) End Sub Private Sub tcpClient_Error(ByVal Number As Integer, _ Description As String, ByVal Scode As Long, _ ByVal Source As String, ByVal HelpFile As String, _ ByVal HelpContext As Long, CancelDisplay As Boolean) Dim result As Integer result = MsgBox(Source & ": " & Description, _ vbOKOnly, "Erreur TCP/IP") End End Sub Private Sub cmdSend_Click() ' Envoie de donnes vers le serveur Call tcpClient.SendData("CLIENT >>> " & txtSend.Text) txtOutput.Text = txtOutput.Text & _ "CLIENT >>> " & txtSend.Text & vbCrLf & vbCrLf txtOutput.SelStart = Len(txtOutput.Text) txtSend.Text = "" End Sub ______________________________

Contrle frmTCPClient tcpClient txtSend txtOutput cmdSend

Proprit Caption Protocol Text Multiline Caption

Valeur Client TCP 0 sckTCPProtocol (par dfaut) (vide) True Envoie de texte

Lis au contrle Winsock, il existe d'autres proprits, mthodes et vnements, tels que : pour les proprits : BytesReceived, LocalHostName, LocalHostIP, pour les mthodes : PeekData, pour les vnements : SendComplete, SendProgress. A titre dexercice, tudier lapplication multi-utilisateurs, intitule Serveur et situe dans le rpertoire \partage\M2AI Visual Basic\TP Reseau\Serveur TCP. Adapter ce serveur lapplication client TCP prcdente.

page 64

12

PROGRAMMATION ORIENTE-OBJET

La programmation en Visual Basic est dite oriente objet. Cette mthode de programmation, assez naturelle, consiste dcomposer une application en un ensemble (fini) dobjets ; ces objets interagissant afin de concourir la ralisation de lapplication. A titre dexemples, tous les composants de Visual Basic, tels que les feuilles, les contrles, sont des objets. Les objets (en anglais, objects) encapsulent, la fois, les donnes (attributs dcrivant lobjet) et les mthodes (actions, routines permettant de manipuler lobjet) ; les donnes et les mthodes tant intimement lies entre-elles. Notons que la programmation oriente objet donne autant dimportance aux donnes quaux actions rattaches ces donnes, alors que la programmation procdurale donnera - travers la ralisation de procdures - plus dimportance aux actions quaux donnes proprement dites. Notons que la notion dobjet s'intgre pleinement dans le cadre de la programmation vnementielle : Le fait qu'un objet puisse provoquer un vnement va permettre de signaler aux autres objets que quelque chose est survenu. La programmation oriente objet (POO) repose sur la notion de classe : Cest partir dune classe quun objet est instanci, i.e., cr. Chaque classe contient des donnes, et lensemble des mthodes permettant leurs manipulations. A titre dexemple, chaque icne de contrle reprsente une classe. Quand un contrle TextBox est plac sur une feuille, un objet de la classe TextBox (reprsente par son icne) est instanci (cr), vers lequel votre programme peut envoyer des messages. Par analogie, un moule gaufre (ou le plan dune voiture) peut tre considr comme une classe, sachant quune gaufre (ou quune voiture) peut tre considr comme une instances de cette classe. Les objets ont la proprit de cacher linformation - en effet, ils communiquent entre-eux sans connatre en dtail leurs fonctionnements internes -, ce qui facilite la ralisation de logiciels. En effet, un programmeur pourra manipuler un objet "uniquement" travers la connaissance de ses diffrents comportements, sans tre concern par la manire dont ces comportements sont excuts (cods) : Il est question dabstraction de donnes (en anglais, data abstraction). Par analogie, il est tout fait possible de conduire une voiture sans pour autant connatre le dtail de son mcanisme. A titre dexemple, considrons une pile dassiettes. Une assiette est toujours place au sommet (en anglais, push) de la pile ; de mme, c'est toujours du sommet qu'elle en est te (en anglais, pop). Ainsi, la dernire assiette place sur la pile sera toujours la premire te : Un tel fonctionnement sassimile une structure de donnes, appele pile LIFO (Last-In, First-Out). Par exemple, si les assiettes numro 1, 2, 3 sont respectivement places (push) sur la pile, les 3 prochaines oprations consistant ter (pop) les assiettes de la pile retourneront respectivement les assiettes numro 3, 2 et 1. Un client de la classe pile (client : portion de programme utilisant la classe) naura pas besoin de connatre la manire dont a t ralise cette classe, mais seulement son fonctionnement "dernier entr, premier sorti" travers les oprations push et pop. En outre, une classe peut tre remplace par une autre version, sans affecter le reste de lapplication, pour autant que linterface publique de la classe soit inchange. Linterface dune classe combine ses proprits, mthodes et vnements, i.e., tout ce quil est utile de savoir pour utiliser pleinement la classe. La programmation oriente objet requiert trois concepts cls lencapsulation, lhritage et le polymorphisme9. A la diffrence des langages C++ et Java, Visual Basic ne permet pas dutiliser la notion dhritage, cependant, il fournit une alternative travers lutilisation des interfaces et une technique appele dlgation.

12.1
9

Les modules de classe

Ces notions seront tudies en dtail dans d'autres enseignements de la formation.


page 65

La cration de classes se fait via le mcanisme des modules de classe. Un module de classe contient uniquement du code, il ne peut pas contenir dIUG. Comme les modules feuilles et standards, les modules de classes contiennent une partie dclaration gnrale ; seulement deux vnements leurs sont associs : Initialize (vnement dclench lorsqu'une instance de la classe est cre) et Terminate (vnement dclench avant la destruction d'une instance de la classe). Pour ajouter un module de classe un projet, slectionner Add Class Module partir du menu Project : Il en rsulte la bote de dialogue suivante, qui permet douvrir un module de classe, intitul (par dfaut) Class1, et modifiable via la proprit Name.

Remarque : Notons qu'il est possible d'ajouter un module de classe dj existant (extension .cls) dans un projet en cliquant sur l'onglet Existing de la prcdente bote de dialogue, ce qui permet de retrouver la classe dsire. Le mot-cl New est utilis pour crer un objet. Par exemple, linstruction Dim heure As New CTemps permet de crer un objet heure comme une nouvelle instance de la classe CTemps (en fait, Visual Basic ne cre lobjet quau moment correspondant au premier accs une proprit, ou la premire fois quune mthode est appele). Une fois lobjet cr, il est possible de lutiliser - via son interface (publique) - en lui assignant ses proprits et en invoquant ses mthodes. Le programme qui suit contient une (premire) dfinition de la classe CTemps. Cette classe contient 3 variables entires (Integer) mHeure, mMinute et mSeconde, appeles variables d'instance de classe. Chacune de ces 3 variables est dclare Private, ce qui la rend accessible uniquement travers les mthodes de la classe. En principe, les variables d'instance sont dclares Private et les mthodes sont dclares Public. La classe CTemps a une interface publique compose de 3 mthodes Public : - Fixer_heure rgle l'heure partir de 3 entiers, chaque entier tant pralablement vrifi ;
page 66

- Mettre_sous_forme_universelle retourne une chane de caractres donnant l'heure au format universel, i.e., sous la forme : hh:mm:ss (par exemple : 02:24:35, ou 17:14:45) ; - Mettre_sous_forme_standard retourne une chane de caractres donnant l'heure au format standard, i.e., sous la forme : hh:mm:ss AM (ou PM) (par exemple : 2:24:35 AM, ou 5:14:45 PM). La procdure Form_Load, du programme crit pour tester la classe, dclare une variable locale de la classe CTemps appele t. Le module Form peut utiliser la classe CTemps car la classe fait partie du projet. L'objet t est instanci, i.e., cr, via l'instruction Dim t As New CTemps Lorsque l'objet t est instanci, chacune des 3 variables d'instance (prives) est initialise 0. Les mthodes Mettre_sous_forme_standard, Mettre_sous_forme_universelle de l'objet sont appeles de manire afficher l'heure sous une forme standard, respectivement universelle. La mthode Fixer_heure permet de rgler l'heure, une vrification des donnes introduites est faite au pralable. Une valeur non valide est remplace par 0 : C'est le cas - dans le programme de test de la classe - de la variable mSeconde lors du deuxime appel de la mthode Fixer_heure. ___________ module de classe Ctemps.cls ___________________ ' Dfinition de la classe CTemps Option Explicit Private mHeure As Integer Private mMinute As Integer Private mSeconde As Integer Public Sub Fixer_heure(ByVal h As Integer, ByVal m As Integer, _ ByVal s As Integer) mHeure = IIf((h >= 0 And h < 24), h, 0) mMinute = IIf((m >= 0 And m < 60), m, 0) mSeconde = IIf((s >= 0 And s < 60), s, 0) End Sub Public Function Mettre_sous_forme_universelle() As String Mettre_sous_forme_universelle = Format$(mHeure, "00") & ":" & _ Format$(mMinute, "00") & ":" & _ Format$(mSeconde, "00") End Function Public Function Mettre_sous_forme_standard() As String Dim h As Integer ' IIf(expr, true part, false part) h = IIf((mHeure = 12 Or mHeure = 0), 12, mHeure Mod 12) Mettre_sous_forme_standard = h & ":" & _ Format$(mMinute, "00") & ":" & _ Format$(mSeconde, "00") & " " & _ IIf(mHeure < 12, "AM", "PM") ' Format$(expr, format) renvoie une valeur de type Variant (String) contenant ' une expression formate selon l'expression de mise en forme indique dans format.
page 67

End Function ___________ programme de test de la classe CTemps ___________________ ' Programme permettant de tester la classe CTemps Option Explicit Private Sub Form_Load() Dim t As New Ctemps frmCTempsTest.Show ' frmCTempsTest : nom de la feuille Print "Heure standard initiale : " & t.Mettre_sous_forme_standard() Print "Heure universelle initiale : " & t.Mettre_sous_forme_universelle() Print Call t.Fixer_heure(17, 28, 46) Print "Heure standard aprs appel de Fixer_heure(17, 28, 46) : " & _ t.Mettre_sous_forme_standard() Print "Heure universelle correspondante : " & t.Mettre_sous_forme_universelle() Print Call t.Fixer_heure(5, 44, 99) Print "Heure standard aprs appel de Fixer_heure(5, 44, 99) : " & _ t.Mettre_sous_forme_standard() Print "Heure universelle correspondante : " & t.Mettre_sous_forme_universelle() End Sub

12.2

Accs aux membres d'une classe : Public, Private

Les mots-cls Public ou Private permettent de spcifier l'accs des membres10 d'une classe (variables d'instance, ou mthodes). Une variable d'instance, ou une mthode, ayant un accs public est accessible par chacun des modules du projet. Au contraire, une variable d'instance prive peut seulement tre manipule travers les mthodes de la classe. Les mthodes prives, appeles aussi mthodes utilitaires,
10

Cette notion explique la raison pour laquelle les variables d'instance sont prfixes par la lettre m.
page 68

peuvent seulement tre utilises par d'autres mthodes de la classe. Par dfaut, les procdures Property, Sub ou Function sont publiques, alors que les variables d'instance sont prives. Par exemple, considrons le programme suivant pour tester la classe CTemps, prcdemment dfinie (cf. 12.1) : ___________ programme de test de la classe CTemps ___________________ Option Explicit Private Sub Form_Load() Dim t As New CTemps t.mHeure = 8 Print t.Mettre_sous_forme_standard() End Sub Un tel programme dclenche une erreur de compilation. En effet, la variable d'instance mHeure de l'objet t tant prive, elle n'est pas accessible en dehors de la classe CTemps. En fait, l'accs des donnes prives est rendu possible travers des mthodes particulires de la classe, appeles proprits (notion introduite au 3.1). Pour permettre la lecture d'une donne prive en dehors de son module de classe, il est possible de dclarer - dans le module de classe - une mthode get. De mme, pour permettre la modification d'une donne prive en dehors de son module de classe, il est possible de dclarer - dans le module de classe - une mthode let. Ces accs semblent transgresser la notion de donnes prives d'une classe. Toutefois, une mthode let a la possibilit de vrifier la cohrence d'une donne, de mme, une mthode get permet une "visualisation" diffrente, ventuellement partielle, d'une donne "brute". Ces mthodes particulires dans Visual Basic sont appeles Property Let, Property Set et Property Get. Par exemple, la mthode permettant de modifier la variable d'instance prive nomme mVar pourrait s'appeler Property Let Var, la mthode permettant de lire cette variable pourrait s'appeler Property Get Var. Exemple : Relativement la classe CTemps, la portion de programme suivante dfinit une proprit Heure permettant de stocker l'heure de 0 23 : Private mHeure As Integer Public Property Let Heure(ByVal hr As Integer) mHeure = IIf((hr >= 0 And hr < 24), hr, 0) End Property ' -- > modification

Supposons l'objet rveil de la classe CTemps dfini, considrons l'instruction suivante : rveil.Heure = -6 En rponse cette instruction, la procdure Property Let va rejeter cette valeur, non valide, et positionner mHeure 0. A prsent, considrons la procdure Property Get Heure suivante : Public Property Get Heure() As Integer ' -- > visualisation Heure = mHeure
page 69

End Property L'instruction suivante permet de stocker la valeur de la variable Heure de l'objet rveil dans la variable Valeur_heure_alarme (suppose entire et dfinie) : Valeur_heure_alarme = rveil.Heure Emploi de la procdure Property Set : Supposons dfinie une classe CEmploy qui contient un objet mDate_anniversaire de la classe CDate1. La procdure Property Let ne permet pas d'assigner une valeur un objet (en l'occurrence mDate_anniversaire). Il faut utiliser, la place, la procdure Property Set comme dans les procdures Property suivantes : Public Property Set Date_anniversaire(ByVal ani As CDate1) Set mDate_anniversaire = ani End Property Public Property Get Date_anniversaire() As CDate1 Set Date_anniversaire = mDate_anniversaire End Property Remarque : L'instruction Exit Property provoque la sortie immdiate d'une procdure Property (Property Get, Property Let ou Property Set). Le programme qui suit contient une dfinition accrue de la classe CTemps (dfinie prcdemment, cf. 12.1). Cette nouvelle classe, appele CTemps1, inclut les procdures Property Let et Property Get pour les variables d'instance mHeure, mMinute et mSeconde. Les proprits Property Let vont permettre le contrle et l'assignation des variables d'instance. La validation des variables mHeure, mMinute et mSeconde est implmente dans des mthodes prives (i.e., usage interne la classe), appeles respectivement Valider_heure, Valider_minute et Valider_seconde. Dans cet exemple, chaque procdure Property Get retourne la valeur de la variable d'instance souhaite. ___________ module de classe Ctemps1.cls ___________________ ' Dfinition de la classe CTemps1 ' Cette classe tend la classe CTemps en fournissant des procdures ' Property pour les proprits Heure, Minute et Seconde Option Explicit ' On dfinit 3 variables dinstances prives (mHeure, mMinute, mSeconde) Private mHeure As Integer Private mMinute As Integer Private mSeconde As Integer ' On dfinit 3 mthodes publiques (Fixer_Heure, Mettre_sous_forme_universelle, ' Mettre_sous_forme_standard) Public Sub Fixer_heure(ByVal h As Integer, ByVal m As Integer, _ ByVal s As Integer) mHeure = Valider_heure(h) mMinute = Valider_minute(m)
page 70

mSeconde = Valider_seconde(s) End Sub Public Function Mettre_sous_forme_universelle() As String Mettre_sous_forme_universelle = Format$(mHeure, "00") & ":" & _ Format$(mMinute, "00") & ":" & _ Format$(mSeconde, "00") End Function Public Function Mettre_sous_forme_standard() As String Dim h As Integer h = IIf((mHeure = 12 Or mHeure = 0), 12, mHeure Mod 12) Mettre_sous_forme_standard = h & ":" & _ Format$(mMinute, "00") & ":" & _ Format$(mSeconde, "00") & " " & _ IIf(mHeure < 12, "AM", "PM") End Function ' On dfinit 3 proprits (Heure, Minute, Seconde) Public Property Get Heure() As Integer Heure = mHeure End Property Public Property Let Heure(ByVal h As Integer) mHeure = Valider_heure(h) End Property Public Property Get Minute() As Integer Minute = mMinute End Property Public Property Let Minute(ByVal m As Integer) mMinute = Valider_minute(m) End Property Public Property Get Seconde() As Integer Seconde = mSeconde End Property Public Property Let Seconde(ByVal s As Integer) mSeconde = Valider_seconde(s) End Property ' On dfinit 3 mthodes prives (Valider_heure, Valider_minute, Valider_seconde) Private Function Valider_heure(ByVal h As Integer) As Integer Valider_heure = IIf((h >= 0 And h < 24), h, 0) End Function Private Function Valider_minute(ByVal m As Integer) As Integer Valider_minute = IIf((m >= 0 And m < 60), m, 0) End Function
page 71

Private Function Valider_seconde(ByVal s As Integer) As Integer Valider_seconde = IIf((s >= 0 And s < 60), s, 0) End Function ___________ programme de test de la classe CTemps1 ___________________ ' Programme permettant de tester la classe CTemps1 Option Explicit Private mTemps As New CTemps1 Private Sub Form_Load() Call mTemps.Fixer_heure(txtHeure.Text, txtMinute.Text, _ txtSeconde.Text) Call Reactualiser_affichage End Sub Private Sub cmdEntrer_Click() mTemps.Heure = txtHeure.Text mTemps.Minute = txtMinute.Text mTemps.Seconde = txtSeconde.Text Call Reactualiser_affichage End Sub Private Sub cmdAjouter_Click() mTemps.Seconde = (mTemps.Seconde + 1) Mod 60 If mTemps.Seconde = 0 Then mTemps.Minute = (mTemps.Minute + 1) Mod 60 If mTemps.Minute = 0 Then mTemps.Heure = (mTemps.Heure + 1) Mod 24 End If End If Call Reactualiser_affichage End Sub Private Sub Reactualiser_affichage() lblAffichage.Caption = Space$(12) & "Standard : " & _ mTemps.Mettre_sous_forme_standard() & _ " Universelle: " & _ mTemps.Mettre_sous_forme_universelle() End Sub N.B. : Penser mettre 0 dans les proprits Text des contrles TextBox txtHeure, txtMinute, txtSeconde.

page 72

Le programme de test de la classe CTemps1 permet, via le bouton de commande "Entrer" et les contrles TextBox, de fixer des valeurs aux variables mHeure, mMinute et mSeconde. L'utilisateur peut aussi incrmenter d'une seconde l'heure courante en appuyant sur le bouton de commande "Ajouter 1 seconde". Aprs chacune de ces oprations, l'heure courante est affiche.

12.3

Composition : Objets en tant que variables d'instance d'autres classes

La composition, appele aussi agrgation, consiste former de nouvelles classes incluant en tant que membres des objets d'autres classes existantes. Afin de comprendre cette notion, dfinissons ce qu'est une rfrence dans Visual Basic : Une rfrence est un nom qui se rfre un objet, ou non (i.e., Nothing). Soit par exemple : Dim t1 As New CTemps1 Dim t2 As CTemps1 Du fait du mot-cl New, la rfrence t1 se rfre un objet de la classe CTemps1 ; le programmeur peut appeler ses mthodes et accder ses proprits. Ceci n'est pas le cas de la rfrence t2, qui se rfre Nothing, tant que New n'est pas utilis ; l'instruction Set t2 = New CTemps1 permet t2 de se rfrer une nouvelle instance (objet) de la classe CTemps1. A titre d'exemple, considrons le programme qui suit o sont dfinies les classes CEmploy et CDate1. La classe CEmploy contient les variables d'instance mPrnom, mNom, mDate_naissance et mDate_embauche. Les membres mDate_naissance et mDate_embauche utilisent des objets de la classe CDate1, cette dernire contient les variables d'instance mJour, mMois et mAnne. Le programme de test instancie 2 objets CEmploy, les initialise et affiche leurs variables d'instance. ___________ module de la classe CDate1.cls ________________ ' Dfinition de la classe CDate1 Option Explicit
page 73

' On dfinit 3 variables dinstances prives (mJour, mMois, mAnne) Private mJour As Integer Private mMois As Integer Private mAnne As Integer Private Sub Class_Initialize() mJour = 1 mMois = 1 mAnne = 1900 End Sub ' On dfinit 3 proprits (Jour, Mois, Anne) Public Property Get Jour() As Integer Jour = mJour End Property Public Property Let Jour(ByVal jr As Integer) mJour = Valider_jour(jr) End Property Public Property Get Mois() As Integer Mois = mMois End Property Public Property Let Mois(ByVal ms As Integer) mMois = Valider_mois(ms) End Property Public Property Get Anne() As Integer Anne = mAnne End Property Public Property Let Anne(ByVal an As Integer) mAnne = an ' Pourrait aussi tre valide End Property ' On dfinit 2 mthodes publiques (Afficher, Fixer_Date) Public Function Afficher() As String Afficher = mJour & "/" & mMois & "/" & mAnne End Function Public Sub Fixer_date(ByVal jr As Integer, ByVal ms As Integer, _ ByVal an As Integer) mMois = Valider_mois(ms) mAnne = an mJour = Valider_jour(jr) End Sub ' On dfinit 2 mthodes prives (Valider_jour, Valider_mois) Private Function Valider_jour(ByVal jr As Integer) As Integer Dim Jours_par_mois() Jours_par_mois = Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
page 74

If jr > 0 And jr <= Jours_par_mois(mMois) Then Valider_jour = jr Exit Function End If If mMois = 2 And jr = 29 And (mAnne Mod 400 = 0 Or mAnne Mod 4 = 0 And _ mAnne Mod 100 <> 0) Then Valider_jour = jr Exit Function End If ' Une entre non valide est remplace par la valeur 1 Valider_jour = 1 End Function Private Function Valider_mois(ByVal ms As Integer) As Integer Valider_mois = IIf((ms > 0 And ms <= 12), ms, 1) End Function ___________ module de la classe CEmploy.cls ___________________ ' Dfinition de la classe CEmploy Option Explicit ' On dfinit 4 variables dinstances prives (mPrnom, mNom, mDate_naissance, ' mDate_embauche) Private mPrnom As String Private mNom As String Private mDate_naissance As CDate1 Private mDate_embauche As CDate1 Private Sub Class_Initialize() Set mDate_naissance = New CDate1 Set mDate_embauche = New CDate1 End Sub ' On dfinit 1 mthodes publique (Afficher) Public Function Afficher() As String Afficher = mPrnom & " " & mNom & _ ", Embauche : " & mDate_embauche.Afficher() & _ ", Naissance : " & mDate_naissance.Afficher() End Function ' On dfinit 4 proprits (Prnom, Nom, Date_naissance, Date_embauche) Public Property Get Prnom() As String Prnom = mPrnom End Property Public Property Let Prnom(ByVal pn As String) mPrnom = pn End Property Public Property Get Nom() As String
page 75

Nom = mNom End Property Public Property Let Nom(ByVal nm As String) mNom = nm End Property Public Property Get Date_naissance () As CDate1 Set Date_naissance = mDate_naissance End Property Public Property Set Date_naissance (ByVal ani As CDate1) Set mDate_naissance = ani End Property Public Property Get Date_embauche() As CDate1 Set Date_embauche = mDate_embauche End Property Public Property Set Date_embauche(ByVal emb As CDate1) Set mDate_embauche = emb End Property Private Sub Class_Terminate() Set mDate_naissance = Nothing Set mDate_embauche = Nothing End Sub

' Libration mmoire de l'objet ' Libration mmoire de l'objet

___________ programme de test ___________________ ' Programme de test des classes CDate et CEmploy Option Explicit Private Sub Form_Load() Dim employ1 As New CEmploy Dim employ2 As New CEmploy With employ1 .Prnom = "Lionel" .Nom = "Terray" Call .Date_naissance.Fixer_date(1, 1, 1921) Call .Date_embauche.Fixer_date(2, 17, 1942) End With employ2.Prnom = "Gaston" employ2.Nom = "Rbuffat" Print employ1.Afficher() Print employ2.Afficher() End Sub
page 76

Relativement la classe CDate1 : La procdure vnementielle Class_Initialize fixe une valeur (non nulle) par dfaut aux 3 variables d'instance entires de la classe, savoir mJour = 1, mMois = 1 et mAnne = 1900. Cet vnement est dclench (uniquement) lorsqu'une instance de la classe est cre. La classe Cdate1 permet, via des procdures Property Get et Property Let, l'accs aux 3 variables d'instance (prives). Property Let Jour et Property Let Mois appellent chacune une mthode prive (respectivement Valider_jour et Valider_mois) afin d'assurer la cohrence des variables d'instance mJour et mMois (par choix, la variable d'instance mAnne n'est pas vrifie). Deux mthodes sont associes cette classe. La mthode Afficher retourne une chane de caractres reprsentant la date. La mthode Fixer_date permet l'utilisateur de fixer le jour, le mois et l'anne (une autre possibilit consisterait utiliser les proprits Jour, Mois et Anne). Notons que cette mthode assure aussi la cohrence des variables d'instance mJour et mMois, travers les mthodes prives Valider_Jour et Valider_mois. Relativement la classe CEmploy : Quatre variables d'instance prives sont associes cette classe : mPrnom, mNom, mDate_naissance et mDate_embauche. Notons que mDate_naissance et mDate_embauche se rfrent des objets de la classe CDate1, il en rsulte une relation de composition. Chacun de ces objets est construit, via New, dans la procdure vnementielle Class_Initialize. La classe CEmploy permet, via des procdures Property Get, Property Let et Property Set, l'accs aux 4 variables d'instance (prives) de la classe. Quand Property Get, ou Property Set, est appele pour un objet CDate1, on note l'emploi du mot-cl Set dans le corps de la procdure Property. La mthode Afficher, associe la classe CEmploy, affiche le prnom, le nom, la date d'embauche et la date de naissance de l'employ. La procdure vnementielle Class_Terminate permet de "nettoyer" un objet avant sa destruction. Relativement au programme de test : Deux objets de la classe CEmploy sont crs (employ1 et employ2) dans la procdure vnementielle Form_Load. Relativement employ1, les proprits Prnom et Nom sont fixes, les dates d'embauche et de naissance sont fixes travers la mthode Fixer_date. En effet, l'appel de la procdure Property Date_naissance Get retourne un objet de la classe CDate1, partir duquel on peut appeler la mthode Fixer_date. Seules sont fixes les proprits Prnom et Nom pour employ2. Aussi les dates d'embauche et de naissance sont mises par dfaut via la procdure vnementielle Class_Initialize de la clase CDate1.

12.4

Evnements et classes

Il est possible de dclarer des vnements au sein d'une classe. Le fait de provoquer un vnement permet un objet de signaler aux autres objets que quelque chose est survenu. Le mot-cl RaiseEvent est utilis pour provoquer un vnement.
page 77

Un vnement est dclar, via le mot-cl Event, de type Public dans la partie dclaration gnrale : Les paramtres associs Event permettent l'mission, ou la rception, de donnes avec le programme. A titre d'exemple, est dfinie dans la figure suivante une classe appele CEvnement, laquelle peut dclencher un vnement. ___________ module de la classe CEvnement.cls __________________ ' Dfinition de la classe pouvant dclencher un vnement Option Explicit ' On dfinit 1 variable dinstance prive (mNombre) Private mNombre As Long ' On dfinit 1 vnement (NomEvnement) Public Event NomEvnement(s As String, n As Long) ' On dfinit 1 mthodes publique (ProvoqueEvnement) Public Sub ProvoqueEvnement() mNombre = mNombre + 1 ' Dclencher l'vnement NomEvnement RaiseEvent NomEvnement("Evnement numro : ", mNombre) End Sub ___________ programme de test ___________________ ' Programme de test de la classe CEvnement Option Explicit Private WithEvents mEvt As CEvnement ' mEvt est 1 objet de la classe CEvnement dans laquelle sont associs des vnements Private Sub Form_Initialize() Set mEvt = New CEvnement End Sub Private Sub Form_Load() Dim x As Integer frmTest.Show ' frmTest : nom de la feuille For x = 1 To 5 ' Appel de la mthode ProvoqueEvnement de lobjet mEvt Call mEvt.ProvoqueEvnement Next x End Sub Private Sub mEvt_NomEvnement(s As String, n As Long) Print s & " #" & n End Sub Private Sub Form_Terminate() Set mEvt = Nothing
page 78

End Sub

Relativement la classe CEvnement, la ligne de code Public Event NomEvnement(s As String, n As Long) dclare un vnement, appel NomEvnement, lequel comprend un paramtre de type String et un paramtre de type Long. Cette classe dfinit galement une mthode, appele ProvoqueEvnement, qui ; - incrmente de 1 la variable d'instance appele mNombre (de type Long), - puis, dclenche l'vnement, appel NomEvnement, via la ligne de code RaiseEvent NomEvnement("Evnement numro : ", mNombre) La chane de caractres "Evnement numro : " et la valeur de mNombre sont les 2 paramtres de NomEvnement. Retenons que la mthode appele ProvoqueEvnement doit tre excute afin de dclencher l'vnement appel NomEvnement. Relativement au programme de test, la ligne de code Private WithEvents mEvt As CEvnement cre une rfrence, appele mEvt, un objet de la classe CEvnement. Le mot-cl WithEvents indique que des vnements sont associs la classe. La ligne de code Call mEvt.ProvoqueEvnement dclenche l'vnement appel NomEvnement. La procdure vnementielle mEvt_NomEvnement permet alors la prise en compte de l'vnement NomEvnement. Dans le cas prsent, on se contente d'afficher les paramtres s et n, associs cette procdure.

page 79

ANNEXES __________________________________________________________________________ ANNEXE A (Code de compilation)

Les programmes Visual Basic sont, par dfaut, compils dans un code intermdiaire, appel p-code. Lors de l'excution, les instructions p-code sont interprtes en code machine par un moteur d'excution msvbvm60.dll (fichier prsent dans le rpertoire WINDOWS\SYSTEM). Les versions Professional et Enterprise de Visual Basic permettent la compilation directement en code machine, il en rsulte, souvent, une augmentation de la vitesse d'excution des programmes, mais aussi de leurs tailles en mmoire. Pour passer d'une compilation en p-code une compilation en code machine, ouvrer le menu Projet | Proprits de projet, cliquer l'onglet nomm Compilation et slectionner la case options Compiler en code natif.

ANNEXE B (Types de projet) Type

Description EXE Standard Programme Windows ordinaire, fichier excutable. EXE ActiveX Fonction dautomatisation fonde sur les modules de classe ; fichier ActiveX excutable. DLL ActiveX Fonction dautomatisation fonde sur les modules de classe ; fichier ActiveX non excutable. Contrle ActiveX Contrle destin la bote outils, ou lutilisation dInternet (fichier OCX). Assistant Cration dApplications Assistant de cration de fichier EXE Standard. Add-In Extension de lenvironnement Visual Basic. DLL Document ActiveX Document Visual Basic destin laffichage, par exemple dans Internet Explorer. EXE Document ActiveX Document ActiveX destin laffichage, par exemple dans Internet Explorer.

ANNEXE C (lments cls de Windows : Fentres, vnements et messages)

Considrons qu'une fentre est simplement une zone rectangulaire dote de ses propres limites. Sans doute, connaissez-vous dj plusieurs types de fentres : Une fentre Explorateur dans Windows, une fentre de document dans un programme de traitement de texte, ou encore une bote de dialogue. S'il s'agit l des exemples les plus courants, il existe bien d'autres types de fentres. Un bouton de commande est une fentre. Les icnes, les zones de texte, les boutons d'option et les barres de menus constituent tous des fentres. Le systme d'exploitation Microsoft Windows gre ces nombreuses fentres en affectant chacune d'elles un numro d'identification unique (descripteur de fentre ou hWnd). Le systme surveille en permanence chacune de ces fentres de faon dceler le moindre vnement ou signe d'activit. Les vnements peuvent tre engendrs par des actions de l'utilisateur (notamment, lorsque celui-ci clique un bouton de la souris ou appuie sur une touche), par un contrle programm, voire mme par des actions d'une autre fentre. Chaque fois qu'un vnement survient, un message est envoy au systme d'exploitation. Celui-ci traite le message et le diffuse aux autres fentres. Chacune d'elles peut alors excuter l'action approprie de la manire prvue pour ce type de message (notamment, se redessiner si elle n'est plus recouverte par une autre fentre).
page 80

Comme vous pouvez l'imaginer, il n'est pas simple de faire face toutes les combinaisons possibles de fentres, d'vnements et de messages. Heureusement, Visual Basic vous pargne la gestion de tous les messages de bas niveau. La plupart de ceux-ci sont automatiquement grs par Visual Basic tandis que d'autres sont mis disposition sous forme de procdures Event afin de vous faciliter la tche. Vous pouvez aussi crire rapidement des applications puissantes sans vous proccuper de dtails inutiles.

ANNEXE D (Description du modle vnementiel)

Dans les applications traditionnelles ou " procdurales ", c'est l'application elle-mme, et non un vnement, qui contrle les parties du code qui sont excutes, ainsi que leur ordre d'excution. Celle-ci commence la premire ligne de code et suit un chemin dfini dans l'application, appelant les procdures au fur et mesure des besoins. Dans une application vnementielle, le code ne suit pas un chemin prdtermin. Diffrentes sections du code sont excutes en raction aux vnements. Ceux-ci peuvent tre dclenchs par des actions de l'utilisateur, par des messages provenant du systme ou d'autres applications, voire mme par l'application proprement dite. L'ordre de ces vnements dtermine l'ordre d'excution du code. Le chemin parcouru dans le code de l'application est donc diffrent chaque excution du programme. Comme il est impossible de prvoir l'ordre des vnements, votre code doit mettre certaines hypothses quant " l'tat du systme " au moment de son excution. Lorsque vous laborez des hypothses (par exemple quand vous supposez qu'un champ de saisie doit contenir une valeur avant l'excution de la procdure charge de traiter cette valeur), vous devez structurer votre application de telle sorte que cette hypothse soit toujours vrifie (par exemple en dsactivant le bouton de commande qui dmarre la procdure aussi longtemps que le champ de saisie ne contient pas une valeur). Votre code peut galement dclencher des vnements pendant l'excution. Par exemple, la modification par programmation du contenu d'une zone de texte dclenche l'vnement Change qui lui est associ et donc l'excution du code ventuellement contenu dans cet vnement. Si vous avez estim que cet vnement ne serait dclench que par dialogue avec l'utilisateur, vous risquez d'tre confront des rsultats inattendus. C'est pour cette raison qu'il est important de bien comprendre le modle vnementiel et de le garder toujours l'esprit tout au long de la phase de cration d'une application.

ANNEXE E (Description (notamment) des paramtres de MoveComplete)

Mthodes WillMove et MoveComplete La mthode WillMove est appele avant que l'opration en attente change la position actuelle dans le Jeu d'enregistrements. La mthode MoveComplete est appele aprs modification de la position actuelle dans le Recordset. Syntaxe WillMove adReason, adStatus, pRecordset MoveComplete adReason, pError, adStatus, pRecordset Paramtres adReason Une valeur EventReasonEnum. Spcifie le motif de cet vnement. Il peut prendre comme valeur adRsnMoveFirst, adRsnMoveLast, adRsnMoveNext, adRsnMovePrevious, adRsnMove ou adRsnRequery. pError Un objet Error. Il dcrit l'erreur survenue pour autant que la valeur de adStatus soit adStatusErrorsOccurred ; dans le cas contraire, il n'est pas dfini. adStatus Une valeur d'tat EventStatusEnum.
page 81

Lors de l'appel de WillMove, ce paramtre est dfini adStatusOK si l'opration qui a provoqu l'vnement a russi. Il est dfini adStatusCantDeny si cette mthode ne peut demander l'annulation de l'opration en attente. Lors de l'appel de MoveComplete, ce paramtre est dfini adStatusOK si l'opration qui a provoqu l'vnement a russi, ou adStatusErrorsOccurred si l'opration a chou. Avant le renvoi d'une valeur de la mthode WillMove, dfinisser ce paramtre adStatusCancel pour demander l'annulation de l'opration en attente. Avant le renvoi d'une valeur de la mthode MoveComplete, dfinisser ce paramtre adStatusUnwantedEvent pour empcher des notifications ultrieures. pRecordset Un objet Recordset. Le Recordset pour lequel cet vnement s'est produit. Remarque : Un vnement WillMove, ou MoveComplete, peut survenir la suite des oprations Recordset suivantes : Open, Move, MoveFirst, MoveLast, MoveNext, MovePrevious, Bookmark, AddNew, Delete, Requery et Resync.

ANNEXE F (Les types de variables objet)

Les variables objet, comme toute autre variable, peuvent se dclarer explicitement en spcifiant le type. Par exemple, pour dclarer une variable objet, nomme txtContrle, comme zone de texte, on crit : Dim txtContrle As TextBox Il correspond un type pour chaque contrle (objet) standard, savoir : CheckBox DirListBox Frame Label Menu Shape ComboBox DriveListBox Grid Line OptionButton TextBox CommandButton FileListBox HscrollBar ListBox OLE Timer Data Form Image MDIForm PictureBox VscrollBar

Des types existent galement pour les contrles non intrinsques. En fait, Visual Basic rappelle le type d'un contrle dans la zone de liste modifiable en haut de la fentre de proprits.

ANNEXE G (Traitement de fichiers avec d'anciennes instructions et fonctions d'E/S de fichiers)

Depuis la premire version de Visual Basic, les fichiers ont t traits l'aide de l'instruction Open et d'autres instructions et fonctions associes (dont la liste est prsente ci-dessous). Ces mcanismes deviendront ventuellement prims en faveur du modle d'objet FSO (File System Object), mais ils sont entirement pris en charge dans Visual Basic 6.0. Bien que vous puissiez crer votre application de sorte qu'elle utilise des fichiers de base de donnes, il n'est pas ncessaire de prvoir l'accs direct aux fichiers dans votre application. Le contrle Data et les contrles dpendants vous permettent de lire et d'crire des donnes dans une base de donnes, ce qui est beaucoup plus simple que de recourir aux techniques d'accs direct aux fichiers. Toutefois, il se peut que vous deviez parfois lire et crire dans des fichiers autres que des bases de donnes. Vous devez alors traiter directement les fichiers en crant, manipulant et stockant du texte et d'autres donnes.
page 82

Types d'accs aux fichiers Pris isolment, un fichier n'est autre qu'une suite d'octets connexes enregistrs sur un disque. Lorsque votre application accde un fichier, elle doit imaginer ce que reprsente ces octets (des caractres, des enregistrements de donnes, des entiers, des chanes, etc.). Le type d'accs aux fichiers varie selon le type de donnes contenues dans le fichier. Dans Visual Basic, il existe trois types d'accs aux fichiers : Squentiel : Pour la lecture et l'criture de fichiers texte dans des blocs continus. Alatoire : Pour la lecture et l'criture de fichiers texte ou binaires structurs sous la forme d'enregistrements de longueur fixe. Binaire : Pour la lecture et l'enregistrement de fichiers possdant une structure arbitraire.

L'accs squentiel a t conu pour les fichiers texte sans mise en forme. Chaque caractre du fichier est cens reprsenter un caractre de texte ou une squence de mise en forme du texte, par exemple un caractre de nouvelle ligne (NL). Les donnes sont stockes sous forme de caractres ANSI. Un fichier ouvert dans le cadre dun accs alatoire est cens tre constitu d'un ensemble d'enregistrements de mme longueur. Grce aux types dfinis par l'utilisateur, vous pouvez crer des enregistrements constitus de nombreux champs pouvant mme possder chacun un type de donnes diffrent. Les donnes sont stockes sous forme d'informations binaires. L'accs binaire vous permet de stocker des donnes dans un ordre quelconque au sein de fichiers. Ce mode d'accs est semblable l'accs alatoire, mais s'en diffrencie par le fait qu'il n'y a aucune estimation du type de donnes ou de la longueur des enregistrements. Toutefois, vous devez connatre avec prcision la manire dont les donnes ont t crites dans le fichier si vous souhaitez les extraire correctement. Pour plus d'informations sur les types d'accs aux fichiers, reportez-vous dans MSDN aux sections " Utilisation de l'accs squentiel aux fichiers ", " Utilisation de l'accs alatoire aux fichiers " et " Utilisation de l'accs binaire aux fichiers ". Fonctions et instructions d'accs aux fichiers Les fonctions suivantes sont utilises avec les trois types d'accs aux fichiers. Dir EOF FileCopy FileDateTime FileLen FreeFile GetAttr Loc LOF Seek SetAttr

Le tableau suivant numre toutes les instructions et fonctions d'accs aux fichiers disponibles pour chacun des trois types d'accs direct aux fichiers. Instruction et fonction Close Get Input( ) Input # Line Input # Open Print # Accs squentiel X X X X X X X X Accs alatoire X X X X
page 83

Accs binaire

Put Type...End Type Write #

X X X

page 84

Vous aimerez peut-être aussi