Вы находитесь на странице: 1из 346

Projet de dveloppement

ou

dveloppements dapplications de gestion


en

VB.Net

Philippe ROBILLARD

20/06/2011

PHR VB.Net - i

Plan du cours
Le cours est scind en plusieurs parties auxquelles sajoute une liste dnoncs dexercices. Le syllabus de chaque partie se distingue des autres par le prfixe attach chaque numro de page. Le cours est autant destin aux dbutants en programmation qu la mise niveau de programmeurs chevronns nayant pas lexprience du .Net. Les diffrents points de la matire doivent tre abords de manire plus ou moins dtaille et un rythme plus ou moins soutenu selon le niveau des participants. Pages VBLab Enoncs dexercices divers

Les pages LaboVB reprennent tous les noncs dexercices appropris lensemble du cours. Chaque nonc dsigne la partie du cours pour laquelle il est pertinent. Pages VBNF Notions fondamentales de programmation en VB.Net

Les pages VBNF sont destines tous. Pour les dbutants, certaines pages peuvent tre dtailles pendant les leons et dautres sommairement abordes. Ces pages doivent tre traites inversement lorsque le cours est dispens des programmeurs. Elles exposent les structures des donnes et les moyens de traitements sous VB.Net. Pages VBPV Bases de la programmation visuelle et vnementielle en VB.Net

Les pages VBPV sadressent galement tous les tudiants. Elles expliquent les outils de la programmation dapplications pour lenvironnement graphique de Windows. Pages VBPA Programmation avance en VB.Net

Les pages VBPA sont destines aux programmeurs qui, matrisant bien la programmation visuelle, souhaitent doper leurs applications en y exploitant au mieux les services du Framework. Pages VBOBJ Programmation oriente objet en VB.Net

Les pages VBOBJ sont uniquement destines aux programmeurs qui matrisent la programmation procdurale et qui souhaitent programmer des applications conues en orient objet. Le cours expose les concepts de base de la POO et dtaille leur mise en uvre sous .Net. Pages VBDB Programmation oriente bases de donnes en VB.Net

Les pages VBDB sadressent tous. Elles expliquent les moyens daccs aux bases de donnes et leur exploitation. Pages VBWEB Elments de programmation oriente Internet en VB.Net

Les pages VBWEB sont destines aux programmeurs et aux dbutants qui ont dj acquis par ailleurs des connaissances de la programmation pour Internet. Elles traitent essentiellement de trois concepts : les pages ASP, les services Web et les applications client/serveur. Pages VBCD Complments divers en VB.Net

Les pages VBCD prsentent divers sujets qui ne sont pas exposs dans le cadre du cours. Elles livrent des complments dinformations que le lecteur peut consulter selon ses besoins. Elles sont notamment destines la prsentation dassistants de lenvironnement DotNet, comme lassistant dempaquetage par exemple.

Avertissement
Les programmes repris dans ce cours sont censs tre illustratifs et non tre toute preuve. Bien que gnralement de bonne facture, ils nont pas subi de tests approfondis. Le programmeur souhaitant en intgrer dans un dveloppement aura soin de pratiquer les tests ncessaires la fiabilit de son application.

20/06/2011

PHR VB.Net - ii

Conventions d'criture
Afin de permettre au lecteur de diffrencier rapidement diverses parties du texte, la rdaction et la mise en page de ce cours sont ralises autant que possible dans le respect des rgles suivantes. Mots du langage et mots du programmeur. Les mots des langages sont crits dans le texte courant en Courier New gras. Il en est de mme pour les mots utiliss par le programmeur dans les lignes de codes des exemples, mais ceux-ci sont franciss. Exemples : le contrle daccs n'est pas assur car la variable Cinq dclare Public est accessible les portes Public et Friend sont Programme complet et extraits. Les lignes de codes des exemples sont cadres gauche lorsqu'elles constituent un programme complet, mme si son code est entrecoup de textes explicatifs, et elles sont dcales d'un retrait vers la droite lorsqu'elles constituent un extrait de programme. Exemple de programme complet :
Module MonModule Sub Main() Console.WriteLine("Bonjour") End Sub End Module

Exemple d'extrait de programme :


Sub Main() Console.WriteLine("Bonjour") End Sub

Codes et commentaires. Les lignes et fins de lignes qui sont des commentaires sont crites en plus petit et en italique. Certaines d'entre elles prsentent des rsultats d'affichages : l'italique est supprim pour les caractres effectivement affichs. Exemples :
' La Sub Main suivante a pour but d'afficher le mot Bonjour l'cran Sub Main() ' Entte de la procdure ' Affichage : Bonjour Console.WriteLine("Bonjour") ' Fin de la procdure End Sub

Longues lignes de codes. Les lignes de codes trop longues pour tenir sur la largeur de la page sont continues cadres droite la ligne suivante. Cette typographie signifie donc que le code ainsi reprsent doit tre programm sur une seule ligne. Exemple :
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

Divers, abus de langage, particularits. Les mots dont le sens premier est dtourn, ceux reprsentant pour la premire fois un objet ou un concept particulier, ceux dont la dfinition est donne plus loin, ou simplement ceux qui mritent une attention spciale dans le contexte, et qui ne sont pas des mots du langage, ni des extraits des lignes de codes des exemples, sont crits en italique dans le texte courant. Exemples : la variable de type valeur est bien traite comme telle seule la rfrence d'un membre de type rfrence est conserve

20/06/2011

PHR VB.Net - iii

Lectures utiles (offertes sous format lectronique en dbut de cours)


* * Christophe Darmangeat. Algorithmique et programmation Adaptation (avec lautorisation de lauteur) la programmation sous VB.Net du cours de Ch. Darmangeat (Universit Paris 7 http://www.pise.info). Elments de SQL : lments dalgbre relationnelle (non mathmatique) et approche indite de conception de requtes.

Table des matires des pages VBNF : Notions fondamentales de programmation en VB.Net
Historique du Basic ............................................................................................................................................................4 La technologie .NET...........................................................................................................................................................5 Visual Studio .Net ....................................................................................................................................................5 Lenvironnement de dveloppement Visual Studio............................................................................................................6 Application Console .................................................................................................................................................7 Application Windows...............................................................................................................................................8 Les entres et les sorties de donnes.................................................................................................................................11 Applications Console .............................................................................................................................................11 Les entres....................................................................................................................................................11 Les sorties ....................................................................................................................................................12 Applications Windows ...........................................................................................................................................13 Les types et structures de donnes....................................................................................................................................14 Brve rvision de notions fondamentales...............................................................................................................14 Les variables ................................................................................................................................................14 Les structures composes (tableaux)............................................................................................................14 Les structures complexes (types utilisateurs)...............................................................................................15 Dclarations des variables. .....................................................................................................................................16 Les types de donnes..............................................................................................................................................20 Notation littrale de donnes ..................................................................................................................................21 Dclaration des tableaux ........................................................................................................................................21 Dfinition des structures.........................................................................................................................................23 Les structures de tableaux ............................................................................................................................24 Les tableaux de structures ............................................................................................................................24 Les numrations....................................................................................................................................................25 Les instructions de contrles et moyens de traitements....................................................................................................26 Brve rvision de notions fondamentales...............................................................................................................26 La squence..................................................................................................................................................26 La rupture de squence ................................................................................................................................26 Lalternative .................................................................................................................................................26 Les itrations ................................................................................................................................................26 Ni contrle, ni traitement........................................................................................................................................27 Les commentaires ........................................................................................................................................27 La continuation ............................................................................................................................................27 Lconomie de dactylographie.....................................................................................................................27 Le sparateur dinstructions .........................................................................................................................27 Les instructions de contrles ..................................................................................................................................28 La rupture de squence ................................................................................................................................28 Lalternative .................................................................................................................................................28 La slection ..................................................................................................................................................30 Les itrations ................................................................................................................................................31 Les boucles logiques..........................................................................................................................31 La boucle arithmtique ......................................................................................................................32 Une boucle ni logique, ni arithmtique..............................................................................................33 Lappel de sous-programmes .......................................................................................................................33 Lexcution de programmes externes. .........................................................................................................34 Le mot de la fin ............................................................................................................................................34 Les moyens de traitements .....................................................................................................................................35 Les oprateurs ..............................................................................................................................................35 Laffectation ......................................................................................................................................35 La concatnation ................................................................................................................................35 Les oprateurs arithmtiques .............................................................................................................35

20/06/2011

PHR VB.Net - iv

Les formes contractes de laffectation .............................................................................................35 Les oprateurs relationnels ................................................................................................................35 Les oprateurs logiques .....................................................................................................................36 Les oprateurs binaires ......................................................................................................................37 Ordre dvaluation des expressions et hirarchie des oprateurs ......................................................37 Les procdures et fonctions intrinsques, et les mthodes...........................................................................37 Dclarations des procdures et des fonctions...............................................................................................38 Dclarations des arguments des procdures, fonctions et mthodes .................................................40 Type de donne des arguments ..........................................................................................................42 Valeur de retour des fonctions ...........................................................................................................42 La rcursivit................................................................................................................................................43

Table des matires des pages VBPV : Bases de la programmation visuelle et vnementielle en VB.Net
Programmation oriente objet, visuelle et vnementielle .................................................................................................5 Une application Windows (Form et Button) ..................................................................................................................6 Deux proprits pour commencer : Name et Text .................................................................................................9 Proprits gnralement associes la proprit Text : BackColor, ForeColor et Font..............................10 Quelques proprits communes la plupart des composants visuels ....................................................................10 Quelques mthodes communes la plupart des composants visuels .....................................................................11 Quelques vnements communs la plupart des composants visuels ...................................................................11 Dbogage et gestion des erreurs .......................................................................................................................................13 Le pas pas ............................................................................................................................................................14 Le point darrt.......................................................................................................................................................14 Lvaluation des variables en cours dexcution....................................................................................................15 Linsertion denvois de messages...........................................................................................................................15 La gestion des erreurs.............................................................................................................................................17 Gnrer des erreurs.................................................................................................................................................18 Lessentiel des composants visuels et de leurs membres .................................................................................................19 Le formulaire : Form .............................................................................................................................................19 Proprits .....................................................................................................................................................19 Mthodes......................................................................................................................................................21 Evnements ..................................................................................................................................................22 Membres communs la plupart des composants visibles ......................................................................................22 Proprits .....................................................................................................................................................22 Mthode .......................................................................................................................................................23 Evnements ..................................................................................................................................................23 Ltiquette : Label ...............................................................................................................................................23 Proprits .....................................................................................................................................................23 La bote de texte : TextBox .................................................................................................................................24 Proprits .....................................................................................................................................................24 Mthodes......................................................................................................................................................25 Evnement....................................................................................................................................................25 La case cocher : CheckBox ...............................................................................................................................25 Proprits .....................................................................................................................................................25 Evnements ..................................................................................................................................................25 Le bouton radio : RadioButton .........................................................................................................................26 Les groupes dobjets : GroupBox et Panel........................................................................................................27 Diffrences essentielles................................................................................................................................27 Ltiquette hyperlien : LinkLabel ......................................................................................................................27 La bote de liste : ListBox ..................................................................................................................................28 Proprits .....................................................................................................................................................28 Mthodes......................................................................................................................................................29 Evnement....................................................................................................................................................29 Quelques exemples ......................................................................................................................................29 La liste de cases cocher : CheckedListBox ...................................................................................................30 La liste droulante : ComboBox ............................................................................................................................30 La liste de visualisation : ListView ....................................................................................................................30 Proprits .....................................................................................................................................................30

20/06/2011

PHR VB.Net - v

Mthodes......................................................................................................................................................32 Evnements ..................................................................................................................................................32 Quelques exemples ......................................................................................................................................32 Les vues en arborescence : TreeView .................................................................................................................34 Proprits .....................................................................................................................................................34 Mthodes......................................................................................................................................................34 Evnment....................................................................................................................................................35 Lecture dun TreeView ................................................................................................................................35 Le calendrier mensuel : MonthCalendar ..........................................................................................................36 Le slectionneur de date : DateTimePicker ....................................................................................................36 La bote image : PictureBox ..........................................................................................................................37 Le diviseur : Splitter........................................................................................................................................38 Une ralisation .............................................................................................................................................38 Son code.............................................................................................................................................38 Son rsultat ........................................................................................................................................38 Le contrle onglets : TabControl ...................................................................................................................39 Le menu : MainMenu et MenuStrip ..............................................................................................................40 La minuterie : Timer ............................................................................................................................................41 Proprits .....................................................................................................................................................41 Mthodes......................................................................................................................................................41 Evnement....................................................................................................................................................41 Exemple .......................................................................................................................................................41 Les botes de dialogue ......................................................................................................................................................42 Louverture de fichiers : OpenFileDialog ......................................................................................................42 Proprits .....................................................................................................................................................42 Mthode .......................................................................................................................................................43 Exemple .......................................................................................................................................................43 Lenregistrement de fichiers : SaveFileDialog ..............................................................................................43 Lexplorateur de dossiers : FolderBrowserDialog .......................................................................................43 Les polices de caractres : FontDialog .............................................................................................................44 Les couleurs : ColorDialog ..............................................................................................................................44 Limpression des documents ..................................................................................................................................45 Le moteur dimpression : PrintDocument....................................................................................................45 La mise en page : PageSetupDialog.............................................................................................................47 La slection de limprimante : PrintDialog ..................................................................................................47 La fentre de prvisualisation : PrintPreviewDialog....................................................................................47 Le composant de prvisualisation : PrintPreviewControl ............................................................................47 Exemple rcapitulatif ...................................................................................................................................47 Programmation multi formulaires.....................................................................................................................................49 Louverture de formulaires secondaires .................................................................................................................49 Le passage de donnes entre formulaires ...............................................................................................................49 LInputBox lancienne.........................................................................................................................................55 Rsum des modes de communications abords....................................................................................................56 Lexploitation des mmoires de masse.............................................................................................................................57 Les dossiers ............................................................................................................................................................57 Liste des units.............................................................................................................................................57 Liste des dossiers dune unit ......................................................................................................................57 Liste des fichiers dun dossier......................................................................................................................57 Liste des sous dossiers et fichiers dun dossier ............................................................................................57 Crer un dossier ...........................................................................................................................................58 Copier un dossier .........................................................................................................................................58 Dplacer un dossier......................................................................................................................................58 Renommer un dossier...................................................................................................................................58 Supprimer un dossier ...................................................................................................................................58 Les fichiers .............................................................................................................................................................59 Crer un fichier ............................................................................................................................................59 Copier un fichier ..........................................................................................................................................59 Dplacer un fichier.......................................................................................................................................59 Renommer un fichier ...................................................................................................................................59

20/06/2011

PHR VB.Net - vi

Supprimer un fichier ....................................................................................................................................59 Cration, enregistrement et lecture dun fichier texte ..................................................................................60 Cration, enregistrement et lecture dun fichier de donnes accs squentiel ..........................................61 Cration, enregistrement et lecture dun fichier de donnes accs alatoire.............................................62 Les modes douvertures .....................................................................................................................62 Les types daccs ...............................................................................................................................62 Tableau rcapitulatif des associations permises du mode douverture et du type daccs ................62 Quelques membres de la classe FileStream.................................................................................62 Lcriture et la lecture du fichier .......................................................................................................63 Exemple complet ...............................................................................................................................64 La protection des donnes des fichiers lors des accs simultans .....................................................70 Cration, enregistrement et lecture dun fichier binaire...............................................................................72 Inventaire des principaux outils concernant les dossiers et les fichiers .................................................................75 Mthodes communes des classes Directory et File......................................................................................75 Proprits communes des classes DirectoryInfo et FileInfo ........................................................................75 Mthodes communes des classes DirectoryInfo et FileInfo.........................................................................75 Mthodes spcifiques de la classe Directory................................................................................................75 Proprits spcifiques de la classe DirectoryInfo ........................................................................................75 Mthodes spcifiques de la classe DirectoryInfo.........................................................................................75 Mthodes spcifiques de la classe File.........................................................................................................76 Proprits spcifiques de la classe FileInfo..................................................................................................76 Mthodes spcifiques de la classe FileInfo ..................................................................................................76 La classe Stream...........................................................................................................................................77 Proprits et mthodes de la classe StreamWriter .......................................................................................77 Mthodes de la classe StreamReader ...........................................................................................................77 Mthodes de la classe BinaryWriter ............................................................................................................77 Mthodes de la classe BinaryReader............................................................................................................78

Table des matires des pages VBPA : Programmation avance en VB.Net


Autant savoir.......................................................................................................................................................................3 Les traitements en ligne de commande ....................................................................................................................3 Les assemblages .......................................................................................................................................................4 Manifeste de l'assemblage..............................................................................................................................5 Assemblages mono fichier et multi fichiers...................................................................................................5 Le dsassemblage...........................................................................................................................................6 Espace de noms..............................................................................................................................................7 Nom complet..................................................................................................................................................7 Instructions au niveau de l'espace de noms....................................................................................................7 Rfrences, Imports et Declare ......................................................................................................................8 Arguments d'appel d'une application........................................................................................................................9 Application Console.......................................................................................................................................9 Application Windows ....................................................................................................................................9 A partir dune session Dos...................................................................................................................9 A partir de Windows..........................................................................................................................10 Les rgions .............................................................................................................................................................11 Les fonctionnalits du Framework ...................................................................................................................................12 L'espace de noms System .......................................................................................................................................12 La classe System.Object ..............................................................................................................................12 Mthodes............................................................................................................................................12 La classe String ............................................................................................................................................13 Proprit.............................................................................................................................................13 Mthodes............................................................................................................................................13 La classe DateTime ......................................................................................................................................16 Proprits ...........................................................................................................................................17 Mthodes............................................................................................................................................17 La classe RegEx ...........................................................................................................................................19 Membres ............................................................................................................................................22 La classe Math .............................................................................................................................................25 Proprits ...........................................................................................................................................25

20/06/2011

PHR VB.Net - vii

Mthodes............................................................................................................................................25 La classe VBMath ........................................................................................................................................25 L'espace de nom System.Drawing..........................................................................................................................26 La classe Graphics .......................................................................................................................................26 L'espace de noms System.Collections....................................................................................................................31 Les classes offertes.......................................................................................................................................31 Membres communs la plupart des collections...........................................................................................31 Proprites ...........................................................................................................................................31 Mthodes............................................................................................................................................31 La classe ArrayList ......................................................................................................................................32 Proprit.............................................................................................................................................32 Mthodes............................................................................................................................................32 La classe BitArray........................................................................................................................................35 Proprit.............................................................................................................................................35 Mthodes............................................................................................................................................35 La classe Hashtable......................................................................................................................................36 Proprits ...........................................................................................................................................36 Mthodes............................................................................................................................................36 La classe SortedList .....................................................................................................................................37 Mthodes............................................................................................................................................37 La classe Queue ...........................................................................................................................................38 Mthodes............................................................................................................................................38 La classe Stack .............................................................................................................................................39 Mthodes............................................................................................................................................39 Une dernire comparaison ...........................................................................................................................40 La classe CollectionBase .............................................................................................................................41 Lespace de noms Collections.Generic ........................................................................................................43

Table des matires des pages VBOBJ : Programmation oriente objet en VB.Net
Introduction ........................................................................................................................................................................3 Depuis 1960..............................................................................................................................................................3 Quelles diffrences ? ................................................................................................................................................3 Programmation oriente objet.............................................................................................................................................4 Classe et structure.....................................................................................................................................................4 Gestion de la mmoire..............................................................................................................................................8 Ramasse-miettes.............................................................................................................................................9 Enveloppement, contrle daccs, encapsulation .....................................................................................................9 Une proprit par dfaut ..............................................................................................................................12 L'hritage................................................................................................................................................................13 Programmation de l'hritage ........................................................................................................................14 Membre statique ................................................................................................................................15 Drivations publique, protge et prive ...........................................................................................18 Constructeurs et destructeurs .............................................................................................................19 Constructeur par recopie....................................................................................................................21 Interface et Implements................................................................................................................................22 Le polymorphisme..................................................................................................................................................26 Classe abstraite et mthode virtuelle............................................................................................................26 Surdfinition, surcharge et masquage ..........................................................................................................30 La surcharge des oprateurs .........................................................................................................................33 L'interdiction de driver .........................................................................................................................................33 Les vnements ......................................................................................................................................................34 Emission d'vnements ................................................................................................................................34 Rception et traitement d'vnements..........................................................................................................35 Aspects avancs................................................................................................................................................................37 La dlgation ..........................................................................................................................................................37 Programmation asynchrone....................................................................................................................................40 La commande asynchrone Shell...................................................................................................................40 Programmation de mthodes asynchrones ...................................................................................................41

20/06/2011

PHR VB.Net - viii

Le multithreading ...................................................................................................................................................43 Les processus actifs......................................................................................................................................43 Synchrone, asynchrone et multithreading ....................................................................................................44 Programmation et gestion du multithreading ...............................................................................................45 Accs une ressource partage .........................................................................................................45 Accs exclusif une ressource ..........................................................................................................47 Instanciation d'un thread par dlgation ............................................................................................48 Echange d'informations avec un thread .............................................................................................48 Le marshaling ....................................................................................................................................51 Programmation asynchrone et multithreading : une synthse ...........................................................56 La persistance .........................................................................................................................................................57

Table des matires des pages VBDB : Programmation oriente bases de donnes en VB.Net
L'ADO.Net..........................................................................................................................................................................4 L'accs aux sources de donnes................................................................................................................................4 Les modes d'accs aux bases de donnes .................................................................................................................4 Le mode connect ..........................................................................................................................................4 Le mode dconnect.......................................................................................................................................5 Les bases de donnes Access..............................................................................................................................................5 Cration d'une base Access ......................................................................................................................................5 Compactage d'une base Access ................................................................................................................................6 Rglage d'un pilote ODBC pour Access ..................................................................................................................7 Le mode connect...............................................................................................................................................................8 La connexion ............................................................................................................................................................8 Fonctionnalits de l'objet Connection ............................................................................................................8 Proprits .............................................................................................................................................8 Mthodes..............................................................................................................................................9 Evnements..........................................................................................................................................9 L'objet Command ...................................................................................................................................................10 Proprits ...........................................................................................................................................10 Mthodes............................................................................................................................................10 Exemple .............................................................................................................................................11 L'objet DataReader .................................................................................................................................................11 Proprits ...........................................................................................................................................11 Mthodes............................................................................................................................................12 Exemples............................................................................................................................................12 L'objet Transaction.................................................................................................................................................13 Exemple .............................................................................................................................................13 Connexion polyvalente...........................................................................................................................................14 Obtention de la chane de connexion .....................................................................................................................15 Le mode dconnect .........................................................................................................................................................16 La connexion en lecture .........................................................................................................................................16 L'objet DataAdapter .....................................................................................................................................16 Deux mthodes de lecture ............................................................................................................................16 Les objets DataSet et DataTable ..................................................................................................................16 Proprit du DataSet ..........................................................................................................................16 Proprit du DataSet et du DataTable................................................................................................16 Proprits du DataTable.....................................................................................................................16 Mthodes du DataSet et du DataTable...............................................................................................17 Usage simple du DataSet ...................................................................................................................17 Usage simple du DataTable ...............................................................................................................18 Cration d'une base de donnes en mmoire..........................................................................................................19 Sauvegarde de la base mmoire dans une base Access................................................................................22 Utilisation des relations et contraintes d'intgrit...................................................................................................23 Lectures des donnes ...................................................................................................................................23 Lecture linaire ..................................................................................................................................23 Lectures hirarchiques .......................................................................................................................23 Les contraintes d'intgrits...........................................................................................................................24

20/06/2011

PHR VB.Net - ix

Quelques cas ......................................................................................................................................24 Mise jour de la base source et gestion des conflits ..............................................................................................25 Bases de donnes et composants visuels ..........................................................................................................................29 La liaison une base de donnes............................................................................................................................29 La prsentation des donnes...................................................................................................................................29 Lecture et affichage d'une simple table........................................................................................................31 Lecture et affichage de tables lies par une relation ....................................................................................31 La recherche d'un enregistrement.................................................................................................................33 La manipulation des donnes .................................................................................................................................34 L'dition contrle d'un enregistrement .......................................................................................................34 L'ajout d'un enregistrement ..........................................................................................................................36 La suppression d'un enregistrement .............................................................................................................37 La mise jour de la base ........................................................................................................................................38 Le composant DataGridView.................................................................................................................................40 Limpression des donnes par CrystalReport.........................................................................................................41

Table des matires des pages VBWEB : Elments de programmation oriente Internet en VB.Net
Introduction ........................................................................................................................................................................3 Les Web Forms...................................................................................................................................................................4 La page HTML.........................................................................................................................................................4 La page ASPX ..........................................................................................................................................................6 Les composants ASP visuels..........................................................................................................................8 L'objet Page .........................................................................................................................................9 Le composant TextBox......................................................................................................................11 Le composant HyperLink ..................................................................................................................11 Le composant LinkButton .................................................................................................................11 Le composant ImageButton ...............................................................................................................11 Le composant Image..........................................................................................................................12 Le composant HiddenField................................................................................................................12 Le composant Menu...........................................................................................................................12 Le composant Table...........................................................................................................................13 Les composants CheckBox, CheckBoxList, RadioButton et RadioButtonList .................................13 Le composant Panel ...........................................................................................................................16 Les composants View et MultiView..................................................................................................16 Le composant FileUpload..................................................................................................................17 Liaisons de composants une base de donnes ...........................................................................................18 Connexion une base Access ............................................................................................................18 Les composants ListBox et DropDownList.......................................................................................19 Les services Web ..............................................................................................................................................................20 Introduction ............................................................................................................................................................20 Cycle de fonctionnement .............................................................................................................................20 Utilisation d'un service Web ..................................................................................................................................21 Recherche du service ...................................................................................................................................21 Mise en place du service ..............................................................................................................................21 Exploitation du service.................................................................................................................................23 Cration d'un service Web......................................................................................................................................24 Exploitation du service.................................................................................................................................26 Exemple d'exploitation synchrone .....................................................................................................26 Exemple d'exploitation asynchrone ...................................................................................................26 Cration et exploitation d'un service avec contrle d'accs .........................................................................27 Le Net Remoting ..............................................................................................................................................................29 Le choix entre Service Web et Net Remoting ........................................................................................................29 Fonctionnement du Net Remoting .........................................................................................................................29 Programmation du Net Remoting...........................................................................................................................30 Cration d'une application serveur lmentaire ...........................................................................................30 Cration d'une application cliente ................................................................................................................31 Dmarrage d'une application serveur par une application cliente................................................................32

20/06/2011

PHR VB.Net - x

Table des matires des pages VBCD : Complments divers en VB.Net


Le Basic : son histoire en un coup dil.............................................................................................................................3 Le Visual Studio et "son" framework .................................................................................................................................3 Amliorations du langage dans Visual Basic 2005 ............................................................................................................4 Introduction ..............................................................................................................................................................4 My ............................................................................................................................................................................4 Les commentaires XML...........................................................................................................................................6 Gnriques................................................................................................................................................................7 Instruction Using ......................................................................................................................................................8 Instruction Continue .................................................................................................................................................8 Mot Global ...............................................................................................................................................................8 Oprateur IsNot ........................................................................................................................................................9 Instruction TryCast...................................................................................................................................................9 Surcharge des oprateurs et oprateurs de conversion .............................................................................................9 Accessibilit des mcanismes d'accs aux proprits ..............................................................................................9 Limites explicites des tableaux.................................................................................................................................9 Accesseurs aux vnements personnaliss.............................................................................................................10 Types partiels .........................................................................................................................................................10 vnements de niveau application .........................................................................................................................11 Avertissements du compilateur ..............................................................................................................................11 Nouveaux types numriques ..................................................................................................................................11 Instances par dfaut ................................................................................................................................................12 La documentation du code source ....................................................................................................................................13 Commentaires XML...............................................................................................................................................13 Les commentaires ordinaires..................................................................................................................................14 Les commentaires spcialiss.................................................................................................................................14 Les signets ..............................................................................................................................................................15 Usage de fichiers de paramtres .......................................................................................................................................16 La lecture de fichiers XML ....................................................................................................................................16 Le fichier ressource programm.............................................................................................................................17 Synthse des fichiers de paramtres .......................................................................................................................17 Fichier de ressources ajout lespace My...................................................................................................17 Fichier de paramtres ajout lespace My ..................................................................................................17 Fichier XML de paramtres .........................................................................................................................17 Fichier de paramtres programm................................................................................................................17 Lempaquetage .................................................................................................................................................................18

09/08/2011

PHR VB.Net VBLab - 1

Enoncs des labos en VB.Net

09/08/2011

PHR VB.Net VBLab - 2

Contenu des pages VBLab


Modalits Enoncs des labos 1. BonjourConsole (/100) (cf. Pages VBNF : Application Console) 2. BonjourWindows (/100) (cf. Pages VBNF : Application Windows) 3. Dbile (/200) (cf. Pages VBPV : Proprits et vnements communs la plupart des composants visuels) c 4. Debug (/100) (cf. Pages VBNF + VBPV : Dclaration des arguments et Dbogage) 5. DesChoix (/100) (cf. Pages VBPV : CheckBox et RadioButton) c 6. MesAmis (/200) (cf. Pages VBPV : Le composant ListView) c 7. BonneImpression (/150) (cf. Pages VBPV : Menu et impression) 8. MesAmisEnFichier (/200) (cf. Pages VBPV : Les botes de dialogues + Exploitation des mmoires de masse) c 9. SauvezLes (/100) (cf. Pages VBPV : Minuterie) c 10. UnBonArgument (/200) (cf. Pages VBPV + VBPA : Mmoires de masse + Arguments d'appel ) c 11. Remplace (/150) (cf. Pages VBPA : La classe String) c 12. LeBonMoment (/100) (cf. Pages VBPA : DateTime et RegEx) c 13. UneCollection (/200) (cf. Pages VBNF et VBPA : Structure + CollectionBase) c 14. MesPremiers (/200) (cf. Pages VBOBJ : Encapsulation et abstraction) c 15. MesPersonnes (/300) (cf. Pages VBPA et VBOBJ : CollectionBase + Proprit par dfaut) c 16. MesFractions (/100) (cf. Pages VBOBJ : Surcharge des oprateurs) c 17. EncoreDesPersonnes (/400) (cf. Pages VBPA et VBOBJ : CollectionBase + Proprit par dfaut + Persistance) c 18. UneDBPersonnes (/400) (cf. Pages VBDB : Bases de donnes et composants visuels) c 19. CarnetDAdresses (/600) (cf. Pages VBDB : Bases de donnes et composants visuels) 20. AutreCarnetDAdresses (/800) (cf. Pages VBDB : Bases de donnes et composants visuels) Travaux complmentaires 21. Tableaux (/100) (cf. Pages VBNF : Les tableaux) 22. StructuresTableaux (/100) (cf. Pages VBNF : Les structures de tableaux) 23. TableauxStructures (/100) (cf. Pages VBNF : Les tableaux de structures) 24. DeclareProc (/100) (cf. Pages VBNF : Dclarations des procdures et des fonctions) 25. ToString (/100) (cf. Pages VBPA : La classe System.Object et la classe String) c 26. Sinus (/100) (cf. Pages VBPA : La classe Graphics) 27. Async (/200) (cf. Pages VBOBJ : Synchrone, asynchrone et multithreading) c 28. ListeDesPersonnes (/400) (cf. Pages VBPV et VBDB : ListBox, Impression et DataGridView) 29. MesAmisWeb (/400) (cf. Pages VBWEB : Les composants ASP visuels + Liaison une base de donnes) c 30. JeuDuPendu (/400) (cf. Pages VBWEB : Programmation du Net Remoting) c Exercices divers 31. LesImpairs (cf. Pages VBNF: Itrations) 32. SomEntiers (cf. Pages VBNF : Itrations) 33. DesMots (cf. Pages VBNF et VBPV : Les tableaux + Boutons + Bote de texte) c 34. MonRepertoire (cf. Pages VBPV : ListView + Impression) c 35. DevineNombre (cf. Pages VBPV : Gnrer des erreurs + Form + Programmation multi formulaires) c 36. ChercheEtRemplace (cf. Pages VBPV et VBPA : Mmoires de masse + Classes String et RegularExpressions) c 37. RepertoireTelephones (cf. Pages VBPA : Collections gnriques) c 38. DesEtudiants (cf. Pages VBOBJ : Constructeurs et destructeurs, constructeur par recopie) c 39. MailAGogo (cf. Pages VBDB : OleDB et DataReader) c 40. DBMails (cf. Pages VBDB : Cration d'une base Access + Mode connect) c

Corrig existant (document Word, sauf pour le labo 18 o il sagit des fichiers sources de lapplication)

09/08/2011

PHR VB.Net VBLab - 3

Modalits
Chaque labo doit tre considr comme une application part entire et, ce titre, doit avoir un dossier qui lui est spcialement rserv sur l'ordinateur o a lieu son dveloppement. Ce dossier doit recevoir un nom reprsentatif de son contenu. Pour un labo, le nom est compos du numro et du nom du labo spars par un soulign (ex. 1_BonjourConsole si le nom du premier labo est BonjourConsole). Ce dossier DOIT contenir TOUT le ncessaire son labo et un document Word contenant les copies documentes ( limage de ce qui est fait dans le support de cours) de quelques crans reprsentatifs des exprimentations effectues. Le cas chant, ce document contiendra les explications requises par lnonc du labo. Certains labos ne consistent quen la production dun document Word. Celui-ci doit galement tre stock dans un dossier au nom du labo. Ce(s) dossier(s) de labos est (sont) compress(s) dans un fichier dont le nom est celui de ltudiant. Ce fichier ZIP (ou RAR) doit tre transmis par e-mail phr@skynet.be ou phr.phr@base.be ou encore phr.phr@belgacom.net. Ainsi donc, par exemple, ltudiant Jules Denface envoyant les labos 1 et 2, transmettra un fichier DENFACE.ZIP qui contiendra les dossiers 1_BonjourConsole et 2_BonjourWindows, chacun de ceux ci contenant tous les fichiers du labo correspondant. Ces directives permettent d'automatiser la rception des labos et leur rangement sur le disque partir duquel ils sont expriments et valus. Aussi, les envois ne respectant pas ces directives sont refuss et leurs labos reoivent la cote nulle. Les indications /100, /200, reprsentent le poids de chaque labo en matire de cotation et sont fonction du temps ncessaire la ralisation des labos. Ces temps sont estims en sachant que les tudiants disposent des codes du cours en fichiers non protgs et quils peuvent donc effectuer des copier/coller de ces codes offerts pour amorcer leurs labos en ralisant une grande conomie de dactylographie. A dfaut dindication, le poids dun labo vaut 100. Chaque nonc de labo est assorti dune indication des pages du cours auxquelles il se rapporte principalement. Le ncessaire la ralisation dun labo est presque toujours contenu ces pages. Les quelques vitamines parfois ncessaires sont des membres proches de ceux expliqus dans le cours et il nest donc jamais ncessaire dentreprendre de longues recherches dans les pages daide ou sur Internet pour mener bien un labo. De plus lobjet des labos est lexprimentation de la matire enseigne et non la mise en uvre dautres techniques. Pour chacun des labos, les fichiers VB comptent pour la moiti des points et le document Word pour lautre moiti, mais un document Word seul ne compte pas. La cote attribue au document Word nexcde jamais celle attribue au projet VB. Pour la dtermination de celle-ci, les fichiers VB sont tests et leur bon fonctionnement vrifi. La qualit du projet est galement value sur base des noms attribus aux diffrents fichiers, objets et variables qui le composent, sur base du respect de lnonc, de la pertinence des copies dcrans ralises, Rpartition des points : Les interrogations ventuelles et lexamen (ou le travail de fin de cours) fournissent ensemble une cote A sur 100. Lensemble des labos fournit une cote B sur 100. Le poids de chacune de ces 2 cotes dans la cote globale est dtermin par la rgle suivante : Rsultats obtenus pour les cotes A et B Cote A Cote B
(Interrog. + TFF et/ou examen) (les labos)

Cote globale % de A 75 50 100 50 % de B 25 50 0 50

>= 60 >= 60 <60 <60 chances :

>= 50 < 50 >= 50 < 50

Sauf indication contraire, un labo doit tre transmis au plus tard le samedi matin de la semaine qui suit celle o a t nonc ce labo. Un faible retard entrane la division de sa cote par 2. Pass le dimanche (ou le jour suivant dans le cas d'une chance prcise), la cote devient nulle.

Lobjet des labos est lexprimentation de la matire enseigne et non la mise en uvre dautres techniques !

09/08/2011

PHR VB.Net VBLab - 4

Enoncs des labos


1. BonjourConsole (/100) (cf. Pages VBNF : Application Console) Ralisez une application Console qui demande le nom de l'utilisateur et lui affiche ensuite Bonjour suivi du nom. Exemple supposant que l'utilisateur s'appelle Jules :
Quel est ton nom ? Bonjour Jules

2. BonjourWindows (/100) (cf. Pages VBNF : Application Windows) Ralisez une application Windows qui demande le nom de l'utilisateur et lui affiche ensuite Bonjour. Cette application doit utiliser un Label pour la question, un TextBox pour l'encodage et un MessageBox pour l'affichage demand. 3. Dbile (/200) (cf. Pages VBPV : Proprits et vnements communs la plupart des composants visuels) c Ralisez une application Windows ouvre un formulaire contenant un bouton en son centre. La largeur du formulaire doit tre suprieure 3 fois la largeur du bouton, et la hauteur doit tre suprieure 3 fois celle du bouton. Libell du bouton : "Clique-moi si tu peux". Cette application doit dplacer le bouton dans une des 9 zones possibles chaque tentative de clic. Chaque zone doit avoir tre occupe par le bouton l'occasion de 9 tentatives de clic. Les traits interrompus de lillustration suivante ne doivent pas tre implments dans le labo.

1 4 7

3 6

4. Debug (/100) (cf. Pages VBNF + VBPV : Dclaration des arguments et Dbogage) Ralisez une application Console qui met en uvre les codes des exemples contenus dans les pages VBNF pour illustrer la dclaration des arguments des procdures, fonctions et mthodes. Excutez cette application en pas pas et en valuant diverses valeurs de sorte vrifier les rsultats annoncs dans les pages VBNF. 5. DesChoix (/100) (cf. Pages VBPV : CheckBox et RadioButton) c Ralisez une application d'exprimentation des codes proposs propos des RadioButton et de sorte les appliquer galement aux CheckBox en indiquant dans ce cas, si un CheckBox est coch ou dcoch. 6. MesAmis (/200) (cf. Pages VBPV : Le composant ListView) c Ralisez une application de gestion des personnes avec un numro de tlphone pour chacune. La liste des personnes doit tre un composant ListView avec 2 colonnes visibles et intitules Noms et Numros. Le formulaire doit prsenter deux TextBox, l'un pour le nom et l'autre pour le numro. Ils doivent servir l'encodage des informations des personnes en ajout et en recherche. Trois boutons libells Ajout, Cherche et Supprime doivent activer les procdures correspondantes. Si lors d'un ajout, le nom de la personne encode existe dj dans la liste, l'ajout doit tre annul et la procdure de recherche active. La recherche d'une personne, qui s'effectue uniquement sur le nom, doit slectionner l'enregistrement de la personne dans la liste et, si la personne n'existe pas, un MessageBox doit en informer l'utilisateur. Si la personne existe, son numro de tlphone doit tre prsent dans le TextBox appropri. La slection d'une personne dans la liste doit provoquer l'affichage de son nom et de son numro de tlphone dans les TextBox correspondants.

09/08/2011

PHR VB.Net VBLab - 5

7. BonneImpression (/150) (cf. Pages VBPV : Menu et impression) Exprimentez l'exemple rcapitulatif propos dans le cours propos des impressions en remplaant les cinq boutons par un menu. 8. MesAmisEnFichier (/200) (cf. Pages VBPV : Les botes de dialogues + Exploitation des mmoires de masse) c Amliorez le labo n6 en y intgrant les botes de dialogues permettant la dsignation des fichiers en ouverture et l'enregistrement et en y implmentant la sauvegarde des donnes de la liste, ainsi que son chargement par la lecture d'un fichier. Il convient d'ajouter deux boutons Charger et Enregistrer au formulaire du labo n6. 9. SauvezLes (/100) (cf. Pages VBPV : Minuterie) c Amliorez le labo n8 prcdent en y intgrant une minuterie qui comptabilise le temps d'excution de l'application partir du moment o des modifications ont t ralises. Toutes les 5 minutes, un MessageBox doit alors rappeler l'utilisateur qu'il serait prudent de sauvegarder ses donnes. 10. UnBonArgument (/200) (cf. Pages VBPV + VBPA : Mmoires de masse + Arguments d'appel ) c Ralisez une application Windows lancer en ligne de commande avec deux paramtres, le premier dsignant le chemin complet d'un dossier et le second dsignant les fichiers inventorier. L'application ouverte doit afficher un composant ListBox prsentant tous les noms de fichiers ayant l'extension dsigne dans le dossier galement dsign, ainsi que dans tous ses sous-dossiers. L'application doit donc raliser le mme travail que la commande Dir utilise avec les paramtres /B et /S, comme par exemple : Dir X:\MesDonnees\*.TXT /B /S lorsque ses arguments d'appel sont X:\MesDonnees\ et *.TXT . 11. Remplace (/150) (cf. Pages VBPA : La classe String) c Ralisez une application Windows qui recherche dans une chane donne, une autre chane dont seuls quelques caractres de chaque extrmit sont connus, et la remplace par une chane galement donne. 12. LeBonMoment (/100) (cf. Pages VBPA : DateTime et RegEx) c Ralisez une application Windows qui calcule des chances de payements de factures sur base d'une date encode au format jj/mm/aaaa vrifi par l'usage des expressions rgulires. Les chances calcules doivent tre affiches au format Jour jj Mois aaaa et correspondre l'une des chances 30 ou 60 jours, de date de facture ou de fin de mois, selon le choix de l'utilisateur. 13. UneCollection (/200) (cf. Pages VBNF et VBPA : Structure + CollectionBase) c Crez une collection de personnes et une application pour son exploitation en mode Console. La collection inspire de la Classe MesChaines dcrite la fin des pages VBPA doit grer des structures Personnes dont les champs sont Nom de type String, DateNais de type Date et Telephone de type String. La collection doit garder les informations ordonnes sur le champ Nom. 14. MesPremiers (/200) (cf. Pages VBOBJ : Encapsulation et abstraction) c Crez une application qui remplit un ListBox avec les nombres premiers compris entre deux valeurs obligatoirement impaires encodes dans des TextBox. Cette application doit exploiter la classe MesPremiers dcrite dans le cours. 15. MesPersonnes (/300) (cf. Pages VBPA et VBOBJ : CollectionBase + Proprit par dfaut) c Modifiez la classe ClTableauDePersonnes dcrite dans le cours de sorte que les objets ClPersonne grs soient constamment ordonns par ordre croissant ou dcroissant la guise du programmeur client. Il faut notamment doter la classe fournie des membres SensTri, Add et ChangeOrdre, ainsi que d'une procdure locale de tri. Un constructeur appropri peut s'avrer utile. Lapplication doit grer un tableau de personnes et non une collection. La consultation des pages CollectionBase peut fournir linspiration ncessaire la programmation des membres demands. Exprimentez la nouvelle classe dans une application Windows.

09/08/2011

PHR VB.Net VBLab - 6

16. MesFractions (/100) (cf. Pages VBOBJ : Surcharge des oprateurs)

Compltez la classe Fraction du cours en y implmentant la soustraction, la division et les six oprateurs relationnels de base, ainsi qu'une mthode CType permettant la conversion vers un rel Double. La mthode CType permettant la conversion vers une chane doit subsister. Compltez aussi l'application Console du cours de sorte permettre l'exprimentation de tous les oprateurs. 17. EncoreDesPersonnes (/400) (cf. Pages VBPA et VBOBJ : CollectionBase + Proprit par dfaut + Persistance) c Modifiez et compltez les classes ClPersonne et ClTableauDePersonnes. La classe ClPersonne doit grer les noms et numros de tlphones des personnes, ainsi que leurs localits. La classe ClTableauDePersonnes doit intgrer les fonctionnalits et membres tels qu'noncs au labo n15, mais aussi ses propres moyens de persistances. Un membre supplmentaire ChoixClef doit permettre l'utilisateur d'obtenir la liste des personnes ordonnes sur le nom (par dfaut) ou sur la localit. Exprimentez la nouvelle classe dans une application Windows qui doit permettre l'ajout de personnes ainsi que les chargements et sauvegardes de l'instance active de ClTableauDePersonnes. 18. UneDBPersonnes (/400) (cf. Pages VBDB : Bases de donnes et composants visuels) c L'application de gestion des personnes et des localits prsente dans le cours partir du titre Bases de donnes et composants visuels est construite progressivement au gr des concepts dvelopps. L'objet de ce labo est de reconstituer cette application et de l'amliorer en y intgrant la slection d'une base de donnes de type Access. L'usage de botes de dialogues permettant la dsignation des fichiers en ouverture s'impose. L'utilisateur doit pouvoir choisir une base encore inexistante qui est alors cre. Pour fonctionner partir d'une base de donnes vide, l'application doit permettre l'encodage distinct de localits et de personnes. C'est pourquoi, un menu (ou un jeu de boutons) doit permettre l'ajout des localits et l'ajout des personnes par des formulaires spcifiques. L'accs au formulaire MesDonnes prsent dans le cours ne peut avoir lieu tant qu'aucune personne n'est encode, de mme que l'accs au formulaire d'encodage des personnes ne peut avoir lieu tant qu'aucune localit n'est encode. Le contrle de lencodage dune personne doit tre amlior linstar de ce qui est fait dans le cours pour les localits (donc aussi implmenter les concepts de nature ergonomique qui permettent lajout et la modification partir dencodages sur les zones de prsentation des donnes). 19. CarnetDAdresses (/600) (cf. Pages VBDB : Bases de donnes et composants visuels) En partant de lapplication du labo prcdent, ralisez une application grant une base de donnes selon les conditions suivantes. TPays
IdPays Pays Entier court (non auto) Texte

TLocalite
IdLoc CPost Localite XIdPays Entier (non auto) Texte Texte Entier court

TPers
IdPers NomPers PrenomPers AdrPers Telephone EMail XIdLoc Entier (non auto) Texte Texte Texte Texte Texte Entier

Lapplication doit permettre la gestion (recherche et balayage pour consultation, ajout, modification et suppression, avec confirmation et annulation possibles) distincte de chaque entit permanente (ou signaltique). Mais lencodage dun champ qui ne correspond pas une donne connue doit provoquer louverture du formulaire de gestion correspondant avec par dfaut la donne encode dans la gestion fille. Par exemple, lencodage dans la gestion des personnes dune localit inconnue doit provoquer louverture du formulaire de gestion des localits en prsentant linformation qui vient dtre encode au niveau des personnes. Il doit en tre de mme pour lencodage dun pays inexistant dans la gestion des localits. Au retour dans le formulaire de dpart, linformation propose doit tre celle qui vient dtre confirme dans le formulaire de gestion appel, ou linformation initiale de lenregistrement en cas dannulation. Afin de prserver la cohrence de la base de donnes, il faut empcher la suppression dun pays qui comporte une localit habite. La suppression dun pays ne comportant aucune localit habite doit provoquer la suppression de toutes les localits de ce pays. De plus, la suppression dune localit habite ne peut avoir lieu. Les modifications des champs Pays, CPost, Localite et NomPers doivent donner lieu confirmation, de mme que le dmnagement dune personne vers une autre localit. Lors dune modification des champs CPost et Localite, la demande de confirmation ne peut avoir lieu que lorsque les deux zones de saisie sont abandonnes par lutilisateur.

09/08/2011

PHR VB.Net VBLab - 7

Lencodage de doublons sur les champs CPost, Localite et NomPers doit donner lieu confirmation. Les doublons sur le champ Pays et sur la paire CPost/Localite sont interdits. Lutilisateur doit pouvoir choisir la base de donnes sur laquelle il souhaite travailler et, le cas chant, crer une nouvelle base. La fermeture de lapplication doit provoquer le compactage de la base. 20. AutreCarnetDAdresses (/800) (cf. Pages VBDB : Bases de donnes et composants visuels) En partant de lapplication du labo prcdent, ralisez une application grant une base de donnes selon les conditions suivantes. TPays
IdPays Pays Entier court (non auto) Texte

TLocalite
IdLoc CPost Localite XIdPays Entier (non auto) Texte Texte Entier court

TPers
IdPers NomPers PrenomPers AdrPers XIdLoc Entier (non auto) Texte Texte Texte Entier

TCommunication
IdCom Libelle Entier court (non auto) Texte

TNumero
XIdPers XIdCom Numero Entier Entier court Texte

Lapplication doit permettre la gestion (recherche et balayage pour consultation, ajout, modification et suppression, avec confirmation et annulation possibles) distincte de chaque entit permanente (ou signaltique). Mais lencodage dun champ qui ne correspond pas une donne connue doit provoquer louverture du formulaire de gestion correspondant avec par dfaut la donne encode dans la gestion fille. Par exemple, lencodage dans la gestion des personnes dune localit inconnue doit provoquer louverture du formulaire de gestion des localits en prsentant linformation qui vient dtre encode au niveau des personnes. Il doit en tre de mme pour lencodage dun pays inexistant dans la gestion des localits. Au retour dans le formulaire de dpart, linformation propose doit tre celle qui vient dtre confirme dans le formulaire de gestion appel, ou linformation initiale de lenregistrement en cas dannulation. Afin de prserver la cohrence de la base de donnes, il faut empcher la suppression dun pays qui comporte une localit habite. La suppression dun pays ne comportant aucune localit habite doit provoquer la suppression de toutes les localits de ce pays. De plus, la suppression dune localit habite et la suppression dune ligne de communication utilise par une personne ne peuvent avoir lieu. Les modifications des champs Pays, CPost, Localite, Libelle et NomPers doivent donner lieu confirmation, de mme que le dmnagement dune personne vers une autre localit et la suppression dune ligne de communication dune personne. Lors dune modification des champs CPost et Localite, la demande de confirmation ne peut avoir lieu que lorsque les deux zones de saisie sont abandonnes par lutilisateur. Lencodage de doublons sur les champs CPost, Localite et NomPers doit donner lieu confirmation. Les doublons sur les champs Pays et Libelle, ainsi que sur les paires CPost/Localite et XIdPers/XIdCom, sont interdits. Ce dernier point nempche pas une personne de disposer de plusieurs lignes de communications et, ce propos, il convient que linterface utilisateur permette le choix ais dune ligne parmi dautres. Lutilisateur doit pouvoir choisir la base de donnes sur laquelle il souhaite travailler et, le cas chant, crer une nouvelle base. La fermeture de lapplication doit provoquer le compactage de la base.

09/08/2011

PHR VB.Net VBLab - 8

Travaux complmentaires
21. Tableaux (/100) (cf. Pages VBNF : Les tableaux) Etablissez en Word un tableau comparatif des possibilits offertes, avantages et inconvnients, de chaque mode dutilisation de tableaux proposs dans les 5 exemples du cours. 22. StructuresTableaux (/100) (cf. Pages VBNF : Les structures de tableaux) Crez un exemple de dfinition de structure dans laquelle lusage dun tableau est pertinent. Dfinissez la structure et son ou ses tableau(x). Fournissez une page Word (pas dapplication). 23. TableauxStructures (/100) (cf. Pages VBNF : Les tableaux de structures) Crez un exemple pertinent dusage dun tableau de structures. Fournissez une page Word (pas dapplication). Dfinissez la ou les structure(s) et le tableau.

24. DeclareProc (/100) (cf. Pages VBNF : Dclarations des procdures et des fonctions) Etablissez en Word un tableau comparatif des possibilits offertes, similitudes et oppositions, des attributs de porte
Overloads, Overrides, Overridable, NotOverridable et MustOverride.

25. ToString (/100) (cf. Pages VBPA : La classe System.Object et la classe String) c Pour certains types de donnes tels que les Date, Time et les numriques, la mthode ToString offre des possibilits de formatage semblables celles de la mthode Format. Par exemple F.ToString(".###") prsente le rel F avec 3 dcimales. Ralisez une application Windows qui permet lencodage dun nombre rel, dun nombre de caractres pour la partie entire et dun nombre de dcimales, et ralise ensuite laffichage du nombre rel format comme souhait par la mthode ToString. 26. Sinus (/100) (cf. Pages VBPA : La classe Graphics) Ralisez une application mettant en uvre lexemple du cours (trac dune sinusode) en permettant lutilisateur dencoder en degrs dangle les limites quil souhaite pour la reprsentation de la sinusode. 27. Async (/200) (cf. Pages VBOBJ : Synchrone, asynchrone et multithreading) c Ralisez lapplication Console permettant lexprimentation des modes de traitements synchrone, asynchrone et multithreads, en y intgrant les affichages de temps comme indiqu dans le cours. Etablissez un tableau comparatif des temps (semblable celui du support) pour chacun de ces modes : mise en excution, dlai de reprise par lappelant et dure de lexcution. Outre les fichiers du projet et les copies dcran, ce labo implique la livraison dune page Word prsentant le tableau ralis. 28. ListeDesPersonnes (/400) (cf. Pages VBPV et VBDB : ListBox, Impression et DataGridView) Ralisez une application de consultation de la base de donnes cre au labo 18. L'usage dune bote de dialogue permettant la dsignation de la base consulter s'impose. La fentre principale doit prsenter la liste des personnes, chacune avec sa localit, dans un DataGridView. Aucune modification de donnes de ce composant ne peut affecter la base de donnes. Lajout denregistrements doit tre impossible. Un menu doit proposer : Autre base, Impression et Quitter. Le menu Impression doit offrir le choix entre : Personnes slectionnes et Toutes les localits. Les impressions doivent se faire via un formulaire secondaire qui prsente les donnes prpares selon le type dimpression demand dans un ListBox. Limpression des lignes slectionnes, doit fournir le nom et la localit de chaque personne de la slection. Limpression de toutes les localits, ne tient pas compte dventuelles slections. Il doit fournir toutes les localits et pour chacune, la liste des habitants. Ce formulaire secondaire prsente un menu qui propose : Imprimer et Quitter. La premire option provoque limpression effective du contenu du ListBox, la seconde ferme le formulaire et rend la main au formulaire principal. Cette application doit tre absolument distincte de celle du labo 18.

09/08/2011

PHR VB.Net VBLab - 9

29. MesAmisWeb (/400) (cf. Pages VBWEB : Les composants ASP visuels + Liaison une base de donnes) c Ralisez une page Web dynamique de gestion des personnes avec un numro de tlphone pour chacune. La liste des personnes doit tre prsente dans un composant DropDownList lequel doit galement servir la recherche dune personne. La page aussi doit prsenter deux TextBox, l'un pour le nom et l'autre pour le numro. Ils doivent servir l'encodage des informations lors de lajout dune personne. Le TextBox utilis pour le numro de tlphone doit prsenter en permanence le numro dappel de la personne dont le nom est visible dans le DropDownList. Deux boutons libells Ajout et Supprime doivent activer les procdures correspondantes. Si lors d'un ajout, le nom de la personne encode existe dj dans la liste, l'ajout doit tre ignor. Les nom et numro dappel de chaque personne doivent tre stocks dans une base de donnes Access. 30. JeuDuPendu (/400) (cf. Pages VBWEB : Programmation du Net Remoting) c Ralisez une application client/serveur permettant aux utilisateurs de divers ordinateurs dutiliser les services dun serveur pour jouer au pendu. A linitialisation du jeu, le serveur doit : Prendre un mot au hasard dans un fichier stock sur lordinateur serveur; Dterminer le nombre de points comptabiliser pour ce mot; Prsenter le mot avec toutes les lettres intrieures remplaces par des points. Pendant le jeu, chaque proposition de lettre placer, le serveur doit : Placer la lettre propose dans le mot aux endroits adquats si elle convient ou comptabiliser les erreurs si la lettre ne convient pas. Le dmarrage du serveur ncessite lattribution dun port de communication et le dmarrage dun client ncessite ladresse IP du serveur et le numro de port employ. Les interfaces graphiques ci-aprs conviennent bien cette application (cette illustration prsente le serveur, mais aussi trois clients connects).

09/08/2011

PHR VB.Net VBLab - 10

Exercices divers
31. LesImpairs (cf. Pages VBNF: Itrations) Ralisez une application Console qui affiche les N premiers entiers positifs impairs. La valeur de N doit tre donne par lutilisateur et le traitement se ralise laide dune seule boucle For. Exemple (en supposant que lutilisateur rponde 5 la question) :
Valeur de N ? 5 1 3 5 7 9

32. SomEntiers (cf. Pages VBNF : Itrations) Ralisez une application Windows qui calcule et affiche la somme de tous les entiers compris dans un intervalle dsign par deux nombres Min et Max. 33. DesMots (cf. Pages VBNF et VBPV : Les tableaux + Boutons + Bote de texte) c Ralisez une application permettant la gestion dun maximum de 10 mots stocks dans un vecteur de chanes. La gestion doit permettre lajout et la suppression de mots ainsi que le balayage du vecteur. Seuls les mots rellement encods doivent tre prsents lors du balayage. Lillustration ci contre est un modle dinterface qui convient trs bien cette application. 34. MonRepertoire (cf. Pages VBPV : ListView + Impression) c Ralisez une application permettant la gestion dun rpertoire dadresses dans un composant ListView. Des TextBox doivent constituer les zones dencodages des donnes qui sont ensuite ajoutes dans le ListView par le clic dun bouton Ajout. Deux autres boutons, Supprime et Imprime, doivent provoquer les actions attendues sur les lignes slectionnes du ListView. Lillustration ci contre reprsente linterface de cette application. 35. DevineNombre (cf. Pages VBPV : Gnrer des erreurs + Form + Programmation multi formulaires) c Lapplication demande ici est un jeu qui consiste faire deviner par lutilisateur un nombre pens par lordinateur. A louverture du formulaire de base prsent ci-contre, un nombre cach dune valeur allant de 1 100, est calcul partir du millime de seconde du temps actuel fournit par Date.Now.Millisecond. Le joueur tente alors de trouver ce nombre cach par des encodages successifs et il est aid chaque coup par lindication que le nombre encod est trop grand ou trop petit. Lorsquil trouve enfin le nombre cach, un message de flicitation est exprim ainsi que le nombre de coups jous. Pour lexprimentation de la gestion des erreurs, de la gnration des erreurs et de la communication entre formulaires, la vrification du nombre encod doit tre confie une fonction qui retourne True en cas de russite et qui dans le cas contraire, gnre une erreur dont le message est Trop grand ou Trop petit. Ce message doit tre pass une MessageBox originale qui se prsente sous la forme dun bouton du fait que sa taille nexcde pas celle du bouton quelle contient (cf. illustrations). Cest le texte de ce bouton qui doit exprimer le message.

09/08/2011

PHR VB.Net VBLab - 11

36. ChercheEtRemplace (cf. Pages VBPV et VBPA : Mmoires de masse + Classes String et RegularExpressions) c Lapplication demande doit faire la copie dun fichier texte en remplaant une chane donne par une autre. Les recherches de fichiers doivent utiliser les DialogBox adquates. Linformation du nombre de remplacements effectus par ligne doit tre affiche dans un ListBox. Il ne doit pas y tre fait mention des lignes pour lesquelles il ny a pas de remplacement. Le traitement termin doit tre signal par un message appropri dans le ListBox et indiquer le nombre total de remplacements raliss. Le comptage des remplacements doit tre ralis laide de la classe RegularExpressions (la chane recherche est suppose ne jamais contenir de mtacaractre) et les remplacements doivent tre raliss par la mthode adquate de la classe String. 37. RepertoireTelephones (cf. Pages VBPA : Collections gnriques) c Crez une collection gnrique de structures Personne contenant les noms et numros de tlphones de personnes, toujours en ordre alphabtique croissant des noms. Ralisez une application Console qui permet, sur base dun menu, lajout et la suppression de personnes, laffichage de toutes les personnes de la collection ainsi que laffichage des informations dune personne recherche indiffremment sur base de son nom ou de son numro de tlphone. 38. DesEtudiants (cf. Pages VBOBJ : Constructeurs et destructeurs, constructeur par recopie) c Crez la classe ClEtudiant en compltant le code qui est livr ci-dessous et implmentez-la ensuite dans une application Windows qui gre une classe dtudiants nomme MaClasse et qui est une ArrayList de ClEtudiant. Laffichage des tudiants dune classe se ralise dans une ListView nomme LVEtudiants. Les boutons BNouveau, BDouble, BCopie et BSupprime commandent les oprations correspondantes. Le click dun entte de colonne recopie la cote correspondante de la ligne slectionne dans une TextBox nomme TCote o elle peut tre modifie. La validation dune cote modifie est commande par le bouton BCoteOK. La cration dun nouvel tudiant implique quil ait un nom et un nombre de cours. Cette dernire valeur est plafonne 10 pour les besoins de cet exercice. Ce nombre de cours dfinit la taille dun vecteur CoteEtud cr et initialis zro dans linstance. La cration dun double ne ncessite que la slection dune ligne de la ListView. Le double est en tous points identique son modle. La copie ncessite un nom dans la TextBox TNom et la slection dune ligne. Sauf pour son nom qui lui est propre, la copie est en tous points identique son modle. La suppression concerne la ligne slectionne. Cette suppression doit librer la mmoire en consquence. Larrt de lapplication provoque lmission de lvnement FormClosed. Il convient den profiter pour librer la mmoire encore occupe par dventuelles instances et tout autre objet.

Lintrt de lexercice rside davantage dans la ralisation de ClEtudiant, lapplication Windows ne servant qu lexprimentation de cette classe.

09/08/2011

PHR VB.Net VBLab - 12

Public Class ClEtudiant Implements IDisposable #Region "Donnes et membres privs" Private Private Private Private NomEtud As String CoteEtud() As Single NbreCotes As Integer MaxNbCote As Integer = 10

Private WriteOnly Property NbreCours() As Integer ' ... ... ... End Property #End Region #Region "Interface de la classe" Public ReadOnly Property NombreCours() As Integer ' ... ... ... End Property Public Property Nom() As String ' ... ... ... End Property Public Property Cote(ByVal Index As Integer) As Single ' ... ... ... End Property #End Region #Region "Constructeurs" Public Sub New(ByVal ArgNom As String, ByVal ArgNbreCours As Integer) ' ... ... ... End Sub Public Overloads Function Clone() As ClEtudiant ' Ce constructeur doit permettre une instance de se cloner elle-mme : C = A.Clone() ' ... ... ... End Function Public Overloads Function Clone(ByVal ArgSource As ClEtudiant) As ClEtudiant ' Ce constructeur doit permettre une instance den cloner une autre : C = A.Clone(B) ' ... ... ... End Function Public Function Copy(ByVal ArgNom As String, ByVal ArgSource As ClEtudiant) As ClEtudiant ' Le nom de ltudiant cible doit tre diffrent de celui de ltudiant source ' ... ... ... End Function #End Region #Region "Destructeur" ' ... ... ... #End Region End Class

09/08/2011

PHR VB.Net VBLab - 13

39. MailAGogo (cf. Pages VBDB : OleDB et DataReader)

Crez lapplication Windows MailAGogo qui permet lenvoi dun message de plusieurs expditeurs plusieurs destinataires. Les adresses des serveurs SMTP et les adresses des messageries sont encodes par une application distincte dans deux tables Access (TServSMTP et TAdrMail). Elles sont charges sur laction dun bouton BCharge pour remplir les objets de prsentations CBServeur (un ComboBox), LBExpediteurs et LBDestinataires (deux ListBox). Un TextBox nomm TObjet permet lencodage de lobjet du message et un RichTextBox nomm RTBMessage permet lencodage du message proprement dit. Un bouton BEnvoi lance lmission des mails. A toutes fins utiles, voici le code qui permet denvoyer un message dun expditeur vers un destinataire.
Dim Dim Dim Dim Try Mail As System.Net.Mail.MailMessage smtp As System.Net.Mail.SmtpClient Expediteur As String Destinataire As String

' Dsigner le serveur SMTP smtp = New System.Net.Mail.SmtpClient("smtp.unprovider.com") ' Instancier un mail Mail = New System.Net.Mail.MailMessage ' Prciser les codages employs pour l'objet du message et pour le message Mail.SubjectEncoding = System.Text.UTF8Encoding.UTF8 Mail.BodyEncoding = System.Text.UTF8Encoding.UTF8 ' Dsigner lobjet du message situ ici dans un TextBox nomm TObjet Mail.Subject = TObjet.Text ' Dsigner le message situ ici dans un RichTextBox nomm RTBMessage Mail.Body = RTBMessage.Text ' Donner les adresses des expditeur et destinataire Expediteur = "CocoLeFilou@encavale.net" Destinataire = "JacoLePirate@alcatraz.bg" Mail.From = New System.Net.Mail.MailAddress(Expediteur) Mail.To.Add(New System.Net.Mail.MailAddress(Destinataire)) ' Expdier le message smtp.Send(Mail) ' Librer la mmoire Mail.Dispose() Catch ex As ApplicationException MessageBox.Show(ex.Message) Finally smtp = Nothing ' Librer la mmoire dans un Try car si le message Try ' sest bien pass, cest dj chose faite. Mail.Dispose() Catch End Try Mail = Nothing End Try

40. DBMails (cf. Pages VBDB : Cration d'une base Access + Mode connect) c Crez une application Windows qui permet la cration et la gestion dune base de donnes Access contenant les adresses des serveurs SMTP et les lieux dmission, ainsi que celles des expditeurs et destinataires potentiels des messages lectroniques. La base de donnes doit rpondre aux rgles de gestion des donnes suivantes : - Un serveur SMTP est accessible de plusieurs lieux - Un seul serveur SMTP est accessible partir dun lieu donn - Une adresse de messagerie est de type Expditeur ou de type Destinataire, mais pas les deux - Les doublons dadresses SMTP sont interdits

09/08/2011

PHR VB.Net VBLab - 14

Les doublons de lieux sont interdits Les doublons sur la paire Adresse-Type sont interdits Les doublons dadresses de messagerie sont permis.

Le modle physique illustr ici permet cette gestion des donnes. Dans la mesure o les contraintes de dveloppement exposes ci aprs imposent le contrle des rgles de gestion des donnes par la programmation, la relation entre les entits TServSMTP et TLieux ne doit pas obligatoirement tre mise en place dans la base. Lattribut Type de lentit TAdrMail peut avoir pour valeur 1 (si Expditeur) ou 2 (si Destinataire). Les codes SQL de cration des entits et de la relation sont :
CREATE TABLE TServSMTP (IdSMTP Int, ServSMTP TEXT (40)) ALTER TABLE TServSMTP ADD PRIMARY KEY (IdSMTP) CREATE TABLE TLieux (Lieu TEXT (40), XIdSMTP Int) ALTER TABLE TLieux ADD FOREIGN KEY (XIdSMTP) REFERENCES TServSMTP (IdSMTP) CREATE TABLE TAdrMail (AdrMail TEXT (40), Type Byte)

Linterface demande est celle illustre ci contre. Outre un bouton BDonnees destin au choix de la base ouvrir ou crer, linterface est constitue de deux GroupBox (GPBConsultation et GPBEncodage). Laccs GPBEncodage doit tre le seul possible au moment de la cration dune nouvelle base. Le bouton BDonnees doit tre rendu inactif de sorte empcher une double slection de base de donnes. Le GroupBox GPBConsultation contient quatre ListBox (LBLieux, LBServeur, LBExpediteur et LBDestinataire) et une TextBox (TServeurDuLieu) qui prsente le serveur du premier lieu prsent dans LBLieux louverture, et le serveur du lieu slectionn par la suite. Le GroupBox GPBEncodage contient quatre TextBox (TLieux, TServeur, TExpediteur et TDestinataire), un ComboBox (CBServeur) et trois boutons (BVideZone, BAjout et BSuppression). Le bouton BVideZone commande leffacement de toutes les zones de textes du GroupBox. Les boutons BAjout et BSuppression activent les procdures correspondantes pour chacune des zones non vides. Une confirmation doit tre demande lutilisateur pour chacune des informations ajouter ou supprimer. La slection dune donne dans un des ListBox de GPBConsultation doit provoquer la rplication de cette donne dans la TextBox correspondante de GPBEncodage. Ce dispositif doit notamment permettre de dsigner les informations supprimer. Le respect des rgles de gestion des donnes doit tre vrifi par le code de chaque procdure dajout ou de suppression. La cration denregistrements orphelins dans TLieux doit tre vite. Lajout ou la suppression denregistrement doit provoquer la mise jour de tous les objets de prsentation des donnes. Pour faire simple, une procdure ChargeEtAffiche() est utilise louverture de la base et chaque modification (il serait prfrable de programmer les mises jours des ListBox et ComboBox, mais ce nest pas lobjet de cet exercice). Lobjet de cet exercice tant de raliser une application exclusivement en mode connect, linitialisation des objets de liaison la base de donnes peut tre faite ds louverture ou la cration et ils peuvent tre dtruits en rponse de lvnement FormClosed . Les dclarations de ces objets peuvent tre globales et, outre les Imports, les premires lignes de codes peuvent tre les suivantes :
Public Class FDBMail Dim Dim Dim Dim Dim
' -1 = pas de base, 0 = nouvelle base, 1 = base oprationnelle FlgDB As Integer NomDB As String MaConnexion As New OleDbConnection MaCommande As New OleDbCommand DesAdresses As OleDbDataReader

'

09/08/2011

PHR VB.Net VBNF - 1

Notions fondamentales de programmation en VB.Net

09/08/2011

PHR VB.Net VBNF - 2

Tables des matires des pages VBNF


Historique du Basic ............................................................................................................................................................4 La technologie .NET...........................................................................................................................................................5 Visual Studio .Net ....................................................................................................................................................5 Lenvironnement de dveloppement Visual Studio............................................................................................................6 Application Console .................................................................................................................................................7 Application Windows...............................................................................................................................................8 Les entres et les sorties de donnes.................................................................................................................................11 Applications Console .............................................................................................................................................11 Les entres....................................................................................................................................................11 Les sorties ....................................................................................................................................................12 Applications Windows ...........................................................................................................................................13 Les types et structures de donnes....................................................................................................................................14 Brve rvision de notions fondamentales...............................................................................................................14 Les variables ................................................................................................................................................14 Les structures composes (tableaux)............................................................................................................14 Les structures complexes (types utilisateurs)...............................................................................................15 Dclarations des variables. .....................................................................................................................................16 Les types de donnes..............................................................................................................................................20 Notation littrale de donnes..................................................................................................................................21 Dclaration des tableaux ........................................................................................................................................21 Dfinition des structures.........................................................................................................................................23 Les structures de tableaux ............................................................................................................................24 Les tableaux de structures ............................................................................................................................24 Les numrations....................................................................................................................................................25 Les instructions de contrles et moyens de traitements....................................................................................................26 Brve rvision de notions fondamentales...............................................................................................................26 La squence..................................................................................................................................................26 La rupture de squence ................................................................................................................................26 Lalternative .................................................................................................................................................26 Les itrations ................................................................................................................................................26 Ni contrle, ni traitement........................................................................................................................................27 Les commentaires ........................................................................................................................................27 La continuation ............................................................................................................................................27 Lconomie de dactylographie.....................................................................................................................27 Le sparateur dinstructions .........................................................................................................................27 Les instructions de contrles ..................................................................................................................................28 La rupture de squence ................................................................................................................................28 Lalternative .................................................................................................................................................28 La slection ..................................................................................................................................................30 Les itrations ................................................................................................................................................31 Les boucles logiques..........................................................................................................................31 La boucle arithmtique ......................................................................................................................32 Une boucle ni logique, ni arithmtique..............................................................................................33 Lappel de sous-programmes .......................................................................................................................33 Lexcution de programmes externes. .........................................................................................................34 Le mot de la fin ............................................................................................................................................34 Les moyens de traitements .....................................................................................................................................35 Les oprateurs ..............................................................................................................................................35 Laffectation ......................................................................................................................................35 La concatnation ................................................................................................................................35 Les oprateurs arithmtiques .............................................................................................................35 Les formes contractes de laffectation .............................................................................................35 Les oprateurs relationnels ................................................................................................................35 Les oprateurs logiques .....................................................................................................................36 Les oprateurs binaires ......................................................................................................................37 Ordre dvaluation des expressions et hirarchie des oprateurs ......................................................37 Les procdures et fonctions intrinsques, et les mthodes...........................................................................37 Dclarations des procdures et des fonctions...............................................................................................38

09/08/2011

PHR VB.Net VBNF - 3

Dclarations des arguments des procdures, fonctions et mthodes .................................................40 Type de donne des arguments..........................................................................................................42 Valeur de retour des fonctions ...........................................................................................................42 La rcursivit................................................................................................................................................43

09/08/2011

PHR VB.Net VBNF - 4

Historique du Basic
Le Basic (Beginner's All-purpose Symbolic Instruction Code) est un langage de programmation de haut niveau, invent en 1964 par John George Kemeny et Thomas Eugene Kurtz au Dartmouth College . Driv du Fortran II, il a t conu pour permettre aux tudiants des filires non scientifiques d'utiliser les ordinateurs ce qui l'poque, tait rservs aux seuls spcialistes du langage de programmation gnralement spcifique de lordinateur. La premire version du Basic a t dveloppe sur un mainframe temps rel de General Electric appel GE-256. C'tait le premier langage spcialement conu pour tre utilis sur des systmes interactifs. Il sagissait dune version compile. Plus tard, lavnement de la micro informatique a propuls le Basic lavant-plan des langages de programmation, du moins sur le plan du nombre de versions installes. Les versions interprtes du langage taient suffisament conomes de lespace mmoire pour pourvoir tre contenues dans la ROM dun micro ordinateur. Cest ainsi que presque tous les ordinateurs individuels du dbut des annes 80 possdaient un interprteur Basic en ROM (Vic20, C64, TRS 80, ZX81, Apple II, ). Cest loutil qui permettait aux utilisateurs de la micro informatique dcrire les programmes qui leur taient ncessaires pour lexploitation de leur ordinateur. Les versions les plus rpandues de ces Basic en ROM ont t produites par Microsoft. En 1977 Microsoft a produit l'Altair Basic pour lordinateur MITS Altair. En 1979 Microsoft obtient dIBM la licence de l'interprteur BASIC des futurs PC. Plus tard, Microsoft a produit diffrentes versions du Basic pour DOS, dont le Basica, le GW-Basic et le Quick Basic. Ce dernier tait encore prsent dans les packages de Windows 95 et Windows 98, lequel intgrait aussi un interprteur VBScript (mais a, cest autre chose). Ds le dbut des annes 90 (en 1991), Visual Basic prend la relve de ses prdcesseurs et permet le dveloppement rapide dapplications sous linterface graphique de Windows. Les premires versions innovent par un environnement de dveloppement particulirement convivial et compltent le langage Basic de structures de contrle quil ne possdait pas encore comme la slection, par exemple. En 1996, la version 4.0, change notablement la puissance de loutil en permettant : Cration dapplications 32 bits Cration et utilisation de DLL Apparition des fonctionnalits Objet

Cette version, qui nest toutefois pas trs stable, est rapidement remplace par la version 5.0 qui prsente une stabilit accrue et signe la disparition des applications 16 bits. Cest cette poque aussi quapparat le VBA (Visual Basic for Applications) qui remplace les anciens langages dcriture de macros commandes dans les produits Microsoft partir de la version 1997 dOffice. La dernire version de Visual Basic, la 6.0, propose peu dvolutions dans le langage, mais intgre lADO, une nouvelle technologie daccs aux donnes, ainsi que de nouveaux outils de connexion aux sources de donnes et ddition de rapports (Data Environment et Data Report). Les versions suivantes de VB sont intgres dans Visual Studio .Net (dot Net). La premire version de Visual Studio .Net, qui est disponible en version bta depuis 2000, ne sort officiellement qu'en fvrier 2002. Mais cest la version 2003 qui rend disponible et fiable toute la puissance de la technologie DotNet. Elle intgre notamment VB 7.1 et Framework 1.1. La version 2005, effectivement sortie en 2006, intgre VB 8.0 et Framework 2.0. Elle apporte des fonctionnalits complmentaires telles que la surcharge des oprateurs et les dclarations partielles de classes, par exemple. Fin 2006, lheure o sont crites ces pages, Microsoft a prsent son nouveau Windows Vista qui intgre une version 3.0 du Framework. Cela permet de supposer que la prochaine version de Visual Basic .Net nest plus trs loin, moins quun Service Pack ou autres patches nassurent la mise jour de la version 2005 ...

09/08/2011

PHR VB.Net VBNF - 5

La technologie .NET
La technologie .NET est un standard propos par Microsoft, en alternative la plate-forme J2EE de Sun, pour le dveloppement d'applications d'entreprises multi niveaux, bases sur des composants. La plate-forme .NET a t labore sur les avis dune communaut d'utilisateurs et a abouti l'dition de spcifications. Celles-ci ratifies par un organisme international de standardisation, l'ECMA (European Computer Manufacturers Association), ont lev DotNet au rang de standard. La standardisation a permis l'mergence de plates-formes portes par des entreprises tierces et disponibles sous un grand nombre de systmes d'exploitation. Le schma suivant illustre les interactions liant les principaux lments constitutifs de la technologie DotNet dans les diffrentes phases qui conduisent dun code source lapplication en excution. Visual Studio DotNet
La technologie DotNet impose le respect de rgles et de structures communes tous les langages adhrents. Ces rgles et structures sont dfinies dans une charte nomme CLS (Common Language Specification) et dans un cahier de charges nomms CLI (Common Language Infrastructure). Le programmeur peut choisir parmi tous ces langages celui qui lui convient le mieux, et mme plusieurs. Son travail VB F# C# repose en principal sur la mise en uvre de classes du Framework implmentes pour lui par lenvironnement de C++ Perl dveloppement Visual Studio. Les applications termines sont assembles.

CIL ou MSIL Lassemblage du code source livre un code intermdiaire appel CIL (Common Intermediaire Language) ou MSIL (Microsoft Intermediaire Language).

Applications Systme, Console, Windows, Web, , en codes MSIL.

FRAMEWORK
Le Framework constitue le fournisseur des services (les classes) et lenvironnement dexcution des applications.

FCL
Le Framework offre des services sous forme de classes prsentes dans un ensemble hirarchis de librairies. Cet ensemble de classes est nomm FCL (Framework Class Library).

CLR
Le CLR (Common Language Runtime) gre lexcution du code manag, c'est--dire celui qui est spcialement compil pour le Framework, celui qui est conforme la technologie DotNet. Cette gestion consiste essentiellement au contrle de lexcution et la gestion de la mmoire utilise par ce code.

JIT ou JITer Chaque mthode contenue dans le code CIL est traduite en langage machine avant son excution. Cest le JIT (Just In Time Enhanced Runtime) qui ralise cette traduction.

Visual Studio .Net


Lenvironnement de dveloppement Visual Studio offre au programmeur toute lassistance utile lexploitation des classes du Framework dans le langage de son choix (parmi ceux proposs, selon le package), pour la cration dapplications de types trs divers rpertories en deux grandes catgories : les projets Windows et les sites Web. Linventaire complet des nombreuses librairies du Framework peut tre consult sur le site de Microsoft ladresse http://msdn.microsoft.com/fr-fr/library.

09/08/2011

PHR VB.Net VBNF - 6

Les projets Windows concernent la programmation dapplications devant fonctionner sous un systme dexploitation Windows. Ces projets se divisent essentiellement en deux catgories : les applications graphiques et les applications console. Les applications graphiques utilisent les Windows Forms et sexcutent en mode graphique dans lenvironnement Windows. Elles sont toutes ces applications qui prsentent leur propre interface graphique utilisateur (GUI). Les applications console sont toutes celles qui sont lances en ligne de commande en session DOS. Les Sites Web concernent la programmation dapplication devant fonctionner par lusage dune connexion lInternet. Deux catgories se retrouvent ici : les Sites Web Asp et les Services Web. Les Sites Web Asp utilisent les Web Forms accessibles par les navigateurs Internet. Ces sites sont destins tre installs sur le serveur Microsoft Internet Information Services (IIS) pourvu du Framework. Les Services Web sont des entits logicielles fournissant des fonctionnalits d'autres applications via une connexion Internet. A ces deux grandes catgories bien diffrencies, il faut ajouter le dveloppement des applications Client/Serveur qui entrent dans la catgorie des projets Windows de par leur mode de dveloppement, mais qui entrent aussi dans la catgorie des Services Web de par leur mode de fonctionnement.

Lenvironnement de dveloppement Visual Studio


Ds Visual Studio charg, sa page de dmarrage propose le choix entre la cration dun nouveau projet ou bien louverture dun existant, et cela en prcisant demble la catgorie : projet Windows ou site Web. Dans la version 2003, ce choix est dduit du type dapplication dsign parmi ceux offerts par le package install. Pour les projets Windows il faut galement choisir le langage et, dans tous les cas, il faut nommer le projet et lui dsigner un emplacement sur une mmoire de masse.

Le type dapplication se dfinit par le choix dun modle parmi ceux proposs ci-contre. Voici la signification de quelques uns dentre eux : Application Windows : Application graphique ordinaire pour Windows. Bibliothque de classe : Classe rutilisable ou composant qui peut tre partag avec d'autres projets. Bibliothque de contrle Windows : Contrle personnalis destin tre intgr une application Windows.

09/08/2011

PHR VB.Net VBNF - 7

Service Windows : Application rsidente dpourvue d'interfaces graphiques. Service Web ASP.Net : Service Web XML conu avec ASP.NET, ses fonctionnalits peuvent tre publies et appeles par des applications tierces extrieures. Application Smart Device (jusqu la version 2008, nexiste plus dans la version 2010) : Application ASP.NET prvue pour tre consulte sur des PDA (Personal Digital Assistants), GSM et autres priphriques mobiles. Application Web ASP.Net : Application prvue pour tre consulte via un navigateur Internet. Application console : Application en lignes de commandes dpourvues d'interfaces graphiques. Il nentre pas dans le cadre de ce cours dexaminer en dtail lensemble des fonctionnalits de lenvironnement de dveloppement, mais seulement lessentiel permettant la ralisation des petits programmes dexprimentation ncessaires la comprhension des concepts dvelopps. Diverses fonctionnalits, de mme que certaines diffrences entre les versions 2003 et les suivantes, sont expliques dans ces pages quand cest ncessaire.

Application Console
A lissue des pralables la cration dapplications dcrits la page prcdente, et aprs le choix dune application de type Console, Visual Studio prsente son interface de travail illustre ci dessous.

Excution de lapplication

La feuille de travail est munie donglets permettant laccs immdiat tout fichier ouvert. Ses listes droulantes permettent la slection des objets (liste de gauche) et des mthodes ou vnements les concernant (liste de droite). Lexplorateur de solutions (ex-explorateur de projet) prsente les rfrences et les fichiers du projet. Un fichier slectionn l peut recevoir un nom reprsentatif dans la fentre des proprits situe en-dessous par dfaut. Cette page de proprits du projet sobtient par le menu Projet/Proprits du projet. Elle permet de dsigner lobjet de dmarrage et de dfinir le nom de lexcutable (Nom de lassembly).

09/08/2011

PHR VB.Net VBNF - 8

Une fois linterface en place, il ny a plus qu crire les codes requis par lapplication envisage. En cours dencodage, Visual Studio fournit une aide contextuelle qui constitue un prcieux aide-mmoire pour le programmeur. Voici le code de cette premire application Console

et le rsultat de son excution

Application Windows
Le dveloppement dune application de type Windows prsente une interface plus labore. Lexplorateur de solutions propose des boutons supplmentaires, la feuille de travail prsente demble un Form vierge sur un onglet tiquet [Design], et une bote outils prsente les contrles qui peuvent tre dessins sur ce Form.
Pour passer du Form graphique sa page de code et vice versa.

Obtenir linformation de tous les fichiers du projet, ou seulement les plus utiles.

A ce stade, la page de code contient trs peu de choses. Pourtant, le Concepteur Windows Form, c'est--dire lassistant qui crit notamment le code ncessaire la prsentation du Form et des contrles qui y sont dessins par le programmeur, a dj enregistr les informations dans leur tat actuel. Ces informations et le code correspondant sont modifis au fur et mesure de la mise au point du Design par le programmeur. Alors que sous la version 2003, le code du concepteur tait contenu dans une Region (regroupement de codes) de chaque formulaire, depuis la version 2005, ce code est contenu dans un fichier distinct prsent sur lillustration prcdente comme un sous fichier de Form1.vb. Ce fichier

09/08/2011

PHR VB.Net VBNF - 9

est en fait une partie de la classe Form1 de lillustration prcdente. Il sagit dune application de cette fonctionnalit nouvelle depuis 2005 qui permet dcrire du code dune classe sur plusieurs fichiers. Il suffit de faire prcder le mot Class du mot Partial pour que le code soit reconnu comme appartenant la classe dsigne. Voici le contenu de ce fichier nomm Form1.Designer.vb dans cet exemple.
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class Form1 Inherits System.Windows.Forms.Form ' Form remplace la mthode Dispose pour nettoyer la liste des composants. <System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) If disposing AndAlso components IsNot Nothing Then components.Dispose() End If MyBase.Dispose(disposing) End Sub ' Requise par le Concepteur Windows Form Private components As System.ComponentModel.IContainer ' REMARQUE : la procdure suivante est requise par le Concepteur Windows Form ' Elle peut tre modifie l'aide du Concepteur Windows Form. ' Ne la modifiez pas l'aide de l'diteur de code. <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() components = New System.ComponentModel.Container() Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.Text = "Form1" End Sub End Class

Des composants sont placs sur le Form et la taille de ce dernier est ajuste aux besoins dune hypothtique application. Dans le code gnr par le Concepteur Windows Form, la procdure prive InitializeComponent a t modifie et la dclaration vnementielle du contrle Button a t ajoute. Voici un extrait de ces modifications.
Me.MonBouton = New System.Windows.Forms.Button Me.SuspendLayout() ' ' MonBouton ' Me.MonBouton.Location = New System.Drawing.Point(84, 28) Me.MonBouton.Name = "MonBouton" Me.MonBouton.Size = New System.Drawing.Size(126, 23) Me.MonBouton.TabIndex = 1 Me.MonBouton.Text = "Fin" Me.MonBouton.UseVisualStyleBackColor = True ' ' Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(282, 75) Me.Controls.Add(Me.MonBouton) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False) ' Dclaration des contrles avec prise en compte de leurs vnements ' Friend WithEvents MonBouton As System.Windows.Forms.Button

09/08/2011

PHR VB.Net VBNF - 10

La procdure InitializeComponent dcrit les composants ajouts et leurs proprits modifies. Ordinairement, le programmeur ne se soucie pas du code gnr par le Concepteur Windows Form, code quil nest dailleurs pas judicieux de modifier autrement que par longlet Design et la fentre des proprits (cf. la remarque dans le code de Partial Class Form1 la page prcdente). Aprs cette illustration de linterface de dveloppement dune application Windows, voici une autre application de type Windows, quivalente celle-ci lapplication Console ralise prcdemment. Une fois linterface de travail en place et le Form vierge prsent sur la feuille de travail, la page de code est active par le clic du bouton adquat de lexplorateur de solutions en vue de dfinir une procdure vnementielle. Form1 Evnements est choisi dans la liste droulante de gauche et lvnement souhait peut alors tre slectionn dans celle de droite.

Ces slections ralises, la feuille de code prsente le corps de la procdure vnementielle. Il reste y crire le code qui permettra cette application de raliser dans linterface graphique de Windows ce que lapplication Console ralise en session Dos. Voici le code de cette premire application Windows
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load MessageBox.Show("Bonjour", "", MessageBoxButtons.OK) End End Sub

et le rsultat de son excution

Aprs avoir illustr lenvironnement de dveloppement par la ralisation dune application affichant Bonjour sous Dos et dune autre effectuant le mme affichage sous Windows, il convient daborder les concepts de base en programmation VB.Net. Pour ltude de ces concepts, cest le contexte procdural de la programmation qui est important et, autant que possible, les aspects POO (Programmation Oriente Objet) sont vits. Ces derniers sont tudis en dtail par la suite. Lapproche de cette tude est scinde en plusieurs parties, respectant ainsi la structure dcrite par le schma du traitement rationnel de linformation de Von Newman. Les entres et sorties de donnes Le stockage des donnes en mmoire o Les types et structures de donnes Le traitement des donnes o Les instructions de contrle o Les moyens de traitements

09/08/2011

PHR VB.Net VBNF - 11

Les entres et les sorties de donnes


Il sagit, pour la description des moyens dentrer et de sortir linformation des systmes, de faire la distinction entre ceux utiliss dans les applications Console et ceux utiliss dans les applications Windows.

Applications Console
Il existe sous DOS/Windows trois priphriques standard appels : 1. priphrique d'entre standard - dsigne par dfaut le clavier et porte le n 0 2. priphrique de sortie standard - dsigne par dfaut l'cran et porte le n 1 3. priphrique d'erreur standard - dsigne par dfaut l'cran et porte le n 2 En VB.NET, le flux de lecture Console.In lit les donnes provenant du priphrique 0, le flux d'criture Console.Out crit sur le priphrique 1, et le flux d'criture Console.Error crit sur le priphrique 2. Les instructions dentres et de sorties de donnes sont des mthodes des objets Console.In, Console.Out et Console.Error. Le premier est de type StreamReader et les deux autres sont de type StreamWriter (ces types prsenteront de lintrt lors de lusage des fichiers). Les proprits In et Out peuvent tre omises lorsque les priphriques sont bien, comme par dfaut, le clavier et lcran.

Les entres
Console.Read Cette mthode lit le premier caractre prsent dans le flux. Lencodage doit se terminer par un <Enter>. La mthode retourne un nombre entier reprsentant le code ASCII du caractre lu. Toutefois, la valeur de retour peut tre affecte une chane de caractres qui contient alors les chiffres composants le numro ASCII du caractre lu. Attention, lusage de cette mthode pour la saisie dun caractre laisse dans le flux les caractres constituant la fin de ligne. Ces caractres peuvent tre lus par des Read() supplmentaires. Il faut le dire, Read() nest pas la meilleure mthode de lecture du clavier. Par exemple, le code ci-dessous
Dim I As Integer Dim S As String
' Lecture dun caractre Encodage I = Console.Read() Console.WriteLine(" 1 ==> I = " & I) ' Affichage ' Lecture de la fin de ligne I = Console.Read() ' Affichage Console.WriteLine(" 2 ==> I = " & I) I = Console.Read() ' Affichage Console.WriteLine(" 3 ==> I = " & I)

A
1 ==> I = 65 2 ==> I = 13 3 ==> I = 10

' Lecture dun caractre Encodage S = Console.Read() ' Affichage Console.WriteLine(" 4 ==> S = " & S) ' Lecture de la fin de ligne I = Console.Read() ' Affichage Console.WriteLine(" 5 ==> I = " & I) I = Console.Read() ' Affichage Console.WriteLine(" 6 ==> I = " & I)

A
1 ==> S = 65 2 ==> I = 13 3 ==> I = 10

Les Read() contenus dans les lignes de codes dsignes par 'Lecture de la fin de ligne nattendent aucune action sur le clavier. Elles puisent chacune un caractre encore prsent dans le flux et fournissent successivement la variable I les valeurs 13 et 10. Ces valeurs constituent bien la squence de fin de ligne.

09/08/2011

PHR VB.Net VBNF - 12

Console.ReadLine Cette mthode lit toute la ligne tape au clavier, vide le flux des caractres de fin de ligne, et restitue dans une variable de type String les caractres utiles de la ligne. Par exemple, le code ci-dessous
Dim S As String S = Console.ReadLine() Console.WriteLine("==> S = " & S)
' Encodage ' Affichage Bonjour ==> S = Bonjour

Console.ReadKey Cette mthode lit un seul caractre tap au clavier et renvoie une valeur de type ConsoleKeyInfo sans attendre lappui de la touche <Enter>. Cest la mthode utiliser de prfrence toute autre aprs le message "Pressez une touche pour continuer ". Utilise sans paramtre, ou avec le paramtre False, le caractre de la touche presse est affich (saisie avec cho). Avec le paramtre True, le caractre de la touche presse nest pas affich (saisie sans cho).
Dim N As ConsoleKeyInfo Console.Write("Pressez une touche pour continuer ") ' Saisie sans Console.ReadKey(True) ' Encodage N = Console.ReadKey(True) Console.WriteLine(N.Key) ' Affichage ' Affichage Console.WriteLine(N.KeyChar)

cho et valeur ignore A 65 A

Les sorties
Console.Write La mthode Write() affiche lcran une chane de caractres, reprsentant les valeurs qui lui sont passes par paramtres, sans y ajouter les caractres de fin de ligne. Il en rsulte quaprs cela, un autre affichage ou une saisie se fait la fin de la ligne affiche.
Dim S As String Console.Write("Votre nom : ") S = Console.ReadLine() Console.Write(S) Console.Write(" est valide") Evolution l'cran : Affichage Encodage Affichage de S Affichage suiv. Votre nom : _ Votre nom : Pierre Pierre Pierre est valide

Console.WriteLine La mthode WriteLine() affiche lcran une chane de caractres, reprsentant les valeurs qui lui sont passes par paramtres, et y ajoute les caractres de fin de ligne. Il en rsulte quaprs cela, un autre affichage ou une saisie se fait au dbut de la ligne suivante.
Evolution l'cran : Affichage Console.WriteLine("Votre nom : ") S = Console.ReadLine() Console.WriteLine(S) Console.WriteLine(" est valide") Encodage Affichage de S Affichage suiv. Dim S As String Votre nom : _ Pierre Pierre est valide

Les mthodes Write et WriteLine acceptent la dfinition dune chane compose de caractres afficher, de codes de formatage et de la dsignation de la position des valeurs livres par les variables (cf. ltude de la mthode Format de la classe String, dans les pages VBPA). Par exemple, la suite des lignes de codes prcdentes :
Console.WriteLine("Est-ce {0} ?", S)
' Affichage Est-ce Pierre ?

09/08/2011

PHR VB.Net VBNF - 13

Applications Windows
Les entres/sorties standard (clavier-cran) se font essentiellement laide dobjets possdant des proprits de type texte qui peuvent tre utilises pour laffichage et/ou lentre dinformations : Label, TextBox, MessageBox, Par exemple, le code ci-dessous

et le rsultat de son excution


Affichage Encodage Affichage

09/08/2011

PHR VB.Net VBNF - 14

Les types et structures de donnes


Brve rvision de notions fondamentales
Les variables
Alors que le systme utilise la mmoire sa manire, en ladressant lectriquement sur base du numro dordre de chaque emplacement, le programmeur utilise des tiquettes reprsentatives ses yeux des valeurs utilises dans son programme. Ainsi, lorsque le systme range ladresse 55123456 la valeur 0.21, le programmeur voit cette valeur sous le nom TauxTVA. Le programmeur utilise des noms aussi reprsentatifs que possible du rle des valeurs tiquettes. La variable est un conteneur (lemplacement mmoire) nomm de valeurs. Outre dtre nomm, ce conteneur ( linstar de ceux servant la collecte slective dobjets) doit tre prdestin un type donn de valeurs.

Attention :

Une variable ne peut contenir quune seule valeur la fois. Donner une valeur une variable revient remplacer toute autre valeur quelle pouvait contenir.

Les langages donnent des moyens dorganisation des variables en structures plus ou moins complexes selon les cas. Ces structures ont toujours pour but de permettre le stockage de plusieurs valeurs derrire une seule et mme tiquette de variable. Ces structures de donnes sont appeles types composs (ou structures composes) lorsquelles rassemblent des lments dun mme type et types complexes (ou structures complexes) lorsquelles rassemblent des lments de types diffrents.

Les structures composes (tableaux)


La plus simple des structures gnralement proposes permet dassembler plusieurs variables dun mme type en une seule variable de ce type. Cette structure porte le nom de Table, ou Tableau, ou Vecteur, ou Matrice selon leurs dimensions et selon les auteurs. Certains langages proposent galement des types de valeurs qui sont dj des assemblages de structures lmentaires (les chanes de caractres sont toujours des assemblages de type vecteur de structures lmentaires de type caractre ). Une variable lmentaire (reprise ici pour comparaison car ce nest pas une structure) : On accde la variable et son contenu par son nom :
Dim A as Integer A = 12 Pour les amateurs de gomtrie : le point

A
A

Une structure Table 1 dimension (Vecteur) regroupant 4 variables lmentaires : On accde la variable par son nom et son contenu par son nom et son indice :
Dim A(4) as Integer A(C) = 12 Pour les amateurs de gomtrie : la droite
C 1 2 n
2 1 A A A A 4 3

AC

Une structure Table 2 dimensions (Matrice) regroupant 8 variables lmentaires : On accde la variable par son nom et son contenu par son nom et ses indices :
Dim A(2,4) as Integer A(L,C) = 12 Pour les amateurs de gomtrie : le plan
L C 1 1
1

n
3 2

4 3 2 A 1 1 A A A A 2 A

AL,C

09/08/2011

PHR VB.Net VBNF - 15

Une structure Table 3 dimensions regroupant 16 variables lmentaires :


C

On accde la variable par son nom et son contenu par son nom et ses indices :
Dim A(2,2,4) as Integer A(P,L,C) = 12 Pour les amateurs de gomtrie : lespace

L 1

n
3 2 1 3 A 3

4 3 2 A 41 4 2 A 2 2 2 2A A 3 A 3

1 2
1 2 1 1 1 A

A 4 4

A 2 2 1 1A AA

A A

A 1 A 1

A A

A A

AP,L,C
P

La reprsentation quon se fait de ces structures est avant tout une vue de lesprit. Limagination du programmeur limite le nombre de dimensions alloues une table bien avant les capacits techniques des systmes. VB.Net autorise jusqu 32 dimensions !

Les structures complexes (types utilisateurs)


Il sagit dune organisation regroupant diffrents types de variables lmentaires et/ou de structures diverses :
Private Structure Etudiant NomEtud As String PrenomEtud As String DateNaisEtud As String SexeEtud As Byte NbreCoursEtud As Byte CoursEtud() As String PointEtud(,) As Integer End Structure Private Structure Classe NiveauClas As Byte NbreEtudClas As Byte EtudClas() As Etudiant End Structure Dim NomVarClas As Classe

Voici dfinis deux types structurs de donnes : le type Etudiant et le type Classe. Une variable NomVarClas de type Classe est directement rserve. Le type Etudiant est compos de variables lmentaires et de structures fournies par le langage. Le type Classe intgre un type utilisateur , savoir Etudiant qui est le type de donnes pralablement dfini par le programmeur. Chacun de ces types possde une ou plusieurs sous-structures de type tableau dynamique : CoursEtud et EtudClas sont des vecteurs et PointEtud est une matrice. Ces structures complexes peuvent tre visualises comme ceci :
NomVarClas NiveauClas NbreEtudClas EtudClas

NomEtud

PrenomEtud

DateNaisEtud

SexeEtud

NbreCoursEtud

CoursEtud

PointEtud

On accde la variable par son nom et son contenu par les noms des membres suivis, le cas chant, des indices ou autres vitamines ncessaires compte tenu de leur type de structure. En poursuivant lexemple ci-dessus :
NomVarClas.NiveauClas = 3 NomVarClas.EtudClas(12).PointEtud(1,1) = 75

09/08/2011

PHR VB.Net VBNF - 16

Dclarations des variables.


La dclaration des variables peut tre implicite en VB. Cela signifie quune variable acquiert le type de la donne qui lui est affecte.
X = "Bonjour" assigne X le type String et lui affecte la valeur Bonjour.

Cependant, cette facilit doit tre dlaisse par le programmeur qui lui prfrera la dclaration explicite des variables.
Dim X As String X = "Bonjour"

La dclaration implicite, qui nexiste dailleurs pas dans tous les langages (Fortran, Cobol, Pascal, C, C++), prsente linconvnient dexposer le programmeur une correction fastidieuse des fautes de frappes. La dclaration explicite des variables ne met pas le programmeur labri de telles fautes, mais celles-ci lui sont signales immdiatement pour autant quil ait plac la directive Option Explicit On en tte de chaque page de code. Dans Visual Studio .Net, cette option peut tre fixe dans les proprits du projet, sous longlet Compiler. La dclaration dune variable se compose de trois parties essentielles : la dfinition de la porte de la variable la dfinition de son nom la dfinition de son type
Private X As String Un nom de variable, de mme que celui de tout autre objet, doit tre aussi reprsentatif que possible du rle de lobjet dans le code. Il est idalement crit en lettres majuscules et minuscules (non accentues) combines de sorte faciliter la lecture. Il peut contenir des chiffres et le caractre de soulignement, mais il ne peut commencer par un chiffre.

La porte est dfinie par les mots Dim, Private, Public, Static, Protected, Friend, Protected Friend, Shadows, Shared, ReadOnly et par certaines associations de ces mots. Elle dtermine lespace daccessibilit aux variables. Il existe trois principaux lieux de dclarations des variables o lemploi de ces mots est requis : Dim La variable dclare avec Dim en tte dun module ou dune classe est accessible de n'importe quel endroit de ce module ou de cette classe o elle nest pas redfinie (effet de masque), mais pas dans une sous-classe. Si elle est dclare lintrieur dune procdure, dune fonction ou dun bloc de code, elle nest visible que dans cette partie du code o elle bnficie de leffet de masque.
Public Class Class1 Dim VarGlobClass1 As Integer Dim UneAutreVar As Integer Private Sub MaSub() Dim VarLocMaSub As Byte VarGlobClass1 = 11 UneAutreVar = 12 VarLocMaSub = 13 If VarGlobClass1 > 100 then Dim VarBlocIf As Byte VarBlocIf = 14 Else Dim UneAutreVar As Byte ' VarBlocIf = 15 End If End Sub Un bloc de code ne bnficie pas de leffet de masque par rapport aux variables dclares dans sa procdure ou sa fonction. Dans lexemple ci contre, il serait interdit de redclarer VarLocMaSub dans le bloc If, tandis quil est permis de redclarer UneAutreVar.
' Visible dans sa classe ' Celle-ci aussi ' Nest visible que dans MaSub

en tte de modules ou de classes lintrieur de procdures et de fonctions lintrieur de blocs de codes

' Visible dans son bloc de code ' Visible dans son bloc de code et masque la ' variable de mme nom dclare en tte de Class1 ' Erreur : la variable n'est pas visible ici

09/08/2011

PHR VB.Net VBNF - 17

Private Class SousClass Private Sub UneSUb() ' VarGlobClass1 = 16 End Sub End Class End Class

' Erreur : la variable n'est pas visible ici

Private La variable dclare avec Private en tte dun module ou dune classe est accessible de n'importe quel endroit de ce module ou de cette classe o elle nest pas redfinie (effet de masque), mais pas dans une sous-classe.
Public Class Class1 Private VarGlobClass1 As Integer Private Sub MaSub() VarGlobClass1 = 11 End Sub Private Class SousClass Private Sub UneSUb() ' VarGlobClass1 = 16 End Sub End Class End Class

' Visible dans sa classe

' Erreur : la variable n'est pas visible ici

Public La dclaration Public ne peut se faire quen tte dun module ou dune classe. La variable ainsi dclare est accessible dans sa classe, mais pas dans une sous-classe. Elle est aussi accessible de n'importe quel endroit de lapplication en cours de dveloppement par la dsignation dune instance de sa classe ou du nom de son module. De plus, si une variable est ainsi dclare dans une classe, elle est aussi accessible de toute instance de la classe compile et rfrence dans un projet. Attention, la dclaration Public dune variable de classe est en infraction avec le contrle daccs prconis en POO.
Module MonModule Public VarGlobMonModule As Integer Sub Main() ' Visible dans tout le code de son module VarGlobMonModule = 17 End Sub End Module Public Class Class1 Public VarGlobClass1 As Integer Private Sub MaSub() ' Visible dans sa classe VarGlobClass1 = 11 MonModule.VarGlobMonModule = 1 ' Visible via le nom du module End Sub Private Class SousClass Private Sub UneSUb() Dim VarLoc As Class1 ' VarGlobClass1 = 16 VarLoc.VarGlobClass1 = 16 End Sub End Class End Class

' Erreur : la variable n'est pas visible ici ' Visible via le nom dune variable de type Class1

09/08/2011

PHR VB.Net VBNF - 18

Static La dclaration Static nest permise qu lintrieur dune procdure, dune fonction, ou dun bloc de code et elle nest visible que dans cette porte o elle est dclare. Une telle variable nest initialise quau premier appel du code qui la contient et conserve ainsi la dernire valeur qui lui est affecte dans cette partie du programme. Cette valeur est donc rcuprable dun appel lautre du code contenant la dclaration.
Private Sub UneSub() La variable Passage nest initialise quau premier Static Passage As Integer = 1 appel de la procdure UneSub. ' code de la procdure MessageBox.Show("Passage n : " & Passage) Passage garde ensuite sa dernire valeur affecte Passage = Passage + 1 par Passage = Passage + 1 et ce, jusqu End Sub larrt du programme.

Protected La dclaration Protected ne peut se faire quen tte dune classe. La variable ainsi dclare est accessible dans sa classe, bien sr, mais aussi dans toute classe qui en drive (hritage).
Public Class Class1 Protected VarClass1 As Integer Private Sub MaSub() VarClass1 = 11 End Sub End Class Public Class Class2 Inherits Class1

' Visible dans sa classe

' Hritage de Class1 : Class1 peut ne pas tre crite ici, ' mais tre une dll compile et rfrence dans le projet

Private Sub MaSub() Dim VarObjet As New Class1 ' Visible via le nom de la variable de type Class1 VarObjet.VarClass1 = 1 End Sub End Class

Friend La dclaration Friend peut se faire en tte dune classe ou en tte dun module et est dans ce cas, synonyme de Public mais seulement dans le projet en cours. La variable dclare avec Friend en tte dune classe est accessible partir de toute instanciation de sa classe dans le projet.
Public Class Class1 Friend VarClass1 As Integer Private Sub MaSub() VarClass1 = 11 End Sub End Class Public Class Class2 Private Sub MaSub() Dim VarObjet As Class1 VarObjet.VarClass1 = 1 End Sub End Class

' Visible dans sa classe

' Class2 appartient au mme projet que Class1

' Visible via le nom de la variable de type Class1

09/08/2011

PHR VB.Net VBNF - 19

Protected Friend La dclaration Protected Friend ne peut se faire quen tte dune classe. La variable dclare avec Protected Friend en tte dune classe est accessible partir de toute instanciation de sa classe dans le projet et dans dautres projets partir dinstances drives de sa classe compile et rfrence.
Public Class Class1 Protected Friend VarClass1 As Integer ' ' End Class
VarClass1 est visible dans Class1, partout dans le projet en cours via le nom dune variable de type Class1, et dans les classes hritant de Class1

Shadows La dclaration Shadows ne peut se faire quen tte dune classe et na dintrt que dans une classe drive. En effet, elle sert redclarer dans la classe drive un lment de mme nom qui existerait dans la classe mre en masquant ce dernier. Elle palie ainsi labsence deffet de masque dans ce contexte.
Public Class Class1 Protected VarClass1 As Integer Protected DateNais As Date End Class Public Class Class2 Inherits Class1 Private Sub MaSub() ' Dim DateNais As String Dim Shadows DateNais As String ' End Sub End Class

' Hritage de Class1 : Class1 peut ne pas ' tre crite ici, mais tre une dll ' compile et rfrence dans le projet ' Erreur : conflit de nom avec Class1 ' Le membre de Class1 est masqu

Shared La dclaration Shared ne peut se faire quen tte dune classe. La variable ainsi dclare est visible dans sa classe et dans ses ventuelles sous-classes ainsi que, selon la dclaration de porte qui lui est associe (Public, Protected, Friend, ), dans toute instance de sa classe. Mais attention, elle est unique pour toutes les instances et si sa valeur est modifie dans une instance, elle lest galement dans toutes les autres.
Public Class Class1 Friend Shared VarClass1 As Integer = 0 ' La variable est initialise 0 End Class Public Class Class2 Private Sub MaSub() Dim VarObjet As Class1 VarObjet.VarClass1 = 15 End Sub End Class Public Class Class3 Private Sub MaSub() Dim VarObjet As Class1 MessageBox.Show(VarObjet.VarClass1) End Sub End Class

' La valeur 0 affecte dans Class1 est ' remplace par la valeur 15

' Affichage de la valeur 15

09/08/2011

PHR VB.Net VBNF - 20

ReadOnly (une variable qui nen est plus une) La dclaration ReadOnly ne peut se faire quen tte dun module ou dune classe. La variable ainsi dclare est visible selon la dclaration de porte qui lui est associe, mais seulement en lecture. Cette variable a donc le comportement dune constante.
Public ReadOnly Pi As Single = 3.141592 La variable Pi est accessible selon les possibilits offertes par la porte Public, mais elle ne peut tre modifie en nul autre endroit que celui-ci.

Const (une variable qui nen est pas une) Le mot Const nest pas une dclaration de porte mais celle dune constante. Employ seul ou accompagn dune des prcisions Private, Public, Protected, Friend, Protected Friend et Shadows, il permet la dclaration dune donne dont la valeur ne peut plus tre modifie en cours dexcution. Avec Const employ seul, la constante a une porte locale si elle est dclare lintrieur dune procdure ou dune fonction, sinon elle est accessible tout le code qui se trouve dans la rgion de la dclaration.
Public Const Pi As Double = 3.141592 La constante Pi est accessible selon les possibilits offertes par la porte Public, mais elle ne peut tre modifie en nul autre endroit que celui-ci.

Les types de donnes


Dsignations
System.Boolean
(type valeur)

Tailles 2 octets 1 octet 1 octet 2 octets 8 octets 16 octets


True ou False 0 255 (non signs). -128 127. 0 65 535 (non signs).

Plages de valeurs

System.Byte
(type valeur)

System.SByte
(type valeur)

System.Char
(type valeur)

System.DateTime
(type valeur)

0:00:00 le 1er janvier 0001 23:59:59 le 31 dcembre 9999. 0 +/-79 228 162 514 264 337 593 543 950 335 sans dcimale ou 0 +/-7,9228162514264337593543950335 avec 28 dcimales.

System.Decimal
(type valeur)

Le plus petit nombre diffrent de zro est :


+/-0,0000000000000000000000000001 (+/-1E-28). System.Single
(type valeur)

4 octets 8 octets

-3,402823E+38 -1,401298E-45 pour les valeurs ngatives ; 1,401298E-45 3,402823E+38 pour les valeurs positives. -1,79769313486231E+308 -4,94065645841247E-324 pour les valeurs ngatives et 4,94065645841247E-324 1,79769313486231E+308 pour les valeurs positives. -32 768 32 767.

System.Double
(type valeur)

System.Int16
(type valeur)

2 octets 4 octets 8 octets 2 octets 4 octets 8 octets 4 octets


ou 8 octets

System.Int32
(type valeur)

System.Int64
(type valeur)

System.UInt16
(type valeur)

System.UInt32
(type valeur)

System.UInt64
(type valeur)

System.Object
(type rfrence)

Synonyme autoris : Short -2 147 483 648 2 147 483 647. Synonyme autoris : Integer -9 223 372 036 854 775 808 9 223 372 036 854 775 807. Synonyme autoris : Long 0 65 535. Synonyme autoris : UShort 0 4 294 967 295. Synonyme autoris : UInteger 0 18 446 744 073 709 551 615. Synonyme autoris : ULong N'importe quel type peut tre rfrenc par une variable de type Object.
(4 octets sur un systme 32 bits, 8 octets sur un systme 64 bits)

09/08/2011

PHR VB.Net VBNF - 21

System.String
(type rfrence)

Dpend de 0 environ 2 milliards de caractres Unicode (2 octets par caractre). limplmentation

Type utilisateur Dpend de Chaque membre de la structure prsente une plage dtermine par son type de System.ValueType limplmentation donnes.
(type valeur)

Chaque type de donne repris dans le tableau prcdent est assorti dune indication type valeur ou type rfrence. La diffrence entre les deux rside dans la manire de leur rserver de la place en mmoire et de les initialiser. La dclaration dune variable de type valeur provoque la rservation de son emplacement en mmoire et son initialisation la valeur nulle (sauf pour une variable de type DateTime pour laquelle la valeur dinitialisation est 111000, c'est--dire 01/01/0001 01:01:01). La dclaration dune variable de type rfrence provoque la rservation en mmoire de lemplacement ncessaire pour stocker ladresse o sont effectivement stockes les donnes dsignes par cette variable. Linitialisation par dfaut dune telle variable, qui est donc un pointeur, est Nothing. Une variable de type rfrence doit tre initialise par des valeurs ou par lusage de loprateur New. Cette initialisation doit permettre au compilateur dvaluer et de rserver lespace ncessaire en mmoire, et dinitialiser la variable avec ladresse de la zone ainsi rserve.

Notation littrale de donnes


La notation littrale dune donne est lexpression de sa valeur dans le code. Par exemple : Pi = 3.141592
Integer Long Double Single Decimal Char Date 145, -7, &FF 100000L 134.789, -45E-18 134.789F, -45E-18F 100000D "A"c New Date(2006, 3, 1) #1/3/2006# "01/03/2006" "aujourd'hui" & est, dans ce cas, le prfixe pour lhexadcimal

F comme float pour dsigner la simple prcision

String

c, pour transformer la chane de caractres "A" en caractre 'A' instanciation d'un objet Date initialis 01/03/2006 forme ordinaire du littral de type Date et Time (#2:25:30 PM#) littral de type Date et Time sous forme de chane si la chane doit contenir le caractre ", on double celui-ci comme dans "abcd""e" pour reprsenter la chane abcd"e.

Dclaration des tableaux


Contrairement aux variables lmentaires de type valeur dont il a t question jusqu prsent, les tableaux sont de type rfrence. Alors que Dim X As Integer rserve la place en mmoire pour un entier, Dim T() As Integer rserve la place en mmoire pour ladresse dun tableau dentiers et non pour le tableau lui-mme. Le tableau T doit tre spcialement initialis pour que la rfrence dsigne effectivement son contenu. Comme indiqu prcdemment, laccs aux donnes dun tableau se fait par la dsignation de son nom flanqu des indices ncessaires. Lindice minimal est toujours 0 et lindice maximal est celui indiqu par linitialisation. Par exemple, Dim T(5) As Integer rserve lespace pour 6 entiers, tous initialiss 0, accessibles par un indice variant de 0 5. Ou encore Dim T() As Integer = {0, 1, 2, 3, 4, 5} rserve lespace pour 6 entiers, respectivement initialiss avec les valeurs 0, 1, 2, 3, 4 et 5, galement accessibles par un indice variant de 0 5. Les tableaux sont des objets tous drivs dune classe Array. Ils possdent des proprits et des mthodes exploitables par le programmeur, certaines par linstance utilise, dautres partir de la classe Array. Voici titre dexemple, les proprits Length et Rank, ainsi que les mthodes GetLength, Reverse et Sort :
Length Rank GetLength Sort

Contient le nombre total dlments rservs pour le tableau. Contient le nombre dindices ncessaires pour laccs aux donnes. Fournit le nombre dlments rservs pour une dimension donne du tableau. Retourne le tableau tri par ordre croissant. Aprs cela, Reverse donnera le tableau dans lordre inverse.

09/08/2011

PHR VB.Net VBNF - 22

Dim L, C As Integer ' Tableau 1

' Alloue lespace pour 2 entiers L et C

' Alloue lespace pour 5 entiers initialiss 0 Dim Tab1(4) As Integer ' Balayage de Tab1 de 0 jusqu son indice maximal For C = 0 To Tab1.Length 1 ' Affectation Tab(C) de la valeur de lindice Tab1(C) = C Next C Console.WriteLine("NbItem : " & Tab1.Length & " NbDim : " & Tab1.Rank) ' Affichage : NbItem : 5 NbDim : 1 For C = 0 To Tab1.Length 1 Console.WriteLine("Tab1(" & C & ")=" & Tab1(C)) ' Affichage : Tab1(0) = 0 Next C
' ' Tab1(1) = 1

' Tableau 2 ' Alloue lespace pour 5 entiers initialiss avec les valeurs numres Dim Tab2() As Integer = New Integer(4) {200, 203, 202, 201, 204} Console.WriteLine("NbItem : " & Tab2.Length & " NbDim : " & Tab2.Rank) Array.Sort(Tab2)
' Affichage : NbItem : 5 NbDim : 1 ' Tri de Tab2

' Tableau 3 ' Alloue lespace pour 3 x 5 entiers initialiss avec les valeurs numres Dim Tab3(,) As Integer = New Integer(2, 4) {{300, 301, 302, 303, 304}, _ {310, 311, 312, 313, 314}, _ {320, 321, 322, 323, 324}} Console.WriteLine("NbItem = " & Tab3.Length & " NbDim = " & Tab3.Rank)
' Affichage : NbItem : 15 NbDim : 2

' Tableau 4 ' Alloue lespace pour 3 tableaux dentiers. Les Tab4() sont initialiss Nothing Dim Tab4()() As Integer = New Integer(2)() {} Console.WriteLine("NbItem = " & Tab4.Length & " NbDim = " & Tab4.Rank) ' Affichage : NbItem : 3 NbDim : 1 For L = 0 To 2 ' Alloue lespace de chaque Tab4() pour 5 entiers initiliss 0 Tab4(L) = New Integer(4) {} For C = 0 To 4 ' Affectation des cellules C du tableau Tab4(L) Tab4(L)(C) = C * 10 + L Next C Next L Console.WriteLine("NbItem = " & Tab4.Length & " NbDim = " & Tab4.Rank)
' Affichage : NbItem : 3 NbDim : 1

Console.WriteLine("NbItem = " & Tab4(0).Length & " NbDim = " & Tab4(0).Rank)
' Affichage : NbItem : 5 NbDim : 1

' Tableau 5 ' Alloue lespace pour 1 tableaux dentiers. Tab5 est initialise Nothing Dim Tab5(,) As Integer = New Integer(,) {} ' Alloue 3 lignes de 3 colonnes Tab5. La plage est initialise 0 ReDim Tab5(2, 2) Console.WriteLine("NbItem = " & Tab5.Length & " NbDim = " & Tab5.Rank) ' Affichage : NbItem : 9 NbDim : 2 ' ' Alloue 2 colonnes de plus chaque ligne de Tab5. La plage ajoute est initialise 0 ' Cette opration ne peut concerner que lindice de droite ' Preserve pour conserver le contenu ReDim Preserve Tab5(2, 4) Console.WriteLine("Tab5 : NbItem = " & Tab5.Length & " NbDim = " & Tab5.Rank)
' Affichage : NbItem : 15 NbDim : 2

Console.WriteLine(Tab5.GetLength(0) & " ligne(s)")


' Affichage : 3 ligne(s)

Console.WriteLine(Tab5.GetLength(1) & " colonne(s)")


' Affichage : 5 colonne(s)

09/08/2011

PHR VB.Net VBNF - 23

Dfinition des structures


Les structures sont les types de donnes dfinis par le programmeur. Elles sont un assemblage de types divers tels que types de base du langage, tableaux et autres structures pralablement dfinies. Comme les variables lmentaires (et contrairement aux tableaux qui sont de type rfrence) les structures sont de type valeur. La dclaration dune variable dun type utilisateur entrane donc immdiatement la rservation de sa place en mmoire. Cependant, si une structure contient des membres de type rfrence, ces derniers doivent tre explicitement initialiss par des valeurs ou par lusage de loprateur New. Lespace rserv en mmoire pour une variable dune telle structure ne contient, pour ces membres de type rfrence, que lespace ncessaire au stockage dune adresse. Une structure ne peut pas tre dfinie l'intrieur d'une procdure ou d'une fonction. Il sagit dune dclaration de type de donne et non encore dune variable. Les indicateurs de porte qui sont applicables au niveau de la dfinition dune structure sont les mmes que ceux des variables lexception de Dim, Static, Shared et ReadOnly, ceux-ci ne pouvant tre employs. Une structure dfinie l'extrieur d'une classe ou d'un module doit tre dclare Public. Les membres dune structure utilisent les indicateurs de portes Dim, Private, Public, Shadows, Shared et ReadOnly, soit tous lexception de ceux ordinairement rservs aux classes et de Static qui ne peut semployer qu lintrieur dune procdure ou une fonction. Seuls Dim et Shared sont rellement dignes dintrt :
Dim Shared Private Public Shadows ReadOnly

le membre est visible partout o la structure est visible le membre est visible partout o la structure est visible, mais unique pour toutes les variables du mme type le membre est invisible partout et donc, sans intrt le membre est visible partout o la structure est visible, comme avec Dim le membre est visible partout o la structure est visible mais sans intrt, les membres dune structure bnficiant toujours de leffet de masque le membre est visible partout o la structure est visible mais non modifiable, ce qui ne prsente pas dintrt du fait quon ne peut initialiser un membre de structure lors de sa dfinition, sauf sil est dclar Const

Les variables de type structure se dclarent comme toute autre variable l o le type dfini par la structure est visible. Une fois la variable dclare, elle donne accs tous les membres de la structure lexception de ceux dclars Private. Cependant, la porte de la structure limite la porte permise pour une variable. Cest donc la porte inscrite dans la dfinition de la structure qui dtermine la visibilit des variables et des membres.
Private Structure Test ' Dim VarTest1 As Integer Public VarTest2 As Integer ' Shared VarTest3 As Integer ' ReadOnly VarTest4 As Integer Const VarTest5 As Integer = 101 ' End Structure ' Public MaVarTest As Test Public Sub MaSub() Dim T As Test Dim TT As Test T.VarTest1 = 10 T.VarTest3 = 13 ' T.VarTest4 = 14 ' T.VarTest5 = 15 Console.WriteLine(T.VarTest1) Console.WriteLine(T.VarTest2) Console.WriteLine(T.VarTest3) Console.WriteLine(TT.VarTest3) Console.WriteLine(T.VarTest4) Console.WriteLine(T.VarTest5) End Sub
Visible dans sa classe ou son module

Unique pour toutes les variables de type Test Ne peut recevoir aucune valeur Ne peut tre modifie

' Erreur : ne peut tre Public car Test est Private

' ' ' ' ' ' ' '

Erreur : le Erreur : le Affichage : Affichage : Affichage : Affichage : Affichage : Affichage :

membre est ReadOnly membre est une constante 10 0 initialisation par dfaut 13 13 il ny a eu aucune affection ! 0 initialisation par dfaut 101

09/08/2011

PHR VB.Net VBNF - 24

Les structures de tableaux


Un tableau contenu dans une structure doit tre initialis comme tout autre tableau. Mais il ne peut ltre lors de la dfinition de la structure. Il doit tre initialis avant utilisation, aprs la dclaration dune variable du type de la structure concerne. Laccs aux donnes se fait par le nom de la variable suivi du nom de son tableau, lui-mme accompagn des indices ncessaires.
Private Structure MesTab Dim Tab1() As Integer Dim Tab2(,) As Integer Dim Tab3()() As Integer End Structure Sub Main() Dim L, C As Integer Dim MT As MesTab MT.Tab1 = New Integer(4) {} MT.Tab2 = New Integer(,) {} ReDim MT.Tab2(2, 4) MT.Tab3 = New Integer(2)() {} For L = 0 To 2 MT.Tab3(L) = New Integer(4) {} For C = 0 To 4 MT.Tab3(L)(C) = C * 10 + L Next C Next L End Sub
' Alloue lespace pour 5 entiers ' Initialisation de MT.Tab2 Nothing ' et allocation despace pour 3 x 5 entiers

' Alloue lespace pour 3 vecteurs dentiers ' Alloue lespace pour chaque vecteur ' Affectation des cellules C du ' tableau MT.Tab3(L)

Les tableaux de structures


Un tableau de structures doit tre initialis comme tout autre tableau. Si la structure concerne contient un tableau, ce dernier doit tre initialis comme indiqu ci avant. Laccs aux donnes se fait par le nom du tableau accompagn des indices ncessaires, suivi du nom du membre concern de la structure.
Private Structure MaStruct Dim Nbre As Byte Dim Tab() As Integer End Structure Sub Main() Dim L, C As Integer ' Alloue lespace pour 6 structures MaStruct Dim TS(5) As MaStruct ' Initialisation du tableau contenu dans chaque structure For L = 0 To 5 ' Affectation dune valeur Nbre TS(L).Nbre = L ' Alloue lespace pour 3 entiers dans TS(L).Tab = New Integer(2) {} ' chaque Tab For C = 0 To 2 ' Affectation dune valeur chaque TS(L).Tab(C) = C * 10 + L ' Tab(C) de TS(L) Next C Affichage : Next L ' Affichage de toutes les valeurs du tableau de structures Structure 0 For L = 0 To 5 ...Valeur de Nbre = 0 Console.WriteLine("Structure " & L) ...Valeurs de Tab Console.WriteLine("...Valeur de Nbre = " & ...Cel 0 = 0 TS(L).Nbre) ...Cel 1 = 10 ...Cel 2 = 20 Console.WriteLine("...Valeurs de Tab") Structure 1 For c = 0 To 2 ...Valeur de Nbre = 1 Console.WriteLine("...Cel " & C & " = " & ...Valeurs de Tab TS(L).Tab(C)) ...Cel 0 = 1 Next C ...Cel 1 = 11 Next L ... End Sub

09/08/2011

PHR VB.Net VBNF - 25

Les numrations
Une numration ne peut pas tre dfinie l'intrieur d'une procdure ou d'une fonction. Il sagit dune dclaration de type de donne et non encore dune variable. Les indicateurs de porte Public, Private, Protected, Friend, Protected Friend et Shadows lui sont applicables. Une numration dfinie l'extrieur d'une classe ou d'un module doit tre dclare Public. Les variables de type numration se dclarent comme toute autre variable l o le type dfini par lnumration est visible. Une fois la variable dclare, elle donne accs tous les champs de lnumration. Contrairement aux structures, les champs de lnumration nacceptent aucun indicateur de porte. La porte de lnumration limite la porte permise pour une variable. Cest donc la porte inscrite dans la dfinition de lnumration qui dtermine la visibilit des variables et des champs. Une variable de type numration peut tre affecte de nimporte quelle valeur de type numrique entier. Il incombe au programmeur de sassurer de la pertinence de telles affectations. Le bon usage consiste naffecter une telle variable que par des valeurs appartenant sa plage de valeurs. Mieux encore, de naffecter cette variable que par un des noms de champs de lnumration. Les champs de lnumration sont tous des constantes dun type entier. Ce type de donne est ventuellement prcis lors de la dclaration de lnumration comme tant Byte, Integer, Long ou Short, lexclusion mme de leur synonyme (Int16, Int32, ). Par dfaut, le type d'une numration est Integer. A dfaut daffectation explicite dans la dfinition de lnumration, les champs ont pour valeur lentier correspondant leur position de 0 N-1 (N tant le nombre de champs). Si un champ nest pas affect dans la dfinition, il a pour valeur celle de son prdcesseur incrmente dune unit. Plusieurs champs peuvent avoir la mme valeur.
Private Enum Jours Lundi = 0 : Mardi = 1 : Mercredi = 2 Jeudi = 3 : Vendredi = 4 : Samedi = 5 : Dimanche = 6 End Enum Private Enum Saisons As Byte Printemps Ete Automne Hiver End Enum Private Enum Divers As Integer Chose = 5 : Bidule = 7 : Truc : Machin = 8 : Bazar = 17 End Enum ' Public JJ As Jours
' Erreur : JJ ne peut tre Public car Jours est Private

Public Sub MaSub() ' Dim J As Jours ' Dim S As Saisons ' ' J = "dksh" MessageBox.Show(J & " Lundi = " & Jours.Lundi) ' J = 21 MessageBox.Show(J & " Mardi = " & Jours.Mardi) ' J = Jours.Jeudi MessageBox.Show(J & " Jeudi = " & Jours.Jeudi) ' ' S.Hiver = 31 MessageBox.Show(S & " Et = " & Saisons.Ete) MessageBox.Show("Bidule = " & Divers.Bidule) MessageBox.Show("Truc = " & Divers.Truc) MessageBox.Show("Machin = " & Divers.Machin) End Sub

La dclaration dune telle variable nest utile qu son affectation Erreur lexcution : J est entier ' Affichage : 0 Lundi = 0 Pas derreur, mais un non-sens ' Affichage : 21 Mardi = 1 Le bon usage ' Affichage : 3 Jeudi = 3 Erreur : le champ est une constante ' Affichage : 0 Et = 1 ' Affichage : Bidule = 7 ' Affichage : Truc = 8 ' Affichage : Machin = 8

Les numrations sont des aides au service du programmeur qui elles prsentent des valeurs sous des noms reprsentatifs. Ainsi par exemple, VB offre des numrations comme celle des diffrents jeux de boutons disponibles pour la MessageBox : OK, OKCancel, AbortRetryIgnore, YesNoCancel, YesNo, et RetryCancel, chacun de ces mots tant bien plus significatif que la valeur quil reprsente, soit respectivement 0, 1, 2, 3, 4 et 5.

09/08/2011

PHR VB.Net VBNF - 26

Les instructions de contrles et moyens de traitements


Brve rvision de notions fondamentales
La squence
Cest la structure de programmation la plus lmentaire. Toutes les instructions ainsi programmes sexcutent lune aprs lautre, successivement, squentiellement et sans aucun contrle. Le code suivant constitue une squence :
Dim J As Jours Dim S As Saisons Dim D As Divers MessageBox.Show(J & " Lundi = " & Jours.Lundi) J = 21 MessageBox.Show(J & " Mardi = " & Jours.Mardi) J = Jours.Jeudi MessageBox.Show(J & " Jeudi = " & Jours.Jeudi) MessageBox.Show("Bidule = " & Divers.Bidule)

La rupture de squence
Les langages offrent diverses solutions permettant le contrle de lexcution de certaines squences. La plus lmentaire de ces solutions est la rupture de squence. Le programmeur peut interrompre le droulement dune squence en dtournant son cours normal vers dautres codes. La rupture de squence permet aussi la r-excution de codes en dtournant le droulement de la squence vers son dbut.

Action(s)

Action(s) rptes

Aller

Action(s) ignores

Aller

Condition

Action(s) ignores

Action(s)

La rupture de squence inconditionnelle.

La rupture de squence conditionnelle.

Bien que prsente sous lune ou lautre forme dans tous les langages, linstruction "Aller " doit toujours tre remplace par lusage dalternatives bien construites ou ditrations judicieusement organises. Cette instruction n'est tolrable que dans les langages pauvres en contrles dalternatives et ditrations (script MS-DOS, Assembleur, ).

Lalternative
Lalternative est une instruction de contrle de lexcution du code qui permet ordinairement le choix entre deux squences distinctes. Dans des formes imbriques, elle permet le choix dune squence parmi plusieurs.

Les itrations
Les instructions de contrle ditrations sont nombreuses. Elles permettent toutes lorganisation et le contrle de rptitions de squences. Certaines permettent un nombre dtermin de rptitions, dautres autorisent la rptition jusqu la ralisation dune condition pralablement dfinie.

09/08/2011

PHR VB.Net VBNF - 27

Ni contrle, ni traitement
Les instructions de contrles sont les codes rgissant lexcution dune ou plusieurs autres instructions sans rellement affecter les donnes. Les moyens de traitements sont les oprateurs, les fonctions et les procdures, ainsi que toute autre instruction dont le rle premier est la transformation et/ou la production de donnes. Cette distinction gnralement ignore en informatique est faite ici pour mettre en vidence les deux grandes familles doutils quoffrent les langages : les outils dorganisation et de contrle des programmes les outils de traitements des donnes

Les outils dorganisation et de contrle des programmes sont les diffrentes instructions de structuration des programmes, dont essentiellement lalternative et les itrations. Les outils de traitement des donnes sont les oprateurs, les procdures et les fonctions intrinsques du langage ainsi que celles dveloppes par le programmeur. Outre ces instructions, les langages offrent des possibilits damliorer lorganisation et la lisibilit du code sans que cela change son ordre dexcution, ni ses donnes.

Les commentaires
Lapostrophe ( ' ) ou le mot cl REM plac en dbut de ligne ou avant une partie de phrase de code est la marque de commentaire du langage. Sa prsence empche le compilateur de traiter ce qui est crit sa droite. Elle est utile pour linsertion de commentaires et pour lisolation provisoire de codes pendant la mise au point dun programme.
' Ceci est un commentaire REM de mme que cette phrase

La continuation
Le caractre de soulignement ( _ ) prcd dun espace est la marque de continuation. Elle permet la coupure dune ligne de code trop longue et sa continuation la ligne suivante, ou simplement damliorer la lisibilit du code. Par exemple, dans le code suivant, la marque de continuation permet dinitialiser le tableau Tab3 en montrant la matrice ainsi ralise.
Dim Tab3(,) As Integer = New Integer(2, 4) { {300, 301, 302, 303, 304}, _ {310, 311, 312, 313, 314}, _ {320, 321, 322, 323, 324} }

Lconomie de dactylographie
Linstruction With suivie dun nom de variable dun type structur permet daccder aux donnes sans devoir rpter le nom de la variable chaque fois. Les 4 lignes de codes suivantes
NomVarStruct.Nbre = NomVarStruct.Tab(1) NomVarStruct.Tab(2) NomVarStruct.Tab(3) 0 = 11 = 12 = 13

peuvent scrire
With NomVarStruct .Nbre = 0 .Tab(1) = 11 .Tab(2) = 12 .Tab(3) = 13 End With

Le sparateur dinstructions
Le double point ( : ) permet lcriture de plusieurs instructions sur une mme ligne. Labus du sparateur dinstructions nuit souvent la lisibilit du code. Les lignes de codes prcdentes peuvent scrire :
With NomVarStruct .Nbre = 0 : .Tab(1) = 11 : .Tab(2) = 12 : .Tab(3) = 13 : End With

09/08/2011

PHR VB.Net VBNF - 28

Les instructions de contrles


La rupture de squence
Bien que lusage des branchements de type "Aller " (Goto) soit bannir, voici lillustration de lemploi de ces instructions.
Spaghetti ?

Private Sub Branchement() MessageBox.Show("Message 1") ' Branch. incond. GoTo Etiq1 Etiq2: MessageBox.Show("Message 4") ' Retour aprs Goto GoTo Etiq5 Etiq1: MessageBox.Show("Message 2") ' Branch. incond. GoTo Etiq3 Etiq4: MessageBox.Show("Message 5") ' Fin de procdure Exit Sub Etiq3: MessageBox.Show("Message 3") ' Branch. incond. GoTo Etiq2 Etiq5: ' Retour aprs Goto GoTo Etiq4 End Sub

Etiq1

Etiq2

Etiq3

Si lusage dalternatives bien construites et ditrations judicieusement organises permet de crer du code sans rupture de squence, il est toutefois pratique, par facilit, de briser certains droulements de traitements notamment par lemploi des instructions :
Exit Exit Exit Exit Do For Function Sub

Etiq2 Etiq3

Les tiquettes (Etiq1, Etiq2, ) doivent tre places en premire colonne du code (pas de retrait, pas d'indentation, pas d'espace).

Lalternative
Condition Condition

Action(s) contrle(s)

Action(s) 1 contrle(s)

Action(s) 2 contrle(s)

Le contrle dune alternative se ralise toujours par lvaluation dune condition. Plusieurs alternatives peuvent tre assembles en cascades ou imbriques pour raliser des choix complexes.
If Condition_ralise Then Action If Condition_ralise Then Action1 Else Action2

Meilleure criture :
If Condition_ralise Then
Action(s)_contrle(s)

End If If Condition_ralise Then


Action(s)_contrle(s)

Else
Autre(s)_action(s)_contrle(s)

End If

09/08/2011

PHR VB.Net VBNF - 29

If Total > 50 Then Console.WriteLine("Trop cher") If Total > 50 Then Console.Write("Trop cher ") Else Console.Write("Prix OK ")

Meilleure criture :
If Total > 50 Then Console.WriteLine("Trop cher") End If If Total > 50 Then Console.Write("Trop cher ") Else Console.Write("Prix OK ") End If

Les alternatives, comme toutes les structures de contrles, peuvent tre imbriques. Cela signifie quune ou plusieurs actions contrles peuvent elles-mmes tre des alternatives. Les alternatives peuvent galement tre assembles en cascades. Lusage de plusieurs alternatives permet lvaluation de plusieurs conditions.
If Total > 50 Then ' Il doit y avoir autant de End If que de If If Remise = 0.50 then Total = Total * 0.50 Console.WriteLine("Prix OK") else Console.WriteLine("Trop cher") End If Else Console.WriteLine("Prix OK") End If

' Il doit y avoir autant de End If que de If If NombreCote = 3 Then Console.WriteLine("Triangle") Else If NombreCote = 4 Then Console.WriteLine("Quadrilatre") Else If Heure = 16 Then Console.WriteLine("Post meridian") End If End If End If

Pour ce dernier exemple, la forme suivante est meilleure car plus lisible et ne ncessitant quun seul End If :
If NombreCote = 3 Then ' Un seul End If car un seul If Console.WriteLine("Triangle") ElseIf NombreCote = 4 Then Console.WriteLine("Quadrilatre") ElseIf Heure = 16 Then Console.WriteLine("Post meridian") End If If Choix = 1 Then ' Toutes les conditions valuent les diffrentes ' valeurs possibles dune mme variable Console.WriteLine("Saisie") ElseIf Choix = 2 Then Console.WriteLine("Calcul ") ElseIf Choix = 3 Then Console.WriteLine("Affichage") ElseIf Choix = 0 Then Console.WriteLine("Fin") Else Console.WriteLine("Mauvais choix") End If

09/08/2011

PHR VB.Net VBNF - 30

La slection
La slection est une forme labore de lalternative qui remplace avantageusement toute cascade dalternatives, chacune vrifiant sa condition sur une seule et mme variable commune.

Condition 1 sur variable v Condition 2 sur variable v Action(s) 2 contrle(s) Condition sur variable v Condition n sur variable v

Action(s) 1 contrle(s)

Action(s) contrle(s)

Action(s) n contrle(s)

Action(s) sur imprvus

Ce schma au trac simplifi exprime trs bien la slection sur les valeurs de v.

Selon valeur de v

autres

Action(s) 1 contrle(s)

Action(s) 2 contrle(s)

Action(s) contrle(s)

Action(s) n contrle(s)

Action(s) sur imprvus

Select Case Choix Case 1 Console.WriteLine("Saisie") Case 2 Console.WriteLine("Calcul ") Case 3 Console.WriteLine("Affichage") Case 0 Console.WriteLine("Fin") Case Else Console.WriteLine("Mauvais choix") End Select

Outre dadmettre des valeurs discrtes comme dans lexemple ci-dessus, la slection en VB autorise aussi lindication de plages de valeurs.

Select Case Heure Case 8 To 12 Console.WriteLine("Matin") Case 13 To 18 Console.WriteLine("Aprs-midi") Case 19 To 22 Console.WriteLine("Soir") Case 22 To 24 , 0 To 7 Console.WriteLine("Nuit") Case Else Console.WriteLine("Heure invalide !") End select

09/08/2011

PHR VB.Net VBNF - 31

Les itrations
Les codes contrls par une itration sont excuts plusieurs fois, soit jusqu ce quune condition prdtermine darrt soit ralise, soit un nombre prdtermin de fois. Il s'agit des boucles logiques dans le premier cas, et des boucles arithmtiques dans le second. Les boucles logiques Les boucles logiques sont reprsentes par les instructions "Tant que" et "Jusqu", lune et lautre se programmant avec lvaluation de la condition Avant ou Aprs le code contrl. Evaluation de la condition avant le code contrl : Le code contrl ne sera peut-tre jamais excut. Evaluation de la condition aprs le code contrl : Le code contrl sera excut au moins une fois.

Condition

Action(s) rpte(s)

Action(s) rpte(s)

Condition

Il faut, dans un cas comme dans lautre, que le code contrl contienne une instruction modifiant une ou plusieurs variables participant la condition de sorte permettre la sortie de la boucle aprs un certain nombre ditrations.
N = 0 While N < 5 N = N + 1 Console.WriteLine(N) End While Do While N < 10 N = N + 1 Console.WriteLine(N) Loop Do N = N + 1 Console.WriteLine(N) Loop While N < 15 Do Until N = 20 N = N + 1 Console.WriteLine(N) Loop Do N = N + 1 Console.WriteLine(N) Loop Until N = 25
' "Tant que" avec valuation Avant (Forme 1) ' Affichage des valeurs de 1 5

' "Tant que" avec valuation Avant (Forme 2) ' Affichage des valeurs de 6 10

' "Tant que" avec valuation Aprs ' Affichage des valeurs de 11 15

' "Jusqu" avec valuation Avant ' Affichage des valeurs de 16 20

' "Jusqu" avec valuation Aprs ' Affichage des valeurs de 21 25

Il existe une structure de boucle logique qui permet au programmeur de placer lvaluation de la condition nimporte o dans le code contrl. La sortie de la boucle se programme alors avec un ordre Exit Do.
Do N = N + 1 If N > 30 Then Exit Do Console.WriteLine(N) Loop
' Avec valuation dans le code contrl ' Evaluation et sortie si ncessaire ' Affichage des valeurs de 26 30

09/08/2011

PHR VB.Net VBNF - 32

La boucle arithmtique La boucle arithmtique peut toujours tre remplace par une boucle logique dont la condition value la valeur dune variable incrmente chaque itration (comme dans lexemple prcdent). Toutefois, linstruction approprie a le mrite dintgrer la variable, dite variable de boucle, son incrmentation et son valuation par rapport une limite donne.
For Variable_de_boucle = Valeur_Debut To Valeur_Fin Step Pas
Action(s)_ rpte(s)

Next Variable_de_boucle
V = VDeb ==> VFin, Pas

Action(s) rpte(s)

Les trois boucles suivantes sont identiques :


For N = 1 To 25 Step 1 Console.WriteLine(N) Next N For N = 1 To 25 Console.WriteLine(N) Next N For N = 1 To 25 Console.WriteLine(N) Next
' Affichage des valeurs de 1 25

' La valeur par dfaut du pas est 1 ' Affichage des valeurs de 1 25

' ' ' '

Affichage des valeurs de 1 25 Le rappel de la variable de boucle cet endroit est facultatif, mais il amliore la lisibilit du code

Le pas peut prendre nimporte quel type de valeur (entire, ngative, fractionnaire) pour autant que la variable de boucle soit du type appropri. Sil est fourni par une variable, celle-ci nest value quune fois et sa modification lintrieur de la boucle naffecte pas le nombre ditrations calcul au dbut.
For R As Single = 2 To -1 Step -.5 ' Affichage les valeurs 2, 1.5, 1, 0.5, 0, -0.5, -1 Console.WriteLine(R) Next

Pour rappel, un bloc de code ne bnficie pas de leffet de masque par rapport aux variables dclares dans sa procdure ou fonction. La variable de boucle ne peut donc pas tre dclare localement si elle est dj dclare dans sa procdure ou fonction (hors dun bloc de code). La dclaration de la variable de boucle lors de la dfinition de celle-ci en fait une variable locale au bloc de code de la boucle.
Private Sub MaSub() Dim x As Integer Dim k As Integer x = 0 While x < 5 ' Dim k As Integer Dim y As Integer x = x + 1 y = y + 1 Console.WriteLine(x * y) End While ' For x As Integer = 1 To 5 For x = 1 To 5 Dim y As Integer y = y + 1 Console.WriteLine(x * y) Next x End Sub

' Erreur : k est dj dclare dans MaSub ' Cest mieux comme a et y est locale ' la boucle While

' Erreur : x est dj dclare dans MaSub ' Cest mieux comme a ' y est locale la boucle For

09/08/2011

PHR VB.Net VBNF - 33

Une boucle ni logique, ni arithmtique La boucle "Pour chaque" ne requiert pas la dfinition dune condition darrt, ni la spcification dun compteur. Elle permet laccs chacune des donnes contenues dans un tableau ou une collection.
Module MonModule Private Structure MaStruct Dim Nom As String Dim Age As Integer End Structure Sub Main() Dim TS(5) As MaStruct Dim MS As MaStruct Dim TI(5) As Integer ' For Each N As Integer In TI Console.WriteLine(N) Next
' Pour chaque N, qui est un entier contenu dans TI ' Affiche la valeur de N

' Pour chaque MS, qui est une MaStruct contenue dans TS For Each MS In TS Console.WriteLine(MS.Nom & " " & MS.Age) Next End Sub

End Module

Un autre exemple :
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Pour chaque TB, qui est un objet contenu For Each TB As Object In Me.Controls If TB.GetType.Name = "TextBox" Then ' dans la collection des Controls de Form1 ' lui-mme (Me), sil est de type TextBox, TB.Clear() End If ' alors le vider de tout contenu Next '

Lappel de sous-programmes
Les fonctions et les procdures sont les seuls sous-programmes utilisables en VB. Il sagit de blocs de codes gnralement spcialiss qui peuvent tre excuts plusieurs fois par un ou plusieurs codes appelants, ou en rponse des vnements. Dans les pages prcdentes, chaque Sub est un exemple de procdure. Pour le programmeur, ils prsentent comme premier avantage quune fois bien mis au point, ils ne doivent plus tre repenss ni r-encods. Mcanisme dexcution dun sous-programme. Code appelant
Action(s) Action(s) Appel dun sous-programme

Procdure ou fonction
Action(s)

Action(s)

Action(s) Retour

Les fonctions ayant retourner une valeur au code appelant utilise linstruction Return cet effet.

09/08/2011

PHR VB.Net VBNF - 34

Lexcution de programmes externes.


Lappel, par lapplication dveloppe, dun programme excutable dj existant est souvent bien utile. Quil sagisse de lancer un programme ds que la ncessit se prsente et sans intervention de lutilisateur, ou bien dexcuter des fichiers de commandes systmes ventuellement crs par lapplication. Cest lespace de nom Microsoft.VisualBasic, cr pour permettre aux programmeurs VB 6.0 de retrouver bon nombre de leurs outils favoris, qui donne la commande Shell ncessaire lexcution de programmes externes. Cette librairie est rfrence par dfaut dans tout nouveau projet. Afin de se prmunir dventuelles incompatibilits futures, le programmeur doit nutiliser les outils de Microsoft.VisualBasic que lorsquils nont pas de remplaant dans DotNet. Pour la plupart des applications, le programmeur peut mme dsactiver limportation automatique de cette librairie. La dsactivation de limportation automatique de la librairie se rgle dans les proprits du projet, sous longlet Rfrences. Il suffit de dcocher la rfrence Microsoft.VisualBasic.

Pour utiliser une librairie non encore prsente dans un projet, il faut soit lajouter par le menu Projet/Ajouter une rfrence , soit la spcifier en Imports l o elle est ncessaire. Cette deuxime solution est de loin prfrable pour toute librairie dusage occasionnel.
Imports Microsoft.VisualBasic Module MonModule Sub Main() ' Shell("GoSyst.Bat", 1) Shell("Calc.Exe", 1) Shell("Attrib *.*", 1) '

' Lance le fichier de commande GoSyst ' Ouvre la calculette ' Affiche les attributs des fichiers

La commande Shell est une commande asynchrone. Cela signifie quelle nattend pas la fin de lexcution demande pour rendre la main lapplication en cours. Toutefois, une valeur True pour troisime paramtre lui impose d'attendre la fin de la tche lance. Il faut y penser si le bon droulement de lapplication en cours dpend du rsultat de lexcution demande par Shell. Le deuxime paramtre de la commande, dont la valeur dans cet exemple est 1 pour AppWinStyle.NormalFocus, exprime le mode d'affichage de la fentre (rduite dans la barre des tches, normale, taille maximale). Sur certains systmes, il faut dsactiver les paramtres de scurits (sous longlet scurit des proprits du projet) pour que lexcution de Shell soit possible.

Le mot de la fin
Une dernire instruction de contrle utile est celle qui provoque larrt dfinitif du programme, cest linstruction "Fin". Le mot cl End ferme les fichiers ouverts avec Open et provoque larrt inconditionnel de toute lapplication.
Module MonModule Sub Main() End End Sub End Module

' Un programme qui ne fait rien !

09/08/2011

PHR VB.Net VBNF - 35

Les moyens de traitements


Les oprateurs
Laffectation
=

Cette opration, aussi appele assignation, est celle par laquelle une valeur est attribue une variable.
Pi = 3.141592

La concatnation
& et + La concatnation est la mise bout bout de chanes de caractres. Deux symboles & et + sont offerts. Il est prfrable demployer & de sorte ninduire aucune confusion avec laddition arithmtique qui utilise le +. Dim Nom As String = "Pierre" Console.WriteLine("Bon" & "jour " & Nom)

' Affiche Bonjour Pierre

Les oprateurs arithmtiques


^ * / \ Mod + -

Elvation la puissance Multiplication Division relle Division entire Modulo (Reste) Addition Soustraction

X X X X X X X

= = = = = = =

V V V V V V V

^ 2 * 2 / 2 \ 2 Mod 2 + 2 2

si V si V si V si V si V si V si V

= = = = = = =

3, X reoit la valeur 4, X reoit la valeur 5, X reoit la valeur 7, X reoit la valeur 7, X reoit la valeur 8, X reoit la valeur 9, X reoit la valeur

9 8 2.5 3 1 10 7

(32 = 9) (4 * 2 = 8) (5 / 2 = 2.5) (7 \ 2 = 3) (7 (7 \ 2) * 2 = 1) (8 + 2 = 10) (9 - 2 = 7)

Les formes contractes de laffectation Il sagit de la combinaison dun des oprateurs prcdents avec loprateur daffectation ayant pour effet une conomie dcriture. On retrouve l tous les oprateurs arithmtiques, sauf Mod, et loprateur de concatnation. La signification de Variable Oprateur = Valeur est la mme que celle de Variable = Variable Oprateur Valeur.
^= *= /= \= += -= &= V V V V V V V ^= *= /= \= += -= &= 2 3 4 5 6 7 "OK"

est quivalent est quivalent est quivalent est quivalent est quivalent est quivalent est quivalent

V V V V V V V

= = = = = = =

V V V V V V V

^ * / \ + &

2 3 4 5 6 7 "OK"

Les oprateurs relationnels Les oprateurs relationnels, dits aussi oprateurs de comparaisons, sont indispensables la dfinition des critres de choix des alternatives et la dfinition des conditions darrt des itrations logiques. Des expressions utilisant ces oprateurs fournissent des rsultats boolens qui peuvent tre affects des variables de ce type.
< <= > >= = <> Like

Infrieur Infrieur ou gal Suprieur Suprieur ou gal Egal Diffrent de Comme (usage des jokers ? et *)

X X X X X X X

= = = = = = =

V V V V V V V

< 2 <= 2 > 2 >= 2 = 2 <> 2 Like "Pi*"

si V si V si V si V si V si V si V

= = = = = = =

3, X reoit la valeur False 3, X reoit la valeur False 3, X reoit la valeur True 3, X reoit la valeur True 3, X reoit la valeur False 3, X reoit la valeur True "Pierre", X reoit la valeur True

09/08/2011

PHR VB.Net VBNF - 36

Les oprateurs logiques Lorsque les dfinitions des critres dalternatives et des conditions darrt ditrations ne peuvent se suffire dune seule expression relationnelle, les oprateurs logiques permettent den combiner plusieurs. Des expressions utilisant ces oprateurs fournissent des rsultats boolens qui peuvent tre affects des variables de ce type.
Not And Or Xor AndAlso OrElse

Ngation (contraire) Et (les deux) Ou (un OU lautre OU les deux) Ou exclusif (un OU lautre, mais pas les deux) Et aussi Ou sinon

Les rsultats des expressions mettant en uvre les oprateurs logiques sont prdtermins par les tables de vrits. Conventionnellement, la valeur boolenne False est reprsente dans ces tables par 0, et la valeur True est reprsente par 1.
NOT a 0 1 R 1 0 a 0 0 1 1 OR b 0 1 0 1 AND b 0 1 0 1 XOR b 0 1 0 1

R 0 1 1 1

a 0 0 1 1

R 0 0 0 1

a 0 0 1 1

R 0 1 1 0

Soit lexpression (X < 2) reprsente par la lettre a et lexpression (Y >= X) reprsente par la lettre b. Si X est effectivement plus petit que 2, lexpression X < 2 est vraie et elle est reprsente par le chiffre 1 dans la colonne de la lettre a. Si X nest pas plus petit que 2, lexpression est fausse et elle est reprsente par le chiffre 0. Il en est de mme pour lexpression reprsente par b. Le rsultat de lusage de loprateur logique est reprsent de la mme manire dans la colonne de la lettre R. Le tableau montre ainsi, par exemple : Si Si Si Si Si
(X (X (X (X (X < < < < < 2) est faux, a est faux et vaut 0, et Not a est vrai, et donc R vaut 1 2) est faux, et (Y >= X) est faux aussi, lexpression (X < 2) OR (Y >= X) est fausse, et donc R vaut 0 2) est vrai, et (Y >= X) est faux, lexpression (X < 2) OR (Y >= X) est vraie, et donc R vaut 1 2) est vrai, et (Y >= X) est faux, lexpression (X < 2) AND (Y >= X) est fausse, et donc R vaut 0 2) est vrai, et (Y >= X) est vrai, lexpression (X < 2) AND (Y >= X) est vraie, et donc R vaut 1

Plutt que de tenter une mmorisation fastidieuse de ce tableau, mieux vaut sans doute retenir ceci :
Not And Or Xor

Tout ce qui est vrai devient faux, et vice versa Pour que le rsultat dun And soit vrai, il faut que les deux expressions impliques soient vraies Pour que le rsultat dun Or soit vrai, il suffit quune seule des expressions soit vraie Pour que le rsultat dun Xor soit vrai, il faut quune des expressions soit vraie et que lautre soit fausse

Les oprateurs AndAlso et OrElse suivent les mmes rgles que, respectivement, And et Or. Cependant, leurs comportement est optimis et donc quelque peu diffrent lors de lvaluation des conditions qui les employent.
(X < 2) Or (Y >= X) (X < 2) And (Y >= X)

les deux expressions relationnelles sont values dabord, lexpression logique ensuite les deux expressions relationnelles sont values dabord, lexpression logique ensuite

Or dans la premire expression, si (X < 2) est vrai, il nest plus ncessaire dvaluer (Y >= X) car avec loprateur Or, il suffit dun rsultat vrai pour que toute lexpression le soit aussi. De mme, dans la deuxime expression, si (X < 2) est faux, il nest plus ncessaire dvaluer (Y >= X) car avec loprateur And, il suffit dun rsultat faux pour que toute lexpression le soit aussi.
(X < 2) OrElse (Y >= X) la deuxime expression relationnelle nest value que si la premire est fausse (X < 2) AndAlso (Y >= X) la deuxime expression relationnelle nest value que si la premire est vraie.

09/08/2011

PHR VB.Net VBNF - 37

Les oprateurs binaires Les oprateurs binaires permettent les oprations bit bit sur les octets composant les nombres entiers. Ils ne sont applicables quaux numriques de type Byte, Short, Integer et Long.
Not And Or Xor >> <<

Complment 1 (tous les bits sont inverss) Garde les bits valeur 1 dont le vis--vis la valeur 1 Garde tous les bits valeur 1 Garde les bits valeur 1 dont le vis--vis la valeur 0 Dcalage, dun nombre donn de bits, de tous les bits vers la droite (les bits sortants sont perdus) Dcalage, dun nombre donn de bits, de tous les bits vers la gauche (les bits sortants sont perdus)
A 00010111 23 B 00001010 10 Not A 11101000 -24 A And B 00000010 2 A Or B 00011111 31 A Xor B 00011101 29 A >> 2 00000101 5 A << 2 01011100 92

Combinaison Valeur

Les oprateurs binaires de dcalage disposent galement daffectations contractes :


>>= <<= V >>= 3 V <<= 4

est quivalent est quivalent

V = V >> 3 V = V << 4

Ordre dvaluation des expressions et hirarchie des oprateurs Les parenthses ventuelles encadrent dans les expressions des parties qui doivent tre values en premier. Si des expressions combinent plusieurs types doprations, lvaluation commence toujours par la rsolution des oprations arithmtiques. Les oprations relationnelles sont values ensuite et les oprations logiques sont values en dernier. A dfaut de structuration des expressions par lutilisation de parenthses, les oprateurs arithmtiques ont la mme hirarchie quen mathmatique. Par exemple, 3 + 2 * 23 vaut 49, la multiplication tant calcule avant laddition. Les expressions combinant des oprateurs diffrents, mais de mme type et de mme niveau hirarchique, sont values de gauche droite. Par exemple, 2 * 24 / 3 vaut 16 et 3 / 2 * 24 vaut 36.

Les procdures et fonctions intrinsques, et les mthodes


Les procdures et les fonctions intrinsques sont celles livres par les librairies des langages. Encapsules dans des objets, elles en deviennent les mthodes si leur concepteur a permis quelles soient visibles. Seuls quelques exemples illustrent ici ces moyens de traitements. Dautres sont tudis dans ces pages l o leur usage est requis. Le lecteur peut explorer lensemble des outils des librairies de Visual Studio .Net en parcourant les pages de http://msdn.microsoft.com/fr-fr/library/default.aspx ainsi que laide intgre dans son Visual Studio. La fonction CType fournit une valeur qui est le rsultat de la conversion dune valeur qui lui a t donne dans un type de donnes qui lui a t indiqu.
Dim Nombre As String Dim Valeur As Integer Valeur = 12345 Nombre = CType(Valeur, String)

La procdure ReDim ralise lallocation en mmoire de lespace demand pour le tableau qui lui est donn.
ReDim Tab5(2, 2)

La mthode Sort() de la classe Array effectue le tri par ordre croissant du tableau qui lui est donn.
Array.Sort(Tab2)

09/08/2011

PHR VB.Net VBNF - 38

Dclarations des procdures et des fonctions


Tout code excutable doit tre crit lintrieur dune procdure ou dune fonction. La dclaration dune procdure ou dune fonction se compose des parties essentielles suivantes : la dfinition de la porte de la procdure ou fonction la dfinition du type de sous-programme (Sub si procdure ou Function si fonction) la dfinition de son nom (procdures et fonctions sont nommes selon les rgles applicables aux variables) la dfinition de ses arguments la dfinition du type de valeur renvoye (seulement pour la fonction)

Le type du sous-programme, son nom et la dfinition de ses arguments constituent ensemble la signature de la procdure ou fonction. A l'instar des variables, les procdures et les fonctions peuvent tre dclares Private, Public, Protected, Friend, Protected Friend, Shadows et Shared. Ces dclarations de porte ont la mme signification ici que lors de la dclaration des variables. Mais attention, dfaut de dclaration complte, les procdures et fonctions sont Public. On ne peut dfinir une procdure (ou fonction) lintrieur dune autre. Les procdures (ou fonctions) incluses dans des classes et accessibles dans les classes drives ou instancies sont appeles mthodes.
Public Function MaFonction() As Integer Dim X As Integer ' calcul de la valeur de X Return X End Function Public Sub MaSub() Dim X As Integer ' code de la procdure ' End Sub

La fonction sappelle par lusage direct de son nom, cest--dire par usage direct de la valeur renvoye dans une affectation ou une expression. La procdure sappelle par lusage de son nom en dehors de toute expression.
MessageBox.Show(MaFonction()) MaVariable = MaFonction() * 3 MaSub()

Quelques vitamines, dites attributs, peuvent sajouter aux indicateurs de porte. Ce sont les mots Overloads, Overrides, Overridable, NotOverridable, MustOverride et, quoique de nature diffrente, Implements. Overloads Lattribut Overloads indique que la mthode en surcharge une ou plusieurs autres dfinies avec le mme nom dans la mme classe ou dans une classe de base. Quand la surcharge se fait au sein d'une mme classe, les signatures doivent tre diffrentes. Cela signifie notamment que les listes darguments doivent diffrer au niveau de leur nombre d'arguments, de leurs types de donnes ou des deux. Cest cette diffrenciation qui permet au compilateur de distinguer la version utiliser. Et contrairement la redclaration avec Shadows qui peut tre applique nimporte quel objet accessible partir dune classe drive, la surcharge ne concerne que les mthodes. Lattribut Overloads peut tre omis pour des surcharges dfinies dans la mme classe. Toutefois, sil est utilis pour lune, il doit ltre aussi pour les autres. Cet attribut ne peut tre employ conjointement Shadows. Overrides Lattribut Overrides indique que la mthode surdfinit une procdure de mme nom dans une classe de base. Contrairement la surcharge par Overloads, la signature, la porte et le type de valeur de retour doivent ici tre strictement identiques. La surdfinition ne concerne que les mthodes qui doivent en outre, avoir t spcifies Overridable dans la classe de base. Overridable Lattribut Overridable indique que la mthode peut tre surdfinie par une autre dans une classe drive. Par ailleurs, lorquune mthode en surdfinit une autre, Overridable devient son attribut par dfaut.

09/08/2011

PHR VB.Net VBNF - 39

' Shadows, Overloads, Overridable et Overrides Public Class ClsBase Protected Function FB1(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 End Function Protected Function FB2(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 End Function ' La fonction FB3 est explicitement dclare Overridable. Elle peut tre surdfinie Protected Overridable Function FB3(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 End Function End Class Public Class ClsDeriv Inherits ClsBase ' Shadows permet la redclaration de FB1, sans contrainte de respect de signature Shadows Function FB1(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 + 1 End Function ' Overloads permet la surcharge de FB2 sans contrainte de signature dans la classe drive Overloads Function FB2(ByVal N1 As Integer, ByVal N2 As Integer) As Integer Return N1 + N2 End Function ' Overrides permet la redfinition de FB3 dclare Overridable, avec signature identique Protected Overrides Function FB3(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 + 2 End Function End Class

NotOverridable Lattribut NotOverridable semploye uniquement dans une classe drive et indique quune mthode surdfinie ne peut plus ltre dans une classe sous drive. Cest lattribut par dfaut d'une mthode qui nest pas la surdfinition dune autre appartenant une classe de base. MustOverride Lattribut MustOverride indique que la mthode nest pas implmente dans la classe de base et quelle doit ltre dans une classe drive pour que cette classe puisse tre cre. Il ne s'employe que dans une classe abstraite.
' NotOverridable et MustOverride Public MustInherit Class BaseCls
' La classe doit tre dclare MustInherit pour ' permettre la dclaration MustOverride dune ' mthode

Protected Overridable Function FB4(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 End Function Protected MustOverride Function FB5(ByVal N1 As Byte, ByVal N2 As Byte) As Byte ' pas de code, ni de End Function ' End Function End Class

09/08/2011

PHR VB.Net VBNF - 40

Public Class DervCls Inherits BaseCls ' FB4 et FB5 surdfinies ici ne peuvent plus tre surdfinies dans une classe ' qui serait drive Protected NotOverridable Overrides Function FB4(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 End Function Protected NotOverridable Overrides Function FB5(ByVal N1 As Byte, ByVal N2 As Byte) As Byte Return N1 + N2 End Function End Class

Implements Nom_Interface.Nom_Mthode Lattribut Implements, qui ne scrit pas dans la dfinition de la porte, mais bien la suite de la ligne de dfinition, indique que cette mthode implmente un homologue dfini par une interface. Lusage des mots cls Interface et Implements sera tudi en temps opportun.
Public Interface Comparable Function Compare(ByVal Obj As Object) As Integer End Interface Public Class UneClasse Implements Comparable Public Function Compare(ByVal Obj As Object) As Integer Implements Comparable.Compare ' code de la fonction End Function End Class

Dclarations des arguments des procdures, fonctions et mthodes Un argument de procdure (ou fonction), et donc de mthode, dfinit une variable utilisable dans cette mthode pour y traiter les donnes qui lui sont passes en paramtres lors de lappel. Cette variable est donc locale et bnficie de leffet de masque. Toutefois, bien quune variable dfinie en dclaration dargument ne soit jamais accessible de lextrieur de sa procdure (ou fonction), sa modification peut changer la valeur de la variable correspondante dans le code appelant. Les spcifications ByRef et ByVal et le type (Valeur ou Rfrence) de la variable dterminent la scurit des donnes transmises. ByVal Un argument dclar ByVal est strictement local sil est dun type Valeur. Cest une copie de la variable d'origine qui est transmise et sa modification n'affecte en rien la variable d'origine. Sil sagit dun type Rfrence, toute modification de la variable dans la procdure (ou fonction) modifie galement la variable utilise dans le code appelant. Cest la spcification par dfaut. Le type String se comporte comme un type Valeur.
Private Sub ValByVal(ByVal a As Byte) a = a * 2 End Sub
' Multiplie largument par 2 ' La variable dorigine sera inchange

Private Sub ChaineByVal(ByVal Ch As String) ' Concatne "+++" largument Ch = Ch & "+++" ' La variable dorigine sera inchange End Sub Private Sub RefByVal(ByVal T() As Byte) T(2) = T(2) * 2 End Sub

' Multiplie un lement de largument par 2 ' La variable dorigine sera change

09/08/2011

PHR VB.Net VBNF - 41

Private Sub Test() Dim s As String = "AZE" Dim x As Byte = 5 Dim T() As Byte = {10, 11, 12, 13, 14, 15} Console.WriteLine("Av.ValByVal X = " & x) ValByVal(x) Console.WriteLine("Ap.ValByVal X = " & x) Console.WriteLine("Av.ChaineByVal s = " & s) ChaineByVal(s) Console.WriteLine("Ap.ChaineByVal s = " & s) Console.WriteLine("Av.RefByVal T(2) = " & T(2)) RefByVal(T) Console.WriteLine("Ap.RefByVal T(2) = " & T(2)) End Sub

' Affiche : Av.ValByVal X = 5 ' Affiche : Ap.ValByVal X = 5 ' Affiche : Av.ChaineByVal s = AZE ' Affiche : Ap.ChaineByVal s = AZE ' Affiche : Av.RefByVal T(2) = 12 ' Affiche : Ap.RefByVal T(2) = 24

ByRef Si largument est dclar ByRef, alors la procdure (ou fonction) reoit l'adresse mmoire de la variable et ce, quel que soit le type de cette variable. Dans ce cas, toute modification de la variable dans la procdure (ou fonction) entrane la modification de la variable d'origine. Il faut tre prudent quant aux manipulations effectues sur cette variable l'intrieur de la procdure ou de la fonction.
Private Sub ValByRef(ByRef a As Byte) a = a * 2 End Sub Private Sub RefByRef(ByRef T() As Byte) T(2) = T(2) * 2 End Sub Private Sub Test() Dim x As Byte = 5 Dim T() As Byte = {10, 11, 12, Console.WriteLine("Av.ValByRef ValByRef(x) Console.WriteLine("Ap.ValByRef Console.WriteLine("Av.RefByRef RefByRef(T) Console.WriteLine("Ap.RefByRef End Sub
' Multiplie largument par 2 ' La variable dorigine sera change

' Multiplie un lement de largument par 2 ' La variable dorigine sera change

13, 14, 15} X = " & x) X = " & x) T(2) = " & T(2)) T(2) = " & T(2))

' Affiche : Av.ValByRef X = 5 ' Affiche : Ap.ValByRef X = 10 ' Affiche : Av.RefByRef T(2) = 12 ' Affiche : Ap.RefByRef T(2) = 24

Optional Avec ByVal et ByRef, Optional et ParamArray constituent les quatre spcifications des arguments des procdures (ou fonctions). Le mot Optional indique que l'argument qu'il prcde est facultatif. Cet argument peut donc tre absent lors de lappel de la procdure (ou fonction). Sa valeur par dfaut doit tre indique lors de la dclaration des arguments. Quand plusieurs arguments sont facultatifs, l'emploi de virgules lors de l'appel permet d'en omettre certains et pas d'autres. Les arguments sont valus selon leur ordre de dfinition. Il est toutefois possible de dsigner explicitement les arguments par leur nom lors de l'appel. Les arguments ainsi utiliss sont dits arguments nomms. Cette facult, qui n'est pas rserve aux arguments facultatifs, permet de passer les variables dans un ordre diffrent de celui de la dfinition.
Private Sub Optionel(ByVal X As Byte, Optional ByVal Y As String = "Y absent") Console.WriteLine("Optionel " & X & " / " & Y) End Sub Private Sub Nommes(ByVal X As Byte, Optional ByVal Y As String = "Y", Optional ByVal Z As String = "Z") Console.WriteLine("Nommes " & X & " / " & Y & " / " & Z) End Sub

09/08/2011

PHR VB.Net VBNF - 42

Private Sub Test() ' Optionel(1) ' Optionel(2, "Pierre") ' Nommes(3, Z:="Pierre") ' Nommes(4, , "Pierre") Nommes(Z:="Pierre", Y:="Bill", X:=5)' End Sub

Affichage Affichage Affichage Affichage Affichage

de de de de de

Optionel Optionel Nommes : Nommes : Nommes :

: Optionel : Optionel Nommes 3 / Nommes 4 / Nommes 5 /

1 / Y absent 2 / Pierre Y / Pierre Y / Pierre Bill / Pierre

ParamArray Cette spcification, qui doit tre la dernire de la liste darguments, signifie que largument qui suit est facultatif et que sil est prsent, il est un tableau d'arguments du type prcis et de taille indtermine. Un argument ParamArray est toujours pass l'aide de ByVal.
Private Sub ParamArra(ByVal ParamArray PX() As Integer) Dim XX As Integer For Each XX In PX Console.Write(XX & " / ") Next XX Console.WriteLine() End Sub Private Sub Test() Dim T () As Integer = {101, 102, 103, 104} ' Naffiche rien dans ParamArra ParamArra() ' Affichage dans ParamArra : 110 / 120 / 130 / ParamArra(110, 120, 130) ' Affichage dans ParamArra : 101 / 102 / 103 / ParamArra(T(0), T(1), T(2)) ' Affichage de tous les lments de T ParamArra(T) End Sub

Type de donne des arguments Indpendamment des spcifications ByVal, ByRef, Optional et ParamArray, les arguments doivent tre typs, c'est--dire que leur type de donne doit tre explicit. Les arguments peuvent Boolean, Byte, Char, Date, Decimal, Double, Integer, Long, Object, Short, Single ou String ou bien le nom d'une numration, d'une structure, d'une classe ou d'une interface. Valeur de retour des fonctions Le type de la valeur retourne par une fonction doit tre prcis dans la ligne de dfinition de la fonction. Les fonctions utilisent linstruction Return pour simultanment envoyer le rsultat de leur travail au code appelant et quitter la fonction.
Public Function MaFonction() As Byte ' code de la fonction Return 10 ' code non excut aprs la sortie inconditionnelle de la fonction

Une ancienne mthode consiste affecter le rsultat au nom de la fonction. Cette opration ne provoque pas la sortie de la fonction. Le rsultat nest effectivement transfr qu la fin de la fonction ou lors dune sortie force par Exit Function.
Public Function MaFonction() As Byte ' code de la fonction MaFonction = 10 ' code encore excut avant la sortie de la fonction

Lors dune sortie force par Exit Function, si le nom de la fonction na subi aucune affectation, la fonction retourne une valeur nulle selon le type de la valeur de retour : 0 pour les numriques, Nothing pour les objets, .

09/08/2011

PHR VB.Net VBNF - 43

La rcursivit
La rcursivit en informatique est la proprit qua une fonction ou une procdure de sappeler elle-mme. Cette technique de programmation est permise en VB.Net. Lusage de la rcursivit est particulirement indiqu pour les rsolutions de problmes ncessitant un nombre inconnu ditrations. Toutefois, tout algorithme rcursif peut tre transform en algorithme itratif. Tout appel rcursif doit tre programm dans une alternative qui contient la condition darrt de la rcursivit, ou dans une boucle logique dont la condition darrt est aussi la condition darrt de la rcursivit. Il y a lieu de distinguer la rcursivit directe dans laquelle un sous-programme sappelle lui-mme et la rcursivit croise dans laquelle un sous-programme en appelle un autre qui son tour appelle celui qui la appel.

Par exemple, le calcul de la somme des N premiers entiers positifs. Non rcursif
Private Function SommeN(ByVal SN As Integer) As Integer Dim Som, i As integer Som = 0 For i = SN To 1 Step -1 Som = Som + i Next i Return Som End Function

Rcursif
Private Function SommeN(ByVal SN As Integer) As Integer If SN = 1 Then Return 1 Else Return (SN + SommeN(SN - 1)) End If End Function

09/08/2011

PHR VB.Net VBPV - 1

Bases de la programmation visuelle et vnementielle en VB.Net

09/08/2011

PHR VB.Net VBPV - 2

Tables des matires des pages VBPV


Programmation oriente objet, visuelle et vnementielle .................................................................................................5 Une application Windows (Form et Button) ..................................................................................................................6 Deux proprits pour commencer : Name et Text .................................................................................................9 Proprits gnralement associes la proprit Text : BackColor, ForeColor et Font..............................10 Quelques proprits communes la plupart des composants visuels ....................................................................10 Quelques mthodes communes la plupart des composants visuels .....................................................................11 Quelques vnements communs la plupart des composants visuels ...................................................................11 Dbogage et gestion des erreurs .......................................................................................................................................13 Le pas pas ............................................................................................................................................................14 Le point darrt.......................................................................................................................................................14 Lvaluation des variables en cours dexcution....................................................................................................15 Linsertion denvois de messages...........................................................................................................................15 La gestion des erreurs.............................................................................................................................................17 Gnrer des erreurs.................................................................................................................................................18 Lessentiel des composants visuels et de leurs membres .................................................................................................19 Le formulaire : Form .............................................................................................................................................19 Proprits .....................................................................................................................................................19 Mthodes......................................................................................................................................................21 Evnements ..................................................................................................................................................22 Membres communs la plupart des composants visibles ......................................................................................22 Proprits .....................................................................................................................................................22 Mthode .......................................................................................................................................................23 Evnements ..................................................................................................................................................23 Ltiquette : Label ...............................................................................................................................................23 Proprits .....................................................................................................................................................23 La bote de texte : TextBox .................................................................................................................................24 Proprits .....................................................................................................................................................24 Mthodes......................................................................................................................................................25 Evnement....................................................................................................................................................25 La case cocher : CheckBox ...............................................................................................................................25 Proprits .....................................................................................................................................................25 Evnements ..................................................................................................................................................25 Le bouton radio : RadioButton .........................................................................................................................26 Les groupes dobjets : GroupBox et Panel........................................................................................................27 Diffrences essentielles................................................................................................................................27 Ltiquette hyperlien : LinkLabel ......................................................................................................................27 La bote de liste : ListBox ..................................................................................................................................28 Proprits .....................................................................................................................................................28 Mthodes......................................................................................................................................................29 Evnement....................................................................................................................................................29 Quelques exemples ......................................................................................................................................29 La liste de cases cocher : CheckedListBox ...................................................................................................30 La liste droulante : ComboBox ............................................................................................................................30 La liste de visualisation : ListView ....................................................................................................................30 Proprits .....................................................................................................................................................30 Mthodes......................................................................................................................................................32 Evnements ..................................................................................................................................................32 Quelques exemples ......................................................................................................................................32 Les vues en arborescence : TreeView .................................................................................................................34 Proprits .....................................................................................................................................................34 Mthodes......................................................................................................................................................34 Evnment....................................................................................................................................................35 Lecture dun TreeView ................................................................................................................................35 Le calendrier mensuel : MonthCalendar ..........................................................................................................36 Le slectionneur de date : DateTimePicker ....................................................................................................36 La bote image : PictureBox ..........................................................................................................................37 Le diviseur : Splitter........................................................................................................................................38

09/08/2011

PHR VB.Net VBPV - 3

Une ralisation .............................................................................................................................................38 Son code.............................................................................................................................................38 Son rsultat ........................................................................................................................................38 Le contrle onglets : TabControl ...................................................................................................................39 Le menu : MainMenu et MenuStrip ..............................................................................................................40 La minuterie : Timer ............................................................................................................................................41 Proprits .....................................................................................................................................................41 Mthodes......................................................................................................................................................41 Evnement....................................................................................................................................................41 Exemple .......................................................................................................................................................41 Les botes de dialogue ......................................................................................................................................................42 Louverture de fichiers : OpenFileDialog ......................................................................................................42 Proprits .....................................................................................................................................................42 Mthode .......................................................................................................................................................43 Exemple .......................................................................................................................................................43 Lenregistrement de fichiers : SaveFileDialog ..............................................................................................43 Lexplorateur de dossiers : FolderBrowserDialog .......................................................................................43 Les polices de caractres : FontDialog .............................................................................................................44 Les couleurs : ColorDialog ..............................................................................................................................44 Limpression des documents ..................................................................................................................................45 Le moteur dimpression : PrintDocument....................................................................................................45 La mise en page : PageSetupDialog.............................................................................................................47 La slection de limprimante : PrintDialog..................................................................................................47 La fentre de prvisualisation : PrintPreviewDialog....................................................................................47 Le composant de prvisualisation : PrintPreviewControl ............................................................................47 Exemple rcapitulatif ...................................................................................................................................47 Programmation multi formulaires.....................................................................................................................................49 Louverture de formulaires secondaires .................................................................................................................49 Le passage de donnes entre formulaires ...............................................................................................................49 LInputBox lancienne.........................................................................................................................................55 Rsum des modes de communications abords....................................................................................................56 Lexploitation des mmoires de masse.............................................................................................................................57 Les dossiers ............................................................................................................................................................57 Liste des units.............................................................................................................................................57 Liste des dossiers dune unit ......................................................................................................................57 Liste des fichiers dun dossier......................................................................................................................57 Liste des sous dossiers et fichiers dun dossier ............................................................................................57 Crer un dossier ...........................................................................................................................................58 Copier un dossier .........................................................................................................................................58 Dplacer un dossier......................................................................................................................................58 Renommer un dossier...................................................................................................................................58 Supprimer un dossier ...................................................................................................................................58 Les fichiers .............................................................................................................................................................59 Crer un fichier ............................................................................................................................................59 Copier un fichier ..........................................................................................................................................59 Dplacer un fichier.......................................................................................................................................59 Renommer un fichier ...................................................................................................................................59 Supprimer un fichier ....................................................................................................................................59 Cration, enregistrement et lecture dun fichier texte ..................................................................................60 Cration, enregistrement et lecture dun fichier de donnes accs squentiel ..........................................61 Cration, enregistrement et lecture dun fichier de donnes accs alatoire.............................................62 Les modes douvertures .....................................................................................................................62 Les types daccs ...............................................................................................................................62 Tableau rcapitulatif des associations permises du mode douverture et du type daccs ................62 Quelques membres de la classe FileStream.................................................................................62 Lcriture et la lecture du fichier .......................................................................................................63 Exemple complet ...............................................................................................................................64 La protection des donnes des fichiers lors des accs simultans .....................................................70 Cration, enregistrement et lecture dun fichier binaire...............................................................................72 Inventaire des principaux outils concernant les dossiers et les fichiers .................................................................75

09/08/2011

PHR VB.Net VBPV - 4

Mthodes communes des classes Directory et File......................................................................................75 Proprits communes des classes DirectoryInfo et FileInfo ........................................................................75 Mthodes communes des classes DirectoryInfo et FileInfo.........................................................................75 Mthodes spcifiques de la classe Directory................................................................................................75 Proprits spcifiques de la classe DirectoryInfo ........................................................................................75 Mthodes spcifiques de la classe DirectoryInfo.........................................................................................75 Mthodes spcifiques de la classe File.........................................................................................................76 Proprits spcifiques de la classe FileInfo..................................................................................................76 Mthodes spcifiques de la classe FileInfo ..................................................................................................76 La classe Stream...........................................................................................................................................77 Proprits et mthodes de la classe StreamWriter .......................................................................................77 Mthodes de la classe StreamReader ...........................................................................................................77 Mthodes de la classe BinaryWriter ............................................................................................................77 Mthodes de la classe BinaryReader............................................................................................................78

09/08/2011

PHR VB.Net VBPV - 5

Programmation oriente objet, visuelle et vnementielle


Les priphriques dentres ont toujours t des gnrateurs dvnements en ce sens quils informent le systme de toute arrive dinformations. Mais le concept de lvnementiel tend le champ de linformation au dl des donnes entrant dans le systme. Les vnements sont aussi, par exemple, le dplacement du curseur de la souris, le clic sur un objet, louverture ou la fermeture dune fentre, lenfoncement ou le relchement dune touche du clavier. Lvnement est la notion de base de cette programmation qui sorganise, non plus seulement en fonction de menus rigides en cascades, mais aussi en fonction dvnements dont certains sont invisibles pour lutilisateur. Le programmeur dispose ainsi dune plus vaste panoplie de dtection des besoins de lutilisateur. Tous les vnements sont dtects par des objets. Presque tous les objets visibles sont dtecteurs dvnments. Certains objets sont gnrateurs dvnements en ce sens quils dtectent des vnements quils sont eux-mmes entrain de produire (la fentre dtecte lvnement de son ouverture). Le programmeur utilise ces vnements pour dclencher des traitements linsu de lutilisateur, sans lui donner loccasion dintervenir. La programmation visuelle permet la mise en place aise dobjets dtecteurs dvnements et la dfinition des codes des traitements appropris aux vnements dtects compte tenu des objectifs des applications. La notion de programmation visuelle tient essentiellement dans les fonctionnalits offertes par les compilateurs et environnements de dveloppements. Ds lors quon aborde les aspects visuels et vnementiels de la programmation, on est dans le monde de lobjet. De plus en .Net, "tout est objet". Il convient cependant de distinguer cette programmation base sur lassociation visible des objets et des vnements, de la programmation oriente objet (POO). La programmation visuelle est la couche superficielle de la POO destine au dveloppement rapide dapplications pour environnements graphiques dexploitation tels que Windows. La programmation oriente objet est la couche profonde o sont crs notamment, les outils et fonctions de la programmation visuelle. Alors que les structures mises en place par les programmeurs dans les anciens langages comme le Quick Basic, le Pascal, le C, le Cobol, , contenaient uniquement des donnes, les structures de la POO quant elles contiennent non seulement des donnes, mais galement les fonctions ncessaires leur traitement. Il faut ici considrer "donnes" au sens le plus large : ces structures sont notamment des descriptions dobjets visuels avec leurs variables (proprits), leurs traitements (mthodes) et leurs vnements. Ces objets visuels sont aussi appels composants, ou contrles. Les pages qui suivent concernent essentiellement les aspects visuels du dveloppement sous VB.Net. Elles illustrent lusage de la plupart des composants offerts et diverses fonctionnalits. Elles sont aussi loccasion daborder quelques bonnes pratiques de la programmation. Ltude de la POO : elle sera dtaille ensuite.

La fentre elle-mme est dtectrice dvnements tels que le clic, le double-clic,

La fentre est aussi dtectrice dvnements quelle gnre tels que son ouverture, son activation, sa fermeture, Les boutons sont des dtecteurs dvnements.

09/08/2011

PHR VB.Net VBPV - 6

Une application Windows (Form et Button)


Une premire application Windows est idale pour tudier lusage du Form et du Button, ainsi que quelques points importants de la programmation visuelle sous lenvironnement VB.Net. Au dpart, VB.Net tant charg, il sagit de faire le choix de crer un Nouveau projet. Un premier formulaire souvre alors et il ne faut pas accepter les informations proposes par dfaut, mais plutt le complter avec des informations pertinentes. Outre de choisir le type de projet et son modle, il faut dsigner lendroit de stockage des fichiers, le nom du dossier et le nom de la solution, c'est--dire le nom de lapplication.
Types de projets VB en ce qui nous concerne Modles Application Windows Nom du dossier Emplacement du dossier Nom de lapplication Autoriser la cration du dossier Sauf sil existe dj

Aprs la validation de ces informations, VB.Net prsente lenvironnement de travail dj observ. Les diffrents points des menus et outils divers sont abords lorsquils savrent ncessaires. Pour linstant, il importe de savoir comment obtenir la bote outils (menu Affichage/Bote outils ou bien par le bouton mis en vidence ci-dessous), et o nommer les objets utiliss dans lapplication.

Les fichiers de la solution dont les Rfrences et le Form

Cliquer ce bouton pour faire apparatre la bote outils.

Bote outils Les composants visuels

Cette fentre prsente les proprits de lobjet slectionn. Il faut lutiliser pour nommer les objets visuels ds quils sont dposs. Cest ici aussi que sont nomms significativement les Forms et les fichiers.

09/08/2011

PHR VB.Net VBPV - 7

La slection du fichier Form1.vb dans lexplorateur de solution provoque laffichage du bouton qui permet laccs la feuille de code.

Comme dj observ prcdemment, dentre de jeu la feuille de code propose lcriture dune classe. Cela signifie que lapplication compose du Form et de son code sera une instance de cette classe lors de lexcution, c'est--dire un objet au sens de la POO. Cette classe est Public et porte le nom du formulaire. Elle hrite de Form, de la collection des Forms, de la librairie System.Windows. Cet hritage est ralis dans le fichier Form1.Designer.vb crit par le Concepteur Windows Form. Mais ces aspects ne sont pas pertinents pour linstant. En revenant lcran prcdent par longlet [Design] et, aprs slection du Form, il convient de lui donner un nom significatif dans la fentre des proprits, soit FBase pour cette application. Ne pas confondre nom de fichier et nom dobjet ! Tous deux ont leur importance et mritent de recevoir un nom reprsentatif de leur rle dans le projet. Les noms attribus aux objets sont directement utiles dans le code et mieux ils sont reprsentatifs de lobjet, et plus facilement ils sont retrouvs par le programmeur parmi la multitude dobjets que peuvent contenir certaines applications.

Le fichier Form1.vb tant slectionn dans lexplorateur de solutions, il est possible den changer le nom dans la fentre des proprits.

Le Form tant slectionn par un clic dans longlet [Design], il est possible den changer le nom dans la fentre des proprits.

Il est galement permis de renommer le formulaire directement dans la feuille de code.

09/08/2011

PHR VB.Net VBPV - 8

Sauf dfinition explicite, et dfaut dune procdure Main() dans un module, cest le premier formulaire (Form1) qui est le matre de lapplication, cest lobjet de dmarrage. Ds lors quil est renomm FBase, par exemple, ou simplement que le dveloppement du projet na pas dbut par le formulaire douverture, il convient de dsigner lobjet de dmarrage dans les proprits du projet (menu Projet/Proprits du projet ). Cest aussi loccasion de supprimer limportation automatique de la librairie Microsoft.VisualBasic qui nest idalement utilise quen cas de besoins par la commande Imports.

Pour continuer cette premire application, il faut adapter la taille du formulaire, donner le texte de sa barre de titre (proprit Text), y placer un bouton, le nommer et lui attribuer le texte qui convient.

Aprs le choix dun composant dans la bote outils (par un clic), sa mise en place sur le formulaire, lattribution de son nom dans la fentre des proprits et le rglage de sa proprit Text, la programmation visuelle est termine. Il faut maintenant passer la programmation vnementielle. Il faut pour cela retourner la feuille de code et utiliser ses listes droulantes. Celle de gauche permet le choix de lobjet qui doit ragir un vnement, et celle de droite permet le choix de lvnement auquel doit rpondre le code. La liste de droite propose les vnements appropris lobjet slectionn gauche.

09/08/2011

PHR VB.Net VBPV - 9

Et voici la procdure vnementielle en place. Le nom de lvnement associ au nom du bouton est visible sous deux formes : BFin_Click est le nom de la procdure et BFin.Click est le nom de lvnement. Cest le mot cl Handles qui ralise ici lassociation entre la procdure et lvnement. Il ne manque plus que le code.

Il faut donc, pour parachever lapplication, crire le code de la procdure vnementielle et complter la feuille de code par les Imports ventuels et les dclarations doptions. Voici le programme complet :
Option Explicit On Option Strict On
' ' ' ' Obligation de dclarer toutes les variables L'interdiction des conversions implicites des donnes oblige le programmeur utiliser des fonctions de conversions, ce qui amliore la scurit des donnes, mais peut alourdir le code

Public Class FBase Private Sub BFin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BFin.Click ' Voici le code vnementiel de ce premier programme End End Sub End Class

Et lexcution, un clic du bouton Fin arrte lapplication :

Ce premier programme est compos de deux objets visuels (un Form et un Button) et dune procdure vnementielle. Quelques particularits de ces composants mritent dtre observes. Les proprits, mthodes et vnements dun objet sont gnriquement appels membres de lobjet. Ils sont trs nombreux et leur tude systmatique ne prsente gure dintrts. Ltude de tous les composants visuels proposs est galement fastidieuse et superflue puisquils sont presque tous dun usage trs semblable au niveau de la programmation. Cest pourquoi ces pages ne prsentent quun chantillonnage de ces composants et pour chacun, quelques membres de chaque sorte, parmi les plus employs. De plus, lorsque des membres ont le mme nom dans plusieurs objets, ils ont la mme signification et les explications les concernant ne sont pas rptes. Cest ainsi quune des deux proprits utilises dans le programme prcdent se retrouve dans tous les objets et lautre dans tous les objets disposant dune zone daffichage de texte. Ces proprits sont Name et Text.

Deux proprits pour commencer : Name et Text


Name Tous les objets doivent tre nomms dune faon reprsentative de leur rle dans lapplication. Il convient en outre de prfixer le nom dune ou deux lettres rappelant le type de lobjet. Cest pourquoi le formulaire de lapplication prcdente a t nomm FBase (avec F comme Form) et le bouton a t nomm BFin (avec B comme Button). Lavantage de cette nomenclature est de permettre la diffrenciation claire des objets dans la liste droulante de gauche lorsquon se propose dcrire leur code vnementiel. Il est ainsi facile de faire la diffrence entre une TextBox nomme TNomPers contenant le nom dune personne et une ListBox nomme LBNomPers contenant les noms de toutes les personnes.

09/08/2011

PHR VB.Net VBPV - 10

Text Presque tous les objets disposant dune zone daffichage de texte ont une proprit Text. Cest elle qui contient le texte affich. Pour un Button, ce texte est celui qui est affich sur le bouton. Pour le Form, cest le texte de la barre de titre. Pour un TextBox, cest son contenu.

Proprits gnralement associes la proprit Text : BackColor, ForeColor et Font


BFin.BackColor = System.Drawing.Color.White ' Couleur du fond ' Couleur du texte BFin.ForeColor = System.Drawing.Color.Black BFin.Font = New System.Drawing.Font("Courier New", 10) ' Police Courier New
' de taille 10

Attention, ces mmes proprits rgles au niveau du Form naffectent pas la barre de titre. A tester au cas par cas. Il a dj t question des Imports dans ce cours. Voici un exemple : le code prcdent peut scrire plus simplement si la dclaration Imports System.Drawing est place la suite des lignes doptions.
BFin.BackColor = Color.White BFin.ForeColor = Color.Black BFin.Font = New Font("Courier New", 10)
' Affectation dune proprit ' Instanciation dun objet ' Font

Il faut noter quil nest pas possible dans ce cas dutiliser lconomiseur de dactylographie With parce que System.Drawing nest pas un objet ou une variable de type structure mais un espace de noms, une librairie.

Quelques proprits communes la plupart des composants visuels


Location Cette proprit contient les coordonnes en pixels du coin suprieur gauche dun objet par rapport au coin correspondant de lobjet qui le contient. Ces coordonnes sont accessibles en lecture via les deux sous proprits X et Y et modifiables par le rglage des proprits Left et Top exposes ci-aprs. La ligne de code suivante affiche les coordonnes du bouton BFin du programme prcdent, exprimes en pixels et par rapport au coin suprieur gauche du formulaire FBase.
MessageBox.Show(CType(BFin.Location.X, String) & " " & CType(BFin.Location.Y, String))

Left et Top Ces proprits contiennent respectivement la distance en pixels du bord gauche et la distance du bord suprieur dun objet par rapport aux bords correspondants de lobjet qui le contient. En exprimant ces deux distances, la ligne de code suivante est tout fait quivalente la prcdente.
MessageBox.Show(CType(BFin.Left, String) & " " & CType(BFin.Top, String))

Width et Height Ces proprits contiennent respectivement la largeur et la hauteur de lobjet exprimes en pixels. La ligne de code suivante affiche la largeur et la hauteur du bouton BFin.
MessageBox.Show(CType(BFin.Width, String) & " " & CType(BFin.Height, String))

Enabled Cette proprit, qui peut tre affecte dune des valeurs True et False, ne cache pas lobjet mais en autorise ou interdit lutilisation.
BFin.Enabled = True BFin.Enabled = False
' BFin utilisable ' BFin inutilisable

09/08/2011

PHR VB.Net VBPV - 11

Visible La proprit Visible permet de montrer ou cacher un objet volont selon la valeur quon lui affecte : True ou False. La premire ligne de code ci-dessous montre le bouton BFin du formulaire FBase et la suivante lefface. Par dfaut, un composant visuel est toujours visible.
BFin.Visible = True BFin.Visible = False
' BFin visible ' BFin invisible

Quelques mthodes communes la plupart des composants visuels


Hide et Show Les mthodes Hide et Show permettent respectivement de cacher et monter lobjet. Elles produisent ensemble le mme effet que la proprit Visible selon la valeur qui lui est affecte.
BFin.Hide() BFin.Show() Me.Hide()
' ' ' ' BFin invisible BFin visible Le formulaire actif devient invisible. A ne pas faire !

Focus et Select Cette mthode donne le focus lobjet, c'est--dire quelle le rend actif, lui donne la main. Cependant cette mthode ne peut pas toujours sexcuter. Elle est dpendante du contexte dexcution et elle peut sexcuter quand la proprit en lecture seule CanFocus du contrle a la valeur True. La mthode Select est une bonne alternative la mthode Focus. Cest par cette mthode que le programmeur peut imposer lencodage dans une TextBox plutt que dans une autre, ou rendre actif un bouton par dfaut.
BFin.Focus() TUneTextBox.Select()
' Cest BFin qui a la main ' Cest TUneTextBox qui a la main

ToString Cette mthode fournit des informations affichables au sujet de lobjet concern.
MessageBox.Show(BFin.ToString) MessageBox.Show(BFin.GetType.ToString) MessageBox.Show(Me.ToString) MessageBox.Show(Me.BackColor.ToString)
' Affiche : System.Windows.Forms.Button, Text:Fin ' Affiche : System.Windows.Forms.Button ' Affiche : PremierProgramme.FBase, Text:Premier programme ' Affiche : Color [White]

Quelques vnements communs la plupart des composants visuels


GotFocus et LostFocus Ces vnements se produisent quand lobjet reoit le focus ou le perd. Lorsquune mthode Focus est excute sur un objet, il reoit le contrle qui est t dun autre objet. Ce dernier dtecte lvnement LostFocus, et ensuite lobjet qui reoit le focus dtecte lvnement GotFocus.
BFin.Select()
' Lvnement GotFocus est ensuite dtect ' par BFin

Click Cet vnement se produit quand un objet est cliqu. Pour la plupart des objets, cela revient lui donner le contrle sil ne la pas encore et dans ce cas, Click est dtect avant GotFocus.

09/08/2011

PHR VB.Net VBPV - 12

KeyPress Cet vnement se produit quand une touche du clavier est enfonce. Lvnement fournit alors le caractre de la touche par la proprit KeyChar de son paramtre de type KeyPressEventArgs. Si lobjet possde une zone daffichage du caractre press au clavier, cest notamment le cas de la TextBox, le caractre est plac dans cette zone lors du relchement de la touche.
Private Sub BFin_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles BFin.KeyPress ' Si x est la touche presse, MessageBox.Show(e.KeyChar) End Sub ' alors affichage : x

Lvnement KeyPress ne se produit qu' l'appui d'un caractre du clavier, mais non lors de l'appui d'une touche de contrle ou d'une touche de fonction. Pour rpondre l'action d'une de ces touches, il faut utiliser l'vnement KeyDown. La frappe d'un caractre provoque l'vnement KeyPress qui est aussitt suivi de l'vnement KeyDown. Lors de l'appui d'une touche de contrle ou de fonction, seul l'vnement KeyDown est mis. La reconnaissance de la touche s'obtient par comparaison de la valeur de e.KeyCode avec une des valeurs d'une longue numration de touches possibles. MouseMove Cet vnement se produit lorsque le curseur de la souris est dplac la surface de lobjet. Lvnement fournit les coordonnes du curseur par les proprits X et Y de son paramtre de type MouseEventArgs.
Private Sub BFin_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles BFin.MouseMove MessageBox.Show(CType(e.X, String) & " " & CType(e.Y, String)) ' Position du curseur End Sub

Lvnement MouseMove se produit chaque dplacement du curseur, aussi imperceptible soit-il. Son usage, qui accapare fortement le systme, nest que rarement requis. Les vnements MouseEnter et MouseLeave suffisent dans la plupart des cas o il nest pas ncessaire de connatre les coordonnes du curseur. MouseEnter Cet vnement se produit lorsque le curseur de la souris atteint la surface de lobjet.
Private Sub BFin_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles BFin.MouseEnter ' End Sub

MouseLeave Cet vnement se produit lorsque le curseur de la souris quitte la surface de lobjet.
Private Sub BFin_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles BFin.MouseLeave ' End Sub

09/08/2011

PHR VB.Net VBPV - 13

Dbogage et gestion des erreurs


Le dbogueur Visual Studio .NET est un puissant outil grce auquel il est possible dobserver le comportement du programme au moment de l'excution et de dterminer l'emplacement des erreurs. Il comprend les fonctionnalits qui sont intgres dans les langages de programmation et les bibliothques qui leur sont associes. Avec le dbogueur, l'excution du programme peut tre arrte (suspendue) pour permettre au programmeur d'examiner le code, de lexcuter pas pas, et den valuer les variables. Il nest pas question de faire ici un cours dtaill sur lusage du dbogueur, mais quelques fonctionnalits sont des plus utiles en cours de dveloppement : Le fonctionnement en pas pas Le point darrt Lvaluation des variables en cours dexcution Linsertion denvois de messages

Lenvironnement Visual Studio .Net effectue lanalyse du code en cours de dactylographie. Pendant cette analyse, deux aides essentielles sont actives. La premire, cest laide en ligne qui informe le programmeur sur la syntaxe et les paramtres fournir pour linstruction commence. La seconde, cest le soulignement de la plupart des fautes de syntaxe, la manire du correcteur orthographique du traitement de textes.

Le soulignement bleu ondul en cours de frappe avise le programmeur que son instruction est errone ou incomplte. Dans cet exemple, le nom de lobjet est incorrect.

Le nom de lobjet a t corrig, mais linstruction est toujours incomplte. Un caractre reste soulign. Ds la frappe du point, saffiche la liste des vitamines plausibles pour ce cas.

Cest une proprit de lobjet qui est choisie ici. Une aide contextuelle informe sur son type et sur son rle. Mais linstruction est toujours incomplte. Un caractre reste soulign.

Linstruction est complte, mais le programmeur a oubli quune valeur littrale alphanumrique sencode entre guillemets. Il y a faute de syntaxe. Un soulignement subsiste.

A partir de la version 2005 de Visual Studio, l'environnement signale galement des anomalies qui ne portent pas forcment prjudice au bon fonctionnement du programme. Ces warnings sont galement souligns d'un trait ondul, mais celui-ci est de couleur verte. Si le programmeur lance lexcution avec son code erron, il est averti que des erreurs sont dtectes. Il a alors le choix darrter lexcution ou la poursuivre. Dans ce dernier cas, les lignes fautives sont ignores. Sil prfre corriger son code, la fentre Liste des tches linforme sur le type et lendroit de lerreur. Un double clic sur une ligne ainsi prsente renvoie directement le programmeur l o une correction simpose. Les messages derreurs disparaissent de la liste au fur et mesure des corrections, sans quil soit ncessaire de recompiler.

09/08/2011

PHR VB.Net VBPV - 14

Mais il ny pas que des fautes de syntaxe dans un programme en cours de dveloppement. Lorsque le programme est excut, le programmeur a loccasion de constater que le droulement ne seffectue pas comme prvu, que les rsultats ne sont pas ceux attendus. Il y a des erreurs logiques. Cest ici que les fonctionnalits du dbogueur numres cidessus savrent trs utiles.

Le pas pas
Cest lexcution ligne par ligne du code, le programmeur activant lexcution de la ligne prsente quand il le souhaite selon un des deux modes possibles. Le pas pas dtaill se commande par la touche <F11> et le pas pas principal par <F10>. En mode dtaill, lexcution se poursuit ligne par ligne jusqu lintrieur des fonctions et procdures. Lorsque lexcution est sur le point dentrer dans un sous-programme quil nest pas opportun dtudier ainsi, le mode principal en effectue lexcution sans y entraner le programmeur.

Instruction excuter par <F11> ou <F10>

La ligne de code sur le point dtre excute est dsigne par une flche jaune dans la marge gauche de la feuille de code et la ligne de code elle-mme est surligne. Pour que la ligne sexcute, le programmeur doit presser <F11>. Dans lexemple ci-contre, la ligne suivant celle indique par la flche fait appel la fonction SommeN(). Le moment venu dexcuter cette ligne, le programmeur doit presser <F11> sil souhaite excuter la fonction en pas pas, et <F10> dans le cas contraire.

Au sein dune mme procdure, le programmeur peut provoquer la r-excution dune ligne ou au contraire viter quune ligne soit excute. Il lui suffit pour cela glisser la flche jaune jusqu la ligne de code souhaite.

Le point darrt
Comme il nest pratiquement jamais utile dexcuter tout le code en pas pas, le programmeur place un point darrt dans son code lendroit partir duquel il souhaite tudier lexcution en dtail. Lexcution du programme se droule ordinairement jusqu la premire ligne marque dun point darrt et se met alors automatiquement en pas pas. Le programmeur peut poursuivre par <F11> ou <F10>. Quand le programmeur le souhaite, lappui de la touche <F5> provoque labandon du pas pas jusquau prochain point darrt ou jusqu la fin du programme. Un point darrt est marqu par un clic dans la marge gauche de la feuille de code en regard de la ligne de code souhaite pour le dpart du pas pas. Un point brun est plac dans la marge et la ligne de code est surligne. Un point darrt ne peut tre fix sur une dclaration, mais seulement sur une instruction valide.

Le pas pas doit commencer cette ligne.

09/08/2011

PHR VB.Net VBPV - 15

Lvaluation des variables en cours dexcution


Pendant lexcution en pas pas, il suffit damener le curseur de la souris sur une variable pour que saffiche spontanment sa valeur. En outre, une fentre prsentant divers onglets dont Variables locales et Espion est prsente pendant le dbogage. On accde en permanence aux valeurs de toutes les variables de la procdure tudie par longlet Variables locales. Longlet Espion permet la garde de variables explicitement dsignes de nimporte quelle procdure. La mise en garde dune variable seffectue par un copier de la variable partir du code et son coller dans cet onglet.

Linsertion denvois de messages


Linsertion denvois de messages nest plus du ressort du dbogueur, mais bien dun jeu doutils adquats offerts par le langage. Comme de tout temps, le programmeur peut placer des instructions de sortie avec les messages quil souhaite aux endroits quil veut tester. Mais cette mthode prsente au moins deux inconvnients. Dune part ces messages, qui ne peuvent gnralement pas subsister dans la version compile dfinitive, doivent tre retirs manuellement. Dautre part, les contenus des messages disparaissent aussitt lexcution termine et ne supportent donc pas une deuxime lecture. Les moyens offerts par VB.Net sont communs tout Visual Studio .Net et ils sont livrs par les deux classes Trace et Debug. Ces deux classes sont identiques sauf que les mthodes de Trace subsistent dans les versions dfinitives tandis que celles de Debug ne sont pas intgres dans les excutables. Ces classes envoyent leurs messages vers des couteurs qui les redirigent vers des sorties dsignes. Il y trois types dcouteurs prdfinis : 1. TextWriterTraceListener redirige la sortie vers une instance de la classe TextWriter ou tout autre type de la classe Stream (Console ou fichier) 2. EventLogTraceListener redirige la sortie vers un journal dvnements 3. DefaultTraceListener renvoie les messages vers les mthodes OutPutDebugString et Debugger.Log. Pendant la mise au point des codes, ces messages sont affichs dans la fentre Sortie de Visual Studio. Cest le seul couteur par dfaut des classes Trace et Debug car cest le seul qui soit automatiquement inclus dans la collection Listeners. Tous les couteurs de la collection reoivent les mmes messages des mthodes de sorties. Simplement, chacun le redirige vers la sortie qui lui a t dsigne, un flux pour TextWriterTraceListener et un journal dvnements pour EventLogTraceListener. Les mthodes de sorties pour Trace et Debug sont Write, WriteLine, Fail qui mettent inconditionnellement leurs sorties, et WriteIf, WriteLineIf, Assert pour lesquelles les sorties sont soumises conditions.

09/08/2011

PHR VB.Net VBPV - 16

Quelques prcisions simposent au sujet des classes Trace et Debug.

En mode Debug, tous les messages sont envoys, tandis quen mode Release, qui est le mode de compilation des versions dfinitives, seuls les messages Trace subsistent. Bien entendu, le lancement du fichier excutable ne produit aucune sortie dans ce cas, aucune redirection nayant t dfinie.

Les classes Trace et Debug partagent la mme collection Listeners. Ds lors, lajout dun couteur lune ou lautre de ces deux classes profitent toutes les deux. Quand un seul couteur doit tre utilis, tant en dbogage quen excution, il faut vider la collection avant dy insrer lcouteur souhait. Une ligne Trace.Listeners.Clear() avant lajout dun couteur vide la collection de ceux qui sy trouve dj, dont DefaultTraceListener.

Ici, DefaultTraceListener nest plus le seul couteur. Un TextWriterTraceListener a t ajout et il dirige ses sorties vers la console. Un fichier ouvert aurait pu tre dsign la place de Console.Out. Il rsulte de cette modification que tous les messages sont maintenant envoys lcran et dans la fentre Sortie en mode Debug. La version excutable quant elle nenverra que les messages Trace lcran. En ce qui concerne les mthodes de sorties des couteurs, il faut encore savoir que la diffrence entre Write et WriteLine est la mme que celle qui existe entre les mthodes de mme nom qui servent la sortie des donnes en application Console. La prsence du suffixe If dsigne seulement le mode conditionnel. Il existe encore des mthodes Fail et Assert qui ne prsentent pas dintrts ici. Le lecteur peut se reporter laide en ligne de son Visual Studio, et au site MSDN de Microsoft dj rfrenc, pour complter son information ce sujet. Voici lessentiel ordinairement ncessaire au programmeur :
Dim FichierTrace As New TextWriterTraceListener("MonFichierMsg.txt") ' Collection vide Trace.Listeners.Clear() ' Ce fichier lindice 0 Trace.Listeners.Add(FichierTrace) ' Date, heure, message Trace.Listeners(0).WriteLine(Date.Now & " MonMessage") ' Vider le buffer FichierTrace.Close()
' Trace ou Debug Debug.WriteLine("Message inconditionnel") Debug.WriteLineIf(Condition, "Message si condition ralise")

09/08/2011

PHR VB.Net VBPV - 17

La gestion des erreurs


Le dbogage permet la mise au point dune application mais ne la protge pas des erreurs qui surviennent en cours dexploitation. Le traage vers un fichier de lexcution dune version compile peut informer le programmeur sur les circonstances des errreurs. Ces erreurs sont le plus souvent dues une mauvaise utilisation de lapplication. Le programmeur doit sefforcer de prvoir toutes les maladresses dont peut tre victime son application et len protger. Outre de programmer des contrles de validit des donnes traiter, le programmeur peut user dun outil du langage qui permet la prvention et la rcupration des erreurs sans programmation excessive.

Sans contrle de validit des donnes, ni rcupration de lerreur :

Laffichage ralis par cette procdure est le rsultat de la division de N1 par N2 si tout va bien. Si N2 vaut 0, alors une Private Sub UneProcedure() fentre du Just-In-Time Debugging vient proposer un Dim N1, N2, R As Integer dbogage dont lutilisateur ne peut rien faire. Le programme est ensuite arrt. R = N1 / N2 Console.WriteLine(CType(R, String)) Si les variables taient ici de type rel, la division ne produirait pas derreur, mais le rsultat serait +Infini (si N1 est positif). Ceci nest gure satisfaisant, mais sans End Sub erreur. Cest au programmeur dassurer le contrle de validit des donnes. Avec contrle de validit des donnes, sans rcupration de lerreur :
Private Sub UneProcedure() Le programmeur, qui contrle ici la validit de la variable Dim N1, N2, R As Integer N2, peut grer lerreur comme il le souhaite. Soit ignorer lappel de cette procdure par un Exit Sub, If N2 <> 0 then soit informer lutilisateur par un message convivial, soit R = N1 / N2 Console.WriteLine(CType(R, String)) encore effectuer nimporte quel traitement quil juge utile. Else ' traitement appropri de lerreur End If End Sub

Sans contrle de validit des donnes, avec rcupration de lerreur :


Private Sub UneProcedure() Dim N1, N2, R As Integer Try R = N1 / N2 Catch MonErr As Exception ' traitement appropri de lerreur Finally ' traitement faire en tous cas End Try End Sub

Le programmeur, qui ne contrle pas ici la validit de la variable N2, peut toutefois rcuprer lerreur et la grer comme dans lexemple prcdent. Cest le bloc de contrle Try End Try qui permet cette rcupration.

Attention, la rcupration dune erreur sans sa gestion peut gnrer des rsultats errons. Dans lexemple ci contre, aucun message ne vient perturber lutilisateur et lapplication ne sarrte pas, mais la valeur affiche est errone quand N2 vaut 0.

Private Sub UneProcedure() Dim N1, N2, R As Integer Try R = N1 / N2 Catch Console.WriteLine(CType(R, String)) Finally ' traitement faire en tous cas End Try End Sub

09/08/2011

PHR VB.Net VBPV - 18

Les mots cls de cet outil de rcupration des erreurs sont Try, Catch, Finally, When, Exit Try et End Try. Lemploi de Exit Try permet de ne pas excuter les autres instructions du bloc Try. Le mot cl Catch permet la dsignation ventuelle du type derreur prendre en compte et le mot When permet den prciser la condition dinterception. Plusieurs instructions Catch peuvent se succder et il convient dans ce cas de les classer par type derreur du plus prcis vers le moins prcis.
Private Sub UneProcedure() Dim N1, N2, R As Integer Try R = N1 / N2 If N1 = 1 Then Exit Try ' sinon suite des traitements Catch MonErr As DivideByZeroException ' traitement appropri Catch MonErr As ArithmeticException ' traitement appropri Catch MonErr As Exception When N1 = 1 ' traitement appropri Catch ' traitement appropri Finally ' traitement faire en tous cas End Try End Sub

' Il peut tre opportun de ne pas excuter ' la suite ' Les Catch, partir du plus prcis

' Attention : pas de rcupration si N1 <> 1 ' jusquau plus vague (Erreur indtermine) ' ' ' ' Le bloc Finally est facultatif, mais sil est prsent, ses traitements sont excuts mme en cas derreurs, ou dExit Try, ou de Return (quand Try est dans une fonction)

Gnrer des erreurs


Une instruction particulire, Throw, permet au programmeur de gnrer les exceptions appropries aux erreurs quil dfinit. Voici son fonctionnement par un exemple extrait dune application MonApplication. Une procdure risque, Calcul, est appele partir dun bloc Try End Try de la procdure UneProcedure. Le programmeur, dtecte la situation derreur dans Calcul par un test de validit de loprande Arg2 et gnre lui-mme une erreur avec un message adquat lintention de la procdure appelante. Dans Calcul, cest la ligne Throw New ApplicationException("MonErreur") qui retourne lerreur de type ApplicationException avec le message MonErreur. Dans cet exemple, "MonErreur dans MonApplication" est la phrase affiche par le bloc Try de la procdure appelante quand sa variable Terme2 vaut 0.
Private Sub UneProcedure() Dim Resultat, Terme1, Terme2 As Integer ' acquisition des valeurs pour Terme1 et Terme2 Try Calcul(Resultat, Terme1, Terme2) MessageBox.Show(Resultat) Catch UneErreur As ApplicationException MessageBox.Show(UneErreur.Message & " dans " & UneErreur.Source) End Try End Sub Private Sub Calcul(ByRef Rep As Integer, ByVal Arg1 As Integer, ByVal Arg2 As Integer) If Arg2 = 0 Then Throw New ApplicationException("MonErreur") Else Rep = Arg1 / Arg2 End If End Sub

09/08/2011

PHR VB.Net VBPV - 19

Lessentiel des composants visuels et de leurs membres


Le formulaire : Form
Proprits
Icon Cette proprit associe un fichier icne au formulaire. Licne saffiche dans la barre de titre son extrmit gauche. Quand le formulaire est celui de dmarrage, son icne est aussi celle de lapplication. Visual Studio donne la possibilit de crer une icne par le menu Fichier/Nouveau /Fichier /Fichier dicne et de la modifier. Cursor Cette proprit qui peut aussi tre rgle au niveau des contrles, dfinit le style du curseur par dfaut sur le formulaire. Les diffrentes valeurs sont disponibles dans la classe System.Windows.Forms.Cursors. BackgroundImage Dfinit lventuelle image de fond du formulaire. Si limage est plus petite que le formulaire, elle rpte en mosaque, sinon elle est tronque. WindowState Dfinit ou restitue ltat daffichage du formulaire.
FormWindowState.Maximized FormWindowState.Normal FormWindowState.Minimized

Plein cran. Equivalent au clic du bouton Agrandir Taille normale. Equivalent au clic du bouton Restaurer Rduit dans la barre des tches. Equivalent au clic du bouton Rduire

ControlBox Indique si le bloc de boutons de contrles situ dans le coin suprieur droit du formulaire est prsent ou pas. Dautres proprits sont dpendantes du ControlBox : MaximizeBox , MinimizeBox et HelpButton.
MaximizeBox MinimizeBox HelpButton

Dtermine si le bouton Agrandir du bloc peut tre utilis. Si cette proprit a comme valeur False, ce bouton est inactif. Dtermine si le bouton Rduire du bloc peut tre utilis. Si cette proprit a comme valeur False, ce bouton est inactif. Affiche un bouton daide dans le ControlBox seulement si les boutons MaximizeBox et MinimizeBox sont tous les deux inactifs, auquel cas ils ne sont dailleurs plus affichs.

Pour rpondre au clic sur le HelpButton, il faut programmer la rponse lvnement HelpRequested du formulaire. Il est possible que le clic de ce bouton ne produise pas cet vnement sur tous les systmes, mais avec ou sans le HelpButton, lappui de <F1> gnre lvnement.
Private Sub FBase_HelpRequested(ByVal sender As Object, ByVal hlpevent As System.Windows.Forms.HelpEventArgs) Handles MyBase.HelpRequested ' Traitement pour fournir l'aide End Sub

AcceptButton Permet la dsignation dun bouton pour lequel est gnr un vnement Click lorsque le formulaire a le focus et que la touche <Enter> est presse. Cest gnralement un bouton OK qui est dsign comme AcceptButton.

09/08/2011

PHR VB.Net VBPV - 20

CancelButton Permet la dsignation dun bouton pour lequel est gnr un vnement Click lorsque le formulaire a le focus et que la touche <Escape> est presse. Cest gnralement un bouton Annule qui est dsign comme CancelButton. AutoScale La proprit AutoScale autorise ou pas le redimensionnement automatique des contrles et du formulaire lors dun changement de la police dcran. AutoScroll La proprit AutoScroll autorise ou pas le placement automatiquement des barres de dfilement lorsque la taille du formulaire ne permet pas laffichage de tous les contrles quil contient. FormBorderStyle Cette proprit dtermine le style du formulaire.
None FixedSingle Fixed3d FixedDialog Sizable FixedToolWindow SizableToolWindow

Fentre sans bord ni barre de titre, non dimensionnable et non dplaable Fentre ordinaire non dimensionnable mais dplaable Mmes proprits que FixedSingle, mais avec un aspect 3D Fentre non dimensionnable mais dplaable Fentre ordinaire dimensionnable et dplaable Fentre non dimensionnable mais dplaable, sans icne ni ControlBox Fentre dimensionnable et dplaable, sans icne ni ControlBox

IsMDIContainer Dtermine si le formulaire est un conteneur MDI (Multiple Documents Interface), cest--dire sil est capable de contenir dautres fentres. Quand une fentre MDI est cre, cest par le code quil faut y placer les feuilles filles.
Dim F As Form = New NomFeuilleFille F.MDIParent = Me F.Show()
' NomFeuilleFille est le nom du Form charger

StartPosition Permet de choisir la position de la fentre lors de son ouverture.


Manual CenterScreen WindowsDefaultlocation WindowsDefaultBounds CenterParent

Position dfinie par la proprit Location Centr par rapport lcran Situ lemplacement par dfaut de Windows avec la taille dfinie dans Size Situ lemplacement par dfaut de Windows avec la taille par dfaut de Windows Centr par rapport la fentre ayant dclench louverture.

TopMost Si cette option est active (True) le formulaire est toujours lavant plan, mme quand il nest pas actif. Cette option est utile pour les fentres dont les contenus doivent toujours tre visibles. Locked Cest une proprit au service du programmeur. En effet, quand elle a la valeur True elle empche toute modification des proprits visuelles du composant pendant le dveloppement. Elle na aucune incidence sur lapplication en cours dexcution.

09/08/2011

PHR VB.Net VBPV - 21

LayoutMode, SnapLines et SnapToGrid Cest par le menu Outils/Options/Concepteur Windows Forms/Gnral quil convient de rgler la proprit LayoutMode SnapLines ou SnapToGrid (leffet du rglage sobserve aprs le redmarrage de lenvironnement). La proprit LayoutMode aide le programmeur dimensionner et positionner les composants visuels sur un formulaire. La valeur SnapLines provoque lapparition de lignes de reprage par rapport aux composants dj placs. La valeur SnapToGrid provoque lapparition dune grille de points auxquels saccrochent les composants. Opacity Dfinit lopacit gnrale dun formulaire par une valeur allant de 0% 100%. Pour obtenir lillustration ci contre, lopacit a t rgle 75%.

TransparencyKey Permet la transparence totale de tout objet du formulaire qui a de la couleur dsigne. Pour obtenir lillustration ci contre, la couleur choisie a t le jaune, le bouton Test ayant cette couleur.

ShowInTaskBar Cette proprit, qui a la valeur True par dfaut, empche la visibilit de lapplication dans la barre des tches lorsque sa valeur est False.

Mthodes
Activate La mthode Activate permet de remettre un formulaire au premier plan et de lui donner le focus. Close Cette mthode ferme le formulaire et libre la mmoire des ressources utilises. Dans le premier programme de cette partie du cours, lusage de linstruction End ou de la mthode Me.Close()produit le mme rsultat. ShowDialog Affiche le formulaire en tant que feuille modale, cest dire que la fentre reste au premier plan tant quelle nest pas ferme et empche laccs aux autres feuilles de lapplication. Lobjet MessageBox est toujours une fentre modale. BringToFront Cette mthode pousse le formulaire lavant plan. Contrairement leffet produit par la proprit TopMost, qui place dfinitivement le formulaire en avant, celui de BringToFront est temporaire.

09/08/2011

PHR VB.Net VBPV - 22

Evnements
Activated et Deactivate Lvnement Activated survient quand un formulaire reoit le focus, quil devient actif. Lvnement Deactivate se produit videmment dans le cas contraire. Ces vnements se produisent notamment quand le focus passe de la fentre dune application celle dune autre application, ou dune fentre lautre dans une mme application. DoubleClick Comme son nom lindique Load Cet vnement se produit avant le premier affichage du formulaire. Closing et Closed Lvnement Closing se produit pendant la fermeture du formulaire et Closed quand il est effectivement ferm.

Membres communs la plupart des composants visibles


Proprits
Dj vues : Enabled, Location, Locked, Text, Visible Anchor Les ancres permettent de fixer la position dun contrle de sorte quil la conserve ensuite lors des redimensionnements du formulaire. Leffet est assur tant en dveloppement qu lexcution. Valeur par dfaut : None. Laffectation simultane des quatre valeurs Top, Bottom, Left et Right offre une mise lchelle globale des composants. Les proprits Anchor et Dock sexcluent mutuellement, seule la dernire affecte est valide. Dock Similaire Anchor, sauf quelle dfinit une seule ancre, la proprit Dock permet dancrer un contrle un bord du conteneur. Valeur par dfaut : None. Les proprits Anchor et Dock sexcluent mutuellement, seule la dernire affecte est valide.
Left Right Top Bottom Fill

Lobjet occupe tout le bord gauche Lobjet occupe tout le bord droit Lobjet occupe tout le bord suprieur Lobjet occupe tout le bord infrieur Lobjet occupe toute la surface du conteneur

Modifiers Cette proprit dfinit la porte de lobjet au niveau de la programmation. Par dfaut, sa valeur est Friend.
Public Protected Protected Friend Friend Private

Accessible partir de tous les lments de la solution. Accessible partir des membres de la classe et des sous classes Correspond lunion des visibilits Friend et Protected Accessible partir de tous les lments du projet. Accessible partir des membres de la classe

Size Cette proprit contient la taille du contrle. Elle est compose de deux sous proprits, Width et Height.

09/08/2011

PHR VB.Net VBPV - 23

ClientSize Cette proprit contient la taille intrieure du contrle, c'est--dire l'espace intrieur disponible. Elle est compose de deux sous proprits, Width et Height, dont les valeurs sont toujours infrieures celles de la proprit Size du mme composant. La diffrence est particulirement importante pour un Form o il faut dduire de Size, non seulement les paisseurs des bords, mais aussi la hauteur de la barre de titre. TabIndex Ordre daccs au contrle par la touche <Tab>. Tous les objets poss sur un formulaire reoivent une valeur pour cette proprit. La valeur par dfaut correspond lordre darrive de lobjet sur la feuille : 0 pour le premier, 1 pour le deuxime, jusqu N-1 pour le Nime. Tag Voici une sympathique proprit qui ne sert rien ou, plus exactement, n'importe quoi. C'est une variable associe (comme un signet) l'objet et disponible pour le programmeur qui peut y stocker une valeur quelconque.

Mthode
Dj vues : Focus, Select

Evnements
Dj vus : Click, DoubleClick, GotFocus, KeyPress, LostFocus, MouseMove, MouseEnter, MouseLeave Enter Leave KeyDown KeyUp MouseDown MouseUp MouseWheel Resize Activ lorsque le contrle reoit le focus, bonne alternative GotFocus Activ lorsque le contrle perd le focus, bonne alternative LostFocus Touche enfonce Touche relche Bouton souris enfonc Bouton souris relch Dplacement de la roulette Dclench lorsque le contrle est redimensionn

Ltiquette : Label
Proprits
BorderStyle Style de bordure. Valeur par dfaut : None. Autres valeurs possibles : FixedSingle et Fixed3d
None FixedSingle Fixed3d

Pas dencadrement Encadr dun simple trait Aspect 3D enfonc

AutoSize La taille de ltiquette est adapte la taille du texte. TextAlign Position du texte dans ltiquette. Valeur par dfaut : TopLeft. Autres valeurs possibles : TopCenter, TopRight, MiddleLeft, MiddleCenter, MiddleRight, BottomLeft, BottomCenter et BottomRight.

09/08/2011

PHR VB.Net VBPV - 24

La bote de texte : TextBox


Proprits
CharacterCasing Dtermine la casse du texte. Valeur par dfaut : CharacterCasing.Normal. Autres valeurs possibles : CharacterCasing.Upper (majuscule) et CharacterCasing.Lower (minuscule). Focused Cette proprit a la valeur True quand le contrle dtient le focus. Elle nest accessible que par le code et en lecture seule. HideSelection Cette proprit dfinit si le contrle conserve la marque dune slection lorsquil perd le focus. Sa valeur par dfaut est True, ce qui signifie que le contrle cache la marque de slection. Lines et MultiLine La proprit Lines qui est un tableau de chanes, donne accs chacune des lignes dune TextBox. Il est permis dencoder plusieurs lignes de texte dans une TextBox quand sa proprit MultiLine a la valeur True.
Dim i As Integer For i = 0 To MaTextBox.Lines.Length - 1 MessageBox.Show(MaTextBox.Lines(i)) Next

MaxLength Nombre maximum de caractres autoriss pour le texte du contrle. Par dfaut : 32767. Modified Cette proprit reoit la valeur True chaque fois que le contenu du champ est modifi. Elle est accessible par le code en lecture et criture. PasswordChar Tout caractre encod ou affich est remplac par le caractre affect cette proprit. Par dfaut, cette proprit est vide. ReadOnly Laffectation de la valeur True cette proprit interdit toute modification du contenu. SelectionStart et SelectionLength La proprit SelectionStart contient lindice de dpart dune slection et SelectionLength contient la longueur de slection effectue par un gliss du curseur sur le texte ou la longueur de la slection effectuer par le code.
MaTextBox.SelectionStart = 1 MaTextBox.SelectionLength = 3 MaTextBox.Select()
' Commencer la slection au deuxime caractre ' Slectionner 3 caractres ' Donne le focus et fait la slection demande

09/08/2011

PHR VB.Net VBPV - 25

TextLength Cette proprit contient le nombre de caractre contenu dans le contrle.

Mthodes
Clear Vide la TextBox de son contenu. Copy, Cut et Paste Ce sont les mthodes Copier, Couper et Coller de Windows. Les mthodes Copy et Cut sappliquent ici au texte slectionn dune TextBox. La mthode Paste restitue le contenu du presse-papier.

Evnement
TextChanged Dclench lorsque le texte change. Lvnement se produit chaque appui de touche.

La case cocher : CheckBox


Un jeu de cases cocher permet lutilisateur deffectuer plusieurs choix parmi ceux proposs.

Proprits
Checked Cette proprit accessible en lecture et criture a la valeur True quand la case est coche. CheckState Cette proprit accessible en lecture et criture peut avoir trois valeurs diffrentes selon que la case est coche, coche et grise, et non coche.
CheckState.Checked CheckState.Indeterminate CheckState.Unchecked

La case est coche (Choix 1 de lillustration) La case est coche et grise (Choix 2 de lillustration) La case est non coche (Choix 4 de lillustration)

ThreeState Par dfaut, cette proprit a la valeur False. Il faut lui affecter la valeur True pour quune case cocher puisse tre coche et grise. CheckAlign Cette proprit permet de rgler les positions respectives du texte et de la case au sein dun contrle CheckBox.

Evnements
CheckedChanged Cet vnement se produit quand la proprit Checked change. CheckStateChanged Cet vnement se produit quand la proprit CheckState change.

09/08/2011

PHR VB.Net VBPV - 26

Le bouton radio : RadioButton


Contrairement un jeu de cases cocher, qui permet lutilisateur deffectuer plusieurs choix parmi ceux proposs, les RadioButton quant eux nautorisent quun seul choix parmi les options proposes dans un mme conteneur. Le systme dcoche lui-mme loption prcdemment choisie lorsquune nouvelle est coche. Les RadioButton nayant pas dtat gris, ils ne possdent pas les membres CheckState, ThreeState et CheckStateChanged. A part cela, les proprits, mthodes et vnements des RadioButton sont les mmes que ceux des CheckBox. La rponse un vnement CheckedChanged peut tre programme de deux manires. Soit une procdure vnementielle est crite par RadioButton, soit une seule est crite pour tous les RadioButton du mme conteneur.
Private Sub RadioButton1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged MessageBox.Show("1") End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged MessageBox.Show("2") End Sub Private Sub RadioButton3_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged MessageBox.Show("3") End Sub Private Sub RadioButton4_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged MessageBox.Show("4") End Sub

Les quatre procdures prcdentes peuvent tre remplaces par la suivante, qui illustre au passage la possibilit dcrire une seule procdure pour rpondre plusieurs vnements :
Private Sub RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged, RadioButton3.CheckedChanged, RadioButton4.CheckedChanged Select Case sender.Name.ToString Case "RadioButton1" MessageBox.Show("1") Case "RadioButton2" MessageBox.Show("2") Case "RadioButton3" MessageBox.Show("3") Case "RadioButton4" MessageBox.Show("4") End Select End Sub

Lune comme lautre de ces deux solutions gnre deux affichages de MessageBox. Lorsquun RadioButton est coch, un autre est dcoch automatiquement. Il sen suit quune premire MessageBox affichant le numro du RadioButton dcoch est suivie dune seconde MessageBox affichant le numro du RadioButton coch. Les RadioButton, de mme que les CheckBox, peuvent prendre l'apparence d'un bouton. Il suffit d'affecter la valeur Button leur proprit Appearance.
UnRadioButton.Appearance = Appearance.Button UnCheckBox.Appearance = Appearance.Button

09/08/2011

PHR VB.Net VBPV - 27

Les groupes dobjets : GroupBox et Panel


Divers contrles peuvent tre regroups au sein dun mme conteneur qui leur est spcifique. Les composants GroupBox et Panel sont des conteneurs au mme titre que le formulaire. Ils ont pour avantages de permettre au programmeur de regrouper des contrles de manire logique (pour grer plusieurs jeux de RadioButton, par exemple) afin de les isoler du reste du formulaire et de faciliter leur placement pendant le dveloppement (le dplacement dun groupe dplace tout son contenu). Par ailleurs ces composants disposent de la plupart des membres dj tudis.

Diffrences essentielles
GroupBox Panel BorderStyle : None, FixedSingle, Fixed3D

Pas de BorderStyle : encadr simple uniquement Proprit Text : permet de placer un libell sur le cadre Pas de proprit AutoScroll En cours de dveloppement

Pas de proprit Text Valeur par dfaut de la proprit AutoScroll : False En cours de dveloppement

A lexcution

A lexcution (BorderStyle = None)

Pour ce qui concerne les jeux de RadioButton, ils sont tels que dcrits aux pages prcdentes. Simplement, il est possible den cocher un au niveau du formulaire et un dans chacun des regroupements.

Ltiquette hyperlien : LinkLabel


Directement drive de Label, le LinkLabel en possde tous les comportements, proprits et mthodes. Son intrt rside dans quelques proprits supplmentaires, dont notamment LinkArea et LinkBehaviour, qui sont spcialises dans l'affichage d'hyperliens. L'activation d'une URL (Uniform Resource Locator) peut se faire partir de n'importe quelle procdure, avec ou sans LinkLabel, par la commande System.Diagnostics.Process.Start("Chane_url"), l'URL pouvant tre extraite de la proprit Text d'un LinkLabel sur base des valeurs attribues son LinkArea. La proprit LinkArea permet de dfinir le dbut et la fin des caractres qui constituent l'URL dans le texte de l'tiquette. La proprit LinkBehaviour permet de dfinir le soulignement de ce texte.
LinkLabel1.Text = "+++http://www.google.be+++" LinkLabel1.LinkArea = New LinkArea(3, 20) LinkLabel1.LinkBehavior = LinkBehavior.NeverUnderline LinkLabel1.LinkVisited = True
' ' ' ' ' Le texte affich Dlimitation de l'URL Ne pas souligner Indiquer si le lien a t visit

09/08/2011

PHR VB.Net VBPV - 28

La bote de liste : ListBox


Le contrle ListBox permet laffichage dune liste de donnes prsentes sous forme de chanes de caractres, dans laquelle lutilisateur peut effectuer une ou plusieurs slections. Elle est aussi un excellent outil de prsentation de linformation.

Proprits
MultiColumn Quand cette proprit a la valeur True, laffichage des donnes stale sur plusieurs colonnes, sans jamais dpasser lespace allou verticalement. De ce fait, seule la barre de dfilement horizontal reste utile dans ce mode. Il nest pas possible de choisir de remplir une colonne plutt quune autre, chaque colonne ntant occupe que par la suite des donnes de la colonne prcdente ( la manire des colonnes dun journal). Integralheight La valeur par dfaut de cette proprit est True. La ListBox adapte sa hauteur, mme en cours de dveloppement, un multiple de la hauteur des caractres dfinie par la proprit Font. Elle reste ainsi proche de la hauteur souhaite par le programmeur, mais aucune ligne de donnes ne subit un affichage partiel. Items Cette proprit est la collection contenant toutes les lignes de donnes de la liste. Sorted Les informations sont affiches dans leur ordre alphabtique croissant lorsque la valeur de cette proprit est True. SelectionMode Cette proprit contient le mode de slection autoris sur la ListBox. Sa valeur par dfaut est One.
One None MultiSimple MultiExtended

Une seule slection permise la fois Aucune slection nest possible sur la liste Plusieurs slections dsignes distinctement (Clics avec <Ctrl> enfonce) Plusieurs slections distinctes et par plages (Clics avec <Ctrl> et/ou <Shift> enfonce(s))

SelectedIndex Indice de llment slectionn entre 0 et Items.Count() - 1 SelectedIndices Cette proprit est la collection contenant les indices des lignes slectionnes.

09/08/2011

PHR VB.Net VBPV - 29

Mthodes
FindString Retourne lindice de llment commenant par le texte recherch. SetSelected Effectue la slection ou la dslection de la ligne dsigne par son indice, selon que le second paramtre de la mthode est True ou False. GetSelected Retourne la valeur True si la ligne dsigne par son indice est slectionne. ClearSelected Dslectionne toutes les slections.

Evnement
SelectedIndexChange Cet vnement est dclench lorsque la proprit SelectedIndex change, c'est--dire chaque slection ou dslection.

Quelques exemples
Dim i As Integer MaListe.Items.Clear For i = 0 To 50 MaListe.Items.Add("Texte " & i) Next MessageBox.Show(MaListe.Items.Count()) For i = 0 To MaListe.SelectedIndices.Count - 1 MessageBox.Show(MaListe.SelectedIndices(i)) Next i = MaListe.FindString("Texte 5") MessageBox.Show(MaListe.Items.Item(i)) MaListe.SetSelected(i, True)
' Stocke dans i lindice de la ligne Texte 5 ' Affiche la ligne dindice i ' Slectionne la ligne dindice i ' Vide MaListe de tout contenu

' Ajout de 51 lignes dans MaListe

' Affiche le nombre de lignes de MaListe ' Affiche les indices des lignes slectionnes

If MaListe.GetSelected(MaListe.Items.Count()-1) ' Vrifie si la dernire ligne est


slectionne

09/08/2011

PHR VB.Net VBPV - 30

La liste de cases cocher : CheckedListBox


Ce contrle est une association des contrles CheckBox et ListBox. Il hrite des membres de ses deux parents. Il naccepte toutefois pas les slections multiples.

La liste droulante : ComboBox


Le contrle ComboBox, ou botes combines, est lassociation dune ListBox et dune TextBox. Il permet lutilisateur de slectionner une valeur dans une liste ou de saisir une nouvelle valeur. Cependant, ce contrle naccepte pas les slections multiples et ne droule sa liste de donnes qu la demande. Sa proprit DropDownStyle est pingler. Ses valeurs possibles sont :
DropDown DropDownList Simple

Zone modifiable et droulante (c'est la valeur par dfaut) Zone droulante, mais non modifiable Zone modifiable, mais non droulante (balayage des valeurs par les flches du clavier)

La liste de visualisation : ListView


Le contrle ListView permet l'affichage dune liste d'lments avec, pour chacun, son texte et, ventuellement, une icne identifiant son type ou des informations filles le concernant et prsentes en colonnes. La classe ListViewItem reprsente un lment (avec ses informations filles ventuelles) du contrle ListView. Les lments de la liste peuvent tre affichs de quatre manires diffrentes. Ils peuvent apparatre sous forme de grandes icnes (LargeImageList), de petites icnes (SmallImageList) ou de petites icnes dans une liste verticale (StateImageList). Les lments peuvent aussi contenir des sous lments comportant des informations relatives l'lment parent. Le quatrime mode d'affichage, la vue Details, permet d'afficher l'lment et ses sous-lments dans une grille munie d'en-ttes de colonne qui identifient les donnes affiches. Lutilisateur peut raliser des slections par des clics sur la colonne dindice 0 ou nimporte o sur la ligne selon la valeur affecte la proprit FullRowSelect. Quelque soit le mode de slection, il est possible dobtenir toutes les informations de la ligne, mais linstar des volets de lexplorateur de Windows, seule celle de la colonne dindice 0 est directement accessible. Dans lillustration propose, les lments sont contenus dans la colonne dindice 0 et intitule Col .1. Les autres colonnes contiennent des informations lies llment de la mme ligne.

Proprits
FullRowSelect Quand cette proprit la valeur True, un clic sur nimporte quelle cellule de la ligne slectionne toute la ligne. Si la valeur est False, une slection ne peut soprer qu partir de la colonne dindice 0 (comme dans lexplorateur). FocusedItem Cette proprit contient des informations de la ligne slectionne.
FocusedItem.Index FocusedItem.Text FocusedItem.SubItems FocusedItem.SubItems.Count FocusedItem.SubItems(n).Text

Indice de la ligne slectionne Contenu de la ligne slectionne en colonne dindice 0 Collection des informations de la ligne Nombre de colonnes de la ligne Contenu de la ligne slectionne en colonne dindice n

09/08/2011

PHR VB.Net VBPV - 31

CheckBoxes Quand cette proprit a la valeur True, les informations de la colonne dindice 0 sont assorties de cases cocher. CheckedIndices et SelectedIndices Ces proprits contiennent respectivement la collection des indices des lignes coches (si CheckBoxes vaut True) et celle des indices des lignes slectionnes. Comme toutes les collections, elles disposent des sous proprits Count et Item. Une ligne coche nest pas une ligne slectionne et une ligne slectionne nest une ligne coche. CheckedItems et SelectedItems Ces proprits contiennent respectivement la collection des lignes coches (si CheckBoxes vaut True) et celle des lignes slectionnes. Comme toutes les collections, elles disposent des sous proprits Count et Item. View Cest par laffectation de cette proprit que se dfinit le mode daffichage souhait pour la ListView : Details, LargeImageList, SmallImageList et StateImageList. Columns En mode Details, cette proprit dsigne la collection des colonnes de la liste. La largeur de chaque colonne se dfinit en paramtre de la mthode Add qui la cre. Il est toutefois possible de modifier la largeur dune colonne par sa proprit Width. Il est ainsi possible daffecter la largeur 0 la colonne dindice 0. Cette facult peut tre utile par exemple, pour cacher lidentifiant de linformation prsente. HeaderStyle La dtermination du type dentte de colonne seffectue par laffectation de cette proprit par une des valeurs suivantes :
ColumnHeaderStyle.Clickable Le clic de lentte de colonne provoque lvnement ColumnClick ColumnHeaderStyle.Nonclickable Le clic de lentte de colonne ne provoque pas dvnement ColumnHeaderStyle.None Pas dentte de colonne

AllowColumnReorder Quand cette proprit a la valeur True, lutilisateur peut dplacer les colonnes de sorte les placer dans un ordre diffrent. Cette manuvre naffecte que lapparence de la ListView. Les indices de colonnes ne sont pas modifis. LabelEdit Selon sa valeur True ou False, cette proprit autorise ou interdit la modification dun lment par lutilisateur. Seul le contenu de la colonne dindice 0 peut tre modifi. SubItems La collection des informations dune ligne nest pas une proprit de ListView, mais bien celle dun objet de type ListViewItem, comme FocusedItem par exemple. Cest par lajout dlments cette proprit que sont crs les champs dinformations lis au parent, c'est--dire llment de la colonne dindice 0. Sorting La valeur de cette proprit dtermine la faon dont les informations peuvent tre tris sur la colonne dindice 0.
SortOrder.Ascending SortOrder.Descending SortOrder.None

Tri dans lordre croissant Tri dans lordre dcroissant Pas de tri

09/08/2011

PHR VB.Net VBPV - 32

Mthodes
Il ny a gure de mthodes spcifiques la ListView qui naient dj t vues. Par contre, quelques mthodes accessibles par des membres sont indispensables. Columns.Add Lajout de colonnes est ralis par cette mthode. Sa syntaxe est la suivante :
MaListView.Columns.Add("Libell", Largeur, Alignement) Alignement peut prendre une des valeurs paramtre HorizontalAlignment.Left et HorizontalAlignment.Right.

Le

HorizontalAlignment.Center,

Items.Add Cette mthode ralise lajout dlments, c'est--dire dinformation en colonne dindice 0. Elle cre les lignes. Sa syntaxe est :
MaListView.Items.Add("Information")

Outre de crer la ligne et dy placer linformation donne, la mthode retourne un objet de type ListViewItem. Cest par la rcupration de cet objet et de sa collection SubItems quil est ensuite possible dajouter les informations filles, en principe autant quil y a de colonnes dans la ListView.
Dim UneLigne As ListViewItem ' Dclaration dune variable de type ListViewItem UneLigne = MaListView.Items.Add("Info 1") ' Cration de la ligne avec la donne de colonne 0 UneLigne.SubItems.Add("Sous info 1 de 1") ' Cre un sous lment avec la donne de colonne 1 UneLigne.SubItems.Add("Sous info 2 de 1") ' Cre un sous lment avec la donne de colonne 2

Evnements
ColumnClick Cet vnement est dclench par le clic de lentte dune colonne. SelectedIndexChanged Lvnement se produit lors de chaque changement de slection. Il est toujours suivi de lvnement Click de la ListView.

Quelques exemples
MaListV.HeaderStyle = ColumnHeaderStyle.Clickable MaListV.View = View.Details MaListV.Clear() MaListV.Sorting = SortOrder.Ascending
' ' ' ' Type Mode Vide Mode dentte de colonne daffichage la liste de tri

' Cration de 4 colonnes de largeur 100 avec intitul : Col.0 Col.3 For j As Integer = 0 To 3 MaListV.Columns.Add("Col." & j, 100, HorizontalAlignment.Left) Next j ' Cration de 6 lignes, chacune munie de 2 sous lments Dim UneLigne As ListViewItem For i As Integer = 0 To 5 UneLigne = MaListV.Items.Add("Info " & i) UneLigne.SubItems.Add("Sous info 1 de " & i) UneLigne.SubItems.Add("Sous info 2 de " & i) Next i

09/08/2011

PHR VB.Net VBPV - 33

' Affectation de la largeur 0 la colonne dindice 0 MaListV.Columns(0).Width = 0 ' Affiche lindice de la ligne qui a le focus MessageBox.Show(MaListV.FocusedItem.Index)

'

Affiche le texte de la colonne 0 de la ligne qui a le focus

MessageBox.Show(MaListV.FocusedItem.Text)

'

Affiche le nombre de cellules de la ligne qui a le focus

MessageBox.Show(MaListV.FocusedItem.SubItems.Count)

'

Affiche tous les textes situs en colonne dindice 0

Dim x As ListViewItem For Each x In MaListV.Items MessageBox.Show(x.Text) Next

'

Affiche le texte de chaque cellule de la ligne qui a le focus

For i As Integer = 0 To MaListV.FocusedItem.SubItems.Count - 1 MessageBox.Show(MaListV.FocusedItem.SubItems(i).Text) Next i

'

Affiche aussi tous les textes de la ligne qui a le focus

Dim x As ListViewItem.ListViewSubItem For Each x In MaListV.FocusedItem.SubItems MessageBox.Show(x.Text) Next

'

Marque la ligne qui a le focus comme tant slectionne

MaListV.FocusedItem.Selected = True

'

Affiche tous les indices de lignes coches

For Each i As Integer In MaListV.CheckedIndices MessageBox.Show(i) Next i

'

Affiche tous les textes de la colonne dindice 0 des lignes coches

For i As Integer = 0 To MaListV.CheckedIndices.Count - 1 MessageBox.Show(MaListV.CheckedItems.Item(i).Text) Next i

'

Affiche tous les indices de lignes slectionnes

For Each i As Integer In MaListV.SelectedIndices MessageBox.Show(i) Next i

'

Affiche tous les textes de la colonne dindice 0 des lignes slectionnes

For i As Integer = 0 To MaListV.SelectedIndices.Count - 1 MessageBox.Show(MaListV.SelectedItems.Item(i).Text) Next i

09/08/2011

PHR VB.Net VBPV - 34

'

Affiche lindice de la colonne clique (sur lentte)

Private Sub MaListV_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles MaListV.ColumnClick MessageBox.Show(e.Column) End Sub

Les vues en arborescence : TreeView


Le TreeView, qui sapparente un peu la ListView, prsente toutefois une norme diffrence. Alors que dans la ListView, chaque lment peut tre assorti de plusieurs informations filles sans distinction hirarchique entre elles, dans le TreeView, chaque lment appel node peut tre assorti de Nodes fils qui lui sont subordonns et qui sont aussi des Nodes part entire. Le premier nud dune arborescence est aussi appel racine.

Proprits
Nodes Cette proprit contient la collection des Nodes. SelectedNode La proprit SelectedNode contient les informations du nud slectionn. ShowPlusMinus Selon sa valeur True ou False, cette proprit dtermine si les boutons +/- sont affichs ou pas. Quand ils ne sont pas affichs, les dveloppements ou rductions darborescences restent possibles par double-clic. ShowLines Quand cette proprit a la valeur True, soit sa valeur par dfaut, laffichage des lignes joignant les diffrents nuds est effectu. ShowRootLines Quand cette proprit a la valeur True, soit sa valeur par dfaut, et que ShowLines autorise laffichage des lignes joignant les diffrents nuds, la ligne joignant les nuds racines est galement affiche. Si ShowLines a la valeur True et que ShowRootLines a la valeur False, seules les lignes joignant les nuds secondaires sont affiches.

Mthodes
Comme pour la ListView, les mthodes les plus utiles du TreeView se trouvent au niveau de certains de ses membres. Il faut toutefois pingler ExpandAll et CollapseAll qui sont des mthodes de TreeView, et dont les cousines sont des mthodes de TreeView.Nodes. ExpandAll Cette mthode provoque le dveloppement de toute larborescence, comme si chacun des boutons + avait t cliqu. CollapseAll Cette mthode provoque la rduction de toute larborescence, comme si chacun des boutons - avait t cliqu.

09/08/2011

PHR VB.Net VBPV - 35

SelectedNode.Expand, SelectedNode.ExpandAll, SelectedNode.Collapse et SelectedNode.Toggle Ces mthodes, qui sappliquent un nud slectionn, dveloppent ou rduisent larborescence partir de la slection.
SelectedNode.Expand SelectedNode.ExpandAll SelectedNode.Collapse SelectedNode.Toggle

Dveloppement dun sous niveau Dveloppement de tous les sous niveaux Rduction de tous les sous niveaux Passage ltat suivant (dvelopp ou rduit)

Nodes.Add Cette mthode ralise lajout de nuds et retourne un objet de type TreeNode. Lexcution de Nodes.Add sur lobjet retourn cre un sous niveau de larborescence. Il nest pas ncessaire de rcuprer lobjet retourn par la mthode lorsquon cre le nud de dernier niveau. Le code suivant cre la TreeView prsente en illustration ci-dessous.
Dim N1, N2 As TreeNode ' Deux racines For i As Integer = 1 To 2 N1 = MaTreeView.Nodes.Add("Racine " & i) ' Deux premiers sous niveaux For j As Integer = 1 To 2 N2 = N1.Nodes.Add("Noeud " & i & "." & j) ' Trois seconds sous niveaux For k As Integer = 1 To 3 N2.Nodes.Add("Sous-noeud " & i & "." & j & "." & k) Next k Next j Next i

Evnment Le seul vnement retenu ici est NodeMouseClick : il donne accs toutes les proprits dun nud cliqu.
Private Sub MaTreeView_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles MaTreeView.NodeMouseClick ' Donne le texte du nud cliqu MessageBox.Show(e.Node.Text) End Sub

Lecture dun TreeView La procdure rcursive suivante ralise la lecture de tous les nuds enfants, partir dun nud dentre donn, et copie leur donne dans une ListBox nomme LBNodes.
Private Sub AfficheNodes(ByVal Entree As TreeNode) ' Copie des donnes dans une ListBox LBNodes.Items.Add(Entree.Text) If Entree.GetNodeCount(True) > 0 Then For Each N As TreeNode In Entree.Nodes AfficheNodes(N) Next End If End Sub

Pour faire une lecture complte du TreeView, il faut appeler la procdure pour chaque racine. Le remplissage de la ListBox illustr ci-contre, avec toutes les donnes du TreeView, est le rsultat de lexcution des deux lignes suivantes :
AfficheNodes(MaTreeView.Nodes(0)) AfficheNodes(MaTreeView.Nodes(1))

09/08/2011

PHR VB.Net VBPV - 36

Le calendrier mensuel : MonthCalendar


Le contrle MonthCalendar est un calendrier prsentant par dfaut, un mois la fois et permettant le passage dun mois lautre par deux boutons de navigation. Sa proprit CalendarDimensions permet la dfinition dun nombre de mois prsents en ligne, en colonne ou en rectangle selon les valeurs affectes aux sous proprits Height et Width. Ces proprits doivent tre rgles pendant le dveloppement dans la fentre des proprits. Par exemple, affecter respectivement 2 et 3 ces proprits fait que le calendrier prsente ensuite 6 mois la fois, en 2 lignes de 3. La proprit MaxSelectionCount dfinit le nombre de jours pouvant tre slectionns en une fois. Quand une slection est ralise, les proprits SelectionStart, SelectionEnd et SelectionRange founissent la ou les date(s) slectionne(s) en une plage contigu.
' Affiche la date slectionne ou la premire date dune plage slectionne MessageBox.Show(MonCalendrier.SelectionStart) ' Affiche la date slectionne ou la dernire date dune plage slectionne MessageBox.Show(MonCalendrier.SelectionEnd) ' Affiche la premire et la dernire date dune plage slectionne MessageBox.Show(MonCalendrier.SelectionRange.ToString)

Le slectionneur de date : DateTimePicker


Ce contrle, qui est le regroupement des contrles ComboBox et MonthCalendar, a lavantage de montrer le calendrier la demande. Il nest affich quen rponse au clic sur le bouton de la ComboBox et disparat aprs slection. Seule la ComboBox reste visible. La date slectionne est automatiquement affiche dans la zone de texte du ComBoBox. Sa valeur est accessible partir du code par la proprit Text du contrle.

09/08/2011

PHR VB.Net VBPV - 37

La bote image : PictureBox

Le composant PictureBox est loutil de prsentation dimages. Il a comme proprits particulires celle qui dfinit le mode daffichage de limage et celle qui dsigne limage afficher. Cette dernire va de paire avec une mthode de chargement du fichier de limage. SizeMode Cest la proprit qui dfinit le mode daffichage par une des quatre valeurs possibles : Normal, CenterImage, StretchImage et AutoSize. Lillustration montre leffet de chacune de ces valeurs.
Normal CenterImage StretchImage AutoSize

Limage est dessine partir du coin suprieur gauche de lobjet. Si elle est trop grande, seule une partie est affiche Limage est dessine partir de son centre positionn au centre de lobjet. Si elle est trop grande, seule une partie est affiche Limage est rduite ou agrandie pour occuper la surface de lobjet. Limage est dessine partir du coin suprieur gauche de lobjet qui est agrandi pour contenir toute limage, mais sans toutefois dpasser les bords du formulaire qui le contient. Si limage est malgr tout trop grande, seule une partie est affiche

Image Cest le membre qui fournit la fois la proprit Image et la mthode Image.FromFile qui permet son affectation.
MonImage.Image = System.Drawing.Image.FromFile("F:\MesImages\ArbresEnNeigs.jpg")

09/08/2011

PHR VB.Net VBPV - 38

Le diviseur : Splitter
Le contrle Splitter permet de crer des barres de sparation redimensionnables pour distribuer lespace du formulaire entre diffrents contrles. Le Splitter est particulirement utilis dans les interfaces de type explorateur Windows o la sparation verticale entre les deux volets daffichage est un Splitter. Outre lexagration prsente par lillustration ci contre o le formulaire est divis en cinq parties, voici un exemple plus plausible. Le but est de prsenter les chemin et nom de chaque fichier dimage dans une
ListBox, et de prsenter limage slectionne dans la PictureBox voisine.

Une ralisation
Placer la ListBox sur le formulaire et fixer sa proprit Dock Left. Placer le Splitter et ajuster sa largeur comme souhait. Sa proprit Dock a la valeur Left par dfaut. Placer une PictureBox sur la partie restante du formulaire et rgler sa proprit Dock Fill de sorte quelle occupe tout lespace. Son code
Private Sub FBase_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load MaListe.Items.Clear() MaListe.Items.Add("X:\VBNet\ArbresEnneiges.jpg") MaListe.Items.Add("X:\VBNet\Chateau.jpg") MonImage.SizeMode = PictureBoxSizeMode.StretchImage End Sub Private Sub MaListe_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MaListe.SelectedIndexChanged MonImage.Image = System.Drawing.Image.FromFile(MaListe.SelectedItem) End Sub

Son rsultat

09/08/2011

PHR VB.Net VBPV - 39

Le contrle onglets : TabControl


Un TabControl contient des pages d'onglets qui sont reprsentes par des objets TabPage ajouts la collection TabPages. Lobjet TabControl se prsente demble muni de deux onglets TabPage1 et TabPage2. Le moyen le plus simple dajouter des pages, ou den retirer, est dutiliser lditeur de collections de TabPage accessible par le bouton situ dans la fentre des proprits.

Lditeur

de collections de TabPage prsente une page de proprits pour chaque page ajoute. Cest loccasion daffecter la proprit Text de chacune et de les nommer de faon pertinente. Une fois les pages cres, elles sont disponibles pour le programmeur qui peut y dposer les composants visuels quil souhaite.

Les onglets sont indics partir de 0 et sont accessibles par la proprit Item de la collection TabPages ou par leur proprit Name.

La proprit SelectedTab dsigne longlet davant plan.


MesTab.TabPages.Item(0).Text = "MonTexte" Private Sub MesTab_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MesTab.Click ' Affiche le libell de longlet MessageBox.Show(MesTab.SelectedTab.Text) End Sub ' cliqu

Les objets TabPage nont pas de proprit Visible. Il nest donc pas possible de les rendre visible ou invisible la demande aussi simplement que cela se fait avec dautres composants. Comme ils appartiennent une collection, ils peuvent tre retirs ou insrs dynamiquement. Toutefois, pour quune insertion dun TabPage restitue celui qui a t retir auparavant, il faut que le nom de ce dernier soit conserv ou que sa rfrence soit mmorise.
Dim Page As TabPage ' Page = MesTab.TabPages.Item(i) MesTab.TabPages.RemoveAt(i) ' MesTab.TabPages.Insert(i, Page) AutresTab.TabPages.Remove(NomDuTabPage) ' AutresTab.TabPages.Insert(i, NomDuTabPage)
' ' ' ' Pour mmoriser la rfrence du TabPage manipuler Mmorisation du TabPage dindice i Suppression du TabPage dindice i

' Remise en place du TabPage supprim ' dont la rfrence a t mmorise ' La suppression dun TabPage nomm ' Remise en place du TabPage supprim ' dont le nom a t conserv

09/08/2011

PHR VB.Net VBPV - 40

Le menu : MainMenu

et MenuStrip

Le MainMenu, ou MenuStrip (depuis VB.Net 2005), se situe mi-chemin entre les composants visibles et ceux qui ne le sont pas. En effet, tous les contrles abords jusqu prsent se dessinent concrtement sur le formulaire. Le MainMenu est un concepteur dont seuls les effets sur la fentre sont visibles. Dautres composants qui sont expliqus plus loin, ne sont visibles quen temps utile, ou mme jamais. Comme illustr ci contre, linterface de dveloppement est quelque peu adapte lorsque de tels composants sont utiliss. Sur cette copie dcran, les composants peu ou pas visibles apparaissent en dessous du formulaire. Il sagit du MainMenu dont leffet est visible sur le formulaire, du Timer qui nest jamais visible, et de lOpenFileDialog qui nest visible qu la demande. Dans la mesure o lobjet de cette page est de placer un menu sur un formulaire, MainMenu et MenuStrip se valent. Toutefois le MenuStrip offre des possibilits supplmentaires qui ne sont pas tudies ici. Alors que le MainMenu est un conteneur de MenuItem, le MenuStrip peut aussi contenir des ToolStripMenuItem (quivalent au MenuItem), ToolStripComboBox, ToolStripSeparator et ToolStripTextBox. Le MenuStrip remplace le MainMenu dans lvolution des composants. Depuis VB.Net 2005, le MainMenu peut tre ajout la liste des composants visuels par un clic du bouton droit de la souris sur la bote outils, puis Choisir les lments , puis Composants .Net Framework. Quand le composant Menu a t dpos sur le formulaire, il est automatiquement dplac dans la zone des composants invisibles et les zones de dactylographie des diffrents points des menus sont prsentes sur le formulaire. e. Les diffrents menus se dessinent assez simplement au fur et mesure que le programmeur encode ses libells. Un clic du bouton droit de la souris prsente un menu contextuel dont certaines propositions peuvent tre utiles la mise au point du menu et linsertion des composants dun MenuStrip. Pour que le menu soit affich lors de lexcution, il faut affecter la proprit Menu du formulaire avec le nom du menu. Il est ainsi possible de choisir un menu parmi dautres selon les ncessits du moment.
Me.Menu = MonMenuPrincipal

Chaque menu et sous menu a sa proprit Name laquelle il convient de donner un nom aussi reprsentatif que possible, contrairement ce qui est illustr ci-dessous. En effet, cest en rponse lvnement Click quest programm le code vnementiel et il nest pas commode de sy retrouver lorsque, comme ci-dessous, les menus portent les noms MenuItem1, MenuItem2, , MenuItem

Diffrentes proprits, dont notamment Enabled, Visible, Shortcut, Checked permettent dinfluencer lapparence et le comportement des sous menus Des barres de sparations peuvent tre places par le menu contextuel ou bien en encodant un tiret en lieu et place du texte. Il faut encore savoir que prcder une lettre du texte du caractre &, fait de cette lettre un raccourci clavier par lusage de la touche <Alt>. Cela est vrai pour dautres contrles, tels que le bouton par exemple.

09/08/2011

PHR VB.Net VBPV - 41

La minuterie : Timer
Le composant Timer est toujours invisible. Cest idalement dans le code quil est rgl et cest dans le code quest exploit son effet, c'est--dire le dclenchement dun vnement un intervalle prdfini.

Proprits
Enabled Cette proprit permet le fonctionnement du Timer quand elle a la valeur True et provoque son arrt quand elle reoit la valeur False. Interval Cest par cette proprit que se dfinit lintervalle de dclenchement de lvnement. Sa valeur exprime un nombre de millimes de seconde compris entre 1 et 2147483647, soit jusqu plus de 595 heures. Laffectation de la valeur 0 cette proprit provoque larrt du Timer aussitt son intervalle en cours termin. Larrt du Timer par ce procd nest pas instantan.

Mthodes
Start La mthode Start dmarre le Timer. Son usage quivaut donner la valeur True la proprit Enabled. Stop La mthode Stop arrte le Timer. Son usage quivaut donner la valeur False la proprit Enabled.

Evnement
Tick Cet vnement est le seul produit par le Timer. Il survient chaque intervalle de temps coul, selon la valeur de la proprit Interval.

Exemple
UnTimer.Interval = 1000 ' Intervalle dune seconde UnTimer.Start() UnTimer.Stop()
' Code de dmarrage ' Code darrt

Private Sub UnTimer _Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles UnTimer.Tick Static T As Integer T += 1 ' Affichage de la valeur de T chaque fois MaTextBox.Text = T End Sub ' que Tick se produit

09/08/2011

PHR VB.Net VBPV - 42

Les botes de dialogue


Les botes de dialogue font partie de ces composants visibles la demande. Elles sont rendues visibles par programmation, linstar des MessageBox, quand leur usage est requis, le plus souvent par linvocation la mthode ShowDialog. Cette mthode renvoie une valeur de type DialogResult qui indique le mode de fermeture de la DialogBox (<OK>, <Escape>, ).

Louverture de fichiers : OpenFileDialog


La bote dialogue OpenFileDialog est celle que prsente Windows lorsque lutilisateur ouvre le menu Fichier et choisi loption Ouvrir dans une application telle que Word ou Excel, ou encore dans lenvironnement de dveloppement VB.Net. Elle sert lacquisition du nom dun fichier avec son chemin complet en vue de son ouverture.

Proprits
InitialDirectory Contient le dossier par dfaut pour la premire ouverture de la bote de dialogue. Pour les ouvertures suivantes, le dossier prsent est le dernier auquel lOpenFileDialog a accd. Title Contient le texte de la barre de titre de la bote de dialogue. Filter Cette proprit dfinit le contenu de la ComboBox Type de fichiers. Le filtre est une chane de caractres regroupant tous les textes concatns. Ces textes sont spars les uns des autres par le caractre pipe (|), et chacun est constitu de la partie affichable spare du filtre proprement dit par un pipe galement.
Filter = "Tous|*.*|Texte|*.TXT|Excel|*.XLS|Word|*.DOC"

DefaultExt Contient le texte de lextension placer lorsque lutilisateur nglige de lencoder. AddExtension Quand cette proprit a la valeur True, lextension dfinie dans DefaultExt est ajoute dans tous les cas. Il faut user de cette facult avec prudence sous peine de retrouver les fichiers munis de deux extensions (MonDoc.Txt.TXT).

09/08/2011

PHR VB.Net VBPV - 43

MultiSelect Cette proprit dtermine par sa valeur True ou False, sil est permis de pratiquer la slection de plusieurs fichiers dans la bote de dialogue. CheckFileExists et CheckPathExists Lorsque ces proprits ont la valeur True, qui est leur valeur par dfaut, une vrification de lexistence du fichier et de son chemin est ralise. FileName et FileNames Cette proprit retourne le nom et le chemin du fichier slectionn. Quand la proprit MultiSelect a la valeur True et quune slection multiple est pratique, FileNames contient la collection des noms et chemins des fichiers slectionns.

Mthode
ShowDialog Cest la mthode ShowDialog qui provoque laffichage de la fentre.

Exemple
Private Sub BFichier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BFichier.Click ' Valeur renvoye par la mthode Showdialog Dim Resultat As DialogResult MonOpenFileDial.Title = "Test de l'OpenFileDialog" MonOpenFileDial.Filter = "Tous|*.*|Texte|*.TXT|Excel|*.XLS|Word|*.DOC" MonOpenFileDial.InitialDirectory = "X:\VbNet" Resultat = MonOpenFileDial.ShowDialog() If Resultat = Windows.Forms.DialogResult.OK Then ' OK est le gage dune saisie ' correcte, sans annulation MessageBox.Show(MonOpenFileDial.FileName) End If End Sub

Lenregistrement de fichiers : SaveFileDialog


La bote dialogue SaveFileDialog est celle que prsente Windows lorsque lutilisateur ouvre le menu Fichier et choisit loption Enregistrer sous dans une application. Elle sert lacquisition du nom dun fichier avec son chemin complet en vue de son enregistrement. Elle trs semblable lOpenFileDialog. La principale diffrence est quelle ne dispose pas de la proprit MultiSelect et donc, ne dispose pas non plus de la collection des fichiers slectionns FileNames.

Lexplorateur de dossiers : FolderBrowserDialog


Le FolderBrowserDialog permet la slection dun dossier et sa cration si ncessaire. Il est plus simple mettre en uvre que les FileDialog lorsquil ny a pas de nom de fichier rechercher, mais seulement un chemin. Le bouton Nouveau dossier est affich ou pas selon la valeur de la proprit ShowNewFolderButton qui peut tre True ou False.
Private Sub BFichier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BFichier.Click MonFolderBrowserDial.SelectedPath = "X:\VBNet" MonFolderBrowserDial.ShowDialog() MessageBox.Show(MonFolderBrowserDial.SelectedPath) End Sub

09/08/2011

PHR VB.Net VBPV - 44

Les polices de caractres : FontDialog


La FontDialog est bien entendu linterface de slection et de configuration dune police de caractre. Quelques proprits permettent de rgler son contenu avant de la proposer lutilisateur. ShowEffects et ShowColor La proprit ShowEffects, dont la valeur par dfaut est True, autorise laffichage de lencadr Effets. Quand ce jeu de cases cocher est visible, il est possible de proposer aussi un choix de couleur par la ComboBox Couleur. Pour cela, il faut affecter la valeur True la proprit ShowColor qui est False par dfaut. MinSize et MaxSize Ces proprits dfinissent les limites des tailles de caractres proposes dans la ListBox Taille. La valeur minimale permise est 8 et la valeur maximale est 72. Ces limites nempchent toutefois pas lutilisateur dencoder une valeur choisie hors de la plage propose. Usage des proprits Font, Color et Font.Size.
MaPolice.ShowDialog() MessageBox.Show(MaPolice.Font.Size) MaTextBox.Font = MaPolice.Font MaTextBox.ForeColor = MaPolice.Color
' ' ' ' ' Affichage de la bote de dialogue Affichage de la taille choisie Affectation de la police une TextBox Affectation de couleur du texte de la TextBox

Les couleurs : ColorDialog


La proprit FullOpen, qui a la valeur False par dfaut, limite le choix aux couleurs de base. Quand elle a la valeur True, lutilisateur peut obtenir la palette de personnalisation. La proprit SolidColorOnly limite les possibilits de choix aux couleurs supportes par la carte graphique quand sa valeur est True. Sa valeur par dfaut est False. La proprit la plus importante est Color. Elle permet de proposer une couleur par dfaut et surtout, elle retourne la couleur slectionne par lutilisateur.
MaCouleur.Color = System.Drawing.Color.Green ' Affectation dune couleur par MaCouleur.AllowFullOpen = True MaCouleur.ShowDialog() MaTextBox.ForeColor = MaCouleur.Color
' dfaut (Vert) ' Autorise la personnalisation ' dune couleur ' Affectation de couleur du texte ' de la TextBox

09/08/2011

PHR VB.Net VBPV - 45

Limpression des documents


Les composants permettant le lancement dune impression sont PrintDocument et PrintPreviewDialog. Dans la mesure o il est souhaitable de permettre lutilisateur de rgler les marges de son document et de slectionner une imprimante, les composants PrintDialog et PageSetupDialog sont galement ncessaires. Le composant PrintPreviewControl permet seulement la visualisation du document dsign par PrintDocument et cest au programmeur de prvoir la commande dimpression. Les composants PrintDocument et PrintPreviewDialog provoquent lvnement PrintPage en rponse duquel il faut programmer le dtail de limpression. Cest notamment dans cette procdure vnementielle quest ralise la lecture du fichier contenant le document, moins quil sagisse dimpression directe. Pour pouvoir utiliser les outils de lecture de fichier, lImports System.IO est indispensable et le fichier, qui doit tre utilis par plusieurs procdures, doit tre dclar au niveau de la classe. Dans cette situation, les premires lignes de codes de la classe sont :
Imports System.IO Public Class FBase Dim MonDoc As StreamReader

Le moteur dimpression : PrintDocument


Le composant PrintDocument est toujours invisible lexcution. Limpression directe dun document, sans possibilit pour lutilisateur de slectionner limprimante, ni de modifier les marges, se commande par le code suivant :
PrintDocument1.Print()

Lexcution de la mthode Print provoque lvnement PrintPage et limpression peut tre ralise comme ceci :
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Ligne As String Dim Position As System.Drawing.PointF ' PointF et RectangleF sont les position et Dim Rectangle As RectangleF ' dimensions de la zone dimpression ' exprimes en nombres rels (Floating point) Dim Police As Font Dim HauteurLigne As Single Ligne = "Voici la ligne imprimer"
' Une premire ligne imprimer

Police = New Font("Courier New", 10, FontStyle.Bold) Position = New PointF(e.MarginBounds.Left, e.MarginBounds.Top) HauteurLigne = Police.GetHeight(e.Graphics) Rectangle.Location = Position Rectangle.Width = e.MarginBounds.Width ' Rcuprer la largeur entre marges ' et utiliser la hauteur de ligne Rectangle.Height = HauteurLigne e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle) Ligne = "et en voici une autre"
' une autre

Police = New Font("Times New Roman", 16, FontStyle.Bold) Position = New PointF(e.MarginBounds.Left, e.MarginBounds.Top + HauteurLigne) HauteurLigne += Police.GetHeight(e.Graphics) ' += pour viter la superposition Rectangle.Location = Position Rectangle.Width = e.MarginBounds.Width Rectangle.Height = HauteurLigne e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle) '
tant quil y a des lignes ' encore une

e.HasMorePages = False End Sub

09/08/2011

PHR VB.Net VBPV - 46

Limpression dun fichier texte, sans possibilit pour lutilisateur de slectionner limprimante, ni de modifier les marges, se commande par le code suivant :
PrintDocument1.DocumentName = "X:\TXT\MonTexte.Txt" MonDoc = New StreamReader(PrintDocument1.DocumentName) PrintDocument1.Print() MonDoc.Close()

Lexcution de la mthode Print provoque lvnement PrintPage et limpression peut tre ralise, mais cette fois les lignes imprimer sont fournies par la lecture du fichier. La procdure PrintDocument1_PrintPage devient par exemple :
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Ligne As String Dim Position As System.Drawing.PointF Dim Rectangle As RectangleF Dim Police As Font Dim HauteurLigne As Single Dim NbrLignesParPage As Integer ' Comptage des lignes imprimes Dim NumLigne As Integer = 0
' Dans cet exemple, toutes les lignes ' utilisent la mme police

Police = New Font("Courier New", 10, FontStyle.Bold) HauteurLigne = Police.GetHeight(e.Graphics)


' Nombre de lignes par page est la ' hauteur de la zone imprimable ' divise par la hauteur d'une ligne

NbrLignesParPage = e.MarginBounds.Height / HauteurLigne Do Until MonDoc.Peek = -1 Ligne = MonDoc.ReadLine()


' Lire le contenu du fichier ligne par ' ligne et calculer la position de la ' ligne imprimer

Position = New PointF(e.MarginBounds.Left, e.MarginBounds.Top + (NumLigne * HauteurLigne))


' ' ' ' ' ' Dfinir les coordonnes de la zone dans laquelle la ligne sera imprime avec la position calcule et sa taille Rcuprer la largeur entre marges et utiliser la hauteur de ligne

Rectangle.Location = Position Rectangle.Width = e.MarginBounds.Width Rectangle.Height = HauteurLigne

e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle)


' Incrmenter le compteur de lignes NumLigne += 1 If NumLigne > NbrLignesParPage Then Exit Do ' et vrifier si on est en fin de page Loop

If MonDoc.Peek <> -1 Then e.HasMorePages = True Else MonDoc.Close() MonDoc = New StreamReader(TDocument.Text) End If End Sub

' Relancer l'impression de la page ' suivante

' ' ' '

En prvisualisation, cette procdure est excute une premire fois pour laffichage et il faut rouvrir le fichier pour limpression ventuelle

Pour donner lutilisateur la possibilit de slectionner limprimante et de modifier les marges, il faut associer les composants PrintDialog et PageSetupDialog PrintDocument et permettre lutilisateur de les utiliser pour dfinir ses options. Il faut noter que PageSetupDialog permet aussi la dsignation de limprimante. Ces associations se programment par ces lignes :
PageSetupDialog1.Document = PrintDocument1 PrintDialog1.Document = PrintDocument1

09/08/2011

PHR VB.Net VBPV - 47

La mise en page : PageSetupDialog


Une fois un PrintDocument et une PageSetupDialog associs, lactivation de la bote de dialogue se programme par :
PageSetupDialog1.ShowDialog()

Les proprits AllowMargins, AllowOrientation, AllowPaper et AllowPrinter dont la valeur par dfaut est True peuvent recevoir la valeur False pour interdire laccs aux fonctionnalits correspondantes.

La slection de limprimante : PrintDialog


Une fois un PrintDocument et une PrintDialog associs, lactivation de la bote de dialogue se programme par :
PrintDialog1.ShowDialog()

Les proprits AllowSomePages, AllowSelection et AllowPrintToFile peuvent aussi recevoir une des valeurs True ou False selon le degr de libert accord lutilisateur.

La fentre de prvisualisation : PrintPreviewDialog


La bote de dialogue de prvisualisation affiche le document tel quil sera imprim et permet lutilisateur den commander limpression. Le composant PrintPreviewDialog doit tre associ un PrintDocument avant dtre activ. Il est bien entendu que le PrintDocument doit tre rgl au pralable. Le code suivant ralise cette association et active la bote de dialogue.
PrintPreviewDialog1.Document = PrintDocument1 MonDoc = New StreamReader(PrintDocument1.DocumentName) PrintPreviewDialog1.ShowDialog() MonDoc.Close()

Le composant de prvisualisation : PrintPreviewControl


Le composant de prvisualisation affiche le document tel quil sera imprim, mais ne permet pas lutilisateur den commander limpression. Le composant PrintPreviewControl doit tre associ un PrintDocument avant dtre activ. Il est bien entendu que le PrintDocument doit tre rgl au pralable. Le code suivant ralise cette association et active laffichage du document dans le composant.
MonDoc = New StreamReader(PrintDocument1.DocumentName) PrintPreviewControl1.Document = PrintDocument1 PrintPreviewControl1.InvalidatePreview()

Exemple rcapitulatif
Tous les composants tudis ci avant sont regroups dans une mme application permettant lexprimentation de chacun dans une situation de traitement dun fichier texte en autorisant la slection de limprimante et la modification des marges par lutilisateur. Les codes communs de rglage des composants ont t runis dans une procdure InitialiseComposants qui est appele par chaque procdure vnementielle de rponse au clic dun bouton. La bote de texte TDocument contient le chemin et le nom du fichier traiter.

09/08/2011

PHR VB.Net VBPV - 48

Imports System.IO Public Class FBase Dim MonDoc As StreamReader Private Sub InitialiseComposants(ByVal Test As Byte) Select Case Test Case 1 ' Association pour PageSetupDialog PageSetupDialog1.Document = PrintDocument1 Case 2 ' Association pour PrintDialog PrintDialog1.Document = PrintDocument1 Case 3 PrintPreviewDialog1.Document = PrintDocument1 ' Association pour PrintPreviewDialog Case 4 PrintPreviewControl1.Document = PrintDocument1 ' Association pour PrintPreviewControl Case 0 ' Rien faire ici. Le paramtre 0 est prvu pour entrer dans la procdure, mme sil ny ' a aucune association rgler (comme dans BPrintDocument_Click). Les 2 lignes crites ' aprs End Select doivent toujours tre excutes. End Select PrintDocument1.DocumentName = TDocument.Text MonDoc = New StreamReader(PrintDocument1.DocumentName) End Sub Private Sub BPageSetup_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BPageSetup.Click InitialiseComposants(1) PageSetupDialog1.ShowDialog() End Sub Private Sub BPrintDial_Click(ByVal sender As System.Object, ByVal e As system.EventArgs) Handles BPrintDial.Click InitialiseComposants(2) PrintDialog1.ShowDialog() End Sub Private Sub BPrintPreviewDial_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BPrintPreviewDial.Click InitialiseComposants(3) PrintPreviewDialog1.ShowDialog() MonDoc.Close() End Sub Private Sub BPrintPreviewControl_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BPrintPreviewControl.Click InitialiseComposants(4) ' Force la mise jour du contrle PrintPreviewControl1.InvalidatePreview() End Sub Private Sub BPrintDocument_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BPrintDocument.Click InitialiseComposants(0) PrintDocument1.Print() MonDoc.Close() End Sub Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage ' Replacer ici la procdure PrintDocument1_PrintPage dj crite pour limpression dun fichier ' texte End Sub End Class

09/08/2011

PHR VB.Net VBPV - 49

Programmation multi formulaires


Louverture de formulaires secondaires
Une application Windows dispose dun formulaire de dmarrage, qui est de ce fait son formulaire principal, et toute fentre doit tre instancie et affiche la demande. Soit une application qui contient deux formulaires, FBase et FTest. Le formulaire de dmarrage est FBase. Il saffiche automatiquement ds lapplication charge. Il est muni dun bouton Fentre secondaire destin ouvrir FTest. Ce dernier est muni dun bouton Fin pour le retour FBase. Voici le code douverture de FTest dans FBase :
Private Sub BOuvreFTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOuvreFTest.Click Dim FSecondaire As New FTest FSecondaire.Show() Cette criture de BOuvreFTest permet linstanciation simultane End Sub de plusieurs fentres FTest, chacune ayant ses ventuelles donnes rinitialises. Les 2 lignes de codes de cette procdure peuvent tre remplaces par FTest.Show(). Dans ce cas, FTest est unique et conserve ses ventuelles donnes dun appel lautre. Le code de fermeture de FTest est le suivant : Private Sub BFin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BFin.Click Me.Close() End Sub

Dans cette situation multi formulaires, lusage de la mthode Me.Close nquivaut pas utiliser linstruction End. Cette dernire provoque larrt de toute lapplication et ne doit tre utilise qu bon escient. Dans cet exemple, il nest pas question de tout arrter, mais seulement de fermer FTest et de continuer les traitements avec FBase.

Le passage de donnes entre formulaires


La communication dinformations entre deux fentres est chose courante. Les techniques qui permettent cette communication sont multiples. Afin den illustrer quelques unes, voici une hypothtique application de gestion dun signaltique complexe de personnes comportant notamment les quatre formulaires suivants :
FBase, dont le titre est Gestion des personnes,

est une fentre de slection dune personne. Cest par elle aussi que se commande lencodage dune nouvelle personne.
FAffiche, dont le titre est Affichage, est la fentre de consultation de lensemble des informations concernant la personne slectionne dans FBase. Dans cet exemple, la seule information affichable est le nom de la personne. FVerifie, dont le titre est Vrification correction, est la fentre de modification des informations concernant la personne slectionne dans FBase. Dans cet exemple, la seule information modifiable est le nom de la personne. FEncode, dont le titre est Encodage, est la fentre dencodage des informations concernant une nouvelle personne.

Dans cet exemple, la seule information encoder est le nom de la personne.

09/08/2011

PHR VB.Net VBPV - 50

Laffichage du signaltique complet pour consultation se commande par le bouton Affichage de FBase. Laffichage du signaltique complet pour dition se commande par le bouton Vrification. Dans un cas comme dans lautre, il faut quune personne soit slectionne dans la ListBox MesPersonnes. Voici le code de FBase qui provoque louverture des fentres concernes en leur passant linformation ncessaire, savoir le nom de la personne dans cet exemple.
Private Selection As Integer
' Seule variable de la classe FBase, pour mmoriser l'indice d'une slection

Une procdure prive a t cre pour laffichage dun message en cas de tentative daffichage ou ddition alors quil ny a pas de slection. Cette procdure peut donc tre appele par BAffiche_Click et par BVerification_Click. Le libell du bouton concern lui est pass en paramtre de sorte rendre le message plus prcis.
Private Sub MessageErreur(ByVal TexteDuBouton As String) MessageBox.Show("Une personne doit tre slectionne pour utiliser " & TexteDuBouton) End Sub

Pour laffichage, la mthode choisie pour la communication de linformation FAffiche consiste profiter de la porte par dfaut de tout objet dpos sur un formulaire, qui est Friend, pour affecter directement la TextBox daffichage TUnePers.
Private Sub BAffiche_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAffiche.Click ' Seulement si une slection existe If MesPersonnes.SelectedItems.Count = 1 Then Dim Fs As New FAffiche Fs.TUnePers.Text = MesPersonnes.SelectedItem ' Affecter la slection la TextBox ' Passer le nom du Form appelant Fs.Owner = Me Fs.ShowDialog() Else ' Passer le libell du bouton au message MessageErreur(BAffiche.Text) End If End Sub

Pour ldition, la mthode choisie pour la communication de linformation FVerifie consiste utiliser une proprit Entree cre cette fin dans cette classe. Cette faon de faire est conforme au contrle daccs prconis en POO : on accde aux proprits dune classe par les mthodes quelle expose pour cela.
Private Sub BVerification_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BVerification.Click If MesPersonnes.SelectedItems.Count = 1 Then Dim Fs As New FVerifie ' Mmoriser l'indice tant quon a le focus Selection = MesPersonnes.SelectedIndex Fs.Entree = MesPersonnes.SelectedItem ' Affecter une proprit du form Fs.Owner = Me ' Passer le nom du Form appelant Fs.ShowDialog() Else ' Passer le libell du bouton au message MessageErreur(BVerification.Text) End If End Sub

Dans cette application, le nom du formulaire appelant doit tre pass aux formulaires instancis. Cest la proprit Owner, au nom symbolique, qui est utilise cet effet mais la proprit Tag aurait tout aussi bien fait laffaire. Quand un formulaire est la proprit d'un autre, il est rduit et ferm en mme temps que son formulaire propritaire. Par exemple, si Form2 appartient Form1, la fermeture ou la rduction de Form1 entrane celle de Form2. En outre, un formulaire dtenu par un autre formulaire n'est jamais affich derrire son propritaire. Si ces caractristiques de la relation de proprit ne conviennent pas, il est toujours possible de crer une proprit dans le formulaire secondaire pour lui transmettre le nom de lappelant. Il suffit daffecter ensuite cette proprit de la mme faon que nimporte quelle autre valeur.

09/08/2011

PHR VB.Net VBPV - 51

Voici le code complet de FAffiche :


Public Class FAffiche Dim Fp As FBase
' Rfrence un Form de type FBase

Private Sub FAffiche_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated ' Dsignation du formulaire appelant Fp Fp = Me.Owner BOK.Select() End Sub Private Sub BOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BOK.Click ' Accs direct un objet de FBase Fp.LDernierAffiche.Text = Me.TUnePers.Text Me.Close() End Sub End Class

Lapplication conserve dans ltiquette LDernierAffiche le dernier affichage ralis par FAffiche. Pour lexemple, cest de la classe FAffiche quest affect ce Label. La mthode choisie pour la communication de linformation FBase est la mme que celle utilise par FBase pour transmettre le texte FAffiche, c'est--dire laffectation directe dun objet du formulaire destinataire. Voici maintenant le code complet de FVerifie :
Public Class FVerifie Private Fp As FBase Private Modifiee As Boolean
' Rfrence un Form de type FBase ' A passer MiseAJour de Fp

Private Sub FVerifie_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Dsignation du formulaire appelant Fp Fp = Me.Owner Modifiee = False End Sub Private Sub TUnePers_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TUnePers.TextChanged ' Lvnement TextChanged indique Modifiee = True ' sil y a modification End Sub Private Sub BCorrecte_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCorrecte.Click ' Ne pas envoyer une chane vide If Me.TUnePers.Text <> String.Empty Then ' Accs une mthode Friend de Fp Fp.MiseAJour(Modifiee, TUnePers.Text) End If Me.Close() End Sub Private Sub BIncorrecte_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BIncorrecte.Click ' Accs une autre mthode Friend de Fp Fp.Supprime() Me.Close() End Sub Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAnnule.Click Me.Close() End Sub

09/08/2011

PHR VB.Net VBPV - 52

Public WriteOnly Property Entree() As String Set(ByVal Valeur As String) TUnePers.Text = Valeur End Set End Property End Class

' Mthode daccs une proprit ' locale ' Stockage de la valeur affecte ' cette proprit dans FBase

Plusieurs tches sont disponibles dans FVerifie. Il reoit les informations signaltiques par sa mthode Entree et les affiche dans les zones appropries. Lutilisateur peut alors dclarer les informations correctes. Si elles ont t modifies, elles sont remplaces dans FBase. Cest pourquoi la valeur de la variable Modifiee est passe la mthode MiseAJour de FBase. Les informations peuvent aussi tre simplement dclares incorrectes et dans ce cas elles sont supprimes dans FBase par sa mthode Supprime. Lutilisateur peut aussi navoir rien dire des informations qui lui sont soumises et annuler la vrification. Voici le code des mthodes MiseAJour et Supprime de FBase :
Friend Sub MiseAJour(ByVal ValeurChangee As Boolean, ByVal Personne As String) If ValeurChangee Then Supprime() ' Suppression de la ligne errone Me.MesPersonnes.Items.Insert(Selection, Personne) ' et remplacement par la bonne End if End Sub Friend Sub Supprime() Me.MesPersonnes.Items.RemoveAt(Selection) End Sub

' Suppression de la ligne errone

Il reste examiner les liens existant entre FBase et FEncode. Voici le code concern dans FBase. La mthode Encodage est dclare Friend pour pouvoir tre utilise dans FEncode.
Private Sub BEncodage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEncodage.Click Dim Fs As New FEncode ' Passer le nom du Form appelant Fs.Owner = Me Fs.ShowDialog() If Not Fs.Abandonne Then ' Appeler la mthode locale Encodage Encodage(Fs.NomEncode()) End If ' pour le stockage de la proprit ' renvoye par la mthode NomEncode End Sub
' de Fs.

Friend Sub Encodage(ByVal Personne As String) Me.MesPersonnes.Items.Add(Personne) End Sub

Laffichage modal de FEncode est indispensable ici car le formulaire secondaire doit rester actif jusqu' la fin du traitement et ne pas permettre FBase de continuer ses traitements. Sil nest pas modal, FBase reoit la proprit NomEncode ds louverture de FEncode alors que rien n'a encore t encod. Cela entrane lajout dune ligne vide. Indpendamment de la proprit retourne par FEncode, cette dernire utilise la mthode Encodage de FBase pour enregistrer des encodages successifs, sans retour FBase. Voici le code complet de FEncode :
Public Class FEncode Private Annule As Boolean Private Modifiee As Boolean Private Fp As FBase
' Pour ne pas enregistrer sur une annulation ' Pour ne pas ajouter une valeur dj ' enregistre

09/08/2011

PHR VB.Net VBPV - 53

Private Sub FEncode_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Fp = Me.Owner TUnePers.Clear() Modifiee = False End Sub Private Sub FEncode_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated TUnePers.Select() End Sub Private Sub TUnePers_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TUnePers.TextChanged ' Lvnement TextChanged indique Modifiee = True ' sil y a modification End Sub Private Sub BOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOK.Click ' A la sortie, si la valeur est dj Annule = Not Modifiee Me.Close() ' enregistre, Annule reoit True et cette ' mthode devient quivalente BAnnule_Click End Sub Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAnnule.Click Annule = True Me.Close() End Sub Private Sub BAjout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAjout.Click If Me.TUnePers.Text <> String.Empty Then ' Accs la mthode Encodage de Fp Fp.Encodage(Me.TUnePers.Text) TUnePers.Clear() ' Rinitialise Modifiee aprs enregistrement Modifiee = False End If TUnePers.Select() End Sub Public ReadOnly Property NomEncode() As String Get ' Rponse la demande daccs NomEncode Return TUnePers.Text ' par Fp End Get End Property Public ReadOnly Property Abandonne() As Boolean Get Return Annule End Get End Property End Class

La rponse lvnement Click du bouton BOK rend le focus la fentre appelante FBase. Cette dernire continue alors son traitement et prend possession de la valeur demande par Fs.NomEncode dans BEncodage_Click. Entre le moment o FEncode reoit le focus et le moment o FBase le rcupre, la procdure BAjout_Click de FEncode a ajout toutes les valeurs dune mme session dencodage dans la ListBox MesPersonnes de FBase. Bien que FBase nait pas le focus, sa ListBox est effectivement mise jour au fur et mesure des encodages.

09/08/2011

PHR VB.Net VBPV - 54

Si le formulaire dencodage ne doit pas permettre lencodage de plusieurs personnes en une mme session, le code peut tre crit autrement. Dans FBase, la procdure dappel de FEncode est la suivante :
Private Sub BEncodage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEncodage.Click Dim Fs As New FEncode Fs.ShowDialog() If Not Fs.Abandonne Then ' Rponse fournie par la proprit NomEncode de Fs Encodage(Fs.NomEncode()) End If End Sub

Aucune mthode et aucun objet de FBase nest directement utilis dans FEncode qui na ainsi pas besoin de connatre lappelant.
Public Class FEncode Private Annule As Boolean Private Sub FEncode_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated TUnePers.Clear() TUnePers.Select() End Sub Private Sub BOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOK.Click If TUnePers.Text = String.Empty Then Annule = True Else Annule = False End If Me.Close() End Sub Public ReadOnly Property NomEncode() As String Get Return TUnePers.Text End Get End Property Public ReadOnly Property Abandonne() As Boolean Get Return Annule End Get End Property Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAnnule.Click Annule = True Me.Close() End Sub End Class

Le cas de lexemple ci-dessus, o le formulaire dencodage doit fournir une seule chane de caractres par session dencodage, rappelle un outil de saisie qui existait dans les versions antrieures de VB : lInputBox. Cet outil est encore disponible dans la librairie MicroSoft.VisualBasic.Interaction mais ne sutilise plus de la mme manire que son anctre. La ralisation dune InputBox ressemblant autant que possible lancienne permet daborder une autre forme de communication entre formulaires.

09/08/2011

PHR VB.Net VBPV - 55

LInputBox lancienne
Voici une InputBox apparemment identique celle propose autrefois en VB 6. Elle est utilise ici pour rpondre une demande dencodage effectue par un clic du bouton Encodage du formulaire FBase de lapplication prcdente. Elle remplace donc le formulaire FEncode de cette application. Dans FBase, le code de rponse ce clic est le suivant :
Private Sub BEncodage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEncodage.Click Dim x As String x = New InputBox("Nom de la personne ?", "Encodage", "", ).Resultat() If x <> String.Empty Then Encodage(x) End If End Sub

Lappel de lInputBox se fait par une instanciation et le rsultat est obtenu par la lecture de sa proprit Resultat. Mises part ces deux diffrences, les programmeurs VB 6 reconnatront leur InputBox. Plusieurs informations sont passes lInputBox lors de cet appel. La premire chane de caractres constitue la question que lInputBox doit afficher. La deuxime est son titre. La troisime, une chane vide dans cet exemple, est la valeur proposer par dfaut lutilisateur. La quatrime, qui nest pas exploite ici, constituerait la rponse renvoyer en cas dannulation par lutilisateur. Pour passer ces quatre chanes lInputBox, la mthode choisie ici consiste surcharger le constructeur de la nouvelle classe de sorte quil accepte les paramtres souhaits et les utilise comme il convient. Toutes les classes possdent un constructeur qui est New et qui est excut chaque fois quun objet est instanci. Pour le surcharger, il suffit de le rcrire comme souhait. Cest ce qui est fait ci-dessous dans Public Sub New. Toutefois, le constructeur initial a des tches raliser et notamment, dans le cas dune fentre, il doit excuter le code gnr par le Concepteur Windows Form qui ralise le dessin lcran des composants visuels. Cest pour cette raison que la nouvelle procdure de surcharge commence par lappel du constructeur initial : Me.InitializeComponent(). Voici le code complet de la classe InputBox.
Public Class InputBox Dim ValeurSiAnnulation As String Public Sub New(ByVal Msg As String, Optional ByVal Titre As String = " ", Optional ByVal ValeurParDefaut As String = Nothing, Optional ByVal ValeurSiAnnule As String = Nothing) ' Une fois la fentre dessine, il faut rgler ses Me.InitializeComponent() ' composants en fonction des valeurs reues par Me.Text = Titre ' paramtres : le Titre, la question Msg pour le LMsg.Text = Msg ValeurSiAnnulation = ValeurSiAnnule ' Label LMsg, la valeur par dfaut pour la TextBox ' TReponse et la valeur retourner en cas TReponse.Text = ValeurParDefaut ' dannulation stocker dans la variable TReponse.TabIndex = 0 ' ValeurSiAnnulation rserve cet effet. Me.ControlBox = True ' Quelques rglages supplmentaires pour donner Me.MaximizeBox = False ' lapparence souhaite lInputBox Me.MinimizeBox = False Me.CancelButton = BAnnule Me.AcceptButton = BOK Me.TopMost = True Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog Me.StartPosition = FormStartPosition.CenterParent ' et il ny a plus qu lafficher. Me.ShowDialog() End Sub

09/08/2011

PHR VB.Net VBPV - 56

Public ReadOnly Property Resultat() As String Get ' La proprit Resultat retourne la valeur de la Return TReponse.Text End Get ' TextBox TReponse End Property Private Sub BOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BOK.Click ' Rendre la main Me.Close() End Sub Private Sub BAnnule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BAnnule.Click ' Placer la valeur adquate en cas dannulation et TReponse.Text = ValeurSiAnnulation ' rendre la main Me.Close() End Sub End Class

Rsum des modes de communications abords


Le formulaire FBase affecte directement lobjet TUnePersonne de FAffiche en profitant de la porte Friend de cet objet. De mme, FAffiche affecte directement le Label LDernierAffiche de FBase :
Dim Fs As New FAffiche Fs.TUnePers.Text = MesPersonnes.SelectedItem Fp = Me.Owner Fp.LDernierAffiche.Text = Me.TUnePers.Text
' Dans FBase

' Dans FAffiche

Le formulaire FVerifie ralise la mise jour de donnes dans FBase en utilisant directement la procdure MiseAJour dclare Friend dans ce dernier :
Friend Sub MiseAJour(ByVal ValeurChangee As Boolean, ByVal Personne As String) ' FBase Fp.MiseAJour(Modifiee, TUnePers.Text)
' Dans FVerifie

Le formulaire FBase passe son nom aux formulaires appels par laffectation de leur proprit Owner :
Fs.Owner = Me Fp = Me.Owner
' Dans FBase ' Dans FAffiche notamment

Le formulaire FBase passe une valeur FVerifie par une propit Entree cre cet effet dans ce dernier. De mme, FBase accde aux proprits NomEncode et Abandonne de FEncode par les mthodes Property cres pour cela :
Dim Fs As New FVerifie Fs.Entree = MesPersonnes.SelectedItem If Not Fs.Abandonne Then Encodage(Fs.NomEncode()) Public WriteOnly Property Entree() As String Public ReadOnly Property NomEncode() As String Public ReadOnly Property Abandonne() As Boolean
' Dans FBase

' Dans FBase

' Dans FEncode

Le constructeur de InputBox est surcharg pour permettre lenvoi dinformations lors de linstanciation :
x = New InputBox("Nom de la personne ?", "Encodage", "", ).Resultat()
' Dans FBase

09/08/2011

PHR VB.Net VBPV - 57

Lexploitation des mmoires de masse


Lexploitation des mmoires de masse concerne la cration et la gestion des dossiers et des fichiers quils contiennent. Bien quayant de nombreux points communs, dossiers et fichiers mritent des approches distinctes. Les dossiers stockent les fichiers quon y place, sans considration de leur contenu, et les fichiers, dont lorganisation du contenu peut relever dalgorithmes complexes, conservent les donnes des applications. De plus, les outils des traitements des uns et des autres fournis par VB.Net appartiennent des classes diffrentes, bien que toutes drives de System.IO. La dclaration Imports System.IO est donc requise. Ce sont notamment les classes Directory et File, DirectoryInfo et FileInfo, Path, Stream, StreamWriter et StreamReader, TextWriter et TextReader, BinaryWriter et BinaryReader, ainsi que la classe FileStream qui permet notamment la gestion de fichiers accs relatif par lusage dune mthode Seek. Le contenu de cette partie du cours est limit lexamen des principaux membres de quelques unes de ces classes. Pour commencer, voici quelques exemples qui se passent gnralement de commentaires et qui illustrent les oprations de base sur les dossiers et les fichiers.

Les dossiers
Liste des units
Dim MesLecteurs() As String = Directory.GetLogicalDrives Dim UnLecteur As String For Each UnLecteur In MesLecteurs LBMaListe.Items.Add(UnLecteur) Next

Liste des dossiers dune unit


Dim MesDossiers() As String = Directory.GetDirectories("X:\") Dim UnDossier As String For Each UnDossier In MesDossiers LBMaListe.Items.Add(UnDossier) Next

Liste des fichiers dun dossier


Dim MesFichiers() As String = Directory.GetFiles("X:\MonDossier") Dim UnFichier As String For Each UnFichier In MesFichiers LBMaListe.Items.Add(UnFichier) Next

Liste des sous dossiers et fichiers dun dossier


Private Sub ExploreSousDossiers(ByVal Dossier As String) ' Charger LBMaListe avec les fichiers du Dossier
(placer ce code dans un Try permettrait dignorer les fichiers protgs par le systme)

Dim MesFichiers() As String = Directory.GetFiles(Dossier) Dim UnFichier As String GetFiles et GetDirectories peuvent recevoir un second For Each UnFichier In MesFichiers paramtre dsignant le nom ou une partie du nom de lobjet LBMaListe.Items.Add(UnFichier) recherch, ainsi quun troisime paramtre indiquant si la Next recherche doit se faire rcursivement. ' Charger LBMaListe avec les sous dossiers du Dossier
(placer ce code dans un Try permettrait dignorer les dossiers protgs par le systme)

Dim SousDossiers() As String = Directory.GetDirectories(Dossier) Dim UnDossier As String For Each UnDossier In SousDossiers LBMaListe.Items.Add(UnDossier) ' Rappel rcursif de la procdure ExploreSousDossiers(UnDossier) Next End Sub

09/08/2011

PHR VB.Net VBPV - 58

Crer un dossier
Dim UnDossierNeuf As String = "X:\Tmp\MonDossierNeuf" Directory.CreateDirectory(UnDossierNeuf)

ou

' Mieux vaut utiliser Directory que DirectoryInfo ' quand cest possible (scurit multi Threads) Dim UnDossierNeuf As String = "X:\Tmp\MonDossierNeuf" Dim DossierACreer As New DirectoryInfo(UnDossierNeuf) DossierACreer.Create()

Copier un dossier
Le langage noffre aucune mthode de copie de dossier. Il faut donc la programmer. Voici une procdure qui ralise la copie rcursive des fichiers et sous dossiers dun rpertoire donn. Les blocs Try dinterception derreurs sont destins ici viter larrt de la procdure lorsquelle est confronte un dossier ou un fichier protg par le systme. Cest lutilisation du Try qui est suggre dans la procdure ExploreSousDossiers.
Private Sub CopieDossiers(ByVal DossierSource As String, ByVal DossierCible As String) ' La classe Path donne notamment la mthode GetFileName qui permet dextraire le nom du ' fichier ou du sous dossier dun chemin complet Directory.CreateDirectory(DossierCible) Try Dim MesFichiers() As String = Directory.GetFiles(DossierSource) Dim UnFichier As String For Each UnFichier In MesFichiers File.Copy(UnFichier, DossierCible & "\" & Path.GetFileName(UnFichier)) Next Catch End Try Try Dim SousDossiers() As String = Directory.GetDirectories(DossierSource) Dim UnDossier As String For Each UnDossier In SousDossiers CopieDossiers(UnDossier, DossierCible & "\" & Path.GetFileName(UnDossier)) Next Catch End Try End Sub

Dplacer un dossier
Le code suivant permet le dplacement dun dossier vers un autre sur la mme unit de mmoire de masse.
Directory.Move("X:\Tmp\MonDossier", "X:\Trsf\DossierDeplace")

Pour dplacer un dossier vers une autre unit de mmoire de masse, il faut dabord le copier et supprimer ensuite le dossier source.

Renommer un dossier
Directory.Move("X:\Tmp\MonDossier", "X:\Tmp\DossierRenomme")

Supprimer un dossier
Dim UnVieuxDossier As String = "X:\Tmp\MonVieuxDossier" Directory.Delete(UnVieuxDossier, True) ' True pour une suppression rcursive

09/08/2011

PHR VB.Net VBPV - 59

Les fichiers
Crer un fichier
Dim UnFichierNeuf As String = "X:\Tmp\MonFichierNeuf.TXT" File.Create(UnFichierNeuf)

ou

' Mieux vaut utiliser File que FileInfo ' quand cest possible (scurit multi Threads) Dim UnFichierNeuf As String = "X:\Tmp\MonFichierNeuf.TXT" Dim FichierACreer As New FileInfo(UnFichierNeuf) FichierACreer.Create()

Copier un fichier
File.Copy("X:\Tmp\MonFichier", "X:\Tmp\MonFichierCopie")

Dplacer un fichier
File.Move("X:\Tmp\MonFichier", "X:\Trsf\FichierDeplace")

Contrairement ce quil en est avec les dossiers, il est permis de dplacer un fichier vers une autre unit de mmoire de masse.

Renommer un fichier
File.Move("X:\Tmp\MonFichier", "X:\Tmp\FichierRenomme")

Supprimer un fichier
Dim UnVieuxFichier As String = "X:\Tmp\MonVieuxFichier" File.Delete(UnVieuxFichier)

09/08/2011

PHR VB.Net VBPV - 60

Cration, enregistrement et lecture dun fichier texte


La spcificit dun fichier texte est dtre enregistr ligne par ligne. Ce sont les squences de caractres des fins de lignes qui dlimitent chaque enregistrement qui peuvent tre de longueurs diffrentes. Ces fichiers sont lus squentiellement. Ce sont les classes StreamWriter et StreamReader qui fournissent les outils ncessaires.
' Ouverture en cration : si le fichier existe, il est remplac Dim FichierSortie As New StreamWriter("X:\Tmp\MonFichierNeuf.TXT") ' Enregistrement For i As Integer = 1 to 5 FichierSortie.WriteLine("Ligne " & i) Next i ' FichierSortie.Flush() FichierSortie.Close()
' Close effectue Flush

' Ouverture en ajout : si le fichier nexiste pas, il est cr Dim FichierSortie As New StreamWriter("X:\Tmp\MonFichierNeuf.TXT", True) ' Enregistrement des lignes supplmentaires For i As Integer = 6 to 10 FichierSortie.WriteLine("Ligne " & i) Next i FichierSortie.Close() ' Ouverture en lecture Dim FichierEntree As New StreamReader("X:\Tmp\MonFichierNeuf.TXT") ' Lecture : premire solution ' ' ' ' ' '
Dim Ligne As String Ligne = FichierEntree.ReadLine() While Ligne <> String.Empty LBMaListe.Items.Add(Ligne) Ligne = FichierEntree.ReadLine() End While

' Lecture : meilleure solution Do Until FichierEntree.Peek = -1 LBMaListe.Items.Add(FichierEntree.ReadLine()) Loop FichierEntree.Close()


' ' ' ' Peek donne le prochain octet sans influencer la lecture suivante. Quand cet octet vaut -1, il signifie EOF

09/08/2011

PHR VB.Net VBPV - 61

Cration, enregistrement et lecture dun fichier de donnes accs squentiel


Le fichier accs squentiel permet lenregistrement de structures complexes. Les champs de chaque enregistrement, ainsi que les enregistrements eux-mmes, peuvent tre de longueurs diffrentes. Il nest pas ncessaire en VB.Net dutiliser des dlimiteurs de champs, ni des sparateurs denregistrements. Lusage des instructions de lecture appropries permet laccs aux diffrentes donnes selon leur type. Ces fichiers sont lus squentiellement. Ce sont les classes BinaryWriter et BinaryReader qui fournissent les outils ncessaires.
Imports System.IO Public Class FSequentiel Structure Personne Dim Nom As String Dim Age As Integer End Structure Private Sub BEnregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BEnregistrer.Click Dim UnePersonne As Personne Static NouvelleSession As Boolean = True Dim FichierSortie As String = "X:\Tmp\MonFichierData.dat" Static FSortie As BinaryWriter If NouvelleSession Then FSortie = New BinaryWriter(File.Open(FichierSortie, _ FileMode.Append, _ FileAccess.Write)) NouvelleSession = False End If With UnePersonne .Nom = TNom.Text .Age = CType(TAge.Text, Integer) If .Nom <> String.Empty And .Age > 0 Then FSortie.Write(.Nom) FSortie.Write(.Age) Else FSortie.Close() NouvelleSession = True End If End With End Sub ' Attention, la procdure BLire_Click suivante ne peut tre active quaprs la fermeture ' du fichier par la procdure BEnregistrer_Click ci-dessus. Private Sub BLire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BLire.Click Dim UnePersonne As Personne Dim FichierEntree As String = "X:\Tmp\MonFichierData.dat" Dim FEntree As BinaryReader FEntree = New BinaryReader(File.Open(FichierEntree, _ FileMode.Open, _ FileAccess.Read)) LBMaListe.Items.Clear() While FEntree.PeekChar() <> -1 With UnePersonne .Nom = FEntree.ReadString() .Age = FEntree.ReadInt32() LBMaListe.Items.Add(.Nom & " " & .Age) End With End While FEntree.Close() End Sub End Class

09/08/2011

PHR VB.Net VBPV - 62

Cration, enregistrement et lecture dun fichier de donnes accs alatoire


Le fichier accs random ( la demande), aussi nomm fichier accs direct, ou relatif, permet lenregistrement de structures complexes. Les champs de chaque enregistrement, et donc les enregistrements eux-mmes, doivent tre tous de la mme longueur. Un tel fichier peut tre lu squentiellement, mais aussi par accs direct un enregistrement souhait, notamment pour permettre le remplacement dun enregistrement modifi. Cest la classe FileStream qui fournit les outils ncessaires. Le fichier est une instance de la classe FileStream et son ouverture est ralise par le constructeur selon les mode et type daccs qui lui sont passs par paramtres.
Dim Fichier As FileStream Dim NomFichier As String = "X:\MesDonnees\MonFichier.dat" Fichier = New FileStream(NomFichier, FileMode, FileAccess)

Les modes douvertures Le mode douverture dun fichier est donn par une des valeurs possibles du paramtre FileMode du constructeur. Ouverture dun fichier en ajout et positionnement pour criture la fin. Si le fichier nexiste pas, il est cr. Le mode daccs FileAccess.Write est le seul permis sous ce mode douverture. Create Ouverture dun fichier en cration et positionnement pour criture au dbut. Si le fichier existe, il est remplac. Le mode daccs FileAccess.Read est interdit sous ce mode douverture. CreateNew Ouverture dun fichier en cration et positionnement pour criture au dbut. Si le fichier existe, une exception est gnre. Le mode daccs FileAccess.Read est interdit sous ce mode douverture. Open Ouverture dun fichier existant. Si le fichier nexiste pas, une exception est gnre. OpenOrCreate Ouverture dun fichier existant ou cration sil nexiste pas. Truncate Ouverture et vidange dun fichier existant. Si le fichier nexiste pas, une exception est gnre. Le mode daccs FileAccess.Read est interdit sous ce mode douverture.
Append

Les types daccs Le type daccs un fichier est donn par une des valeurs possibles du paramtre FileAccess du constructeur.
Read ReadWrite Write

Accs en lecture seule au fichier. Accs en lecture et en criture au fichier. Accs en criture seule au fichier.

Tableau rcapitulatif des associations permises du mode douverture et du type daccs Si le fichier existe
Read Append Create CreateNew Open OpenOrCreate Truncate
Err. Err. Err.

Si le fichier nexiste pas


Write OK OK
Err.

ReadWrite
Err.

Read
Err. Err. Err. Err.

ReadWrite
Err.

OK
Err.

OK OK
Err.

Write OK OK OK
Err.

OK OK
Err.

OK OK OK

OK OK OK

OK
Err.

OK
Err.

OK
Err.

Quelques membres de la classe FileStream


Length Position

Cette proprit contient la taille du fichier en octets. Cette proprit contient la position du prochain octet accessible dans le fichier. A louverture du fichier,
Position vaut 0. Quand la fin de fichier est atteinte, Position a la mme valeur que Length.

09/08/2011

PHR VB.Net VBPV - 63

Close

La mthode Close force lenregistrement des donnes non encore transfres vers la mmoire de masse, ferme le fichier, et libres les ressources utilises pour son exploitation. La mthode Flush force lenregistrement des donnes non encore transfres vers la mmoire de masse et vide le buffer. Cette mthode force le dplacement du pointeur du fichier dun nombre doctets spcifi par rapport une position galement spcifie et choisie parmi SeekOrigin.Begin, SeekOrigin.Current et SeekOrigin.End.

Flush

Seek

WriteByte Cette mthode crit un seul Byte dans le fichier : Fichier.WriteByte(UneVarDeTypeByte). ReadByte

Cette mthode lit un seul Byte du fichier : Fichier.ReadByte(UneVarDeTypeByte).

Lcriture et la lecture du fichier Outre les mthodes marginales WriteByte et ReadByte, ce sont les mthodes Write et Read qui permettent lexploitation dun fichier accs direct. Elles ont en commun la manipulation dun nombre donn de Byte appartenant ou affects un vecteur partir dun indice galement donn. Cet indice peut avoir une des valeurs de 0 Count - 1. Le nombre doctets lire ou crire ne peut tre suprieur Count IndiceDepart.
Fichier.Write(VecteurDeBytes, IndiceDansLeVecteur, NombreDeBytesAEcrire) Fichier.Read(VecteurDeBytes, IndiceDansLeVecteur, NombreDeBytesALire)

La mthode Read retourne le nombre doctets effectivement lus. Ce nombre peut tre infrieur au NombreDeBytesALire demand lorsque que la fin du fichier est atteinte.
Nombre = Fichier.Read(VecteurDeBytes, IndiceDansLeVecteur, NombreDeBytesALire)

Lusage dun vecteur de Byte impose que les donnes enregistrer soient converties dans ce type et que les donnes lues subissent la conversion inverse. La classe System.Text.Encoding offre le ncesaire ces conversions sous la forme du jeu de proprits numres ci-dessous et des mthodes GetBytes et GetString.
ASCII Default UTF7 UTF8 Unicode BigEndianUnicode UTF32

Codage pour le jeu de caractres ASCII (7 bits). Codage de la page de codes ANSI actuelle du systme. Codage du format UTF-7. Codage du format UTF-8. Codage du format UTF-16 avec primaut des octets de poids faible (Little endian). Codage du format UTF-16 avec primaut des octets de poids fort (Big endian). Codage du format UTF-32 avec primaut des octets de poids faible (Little endian).

Le jeu de caractres ASCII sur 7 bits ne concerne que les caractres 0 127 et le jeu par dfaut peut handicaper lusage dun fichier sur un autre systme dont le format par dfaut serait diffrent. LUTF reprsente un des formats de codage du jeu de caractres universel (UTF pour UCS Transformation Format et UCS pour Universal Characters Set). Il faut que le format choisi soit le mme lenregistrement et la lecture.
MonVecteur = System.Text.Encoding.UTF8.GetBytes(UneChaine) UneChaine = System.Text.Encoding.UTF8.GetString(MonVecteur)

Les enregistrements doivent tre dune mme longueur. Cela implique que les diffrents champs soient traits avant leur concatnation et leur conversion en tableau de Byte. Toutes les valeurs numriques peuvent aisment converties en chanes par CType ou ToString et toutes les chanes doivent tre ajustes une longueur convenable. Les mthodes PadRight et PadLeft de la classe String servent complter une chane en reproduisant un caractre donn jusqu lobtention de la longueur souhaite. De plus la chane traite est aligne droite ou gauche selon la mthode choisie. La mthode SubString de la classe String permet de tronquer les chanes trop longues. Les caractres excdentaires peuvent tre enlevs droite ou gauche selon le paramtrage de la mthode.
S = UneChaine.PadRight(6,"+"c)
' Si UneChaine est 1234, ' le rsulat S vaut 1234++

09/08/2011

PHR VB.Net VBPV - 64

S = UneChaine.PadLeft(6,"~"c) S = UneChaine.Substring(0, 4) S = UneChaine.Substring(UneChaine.Length - 4, 4)

' ' ' ' ' '

Si le Si le Si le

UneChaine rsulat S UneChaine rsulat S UneChaine rsulat S

est 1234, vaut ~~1234 est 123456, vaut 1234 est 123456, vaut 3456

Lors de la lecture des enregistrements, les mthodes TrimStart et TrimEnd de la classe String permettent la suppression aise des caractres ajouts. La mthode Trim sans paramtre te les espaces gauche et droite.
S = UneChaine.TrimStart("~") S = UneChaine.TrimEnd("+") S = UneChaine.TrimStart() S = UneChaine.TrimEnd()
' ' ' ' ' ' Si UneChaine est ~~1234, le rsulat S vaut 1234 Si UneChaine est 1234++, le rsulat S vaut 1234 Enlve les espaces gauche Enlve les espaces droite

Exemple complet Lapplication permet une gestion simple de personnes lcran par des botes de textes TNom et TSalaire destin lencodage, ainsi quun ListView LVPers destin la consultation et aux slections. Linformation Numro prsente dans TNumero et dans la premire colonne de LVPers ne peut tre modifie. Elle reprsente le numro de lenregistrement de la personne dans le fichier principal. Ce numro vaut 0 tant que les donnes nont pas t effectivement enregistres. Les botes de textes TFichierPrincipal et TFichierCopie doivent recevoir les chemins et noms complets des fichiers. Le premier fichier est celui de toutes les personnes et le second est destin recevoir la copie denregistrements slectionns dans LVPers. Les boutons Ajouter la liste (BAjouterListe) et Supprimer de la liste (BSupprimerListe) permettent le pilotage de LVPers. Les boutons Tout lire (BChargerTout) et Tout sauver (BEnregistrerTout) assurent respectivement la lecture et lenregistrement de toutes les personnes du fichier principal. Le bouton Ajouter dans le fichier (BAjouterFichier) provoque lcriture dun seul enregistrement, celui dont les donnes sont prsentes dans les TextBox. Le ListView est galement mis jour. Le bouton Modifier dans le fichier (BModifierFichier) provoque la r-criture de lenregistrement dont le numro et les donnes sont prsentes dans les TextBox. Le ListView est galement mis jour. Le bouton Copier la slection (BCopierSelection) provoque lenregistrement dans le deuxime fichier des enregistrements dont les donnes sont slectionnes dans LVPers. Afin dillustrer louverture simultane de deux fichiers et laccs direct, chaque enregistrement envoy vers le fichier de copie est dabord lu dans le fichier principal sur base de son numro prsent dans LVPers.
Imports System.IO Public Class FichierRandom Private Structure Personne Dim Nom As String Dim Salaire As Integer End Structure Private LongNom As Integer = 30 Private LongSalaire As Byte = 6 Private LongEnregistrement As Integer Private VBytes() As Byte Private UnEnregistrement As String Private NomPers As String Private SalPers As String
' ' ' ' ' ' La structure des donnes dune personne associe aux rglages des longueurs des champs ci-dessous, constitue la dfinition dun enregistrement. Elle est crite ici titre dexemple et nest utilise dans le code que lors de la lecture dun fichhier complet

' Valeur calcule au dmarrage du programme ' Lenregistrement sous forme dun vecteur de Byte ' et sous forme dune chane ' Les variables de manipulations des champs dun ' enregistrement

09/08/2011

PHR VB.Net VBPV - 65

' Programmation de quelques outils ' La fonction ByteVersString reconstitue une chane aprs la lecture dun enregistrement Private Function BytesVersString(ByRef DesBytes() As Byte) As String Return System.Text.Encoding.UTF8.GetString(DesBytes) End Function ' La fonction StringVersByte cre un vecteur de Byte partir dune chane de donnes Private Function StringVersBytes(ByVal UneChaine As String) As Byte() Return System.Text.Encoding.UTF8.GetBytes(UneChaine) End Function ' La fonction ALongueur permet la mise longueur et lalignement des donnes des champs Private Function ALongueur(ByVal UneChaine As String, ByVal UneLongueur As Integer, Optional ByVal Alignement As Byte = 0, Optional ByVal Caractere As Char = " "c) As String Select Case Alignement ' Alignement gauche (coupure ou ajout droite) Case 0 If UneChaine.Length > UneLongueur Then Return UneChaine.Substring(0, UneLongueur) Else Return UneChaine.PadRight(UneLongueur, Caractere) End If ' Alignement droite (coupure ou ajout gauche) Case 1 If UneChaine.Length > UneLongueur Then Return UneChaine.Substring(UneChaine.Length - UneLongueur, UneLongueur) Else Return UneChaine.PadLeft(UneLongueur, Caractere) End If End Select End Function ' ' ' ' '
La fonction AccesAuFichier regroupe toutes les commandes douverture et de fermeture des fichiers. Elle gre plusieurs fichiers par mise jour dun vecteur des rfrences alloues la demande. La fermeture dun fichier libre sa rfrence qui peut tre utilise ensuite pour un autre fichier. Seules les associations Mode_Ouverture Type_Accs utiles cet exemple ont t programmes (Cas 1 4). Le bloc Select peut tre complt selon les besoins.

Private Function AccesAuFichier(ByVal Job As Byte, ByRef Canal As Byte, Optional ByRef NomFichier As String = Nothing) As FileStream Static Dim Fichier() As FileStream = Nothing Static Dim CanalLibre As Integer = 0 Dim NumCanal As Integer ' Le Job 9 est rserv la fermeture dun fichier If Job < 9 Then For NumCanal = 0 To CanalLibre 1 ' Recherche dun Fichier() non attribu If Fichier(NumCanal) Is Nothing Then Exit For End If Next If NumCanal < CanalLibre Then ' Renvoyer lindice par Canal pass ByRef Canal = NumCanal Else ' Sil ny a pas de rfrence libre dans Fichier(), Canal = CanalLibre ReDim Preserve Fichier(Canal) ' il faut rallouer le vecteur en consquence et ' initialiser la nouvelle rfrence. Fichier(Canal) = Nothing ' Prparation pour la prochaine rallocation. CanalLibre += 1 End If End If Select Case Job ' Fermeture du fichier Case 9 If Fichier(Canal) IsNot Nothing Then Fichier(Canal).Close() ' La rfrence est rinitialise aprs fermeture Fichier(Canal) = Nothing End If

09/08/2011

PHR VB.Net VBPV - 66

Case 1 ' Cration pour criture avec crasement d'un existant ventuel Fichier(Canal) = New FileStream(NomFichier, FileMode.Create, FileAccess.Write) ' Cration ou ouverture pour criture en ajout d'un existant ventuel Case 2 Fichier(Canal) = New FileStream(NomFichier, FileMode.Append, FileAccess.Write) ' Ouverture pour lecture d'un existant Case 3 Fichier(Canal) = New FileStream(NomFichier, FileMode.Open, FileAccess.Read) ' Ouverture pour lecture et criture d'un existant Case 4 Fichier(Canal) = New FileStream(NomFichier, FileMode.Open,FileAccess.ReadWrite) End Select ' Renvoi du FileStream ou Return Fichier(Canal) ' Nothing si fichier ferm. End Function ' Les procdures vnementielles pralables ' Initialisations au dmarrage du programme Private Sub FichierRandom_load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' Dterminer la longueur dun LongEnregistrement = LongNom + LongSalaire ' enregistrement et allouer le ReDim VBytes(LongEnregistrement) LVPers.View = View.Details ' vecteur en consquence. ' Rglages de la ListView LVPers.FullRowSelect = True LVPers.Columns.Add("Numro", LVPers.Width \ 6, HorizontalAlignment.Left) LVPers.Columns.Add("Nom", LVPers.Width \ 2, HorizontalAlignment.Left) LVPers.Columns.Add("Salaire", LVPers.Width \ 3, HorizontalAlignment.Left) ' Interdire la modification TNumero.ReadOnly = True ' du numro denregistrement. End Sub ' Placer les donnes dune ligne slectionne de LVPers dans les TextBox Private Sub LVPers_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LVPers.Click TNumero.Text = LVPers.FocusedItem.Text TNom.Text = LVPers.FocusedItem.SubItems(1).Text TSalaire.Text = LVPers.FocusedItem.SubItems(2).Text End Sub ' Les procdures de traitements des donnes et des fichiers Private Sub BAjouterListe_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BAjouterListe.Click Dim LV As ListViewItem If TNom.Text = "" Or TSalaire.Text = "" Then Exit Sub ' Donnes non valides ' Numro 0 car non enregistr LV = LVPers.Items.Add("0") LV.SubItems.Add(TNom.Text) LV.SubItems.Add(TSalaire.Text) End Sub Private Sub BSupprimerListe_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BSupprimerListe.Click Dim NrLigne As Integer If TNom.Text = "" Or TSalaire.Text = "" Then Exit Sub ' Donnes non valides For NrLigne = 0 To LVPers.Items.Count - 1 ' Recherche sur numro et nom If LVPers.Items(NrLigne).Text = TNumero.Text Then If LVPers.Items(NrLigne).SubItems(1).Text = TNom.Text Then LVPers.Items.RemoveAt(NrLigne) TNumero.Clear() TNom.Clear() TSalaire.Clear() Exit For End If End If Next End Sub

09/08/2011

PHR VB.Net VBPV - 67

Private Sub BAjouterFichier_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BAjouterFichier.Click Dim FAjoute As FileStream Dim NumeroCanal As Byte Dim LV As ListViewItem If TNom.Text = "" Or TSalaire.Text = "" Then Exit Sub ' Donnes non valides ' Nom de fichier requis If TFichierPrincipal.Text = String.Empty Then MessageBox.Show("Dsignez un fichier principal.") TFichierPrincipal.Select() Exit Sub End If ' Cette personne existe dj dans le fichier If TNumero.Text >= "1" Then BModifierFichier_Click(Me, Nothing) Exit Sub End If
' Ouvrir le fichier en cration ou ajout et conserver le NumeroCanal pour sa fermeture

FAjoute = AccesAuFichier(2, NumeroCanal, TFichierPrincipal.Text)


' Mettre les champs longueur, crer la chanes des donnes, la convertir en vecteur de Byte

NomPers = ALongueur(TNom.Text, LongNom, 0) SalPers = ALongueur(TSalaire.Text, LongSalaire, 1) UnEnregistrement = NomPers & SalPers VBytes = StringVersBytes(UnEnregistrement)
' Enregistrer le vecteur de Byte

' Aligner gauche ' Aligner droite

FAjoute.Write(VBytes, 0, LongEnregistrement)
' Mettre jour LVPers. Le numro de lenregistrement est calcul partir de Position

LV = LVPers.Items.Add(FAjoute.Position / LongEnregistrement) LV.SubItems.Add(TNom.Text) LV.SubItems.Add(TSalaire.Text)


' Fermer le fichier

AccesAuFichier(9, NumeroCanal) End Sub Private Sub BModifierFichier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BModifierFichier.Click Dim FModifie As FileStream Dim NumeroCanal As Byte Dim NrLigne As Integer If TNom.Text = "" Or TSalaire.Text = "" Then Exit Sub ' Donnes non valides If TFichierPrincipal.Text = String.Empty Then MessageBox.Show("Dsignez un fichier principal.") TFichierPrincipal.Select() Exit Sub End If ' Cette personne n'existe pas dans le fichier If TNumero.Text < "1" Then BAjouterFichier_Click(Me, Nothing) Exit Sub End If
' Ouvrir le fichier en lecture-criture et conserver le NumeroCanal pour sa fermeture

FModifie = AccesAuFichier(4, NumeroCanal, TFichierPrincipal.Text)


' Mettre les champs longueur, crer la chanes des donnes, la convertir en vecteur de Byte

NomPers = ALongueur(TNom.Text, LongNom, 0) SalPers = ALongueur(TSalaire.Text, LongSalaire, 1) UnEnregistrement = NomPers & SalPers VBytes = StringVersBytes(UnEnregistrement)

' Aligner gauche ' Aligner droite

09/08/2011

PHR VB.Net VBPV - 68

' Positionner le pointeur sur lenregistrement dont le numro est donn par TNumero

FModifie.Seek((CType(TNumero.Text, Integer) - 1) * LongEnregistrement, SeekOrigin.Begin)


' Enregistrer le vecteur de Byte

FModifie.Write(VBytes, 0, LongEnregistrement)
' Mettre jour LVPers l o le numro denregistrement est le mme que dans TNumero

For NrLigne = 0 To LVPers.Items.Count 1 If LVPers.Items(NrLigne).Text = TNumero.Text Then LVPers.Items(NrLigne).SubItems(1).Text = TNom.Text LVPers.Items(NrLigne).SubItems(2).Text = TSalaire.Text Exit For End If Next
' Fermer le fichier

AccesAuFichier(9, NumeroCanal) End Sub Private Sub BChargerTout_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BChargerTout.Click Dim FEntree As FileStream Dim NumeroCanal As Byte Dim UnePersonne As Personne Dim LV As ListViewItem ' Nom de fichier requis If TFichierPrincipal.Text = String.Empty Then MessageBox.Show("Dsignez un fichier principal.") TFichierPrincipal.Select() Exit Sub End If LVPers.Items.Clear()
' Ouvrir le fichier en lecture seule et conserver le NumeroCanal pour sa fermeture

FEntree = AccesAuFichier(3, NumeroCanal, TFichierPrincipal.Text)


' Lire les enregistrements de 1 FEntree.Length / LongEnregistrement

For NrEnreg As Integer = 1 To FEntree.Length / LongEnregistrement FEntree.Read(VBytes, 0, LongEnregistrement)


' Extraire les champs de chaque vecteur de Byte et supprimer les caractres de mise ' longueur utiliss lors de lenregistrement. Comme ce sont des espaces qui ont t utiliss, ' la mthode Trim sans paramtre suffit pour les ter gauche et droite.

UnEnregistrement = BytesVersString(VBytes) With UnePersonne .Nom = UnEnregistrement.Substring(0, LongNom).Trim .Salaire = CType(UnEnregistrement.Substring(LongNom, LongSalaire).Trim, Integer)
' Afficher les donnes lues dans LVPers

LV = LVPers.Items.Add(NrEnreg) LV.SubItems.Add(.Nom) LV.SubItems.Add(.Salaire.ToString) End With Next NrEnreg


' Fermer le fichier

AccesAuFichier(9, NumeroCanal) End Sub

09/08/2011

PHR VB.Net VBPV - 69

Private Sub BEnregistrerTout_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BEnregistrerTout.Click Dim FSortie As FileStream Dim NumeroCanal As Byte ' Nom de fichier requis If TFichierPrincipal.Text = String.Empty Then MessageBox.Show("Dsignez un fichier principal.") TFichierPrincipal.Select() Exit Sub End If
' Ouvrir le fichier en crasement de lexistant et conserver le NumeroCanal pour sa fermeture

FSortie = AccesAuFichier(1, NumeroCanal, TFichierPrincipal.Text)


' Lire les donnes dans LVPers (sans le numro denregistrement)

For NrLigne As Integer = 0 To LVPers.Items.Count - 1


' Mettre les champs longueur, crer la chanes des donnes, la convertir en vecteur de Byte

NomPers = ALongueur(LVPers.Items(NrLigne).SubItems(1).Text, LongNom, 0) SalPers = ALongueur(LVPers.Items(NrLigne).SubItems(2).Text, LongSalaire, 1) UnEnregistrement = NomPers & SalPers VBytes = StringVersBytes(UnEnregistrement)
' Enregistrer le vecteur de Byte

FSortie.Write(VBytes, 0, LongEnregistrement) Next


' Fermer le fichier

AccesAuFichier(9, NumeroCanal) End Sub Private Sub BCopierSelection_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BCopierSelection.Click Dim FSource As FileStream Dim FCible As FileStream Dim NumeroCanalSource As Byte ' Nom de fichier requis et il Dim NumeroCanalCible As Byte ' doit tre diffrent du source If TFichierCopie.Text = TFichierPrincipal.Text Or TFichierCopie.Text = String.Empty Then MessageBox.Show("Dsignez un fichier diffrent du principal.") TFichierCopie.Select() Exit Sub End If
' Ouvrir le fichier source en lecture seule et conserver NumeroCanalSource pour sa fermeture ' et ouvrir le fichier cible en crasement dun existant ventuel et conserver ' NumeroCanalCible pour sa fermeture

FSource = AccesAuFichier(3, NumeroCanalSource, TFichierPrincipal.Text) FCible = AccesAuFichier(1, NumeroCanalCible, TFichierCopie.Text)


' Rechercher les lignes slectionnes dans LVPers

For NrLigne As Integer = 0 To LVPers.Items.Count - 1 If LVPers.Items(NrLigne).Selected Then If LVPers.Items(NrLigne).Text > "0" Then
' Un numro denregistrement suprieur 0 dans LVPers, signifie que lenregistrement existe ' dans le fichier source. Il est alors lu aprs positionnement direct dans le fichier source ' et le vecteur conserv tel quel.

FSource.Seek((CType(LVPers.Items(NrLigne).Text, Integer) - 1) * LongEnregistrement, SeekOrigin.Begin) FSource.Read(VBytes, 0, LongEnregistrement) Else

09/08/2011

PHR VB.Net VBPV - 70

' ' ' '

Un numro denregistrement gal 0 dans LVPers, signifie que les donnes de la ligne nont pas encore t enregistres dans le fichier principal et il nest donc pas possible de les relire. Dans ce cas, il faut mettre les champs longueur, crer la chanes des donnes, la convertir en vecteur de Byte

NomPers = ALongueur(LVPers.Items(NrLigne).SubItems(1).Text, LongNom, 0) SalPers = ALongueur(LVPers.Items(NrLigne).SubItems(2).Text, LongSalaire, 1) UnEnregistrement = NomPers & SalPers VBytes = StringVersBytes(UnEnregistrement) End If
' Enregistrer le vecteur de Byte, lu ou cr, dans le fichier cible

FCible.Write(VBytes, 0, LongEnregistrement) End If Next


' Fermer les fichiers

AccesAuFichier(9, NumeroCanalCible) AccesAuFichier(9, NumeroCanalSource) End Sub End Class

La protection des donnes des fichiers lors des accs simultans La protection des donnes des fichiers lors des accs simultans se ralise par lemploi de la mthode Lock de la classe FileStream. La mthode Lock permet le verrouillage dun ou plusieurs enregistrements (Record Locking), voire mme de tout un fichier (File Locking). Le verrouillage limit aux seuls enregistrements concerns un moment donn, prsente lavantage de prserver laccs aux autres enregistrements par les utilisateurs qui peuvent ainsi continuer travailler sans perte de temps. La libration denregistrements verrouills se commande par la mthode UnLock, avec les mmes paramtres que ceux employs lors du verrouillage :
Dim Fichier As FileStream Dim Position As Long Dim NombreOctet As Long ' Fichier.Lock(Position, NombreOctet) ' personne dautre que moi ne peut modifier ces octets Fichier.UnLock(Position, NombreOctet)

La protection des donnes des fichiers par lusage de ces mthodes consiste sassurer quune donne en cours de mise jour, nest pas modifie dans le mme temps par un autre utilisateur ou par une autre instance de lapplication. Les donnes en mmoire sont dabord copies dans des variables temporaires avant dtre modifies et les valeurs contenues dans le fichier sont relues avant lenregistrement des modifications. Lenregistrement lu est verrouill avant la relecture et nest libr quaprs lenregistrement ou labandon des modifications. Voici le procd : Copie des valeurs sur le point dtre modifies dans des variables temporaires (Tmp1). Modification des valeurs des variables de travail. Verrouillage de lenregistrement dans le fichier. Relecture de lenregistrement modifier dans des variables temporaires (Tmp2). Comparaison des variables temporaires (Tmp1 et Tmp2). Si les variables temporaires sont gales alors mettre le fichier jour avec les variables de travail modifies sinon traiter la situation : les donnes ont t modifies entre temps Dverrouiller lenregistrement aprs la mise jour russie ou aprs abandon des modifications

La procdure BModifierFichier_Click de lapplication prcdente est rcrite ci-aprs titre dillustration de ce procd. Son exprimentation se ralise en instanciant deux fois la mme application, chaque instance traitant le mme enregistrement du mme fichier.

09/08/2011

PHR VB.Net VBPV - 71

Private Sub BModifierFichier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BModifierFichier.Click Dim FModifie As FileStream Dim NumeroCanal As Byte Dim NrLigne As Integer ' Dclaration dun jeu de variables temporaires Dim TmpNom1, TmpSal1 As String ' Dclaration de lautre jeu Dim TmpNom2, TmpSal2 As String Dim OKModif As Boolean
' ' Voir les quelques contrles de validit dans lexemple prcdent ' ' Ouvrir le fichier en lecture-criture et conserver le NumeroCanal pour sa fermeture

FModifie = AccesAuFichier(4, NumeroCanal, TFichierPrincipal.Text)


' Stockage des infos telles qu'elles ont t lues prcdemment dans le fichier

For NrLigne = 0 To LVPers.Items.Count - 1 If LVPers.Items(NrLigne).Text = TNumero.Text Then TmpNom1 = LVPers.Items(NrLigne).SubItems(1).Text TmpSal1 = LVPers.Items(NrLigne).SubItems(2).Text Exit For End If Next
' Relecture des infos actuelles du fichier aprs verrouillage de l'enregistrement

FModifie.Lock((CType(TNumero.Text, Integer) - 1) * LongEnregistrement, LongEnregistrement) FModifie.Seek((CType(TNumero.Text, Integer) - 1) * LongEnregistrement, SeekOrigin.Begin) FModifie.Read(TByte, 0, LongEnregistrement) TmpNom2 = BytesVersString(TByte).Substring(0, LongNom).Trim TmpSal2 = CType(BytesVersString(TByte).Substring(LongNom, LongSalaire).Trim, Integer)
' Vrifier si des modifications ont t faites entre temps

If TmpNom1 <> TmpNom2 Or TmpSal1 <> TmpSal2 Then If MessageBox.Show("Enregistrement modifi entre temps. Continuer ? ", "Attention", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then ' Mettre jour nos donnes avec celles du fichier TNom.Text = TmpNom2 TSalaire.Text = TmpSal2 OKModif = False Else ' ou remplacer les donnes du fichier avec les ntres OKModif = True End If Else ' Le fichier na pas t modifi entre temps OKModif = True End If If OKModif Then
' Mettre les champs longueur, crer la chane des donnes, la convertir en vecteur de Byte ' ' Voir les quatres lignes de codes dans lexemple prcdent ' ' Positionner le pointeur sur lenregistrement est donn par TNumero

FModifie.Seek((CType(TNumero.Text, Integer) - 1) * LongEnregistrement, SeekOrigin.Begin)


' Enregistrer le vecteur de Byte

FModifie.Write(VBytes, 0, LongEnregistrement) End If


' Dverrouiller l'enregistrement

FModifie.Unlock((CType(TNumero.Text, Integer) - 1) * LongEnregistrement, LongEnregistrement)


' Mettre ' ' ' jour LVPers l o le numro denregistrement est le mme que dans TNumero Voir le reste de la procdure dans lexemple prcdent

End Sub

09/08/2011

PHR VB.Net VBPV - 72

Cration, enregistrement et lecture dun fichier binaire


Comme illustr prcdemment, la gestion squentielle de donnes de type complexe en mmoire de masse utilise des fichiers binaires. Ils sont galement utiliss pour assurer la persistance des objets. Lexemple prcdent est suffisamment illustratif pour ce qui concerne lenregistrement de structures. Mais voici un exemple tout diffrent qui rappellera peut tre certains, danciens utilitaires de visualisations et de modifications dexcutables. Le but du programme suivant est dafficher, en hexadcimal et en ASCII, le contenu dun programme excutable et de permettre le remplacement dune chane par une autre de mme longueur. Il est donn titre dexemple et sans aucune prtention de performance. Le programme cible de lexprimentation est un programme en langage C qui est compil et qui affiche Bonjour en session Dos. Le fichier excutable est Bonjour.Exe et il a une taille de 19 Ko. Voici son code source en C :
#include <stdio.h> main() { printf("\nBonjour"); getc(stdin); return 0; }

Linterface prsente deux ListBox (LBHexa et LBAscii) pour laffichage du contenu du fichier, deux TextBox (TCherche et TRemplace) pour lacquisition de la chane cherche et de celle de remplacement, et un jeu de boutons qui permet le pilotage du programme :
BCharger BRemplacer BEnregistrer

provoque la lecture du fichier et son affichage dans les ListBox remplace la chane dans les ListBox rcrit le fichier avec le contenu de LBAscii converti au format appropri.

09/08/2011

PHR VB.Net VBPV - 73

Voici le code complet du programme.


Imports System.IO Imports System.Text.RegularExpressions Public Class FBase Private Sub BCharger_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BCharger.Click ' Un buffer de lecture de 2000 octets Dim ValeurLue(2000) As Byte ' La ligne placer dans LBHexa Dim UneLigneHex As String = String.Empty ' La ligne placer dans LBAscii Dim UneLigneAsc As String = String.Empty Dim i As Integer Dim FichierEntree As String = "X:\Tmp\Bonjour.Exe" Dim FEntree As BinaryReader FEntree = New BinaryReader(File.Open(FichierEntree, FileMode.Open, FileAccess.Read)) LBHexa.Items.Clear() ' Effectuer la lecture jusqu EOF par lots LBAscii.Items.Clear() ' de maximum 2000 octets et constituer les While FEntree.PeekChar() <> -1 ValeurLue = FEntree.ReadBytes(2000) ' lignes des ListBox en les limitant 16 ' octets chacune pour faciliter la lecture For i = 1 To ValeurLue.Length UneLigneHex = UneLigneHex & String.Format("{0:X2}", ValeurLue(i - 1)) UneLigneAsc = UneLigneAsc & Char.ConvertFromUtf32(ValeurLue(i - 1)) If i Mod 16 = 0 Then LBHexa.Items.Add(UneLigneHex) ' Vider la ligne sauve UneLigneHex = String.Empty LBAscii.Items.Add(UneLigneAsc) UneLigneAsc = String.Empty End If Next End While FEntree.Close() End Sub Private Sub BRemplacer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BRemplacer.Click Dim RechAsc, RempAsc As String Dim RechHex As String = String.Empty Dim RempHex As String = String.Empty Dim Ligne As String Dim N As Integer Dim SRech As Regex ' Acquisition des chanes en ASCII RechAsc = TCherche.Text RempAsc = TRemplace.Text For N = 0 To RechAsc.Length 1 ' Cration des chanes en hexadcimal RechHex = RechHex & String.Format("{0:X2}", RechAsc.Substring(N, 1)) RempHex = RempHex & String.Format("{0:X2}", RechAsc.Substring(N, 1)) Next ' La recherche seffectue par la chane ASCII SRech = New Regex(RechAsc) ' pour chaque ligne de la liste LBAscii, et For N = 0 To LBAscii.Items.Count 1 ' comme les 2 listes prsentent les mmes Ligne = LBAscii.Items.Item(N) ' caractres aux mmes endroits, exception If SRech.IsMatch(Ligne) Then Ligne = Ligne.Replace(RechAsc, RempAsc) ' faite du format, si une ligne de LBAscii ' contient la chane cherche, la ligne LBAscii.Items.RemoveAt(N) ' correspondante de LBHexa la contient aussi. LBAscii.Items.Insert(N, Ligne) ' La chane trouve dans une ligne dune LBAscii.SelectedIndex = N ' liste est donc remplace dans deux lignes. Ligne = LBHexa.Items.Item(N) Ligne = Ligne.Replace(RechHex, RempHex) ' Chacune remplace ensuite sa ligne initiale LBHexa.Items.RemoveAt(N) ' dans sa liste dorigine. LBHexa.Items.Insert(N, Ligne) LBHexa.SelectedIndex = N ' On termine si on a trouv. Le programme ne Exit For ' remplace donc que la premire occurrence End If Next ' ventuellement trouve. End Sub
' Outils de manipulation des chanes

09/08/2011

PHR VB.Net VBPV - 74

Private Sub BEnregistrer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BEnregistrer.Click Dim UnByte As Byte Dim NrLigne As Integer Dim i As Byte Dim FichierSortie As String = "X:\Tmp\Bonjour.Exe" Dim FSortie As BinaryWriter FSortie = New BinaryWriter(File.Open(FichierSortie, FileMode.Open, FileAccess.Write)) For NrLigne = 0 To LBAscii.Items.Count - 1 For i = 0 To LBAscii.Items.Item(NrLigne).Length - 1 UnByte = Char.ConvertToUtf32(LBAscii.Items.Item(NrLigne).Substring(i, 1), 0) ' Chaque caractre est converti en sa valeur FSortie.Write(UnByte) ' numrique Ascii et enregistr Next Next FSortie.Close() End Sub End Class

Lenregistrement octet par octet est trs peu performant. Il serait plus rentable de traiter un important nombre doctets en mmoire et den commander lenregistrement par lots, linstar de ce qui est fait pour la lecture du fichier. Et ce nest pas la seule lacune de ce programme. En effet, la recherche de la chane remplacer seffectue lintrieur de chaque ligne de seize caractres de la ListBox et par consquent, si cette chane ne se trouve pas entirement sur une mme ligne, elle nest pas trouve. Enfin, seule la premire occurrence trouve est remplace. Le but ntait pas de fournir un rel utilitaire de bidouillage, mais seulement un autre exemple de traitement binaire dun fichier. A propos des outils utiliss
ConvertFromUtf32

La mthode ConvertFromUtf32 de la classe Char donne le caractre dont la valeur Ascii lui est passe en paramtre. La mthode ConvertToUtf32(Chane, Index_du_caractre) ralise la convertion inverse. La mthode Format de la classe String sert, comme son nom lindique, la mise en forme de diverses valeurs. Elle est utilise dans le programme prcdent pour reprsenter les valeurs Ascii des caractres sous forme de paires de chiffres hexadcimaux : String.Format("{0:X2}", RechAsc.Substring(N, 1)). Les possibilits de formatage sont nombreuses. Plusieurs sont tudies dans une autre partie de ce cours. En attendant, le lecteur peut une fois de plus consulter laide de son VisualStudio.Net et le site de MicroSoft dj rfrenc. Cette autre mthode de la classe String permet lextraction dun ou plusieurs caractres dune chane partir dune position donne de 0 Length 1. Dans la phrase de code ci-dessus, Substring extrait 1 caractre de RechAsc la Nime position. Cette mthode, toujours de la classe String, fournit le nombre de caractres dune chane. Elle a dj t utilise prcdemment sur des chanes contenues dans les composants, comme dans lexpression LBAscii.Items.Item(NrLigne).Length de la fonction BEnregistrer_Click. Dans ce programme elle est aussi utilise pour connatre le nombre de caractres dune variable dans lexpression RechAsc.Length 1 de la fonction BRemplacer_Click. Cette mthode de la classe System.Text.RegularExpressions effectue la recherche dune chane donne lintrieur dune autre et retourne True en cas de succs. Elle est utilise dans le programme pour vrifier lexistence de la chane recherche lintrieur dune ligne de LBAscii, dont les lignes sont prsentes une par une la mthode jusqu russite de la recherche, ou jusqu la fin de la liste. Les expressions rgulires sont tudies davantage dans la partie suivante du cours.

Format

Substring

Length

IsMatch

09/08/2011

PHR VB.Net VBPV - 75

Inventaire des principaux outils concernant les dossiers et les fichiers


Mthodes communes des classes Directory et File
Delete Exists GetCreationTime GetLastAccessTime GetLastWriteTime Move SetCreationTime SetLastAccessTime SetLastWriteTime

Supprime un fichier sans lever dexception sil nexiste pas, ou un rpertoire et son contenu. Dtermine si un fichier existe ou si le chemin d'accs donn fait rfrence un rpertoire existant sur disque. Retourne la date et l'heure de cration dun fichier ou d'un rpertoire. Retourne la date et l'heure de dernier accs au fichier ou au rpertoire spcifi. Retourne la date et l'heure de dernier accs en criture au fichier ou au rpertoire spcifi. Dplace un fichier ou un rpertoire et son contenu vers un nouvel emplacement. Dfinit la date et l'heure de cration pour le fichier ou le rpertoire spcifi. Dfinit la date et l'heure de dernier accs au fichier ou au rpertoire spcifi. Dfinit la date et l'heure de dernier accs en criture au fichier ou au rpertoire.

Proprits communes des classes DirectoryInfo et FileInfo


Exists Name

Cette valeur boolenne indique si le fichier ou le dossier reprsent par linstance de la classe existe. Contient le nom du fichier ou du dossier.

Mthodes communes des classes DirectoryInfo et FileInfo


Create Delete MoveTo

Cre un fichier ou un dossier sil nexiste pas. Supprime un fichier ou un dossier. Dplace le fichier ou le dossier et son contenu vers un chemin dsign.

Mthodes spcifiques de la classe Directory


CreateDirectory GetCurrentDirectory GetDirectories GetDirectoryRoot

Cre tous les rpertoires et sous rpertoires comme spcifi par path. Obtient le rpertoire de travail en cours de l'application. Obtient les noms des sous rpertoires dans le rpertoire spcifi. Retourne les informations relatives au volume, la racine ou les deux pour le chemin d'accs spcifi. GetFiles Retourne les noms des fichiers dans le rpertoire spcifi. GetFileSystemEntries Retourne les noms de tous les fichiers et sous rpertoires du rpertoire spcifi. GetLogicalDrives Extrait les noms des lecteurs logiques sur cet ordinateur sous la forme <lecteur>:\ . GetParent Extrait le rpertoire parent du chemin d'accs spcifi, y compris les chemins d'accs absolus et relatifs. SetCurrentDirectory Dfinit le rpertoire de travail en cours de l'application avec le rpertoire spcifi.

Proprits spcifiques de la classe DirectoryInfo


Parent Root

Contient le nom du dossier parent de celui reprsent par linstance. Contient la partie racine du dossier reprsent par linstance.

Mthodes spcifiques de la classe DirectoryInfo


CreateSubDirectory GetDirectories GetFiles

Cre un sous dossier et ses dossiers parents sils nexistent pas. Retourne la liste des sous dossiers. Retourne la liste des fichiers du dossier.

09/08/2011

PHR VB.Net VBPV - 76

Mthodes spcifiques de la classe File


AppendText Copy Create CreateText GetAttributes Open OpenRead OpenText OpenWrite SetAttributes

Cre StreamWriter qui ajoute du texte cod UTF-8 un fichier existant. Copie un fichier existant vers un nouveau fichier. Cre un fichier dans le chemin d'accs spcifi. Cre ou ouvre un fichier pour crire du texte cod UTF-8. Obtient le FileAttributes du fichier sur le chemin d'accs. Ouvre FileStream sur le chemin d'accs spcifi. Ouvre un fichier existant pour l'accder en lecture. Ouvre un fichier texte cod UTF-8 existant pour l'accder en lecture. Ouvre un fichier existant pour l'accder en criture. Dfinit les attributs du fichier spcifi.

Proprits spcifiques de la classe FileInfo


Directory DirectoryName Length Attributes

Contient le nom du dossier parent. Chemin du dossier contenant le fichier. Contient la taille du fichier en octets. Contient les attributs dun fichier reprsent par une instance de la classe selon la nomenclature spcifie dans lnumration FileAttributes suivante : Archive L'tat d'archivage du statut. Les applications utilisent cet attribut pour marquer les fichiers pour sauvegarde ou suppression. Compressed Le fichier est compress. Directory Le fichier est un rpertoire. Encrypted Le fichier ou le rpertoire est crypt. Cela signifie pour un fichier, que toutes ses donnes seront cryptes. Pour un rpertoire, cela signifie que tous les nouveaux fichiers et rpertoires crs seront crypts par dfaut. Le fichier est masqu et n'est donc pas compris dans un listing de rpertoires ordinaire. Hidden Normal Le fichier est normal et aucun autre attribut n'est dfini. Cet attribut n'est valable que s'il est utilis seul. NotContentIndexed Le fichier ne sera pas index par le service d'indexation du contenu du systme d'exploitation. Offline Le fichier est hors connexion. Les donnes du fichier ne sont pas disponibles. ReadOnly Le fichier est en lecture seule. ReparsePoint Le fichier contient un point d'analyse, qui est un bloc de donnes dfinies par l'utilisateur associ un fichier ou un rpertoire. Le fichier est un fichier fragment. Les fichiers fragments sont gnralement de gros SparseFile fichiers dont les donnes sont principalement des zros. System Le fichier est un fichier systme. Le fichier fait partie du systme d'exploitation ou est utilis en mode exclusif par celui-ci. Temporary Le fichier est temporaire. Les systmes de fichiers essaient de conserver toutes les donnes dans la mmoire pour un accs plus rapide plutt que de les envoyer vers le stockage de masse.

Mthodes spcifiques de la classe FileInfo


AppendText CopyTo CreateText Open OpenRead OpenText OpenWrite

Cre un objet StreamWriter pour ajouter du texte dans un fichier. Copie un fichier existant. Cre un objet StreamWriter pour crire dans un fichier texte. Ouvre un fichier avec divers privilges de lecture, dcriture et de partage. Cre un objet FileStream en lecture seule. Cre un objet StreamReader pour lire un fichier texte existant. Cre un objet FileStream en criture.

09/08/2011

PHR VB.Net VBPV - 77

La classe Stream
Cette classe est abstraite et nest donc pas directement utilisable. Il faut utiliser ses classes drives qui sont les suivantes :
StreamWriter StreamReader BinaryWriter BinaryReader XmlTextWriter XmlTextReader

Ecriture de fichiers textes. Lecture de fichiers textes. Ecriture de fichiers binaires. Lecture de fichiers binaires. Ecriture de fichiers Xml. Lecture de fichiers Xml.

Proprit commune
BaseStream

Obtient le flux sous-jacent qui sert d'interface avec un magasin de sauvegarde.

Mthode commune
Close

Ferme le StreamWriter en cours et le flux sous-jacent.

Proprits et mthodes de la classe StreamWriter


AutoFlush NewLine Flush Write WriteLine

Obtient ou dfinit une valeur indiquant si StreamWriter vide sa mmoire tampon vers le flux sous-jacent aprs chaque appel StreamWriter.Write. Obtient ou dfinit la chane de terminaison de ligne utilise pour le TextWriter en cours. Efface toutes les mmoires tampons pour le writer actuel et provoque l'criture des donnes mises en mmoire tampon dans le flux sous-jacent. crit dans le flux. crit des donnes de la manire spcifie par les paramtres surchargs, suivies d'un terminateur de ligne.

Mthodes de la classe StreamReader


DiscardBufferedData Peek Read ReadBlock ReadLine ReadToEnd

Permet StreamReader d'ignorer ses donnes en cours. Retourne le prochain caractre disponible, mais ne le consomme pas. Lit le caractre ou le jeu de caractres suivant dans le flux d'entre. Lit un maximum de caractres partir du flux en cours et crit les donnes dans buffer, en commenant par index. Lit une ligne de caractres partir du flux en cours et retourne les donnes sous forme de chane. Lit le flux entre la position actuelle et la fin du flux.

Mthodes de la classe BinaryWriter


Flush Seek Write

Efface toutes les mmoires tampons pour le writer actuel et provoque l'criture des donnes mises en mmoire tampon sur le priphrique sous-jacent. Dfinit la position dans le flux actuel. crit une valeur dans le flux actuel.

09/08/2011

PHR VB.Net VBPV - 78

Mthodes de la classe BinaryReader


PeekChar Read ReadBoolean ReadByte ReadBytes ReadChar ReadChars

ReadDecimal ReadDouble ReadInt16 ReadInt32 ReadInt64 ReadSByte ReadSingle ReadString ReadUInt16 ReadUInt32 ReadUInt64

Retourne le caractre disponible suivant et n'avance pas la position du caractre ou de l'octet. Lit des caractres partir du flux sous-jacent et avance la position actuelle du flux. Lit une valeur Boolean partir du flux actuel et avance la position actuelle du flux d'un octet. Lit l'octet suivant partir du flux actuel et avance la position actuelle du flux d'un octet. Lit count octets partir du flux actuel dans un tableau d'octets et avance la position actuelle de count octets. Lit le caractre suivant partir du flux actuel et avance la position actuelle du flux en fonction du codage utilis et du caractre spcifique en cours de lecture partir du flux. Lit count caractres partir du flux actuel, retourne les donnes dans un tableau de caractres et avance la position actuelle en fonction du codage utilis et du caractre spcifique en cours de lecture partir du flux. Lit une valeur dcimale partir du flux actuel et avance la position actuelle du flux de 16 octets. Lit une valeur virgule flottante de 8 octets partir du flux actuel et avance la position actuelle du flux de 8 octets. Lit un entier sign de 2 octets partir du flux actuel et avance la position actuelle du flux de 2 octets. Lit un entier sign de 4 octets partir du flux actuel et avance la position actuelle du flux de 4 octets. Lit un entier sign de 8 octets partir du flux actuel et avance la position actuelle du flux de 8 octets. Lit un octet sign partir de ce flux et avance la position actuelle du flux d'un octet. Lit une valeur virgule flottante de 4 octets partir du flux actuel et avance la position actuelle du flux de 4 octets. Lit une chane partir du flux actuel. La chane est prfixe l'aide de la longueur, code comme un entier raison de sept bits la fois. Lit un entier non sign de 2 octets partir du flux actuel l'aide du codage avec primaut des octets de poids faible (Little endian) et avance la position du flux de 2 octets. Lit un entier non sign de 4 octets partir du flux actuel et avance la position du flux de 4 octets. Lit un entier non sign de 8 octets partir du flux actuel et avance la position du flux de 8 octets.

09/08/2011

PHR VB.Net VBPA - 1

Programmation avance en VB.Net

09/08/2011

PHR VB.Net VBPA - 2

Tables des matires des pages VBPA


Autant savoir.......................................................................................................................................................................3 Les traitements en ligne de commande ....................................................................................................................3 Les assemblages .......................................................................................................................................................4 Manifeste de l'assemblage..............................................................................................................................5 Assemblages mono fichier et multi fichiers...................................................................................................5 Le dsassemblage...........................................................................................................................................6 Espace de noms..............................................................................................................................................7 Nom complet..................................................................................................................................................7 Instructions au niveau de l'espace de noms....................................................................................................7 Rfrences, Imports et Declare ......................................................................................................................8 Arguments d'appel d'une application........................................................................................................................9 Application Console.......................................................................................................................................9 Application Windows ....................................................................................................................................9 A partir dune session Dos...................................................................................................................9 A partir de Windows..........................................................................................................................10 Les rgions .............................................................................................................................................................11 Les fonctionnalits du Framework ...................................................................................................................................12 L'espace de noms System .......................................................................................................................................12 La classe System.Object ..............................................................................................................................12 Mthodes............................................................................................................................................12 La classe String ............................................................................................................................................13 Proprit.............................................................................................................................................13 Mthodes............................................................................................................................................13 La classe DateTime ......................................................................................................................................16 Proprits ...........................................................................................................................................17 Mthodes............................................................................................................................................17 La classe RegEx ...........................................................................................................................................19 Membres ............................................................................................................................................22 La classe Math .............................................................................................................................................25 Proprits ...........................................................................................................................................25 Mthodes............................................................................................................................................25 La classe VBMath ........................................................................................................................................25 L'espace de nom System.Drawing..........................................................................................................................26 La classe Graphics .......................................................................................................................................26 L'espace de noms System.Collections....................................................................................................................31 Les classes offertes.......................................................................................................................................31 Membres communs la plupart des collections...........................................................................................31 Proprites ...........................................................................................................................................31 Mthodes............................................................................................................................................31 La classe ArrayList ......................................................................................................................................32 Proprit.............................................................................................................................................32 Mthodes............................................................................................................................................32 La classe BitArray........................................................................................................................................35 Proprit.............................................................................................................................................35 Mthodes............................................................................................................................................35 La classe Hashtable......................................................................................................................................36 Proprits ...........................................................................................................................................36 Mthodes............................................................................................................................................36 La classe SortedList .....................................................................................................................................37 Mthodes............................................................................................................................................37 La classe Queue ...........................................................................................................................................38 Mthodes............................................................................................................................................38 La classe Stack .............................................................................................................................................39 Mthodes............................................................................................................................................39 Une dernire comparaison ...........................................................................................................................40 La classe CollectionBase .............................................................................................................................41 Lespace de noms Collections.Generic ........................................................................................................43

09/08/2011

PHR VB.Net VBPA - 3

Autant savoir
Les traitements en ligne de commande
Visual Studio .Net offre, en session Dos, des commandes supplmentaires celles ordinairement disponibles dans ce mode de travail. Pour avoir accs ces commandes, il faut lancer le mode ligne de commande par l'outil appropri (et non par le raccourci habituel de Windows, ni par Dmarrer/Excuter/Cmd). L'accs ce mode de travail se fait par /Visual Studio Tools/Invite de commandes de Visual Studio.

Les commandes ajoutes sont nombreuses et se rpertorient en plusieurs catgories regroupant les outils de configuration, dont l'assembly linker (al.exe), les outils de dbogage, les outils de scurit, les outils gnraux dont les assembleur et dsassembleur (ilasm.exe et ildasm.exe). Le lecteur qui souhaite en savoir davantage sur ces outils peut consulter l'aide de son Visual Studio sous la rubrique Ligne de commande, .NET Framework (outils) et le site de MicroSoft dj rfrenc plusieurs fois dans ce cours. Il faut encore savoir que chacune des commandes ajoutes dispose de son aide en ligne accessible par son option /?, par exemple ildasm /? fournit les informations essentielles pour l'usage de la commande ildasm. Voici quelques exemples de compilation en ligne de commande. Compilation du programme C++ dont voici le source Bonjour.cpp :
#include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { Console::WriteLine("Bonjour"); Console::ReadLine(); return 0; }

La commande cl Bonjour.cpp /clr produit les fichiers Bonjour.obj et Bonjour.exe. La commande link Bonjour.obj /Out:EncoreBonjour.exe produit le fichier EncoreBonjour.exe. Compilation du programme J# dont voici le source Bonjour.jsl :
public class UneClasse { public static void main() { System.Console.WriteLine("Bonjour"); System.Console.ReadLine(); } }

La commande vjc Bonjour.jsl produit le fichier Bonjour.exe. Attention, le langage J# nexiste plus dans Visual Studio depuis la version 2008.

09/08/2011

PHR VB.Net VBPA - 4

Compilation du programme C# dont voici le source Bonjour.cs :


using System; class UneClasse { public static void Main() { Console.WriteLine("Bonjour"); Console.ReadLine(); } }

La commande csc Bonjour.cs produit le fichier Bonjour.exe. Compilation du programme VB dont voici le source Bonjour.vb :
Imports System Module ModulePrincipal Sub Main() Console.WriteLine("Bonjour") Console.ReadLine() End Sub End Module

La commande vbc Bonjour.vb produit le fichier Bonjour.exe. La commande vbc /t:module Bonjour.vb produit le fichier Bonjour.netmodule destin tre utilis dans d'autres assemblages. La commande vbc /t:library Bonjour.vb produit le fichier Bonjour.dll qui est prt tre livr pour tre rfrenc dans des projets clients. La commande ildasm Bonjour.netmodule ouvre la fentre de dsassemblage. La commande ildasm Bonjour.netmodule /Out:Bonjour.il /Text cre le fichier Bonjour.il qui contient le rsultat de tout le dsassemblage.

Les assemblages
Les assemblages, qui se prsentent sous la forme d'un ou plusieurs fichiers excutables (.exe) et/ou de fichiers de bibliothques de liaisons dynamiques (.dll), constituent les blocs de construction du .NET Framework. Ils fournissent le Common Language Runtime ainsi que les informations ncessaires la reconnaissance des implmentations des types. Un assemblage ressemble une collection de types et de ressources conus pour fonctionner ensemble et qui forment une unit fonctionnelle logique. Un assemblage peut contenir aussi des rfrences vers d'autres assemblages (notion de dpendances). Ces ressources, ces types et ces rfrences sont dcrits dans un bloc de donnes appel le manifeste. Le manifeste fait partie de l'assemblage et en est la description. Un aspect important des assemblages est qu'ils font partie de l'identit d'un type. L'identit d'un type est constitue de l'assemblage qui le contient associ au nom du type. Ceci signifie, par exemple, si l'assemblage A expose un type appel T, et qu'un assemblage B expose un autre type aussi appel T, le runtime .NET verra ces deux types comme compltement diffrents. Enfin, les assemblages correspondent au niveau le plus bas du versioning dans .NET. Chaque assemblage possde un numro de version qui reflte son niveau de compatibilit. Aussi chaque rfrence un assemblage (depuis un autre) inclut le nom et la version de l'assemblage rfrenc. Le numro de version comporte quatre parties numriques (5.5.2.33 par exemple) et il est modifiable dans le fichier AssemblyInfo.vb prsent dans tous les projets en cours de dveloppement. Conventionnellement, si seule la quatrime partie de ce numro diffre entre deux assemblages, ils sont considrs comme compatibles. Si une des deux premires parties diffre, alors ils sont considrs comme incompatibles. Les autres cas de figure indiquent une possibilit de compatibilit. tant donn que les assemblages contiennent des informations sur le contenu, la version et les dpendances, les applications cres l'aide de Visual Studio .NET ne s'appuient pas sur les valeurs de la registry pour fonctionner correctement. Les assemblages rduisent les conflits de DLL et rendent les applications plus fiables, plus faciles dployer. Ce sont les assemblages qui permettent l'excution cte cte, c'est--dire la cxistence de plusieurs

09/08/2011

PHR VB.Net VBPA - 5

versions de code et la possibilit pour une application de choisir la version du Common Language Runtime ou d'un composant qu'elle utilise. Les installations ultrieures d'autres versions du runtime, d'une application ou d'un composant n'affectent pas les applications dj installes. Dans la plupart des cas, l'installation d'une application .NET se ralise simplement en copiant les fichiers du dossier bin du projet sur l'ordinateur cible, c'est l'installation xcopy.

Manifeste de l'assemblage
Tous les assemblages contiennent donc un manifeste qui en est la description. Le manifeste de l'assemblage contient, en principal, le nom et le numro de version de l'assemblage, ainsi qu'une liste de toutes les dpendances (fichiers .dll ou autres ncessaires l'application) identifies par leur nom, un identifiant et leur numro de version.

Assemblages mono fichier et multi fichiers


Les exemples de compilation en ligne de commande vus prcdemment constituent autant d'exemples d'assemblages mono fichier. L'exemple suivant illustre un assemblage multi fichiers. Voici le code source de lapplication UneClasseVB crite par un programmeur VB. Il y cre un espace de noms MonEspace qui contient une classe UneClasse exposant les mthodes Majuscule dont le rle est de mettre en majuscules tous les caractres d'une chane qui lui est passe en paramtre, et DisBonjour dont le rle est d'afficher la chane Bonjour. Un module ModulePrincipal contient le point d'entre dans le programme (la Sub Main). La seule tche de ce programme est d'afficher Bonjour.
Imports System ' Dfinition d'un Namespace Namespace MonEspace Public Class UneClasse Public Function Majuscule(S As String) As String Return S.ToUpper End Function Public Sub DisBonjour() Console.Write("Bonjour ") Console.ReadLine() End Sub End Class End Namespace Module ModulePrincipal Sub Main() Dim Bonjour As New MonEspace.UneClasse Bonjour.DisBonjour() End Sub End Module

Voici maintenant le code source du programmeur C#. Il cre une classe MonApplication dont le rle est d'afficher la chane coucou en majuscule. Le programmeur C# souhaite rutiliser du code qu'il sait existant dans l'espace de nom MonEspace cr par son collgue VB. Il dclare donc utiliser cet espace de noms par une clause using et peut alors instancier un objet de type UneClasse et en utiliser les mthodes exposes, soit Majuscule dans cet exemple.
using System; ' Aprs avoir ajout UneClasseVB aux using UneClasseVB.MonEspace; class MonApplication ' rfrences du projet C# { public static void Main() { UneClasse CetteInstance = new UneClasse(); Console.WriteLine(CetteInstance.Majuscule("coucou")); Console.ReadLine(); } }

Le programmeur VB a ralis une application qui se suffit elle-mme et peut produire un excutable UneClasseVB.exe. Le programmeur C# a ralis une application qui dpend de l'application VB et plusieurs situations peuvent se prsenter. Soit le programmeur C# ne dispose que de l'excutable UneClasseVB.exe, ou d'une librairie UneClasseVB.dll, soit il dispose d'un module d'assemblage, soit il dispose des sources VB.

09/08/2011

PHR VB.Net VBPA - 6

Dans le premier cas, le programmeur C# doit compiler son programme en rfrenant UneClasse.exe ou UneClasse.dll, selon le cas : ou
csc MonApplication.cs /r:UneClasseVB.exe csc MonApplication.cs /r:UneClasseVB.dll

Dans le second cas, le programmeur C# doit compiler son programme en y ajoutant le module ncessaire :
csc MonApplication.cs /addmodule:UneClasseVB.netmodule

Dans le troisime cas, le programmeur C# doit d'abord crer le module d'assemblage UneClasseVB.netmodule ou l'excutable UneClasseVB.exe par une des commandes (vbc /t:module UneClasseVB.vb ou vbc UneClasseVB.vb) vues prcdemment, et compiler ensuite son application comme indiqu ci dessus.

Le dsassemblage
L'usage du MSIL Disassembler (Ildasm.exe en ligne de commande) permet l'examen du contenu d'un assemblage et de dterminer si un fichier est un assemblage ou un module. Il n'entre pas dans le cadre de ce cours de s'attarder sur le dsassemblage, mais voici une illustration de ce quil peut montrer.

Les

trois

illustrations

ci-dessus

correspondent

respectivement

au

dsassemblage

des

fichiers

UneClasseVB.netmodule, UneClasseVB.exe et MonApplication.exe. Un double clic sur un des lments

provoque l'affichage dans une nouvelle fentre du rsultat de son dsassemblage. L'illustration suivante montre un extrait des codes produits par le dsassemblage du Manisfeste de MonApplication.exe.

09/08/2011

PHR VB.Net VBPA - 7

Espace de noms
Les espaces de noms permettent d'organiser les objets dfinis dans un assemblage. Les assemblages peuvent contenir plusieurs espaces de noms, qui peuvent leur tour contenir d'autres espaces de noms. Les espaces de noms permettent d'viter les ambiguts et de simplifier les rfrences lors de l'utilisation de grands groupes d'objets, tels que les bibliothques de classes. Les espaces de noms Visual Studio .NET permettent la rsolution des problmes dencombrement des espaces de noms par l'usage des noms complets. Ce problme survient lorsque le dveloppeur est confront la prsence de classes homonymes dans diffrentes bibliothques, cause des conflits de noms. Par dfaut, tous les fichiers excutables crs l'aide de Visual Basic .NET contiennent un espace de noms portant le mme nom que le projet. Par exemple, dfaut d'un espace de noms explicitement dfini, l'excutable MonProgramme.exe contient un espace de noms appel MonProgramme. Plusieurs assemblages peuvent utiliser le mme espace de noms. Visual Basic .NET les considre comme un ensemble unique de noms. Il est ainsi possible de dfinir des classes pour un espace de noms appel MonEspace dans un assemblage nomm A1, et dfinir des classes supplmentaires pour le mme espace de noms partir d'un assemblage nomm A2.

Nom complet
Un nom complet est une rfrence un objet prfixe avec le nom de l'espace de noms o l'objet est dfini. Il permet d'viter les conflits entre les noms, aussi appels collisions de noms, en donnant au compilateur le moyen de dterminer l'objet en cours d'utilisation. Si une classe MaClasse est cre dans un MonProjetX, elle est accessible sans qualification partout dans ce projet selon la porte qui lui est attribue. Mais si dans la mme porte, la classe MaClasse du ProjetY doit aussi tre utilise, sa dclaration doit tre qualifie par le nom complet. Il en est de mme pour toutes les rfrences d'objets. Par exemple, dans MonProjetX qui contient la dclaration d'une classe MaClasse :
Dim UnObjet as New MaClasse Dim UnAutreObjet as New ProjetY.MaClasse

et dans un autre projet qui rfrencerait la fois MonProjetX et ProjetY :


Dim UnObjetX = MonProjetX.MaClasse Dim UnObjetY = ProjetY.MaClasse

ou :
Imports MaClasseX = MonProjetX.MaClasse Imports MaClasseY = ProjetY.MaClasse ' Dim UnObjetX As MaClasseX Dim UnObjetY As MaClasseY

Instructions au niveau de l'espace de noms


Un espace de noms peut contenir des modules, des interfaces, des classes, des dlgus, des numrations, des structures et d'autres espaces de noms. Mais il ne peut contenir des proprits, des procdures, des variables et des vnements, ceux ci doivent tre dclars dans des conteneurs tels que des modules, des structures ou des classes.

09/08/2011

PHR VB.Net VBPA - 8

Rfrences, Imports et Declare


Pour utiliser un assemblage existant dans un projet Visual Basic .Net, il faut l'ajouter dans les rfrences du projet et utiliser l'instruction Imports pour choisir l'espace de noms des lments utiliser. Une fois qu'un assemblage est rfrenc et import, toutes les classes, proprits, mthodes et autres membres de ses espaces de noms sont disponibles pour l'application comme si leur code faisait partie du fichier source. Un seul assemblage peut contenir plusieurs espaces de noms, et chaque espace de noms peut contenir diffrents regroupements d'lments, y compris d'autres espaces de noms. Ainsi, si le programmeur C# de l'exemple prcdent avait crit son code en VB, il aurait pu rfrencer
UneClasseVB.dll dans son projet et crire le code suivant : Imports System Imports MonEspace Module Principal Public Sub Main() Dim CetteInstance = New UneClasse Console.WriteLine(CetteInstance.Majuscule("coucou")) Console.ReadLine() End Sub End Module

L'instruction Imports permet le remplacement du nom de l'espace de noms par l'alias qui conviendrait mieux au programmeur :
Imports MonAlias = Nom_EspaceDeNoms

C'est ainsi que le programme prcdent pourrait s'crire :


Imports Scrn = System.Console Imports MonEspace Module Principal Public Sub Main() Dim CetteInstance = New UneClasse Scrn.WriteLine(CetteInstance.Majuscule("coucou")) Scrn.ReadLine() End Sub End Module

Il ne faut pas confondre pas les rfrences de projet avec les instructions Imports ou Declare. Les rfrences de projet rendent les objets externes, tels que les objets des assemblages, disponibles pour les projets Visual Studio .NET. L'instruction Imports simplifie l'accs aux rfrences de projet, mais ne constitue pas un accs ces objets. Elle facilite l'accs aux mthodes des classes en liminant le besoin de taper de manire explicite les noms complets des rfrences. Elle permet donc une conomie de dactylographie, un peu la manire de l'instruction With utilise pour les structures. Les alias permettent d'assigner un nom plus convivial seulement une partie d'un espace de noms. L'instruction Declare permet de dclarer une rfrence une procdure externe dans une bibliothque de liaison dynamique (DLL) installe sur le systme. L'exemple suivant, qui ne ncessite ni Imports ni rfrence, permet l'utilisation d'une MBox qui n'est autre que la MessageBox expose par la librairie systme user32.dll.
Public Class FBase Declare Auto Function MBox Lib "user32.dll" _ Alias "MessageBox" (ByVal hWnd As Integer, _ ByVal txt As String, ByVal caption As String, _ ByVal Typ As Integer) As Integer Private Sub UneProcedure() MBox(Me.Handle.ToInt32, "Message", "Titre", 0) End Sub End Class

' 0 = vbOKOnly

09/08/2011

PHR VB.Net VBPA - 9

Cet usage de l'instruction Declare est avantageusement abandonn au profit d'une mthode tout fait conforme au concept DotNet, qui dispose de l'aide en cours de dactylographie du code, qui est plus succincte et plus lisible, comme l'illustre le code de l'exemple prcdent modifi comme ceci :
Imports MBox = System.Windows.Forms.MessageBox Public Class FBase Private Sub UneProcedure() MBox.Show("Message", "Titre", MessageBoxButtons.OK) End Sub End Class

' vbOKOnly

Arguments d'appel d'une application


L'usage des arguments d'appel d'une application permet l'utilisateur de lancer le programme en lui passant des paramtres. Par exemple, la commande Format du Dos ncessite le passage d'un paramtre dsignant l'unit formater. De mme, la commande Copy a besoin du nom du fichier copier et du nom du fichier de destination.
Format D: Copy MonFichier.Txt MonFichier.Sav

Ces commandes travaillent ainsi parce que leurs arguments d'appel ont t dclars lors de l'criture de la procdure Main, o ils sont aussi appels paramtres formels, et que les paramtres passs en ligne de commande, aussi appels paramtres effectifs, leur sont substitus lors de l'excution du code. Ces paramtres se dclarent comme tant un tableau de String. A l'excution, chaque paramtre effectif occupe une place dans ce tableau.

Application Console
Le mcanisme des paramtres en ligne de commande impose qu'une procdure Main soit crite et dsigne comme objet de dmarrage. C'est la signature choisie pour cette Sub Main qui permet ou interdit la prise en compte de paramtres effectifs.
Sub Main() Sub Main(ByVal Arguments() As String)
' Sans paramtre ' Avec paramtre(s)

Le code suivant est compil pour fournir le programme Test.exe.


Module MonModule Sub Main(ByVal Arguments() As String) For i As Integer = 0 To Arguments.Length - 1 Console.WriteLine(Arguments(i)) Next Console.ReadLine() End Sub End Module

Application Windows
Certaines applications Windows peuvent tre lances partir dune session Dos, dautres seulement partir de linterface graphique, par un raccourci ou par un double-clic de leur nom dans lExplorateur de Windows. La prise en compte des paramtres se programme diffremment selon ces cas. A partir dune session Dos Lapplication est initialement construite comme tant une application Console. Elle est compose du module MonModule et du formulaire FAffichage sur lequel une ListBox nomme MaListBox a t dessine. La Sub Main a t dsigne comme objet de dmarrage dans les proprits du projet. L'application compile donne le programme Test.exe.

09/08/2011

PHR VB.Net VBPA - 10

Sub Main(ByVal Arguments() As String) Dim F As New FAffichage For i As Integer = 0 To Arguments.Length - 1 F.MaListBox.Items.Add(Arguments(i)) Next F.ShowDialog() End Sub

A partir de Windows Lapplication est construite comme tant une application Windows. Elle est uniquement compose du formulaire FBase sur lequel une ListBox nomme MaListBox a t dessine. L'application compile donne le programme Test.exe. Il peut tre activ comme nimporte quelle autre application Windows. Toutefois, pour lui passer des paramtres dexcution, le programme est activ partir de la bote de dialogue Excuter de Windows. Cest la librairie MicroSoft.VisualBasic qui fournit loutil ncessaire, la fonction Command, qui livre une chane de caractres composes des paramtres dexcution. La mthode Split de la classe String permet la transformation de cette chane en un tableau o chaque paramtre est disponible distinctement. La prise en compte des paramtres dexcution se programme ordinairement comme ci-dessous, dans la procdure de rponse lvnement Load du formulaire de dmarrage.
Private Sub FBase_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim Arguments() As String = Microsoft.VisualBasic.Command.Split(" ") For i As Integer = 0 To Arguments.Length - 1 MaListBox.Items.Add(Arguments(i)) Next End Sub

09/08/2011

PHR VB.Net VBPA - 11

Les rgions
Le mot cl Region, qui s'utilise prcd d'un dise ( # ), est une instruction d'organisation du code qui permet d'en amliorer l'accessibilit et la lisibilit. Le programmeur peut regrouper plusieurs parties de son code en rgions selon les rgles qui lui conviennent. Il ne faut pas confondre cette instruction avec la classe Region de l'espace de noms System.Drawing, cette dernire servant la description de l'intrieur d'une forme graphique. Chaque fois quune application Windows est cre sous Visual Studio 2003, une instruction Region est place pour isoler le code produit par le Concepteur Windows Form. Lusage de Region cet effet nexiste plus depuis Visual Studio 2005. Mais cette instruction n'est pas rserve Visual Studio et le programmeur peut en user sa guise. L'instruction #Region doit tre suivie d'une chane de caractres qui constitue la seule indication visible de la rgion lorsque celle-ci est masque. Tout bloc #Region doit se terminer par une instruction #End Region. Les rgions peuvent tre imbriques, mais nul doute que d'en abuser produira un effet contraire celui escompt ! Voici, pour illustrer l'usage de rgions, un exemple un peu excessif pratiqu sur la classe InputBox tudie dans la partie prcdente du cours. Quatre rgions ont t cres de sorte rassembler les diffrentes parties du code de manire logique. Une fois les rgions mises en place, leurs codes peuvent tre rendus visibles ou masqus selon les ncessits du moment. Ci dessous, les rgions Procdures vnementielles prives et Interface ont t rendues visibles tandis que les rgions Proprits prives et Constructeur sont restes masques.

' Rgions imbriques #Region " Interface "


'

#Region " Sorties "


'

#End Region ' Sorties #Region " Entres "


'

#End Region ' Entres #End Region ' Interface

09/08/2011

PHR VB.Net VBPA - 12

Les fonctionnalits du Framework


Les fonctionnalits du Framework se rpartissent en deux catgories, celle des classes organises en espaces de noms arborescents qui fournissent tous les outils de dveloppement utiles au programmeur, et celle des services internes qui assurent notamment la gestion de la mmoire, le contrle des versions, la scurit des applications. Les services internes oprent de manire transparente pour le programmeur qui se contentera d'en apprhender seulement quelques concepts. Pour l'instant, il importe de passer en revue quelques classes du Framework et d'y reprer des outils frquemment utiles.

L'espace de noms System


L'espace de noms System est la base de toutes les classes du Framework. Bien que rarement rfrenc de manire explicite par le programmeur, il est automatiquement inclus dans les rfrences de tout projet Visual Studio .Net et certaines de ses classes, telle que celle des types de donnes, sont exploites en permanence.

La classe System.Object
Descendante directe de la classe System, la classe Object mrite un peu d'attention du fait que tous les objets de l'environnement DotNet en drivent et hritent donc de ses mthodes. Mthodes Equals La mthode Equals retourne la valeur True si deux instances d'objet sont identiques et False dans le cas contraire. Le rsultat livr par cette mthode doit tre interprt de faon diffrente pour des variables de type valeur et celles de type rfrence. Pour les variables de type valeur, ce sont les contenus qui sont effectivement compars. Pour les variables de type rfrence, seules les adresses sont compares et un rsultat True signifie donc que ces rfrences pointent vers la mme instance.
Dim S1, S2, S3 As String S1 = "AZERTY" S2 = "QWERTY" S3 = "QWERTY" Console.WriteLine(S1.Equals(S2).ToString) Console.WriteLine(S2.Equals(S3).ToString) S3 = S1 Console.WriteLine(Equals(S1, S3).ToString)
' Rappel : Les chanes sont ' de type valeur

' Affiche False ' Affiche True ' Affiche True

GetHashCode Cette mthode retourne un identifiant de type Integer qui peut servir de base au calcul de la cl (hashcode) dun objet ajouter une collection. Des objets identiques fournissent le mme entier. Par exemple, les lignes de codes ci-dessous exprimentes la suite des prcdentes :
Console.WriteLine(S1.GetHashCode.ToString) Console.WriteLine(S2.GetHashCode.ToString) Console.WriteLine(S3.GetHashCode.ToString)
' Affiche 1229974258 ' Affiche 1203825954 ' Affiche 1229974258

GetType Cette mthode donne le type de l'objet.


Console.WriteLine(S1.GetType.ToString)
' Affiche System.String

ToString Cette mthode permet la reprsentation d'un objet par une chane de caractres non formate. Pour certains types de donnes tels que les Date, Time et les numriques, la mthode offre des possibilits de formatage semblables celles de la mthode Format. Par exemple F.ToString(".###") prsente le rel F avec 3 dcimales.

09/08/2011

PHR VB.Net VBPA - 13

La classe String
Proprit Length Cette proprit contient le nombre de caractres d'une chane.
Dim S1 As String S1 = "AZERTY" Console.WriteLine(S1.Length.ToString)

' Affiche 6

Mthodes Compare La mthode Compare retourne une valeur ngative, nulle ou positive selon que des deux chanes passes en paramtre, la premire est plus petite, gale ou plus grande que la deuxime.
Dim S1, S2, S3 As String S1 = "AZERTY" S2 = "QWERTY" S3 = "QWERTY" Console.WriteLine(String.Compare(S1, S2).ToString) ' Affiche -1 Console.WriteLine(String.Compare(S2, S1).ToString) ' Affiche 1 Console.WriteLine(String.Compare(S2, S3).ToString) ' Affiche 0

Un troisime paramtre de valeur True ou False peut tre pass la mthode pour indiquer si la casse doit tre diffrencie ou non lors de la comparaison (Compare(S1, S2, True) ou Compare(S1, S2, False)). Concat Cette mthode ralise la concatnation des chanes qui lui sont passes en paramtre et restitue une nouvelle chane. Elle est quivalente l'usage de l'oprateur de concatnation &.
Console.WriteLine(String.Concat(S1, " ", S2))
' Affiche AZERTY QWERTY

Copy Cette mthode copie une chane dans une autre. Elle est quivalente l'usage de l'oprateur d'affectation =. CopyTo La mthode CopyTo effectue la copie d'une sous chane vers un tableau de caractres. Ses arguments sont l'index de dpart de la copie, le tableau destinataire, l'index de dpart dans ce tableau et le nombre de caractres copier.
Dim S1 As String Dim TS(10) As Char S1 = "AZERTY" S1.CopyTo(2, TS, 0, 3) For i As Integer = 0 To 2 Console.Write(TS(i)) Next

' De l'index 2, vers TS partir de 0, 3 caractres ' Affiche ERT

IndexOf et LastIndexOf Ces mthodes fournissent respectivement la premire et la dernire occurrence d'une sous chane dans une chane donne. Elles renvoient -1 si la sous chane nest pas trouve.
S1 = "AZERTYAZERTY" Console.WriteLine(S1.IndexOf("ZER")) Console.WriteLine(S1.LastIndexOf("ZER"))
' Affiche 1 ' Affiche 7

09/08/2011

PHR VB.Net VBPA - 14

Insert Permet l'insertion d'une sous chane dans une chane donne partir d'un index galement donn.
S1 = "AZERTY" Console.WriteLine(S1.Insert(4, " & "))
' Affiche AZER & TY

Remove Suppression dans une chane, d'un nombre de caractres donns partir d'un index galement donn.
S1 = "AZERTY" Console.WriteLine(S1.Remove(3, 2))
' Affiche AZEY

Replace Remplacement dans une chane, de toutes les occurrences dune sous chane donne par une autre.
S1 = "AZERTY est un mot comme un autre" Console.WriteLine(S1.Replace("ER", "xxx")) Console.WriteLine(S1.Replace(" ", ""))
' Affiche AZxxxTY est un ' Enlve tous les espaces

Split Copie les sous chanes dlimites par un ou plusieurs caractres dans un tableau de caractres.
Dim S1 As String ' Table des sparateurs Dim S2 As Char() = {" "} ' Tableau des rsultats Dim S3() As String S1 = "AZERTY, QWERTY sont des mots comme : Visual Studio; VB" S3 = S1.Split(S2) For Each S As String In S3 Console.WriteLine(S) Next

Affichage quand S2 est {" "} : AZERTY, QWERTY sont des mots comme : Visual Studio; VB

Affichage aprs remplacement de S2 par {" ", ",", ";", ":"} : AZERTY QWERTY sont des mots comme

Visual Studio VB

09/08/2011

PHR VB.Net VBPA - 15

Substring La mthode Substring permet l'extraction d'une sous chane dsigne par son index de dbut et son nombre de caractres.
Dim S1 As String S1 = "AZERTY" Console.WriteLine(S1.Substring(2, 3))

' Affiche ERT

ToLower et ToUpper Ces mthodes effectuent les conversions de chanes en minuscules pour ToLower et en majuscule pour ToUpper. Trim, TrimStart et TrimEnd Ces mthodes permettent la suppression d'un ou plusieurs caractres donns, ou des espaces dfaut de spcification, aux extrmits d'une chane (Trim), ou au dbut (TrimStart) ou la fin (TrimEnd) de la chane.
Dim S1 As String Dim S2 As Char() = {"@", "#"} S1 = "#@AZERTY #@# QWERTY@#" Console.WriteLine(S1.TrimStart(S2)) Console.WriteLine(S1.Trim(S2)) Console.WriteLine(S1.TrimEnd(S2))
' Table des caractres ter ' Affiche AZERTY #@# QWERTY@# ' Affiche AZERTY #@# QWERTY ' Affiche #@AZERTY #@# QWERTY

Format La signature de la mthode Format se compose de deux parties, l'instar de la fonction printf du langage C, l'une constituant une chane de formatage, l'autre la liste des valeurs formater. Ainsi, dans l'expression String.Format("{1} + {0} = {2}", a, b, a + b), chaque paire d'accolades contient l'index dune valeur formater (de 0 n-1) et les guillemets dlimitent la chane rsultat qui est alors suivie des valeurs reprsenter. Si lexpression de cet exemple est contenue dans une instruction de sortie (auquel cas la mention String.Format peut tre omise) et si les valeurs respectives de a et b sont 3 et 5, le rsultat affich sera 5 + 3 = 8. Entre les accolades, les index de chaque valeur peuvent tre assortis d'attributs de formatage. En voici les principaux. Codes C D E F N P R X . , Usages et exemples Prsentation d'un nombre au format montaire.
String.Format("{0:C}", 1.25) String.Format("{0:D5}", 125)
' Rsultat 1,25 ' Rsultat 00125 ' Rsultat 1,234568E+005 ' Rsultat 1234,568 ' Rsultat 1 234 567,89 ' Rsultat 1 234,568 ' Rsultat 12,34% ' Rsultat 3,1415926535897931 ' Rsultat FFFF ' Rsultat 0000FFFF

Prsentation d'un nombre sans dcimale avec zros non significatifs. Prsentation d'un nombre au format scientifique.
String.Format("{0:E}", 123456.789) String.Format("{0:F3}", 1234.56789)

Prsentation d'une valeur numrique avec un nombre dtermin de dcimales. Prsentation d'un nombre avec les sparateurs de milliers.
String.Format("{0:N}", 1234567.89) String.Format("{0:N3}", 1234.56789)

Prsentation d'un nombre sous forme de pourcentage.


String.Format("{0:P}", 0.1234) String.Format("{0:R}", Math.Pi)

Prsentation des nombres en virgule flottante avec leur prcision maximale. Prsentation des nombres entiers sous forme hexadcimale.
String.Format("{0:X}", 65535) String.Format("{0:X8}", 65535)

Dfinition de la position du sparateur dcimal dans la chane rsultante. La virgule provoque le placement du sparateur de milliers dans la chane rsultante. Elle doit tre place lintrieur dune chane de formatage compose des caractres # et 0 et lintrieur de la partie entire. Si elle est place lextrme droite de cette partie, le nombre est divis par 1000.
String.Format("{0:##,#.##}", 123456.35) String.Format("{0:###,.##}", 123456.35)
' Rsultat 123 456,35 ' Rsultat 123,46

09/08/2011

PHR VB.Net VBPA - 16

Dfinition de lespace souhait pour la prsentation des nombres sans les zros non significatifs.
String.Format("{0:###}", 12.35) String.Format("{0:###}", 12.65)) String.Format("{0:###.##}", 12.35) String.Format("{0:###.#}", 12.35)
' ' ' ' Rsultat Rsultat Rsultat Rsultat 12 13 12,35 12,4

Dfinition de lespace souhait pour la prsentation des nombres avec placement des zros non significatifs.
String.Format("{0:000}", 12.35) String.Format("{0:000}", 12.65) String.Format("{0:000.00}", 12.3) String.Format("{0:000.00}", 12.35) String.Format("{0:000.0}", 12.35)
' ' ' ' ' Rsultat Rsultat Rsultat Rsultat Rsultat 012 013 012,30 012,35 012,4

La chane rsultante reprsente le nombre multipli par 100 et termin par le caractre %.
String.Format("{0:###.#%}", 12.35) String.Format("{0:###.#%}", 0.1265)
' Rsultat 1235% ' Rsultat 12,7%

- + $ et autres caractres et textes divers

Ces caractres sont insrs dans la chane rsultante tels qu'ils sont taps dans la chane de formatage. C'est aussi le cas de la plupart des caractres. Certains, tels que des caractres de formatage, doivent tre prcds d'un \ pour tre affichs. C'est le cas du \ lui-mme.
String.Format("{0:>####}", 123) String.Format("{0:\####}", 123) String.Format("{0:\\###}", 123) String.Format("{0:A###}", 123)
' ' ' ' Rsultat Rsultat Rsultat Rsultat >123 #123 \123 A123

Les chanes de formatage peuvent tre construites pralablement en tout ou en partie par l'usage d'une ou plusieurs variables de type String et de chanes littrales.
S = "AZER" String.Format("{0:" & S & " TY ##}", 12) S = "{0:" & "T " & "Y ##}" String.Format(S, 12)
' Rsultat AZER TY 12 ' Rsultat T Y 12

Prsentation dune date au format court. Dans les exemples suivants, D est un objet DateTime et sa proprit Now contient les date et heure de l'instant actuel .
String.Format("{0:d}", D.Now)
' Rsultat 7/03/2006 ' Rsultat mardi 7 mars 2006 ' Rsultat 21:14 ' Rsultat 21:14:25 ' Rsultat 7 mars ' Rsultat mars 2006 ' Rsultat mardi 7 mars 2006 21:14 ' Rsultat mardi 7 mars 2006 21:14:25 ' Rsultat 7/03/2006 21:14 ' Rsultat 7/03/2006 21:14:25 ' Rsultat 2006-03-07T21:14:25

D t T M ou m Y ou y f F g G s

Prsentation dune date au format long.


String.Format("{0:D}", D.Now)

Prsentation dune heure au format court.


String.Format("{0:t}", D.Now)

Prsentation dune heure au format long.


String.Format("{0:T}", D.Now)

Prsentation dune date par le jour et le mois.


String.Format("{0:M}", D.Now)

Prsentation dune date par le mois et lanne.


String.Format("{0:Y}", D.Now) String.Format("{0:f}", D.Now) String.Format("{0:F}", D.Now) String.Format("{0:g}", D.Now) String.Format("{0:G}", D.Now) String.Format("{0:s}", D.Now)

Prsentation dune date au format long avec lheure au format court. Prsentation dune date au format long avec lheure au format long. Prsentation dune date au format court avec lheure au format court. Prsentation dune date au format court avec lheure au format long. Prsentation de la date et de lheure sous la forme dune cl pouvant fournir un index.

La classe DateTime
La classe DateTime offre toutes les fonctionnalits ncessaires aux traitements et prsentations des dates et des heures. Ses proprits et mthodes sont applicables aussi aux donnes de type System.Date. La mthode de formatage des dates et heures n'est autre que la mthode ToString qui est surcharge dans cette classe afin de permettre la prise en compte d'ventuels attributs de formatage. Les mthodes String.Format et DateTime.ToString sont donc parfois concurrentes en matire de reprsentation des dates et heures. Au programmeur de choisir celle qui lui convient le mieux selon les ncessits de son application. Voici quelques membres de cette classe.

09/08/2011

PHR VB.Net VBPA - 17

Proprits Now, Date, Today, Day, DayOfWeek, DayOfYear, Month, Year, TimeOfDay, Hour, Minute, Second, Millisecond et Ticks Chacune de ces proprits en lecture seule, restitue un lment de la date et de l'heure contenues dans un objet DateTime.
Dim D As DateTime Dim S As String ' Now S = D.Now.ToString() ' Date S = D.Now.Date.ToString() ' Today S = D.Now.Today.ToString() ' Day
' Rsultat dans S : 9 S = D.Now.Day.ToString() ' DayOfWeek ' Rsultat dans S : Thursday S = D.Now.DayOfWeek.ToString() ' DayOfYear ' Rsultat dans S : 68 S = D.Now.DayOfYear.ToString() ' Month ' Rsultat dans S : 3 S = D.Now.Month.ToString() ' Year ' Rsultat dans S : 2006 S = D.Now.Year.ToString() ' TimeOfDay ' Rsultat dans S : 14:39:25.3734016 S = D.Now.TimeOfDay.ToString() ' Hour ' Rsultat dans S : 14 S = D.Now.Hour.ToString() ' Minute ' Rsultat dans S : 39 S = D.Now.Minute.ToString() ' Second ' Rsultat dans S : 25 S = D.Now.Second.ToString() ' Millisecond (Bonne alternative au gnrateur de nombres alatoires : valeurs de 0 999) ' Rsultat dans S : 373 S = D.Now.Millisecond.ToString() ' Ticks : nombre d'intervalles de 100 nanosecondes couls depuis le 1er janvier 0001, 12:00 ' Rsultat dans S : 632775119653734016 S = D.Now.Ticks.ToString() ' Rsultat dans S : 9/03/2006 00:00:00 ' Rsultat dans S : 9/03/2006 00:00:00 ' Rsultat dans S : 9/03/2006 14:39:25

Mthodes AddYears, AddHours, AddMonths, AddDays, AddMinutes, AddSeconds, AddTicks AddMilliseconds et

Chacune de ces mthodes ajoute une valeur donne la valeur correspondante (selon le nom de la mthode) de la date ou de l'heure contenues dans un objet DateTime. La valeur ajouter peut tre ngative.
Dim D As DateTime Dim DD As DateTime Dim S As String D = D.Now S = D.Day.ToString() D = D.AddDays(3) S = D.Day.ToString() S = D.Date.ToString() D = D.AddDays(-12) S = D.Date.ToString() S = D.Hour.ToString() D = D.AddHours(3) S = D.Hour.ToString()
' Test ralis le 9/3/2006 14h.39' ' Rsultat dans S : 9 ' Ajoute 3 jours D ' Rsultat dans S : 12 ' Rsultat : 12/03/2006 00:00:00 ' Retire 12 jours D ' Rsultat : 28/02/2006 00:00:00 ' Rsultat dans S : 14 ' Ajoute 3 heures D ' Rsultat dans S : 17

09/08/2011

PHR VB.Net VBPA - 18

DaysInMonth La mthode DaysInMonth retourne le nombre de jours du mois en fonction du mois et de l'anne.
DateTime.DaysInMonth(2008, 2)
' Rsultat 29

IsLeapYear La mthode IsLeapYear retourne la valeur True si l'anne qui lui est passe en paramtre est bissextile et False dans le cas contraire. ToShortTimeString, ToLongTimeString, ToShortDateString et ToLongDateString Ces mthodes restituent des chanes de caractres reprsentant les dates et heures sous le format court ou long.
Console.WriteLine(D.Now.ToString) Console.WriteLine(D.Now.ToShortTimeString) Console.WriteLine(D.Now.ToLongTimeString) Console.WriteLine(D.Now.ToShortDateString) Console.WriteLine(D.Now.ToLongDateString)
' ' ' ' ' Affichage Affichage Affichage Affichage Affichage 9/03/2006 17:13:38 17:13 17:13:38 9/03/2006 jeudi 9 mars 2006

ToString Comme dj signal, le mthode ToString est surcharge dans la classe DateTime afin de permettre la prise en compte de codes de formatage. En voici quelques uns. Codes : / y %y yy yyyy M %M MM MMM MMMM d %d dd ddd dddd H h m s HH hh mm ss Usages et exemples Caractres sparateurs dans la prsentation des heures ( : ) et dans celle des dates ( / ). Prsentation des annes, mois, et jours sous forme numrique ou alphabtique, cette dernire pouvant tre abrge non. L'usage du caractre % permet de reprsenter la seule valeur dsigne.
DateTime.Now.ToString("y") DateTime.Now.ToString("%y") DateTime.Now.ToString("yy") DateTime.Now.ToString("yyyy") DateTime.Now.ToString("M") DateTime.Now.ToString("%M") DateTime.Now.ToString("MM") DateTime.Now.ToString("MMM") DateTime.Now.ToString("MMMM") DateTime.Now.ToString("d") DateTime.Now.ToString("%d") DateTime.Now.ToString("dd") DateTime.Now.ToString("ddd") DateTime.Now.ToString("dddd")
' ' ' ' ' ' ' ' ' ' ' ' ' ' Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat Rsultat

septembre 2006
6 06 2006

6 septembre
9 09

sept. septembre 6/09/2006


6 06 mer. mercredi

Prsentation des heures, minutes et secondes, au format 12h ou 24h, avec ou sans zros non significatifs.
DateTime.Now.ToString("h:m:s") DateTime.Now.ToString("H:m:s") DateTime.Now.ToString("hh:mm:ss") DateTime.Now.ToString("HH:mm:ss")
' ' ' ' Rsultat Rsultat Rsultat Rsultat 6:13:8 18:13:8 06:13:08 18:13:08

f ff fffffff ' \ et autres caractres et textes divers

Prsentation du nombre de millisecondes avec ses dcimales sous forme d'une chane de 1 7 chiffres, selon le nombre de f placs.
DateTime.Now.MilliSecond() DateTime.Now.ToString("fff") DateTime.Now.ToString("fffffff")
' Rsultat 564 ' Rsultat 564 ' Rsultat 5642720

L'apostrophe et la barre oblique inverse permettent respectivement d'encadrer une chane littrale et de prcder un caractre littral qui serait aussi un code de formatage. Dans la plupart des cas, les valeurs littrales peuvent tre directement insres dans la chane de formatage.
DateTime.Now.ToString("'Wavre, le ' %d MMM yy") ' DateTime.Now.ToString("\/\/ %d MM yyyy") ' DateTime.Now.ToString("Wavre, le dd,MM,yy.") ' DateTime.Now.ToString("Wavre, le %d-MM-yyyy") '
Rsultat Rsultat Rsultat Rsultat Wavre, le 6 sept. 06 // 6 09 2006 Wavre, le 06,09,06. Wavre, le 6-09-2006

09/08/2011

PHR VB.Net VBPA - 19

La classe RegEx
La classe RegEx offre de trs efficaces moyens de manipulations des chanes de caractres : les expressions rgulires. Celles-ci permettent de tester le format d'une chane de caractres et d'effectuer des recherches de sous chanes correspondant un modle contenant des caractres jokers, aussi appels mtacaractres. On peut, par exemple, vrifier qu'une chane reprsentant une date est bien au format jj/mm/aa en utilisant le modle "\d\d/\d\d/\d\d" o le symbole \d dsigne un chiffre. Pour raliser des exemples d'utilisations des expressions rgulires, comme pour les exploiter dans les applications, il faut mettre en place quelques lments. Il faut tout d'abord importer l'espace de noms System.Text.RegularExpressions. Il faut disposer d'une chane sur laquelle doivent s'oprer les manipulations, ainsi qu'une chane destine contenir les modles contenant les mtacaractres. Et, ds lors que le traitement peut gnrer plusieurs rsultats, il faut un tableau spcial de type MatchCollection pour les stocker. L'excution du code suivant produit l'affichage de chacun des nombres prsents dans la chane Chaine : 123, 456 et 789.
Imports System.Text.RegularExpressions ' Dim Chaine As String ' ' Dim Modele As String ' Dim Reg As Regex ' Dim Resultats As MatchCollection Dim i as Integer ' ' Chaine = "Chaine : 123, 456 et 789" ' Modele = "\d+" ' Reg = New Regex(Modele) Resultats = Reg.Matches(Chaine) ' ' For i = 0 To Resultats.Count - 1 Console.WriteLine(Resultats(i).Value) ' Next

Chane manipuler Chane pour stocker le modle Une instance de la classe RegEx Une collection de classe RegEx pour les rsultats Crer une chane pour les tests Crer le modle tester Initialiser la classe avec le modle Obtenir les rsultats d'une recherche Parcourir la collection des rsultats pour les obtenir un par un

Voici un large extrait des codes disponibles pour la dfinition des modles recherchs : Codes \ Usages et exemples La barre oblique inverse ne peut tre employe seule dans un modle. Elle permet d'utiliser un mtacaractre comme caractre littral ou de dfinir un caractre ordinaire comme mtacaractre. Par exemple, n correspond au caractre n, mais \n correspond une marque de fin de ligne. La squence \\ correspond \ et \( correspond (. Ou encore, $ est un mtacaractre reprsentant la fin de la chane traiter, mais \$ correspond au caractre $.
Chaine = "C:\Cours\VBNet" Modele = "\\" 2 Rsultats \ \
' Chane cherche : \

Indique que la recherche se fait seulement au dbut de la chane.


Chaine = "C:\Cours\VBNet" Modele = "^C" 1 Rsultat C Modele = "^V"
0 Rsultat ' Chane cherche : C (en dbut) ' Chane cherche : V (en dbut)

Indique que la recherche se fait seulement la fin de la chane.


Chaine = "C:\Cours\VBNet" Modele = "C$"
0 Rsultat ' Chane cherche : C ( la fin) ' Chane cherche : Net ( la fin)

Modele = "Net$" 1 Rsultat Net

Joker pour le caractre qui le prcde, lequel peut tre prsent de 0 n fois dans la chane recherche.
Chaine = "C:\Cours\VBNet\Cool" Modele = "Co*" 3 Rsultats C Co Coo
' Chane cherche : C Cooooo .

Joker pour le caractre qui le prcde, lequel peut tre prsent de 1 n fois dans la chane recherche.
Chaine = "C:\Cours\VBNet\Cool" Modele = "Co+" 2 Rsultats Co Coo
' Chane cherche : Co Cooooo

09/08/2011

PHR VB.Net VBPA - 20

Joker pour le caractre qui le prcde, lequel peut tre prsent 0 ou 1 fois dans la chane recherche.
Chaine = "C:\Cours\VBNet\Cool" Modele = "Co?" 3 Rsultats C Co Co
' Chane cherche : C et Co

Le point est joker pour un et un seul caractre, quel qu'il soit, sauf la marque fin de ligne.
Chaine = "C:\Cours\VBNet\Calculs" ' Chane cherche : C et un caractre Modele = "C." 3 Rsultats C: Co Ca Le pipe est le OU logique du modle. La chaine recherche correspond l'une des expressions x, y, z spares par le | . Chaine = "C:\Cours\VBNet\Cool" ' Chanes cherches : VB ou C Coooo Modele = "VB|Co*" 4 Rsultats C: Co VB Coo

x|y|z|

{n}

Les expressions entre accolades se rapportent au caractre qui prcde l'accolade ouverte. Ici, le nombre n qui est un entier non ngatif signifie que la chane cherche correspondant exactement n fois le caractre. Chaine = "C:\Cours\VBNet\Cool"
Modele = "Co{1}"
2 Rsultats : Co Co 1 Rsultat ' Chanes cherches : Co ' Chanes cherches : oo

Modele = "o{2}" oo

{n,}

Les expressions entre accolades se rapportent au caractre qui prcde l'accolade ouverte. Ici, le nombre n qui est un entier non ngatif signifie que la chane cherche correspondant au moins n fois le caractre.
Chaine = "C:\Cours\VBNet\Cool" ' Chanes cherches : Co Coooo Modele = "Co{1,}" 2 Rsultats Co Coo ' Chanes cherches : Coo Coooo Modele = "Co{2,}" 1 Rsultat Coo Remarque : {1,} quivaut + et {0,} quivaut *.

{n,m}

Les expressions entre accolades se rapportent au caractre qui prcde l'accolade ouverte. Ici, les nombres n et m qui sont des entiers non ngatifs, signifient que la chane cherche correspondant au moins n fois et au plus m fois le caractre.
Chaine = "C:\Cours\VBNet\Cool" ' Chanes cherches : Co Modele = "Co{1,1}" 2 Rsultats Co Co ' Chanes cherches : Co et Coo Modele = "Co{1,2}" 2 Rsultats Co Coo Remarque : {0,1} quivaut ?.

[xyz]

La recherche porte sur n'importe quel caractre de la chane place entre les crochets.
Chaine = "C:\Cours\VBNet\Cool" ' Caractres cherchs : : \ s Modele = "[:\\s]" 5 Rsultats \ s \ \ ' Caractre cherch : o Modele = "[o]" 3 Rsultats o o o

[^xyz]

La recherche porte sur n'importe quel caractre n'appartenant pas la chane place entre les crochets.
Chaine = "C:\Cours\VBNet\Cool" ' Caractres cherchs : Tous sauf o u r s e t l Modele = "[^oursetl]" 10 Rsultats C : \ C \ V B N \ C

[a-z]

La recherche porte sur n'importe quel caractre appartenant la plage de caractres dsigne par les bornes a et z.
Chaine = "C:\Cours\VBNet\Cool" ' Caractres cherchs : Toutes les majuscules Modele = "[A-Z]" 6 Rsultats C C V B N C

[^a-z]

La recherche porte sur n'importe quel caractre n'appartenant pas la plage de caractres dsigne par les bornes a et z.
Chaine = "C:\Cours\VBNet\Cool" ' Caractres cherchs : Tous sauf les minuscules Modele = "[^a-z]" 10 Rsultats C : \ C \ V B N \ C

\b

Joker pour un seul caractre qui doit tre un caractre d'espacement.


Chaine = "Par monts et par vaux, quelque part " ' Chanes cherches : ar suivie d'un blanc Modele = "ar\b" 2 Rsultats ar ar Remarque : "ar\b" quivaut "ar ".

09/08/2011

PHR VB.Net VBPA - 21

\B

Joker pour un seul caractre qui ne peut tre un caractre d'espacement.


Chaine = "Par monts et par vaux, quelque part " ' Chanes cherches : ar non suivie d'un blanc Modele = "ar\B" 1 Rsultat ar

\s \S \d \D \f \n \r \t \v

\w

\W

\nOct \xnHex (modle)

Signifie que le caractre prcdent doit tre suivi d'un espace, d'une tabulation, d'un saut de page, . Remarque : \s quivaut [\b\f\n\r\t\v]. Signifie que le caractre prcdent ne peut tre suivi d'un espace, d'une tabulation, . Remarque : \S quivaut [^\b\f\n\r\t\v]. Joker pour un seul caractre qui doit tre un chiffre. Joker pour un seul caractre qui ne peut tre un chiffre. Jokers pour un seul caractre d'chappement : \f pour un saut de page. \n pour une marque de fin de ligne. \r pour un retour chariot. \t pour une tabulation. \v pour une tabulation verticale. Joker pour tout caractre numrique et alphabtique non accentu, ainsi que pour le caractre de soulignement. Remarque : \w quivaut [A-Za-z0-9_]. Joker pour tout caractre non numrique ni alphabtique non accentu, et diffrent du caractre de soulignement. Remarque : \W quivaut [^A-Za-z0-9_]. Le nombre nOct qui est un entier non ngatif exprim en octal reprsente le code ASCII du caractre cherch. Le nombre nHex qui est un entier non ngatif exprim en hexadcimal reprsente le code ASCII du caractre cherch. Les parenthses permettent la cration d'un modle compos de plusieurs groupes (ou sous modles) et de rcuprer ensuite les chanes trouves et leurs sous groupes distinctement. Le code prsent avant ce tableau, qui a servi l'exprimentation de tous les modles prcdents, peut toujours tre utilis mais il ne permet pas la pleine exploitation des groupes. Avec ce code :
Chaine = "C:\Cours\VBNet\Cool\VBNet\Cool" ' Chanes cherches : VBNet, Cool et VBNet\Cool Modele = "(VBNet)\\(Cool)" 2 Rsultats VBNet\Cool VBNet\Cool (sans distinction de VBNet et Cool)

En modifiant le code prcdent comme ci dessous, la mme exprimentation donne davantage de rsultats :
'

For i = 0 To Resultats.Count - 1 For j = 0 To Resultats(i).Groups.Count - 1 Console.WriteLine(Resultats.Groups(i).Value) Next Next

Avec le code modifi :


Chaine = "C:\Cours\VBNet\Cool\VBNet\Cool" ' Chanes cherches : VBNet, Cool et VBNet\Cool Modele = "(VBNet)\\(Cool)" 3 Rsultats VBNet\Cool VBNet Cool (une chane complte et chaque sous groupes) Modele = "((VBNet)\\(Cool)){1,}" 4 Rsultats VBNet\Cool VBNet\Cool VBNet Cool Le nombre num, qui est un entier de 1 n, doit ici tre utilis aprs un groupe entre parenthses. Il est l'index (de 1 n) d'un sous groupe rpter dans le modle qui en contient de 1 n. Il apporte une

\num et ?<nom>

conomie de dactylographie.
Chaine = "C:\Cours\VBNet\Cool\VBNet\Cool" Modele = "(VBNet)\\(Cool)\\\1\\\2" ' Chanes cherches : VBNet, Cool et 3 Rsultats VBNet\Cool\VBNet\Cool VBNet Cool VBNet\Cool\VBNet\Cool Modele = "((VBNet)\\(Cool))\\\1" 4 Rsultats VBNet\Cool\VBNet\Cool VBNet\Cool VBNet Cool

Les sous groupes peuvent en outre tre nomms pour permettre l'usage de noms significatifs la place des index. Il faut pour cela utiliser la syntaxe : Modele = "(?<Nom>Modele)". Les deux lignes suivantes de dfinition de modle sont quivalentes.
Modele = "(?<GrpVb>VBNet)\\(?<GrpCo>Cool)\\\<GrpVb>\\\<GrpCo>" Modele = "(VBNet)\\(Cool)\\\1\\\2"

09/08/2011

PHR VB.Net VBPA - 22

Membres Options La proprit Options est un paramtre de type RegexOptions pass au constructeur Regex pour modifier le mode de travail du moteur d'exploitation des expressions rgulires. Elle est dfinie par syntaxe Reg = New Regex(Modele, Option) avec de nombreuses valeurs possibles pour Option dont RegexOptions.SingleLine, RegexOptions.MultiLine, RegexOptions.IgnoreCase et RegexOptions.RightToLeft.
SingleLine

Cette option modifie la signification du point (.) de sorte qu'il corresponde n'importe quel caractre, sans l'exception de la marque de fin de ligne ( \n ). Cette option modifie la signification de ^ et $ de sorte qu'ils correspondent respectivement au dbut et la fin de n'importe quelle ligne, et non simplement au dbut et la fin de la chane entire. Cette option a pour effet que la recherche ne tient pas compte de la casse des caractres utiliss dans le modle.
Chaine = "C:\Cours\VBNet\COOL\" Modele = "VB|Co" Reg = New Regex(Modele, RegexOptions.IgnoreCase) ' Rsultats Co VB CO

MultiLine

IgnoreCase

RightToLeft Cette option provoque le traitement de chane de la fin vers le dbut. Chaine = "C:\Cours\VBNet\Cool\" Modele = "VB|Co|Net" ' Rsultats Co VB Net Co Reg = New Regex(Modele) Reg = New Regex(Modele, RegexOptions.RightToLeft)' Rsultats Co Net VB Co

La proprit Options de l'instance Regex contient l'information de l'option passe au constructeur.


Reg = New Regex(Modele, RegexOptions.IgnoreCase) Console.WriteLine(Reg.Options.ToString)
' Affiche IgnoreCase

RightToLeft La proprit RightToLeft de l'instance Regex contient la valeur True ou False selon que l'option RightToLeft a t passe au constructeur ou non.
Reg = New Regex(Modele, RegexOptions.RightToLeft) Console.WriteLine(Reg.RightToLeft.ToString)
' Affiche True

IsMatch Cette mthode excute une recherche et retourne la valeur True si une occurrence du modle a t trouve, et False dans le cas contraire.
Chaine = "C:\Cours\VBNet\COOL\" Modele = "VB|Co" Reg = New Regex(Modele) Console.WriteLine(Reg.IsMatch(Chaine).ToString)

' Affiche True

Match La mthode Match d'une instance de Regex ralise la recherche et la lecture de la premire occurrence du modle dans la chane traite.
Chaine = "C:\Cours\VBNet\COOl\" Modele = "VB|CO" Reg = New Regex(Modele)

09/08/2011

PHR VB.Net VBPA - 23

Console.WriteLine(Reg.Match(Chaine).ToString) Reg = New Regex(Modele, RegexOptions.RightToLeft) Console.WriteLine(Reg.Match(Chaine).ToString)

' Affiche VB ' Affiche CO

Matches La mthode Matches d'une instance de Regex ralise la recherche et la lecture de toutes occurrences du modle dans la chane traite et retourne ses rsultats dans une collection de type MatchCollection.
Dim Resultats As MatchCollection Chaine = "C:\Cours\VBNet\Cool\" Modele = "VB|Co" Reg = New Regex(Modele) Resultats = Reg.Matches(Chaine) For i = 0 To Resultats.Count - 1 Console.WriteLine(Resultats(i).Value) Next

' Affiche Co VB Co

Chaque lment de la collection dispose de membres utiles dont Count, NextMatch, Groups, Groups.Count, Index et Groups.Index.
Count

Cette proprit contient bien entendu le nombre de rponses stockes dans la MatchCollection. A la suite du code prcdent :
Console.WriteLine(Resultats.Count)
' Affiche 3

NextMatch

Cette mthode donne accs l'lment suivant celui dsign dans une MatchCollection. Ainsi, les deux lignes de codes suivantes produisent le mme affichage. A la suite du code prcdent :
Console.WriteLine(Resultats(2)) Console.WriteLine(Resultats(1).NextMatch)
' Affiche Co ' Affiche Co

Groups

Cette proprit contient la collection des sous groupes de chaque lment de la MatchCollection. Toujours la suite du code prcdent :
For i = 0 To Resultats.Count - 1 ' Console.WriteLine(Resultats(i).Groups.Count) Next For i = 0 To Resultats.Count - 1 For j = 0 to Resultats(i).Groups.Count - 1 ' Console.WriteLine(Resultats(i).Groups(j)) Next Next Chaine = "C:\Cours\VB\Cool\VB\Cool" Modele = "(VB)\\(Cool)\\\1\\\2" Reg = New Regex(Modele) Resultats = Reg.Matches(Chaine) ' Console.WriteLine(Resultats.Count) ' Console.WriteLine(Resultats(0)) Console.WriteLine(Resultats(0).Groups.Count) ' For i = 0 To Resultats(0).Groups.Count - 1 Console.WriteLine(Resultats(0).Groups(i)) ' Affiche Next
Affiche 1 1 1

Affiche Co VB Co

Affiche 1 Affiche VB\Cool\VB\Cool Affiche 3 VB\Cool\VB\Cool VB Cool

Index

Chaque lment stock dans une MatchCollection, ou dans une collection de sous groupes, possde une proprit Index qui conserve la position dans sa chane d'origine du modle trouv. En modifiant les sorties du code prcdent, on obtient :
Console.WriteLine(Resultats(0).Index) For i = 0 To Resultats(0).Groups.Count - 1 Console.WriteLine(Resultats(0).Groups(i).Index) Next
' Affiche 9 ' Affiche 9 9 12

09/08/2011

PHR VB.Net VBPA - 24

Replace La mthode Replace d'une instance de Regex ralise la recherche de toutes occurrences du modle dans la chane traite et retourne une autre chane dans laquelle ces occurrences ont t remplaces par une sous chane donne.
Dim Dim Dim Dim Chaine As String Modele As String Resultat As String Reg As Regex

Chaine = "C:\Cours\VBNet\Cool\" Modele = "VB|Co+" Reg = New Regex(Modele) Resultat = Reg.Replace(Chaine, "XX") Console.WriteLine(Resultat) Chaine = "Autant en emporte le vent" Modele = "en.*\bv" Reg = New Regex(Modele) Resultat = Reg.Replace(Chaine, "d'arg") Console.WriteLine(Resultat)

' Affiche C:\XXurs\XXNet\XXl\

' Affiche Autant d'argent

Split La mthode Split d'une instance de Regex est tout fait semblable celle de la classe String, mais celle-ci permet la dfinition du modle par lusage des codes des expressions rgulires et de leurs mtacaractres. Les sous chanes extraites par la mthode sont copies dans un tableau de chanes.
Dim Chaine As String ' Tableau des rsultats Dim Resultats() As String Dim Reg As Regex Dim Modele As String = "\W" Chaine = "AZERTY, QWERTY sont des mots comme : Visual Studio; VB" Reg = New Regex(Modele) Resultats = Reg.Split(Chaine) For Each S As String In Resultats Console.WriteLine(S) Next
Affichage quand Modele est "\W" : AZERTY QWERTY sont des mots comme

Visual Studio VB Affichage quand Modele est "\W{1,}" : AZERTY QWERTY sont des mots comme Visual Studio VB

09/08/2011

PHR VB.Net VBPA - 25

La classe Math
La classe Math fournit des constantes et des mthodes pour les fonctions trigonomtriques, logarithmiques et autres fonctions mathmatiques courantes. Proprits Les deux proprits Pi et E sont en fait des constantes publiques. Elles ne peuvent donc pas tre modifies. Pi E Contient la valeur de la constante de mme nom : 3.14159265358979 Contient la valeur de la constante de mme nom, la base des logarithmes naturels : 2.71828182845905

Mthodes Voici lnumration des mthodes de la classe Math. Le lecteur intress aura cur de consulter l'aide de son Visual Studio et de pratiquer les exprimentations ncessaires. Abs Acos Asin Atan Atan2 BigMul Ceiling Cos Cosh DivRem Exp Floor IEEERemainder Log Log10 Max Min Pow Round Sign Sin Sinh Sqrt Tan Tanh Retourne la valeur absolue d'un nombre spcifi. Retourne l'angle dont le cosinus est le nombre spcifi. Retourne l'angle dont le sinus est le nombre spcifi. Retourne l'angle dont la tangente est le nombre spcifi. Retourne l'angle dont la tangente est le quotient de deux nombres spcifis. Gnre le produit intgral de deux nombres 32 bits. Retourne le plus petit nombre entier suprieur ou gal au nombre spcifi. Retourne le cosinus de l'angle spcifi. Retourne le cosinus hyperbolique de l'angle spcifi. Retourne le quotient de deux nombres, en passant le reste en tant que paramtre de sortie. Retourne e lev la puissance spcifie. Retourne le plus grand nombre entier infrieur ou gal au nombre spcifi. Retourne le reste de la division d'un nombre spcifi par un autre. Retourne le logarithme d'un nombre spcifi. Retourne le logarithme de base 10 d'un nombre spcifi. Retourne le plus grand de deux nombres spcifis. Retourne le plus petit de deux nombres. Retourne un nombre spcifi lev la puissance spcifie. Retourne le nombre le plus proche de la valeur spcifie. Retourne une valeur indiquant le signe d'un nombre. Retourne le sinus de l'angle spcifi. Retourne le sinus hyperbolique de l'angle spcifi. Retourne la racine carre d'un nombre spcifi. Retourne la tangente de l'angle spcifi. Retourne la tangente hyperbolique de l'angle spcifi.

Pour rappel, en informatique les angles sont toujours exprims en Radians. Une mesure d'angle exprime en Degrs doit tre multiplie par Pi et divise par 180 pour exprimer la mme mesure en Radians.

La classe VBMath
La classe VBMath appartient lespace de noms Microsoft.VisualBasic et fournit les fonctions Randomize et Rnd utiles la gnration de nombres alatoires. La ligne de code suivante affiche un nombre compris entre 1 et 100.
Console.WriteLine(CType(100 * Microsoft.VisualBasic.VBMath.Rnd() + 1, Integer))

09/08/2011

PHR VB.Net VBPA - 26

L'espace de nom System.Drawing


L'espace de noms System.Drawing donne accs aux fonctionnalits graphiques de base du dessin vectoriel et contient d'autres espaces de noms tels que System.Drawing.Drawing2D, System.Drawing.Imaging et System.Drawing.Text qui fournissent des fonctionnalits plus sophistiques. Il contient aussi l'espace de noms Printing dj utilis pour raliser l'impression de documents. Toutes les fonctionnalits offertes par les diffrentes classes de System.Drawing ne sont pas explores dans ces pages. Seul lemploi de la classe Graphics est illustr ici par une petite application qui dessine l'cran le graphe d'une fonction mathmatique. Le lecteur intress par la programmation du graphisme peut bien entendu consulter l'aide de son VB.Net propos de cet espace de noms, mais aussi les diffrents articles accessibles par une recherche sur GDI+ (Graphics Device Interface). Le GDI+ est la partie du systme d'exploitation qui fournit les graphismes vectoriels deux dimensions, les images et la typographie.

La classe Graphics
La classe Graphics fournit des mthodes de dessin sur le priphrique d'affichage. Dans l'exemple qui suit, la mthode DrawLine couvre l'essentiel des besoins. Comme elle le serait sur une feuille quadrille, la fonction lcran est reprsente par une srie de points lesquels sont ventuellement joints par des segments de droites. Les coordonnes de chaque point sont constitues de son abscisse, qui est une des valeurs de X choisie dans la plage explore, et de son ordonne qui est la valeur Y calcule par l'application de la fonction sur la valeur de X. Le graphe de la fonction peut tre plus ou moins dense selon la faon de choisir les valeurs de X. Par exemple, une fonction f(X) = 2.X + 1 peut tre explore avec des valeurs de X variant de 1 9 au pas de 2 ou au pas de 0.5. Avec le pas de 2, on calcule une valeur de Y pour chacune des valeurs de X : 1, 3, 5, 7, 9, soit 5 points. Avec le pas de 0.5, on calcule une valeur de Y pour chacune des valeurs de X : 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, soit 17 points. Les coordonnes obtenues dans un cas et dans l'autre sont reprsentes par les paires XY suivantes :
X Y X Y 1 3 1 3 3 7 1.5 4 5 11 2 5 7 15 2.5 6 9 19 3 7 3.5 8 4 9 4.5 10 5 5.5 11 12 6 6.5 13 14 7 7.5 15 16 8 8.5 17 18 9 19

Le rsultat du calcul des valeurs de Y par la variation des valeurs de X au pas de 2 est reprsent ci contre par le graphe de gauche, tandis que celui de droite reprsente la mme fonction, mais avec des valeurs de Y calcules pour chaque valeur de X obtenue au pas de 0.5. Bien sr, comme le graphe de la fonction 2.X + 1 est une droite, les deux paires obtenues partir des valeurs extrmes de X sont suffisantes pour reprsenter correctement son graphe. Il en est autrement avec d'autres fonctions. Ainsi par exemple, la fonction trigonomtrique f(X) = Sin(X) tudie pour une gamme de valeurs de X s'talant de -Pi +Pi, peut aussi bien tre explore pour des valeurs de X variant au pas de Pi, ou au pas de Pi/2, ou de Pi/4, , mais le graphe obtenu ne suggrera une sinusode que pour un pas suffisamment fin. Ci contre, le graphe du haut est le trac de f(X) = Sin(X) pour X variant de -Pi +Pi au pas de Pi/2. Cinq points ont t dfinis. Le graphe du milieu reprsente la mme fonction, mais il est calcul cette fois pour chaque valeur de X obtenue au pas de Pi/4. Neuf points ont t dfinis. Enfin, en bas, le graphe a t calcul pour chaque valeur de X obtenue au pas de Pi/10. Vingt et un points ont t dfinis. Alors que le trac en cinq points ne suggre gure la sinusode, le trac en vingt et un points la reprsente parfaitement.

09/08/2011

PHR VB.Net VBPA - 27

Par ailleurs, un pas exagrment fin produit des valeurs qui ne peuvent tre reprsentes faute d'une prcision suffisante des outils de traage. Cela est dj perceptible par la comparaison des graphes de la fonction 2.X + 1 calculs pour des valeurs de X variant au pas de 2 et au pas de 0.5. Les points de ce dernier graphe sont beaucoup plus proches les uns des autres. Si les valeurs de X taient obtenues au pas de 0.01, il ne serait plus possible de distinguer un point d'un autre. De plus, il serait impossible de les tracer l'aide d'une latte d'colier, par exemple. Il y a donc tout intrt calculer le graphe d'une fonction sur base d'un chantillonnage fin des valeurs de X, mais sans toutefois atteindre une prcision qui n'est plus physiquement reprsentable. L'unit de dessin l'cran est le pixel. Il est inutile de calculer 200 points si on ne dispose que de 100 pixels pour les reprsenter. Par contre, n'en calculer que 50 aura pour effet de n'utiliser qu'un pixel sur deux et donc, de produire un graphe moins prcis. C'est donc le nombre de pixels allous horizontalement un graphe qui dtermine le meilleur pas d'chantillonnage des valeurs de X. Le nombre de valeurs de X reprsenter est la valeur absolue de la diffrence des bornes de X, augmente de 1 : NbValeurX = |XMax - Xmin| + 1. Cette valeur doit tre utilise pour calculer le pas de dcoupe de la plage des X en fonction du nombre de pixels. Le pas correspond au nombre de valeurs de X reprsenter divis par le nombre de pixels : PasX = NbValeurX / Largeur. Exemples : Plage des X -6 2 -6 -2 -2 6 -1000 1000 -6.28 +6.28 Units de la plage -6, -5, -4, -3, -2, -1, 0, 1, 2 -6, -5, -4, -3, -2 -2, -1, 0, 1, 2, 3, 4, 5, 6 -1000, -999, , 999, 1000 -6, -5, , 0, 1, , 5, 6 Calcul de
NbValeurX NbValeurX PasX, pour une largeur

|2 - -6| + 1 |-2 - -6| + 1 |-2 - 6| + 1 |1000 - -1000| + 1 |6.28 - -6.28| + 1

9 5 9 2001 13.56

de 500 pixels 0.018 0.01 0.018 4.002 0.02712

Les valeurs de Y sont dtermines par l'application de la fonction sur chacune des valeurs de X. L'cart entre deux valeurs de Y ne peut donc tre fix arbitrairement, mais l'amplitude du trac peut tre mise l'chelle de l'espace disponible de sorte l'occuper pleinement. Cet espace disponible pour la reprsentation des valeurs de Y est dlimit par le nombre de pixels allous verticalement au graphe. Attention toutefois que certaines fonctions apparaissent dformes lorsque les graphes sont raliss dans des systmes d'axes aux chelles diffrentes. Par exemple, les trois graphes ci contre ont t calculs avec les mmes valeurs de X par la mme fonction, et pourtant ils ont des allures bien diffrentes. Celui de gauche est trac dans une zone graphique de 50 sur 200 pixels, celui du milieu dans une zone de 200 sur 50 pixels, et celui de droite dans une zone de 200 sur 200. Par ailleurs, le systme de coordonnes de lcran commence dans le coin suprieur gauche de la feuille active et son axe Y est de sens contraire celui du systme de coordonnes ordinaire des mathmatiques. En mathmatique, laxe Y tale sa partie positive vers le haut. Cest pourquoi chaque Y calcul par un programme donne une valeur daffichage Y valant .Height - Y.

Une valeur Y = 0 donne Y = .Height 0, soit .Height, et cette valeur est bien reprsente en bas de la zone daffichage, lendroit du Y=0 mathmatique.

09/08/2011

PHR VB.Net VBPA - 28

Les considrations prcdentes propos de la programmation de tracs de fonctions mathmatiques, ont mis en vidence des outils utiles pour la dtermination des valeurs de X. Il faut maintenant calculer le facteur d'amplitude de Y et la formule de sa reprsentation compte tenu de l'inversion de l'axe des Y.
L'cran doit positionner un Y' en rapport avec le rsultat de la fonction YMax 0 La fonction calcule un Y reprsenter l'cran

Hauteur

Y' Height YMin

NbValeurY

Facteur d'amplitude : FacteurY

Le facteur d'amplitude est le rapport d'chelle entre la plage de pixels verticaux et la plage des Y calculs, soit FacteurY = Hauteur / NbValeurY. Il faut donc calculer NbValeurY et, en procdant comme pour la plage des X, on obtient la formule NbValeurY = |YMax - YMin| + 1. Pour la position l'cran de la valeur de Y ajuste par son facteur d'amplitude, il faut encore corriger l'erreur induite par l'inversion de l'axe Y. Puisque le facteur d'amplitude garantit une reprsentation de chaque Y' proportionnelle la valeur Y correspondante, on peut crire :
( Hauteur ( ( ( Y' ) / Hauteur Hauteur - Y' ) Hauteur - Y' ) Hauteur - Y' ) - Y' Y' = = = = = = | YMin - Y | / NbValeurY | YMin - Y | / NbValeurY * Hauteur | YMin - Y | * Hauteur / NbValeurY | YMin - Y | * FacteurY | YMin - Y | * FacteurY - Hauteur Hauteur - | YMin - Y | * FacteurY

Comme ralis dans cette dernire formule, la valeur de chaque Y calcul doit tre convertie en distance par rapport YMin, cette distance doit subir le facteur d'amplitude et le rsultat doit tre soustrait de la coordonne Y du bas de la plage graphique pour donner la position de Y' sur cette plage. Enfin, pour finaliser ces formules, il faut encore dterminer les valeurs extrmes de Y. Pour cela, le plus simple est de calculer toutes les valeurs de Y compte tenu du pas d'chantillonnage des valeurs de X et d'attraper au passage le plus petit et le plus grand des rsultats.
YMin = Fonction(XMin) YMax = Fonction(XMax) For X = XMin To XMax Step PasX Y = Fonction(X) If Y < YMin Then YMin = Y If Y > YMax Then YMax = Y Next
' ' ' ' ' ' Supposons que f(XMin) donne le plus petit Y Supposons que f(XMax) donne le plus grand Y Echantillonnge des X au pas de PasX Calcul de l'Y correpondant Si un Y est plus petit, on change Si un Y est plus grand, on change

Il faut encore savoir si le trac des axes X et Y est opportun. La prsence de l'axe X est utile si la valeur 0 existe dans la plage des Y et celle de l'axe Y est utile si la valeur 0 existe dans la plage des X. Dans un cas comme dans l'autre, le produit des valeurs extrmes donne un rsultat ngatif si la valeur 0 existe. Presque tous les ingrdients sont en place :
NbValeurX = |XMax - Xmin| + 1 PasX = NbValeurX / Largeur NbValeurY = |YMax - YMin| + 1 FacteurY = Hauteur / NbValeurY Y' = Hauteur - | YMin - Y | * FacteurY If XMin * XMax < 0 Then If YMin * YMax < 0 Then
' ' ' ' ' ' ' Plage des X Pas d'chantillonnage des X. Largeur correspond Width Plage des Y Facteur d'amplitude des Y Hauteur correspond Height Y' est la position de Y l'cran.

' Tracer l'axe Y l'cran. ' Tracer l'axe X l'cran.

09/08/2011

PHR VB.Net VBPA - 29

Le dessin l'cran se ralise l'aide de segments de droite. Les coordonnes de dpart du premier segment sont donnes par XMin et f(XMin), les coordonnes de l'extrmit de ce segment sont donnes par XMin + PasX et f(XMin + PasX). Ces coordonnes de l'extrmit du premier segment deviennent ensuite celles de dpart du segment suivant. Ce processus est rpt jusqu' la fin du dernier segment. Dans le programme suivant, la fonction utilise pour l'exemple est Y = Sinus(X). Elle est enferme l'intrieur d'une fonction nomme Fonction. L'utilisateur qui souhaite exprimenter une autre fonction doit en crire le code l'intrieur de Fonction et poser des bornes XMin et XMax cohrentes. Dans cet exemple, lespace graphique utilis est la surface dun Panel de 400 pixels sur 400, nomm Graphe.
Imports System.Drawing Imports System.Math
' Pour disposer de la classe Graphics ' Pour disposer de Pi, Sin() et Abs()

Private Function Fonction(ByVal x As Single) As Single Return Sin(x) End Function Dim Dim Dim Dim Dim Dim Dim Dim Dim MG As Graphics NbValeurX, NbValeurY As Single XMin, XMax, YMin, YMax as Single PasX, FacteurY As Single X, Y As Single Xe, Largeur, Hauteur As Single XDepart, YDepart As Single XEcran, YEcran As Single XEcrPrec, YEcrPrec As Single

' ' ' ' ' ' ' '

Les plages de valeurs Les valeurs extrmes Pas et facteur Le ncessaire au calcul Comptage des X "cran" et nombres de pixels Coordonnes de dpart l'cran Coordonnes de l'extrmit du segment Coordonnes du dbut du segment suivant

Graphe.BackColor = Drawing.Color.White Graphe.Refresh() MG = Graphe.CreateGraphics() ' Position XDepart = Largeur = YDepart = Hauteur =

' Pour dessiner sur fond blanc ' Obliger le form se redessiner ' Instanciation de l'objet Graphics

et dimensions du trac avec une marge de 5 pixels tout autour

5 Graphe.Width - 10 Graphe.Height - 5 Graphe.Height - 10

' Limites des X (idalement encoder par l'utilisateur) XMin = -2 * PI XMax = 2 * PI ' Mettre les bornes dans le bon ordre (en cas de mauvais encodage) If XMin > XMax Then Dim tmp As Single tmp = XMin XMin = XMax XMax = tmp End If ' Nombre d'units de la plage des X NbValeurX = Abs(XMax - XMin) + 1 ' Calcul du pas dchantillonnage des X PasX = NbValeurX / Largeur ' Limites des Y YMin = Fonction(XMin) YMax = Fonction(XMax) For X = XMin To XMax Step PasX Y = Fonction(X) If Y < YMin Then YMin = Y If Y > YMax Then YMax = Y Next

09/08/2011

PHR VB.Net VBPA - 30

' Nombre d'units de la plage des Y NbValeurY = Abs(YMax - YMin) + 1 ' Calcul du facteur d'amplitude pour Y FacteurY = Hauteur / NbValeurY ' Tracer de l'axe Y si 0 entre XMin et XMax (en noir) If XMin * XMax < 0 Then XEcran = XDepart + Largeur * Abs(XMin) / NbValeurX MG.DrawLine(Drawing.Pens.Black, XEcran, YDepart, XEcran, YDepart - Hauteur) End If ' Tracer de l'axe X si 0 entre YMin et YMax (en noir) If YMin * YMax < 0 Then YEcran = YDepart - Abs(YMin) * FacteurY MG.DrawLine(Drawing.Pens.Black, XDepart, YEcran, XDepart + Largeur, YEcran) End If ' Tracer le graphe (en bleu) X = XMin Y = Fonction(X) XEcrPrec = XDepart YEcrPrec = YDepart - Abs(YMin - Y) * FacteurY ' YDepart correspond Height, ' donc Hauteur ( la marge prs) For Xe = 1 To Largeur X = X + PasX Y = Fonction(X) XEcran = XDepart + Xe YEcran = YDepart - Abs(YMin - Y) * FacteurY MG.DrawLine(Drawing.Pens.Blue, XEcrPrec, YEcrPrec, XEcran, YEcran) XEcrPrec = XEcran YEcrPrec = YEcran Next

Et voil le rsultat :

09/08/2011

PHR VB.Net VBPA - 31

L'espace de noms System.Collections


Une collection regroupe un ensemble d'objets quelconques, comme le fait un tableau, mais avec une notion d'indice moins marque. Il est ordinaire d'ajouter et de retirer des lments d'une collection sans en connatre la position. Tous les tableaux sont drivs d'une classe Array et les collections sont drives de celles proposes dans System.Collections. Un exemple trivial de diffrence entre le tableau et la collection rside dans le moyen de connatre le nombre d'lments : il est donn par la proprit Length d'un tableau et par la proprit Count d'une collection. La collection peut contenir des objets de types originels diffrents (entiers, chanes, tableaux, autres collections, objets divers, ) alors que tous les lments d'un tableau sont d'un mme type. De plus, contrairement aux tableaux, le programmeur doit rarement se soucier de la taille d'une collection. L'espace de noms System.Collections fournit quelques classes directement oprationnelles ainsi qu'une classe CollectionBase offrant les outils de base d'une collection et permettant par hritage la construction de toute autre collection. Enfin, lespace de noms System.Collections possde un sous espace System.Collections.Generic qui propose plusieurs sortes de collections pouvant tre instancies pour constituer une alternative lusage des tableaux. En effet, comme cest le cas des tableaux, ces collections doivent tre instancies pour un type prdfini de donnes. Elles permettent donc dallier les avantageuses fonctionnalits des collections la rigueur des structures fortement types. Lespace de noms System.Collections.Generic est une nouveaut depuis VS 2005.

Les classes offertes


ArrayList BitArray Hashtable SortedList Queue Stack

C'est la plus simple des collections. L'accs un lment se fait essentiellement par son index. Il s'agit d'un tableau de valeurs boolennes stockes raison d'un bit par valeur. Une valeur est accessible par son index. C'est une collection de paires objet-cl. L'accs un lment se fait essentiellement par sa cl. Il s'agit d'un version amliore de la Hashtable dans laquelle les lments sont tris selon la valeur de leur cl. Comme son nom l'indique, il s'agit d'une collection dans laquelle on ajoute ou retire un lment selon le principe de la file (FIFO : premier entr, premier sorti). Comme son nom l'indique, il s'agit d'une collection dans laquelle on ajoute ou retire un lment selon le principe de la pile (LIFO : dernier entr, premier sorti).

Membres communs la plupart des collections


Les exemples de programmations relatifs aux membres communs illustrent dans les pages suivantes, l'tude des classes numres ci-dessus. Proprites
Count IsFixedSize IsReadOnly Item

Nombre d'lments de la collection. Cette proprit possde la valeur True ou False selon que la collection est de taille fixe ou non. Cette proprit possde la valeur True ou False selon que la liste est en lecture seul ou non. L'Item fournit l'lment dont on lui a indiqu l'index ou la cl.

Mthodes
Add Clear Clone Contains CopyTo

Ajoute un lment une collection. Vide la collection de tout son contenu. Cre une copie partielle d'une collection. Indique si un lment donn est prsent dans la collection. Copie partielle ou totale d'une collection dans un tableau une dimension.

09/08/2011

PHR VB.Net VBPA - 32

La classe ArrayList
Proprit Capacity Cette proprit reprsente le nombre d'lments que l'ArrayList est capable de stocker. Il ne faut pas confondre cette proprit avec Count qui reprsente le nombre rel d'lments stocks. La valeur de Capacity est toujours suprieure ou gale Count. Si Count excde Capacity lors de l'ajout d'lments, la capacit de la liste est double par une rallocation automatique du tableau interne. Mthodes AddRange Ajout d'une collection ArrayList la fin de l'ArrayList.
Dim A As New ArrayList Dim B As New ArrayList Dim I As Integer Dim S As String Dim Obj As Object I = 5 S = "AZERTY" A.Add(I) Console.WriteLine("A " & A.Add(S) Console.WriteLine("A " & B.Add(I * 2) Console.WriteLine("B " & B.Add("B" & S) Console.WriteLine("B " & A.AddRange(B) For Each Obj In A Console.WriteLine("A Next
' Instanciation d'un ArrayList

A.Item(0)) A.Item(1)) B.Item(0)) B.Item(1))

' ' ' ' ' ' ' ' '

Stocke un entier dans A Affiche A 5 Stocke une chane dans A Affiche A AZERTY Stocke un entier dans B Affiche B 10 Stocke une chane dans B Affiche B BAZERTY Stocke l' ArrayList B dans A

= " & Obj)

' Affiche A = 5 ' A = AZERTY ' A = 10 ' A = BAZERTY

GetType Obtient le type de toute instance ou d'un seul lment.


Console.WriteLine(B.GetType) Console.WriteLine(B.Item(1).GetType)
' Affiche System.Collections.ArrayList ' Affiche System.String

Insert Insre un lment dans ArrayList l'index spcifi et provoque le dplacement de tous les autres lments d'une position vers la fin.
B.Insert(1, "Insertion") Console.WriteLine(B.Item(0)) Console.WriteLine(B.Item(1)) Console.WriteLine(B.Item(2))
' Affiche 10 ' Affiche Insertion ' Affiche BAZERTY

09/08/2011

PHR VB.Net VBPA - 33

InsertRange Insre les lments d'une collection ArrayList l'index spcifi et provoque le dplacement de tous les autres lments vers la fin.
' Contenu de A avant InsertRange : 5 AZERTY 10 BAZERTY A.InsertRange(1, B) ' Contenu de A aprs InsertRange : 5 10 Insertion BAZERTY AZERTY 10 BAZERTY

IndexOf Retourne l'index de base zro de la premire occurrence d'une valeur dans ArrayList ou dans une partie de celui-ci, ou -1 en cas d'chec de la recherche.
Console.WriteLine(A.IndexOf(10))
' Affiche 1

LastIndexOf Retourne l'index de base zro de la dernire occurrence d'une valeur dans ArrayList ou dans une partie de celui-ci, ou -1 en cas d'chec de la recherche.
Console.WriteLine(A.LastIndexOf(10))
' Affiche 5

Remove Supprime la premire occurrence d'un objet spcifique de ArrayList et provoque le dplacement de tous les lments suivants d'une position vers le dbut.
' Contenu de A avant Remove : 5 10 Insertion BAZERTY AZERTY 10 BAZERTY A.Remove("BAZERTY") ' Contenu de A aprs Remove : 5 10 Insertion AZERTY 10 BAZERTY

RemoveAt Supprime l'lment au niveau de l'index spcifi de ArrayList et provoque le dplacement de tous les lments suivants d'une position vers le dbut.
' Contenu de A avant RemoveAt : 5 10 Insertion AZERTY 10 BAZERTY A.RemoveAt(4) ' Contenu de A aprs RemoveAt : 5 10 Insertion AZERTY BAZERTY

RemoveRange Supprime un nombre d'lments donn de ArrayList partir de l'index galement donn et provoque le dplacement de tous les lments suivants vers le dbut. La syntaxe est RemoveRange(Index, Nombre).
' Contenu de A avant RemoveRange : 5 10 Insertion AZERTY BAZERTY A.RemoveRange(1, 3) ' Contenu de A aprs RemoveRange : 5 BAZERTY

Repeat Initialise une ArrayList en recopiant un lment donn un nombre de fois galement donn. L'ArrayList est pralablement vide de son contenu. La syntaxe est Repeat(Objet, Quantit).
' Contenu de A avant Repeat : 5 10 Insertion AZERTY BAZERTY A = ArrayList.Repeat(0, 3)
' Contenu de A aprs Repeat : 0 0 0

09/08/2011

PHR VB.Net VBPA - 34

Reverse Inverse l'ordre des lments dans ArrayList ou dans une partie de celui-ci. La syntaxe est Reverse() ou Reverse(Index, Nombre).
' Contenu de A avant Reverse : 5 10 Insertion AZERTY BAZERTY A.Reverse() ' Contenu de A aprs Reverse : BAZERTY AZERTY Insertion 10 5

Sort Trie les lments dans ArrayList. Si tous les lments de la collection sont des objets ou s'ils appartiennent des types de bases diffrents, il faut indiquer la fonction de comparaison utiliser. Ce point sera abord plus tard. Si les lments sont tous d'un mme type de base, la syntaxe est Sort(). SetRange Copie les lments d'une collection sur une plage d'lments d'un ArrayList partir d'un index donn. Cette opration crase les lments ventuellement existants. La syntaxe est SetRange(Index, Collection).
' Contenu ' Contenu A.SetRange(2, B) ' Contenu ' Contenu
de A avant SetRange : 5 10 15 20 17 25 30 de B avant SetRange : BA BX BW de A aprs SetRange : 5 10 BA BX BW 25 30 de B aprs SetRange : BA BX BW

CopyTo Copie les lments de ArrayList vers un tableau unidimensionnel. Ceci n'est possible que si tous les lments de la collection et le tableau cible sont de mme type. Ainsi, s'il faut copier l'ArrayList A de l'exemple prcdent dans un tableau de chanes, il faut d'abord procder la conversion des valeurs numriques en chanes. Au programmeur de savoir quelles sont les consquences de cette conversion de la collection dans son application.
Dim Resultat(10) As String ' For I = 0 To A.Count - 1 A.Item(I) = A.Item(I).ToString Next A.CopyTo(Resultat)

Clone Copie les lments d'un ArrayList vers un autre. Cette opration crase les lments ventuellement existants dans l'ArrayList cible. La mthode Clone ne pas copie pas les objets rfrencs, mais seulement leurs rfrences. Aprs la copie, une rfrence d'une collection et son homologue de l'autre pointent toutes les deux la mme instance.
A.Add(0) Dim T = New Integer() {1, 2} A.Add(T) B = A.Clone() Console.WriteLine("A = " & A.Item(0)) Console.WriteLine("A = " & A.Item(1)(0)) Console.WriteLine("A = " & A.Item(1)(1)) Console.WriteLine("B = " & B.Item(0)) Console.WriteLine("B = " & B.Item(1)(0)) Console.WriteLine("B = " & B.Item(1)(1)) T(1) = 99 Console.WriteLine("A = " & A.Item(0)) Console.WriteLine("A = " & A.Item(1)(0)) Console.WriteLine("A = " & A.Item(1)(1)) Console.WriteLine("B = " & B.Item(0)) Console.WriteLine("B = " & B.Item(1)(0)) Console.WriteLine("B = " & B.Item(1)(1))
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Stocke l'entier 0 dans A Cre un tableau T(0) = 1 et T(1) = 2 Stocke le tableau T dans A Copie de A sur B Affiche A = 0 Affiche A = 1 Affiche A = 2 Affiche B = 0 Affiche B = 1 Affiche B = 2 Change T(1) de 2 en 99 Affiche A = 0 Affiche A = 1 Affiche A = 99 Affiche B = 0 Affiche B = 1 Affiche B = 99

09/08/2011

PHR VB.Net VBPA - 35

ToArray Copie les lments de ArrayList vers un nouveau tableau de type Object.
Dim T(3) As Object A.Add(0) A.Add(1) A.Add("AZE") T = A.ToArray() For Each Obj In T Console.WriteLine("T = " & Obj) Next

' Affiche 0 1 AZE

Contains Cette mthode retourne True si l'objet dsign est prsent dans la collection et False dans le cas contraire.
Console.WriteLine(A.Contains("AZE").ToString) ' Affiche True

La classe BitArray
Une instance de BitArray est une collection d'un nombre prdtermin de valeurs boolennes. Cette collection a peu de points communs avec les autres mais possde nanmoins les membres dj tudis Count, IsReadOnly, GetType, Clone, CopyTo, Equals et ToString. Proprit Length Cette proprit reprsente le nombre d'lments que BitArray est capable de stocker. Elle est identique la proprit Count, sauf que cette dernire est en lecture seule, tandis que Length peut tre affecte en cours d'excution pour modifier la taille de la collection. Mthodes Set et SetAll La collection BitArray ne possde pas de mthode Add du fait que tous ses lments existent ds son instanciation. Il est toutefois ncessaire d'affecter les valeurs des lments selon les impratifs des applications. C'est ce que permettent les mthodes Set et SetAll. Il est galement possible d'affecter un lment dsign par son index et la proprit Item.
Dim A As New BitArray(8) A.SetAll(False) A.Set(0, True) A.Item(6) = True
' ' ' ' Instanciation d'un BitArray Initialise tout False Initialise True l'index 0 Initialise True l'index 6

Get Mthode de lecture d'un lement, Get retourne True ou False selon la valeur de l'lment un index donn. La lecture de la proprit Item produit le mme rsultat.
Console.WriteLine(A.Get(0).ToString) Console.WriteLine(A.Item(1).ToString)
' Affiche True ' Affiche False

Not La mthode Not inverse toutes les valeurs logiques du BitArray. Le rsultat peut tre copi dans un autre BitArray.
Dim A As New BitArray(8) Dim B As New BitArray(8)

09/08/2011

PHR VB.Net VBPA - 36

A.SetAll(False) B = A.Not()

' Les lments de A et B sont True

And, Or et Xor Ces mthodes excutent les oprations logiques correspondantes entre deux BitArray et retournent le rsultat dans un autre BitArray.
C = A.And(B) C = A.Or(B) C = A.Xor(B)

La classe Hashtable
Dim A As New Hashtable A.Add("AZ", "AZERTi") A.Add("QW", "QWERTY") A.Add("PA", "PANZANI") For Each Obj As Object In A.Keys Console.WriteLine(Obj.ToString) Next For Each Obj As Object In A.Values Console.WriteLine(Obj.ToString) Next A.Item("AZ") = "AZERTY" Console.WriteLine(A.Item("AZ").ToString)
' Instanciation d'un Hashtable ' Ajout d'lments dans A

' Affichage AZ QW PA

' Affichage AZERTi QWERTY PANZANI ' Modification de l'lment de cl AZ ' Affiche AZERTY

Proprits Item Cette proprit permet la lecture et la modification d'une valeur correspondant une cl donne. Si les cls sont numriques et ordonnes de 0 Count - 1, la proprit peut tre utilise comme dans le cas de l'ArrayList. Mais alors, quoi bon utiliser la classe Hashtable ? L'usage de cette dernire n'a de sens que lorsqu'on utilise vraiment des cls.
A.Item("AZ") = "AZERTY"
' Modification de l'lment de cl AZ

Keys Cette proprit contient la collection des cls associes aux valeurs de Hashtable.
For Each Obj As Object In A.Keys Console.WriteLine(Obj.ToString) Next
' Affichage PA QW AZ

Values Cette proprit contient la collection des valeurs associes aux cls de Hashtable.
For Each Obj As Object In A.Values Console.WriteLine(Obj.ToString) Next
' Affichage PANZANI QWERTY AZERTi

Mthodes Add Ajoute un lment avec la cl et la valeur spcifies dans Hashtable.


A.Add("AZ", "AZERTi")
' Ajout d'un lment dans A

09/08/2011

PHR VB.Net VBPA - 37

Contains, ContainsKey et ContainsValue Ces trois mthodes retournent la valeur True si l'lment cherch est prsent dans la collection, et la valeur False dans le cas contraire. Les deux premires, Contains et ContainsKey, ralisent la recherche d'un lment parmi les cls de la collection, tandis que ContainsValue ralise la recherche parmi les valeurs.
Console.WriteLine(A.Contains("QW")) ' ' Console.WriteLine(A.Contains("PANZANI")) ' Console.WriteLine(A.ContainsKey("QW")) Console.WriteLine(A.ContainsValue("PANZANI")) '
Affiche Affiche Affiche Affiche True False True True

Remove Supprime l'lment ayant la cl spcifie.


A.Remove("PA") Console.WriteLine(A.ContainsValue("PANZANI")) ' Affiche False

La classe SortedList
La classe SortedList prsente les mmes membres que la classe Hashtable et quelques mthodes qui lui sont spcifiques. La particularit de SortedList est de conserver tous les lments dans l'ordre croissant des cls. Ceci implique que toutes les cls soient du mme type.
Dim A As New SortedList A.Add("AZ", "AZERTi") A.Add("QW", "QWERTY") A.Add("PA", "PANZANI") For Each Obj As Object In A.Keys Console.WriteLine(Obj.ToString) Next For Each Obj As Object In A.Values Console.WriteLine(Obj.ToString) Next A.Item("AZ") = "AZERTY" Console.WriteLine(A.Item("AZ").ToString)
' Instanciation d'un SortedList ' Ajout d'lments dans A

' Affichage AZ PA QW

' Affichage AZERTi PANZANI QWERTY ' Modification de l'lment de cl AZ ' Affiche AZERTY

Mthodes IndexOfKey Retourne l'index de base zro de la cl spcifie ou -1 en cas d'chec de la recherche.
Console.WriteLine(A.IndexOfKey("QW"))
' Affiche 2

IndexOfValue Retourne l'index de base zro de la premire occurrence de la valeur spcifie ou -1 en cas d'chec de la recherche.
Console.WriteLine(A.IndexOfValue("PANZANI")) ' Affiche 1

GetByIndex Obtient la valeur l'index spcifi.


Console.WriteLine(A.GetByIndex(2))
' Affiche QWERTY

09/08/2011

PHR VB.Net VBPA - 38

GetKey Obtient la cl l'index spcifi.


Console.WriteLine(A.GetKey(1))
' Affiche PA

SetByIndex Remplace la valeur au niveau de l'index spcifi.


Console.WriteLine(A.IndexOfValue("PANZANI")) A.SetByIndex(1, "RANZANI") Console.WriteLine(A.GetKey(1)) Console.WriteLine(A.Item("PA").ToString)
' ' ' ' Affiche 1 Change PANZANI en RANZANI Affiche PA Affiche RANZANI

RemoveAt Supprime l'lment au niveau de l'index spcifi.


A.RemoveAt(1)
' Supprime la paire PA - RANZANI

GetKeyList Retourne une collection des cls du SortedList.


For Each Obj As Object In A.GetKeyList Console.WriteLine(Obj.ToString) Next
' Affichage AZ QW

GetValueList Retourne une collection des valeurs du SortedList.


For Each Obj As Object In A.GetValueList Console.WriteLine(Obj.ToString) Next
' Affichage AZERTY QWERTY

La classe Queue
Un objet Queue est une collection gre selon le principe de la file (FIFO : premier entr, premier sorti). Mthodes Outre les membres Contains, Count et Clear communs la plupart des collections, la classe Queue possde trois mthodes qui lui sont spcifiques : Enqueue, Dequeue et Peek.
Dim A As New Queue A.Enqueue("AZERTY") A.Enqueue("QWERTY") A.Enqueue("PANZANI") For Each Obj As Object In A Console.WriteLine(Obj.ToString) Next
' Instanciation d'un Queue ' Enfilement d'lments dans A

' Affichage AZERTY QWERTY PANZANI

Enqueue La classe Queue ne possde pas de mthode Add. C'est la mthode Enqueue qui la remplace. Peek La mthode Peek retourne la valeur du premier lment disponible, c'est--dire le plus ancien de la collection sans le supprimer de la collection.

09/08/2011

PHR VB.Net VBPA - 39

Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Peek.ToString) Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Peek.ToString) Console.WriteLine(A.Count.ToString)

' ' ' ' '

Affiche Affiche Affiche Affiche Affiche

3 AZERTY encore 3 encore AZERTY toujours 3

Dequeue La mthode Dequeue retourne la valeur du premier lment disponible, c'est--dire le plus ancien de la collection et le supprime de la collection.
Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Dequeue.ToString) Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Dequeue.ToString) Console.WriteLine(A.Count.ToString)
' ' ' ' ' Affiche Affiche Affiche Affiche Affiche 3 AZERTY 2 QWERTY 1

La classe Stack
Un objet Stack est une collection gre selon le principe de la pile (LIFO : dernier entr, premier sorti). Mthodes Outre les membres Contains, Count et Clear communs la plupart des collections, la classe Stack possde trois mthodes qui lui sont spcifiques : Push, Pop et Peek.
Dim A As New Stack A.Push("AZERTY") A.Push ("QWERTY") A.Push ("PANZANI") For Each Obj As Object In A Console.WriteLine(Obj.ToString) Next
' Instanciation d'un Stack ' Empilement d'lments dans A

' Affichage PANZANI QWERTY AZERTY

Push La classe Stack ne possde pas de mthode Add. C'est la mthode Push qui la remplace. Peek La mthode Peek retourne la valeur du premier lment disponible, c'est--dire le plus rcent de la collection sans le supprimer de la collection.
Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Peek.ToString) Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Peek.ToString) Console.WriteLine(A.Count.ToString)
' ' ' ' ' Affiche Affiche Affiche Affiche Affiche 3 PANZANI encore 3 encore PANZANI toujours 3

Pop La mthode Pop retourne la valeur du premier lment disponible, c'est--dire le plus rcent de la collection et le supprime de la collection.
Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Pop.ToString) Console.WriteLine(A.Count.ToString) Console.WriteLine(A.Pop.ToString) Console.WriteLine(A.Count.ToString)
' ' ' ' ' Affiche Affiche Affiche Affiche Affiche 3 PANZANI 2 QWERTY 1

09/08/2011

PHR VB.Net VBPA - 40

Une dernire comparaison


' ArrayList Dim A As New ArrayList A.Add("AZERTY") A.Add("QWERTY") A.Add("RANZANI") A.Add("PANZANI") For Each Obj As Object In A Console.WriteLine(Obj.ToString) Next ' ' BitArray Dim B As New BitArray(4) B.Set(0, True) B.Set(1, True) B.Set(2, False) B.Set(3, True) For Each Obj As Object In B Console.WriteLine(Obj.ToString) Next ' Hashtable Dim C As New Hashtable C.Add("AZ", "AZERTY") C.Add("QW", "QWERTY") C.Add("RA", "RANZANI") C.Add("PA", "PANZANI") For Each Obj As Object In C.Keys Console.WriteLine(Obj.ToString) Next For Each Obj As Object In C.Values Console.WriteLine(Obj.ToString) Next ' SortedList Dim D As New SortedList D.Add("AZ", "AZERTY") D.Add("QW", "QWERTY") D.Add("RA", "RANZANI") D.Add("PA", "PANZANI") For Each Obj As Object In D.Keys Console.WriteLine(Obj.ToString) Next For Each Obj As Object In D.Values Console.WriteLine(Obj.ToString) Next ' Queue Dim E As New Queue E.Enqueue("AZERTY") E.Enqueue("QWERTY") E.Enqueue("RANZANI") E.Enqueue("PANZANI") For Each Obj As Object In E Console.WriteLine(Obj.ToString) Next ' Stack Dim F As New Stack F.Push("AZERTY") F.Push("QWERTY") F.Push("RANZANI") F.Push("PANZANI") For Each Obj As Object In F Console.WriteLine(Obj.ToString) Next

' Affichage en ordre d'encodage : ' AZERTY QWERTY RANZANI PANZANI

' Affichage en ordre d'encodage : ' True True False True

' Affichage des cls et valeurs en ordre ' dencodage depuis VS 2005, mais en ordre ' inverse sous VS 2003

' Affichage en ordre d'encodage : ' AZ QW RA PA ' Affichage en ordre d'encodage : ' AZERTY QWERTY RANZANI PANZANI

' Affichage en ordre croissant des cls : ' AZ PA QW RA ' Affichage en ordre croissant des cls : ' AZERTY PANZANI QWERTY RANZANI

' Affichage en ordre d'encodage : ' AZERTY QWERTY RANZANI PANZANI

' Affichage en ordre inverse de l'encodage : ' PANZANI RANZANI QWERTY AZERTY

09/08/2011

PHR VB.Net VBPA - 41

La classe CollectionBase
Depuis le dbut de ce cours, les proprits et mthodes les plus utilises des classes les plus exploites ont t tudies. Tous ces membres tudis ont une particularit commune : ils sont tous membres Public des classes qui les exposent. Les programmeurs qui ont conu ces classes ont bien du utiliser aussi des variables locales et des membres Private ou Friend, mais nul n'en saura jamais rien, moins que leurs sources soient publies . Chaque classe expose galement des membres qui nont pas t repris dans les numrations du cours, ce sont les membres Protected. Le programmeur souhaitant driver des classes du Framework a tout intrt consulter l'aide de VB.Net pour connatre les membres Protected dont il peut disposer. Tous les membres Public des classes sont accessibles partir de toute instance. Les membres Protected quant eux, ne sont accessibles que par hritage dans des classes drives. Une classe drive dispose alors des membres Public et des membres Protected de la classe dont elle hrite. La classe CollectionBase expose peu de membres Public, pas assez pour grer la moindre collection. Elle est spcialement destine la cration de collections indites et c'est au programmeur d'implmenter les outils et membres ncessaires. Pour illustrer l'emploi de CollectionBase, une collection MesChaines est cre. Elle prsente la particularit de la SortedList de conserver ses lments en ordre allie la simplicit de l'ArrayList. La collection MesChaines ne peut contenir que des objets de type String qui ne sont pas associs des cls et qui sont toujours dans le bon ordre. Cette programmation qui est illustrative, n'a aucune prtention de performance.
Class MesChaines Inherits CollectionBase End Class

Avec ce code, la nouvelle classe MesChaines existe mais son exploitation dans du code client reste fort limite. Elle ne dispose en effet que de quatre mthodes et d'une proprit. Elle ne dispose d'aucun moyen d'ajouter des lments la collection, ni d'en extraire. Il faut donc implmenter une mthode Add et une proprit Item, ainsi que les moyens souhaits pour la classe MesChaines. Voici le code complet de cette nouvelle classe.
Class MesChaines Inherits CollectionBase Dim Sens As Integer Dim FlgTri As Boolean
' Hritage de CollectionBase ' Sens du tri : croissant/dcroissant

Public Sub New(Optional ByVal Ordre As Integer = 1)' Un constructeur est programm pour Sens = Ordre ' prendre en compte un paramtre ' indiquant le sens du tri. End Sub Public ReadOnly Property SensTri() As String Get If Sens = -1 Then Return "D" Else Return "C" End If End Get End Property

' ' ' ' ' '

La proprit SensTri en ReadOnly permet au code client de connatre le paramtrage actuel du tri. La proprit SensTri vaut D si le tri est dcroissant ou C s'il est croissant.

Public Property Item(ByVal Index As Integer) As String Get ' La proprit Item permet la lecture Return MyBase.InnerList(Index) End Get ' et l'criture de l'lment dont Set(ByVal Value As String) ' l'index lui est pass. ' Cette proprit gre la proprit MyBase.Innerlist(Index) = Value ' Innerlist reue par hritage. If Not FlgTri Then Tri() ' FlgTri empche lappel rcursif du End Set ' tri quand Item y est modifi. End Property

09/08/2011

PHR VB.Net VBPA - 42

Public Sub Add(ByVal Obj As String) MyBase.InnerList.Add(Obj) Tri() End Sub Public Sub If Ordre If Ordre Sens = Tri() End If End Sub

' La mthode Add permet l'ajout ' d'un lment la collection et ' enclenche le tri.

ChangeOrdre(Optional ByVal Ordre As Integer = 0) < -1 Or Ordre > 1 Then Ordre = 0 ' La mthode ChangeOrdre permet au <> Sens Then ' code client d'inverser l'ordre du Sens * -1
' tri.

Private Sub Tri() ' La procdure prive Tri ralise le Dim i As Integer ' tri de la collection. Dim Comparaison As Integer ' L'algorithme de tri utilis ici Dim Temp As String ' n'est autre qu'une variante du tri Dim TemoinPermut As Byte If Count < 2 Then Exit Sub ' bulles. FlgTri = True Do TemoinPermut = 0 For i = 0 To Count - 2 Comparaison = String.Compare(Item(i + 1), Item(i)) If Comparaison <> Sens And Comparaison <> 0 Then Temp = Item(i) ' Il y a ici affectation de la Item(i) = Item(i + 1) ' proprit Item de la collection. Item(i + 1) = Temp TemoinPermut = 1 End If Next Loop While TemoinPermut = 1 FlgTri = False End Sub End Class

Utilisation de la classe MesChaines dans une application cliente :


Dim MC As New MesChaines Console.WriteLine(MC.SensTri().ToString) MC.Add("AZERT") MC.Add("QWERT") MC.Add("RANZA") MC.Add("PANZA") For Each S As String In MC Console.WriteLine(S) Next MC.ChangeOrdre() For Each S As String In MC Console.WriteLine(S) Next
' Instanciation d'un MesChaines ' Affiche C ' Ajout d'un lment dans MC

' Affichage AZERT PANZA QWERT RANZA ' Inverse l'ordre de tri ' Affichage RANZA QWERT PANZA AZERT

Autre exemple :
Dim MC As New MesChaines(-1) Console.WriteLine(MC.SensTri().ToString) MC.Add("AZERT") MC.Add("QWERT") MC.Add("RANZA") MC.Add("PANZA") MC.Item(1) = "Quartz" For Each S As String In MC Console.WriteLine(S) Next
' Instanciation pour tri dcroissant ' Affiche D ' Ajout d'un lment dans MC

' Change QWERT en Quartz ' Affichage RANZA Quartz PANZA AZERT

09/08/2011

PHR VB.Net VBPA - 43

Lespace de noms Collections.Generic


Lespace de noms System.Collections.Generic fournit des classes de base pour la mise en exploitation de collections dont les donnes sont dun type prdfini choisi parmi les types standard du Framework. Lutilit vidente de ces classes est doffrir une alternative lusage des tableaux. Lutilisation dune collection la place dun tableau prsente notamment comme avantage dtre dynamique de faon transparente pour le programmeur, ou encore de disposer dune proprit Count qui contient le nombre dlments effectivement prsents dans la collection alors que la proprit Length dun tableau contient le nombre de positions rserves, mais pas le nombres de positions effectivement utilises. Voici quelques unes des collections Generic proposes : Liste de valeurs accessibles par leur index. Cette collection dispose des mthodes de recherche, de tri et de manipulation de listes, comme lArrayList. Dictionary Collection de cls et de valeurs, comme la HashTable. SortedDictionary Collection des paires cl-valeur qui sont tries sur la cl, comme la SortedList. LinkedList Liste doublement chane offrant notamment des mthodes de parcours Previous et Next ainsi que des possibilits dinsertion de types First, Last, Before et After. Queue Collection d'objets FIFO, comme la Collections.Queue, avec les mmes mthodes. Stack Collection de type LIFO, comme la Collections.Stack, avec les mmes mthodes.
List

Quelques exemples.
' List (Of String) Dim Ls As New Collections.Generic.List(Of String) Ls.Add("AZERTY") Ls.Add("QWERTY") Ls.Add("RANZANI") Ls.Add("PANZANI") ' Affichage en ordre d'encodage : For Each Obj As Object In Ls ' AZERTY QWERTY RANZANI PANZANI Console.WriteLine(Obj.ToString) Next ' List (Of Integer) Dim Li As New Collections.Generic.List(Of Integer) Li.Add(456) Li.Add(123) Li.Add(789) Li.Add(258) ' Affichage en ordre d'encodage : For Each Obj As Object In Li ' 456 123 789 258 Console.WriteLine(Obj.ToString) Next ' Dictionary (Keys String, Values Integer) Dim Dsi As New Collections.Generic.Dictionary(Of String, Integer) Dsi.Add("AZ", 456) Dsi.Add("QW", 123) Dsi.Add("RA", 789) Dsi.Add("PA", 258) ' Affichage en ordre d'encodage : For Each Obj As Object In Dsi.Keys ' AZ QW RA PA Console.WriteLine(Obj.ToString) Next ' Affichage en ordre d'encodage : For Each Obj As Object In Dsi.Values ' 456 123 789 258 Console.WriteLine(Obj.ToString) Next

09/08/2011

PHR VB.Net VBPA - 44

' Dictionary (Keys Integer, Values String) Dim Dis As New Collections.Generic.Dictionary(Of Integer, String) Dis.Add(456, "AZERTY") Dis.Add(123, "QWERTY") Dis.Add(789, "RANZANI") Dis.Add(258, "PANZANI") ' Affichage en ordre d'encodage : For Each Obj As Object In Dis.Keys ' 456 123 789 258 Console.WriteLine(Obj.ToString) Next ' Affichage en ordre d'encodage : For Each Obj As Object In Dis.Values Console.WriteLine(Obj.ToString) ' AZERTY QWERTY RANZANI PANZANI Next ' SortedDictionary (Keys Integer, Values String) Dim SDis As New Collections.Generic.SortedDictionary(Of Integer, String) SDis.Add(456, "AZERTY") SDis.Add(123, "QWERTY") SDis.Add(789, "RANZANI") SDis.Add(258, "PANZANI") ' Affichage en ordre croissant des cls : For Each Obj As Object In SDis.Keys Console.WriteLine(Obj.ToString) ' 123 258 456 789 Next ' Affichage en ordre croissant des cls : For Each Obj As Object In SDis.Values ' QWERTY PANZANI AZERTY RANZANI Console.WriteLine(Obj.ToString) Next ' LinkedList Dim LKs As New Collections.Generic.LinkedList(Of String) Dim NoeudAPlacer As LinkedListNode(Of String) Dim NoeudCible As LinkedListNode(Of String) NoeudAPlacer = New LinkedListNode(Of String)("AZER") LKs.AddFirst(NoeudAPlacer) NoeudAPlacer = New LinkedListNode(Of String)("RANA") LKs.AddLast(NoeudAPlacer) NoeudCible = LKs.FindLast("AZER") NoeudAPlacer = New LinkedListNode(Of String)("KIWI") ' Attention : erreur si NoeudCible = Nothing LKs.AddAfter(NoeudCible, NoeudAPlacer) NoeudCible = LKs.FindLast("KIWI") NoeudAPlacer = New LinkedListNode(Of String)("KAWA") LKs.AddBefore(NoeudCible, NoeudAPlacer) NoeudAPlacer = New LinkedListNode(Of String)("PANA") LKs.AddAfter(NoeudCible, NoeudAPlacer) NoeudAPlacer = New LinkedListNode(Of String)("ERGO") LKs.AddFirst(NoeudAPlacer) For Each Obj As Object In LKs Console.WriteLine(Obj.ToString) Next
' Affichage en ordre attendu : ' ERGO AZER KAWA KIWI PANA RANA

Les types de donnes des collections gnriques peuvent tre des types construits par le programmeur. Voici pour exemple une LinkedList de Personne, le type Personne tant une structure.
Private Structure Personne Dim NomPers As String Dim AgePers As Byte End Structure Dim MaListe As New Collections.Generic.LinkedList(Of Personne) Dim NoeudAPlacer As LinkedListNode(Of Personne) Dim NoeudCible As LinkedListNode(Of Personne)

09/08/2011

PHR VB.Net VBPA - 45

Dim UnePersonne As Personne UnePersonne.NomPers = "AZER" UnePersonne.AgePers = 22 NoeudAPlacer = New LinkedListNode(Of Personne)(UnePersonne) MaListe.AddFirst(NoeudAPlacer) UnePersonne.NomPers = "RANA" UnePersonne.AgePers = 66 NoeudAPlacer = New LinkedListNode(Of Personne)(UnePersonne) MaListe.AddLast(NoeudAPlacer) UnePersonne.NomPers = "AZER" UnePersonne.AgePers = 22 NoeudCible = MaListe.FindLast(UnePersonne)

' Recherche d'un noeud

' Si le noeud est trouv If NoeudCible IsNot Nothing Then UnePersonne.NomPers = "KIWI" UnePersonne.AgePers = 44 NoeudAPlacer = New LinkedListNode(Of Personne)(UnePersonne) MaListe.AddAfter(NoeudCible, NoeudAPlacer) End If

09/08/2011

PHR VB.Net VBOBJ - 1

Programmation oriente objet en VB.Net

09/08/2011

PHR VB.Net VBOBJ - 2

Tables des matires des pages VBOBJ


Introduction ........................................................................................................................................................................3 Depuis 1960..............................................................................................................................................................3 Quelles diffrences ? ................................................................................................................................................3 Programmation oriente objet.............................................................................................................................................4 Classe et structure.....................................................................................................................................................4 Gestion de la mmoire..............................................................................................................................................8 Ramasse-miettes.............................................................................................................................................9 Enveloppement, contrle daccs, encapsulation .....................................................................................................9 Une proprit par dfaut ..............................................................................................................................12 L'hritage................................................................................................................................................................13 Programmation de l'hritage ........................................................................................................................14 Membre statique ................................................................................................................................15 Drivations publique, protge et prive ...........................................................................................18 Constructeurs et destructeurs .............................................................................................................19 Constructeur par recopie....................................................................................................................21 Interface et Implements................................................................................................................................22 Le polymorphisme..................................................................................................................................................26 Classe abstraite et mthode virtuelle............................................................................................................26 Surdfinition, surcharge et masquage ..........................................................................................................30 La surcharge des oprateurs .........................................................................................................................33 L'interdiction de driver .........................................................................................................................................33 Les vnements ......................................................................................................................................................34 Emission d'vnements ................................................................................................................................34 Rception et traitement d'vnements..........................................................................................................35 Aspects avancs................................................................................................................................................................37 La dlgation ..........................................................................................................................................................37 Programmation asynchrone....................................................................................................................................40 La commande asynchrone Shell...................................................................................................................40 Programmation de mthodes asynchrones ...................................................................................................41 Le multithreading ...................................................................................................................................................43 Les processus actifs......................................................................................................................................43 Synchrone, asynchrone et multithreading ....................................................................................................44 Programmation et gestion du multithreading...............................................................................................45 Accs une ressource partage .........................................................................................................45 Accs exclusif une ressource ..........................................................................................................47 Instanciation d'un thread par dlgation ............................................................................................48 Echange d'informations avec un thread .............................................................................................48 Le marshaling ....................................................................................................................................51 Programmation asynchrone et multithreading : une synthse ...........................................................56 La persistance .........................................................................................................................................................57

09/08/2011

PHR VB.Net VBOBJ - 3

Introduction
Depuis 1960
L'approche objet, incontournable aujourd'hui, n'est pas une ide neuve. Ds le dbut des annes soixante en Norvge, Ole-Johan Dahl et Kristen Nygaard crent le langage Simula (Simple universal language). Ce langage, qui est driv de l'Algol 60, se prsente comme un Algol intgrant de nouveaux concepts de programmation, dont celui de la programmation oriente objet. C'est pourquoi Simula est reconnu comme tant le premier langage orient objet. Par Simula, on entend gnralement Simula-67, c'est--dire la deuxime version commercialise, celle de 1967. Un pas important vers la programmation oriente objet se fait ensuite au dbut des annes septante avec l'arrive du langage Smalltalk, inspir de Lisp et de Simula, qui implmente notamment les concepts d'enveloppement, d'hritage et de polymorphisme. Ce langage implmente aussi de nombreuses techniques largement reprises en Java et en DotNet. Ce sont les techniques du ramasse-miettes qui s'occupe du nettoyage de la mmoire de faon transparente pour le programmeur, de la compilation en code intermdiaire destin une machine virtuelle, la translation dynamique qui permet la machine virtuelle de compiler le code intermdiaire vers le code machine au moment de l'excution. C'est cette dernire technique qu'on nomme maintenant compilation Just-in-time , ou JIT. C'est de l'volution des concepts et techniques de Smalltalk, que drivent les langages orients objets tels que C++ (cr par Bjarne Stroustrup en 1982), Delphi, Eiffel, Python, Ruby, Loops, et surtout, Java, Delphi.Net, C.Net, VB.Net, C#.Net.

Quelles diffrences ?
En programmation procdurale, les instructions sont runies en sous programmes (procdures ou fonctions) qui ont pour objet le traitement de donnes dfinies par ailleurs. Les fonctions, procdures et autres suites dinstructions accdent aux zones o sont stockes les donnes. Les donnes et leurs moyens de traitements sont dissocis. En programmation oriente objet, un programme est vu comme un ensemble dentits. Ces entits regroupent les donnes et les instructions ncessaires leur traitement. Au cours de l'excution du programme, les entits collaborent et senvoient des messages ncessaires au bon droulement des traitements. Un objet reprsente une entit du monde rel, ou d'un monde virtuel dans le cas dun objet immatriel, qui se caractrise par une identit, des tats significatifs et par un comportement. Lidentit dun objet permet de distinguer les objets les uns par rapport aux autres. Son tat correspond aux valeurs de tous ses attributs un instant donn. Enfin, le comportement dun objet est dfini par lensemble des oprations quil peut excuter en raction aux messages qu'il reoit des autres objets. Ces messages sont essentiellement des ordres lancs par les objets afin de faire excuter une tche par le destinataire ou d'en obtenir une information. Mme si une classe peut tre drive de nombreuses autres (par hritage), l'objet reste nanmoins l'instance dune et une seule classe : sa classe dappartenance. Elle est un modle dcrivant le contenu et le comportement des futurs objets de la classe. C'est dans cette classe que sont dfinies les proprits et les oprations de lobjet. Une classe est labstraction dun ensemble dobjets qui possdent une structure identique (liste des attributs) et un mme comportement (liste des oprations). Ainsi, contrairement l'approche procdurale qui dissocie donnes et traitements, lapproche objet se caractrise par le regroupement dans une mme classe de la description des donnes (appeles attributs, proprits ou donnes membres) et des oprations de traitements (appeles mthodes ou fonctions membres). Ce regroupement est lenveloppement, principe initial de la POO, qui amliore lautonomie et lindpendance de chaque classe et augmente le potentiel de rutilisation de chacune delles.
Traitement 1 Traitement 2 Traitement Traitement n Programmation procdurale Objet 1 Traitements 1 Donnes 1 Donnes Objet 2 Traitements 2 Donnes 2 Programmation objet Communications Objet n Traitements n Donnes n Objet Traitements Donnes

Attention, les concepts procduraux de la programmation ne sont pas jeter. Les moyens de traitements sont crits dans les classes par de la programmation procdurale.

09/08/2011

PHR VB.Net VBOBJ - 4

Les concepts fondamentaux de la programmation oriente objet sont lenveloppement, le contrle daccs, l'hritage et le polymorphisme. Pour certains auteurs, enveloppement et encapsulation sont synonymes et le contrle daccs porte le nom dabstraction. Pour dautres, lencapsulation est lassociation de lenveloppement et du contrle daccs. Voici l'tude de la programmation oriente objet, de sa mise en uvre sous VB.Net, et des techniques avances de programmation qui en dcoulent.

Programmation oriente objet


Classe et structure
Tout code excutable doit tre crit l'intrieur d'une procdure ou d'une fonction, cest connu. Ce qu'il faut encore dire, c'est que toute procdure ou fonction doit tre crite l'intrieur d'un module, d'une structure ou d'une classe. Les exemples de programmation l'intrieur d'un module sont dj nombreux. En ce qui concerne la structure, elle a t tudie en tant que moyen d'organisation des donnes et il est ncessaire de complter l'information son sujet. Une classe peut tre dfinie en dehors de toute autre structure de programmation, auquel cas elle est obligatoirement
Public, ou dfinie comme sous classe l'intrieur d'une autre classe, o le programmeur peut lui donner la porte qu'il souhaite. Elle peut galement tre dfinie l'intrieur d'un module o elle peut tre Public, Friend ou Private,

mais dans la mesure o un module n'est pas accessible par instanciation ou hritage dans une application cliente, les portes Public et Friend sont tout fait quivalentes. Une classe peut aussi tre dfinie l'intrieur d'une structure. Deux attributs peuvent tre associs la dclaration de porte de la classe pour prciser son comportement en matire d'hritage : MustInherit et NotInheritable.
MustInherit

NotInheritable

Indique que la classe sert de classe de base dans une relation d'hritage et elle ne peut tre instancie. En gnral, dans une telle classe, seules les dclarations des mthodes sont dfinies. Le contenu doit tre rdig dans les classes drives. Indique que la classe est la dernire de la hirarchie. Aucune autre classe ne peut en driver.

Public Class MaClasse ' Inherits UneClasseMere ' Implements UneInterface ' Implements UneAutreInterface Public Function MonCinq() As Integer Return 5 End Function End Class Module MonModule Sub Main() Dim MC As MaClasse MC = New MaClasse Console.WriteLine(MC.MonCinq) Console.ReadLine() End Sub End Module

La classe MaClasse crite en dehors de toute autre structure est bien Public et elle expose une mthode, la fonction MonCinq. Les lignes en commentaires ne sont videmment pas utiles ici, sauf pour prsenter l'endroit o il faut, le cas chant, dclarer une classe mre et des interfaces. L'utilisation du mot cl Inherits prcde la classe dont hrite celle en cours. Il ne peut y avoir qu'une seule ligne de ce type dans une classe. Le mot cl Implements prcde le nom d'une interface souhaite. Il peut y en avoir plusieurs par classe. Une interface ressemble un peu une classe mais elle contient uniquement des descriptions de proprits et de mthodes, sans code l'intrieur, ni mme de fin de code (End Sub, End Function). Implmenter une interface revient s'engager en crire le contenu pour toutes les mthodes et proprits. L'usage de l'interface est tudi plus loin. L'application cliente de MaClasse est le module MonModule. Dans sa procdure Main, la dclaration Dim MC As MaClasse attribue une variable pour la manipulation de l'objet. L'affectation de cette variable est ralise par l'appel du constructeur de la classe qui ralise l'instanciation de l'objet, c'est--dire sa cration en mmoire. Il faut remarquer au passage que le code du constructeur New de la classe n'a pas t crit. Dans ce cas, le compilateur en cre un d'office ou plus exactement, il en recherche un en remontant la gnalogie des classes jusqu la classe Object sil le faut.

09/08/2011

PHR VB.Net VBOBJ - 5

L'exemple suivant illustre la cration d'une sous classe et celle d'une classe l'intrieur d'un module, ainsi que leur instanciation.
Public NotInheritable Class MaClasse Private Shared UneValeur As Integer Public Function MaFonction1() As Integer UneValeur = 5 Return UneValeur End Function Public Function MaFonction2() As Integer Dim C As UneSousClasse C = New UneSousClasse Return C.UneFonction / 2 End Function Public Class UneSousClasse Public Function UneFonction() As Integer UneValeur = 10 Return UneValeur * 2 End Function End Class End Class Module MonModule Public Class ClasseModule
' Dfinition d'une classe dans le module ' Nul ne pourra en hriter ' Une variable de classe ' Une mthode ' Retourne la valeur de la variable de classe

' Une autre mthode ' Instanciation d'une sous classe ' Retourne la valeur reue d'une mthode ' de la sous classe aprs l'avoir divise ' Dfinition de la sous classe UneSousClasse

' La mthode retourne un entier

Public Function UneAutreFonction() As String ' La mthode retourne une chane Return "MomMessage" End Function End Class Sub Main() Dim MC As MaClasse Dim MSC As MaClasse.UneSousClasse Dim MCM As ClasseModule MC = New MaClasse MSC = New MaClasse.UneSousClasse MCM = New ClasseModule Console.WriteLine(MC.MaFonction1) Console.WriteLine(MC.MaFonction2) Console.WriteLine(MSC.UneFonction) Console.WriteLine(MCM.UneAutreFonction) Console.ReadLine() End Sub End Module

' ' ' ' ' ' ' ' ' '

Une variable pour MaClasse Une variable pour accder la sous classe Une variable pour ClasseModule Cration d'un objet MaClasse Cration d'un objet UneSousClasse Cration d'un objet ClasseModule Affiche 5 Affiche 10 Affiche 20 Affiche MonMessage

Tout fonctionne aussi bien, dans les exemples prcdents quand le mot cl Class est remplac par le mot cl Structure. Cependant, il y a des diffrences et notamment celles-ci : Un type Structure est de type valeur alors qu'une classe est de type rfrence. Un type Structure doit dclarer au moins une variable membre ou un vnement. Un type Structure peut dclarer un constructeur, mais alors il doit obligatoirement tre paramtr. Un type Structure ne peut pas servir de base pour un autre qui en hriterait. Un type Structure ne peut pas spcifier une classe dont il hriterait. Un type Structure ne peut pas dclarer un destructeur.

09/08/2011

PHR VB.Net VBOBJ - 6

Le premier exemple :
Public Structure MaStructure ' Implements UneInterface Dim UneVariable As Integer Public Function MonCinq() As Integer Return 5 End Function End Structure Module MonModule Sub Main() Dim MS As MaStructure ' MS = New MaStructure Console.WriteLine(MS.MonCinq) Console.ReadLine() End Sub End Module
' L'implmentation d'interfaces est permise ' Une structure doit contenir au moins une ' variable membre.

' Instanciation superflue. Toutefois, les ' membres de type rfrence doivent tre ' initialiss

Le deuxime exemple :
Public Structure MaStructure Private Shared UneValeur As Integer Private XMS As Integer Public Function MaFonction() As Integer Dim C As UneSousStructure ' C = New UneSousStructure Return C.UneFonction / 2 End Function Public Structure UneSousStructure Dim XMSS As Integer Public Function UneFonction() As Integer UneValeur = 10 Return UneValeur * 2 End Function End Structure Public Class ClasseStructure Public Function UneFonction() As Integer Dim X As Integer = 30 Return X End Function End Class End Structure
' ' ' ' ' Ne compte pas comme variable membre Voici une variable membre Une fonction membre qui utilise la fonction membre d'une sous structure Instanciation superflue.

' Dfinition de la sous structure et de ses ' membres, dont une fonction

' Dfinition d'une classe dans la structure ' et d'une mthode UneFonction

Module MonModule ' Dfinition d'une structure dans le module Public Structure StructureModule ' et de ses membres, dont une fonction Dim XSM As Integer Public Function UneAutreFonction() As String Return "MomMessage" End Function End Structure Sub Main() Dim MS As MaStructure Dim MSS As MaStructure.UneSousStructure Dim MSM As StructureModule Dim MCS As MaStructure.ClasseStructure MCS = New MaStructure.ClasseStructure Console.WriteLine(MS.MaFonction) Console.WriteLine(MSS.UneFonction) Console.WriteLine(MSM.UneAutreFonction) Console.WriteLine(MCS.UneFonction) Console.ReadLine() End Sub End Module

' ' ' ' '

Une classe est un objet de type rfrence Affiche 10 Affiche 20 Affiche MonMessage Affiche 30

09/08/2011

PHR VB.Net VBOBJ - 7

Un dernier exemple pour illustrer encore les similitudes existant entre les Class et les Structure, mais aussi l'une de leurs diffrences, ainsi que l'emploi d'un constructeur personnalis.
Public Structure MaStructure Public XMS As Integer Public Tab1() As Integer Public Classe As ClasseEnStructure Public Sub New(ByVal NbEntiers As Integer) Tab1 = New Integer(NbEntiers -1) {} Classe = New ClasseEnStructure End Sub Public Class ClasseEnStructure Public Tab2 = New Integer(5) {} End Class End Structure Public Class MaClasse Public XMC As Integer Public Tab1() As Integer Public Classe As ClasseEnClasse Public Sub New(ByVal NbEntiers As Integer) Tab1 = New Integer(NbEntiers -1) {} Classe = New ClasseEnClasse End Sub Public Class ClasseEnClasse Public Tab2 = New Integer(5) {} End Class End Class
' ' ' ' ' ' ' ' Dfinition d'une structure MaStructure et de ses membres, soit une variable de type entier, un tableau d'entiers, une variable de type objet ClasseEnStructure La structure dclare un constructeur dont le rle est de crer le tableau pour un nombre d'entiers pass en paramtre et de crer l'objet pour la variable Classe

' La classe expose un tableau pour 6 entiers

' ' ' ' ' ' ' '

Dfinition d'une classe MaClasse et de ses membres, soit une variable de type entier, un tableau d'entiers, une variable de type objet ClasseEnClasse La structure dclare un constructeur dont le rle est de crer le tableau pour un nombre d'entiers pass en paramtre et de crer l'objet pour la variable Classe

' La classe expose un tableau pour 6 entiers

Jusqu'ici, il n'y a pas de diffrences importantes entre les approches Structure et Class.
Module MonModule Sub Main() Dim MS, MS2 As MaStructure Dim MC, MC2 As MaClasse MS = New MaStructure(5) MS.XMS = 123 MS.Tab1(1) = 10 MC = New MaClasse(5) MC.XMC = 456 MC.Tab1(1) = 100 MS2 = MS MS2.XMS = 321 MS2.Tab1(1) = 101 MC2 = MC MC2.XMC = 654 MC2.Tab1(1) = 1001 Console.WriteLine(MS.XMS) Console.WriteLine(MS2.XMS) Console.WriteLine(MS.Tab1(1)) Console.WriteLine(MS2.Tab1(1)) Console.WriteLine(MC.XMC) Console.WriteLine(MC2.XMC) Console.WriteLine(MC.Tab1(1)) Console.WriteLine(MC2.Tab1(1)) End Sub End Module

' Dclaration des variables pour MaStructure ' Dclaration des variables pour MaClasse ' Cration d'une MaStructure en mmoire ' Affectation d'un membre de MaStructure ' Affectation d'un autre membre ' Cration d'une MaClasse en mmoire ' Affectation d'un membre de MaClasse ' Affectation d'un autre membre ' Affectation d'une autre MaStructure par MS ' Modification des valeurs de cette variable ' ' Affectation d'une autre MaClasse par MC ' Modification des valeurs de cette variable ' ' ' ' ' ' ' ' ' Affiche Affiche Affiche Affiche Affiche Affiche Affiche Affiche 123 321 101 101 654 654 1001 1001

Une diffrence !

09/08/2011

PHR VB.Net VBOBJ - 8

La seule diffrence constate dans l'exemple prcdent rside apparemment dans le fait que la variable de type valeur est bien traite comme telle dans la structure et non dans la classe. En ralit, c'est la structure elle-mme qui est de type valeur et lors de l'affectation de MS MS2, toutes les valeurs de la premire sont copies dans la deuxime. Dans le cas de l'objet de type MaClasse, seule la rfrence de MC est copie dans MC2 lors de l'affectation, et c'est bien normal puisqu'une classe est de type rfrence. Ds lors, et en premire approche, il est tonnant que les tableaux de la structure ne soient pas simplement copis eux aussi, qu'ils soient traits comme dans la classe. Il faut se souvenir qu'un tableau est de type rfrence et que seule la rfrence est conserve dans la variable. Ainsi, tout s'explique. Donc, dans la structure comme dans la classe, seule la rfrence d'un membre de type rfrence est conserve dans la variable correspondante et dans le cas de la structure, cette rfrence est bien copie par l'affectation, tandis que dans le cas de la classe, seule la rfrence de l'instance de la classe elle-mme est copie. Le choix entre Class et Structure est simple ds lors quest aborde la programmation oriente objet. Comme la structure ne peut hriter d'une classe et qu'aucune classe ou autre structure ne peut en driver, il est vident qu'elle n'intgre pas le concept d'hritage de la POO, ni donc celui du polymorphisme. La structure est donc rejeter de la POO, sauf pour organiser des lots de donnes sous la forme de types complexes dfinis par le programmeur. La classe intgre tous les concepts de la POO, elle est maintenant le principal objet de ces pages.

Gestion de la mmoire
La dclaration dun objet de type valeur provoque la rservation en mmoire de lemplacement ncessaire pour stocker la ou les valeur(s) de cet objet. Linitialisation par dfaut de la variable le reprsentant, est la valeur nulle selon le type. L'opration d'affectation entre objets de ce type copie toutes les valeurs de l'objet. Les valeurs de ce type sont stockes dans la pile ou stack. Les donnes de la pile sont dpiles et perdues quand l'application quitte la porte qui leur a t alloue. L'espace occup dans la pile est celui ncessaire au stockage des valeurs des variables. La dclaration dun objet de type rfrence provoque la rservation en mmoire de lemplacement ncessaire pour stocker ladresse o sera stock cet objet. Linitialisation par dfaut de la variable le reprsentant, qui est donc un pointeur, est Nothing. Ce n'est qu' la cration effective de l'objet que cette variable reoit l'adresse de l'objet. Une variable de type rfrence doit tre initialise par des valeurs ou par lusage de loprateur New pour permettre au compilateur dvaluer et de rserver lespace ncessaire en mmoire. Quand cette variable reprsente l'instance d'une classe, New, qui est le constructeur de toute classe, est le seul oprateur habilit l'initialiser. L'opration d'affectation entre objets de ce type ne copie que l'adresse mmoire de l'objet, sa rfrence. Les rfrences des objets sont stockes dans la pile et leurs valeurs dans le tas ou heap. Comme pour les objets de type valeur, les rfrences dans la pile sont dpiles et perdues quand l'application quitte la porte qui leur a t alloue. Cependant, ce processus ne libre pas l'espace occup dans le tas par les objets. Cette libration de la mmoire est ralise automatiquement par le ramassemiettes ou garbage collector. L'affectation de la valeur Nothing une rfrence n'influence en rien l'occupation de la mmoire, aussi bien ct pile que ct tas. L'espace occup dans la pile est celui ncessaire au stockage d'une adresse, soit quatre ou huit octets selon le systme, et celui occup dans le tas est l'espace ncessaire pour les donnes des objets. Les codes, comme ceux des mthodes par exemple, sont stocks en d'autres endroits de la mmoire et n'affectent ni la pile, ni le tas.
Oprations Dim XN As Integer XN = 5 Dim MC As MaClasse MC = New MaClasse Quelque part dans la pile Adresses supposes 14000000H 14000000H 13FFFFFCH 13FFFFFCH Quelque part dans le tas Adresses Valeurs supposes

Etiquettes

Valeurs

XN XN MC MC

0 5 Nothing 10000000H

10000000H

Dbut d'un objet MaClasse

Dim MC2 Dim T =

MC2 As MaClasse = MC T() As Integer New Integer(5) {}

MC2 MC2 T T T

13FFFFF8H 13FFFFF8H 13FFFFF4H 13FFFFF4H 13FFFFF4H

Nothing 10000000H Nothing 10001000H 10001000H

10001000H 10001004H

T(1) = 7

Espace pour 6 entiers 7

09/08/2011

PHR VB.Net VBOBJ - 9

Ramasse-miettes
Le ramasse-miettes ou garbage collector ralise la rcupration des ressources alloues et devenues inutiles. Son travail est transparent pour le programmeur qui ne doit pratiquement jamais s'en occuper. Il existe toutefois des cas o il ne suffit pas de compter sur le ramasse-miettes. Ce dernier libre en effet automatiquement la mmoire alloue un objet manag lorsque cet objet n'est plus utilis, mais il est impossible de prvoir quand il va le faire. De plus, le ramasse-miettes n'a pas connaissance des ressources non manages telles que les handles de fentres et les fichiers et flux ouverts. Les objets manags sont ceux dont le code est spcifiquement conu pour le Framework et sont, de ce fait, contrls par le CLR (Common language runtime). A linverse notamment, des composants appartenant d'anciennes versions de VB se retrouvent parmi les objets non manags. Lorsqu'il doit ajouter une rfrence dans un projet, la fentre de dialogue qui s'ouvre au programmeur possde plusieurs onglets dont NET et COM. Les rfrences proposes sous l'onglet NET sont des ressources manages. Celles de l'onglet COM ne le sont pas. Le programmeur peut parfois souhaiter que la libration d'une ressource soit immdiate. Il doit par ailleurs absolument librer les ressources qui sont inconnues du ramasse-miettes. Plusieurs moyens existent pour librer explicitement les ressources en association avec le ramasse-miettes. Ce sont les mthodes Close, Dispose et Finalize. L'tude des destructeurs est aborde un peu plus loin dans ces pages, mais il faut dj noter qu'il est prfrable d'utiliser la mthode Close quand l'objet concern l'implmente. Cette mthode appelle la mthode Dispose sans lui passer de paramtres. Si l'objet ne possde pas cette mthode ou s'il est ncessaire de paramtrer le destructeur, il faut utiliser la mthode Dispose adquate. La mthode Finalize de la classe Object ne doit jamais tre appele explicitement, elle est excute automatiquement lors de la destruction de l'objet.

Enveloppement, contrle daccs, encapsulation


L'enveloppement est le mcanisme consistant rassembler les donnes et les mthodes au sein d'une classe et le contrle daccs est celui qui consiste cacher l'implmentation de l'objet, c'est--dire empcher l'accs aux donnes par d'autres moyens que ceux exposs par l'interface de la classe. L'interface de la classe est l'ensemble de ses membres accessibles partir d'instances. Le contrle daccs veut que cette interface ne contienne que des mthodes. Dans l'exemple ci contre, le contrle daccs n'est pas ralis car la variable Cinq dclare Public est accessible de toute instance de la classe. Il existe pourtant une mthode MonCinq qui est habilite renvoyer la valeur de cette variable. Le contrle daccs est donc facile dans ce cas : il suffit de remplacer l'attribut de porte de la variable par Dim ou Private.
Public Class MaClasse Public Cinq As Integer = 5 Public Function MonCinq() As Integer Return Cinq End Function End Class

L'enveloppement renferme les biens d'une classe l'intrieure de celle-ci et leur accs ne peut se faire que par les mthodes habilites. Ces concepts runis ralisent lencapsulation, la protection de l'intgrit des donnes contenues dans l'objet. L'interface de la classe expose les membres selon les niveaux de visibilit dfinis par le programmeur. Il existe essentiellement trois niveaux de visibilit des membres d'une classe : Publique Tous les membres Public sont toujours exposs et donc toujours accessibles par les fonctions de n'importe quelle autre classe. Il s'agit du plus bas niveau de protection des donnes. Protg Les membres Protected ne sont exposs que dans des classes drives. Ils sont rservs aux fonctions des classes hritires. Priv Les membres Private ne sont pas exposs et leur accs est limit aux mthodes de la classe elle mme. Il s'agit du niveau de protection des donnes le plus lev. A cela peuvent s'ajouter les dclarations de portes Friend et Protected Friend. La visibilit Friend est quivalente Public dans le projet en cours et Private dans les applications clientes. La visibilit Protected Friend est quivalente Public dans le projet en cours et dans les classes drives, mais Private dans les applications clientes qui ne pratiquent que des instanciations de la classe.

09/08/2011

PHR VB.Net VBOBJ - 10

La ncessit du contrle daccs concerne essentiellement les donnes de la classe. Il est cependant superflu de dclarer Public des procdures et des fonctions qui ne servent que la classe elle-mme. Il faut rserver la porte Public aux mthodes qui doivent rpondre aux ordres lancs par d'autres objets. Par exemple, la classe suivante MesPremiers, est destine au traitement de nombres premiers. Elle n'est pas complte, mais elle expose dj une mthode Premier qui retourne True si le nombre qui lui est pass est premier et False dans le cas contraire. La vrification d'un nombre est faite par le test du reste de sa division par un entier impair qui varie au pas de 2, partir de 3 jusqu' une limite calcule. Cette limite est calcule par la fonction locale Limite qui retourne la partie entire de la racine carre du nombre ou 0 si le nombre est un carr parfait. De plus, les nombres pairs et multiples de 5 sont dtects par la fonction locale PairEt5 de sorte ne pas entreprendre les calculs pour eux. En cours d'itrations cette fonction permet encore d'viter le calcul du reste de la division par 5. L'outil fonctionne aussi bien si les attributs de porte des fonctions Limite et PairEt5 sont remplacs par Public ou
Protected.

Mais est-il bien ncessaire qu'une application cliente ait accs ces fonctions spcialement conues pour servir la mthode Premier ? A dfaut d'une analyse oriente objet bien mene, c'est la question que doit se poser le programmeur pour dterminer si un membre prsente un intrt publique ou pas.
Public Class MesPremiers Public Function Premier(ByVal N As Integer) As Boolean Dim Diviseur As Integer Dim LimiteCalcul As Integer = 0 If N = 1 Or N = 2 Or N = 3 Or N = 5 Then Return True If Not (PairEt5(N)) Then LimiteCalcul = Limite(N) Diviseur = 3 While (Diviseur < LimiteCalcul) If N Mod Diviseur = 0 Then Return False Diviseur += 2 If PairEt5(Diviseur, False) Then Diviseur += 2 End While Else Return False End If If LimiteCalcul > 0 Then Return True Else Return False End If End Function Private Function PairEt5(ByVal N As Integer, Optional ByVal Tout As Boolean = True) As Boolean Dim Resultat As Boolean ' Test si multiple de 5 Resultat = (N Mod 5 = 0) ' Tester aussi si multiple de 2 If Tout Then Resultat = Resultat OrElse (N Mod 2 = 0) End If Return Resultat End Function Private Function Limite(ByVal N As Integer) As Integer Dim R As Single ' Calculer de la racine carre R = Math.Sqrt(N) ' Arrondir vers le bas If R > Math.Floor(R) Then Return CType(R, Integer) Else ' Si R vaut son arrondi, N est un carr Return 0 End If End Function End Class

09/08/2011

PHR VB.Net VBOBJ - 11

En ce qui concerne les donnes de l'objet, plusieurs moyens sont la disposition du programmeur pour les encapsuler et permettre quand mme aux applications clientes d'accder certaines d'entre elles. Le programmeur peut user de fonctions et de procdures publiques, donc de mthodes au sens commun, ainsi que de mthodes appropries et appeles Property. Selon le cas, il doit autoriser l'accs en lecture seule, ou en criture seule, ou encore permettre la lecture et l'criture des valeurs.
Public Class MaClasse Dim ValeurLocale As Integer Public Enum SetGet DoSet = 0 : DoGet = 1 End Enum ' Mthode commune d'accs en lecture seule Public Function LireValeurM() As Integer Return ValeurLocale End Function ' Mthode commune d'accs en criture seule

' Valeurs constantes

' Usage dans ' Dim ' Dim ' N =

une application cliente : Obj As New MaClasse N as Integer Obj.LireValeurM()

' Usage dans une application cliente : ' Dim Obj As New MaClasse ' Dim N as Integer = 5 Public Sub EcrireValeurM(ByVal UneValeur As Integer) ' Obj.EcrireValeurM(N) ValeurLocale = UneValeur

End Sub ' Mthode commune d'accs en lecture et en criture Public Function LireEcrireValeurM(ByVal SG As SetGet, Optional ByVal UneValeur As Integer = 0) As Integer ' Usage dans une application cliente : If SG = SetGet.DoSet Then ' Dim Obj As New MaClasse ValeurLocale = UneValeur ' Dim N as Integer Else ' N = Obj.LireEcrireValeurM(1) Return ValeurLocale ' N += 5 End If ' Obj.LireEcrireValeurM(0, N) End Function ' Mthode Property d'accs en lecture seule, aussi apelle "Accesseur" Public ReadOnly Property LireValeurP() As Integer Get Return ValeurLocale End Get End Property
' Mot ' Usage dans ' Dim ' Dim ' N = cl ReadOnly requis une application cliente : Obj As New MaClasse N as Integer Obj.LireValeurP

' Mthode Property d'accs en criture seule, aussi apelle "Modifieur" ou "Modificateur"
' Mot cl WriteOnly requis Public WriteOnly Property EcrireValeurP() As Integer ' Usage dans une application cliente : Set(ByVal UneValeur As Integer) ' Dim Obj As New MaClasse ValeurLocale = UneValeur ' Dim N as Integer = 5 End Set ' Obj.EcrireValeurP = N End Property

' Mthode Property d'accs en lecture et en criture ("Accesseur" ou "Modifieur" selon son usage) Public Property LireEcrireValeurP() As Integer Get Return ValeurLocale End Get Set(ByVal UneValeur As Integer) ValeurLocale = UneValeur End Set End Property End Class

' Usage dans une application cliente : ' Dim Obj As New MaClasse ' Dim N as Integer ' N = Obj.LireEcrireValeurP ' N += 5 ' Obj.LireEcrireValeurP = N

09/08/2011

PHR VB.Net VBOBJ - 12

Il faut encore noter que l'initialisation de variables de classes l'aide d'un constructeur paramtr respecte le principe du contrle daccs. Dans l'exemple suivant, deux constructeurs ont t programms. L'emploi de plusieurs constructeurs permet le choix de celui qui convient le mieux un moment donn dans l'application cliente. Le premier, sans paramtre, fait appel au constructeur dont tout objet hrite implicitement de la classe originelle, savoir la classe Object. La programmation de cet appel est facultative car il est excut automatiquement, mais cest la seule tche qui puisse tre programme ici, ce constructeur nayant rien dautre faire. Le deuxime constructeur est dfini avec un paramtre formel destin l'affectation de la variable de la classe. Ce constructeur surcharge le premier. La spcification Optional de son paramtre aurait dispens de la programmation du premier constructeur. Le mot cl Overloads ne doit pas tre employ pour la surcharge des constructeurs.
Public Class MaClasse Dim DonneeLocale As Integer Public Sub New() MyBase.New() End Sub Public Sub New(ByVal Donnee As Integer) DonneeLocale = Donnee End Sub Public Function Donnee() As Integer Return DonneeLocale End Function End Class Module MonModule Sub Main() Dim MC As MaClasse MC = New MaClasse Console.WriteLine(MC.Donnee) MC = New MaClasse(123) Console.WriteLine(MC.Donnee) End Sub End Module
' Dfinition du premier constructeur ' Appel du constructeur de base

' Dfinition du deuxime constructeur ' Affectation de la variable de classe

' Mthode de lecture de la variable

' ' ' '

Appel du constructeur sans paramtre Affiche 0 Appel du constructeur avec paramtre Affiche 123

Une proprit par dfaut


La proprit par dfaut est celle qui est utilise lors de laccs une instance sans prcision de membre. Elle est dfinie par une mthode Property dote d'un attribut particulier : Default. Voici, pour l'exemple, une classe ClTableauDePersonnes construite l'image d'une ArrayList mais dont la proprit Item peut tre omise l'usage. La classe gre bien entendu un vecteur de personnes, chacune tant une instance d'une classe ClPersonne. Cette dernire possde ici un seul membre, une mthode Property, qui permet l'accs au nom de la personne.
Public Class ClPersonne Dim NomLocal As String Public Property Nom() As String Get Return NomLocal End Get Set(ByVal UneValeur As String) NomLocal = UneValeur End Set End Property End Class

09/08/2011

PHR VB.Net VBOBJ - 13

Public Class ClTableauDePersonnes Private DesPersonnes() As ClPersonne Default Public Property Item(ByVal Index As Integer) As ClPersonne Get Return CType(DesPersonnes(Index), ClPersonne) End Get Set(ByVal Value As ClPersonne) If DesPersonnes Is Nothing Then ' Rservation par tranches de 9 ReDim DesPersonnes(8) If Index <> 0 Then ' Lever une exception serait mieux ! Exit Property ' Out of range End If Else If Index = DesPersonnes.Length Then ReDim Preserve DesPersonnes(Index + 8) ElseIf Index > DesPersonnes.Length Then ' Lever une exception serait mieux ! Exit Property End If End If DesPersonnes(Index) = Value End Set End Property End Class Module MonModule Sub Main() Dim UnePersonne As ClPersonne Dim TPersonne As New ClTableauDePersonnes For i As Integer = 0 To N - 1 UnePersonne = New ClPersonne UnePersonne.Nom = Console.ReadLine() TPersonne(i) = UnePersonne Next End Sub End Module

' N tant le nombre de personnes

' L'emploi de Item est optionnel

L'hritage
Lhritage permet de construire une classe partir dune ou de plusieurs autres. Le nom hritage provient du fait que la classe drive, ou classe fille, contient les attributs et les mthodes de sa superclasse, ou classe mre, dont elle drive. L'intrt majeur de l'hritage est de pouvoir dfinir de nouveaux attributs et de nouvelles mthodes pour la classe drive, qui viennent s'ajouter ceux et celles hrits. C'est par ce moyen que peut se crer une hirarchie de classes de plus en plus spcialises. L'avantage majeur est de ne pas devoir repartir de zro quand il est ncessaire de spcialiser une classe existante. C'est le principal outil permettant la rutilisabilit de codes existants.
Classe Vhicule Classe Animal Classe Mammifre Classe Automobile Classe Rongeur
NbPlaces Liste_Passagers( ) Propritaire, Marque, NoPlaque Avancer( ), Reculer(), Arrter( )

Classe Camion
Tonnage, TypeChargement

Dans ces exemples, la flche dsigne le parent d'o provient l'hritage. Ce sont des flches creuses conformment au formalisme UML (Unified Modeling Language). De mme, les reprsentations des classes sont divises en 3 parties dans le schma de droite. Ces parties correspondent au nom de la classe, ses proprits exposes et ses mthodes.

Classe Camionnette
Type_ Utilisation

Les exemples prcdents illustrent bien la notion de spcialisation sous jacente celle d'hritage. Ils montrent bien aussi le mcanisme de cette spcialisation qui consiste enrichir l'apport de la classe mre en y ajoutant les proprits et mthodes appropries la nouvelle classe.

09/08/2011

PHR VB.Net VBOBJ - 14

L'exemple de la classe Vhicule prsente aussi un aspect de l'hritage qui n'est pas ralisable en VB, pas plus qu'en Java d'ailleurs, mais qui est possible en C++ : l'hritage multiple. En effet, la classe Camionnette ne peut exister que par l'hritage des membres de la classe Automobile et de ceux de la classe Camion. Il n'y a pas regretter l'absence d'hritage multiple en VB. Cette technique peut engendrer des problmes logiques complexes quand elle n'est pas parfaitement matrise, notamment quand les diffrentes classes mres possdent des membres homonymes. De plus, l'usage des interfaces avec l'instruction Implements procure une sorte d'hritage plus simple et plus sr. Il faut noter que l'hritage ne transmet pas tout. Outre les membres Private et Friend, qui ne sont bien videmment pas transmis par l'hritage, les constructeurs, destructeurs et oprateurs d'galit ne le sont pas non plus. Chaque classe dispose dun constructeur par dfaut, celui de la classe Object. Toutefois, si des membres de la classe mre doivent tre initialiss lors de l'instanciation, il faut que la classe drive appelle explicitement un constructeur de la classe mre dans son propre constructeur et ce, avant mme de procder l'initialisation de ses propres membres. Par contre si un destructeur est explicitement dfini dans la classe drive, il ne doit pas faire appel celui de la classe mre. Ce dernier est automatiquement excut lors de la destruction de l'instance de la classe drive.
Public Class UneClasseDerivee Inherits UneClasseMere Dim UneValeurLocale As Integer Public Sub New(ByVal ValeurInitiale As Integer) ' Appel du constructeur de la classe mre MyBase.New() ' Initialisation d'un membre UneValeurLocale = ValeurInitiale End Sub '

Programmation de l'hritage
Voici une classe ordinaire ClPersonne. Elle est Public et n'est pas dote d'attributs particuliers. Elle n'expose qu'une proprit Nom en lecture et en criture.
Public Class ClPersonne Dim NomLocal As String Public Property Nom() As String Get Return NomLocal End Get Set(ByVal UneValeur As String) NomLocal = UneValeur End Set End Property End Class

La classe drive ClPersonneSpecialisee hrite de la classe ClPersonne et n'utilise explicitement aucun membre de sa classe mre, mais y ajoute une proprit Specialite.
Public Class ClPersonneSpecialisee Inherits ClPersonne Dim SpecialiteLocale As String Public Property Specialite() As String Get Return SpecialiteLocale End Get Set(ByVal UneValeur As String) SpecialiteLocale = UneValeur End Set End Property End Class ClPersonne avait reu l'attribut ClPersonneSpecialisee aurait t impossible.

Si

la

classe

NotInheritable,

sa

drivation

dans

la

classe

09/08/2011

PHR VB.Net VBOBJ - 15

Dans une application cliente, il peut tre fait usage, selon les besoins, aussi bien de la classe ClPersonne que de la classe ClPersonneSpecialisee. Alors que la classe ClPersonneSpecialisee ne dfinit aucune proprit Nom, son instance dans l'application cliente en dispose. C'est l'hritage de ClPersonne. L'inverse n'est pas vrai. L'instance de ClPersonne ne dispose pas des proprits d'une de ses classes drives.
Dim UnePersonne As ClPersonne UnePersonne = New ClPersonne UnePersonne.Nom = "Pol" Dim UnePersonneSpecialisee As ClPersonneSpecialisee UnePersonneSpecialisee = New ClPersonneSpecialisee UnePersonneSpecialisee.Nom = "Pierre" UnePersonneSpecialisee.Specialite = "Informatique"

Si la classe ClPersonne avait reu l'attribut MustInherit, son instanciation dans l'application cliente aurait t impossible. Lors de la programmation, l'instance d'une classe mre semble permettre l'exploitation des membres d'une de ses classes drives. L'instanciation d'une classe mre sous la rfrence d'une de ses classes drives donne bien accs aux membres de cette dernire. Mais la conversion s'avre impossible lors de l'excution et une exception est leve. A l'excution, la classe mre ne sait rien de sa classe drive. Son instance ne contient pas les membres de la classe drive. L'instanciation d'une classe de base par une rfrence de classe drive est un nonsens.

Dim UneAutrePersonneSpecialisee As ClPersonneSpecialisee UneAutrePersonneSpecialisee = New ClPersonne

Par contre, avec la manuvre inverse, celle qui consiste instancier une classe drive sous la rfrence de sa classe mre, tout fonctionne pour le mieux, tant la programmation qu' l'excution. Mais l'instance de la classe drive n'accde qu'aux membres de la classe mre ! A l'excution, la classe drive connat sa classe mre. Son instance contient les membres de la classe mre. L'instanciation d'une classe drive par une rfrence de classe de base limite l'accs aux seuls membres de la classe de base.
Dim UneAutrePersonne As ClPersonne UneAutrePersonne = New ClPersonneSpecialisee

Mais alors, quoi bon instancier une classe drive si seuls les membres de la classe mre sont ncessaires ? C'est utile pour accder un membre non spcialis, et donc connu de toutes les classes drives, lorsque la classe mre ne peut tre instancie du fait qu'elle soit une classe abstraite, une classe spcifie MustInherit. Les remarques prcdentes concernant les croisements de types par instanciation s'appliquent galement aux croisements par affectation.
Dim UnePersonne As ClPersonne Dim PS As ClPersonneSpecialisee UnePersonne = New ClPersonne PS = UnePersonne

' Erreur l'excution

Dim UnePersonneSpecialisee As ClPersonneSpecialisee Dim P As ClPersonne UnePersonneSpecialisee = New ClPersonneSpecialisee ' Pas d'erreur, mais seuls les membres de la P = UnePersonneSpecialisee
' classe ClPersonne sont disponibles

Membre statique La programmation d'un membre statique est ralise en VB par l'usage du mot cl Shared. A l'instar de la variable Static, un membre statique conserve l'tat dans lequel il a t positionn par la dernire instance qui l'a utilis. Pour rappel, il est unique pour toutes les instances de sa classe et des classes drives. Un membre statique, s'il est Public, peut tre invoqu directement sous une rfrence de sa classe sans que celle-ci ait t instancie. Mais ceci est en infraction du principe du contrle daccs.

09/08/2011

PHR VB.Net VBOBJ - 16

Par contre, s'il est Private, il peut nanmoins tre utilis par l'instance d'une classe drive via une mthode habilite. Pour peu que l'accs ce membre priv soit la seule raison d'tre de cette instanciation, elle peut se faire sous une rfrence la classe mre. Par exemple :
Public Class ClPersonne Public NbPersonnes As Integer ' Sub Main() Dim UnePersonne As ClPersonne UnePersonne.NbPersonnes = 15 '
' Dclaration d'un membre Public, qui n'est ' pas un membre statique

' Erreur l'excution car UnePersonne n'est ' pas une instance de ClPersonne

Autre exemple :
Public Class ClPersonne Public Shared NbPersonnes As Integer ' Dclaration d'un membre Public, qui est ' ' aussi un membre statique Sub Main() Dim UnePersonne As ClPersonne UnePersonne.NbPersonnes = 15 '

' Pas d'erreur car NbPersonnes est un ' membre statique

Et encore :
Public Class ClPersonne Private Shared NbPersonnes As Integer ' Dclaration d'un membre Private, qui est ' ' aussi un membre statique Sub Main() Dim UnePersonne As ClPersonne ' UnePersonne.NbPersonnes = 15 '

' Erreur car NbPersonnes, qui est un membre ' Private n'est pas accessible ici

Pour raliser un meilleur exemple de l'usage d'un membre statique, avec une donne telle que NbPersonnes qui doit indiquer en permanence le nombre d'instances effectives de la classe, il faut y intgrer le comptage et le dcomptage au fur et mesure des instanciations et destructions. Il faut donc doter la classe d'un constructeur et d'un destructeur.
Public Class ClPersonne Dim NomLocal As String Private Shared NbPersonnes As Integer ' Dclaration d'un membre Private, qui est Public Sub New() NbPersonnes += 1 End Sub Public Sub Dispose() NbPersonnes -= 1 End Sub Public Property Nom() As String Get Return NomLocal End Get Set(ByVal UneValeur As String) NomLocal = UneValeur End Set End Property
' aussi un membre statique ' Programmation d'un constructeur adquat

' Programmation d'un destructeur fictif ' mais suffisant pour cet exemple

09/08/2011

PHR VB.Net VBOBJ - 17

Public ReadOnly Property NombreInstance() As Integer Get ' NombreInstance est la mthode d'accs au Return NbPersonnes ' membre statique NbPersonnes End Get End Property End Class
' La classe drive est identique celle de Public Class ClPersonneSpecialisee ' l'exemple prcdent Inherits ClPersonne Dim SpecialiteLocale Public Property Specialite() As String Get Return SpecialiteLocale End Get Set(ByVal UneValeur As String) SpecialiteLocale = UneValeur End Set End Property End Class

Sub Main() Dim UnePersonne As ClPersonne Dim UnePersonneSpecialisee As ClPersonneSpecialisee UnePersonne = New ClPersonne ' Console.WriteLine(UnePersonne.NombreInstance) UnePersonneSpecialisee = New ClPersonneSpecialisee ' Console.WriteLine(UnePersonne.NombreInstance) Console.WriteLine(UnePersonneSpecialisee.NombreInstance)' Dim UneAutrePersonne As ClPersonne UneAutrePersonne = New ClPersonneSpecialisee ' Console.WriteLine(UnePersonne.NombreInstance) Console.WriteLine(UnePersonneSpecialisee.NombreInstance)' ' Console.WriteLine(UneAutrePersonne.NombreInstance) UneAutrePersonne.Dispose() ' Console.WriteLine(UnePersonne.NombreInstance) Console.WriteLine(UnePersonneSpecialisee.NombreInstance)' ' Console.WriteLine(UneAutrePersonne.NombreInstance) End Sub

Affichage 1 Affichage 2 Affichage 2

Affichage 3 Affichage 3 Affichage 3 Affichage 2 Affichage 2 Affichage 2

Une classe drive hrite des membres de sa classe mre et il est ds lors bien normal dans cet exemple que, pour n'importe quelle instance, il soit toujours permis daccder NombreInstance, mthode qui renvoie par ailleurs une donne unique pour toutes les instances puisque Shared. Cependant, il peut tre ncessaire de faire la distinction entre le nombre total d'instances et celui des instances de la classe drive. Il faut pour cela crire la classe drive diffremment.
Public Class ClPersonneSpecialisee Inherits ClPersonne Dim SpecialiteLocale Private Shared NbPersonnes As Integer Public Sub New() NbPersonnes += 1 End Sub Public Overloads Sub Dispose() NbPersonnes -= 1 End Sub Public Property Specialite() As String Get Return SpecialiteLocale End Get Set(ByVal UneValeur As String) SpecialiteLocale = UneValeur End Set End Property
' New redfinie (sans Overloads ni Overrides)

' Dispose surcharg. ' Fait son travail. Le ramasse-miettes ' s'occupera de la classe mre plus tard

09/08/2011

PHR VB.Net VBOBJ - 18

Public Overloads ReadOnly Property NombreInstance() As Integer ' La mthode d'accs au nombre d'instances Get Return NbPersonnes ' est surcharge. End Get End Property End Class Sub Main() Dim UnePersonne As ClPersonne UnePersonne = New ClPersonne Console.WriteLine(UnePersonne.NombreInstance)

' Affichage 1

Aprs avoir instanci UnePersonne de type ClPersonne, sa proprit NombreInstance contient bien comme valeur le nombre de ClPersonne instancies, soit 1 aprs cette premire instanciation.
Dim UneAutrePersonne As ClPersonne UneAutrePersonne = New ClPersonneSpecialisee Console.WriteLine(UnePersonne.NombreInstance) Console.WriteLine(UneAutrePersonne.NombreInstance)

' Affichage 2 ' Affichage 2

Aprs avoir instanci UneAutrePersonne de type ClPersonneSpecialisee sous la rfrence de sa classe mre ClPersonne, la proprit NombreInstance de ClPersonne a bien t incrmente. Elle peut tre consulte partir de l'objet UnePersonne aussi bien qu' partir de l'objet UneAutrePersonne. Elle vaut 2 aprs cette deuxime instanciation. Aucun pointeur de ClPersonneSpecialisee n'a encore t spcifi et il est impossible d'accder la proprit NombreInstance de cette classe. C'est pourtant son constructeur qui a t appel pour instancier UneAutrePersonne
Dim UnePersonneSpecialisee As ClPersonneSpecialisee UnePersonneSpecialisee = New ClPersonneSpecialisee ' Affichage 3 Console.WriteLine(UnePersonne.NombreInstance) ' Affichage 3 Console.WriteLine(UneAutrePersonne.NombreInstance) Console.WriteLine(UnePersonneSpecialisee.NombreInstance)' Affichage 2 '

Aprs avoir instanci UnePersonneSpecialisee de type ClPersonneSpecialisee sous la rfrence approprie, la consultation de la mthode NombreInstance de l'objet UnePersonne indique bien une instance de plus, soit 3. La mme consultation partir de l'objet UneAutrePersonne donne le mme rsultat. Mais la proprit consulte par UnePersonneSpecialisee donne 2 alors qu'on ne dispose effectivement que d'un seul objet de type ClPersonneSpecialisee. Ces exemples mettent en vidence que la dclaration des objets dtermine celui dont les membres sont sollicits. Ainsi, les dclarations Dim UnePersonne As ClPersonne et Dim UneAutrePersonne As ClPersonne ont pour effet que la proprit NombreInstance accde est bien celle de la classe ClPersonne, mme si l'instanciation fait appel au constructeur d'une classe drive comme dans UneAutrePersonne = New ClPersonneSpecialisee. Mais attention dans ce cas, mme si ce n'est pas visible par dfaut de pointeur, les valeurs internes affectes par le constructeur de l'objet ClPersonneSpecialisee ont bien t changes. Drivations publique, protge et prive La classe drive ClPersonneSpecialisee des exemples prcdent est la reprsentation commune de la drivation publique. Une classe publique drive d'une classe mre galement publique, permet sa drivation dans toute autre nouvelle classe. Les membres Public et Protected de la classe mre restent disponibles, chacun avec sa porte, dans les classes drives.
Public Class ClPersonne Protected Sub Protection()
'

End Sub Public Sub PourTous()


'

End Sub ' End Class

09/08/2011

PHR VB.Net VBOBJ - 19

Public Class ClPersonneSpecialisee Inherits ClPersonne Private Sub MaSub() MyBase.Protection() MyBase.PourTous()
'

End Sub ' End Class Public Class ClPersonneTresSpecialisee Inherits ClPersonneSpecialisee Private Sub UneSub() MyBase.Protection() End Sub End Class

' MyBase connat tous ses ascendants

Les drivations protges et prives, lorsqu'elles sont ralisables, ont pour effet de limiter ou interdire la spcialisation et l'accs aux membres de la classe mre par l'usage de la classe ainsi drive. Ces drivations ne sont pas possibles en VB, sauf crire autrement la classe mre, car toute instance d'une classe drive accde aux membres Public de sa classe mre. La drivation protge consiste en principe, au remplacement des portes Public de membres hrits par une porte Protected. Elle est rgle par le programmeur qui ne souhaite pas qu'une instance de la classe drive qu'il met au point, puisse accder aux membres Public de sa classe mre. Il n'autorise cet accs qu' des classes drives. La drivation prive consiste rendre Private, dans la classe drive, tous les membres hrits de sa classe mre. Constructeurs et destructeurs Le constructeur, qui est invoqu dans les codes clients par l'oprateur New, est une mthode New crite ou non dans les classes utilises. Si cette mthode n'est pas crite, le constructeur par dfaut, celui de la classe Object, est excut. Par contre si la mthode New est programme dans une classe, c'est elle qui est excute lors de l'instanciation de cette classe. Plusieurs mthodes New peuvent tre programmes dans une mme classe condition que les signatures soient diffrentes. Il s'agit du mcanisme de surcharge qui se programme ici sans usage du mot cl Overloads. La prsence de plusieurs constructeurs dans une classe permet aux codes clients de choisir celui qui convient le mieux dans une situation donne. Le constructeur est le moyen d'initialisation dynamique des donnes d'une classe. Un constructeur peut aussi tre redfini dans une classe drive. Il s'agit dans ce cas du mcanisme de surdfinition qui se programme ici sans usage du mot cl Overrides. Plusieurs constructeurs peuvent tre crits dans une classe drive, en surdfinition ou non de ceux de la classe mre. Si la classe mre possde un ou plusieurs constructeurs tous paramtrs, chaque constructeur dune classe drive doit obligatoirement raliser lappel de lun dentre eux. Par contre, si la classe mre possde aussi un constructeur sans argument, ou si elle ne possde aucun constructeur, lappel MyBase.New()n'est plus ncessaire. S'il est quand mme programm, c'est le constructeur par dfaut de la classe mre qui est invoqu, c'est--dire celui sans argument s'il existe, ou bien celui de la classe Object. Le rle du destructeur est intimement li au fonctionnement du ramasse-miettes et il peut tre utile de faire appel aux services de la classe System.GC (Garbage Collector). Le lecteur peut consulter l'aide en ligne de son Visual Studio.Net par une recherche sur GC pour obtenir davantage d'informations sur le sujet. L'important ici est de savoir comment mettre en uvre la destruction explicite des objets. Le ramasse-miettes effectue le suivi des objets allous dans la mmoire manage et en rcupre l'espace lorsqu'il le peut. Ce traitement porte le nom de garbage collection. Il rcupre la mmoire alloue aux objets qui ne possdent pas de rfrences valides. Il est aussi excut automatiquement lorsqu'une demande de mmoire ne peut pas tre satisfaite avec la mmoire disponible. Il en rsulte que la rinitialisation Nothing de la dernire rfrence un objet, livre ce dernier aux bons soins du ramasse-miettes. Mais si cet objet est li des ressources non manages, celles ci ne sont pas forcment libres ds la destruction de l'objet. La destruction par dfaut de tous les objets a lieu lors de l'arrt de l'application qui les a instancis et leurs ressources sont libres ensuite. Si cette destruction par dfaut est satisfaisante pour certaines applications, elle ne l'est plus lorsque les ressources sont sollicites par d'autres applications, ni lorsque les applications tournent sur des serveurs, o elles ne sont peut-tre jamais arrtes et o, de toutes manires, les ressources sont pleinement sollicites. Il y a donc des situations qui ncessitent un travail prliminaire la destruction d'objets. Ce travail consiste en la libration des ressources utilises par l'objet avant sa mise la disposition du ramasse-miettes. Ces ressources sont des handles de fentres (hwnd), des connexions de bases de donnes, des rfrences des objets non manags tels que les COM, par exemple.

09/08/2011

PHR VB.Net VBOBJ - 20

Le premier moyen de programmer un destructeur est de redfinir la mthode Finalize. Si la classe pour laquelle est ralise cette programmation drive d'une classe qui n'est pas dote d'une mthode Finalize, c'est celle de la classe Object qui est redfinie. Une mthode Finalize ne doit jamais tre appele explicitement, elle est excute automatiquement lors de la destruction de l'objet. C'est la raison pour laquelle il est impratif d'accorder la porte Protected Overrides toute redfinition de la mthode. Cela permet aux classes drives de l'implmenter galement et interdit son accs partir d'une instance. Chaque classe drive peut ainsi programmer la libration de ses ressources. Pour rappel, l'appel du destructeur d'une classe drive ne doit pas tre assorti de l'appel de celui de sa classe mre.
Protected Overrides Sub Finalize() ' Codes ralisant la libration des ressources utilises End Sub

De nombreuses classes du Framework prsentent une mthode Dispose qui peut tre utilise pour librer explicitement la mmoire occupe par un objet. Ces classes, dont la liste peut tre consulte dans l'aide en ligne par une recherche sur IDisposable, ont en commun d'implmenter l'interface IDisposable. Il n'est pas encore question d'tudier l'Interface, mais il faut savoir qu'il regroupe une ou plusieurs dclarations de proprits, mthodes et vnements, sans codes, tous destins tre implments dans les classes qui en font usage. Chaque application cliente qui implmente un Interface donn est donc contrainte d'en implmenter tous les membres. Ce mcanisme constitue un indice de compatibilit entre les classes implmentant les mmes Interface, ainsi qu'un indice de conformit aux rgles du DotNet. Programmer la destruction d'objets par l'implmentation de IDisposable, revient donc fournir le code ncessaire une mthode Dispose. Contrairement la mthode Finalize qui ne doit pas tre explicitement appele, la mthode Dispose doit tre explicitement appele partir du code client. Elle doit donc recevoir la porte Public.
Public Class Implements Public Sub ' Codes End Sub ' End Class MaClasse IDisposable Dispose() Implements System.IDisposable.Dispose
ralisant la libration des ressources utilises

Module MonModule Sub Main() Dim MonObjet As MaClasse MonObjet = New MaClasse ' MonObjet.Dispose() MonObjet = Nothing End Sub End Module

La libration programme dans le destructeur des ressources utilises par l'objet ne dispense pas de dtruire l'objet. Le destructeur Dispose s'excute exactement au moment voulu par le programmeur et la rinitialisation de la rfrence de l'objet Nothing le met la disposition du ramasse-miettes. Il n'y a ds lors plus de raison que soit excute la mthode Finalize. Il peut arriver que l'application cliente oublie l'appel explicite de la mthode Dispose alors que Finalize ne doit pas tre appele. Une combinaison des mthodes Finalize et Dispose est intressante.
Module MonModule Sub Main() Dim MonObjet As MaClasse MonObjet = New MaClasse ' ' Destruction de l'objet End Sub End Module

Le programme ci contre peut intgrer la destruction de l'instance de MaClasse de deux faons. Soit il utilise Dispose comme prcdemment et rinitialise sa rfrence Nothing, soit il utilise une autre mthode Dispose qui se charge elle-mme de rinitialiser la rfrence :
MonObjet.Dispose() MonObjet = Nothing

ou
MonObjet.Dispose(MonObjet)

09/08/2011

PHR VB.Net VBOBJ - 21

La classe MaClasse ci aprs ralise une bonne combinaison des mthodes Finalize et Dispose. Elle propose deux mthodes Dispose, l'une ordinaire, qui contient les codes de libration des ressources, est munie d'une variable Static pour prvenir l'excution inutile de son code. Elle empche l'excution redondante de Finalize. L'autre, qui est une surcharge de la prcdente, appelle celle ci pour la libration des ressources et rinitialise la rfrence de l'objet Nothing. Enfin, la classe est dote d'une mthode Finalize qui n'est excute que si le programmeur de l'application cliente oublie l'appel de Dispose.
Public Class MaClasse Implements IDisposable Public Overloads Sub Dispose() Implements System.IDisposable.Dispose Static Detruit As Boolean If Detruit Then Exit Sub ' Codes ralisant la libration des ressources utilises Detruit = True ' La mthode SuppressFinalize de la classe GC GC.SuppressFinalize(Me) End Sub ' empche l'excution de la mthode Finalize Public Overloads Sub Dispose(ByRef Ref As MaClasse) Dispose() Ref = Nothing End Sub Protected Overrides Sub Finalize() Dispose() End Sub ' End Class

Constructeur par recopie Dans l'exemple suivant, l'affectation d'un objet une autre rfrence que celle sous laquelle il a t instanci, copie dans cette nouvelle rfrence le contenu de la prcdente, c'est--dire l'adresse de l'objet dans le tas. Il en rsulte l'existence de deux rfrences dsignant le mme objet et sa modification par l'une est visible par l'autre.
Dim A, B As ArrayList A = New ArrayList A.Add("QWERTY") Console.WriteLine(A.Item(0)) B = A A.Item(0) = "AZERTY" Console.WriteLine(A.Item(0)) Console.WriteLine(B.Item(0))

' Affiche : QWERTY ' La modification de A modifie B ' Affiche : AZERTY ' Affiche : AZERTY

Cependant, il est frquent que le programmeur souhaite instancier un nouvel objet dans un tat strictement identique un autre ce moment. Nombreuses classes du Framework offre une mthode Clone qui permet cette programmation. C'est le constructeur par recopie. Il ne faut toutefois pas oublier que ce copieur ne copie pas les valeurs des types rfrences contenues dans lobjet copier, mais seulement les rfrences.
Dim A, B As ArrayList A = New ArrayList A.Add("QWERTY") Console.WriteLine(A.Item(0)) B = A.Clone() A.Item(0) = "AZERTY" Console.WriteLine(A.Item(0)) Console.WriteLine(B.Item(0))

' Affiche : QWERTY ' La modification de A n'affecte pas B ' Affiche : AZERTY ' Affiche : QWERTY

Le programmeur peut galement programmer un constructeur par recopie dans ses classes. L'exemple suivant illustre la programmation et l'usage d'une mthode Clone qui permet effectivement l'instanciation d'un nouvel objet par copie d'un existant.

09/08/2011

PHR VB.Net VBOBJ - 22

Public Class UneClasse Dim Elem As Integer Public Sub New(ByVal ArgElem As Integer) Elem = ArgElem End Sub Public Function Clone() As UneClasse Return New UneClasse(Elem) End Function Public Property Element() Get Return Elem End Get Set(ByVal Valeur) Elem = Valeur End Set End Property End Class Module MonModule Sub Main() Dim X, Y As UneClasse X = New UneClasse(5) Console.WriteLine(X.Element) Y = X.Clone() X.Element = 7 Console.WriteLine(X.Element) Console.WriteLine(Y.Element) End sub End Module La mthode Clone doit affecter toutes les proprits du nouvel objet avec les valeurs des proprits de l'objet existant. Dans cet exemple, UneClasse n'a qu'une seule valeur copier. Si elle en avait eu plusieurs, elle aurait du possder aussi une mthode surcharge New() sans argument et la mthode Clone aurait du tre programme comme ceci :
Public Function Clone() As UneClasse Dim Nouveau As UneClasse Nouveau = New UneClasse Nouveau.Element = Elem ' Return Nouveau End Class

' Affiche : 5 ' La modification de X n'affecte pas Y ' Affiche : 7 ' Affiche : 5

Jusqu'ici, les principaux membres de nombreuses classes du Framework ont t tudis. Ces membres sont toujours accessibles sur simple instanciation. Ce sont des membres dclars Public dans les classes dont ils constituent les interfaces. Il faut savoir aussi, pour en terminer avec l'hritage, que presque toutes ces classes possdent galement des membres Protected qui sont des voies ouvertes la spcialisation. C'est une fois de plus la consultation de l'aide en ligne du Visual Studio qui permet l'obtention de la liste des membres protgs de chaque classe. La mme consultation permet aussi de se rendre compte que certaines classes possdent aussi, ou seulement, des membres de type Interface accessibles par implmentation de la classe. Il est temps d'en dire un peu plus sur ces Interface.

Interface et Implements
Les Interface, qui peuvent tre considres comme des Class Interface, afin de ne pas les confondre avec les interfaces de classes ou les interfaces utilisateurs (ou IHM pour Interface Homme Machine), permettent la dclaration d'ensembles de membres sans code. Ces dclarations, qui ne peuvent tre que des Property, Sub, Function et Event, ne peuvent pas tre assorties d'attributs de porte, ni des fins de blocs usuels (End Property, End Sub, ). Les codes des membres ainsi dclars doivent tre tous produits dans les classes qui implmentent l'Interface. Cela signifie notamment que plusieurs classes implmentant les mmes Interface peuvent offrir une interface de classe identique, ou contenant au moins une mme liste de membres, ceux dfinis dans les Interface implments.
Public Interface MonInterface Sub UneProcedure(ByVal X As Integer) Function UneFonction(ByVal S As String) As Integer Property UnePropriete() End Interface Public Class UneClasse Implements MonInterface Public Sub UneProcedure(ByVal Entier As Integer) Implements MonInterface.UneProcedure ' End Sub

09/08/2011

PHR VB.Net VBOBJ - 23

Public Function UneFonction(ByVal Chaine As String) As Integer Implements MonInterface.UneFonction ' End Function Public Property UnePropriete() Implements MonInterface.UnePropriete Get ' End Get Set(ByVal Value) ' End Set End Property ' End Class

L'hritage multiple n'est pas possible en VB, mais l'utilisation des Interface permet de rsoudre sa programmation le cas chant. Ainsi, l'illustration de l'hritage multiple prsente prcdemment est ralisable par l'usage des Interface. Les classes dfinies dans l'illustration ne possdent pas de membres homonymes et les Interface les reprsentant peuvent tre crites comme ceci :
Public Interface IVehicule Property Proprietaire() Property Marque() Property NoPlaque() Sub Avancer(ByVal Distance As Integer) Sub Reculer(ByVal Distance As Integer) Sub Arreter() End Interface Public Interface IVoiture Inherits IVehicule Property NbPlaces() Function Liste_Passagers() As String() End Interface Public Interface ICamion Inherits IVehicule Property Tonnage() Property TypeChargement() End Interface Public Interface ICamionnette Inherits IVoiture Inherits ICamion Property Type_Utilisation() End Interface Public Class ClCamionnette Implements ICamionnette ' et il n'y plus qu' programmer chaque membre de chaque Interface

Il est permis de donner aux membres implments et leurs arguments, des noms locaux diffrents de ceux dclars dans l'Interface d'origine.
Public Interface MonInterface Sub UneProcedure(ByVal X As Integer) End Interface Public Class UneClasse Implements MonInterface Public Sub MaSub(ByVal Entier As Integer) Implements MonInterface.UneProcedure ' End Sub

09/08/2011

PHR VB.Net VBOBJ - 24

Mais l'Interface n'a pas pour vocation premire de combler l'absence de mcanisme d'hritage multiple en VB.Net. La cration d'une procdure de tri capable de trier n'importe quel objet est un exemple plus appropri de son usage.
Public Class ClPersonne Dim NomLocal As String Public Property Nom() As String Get Return NomLocal End Get Set(ByVal UneValeur As String) NomLocal = UneValeur End Set End Property End Class
' La classe ClPersonne est l'objet de base de ' de cet exemple

Public Interface IComparer ' L'Interface de l'exemple Function Compare(ByVal Objet As Object, ByVal Index As Byte) As Integer ReadOnly Property Information(ByVal Choix As Byte) As Object End Interface Public Class ClTri
' La classe ClTri capable de trier toute ' table d'objets implmentant IComparer

Public Sub Tri(ByVal Table As IComparer(), _ Optional ByVal CleTri As Integer = 1, _ Optional ByVal Sens As Integer = 1) ' CleTri dsigne le membre de l'objet sur Dim Tmp As Object ' lequel doit s'effectuer le tri. C'est le Dim i As Integer ' premier par dfaut Dim Permutation As Boolean = True ' Sens vaut 1 par dfaut et provoque un tri While Permutation ' croissant, sa valeur doit tre -1 pour un Permutation = False For i = 0 To Table.Length - 2 ' tri dcroissant If Table(i).Compare(Table(i + 1), CleTri) = Sens Then Tmp = Table(i) Table(i) = Table(i + 1) Table(i + 1) = Tmp Permutation = True End If Next End While End Sub End Class Public Class ClEtudiant Inherits ClPersonne Implements IComparer Private Resultat As Single Private Section As String
' La classe ClEtudiant est une spcialisation ' de la classe ClPersonne et elle implmente ' IComparer

Public ReadOnly Property Information(ByVal Choix As Byte) As Object Implements IComparer.Information Get Select Case Choix Case 1 Return Nom Case 2 Return Resultat Case 3 Return Section End Select End Get End Property

09/08/2011

PHR VB.Net VBOBJ - 25

Public Sub New(ByVal ArgNom As String, ByVal ArgResultat As Single, ByVal ArgSection As String) Nom = ArgNom Resultat = ArgResultat Section = ArgSection End Sub Public Function Compare(ByVal Objet As Object, ByVal Index As Byte) As Integer Implements IComparer.Compare Select Case Me.Information(Index) Case Is < Objet.Information(Index) Return -1 Case Is = Objet.Information(Index) Return 0 Case Is > Objet.Information(Index) Return 1 End Select End Function End Class
' Une application cliente de la classe Module MonModule ' ClEtudiant et du tri polyvalent ClTri.Tri Sub Main() Dim MesEtudiant(5) As ClEtudiant Dim Tri As ClTri = New ClTri Dim i As Integer MesEtudiant(0) = New ClEtudiant("Michel", 10, "Linux") MesEtudiant(1) = New ClEtudiant("Marc", 15, "Windows") MesEtudiant(2) = New ClEtudiant("Pierre", 12, "Analyse") MesEtudiant(3) = New ClEtudiant("Albert", 17, "Windows") MesEtudiant(4) = New ClEtudiant("Christian", 16, "Analyse") MesEtudiant(5) = New ClEtudiant("Bruno", 19, "Linux") ' Avant le tri For i = 0 To MesEtudiant.Length - 1 With MesEtudiant(i) Console.WriteLine(.Information(1)) Console.WriteLine(.Information(2)) Console.WriteLine(.Information(3)) End With Next Tri.Tri(MesEtudiant, 2, -1) ' Aprs le tri For i = 0 To MesEtudiant.Length - 1 With MesEtudiant(i) Console.WriteLine(.Information(1)) Console.WriteLine(.Information(2)) Console.WriteLine(.Information(3)) End With Next End Sub End Module

La modification du code prcdent en vue d'exprimenter ClTri.Tri sur une table de ClPersonne provoque la leve d'une exception lors de l'excution car ClPersonne n'implmente pas l'Interface requise.
Dim MesEtudiant(5) As ClEtudiant Dim MesPersonnes(5) As ClPersonne Dim Tri As ClTri = New ClTri Dim i As Integer MesEtudiant(0) = New ClEtudiant("Michel", 10, "Linux") ' For i = 0 To MesEtudiant.Length - 1 MesPersonnes(i) = New ClPersonne MesPersonnes(i) = MesEtudiant(i) Next ' Erreur l'excution Tri.Tri(MesPersonnes, 1, -1) '

09/08/2011

PHR VB.Net VBOBJ - 26

Le polymorphisme
Le polymorphisme est un ensemble de mcanismes permettant une application d'instancier plusieurs classes avec des proprits et des mthodes homonymes dont les implmentations sont diffrentes. Certains diffrencient les polymorphismes en polymorphisme de spcialisation, de redfinition, de surcharge, lesquels peuvent encore recevoir des appelations diffrentes, selon les auteurs. Il n'est pas utile ici de faire la part des choses entre les points de vues de ces diffrents auteurs. Toutefois leurs diverses approches sous entendent des modes de programmation diffrents et des comportements appropris des compilateurs. Ces particularits sont mises en vidence dans les exemples traits ci aprs. Les diffrentes dfinitions et explications qui traitent des polymorphismes ont une ide commune : les mthodes concernes, qui sont dites mthodes polymorphes, peuvent tre utilises sans considration du type d'objets auxquels elles sont appliques et ce, de manire transparente pour le programmeur de l'application cliente. Elles s'adaptent l'objet pour lequel elles sont invoques. Dans l'exemple prcdent, la mthode Compare de l'Interface IComparer, est bien une mthode polymorphe puisqu'elle peut comparer n'importe quel objet, sans diffrenciation ni spcification de type. Il s'agit dans cet exemple, d'un polymorphisme de spcialisation, dit aussi de sous typage ou de drivation. Il dcoule directement de l'hritage. C'est le polymorphisme ordinairement associ au concept objet. L'ide est de partir d'un type et de le modifier, de crer une classe de base et d'en faire des classes drives. Toutefois, l'hritage ne procure pas le polymorphisme dans tous les cas. Le polymorphisme de spcialisation s'obtient par la programmation d'une classe de base, ventuellement abstraite, dans laquelle sont dclares des mthodes virtuelles ou dfinies des mthodes spcifies redfinissables. L'application cliente peut utiliser la classe de base qui va automatiquement appeler les mthodes des classes drives appropries selon le type d'objet traiter.

Classe abstraite et mthode virtuelle


Une mthode virtuelle ne peut tre dclare qu' l'intrieur d'une classe abstraite. Une classe est dclare abstraite par le mot cl MustInherit et une mthode est dclare virtuelle par MustOverride. Comme dans le cas de l'Interface, une mthode virtuelle n'est reprsente dans une classe abstraite que par sa dclaration, sans aucun code ni fin de bloc. Contrairement l'Interface, la classe abstraite peut contenir d'autres membres et mme des mthodes sans code mais non virtuelle et dont le comportement est diffrent.
Public MustInherit Class UneClasseAbstraite Public MustOverride Function UneVirtuelle() As String End Class Public Class UneClasseDerivee Inherits UneClasseAbstraite Public Overrides Function UneVirtuelle() As String Return "Fonction en UneClasseDerivee" End Function End Class Module MonModule Sub Main() Dim ObjetUneClasseAbstraite As UneClasseAbstraite Dim ObjetUneClasseDerivee As UneClasseDerivee ObjetUneClasseAbstraite = New UneClasseDerivee ObjetUneClasseDerivee = New UneClasseDerivee Console.WriteLine("1 " & ObjetUneClasseAbstraite.UneVirtuelle) Console.WriteLine("2 " & ObjetUneClasseDerivee.UneVirtuelle) End Sub End Module

Les exemples tudis prcdemment dans les cas d'hritages simples montrent que le type dclar d'une rfrence d'objet dtermine si les membres accds sont ceux de la classe mre ou ceux de la classe drive. Mais lorsque ces membres sont des mthodes virtuelles, ce sont les mthodes correspondantes de la classe drive qui sont invoques quel que soit le type de la rfrence. C'est prcisment l'accs aux mthodes d'une classe drive par une rfrence de sa classe mre qui induit le polymorphisme.

09/08/2011

PHR VB.Net VBOBJ - 27

L'exemple suivant illustre que, quel que soit l'objet instanci, la rfrence la classe mre conduit bien la mthode de la classe drive approprie.
Public MustInherit Class UneClasseAbstraite Public MustOverride Function UneVirtuelle() As String End Class Public Class UneClasseDerivee Inherits UneClasseAbstraite Public Overrides Function UneVirtuelle() As String Return "Fonction en UneClasseDerivee" End Function End Class Public Class UneAutreDerivee Inherits UneClasseAbstraite Public Overrides Function UneVirtuelle() As String Return "Fonction en UneAutreDerivee" End Function End Class Module MonModule Sub Main() Dim UnObjet As UneClasseAbstraite UnObjet = New UneClasseDerivee Console.WriteLine("1 " & UnObjet.UneVirtuelle) UnObjet = New UneAutreDerivee Console.WriteLine("2 " & UnObjet.UneVirtuelle) Console.ReadLine() End Sub End Module

Un autre exemple illustre bien le polymorphisme. Une classe abstraite ClForme contient une mthode virtuelle Surface. Diverses classes drives implmentent la mthode Surface. L'accs leurs instances par une rfrence de type ClForme permet d'invoquer la mthode approprie de manire transparente pour le programmeur.
Public MustInherit Class ClForme Public MustOverride Function Surface() As Single End Class Public Class ClCarre Inherits ClForme Dim Cote As Single Public Sub New(ByVal Mesure As Single) Cote = Mesure End Sub Public Overrides Function Surface() As Single Return Cote * Cote End Function End Class Public Class ClRectangle Inherits ClForme Dim Longueur As Single Dim Largeur As Single Public Sub New(ByVal ArgLongueur As Single, ByVal ArgLargeur As Single) Longueur = ArgLongueur Largeur = ArgLargeur End Sub Public Overrides Function Surface() As Single Return Longueur * Largeur End Function End Class

09/08/2011

PHR VB.Net VBOBJ - 28

Public Class ClCercle Inherits ClForme Dim Rayon As Single Dim Diametre As Single Public Sub New(ByVal Mesure As Single, Optional ByVal EstRayon As Boolean = True) If EstRayon Then Rayon = Mesure Diametre = Rayon * 2 Else Diametre = Mesure Rayon = Diametre / 2 End If End Sub Public Overrides Function Surface() As Single Return Math.PI * Rayon * Rayon End Function End Class Public Class ClTriangle Inherits ClForme Dim Base As Single Dim Hauteur As Single Public Sub New(ByVal ArgBase As Single, ByVal ArgHauteur As Single) Base = ArgBase Hauteur = ArgHauteur End Sub Public Overrides Function Surface() As Single Return Base * Hauteur / 2 End Function End Class Module MonModule Sub Main() Dim MaForme As ClForme MaForme = New ClCarre(5) Console.WriteLine(MaForme.Surface) MaForme = New ClRectangle(5, 3) Console.WriteLine(MaForme.Surface) MaForme = New ClCercle(5) Console.WriteLine(MaForme.Surface) MaForme = New ClCercle(10, False) Console.WriteLine(MaForme.Surface) MaForme = New ClTriangle(5, 3) Console.WriteLine(MaForme.Surface) End Sub End Module

' ' ' ' ' ' ' ' ' '

Instanciation d'un carr Obtention de l'aire de ce carr Instanciation d'un rectangle Obtention de l'aire de ce rectangle Instanciation d'un cercle par son rayon Obtention de l'aire de ce cercle Instanciation d'un cercle par son diamtre Obtention de l'aire de ce cercle Instanciation d'un triangle Obtention de l'aire de ce triangle

Lors de l'tude de l'Interface, un exemple montre une mthode de tri capable de trier n'importe quel vecteur d'objets pourvu qu'ils implmentent l'Interface IComparer. Le tri est test sur un vecteur d'objets ClEtudiant, dont la classe hrite de la classe ClPersonne et implmente l'Interface IComparer. Cet exemple peut tre ralis presque de la mme manire par l'usage d'une classe abstraite ClComparer. Le tri peut alors traiter n'importe quel vecteur d'objets qui hritent de ClComparer et en implmentent les membres. Mais dans ce nouvel exemple, la classe ClEtudiant ne peut hriter la fois de ClPersonne et de ClComparer puisque l'hritage multiple n'est pas possible. Pour cet exemple, le seul membre de ClPersonne utilis prcdement, sa proprit Nom, a t intgr dans la classe ClEtudiant. Lautre faon de faire, pour conserver la classe ClPersonne, tait que ce soit cette dernire qui hrite de ClComparer. La classe ClEtudiant drivant de ClPersonne en aurait hrit aussi. L'application cliente, le module MonModule est strictement identique celui de l'exemple concernant l'Interface et n'est pas reproduit ici.
' La classe abstraite de l'exemple Public MustInherit Class ClComparer MustOverride Function Compare(ByVal Objet As Object, ByVal Index As Byte) As Integer MustOverride ReadOnly Property Information(ByVal Choix As Byte) As Object End Class

09/08/2011

PHR VB.Net VBOBJ - 29

Public Class ClTri

' La classe ClTri capable de trier toute ' table d'objets qui hritent de ClComparer

Public Sub Tri(ByVal Table As ClComparer(), _ Optional ByVal CleTri As Integer = 1, _ Optional ByVal Sens As Integer = 1) ' CleTri dsigne le membre de l'objet sur Dim Tmp As Object ' lequel doit s'effectuer le tri. C'est le Dim i As Integer ' premier par dfaut Dim Permutation As Boolean = True ' Sens vaut 1 par dfaut et provoque un tri While Permutation ' croissant, sa valeur doit tre -1 pour un Permutation = False For i = 0 To Table.Length - 2 ' tri dcroissant If Table(i).Compare(Table(i + 1), CleTri) = Sens Then Tmp = Table(i) Table(i) = Table(i + 1) Table(i + 1) = Tmp Permutation = True End If Next End While End Sub End Class Public Class ClEtudiant Inherits ClComparer Private Resultat As Single Private Section As String Private NomLocal As String
' La classe ClEtudiant hrite de la ' classe abstraite ClComparer et en ' implmente les mthodes virtuelles

Public Sub New(ByVal ArgNom As String, ByVal ArgResultat As Single, ByVal ArgSection As String) Nom = ArgNom : Resultat = ArgResultat : Section = ArgSection End Sub Public Property Nom() As String Get Return NomLocal End Get Set(ByVal UneValeur As String) NomLocal = UneValeur End Set End Property Public Overrides ReadOnly Property Information(ByVal Choix As Byte) As Object Get Select Case Choix Case 1 Return Nom Case 2 Return Resultat Case 3 Return Section End Select End Get End Property Public Overrides Function Compare(ByVal Objet As Object, ByVal Index As Byte) As Integer Select Case Me.Information(Index) Case Is < Objet.Information(Index) Return -1 Case Is = Objet.Information(Index) Return 0 Case Is > Objet.Information(Index) Return 1 End Select End Function End Class

09/08/2011

PHR VB.Net VBOBJ - 30

Surdfinition, surcharge et masquage


La surdfinition, ou redfinition, est un mcanisme qui permet de rcrire une mthode dj dfinie ou simplement dclare, comme cela se fait pour l'implmentation des mthodes virtuelles. Les signatures des mthodes redfinies doivent toujours tre identiques. Mots cls : MustOverride, NotOverridable, Overrides et Overridable. La surcharge, qui est un mcanisme trs semblable la redfinition, mais diffrent dans ses effets, permet galement de rcrire des mthodes dj dfinies. Il peut tre utilis pour offrir un choix de mthodes virtuelles dans une classe abstraite, mais ne peut servir l'implmentation de ces mthodes pour raliser le polymorphisme de spcialisation. Les signatures des mthodes surcharges doivent tre diffrentes au sein d'une mme classe, mais dans une classe drive, elles peuvent tre identiques leurs homologues de la classe mre. Mot cl : Overloads. Le masquage est quivalent la surcharge avec la diffrence essentielle qu'il permet la redclaration de variables publiques d'une classe mre. Le masquage ralise un effet de masque l o celui ci est inexistant par dfaut. Au sein d'une mme classe, il ne peut masquer des variables et il est synonyme de surcharge en ce qui concerne les mthodes, mais il ne peut surcharger des mthodes virtuelles. Il faut noter encore que la redclaration de variables n'est pas une bonne pratique de la POO, ne serait-ce que par dfaut de contrle daccs. Mot cl : Shadows. Quelques diffrences existant entre ces trois mcanismes sont illustres dans l'exemple suivant.
Public Class ClBase Public Overridable Function Return "F1 en ClBase" End Function Public Overridable Function Return "F2 en ClBase" End Function Public Overridable Function Return "F3 en ClBase" End Function Public Overridable Function Return "F4 en ClBase" End Function End Class Public Class ClDerivee Inherits ClBase Public Overrides Function F1() As String Return "F1 en ClDerivee" End Function Public Overridable Overloads Function F2() As String Return "F2 en ClDerivee" End Function End Class Public Class ClSecondaire Inherits ClDerivee Public Overrides Function F2() As String Return "F2 en ClSecondaire " End Function Public Overrides Function F3() As String Return "F3 en ClSecondaire" End Function Public Shadows Function F4() As String Return "F4 en ClSecondaire" End Function End Class
' ' ' ' La classe de ClSecondaire hrite de ClDerivee, et donc aussi de ClBase, redfinit F2 de ClDerivee, F3 de ClBase, et masque F4 de ClBase

F1() As String

' La classe de base contient 4 mthodes ' redfinissables

F2() As String

F3() As String

F4() As String

' La classe de ClDerivee hrite de ClBase, ' en redfinit F1 et surcharge F2 en la ' spcifiant redfinissable

09/08/2011

PHR VB.Net VBOBJ - 31

Module MonModule Sub Main() Dim RefBaseD As ClBase Dim RefBaseS As ClBase Dim RefDerive As ClDerivee Dim UnDerive As ClDerivee Dim UnSecond As ClSecondaire RefBaseD = New ClDerivee UnDerive = New ClDerivee RefBaseS = New ClSecondaire RefDerive = New ClSecondaire UnSecond = New ClSecondaire ' Accs Console.WriteLine("11 " Console.WriteLine("12 " Console.WriteLine("13 " Console.WriteLine("14 "
' ClDerivee par rfrence sa classe mre ' ClDerivee par rfrence sa classe ' ClSecondaire par rfrence sa grand-mre ' ClSecondaire par rfrence sa classe mre ' ClSecondaire par rfrence sa classe de sa classe mre ClBase ClDerivee ClBase ClBase ClBase

une instance de ClDerive par une rfrence ' Affiche : 11 F1 en & RefBaseD.F1) ' Affiche : 12 F2 en & RefBaseD.F2) ' Affiche : 13 F3 en & RefBaseD.F3) ' Affiche : 14 F4 en & RefBaseD.F4)

Console.WriteLine("21 Console.WriteLine("22 Console.WriteLine("23 Console.WriteLine("24

" " " "

& & & &

' Accs une instance de ClDerive ' Affiche : 21 UnDerive.F1) ' Affiche : 22 UnDerive.F2) ' Affiche : 23 UnDerive.F3) ' Affiche : 24 UnDerive.F4)

par une rfrence de sa classe F1 en ClDerivee F2 en ClDerivee F3 en ClBase F4 en ClBase

' Accs une instance de ClSecondaire par une rfrence de sa classe "grand-mre" ClBase ' Affiche : 31 F1 en ClDerivee Console.WriteLine("31 " & RefBaseS.F1) ' Affiche : 32 F2 en ClBase Console.WriteLine("32 " & RefBaseS.F2) ' Affiche : 33 F3 en ClSecondaire Console.WriteLine("33 " & RefBaseS.F3) ' Affiche : 34 F4 en ClBase Console.WriteLine("34 " & RefBaseS.F4) ' Accs une Console.WriteLine("41 Console.WriteLine("42 Console.WriteLine("43 Console.WriteLine("44
instance de ClSecondaire par une rfrence de sa classe mre ClDerive " & RefDerive.F1) ' Affiche : 41 F1 en ClDerivee ' Affiche : 42 F2 en ClSecondaire " & RefDerive.F2) ' Affiche : 43 F3 en ClSecondaire " & RefDerive.F3) ' Affiche : 44 F4 en ClBase " & RefDerive.F4)

Console.WriteLine("51 Console.WriteLine("52 Console.WriteLine("53 Console.WriteLine("54 End Sub End Module

" " " "

' Accs une instance de ClSecondaire par une rfrence de sa classe & UnSecond.F1) ' Affiche : 51 F1 en ClDerivee ' Affiche : 52 F2 en ClSecondaire & UnSecond.F2) ' Affiche : 53 F3 en ClSecondaire & UnSecond.F3) ' Affiche : 54 F4 en ClSecondaire & UnSecond.F4)

Le tableau de la page suivante explique les rsultats constats l'excution entre les diffrentes combinaisons testes. Il sen dgage les gnralits suivantes, donc certaines ont dj t mises en vidence dans ces pages. Quand un objet est manipul par une rfrence sa classe, tous ses membres et tous ceux dont il hrite de ses classes anctres sont accessibles. Quand un objet est manipul par une rfrence une de ses classes anctres, seuls les membres de cette dernire et ceux dont elle a hrits sont accessibles. Toutefois, si cette classe anctre de la rfrence, ou une de ses anctres, possde des membres redfinissables, ceux-ci sont recherchs par le compilateur depuis la classe instancie et jusque la classe o ils sont spcifis redfinissables. C'est le membre redfini le plus proche gnalogiquement de la classe instancie qui est invoqu. C'est la liaison dynamique. Il en rsulte que toute mthode spcifie redfinissable provoque un travail de recherche et d'analyse par le compilateur. Ce travail ne pouvant se faire qu'au dtriment de la rapidit d'excution, il faut limiter cette pratique aux seuls cas dment justifis par une ncessit de polymorphisme. Ce dernier cas de figure s'illustre bien dans les affichages 43 et 44 de l'exemple. L'objet de type ClSecondaire est manipul par une rfrence sa classe mre ClDerivee. Celle-ci hrite de ClBase o toutes les mthodes sont spcifies redfinissables. En 43, la mthode F3 de ClSecondaire, qui est une redfinition de F3 de ClBase, est trouve par le compilateur et invoque. En 44, la mthode F4 de ClSecondaire n'est pas une redfinition. Elle nest pas davantage redfinie en ClDerivee. En remontant la gnalogie de ces classes, le compilateur trouve F4 redfinissable en ClBase et l'invoque.

09/08/2011

PHR VB.Net VBOBJ - 32

Numro affichage 11

Type de la rfrence

Classe instancie

Rpondant F1 de ClDerivee F2 de ClBase F3 de ClBase F4 de ClBase F1 de ClDerivee F2 de ClDerivee

Explication Polymorphisme. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et dans ClDerivee, F1 redfinit F1 de ClBase. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et F2 n'est que surcharge en ClDerivee. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et F3 n'existe pas en ClDerivee. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et F4 n'existe pas en ClDerivee. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et F1 est membre de ClDerive o il redfinit un membre de ClBase. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et F2 est membre de ClDerivee o il surcharge un membre de ClBase. Hritage simple. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et ClDerivee hrite F3 de ClBase. Hritage simple. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et ClDerivee hrite F4 de ClBase. Hritage et polymorphisme. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et ClSecondaire hrite de ClDerivee qui redfinit F1 de ClBase. Hritage. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et F2 n'est que surcharge en ClDerivee. Polymorphisme. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et dans ClSecondaire, F3 redfinit F3 de ClBase. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et en ClSecondaire, F4 n'est pas une redfinition de F4 de ClBase. Hritage. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et F1 n'existe pas en ClSecondaire. Polymorphisme. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et dans ClSecondaire , F2 redfinit F2 de ClDerivee (et non F2 de ClBase). Polymorphisme. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et dans ClSecondaire, F3 redfinit F3 de ClBase. La manipulation d'un objet par une rfrence sa classe mre ne permet d'atteindre que les membres de cette dernire, sauf en cas de redfinition, et en ClSecondaire, F4 n'est pas une redfinition de F4 de ClBase. Hritage simple. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et ClSecondaire hrite F1 de ClDerivee o il redfinit un membre de ClBase. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et F2 est membre de ClSecondaire o il redfinit un membre de ClDerivee. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et F3 est membre de ClSecondaire o il redfinit un membre de ClBase. La manipulation d'un objet par une rfrence sa propre classe permet d'atteindre tous ses membres, ainsi que ceux dont il hrite, et F4 est membre de ClSecondaire o il masque un membre de ClBase.

12 ClBase 13 ClDerivee

14

21

22 ClDerivee 23 ClDerivee

F3 de ClBase F4 de ClBase F1 de ClDerivee F2 de ClBase ClBase ClSecondaire F3 de ClSecondaire

24

31

32

33

34

F4 de ClBase F1 de ClDerivee F2 de ClSecondaire ClDerivee ClSecondaire F3 de ClSecondaire

41

42

43

44

F4 de ClBase

51

F1 de ClDerivee F2 de ClSecondaire F3 de ClSecondaire F4 de ClSecondaire

52 ClSecondaire ClSecondaire 53

54

09/08/2011

PHR VB.Net VBOBJ - 33

La surcharge des oprateurs


La surcharge des oprateurs (depuis VS2005 en VB.Net) permet au programmeur de lapplication cliente dune classe de raliser des oprations entre les objets instancis en utilisant les oprateurs naturels pourtant non conus pour de tels oprandes. Par exemple, la surcharge loprateur de soustraction de sorte que "AZY" = "AZERTY" - "ERT".
Public Class Fraction Dim Numer, Denom As Integer Public Sub New (ByVal ArgNumer As Integer, ByVal ArgDenom As Integer) Numer = ArgNumer Denom = ArgDenom End Sub Public Shared Operator +(ByVal a As Fraction, ByVal b As Fraction) As Fraction Return New Fraction(a.Numer * b.Denom + b.Numer * a.Denom, a.Denom * b.Denom) End Operator Public Shared Operator *(ByVal a As Fraction, ByVal b As Fraction) As Fraction Return New Fraction(a.Numer * b.Numer, a.Denom * b.Denom) End Operator Public Shared Narrowing Operator CType(ByVal Valeur As Fraction) As String Return Valeur.ToString End Operator Public Overrides Function ToString() As String Return Numer.ToString & "/" & Denom.ToString End Function End Class

Les oprateurs de conversion doivent tre dclars avec un attribut de restriction (Narrowing) ou d'largissement (Widening) indiquant la manire dont la conversion doit avoir lieu. Une conversion Widening change une valeur vers un type de donne qui peux s'adapter n'importe quelle valeur possible de la donne d'origine, par exemple : Integer vers Decimal. Une conversion Narrowing change une valeur vers un type de donne qui peut ne pas tre capable de contenir certaines valeurs possibles de la donne d'origine, par exemple : Decimal vers Integer. L'application cliente de la classe Fraction ci-dessus pourrait tre :
Module MonModule Sub Main() Dim x As New Fraction(4, 3) Dim y As New Fraction(5, 2) Dim z As New Fraction(3, 5) Console.WriteLine((x + (y * z)).ToString) Console.WriteLine(CType(x, String)) End Sub End Module

' Affiche : 85/30 ' Affiche : 4/3

Les oprateurs susceptibles d'tre surchargs sont : +, -, *, /, \, ^, &, Like, Mod, And, Or, Xor, Not, <<, >>, =, <>, >, >=, <, <=, CType, IsTrue, IsFalse.

L'interdiction de driver
A l'inverse de la classe dclare abstraite par le mot cl MustInherit, qui doit obligatoirement tre drive moins d'tre inutile, une classe peut tre dclare drivation interdite, ou plus exactement NotInheritable. Aucune classe ne peut en hriter et toutes ses mthodes sont NotOverridable, et non surchargeables et non masquables, quels que soient leurs attributs. Il faut noter que ce mcanisme ne palie pas l'absence de drivation protge et prive en VB. Sans doute doit il exister de bonnes raisons justifiant cette pratique goste et contraire au principe de rutilisabilit de la POO, mais sans doute aussi sont-elles suffisament rares pour que ce mcanisme n'encombre pas davantage ces pages.

09/08/2011

PHR VB.Net VBOBJ - 34

Les vnements
Les mthodes permettent aux applications de communiquer des ordres aux objets et ceux-ci rpondent en renvoyant l'information demande le cas chant. Mais, par ailleurs, la programmation des objets permet de les doter d'metteurs de signaux l'intention de tout autre objet qui veut bien tre l'coute. Ces signaux sont les vnements. Lorsque survient un vnement, l'application consommatrice de l'objet, si elle est l'coute de cet vnement, peut le capter et ragir en consquence. C'est ainsi que lorsqu'un objet TextBox est install sur un formulaire, le code de l'application peut ragir aux vnements gnrs par cet objet. Le TextBox met des vnements. Le programmeur choisit parmi les nombreux signaux du TextBox celui ou ceux qui conviennent son application. Il met son application l'coute de certains vnements mis par le TextBox. Il peut choisir de ragir l'vnement Click, ou KeyPress, ou d'autres, ou aucun. C'est la logique de la programmation vnementielle qui guide le programmeur.

Emission d'vnements
Un vnement se dclare dans la classe mettrice comme une variable, ou mieux comme une mthode d'Interface, c'est--dire sans code ni fin de bloc, pour laquelle le mot cl Function ou Sub est remplac par Event. Cette dclaration ne peut se faire l'intrieur d'une procdure ou d'une fonction. Ses attributs de porte sont les mmes que ceux des fonctions et procdures. Les arguments d'une procdure Event ne peuvent tre Optional, ni ParamArray. Par convention, les vnements sous DotNet ont une mme signature contenant deux arguments. Le premier, qui de type Object, dsigne l'objet metteur et le second de type EventArgs contient la liste des arguments passer. Le programmeur peut respecter cette convention ou pas. La forme conventionnelle d'une procdure Event est la suivante :
Public Event UnEvenement(ByVal Sender As Object, ByVal e As EventArgs)

Cette francisation du code, gnralement adopte dans ce cours, prsente l'avantage pour le dbutant de diffrencier clairement les mots du langage et ceux du programmeur. La dclaration prcdente peut s'crire comme ceci :
Public Event UnEvenement(ByVal Emetteur As Object, ByVal Arguments As EventArgs)

Le programmeur peut conserver la forme conventionnelle mme lorsqu'il n'a pas d'argument transmettre. Dans ce cas, il doit utiliser l'argument EventArgs.Empty. Mais s'il doit transmettre une information en mme temps que l'vnement, il doit crer un objet de type EventArgs contenant cette information, ou bien abandonner la forme conventionnelle. L'mission de l'vnement est dclenche par l'ordre RaiseEvent.
Public Class UneClasse Public Event CetEvenement(ByVal Emetteur As Object, ByVal Arguments As EventArgs) Public Sub UneSub() Dim MomentEmission As Boolean = True ' ' Dans cet exemple, c'est toujours le moment If MomentEmission Then RaiseEvent CetEvenement(Me, EventArgs.Empty) End If End Sub End Class

Soit, pour l'exemple, un vnement gnrant trois informations l'intention de l'objet qui souhaite ragir son avnement. La premire information est la dsignation de l'objet metteur, la deuxime est un message et la troisime est le moment en date et heure de la survenance de l'vnement. Voici sa programmation sous une forme quelconque d'abord et sous la forme conventionnelle ensuite.
Public Class UneClasse ' Forme non conventionnelle de CetEvenement Public Event CetEvenement(ByVal Emetteur As Object, ByVal Message As String, ByVal Moment As DateTime) Public Sub UneSub() ' RaiseEvent CetEvenement(Me, "Un message", DateTime.Now) ' End Sub End Class

09/08/2011

PHR VB.Net VBOBJ - 35

Pour dclarer le mme vnement CetEvenement sous la forme conventionnelle, il faut crer un objet de type EventArgs capable de transmettre plusieurs informations. De plus, il est utile de conserver la possibilit de transmettre EvengArgs.Empty. Il est vident que le respect de la forme conventionnelle engendre un surcrot de programmation.
Public Class EvenementArgs Inherits EventArgs Private UnMessage As String Private UnMoment As DateTime Public Sub New() MyBase.New() End Sub
' L'objet EvenementArgs hrite de EventArgs ' et dispose ainsi de sa proprit Empty

' Il peut tre instanci sans paramtre, ce ' qui est suffisant quand il n'y a aucune ' information transmettre

Public Sub New(ByVal Maintenant As DateTime) ' Mais il doit recevoir le moment de son UnMoment = Maintenant End Sub ' instanciation s'il faut le transmettre
' une procdure vnementielle

Public Property Message() Get Return UnMessage End Get Set(ByVal Valeur) UnMessage = Valeur End Set End Property Public ReadOnly Property Moment() Get Return UnMoment End Get End Property End Class

' Les proprits sont les diverses ' informations transmettre

Public Class UneClasse Public Event CetEvenement(ByVal Emetteur As Object, ByVal Arguments As EvenementArgs) ' UneSub transmet les informations Public Sub UneSub() Dim e As New EvenementArgs(DateTime.Now()) e.Message = "Un Message" RaiseEvent CetEvenement(Me, e) End Sub
' UneAutreSub ne transmet aucune information Public Sub UneAutreSub() Dim e As New EvenementArgs RaiseEvent CetEvenement(Me, e.Empty) End Sub End Class

Rception et traitement d'vnements


La mise l'coute d'un vnement par une instance de l'objet susceptible de le dclencher peut se raliser de deux manires. Soit la variable de rfrence l'objet est dclare avec l'attribut WithEvents, soit un ordre AddHandler implique l'vnement concern. Dans un cas comme dans l'autre, le traitement de la rception d'un vnement est pris en charge par une procdure vnementielle dont les arguments sont identiques ceux dfinis lors de la dclaration de l'vnement dans la classe mettrice. Quand une rfrence d'objet est dclare avec l'attribut WithEvents, l'objet est visible dans la liste droulante de gauche de la fentre d'criture du code et les vnements de cet objet sont visibles dans la liste droulante de droite. Exactement comme cela se passe avec les objets visuels dposs sur un Form, la slection d'un vnement dans cette liste provoque l'criture automatique de la ligne d'entte de la procdure vnementielle adquate. Il ne reste plus qu' y ajouter le code de rponse l'vnement. Lordre AddHandler, naccorde pas cette facilit, mais prsente d'autres avantages. L'ordre AddHandler permet la mise l'coute dynamique d'un objet, un moment choisi et pour une dure dtermine, ainsi que la dsignation d'une mme procdure pour rpondre plusieurs vnements. L'coute d'un objet est stoppe par l'ordre RemoveHandler.

09/08/2011

PHR VB.Net VBOBJ - 36

Pour illustrer ces mcanismes, la classe UneClasse de l'exemple prcdent est reprise et le code d'coute et de traitement de ses vnements est programm ci aprs de diffrentes manires.
Module MonModule ' Instanciation de UneClasse avec prise en compte de ses vnements Dim WithEvents UnObjet As New UneClasse ' Les slections appropries dans les listes droulantes facilitent la dclaration de la ' procdure vnementielle. Le code Console.WriteLine() y est ajout. Private Sub UnObjet_CetEvenement(ByVal Emetteur As Object, ByVal Arguments As EvenementArgs) Handles UnObjet.CetEvenement Console.WriteLine("1 : " & Arguments.Message & ", " & Arguments.Moment) End Sub ' Une autre procdure vnementielle, ayant les mmes arguments que la prcdente, est ' crite sans rfrence un vnement (pas de Handles ). Private Sub EvenementUnAutreObjet(ByVal Emetteur As Object, ByVal Arguments As EvenementArgs) Console.WriteLine("2 : " & Arguments.Message & ", " & Arguments.Moment) End Sub Sub Main() ' La mthode UneSub de UnObjet met un venement UnObjet.UneSub() ' La procdure UnObjet_CetEvenement est
' active et l'affichage est : ' 1 : Un Message, 16/05/2006 14:37:34

' Instanciation de UneClasse sans prise en compte de ses vnements Dim UnAutreObjet As New UneClasse UnAutreObjet.UneSub() ' Aucune procdure vnementielle n'est
' dsigne pour rpondre l'vnement ' mis par UneSub

' La procdure EvenementUnAutreObjet est dsigne pour rpondre un CetEvenement mis ' par UnAutreObjet AddHandler UnAutreObjet.CetEvenement, AddressOf EvenementUnAutreObjet ' La procdure EvenementUnAutreObjet est UnAutreObjet.UneSub()
' active et l'affichage est : ' 2 : Un Message, 16/05/2006 14:37:35

' La procdure UnObjet_CetEvenement est aussi dsigne pour rpondre un CetEvenement ' mis par UnAutreObjet AddHandler UnAutreObjet.CetEvenement, AddressOf UnObjet_CetEvenement ' Les deux procdures sont actives dans UnAutreObjet.UneSub()
' l'ordre de leur dsignation : ' 2 : Un Message, 16/05/2006 14:37:36 ' 1 : Un Message, 16/05/2006 14:37:36

' La procdure EvenementUnAutreObjet est dsigne pour rpondre aussi un CetEvenement ' mis par UnObjet AddHandler UnObjet.CetEvenement, AddressOf EvenementUnAutreObjet ' Les deux procdures sont actives dans UnObjet.UneSub()
' l'ordre de leur dsignation : ' 1 : Un Message, 16/05/2006 14:37:37 ' 2 : Un Message, 16/05/2006 14:37:37

' Arrt des coutes des vnements mis par les objets UnObjet et UnAutreObjet RemoveHandler UnObjet.CetEvenement, AddressOf UnObjet_CetEvenement RemoveHandler UnObjet.CetEvenement, AddressOf EvenementUnAutreObjet RemoveHandler UnAutreObjet.CetEvenement, AddressOf UnObjet_CetEvenement RemoveHandler UnAutreObjet.CetEvenement, AddressOf EvenementUnAutreObjet ' Aucune procdure active UnObjet.UneSub() ' Aucune procdure active UnAutreObjet.UneSub() End Sub End Module

09/08/2011

PHR VB.Net VBOBJ - 37

Aspects avancs
La dlgation
La dlgation est le mcanisme permettant de passer l'adresse d'une procdure ou d'une fonction en paramtre une mthode. Il permet aussi bien le passage d'une mthode d'instance que d'une mthode statique (Shared). La classe Delegate du Framework est la classe de base de tous les types dlgus et elle n'est pas drivable. Une procdure ou une fonction qui est dclare avec l'attribut Delegate l'intrieur ou l'extrieur d'une classe, constitue le prototype de plusieurs autres mthodes autorises tre passes en paramtre par leur adresse. Cette dernire est donne par l'oprateur AddressOf. Cette dclaration de prototype implique que toutes les mthodes concernes aient exactement la mme signature.
Public Class MesOperations ' Dclaration d'un prototype de fonction dlgue l'intrieur d'une classe Public Delegate Function Operation(ByVal V1 As Object, ByVal V2 As Object) As Object ' Dfinition de deux fonctions statiques Addition et Division Public Shared Function Addition(ByVal V1 As Object, ByVal V2 As Object) As Object Return V1 + V2 End Function Public Shared Function Division(ByVal V1 As Object, ByVal V2 As Object) As Object If V2 <> 0 Then Return V1 / V2 Else Return 0 End If End Function ' Dfinition de deux fonctions non statiques Soustraction et Multiplication Public Function Soustraction(ByVal V1 As Object, ByVal V2 As Object) As Object Return V1 - V2 End Function Public Function Multiplication(ByVal V1 As Object, ByVal V2 As Object) As Object Return V1 * V2 End Function End Class Module MonModule Sub Main() ' Instanciation d'un dlgu Dim Operateur As MesOperations.Operation ' Dsignation au dlgu de l'adresse de la fonction sans instanciation (car Shared) Operateur = AddressOf MesOperations.Division ' Excution de la fonction concerne par dlgation Console.WriteLine(Operateur(5, 3)) ' Affiche : 1.6666667 ' Dsignation au dlgu de l'adresse d'une autre fonction sans instanciation (car Shared) Operateur = AddressOf MesOperations.Addition ' Excution de la fonction concerne par dlgation Console.WriteLine(Operateur(5, 3)) ' Affiche : 8 ' Instanciation d'un objet MesOperations Dim AutreOperateur As New MesOperations ' Dsignation au dlgu de l'adresse de la fonction de l'instance (car non Shared) Operateur = AddressOf AutreOperateur.Multiplication ' Excution de la fonction concerne par dlgation Console.WriteLine(Operateur(5, 3)) ' Affiche : 15 ' Dsignation au dlgu de l'adresse d'une autre fonction de l'instance (car non Shared) Operateur = AddressOf AutreOperateur.Soustraction ' Excution de la fonction concerne par dlgation Console.WriteLine(Operateur(5, 3)) ' Affiche : 2 End Sub End Module

09/08/2011

PHR VB.Net VBOBJ - 38

Sr qu'un dlgu nest pas ncessaire pour choisir une des quatre oprations arithmtiques lmentaires. Mais ce n'est qu'un exemple de la programmation du mcanisme. En voici un autre, un peu plus srieux. Le sujet et le mcanisme de tri utiliss pour illustrer l'usage de l'Interface, sont repris ici avec pour principale diffrence que l'Interface est abandonn au profit d'un dlgu.
' Dclaration d'un prototype de fonction dlgue l'extrieur de toute classe. Par souci de ' regroupement d'outils associs, cette dclaration aurait pu tre faite dans la classe ClTri, ' sans aucune autre modification de l'application. Public Delegate Function Compare(ByVal Objet1 As Object, ByVal Objet2 As Object) As Integer ' La classe ClEtudiant est l'objet de Public Class ClEtudiant Private Nom As String ' base de cet exemple Private Resultat As Single Private Section As String Public ReadOnly Property Information(ByVal Choix As Byte) As Object Get Select Case Choix Case 1 Return Nom Case 2 Return Resultat Case 3 Return Section End Select End Get End Property Public Sub New(ByVal ArgNom As String, ByVal ArgResultat As Single, ByVal ArgSection As String) Nom = ArgNom Resultat = ArgResultat Section = ArgSection End Sub ' Pour que ses instances puissent tre tries sur certains de ses membres par l'algorithme ' de tri utilis, il faut que la classe ClEtudiant implmente les mthodes de comparaisons ' adquates en respectant la signature du prototype adopt par la mthode Tri. ' Pour la permettre la comparaison sur Nom. Public Shared Function CompareNom(ByVal Obj1 As Object, ByVal Obj2 As Object) As Integer Return Comparaison(1, Obj1, Obj2) End Function ' Pour la permettre la comparaison sur Resultat. Public Shared Function CompareResultat(ByVal Obj1 As Object, ByVal Obj2 As Object) As Integer Return Comparaison(2, Obj1, Obj2) End Function ' Pour viter la redondance de codes, une seule fonction ralise vraiment les comparaisons. Private Shared Function Comparaison(ByVal Choix As Byte, ByVal Obj1 As Object, ByVal Obj2 As Object) As Integer Select Case Obj1.Information(Choix) Case Is < Obj2.Information(Choix) Return -1 Case Is = Obj2.Information(Choix) Return 0 Case Is > Obj2.Information(Choix) Return 1 End Select End Function End Class

09/08/2011

PHR VB.Net VBOBJ - 39

Public Class ClTri Public Sub Tri(ByVal Table() As Object, ByVal Comparateur As Compare, Optional ByVal Sens As Integer = 1) ' Sens vaut 1 par dfaut et provoque un tri Dim Tmp As Object ' croissant, sa valeur doit tre -1 pour un Dim i As Integer ' tri dcroissant Dim Permutation As Boolean = True While Permutation Permutation = False For i = 0 To Table.Length - 2 If Comparateur(Table(i), Table(i + 1)) = Sens Then Tmp = Table(i) Table(i) = Table(i + 1) Table(i + 1) = Tmp Permutation = True End If Next End While End Sub End Class
' Une application cliente de la classe Module MonModule ' ClEtudiant et du tri polyvalent ClTri.Tri Sub Main() Dim MesEtudiant(5) As ClEtudiant Dim Tri As ClTri = New ClTri Dim i As Integer MesEtudiant(0) = New ClEtudiant("Michel", 10, "Linux") MesEtudiant(1) = New ClEtudiant("Marc", 15, "Windows") MesEtudiant(2) = New ClEtudiant("Pierre", 12, "Analyse") MesEtudiant(3) = New ClEtudiant("Albert", 17, "Windows") MesEtudiant(4) = New ClEtudiant("Christian", 16, "Analyse") MesEtudiant(5) = New ClEtudiant("Bruno", 19, "Linux") ' Affichage de la table non trie For i = 0 To MesEtudiant.Length - 1 With MesEtudiant(i) Console.Write(.Information(1) & " - ") Console.Write(.Information(2) & " - ")) Console.WriteLine(.Information(3)) End With Next ' C'est l'adresse de la mthode qui est passe Tri, selon la dfinition de ses arguments Tri.Tri(MesEtudiant, AddressOf ClEtudiant.CompareNom, 1) ' Affichage de la table trie par Nom For i = 0 To MesEtudiant.Length - 1 With MesEtudiant(i) Console.Write(.Information(1) & " - ")) Console.Write(.Information(2) & " - ")) Console.WriteLine(.Information(3)) End With Next

Tri.Tri(MesEtudiant, AddressOf ClEtudiant.CompareResultat, -1) ' Affichage de la table trie par Resultat For i = 0 To MesEtudiant.Length - 1 With MesEtudiant(i) Console.Write(.Information(1) & " - ")) Console.Write(.Information(2) & " - ")) Console.WriteLine(.Information(3)) End With Next End Sub End Module

09/08/2011

PHR VB.Net VBOBJ - 40

Programmation asynchrone
Dans la plupart des cas lorsqu'une procdure ou une fonction en appelle une autre, elle doit attendre la fin de l'excution de la mthode appele pour continuer ses propres tches. Il s'agit l du mcanisme de programmation synchrone. Il peut constituer une perte de temps, parfois considrable, pouvant laisser croire l'utilisateur que son systme ne rpond plus. La programmation asynchrone rassemble des mcanismes permettant le lancement d'une tche en arrire plan, et ceux permettant de s'assurer de la fin d'une tche avant d'en commencer une autre.

La commande asynchrone Shell


Le mcanisme de la programmation asynchrone permet donc une mthode de continuer ses tches aprs l'appel d'une autre, sans en attendre la fin de l'excution. Ce cas a dj t rencontr prcdemment avec la commande Shell (de la librairie Microsoft.VisualBasic) qui sert au lancement d'applications externes.
Sub Main() Shell("Sol.exe", AppWinStyle.NormalFocus) For i As Byte = 1 To 250 Console.WriteLine(i) Next '

Dans cet exemple, une commande Shell est utilise pour lancer le jeu Solitaire de Windows. Cette commande transmet l'ordre au systme et rend aussitt la main Sub Main. L'affichage des valeurs de 1 250 demand dans ce Main sera probablement termin avant mme qu'apparaisse la fentre du jeu. L'inconvnient potentiel est que si la suite du traitement doit utiliser les rsultats du traitement demand par Shell, ceux-ci ne seront pas encore disponibles. Par exemple, si Shell lance l'excution d'un fichier script dont le rle est de crer un fichier texte d'informations, il est impossible que le code la suite de la ligne Shell ralise la lecture de ce fichier sauf implmenter une temporisation suffisante, ce qui est fastidieux et peu fiable. Par exemple le script MesFichiers.Bat doit crer un fichier MesFichiers.Txt contenant les noms de tous les fichiers de tous les dossiers de l'unit X:. Ce script est : DIR X:\*.* /S > MesFichiers.Txt. Le code VB suivant lance l'excution de MesFichier.Bat par la commande Shell et tente ensuite d'ouvrir en lecture le fichier ainsi cr (par exemple, pour en afficher le contenu l'cran).
Sub Main() Shell("X:\MesFichiers.Bat") Dim FichierEntree As New StreamReader("X:\MesFichiers.TXT") ' utilisation du fichier FichierEntree.Close()

La tentative d'instanciation d'un StreamReader sur le fichier lve une exception avec le message suivant : Le processus ne peut pas accder au fichier "X:\MesFichiers.TXT", car il est en cours d'utilisation par un autre processus. Lorsque l'asynchronisme de la commande Shell handicape l'excution correcte du reste de l'application, il faut utiliser les moyens qu'elle offre pour s'assurer de la fin du processus qu'elle a enclench. Ses moyens sont un argument boolen indiquant s'il faut attendre ou non la fin du processus activ, et un autre argument prcisant la dure de cette attente. La valeur par dfaut de ce dernier est -1 et signifie dure illimite. En outre, Shell est une fonction et elle retourne l'entier 0 si le processus se termine endans l'intervalle de temps spcifi ou l'identifiant du processus dans le cas contraire. Voici le prototype de la fonction Shell.
Public Function Shell( ByVal Commande As String, _ Optional ByVal StyleFenetre As AppWinStyle = AppWinStyle.MinimizedFocus, _ Optional ByVal Attente As Boolean = False, _ Optional ByVal Duree As Integer = -1 _ ) As Integer

La correction du Main prcdent par le passage de la valeur True pour le paramtre d'attente a pour effet que l'instanciation du StreamReader se fait aprs l'excution complte du processus enclench par Shell. Plus aucune exception n'est leve.

09/08/2011

PHR VB.Net VBOBJ - 41

Sub Main() Shell("X:\MesFichiers.Bat",,True) Dim FichierEntree As New StreamReader("X:\MesFichiers.TXT") ' utilisation du fichier FichierEntree.Close() '

En matire d'excution de programmes externes, la mthode Start de la classe Process du framework est une bonne alternative Shell. Toutefois c'est aussi une commande asynchrone et une vitamine additionnelle est ncessaire pour qu'elle attende la fin de l'excution de la tche demande. L'Imports System.Diagnostics est utile.
Process.Start("x:\MesFichiers.Bat") Process.Start("x:\MesFichiers.Bat").WaitForExit(t)
' Aucune attente ' Attente de t millisecondes ou illimite si t absent

Programmation de mthodes asynchrones


Lorsqu'une mthode dlgue est appele par l'usage d'une mthode BeginInvoke, l'appel est plac en file d'attente et l'appelant peut immdiatement poursuivre ses tches.
Imports System.Threading ' Pour disposer d'une temporisation Delegate Function UneMethode(ByVal Entier As Integer) As String
' Implmente la conversion d'un entier Public Class UneClasse Public Shared Function Conversion(ByVal N As Integer) As String Console.WriteLine("Conversion commence") ' Temporisation d'une seconde Thread.Sleep(1000) Console.WriteLine("Conversion termine") Return N.ToString End Function End Class

Module MonModule Dim Convertir As New UneMethode(AddressOf UneClasse.Conversion) Sub Main() Console.WriteLine("Appel Conversion") Convertir(5) Console.WriteLine("Suite application ") End Sub End Module

Affichages : Appel Conversion Conversion commence Conversion termine Suite application

L'affichage produit par ce programme montre que son fonctionnement est synchrone. Le dernier message du Main n'apparat qu'aprs l'excution complte de la fonction Conversion. Pour raliser un appel asynchrone de cette fonction, il faut l'invoquer par la mthode BeginInvoke. Cette mthode impose que deux paramtres supplmentaires soient ajouts ceux de la fonction invoque. Pour l'instant, ils sont remplacs par la valeur Nothing.
Module MonModule Dim Convertir As New UneMethode(AddressOf UneClasse.Conversion) Sub Main() Console.WriteLine("Appel Conversion") Convertir.BeginInvoke(5, Nothing, Nothing) Console.WriteLine("Suite application ") End Sub End Module

Affichages : Appel Conversion Suite application Conversion commence Conversion termine

Cette fois, l'affichage produit par ce programme montre un fonctionnement asynchrone. En effet, le dernier message du
Main apparat dj alors que ceux de la fonction Conversion ne sont pas encore affichs.

Le premier paramtre impos par la mthode BeginInvoke est l'adresse de la mthode excuter la fin du traitement asynchrone. Par ailleurs, la mthode BeginInvoke retourne une valeur de type IAsyncResult qui peut tre rcupre par la mthode EndInvoke. La rcupration de la valeur de retour de la mthode appele et son traitement doivent tre programms dans une autre mthode qui accepte une valeur IAsyncResult et invoque la mthode EndInvoke.

09/08/2011

PHR VB.Net VBOBJ - 42

Module MonModule Dim Convertir As New UneMethode(AddressOf UneClasse.Conversion) Private Sub Affichage(ByVal Resultat As IAsyncResult) Console.WriteLine(Convertir.EndInvoke(Resultat)) End Sub Sub Main() Console.WriteLine("Appel Conversion") Convertir.BeginInvoke(5, AddressOf Affichage, Nothing) Console.WriteLine("Suite application ") End Sub End Module

Affichages : Appel Conversion Suite application Conversion commence Conversion termine 5

Une autre manire de faire dispense de l'criture de cette mthode spcifique mais elle bloque l'excution de la suite du programme car EndInvoke est une mthode synchrone. Mais alors, quoi bon s'embarrasser de l'asynchrone ?
Module MonModule Dim Convertir As New UneMethode(AddressOf UneClasse.Conversion) Sub Main() Dim Resultat As IAsyncResult Console.WriteLine("Appel Conversion") Resultat = Convertir.BeginInvoke(5, Nothing, Nothing) Console.WriteLine(Convertir.EndInvoke(Resultat)) Console.WriteLine("Suite application ") End Sub End Module

Affichages : Appel Conversion Conversion commence Conversion termine 5 Suite application

Toutefois, cette manire de procder peut se justifier. Elle permet de continuer certains traitements pendant que s'excute la mthode asynchrone et de ne bloquer l'application que lorsque c'est vraiment ncessaire. Dans l'exemple ci-dessous, les blocages par EndInvoke sont effectus quand c'est ncessaire et d'autres traitements, dont un autre appel de la mme mthode asynchrone, ont t raliss entre temps.
Module MonModule Sub Main() Dim Resultat1, Resultat2 As IAsyncResult Console.WriteLine("Appel 1 Conversion") Resultat1 = Convertir.BeginInvoke(11, Nothing, Nothing) Console.WriteLine("Suite 1 application ...") Console.WriteLine("Appel 2 Conversion") Resultat2 = Convertir.BeginInvoke(22, Nothing, Nothing) Console.WriteLine("Suite 2 application ...") Console.WriteLine("Resultat 2 ncessaire") Console.WriteLine(Convertir.EndInvoke(Resultat2)) Console.WriteLine("Suite 3 application ...") Console.WriteLine("Resultat 1 ncessaire") Console.WriteLine(Convertir.EndInvoke(Resultat1)) Console.WriteLine("Suite application ...") End Sub End Module

Affichages : Appel 1 Conversion Suite 1 application ... Appel 2 Conversion Suite 2 application ... Resultat 2 ncessaire Conversion commence Conversion commence Conversion termine Conversion termine 22 Suite 3 application ... Resultat 1 ncessaire 11

L'affichage produit par ce dernier exemple montre aussi que chaque appel asynchrone gnre un processus d'excution distinct. C'est ainsi que le deuxime appel asynchrone provoque le message d'entre dans la mthode alors que le premier appel n'a pas encore produit le message de sortie. La mthode est donc bien excute une deuxime fois avant mme avoir termin les tches de la premire excution. Cela ne peut se faire que dans des processus distincts. Il faut encore remarquer que l'arrt d'une application par EndInvoke peut parfois durer plus longtemps que prvu. Il est prudent de se prmunir d'un arrt infini par un test de la proprit IsCompleted de l'objet IAsyncResult.
If Resultat2.IsCompleted Then Console.WriteLine(Convertir.EndInvoke(Resultat2)) Else Console.WriteLine("Resultat 2 pas encore disponible") ' Agir en consquence ... End If

09/08/2011

PHR VB.Net VBOBJ - 43

Une autre technique d'attente de la fin d'un processus asynchrone consiste obtenir le signal de fin de processus par l'appel de la mthode AsyncWaitHandle.WaitOne de l'objet IAsyncResult. Cette technique est quivalente l'usage de EndInvoke seul.
Console.WriteLine("Resultat 2 ncessaire") Resultat2.AsyncWaitHandle.WaitOne() Console.WriteLine(Convertir.EndInvoke(Resultat2))

Enfin, il faut encore noter que le deuxime paramtre supplmentaire impos par la mthode BeginInvoke est de type Object et qu'il peut donc contenir n'importe quoi. Cet objet est destin tre rcupr dans la mthode dont l'adresse est passe BeginInvoke, par la proprit AsyncState de l'objet IAsyncResult.
Module MonModule Dim Convertir As New UneMethode(AddressOf UneClasse.Conversion) Private Sub Affichage(ByVal Resultat As IAsyncResult) Console.Write(Resultat.AsyncState) Console.WriteLine(Convertir.EndInvoke(Resultat)) End Sub Sub Main() Dim UneChaine As String UneChaine = "Rsultat = " Console.WriteLine("Appel Conversion") Convertir.BeginInvoke(5, AddressOf Affichage, UneChaine) Console.WriteLine("Suite application ...") Console.ReadLine() End Sub End Module

Affichages : Appel Conversion Suite application ... Conversion commence Conversion termine Rsultat = 5

Le multithreading
Une application est excute dans le contexte d'un processus global dont le rle principal est la gestion de la zone mmoire ncessaire au stockage des donnes de cette application. Ce processus global est constitu d'un ensemble de petits processus appels threads (processus lgers ou fils d'excution). Ces threads, pour l'excution de leurs traitements, utilisent le processeur tour de rle pendant un court laps de temps allou par le systme. Si les traitements d'un thread ne sont pas termins dans le bref dlai imparti, ils sont continus quand ce thread obtient de nouveau la main. Il en dcoule que la simultanit d'excution d'applications n'est qu'une apparence, tout au moins sur un systme mono processeur. Trs nombreuses sont les applications qui ne ncessitent pas la gestion explicite des threads par le programmeur. Ce dernier peut user des mthodes asynchrones pour faire excuter plusieurs tches simultanment par le systme sans se proccuper des threads sous jacents. Toutefois, la gestion de threads par le programmeur est intressante parce qu'elle offre des possibilits de contrles suprieures celles de la programmation asynchrone. De plus, elle permet l'excution et la gestion de tches en parallle sur les systmes multi processeurs o la simultanit n'est plus une illusion.

Les processus actifs


La classe Process de l'espace de noms System.Diagnostics propose une vaste panoplie de moyens de gestion des processus. Il n'est pas utile ici de les tudier en dtail, mais voici un exemple d'identification et d'arrt d'un processus, qui correspond aux besoins les plus frquents en la matire. Le code suivant affiche l'identifiant et le nom de chaque processus actif et, pour autant que Excel ait t lanc au pralable, l'exprimentation montre l'arrt immdiat de ce logiciel par l'excution de la mthode Kill.
Module MonModule Sub Main() Dim P As System.Diagnostics.Process For Each P In System.Diagnostics.Process.GetProcesses Console.WriteLine(P.Id & " " & P.ProcessName) If P.ProcessName = "EXCEL" Then P.Kill() Next End Sub End Module

09/08/2011

PHR VB.Net VBOBJ - 44

Synchrone, asynchrone et multithreading


La comparaison des modes de programmation synchrone, asynchrone et multithreads illustre des diffrences de comportement et apporte une justification l'emploi du multithreading sur un systme mono processeur. Ci-dessous, une classe Traitements offre deux mthodes Traitement1 et Traitement2 ralisant presque les mmes tches. Pour diffrencier ces mthodes lors de l'excution, la premire affiche les entiers de 10 15 et la deuxime, les entiers de 20 25. Une pause entre chaque affichage allonge la dure de chaque traitement pour permettre le dpassement du temps processeur allou. Des affichages du temps avec Now.TimeOfDay ont t raliss afin de produire une comparaison des performances. Ils ne sont pas programms ci dessous, mais les positions qu'ils occupaient sont signales en commentaires. Bien entendu, outre les temporisations, les dures calcules sont dpendantes des performances du processeur et non gure de significations en elles mmes. C'est leur comparaison qui est porteuse d'enseignement. Dans les exemples suivants et dans tous ceux qui illustrent des traitements asynchrones ou multithreads, il convient de placer un ReadKey ou un ReadLine avant la fin de la procdure principale pour que les traitements parallles puissent afficher leurs rsultats avant larrt du programme et le retour au systme.
Imports System.Threading Public Class Traitements Public Sub Traitement1() For i As Byte = 10 To 15 Console.Write(i & " ") Thread.Sleep(400) Next End Sub Public Sub Traitement2() For i As Byte = 20 To 25 Console.Write(i & " ") Thread.Sleep(800) Next End Sub End Class Module MonModule Dim T As New Traitements Sub Main() T.Traitement1() T.Traitement2() End Sub End Module
' Programmation synchrone ' ' ' ' ' Affichage du temps avant appel Traitement1 Affichage du temps avant appel Traitement2 Affichage du temps aprs appel Traitement2 Affichage : 10 11 12 13 14 15 20 21 22 23 24 25 ' Implmente deux traitements semblables ' mais de rapidits diffrentes ' ' ' ' Affichage du temps avant For Doit afficher 10 11 12 13 14 15 Temporisation 400 millisecondes Affichage du temps aprs Next

' ' ' '

Affichage du temps avant For Doit afficher 20 21 22 23 24 25 Temporisation 800 millisecondes Affichage du temps aprs Next

' Programmation Asynchrone Module MonModule Delegate Sub Traitement() Dim T As New Traitements Dim T1 As New Traitement(AddressOf T.Traitement1) Dim T2 As New Traitement(AddressOf T.Traitement2) ' Affichage du temps avant appel Traitement1 Sub Main() ' Affichage du temps avant appel Traitement2 T1.BeginInvoke(Nothing, Nothing) ' Affichage du temps aprs appel Traitement2 T2.BeginInvoke(Nothing, Nothing) ' Affichage : End Sub ' 10 11 20 12 13 21 14 15 22 23 24 25 End Module ' Programmation MultiThreads Module MonModule Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Dim T2 As New Thread(AddressOf T.Traitement2) ' Affichage du temps avant appel Traitement1 Sub Main() ' Affichage du temps avant appel Traitement2 T1.Start() ' Affichage du temps aprs appel Traitement2 T2.Start() ' Affichage : End Sub End Module ' 10 20 11 21 12 13 22 14 15 23 24 25

09/08/2011

PHR VB.Net VBOBJ - 45

Synchrone Mise en excution de T1 Mise en excution de T2 Dlai de reprise par l'appelant l'issue des 2 appels Dure totale des traitements (T1 et T2 achevs) Affichages Asynchrone Mise en excution de T1 Mise en excution de T2 Dlai de reprise par l'appelant l'issue des 2 appels Dure totale des traitements (T1 et T2 achevs) Affichages Multithreads Mise en excution de T1 Mise en excution de T2 Dlai de reprise par l'appelant l'issue des 2 appels Dure totale des traitements (T1 et T2 achevs) Affichages
30,0432 millisecondes 30,0432 millisecondes 10,0144 millisecondes 4.987,1712 millisecondes
10 20 11 21 12 13 22 14 15 23 24 25

0 millisecondes 0 millisecondes 7.220,3824 millisecondes 7.220,3824 millisecondes


10 11 12 13 14 15 20 21 22 23 24 25

50,0720 millisecondes 0 millisecondes 40,0576 millisecondes 5.497,9056 millisecondes


10 11 20 12 13 21 14 15 22 23 24 25

L'examen des relevs ci-dessus montre clairement qu'en programmation synchrone, bien que la mise en excution d'un traitement soit extrmement plus rapide que dans les autres modes, la dure totale des traitements est un peu suprieure la somme des dures de chacun des traitements (6 x 400 + 6 x 800 = 7200). Par ailleurs, la mthode appelante doit attendre la fin de tous les traitements pour continuer ses tches. En programmation asynchrone, bien que le temps de mise l'excution du premier traitement soit consquent, la dure totale des traitements est infrieure la somme des dures de chacun des traitements. Ceci est bien normal car chaque traitement profite de la pause de l'autre pour effectuer une partie de ses tches. Cela se voit l'examen de l'affichage : Traitement2 ralise une itration pendant la pause Traitement1, lequel ralise ensuite deux itrations pendant la pause de l'autre, et ainsi de suite. Par ailleurs, la mthode appelante peut continuer la suite de ses tches aprs un dlai infrieur mme l'activation du premier traitement. En programmation par gestion des threads, chaque mise en excution a une mme dure qui est moins importante qu'en programmation asynchrone. Mais ce qui extrmement plus rapide, ce sont la dure totale des traitements et le dlai de continuation de ses propres tches par la mthode appelante. Ceci s'explique par le fait que les traitements ainsi lancs sont excuts comme des processus strictement distincts. Ils ne sont donc plus dpendants des temporisations de leurs concurrents, mais seulement des laps de temps accords par le systme. L'affichage montre d'ailleurs que Traitement2 ralise ses deux premires itrations (affichage de 20 et 21) avant mme que Traitement1 termine sa troisime (affichage de 12). Les deux traitements sont quasi simultans.

Programmation et gestion du multithreading


L'espace de nom System.Threading propose plusieurs classes utiles pour la programmation et la gestion des threads, dont notamment Thread et Mutex. Les outils de gestions des threads, dont seuls les plus frquemment utiliss sont tudis ici, sont ncessaires pour viter les dangers de ce mode de programmation. Ces dangers et leur gestion, qui ont diverses incidences sur le bon fonctionnement des applications, sont illustrs dans les exemples suivants. Accs une ressource partage
Module MonModule ' Programmation MultiThreads Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Sub Main() ' Dmarrage de Traitement1 sur un thread T1.Start() ' Appel de Traitement2 en mode synchrone T.Traitement2() ' Affichage : End Sub End Module ' 10 20 11 21 12 13 22 14 15 23 24 25

09/08/2011

PHR VB.Net VBOBJ - 46

L'affichage produit par Traitement2 est parasit par l'affichage de Traitement1. L'usage des mthodes Suspend et Resume de la classe Thread permet qu'une tche comme Traitement2 dans cet exemple, soit excute sans perturbation, prioritairement au thread T1. Mais la suspension de Traitement1 risque fort de bloquer laccs Console, la ressource commune de lexemple, et dempcher du mme coup lexcution de Traitement2. Le risque est vit ci-dessous par la reprise de la ressource par lapplication principale avant la suspension de Traitement1.
Module MonModule ' Programmation MultiThreads Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Sub Main() ' Dmarrage de Traitement1 sur un thread T1.Start() Console.Write(String.Empty) ' Reprendre la main sur la Console ' Interrompt l'excution du thread T1 T1.Suspend() ' Appel de Traitement2 en mode synchrone T.Traitement2() ' Continue l'excution du thread interrompu T1.Resume() ' Affichage : End Sub End Module ' 10 20 21 22 23 24 25 11 12 13 14 15

Par ailleurs, l'usage de Suspend ou de Resume sur un thread qui n'est pas en service provoque la leve d'une exception. Les proprits IsAlive et ThreadSate fournissent l'information sur l'tat d'un thread donn.
Module MonModule ' Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Sub Main() ' T1.Start() ' If T1.IsAlive Then ' Console.Write(String.Empty) T1.Suspend() End If ' T.Traitement2() ' If T1.ThreadState Then ' T1.Resume() ' End If ' End Sub End Module
Programmation MultiThreads

Dmarrage de Traitement1 sur un thread Interruption si IsAlive Reprendre la main sur la Console

Appel de Traitement2 en mode synchrone Reprise si ThreadState <> 0 ThreadState a plusieurs valeurs possibles et la dcision de reprise peut tre value de manire plus pertinente

Les exemples prcdents illustrent comment excuter une mthode prioritairement sur le thread actif, mais montre aussi que la suspension temporaire dun thread peut provoquer des problmes dexcution par le blocage de ressources partages. Il faut noter encore quil nest sans doute pas judicieux dinvoquer diffremment des mthodes dune mme instance comme dans ces exemples en multithreading et en mode synchrone, mais procder autrement nillimine pas les risques de blocages. Il faut viter de suspendre un thread au profit dun autre qui utilise les mmes ressources. Plutt quexcuter une mthode prioritairement sur un thread actif, il peut tre souhaitable d'attendre la fin de l'excution du thread avant den lancer un autre. La classe Thread offre la mthode bloquante Join pour raliser cette manoeuvre.
Module MonModule ' Programmation MultiThreads Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Dim T2 As New Thread(AddressOf T.Traitement2) Sub Main() ' Dmarrage de Traitement1 sur un thread T1.Start() If T1.IsAlive Then ' Attendre la fin de T1 si IsAlive T1.Join() End If ' Dmarrage de Traitement2 sur un thread T2.Start() ' Affichage : End Sub End Module ' 10 11 12 13 14 15 20 21 22 23 24 25

La mthode Join permet galement de s'assurer de l'excution complte de tous les threads lancs par l'application avant l'arrt de celle-ci. Cela peut se produire lorsque l'application utilise l'ordre explicite de retour au systme System.Environment.Exit. Dans l'exemple suivant, des lignes T1.Join() et T2.Join() devraient prcder l'ordre de sortie pour que les affichages raliss par les threads soient complets.

09/08/2011

PHR VB.Net VBOBJ - 47

Module MonModule ' Programmation MultiThreads Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Dim T2 As New Thread(AddressOf T.Traitement2) Sub Main() T1.Start() T2.Start() System.Environment.Exit(0) ' Affichage : End Sub End Module ' 10 20

Accs exclusif une ressource C'est la classe Mutex qui permet de rserver les ressources d'un thread. La mthode WaitOne rserve toutes les ressources utilises dans les lignes de codes qui la suivent jusqu' la rencontre de la mthode ReleaseMutex qui les libre pour d'autres threads. L'instance de Mutex doit tre unique dans un contexte donn. Avec ce procd, le premier thread excuter WaitOne garde la main sur ses ressources jusqu' la fin de ses traitements. La classe Traitements utilise prcdemment est modifie de sorte que la ressource ne soit plus la Console, mais une mthode Traitement3. C'est dans la mthode appelante qu'il faut rgler la priorit souhaite en choisissant le thread dmarrer d'abord.
Imports System.Threading Public Class Traitements Dim M As New Mutex Public Sub Traitement1() M.WaitOne() For i As Byte = 10 To 15 Traitement3(i) Thread.Sleep(400) Next M.ReleaseMutex() End Sub Public Sub Traitement2() M.WaitOne() For i As Byte = 20 To 25 Traitement3(i) Thread.Sleep(800) Next M.ReleaseMutex() End Sub Public Sub Traitement3(ByVal N As Integer) Console.Write(N & " ") End Sub End Class

' Rserve les ressources pour le thread

' Libre les ressources

' Rserve les ressources pour le thread

' Libre les ressources

La classe Mutex offre donc un outil de synchronisation des tches dmarres sur des threads diffrents. Mais, attention au contenu des zones de codes protges par Mutex. Si une mthode contient une zone protge par laquelle elle ralise l'appel d'une autre mthode qui contient aussi une zone protge dans laquelle est effectu l'appel de la mthode appelante, il y a un inter blocage qui, sous DotNet, gnre la leve d'une exception. Il faut donc viter que des mthodes ainsi excutes s'appellent entre elles.
Module MonModule ' Programmation MultiThreads Dim T As New Traitements Dim T1 As New Thread(AddressOf T.Traitement1) Dim T2 As New Thread(AddressOf T.Traitement2) Sub Main() T1.Start() T2.Start() ' Affichage : End Sub End Module ' 10 11 12 13 14 15 20 21 22 23 24 25

09/08/2011

PHR VB.Net VBOBJ - 48

Instanciation d'un thread par dlgation Deux critures diffrentes du code d'instanciation d'un thread se rencontrent dans ce cours, mais aussi dans la littrature et dans la documentation en ligne de Visual Studio.
Dim T1 As New Thread(AddressOf T.Traitement1) Dim T1 As New Thread(New ThreadStart(AddressOf T.Traitement1))

La seconde utilise explicitement une mthode dlgue ThreadStart. En ralit, le constructeur de la classe Thread reoit comme seul paramtre le dlgu ThreadStart et le compilateur remplace automatiquement la premire criture d'instanciation par la deuxime. Ces deux critures sont donc strictement quivalentes. Echange d'informations avec un thread Le thread est instanci avec un dlgu qui ne tolre aucun argument et ne retourne aucune valeur. Il est donc impossible d'utiliser les modes ordinaires de communication de donnes que sont les arguments et les valeurs de retour des fonctions. Il existe toutefois plusieurs moyens de fournir des valeurs aux threads et d'en rcuprer des informations. Il convient que toutes les mthodes excutables sur des threads distincts soient regroupes au sein d'une ou plusieurs classes, mme si cela n'est pas toujours ncessaire. Ainsi dans l'exemple suivant, une chane de caractres est traite par un thread du seul fait que procdure et variable sont situes dans la mme porte.
Imports System.Threading Public Module MonModule Private Chaine As String Public Sub UneProc() Console.WriteLine(Chaine) Chane = "Chane modifie" End Sub

' Affiche la variable de la porte ' et change son contenu

Public Sub Main() Dim Traitement As New Thread(AddressOf UneProc) Chaine = "Une chane" Traitement.Start() Console.WriteLine("Appel termin") Traitement.Join() Console.WriteLine("Traitement termin.") Console.WriteLine(Chaine) End Sub End Module

Affichages : Appel termin Une chane Traitement termin Chane modifie

En enfermant la procdure dans une classe distincte, le code appelant, qui peut utiliser les mthodes Property pour passer et rcuprer des valeurs, dispose aussi d'un constructeur permettant le passage de valeurs initiales.
Public Class MesProcedures Private ChaineLocale As String Public Sub New(ByVal Chaine As String) ChaineLocale = Chaine End Sub Public ReadOnly Property Chaine() Get Return ChaineLocale End Get End Property Public Sub UneProc() Console.WriteLine(ChaineLocale) ChaineLocale = "Chane modifie" End Sub End Class

' Affiche la variable locale et ' et change son contenu

09/08/2011

PHR VB.Net VBOBJ - 49

Public Module MonModule Public Sub Main() Dim Procedure As New MesProcedures("Une Chane") Dim Traitement As New Thread(AddressOf Procedure.UneProc) Traitement.Start() Console.WriteLine("Appel termin") Traitement.Join() Console.WriteLine("Traitement termin.") ' Lecture de la proprit modifie Console.WriteLine(Procedure.Chaine) End Sub End Module

Si l'usage du constructeur et des mthodes Property permet l'change d'informations avec un thread, ce procd n'est gure satisfaisant dans la mesure o il faut absolument attendre (Join) la fin de l'excution du thread, c'est--dire renoncer l'avantage du multithreading, pour rcuprer la valeur souhaite. En effet, dans le code suivant, la valeur rcupre est la valeur initiale et non celle modifie par le thread parce que la reprise de la main par le programme appelant est plus rapide que l'excution du thread.
Public Sub Main() Dim Procedure As New MesProcedures("Une Chane") Dim Traitement As New Thread(AddressOf Procedure.UneProc) Traitement.Start() ' Traitement.Join() ' Affiche : Une Chane Console.WriteLine(Procedure.Chaine) End Sub

C'est la programmation judicieuse d'vnements qui apporte la meilleure solution en matire de communication entre une application excute sur un thread principal et les threads qu'elle active. Voici, reprogramm en consquence, les codes de l'exemple prcdent.
Imports System.Threading Public Class MesProcedures Public Event ResultatComplet(ByVal Valeur As String) Private ChaineLocale As String Public Sub New(ByVal Chaine As String) ChaineLocale = Chaine End Sub Public Sub UneProc() Console.WriteLine(ChaineLocale) Thread.Sleep(400) ChaineLocale = "Chane modifie" RaiseEvent ResultatComplet(ChaineLocale) End Sub End Class Public Module MonModule Private Sub ResultatDisponible(ByVal Chaine As String) Console.WriteLine(Chaine) End Sub Public Sub Main() Dim Procedure As New MesProcedures("Une Chane") Dim Traitement As New Thread(AddressOf Procedure.UneProc) AddHandler Procedure.ResultatComplet, AddressOf ResultatDisponible Traitement.Start() Console.WriteLine("Appel termin") ' Traitement.Join() Console.WriteLine("Traitement termin.") Console.ReadLine() End Sub End Module

09/08/2011

PHR VB.Net VBOBJ - 50

Dans cet exemple, l'arrt du programme a t suspendu par une ligne Console.ReadLine pour laisser l'vnement le temps de survenir. Dans une application, cette ligne est remplace par le code qui peut tre excut sans attendre le rsultat de l'excution du thread. Lorsque plusieurs instances d'un mme thread ou plusieurs threads accdent une mme ressource, cela pose des problmes d'interfrences, voire des blocages. C'est pourquoi les mcanismes de synchronisation tels que l'emploi de la mthode Join ou l'usage de la classe Mutex ont t tudis. Quand la ressource critique est une expression manipulant un objet de type rfrence, comme une classe, un module, un tableau ou un dlgu, VB.Net offre un outil permettant de geler l'accs cet objet tout le temps ncessaire son traitement. L'instruction SyncLock veille ce que plusieurs threads n'excutent pas les mmes instructions en mme temps. Quand l'excution d'un thread atteint le bloc SyncLock, il value l'objet ou l'expression et s'en rserve l'exclusivit. Ceci empche une expression de modifier des valeurs pendant l'excution de plusieurs threads, ce qui peut donner des rsultats inattendus. La leve de cette exclusivit s'effectue la rencontre de la fin de bloc End SyncLock. La mme protection peut tre obtenue avec un Mutex, mais l'action de SyncLock est plus rapide. L'exemple suivant illustre le problme et son remde.
Imports System.Threading Public Class Traitements Public Event ResultatComplet(ByRef T() As Integer, ByVal Taille As Integer) Dim TLocal() As Integer Dim TailleLocale As Integer Public Sub New(ByVal Taille As Integer) ReDim TLocal(Taille) TailleLocale = Taille End Sub Public Sub Traitement1() ' Verrouillage de TLocal SyncLock TLocal For i As Integer = 0 To TailleLocale Thread.Sleep(100) TLocal(i) = 10 + i Next i RaiseEvent ResultatComplet(TLocal, TailleLocale) ' Libration (aprs expdition du rsultat) End SyncLock End Sub Public Sub Traitement2() ' Verrouillage de TLocal SyncLock TLocal For i As Integer = 0 To TailleLocale Thread.Sleep(200) TLocal(i) = 20 + i Next i RaiseEvent ResultatComplet(TLocal, TailleLocale) ' Libration (aprs expdition du rsultat) End SyncLock End Sub End Class Public Module MonModule Private Sub ResultatDisponible(ByRef T() As Integer, ByVal Longueur As Integer) For i As Integer = 0 To Longueur Affichage sans les protections SyncLock : Console.Write(T(i).ToString & " ") Next 20 21 22 13 14 15 20 21 22 23 24 25 End Sub
Affichage avec les protections SyncLock : Public Sub Main() Dim T As New Traitements(5) 10 11 12 13 14 15 20 21 22 23 24 25 Dim T1 As New Thread(AddressOf T.Traitement1) Dim T2 As New Thread(AddressOf T.Traitement2) AddHandler T.ResultatComplet, AddressOf ResultatDisponible ' Doit fournir les valeurs de 10 15 T1.Start() ' Doit fournir les valeurs de 20 25 T2.Start() ' Attendre la fin des affichages Console.ReadLine() End Sub End Module

09/08/2011

PHR VB.Net VBOBJ - 51

Le marshaling Plusieurs significations du mot marshaling (ou marshalling), telles conduite crmonieuse de personnes, organisation et rangement de groupes de personnes, triage de wagons, suggrent sa signification en informatique. C'est un mcanisme qui, lors de l'appel d'une procdure ou d'une fonction distance (autre rseau, autre machine, autre processus), consiste trier et convertir des donnes d'une structure particulire vers un flux d'octets, en vue de leur transfert vers un site de rception o sont rtablies les valeurs dans une forme quivalente. Cette opration inverse porte le nom de unmarshaling. En DotNet, le concept s'applique aussi aux communications entre processus manags et non manags, et aux communications entre threads. Le marshaling est recommand lorsque des mthodes doivent tre actives sur le thread principal en rponse des sollicitations de threads secondaires. La mise en place du marshaling consiste programmer l'appel de ces mthodes en mode asynchrone. Cette situation arrive notamment quand des threads secondaires manipulent des contrles d'une application Windows, ces contrles appartenant toujours au thread d'excution principal. Il sagit en fin de compte, dempcher un thread secondaire de dclencher lexcution dune mthode synchrone qui perturberait les traitements en cours dun thread principal. A titre d'illustration, la mise en place du marshaling dans l'exemple prcdent consiste modifier le module MonModule de sorte sous-traiter le travail de la procdure vnementielle ResultatDisponible , qui est active partir des threads, la procdure TraiteResultatDisponible excute en mode asynchrone par une mthode BeginInvoke.
Public Module MonModule Public Delegate Sub ResultatPresent(ByRef T() As Integer, ByVal L As Integer) Dim TraitementResultat As New ResultatPresent(AddressOf TraiteResultatDisponible) Private Sub TraiteResultatDisponible(ByRef T() As Integer, ByVal Longueur As Integer) For i As Integer = 0 To Longueur Console.Write(T(i).ToString & " ") Next End Sub Private Sub ResultatDisponible(ByRef T() As Integer, ByVal Longueur As Integer) ' Pour test avec appel synchrone ' TraiteResultatDisponible(T, Longueur) TraitementResultat.BeginInvoke(T, Longueur, Nothing, Nothing) End Sub Public Sub Main() Dim T As New Traitements(5) Dim T1 As New Thread(AddressOf T.Traitement1) Dim T2 As New Thread(AddressOf T.Traitement2) AddHandler T.ResultatComplet, AddressOf ResultatDisponible ' Doit fournir les valeurs de 10 15 T1.Start() ' Doit fournir les valeurs de 20 25 T2.Start() ' Attendre la fin des affichages Console.ReadLine() End Sub End Module

Le marshaling mobilise beaucoup de ressources et dans l'exemple ci-dessus, la dure sparant le dbut du Main de la fin du dernier affichage est plus importante pour l'appel de TraiteResultatDisponible en mode asynchrone que pour l'appel en mode synchrone. Dans l'exemple suivant, la mise en uvre du marshaling ne modifie gure les performances. Cet exemple est une application Windows qui excute trois traitements, un lent, un moyen et un rapide. L'application est d'abord ralise en programmation vnementielle ordinaire, elle est modifie ensuite en mode multithreads et finalement, elle implmente le marshaling. L'application est constitue d'un formulaire unique et d'une classe qui contient les diffrents traitements. Ceux-ci excutent les calculs sollicitant le processeur et indiquent au formulaire la fin de ces calculs. En programmation vnementielle ordinaire, l'utilisateur encode une valeur et lance le traitement souhait. Il doit alors attendre que le formulaire reoive le rsultat et l'affiche dans l'tiquette approprie pour procder l'encodage de la valeur suivante. En programmation multithreads, l'utilisateur peut encoder la valeur suivante aussitt un traitement lanc. Cette disponibilit de son application est plus rapide encore lorsque le marshaling est implment. C'est un des bnfices dj constats de la programmation asynchrone.

09/08/2011

PHR VB.Net VBOBJ - 52

Le formulaire, qui est nomm FBase, est muni de quatre tiquettes (EtiDouble, EtiFactorielle, EtiIteration, EtiNbCalcul), de trois boutons (BDouble, BFactorielle, BIteration) et d'une bote de texte (TValeur). Ces diffrents objets sont flanqus d'tiquettes de libells lorsque c'est ncessaire. La proprit BackColor des tiquettes destines aux rsultats a t rgle de sorte les mettre en vidence. L'encodage s'effectue dans la bote de texte et le clic d'un bouton lance le traitement correspondant. Le traitement Double consiste doubler la valeur encode. C'est le plus rapide. Le traitement Factorielle, plus lent, calcule la factorielle de la valeur encode. Enfin, le traitement Iteration, qui est d'autant plus lent qu'il contient une pause de 500 millisecondes, effectue le nombre d'itrations indiqu par la valeur encode. Le premier traitement compte pour un calcul et les deux autres en comptabilisent un par itration. La classe, qui est nomme MesProcedures, contient les variables locales ncessaires l'excution de ses calculs vFactorielle, vIteration, vNbCalcul), les vnements (DoubleComplete, (vDouble, FactorielleComplete, IterationComplete) qui retournent les rsultats, les mthodes Property (ValeurDouble, ValeurFactorielle, ValeurIteration) permettant le passage de la valeur encode dans FBase vers la variable locale approprie, et les trois procdures de traitements (CalculeDouble, CalculeFactorielle, ExecuteIteration) qui effectuent les calculs demands et mettent les vnements. Chaque traitement dispose de ses propres variables locales pour stocker les valeurs retourner par l'vnement. Voici le code de cette classe.
Imports System.Threading Public Class MesProcedures Private vDouble As Integer Private vFactorielle As Integer Private vIteration As Integer Private vNbCalcul As Double = 0 ' En version multithreads, c'est ici que sont insres les lignes de dclaration des threads Public Event IterationComplete(ByVal Nombre As Integer, ByVal TotalCalculs As Double) Public Event DoubleComplete(ByVal Result As Integer, ByVal TotalCalculs As Double) Public Event FactorielleComplete(ByVal Factorial As Double, ByVal TotalCalculs As Double) Public WriteOnly Property ValeurDouble() Set(ByVal Valeur) vDouble = Valeur End Set End Property Public WriteOnly Property ValeurFactorielle() Set(ByVal Valeur) vFactorielle = Valeur End Set End Property Public WriteOnly Property ValeurIteration() Set(ByVal Valeur) vIteration = Valeur End Set End Property Public Sub CalculeDouble() Dim vResultat As Integer Dim vTotalActuel As Double vResultat = vDouble * 2 vNbCalcul += 1 vTotalActuel = vNbCalcul RaiseEvent DoubleComplete(vResultat, vTotalActuel) End Sub

09/08/2011

PHR VB.Net VBOBJ - 53

Public Sub CalculeFactorielle() Dim i As Integer Dim vResultat As Double = 1 Dim vTotalActuel As Double For i = 1 To vFactorielle vResultat *= i vNbCalcul += 1 Next i vTotalActuel = vNbCalcul RaiseEvent FactorielleComplete(vResultat, vTotalActuel) End Sub Public Sub ExecuteIteration() Dim i As Integer Dim vTotalActuel As Double For i = 1 To vIteration ' Pause de 500 millisecondes Thread.Sleep(500) vNbCalcul += 1 Next i vTotalActuel = vNbCalcul RaiseEvent IterationComplete(i - 1, vTotalActuel) End Sub End Class

Cette fois, le sacro saint Code gnr par le Concepteur Windows Form et stock dans le fichier FBase.Designer.vb ne suffit plus linstanciation correcte du formulaire. Puisquil ne convient pas de modifier ce code dans ce fichier, le constructeur de FBase est rcrit pour contenir les complments ncessaires, savoir l'instanciation d'un objet Procedures de type MesProcedures et les dsignations des procdures vnementielles.
Public Sub New() ' Constructeur contenu dans le fichier InitializeComponent() ' complments ajouts Procedures = New MesProcedures AddHandler Procedures.FactorielleComplete, AddressOf EvFinFactorielle AddHandler Procedures.DoubleComplete, AddressOf EvFinDouble AddHandler Procedures.IterationComplete, AddressOf EvFinIteration End Sub

Voici le code complet de FBase dans sa version vnementielle simple.


Public Class FBase Inherits System.Windows.Forms.Form Dim Procedures As MesProcedures Public Sub New() ' Reproduire ici le code de la procdure New crite ci dessus End Sub Private Sub BFactorielle_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BFactorielle.Click Procedures.ValeurFactorielle = CInt(TValeur.Text) ' Transmettre la valeur l'instance ' Geler le bouton BFactorielle.Enabled = False ' Lancer le calcul sur le thread Procedures.CalculeFactorielle() ' Lancer le calcul sur un autre thread ' Procedures.ChoixThreads(1) End Sub Private Sub BDouble_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BDouble.Click ' Transmettre la valeur l'instance Procedures.ValeurDouble = CInt(TValeur.Text) ' Geler le bouton BDouble.Enabled = False ' Lancer le calcul sur le thread Procedures.CalculeDouble()
' Lancer le calcul sur un autre thread

' Procedures.ChoixThreads(2) End Sub

09/08/2011

PHR VB.Net VBOBJ - 54

Private Sub BIteration_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BIteration.Click ' Faire patienter l'utilisateur EtiIteration.Text = "... ... ..." EtiIteration.Refresh() Procedures.ValeurIteration = CInt(TValeur.Text) ' Transmettre la valeur l'instance ' Geler le bouton BIteration.Enabled = False ' Lancer le calcul sur le thread Procedures.ExecuteIteration() ' Lancer le calcul sur un autre thread ' Procedures.ChoixThreads(3) End Sub Private Sub EvFinFactorielle(ByVal Valeur As Double, ByVal NbCalculs As Double) ' Afficher le rsultat EtiFactorielle.Text = Valeur.ToString ' Librer le bouton BFactorielle.Enabled = True ' Mettre jour le nombre de calculs EtiNbCalcul.Text = NbCalculs.ToString End Sub Private Sub EvFinDouble(ByVal Valeur As Integer, ByVal NbCalculs As Double) ' Afficher le rsultat EtiDouble.Text = Valeur.ToString ' Librer le bouton BDouble.Enabled = True ' Mettre jour le nombre de calculs EtiNbCalcul.Text = NbCalculs.ToString End Sub Private Sub EvFinIteration(ByVal Nombre As Integer, ByVal NbCalculs As Double) ' Afficher le rsultat EtiIteration.Text = Nombre.ToString BIteration.Enabled = True ' Librer le bouton ' Mettre jour le nombre de calculs EtiNbCalcul.Text = NbCalculs.ToString End Sub End Class

Pour le test de l'excution de toute l'application sur son thread courant, les lignes Procedures.ChoixThreads() doivent tre maintenues en commentaires. Voici un test dmonstratif. L'encodage de la valeur 10 et le clic de BIteration provoque un traitement qui doit durer au moins 5 secondes. Pendant ce temps, il est impossible d'encoder une autre valeur ni de cliquer un autre bouton. En ralit, le clic d'un autre bouton est mmoris dans le buffer et il est pris en compte quand le traitement en cours se termine. Ce dcalage entre une action de l'utilisateur et le feedback que lui renvoie l'application est source de confusions, d'erreurs, et aussi d'inconfort pour l'utilisateur. Il s'agit d'un problme frquent qui se produit quand le processeur est accapar par un traitement. Tous les autres traitements excuts sur le mme thread sont en souffrances. En plus du gain de performances dj constat, le multithreading apporte la solution ce problme. Peu de modifications sont ncessaires pour que les traitements de cette application soient excuts sur des threads diffrents. Dans la classe MesProcedures, il faut ajouter les trois lignes suivantes de dclaration des threads la suite des dclarations des variables de la classe, ainsi que la procdure ChoixThread qui facilite la programmation des appels de threads.
Public ThrFactorielle As Thread Public ThrDouble As Thread Public ThrIteration As Thread Public Sub ChoixThreads(ByVal ThreadChoisi As Integer) Select Case ThreadChoisi Case 1 ThrFactorielle = New Thread(AddressOf CalculeFactorielle) ThrFactorielle.Start() Case 2 ThrDouble = New Thread(AddressOf CalculeDouble) ThrDouble.Start() Case 3 ThrIteration = New Thread(AddressOf ExecuteIteration) ThrIteration.Start() End Select End Sub

09/08/2011

PHR VB.Net VBOBJ - 55

Dans la classe FBase, trois procdures doivent tre modifies comme indiqu prcdemment. Ce sont les procdures BDouble_Click, BFactorielle_Click et BIteration_Click dans lesquelles les lignes d'appels des procdures de traitements et commentes Lancer le calcul sur le thread doivent tre places en commentaire, tandis que les lignes Procedures.ChoixThreads() doivent tre rendues actives. Par exemple, voici la procdure BDouble_Click ainsi modifie.
Private Sub BDouble_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BDouble.Click Procedures.ValeurDouble = CInt(TValeur.Text) BDouble.Enabled = False
' Lancer le calcul sur le thread ' Lancer le calcul sur un autre thread

' Procedures.CalculeDouble() Procedures.ChoixThreads(2) End Sub

Une fois ces modifications ralises, le test prcdent offre une toute autre disponibilit de l'application. Il est possible d'encoder d'autres valeurs avant mme que le traitement initial ait termin ses itrations. Mais au moment o le rsultat d'un autre traitement devrait tre affich dans ltiquette qui le concerne, le dbogueur suspend lapplication et produit un message Opration inter-threads non valide : le contrle '' a fait l'objet d'un accs partir d'un thread autre que celui sur lequel il a t cr. Cette intervention du dbogueur, qui ne se produit dailleurs pas en exploitation relle, peut tre dsactive en attribuant la valeur False la proprit CheckForIllegalCrossThreadCalls du composant. Toutefois, il sagit l de lindication que le Framework noffre aucune scurit pour cette communication entre threads et il est donc prudent dimplmenter le marshaling. Ce contrle de la communication entre threads ne seffectuait pas sous VS 2003. Il faut remarquer que dans cet exemple, le nombre de calculs prsent en cours de traitement n'est pas significatif. Sur l'illustration ci contre, le nombre de calculs est 13. Il n'en faut pourtant pas autant pour tablir le double et la factorielle de la valeur 10. La diffrence s'explique du fait que pendant ces calculs, le traitement des itrations a galement modifi la variable vNbCalcul. Bien sr, il y a des outils de verrouillage de l'accs aux donnes (Mutex, SyncLock). Mais ces outils sont bloquants et leur usage dans cet exemple anantirait tout l'avantage du multithreading. L'implmentation du marshaling ne ncessite aucune modification de la classe MesProcedures. Par contre plusieurs modifications s'imposent dans FBase. Il faut ajouter les trois lignes suivantes de dclaration des dlgus la suite des dclarations des variables de la classe et crire les trois procdures dlgues.
Public Delegate Sub FinFactorielle(ByVal Valeur As Double, ByVal Calculs As Double) Public Delegate Sub FinDouble(ByVal Valeur As Integer, ByVal Calculs As Double) Public Delegate Sub FinIteration(ByVal Nombre As Integer, ByVal Calculs As Double) Public Sub TraiteFinFactorielle(ByVal Valeur As Double, ByVal NbCalculs As Double) ' Afficher le rsultat EtiFactorielle.Text = Valeur.ToString ' Librer le bouton BFactorielle.Enabled = True ' Mettre jour le nombre de calculs EtiNbCalcul.Text = NbCalculs.ToString End Sub Public Sub TraiteFinDouble(ByVal Valeur As Integer, ByVal NbCalculs As Double) ' Afficher le rsultat EtiDouble.Text = Valeur.ToString ' Librer le bouton BDouble.Enabled = True ' Mettre jour le nombre de calculs EtiNbCalcul.Text = NbCalculs.ToString End Sub Public Sub TraiteFinIteration(ByVal Nombre As Integer, ByVal NbCalculs As Double) ' Afficher le rsultat EtiIteration.Text = Nombre.ToString BIteration.Enabled = True ' Librer le bouton ' Mettre jour le nombre de calculs EtiNbCalcul.Text = NbCalculs.ToString End Sub

Les lignes de codes de ces trois procdures ci dessus sont exactement celles des procdures vnementielles correspondantes des versions prcdentes. Il faut donc maintenant modifier chacune de ces procdures en y remplaant

09/08/2011

PHR VB.Net VBOBJ - 56

le code recopi ici par l'appel asynchrone des procdures dlgues. Voici les procdures vnementielles ainsi modifies.
Private Sub EvFinFactorielle(ByVal Valeur As Double, ByVal NbCalculs As Double) Me.BeginInvoke(New FinFactorielle(AddressOf TraiteFinFactorielle), New Object() _ {Valeur, NbCalculs}) End Sub Private Sub EvFinDouble(ByVal Valeur As Integer, ByVal NbCalculs As Double) Me.BeginInvoke(New FinDouble(AddressOf TraiteFinDouble), New Object() _ {Valeur, NbCalculs}) End Sub Private Sub EvFinIteration(ByVal Nombre As Integer, ByVal NbCalculs As Double) Me.BeginInvoke(New FinIteration(AddressOf TraiteFinIteration), New Object() _ {Nombre, NbCalculs}) End Sub

Limplmentation du marshaling rduit un peu les performances des applications. Les mesures releves sur lexemple prcdent sont de 10,194 secondes pour une programmation sans marshaling et de 10,234 avec marshaling, soit un cart de moins de 0.004% du temps dexcution. Programmation asynchrone et multithreading : une synthse La dmonstration de la supriorit du multithreading en matire de performances a t montre dans les pages prcdentes. La programmation asynchrone apporte elle aussi un apprciable gain de rapidit, mais elle impose l'usage de dlgus. Toutefois, cette contrainte offre l'avantage de son inconvnient puisque le dlgu peut tre une fonction avec plusieurs arguments et retournant un rsultat. En programmation multithreads, les mthodes excutes ne peuvent tre que des Sub sans arguments. L'usage des mthodes Property et des vnements s'imposent comme tant les meilleurs moyens de communications avec les threads. Ceci implique, idalement, la cration de classes spcifiques pour les traitements et vnements du multithreads. L'un comme l'autre, ces modes de programmation ncessitent des prcautions quand l'interprtation des rsultats lorsque plusieurs mthodes ont trait des donnes communes. Toutefois, ils acceptent tous deux des mthodes de verrouillages et de synchronisations de l'accs aux donnes et aux ressources qu'ils manipulent. Ces mthodes, qui ont t illustres dans les exemples concernant le multithreading, sont aussi applicables aux mthodes asynchrones. Ainsi, dans l'exemple de programmation asynchrone o Traitement1 (qui affiche les entiers de 10 15) et Traitement2 (qui affiche les entiers de 20 25) se partagent la Console pour afficher leurs valeurs presque tour de rle, l'emploi d'un Mutex aurait permis celui qui a commenc l'affichage de terminer son travail avant de laisser la main l'autre. Mais les dispositifs de verrouillages et de synchronisations rduisent fortement le bnfice du travail simultan de plusieurs mthodes, qu'elles soient asynchrones ou multithreads. En rsum, au plus s'lve le gain en performance, au plus la communication de donnes devient ardue, et au plus la protection de donnes communes rduit presque nant les efforts du programmeur. La programmation asynchrone convient l'excution de petites procdures ou fonctions, et elle offre quelques facilits pour le transfert de peu de donnes, ainsi que pour la rcupration d'un rsultat unique. La programmation multithread convient l'excution de toutes les procdures, et surtout celles dont les traitements accaparent fortement le processeur. Dans un mode comme dans l'autre, le programmeur doit concevoir son dveloppement de sorte viter l'excution simultane de mthodes utilisant les mmes donnes. En programmation multithreads, il faut empcher un thread secondaire de dclencher lexcution dune mthode synchrone sur le thread qui la instanci par limplmentation du marshaling, c'est--dire en dlgant les traitements de rponses aux vnements mis par un thread secondaire des procdures asynchrones.

09/08/2011

PHR VB.Net VBOBJ - 57

La persistance
La persistance est la mmorisation des valeurs des proprits d'un objet en vue d'une rutilisation future. Les diffrents objets manipuls possdent des proprits dont les valeurs peuvent tre modifies en cours d'excution. Mais chaque nouvelle utilisation, ce sont les valeurs par dfaut, ou celles prvues dans le code par le programmeur, qui affectent les objets lors de leur instanciation. La persistance d'un objet se ralise par l'enregistrement des valeurs de toutes ses proprits, gnralement dans un fichier binaire. La solution idale consiste doter les objets des moyens de persistance qui leur sont ncessaires ainsi que d'un constructeur capable d'effectuer la rcupration des valeurs sauves prcdemment. L'exemple suivant illustre cette faon de faire. La classe concerne par la persistance possde un constructeur adapt et les mthodes de traitements des fichiers les plus appropris ses donnes. L'application cliente doit dsigner le nom du fichier, avec son chemin complet, en le passant par paramtre la mthode approprie de l'instance.
Imports System.IO Public Class UneClasse Dim UneChaine As String Public Sub New(ByVal ArgValeur As String) UneChaine = ArgValeur End Sub Public Property Chaine() As String Get Return UneChaine End Get Set(ByVal Valeur As String) UneChaine = Valeur End Set End Property End Class Public Class UneClasseSpecialisee Inherits UneClasse Dim UnEntier As Integer
' Une classe quelconque exposant une valeur ' de type String ' Constructeur permettant l'initialisation ' de la valeur UneChaine

' Property permettant l'accs UneChaine

' ' ' '

Une autre classe drive de la prcdente expose une valeur de type Integer Son constructeur permet l'initialisation de la valeur UnEntier et de celle hrite

Public Sub New(ByVal V As Integer, ByVal S As String) MyBase.New(S) UnEntier = V End Sub Public Property Entier() As Integer Get Return UnEntier End Get Set(ByVal Valeur As Integer) UnEntier = Valeur End Set End Property End Class Public Class UneAutreClasse Dim MesValeurs(4) As UneClasseSpecialisee Public Sub New() MesValeurs(0) = MesValeurs(1) = MesValeurs(2) = MesValeurs(3) = MesValeurs(4) = End Sub
' Property permettant l'accs UnEntier

' Une classe client expose un vecteur de 5 ' objets de type UneClasseSpecialisee ' Initialisation par dfaut

New New New New New

UneClasseSpecialisee(0, UneClasseSpecialisee(1, UneClasseSpecialisee(2, UneClasseSpecialisee(3, UneClasseSpecialisee(4,

"Zro") "Un") "Deux") "Trois") "Quatre")

09/08/2011

PHR VB.Net VBOBJ - 58

Public Sub New(ByVal Fichier As String) Charge(Fichier) End Sub

' Initialisation par lecture d'un fichier

' Remplacement d'un lment du vecteur

Public Sub New(ByVal Indice As Integer, ByVal ArgValeur As Integer, ByVal ArgChaine As String) MesValeurs(Indice) = New UneClasseSpecialisee(ArgValeur, ArgChaine) End Sub
' Accs un lment donn

Public Property UneValeur(ByVal Indice As Integer) As UneClasseSpecialisee Get Return MesValeurs(Indice) End Get Set(ByVal Value As UneClasseSpecialisee) MesValeurs(Indice).Entier = Value.Entier MesValeurs(Indice).Chaine = Value.Chaine End Set End Property
' Ecriture du vecteur dans un fichier Public Sub Sauve(ByVal Fichier As String) Dim FichierSortie As New BinaryWriter(File.Open(Fichier, FileMode.Create, FileAccess.Write)) For i As Integer = 0 To 4 FichierSortie.Write(MesValeurs(i).Entier) FichierSortie.Write(MesValeurs(i).Chaine) Next FichierSortie.Close() End Sub ' Instanciation des lments du vecteur Public Sub Charge(ByVal Fichier As String) ' par lecture des valeurs du fichier Dim i As Integer Dim FichierEntree As New BinaryReader(File.Open(Fichier, FileMode.Open, FileAccess.Read))

For i = 0 To 4 MesValeurs(i) = New UneClasseSpecialisee(FichierEntree.ReadInt32, FichierEntree.ReadString) Next FichierEntree.Close End Sub End Class Module MonModule Private Sub Affiche(ByVal Obj As UneAutreClasse) For i As Integer = 0 To 4 Console.WriteLine(Obj.UneValeur(i).Entier) Console.WriteLine(Obj.UneValeur(i).Chaine) Next End Sub Sub Main() Dim UnObjet As New UneAutreClasse Dim UnAutre As New UneClasseSpecialisee(7, "Sept") Dim NomFichier As String = "X:\MesDonnees\MesObjets.txt" ' Affiche les lments suite l'instanciation avec le constructeur par dfaut Affiche(UnObjet) ' Remplace l'lment d'indice 3 UnObjet.UneValeur(3) = UnAutre ' Affiche les lments suite la modification Affiche(UnObjet) ' Appel de la mthode de sauvegarde de l'instance UnObjet.Sauve(NomFichier)

09/08/2011

PHR VB.Net VBOBJ - 59

' Instanciation avec le constructeur "lecteur de fichier" Dim UnAutreObjet As New UneAutreClasse(NomFichier) ' Affiche les lments suite l'instanciation par lecture du fichier Affiche(UnAutreObjet) End Sub End Module

09/08/2011

PHR VB.Net VBDB - 1

Programmation oriente bases de donnes en VB.Net

09/08/2011

PHR VB.Net VBDB - 2

Tables des matires des pages VBDB


L'ADO.Net..........................................................................................................................................................................4 L'accs aux sources de donnes................................................................................................................................4 Les modes d'accs aux bases de donnes .................................................................................................................4 Le mode connect ..........................................................................................................................................4 Le mode dconnect.......................................................................................................................................5 Les bases de donnes Access..............................................................................................................................................5 Cration d'une base Access ......................................................................................................................................5 Compactage d'une base Access ................................................................................................................................6 Rglage d'un pilote ODBC pour Access ..................................................................................................................7 Le mode connect...............................................................................................................................................................8 La connexion ............................................................................................................................................................8 Fonctionnalits de l'objet Connection ............................................................................................................8 Proprits .............................................................................................................................................8 Mthodes..............................................................................................................................................9 Evnements..........................................................................................................................................9 L'objet Command ...................................................................................................................................................10 Proprits ...........................................................................................................................................10 Mthodes............................................................................................................................................10 Exemple .............................................................................................................................................11 L'objet DataReader .................................................................................................................................................11 Proprits ...........................................................................................................................................11 Mthodes............................................................................................................................................12 Exemples............................................................................................................................................12 L'objet Transaction.................................................................................................................................................13 Exemple .............................................................................................................................................13 Connexion polyvalente...........................................................................................................................................14 Obtention de la chane de connexion .....................................................................................................................15 Le mode dconnect .........................................................................................................................................................16 La connexion en lecture .........................................................................................................................................16 L'objet DataAdapter .....................................................................................................................................16 Deux mthodes de lecture ............................................................................................................................16 Les objets DataSet et DataTable ..................................................................................................................16 Proprit du DataSet ..........................................................................................................................16 Proprit du DataSet et du DataTable................................................................................................16 Proprits du DataTable.....................................................................................................................16 Mthodes du DataSet et du DataTable...............................................................................................17 Usage simple du DataSet ...................................................................................................................17 Usage simple du DataTable ...............................................................................................................18 Cration d'une base de donnes en mmoire..........................................................................................................19 Sauvegarde de la base mmoire dans une base Access................................................................................22 Utilisation des relations et contraintes d'intgrit...................................................................................................23 Lectures des donnes ...................................................................................................................................23 Lecture linaire ..................................................................................................................................23 Lectures hirarchiques .......................................................................................................................23 Les contraintes d'intgrits...........................................................................................................................24 Quelques cas ......................................................................................................................................24 Mise jour de la base source et gestion des conflits ..............................................................................................25 Bases de donnes et composants visuels ..........................................................................................................................29 La liaison une base de donnes............................................................................................................................29 La prsentation des donnes...................................................................................................................................29 Lecture et affichage d'une simple table........................................................................................................31 Lecture et affichage de tables lies par une relation ....................................................................................31 La recherche d'un enregistrement.................................................................................................................33 La manipulation des donnes .................................................................................................................................34 L'dition contrle d'un enregistrement .......................................................................................................34 L'ajout d'un enregistrement ..........................................................................................................................36 La suppression d'un enregistrement .............................................................................................................37 La mise jour de la base ........................................................................................................................................38

09/08/2011

PHR VB.Net VBDB - 3

Le composant DataGridView.................................................................................................................................40 Limpression des donnes par CrystalReport.........................................................................................................41

09/08/2011

PHR VB.Net VBDB - 4

L'ADO.Net
L'accs aux sources de donnes
L'accs et le traitement des sources de donnes sous Visual Studio .Net repose exclusivement sur la technologie ADO.Net. Bien qu'inspire d'une technologie ADO antrieure (ActiveX Data Object), l'ADO.Net est trs diffrente par sa simplicit d'emploi et par ses fonctionnalits. Elle permet l'accs diverses sources de donnes par l'intermdiaire de fournisseurs d'accs OLEDB (Object Linking and Embedding DataBase) et de pilotes ODBC (Open DataBase Connectivity). Les fournisseurs OLEDB permettent l'accs des sources de donnes aussi diffrentes que fichiers plat, messageries, annuaires, bases de donnes, , tandis que les pilotes ODBC permettent seulement (ou presque) l'accs des bases de donnes. Mais les technologies OLE et ODBC ne sont pas neuves et la puissance de l'ADO.Net rside ailleurs, notamment dans le fait que peu d'objets soient ncessaires l'tablissement de la connexion une source de donnes et son exploitation. Ces objets sont dpendants du fournisseur OLEDB ou du pilote ODBC et une application peut accder n'importe quelle source de donnes sans modification de son code hormis l'instanciation et le rglage ventuel de ces objets. Des fournisseurs OLEDB et pilotes ODBC sont disponibles par dfaut sous DotNet et grs par le Framework (code manag). Pour d'autres sources de donnes il appartient leur producteur de livrer les fournisseurs d'accs adquats. Les anciennes technologies de connexions aux sources de donnes, telle que DAO (Data Access Object) utilise dans ce cours pour permettre la cration d'une base de type Access, peuvent toujours tre utilises mais ne sont pas gres par le Framework (code non manag). Lorsqu'un fournisseur OLEDB et un pilote ODBC sont tous deux disponibles, c'est l'utilisation de l'OLEDB qui prsente les meilleures performances et fiabilits. Les fournisseurs d'accs de ADO.Net sont livrs dans les espaces de noms :
System.Data.ODBC System.Data.OleDB System.Data.SqlClient System.Data.OracleClient

Contient les objets associs aux pilotes ODBC Contient les objets associs aux fournisseurs OLEDB.Net Contient les objets associs au fournisseur Sql Server Contient les objets associs au fournisseur Oracle

Les modes d'accs aux bases de donnes


La technologie DotNet permet l'exploitation d'une base de donnes sous deux modes diffrents, chacun prsentant ses avantages et ses inconvnients.

Le mode connect
En mode connect, la connexion avec la base de donnes est maintenue tout le temps ncessaire, mme si le traitement consiste en de l'encodage qui peut durer plusieurs heures. Toute modification valide est immdiatement rpercute sur la base et, en cas de panne du systme ou du rseau, seules les donnes en cours de dactylographie sont perdues. La mise jour simultane de donnes par plusieurs utilisateurs ne pose ordinairement pas de problme. C'est le moteur de gestion de la base de donnes qui gre les mises jour simultanes. Par exemple, Oracle verrouille une ligne de la base de donnes ds qu'un utilisateur la modifie. Elle reste verrouille, et donc inaccessible aux autres utilisateurs, jusqu' ce que celui qui l'a modifie valide sa modification ou l'abandonne. Les phases de travail avec la source de donnes sont videntes en mode connect. Ce sont les suivantes : 1. Ouvrir une connexion avec la source de donnes 2. Travailler avec la source de donnes en lecture et en criture 3. Fermer la connexion Les principaux objets ADO.Net concerns par ce mode d'accs sont Connection, Command et DataReader.

09/08/2011

PHR VB.Net VBDB - 5

Le mode dconnect
En mode dconnect, la connexion avec la base de donnes n'est tablie que le temps ncessaire l'acquisition d'une copie mmoire des informations ncessaires au traitement. Elle est ventuellement rtablie ultrieurement si une mise jour de la base s'impose. Les modifications sont ainsi rpercutes en une seule opration quand tous les traitements sont termins et un encodage de plusieurs heures peut tre perdu si une panne lectrique survient avant la mise jour. La mise jour de donnes modifies simultanment par plusieurs utilisateurs est plus dlicate. En effet, si deux utilisateurs disposent d'une mme copie initiale d'un jeu de donnes, le dernier des deux commander la mise jour provoque l'crasement de celle commande par l'autre. Ce mode de travail permet de rduire au strict minimum la charge occasionne sur la base de donnes par de nombreuses connexions comme c'est gnralement le cas sous Internet ou sur de grands rseaux. Le mode dconnect offre un avantage tout particulier lorsqu'il s'agit d'changer l'information sur un rseau htrogne. Les donnes stockes localement sont converties de faon tout fait transparente au format XML (eXtensible Markup Language) et elles peuvent tre communiques tout autre systme disposant de ce langage. Les phases de travail avec la base de donnes en mode dconnect sont les suivantes : 1. 2. 3. 4. 5. Ouvrir une connexion avec la source de donnes Obtenir une copie mmoire de tout ou partie des donnes de la source Fermer la connexion Travailler avec la copie mmoire des donnes en lecture et en criture Si mise jour ncessaire : 1. Ouvrir une connexion avec la source de donnes 2. Envoyer les donnes modifies la source 3. Fermer la connexion

Les principaux objets ADO.Net concerns par ce mode d'accs sont Connection, DataSet et DataAdapter.

Les bases de donnes Access


L'accs aux bases de donnes Access et leurs traitements s'oprent ordinairement sous la technologie ADO.Net par l'usage du fournisseur OLEDB propos par Microsoft et de prfrence l'ODBC galement disponible sous Windows. Mais la technologie ADO.Net, qui est destine au travail sur des sources de donnes existantes, ne permet pas la cration de bases de donnes. Toutefois, le programmeur qui dveloppe une application dont les donnes doivent tre stockes dans une base Access, peut souhaiter y intgrer la cration de la base initiale afin de se dispenser de l'emploi du logiciel Access lors de l'installation de son produit. Le programmeur peut galement souhaiter intgrer dans son application un compactage automatique de la base de donnes. Ces oprations de cration et de compactage se commandent par des mthodes de l'objet DBEngine de l'espace de noms DAO qui contient les objets DAO du modle COM (Component Object Model), ancienne technologie qui a t essentielle la programmation sous Windows, mais qui n'est plus maintenue sous DotNet qu' des fins de transitions. Les codes et donnes du modle COM ne sont pas grs par le Framework de DotNet. L'emploi des objets COM produit donc du code non manag et il convient d'en user aussi peu que possible. C'est pourquoi l'emploi des objets DAO est limit dans ce cours l'illustration de ces deux oprations particulires du monde Access. Pour utiliser lobjet DBEngine, lapplication doit rfrencer le composant Microsoft DAO Object Library.

Cration d'une base Access


La cration d'une base Access avec DBEngine produit un fichier .mdb qui ne contient aucune table. Il convient donc de programmer ensuite l'ajout des tables en utilisant la technologie ADO.Net. La fonction CreationDBAccess ci aprs ralise la cration d'une base de donnes Access dont le chemin et le nom lui sont passs par un paramtre de type chane de caractres. Elle retourne la valeur True en cas de succs et False dans le cas contraire. La mthode de cration, qui est CreateDatabase, gnre une exception si la base de donnes existe dj ou si le chemin est inexistant. Pour remplacer une base existante, il faut d'abord la supprimer par la mthode Delete de l'objet File. La seule gestion d'erreur faite ici consiste attribuer False comme valeur de retour de la fonction.

09/08/2011

PHR VB.Net VBDB - 6

La mthode CreateDatabase ncessite deux paramtres : le nom complet de la base crer et une constante de l'espace DAO qui concerne la faon dont les tris de chanes doivent tre excuts en fonction de la langue (avec ou sans caractres accentus, par exemple).
Public Function CreationDBAccess(ByVal NomComplet As String) As Boolean Dim dbe As New DAO.DBEngine Dim db As DAO.DataBase Dim Reussite As Boolean = True Try db = dbe.CreateDatabase(NomComplet, DAO.LanguageConstants.dbLangGeneral) Catch ex As Exception Reussite = False Finally If Reussite Then db.Close ' Libre le fichier pour permettre son accs par d'autres codes End if db = Nothing dbe = Nothing End Try Return Reussite End Function

L'usage de cette fonction peut tre le suivant :


Sub Main() Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" If CreationDBAccess(NomDB) Then ' Tout va bien, on continue Else ' Traitement de l'erreur End If End Sub

Compactage d'une base Access


Le compactage est une opration qui consiste dbarrasser le gestionnaire de la base de donnes de toutes ses informations inutiles comme par exemple, les enregistrements supprims par l'application mais encore physiquement prsents dans le fichier de la base. Cette opration rduit son volume et amliore l'accs aux donnes. Le compactage est ralis par la mthode CompactDatabase qui produit une copie de la base traite. Cette mthode ncessite deux paramtres : le nom complet de la base traiter et celui du fichier produire. La mthode gnre une exception si le fichier cible existe dj ou si le compactage ne peut tre men bien pour n'importe quelle autre raison. Dans la procdure CompacteDBAccess ci aprs, le nom du fichier cible est celui de la base elle-mme auquel les caractres ~TMP sont ajouts. Quand le compactage s'est bien droul, le fichier cible est renomm avec le nom de la base de donnes d'origine aprs suppression de cette dernire. Cette faon de faire prsente l'avantage de conserver intacte la base d'origine en cas d'accident de compactage.
Public Sub CompacteDBAccess(ByVal NomComplet As String) Dim dbe As New DAO.DBEngine Dim Reussite As Boolean = True Try dbe.CompactDatabase(NomComplet, NomComplet & "~TMP") Catch ex As Exception Reussite = False Finally If Reussite Then IO.File.Delete(NomComplet) IO.File.Move(NomComplet & "~TMP", NomComplet) End If dbe = Nothing End Try End Sub

09/08/2011

PHR VB.Net VBDB - 7

Rglage d'un pilote ODBC pour Access


Bien que l'usage du fournisseur OLEDB soit prfrable au pilote ODBC, le rglage de l'ODBC pour Access est l'occasion d'illustrer ce processus par ailleurs absolument ncessaire pour d'autres types de bases comme MySQL, par exemple. Le rglage de l'ODBC s'effectue par l'outil "Sources de donnes (ODBC)" du systme d'exploitation. Sous Windows 2000, l'accs cet outil est : Paramtres/Panneau de configuration/Outils d'administration/Sources de donnes (ODBC). Un fois charg, l'outil prsente une fentre munie de divers onglets. Pour les besoins d'une application particulire, il convient de slectionner l'onglet Sources de donnes utilisateur et de cliquer le bouton Ajouter

Il faut alors choisir le pilote ODBC souhait, soit Microsoft Access Driver dans ce cas, et cliquer sur le bouton Terminer. La bote de dialogue prsente ci contre s'ouvre alors. Elle permet le rglage du pilote. L'indication d'un nom identifiant le pilote et la slection de la base par le bouton Slectionner sont les rglages ordinairement suffisants. Cette bote de dialogue est diffrente d'un pilote l'autre car elle expose des fonctionnalits et proprits spcifiques au type de sources de donnes choisi. Par exemple, celle prsente ci-dessous pour le rglage d'un ODBC MySql est bien diffrente de celle utilise pour Access. A l'issue de ce rglage, le nom de la source de donnes se retrouve dans la liste de l'onglet Sources de donnes utilisateur. Le bouton Configurer de cet onglet ouvre nouveau la bote de dialogue de rglage d'un pilote slectionn dans la liste pour en permettre d'ventuelles modifications. Le rglage d'un pilote ODBC ddi une base de donnes est termin et son nom est stock parmi tous les DSN (Data Source Name) connus du systme. Si la base de donnes X:\MesDonnees\MaBaseAccess.mdb cre prcdemment au moyen de l'objet DAO a t slectionne pour le rglage de cet ODBC TestAccess, alors la chane de connexion DSN=TestAccess; permet l'accs cette base.

09/08/2011

PHR VB.Net VBDB - 8

Le mode connect
La connexion
La connexion une base de donnes se dfinit par la paramtrisation d'un objet Connection livr par un des fournisseurs d'accs disponibles. Il est commode de raliser les Imports adquats, savoir :
Imports System.Data Imports System.Data.Common

et un ou plusieurs des suivants selon la ou les base(s) de donnes utilise(s) :


Imports Imports Imports Imports ' System.Data.Odbc System.Data.OleDb System.Data.SqlClient System.Data.OracleClient
' Pour utiliser un pilote ODBC quelconque

' A tlcharger chez Microsoft (cf. MDAC )

Le programmeur dispose aprs cela de l'objet de Connection dont il a besoin et il peut l'instancier comme ci-dessous. Il est intressant de remarquer que le nom du type de l'objet de connexion rappelle celui de son fournisseur.
Dim Dim Dim Dim ' MaConnexion MaConnexion MaConnexion MaConnexion As As As As New New New New OdbcConnection OleDBConnection SqlConnection OracleConnection

La liaison la base de donnes n'est pas tablie l'instanciation d'un objet Connection. Il faut encore dfinir la proprit ConnectionString de l'objet et invoquer sa mthode Open. La connexion se termine par l'excution de la mthode Close. Par exemple, la base de donnes X:\MesDonnees\MaBaseAccess.mdb cre prcdemment au moyen de l'objet DAO, pour laquelle un pilote ODBC TestAccess a t rgl, peut tre accde par le code suivant :
Dim MaConnexion As New OdbcConnection MaConnexion.ConnectionString = "DSN=TestAccess;" ' Connexion effective MaConnexion.Open() ' Travail sur la base de donnes ' Fermeture de la connexion MaConnexion.Close()

Mais puisqu'il existe un fournisseur OLEDB pour le traitement des bases Access, il est prfrable d'abandonner l'ODBC et de reprogrammer la connexion prcdente comme ceci :
Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" Dim MaConnexion As New OleDBConnection MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" ' Connexion effective MaConnexion.Open() ' Travail sur la base de donnes ' Fermeture de la connexion MaConnexion.Close()

Fonctionnalits de l'objet Connection


Outre la proprit ConnectionString, qui est aussi accessible en lecture, et les mthodes Open et Close, l'objet Connection offre quelques fonctionnalits intressantes. Proprits Toutes les proprits suivantes sont uniquement accessibles en lecture.
ConnectionTimeOut

Dlai maximum autoris pour une tentative de connexion.

09/08/2011

PHR VB.Net VBDB - 9

DataSource Provider State Closed Open

Connecting Executing Fetching Broken

Nom complet de la base de donne. Fournisseur d'accs la base. Etat de la connexion En VB.Net, cette proprit peut livrer une des valeurs suivantes : Valeur 0. La connexion est ferme. Valeur 1. La connexion est ouverte. Dans une version ultrieure, peut-tre, la proprit pourra livrer aussi une ou plusieurs des valeurs suivantes : Valeur 2. La connexion est entrain de se faire. Valeur 4. La connexion est entrain d'excuter une commande. Valeur 8. La connexion est entrain de rcuprer des donnes. Valeur 16. La connexion a t interrompue. Cela ne peut se produire que sur une connexion ouverte. La connexion dans cet tat peut tre ferme et, ventuellement, ouverte nouveau.

Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" Dim MaConnexion As New OleDbConnection MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" Console.WriteLine(MaConnexion.ConnectionString) ' Affichage de la chane complte ' Affichage du contenu de NomDB Console.WriteLine(MaConnexion.DataSource) Console.WriteLine(MaConnexion.Provider) ' Affiche : Microsoft.JET.OLEDB.4.0 Console.WriteLine(MaConnexion.ConnectionTimeout)' Affiche : 15 Console.WriteLine(MaConnexion.State.ToString) ' Affiche : Closed MaConnexion.Open() Console.WriteLine(MaConnexion.State.ToString) ' Affiche : Open MaConnexion.Close() Console.WriteLine(MaConnexion.State.ToString) ' Affiche : Closed

Mthodes
CreateCommand BeginTransaction

Cre un objet Command sur la connexion. Retourne la rfrence de l'objet Transaction associ la connexion. Cet objet fournit les mthodes de validation (Commit) et d'annulation (Rollback) des oprations excutes sur la connexion. Cette mthode accepte un paramtre de type IsolationLevel qui dtermine le niveau de scurit souhait pour la transaction. Voici les valeurs possibles de ce niveau de scurit, aussi appel niveau d'isolation : Chaos Valeur 16. Les modifications en attente, provenant des transactions les plus isoles, ne peuvent pas tre remplaces. ReadCommitted Valeur 4096. Les verrous partags sont conservs pendant la lecture des donnes afin d'viter tout dfaut de lecture, mais les donnes peuvent tre modifies avant la fin de la transaction, entranant ainsi des donnes fantmes ou des lectures qui ne peuvent pas tre rptes. ReadUncommitted Valeur 256. Un dfaut de lecture est possible, ce qui signifie qu'aucun verrou partag n'est mis et qu'aucun verrou exclusif n'est respect. RepeatableRead Valeur 65536. Des verrous sont placs sur toutes les donnes utilises dans une requte afin d'empcher d'autres utilisateurs de mettre jour les donnes. Cette valeur empche les lectures qui ne peuvent pas tre rptes, mais des lignes fantmes peuvent toujours exister. Serializable Valeur 1048576. Un verrou de plage est plac sur DataSet afin d'empcher les autres utilisateurs de mettre jour ou de modifier les lignes du groupe de donnes avant la fin de la transaction. Unspecified Valeur -1. Un niveau d'isolation diffrent de celui spcifi est utilis actuellement, mais il est impossible de le dterminer.

Evnements
StateChange InfoMessage

Est mis chaque changement d'tat de la connexion. Est mis lorsque le systme gestionnaire de la base de donnes envoie un message l'application.

09/08/2011

PHR VB.Net VBDB - 10

' Dclaration globale du module Dim WithEvents MaConnexion As New OleDbConnection Private Sub MaConnexion_StateChange(ByVal sender As Object, ByVal e As System.Data.StateChangeEventArgs) Handles MaConnexion.StateChange Console.WriteLine(e.OriginalState.ToString & " => " & e.CurrentState.ToString) End Sub ' Quelque part, le code de connexion et dconnexion ' ' Changement d'tat MaConnexion.Open() ' Travail sur la base de donnes ' Changement d'tat MaConnexion.Close()

Pendant l'excution de ce code, la procdure vnementielle MaConnexion_StateChange est sollicite deux fois et affiche successivement :
Closed => Open Open => Closed

L'objet Command
L'objet Command cr par la mthode CreateCommand d'un objet Connection est indispensable au travail avec une base de donnes. C'est par ses proprits et ses mthodes que sont dfinis, puis transmis, les ordres que le programmeur souhaite faire excuter sur la base. Proprits
CommandType Text TableDirect StoredProcedure CommandText CommandTimeOut Connection Transaction

La commande peut tre de trois types prciser : Le texte de la commande doit tre un ordre SQL. Le texte de la commande doit tre le nom d'une table de la base. Le texte de la commande doit tre le nom d'une procdure stocke dans la base. Chane de caractres contenant la commande conformment ce qui est stipul dans la proprit CommandType. Dlai maximum autoris pour l'excution de la commande. Connexion sur laquelle doit s'excuter la commande. C'est la connexion qui l'a cre ou une autre du mme fournisseur d'accs. Objet Transaction de la connexion qui doit contrler cette commande.

Mthodes Annule la commande qui vient d'tre excute. Excute une commande qui n'est pas une requte de slection. Excute une commande qui est une requte ne retournant qu'une seule valeur. Le lancement d'une requte de slection par cette mthode retourne la valeur de la premire colonne de la premire ligne trouve par cette requte. ExecuteReader Excute une commande qui est une requte de slection et retourne le rsultat dans un objet DataReader. Cette mthode peut recevoir un paramtre qui modifie son comportement comme, par exemple : CommandBehavior.CloseConnection Provoque la fermeture de la connexion la fin de la commande de slection. CommandBehavior.SingleRow Le DataReader reoit seulement la premire ligne du jeu d'enregistrements. CommandBehavior.SchemaOnly Le DataReader reoit seulement les noms des champs.
Cancel ExecuteNonQuery ExecuteScalar

09/08/2011

PHR VB.Net VBDB - 11

Exemple
Imports System.Data.OleDb Module UnModule Public Function CreationDBAccess(ByVal NomComplet As String) As Boolean ' Code de cette fonction dj crit prcdemment End Function Sub Main() Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" ' Instanciation d'un objet Connection Dim MaConnexion As New OleDbConnection ' Instanciation d'un objet Command Dim MaCommande As New OleDbCommand ' Vecteur de chanes pour 5 noms Dim TLocalePers(4) As String Dim i As Integer ' Stockage des noms dans le vecteur TLocalePers(0) = "Azerty" ' TLocalePers(1) = "Qwerty" ' TLocalePers(2) = "Panzani" ' TLocalePers(3) = "Ranzani" ' TLocalePers(4) = "Barety" ' Cration d'une base Access If Not CreationDBAccess(NomDB) Then End MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" ' Connexion effective via fournisseur OLEDB MaConnexion.Open() ' Affiche : Open Console.WriteLine(MaConnexion.State.ToString) ' Cration effective de Command MaCommande = MaConnexion.CreateCommand() MaCommande.CommandType = CommandType.Text ' Dsignation du type de commande MaCommande.CommandText = "CREATE TABLE TPers (IdPers Int, Nom Text (40) )" ' La commande CREATE TABLE n'est pas une MaCommande.ExecuteNonQuery() For i = 0 To 4 ' requte. La commande INSERT non plus. MaCommande.CommandText = "INSERT INTO TPers (IdPers, Nom) VALUES (" & i + 1 & ", '" & TLocalePers(i) & "')" ' Stockage des valeurs du vecteur dans TPers MaCommande.ExecuteNonQuery() Next MaCommande.CommandText = "SELECT COUNT(*) FROM TPers" ' La requte SELECT COUNT retourne UNE valeur i = MaCommande.ExecuteScalar() ' Affiche : 5 enregistrement(s) Console.WriteLine(i & " enregistrement(s)") ' Dclaration d'un objet DataReader Dim MesPersonnes As OleDbDataReader MaCommande.CommandText = "SELECT * FROM TPers" MesPersonnes = MaCommande.ExecuteReader() ' La requte SELECT * retourne DES valeurs ' qui sont stockes dans l'objet DataReader Do While MesPersonnes.Read Console.WriteLine(MesPersonnes.Item(0) & " " & MesPersonnes.Item(1)) ' Le DataReader est parcouru ligne par ligne Loop MesPersonnes.Close() ' par la mthode Read et chaque Item contient MaConnexion.Close() ' la valeur du champ dsign par l'indice ' Affiche : Closed Console.WriteLine(MaConnexion.State.ToString) End Sub End Module

L'objet DataReader
Comme le montre clairement l'exemple prcdent, l'objet DataReader reoit un jeu d'enregistrements livr par la mthode ExecuteReader de l'objet Command. La dfinition du type de DataReader est dpendant du fournisseur d'accs choisi et, comme pour l'objet Connection et l'objet Command, le nom de son type rappelle celui de son fournisseur. Attention, le jeu d'enregistrements est livr en lecture seule et ne peut tre parcouru que du dbut vers la fin. Un DataReader doit tre ferm (mthode Close) avant que puisse tre excute une autre commande ExecuteNonQuery, ExecuteScalar ou ExecuteReader. Proprits
FieldCount HasRows Item(i)

Nombre de colonnes d'un enregistrement. Contient False si le DataReader ne contient aucune ligne, sinon True. Contenu du champ dsign par l'indice i de sa colonne dans la ligne de 0 FieldCount - 1.

09/08/2011

PHR VB.Net VBDB - 12

Mthodes
Read NextResult

GetValue(i) GetName(i) Item(i).GetType

Positionne sur l'enregistrement suivant du DataReader et retourne True tant qu'il y a encore des enregistrements disponibles. Passe au jeu d'enregistrements suivant du DataReader et retourne True tant qu'il y a des jeux d'enregistrements disponibles. Cette mthode permet la lecture de jeux d'enregistrements issus d'une batterie de slections. Ce mode de slections, qui permet plusieurs slections en une seule connexion la base, n'est pas accept par tous les SGBD : Access ne l'accepte pas, SQL Server l'accepte. Retourne le contenu du champ dsign par l'indice i de sa colonne dans la ligne, de 0 FieldCount - 1. Retourne le nom du champ dsign par l'indice i de sa colonne dans la ligne, de 0 FieldCount - 1. Retourne le type du champ dsign par l'indice i de sa colonne dans la ligne, de 0 FieldCount - 1.

Exemples Sur base de l'exemple prcdent :


' Dim MesPersonnes As OleDbDataReader MaCommande.CommandText = "SELECT * FROM TPers" MesPersonnes = MaCommande.ExecuteReader() ' Affiche : 2 Console.WriteLine(MesPersonnes.FieldCount) ' Affiche : True Console.WriteLine(MesPersonnes.HasRows.ToString) If MesPersonnes.Read() Then ' Affichage des noms des champs d'indice 0 et 1 : IdPers Nom Console.WriteLine(MesPersonnes.GetName(0) & " " & MesPersonnes.GetName(1)) ' Affichage des types de valeurs des champs d'indice 0 et 1 : Int32 String Console.WriteLine(MesPersonnes.Item(0).GetType.ToString & " " & MesPersonnes.Item(1).GetType.ToString) ' Affichage des contenus des champs d'indice 0 et 1 de la ligne courante : 1 Azerty Console.WriteLine(MesPersonnes.GetValue(0) & " " & MesPersonnes.GetValue(1)) End If ' Positionnement la ligne suivante et affichage des contenus des champs Do While (MesPersonnes.Read()) Console.WriteLine(MesPersonnes.GetValue(0) & " " & MesPersonnes.GetValue(1)) Loop MesPersonnes.Close() MaConnexion.Close() '

Reprogrammation de l'exemple complet prcdent pour SQL Server :


Imports System.Data.SqlClient Module MonModule Sub Main() Dim MaConnexion As New SqlConnection Dim MaCommande As New SqlCommand Dim MesPersonnes As SqlDataReader Dim TLocalePers(4) As String Dim i As Integer TLocalePers(0) = "Azerty" TLocalePers(1) = "Qwerty" TLocalePers(2) = "Panzani" TLocalePers(3) = "Ranzani" TLocalePers(4) = "Barety"

' ' ' '

Instanciation d'un objet Connection Instanciation d'un objet Command Dclaration d'un objet DataReader Vecteur de chanes pour 5 noms

' Stockage des noms dans le vecteur ' ' ' ' ' Chane de connexion pour MaBaseSQL gre par mon serveur SQL MonServeur

MaConnexion.ConnectionString = "Data Source=MonServeur; Initial Catalog=MaBaseSQL;Integrated Security=True;" ' Connexion effective via fournisseur SQL MaConnexion.Open() ' Cration effective de Command MaCommande = MaConnexion.CreateCommand() MaCommande.CommandType = CommandType.Text ' Dsignation du type de commande

09/08/2011

PHR VB.Net VBDB - 13

MaCommande.CommandText = "CREATE TABLE TPers (IdPers Int, Nom Text (40))" ' La commande CREATE TABLE n'est pas une MaCommande.ExecuteNonQuery() For i = 0 To 4 ' requte. La commande INSERT non plus. MaCommande.CommandText = "INSERT INTO TPers (IdPers, Nom) VALUES (" & i + 1 & ", '" & TLocalePers(i) & "')" ' Stockage des valeurs du vecteur dans TPers MaCommande.ExecuteNonQuery() Next
' Batterie de deux slections : les requtes SELECT sont concatnes (point virgule ncessaire)

MaCommande.CommandText = "SELECT * FROM TPers;" & "SELECT * FROM TPers WHERE (IdPers > 2);" MesPersonnes = MaCommande.ExecuteReader() Do ' Balayage des diffrents jeux de rsultats ' Balayage des lignes d'un jeu Do While (MesPersonnes.Read()) Console.WriteLine(MesPersonnes.GetValue(0) & " " & MesPersonnes.GetValue(1)) Loop ' Passage au jeu de rultats suivant Loop Until Not MesPersonnes.NextResult MesPersonnes.Close() MaConnexion.Close() End Sub End Module

L'objet Transaction
La transaction est un mcanisme fondamental du travail sur les bases de donnes qui est utilis pour prserver l'intgrit des donnes lorsqu'il faut mettre jour des enregistrements dans une ou plusieurs tables en ayant la certitude que les modifications sont effectues (entrines) ou annules (rvoques) dans toutes les tables. Le principe dutilisation est le suivant : Initier la transaction (BeginTransaction) Tant quil y a des enregistrements mettre jour et quil ne survient pas derreur Mettre jour lenregistrement Passer au suivant Si une erreur survient Rvoquer les mises jour (RollBack) Sinon Entriner les mises jour (Commit) Exemple
' Dim MaTransaction As OleDbTransaction ' Dclaration d'un objet Transaction Dim Reussite As Boolean = True MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" MaConnexion.Open() ' Dmarrage d'une transaction MaTransaction = MaConnexion.BeginTransaction MaCommande = MaConnexion.CreateCommand() MaCommande.CommandType = CommandType.Text ' Affectation de la transaction MaCommande.Transaction = MaTransaction Try For i = 0 To 4 MaCommande.CommandText = "INSERT INTO TPers (IdPers, Nom) VALUES (" & i + 1 & ", '" & TLocalePers(i) & "')" MaCommande.ExecuteNonQuery() Next ' Entrine les transactions MaTransaction.Commit() Catch ex As Exception ' Rvoque les transactions MaTransaction.Rollback() Reussite = False Finally Console.WriteLine("Transaction termine. Russite = " & Reussite.ToString) End Try '

09/08/2011

PHR VB.Net VBDB - 14

Connexion polyvalente
Il est relativement ais d'offrir une application, la possibilit de travailler avec divers types de base de donnes. Il convient toutefois que les fonctionnalits utilises soient compatibles avec ces bases. L'exemple suivant illustre le plus simple moyen de traiter indiffremment une base Access, ou SQL Server, ou Oracle. Mais ce niveau de simplicit, il n'est pas possible d'excuter une batterie de slections car une telle tentative sur une base Access gnre une erreur lors de l'excution. La simplicit du procd provient de l'usage d'Interface (IDbConnection, IDbCommand, IDataReader, IDbTransaction) implments dans les outils (Connection, Command, DataReader, Transaction) de chaque fournisseur d'accs.
Imports System.Data.Odbc Imports System.Data.OleDb Imports System.Data.SqlClient Imports System.Data.OracleClient ' Dim MaConnexion As IDbConnection Dim MaCommande As IDbCommand Dim MaTransaction As IDbTransaction Dim MesPersonnes As IDataReader Dim Reussite As Boolean = True Dim TypeDB As Integer Console.Write("Type de base (1, 2, 3 ou 4) ? ") TypeDB = Console.ReadLine() Select Case TypeDB Case 1 ' ODBC MaConnexion = New OdbcConnection MaCommande = New OdbcCommand MaConnexion.ConnectionString = "DSN=TestAccess;" Case 2 ' OLEDB Access MaConnexion = New OleDbConnection MaCommande = New OleDbCommand Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0; Data Source=" & NomDB & ";" Case 3 ' SQL Server MaConnexion = New SqlConnection MaCommande = New SqlCommand MaConnexion.ConnectionString = "Data Source=MonServeur; Initial Catalog=MaBaseSQL;Integrated Security=True;" Case 4 ' Oracle MaConnexion = New OracleConnection MaCommande = New OracleCommand ' MaConnexion.ConnectionString = End Select Dim TLocalePers(4) As String Dim i As Integer TLocalePers(0) = "Azerty" ' MaConnexion.Open() MaTransaction = MaConnexion.BeginTransaction() MaCommande = MaConnexion.CreateCommand() MaCommande.CommandType = CommandType.Text MaCommande.Transaction = MaTransaction Try For i = 0 To 4 MaCommande.CommandText = "INSERT INTO TPers (IdPers, Nom) VALUES (" & i + 1 & ", '" & TLocalePers(i) & "')" MaCommande.ExecuteNonQuery() Next MaTransaction.Commit() Catch ex As Exception '

09/08/2011

PHR VB.Net VBDB - 15

Obtention de la chane de connexion


Dans les exemples prcdents, plusieurs chanes de connexion ont t dfinies. Chacune possde un format dpendant du fournisseur d'accs utilis et un contenu reprsentant une base de donnes particulire sur un SGBD donn. Il est vident que la cration d'une chane de connexion est une mission impossible sans une documentation adquate. Or cette documentation fait souvent dfaut Mais Visual Studio offre un assistant de connexion une source de donnes qui est capable de crer la chane idale pour une connexion envisage. Ds lors, la meilleure mthode d'laboration d'une chane de connexion consiste raliser une connexion avec cet assistant et rcuprer la chane souhaite dans les proprits de la connexion. Il suffit d'un copier-coller pour placer la chane ainsi produite dans le code. L'assistant de connexion une source de donnes est accessible par l'explorateur de serveurs (menu Affichage/Explorateur de serveurs) qui prsente la fentre ci contre. Le menu contextuel obtenu partir du libell Connexions de donnes propose l'ajout d'une connexion et mme la cration d'une base SQL Server. L'ajout d'une connexion ouvre l'assistant.

Le menu contextuel obtenu partir du libell d'une connexion propose des fonctionnalits qui diffrent selon le fournisseur d'accs de la connexion, ainsi que d'autres toujours prsentes, dont notamment Proprits qui fournit la chane de connexion convoite.

L'explorateur de serveurs permet aussi de visualiser les objets des bases de donnes connectes et d'en obtenir les proprits. Il offre galement un assistant de mise au point des requtes SQL. C'est la proposition Nouvelle requte du menu contextuel ci-dessus qui ouvre cet assistant.

09/08/2011

PHR VB.Net VBDB - 16

Le mode dconnect
Seul l'essentiel du mode dconnect est abord dans ces pages. Le lecteur dsireux d'approfondir les techniques de ce mode et d'tudier les outils non expos ici, tels que CommandBuilder, DataView ou encore le mappage des donnes, peut se rfrer la documentation de son Visual Studio et aux pages du site de MicroSoft qui concernent l'espace de noms System.Data.

La connexion en lecture
L'objet DataAdapter
Comme pour le mode connect, c'est la paramtrisation d'un objet Connection livr par un des fournisseurs d'accs disponibles qui permet l'accs une base de donnes choisie. Mais cet objet n'est pas utilis explicitement comme dans le mode connect. Une fois sa chane de connexion dfinie, il est pass en paramtre un DataAdapter qui se charge de la gestion des connexions et des liaisons avec la base de donnes via ses mthodes. De nombreux objets, tels que DataSet, DataTable ou encore DataRelation, sont utiles au travail en mode dconnect. Les deux premiers, DataSet et DataTable, sont directement lis au DataAdapter et il n'est gure possible d'illustrer l'usage de ce dernier sans intgrer les deux autres.

Deux mthodes de lecture


Fill FillSchema

Lecture de donnes pour le remplissage d'un DataSet ou d'un DataTable. Lecture des informations de schma pour leur affectation un DataSet ou un DataTable.

Les objets DataSet et DataTable


Le DataSet est une reprsentation en mmoire d'une base de donnes relationnelle complte et cohrente, comprenant les tables avec leurs contraintes et relations. Le DataSet est indpendant de toute source de donnes et, mme quand il est la copie d'une base relle, les manipulations ralises sur ses donnes ne sont pas rpercutes dans la base d'origine, sauf commande explicite de mise jour. Le DataTable est une table du DataSet. Il contient les colonnes avec leurs noms, proprits et donnes. Un DataTable peut tre construit de toutes pices ou tre la rplique d'une table existant dans une base relle. Proprit du DataSet
DataSetName HasChanges Relations Tables

Nom du DataSet. Retourne True si le DataSet contient des tables dont les enregistrements ont t modifis, supprims, ajouts. Collection des relations tablies entre les tables du DataSet. Collection des DataTable du DataSet.

Proprit du DataSet et du DataTable


CaseSensitive

Indique si les comparaisons de chanes doivent tenir compte de la casse.

Proprits du DataTable
TableName Columns Rows MinimumCapacity PrimaryKey Constraints ChildRelations ParentRelations

Nom du DataTable. Collection des colonnes de la table. Une colonne est un objet DataColumns. Collection des lignes de la table. Une ligne est un objet DataRow. Taille initiale pour les enregistrements. Tableau de colonnes faisant partie de la cl primaire. Collection des contraintes de la table. Collection des relations enfants. Collection des relations parents.

09/08/2011

PHR VB.Net VBDB - 17

Mthodes du DataSet et du DataTable


AcceptChanges RejectChanges GetChanges Clear Clone Copy Reset

Valide toutes les modifications effectues. Refuse toutes les modifications effectues depuis le dernier appel AcceptChanges. Retourne une copie de toutes les modifications effectues depuis le dernier appel AcceptChanges. Efface toutes les donnes. Copie de la structure sans copier les donnes. Copie de la structure et des donnes. Efface les donnes et les noms des champs, ne conserve que les noms des tables.

Usage simple du DataSet Pour les exemples suivants, une table des localits TLoc compose de IdLoc et Localite a t ajoute la base de donnes X:\MesDonnees\MaBaseAccess.mdb prcdemment utilise pour illustrer le mode connect. La procdure AfficheDonnees ci-dessous permet l'affichage des noms et contenus de tous les champs de la premire table d'un DataSet. Elle sera complte plus tard pour permettre le balayage de toutes les tables du DataSet.
Private Sub AfficheDonnees(ByVal DTS As DataSet) ' Affichage des noms des colonnes For Each C As DataColumn In DTS.Tables(0).Columns Console.Write(C.ColumnName & " ") Next ' Balayage des lignes de la table et affichage du contenu de chaque colonne For Each R As DataRow In DTS.Tables(0).Rows Console.WriteLine() For Each C As DataColumn In DTS.Tables(0).Columns Console.Write(R.Item(C.ColumnName) & " ") Next Next Console.WriteLine() End Sub ' Dim MaConnexion As New OleDbConnection Dim MaConnexionTmp As OleDbDataAdapter Dim MesDonnees As New DataSet Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" ' La connexion est ralise par la mthode Fill de l'objet DataAdapter qui reoit en ' paramtres la chane de slection et la connexion utiliser MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TPers", MaConnexion) ' La mthode Fill ouvre la connexion, remplit le DataSet et ferme la connexion ' La table d'indice 0 est cre dans le DataSet ' La mthode Fill ne fournit pas le nom de la table MaConnexionTmp.Fill(MesDonnees) ' Affichage des donnes AfficheDonnees(MesDonnees) ' Pour obtenir une autre lecture de la base, il faut excuter la mthode Reset du DataSet, ' faute de quoi son contenu reste inchang MesDonnees.Reset() MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TLoc", MaConnexion) MaConnexionTmp.Fill(MesDonnees) ' Affichage des donnes AfficheDonnees(MesDonnees)

La solution adopte dans l'exemple ci-dessus pour permettre la lecture et l'affichage des donnes de la table TLoc n'est gure satisfaisante dans la mesure o les donnes de la table TPers ont t perdues. Le DataSet contient une collection Tables qui ne contient qu'une seule table par dfaut. Mais cette collection propose une mthode Add bien utile.

09/08/2011

PHR VB.Net VBDB - 18

C'est ainsi qu'au lieu de faire un Reset du DataSet pour lire les localits, il est possible d'ajouter une table et de conserver ensuite les donnes de TPers en mme temps que celles de TLoc. Il suffit d'utiliser la table d'indice 0 ou celle d'indice 1 selon les donnes souhaites.
' ' MesDonnees.Reset() ' Inutile maintenant MesDonnees.Tables.Add() ' Ou bien : .Add("TLocalites") MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TLoc", MaConnexion) ' Si la table ajoute est nomme, son nom est disponible et il peut remplacer son indice ' Console.WriteLine(MesDonnees.Tables(1).TableName) ' Ou bien : .Tables("TLocalites") MaConnexionTmp.Fill(MesDonnees.Tables(1)) ' Affichage des donnes AfficheDonnees(MesDonnees)

Comme illustr en commentaires dans l'exemple ci-dessus, une table du DataSet peut tre nomme la cration, mais elle peut aussi tre nomme et renomme par la suite :
MesDonnees.Tables(0).TableName = "TPersonnes"

Usage simple du DataTable Dans le cadre d'une application aussi simple que celle de l'exemple prcdent, il n'y a pas de diffrence l'usage entre le DataSet et le DataTable, sauf la possibilit de constituer le DataSet par l'ajout de DataTable. Cette possibilit facilite la reconstitution fidle en mmoire de tables existantes.
Dim MaConnexion As New OleDbConnection Dim MaConnexionTmp As OleDbDataAdapter Dim UneTable As New DataTable Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TPers", MaConnexion) ' La mthode FillSchema ne rcupre pas les donnes MaConnexionTmp.FillSchema(UneTable, SchemaType.Source) ' Affichage du nom de la table Console.WriteLine(UneTable.TableName) ' Affichage des noms des colonnes For Each C As DataColumn In UneTable.Columns Console.Write(C.ColumnName & " ") Next Console.WriteLine() ' Affichage des types de donnes For Each C As DataColumn In UneTable.Columns Console.Write(C.DataType.ToString & " ") Next Console.WriteLine() ' Rcupration des donnes MaConnexionTmp.Fill(UneTable) ' Balayage des lignes de la table et affichage du contenu de chaque colonne For Each R As DataRow In UneTable.Rows For Each C As DataColumn In UneTable.Columns Console.Write(R.Item(C.ColumnName) & " ") Next Console.WriteLine() Next

L'exemple suivant illustre la constitution d'un DataSet par la lecture de deux tables d'une base existante et l'affichage de toutes les informations ainsi regroupes. C'est l'occasion d'amliorer la procdure AfficheDonnees crite prcdemment.
Private Sub AfficheDonnees(ByVal DTS As DataSet) For Each T As DataTable In DTS.Tables Console.WriteLine(T.TableName) For Each C As DataColumn In T.Columns Console.Write(C.DataType.ToString & " ") Next

' Affichage du nom de la table ' Affichage des types de champs

09/08/2011

PHR VB.Net VBDB - 19

Console.WriteLine() For Each C As DataColumn In T.Columns Console.Write(C.ColumnName & " ") Next For Each R As DataRow In T.Rows If R.RowState <> DataRowState.Deleted then Console.WriteLine() For Each C As DataColumn In T.Columns Console.Write(R.Item(C.ColumnName) & " Next End If Next Console.WriteLine() Next End Sub

' Affichage des noms de champs

' ' ' ") '

La tentative d'accs une ligne supprime provoque une erreur Affichage du contenu

' Dim MaConnexion As New OleDbConnection Dim MaConnexionTmp As OleDbDataAdapter Dim MesDonnees As New DataSet Dim UneTable As DataTable Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" ' Rcupration de la table TPers MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TPers", MaConnexion) UneTable = New DataTable MaConnexionTmp.FillSchema(UneTable, SchemaType.Source) MaConnexionTmp.Fill(UneTable) MesDonnees.Tables.Add(UneTable) ' Rcupration de la table TLoc MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TLoc", MaConnexion) UneTable = New DataTable MaConnexionTmp.FillSchema(UneTable, SchemaType.Source) MaConnexionTmp.Fill(UneTable) MesDonnees.Tables.Add(UneTable) ' Balayage de toutes les tables du DataSet AfficheDonnees(MesDonnees)

Cration d'une base de donnes en mmoire


Le mode dconnect peut effectivement tre utile au traitement en mmoire de lots d'informations provenant d'une base de donnes relle. La cration d'une base de donnes en mmoire, autrement que par la lecture d'une base relle, est une technique d'usage exceptionnel qu'il n'est pas opportun d'approfondir dans ce cours. C'est pourquoi elle n'est prsente ci aprs que sous la forme d'un exemple. Pour cet exemple, la base prcdemment utilise va tre recre et amliore. La table des personnes, nomme TPers, est constitue des champs IdPers, NomPers et XIdLoc, ce dernier tant une copie de la cl de l'identifiant de la localit de la personne. La table des localits, nomme TLoc, est constitue des champs IdLoc et Localite. Une relation Domicile lie les tables TPers et TLoc et une localit ne peut tre supprime de la base tant qu'une personne y habite. La base de donnes est contenue dans un DataSet nomm MesDonnees. Aucun Imports autre que System.Data n'est ncessaire tant que la programmation ne concerne que la base en mmoire. La procdure AfficheDonnees dj crite prcdemment est utilise chaque fois qu'un affichage de tout le DataSet est souhait.

09/08/2011

PHR VB.Net VBDB - 20

Afin de permettre des exprimentations successives sans rptition d'une fastidieuse phase d'encodage, une procdure EncodeJeuDeTest est crite ci aprs. Les enregistrements y sont dfinis dans des tableaux en mmoire et sont transfrs dans les tables de la base donnes lors de l'excution de la procdure.
Private Sub EncodeJeuDeTest(ByRef DTS As DataSet) ' Uniquement pour tests Dim i As Integer ' Vecteur de chanes pour 5 personnes Dim TLocalePers(4) As String ' Vecteur de chanes pour 5 localits Dim TLocaleLoc(4) As String Dim TLocaleDom(4, 1) As Integer ' Matrice des relations Personnes - Localits ' Stockage des Personnes dans le vecteur TLocalePers(0) = "Azerty" TLocalePers(1) = "Qwerty" TLocalePers(2) = "Panzani" TLocalePers(3) = "Ranzani" TLocalePers(4) = "Barety" ' Stockage des Localits dans le vecteur TLocaleLoc(0) = "Loc 1" TLocaleLoc(1) = "Loc 2" TLocaleLoc(2) = "Loc 3" TLocaleLoc(3) = "Loc 4" TLocaleLoc(4) = "Loc 5" ' Associations Personnes - Localit ' Azerty TLocaleDom(0, 0) = 0 ' Loc 4 TLocaleDom(0, 1) = 3 ' Qwerty TLocaleDom(1, 0) = 1 ' Loc 1 TLocaleDom(1, 1) = 0 ' Panzani TLocaleDom(2, 0) = 2 ' Loc 2 TLocaleDom(2, 1) = 1 ' Ranzani TLocaleDom(3, 0) = 3 ' Loc 1 TLocaleDom(3, 1) = 0 ' Barety TLocaleDom(4, 0) = 4 ' Loc 4 TLocaleDom(4, 1) = 3 ' Insertion des localits dans la base For i = 0 To 4 DTS.Tables("TLoc").Rows.Add(i) DTS.Tables("TLoc").Rows(i).Item("Localite") = TLocaleLoc(i) Next ' Insertion des personnes dans la base For i = 0 To 4 DTS.Tables("TPers").Rows.Add(i) DTS.Tables("TPers").Rows(i).Item("NomPers") = TLocalePers(TLocaleDom(i, 0)) DTS.Tables("TPers").Rows(i).Item("XIdLoc") = TLocaleDom(i, 1) Next End Sub ' ' Cration de la base de donnes en mmoire ' Instanciation d'un DataSet nomm MesDonnees (c'est aussi le nom sa rfrence) Dim MesDonnees As New DataSet("MesDonnees") ' Cration d'un DataTable nomm TPers (c'est aussi le nom sa rfrence) Dim TPers As New DataTable("TPers") ' Rglage du DataTable TPers.CaseSensitive = False TPers.MinimumCapacity = 10 ' Cration d'un DataColumn nomm IdPers Dim IdPers As New DataColumn("IdPers", GetType(Integer)) ' Rglage de la colonne IdPers IdPers.AutoIncrement = True GetType fournit un objet Type pour le type spcifi. Cet objet ' Ajout de la colonne IdPers la table TPers contient des informations sur le TPers.Columns.Add(IdPers) type telles que ses proprits, TPers.PrimaryKey = New DataColumn() {IdPers} mthodes et vnements.

09/08/2011

PHR VB.Net VBDB - 21

' Cration d'un DataColumn nomm NomPers Dim NomPers As New DataColumn("NomPers", GetType(String)) ' Rglage de la colonne NomPers NomPers.Unique = True NomPers.MaxLength = 50 ' Ajout de la colonne NomPers la table TPers TPers.Columns.Add(NomPers) ' Cration d'un DataColumn nomm XIdLoc Dim XIdLoc As New DataColumn("XIdLoc", GetType(Integer)) ' Rglage de la colonne XIdLoc XIdLoc.AutoIncrement = False XIdLoc.Unique = False XIdLoc.DefaultValue = 0 ' Ajout de la colonne XIdloc la table TPers TPers.Columns.Add(XIdLoc) ' Ajout de la table TPers la base MesDonnees MesDonnees.Tables.Add(TPers) ' Cration d'un DataTable nomm TLoc (c'est aussi le nom sa rfrence) Dim TLoc As New DataTable("TLoc") ' Rglage du DataTable TLoc.CaseSensitive = False TLoc.MinimumCapacity = 10 ' Cration d'un DataColumn nomm IdLoc Dim IdLoc As New DataColumn("IdLoc", GetType(Integer)) ' Rglage de la colonne IdLoc IdLoc.AutoIncrement = True ' Ajout de la colonne IdLoc la table TLoc TLoc.Columns.Add(IdLoc) TLoc.PrimaryKey = New DataColumn() {IdLoc} ' Cration d'un DataColumn nomm Localite Dim Localite As New DataColumn("Localite", GetType(String)) ' Rglage de la colonne Localite Localite.Unique = True Localite.MaxLength = 40 ' Ajout de la colonne Localite la table TLoc TLoc.Columns.Add(Localite) ' Ajout de la table TLoc la base MesDonnees MesDonnees.Tables.Add(TLoc) ' Cration d'une relation Domicile entre TPers et TLoc Dim Domicile As New DataRelation("Domicile", _ MesDonnees.Tables("TLoc").Columns("IdLoc"), _ MesDonnees.Tables("TPers").Columns("XIdLoc")) ' Ajout de la relation Domicile la base MesDonnees MesDonnees.Relations.Add(Domicile) ' Ajout de la contrainte d'intgrit : ne pas supprimer la ligne, ni modifier la cl Dim Contrainte As ForeignKeyConstraint = Domicile.ChildKeyConstraint Contrainte.DeleteRule = Rule.None ' Aucune action sur les lignes lies Contrainte.UpdateRule = Rule.None ' Autres valeurs : EncodeJeuDeTest(MesDonnees) AfficheDonnees(MesDonnees)
' ' ' ' Cascade : rpercute laction en cascade SetNull : place DBNull dans les lignes lies SetDefault : place la valeur stipule par la proprit DefaultValue du DataColumn

09/08/2011

PHR VB.Net VBDB - 22

Les deux dernires tches ralises ci-dessus, l'tablissement des relations et la dfinition des contraintes, sont utiles programmer pour tablir au niveau d'un DataSet une scurit quivalente celle qui existe dans une base de donnes relle.

Sauvegarde de la base mmoire dans une base Access


Les oprations ncessaires la sauvegarde de la base mmoire dans une base de donnes relle relvent essentiellement des possibilits offertes par le mode connect. Il faut d'abord procder la cration des tables, de leurs relations et contraintes, ensuite il faut y insrer toutes les donnes obtenues par le balayage de toutes les lignes de chaque table. Dans l'exemple suivant, ces oprations sont ralises dans une procdure CreeDBAccessEtStockeDataSet qui reoit par paramtres, le nom complet de la base Access crer et la rfrence du DataSet enregistrer.
' la suite de l'exemple prcdent Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" CreeDBAccessEtStockeDataSet(NomDB, MesDonnees) Private Function CreationDBAccess(ByVal NomComplet As String) As Boolean ' Code de cette fonction dj crit prcdemment End Function Private Sub CreeDBAccessEtStockeDataSet(ByVal NomComplet As String, ByVal DTS As DataSet) Dim MaConnexion As New OleDbConnection Dim MaCommande As New OleDbCommand CreationDBAccess(NomComplet) MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomComplet & ";" MaConnexion.Open() MaCommande.CommandType = CommandType.Text MaCommande.Connection = MaConnexion MaCommande.CommandText = "CREATE TABLE TPers (IdPers Int, NomPers Text (40), XIdLoc Int )" MaCommande.ExecuteNonQuery() MaCommande.CommandText = "CREATE TABLE TLoc (IdLoc Int, Localite Text (35))" MaCommande.ExecuteNonQuery() MaCommande.CommandText = "ALTER TABLE TPers ADD PRIMARY KEY (IdPers)" MaCommande.ExecuteNonQuery() MaCommande.CommandText = "ALTER TABLE TLoc ADD PRIMARY KEY (IdLoc)" MaCommande.ExecuteNonQuery() MaCommande.CommandText = "ALTER TABLE TPers ADD FOREIGN KEY (XIdLoc) REFERENCES TLoc (IdLoc)" MaCommande.ExecuteNonQuery() For Each R As DataRow In DTS.Tables("TLoc").Rows ' La tentative d'accs une If R.RowState <> DataRowState.Deleted then
' ligne supprime provoque une ' erreur

MaCommande.CommandText = "INSERT INTO TLoc (IdLoc, Localite) VALUES (" & R.Item("IdLoc").ToString & ", '" & R.Item("Localite").ToString & "')" MaCommande.ExecuteNonQuery() End If Next For Each R As DataRow In DTS.Tables("TPers").Rows If R.RowState <> DataRowState.Deleted then MaCommande.CommandText = "INSERT INTO TPers (IdPers, NomPers, XIdLoc) VALUES (" & R.Item("IdPers").ToString & ", '" & R.Item("NomPers").ToString & "', " & R.Item("XIdLoc").ToString & ")" MaCommande.ExecuteNonQuery() End If Next MaConnexion.Close() End Sub

09/08/2011

PHR VB.Net VBDB - 23

Utilisation des relations et contraintes d'intgrit


Pour illustrer l'effet des relations et des contraintes d'intgrits, un DataSet est cr par lecture de la base de donnes issue de l'exemple prcdent, par l'utilisation du code dj tudi et repris ici pour mmoire.
Dim MaConnexion As New OleDbConnection Dim MaConnexionTmp As OleDbDataAdapter Dim MesDonnees As New DataSet Dim UneTable As DataTable Dim NomDB As String = "X:\MesDonnees\MaBaseAccess.mdb" MaConnexion.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomDB & ";" ' Rcupration de la table TLoc (TLoc avant TPers car table "parent") MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TLoc", MaConnexion) UneTable = New DataTable MaConnexionTmp.FillSchema(UneTable, SchemaType.Source) MaConnexionTmp.Fill(UneTable) MesDonnees.Tables.Add(UneTable) ' Rcupration de la table TPers (TPers aprs TLoc car table "enfant") MaConnexionTmp = New OleDbDataAdapter("SELECT * FROM TPers", MaConnexion) UneTable = New DataTable MaConnexionTmp.FillSchema(UneTable, SchemaType.Source) MaConnexionTmp.Fill(UneTable) MesDonnees.Tables.Add(UneTable)

Lectures des donnes


Lecture linaire La lecture linaire est celle qui consiste lire les donnes d'une table la fois. C'est la lecture ralise par la procdure AffichesDonnees crite prcdemment. Cette procdure parcourt tout le DataSet qui lui est pass par paramtre, affiche des informations sur les tables et leurs champs et pour chacune, affiche tout son contenu. Lectures hirarchiques La lecture hirarchique est celle qui consiste lire les donnes en fonction des relations qui existent entre les tables. Alors qu'une lecture linaire de la table TPers de l'exemple prcdent donne l'identifiant de chaque personne, son nom et l'identifiant de sa localit, une lecture hirarchique de cette mme table en fonction de la relation qui lie TPers TLoc donne galement l'identifiant et le nom de chaque personne, mais pour la localit, c'est son libell qui est fourni. Il y a deux sortes de lectures hirarchiques : la lecture de la relation "parent" et la lecture de la relation "enfant". La lecture de la relation "parent" est celle qui consiste rechercher dans une autre table le parent d'un enregistrement de la table lue, c'est--dire rechercher l'enregistrement dsign par la cl trangre. Lors de la lecture de la table TPers, la lecture de la relation "parent" consiste lire TPers et pour chacun de ses XIdLoc, rechercher le IdLoc correspondant dans TLoc. Elle consiste dire o habite la personne. Il s'agit de la lecture ordinaire d'une relation. Inversement, la lecture de la relation "enfant" est celle qui consiste rechercher dans une autre table tous les enfants d'un enregistrement de la table lue, c'est--dire rechercher tous les enregistrements dont la cl trangre est une copie de l'identifiant de l'enregistrement en cours. Dans le cas de la relation entre TPers et TLoc, la lecture de la relation "enfant" consiste lire TLoc et pour chacun de ses IdLoc, rechercher tous les XIdLoc correspondant dans TPers. Elle consiste numrer tous les habitants d'une localit. La rcupration des donnes par le code ci-dessus ne restitue pas les relations existant dans la base de donnes. C'est une lacune du fournisseur d'accs et cela peut tre diffrent avec d'autres, comme SQL Server par exemple. Il faut donc rcrer les relations ncessaires compte tenu des tables rcupres et du travail raliser. Il n'y qu'une seule relation tablir dans le cadre de cet exemple et le code ncessaire est identique celui utilis lors de la cration de la base en mmoire. Il suffit de le placer la suite du code prcdent.
Dim Domicile As New DataRelation("Domicile", _ MesDonnees.Tables("TLoc").Columns("IdLoc"), _ MesDonnees.Tables("TPers").Columns("XIdLoc")) MesDonnees.Relations.Add(Domicile)

09/08/2011

PHR VB.Net VBDB - 24

Affichage des donnes par lecture de la relation "parent".


Affichages :

For Each R As DataRow In MesDonnees.Tables("TPers").Rows If R.RowState <> DataRowState.Deleted then Console.WriteLine(R.Item("IdPers") & " " & _ R.Item("NomPers") & " " & _ R.GetParentRow("Domicile").Item("Localite")) End If Next

0 1 2 3 4

Azerty Loc 4 Qwerty Loc 1 Panzani Loc 2 Ranzani Loc 1 Barety Loc 4

Affichage des donnes par lecture de la relation "enfant".


For Each R As DataRow In MesDonnees.Tables("TLoc").Rows If R.RowState <> DataRowState.Deleted then Console.WriteLine(R.Item("Localite")) For Each Habitant As DataRow In R.GetChildRows("Domicile") Console.WriteLine(" " & Habitant.Item("NomPers")) Next End If Next

Affichages : Loc 1 Qwerty Ranzani Loc 2 Panzani Loc 3 Loc 4 Azerty Barety Loc 5

Les contraintes d'intgrits


De mme que les relations, les contraintes d'intgrits ne sont pas restitues (faute au fournisseur d'accs) par le code de rcupration de la base de donnes et il faut galement les redfinir au niveau du DataSet. Ici aussi le code ajouter est identique celui utilis lors de la cration de la base en mmoire et il suffit de le placer la suite du code prcdent.
Dim Contrainte As ForeignKeyConstraint = Domicile.ChildKeyConstraint Contrainte.DeleteRule = Rule.None Contrainte.UpdateRule = Rule.None

Quelques cas La suppression de l'enregistrement de la localit Loc 3 est permise car cette localit n'est pas habite. Mais une tentative de suppression de la localit Loc 2 gnrerait une exception car cela produirait une ligne orpheline dans la table TPers.
For Each R As DataRow In MesDonnees.Tables("TLoc").Rows If R.RowState <> DataRowState.Deleted then If R.Item("Localite") = "Loc 3" Then R.Delete() Exit For End If End If Next AfficheDonnees(MesDonnees)

La modification du libell d'une localit est toujours permise car la contrainte ne concerne que les cls. Par contre, la modification de l'identifiant d'une localit habite produirait aussi des lignes orphelines dans la table TPers.
For Each R As DataRow In MesDonnees.Tables("TLoc").Rows If R.RowState <> DataRowState.Deleted then If R.Item("Localite") = "Loc 4" Then R.Item("Localite") = "Loc 4 bis" Exit For End If End If Next AfficheDonnees(MesDonnees)

A propos des modifications de donnes, la programmation suivante est meilleure. L'usage de la mthode BeginEdit permet galement l'usage de EndEdit et de CancelEdit et donc, de pouvoir confirmer ou annuler une modification.

09/08/2011

PHR VB.Net VBDB - 25

For Each R As DataRow In MesDonnees.Tables("TLoc").Rows If R.RowState <> DataRowState.Deleted then If R.Item("Localite") = "Loc 4" Then R.BeginEdit() R.Item("Localite") = "Loc 4 bis" Console.Write("Confirmation de la modification (O/N) ? ") If Console.ReadLine().ToUpper = "O" Then R.EndEdit() Else R.CancelEdit() End If End If End If Next AfficheDonnees(MesDonnees)

L'ajout d'une personne impose que le champ XIdLoc reoive une valeur et il faut que cette valeur existe. La contrainte sur la cl trangre de TPers impose que l'identifiant correspondant existe dans TLoc.
With MesDonnees.Tables("TPers") .Rows.Add(MesDonnees.Tables("TPers").Rows.Count) Console.Write("Nom de la personne ajouter ? ") .Rows(MesDonnees.Tables("TPers").Rows.Count - 1).Item("NomPers") = Console.ReadLine() Console.Write("Localit de la personne (IdLoc) ? ") .Rows(MesDonnees.Tables("TPers").Rows.Count - 1).Item("XIdLoc") = CType(Console.ReadLine(), Integer) End With AfficheDonnees(MesDonnees)

Mise jour de la base source et gestion des conflits


La mise jour de la base de donnes source se ralise par la mthode UpDate de l'objet DataAdapter. La mthode UpDate excute une commande SQL adapte la mise jour envisage et rfrence selon le cas, dans une des proprits InsertCommand, DeleteCommand ou UpdateCommand du DataAdapter. La commande SQL contient des inconnues, reprsentes par des points d'interrogations, qui sont remplaces en cours d'excution par les valeurs utiles de chaque enregistrement traiter grce une collection de paramtres pralablement dfinis. Cette commande traite tout un lot de lignes du DataSet en une fois et retourne le nombre d'enregistrements rellement affects dans la base de donnes. Cette valeur de retour est sans conteste le plus simple moyen de savoir si des oprations ont t refuses par le systme de gestion de la base de donnes. Cela se produit quand une opration tente d'agir sur la base en infractions de ses rgles d'intgrit, lorsqu'il y a conflit. Bien que toutes les contraintes d'intgrits soient respectes dans la base de donnes relle et que chaque application qui traite en DataSet des extraits de cette base redfinisse les contraintes ncessaires la bonne gestion de ses donnes, les conflits peuvent survenir la mise jour et ils ont toujours la mme origine. Ils sont dus l'utilisation de la base de donnes source par d'autres applications entre le moment o se termine le chargement de la base en mmoire et le moment o se fait la mise jour. Ce partage de la base de donnes entre plusieurs applications en mode dconnect n'implique pas obligatoirement la survenance de conflits lors de la mise jour, mais runit toutes les conditions qui leurs sont favorables. Un conflit se produit par exemple, lors d'une mise jour pour modification d'une donne qui a t supprime depuis le chargement, ou lors de la tentative d'insertion d'une donne "enfant" alors que la donne "parent" ncessaire a t supprime, ou encore lors de la tentative de suppression d'un enregistrement qui l'a dj t par ailleurs. Toute base de donnes gre par une application est susceptible d'tre galement manipule dans le mme temps par une autre, ne serait-ce que par une autre instance de la mme application, ou encore par le systme gestionnaire de la base (le logiciel Access pour une base de ce type, par exemple). La programmation de la mise jour d'une base relle partir d'un DataSet doit donc imprativement intgrer des traitements appropris ou tout au moins, recenser les enregistrements rejets et en informer l'utilisateur. C'est pourquoi dans l'exemple suivant, qui peut tre expriment la suite de ce qui a dj t fait, la gestion des enregistrements rejets n'est pas dissocie de la mise jour elle-mme.

09/08/2011

PHR VB.Net VBDB - 26

If MesDonnees.GetChanges() Is Nothing Then Console.WriteLine("Aucun changement") Else MaConnexionTmp.ContinueUpdateOnError = True Dim Dim Dim Dim Dim MaCommande As OleDbCommand Param As OleDbParameter MesModifs As DataTable LignesATraiter As Integer LignesTraitees As Integer

' Pas de mise jour ncessaire s'il ' n'y a eu aucune modification des ' donnes initialement lues. ' ' ' ' La proprit ContinueUpDateOnError du DataAdapter est fixe True afin que la mise jour ne soit pas interrompue ds le premier rejet.

' Mise jour : Ajout des localits (TLoc avant TPers car table "parent") ' Constitution d'un DataTable contenant tous les enregistrements dont le RowState est ' "Ajout". C'est la mthode GetChanges(DataRowState.Added) qui fournit ce DataTable. MesModifs = MesDonnees.Tables("TLoc").GetChanges(DataRowState.Added) ' Si le DataTable est vide, il n'y a donc pas d'enregistrement ajouter. ' Dans le cas contraire, le nombre de lignes traiter est mmoris. If Not MesModifs Is Nothing Then LignesATraiter = MesModifs.Rows.Count ' Ecriture de la commande d'ajout avec des ? pour les valeurs inconnues. MaCommande = New OleDbCommand("INSERT INTO TLoc (IdLoc, Localite) VALUES (?, ?)", MaConnexion) ' ' ' '
Un paramtre se dfinit par de nombreuses proprits, mais la seule indispensable ici est le nom du champ qu'il reprsente. Une boucle For Each est utilisable quand l'ordre et nombre d'inconnues correspondent l'ordre et au nombre de colonnes du DataTable. Chaque paramtre doit tre ajout la collection Parameters de la commande.

For Each C As DataColumn In MesModifs.Columns Param = New OleDbParameter Param.SourceColumn = C.ColumnName MaCommande.Parameters.Add(Param) Next ' Quand la commande est crite et ses paramtres dfinis, il faut l'affecter la ' proprit adquate (InsertCommand dans ce cas) du DataAdapter. MaConnexionTmp.InsertCommand = MaCommande ' Il n'y plus qu' ordonner la mise jour et mmoriser le nombre de lignes traites. LignesTraitees = MaConnexionTmp.Update(MesModifs) ' Traitement des rejets (Affichage) ' S'il y a moins de lignes traites qu'il y en avait traiter, c'est qu'il y a eu des ' rejets. Il faut parcourir le DataSet pour les retrouver et les traiter. If LignesTraitees < LignesATraiter Then For Each R As DataRow In MesModifs.Rows ' Toute ligne correctement mise jour reoit la valeur Unchanged pour sa proprit ' RowState. If R.RowState <> DataRowState.Unchanged Then Console.WriteLine(R.Item(0) & " " & R.Item(1) & " non ajout") End If Next End If MesModifs.Reset() End If

09/08/2011

PHR VB.Net VBDB - 27

' La mme squence d'oprations est rpter pour chaque table et pour chaque type de ' mise jour. ' Mise jour : Ajout des personnes (TPers aprs TLoc car table "enfant") MesModifs = MesDonnees.Tables("TPers").GetChanges(DataRowState.Added) If Not MesModifs Is Nothing Then LignesATraiter = MesModifs.Rows.Count MaCommande = New OleDbCommand("INSERT INTO TPers (IdPers, NomPers, XIdLoc) VALUES (?, ?, ?)", MaConnexion) For Each C As DataColumn In MesModifs.Columns Param = New OleDbParameter Param.SourceColumn = C.ColumnName MaCommande.Parameters.Add(Param) Next MaConnexionTmp.InsertCommand = MaCommande LignesTraitees = MaConnexionTmp.Update(MesModifs) ' Traitement des rejets (Affichage) If LignesTraitees < LignesATraiter Then For Each R As DataRow In MesModifs.Rows If R.RowState <> DataRowState.Unchanged Then Console.WriteLine(R.Item(0) & " " & R.Item(1) & " End If Next End If MesModifs.Reset() End If ' Mise jour : Suppression des localits MesModifs = MesDonnees.Tables("TLoc").GetChanges(DataRowState.Deleted) If Not MesModifs Is Nothing Then LignesATraiter = MesModifs.Rows.Count MaCommande = New OleDbCommand("DELETE FROM TLOC WHERE (IdLoc = ?)", MaConnexion) Param = New OleDbParameter Param.SourceColumn = "IdLoc" MaCommande.Parameters.Add(Param) MaConnexionTmp.DeleteCommand = MaCommande LignesTraitees = MaConnexionTmp.Update(MesModifs) ' Traitement des rejets (Affichage) If LignesTraitees < LignesATraiter Then ' Dans le cas des suppressions refuses, il faut d'abord annuler l'opration pour ' pouvoir afficher les informations. For Each R As DataRow In MesModifs.Rows If R.RowState <> DataRowState.Unchanged Then R.RejectChanges() Console.WriteLine(R.Item(0) & " " & R.Item(1) & " non supprim") End If Next End If MesModifs.Reset() End If ' Mise jour : Suppression des personnes MesModifs = MesDonnees.Tables("TPers").GetChanges(DataRowState.Deleted) If Not MesModifs Is Nothing Then LignesATraiter = MesModifs.Rows.Count MaCommande = New OleDbCommand("DELETE FROM TPers WHERE (IdPers = ?)", MaConnexion)

" & R.Item(2) & " non ajout")

09/08/2011

PHR VB.Net VBDB - 28

Param = New OleDbParameter Param.SourceColumn = "IdPers" MaCommande.Parameters.Add(Param) MaConnexionTmp.DeleteCommand = MaCommande LignesTraitees = MaConnexionTmp.Update(MesModifs) ' Traitement des rejets (Affichage) If LignesTraitees < LignesATraiter Then For Each R As DataRow In MesModifs.Rows If R.RowState <> DataRowState.Unchanged Then R.RejectChanges() Console.WriteLine(R.Item(0) & " " & R.Item(1) & " End If Next End If MesModifs.Reset() End If ' Mise jour : Modification des localits MesModifs = MesDonnees.Tables("TLoc").GetChanges(DataRowState.Modified) If Not MesModifs Is Nothing Then LignesATraiter = MesModifs.Rows.Count MaCommande = New OleDbCommand("UPDATE TLOC SET Localite = ? WHERE (IdLoc = ?)", MaConnexion) Param = New OleDbParameter Param.SourceColumn = "Localite" MaCommande.Parameters.Add(Param) Param = New OleDbParameter Param.SourceColumn = "IdLoc" MaCommande.Parameters.Add(Param) MaConnexionTmp.UpdateCommand = MaCommande LignesTraitees = MaConnexionTmp.Update(MesModifs) ' Traitement des rejets (Affichage) If LignesTraitees < LignesATraiter Then For Each R As DataRow In MesModifs.Rows If R.RowState <> DataRowState.Unchanged Then Console.WriteLine(R.Item(0) & " " & R.Item(1) & " non modifi") End If Next End If MesModifs.Reset() End If ' Mise jour : Modification des personnes MesModifs = MesDonnees.Tables("TPers").GetChanges(DataRowState.Modified) If Not MesModifs Is Nothing Then LignesATraiter = MesModifs.Rows.Count MaCommande = New OleDbCommand("UPDATE TPers SET NomPers = ?, XIdLoc = ? WHERE (IdPers = ?)", MaConnexion) Param = New OleDbParameter Param.SourceColumn = "NomPers" MaCommande.Parameters.Add(Param) Param = New OleDbParameter Param.SourceColumn = "XIdLoc" MaCommande.Parameters.Add(Param) Param = New OleDbParameter Param.SourceColumn = "IdPers" MaCommande.Parameters.Add(Param) MaConnexionTmp.UpdateCommand = MaCommande LignesTraitees = MaConnexionTmp.Update(MesModifs)

" & R.Item(2) & " non supprim")

09/08/2011

PHR VB.Net VBDB - 29

' Traitement des rejets (Affichage) If LignesTraitees < LignesATraiter Then For Each R As DataRow In MesModifs.Rows If R.RowState <> DataRowState.Unchanged Then Console.WriteLine(R.Item(0) & " " & R.Item(1) & " End If Next End If MesModifs.Reset() End If ' Le meilleur moyen de rtablir un DataSet cohrent avec la base de donnes ' aprs mise jour est de le recharger MesDonnees.Reset() ' rappeler le code de chargement du DataSet et redfinir les relations et ' contraintes d'intgrit si ncessaire End If '

" & R.Item(2) & " non modifi")

Bases de donnes et composants visuels


Toutes les exprimentations ralises jusqu' prsent sur les bases de donnes l'ont t en mode Console, mais de nombreuses applications requirent l'interface graphique de Windows. Il s'agit donc prsent de s'intresser aux outils qu'offre la programmation visuelle.

La liaison une base de donnes


Lorsqu'une application est charge et ses donnes initialises, c'est le plus souvent pour permettre de longues consultations d'informations et les modifications de la base de donnes ne reprsentent qu'une petite part du temps de fonctionnement. C'est pourquoi, autant que possible, la recherche des informations et leur prsentation l'cran se feront idalement en mode dconnect, tandis que les actions sur base de donnes se feront en mode connect et au fur et mesure des modifications et ajouts demands par l'utilisateur. Le mode dconnect permet l'obtention d'un lot important d'informations en une seule connexion la base et rduit ainsi le nombre d'accs et surtout, de connexions. Le mode connect pour la mise jour en temps rel vite les lots de rejets, les enregistrements errons tant dtects immdiatement. Ce sont donc les outils de liaisons aux bases de donnes Connection, Command, DataReader et DataAdapter qui sont utiliss en programmation Windows comme en programmation Console.

La prsentation des donnes


Les composants visuels qui permettent l'affichage d'informations sont nombreux et la faon d'y placer les donnes a t tudie prcdemment. Dans les pages suivantes, l'essentiel de la prsentation des donnes se ralise par l'usage des composants de base TextBox, ListBox et ComboBox, avec l'aide de certaines de leurs fonctionnalits ignores jusqu'ici. Deux autres outils, le DataGridView et le CrystalReport sont abords la fin de cette partie du cours. Aucune nouvelle fonctionnalit n'est ncessaire pour remplir un ListBox partir d'un DataReader : il suffit d'ajouter l'information ligne par ligne dans le ListBox au fur et mesure qu'elle est obtenue du DataReader.
Dim MaConnexion As New OleDbConnection Dim MaCommande As New OleDbCommand Dim MesPersonnes As OleDbDataReader ' MaCommande.CommandText = "SELECT * FROM TPers" MesPersonnes = MaCommande.ExecuteReader() ' Balayage du DataReader MesPersonnes Do While MesPersonnes.Read LBPersonnes.Items.Add(MesPersonnes.Item(1)) ' et