Vous êtes sur la page 1sur 352

VisualBasic.

NET
(VB.NET)

ThierryGROUSSARD

Rsum
Ce livre sur VB.Net sadresse aux dveloppeurs, mme dbutants, dsireux de matriser Visual Basic.NET. Aprs une description de lenvironnement de dveloppement (Visual Studio 2008), le lecteur dcouvrira les bases de la programmation oriente objet avec VB.NET. Il voluera de faon progressive vers sa mise en uvre avec le dveloppement dapplications Windows Form. Les nombreux exemples et les conseils sur lutilisation des outils de dbogage lui fourniront une aide prcieuse pendant la ralisation dune application. Un chapitre consacr laccs aux bases de donnes laide de ADO.NET 2.0 et de SQL permettra dvoluer vers le dveloppement dapplications client-serveur. Les puissantes fonctionnalits de LINQ sont prsentes et dtailles pour faciliter laccs et la manipulation des donnes. Le langage XML est galement prsent permettant ainsi de faciliter lchange dinformations avec dautres applications. Les utilisateurs des versions prcdentes dcouvriront les nouveauts et amliorations de cette version 2008 (types nullables, mthodes partielles, classes anonymes, ...) leur permettant de dvelopper encore plus rapidement et facilement des applications pour le framework .NET 3.5 et pour Windows Vista. La distribution dune application est prsente avec lutilisation de Windows Installer et de la technologie Click Once. Les exemples cits dans le livre sont en tlchargement sur cette page.

L'auteur
Analyste et dveloppeur pendant plus de 10 ans, Thierry Groussard sest ensuite orient vers la formation, et plus particulirement dans le domaine du dveloppement. Sa connaissance approfondie des besoins de lentreprise et ses qualits pdagogiques rendent cet ouvrage particulirement adapt lapprentissage et la mise en pratique du dveloppement sous VB.NET 2008.
Ce livre numrique a t conu et est diffus dans le respect des droits dauteur. Toutes les marques cites ont t dposes par leur diteur respectif. La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41, dune part, que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective, et, dautre part, que les analyses et les courtes citations dans un but dexemple et dillustration, toute reprsentation ou reproduction intgrale, ou partielle, faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause, est illicite (alina 1er de larticle 40). Cette reprsentation ou reproduction, par quelque procd que ce soit, constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal. Copyright Editions ENI

ENI Editions - All rigths reserved

- 1-

Introduction
Laplateforme.NETfournitunensembledetechnologiesetdoutilsfacilitantledveloppementdapplicationsetpropose unesolutionpourpratiquementtouslestypesdapplications :
q

applicationsWindowsclassiques applicationWeb servicesWindows servicesWeb.

Touscestypesdapplicationssontralisablesgrceunlmentessentiel : leFramework.NET.CeFrameworkprenden charge, par lintermdiaire de nombreuses couches logicielles superposes, lintgralit de la vie dune application, du dveloppement jusqu lexcution. Le framework doit tre hberg par un systme dexploitation avec lequel il va interagir. Le premier systme permettant de laccueillir est bien sr Windows mais dautres versions sont disponibles permettantladaptationdelaplateforme.NETdessystmestelsLinuxouUnix.

Leframeworkcontientdeuxlmentsprincipaux : leCommonLanguageRuntimeetlabibliothquedeclassesdu.NET Framework. Le Common Language Runtime est la base du .NET Framework. Le runtime peut tre considr comme un moteur dexcutionquigrelexcutionducodeetassuregalementlagestiondelammoire.Lecodeprisenchargeparle CommonlanguageRuntimeestappelcodemanag. La bibliothque de classes est un ensemble de classes pouvant tre utilis pour le dveloppement de tout type dapplication.Nouslemanipuleronstoutaulongdecetouvrage.

1.PrincipedefonctionnementduCommonLanguageRuntime
DanslesapplicationsWindowstraditionnelles,lesystmeprenddirectementenchargelexcutionducode.Eneffet, celuiciestgnrparlecompilateurassociaulangagedeprogrammationutilispourlaconceptiondelapplication. Lersultatdecettecompilationcorrespondunfichierbinairecontenantlecodespcifiquepourlemicroprocesseuret le systme dexploitation avec lesquels lapplication doit fonctionner. Aucune compatibilit avec un autre type de microprocesseur ou systme dexploitation nest possible. Pour sen convaincre, il suffit de tenter lexcution dune applicationprvuepourWindowssurunsystmeLinuxpourvrifiercetteincompatibilit.Silontentelexcutionsur unestationdetravailSUN,quiutiliseuntypedemicroprocesseurradicalementdiffrent,lersultatestidentique.La solution pour saffranchirdecesproblmesconsistegnrerlacompilation,nonpasuncodespcifique,maisun code gnrique, indpendant de toute plateforme logicielle ou matrielle. Ce code est, au moment de lexcution, confi une machine virtuelle qui en assure lexcution. Ce code sappelle Microsoft Intermediate Language (MSIL). Lorsdelexcutiondelapplication,cecodeestprisenchargeparlamachinevirtuellequienassurelatraductionen
ENI Editions - All rigths reserved - 1-

instructions spcifiques pour le microprocesseur de la machine. Cette traduction nest pas effectue, en bloc ds le dbutdelapplication,maisuniquementaufuretmesuredesbesoins.Eneffet,pourquoiperdredutempstraduire ducodeMSIL,silnestjamaisutilisparlasuite.Cestpourcetteraisonquelecompilateurutilispourcettetraduction sappellecompilateurJustInTime(JIT). Les avantages de cette solution sont vidents car pour excuter une mme application sur plusieurs platesformes matrielles et ou logicielles, il suffit dobtenir la machine virtuelle capable deffectuer la traduction. Cette machine virtuelleestdisponiblepourtouslessystmesMicrosoft.LeprojetMonoproposeuneversiondelamachinevirtuelle pourlesplatesformessuivantes :
q

Linux MacOSX SunSolaris BSDOpenBSD,FreeBSD,NetBSD

Ellessontdisponiblesentlchargementsurlesitehttp://www.monoproject.com Leschmasuivantreprendlensembledecesoprations :

2.LesservicesduCommonLanguageRuntime
Lamachinevirtuellenesecontentepasdeffectuerlatraductionducode.LecodeMSILestaussiappelcodemanag, ce qui sousentend quun certain nombre doprations supplmentaires seront ralises sur le code au moment de lexcution.LafigureciaprsreprendlensembledesfonctionnalitsdisponiblesdansleCommonLanguageRuntime.

ClassLoader Ilgrelechargementenmmoiredesinstancesdeclasses.

- 2-

ENI Editions - All rigths reserved

ILToNativeCompilers Ilconvertitlecodeintermdiaire(MSIL)encodenatif. CodeManager Ilgrelexcutionducode. GarbageCollector Ilassurelagestiondelammoireensurveillantlesinstancesdeclassesquinesontplusaccessibles. SecurityEngine Ilpermetlavrificationdelidentitdelapersonnedemandantlexcutionducodeetaccepteounoncetteexcution, enfonctiondesautorisationsaccordes. DebugEngine Ilpermetledbogagedelapplication,enprenantenchargeparexemplelexcutionenpaspasducode. TypeChecker Ilsurveillelutilisationdevariablesnoninitialisesetlesconversionsentredesvariablesdetypediffrent. ExceptionManager Il fournit la gestion structure des exceptions en liaison avec Windows Structured Exception Handling (SEH). Cette techniquepermetunegestionindividuelledechaqueexceptionpluttquunegestionglobale. ThreadSupport Ilproposeunensembledeclassespermettantlaralisationdapplicationsmultithread. COMMarshaler Il permet de traduire des appels vers des composants COM, assurant par exemple la conversion des types de donnes. BaseClassLibrarySupport Ilfournitlaccsauxservicesdisponiblessurlesystmedexploitationhte.

3.LaBaseClassLibrary
LeFramework.NETmetladispositiondesdveloppeursunensembledoutilsluipermettantdobtenir une solution rapideunemajoritdeproblmesrencontrslorsdelaralisationduneapplication. Cesoutilssontdisponiblessousformedeclasses.linversedesbibliothquesdecodedeslangagesdelagnration prcdente, qui ntaient quune liste interminable de procdures ou fonctions, la bibliothque de classes est organise sous forme dune structure hirarchise. Llment essentiel de cette hirarchisation est lespace de nom (Namespace).Ilpermetleregroupementlogiquedeclassesayantdespointscommuns.Parexemple,onretrouvedans lenamespaceSystem.Datatouteslesclassesutilisablespouraccderunebasededonnes. Cettebibliothquedeclassesestbiensrindpendantedunquelconquelangagedeprogrammation.Ellepermetdonc le mlange de diffrents langages au cours du dveloppement dune application. Elle est galement parfaitement intgreVisualStudio,cequinousprocureunconfortdutilisationapprciableavecdesoutilscommeIntelissence. Commecettelibrairieestorienteobjet,elleestfacilementextensibleparlebiaisderelationsdhritage. Labibliothquecontientunequantitimpressionnantedespacesdenometdeclasse,tantetsibienque,aucoursde vosdveloppementsavecVisualBasic,ilyadeforteschancespourquevousnutilisiezjamaiscertainsdentreeux. Lesespacesdenomslesplusutilisssontlessuivants : System

ENI Editions - All rigths reserved

- 3-

CestlespacedenomracinepourlestypesdedonnesdansleFramework.NET.Ilcontientnotammentladfinitionde laclasseObject,quiestlanctredetouslestypesdedonnesduFramework.NET. System.Windows IlcontientlensembledeslmentspermettantlacrationdinterfacesutilisateursWindows. System.Web IlcontienttouteslesressourcesncessairespourlacrationdapplicationsWeb,avecparexemple,lesclassesdela technologieASP.NEToulesclassesutilisablespourlacrationdeservicesWebXML. System.data Ilcontientunensembledeclassesspcialisesdanslaccsauxbasesdedonnes,aveclesupportdeADO.NET. System.Xml Le langage Xml est devenu omniprsent et cet espace de nom contient les classes assurant la manipulation de documentsXml.

4.Lesversionsetvolutionsdelaplateforme.NET
La premire version (1.0) de la plateforme .NET sort en janvier 2002 avec Visual Studio 2002. Cette version est rapidementremplaceparlaversion1.1quicorrigequelquespetitsproblmesdejeunessedelaversionprcdente et ajoute des technologies qui ntaient auparavant disponibles quen tant quinstallations indpendantes et sont dsormaisincluses.Lesapportsdecetteversionsontprincipalement :
q

LesContrlesmobilesASP.NET(anciennementMicrosoftMobileInternetToolkit)quitendentleFramework.NET par la prise en charge des priphriques mobiles (sans fil) tels que tlphones portables et assistants numriquespersonnels. Le fournisseur de donnes .NET Framework pour ODBC et le fournisseur de donnes pour Oracle qui auparavantntaientdisponiblesquepartlchargement,sontdsormaislivrsavecle.NETFramework. LapriseenchargedelanouvellemisejourduprotocoleInternetcourammentappeleIPversion 6ouplus simplement IPv6. Ce protocole est conu pour augmenter sensiblement lespace dadressage qui est utilis pouridentifierlespointsdentredecommunicationdInternet.

Elleestdisponibleaveclaversion2003deVisualStudioenavril2003. Ilfautattendrenovembre2005pourvoirarriverlaversion2.0associelasortiedeVisualStudio 2005.Cetteversion apportedenombreusesamliorations :


q

La prise en charge de la nouvelle gnration dordinateurs 64 bits permettant la cration dapplicationsplus performantes. UnevolutionmajeuredanslaccsauxbasesdedonnesavecADO.NET2.0amliorantlutilisationdeXML. LedveloppementdapplicationsWebestgalementdeplusenplusfacileaveclanouvelleversiondeASP.NET proposantunemultitudedenouveauxcontrles. LutilisationdelaclasseConsoleestoptimiseaveclajoutdenouvellespropritsetmthodes(gestiondes couleurs,effacement,positionducurseur). Le.NETFramework2.0rintroduitlafonctionnalitModifier&Continuerpermettantlutilisateurquidbogue uneapplicationdansVisualStudiodemodifierlecodesourceenmodearrt.Unefoislesmodificationsducode sourceappliques,lutilisateurpeutreprendrelexcutionducodeetobserverleffet. Lapparition de la notion de gnrique qui permet aux classes, structures, interfaces, mthodes et dlgus dtredclarsetdfinisavecdesparamtresdetypenonspcifiougnriqueaulieudetypesspcifiques. Lestypesrelssontspcifisultrieurementlorsdelutilisation.
ENI Editions - All rigths reserved

- 4-

Laversion3.0arriveennovembre2006etapportedenouvellestechnologiestoutenrestantlabaseuneversion 2.0.Cestechnologiessontdisponiblessousformedetlchargementsquiviennentsintgrerauframework2.0.Voici unbrefaperudecesnouveauts:


q

WindowsPresentationFoundation(WPF) reprsentelenouveausystmedinterfacesgraphiques.Ilsebasesur unmoteurderenduvectorieletpermetunesparationplusclaireentreladfinitiondelinterfacegraphique duneapplicationetsoncode.IlutilisepourcelalelangageXAML(eXtensibleApplicationMarkupLanguage).Les tchespeuventainsitreplusfacilementrpartiesentredesignersetdveloppeurs. Windows Communication Foundation (WCF) constitue la nouvelle base de dveloppement dapplications distribues.Ilfacilitelacommunicationentreapplicationsenajoutantunecouchedabstractionuniformisantles techniquesdecommunicationentreapplications(ServicesWeb,.NETRemoting,MicrosoftTransactionServer,et MicrosoftMessageQueuing,). Windows Workflow Foundation (WF) est compos dun modle de programmation, dun moteur dexcution et doutils pour intgrer des workflows dans une application. Un workflow peut tre dfini comme un ensemble dactions ou tapes sexcutant dans un ordre prdfini. Ces actions peuvent senchaner en fonction de conditions,dinteractionsavecdesprocessusinformatiquesouenfonctiondinteractionshumaines. WindowsCardspacefournitunenouvelletechniqueauxutilisateurspoursidentifierdansuneapplication.Ellea lammevocationqueMicrosoftPassportmaisnestpasspcifiqueauxapplicationsMicrosoft(Hotmail,MSDN).

ENI Editions - All rigths reserved

- 5-

criture,compilationetexcutionduneapplication
Danscechapitrenousallonsdtaillerlecycledevieduneapplication,depuislardactionducodejusqulexcutionde lapplication,entudiantendtaillesmcanismesmisen uvre.

1.critureducode
Limmensemajoritdesapplicationssontdveloppesgrceunenvironnementintgrquiregroupelesprincipaux outilsncessaires,savoir :
q

unditeurdetexte uncompilateur undbogueur.

Cette approche est de loin la plus confortable. Elle ncessite cependant une petite phase dapprentissage pour se familiariser avec loutil. Pour notre premire application, nous allons utiliser une dmarche un petit peu diffrente puisquenousallonsutiliserdesoutilsindividuels : leblocnotesdeWindowspourlcritureducodeetlecompilateur enlignedecommandespourVisualBasic. NotrepremireapplicationseratrssimplepuisquelleafficherasimplementlemessageBonjourdansunefentrede commande. Voicilecodedenotrepremireapplicationquenousallonsensuiteexpliquerligneparligne.Ilestsaisirlaidedu blocnotesdeWindowsoudetoutautrediteurdetexte,conditionqueceluicinerajoutepasdecodedemiseen pagelintrieurdudocument,commelefontparexempleleslogicielsdetraitementdetexte. Exemple Imports System public Module test dim message as string="bonjour" public sub main () console.writeline(message) end sub end module Ce code est sauvegarder dans un fichier portant lextension .vb. Cette extension nest pas obligatoire, mais elle permet de respecter les conventions utilises par Visual Studio. Dtaillons maintenant les quelques lignes de notre premireapplication. Imports System CettelignepermetderendredirectementaccessiblesleslmentsprsentsdanslenamespaceSystem.Sanselle,il faudrait utiliser les noms pleinement qualifis pour tous les lments contenus dans le namespace. Dans notre cas, nousdevrionsalorsutiliser :System.Console.writeline("Bonjour") public Module test ... end module DansVisualBasic,touteportiondecodedoittrecontenuedansunmoduleouuneclasse. dim message as string="bonjour" Cette ligne dclare une variable. Toutes les variables doivent tre dclares avant de pouvoir tre utilises. La dclaration permet de spcifier le type dinformation que la variable va contenir, ici une chane de caractres, et ventuellementunevaleurinitiale,bonjourdansnotrecas. public sub Main() ... end sub Toutes les instructions autres que des dclarations doivent tre places dans une procdure ou une fonction. La majeurepartieducodeestdoncplaceentrelesinstructionsSubetEndSubouFunctionetEndFunction.Parmitoutes ces procdures et fonctions, lune dentre elles est dsigne comme le point dentre dans lapplication. Cest par

ENI Editions - All rigths reserved

- 1-

lexcutiondecetteprocdurequedmarrelapplication.CetteprocduredoittrepubliqueetdoitsappelerMain. Console.writeline(Bonjour) La classe Console dfinie dans lespace de nom System fournit un ensemble de mthodes permettant laffichage dinformations sur la console ou la lecture dinformations depuis la console. La procdure writeline permet laffichage dunechanedecaractressurlaconsole. noter galement que Visual Basic ne fait pas de distinction entre les minuscules et les majuscules dans les instructions. Si vous utilisez lditeur de Visual Studio pour rdiger votre code, celuici fera automatiquement les modificationspouruniformiserlorthographedevotrecode.

2.Compilationducode
Le Framework .NET inclut un compilateur en ligne de commande pour Visual Basic. Pour compiler le code source de notre exemple, nous devons ouvrir une fentre de commande DOS pour pouvoir lancer le compilateur. Pour cela, un raccourci a t cr dans le menu dmarrer pendant linstallation. Ce raccourci lance lexcution dun fichier .bat qui positionne certaines variables denvironnement ncessaires pour le bon fonctionnement des outils Visual Studio en lignedecommande.

partirdelafentredecommandeouverte,ilconvientdeseplacerdanslerpertoiredanslequelsetrouvelefichier source. Lacompilationestlanceparlacommandevbc Bonjour.vb. Aprs un bref instant, le compilateur nous rend la main. Nous pouvons vrifier la prsence du fichier excutable et vrifiersonbonfonctionnement.

- 2-

ENI Editions - All rigths reserved

Notre premire application est vraiment trs simple. Pour des applications plus volues, il sera parfois utile de spcifier certaines options pour le fonctionnement du compilateur. Lensemble des options disponibles peut tre obtenuenlanantlacommandevbc / ?. Lesprincipalesoptionssont : /out:fichier.exe Cetteoptionpermetdespcifierlenomdufichierrsultatdelacompilation.Pardfaut,cestlenomdufichiersource encoursdecompilationquiestutilis. /target :exe Cetteoptiondemandeaucompilateurlagnrationdunfichierexcutablepouruneapplicationenmodeconsole. /target :winexe CetteoptiondemandeaucompilateurlagnrationdunfichierexcutabledapplicationWindows. /target :library Cetteoptiondemandeaucompilateurlagnrationdunfichierbibliothquedll. /reference :liste de fichiers Cetteoptionindiqueaucompilateurlalistedesfichiersrfrencsdanslecodeetncessairespourlacompilation.Les nomsdesfichiersdoiventtresparsparunevirgule.

3.Analysedunfichiercompil
Maintenantquenotrefichierexcutableestcr,essayonsdevoircequilcontient. Premiresolution : louvriravecleblocnotesdeWindows

ENI Editions - All rigths reserved

- 3-

Lersultatnestpastrsparlant,cestlemoinsquelonpuissedire! NousavonsditquelecompilateurgnreducodeMSIL.Cestdonccecodequenousvisualisonsdansleblocnotes. PourvisualiserlecontenudunfichierMSIL,leframework.NETproposeunoutilplusadapt. Deuximesolution : utiliserundsassembleur Cetoutilestlancpartirdelalignedecommandeparlinstructionildasm. Il permet de visualiser, de manire plus claire que le blocnotes, un fichier gnr par le compilateur. Il convient dindiquer le fichier que lon souhaite examiner, par le menu Fichier Ouvrir. Le dsassembleur affiche alors son contenu.

Lesinformationsprsentesdanslefichierpeuventtresparesendeuxcatgories : lemanifestetlecodeMSIL.Le
- 4 ENI Editions - All rigths reserved

manifestcontientlesmtadonnespermettantdedcrirelecontenudufichieretlesressourcesdontilabesoin.On parledanscecasdefichierautodescriptif.CettetechniqueesttrsintressantecardsqueleCommonLanguage Runtimelitlefichier,ildisposedetouteslesinformationsncessairespoursonexcution. Ilnyaplusbesoindavoirrecoursunenregistrementdansleregistredelamachine.Lemanifestpeuttrevisualis parundoubleclicsursonnom.

Nous retrouvons dans ce manifest des informations indiquant que, pour que lapplication puisse fonctionner, elle a besoindesassemblagesexternesmscorlib,Microsoft.VisualBasicetSystem. LadeuximepartiecorrespondrellementaucodeMSIL.Unensembledicnesestutilispourfaciliterlavisualisation desinformations. Symbole Plusdinfos Espacedenoms Classe Interface Classedevaleurs Enumration Mthode Mthodestatique Champ Champstatique vnement Signification

ENI Editions - All rigths reserved

- 5-

Proprit lmentdemanifesteoudinfosdeclasse Comme pour le manifest, un double clic sur un lment permet dobtenir plus de dtails. Ainsi, nous pouvons, par exemple,visualiserlatraductiondenotreprocduremain.

Dans un exemple de code aussi simple, il est facile de faire la correspondance entre le code Visual Basic et sa traductionencodeMSIL.PourlespersonnesenthousiasmesparlecodeMSIL,ilexisteunassembleurMSIL : ilasm. CetoutilattendunfichiertextecontenantducodeMSILetletransformeenformatbinaire. PuisquenoussommescapablesdevisualiserlecodeMSIL,nouspouvonsvrifierquilestbienindpendantdulangage source utilis pour dvelopper lapplication. Voici donc le code C# qui ralise la mme chose que notre code Visual Basic. using System; class Program { static String message = "Bonjour"; static void Main(string[] args) { Console.WriteLine(message); } } Aprscompilationetdsassemblageparildasm,voicicequilnousprsentepourlamthodeMain.

IlnyaaucunediffrenceparrapportlaversionVisualBasicdelamthodeMain. Il est galement possible de faire la dmarche inverse en transformant un fichier texte contenant du code MSIL en fichierbinairecorrespondant.Cettetransformationsefaitgrcelassembleurilasm.Laseuledifficultestdecrerun fichier texte contenant le code MSIL car mme si la syntaxe est comprhensible, elle nest pas trs intuitive. Une solutionpeuttrededemanderloutilildasm(ledsassembleur)degnrercefichiertexte.Pourcelaaprs,avoir ouvertlefichierexcutableoulabibliothquedllavecildasm,vousdevezutiliserloptionDumpdumenu Fichier.Vous tesalorsinvitchoisirlenomdufichiergnrer(extension.il).
- 6 ENI Editions - All rigths reserved

Cefichierpeuttreensuitemodifiavecunsimplediteurdetexte.Remplacezparexemplelecontenudelavariable messageaveclachane"Hello". .method private hidebysig specialname rtspecialname static void .cctor() cil managed { // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello" IL_0005: stsfld string Program::message IL_000a: ret } // end of method Program::.cctor Sauvegardez ensuite le fichier. Il ne reste plus maintenant qu regnrer le fichier excutable grce lassembleur ilasm.Saisissezpourcelalalignedecommandesuivante: ilasm Bonjour.il /output=Hello.exe Loption /output=Hellopermetdindiquerlenomdufichiergnr.Sicetteoptionnestpasspcifiecestlenomdu fichier source qui sera utilis. Vous pouvez maintenant lancer le nouvel excutable et vrifier le message affich. Toutescesmanipulationspeuventsefairesurnimportequelfichierexcutableoubibliothquedll.Laseuledifficult rsidedanslevolumedinformationsfourniparladcompilation.Ceciposecependantunproblme : toutepersonne disposant des fichiers excutables ou bibliothques dll dune application peut modifier lapplication. Certes les modifications risquent dtre prilleuses mais la modification dune valeur reprsentant une information importante pourlapplication(motdepasse,cldelicence...)estenvisageable.Uneparadepossiblecegenredemanipulation consiste rendre le code gnr par le dcompilateur le plus incomprhensible possible. Pour cela, il faut agir au niveaudufichierexcutableoudelabibliothquedllenmodifiantlesinformationsquilscontiennentsans,biensr,en perturberlefonctionnement.Desoutilsappelsobfuscateurssontcapablesderalisercetteopration.VisualStudio estfourniavecunoutildelasocitPreEmptiveSolutionsappelDotFuscatorCommunityEdition.Cetteversionpermet deraliserlesoprationsdebasepourembrouillerunfichier.Leprincipaltraitementeffectusurlefichierconsiste renommer les identifiants contenus dans le fichier (nom des variables, nom des procdures et fonctions)avec des valeurstrspeuexplicites,engnraluncaractreunique.VoiciunextraitdeladcompilationdufichierBonjour.exe aprstraitementparDofuscatorCommunityEdition. .class private auto ansi beforefieldinit a extends [mscorlib]System.Object { .field private static string a .method private hidebysig static void a (string[] A_0) cil managed { .entrypoint // Code size 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldsfld string a::a IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret } // end of method a::a .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 7 (0x7) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method a:: .ctor .method private hidebysig specialname rtspecialname static void .cctor() cil managed { // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Bonjour" IL_0005: stsfld string a::a IL_000a: ret

ENI Editions - All rigths reserved

- 7-

} // end of method a:: .cctor } // end of class a Dans ce fichier plus aucune trace des noms utiliss dans le code. La procdure main sappelle maintenant a, la variable message sappelle maintenant a aussi. Imaginez le rsultat dun tel traitement sur un fichier contenant plusieursdizainesdevariablesetprocdures ! LaversionProfessionalEditionpermetgalementlecryptagedeschanesdescaractres,lamodificationetlajoutde codeinutilepourcomplexifierlesstructuresdecontrles(boucles,conditions). CidessousunexempledetransformationextraitdeladocumentationdeDotfuscator. Lecodeoriginal : public int CompareTo(Object o) { int n = occurrences - ((WordOccurrence)o).occurrences; if (n == 0) { n = String.Compare(word, ((WordOccurrence)o).word); } return(n); } Lecodegnr : public virtual int _a(Object A_0) { int local0; int local1; local0 = this.a - (c) A_0.a; if (local0 != 0) goto i0; goto i1; while (true) { return local1; i0: local1 = local0; } i1: local0 = System.String.Compare(this.b, (c) A_0.b); goto i0; } Lanalysedemilliersdelignesdecodedecetyperisquedeprovoquerquelquesmigraines!Ilestdoncprfrablede conserver le code source original pour les modifications ultrieures. Plus dinformations sont disponibles sur le site http://www.preemptive.com/.

4.Excutionducode
Lorsquun utilisateur excute une application manage, le chargeur de code du systme dexploitation charge le CommonLanguageRuntimequiensuitedmarrelexcutionducodemanag.Commeleprocesseurdelamachinesur laquelle sexcute lapplication ne peut pas prendre en charge directement le code MSIL, Le Common Language Runtimedoitleconvertirencodenatif. Cette conversion ne concerne pas la totalit du code au chargement de lapplication. Il convertit le code au fur et mesuredesbesoins.Ladmarcheadopteestlasuivante :
q

Au chargement dune classe, le Common Language Runtime remplace chaque mthode de la classe par un morceaudecodedemandantaucompilateurJITdelecompilerenlangagenatif. Parlasuite,lorsquelamthodeestutilisedanslecode,laportiondecodegnreauchargemententreen actionetcompileencodenatiflamthode. Lemorceaudecodedemandantlacompilationdelamthodeestensuiteremplacparlecodenatifgnr. Lesfutursappelsdecettemthodeseferontdirectementsurlecodenatifgnr.

- 8-

ENI Editions - All rigths reserved

volutiondeVisualBasic1VisualBasic.NET2008
Depuis la version 1.0, sortie en 1991, jusqu la version 6.0, sortie en 1998, Visual Basic a subi de nombreuses volutions. Visual Basic fut conu lorigine comme un langage simple permettant de dvelopper rapidement une applicationsousWindows(commelepermettaitGWBASICsousMSDOS).Cettesimplicitdutilisationreposeengrande partiesurlenvironnementdedveloppement,quimasquelestchesfastidieusesdelacrationduneapplicationsous Windows. Delaversion1.0laversion3.0,onnassisteaucunervolutiondansVBmaisdesvolutionsclassiquespourun langagedeprogrammation. Aveclapparitiondelaversion4.0en1996,VBentredanslacourdesgrandsavecunemultitudedvolutions:
q

possibilitdecrerdesapplications32bits(lapriseenchargedesapplications16bitstaitencoreassure) crationdeDLLpartirdeVB utilisationdeDLL(critesenVBoutoutautrelangage) apparitiondefonctionnalitsobjetdansVB(utilisationdeclasses).

Malgroupeuttrecausedetoutescesvolutions,laversion4.0deVBntaitpastrsstable. Trsrapidement,en1997,Microsoftsortlaversion5.0deVisualBasicquinamnepasdegrandesvolutionssicenest ladisparitiondesapplications16bits. Lesvolutionsdelaversion6.0,quisortunanplustard,portentessentiellementsurlamthodedaccsauxbasesde donnes,avecleremplacementdeDAO(DataAccessObject)desversionsprcdentesparADO( ActiveDataObject),qui devientdailleurslamthodecommuneauxlangagesMicrosoftpourlaccsauxdonnes. Cetteversiondevratoutefoisattendreleservicepack4pourpermettreunfonctionnementcorrectdecertainscontrles daccsauxdonnes(leDataEnvironment). Bien qutant gnre en code natif par la compilation, une application VB a toujours besoin du module runtime pour pouvoirsexcutersurunemachine(vbrun.dll)car,contrairementdeslangagescommeC++,VBnutilisepaslinterface deprogrammationWIN32pourappelerlesfonctionsdusystmedexploitation. Laversionsuivantequisorten2002apportedeschangementsradicauxdansVisualBasic.Cetteversionsintgredans la suite Visual Studio .Net reposant sur une nouvelle infrastructure pour la cration et lexcution dapplications sous Windows : le Framework .NET. Les principes de fonctionnement de cette infrastructure sont dcrits dans le chapitre Prsentationdelaplateforme.NET. Les versions 2003 et 2005 suivent lvolution du Framework.NET (version 1.1 puis 2.0) apportant toujours plus de fonctionnalitsetdoutilsfacilitantetacclrantledveloppeentdapplications. Laversion2008apportegalementsonlotdenouveauts.Parmilesplusremarquables :
q

Possibilitdegnreruneapplicationpouruneversionspcifiqueduframework(2.0,3.0,3.5). Prise en charge ou amlioration de la prise en charge de nouvelles technologies pour le dveloppement WEB (AJAX,JavaScript,CSS). Intgration de Linq dans les langages Visual Basic et Visual C# permettant duniformiser laccs aux donnes indpendammentdelasource(objets,basesdedonnes,fichierXML). Ajoutdunutilitairedemappageobjet/relationnel(O/RDesigner). CrationdapplicationsWPFoptimisespourWindowsVista. PossibilitdecrerdestatsavecReportDesigner(enremplacementdeCrystalReport).

ENI Editions - All rigths reserved

- 1-

Installationetpremierdmarrage
1.Configurationncessaire
Pour permettre un fonctionnement correct, Visual Studio ncessite une configuration minimale. Microsoft conseille les valeurssuivantes: Composant Processeur RAM Minimumrecommand Pentium1,6GHzouquivalent 384Mo 1GBsurledisquesystmeetde 2,83,8GBsurunautredisque 1024x768 Indispensable 1280x1024 Indispensable Touteversionultrieure(XP,2003) avecledernierservicepack disponible(SP2pourXP,SP2pour Windows2003) Performancesoptimales Pentium2,2GHzouquivalent 1024Mo

Espacedisque

Video LecteurCDRomouDVD

Systmedexploitation

MicrosoftWindowsXPMicrosoft WindowsServer2003Microsoft WindowsVista

2.Procduredinstallation
Leslmentsncessairessont :
q

lesCDRomouDVDdeVisualStudio.NET delaplacedisponiblesurvotredisquedur(de3,85Goenfonctiondesoutilsinstalls) etsurtoutdelapatience,carlinstallationestlongue...

AprsinsertiondupremierCDRometquelquessecondesdechargement,lcransuivantsaffiche :

ENI Editions - All rigths reserved

- 1-

Cet cran propose, par des liens hypertexte, les trois actions ncessaires pour linstallation de Visual Studio. Nous devonsbiensrdbuterparlinstallationdeVisualStudio. Lapremiretapeconsiste,pourlassistantdinstallation,collecterlesinformationsconcernantvotresystme :

Lcransuivantvousinformedursultatdelanalyseeffectueetvousdemandedaccepterlecontratdelicenceetde saisirlaclassocievotreproduit :

- 2-

ENI Editions - All rigths reserved

Lcransuivantvousproposedepersonnaliserlinstallationenchoisissantlesoutilsetlangagesinstallsainsiquele rpertoire dans lequel ils seront installs. En fonction de vos choix, lespace disque ncessaire pour linstallationest calcul.Leprogrammedinstallationvrifiegalementquelespacedisquedisponibleestsuffisantpourmenerbien linstallation.

AprsvalidationdevosparamtresparleboutonInstaller,leprogrammedinstallationdbutelacopiedesfichiers.

ENI Editions - All rigths reserved

- 3-

Lcransuivantaffichelaprogressiondelinstallation :

SivousinstallezleproduitpartirdeCDRom,vousserezinvitinsrerledisquesuivantpermettantdepoursuivre laphasedinstallation. Aprsunetrentainedeminutesdecopie,lcransuivantvousinformedusuccsdelinstallation.

- 4-

ENI Editions - All rigths reserved

Aprs la fermeture de cet cran par le bouton Terminer, vous revenez lcran initial et pouvez alors choisir linstallationdeladocumentationMSDN. CommepourlinstallationdeVisualStudio,unassistantvousguidedanslesdiffrentestapes.

VousdevezaccepterlecontratdelicenceMSDNpourpouvoirpoursuivrelinstallation.

ENI Editions - All rigths reserved

- 5-

Puis vous devez choisir le type dinstallation dsire. Si vous ne choisissez pas linstallation complte, vous serez parfois oblig de fournir le ou les disques source de MSDN lors de la consultation de certaines rubriques daide. En fonctiondevoschoix,lespacedisquencessaireestcalculetaffich.

Lultimetapedmarrelacopiedesfichierssurledisque.

Enfonctiondevoschoixetdutypedesupportutilispourlinstallation,vousserezinvitaucoursdelacopiefournir

- 6-

ENI Editions - All rigths reserved

leoulesdisquessuivants. Aprsquelquesminutesdecopie,lcransuivantvousconfirmelinstallationdeladocumentationMSDN.

La dernire tape consiste vrifier, auprs de Microsoft, sil existe des correctifs pour les produits que vous venez dinstaller. Cette tape ncessite un accs Internet avec bande passante suffisante car le volume dinformations recevoirpeuttreimportant(Modem56 Ksabstenir).SivousnedisposezpasdaccsInternet,vouspouvezignorer cettetapeettoutdemmedisposerdunproduitoprationnel.

3.Premierdmarrage
UnraccourcicrautomatiquementparleprogrammedinstallationvouspermetdelancerVisualStudio.

Lors du premier dmarrage, Visual Studio vous propose de personnaliser lenvironnement de travail. En fonction de votre prfrence pour un langage particulier, Visual Studio configure lenvironnement avec les outils adapts. Cette configurationpeut,parlasuite,tremodifieparlemenuOutils Importationetexportationdeparamtres.

ENI Editions - All rigths reserved

- 7-

VisualStudioappliqueensuitevoschoixavantdedmarrer.

Nousallonsmaintenantexplorerlesoutilsnotredisposition.

- 8-

ENI Editions - All rigths reserved

Dcouvertedelenvironnement
1.Pagededmarrage
Cette page est affiche chaque lancement de Visual Studio. Elle vous permet daccder rapidement aux derniers projetssurlesquelsvousaveztravaill,decrerunnouveauprojetoudouvrirunprojetexistant.LarubriqueMiseen routevousproposedesliensverslesrubriquesdaideutilespourunepriseenmainrapidedeVisualStudio.Siune connexion Internet est disponible, la zone Informations pour les dveloppeurs Visual Studio contient des informationsenprovenancedusiteMicrosoft.

LURL contacte pour renseigner cette rubrique est configurable par le menu Outils Options. Aprs cration dun nouveauprojetououverturedunprojetexistant,lenvironnementVisualStudioestdmarr.

2.EnvironnementVisualStudio
Lenvironnementestcomposdetroistypesdlments:
q

unezonedebarredemenusetdebarresdoutils unezonecentraledetravail unemultitudedefentresconstituantlesdiffrentsoutilsnotredisposition.

Lensembleprsentetoutdemmeunaspectcharget,aprslajoutduneoudeuxbarresdoutilsetlapparitionde quelquesfentressupplmentaires,lazonedetravaildevientrestreintesurtoutsuruncranclassiquede15pouces.

ENI Editions - All rigths reserved

- 1-

Heureusement,plusieurssolutionssontdisponiblespourgrernotreespacedetravail:
q

lancragedesfentres lemasquageautomatiquedesfentres lutilisationdonglets.

Lancragedefentresnepermetpasdegagnerdelaplacesurlcranmaisnouspermetdaccrocher,unebordurede lcranouduneautrefentre,telleoutellefentre.Ilestgalementpossiblederendreflottantechaquefentre,en double cliquant sur sa barre de titre ou en utilisant le menu contextuel. La fentre peut tre ensuite dplace ou ancre sur une autre bordure. Pour nous guider dans lancrage dune fentre, Visual Studio affiche, pendant le dplacementdunefentre,desguidespermettantdechoisirlabordureoeffectuerlancrage.

Lesicnes placesenpriphriedelcranpermettentlancragesurlabordurecorrespondantedelcran.Les

- 2-

ENI Editions - All rigths reserved

icnes

apparaissant au centre de la fentre survole, contrlent lancragesursesborduresousous

formedunongletsupplmentairepourlafentre. Plusintressantespourgagnerdelaplacesurlcran,lesfentresmasquablesnesontvisiblesquesilecurseurdela sourissetrouveaudessusdeleursurface.Sinon,seuleunezonedonglets,situeenborduredelenvironnementde dveloppement, permet de faire apparatre son contenu. Pour conserver une fentre toujours visible, il suffit de la bloquerenutilisantlapunaiseprsentesursabarredetitre . Enfin, lutilisationdonglets permet de partager une mme zone cran entre diffrentes fentres et ce niveau, les concepteursdeVisualStudioenontussansmodration.

ENI Editions - All rigths reserved

- 3-

Lesoutilsdisponibles
Regardonsunpeuplusendtaillesdiffrentesbarresdoutilsetfentresquisontnotredisposition.

1.Lesbarresdoutils
PasmoinsdetrentebarresdoutilsdiffrentessontdisponiblesdansVisualStudio.Laffichagedechacunedellespeut trecontrlparlemenucontextuel,obtenuenfaisantunclicdroitsurlabarredemenusprincipale.

Ilestbiensrinutiledafficherlatotalitdesbarresdoutilssimultanmentmaisseulementlesplusutiles. Standard

diteurdetexte

diteurdebotesdedialogue

Disposition

Dboguer

Les autres barres disponibles seront affiches, au coup par coup, en fonction de vos besoins afin dviter de surchargervotrecran. Lesfentresdisponiblessontgalementasseznombreusesetnousallonsdcouvrirlespluscourantes.

2.Laboteoutils
Cest partir de la bote outils que nous allons choisir les lments utiliss pour la conception de linterface de lapplication.

ENI Editions - All rigths reserved

- 1-

Laboteoutilsestorganiseparrubriquepermettantdefacilementretrouverlescontrles. Chacunpourrapersonnalisersaboteoutilsenyajoutantparexemple,descontrlesnondisponiblespardfaut.Il peut tre judicieux, avant dajouter des contrles votre bote outils, de crer une nouvelle rubrique pour les hberger.Pourcela,affichezlemenucontextueldelaboteoutils(encliquantavecleboutondroitdelasourissurla boteoutils),choisissezloptionAjouterunongletpuisdonnezunnomlanouvellerubriqueainsicre.Aprsavoir slectionn cette nouvelle rubrique, vous pouvez ensuite y ajouter des contrles. Affichez nouveau le menu contextueldelaboteoutilspuischoisissezloptionChoisirleslments. La liste des contrles (Com ou .NET), disponibles sur la machine, est alors prsente, vous permettant ainsi de slectionnerlescontrlesajouterdanscetterubriquedelaboteoutils.Laconfigurationdelaboteoutilsnest paslieauprojetactifmaislenvironnementluimme(laboteoutilsseraidentiquequelquesoitleprojetouvert).

3.Lexplorateurdeserveurs
Lexplorateur de serveurs est disponible par le menu Affichage Explorateur de serveursouparleraccourciclavier [Ctrl][Alt]S .Ilsaffichesurunnouvelongletdelafentreassocielaboteoutils.

- 2-

ENI Editions - All rigths reserved

La majorit des applications a besoin pour fonctionner dautres machines prsentes sur le rseau. Il est donc ncessaire davoir, pendant la phase de dveloppement dune application, la possibilit daccder aux ressources disponiblessurdautresmachines. LlmentleplusfrquemmentutilisdelafentreexplorateurdeserveursseracertainementlarubriqueConnexions dedonnes. EllepermetnotammentlagestiondesobjetsdisponiblessurleserveurSQL(tables,vues,procduresstockes). Lexplorateur de serveurs permet galement de grer les services fonctionnant sur les machines aussi bien par linterface graphique que par le code. Il offre la possibilit de visualiser lactivit des machines en analysant les compteurs de performance ou en rcuprant les informations dans les diffrents journaux dvnements. Un simple glisserdplacer entre lexplorateur de serveurs et une fentre en cours de conception gnre automatiquement le code permettant de manipuler cet lment dans lapplication. Par exemple, le dplacement dun compteur de performanceaudessusdunefentregnrelecodesuivant : Friend WithEvents perfCptMemoire As System.Diagnostics.PerformanceCounter Me.perfCptMemoire = New System.Diagnostics.PerformanceCounter Me.perfCptMemoire.CategoryName = "Mmoire" Me.perfCptMemoire.CounterName = "Kilo-octets disponibles" Me.perfCptMemoire.MachineName = "portableTG"

4.Lexplorateurdesolutions
Lexplorateur de solutions permet laffichage des lments constituant une solution et la modification de leurs proprits.

ENI Editions - All rigths reserved

- 3-

utilisationdelexplorateurdesolutionsestprsentendtaildanslechapitreconsacrlorganisationdune L application.

5.Laffichagedeclasses
Laffichage de classes est accessible par le menu Affichage Autres fentres Affichage de classes ou par le raccourciclavier[Ctrl][Shift]C.Ilpartagesazonecranaveclexplorateurdesolutions.

- 4-

ENI Editions - All rigths reserved

Laffichage de classe permet davoir une vision logique dune solution en prsentant les diffrentes classes utilises danscettesolution.

6.Lafentredeproprits
Lafentredepropritspeuttreaffichepartroismthodes :
q

EnutilisantlemenuAffichage Fentredeproprits. Parlatouchedefonction[F4]. Par loption Proprits du menu contextuel disponible en cliquant avec le bouton droit sur un des lments constituantunprojet(lmentgraphiquedelinterfaceutilisateur,fichieroudossierduprojet).Lafentrede proprits adapte automatiquement son contenu en fonction de llment slectionn et permet de modifier cescaractristiques.

ENI Editions - All rigths reserved

- 5-

Les lments dont vous pouvez modifier les caractristiques peuvent tre slectionns directement dans la liste droulanteousurlinterfacedelapplication. Deuxprsentationssontdisponiblespourlalistedesproprits : LemodeAlphabtiquequevousactivezencliquantsurlicne LemodeParcatgoriequevousactivezencliquantsurlicne . .

7.Laidedynamique
LaidedynamiquedeVisualStudioslectionnelesrubriquesdaidequipourraientvoustreutilesenfonctiondevotre activitoudescommandesetoutilsutiliss.

Dans lexemple ci contre, un bouton de commande vient juste dtre slectionn sur linterface. Les diffrentes rubriquesproposessontdonccentressurlobjetboutondecommande.

- 6-

ENI Editions - All rigths reserved

8.Lalistedestches
CettefentrevavouspermettrederemplacerlesdizainesdePostItcollssurleborddevotrecran.Eneffet,vous pourrezgrercequilrestefairedansvotreprojetentenantjourunelistedesmodificationsapporterdansvotre code.

Lesinformationsprsentesdanslalistepeuventavoirdeuxorigines:
q

Lescommentairesinsrsdansvotrecode. Lesinformationssaisiesdirectementdanslafentre.

Vous pouvez placer dans votre code des commentaires qui apparatront par la suite dans la liste des tches. Cette techniquevouspermetparexempledindiquerunemodificationeffectuerplustarddansvotrecode. Ilsuffitquelecommentairecommencepartodo,pourtreensuitereprisautomatiquementdanslalistedestches. Vous pouvez galement saisir directement les informations dans la liste des tches. Vous devez basculer vers laffichagedestchesutilisateurenutilisantlazonedelistedisponiblesurlabarredetitredelalistedestches.

Lajoutdunetchesexcuteensuiteparlebouton ,disponibledanslalistedestches.

Vouspouvezalorsspcifierunedescriptionetuneprioritpourlanouvelletcheencliquantsurlacolonnedegauche delalistedestches.Troisniveauxdeprioritsontdisponibles :
q

Haute Normale Basse.

Pour chaque tche, une case cocher permet dindiquerquelle a t ralise. Sa description apparat alors barre danslalistedestches.Ilnyapas,pourlestchesutilisateur,deliaisonautomatiqueavecuneportionquelconque decode.

9.Lalistedeserreurs
ENI Editions - All rigths reserved - 7-

Le code que vous saisissez est analys en continu par Visual Studio et les ventuelles erreurs de syntaxe sont reprisesparVisualStudiodanslafentreListederreurs.

Pour aller directement sur la ligne o une erreur de syntaxe est apparue, il suffit de double cliquer dans la liste sur llmentcorrespondant(danslexempleprcdent,doublecliquersur )attendue pouratteindrelaligne6).Vous navezdoncnulbesoindedemanderlacompilationcomplteducodepourtraquertoutesleserreursdesyntaxe.Ds quelerreurestcorrige,elledisparatautomatiquementdelalistedeserreurs. Lesboutonserreur,avertissement,messageactiventunfiltragesurlesmessagesaffichsdanslalistedeserreurs.

10.Lafentredditiondecode
Cest certainement dans cette fentre que nous allons passer le plus de temps. Elle propose de nombreuses fonctionnalitspermettantdautomatiserlesactionslespluscourantes.

a.LesSnippets
Les Snippets sont des morceaux de code qui peuvent trs facilement tre incorpors dans un fichier source. Ils permettent dcrire trs rapidement des portions de code correspondant des situations courantes. Visual Studio propose,debase,unemultitudedeSnippets.TroissolutionssontdisponiblespourinsrerunSnippet :
q

Utilisezloption Insrerunextraitdumenucontextueldelditeurdecode. Utilisezlescombinaisonsdetouches[Ctrl]Kpuis[Ctrl]X. SaisissezlenomduSnippetpuislatouche[Tab].

Pour les deux premires mthodes, Visual Studio vous propose de choisir dans une liste le Snippet qui vous intresse.CertainesportionsdecodeduSnippetpeuventtrepersonnalises.Cesportionsdecodesontsurlignes enbleuclair.Lamodificationdunedecesportionsdecoderpercutelechangementsurtouteslesoccurrencesdans leSnippet. Danslexemplesuivant,unSnippetatutilispourajouterunenouvelleproprituneclasse.

LamodificationdesvaleursnewPropertyValue,IntegeretNewPropertyseraeffectueencascadesurlensembledu codeduSnippet. VouspouvezgalementconcevoirvospropresSnippets.VousdevezpourcelacrerunfichierXMLquivacontenirle codeduSnippet.Cefichierdoitavoirlextension.snippet. Pour vous aider dans la cration dun Snippet, Microsoft a prvu un Snippet. Vous pouvez lincorporer dans votre fichierXMLparlemenucontextuelInsrerunextrait Snippet.

- 8-

ENI Editions - All rigths reserved

Vousdevezalorsobtenirledocumentsuivant: <?xml version="1.0" encoding="utf-8" ?> <CodeSnippet Format="1.0.0" xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <Header> <Title>title</Title> <Author>author</Author> <Shortcut>shortcut</Shortcut> <Description>description</Description> <SnippetTypes> <SnippetType>SurroundsWith</SnippetType> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Declarations> <Literal> <IDname/ID> <Defaultvalue/Default> </Literal> </Declarations> <Code Language="XML"> <![CDATA[<test> <name>$name$</name> $selected$ $end$</test>]]> </Code> </Snippet> </CodeSnippet> Avant de voir comment complter ce fichier, vous devez apporter une petite modification sa structure. Les trois premireslignesdoiventtremodifiesafindobtenirlaformesuivante: <?xml version="1.0" encoding="UTF-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> Vousdevezgalementajouterlabalisedefermeturesuivantelafindufichier. </CodeSnippets> VouspouvezensuitepersonnaliservotreSnippet.Dansunpremiertemps,vousdevezmodifierlasectionHeaderen remplaantlesvaleursdesdiffrentesbalises. <Header> <Title>Parcours dun tableau</Title> <Author>Thierry</Author> <Shortcut>tablo</Shortcut> <Description>ce Snippet ajoute une boucle permettant de parcourir un tableau</Description> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> La section Dclarations permet ensuite de crer les paramtres utiliss dans le Snippet. Pour chaque paramtre, vousdevezcrerunesection<Literal>etfournirunnompourleparamtreetunevaleurpardfaut. <Declarations> <Literal> <ID>nomtableau</ID> <Default>leTableau</Default> </Literal> <Literal> <ID>typeTableau</ID> <Default>TypeDuTableau</Default> </Literal>

ENI Editions - All rigths reserved

- 9-

<Literal> <ID>tailleTableau</ID> <Default>tailleDuTableau</Default> </Literal> </Declarations> VousdevezensuiteindiquerpourquellangagevotreSnippetestprvu. <Code Language="VB"> Puis, enfin, dfinir dans la balise CDATA le code du Snippet. Dans ce code, vous pouvez utiliser les paramtres du Snippetenlesencadrantentredeuxcaractres$. <![CDATA[ dim $nomTableau$($tailleTableau$) as $typeTableau$ dim index as integer for index=0 to $taillaTableau$ -1 inserer le code de traitement du tableau next ]]> VousenregistrezensuitelefichieretvotreSnippetestprt.IlconvientdemaintenantlintgrerdansVisualStudio. Pourcela,vousactivezlegestionnairedeSnippetparlemenuOutils Gestionnairedesextraitsdecode.

Lebouton ImporterpermetdajoutervotreSnippetceuxdjdisponiblesdansVisualStudio. AprsavoirslectionnlefichiercontenantleSnippet,vousdevezchoisirlarubriquedanslaquelleilserarang.

- 10 -

ENI Editions - All rigths reserved

VotreSnippetestmaintenantdisponibledanslditeurdecode.

Ilnevousresteplusqupersonnaliserlecodegnr.

b.Suividesmodifications
Vous pouvez visualiser les portions de code ayant t modifies depuis le dmarrage de Visual Studio. Les modificationssontidentifiesparuneborduredecouleurapparaissantdanslamargedelditeurdecode.
q

Unebordurejauneindiquequelecodeatmodifimaispasencoresauvegard. Unebordureverteindiquequelecodeatmodifietsauvegard.

ENI Editions - All rigths reserved

- 11 -

Vouspouvezaussifacilementrenommerunlmentetpropagerautomatiquementlamodificationauresteducode. Lutilisation typique est le changement de nom dune variable ou dune classe. Vous ne devez pas renommer la variabledirectementdanslecodemaisutiliserlabotededialogueafficheenutilisantloption Renommerdumenu contextueldelditeurdecodesurlenomactueldelavariable.

amodificationraliseparlintermdiairedecettebotededialogueestrpercutesurlensembleducodeo L cettevariableestutilise.

c.Utilisationdemacros
Comme la majorit des outils Microsoft, Visual Studio est maintenant capable de grer les macros. Elles vous permettent de facilement enregistrer une srie dactions excutes dans Visual Studio et de les reproduire par un simpleclicsurunboutondunebarredoutils. Nous allons crer trois macros permettant lajout dinstruction Imports pour les espaces de noms System.Data.SqlClient, System.Data.OleDb et System.Data.Odbc. Ces macros seront ensuite associes trois boutonsdunenouvellebarredoutils. Lapremiretapeestdenregistrerlesmacroscommeonenregistreunesquenceavecunmagntophone.Lemenu Outils Macros EnregistrerTemporaryMacrodclenchelenregistrementdevosactions.Vouspouvezalorssaisir le code dsir, puis arrter lenregistrement grce la barre doutils affiche au dbut de lenregistrement de la macro.

VousdevezensuitesauvegarderlamacroparlemenuOutils Macros SauvegarderTemporaryMacro.

Effectuezcesoprationspourchacunedestroislignesdecodesuivantesendonnantunnomdiffrentchacunedes macros. Imports System.Data.SqlClient Imports System.Data.OleDb Imports System.Data.Odbc Pour rendre plus facile lutilisation de ces macros, nous allons les regrouper sur une nouvelle barre doutils. Vous deveztoutdabordcrerunenouvellebarredoutilsenutilisantloptionPersonnaliserdumenucontextueldisponible surunebarredoutilsexistante.

- 12 -

ENI Editions - All rigths reserved

La barre doutils est maintenant disponible mais ne contient aucun bouton. Vous pouvez maintenant ajouter vos boutonslaidedelabotededialoguedepersonnalisationdelabarredoutils.

Lajoutdesboutonssefaiteneffectuantunglisserdplacerdelacommandeverslabarredoutils.Lescommandes apparaissentsousformedetextesurlabarredoutils.Avantdefermerlabotededialoguedepersonnalisation,vous devez associer des images aux diffrentes commandes en utilisant loption Modifier limage du bouton du menu

ENI Editions - All rigths reserved

- 13 -

contextueldechaquecommande.

Choisissez galement pour chaque bouton le style par dfaut. Votre barre doutils est maintenant prte tre utilise.

Maintenantquevoustesfamiliarisaveclenvironnementdedveloppement,vousdevezvousfamiliariseravecle codeVisualBasic.

- 14 -

ENI Editions - All rigths reserved

Lessolutions
1.Prsentation
Pourvousaiderdanslacrationdapplications,VisualStudiovousproposeplusieurslmentsservantregrouperles composantsduneapplication.Leconteneurdeplushautniveauestlasolutiondanslaquellevouspourrezplacerun ouplusieursprojets.Cesprojetscontiendront,leurtour,tousleslmentspourquelecompilateursoitcapablede gnrer le fichier excutable ou dll du projet. Lexplorateur de solutions va nous permettre de manipuler tous ces lments.

2.Crationdunesolution
La cration dunesolutionestautomatiquelorsquevousdmarrezunnouveauprojetdansVisualStudio.Lorsdela crationdunouveauprojet,ilvousserademandplusieursinformationsleconcernant.

Parlintermdiairedecettebotededialogue,vousallezfournirlesinformationssuivantes :
q

laversionduFrameworkncessairepourutiliserlapplication, lelangageutilispourdvelopperleprojet, letypedeprojetcrer, lenomduprojet, lerpertoiredebaseoserontstockslesfichiers, lenomdelasolution, lacrationdunrpertoirepourlasolution.

ENI Editions - All rigths reserved

- 1-

Aprsvalidationdecettebotededialogue,lexplorateurdesolutionsvousprsentelanouvellesolutionsurlaquelle vous allez pouvoir travailler. Tous les fichiers de votre solution sont dj crs et sauvegards sur votre disque, lemplacementquevousavezspcifi. Unesolutioncontiendraaumoinslesfichierssuivants :
q

Unfichieraveclextension.sln,quiestlefichierdeconfigurationdelasolution.Cefichiercontiententreautres la liste de tous les projets composant la solution. Il est complt au fur et mesure que vous ajoutez des nouveauxprojetslasolution. Unfichieraveclextension.suo,enregistrantlesoptionsassocieslasolution.Cefichierpermetderetrouver cesoptions. Un fichier pour le projet, portant lextension .vbproj. Ce fichier contient toutes les informa tions de configurationduprojetavecnotammentlalistedesfichiersconstituantleprojet,lalistederfrencesutilises parceprojet,lesoptionsutiliserpourlacompilationduprojet,etc. De nombreux fichiers ayant lextension .vb qui vont contenir le code source de toutes les classes, feuilles, modulesconstituantleprojet. Unfichier.resxassocichaquefeuilledevotreapplication.CefichierauformatXMLcontiententreautresla listedesressourcesutilisessurcettefeuille. Aufinal,unesolutioncontientdenombreuxautresfichiersenfonctiondeslmentsutilissdansvotreprojet (accsunebasededonnes,fichiershtml...).

3.Modificationdunesolution
Lessolutionstantdesconteneurs,ilestbiensrpossibledegrerleurslments.Vouspouvezajouter,supprimer, renommerdeslmentsdanslasolution.

a.Ajouterunprojet
Plusieurspossibilitssontdisponiblespourlajoutdunprojet :
s

Si vous souhaitez crer un nouveau projet, choisissez loption Nouveau Projet du menu Fichier Ajouter. Une botededialoguevousproposealorsdeconfigurerlescaractristiquesdunouveauprojet.Cettebotededialogue vousproposenotammentunrpertoirepardfautpourlenregistrementduprojet.Sicerpertoirenecorrespond paslemplacementovousdsirezenregistrerleprojet,vouspouvezslectionnerunnouvelemplacement.Cette opration sera raliser pour chaque projet que vous ajouterez. Il peut tre intressant de modifier le chemin propos par dfaut pour lenregistrement des projets. Pour cela, ouvrez le menu Outils Options, puis dans la botededialoguechoisissezloptionProjetsetsolutionsetmodifiezlarubriqueVisualstudioprojectslocation. Si vous souhaitez ajouter un projet dj existant, vous devez utiliser loption Projet existant du menu Fichier Ajouter.Unebotededialoguedeslectiondefichiersvouspermetalorsdechoisirlefichier.vbprojduprojetque voussouhaitezajouterlasolution.

noterqueleprojetrestesonemplacementdoriginesurledisque.

b.Supprimerunprojet
s

Poursupprimerunprojet,utilisezlemenucontextueldelexplorateurdesolutionseneffectuantunclicdroitsurle nomduprojetquevoussouhaitezsupprimerdelasolution.

Le projet est limin de la solution, mais reste enregistr sur le disque. Pour le supprimer dfinitivement, utilisez lexplorateurWindowspoursupprimerlesfichiersdeceprojet.Sivousneffacezpaslesfichiers,leprojetpeut,parla suite,tredenouveauajoutunesolution.

c.Renommerunprojet

- 2-

ENI Editions - All rigths reserved

Pourrenommerunprojet,utilisezlemenucontextueldelexplorateurdesolutionseneffectuantunclicdroitsurle nomduprojetquevoussouhaitezrenommer.

Lenomduprojetdevientalorsmodifiabledanslexplorateurdesolutions.Cettemodificationconcerneuniquementle nomdufichier.vbprojassociauprojet.Ellenemodifieenaucuncaslenomdurpertoiredanslequelsetrouventles fichiersduprojet.

d.Dchargerunprojet
Lorsque vous souhaitez exclure temporairement un projet du processus de gnration ou rendre ldition de ses composantsimpossible,vouspouvezdchargerleprojetdelasolutiongrceloptionDchargerleprojet. U nprojetdchargnestpasretirdelasolutionmaissimplementmarqucommeindisponible.

Leprojetpeut,biensr,trerhabilitdanslasolutionenutilisantloptionRechargerleprojetdumenucontextuel.

4.Organisationdunesolution
Si vous travaillez avec une solution contenant de trs nombreux projets, vous pouvez ajouter un niveau de hirarchisation en crant des dossiers de solutions. Ceuxci permettent le regroupement logique de projets au sein dunesolution.
s

Pourcela,crez,dansunpremiertemps,lesdossiersdanslasolution,puisorganisezlesprojetsdanscesdossiers.

esdossiersdesolutionsnecrentpasdedossiersphysiquessurdisque,ilssontjustedesconteneurslogiques L lintrieurdelasolution.

a.Crationdundossierdesolution
Undossierdesolutionpeuttrecrpartroismthodesdiffrentes.
s

Pourtoutescesmthodes,slectionnezlasolutiondanslexplorateurdesolution. Ensuite,utilisezsoitlebouton delabarredoutilsdelexplorateurdesolution,soitlemenu Projet Ajouter unnouveaudossierdesolutionouencorelemenucontextueldisponibleparunclicdroitsurlenomdelasolution.

ENI Editions - All rigths reserved

- 3-

Quellequesoitlamthodeutilise,vousdevezfournirunnompourledossiercr.

b.Crerunprojetdansundossier
La cration dun projet dans un dossier de solution est identique la cration dun projet directement dans la solution.
s

Slectionnezsimplement,aupralable,ledossierdanslequelvoussouhaitezcrerleprojet.

c.Dplacerunprojetdansundossier
Il arrive frquemment que la ncessit dorganiser une solution avec des dossiers se fasse sentir alors que des projetsexistentdjdanslasolution.
s

Crez,danscecas,lesdossierspuiseffectuezunglisserdplacerdesprojetsdanslesdossierscorrespondants.

5.Ledossierlmentsdesolution
Lessolutionscontiennentprincipalementdesprojets,cependantilestpossibledavoir,dansunesolution,desfichiers grsindpendammentdunprojetparticuliermaisassocislasolution.Cestlecas,parexemple,dunfichiericne quevoussouhaitezutiliserdansplusieursprojetsdelasolution.Cesfichierssontappelslmentsdesolutionetsont placsdansundossierspcifiquedelasolution.
s

Pour ajouter un nouvel lment de solution, utilisez le menu contextuel sur le nom de la solution en choisissant loptionAjouter NouvellmentouloptionAjouter lmentexistant.

Lenouvellmentestalorsajoutdansledossierlmentsdesolution.Ilestnoterquecedossiernexistepas,par dfaut, dans une solution mais il est cr automatiquement lors de lajout du premier lment de solution. Les lmentsdesolutionpeuventensuitetremodifisavecunditeurspcifiqueautypedefichiercr.

6.LedossierFichiersdivers
Vous pouvez, parfois, vouloir visualiser le contenu dun fichier alors que vous travaillez sur une solution, comme par exemplelecompterendudunerunion.Cefichiernedoitpasfairepartiedemanirepermanentedelasolution.Vous pouvezlouvriravecunditeurexterneetbasculerentreVisualStudioetcetditeurexterne,maisilestpluspratique devisualiserlefichierdirectementdanslenvironnementVisualStudio.
s

UtilisezloptionOuvrirunfichierdumenuFichier.

Labotededialoguevouspermetdechoisirlefichierouvrir.Enfonctiondutypedefichier,unditeurpardfautlui seraautomatiquementassocipourpermettresamodification.Ilestparfoisutiledepouvoirchoisirlditeurassoci un fichier. Pour cela, le bouton Ouvrir de la bote de dialogue dispose dun menu proposant loption Ouvrir avec permettantlechoixdelditeurassociaufichier.

- 4-

ENI Editions - All rigths reserved

Labotededialoguesuivantevousproposelalistedesditeursdisponibles.

Choisissezlditeurassociaufichiersurlequelvoussouhaiteztravailleretvalidez.

LefichierestalorsdisponibledansledossierFichiersdiversdelasolution.CommeledossierElmentsdesolution,le dossierFichiersdiversnexistepas,pardfaut,danslasolutionmaisestcrautomatiquementlorsdelouverturedun fichier. Ilseravisibledanslexplorateurdesolutionsuniquementsiloptioncorrespondanteestactivedanslenvironnement Visual Studio. Pour cela, ouvrez le menu Outils Options, puis dans la bote de dialogue, choisissez loption EnvironnementDocumentsetactivezloptionAfficherlesfichiersdiversdanslexplorateurdesolutions.Commele dossier lments de solution, ce dossier est un dossier "logique" et ne correspond pas un emplacement sur le disque.

7.Configurationdunesolution
Les solutions disposent de proprits permettant de configurer leurs comportement lors de la gnration ou de lexcution de lapplication. Ces diffrentes proprits sont regroupes dans une bote de dialogue accessible par loptionPropritsdumenucontextueldunesolution.Quatrecatgoriesdepropritssontdisponibles :

ENI Editions - All rigths reserved

- 5-

Projetdedmarrage Dpendancesdeprojets Fichierssourcespourdbogage Configurations.

Regardonsdansledtailchacunedentreselles.

a.Configurationduprojetdedmarrage
Cettepagedepropritsdelasolutiondtermine,parmilesprojetsdisponibles,celuiouceuxlancsaudmarrage delasolution.

Deuxoptionssontdisponibles : Projetdedmarrageunique Une combobox propose la liste des projets disponibles dans la solution parmi lesquels vous devez choisir celui qui seraexcutaudmarragedelasolution.Ceprojetestparlasuitesignaldanslexplorateurdesolutionparson nom apparaissant en gras. Cette slection peut galement se faire par le menu contextuel de lexplorateur de solutionsenchoisissantloptionDfinircommeprojetdedmarrage. Plusieursprojetsdedmarrage Untableauprsentelalistedetouslesprojetsdisponiblesdanslasolution.Pourchacundeux,vousdevezindiquer lactionexcuterlorsdulancementdelapplication.Leschoixpossiblessont :
q

Aucuneaction Dmarrerleprojet Excuterleprojetsansdbogage.

Sivouschoisissezdedmarrerplusieursprojetsaulancementdelasolution,vousdevezgalementindiquerlordre dans lequel ces projets seront dmarrs. Cet ordre correspond en fait lordre des projets dans le tableau. Les boutons et permettentdemodifiercetordre.

- 6-

ENI Editions - All rigths reserved

b.Dpendancesdeprojet
Lagnrationdecertainsprojetsncessiteaupralablelagnrationdautresprojets.Cestlecas,parexemple,si vous demandez la gnration dun projet qui utilise une rfrence vers un autre projet : celuici est alors une dpendanceduprojetinitial. Lapagedepropritssuivantepermetdeconfigurercesdpendances.

Dans la liste des projets, slectionnez celui pour lequel vous souhaitez configurer les dpendances. Les autres projetsdelasolutionsontalorslists,avec,pourchacundeux,unecasecocher.Lorsdelagnrationduprojet, tous les projets dont il dpend seront automatiquement rgnrs, sils ont t modifis depuis la dernire gnrationousilsnontjamaistgnrs. Certainesdpendancesnepeuventtremodifies,lacasecocherapparatalorsengris. Cest en gnral le cas, lorsquun projet possde une rfrence sur un autre projet ou que lajout dune dpendancerisquedecreruneboucle.Parexemple,leprojet1dpendduprojet2etinversement.

Lesdpendancesdeprojetpeuventtregalementconfiguresparlemenucontextueldelexplorateurdesolutions avecloptionDpendancesduprojet.

c.Fichierssourcepourledbogage
Lorsdudbogageduneapplication,lenvironnementVisualStudioabesoindaccderaufichiersourceducodequil est en train de dboguer. Cette page de proprit permet de spcifier les rpertoires qui seront analyss la rechercheducodesource.

ENI Editions - All rigths reserved

- 7-

Laliste Rpertoires contenant du code sourceaffichelenomdesrpertoiresquiserontscrutslarecherchede code source, pendant le dbogage dune application. Cette liste peut tre gre par la barre doutils dont les boutonspermettentde : Vrifierlexistencedurpertoire. Ajouterunnouveaurpertoire. Supprimerlerpertoireslectionndelaliste. Dplacerlerpertoireverslebasdanslaliste. Dplacerlerpertoireverslehautdanslaliste. LalisteNepasrecherchercesfichierssourcesexclutcertainsfichiersdelarecherche.

d.Configurations
Lesoptionsdeconfigurationpermettentdedfinircommentdiffrentesversionsdunesolutionetdesprojetsquila composent seront gnres. Par dfaut, deux configurations sont disponibles pour une solution dans Visual Studio : laconfigurationDebugetlaconfigurationRelease. Pourchacundesprojetsprsentsdanslasolution,lesdeuxconfigurationsserontgalementdisponibles.Auniveau du projet, les configurations permettent de dfinir des options de compilations. La configuration Debug est utilise pendantledveloppementetlestestsduprojet.LaconfigurationReleaseestutilisepourlagnrationfinaledu projet.

- 8-

ENI Editions - All rigths reserved

Nous avons en fait un systme trois niveaux : pour chaque configuration de solution, on indique quelle configuration utiliser pour chaque projet et, pour chaque configuration de projet, on spcifie des options de compilation.Lesoptionsdecompilationsontmodifiablesauniveaudespropritsduprojet.

ENI Editions - All rigths reserved

- 9-

Lesprojets
Lesprojetssontlesconteneursdedeuximeniveaudansuneapplication.Ilssontutilisspourorganiserlogiquement, grer,gnreretdboguerlescomposantsduneapplication.Lagnrationdunprojetproduit,engnral,unfichier excutableouunebibliothquedll.Unprojetpeuttretrssimpleetnecontenirquedeuxlments,unfichiersource (.vb)etlefichierdeprojet(.vbproj).Plusgnralement,lesprojetscontiennentdenombreuxfichierssource,desscripts debasededonnes,desrfrencesversdesservicesWeb,desressourcesgraphiques,etc. VisualStudioproposepardfautunensembledemodlesdeprojets.Cesmodlesfournissentunpointdedpartpour lamajoritdesbesoinsdansledveloppementduneapplication.Pourdescasplusspcifiques,vouspouvezcrervos propresmodlesdeprojet.

1.Crationdunprojet
s

Pourlacrationdunprojet,activezlemenuFichier Nouveauprojet.Unebotededialoguevousproposealorsde choisirlescaractristiquesdunouveauprojet. Choisissez tout dabord la version du Framework pour laquelle vous souhaitez dvelopper le projet. La version choisieinfluencelestypesdeprojetsquevouspouvezcrer. Choisissezensuitelelangagedanslequelvoussouhaitezdvelopperleprojet.Leschoixdisponiblesdpendentdes langagesinstallsdansVisualStudio.Dansnotrecas,nouschoisissonsbiensrVisualBasic. Choisissez ensuite le type de projet que vous souhaitez dvelopper. La bote de dialogue propose alors les diffrentsmodlesdeprojetdisponiblesenfonctiondutypedeprojetchoisi. Aprsavoirfaitvotrechoix,indiquezunnompourleprojet,unemplacementpourlesfichiersduprojetetunnom pourlasolution.Lemodleslectionnestalorsutilisparlassistantpourcrerleslmentsduprojet.

Aprsquelquesinstantsleprojetestdisponibledanslexplorateurdesolutions.
s

Personnalisezmaintenantlbauchecre.

a.Lesmodlesdeprojets
DenombreuxmodlesdeprojetssontdisponiblesdansVisualStudio.Cesmodlesfournissentleslmentsdebase ncessaires pour dvelopper chaque type de projet. Ils contiennent toujours au moins le fichier de projet, plus un exemplaire de llment le plus utilis pour le type de projet correspondant par exemple, pour un projet de bibliothqueclasse,unfichiersourcecontenantunebauchedeclasseestcr.Lesmodlesfournissentgalement des rfrences et des importations par dfaut pour les bibliothques et les espaces de noms les plus utiles en fonctiondutypedeprojet. ApplicationWindows Cemodledeprojetestcertainementleplusutilis.IlpermetledveloppementdapplicationWindowsstandards.Le modleajouteauprojetleslmentssuivants :
q

Un fichier AssemblyInfo.vb utilis pour la description de lapplication avec notamment les informations concernantlaversion. Unformulairedebaseavecsonfichiersourceform1.vb.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q

System System.Core System.Data

ENI Editions - All rigths reserved

- 1-

System.Data.DataSetExtensions System.Deployment System.Drawing System.Windows.Forms System.Xml System.Xml.Linq

Bibliothquedeclasse Cemodledeprojetestutilisablepourcrerdesclassesetdescomposantsquipourrontparlasuite,trepartags avecdautresprojets.Leslmentssuivantssontautomatiquementajoutsauprojet :


q

UnfichierAssemblyInfo.vbutilispourladescriptionduprojetavecnotammentlesinformationsconcernantla version. Uneclassedebaseavecsonfichiersourceclass1.vb.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q

System System.Core System.Data System.Data.DataSetExtensions System.Xml System.Xml.Linq

BibliothquedecontrlesWindows Commelemodleprcdent,cetypedeprojetpermetdecrerunebibliothquedeclassesutilisabledansdautres projets. Cette bibliothque est plus spcifique, puisquelle est ddie la cration de contrles, utilisables par la suite dans une application Windows. Ces contrles tendent la bote outils dj disponible dans les applications Windows.Leslmentssuivantssontautomatiquementajoutsauprojet :
q

UnfichierAssemblyInfo.vbutilispourladescriptionduprojetavecnotammentlesinformationsconcernantla version. Une classe UserControl1 hritant de la classe System.Windows.Forms.User Control fournissant les fonctionnalitsdebasepouruncontrleWindows,avecsonfichiersourceUserControl1.vb.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q

System System.Core System.Data

- 2-

ENI Editions - All rigths reserved

System.Data.DataSetExtensions System.Drawing System.Windows.Forms System.Xml System.Xml.Linq

Applicationconsole Ce type dapplication est destin tre excut partir de la ligne de commande dune fentre de invit de commande. Elle est bien sr conue sans interface graphique, les entres/sorties se faisant partir de la ligne de commandeetverslaconsole. CetypedapplicationesttrspratiquepourraliserdestestsavecVisualBasic,carellepermetdeseconcentrersur unpointparticuliersansavoirsesoucierdelaspectprsentationdelapplication. De nombreux exemples, prsents dans cet ouvrage, sont bass sur une application en mode console. Il faut cependantavouerque,mispartsasimplicitdecration,cetypedapplicationestdevenuunpeuobsolte. Leslmentssuivantssontajoutspardfautauprojet :
q

UnfichierAssemblyInfo.vbutilispourladescriptionduprojetavecnotammentlesinformationsconcernantla version. Uneclassedebaseavecsonfichiersourceclass1.vb.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q

System System.Core System.Data System.Data.DataSetExtensions System.Deployment System.Xml System.Xml.Linq

ServiceWindows Ce modle de projet est conu pour la cration dapplications sexcutant en tche de fond sur le systme. Le lancement de ce type peut tre effectu automatiquement au dmarrage du systme et ne ncessite pas quune sessionutilisateursoitouvertepourpouvoirsexcuter. Ce type dapplication est dpourvu dinterface utilisateur. Si des informations doivent tre communiques lutilisateur, elles devront transiter par les journaux systme, consultables, par lobservateur dvnements. Les lmentssuivantsserontajoutsauprojet :
q

UnfichierAssemblyInfo.vbutilispourladescriptionduprojetavecnotammentlesinformationsconcernantla version. Une classe de base avec le squelette des procdures OnStart et OnStop appeles automatiquement au dmarrageetlarrtduservice.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
ENI Editions - All rigths reserved - 3-

System System.Core System.Data System.Data.DataSetExtensions System.Deployment System.ServiceProcess System.Xml System.Xml.Linq

ApplicationWPF Ce modle de projet permet de bnficier du nouveau systme daffichage graphique de Windows, utilis dans WindowsVista. Leslmentssuivantssontautomatiquementajoutsauprojet :
q

Un fichier AssemblyInfo.vb utilis pour la description de lapplication avec notamment les informations concernantlaversion. Un fichier Application.Xaml et son fichier de code associ, Application.Xaml.vb, permettant la gestion des vnementsdclenchsauniveaudelapplication. UnefentredebaseWindow1.Xamletsonfichierdecodeassoci,Window1.Xaml.vb.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q

PresentationCore PresentationFramework System System.Core System.Data System.Data.dataSetExtensions System.Xml System.Xml.Linq WindowsBase

BibliothquedecontrlesWPF Comme la bibliothque de contrles Windows, ce type de projet permet dtendre la bote outils dj disponible danslesapplicationsWPF.Leslmentssuivantssontajoutsauprojet.

- 4-

ENI Editions - All rigths reserved

Un fichier AssemblyInfo.vb utilis pour la description de lapplication avec notamment les informations concernantlaversion. UnfichierUserControl1.xamlpourladfinitiondelaspectgraphiqueducontrle. UnfichierUserControl1.xaml.vbpourlecodeassocicecontrle.

Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q

PresentationCore PresentationFramework System System.Core System.Data System.Data.dataSetExtensions System.Xml System.Xml.Linq WindowsBase

BibliothquedecontrlesWPFpersonnaliss Ce type de projet a galement pour vocation dtendre la bote outils disponible pour les applications WPF. Contrairementautypedeprojetprcdent,lescontrlesnesontpascrsdetoutepice,maissontbasssurdes contrlesexistantsdontilstendentlescaractristiques. Lesrfrencesetimportationssontidentiquesautypedeprojetprcdent. Projetvide Cemodledoittreutilislorsquevoussouhaitezcrervotrepropretypedeprojet.Seullefichierprojetestcr. Parcontre,aucunautrelmentnestajoutautomatiquementetaucunerfrencenestcreouimporte.

b.Crationdemodledeprojet
Vouspouvezcrervotrepropremodledeprojetenfonctiondevoshabitudesdedveloppementetfaireensorte quilapparaisseparmilesmodlesprdfinis. Vousdevezconcevoirleslmentssuivants :
q

Un fichier de dfinition contenant les mtadonnes du modle. Ce fichier est utilis par Visual Studio pour laffichageduprojetdanslenvironnementdedveloppementetpourlaffectationdepropritspardfautau projet.CesinformationssontcontenuesdansunfichierXMLayantlextension.vstemplate. Unfichierpourleprojet(.vbproj). Lesfichierssourcesetressourcesincluspardfautlorsdelacrationdunprojetpartirdecemodle.

esfichiersdoiventtrecompresssdansunfichierzip.Lefichierzipdoitcontenirlesfichiersindividuellement C etnonledossierdanslequelilssontplacs.

Lefichier.vstemplatedoitavoirleformatsuivant :
ENI Editions - All rigths reserved - 5-

<VSTemplate Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project"> <TemplateData> <Name>AppliPerso</Name> <Description>creation dun projet avec une configuration personalise </Description> <ProjectType>VisualBasic</ProjectType> <DefaultName>AppliPerso</DefaultName> </TemplateData> <TemplateContent> <Project File="AppliPerso.vbproj"> <ProjectItem>AssemblyInfo.vb</ProjectItem> <ProjectItem>Feuille1.vb</ProjectItem> <ProjectItem>Feuille1.Designer.vb</ProjectItem> <ProjectItem>Feuille1.resx</ProjectItem> </Project> </TemplateContent> </VSTemplate> Onretrouvedanscefichier : DanslasectionName Lenomaffichparlabotededialoguedecrationdunnouveauprojet. DanslasectionDescription Unedescriptiondtailleduprojet. DanslasectionProjectType Lenomdudossierdanslequelceprojetseraclassdanslabotededialoguedecrationdeprojet. DanslasectionDefaultName Le nom utilis par dfaut pour tous les projets crs partir de ce modle. Ce nom est complt par un suffixe numriquelacrationduprojet. DanslasectionProjectFile Lenomdufichierprojetassociaumodle.Cefichierdoittreprsentdanslefichierzipdumodle. DanslessectionsProjectItem Leslmentsfaisantpartieduprojet.Ceslmentsdoiventgalementtredisponiblesdanslefichierzip.

c.Modificationdunmodleexistant
Lamodificationdunmodleconsisteutiliserunfichierzipexistantcontenantleslmentsncessairesauprojetet yajouterdeslmentssupplmentaires.Sidesfichierssontajoutsaumodle,ilsdoiventtreplacsdanslefichier zipetgalementrfrencsdanslefichier.vstemplate.LesmodlesprdfinisdeVisualStudiosontplacsdansle rpertoire C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates\ VisualBasic. Pour que les modificationssoientprisesencompte,vousdevezmettrejourlecacheutilisparVisualStudio.Pourcela :
s

OuvrezunefentredecommandeVisualStudio. Saisissez la commande devenv /setup. Soyez patient car cette commande est assez longue sexcuter. Aprs excutiondelacommande,vosmodificationssontdisponiblesdanslemodledeprojet.

d.Utilisationdunprojetexistantcommemodle
Cestpeuttrelasolutionlaplussimplepourconstruireunmodledeprojet.

- 6-

ENI Editions - All rigths reserved

Dansunpremiertemps,crezlemodlecommeunprojetordinaire. Une fois votre projet finalis, exportezle comme modle. Le menu Fichier Exporter le modle dmarre un assistantpourvousguiderpendantlacrationdumodle.

Cettepremirebotededialoguevousproposedechoisirleprojetquevoussouhaitezexporterainsique,larubrique delabotededialoguedecrationdeprojetdanslaquelleseraplaclefuturmodle.

Cettedeuximebotededialoguevousinvitechoisiruneicnepourvotremodledeprojet,unnompourlemodle etunedescription.Deuxoptionssupplmentairesvouspermettentdeprendreencompteimmdiatementlenouveau modledansVisualStudioetdevousprsenterlersultatdelagnrationenvousaffichantlecontenudufichierzip cr.Aprsvalidationdecettedernirebotededialogue,lenouveaumodledeprojetestdisponibledansVisual Studio. ette mthode est trs simple pour construire un nouveau modle de projet et vite de se torturer lesprit C aveclasyntaxedufichier.vstemplate.

ENI Editions - All rigths reserved

- 7-

Danslecadredundveloppementenquipe,ilpeuttreintressantdepartagerlesmodlespersonnalissentre touslesmembresdelquipe.
s

Recopiezlesfichierszipsurunpartagerseau. Configurez lenvironnement Visual Studio pour lui permettre daccder aux modles. Cette modification seffectue parlabotededialoguedisponibleparlemenuOutilsOptions.

2.Modificationdunprojet
Les modles de projets sont trs utiles pour crer rapidement les bases dune application mais, trs frquemment, ncessiteront lajout de nouveaux lments au projet. Ces ajouts se font par lintermdiaire du menu contextuel de lexplorateurdeprojet.
s

ActivezloptionAjouter Nouvellmentafindechoisirletypedlmentquevoussouhaitezajouterauprojet.La botededialogueproposeunnombreimpressionnantdlmentspouvanttreajoutsunprojet.

- 8-

ENI Editions - All rigths reserved

Indiquezensuiteunnompourlefichiercontenantlenouvellment.

n fonction des types de projet, des options supplmentaires permettant rapidement dajouter un nouvel E lment sont disponibles dans le menu contextuel. Cellesci affichent simplement la bote de dialogue prcdenteavecletypedlmentcorrespondantdjprslectionn.

Ilestgalementpossibledereprendreunlmentexistantdansunautreprojetetdelajouterunprojet.Utilisez, danscecas,loption Ajouter lementexistantdumenucontextueldelexplorateurdeprojets.Unebotededialogue vousproposelaslectiondufichierincluredansleprojet.

Le bouton Ajouter de cette bote de dialogue comporte un menu permettant dajouter le fichier normalement (une copie locale du fichier est alors ralise) ou de crer un lien sur le fichier (le fichier original est utilis). Il faut tre prudentaveccettepossibilitcarlefichiernappartient pasrellement lapplicationmaispeuttrepartagentre plusieurs applications. Si le fichier est supprim du disque, toutes les applications lutilisant ne pourront plus tre compiles. agestiondesfichiersdanslexplorateurdesolutionsestidentiquelagestiondesfichiersdanslexplorateur L Windows. Les fichiers peuvent tre copis et colls ou dplacs par un cliqugliss dun dossier un autre. Lutilisationdestouches[Ctrl],[Shift]et[Ctrl][Shift]pendantlecliquglissmodifielactionralise.Uncliqugliss auseindunmmeprojeteffectueundplacementdefichier.Silestralisentredeuxprojets,cestalorsunecopie
ENI Editions - All rigths reserved - 9-

de fichier qui est effectue. Ce comportement peut tre modifi par lutilisation de la touche [Shift] lors du cliqu gliss. Pour raliser une copie de fichier au sein dun projet, la touche [Ctrl] sera utilise conjointement avec le cliqugliss.Lacrationdunlienseffectueaveclacombinaisondetouches[Ctrl][Shift]lorsducliqugliss.

Afin de retirer un lment dun projet, deux options sont accessibles par le menu contextuel de lexplorateur de solutions :
q

LoptionSupprimersupprimelefichierduprojetmaisgalementdudisque. Loption Exclureduprojetretirelefichierduprojet,maisnelesupprimepasdudisque.Cetteoptionestutile sidautresprojetsutilisentcefichierparlintermdiairedunlien.

3.Propritsdesprojets
Les projets sont des lments fondamentaux de la conception dune application avec Visual Basic. Ils possdent de nombreusespropritspermettantdemodifierleurscomportementsaumomentdelaconceptionoudelexcutionde lapplication. Lensemble des proprits sont accessibles par une bote de dialogue prsentant, par lintermdiaire donglets,lesdiffrentesrubriquesdeconfigurationdunprojet.
s

Activez cette bote de dialogue par loption Proprits du menu contextuel de lexplorateur de projet ou par le bouton delabarredoutilsdelexplorateurdeprojet.

a.Propritsdapplication
Lespropritsprsentessurcetongletvontpermettredeconfigurerlecomportementdelapplication.

Nomdelassembly Cette proprit dtermine le nom utilis pour le fichier rsultant de la compilation de lapplication. Par dfaut, ce
- 10 ENI Editions - All rigths reserved

fichierportelemmenomqueleprojetmaisilspeuventtremodifisindpendammentlun de lautre.Lextension associeaufichierdpenddutypeduprojet. Typedapplication Cette proprit dtermine le type dapplication gnre par la compilation du projet. En rgle gnrale, cette propritestdtermineparlemodlechoisiaumomentdelacrationduprojet.Cettepropritesttrsrarement modifie par la suite car elle dpend normment du code de votre projet (si vous avez conu votre application comme une application Windows et que souhaitez la considrer comme une application console, il risque dy avoir beaucoupdecodeinutile !). Formulairededmarrage Cettepropritdterminelepointdentredanslapplication,lorsdesonexcution.Gnralement,ellecorrespond la fentre principale de lapplication ou une procdure Sub Main. Cette proprit nest disponible que pour les projetspouvantsexcuterdemanireautonome.Elleestinutilepourlesprojetsdetypebibliothque. Espacedenomsracine Tousleslmentsduprojet,accessiblespartirdunautreprojet,appartiennentlespacedenomdfiniparcette proprit. Celleci vient sajouter aux ventuels espaces de noms, dfinis au niveau du code luimme. Par dfaut, cette proprit correspond au nom du projet mais elle peut tre modifie indpendamment de celuici. Elle peut mmetrevidevouspermettantainsidegrerlesespacesdenomsdirectementdanslecode. Icne Cettepropritconfigurelicneassocieaufichiercompilduprojet,lorsquilestaffichdanslexplorateurWindows oulorsquelapplicationapparatsurlabarredestchesdeWindows. Informationsdelassembly Cette option permet de fournir des informations sur le code gnr par la compilation du projet. Une bote de dialoguepermetderemplirdiffrentesrubriquesconcernantladescriptionduprojet.

Lutilisateur de votre code pourra consulter ses informations en affichant les proprits du fichier compil dans lexplorateurWindows. AfficherlesparamtresUAC Cetteoptionpermetdedterminerleniveaudexcutionrequispourlapplication.Cesinformationssontutilisespar lemcanisme UserAccountControl(UAC)deWindowsVista.Ildterminesousquelleidentitvatreexcutlecode delapplication.Troisvaleurssontpossibles
q

asInvoker : lapplicationsexcute avec lidentitactuelledelutilisateuretnedemandepasdaugmentation

ENI Editions - All rigths reserved

- 11 -

deprivilges.
q

highestAvailable : lapplicationsexcuteavecleplushautniveaudeprivilgesdelutilisateur. requireAdministrator : lapplication doit sexcuter avec le privilge administrateur et UAC peut vous demandervotreconsentementpouraccorderlaugmentationdesprivilges.

P ourlessystmesautresqueWindowsVistacetteoptionestignore.

Activerlinfrastructuredelapplication Cette option dtermine si vous souhaitez activer une interaction plus volue entre lapplication et le systme dexploitation.Sicetteoptionestactive,llmentdedmarragedelapplicationdoitobligatoirementtreunefeuille. Lutilisationdecetteoptionactiveladisponibilitdespropritssuivantes. ActiverlesstylesvisuelsXP SicetteoptionestactiveetquelapplicationsexcutesurunsystmeWindowsXP,alorslinterfaceutilisateurde lapplicationsadapteraauthmeWindowsactif. Applicationinstanceunique Par dfaut, vous pouvez lancer autant dexemplaires dune mme application que vous le souhaitez sur un poste toutefois,ilpeutparfoistreutiledenautoriserlefonctionnementquedunseulexemplairedelapplication un instant donn (problme de licence dutilisation, prservation des ressources de la machine...). Lactivation de cette option garantit quil ny aura pas plus dun exemplaire de lapplication sexcutant sur la machine. Si une nouvelle instance est lance alors quil en existe dj une sur le systme, le focus passe immdiatement sur linstanceexistante.Auniveaudelapplication,lvnementStartupNextInstanceestgalementdclench. EnregistrerMy.settingslorsdelarrt Cette option indique si les proprits personnalises de lapplication sont sauvegardes la fermeture de lapplication.Cecipermet,parexemple,demmoriserlesprfrencesdelutilisateur. Modedauthentification Pardfaut,lesapplicationsVisualBasicutilisentlauthentificationWindowspouridentifierlutilisateurdelapplication. Sivoussouhaitezgrervousmmecetteidentification,vousdevezutiliserloptionDfiniauniveaudelapplication. Modedarrt Cette option dtermine le comportement de lapplication lors de son arrt. Par dfaut, lexcution de lapplication sarrtelorsquelafentrededmarragedelapplicationestferme,mmesilyadautresfentresactives(hormis bien sr une fentre modale). Loption la fermeture du dernier formulaire provoque larrt de lapplication la fermeturedeladernirefentreactivedelapplicationoulorsquelesinstructions My.application.exit ou endsont appelesexplicitementdanslecode. crandedmarrage Les crans daccueil sont souvent utiliss pour fournir des informations lutilisateur, pendant le dmarrage de lapplication. Visual Studio propose un modle dcran daccueil personnalisable. Cet cran apparat pendant le chargementdelafentreprincipaledelapplication. Afficherlesvnementsdelapplication Cette option permet daccder aux gestionnaires dvnements de lobjet application. Ces gestionnaires dvnementspermettentderagirfacediffrentessituations : Startup Lapplicationdmarre. StartUpNextInstance Unnouvelexemplairedelapplicationvientdtrelanc.

- 12 -

ENI Editions - All rigths reserved

Shutdown Lapplicationsarrte. UnHandledException Uneexceptionnongrevientdeseproduire. NetworkAvailabilityChanged Laccsaurseauvientdtremodifi(lecbleestdbranchourebranch).

b.Rfrencesetimportationsdunprojet
Pourpouvoirutiliserdeslmentsexternes,disponiblesdansunassembly,vousdevezajouterunerfrencecet assemblage. Lapagedepropritsuivanteregroupetouteslesinformationsconcernantlesrfrencesdunprojet.

Dans cette page de proprit, la liste References prsente tous les assemblages actuellement rfrencs par le projet. Cette liste peut tre mise jour laide des boutons Ajouter, Supprimer, Mettre jour la rfrence Web qui permettentrespectivement,dajouterunerfrencelocaleouunerfrenceWeb,desupprimerunerfrenceoude mettrejourunerfrenceWeb. Le bouton Chemins daccs des rfrences permet dindiquer des rpertoires supplmentaires contenant des assemblagesdisponibles.Cesrpertoiressontscrutslouverturedelabotededialoguedajoutderfrenceet les ventuels assemblages quils contiennent sont ajouts la liste des assemblages disponibles. Lorsquune rfrence est ajoute un assemblage, le fichier original est utilis lors de la premire excution de lapplication. Vouspouvezutiliserlacrationautomatiquedunecopielocaledecefichierdanslerpertoiredelapplication.Pour cela :
s

Modifiez la proprit Copy Local de la rfrence concerne. Aprs avoir slectionn la rfrence, vous pouvez modifiercettepropritdanslafentredepropritsdeVisualStudio.
ENI Editions - All rigths reserved - 13 -

Le bouton Rfrences inutilises propose la liste de toutes les rfrences non utilises dans le code et vous proposedelessupprimerduprojet. Leslmentsdisponiblesdanslesassemblagesrfrencsfonttrscertainementpartiedunespacedenom.Pour pouvoirlesutiliserfacilementilestpossibledimporterautomatiquementcertainsespacesdenom.Laliste Espaces de noms imports reprend les espaces de nom imports automatiquement dans tous les codes du projet. Vous pouvezcompltercettelisteensaisissantdanslazonedetextelenomdelespacedenomimportetenvalidant avecleboutonAjouteruneimportationutilisateur.

c.Propritsdedbogage
Lespropritsprsentessurcettepagedterminentlecomportementduprojetlorsdesondbogage.

Actiondedmarrage Cettepropritdterminelecomportementduprojetlorsdudmarragedudbogage.Troisoptionssontpossibles :
q

Dmarrerleprojetindiquequeleprojetluimmedoittreexcut.Cetteoptionnestutiliserquepourles projetsdapplicationWindowsoulesprojetsdapplicationconsole. Dmarrer le programme externe permet de provoquer lexcution dune application externe qui va se chargerdefairedesappelsaucodenotreprojet.Cetteoptionestutilisepourledbogagedebibliothques declasses. Dmarrer le navigateur avec lURL est identique loption prcdente, mis part que lapplication dmarreestuneapplicationWeb.

Optionsdedmarrage Arguments de la ligne de commandeprciselesargumentspassslapplicationlorsdesonexcutionparVisual Studio. Ces arguments peuvent tre utiliss par le code pour dterminer laction entreprendre : par exemple, dmarrerlapplicationenmodemaintenance. Rpertoiredetravailpermetdespcifierlerpertoireactifpendantlexcutiondelapplication. Utiliserlordinateurdistantautoriseledbogageduneapplicationsexcutantsuruneautremachine.Danscecas, lenomdelamachinedistante,surlaquellelecodevasexcuter,estindiquer. Activerlesdbogueurs

- 14 -

ENI Editions - All rigths reserved

Cesoptionsdterminentlesdiffrentstypesdedbogueuractifs,encomplmentdudbogueurdecodemanagde VisualStudio.

d.Propritsdecompilation
Lespropritsdecettepageconcernentlefonctionnementducompilateuretsonventuelleoptimisation.

Chemindesortiedelagnration Cettepropritindiquelerpertoiredanslequelestcopilefichierrsultantdelacompilationduprojet.Pardfaut,il sagitdusousrpertoirebindurpertoiredanslequelsetrouveleprojet. OptionExplicit Cetteoptionpermetdexigerounonquetoutevariablesoitdclareavantdtreutilise.Ellesappliquetousles fichierssourcedunprojet.Ilestcependantpossible,pourunfichierparticulier,demodifiercetteoptionenajoutantla directiveOption Explicit OnouOption Explicit Offendbutdefichier. OptionStrict Cetteoptionpermetdecontrlerlesconversionseffectues.Siuneconversionrestrictiveesttente,lecompilateur gnreuneerreur.Commeloptionprcdente,cellecisappliquetouslesfichierssourcedunprojetetpeuttre modifiepourunprojetparticulieravecladirectiveOption Strict OnouOption Strict Off. OptionCompare Cette option dtermine comment la comparaison de chanes de caractres est effectue dans lapplication. Avec la valeur Binary, lapplication fait une distinction entre les caractres en minuscule et en majuscule, lors dune comparaison.LavaleurTextpermetdvitercettedistinction. OptionInfer Cette option indique si linfrence des types des variables locales est active. Avec cette option, le compilateur dterminedeluimmeletypedesvariablespartirdesvaleursquileursontaffectes. Avertissements Lecompilateurestcapablededtecterdesproblmespotentielsdansvotrecodeetdegnrerdesavertissements associs.Vousavezlapossibilitdeconfigurerlactionentrepriseparlecompilateurpourdiffrentescatgoriesde

ENI Editions - All rigths reserved

- 15 -

problmes.Lestroisactionspossiblessont :
q

Aucun : lecompilateurignoreleproblme. Avertissement : lecompilateurgnreunavertissementdanslalistedestches. Erreur : lecompilateurgnreuneerreurdecompilation.

Vouspouvezgalementdvalidertousleswarningsenutilisantloption Dsactivertouslesavertissementsou,au contraire,lestraitercommedeserreursavecloptionConsidrertouslesavertissementscommedeserreurs. GnrerlefichierdedocumentationXML Aveccetteoption,lecompilateurrecherchedanslecodelescommentairesspciauxplacsgrceauxcaractreset lesutilisepourgnrerlefichierdedocumentation.Cefichierestcrdanslerpertoiredanslequelestgnrle fichiercompil. Optionsavancesdecompilation Cetteoptionproposeunebotededialoguepermettantlaconfigurationavanceducompilateur.

Cettebotededialoguepermetlaconfigurationdesoptionssuivantes :
q

Supprimerlavrificationdedbordementlorsdecalculssurdesentiers. Autoriserlesoptimisationsdecodelorsdelacompilation. Spcifierladresselaquelleunebibliothquedllseracharge. Indiquersidesinformationsdedbogagesontajoutesaursultatdelacompilation. Dfinirlesconstantesdecompilation. DemanderlagnrationdinformationspourpermettrelasrialisationXML. Indiqueruntypedeprocesseurspcifiquepourlexcutiondecetteapplication.

- 16 -

ENI Editions - All rigths reserved

Indiquerlaversionduframeworkutilisepourlexcutiondelapplication.

e.Ressourcesdunprojet
Les ressources sont utilises pour externaliser certains lments dune application. Elles permettent de raliser rapidementdesmodificationssimplesduneapplication,sansavoirrechercherdansdesmilliersdelignesdecode. Lutilisation la plus classique consiste sparer, du code, les constantes chane de caractres. Vous pouvez galementcrerdesressourcesicones,images,fichiertexte,ouaudio.Touteslesressourcessontgresparcette botededialogue.

Pour chaque ressource, indiquez un nom et une valeur. Le nom sera bien sr utilis dans le code pour pouvoir rcuprerlavaleur.

En fonction du type de ressource, vous avez votre disposition un diteur adapt pour modifier la ressource. Les ressources peuvent tre lies ou embarques, en fonction de leur type. Une ressource lie est stocke dans son propre fichier et le fichier Resources.resx contient simplement un lien vers le fichier original. Une ressource embarqueeststockedirectementdanslefichierResources.resxdelapplication.Danstouslescas,lesressources serontcompilesdanslexcutabledelapplication. Voyons maintenant comment accder aux ressources partir du code de lapplication. Toutes les ressources sont accessiblesparlapropritResourcesdelobjetMy.Lexemplesuivantutilise :
q

Uneressourcechanedecaractres(MessageBienvenueFr) Uneressourceicon(IconAppli) Uneressourceimagebitmap(ImageFond) Unfichierson(Musique)

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.Icon = My.Resources.IconAppli Me.BackgroundImage = My.Resources.ImageFond My.Computer.Audio.Play(My.Resources.Musique, AudioPlayMode.BackgroundLoop) MsgBox(My.Resources.MessageBienvenueFr) End Sub

f.Paramtresdapplication
Les paramtres dapplication sont, en gnral, utiliss pour stocker et charger dynamiquement les paramtres de configuration dune application, comme par exemple, les prfrences de lutilisateur ou les derniers fichiers utiliss danslapplication. Lesparamtresdoiventdabordtrecrsdanslapagedepropritssuivante.

ENI Editions - All rigths reserved

- 17 -

Pourchaqueparamtre,vousdevezfournirunnom,utilispourmanipulerleparamtredanslecodeetuntype,pour leparamtre. Vousdevezgalementfourniruneportepourleparamtre.Deuxchoixsontpossibles : Utilisateur Leparamtrepeuttremodifipendantlefonctionnementdelapplication. Application Leparamtreestenlectureseulependantlexcutionetpeutuniquementtremodifiparlintermdiaire de cette botededialogue. Ladernirechosefaireestdespcifierunevaleurpourleparamtre. Nous allons maintenant tudier comment manipuler les paramtres dans le code. Nous devons raliser trois oprations.
q

Audmarragedelapplication,nousdevonschargerlesparamtres.Laccsauxparamtressefaitparla propritSettingsdelobjetMy.

My.Settings.Reload()
q

Pendant lexcution de lapplication, nous avons accs aux paramtres galement par cette proprit SettingsdelobjetMy,laquellenousajoutonslenomduparamtre.Cecinouspermetlalecturedelavaleur duparamtreoulaffectationdunevaleurauparamtre.

Me.BackColor = My.Settings.CouleurFond My.Settings.DerniereUtilisation = Now


q

lafermeturedelapplication,nousdevonsenfinsauvegarderlesparamtresenutilisantlamthodeSave :

My.Settings.Save() Pourchaqueutilisateurdelapplication,uneversiondistinctedesparamtresestsauvegarde.

g.Autresparamtresdeconfiguration
Les autres rubriques de configuration du projet concernant le dploiement de lapplication sont traites dans un chapitrespcifique.

- 18 -

ENI Editions - All rigths reserved

Lesvariables,constantesetnumrations
1.Lesvariables
Les variables vont vous permettre de mmoriser, pendant lexcution de votre application, diffrentes valeurs utiles pourlefonctionnementdevotreapplication.Unevariabledoitobligatoirementtredclareavantsonutilisationdans lecode.Lorsdeladclarationdunevariable,vousfixezsescaractristiques.

a.Nomdesvariables
Voyonslesrglesrespecterpournommerlesvariables :
q

lenomdunevariablecommenceobligatoirementparunelettre, ilpeuttreconstitudelettres,dechiffresouducaractresoulign(_), ilpeutcontenirunmaximumde1023caractres(pratiquement,ilestprfrabledeselimiterunetailleplus raisonnable), il ny a pas de distinction entre minuscules et majuscules (la variable AgeDuCapitaine et quivalente ageducapitaine). Cependant, dautreslangagesfontunedistinctionentreminusculesetmajuscules,aussiil faudratreprudentsivousgnrezunassemblyutilisparunautrelangage. lesmotsclsdulangagenedoiventpastreutiliss(cestmalgrtoutpossiblemaisdanscecas,lenomde lavariabledoittreencadrparlescaractres[et].Parexemple,unevariablenommenextserautilise danslecodesouscetteforme[next]=56).

b.Typedesvariables
Enspcifiantuntypepourunevariable,nousindiquonsquellesinformationsnousallonspouvoirstockerdanscette variable. Deuxcatgoriesdetypesdevariablessontdisponibles:
q

Lestypesvaleur : lavariablecontientrellementlesinformations. Lestypesrfrence : lavariablecontientladressemmoireosetrouventlesinformations.

LesdiffrentstypesdevariablesdisponiblessontdfinisauniveauduFrameworkluimme.Vouspouvezgalement utiliser les alias dfinis au niveau de VB, peuttre plus explicites. Ainsi, le type System.Int32 dfini au niveau du frameworkpeuttreremplacparletypeintegerdansVisualBasic. Lesdiffrentstypespeuventtreclasssensixcatgories. Lestypesnumriquesentiers Typesentierssigns Sbyte Short Integer Long Typesentiersnonsigns 128 32768 2147483648 9223372036854775808 127 32767 2147483647 9223372036854775807 8bits 16bits 32bits 64bits

ENI Editions - All rigths reserved

- 1-

Byte UShort UInteger ULong

0 0 0 0

255 65535 4294967295 18446744073709551615

8bits 16bits 32bits 64bits

Lorsquevouschoisissezuntypepourvosvariablesentires,vousdevezprendreencomptelesvaleursminimaleet maximalequevousenvisagezdestockerdanslavariableafindoptimiserlammoireutiliseparlavariable.Ilest,en effet,inutiledutiliseruntypeLongpourunevariabledontlavaleurnexcderapas50,untypeByteestdanscecas suffisant. conomiedemmoiresembledrisoirepourunevariableuniquemaisdevientapprciablelorsdelutilisation L detableauxdegrandedimension.

Siparcontrevoussouhaitezoptimiserlavitessedexcutiondevotrecode,ilestprfrabledutiliserletypeInteger. Lestypesdcimaux Single Double 3.40282347E+38 1.7976931348623157E+308 79228162514264337593543950335 3.40282347E+38 1.7976931348623157E+308 4octets 8octets

Decimal

79228162514264337593543950335

16octets

Lesmmesconsidrationsdoptimisationquepourlesvariablesentiresdoiventtreprisesencompte.Danscecas, une rapidit dexcution maximale est obtenue avec le type Double. Le type Decimal est plus spcialement recommandpourlescalculsfinancierspourlesquelsleserreursdarrondissontprohibes,maisaudtrimentdela rapiditdexcutionducode. Lestypescaractres LetypeChar(caractres)estutilispourstockeruncaractreunique.Unevariabledetypecharutilisedeuxoctets pour stocker le code Unicode du caractre. Dans jeu de caractre Unicode, les 128 premiers caractres sont identiquesaujeudecaractreASCII,lescaractressuivantsjusqu255correspondentauxcaractresspciauxde lalphabetlatin(parexemple,lescaractresaccentus),leresteestutilispourdessymbolesoupourlescaractres dautresalphabets. Pourpouvoirstockerdeschanesdecaractres,ilconvientdutiliserletypeString,quireprsenteunesuitedezro 2147483648caractres.Leschanesdecaractressontinvariablescar,lorsdelaffectationdunevaleurunechane decaractres,delespaceestrservenmmoirepourlestockage.Si,parlasuite,cettevariablereoitunenouvelle valeur, le systme lui assigne un nouvel emplacement en mmoire. Heureusement, ce mcanisme est transparent pour nous et la variable fera toujours automatiquement rfrence la valeur qui lui a t assigne. Avec ce mcanisme, les chanes de caractres peuvent avoir une taille variable. Lespace occup en mmoire est automatiquementajustlalongueurdelachanedecaractres. Pouraffecterunechanedecaractresunevariable,lecontenudelachanedoittresaisientre,commedans lexemplecidessous : Exemple NomDuCapitaine = "Crochet"

enombreusesfonctionspermettentlamanipulationdeschanesdecaractresetserontdtaillesplusloin D dans ce chapitre. Il existe galement un type String sous forme dune classe permettant galement la manipulationdeschanesdecaractres.Danscecas,lamanipulationseferaparlesmthodesdisponiblesdans cetteclasseString.Ellesserontgalementdtaillesdansunparagraphespcifiqueplusloindanscechapitre.

LetypeBoolean LetypeBooleanpermetdutiliserunevariablequipeutprendredeuxtatsvrai/faux,oui/non,on/off.

- 2-

ENI Editions - All rigths reserved

LaffectationsefaitdirectementaveclesvaleursTrueouFalse,commedanslexemplesuivant : Disponible=True Modifiable=False Il est toutefois possible daffecter une valeur numrique une variable de type Boolean. Dans ce cas, une valeur gale zro sera considre comme un boolean False alors que toute autre valeur positive ou ngative sera considrecommeunbooleanTrue. LetypeDate LetypeDatepermetdestocker,dansunevariable,desinformationsconcernantunedateetuneheure. Laffectationsefaitenencadrantlavaleurparlesigne#commedanslexemplesuivant : Aujourdhui=#10/27/2005 14 :58 :23# Le format utilis pour affecter une valeur une variable de type date est toujours de la forme #mois/jour/anne heure :minute :seconde#indpendammentduformatdedateconfigursurvotresystmedexploitation.Lesheures peuvent tre spcifies au format 12 heures ou 24 heures. De toute faon, lenvironnement de dveloppement surveillevotresaisieettransformeratoujoursladateauformat12heures.Ainsi,lexempleprcdentseramodifi parlenvironnementdedveloppementaveclaformesuivante : Aujourdhui=#10/27/2005 2:58:23 PM# Si vous affectez, une variable de type Date, une valeur contenant simplement une heure, Visual Basic considre quilsagitdupremierjanvierdelan1lheurequevousavezindique.Parexemple : Jour=#12 :35 :30# Correspondaupremierjanvierdelan112heures35minutes30secondes. Inversementsivousaffectez,unevariabledetypeDate,unevaleurcontenantsimplementunedate,VisualBasic considrequilsagitdujourquevousavezindiqu,minuit. LetypeObject CestpeuttreletypeleplusuniverseldeVB.DansunevariabledetypeObject,vouspouvezstockernimportequoi. Enfait,cetypedevariablenestockerien.Lavariablevacontenirnonpaslavaleurellemme,maisladresse,dans la mmoire de la machine, o lon pourra trouver la valeur de la variable. Rassurezvous, tout ce mcanisme est transparentetvousnaurezjamaismanipulerlesadressesmmoiredirectement. nevariabledetypeObjectpourradoncfairerfrencenimportequelautretypedevaleurycomprisdes U typesnumriquessimples.Cependant,lecodeseramoinsrapidedufaitdelutilisationdunerfrence.

LestypesNullables Ilarriveparfoisquedanscertainescirconstancesunevariablenapasdevaleurbiendfinie.Cestparexemplelecas lorsdelarcuprationdinformationenprovenancedunebasededonnessipourcertainschampsaucunevaleur na t affecte dans la base. Comment reprsenter cette situation avec des variables dans Visual Basic. Une solutionconsisteutiliserunevaleurnayantaucunesignificationpourlapplication.Parexemple,pourunevariable numriquereprsentantuncodepostaldanslapplication,ilpeuttreenvisagdaffectercettevariableunevaleur ngative dans le cas o le code postal nest pas renseign. Le reste du code doit bien sr tenir compte de cette convention.Pourcertainstypesdinformationscettesolutionnestpasenvisageable.Prenonslecasdunevariablede type Boolean pour lequel il ny a que deux valeurs admises, true ou false, comment reprsenter le fait que le contenudelavariablenestpasnonrenseign. Pourrsoudreceproblme,VisualBasicproposelestypesNullables.Ilspermettentauxvariablesdetypevaleurde ne contenir aucune information. Pour activer cette fonctionnalit sur une variable il faut simplement utiliser le caractre ?lasuitedunomdelavariableoudesontypedansladclarationcommedanslexemplesuivant. Dim CodePostal ? as integer ou Dim CodePostal as integer? Ilfautparcontretreprudentlorsdelutilisationdunevariabledecetypeetvrifieravantdelutilisersiellecontient effectivementunevaleur.Pourcela,ilfauttesterlapropritHasValuedelavariablepourdterminersiellecontient

ENI Editions - All rigths reserved

- 3-

effectivement une valeur. Si cest le cas cette valeur est disponible via la proprit Value de la variable. Cette propritestenlectureseulecarlaffectationdunevaleursefaitdirectementsurlavariable. codePostal=17000 If codePostal.HasValue Then Console.WriteLine(codePostal) Else Console.WriteLine("Code postal vide") End If Il est indispensable de tester la proprit HasValue avant lutilisation de la proprit value car si la variable ne contient pas de valeur il y a dclenchement dune exception. Cest le cas dans lexemple cidessous puisquune variablenullable,contrairementunevariablenormale,necontientpasdevaleurpardfaut.

Unevariablecontenantunevaleurpeutrevenirltatnonrenseignsionluiaffectelavaleurnothing. Lutilisation de variables de type boolean nullable avec les oprateurs logiques and et or peut parfois tre problmatique.Voicilatabledevritdecesdeuxoprateursavecdesvariablesnullables. B1 nothing nothing nothing true true true false false false B2 nothing true false nothing true false nothing true false B1andB2 nothing nothing false nothing true false false false false B1orB2 nothing true nothing true true true nothing true false

Ledernierpointclaircirconcernelutilisationdunbooleannullabledansunestructureconditionnelle.Regardonsle codesuivant : Dim condition As Boolean? If condition Then Console.WriteLine("le test est positif") Else Console.WriteLine("le test est ngatif") End If Linstruction if considre que le test est positif uniquement si la variable contient la valeur true. Pour les deux autres cas , valeur false ouvaleur non renseigne, le test est considr comme ngatif et le code du bloc else sexcute.

- 4-

ENI Editions - All rigths reserved

c.Conversionsdetypes
Les conversions de types consistent transformer une variable dun type dans un autre type. Les conversions peuventseffectuerversuntypesuprieurouversuntypeinfrieur. Si une conversion vers un type infrieur est utilise, il risque dy avoir une perte dinformations. Par exemple, la conversionduntypeDoubleversuntypeLongferaperdrelapartiedcimaledelavaleur. Exemple Dim x As Double Dim y As Long x = 21.123456789012344 y = x Console.WriteLine(" valeur de x : " & x) Console.WriteLine(" valeur de y : " & y) Affiche : valeur de x : 21,1234567890123 valeur de y : 21 Uneoptionducompilateurpermetdevrifierlexistencedecegenredeconversion.

En fonction de la configuration de cette option, un warning ou une erreur de compilation sera gnre si une telle conversionesttente. Elles peuvent galement tre implicites ou explicites en fonction du code utilis. Les conversions implicites sont ralises simplement par affectation dune variable dun type une variable dun autre type. Les conversions explicitesncessitentlutilisationdunmotclspcifiquequisontdelaformeCxxxouxxxcorrespondantautypedans lequellavaleurseraconvertie. Letableausuivantrsumecesdiffrentsoprateurs. Oprateur CBool Typededestination Boolean

ENI Editions - All rigths reserved

- 5-

CByte CChar CDate CDbl CDec CInt CLng CObj CSByte CShort CSng CStr CUint CULng CUShort

Byte Char Date Double Decimal Integer Long Object SByte Short Single String UInteger ULong UShort

Un autre oprateur (CType) permet la conversion vers un type standard du langage mais surtout vers un type personnalis,commeparexemple,uneclasse. Cetoprateurestplusgnraletilattenddeuxparamtres :
q

lavariableconvertir letypeverslequeldoitsefairelaconversion.

utilisation de ces oprateurs ne provoque pas derreur de compilation, si vous tentez une conversion L restrictive,carlecompilateurconsidrealorsquevouslaralisezentouteconnaissancedecause.

Lesconversionspartirdechanesdecaractresetversdeschanesdecaractressontplusspcifiques. Conversionversunechanedecaractres La fonction format permet de choisir la forme du rsultat de la conversion dune valeur quelconque en chane de caractres. Cette fonction attend comme paramtre la valeur convertir et le format dans lequel vous souhaitez obtenirlersultat.Cedeuximeparamtreestfournisousformedunechanedecaractresexprimantlaspectdu rsultatdsir. Certainsformatsstandardssontprdfinismaisilestgalementpossibledepersonnaliserlersultatdelafonction format.Ciaprs,lesparamtresdecettefonctionsontprsents. Formatagedevaleursnumriques Currency Formatmontairetelquedfinidanslesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. Exemple :format(12.35,"Currency")

- 6-

ENI Editions - All rigths reserved

Rsultat : 12,35 Fixed Utiliseaumoinsuncaractrepourlapartieentireetaumoinsdeuxcaractrespourlapartiedcimaledunnombre. Le sparateur dcimal est celui dfini dans les options rgionales et linguistiques du panneau de configuration du systme. Exemple : format(.2,"Fixed") Rsultat : 0,20 Percent Multiplielavaleurindiqueparcentetajoutelesymbole%lasuite. Exemple : format(.2,"Percent") Rsultat : 20,00% Standard Format numrique tel que dfini dans les options rgionales et linguistiques du panneau de configuration du systme. Exemple : format(245813.5862,"Standard") Rsultat : 245 813,59 Scientific Notationscientifiqueavecdeuxchiffressignificatifs. Exemple : format(245813.58,"Scientific") Rsultat : 2,46E+05 E Notationscientifiqueavecsixchiffressignificatifs. Exemple : format(245813.5862,"E") Rsultat : 2,458136E+005 X Formathexadcimal.Utilisableuniquementpourlesvaleursentires. Exemple :format(245813,"X") Rsultat : 3C035 Yes/No True/False On/Off RetourneNo,False,OffsilavaleurestgalezrosinonretourneYes,True,Onpourtouteslesautresvaleurs.

Chanedeformatagepersonnalisepourvaleursnumriques

ENI Editions - All rigths reserved

- 7-

0 Rserveunemplacementpouruncaractrenumrique.Leszrosnonsignificatifssontaffichs. Exemple : format(245813.12,"00000000000.0000") Rsultat : 00000245813,1200 # Rserveunemplacementpouruncaractrenumrique.Leszrosnonsignificatifsnesontpasaffichs. Exemple : format(245813.12,"###########.####") Rsultat : 245813,12 . Rserve un emplacement pour le sparateur dcimal. Le caractre rellement utilis dans le rsultat dpend de la configurationdesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. , Rserveunemplacementpourlesparateurdemillier.Lecaractrerellementutilisdanslersultatdpenddela configurationdesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. \ Permet lutilisation dun caractre ayant une signification spciale comme caractre ordinaire dans une chane de formatage.Danslexemplesuivant,lecaractre\faitperdresasignificationspcialeaucaractre# Exemple : format(325,"commandeN\#0000") Rsultat : commande N#0325

Formatsdedateetheure G Format Date court et format Heure tel que dfini dans les options rgionales et linguistiques du panneau de configurationdusystme. Exemple : format(now,"G") Rsultat 17/10/2005 11:10:42 D Format Date longue tel que dfini dans les options rgionales et linguistiques du panneau de configuration du systme. Exemple : format(now,"D") Rsultat lundi 17 octobre 2005 d FormatDatecourttelquedfinidanslesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. Exemple : format(now,"d") Rsultat 17/10/2005 T

- 8-

ENI Editions - All rigths reserved

FormatHeuretelquedfinidanslesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. Exemple : format(now,"T") Rsultat 11:45:30 s Formattriable. Exemple : format(now,"s") Rsultat 2005-10-17T11:47:30

Chanedeformatagepersonnalisepourvaleursdedateetheure dJourdumoissanszrononsignificatif ddJourdumoisaveczrononsignificatif dddNomdujourdelasemaineabrg ddddNomdujourdelasemainecomplet MNumrodumoissanszrononsignificatif MMNumrodumoisaveczrononsignificatif MMMNomdumoisabrg MMMMNomdumoiscomplet hHeuresanszrononsignificatif(format12H) hhHeureaveczrononsignificatif(format12H) HHeuresanszrononsignificatif(format24H) HHHeureaveczrononsignificatif(format24H) mMinutesanszrononsignificatif mmMinuteaveczrononsignificatif sSecondesanszrononsignificatif ssSecondeaveczrononsignificatif yAnnesurunchiffre.Si,cestleseulcaractredelachanedeformatage,ilfautdanscecasutiliser%y aayyAnnesurdeuxchiffres yyyyAnnesurquatrechiffres zzzDcalageparrapportautempsuniversel(GMT).

Conversiondepuisunechanedecaractres LafonctionValpermetlaconversiondunechanedecaractresenvaleurnumrique.Ellelitlachanepassecomme paramtrejusqurencontreruncaractreautrequunchiffre,unespace,unetabulation,ouunpoint.Elletransforme ensuite cette portion de chane en valeur numrique, en tenant compte des ventuels paramtres de formatage dfinisauniveaudusystme,commeparexemplelesparateurdemillier.Lescaractres&Hou&Oplacsen
ENI Editions - All rigths reserved - 9-

dbutdechaneindiquentquelavaleurestexprimeenhexadcimalouenoctal. Exemple : val("&H7FFF") retourne 32767.0

d.Dclarationdesvariables
Pardfaut,lecompilateurVisualBasicconsidrequetoutevariablequiapparatdansuneapplicationdoitavoirt dclare.Vouspouvezmodifiercetteoptionducompilateurenajoutantdansvotrecodelaligne : Option Explicit Off Cetteoptiondoittrelapremirelignedufichiersourceetsappliqueraalorslensembleducodedecefichier. Avec cette option, vous navez plus lobligation de dclarer une variable avant de lutiliser. Bien que paraissant sympathique, cette solution risque de produire des erreurs difficiles trouver dans votre code. Regardons le code suivant : Function CalculTtc(Prix as Single) as Single Dim TempVal as Single TempVal=Prix * 1.196 Return TemVal End Function Pasdesoucisaumomentdelacompilationetpourtantnotrefonctionnousretourneratoujoursunevaleurgale zro.Silonregardedeplusprslecode,onsaperoitdunefautedefrappesurlaligne Return Temval : Ilmanque le p au nom de la variable Tempval. Lors de la compilation, Visual Basic a en fait considr quil sagissait dune nouvellevariableetladoncinitialisezro.Noydansdescentainesdelignesdecode,cegenrederreurspeut tre trs difficile dtecter. En gardant loption dobligation des variables, vous auriez dtect le problme ds la compilationdevotreapplication.

Voyons donc maintenant comment dclarer les variables en Visual Basic. Linstruction de base pour la dclaration dunevariableestlinstructionDim. Lasyntaxegnralededclarationdunevariableestlasuivante : Dim NomVariable1[,NomVariable2,NonVariableN] [As Type de la Variable] [= Valeur initiale] Lesparamtresentrecrochetssontoptionnelsdansladclaration.Siletypedelavariableestomis,elleauraletype pardfautdevbcestdireObject. Silavaleurinitialeestomise,lavariableserainitialisezrosiellecorresponduntypenumrique,unechane decaractrevidesielleestdutypeString,lavaleurNothingsielleestdutypeObjectetfalsesielleestdutype Boolean. Siplusieursnomssontspcifis,lesvariablescorrespondantesseronttoutesdutypeindiqu.

e.Infrencedetype
Nousavonsvudanslessectionsprcdentesquilestfortementsouhaitabledetoujoursdclarerlesvariablesavant leur utilisation. Cependant, dans certains cas, il est envisageable de laisser le compilateur raliser une partie du travail.Grcelinfrencedetype,lecompilateurpeutdterminerletypeutiliserpourunevariablelocaledclare sanslaclauseas.Pourcela,ilsebasesurletypedelexpressionutilisepourinitialiserlavariable.Danslexemple suivantlavariableestconsidrecommeunechanedecaractres. Dim nom = "Dupont" Pour sassurer que cette variable est bien considre comme une chane de caractres, il suffit de demander

- 10 -

ENI Editions - All rigths reserved

IntelliSensecequilnousproposepourutilisercettevariable.

NousavonsbiendispositionlesmthodesetpropritsdutypeString. Pourquelinfrencedetypefonctionnecorrectement,ilfautimprativementrespecterquelquesrgles :
q

Linfrence ne fonctionne que pour les variables locales, cestdire les variables dclares dans une procdureoufonction. Linitialisationdoitsefairesurlammelignedecodequeladclaration.Danslexemplecidessouslavariable estconsidrecommetantdetypeObject.

Lavariablenepeutpastredclarestatic.Sicestlecas,elleestconsidrecommetantdutypeObject.

f.Portedesvariables
Laportedunevariableestlaportiondecodepartirdelaquellelonpeutmanipulercettevariable.Elleestfonction delemplacementoestsitueladclarationetdumotclutilispourladclaration. Porteniveaubloc Seul le code du bloc aura la possibilit de travailler avec la variable (par exemple, dans une boucle for next). Toutefois, si le mme bloc de code est excut plusieurs fois pendant lexcution de la procdure ou fonction, cas dune boucle Do Loop par exemple, la variable ne sera cre que lors du premier passage dans la boucle et conservera sa valeur dun passage lautre dans la boucle. Pour modifier ce mode de fonctionnement, il suffit dinitialiser la variable au moment de sa dclaration. Seul le mot cl Dim peut tre utilis, pour la dclaration de la variableauseindunbloc. Exemple : Dim i As Integer For i = Dim Dim j = k =

0 j k j k

To 5 As Integer As Integer = 0 + 1 + 1

ENI Editions - All rigths reserved

- 11 -

Console.WriteLine("valeur de j :{0}", j) Console.WriteLine("valeur de k :{0}", k) Next Affiche : valeur de valeur de valeur de valeur de valeur de valeur de valeur de valeur de valeur de valeur de valeur de valeur de j k j k j k j k j k j k :1 :1 :2 :1 :3 :1 :4 :1 :5 :1 :6 :1

Porteniveauprocdure Seullecodedelaprocdureoudelafonctionoestdclarelavariablepourramodifiersoncontenu.Cegenrede variableestparfoisnomm variablelocale.Seul le mot cl Dim peut tre utilis pour la dclaration dunevariable dansuneprocdureoufonction. Porteniveaumodule Cetteportecorrespond,enfait,unevariabledclarelextrieurduneprocdureoufonction,cestdiredans unmodule,dansuneclasseoudansunestructure.Ladclarationpeutapparatrenimporteodanslecode(mais lextrieur de toute procdure ou fonction). Il est cependant recommand de regrouper les dclarations afin de faciliterlamaintenanceultrieureducode. Porteniveaunamespace Lavariableserautilisablepartirducodefaisantpartiedummenamespacemmesicecodeestsitudansdes modules diffrents. Si vous ne dclarez pas explicitement de namespace dans votre code, il y aura toujours le namespacepardfaut,etonpourradanscecasparlerpluttdeporteprojet.

g.Niveaudaccsdesvariables
Le niveau daccsdunevariablesecombineaveclaportedelavariableetdterminequelleportiondecodeale droit de lire et dcrire dans la variable. Un ensemble de mots cls permettent de contrler le niveau daccs. Ils sutilisentlaplacedumotclDimlorsdeladclarationdelavariable. Public Leslmentsdclarsaveclemotcl Publicserontaccessiblesdenimportequelleportiondecodeduprojetdans lequelilssontdclarsetdenimportequelautreprojetrfrenantceluidanslequelilssontdclars.Lemotcl Publicnepeutcependantpastreutilispourladclarationlintrieurduneprocdureoufonction. Protected Cemotclestutilisableuniquementlintrieurduneclasse.Ilpermetderestreindrelaccslavariable,aucode delaclasseetaucodedetouteslesclasseshritantdecelleci. Friend Leslmentsdclarsaveccemotclserontaccessiblesdelassemblagedanslequelilssontdclars.Cemotclne peutpastreutilislintrieurduneprocdureoufonction. ProtectedFriend Ce niveau daccs est lunion des niveaux daccs Protected et Friend. Il rend visible la variable lensemble de lassemblagedanslequelelleestdclareettouteslesclasseshritantdecelleoelleestdclare. Private Cemotclrestreintlaccslavariableaumodule,laclasseoulastructuredanslaquelleelleestdclare.Ilne peutpastreutilislintrieurduneprocdureoufonction. LemotclDimpeuttoutefoistreutilispartoutpourladclarationdunevariable,ilfautsesouvenirquedanslecas
- 12 ENI Editions - All rigths reserved

dunedclarationauniveaumodule,ilestquivalentaumot clPrivate.Encoreunefois,pourfaciliterlarelecturedu code,utilisezlemotcl Privateauniveaumoduleetrservezlemotcl Dimpourladclarationdevariableslocales (lintrieurdeprocduresoufonctions).

h.Duredeviedesvariables
La dure de vie dune variable nous permet de spcifier pendant combien de temps durant lexcution de notre applicationlecontenudenotrevariableseradisponible. Pourunevariabledclaredansuneprocdureoufonction,laduredeviecorrespondladuredexcutiondela procdure ou de la fonction. Ds la fin de lexcution de la procdure ou fonction, la variable est limine de la mmoire. Elle sera recre lors du prochain appel de la procdure ou fonction. Pour modifier ce mode de fonctionnement,ilfautdclarerlavariableaveclemotclstaticlaplacedeDim.Danscecas,lorsdupremierappel delaprocdureoufonction,lavariableestcreenmmoiremaisellenestpasdtruitelafindelaprocdureou fonction.Silaprocdureoufonctionestnouveauappeledanslecode,lemmeemplacementmmoireserautilis etlavariableretrouverasoncontenuprcdent.

2.Lesconstantes
Dans une application, il arrive frquemment que lon utilise des valeurs numriques ou chanes de caractres qui ne seront pas modifies pendant le fonctionnement de lapplication. Il est conseill, pour faciliter la lecture du code, de dfinircesvaleurssousformedeconstantes. Ladfinitionduneconstanteseffectueparlemotclconst. Exemple Const ValeurMaxi = 100 Const Message="Trop grand" Laconstantepeuttrealorsutilisedanslecodelaplacedelavaleurquellereprsente. If resultat> ValeurMaxi then Console.WriteLine(Message) Il sera parfois ncessaire de spcifier un type pour la constante que lon dclare (dans le cas o le compilateur est configurenmodeStrict).Ladclarationdelaconstanteauraalorslaformesuivante : Const ValeurMaxi as integer =100

es rgles concernant la dure de vie et la porte des constantes sont identiques celles concernant les L variables.

Lavaleurduneconstantepeutgalementtrecalculepartirduneautreconstante. Exemple Public Const Total As Integer = 100 Public Const Demi As Integer = Total / 2 Dans ce cas de figure, il faut tre prudent et ne pas crer de rfrence circulaire qui provoquerait une erreur de compilation.

DenombreusesconstantessontdjdfiniesauniveaudulangageVisualBasic.Lenomdecesconstantescommence engnralparvb... Lesplusutilisessontreprisesdansletableausuivant :

ENI Editions - All rigths reserved

- 13 -

Nomdelaconstante vbCr vbLf vbCrLf vbNullChar vbTab vbBack

Valeurdelaconstante RetourChariot(caractreN13) Sautdeligne(caractreN10) CombinaisonRetourchariot+sautdeligne CaractreNull(caractreN0) Tabulation(caractreN9) Retourarrire(caractreN8)

3.Lesnumrations
Une numration va nous permettre de dfinir un ensemble de constantes qui sont lies entre elles. La dclaration seffectuedelamaniresuivante : Enum jours Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi End Enum Pardfaut,lapremirevaleurdelnumrationestinitialisezro.Lesconstantessuivantessontensuiteinitialises avecunincrmentdeun.Ladclarationprcdenteauraitdoncpuscrire : Const Const Const Const Const Const Const Dimanche = 0 Lundi = 1 Mardi = 2 Mercredi = 3 Jeudi = 4 Vendredi = 5 Samedi = 6

La squence dincrmentation automatique dans une numration peut tre interrompue, voire ne pas tre utilise commedanslexemplesuivant : Enum dalton Joe = 158 Jack = 163 William = 173 Averell = 185 End Enum

I lfauttoutefoisquelesvaleursutilisesdanslnumrationsoientdesvaleursentires.

Unefoisdfinie,unenumrationpeutensuitetreutilisecommeuntypedevariablespcifique. Dim Taille as Dalton LesseulesvaleursquevouspouvezaffectervotrevariableTaillesontcellesquisontdfiniesdanslnumration. Taille Dalton.Joe Console.WriteLine(Taille) Taille =45 Invalide

- 14 -

ENI Editions - All rigths reserved

Lorsque vous faites rfrence un lment de votre numration, vous devez le faire prcder du nom de lnumration comme dans lexemple prcdent. Pour viter cela, il faut spcifier dans votre code que vous voulez utiliserlnumrationenlimportantlaidedelinstructionsuivante : Imports Application.dalton Ilestalorspossibledutiliserlesvaleurscontenuesdanslnumrationdirectement. Taille = Joe Il faut, dans ce cas, tre prudent avec des noms de constantes identiques qui pourraient exister dans des numrationsdiffrentes. Ladclarationdunenumrationnepeutpassefairedansuneprocdureouunefonction. La porte dune numration suit les mmes rgles que celle des variables (utilisation des mots cls Public, Private, Friend,Protected).

4.Lestableaux
Lestableauxvontnouspermettredefairerfrenceunensembledevariablesparlemmenometdutiliserunindex pourlesdiffrencier.Untableaupeutavoiruneouplusieursdimensions(jusqu32,maisaudeldetroisonadumal sereprsenterlecontenudutableau).Lepremierlmentduntableauatoujourspourindex,zro. Lindex maximum duntableauestspcifiaumomentdelacrationdutableau.Lenombredlments duntableau estdoncgalauplusgrandindexplusun. Tableauxunedimension La dclaration seffectue comme une variable classique mis part que lon indique la suite du nom de la variable entreparenthsesleplusgrandindexdutableau : Dim ChiffreAffaire(11) as Decimal Cette dclaration va crer un tableau avec douze cases numrotes de 0 11. Les lments des tableaux sont accessiblesdelammemanirequunevariableclassique.Ilsuffitdajouterlindexdellmentquelonveutmodifier. ChiffreAffaire(1)=12097 Une autre solution est disponible pour la cration dun tableau. Elle permet simultanment la cration du tableau et linitialisationdesoncontenu.Lasyntaxeestlasuivante : Dim tauxTva() As Decimal = {0, 5.5, 19.6, 33} Ilnestdanscecasnulbesoindeprciserdetaillepourletableau.Ledimensionnementseferaautomatiquementen fonctiondunombredevaleursplacesentrelesaccolades. Tableauxplusieursdimensions Lasyntaxededclarationestsimilairecelleduntableau,mispartquelondoitspcifierunevaleurpourleplus grandindexdechacunedesdimensionsdutableauenlessparantparunevirgule. Dim Cube(4, 4, 4) As Integer Laccsunlmentdutableauseffectuedemanireidentique,enindiquantlesindexpermettantdidentifierlacasse dutableauconcerne. Cube(0,1,1)=52 Lasyntaxepermettantlinitialisationduntableauplusieursdimensionsaumomentdesadclarationestunpetitpeu pluscomplexe. Dim Grille(,) As Integer = {{1, 2}, {3, 4}} Cetexemplecreuntableaudeuxdimensionsdedeuxcasessurdeuxcases. L acration,aveccettetechnique,detableauxdegrandetailleplusieursdimensionsrisquedtreprilleuse.

ENI Editions - All rigths reserved

- 15 -

Redimensionnementduntableau Latailledestableauxnestpasfigemaispeuttremodifiependantlefonctionnementdelapplication.Linstruction Redimpermetdemodifierlatailleduntableau. Redim ChiffreAffaire(52) Nousavonsmaintenantcinquantetroiscasesdisponiblespourstockerlinformationdansnotretableau.Parcontre,si notre tableau contenait des informations, elles ont t perdues pendant le redimensionnement. Pour conserver son contenu,ilconvientdespcifierlemotclPreserveaprslinstructionRedim. Redim Preserve ChiffreAffaire(52) Danscecas,lecontenuinitialdutableauestconservetdenouvellescasessontajouteslasuitedecellesexistant dj,sansenaffecterlecontenu. ans le cas dun tableau multidimensionnel, seule la dernire dimension peut tre modifie si vous souhaitez D conserverlecontenudutableau.Lenombrededimensionsduntableaunepeut,parcontre,pastremodifi paruneinstructionRedim.

Linstruction Redimpeutgalementtreutilisepourfournirunetailleinitialeuntableau.Danscecas,ilnefautpas spcifierdetaillepourletableauaumomentdesadclarationetutiliserlinstruction Redimpourledimensionner.Ilest, danscecas,impratifdutiliserlinstructionRedimavanttoutaccsaucontenudutableau.

Manipulationscourantesdestableaux Lorsquelontravailleaveclestableaux,certainesoprationsdoiventtrefrquemmentralises.Ceparagraphedcrit lesoprationslespluscourantesralisessurlestableaux. Obtenirlatailleduntableau Il suffit dutiliser la proprit Length du tableau pour connatre le nombre dlments quilpeutcontenir.Danslecas duntableaumultidimensionnel,lersultatcorrespondaunombretotaldecasesdutableausoitleproduitdelataille dechacunedesdimensions.Ilnesagitpasdelespacemmoireoccupparletableaumaisbiendunombretotalde casesdutableau. Dim Grille(,) As Integer = {{1, 2}, {3, 4}} Console.WriteLine("taille totale du tableau : {0}", Grille.Length) Pour obtenir loccupationmmoiredutableau,ilfautmultipliersatailleparlenombredoctetsutilisspourunecase lmentairedutableau. Obtenirlatailledunedesdimensionsduntableau LamthodeGetLengthattendcommeparamtreladimensiondutableaupourlaquellelonsouhaiteobtenirlataille : Dim Matrice(,) As Integer = {{1, 2}, {3, 4}, {5, 6}} Console.WriteLine("taille de la premiere dimension : {0}", Matrice.GetLength(0)) Console.WriteLine("taille de la deuxieme dimension : {0}", Matrice.GetLength(1)) Affichelersultatsuivant : taille de la premiere dimension : 3 taille de la deuxieme dimension : 2 Obtenirladimensionduntableau LapropritRankduntableaurenvoiedirectementladimensiondutableau :

- 16 -

ENI Editions - All rigths reserved

Dim Grille(,) As Integer = {{1, 2}, {3, 4}, {5, 6}} Console.WriteLine(" ce tableau comporte {0} dimensions", Grille.Rank) Affichelersultatsuivant : ce tableau comporte 2 dimensions Rechercherunlmentdansuntableau La fonction IndexOf de la classe Array permet deffectuer une recherche dans un tableau. Elle accepte comme paramtres, le tableau dans lequel se fait la recherche et llment recherch dans le tableau. La valeur retourne correspondlindexollmentattrouvdansletableauou1silmentnesetrouvepasdansletableau. Dim gouter() As String = {"pain", "beurre", "moutarde", "confiture"} Console.WriteLine(Array.IndexOf(gouter, "moutarde")) Trieruntableau La procdure Sort de la classe Array assure le tri du tableau quelle reoit en paramtre. Le tri seffectue par ordre alphabtique pour les tableaux de chane de caractres et par ordre croissant pour les tableaux de valeurs numriques. Dim gouter() As String = {"pain", "beurre", "moutarde", "confiture"} Dim plat As String Array.Sort(gouter) For Each plat In gouter Console.WriteLine(plat) Next Affichelersultatsuivant : beurre confiture moutarde pain

5.Leschanesdecaractres
LesvariablesdetypeStringpermettentlamanipulationdechanesdecaractresparvotreapplication.Nousavonsle choixentredeuxpossibilitspourtravailleravecleschanesdecaractres :
q

UtiliserlesfonctionsdeVisualBasic UtiliserlesmthodesdelaclasseSystem.String

Nousallonsregardercommentraliserlesoprationslespluscourantessurleschanesdecaractres. Affectationdunevaleurunechane Nousavonsvuquepour,affecterunevaleurunechane,ilfautlaspcifierentrelescaractreset,unproblmese posesinousvoulonsquelecaractrefassepartiedelachane.Pourquilnesoitpasinterprtcommecaractrede dbutoudefindechane,ilfautdoublerlecaractrecommedanslexemplecidessous. Dim Chane as String Chane=" il a dit : "" a suffit ! """ Console.WriteLine(Chane) Nousobtenonslaffichage : iladit : asuffit! Pourlesexemplessuivants,nousallonstravailleravecdeuxchanes. chane1 = "lhiver sera pluvieux"

ENI Editions - All rigths reserved

- 17 -

chane2 = "lhiver sera froid"

Extractionduncaractreparticulier Pour obtenir le caractre prsent une position donne dune chane de caractres, lon peut considrer la chane commeuntableaudecaractresetainsiatteindrelecaractresouhaitparunindex. Console.WriteLine("Le troisime caractre de la chane1 est : {0}", chane1(2)) Autresolution,maiscettefoisenutilisantlapropritCharsdelaclasseString. Console.WriteLine("Le troisime caractere de la chane1 est : {0}", chane1.Chars(2)) Rsultat : Le troisime caractre de la chane est : h Danslesdeuxcas,lanumrotationdescaractrescommencezrocommepouruntableau. Obtentiondelalongueurdunechane Pourdterminerlalongueurdunechane,lapropritLengthdelaclasseStringoulafonctionLendeVisualBasicsont disponibles.Toutesdeuxretournentlenombredecaractresprsentsdanslachane. Console.WriteLine("la chane1 contient {0} caractres", chane1.Length) Console.WriteLine("la chane2 contient {0} caractres", Len(chane2)) Rsultat : La chane 1 contient 21 caractres. La chane 2 contient 18 caractres.

Dcoupagedechane Plusieurssolutionssontdisponiblesenfonctiondelaportiondechanequelonsouhaitercuprer. Ledbutdelachane LafonctionLeftrenvoielesxpremierscaractresdelachane. Console.WriteLine("les cinq premiers caractres de la chane1 sont {0}", Left(chane1,5)) Rsultat : Les cinq premiers caractres de la chane sont lhiv. Lafindelachane LafonctionRightrenvoielesxdernierscaractresdelachane. Console.WriteLine("les cinq derniers caractres de la chane1 sont {0}", Right(chane1, 5)) Rsultat : les cinq derniers caractres de la chane sont froid. Uneportionquelconquedelachane La fonction Mid ou la mthode Substring de la classe String retournent une portion de chane en fonction de la positiondedpartetdunombredecaractresretournerquileursontpasss.Lafonction Midncessiteenplusla chanepartirdelaquellevaseffectuerledcoupage.

- 18 -

ENI Editions - All rigths reserved

Console.WriteLine("Un morceau de la chane1 {0}", Mid(chane1, 2, 5)) Console.WriteLine("Un morceau de la chane2 {0}", chane2.Substring(2, 5)) Nousobtenonslaffichage : Un morceau de la chane1 hive Un morceau de la chane2 hiver

AttentionpourlafonctionMid,lanumrotationdescaractrescommence1.

Comparaisondechanes Plusieurs solutions sont possibles selon lobjectif atteindre avec la comparaison des deux chanes. Si le but est seulement de vrifier lgalit de deux chanes, vous pouvez utiliser loprateur = ou la fonction Equals de la classe String. If chane1 = chane2 Then Console.WriteLine("ce sont les mmes") Else Console.WriteLine("ce ne sont pas les mmes") End If If chane1.Equals(chane2) Then Console.WriteLine("ce sont les mmes") Else Console.WriteLine("ce ne sont pas les mmes") End If Pour raliser un classement, vous devez par contre utiliser la mthode Compare de la classe String ou la fonction StrComp.Aveccesdeuxsolutions,lesdeuxchanescomparerdoiventtrepassescommeparamtres.Lersultatde lacomparaisonestretournsousformedunentierinfrieurzrosilapremirechaneestinfrieureladeuxime, galzrosilesdeuxchanessontidentiques,etsuprieurzrosilapremirechaneestsuprieureladeuxime. Select Case chane1.CompareTo(chane2) Case Is < 0 Console.WriteLine("chane1 est infrieure chane2") Case 0 Console.WriteLine("chane1 est gale chane2") Case Is > 0 Console.WriteLine("chane1 est suprieure chane2") End Select Insertiondansunechane Lamthode insertdelaclasse Stringpermetlinsertiondunechanedansuneautre.Elleattendcommeparamtre unentieretunechaneetnousretournelachanededpartdanslaquellesetrouveinsre,lapositionspcifie,la chanepasseenparamtre. Dim chane3 As String chane3 = chane2.Insert(13, "tres ") Console.WriteLine(chane3) Linstructionprcdentenousaffichelalignecorrespondante : lhiver sera tres froid

Suppressiondesespaces
q

audbutdelachane :Console.WriteLine(ltrim(chane1))OuConsole.WriteLine(chane1.TrimStart()) lafindelachane :Console.WriteLine(rtrim(chane1))OuConsole.WriteLine(chane1.TrimEnd()) Audbutetlafin :Console.WriteLine(trim(chane1))OuConsole.WriteLine(chane1.Trim())

ENI Editions - All rigths reserved

- 19 -

Changementdelacasse
q

Toutenmajuscules:Console.WriteLine(Ucase(chane1))OuConsole.WriteLine(chane1.ToUpper()) Toutenminuscules:Console.WriteLine(Lcase(chane1))OuConsole.WriteLine(chane1.ToLower())

Recherchedansunechane Lafonction InStroulamthode IndexOfdelaclasse Stringpermettentlarecherchedunechanelintrieurdune autre.Lepremierparamtrecorrespondlachanedanslaquellevaseffectuerlarecherche,ledeuximeparamtre correspond la chane recherche. La fonction retourne un entier indiquant la position laquelle la chane a t trouve ou zro si la chane na pas t trouve. Par dfaut, la recherche commence au dbut de la chane, sauf si vousutilisezuneautreversiondelafonctionInStrqui,elle,attendtroisparamtres,lepremierparamtretantpour cettefonction,lapositiondedpartdelarecherche,lesdeuxautrestantrespectivementlachanedanslaquelleva seffectuerlarechercheetlachanerecherche.Lanumrotationdescaractressefaitpartirde1pourlafonction InStr. Dim recherche As String Dim position As Integer recherche = "e" position = InStr(chane1, recherche) While (position > 0) Console.WriteLine("chane trouve la position {0}", position) position = InStr(position + 1, chane1, recherche) End While Console.WriteLine("fin de la recherche") Nousobtenonslaffichage : chane chane chane fin de trouve la position 6 trouve la position 10 trouve la position 19 la recherche

Remplacementdansunechane Il est parfois souhaitable de pouvoir rechercher la prsence dune chane lintrieur dune autre, comme dans lexemple prcdent, mais galement de remplacer les portions de chanes trouves. La fonction Replace permet de spcifierunechanedesubstitutionpourlachanerecherche.Elleattendautotalcinqparamtres :
q

Lachanedanslaquellevaseffectuerlarecherche. Lachanerecherche Lachanederemplacement Lapositiondedpartdelarecherche Lenombrederemplacementssouhaits(1pourtouteslesoccurrencesdelachanerecherche)

chane3 = Replace(chane1, "hiver", "ete", 1, -1) Console.WriteLine(chane3) Nousobtenonslaffichage : lete sera pluvieux

6.Lesstructures
Les structures offrent la possibilit de combiner des donnes de diffrents types pour crer un nouveau type

- 20 -

ENI Editions - All rigths reserved

composite.Cenouveautypepourraensuitetreutilisdansladclarationdevariablescommeuntypestandardde VisualBasic. Les structures sont trs pratiques lorsque lon souhaite manipuler des informations ayant un lien entre elles. Par exemple,dansuneapplicationcomptable,lesinformationsconcernantlesclients(codeclient,nom,prnom,adresse) peuventtreplusfacilementgressousformedunestructurepluttquepardesvariablesindividuelles.

a.Dclarationdunestructure
LadclarationdunestructuresefaitentrelesmotsclsStructureetEnd Structure.Entrecesdeuxmotscls,vous devez placer au moins la dclaration dun membre de la structure. Les membres de la structure sont, en fait, tout simplement des variables, procdures ou fonctions dclars lintrieur de la structure. Comme pour tout lment dclardansVisualBasicvousavezlapossibilitdespcifierunniveaudaccspourchaquemembredelastructure. Sansinformationspcifique,lemembreestconsidrcommetantpublic.Parcontre,ilestimpossibledinitialiserles membresdunestructureaumomentdeladclaration. Exemple Public Structure Client Public Code As Integer Public Nom As String Public Prenom As String Public Coordonnees As String End Structure Lesmembresdunestructurepeuventtreeuxmmesdesvariablesdetypestructure.Danslexempleprcdentla variablecoordonnespeuttredcomposesousformedunestructuredetypeadresse. Exemple Public Structure Adresse Public Numero As Integer Public Rue As String Public CodePostal As Integer Public Ville As String End Structure Public Structure Client Public Code As Integer Public Nom As String Public Prenom As String Public Coordonnees As Adresse End Structure Lesstructuresacceptentgalementdesproccuresoufonctionscommemembres.Ellessontgnralementutilises pourmanipulerlesvariablesmembresdelastructure. Exemple Public Public Public Public Public Public Structure Adresse Numero As Integer Rue As String CodePostal As Integer Ville As String Function getAdresse () As String Return Numero & " " & Rue & vbCrLf & CodePostal & vbTab & Ville.ToUpper End Function End Structure

b.Utilisationdesstructures
Les structures sont utilises comme des types de donnes classiques. Il convient, au pralable, de dclarer une variabledutypedelastructure. Dim Client1 As Client Par la suite, cette variable permet laccs aux membres de la structure grce loprateur . appel oprateur daccs.

ENI Editions - All rigths reserved

- 21 -

Exemple Client1.Code = 999 Client1.Nom = "LeNom" Client1.Prenom = "lePrenom" Silundesmembresdelastructureestluimmedetypestructure,vousdevezgalementutiliserloprateurdaccs pourpouvoirmanipulerlesmembresimbriqus. Exemple Client1.Coordonnes.Numero = 42 Client1.Coordonnes.Rue = "rue de Paris" Client1.Coordonnes.CodePostal = 44000 Client1.Coordonnes.Ville = "Nantes" Lestypesstructuresontdestypesdedonnesparvaleur,cestdirequelavariablecontientvraimentlesdonnes de la structure ( mettre en opposition avec les variables de type rfrence o la variable ne contient que lemplacement,danslammoire,osetrouventlesdonnes). Cecinouspermetdassignerunevariabledetypestructurelecontenuduneautrevariabledemmetype.Ilya, danscecas,recopiedesinformationsdechaquemembredelavariablesourcedanslemembrecorrespondantdela variabledestination. Exemple Dim Client2 As Client Client2 = Client1 Console.WriteLine("Client1 : " & vbCrLf & Client1.etiquette) Console.WriteLine("Client2 : " & vbCrLf & Client2.etiquette) Affichelersultatsuivant : Client1 : M lePrenom LeNom 42 rue de Paris 44000 NANTES Client2 : M lePrenom LeNom 42 rue de Paris 44000 NANTES

l faut cependant tre mfiant avec ce mcanisme si un membre de la structure est un type rfrence (un I tableauparexemple),cardanscecaslesdeuxvariablessepartagerontlemmetableau.

- 22 -

ENI Editions - All rigths reserved

Lesoprateurs
Lesoprateurssontdesmotsclsdulangagepermettantlexcutiondoprationssurlecontenudecertainslments, en gnral des variables, des constantes, des valeurs littrales, ou des retours de fonctions. La combinaison dunou plusieurs oprateurs et dlments sur lesquels les oprateurs vont sappuyer se nomme une expression. Ces expressionssontvaluesaumomentdeleurexcution,enfonctiondesoprateursetdesvaleursquisontassocies. Lesoprateurspeuventtrerpartisensixcatgories.

1.Lesoprateursdaffectation
Leseuloprateurdisponibledanscettecatgorieestloprateur=.Ilpermetdaffecterunevaleurunevariable.Le mmeoprateurestutilisquelquesoitletypedelavariable(numrique,chanedecaractres...).

2.Lesoprateursarithmtiques
Lesoprateursarithmtiquespermettentdeffectuerdescalculssurlecontenudesvariables : Oprateur ++ * / \ Oprationralise Addition Soustraction Multiplication Division Divisionentire Modulo(restedela divisionentire) Puissance Exemple 6+4 126 3*4 25/3 25/3 Rsultat 10 6 12 8.3333333333 8

Mod

25mod3

^^

5^3

125

3.Lesoprateursbinaires
Ces oprateurs effectuent des oprations sur des entiers uniquement (Byte, Short, Integer, Long). Ils travaillent au niveaudubitsurlesvariablesquilsmanipulent. Oprateur And Or Xor Not Oprationralise EtBinaire OuBinaire Ouexclusif Ngation Exemple 45and255 99or46 99xor46 Not23 Rsultat 45 111 77 24

4.Lesoprateursdecomparaison
Lesoprateursdecomparaisonsontutilissdanslesstructuresdecontrleduneapplication(ifthen,doloop...).Ils renvoientunevaleurdetypebooleanenfonctiondursultatdelacomparaisoneffectue.Cettevaleurseraensuite

ENI Editions - All rigths reserved

- 1-

utiliseparlastructuredecontrle. Oprateur = Oprationralise galit Ingalit < > <= >= Infrieur Suprieur Infrieurougal Suprieurougal galitdechanesde caractres Comparaisondedeux variablesobjets Exemple 2=5 2<>5 2<5 2>5 2<=5 2>=5 Rsultat False True True False True False

Like

totoliket*

True

Is

O1IsO2

TruesiO1etO2font rfrenceaummeobjet TruesiO1nefaitpas rfrenceaummeobjet queO2 TruesilavariableO1 rfrenceunobjetcr partirdutypeClient

IsNot

Comparaisondedeux variablesobjets

O1IsNotO2

TypeOf...Is...

Comparaisondutypede lavariableavecletype donn

TypeOfO1IsClient

Quelquesinformationssupplmentairesconcernantloprateurlike :
q

Commeloprateur=,loprateurlikepermetdetesterlgalitdedeuxchanesdecaractresmaisilestplus soupledutilisationgrcelutilisationdecaractresjokers. Le caractre * permet de remplacer nimporte quelle suite de caractres. Lexpression nom like " t*" nous permetdevrifiersilavariable nomcontientunevaleurcommenantpartetayantunnombrequelconquede caractres. Lecaractre?permetderemplaceruncaractredanslexpressiontester.Pourvrifiersivotrevariable nom contientunevaleurcommenantpartetayantquatrecaractresonutiliseralexpressionsuivante : Nom like " t???"

Il faut galement tre prudent avec les comparaisons de chanes de caractres car les rsultats dune mme comparaison peuvent tre diffrents en fonction de loption choisie pour le compilateur. Les options du compilateur peuventtremodifisparlabotededialoguedespropritsdevotreprojet.

- 2-

ENI Editions - All rigths reserved

LapropritOption Comparepermetdespcifierlemodedecomparaisonutilisparlecompilateur.
q

Avec loption Text, le compilateur ne fera pas de diffrence entre les minuscules et les majusculeslorsdela comparaison. Loptionbinaireexigeraunestrictegalitdeschanespourobtenirunrsultattrue.

5.Lesoprateursdeconcatnation
Deux oprateurs + et & peuvent tre utiliss pour la concatnation de chanes de caractres. Cependant, la destination premire de loprateur + est laddition de valeurs numriques. Il possde un fonctionnement assez complexeencasdutilisationsurdeschanesdecaractres.Lesrglessuivantessontappliques :
q

Silesdeuxoprandessontnumriques,alorsilyaaddition. SilesdeuxoprandessontdetypeStringalorsilyaconcatnation. SiunoprandeestnumriqueetledeuximeestdetypeStringalorsunautreparamtreentreenjeu.Sile compilateurestconfiguravecloptionStrict Onuneerreurdecompilationestgnre.Silecompilateurest configur avec loption Strict Off, la chane de caractres est implicitement convertie en type Double puis additionne.SilachanedecaractresnepeutpastreconvertieenDoublealorsuneexceptionestgnre.

Pourviterdeseposertoutescesquestions,prfrezlutilisationdeloprateur&.Aveccetoprateur,silundesdeux oprandesnestpasdutypeString,ilestautomatiquementconvertiverscetypeavantlaconcatnation. Linconvnientdeloprateur&estquilnestpastrsrapide.Sivousavezdenombreusesconcatnationsexcuter surunechane,ilestprfrabledutiliserlaclasseStringBuilder. Exemple Dim duree, i As Integer Dim lievre As String Dim tortue As String Dim debut, fin As Date debut = Now

ENI Editions - All rigths reserved

- 3-

For i = 0 To 100000 tortue = tortue & " " & i Next fin = Now duree = DateDiff(DateInterval.Second, debut, fin) Console.WriteLine("dure pour la tortue : {0} secondes", duree) debut = Now Dim sb As New StringBuilder For i = 0 To 100000 sb.Append(" ") sb.Append(i) Next lievre = sb.ToString fin = Now duree = DateDiff(DateInterval.Second, debut, fin) Console.WriteLine("dure pour le livre : {0} secondes", duree) If lievre.Equals(tortue) Then Console.WriteLine("les deux chanes sont identiques") End If Rsultatdelacourse : dure pour la tortue : 107 secondes dure pour le livre : 0 secondes les deux chanes sont identiques Cersultatsepassedecommentaire!

6.Lesoprateurslogiques
Lesoprateurslogiquespermettentdecombinerlesexpressionsdansdesstructuresconditionnellesoudeboucle. Oprateur Opration Exemple Rsultat vraisitest1ettest2est vrai vraisitest1outest2est vrai vraisitest1outest2est vraimaispassilesdeux sontvraissimultanment Inverselersultatdu test Idemetlogiquemais test2neseravaluque sitest1estvrai Idemoulogiquemais test2neseravaluque sitest1estfaux

and

Etlogique

If(test1)And(test2)

Or

Oulogique

If(test1)Or(test2)

xor

Ouexclusif

If(test1)Xor(test2)

Not

Ngation

IfNottest

AndAlso

Etlogique

If(test1)AndAlso(test2)

OrElse

Oulogique

If(test1)OrElse(test2)

Il convient dtre prudent avec les oprateurs AndAlso et OrElse car lexpression que vous testez en second (test2 dans notre cas) pourra parfois ne pas tre excute. Si cette deuxime expression modifie une variable, celleci ne seramodifiequedanslescassuivants :
q

premiertestvraidanslecasduAndAlso premiertestfauxdanslecasduOrElse.

- 4-

ENI Editions - All rigths reserved

7.Ordredvaluationdesoprateurs
Lorsque plusieurs oprateurs sont combins dans une expression, ils sont valus dans un ordre bien prcis. Les oprations arithmtiques sont excutes en premier puis les oprations de comparaison et enfin les oprateurs logiques. Les oprateurs arithmtiques ont entre eux galement un ordre dvaluation dans une expression. Lordre dvaluationestlesuivant :
q

Puissance(^) Negation() Multiplicationetdivision(*,/) Divisionentire(\) Modulo(Mod) Additionetsoustraction(+,),concatnationdechanes(+) Concatnationdechane(&).

Siunordredvaluationdiffrentestncessairedansvotreexpression,placezlesportionsvaluerenpriorit,entre parenthses,commedanslexpressionsuivante : X= (z * 4) ^ (y * (a + 2))

ouspouvezutiliserautantdeniveauxdeparenthsesquevouslesouhaitezdansuneexpression.Ilimporte V cependantquelexpressioncontienneautantdeparenthsesfermantesquedeparenthsesouvrantessinonle compilateurgnrerauneerreur.

ENI Editions - All rigths reserved

- 5-

Lesstructuresdecontrle
Les structures de contrle permettent de modifier lordredexcutiondesinstructionsdansvotrecode.Deuxtypesde structuressontdisponibles :
q

Les structures de dcision : elles aiguilleront lexcution de votre code en fonction des valeurs que pourra prendreuneexpressiondetest. Lesstructuresdeboucle : ellesferontexcuteruneportiondevotrecodeuncertainnombredefois,jusquce quuneconditionsoitremplieoutantquuneconditionestremplie.

1.Structuresdedcision
Deuxsolutionssontpossibles.

a.StructureIf
QuatresyntaxessontutilisablespourlinstructionIf. If condition then instruction Si la condition est vraie alors linstructionestexcute danscecas, conditiondoittreuneexpressionqui,une foisvalue,doitfournirunboolean trueou false.Aveccettesyntaxe,seulelinstructionsitueaprsle thensera excutesilaconditionestvraie. Pourpouvoirexcuterplusieursinstructionsenfonctiondunecondition,lasyntaxeutiliserest : If condition then Instruction 1 ... Instruction n End if

D anscecas,legroupedinstructionssituentrelethenetleEnd If,seraexcutsilaconditionestvraie.

Vouspouvezgalementspcifieruneouplusieursinstructionsqui,elles,serontexcutessilaconditionestfausse. If condition then Instruction 1 ... Instruction n Else Instruction 1 ... Instruction n End if Vouspouvezgalementimbriquerlesconditionsaveclasyntaxe : If condition1 then Instruction 1 ... Instruction n ElseIf Condition 2 then Instruction 1 ... Instruction n ElseIf Condition 3 then Instruction 1 ...

ENI Editions - All rigths reserved

- 1-

Instruction n Else Instruction 1 ... Instruction n End if Danscecas,ontestelapremirecondition.Sielleestvraiealorsleblocdecodecorrespondantestexcut,sinonon teste la suivante et ainsi de suite. Si aucune condition nest vrifie, le bloc de code spcifi aprs le else est excut.Linstruction elsenestpasobligatoiredanscettestructure.Danscecas,ilsepeutquaucuneinstructionne soitexcutesiaucunedesconditionsnestvraie.

b.StructureSelectcase
Lastructure select casepermetunfonctionnementquivalent,maisoffreunemeilleurelisibilitducode.Lasyntaxe estlasuivante : Select case variable Case valeur1 Bloc de code 1 Case valeur2 Bloc de code 2 Case valeur3 Bloc de code 3 Case else Bloc de code 4 End select La valeur de la variable est value au dbut de la structure (par le Select case) puis la valeur obtenue est compareaveclavaleurspcifiedanslepremiercase(valeur1). Si les deux valeurs sont gales, alors le bloc de code 1 est excut et lexcution de votre code se poursuit par linstructionplaceaprsleEnd select. Sinon, la valeur obtenue est compare avec la valeur du case suivant, sil y a correspondance, le bloc de code est excutetainsidesuitejusquauderniercase. Siaucunevaleurconcordantenesttrouvedanslesdiffrentscase,alorsleblocdecodespcifidanslecase else estexcut. Lavaleurtesterpeuttrecontenuedansunevariable,maisellepeutgalementtrele rsultatduncalcul.Dans ce cas, le calcul nest effectu quune seule fois au dbut du select case. Le type de la valeur teste peut tre numrique ou chane de caractres. Le type de la variable teste doit bien sr correspondre au type des valeurs danslesdiffrentscase. Lesvaleurstesterdanslesdiffrentscasepeuventtreregroupescommedanslexemplesuivant : Select case reponse Case "oui","OUI" console.writeline("reponse positive") Case "non","NON" Console.writeline("reponse negative") Case else Console.writeline("reponse de normand") End select Oubiendfiniessousformedintervalleoudecomparaison : 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 is >=22 Console.writeline("nuit") Case else Console.writeline("heure invalide")

- 2-

ENI Editions - All rigths reserved

End select Il existe galement trois instructions permettant dobtenirlemmersultatquavec un if then else ou un select casemaisavecuneseuleinstruction :
q

Linstructioniifpermetderemplacerunif then elseaveclasyntaxesuivante:

iif (condition, valeur renvoye si vrai, valeur renvoye si faux) Exemple: resultat = iif (reponse="oui", "YES", "NO")
q

Linstruction switch permet dindiquer un ensemble dexpressions et de valeurs associes et retourne la valeurassocielapremireexpressionquiestvraie.

Exemple : resultat=switch(reponse="oui","YES",reponse="non","NO")
q

Linstructionchoosepermetdechoisirunevaleurdanslalistedesparamtres,enfonctiondelavaleurdun index.LexemplesuivantnouspermetdechoisirletauxdeTVAenfonctionducode(de14).

Exemple : tauxTva = Choose(code, 0, 5.5, 19.6, 33)

2.Lesstructuresdeboucle
Quatrestructuressontnotredisposition : While ... End While Do ... Loop For ... Next For Each ... Next Ellesonttoutespourbutdexcuterunblocdecodeuncertainnombredefoisenfonctiondunecondition.

a.StructureWhile...EndWhile
While condition Bloc de code End While Cettesyntaxepermetdexcuterleblocdecodetantquelaconditionestvraie.Laconditionestvalueavantmme lepremierpassagedanslaboucle,doncleblocdecodepourratrsbiennejamaistreexcutsilaconditionest fausse ds le dpart. Dans le cas o la condition est vraie au premier passage, le bloc de code est excut la condition est nouveau teste, si elle est vraie, une excution du bloc de code est effectue, sinon la prochaine instructionexcuteseracellequisuitle End While.Ilesttoutefoispossibledeprvoirunesortieprmaturedela boucleenutilisantlinstructionExit While.LexcutionreprenddoncsurlalignequisuitimmdiatementleEnd While.

b.StructureDo...Loop
LastructureDo Loopnousproposequatrevariantes : Do While condition Bloc de code Loop

LefonctionnementdecettesyntaxeeststrictementidentiquelastructureWhile End While.

ENI Editions - All rigths reserved

- 3-

Do Bloc de code Loop While condition

ettesyntaxenouspermetdegarantirqueleblocdecodeseraexcutaumoinsunefoispuisquelacondition C seratestelafindublocdecode.

Les instructions prcdentes ralisent une boucle tant quune condition tait remplie, alors que les deux syntaxes suivanteseffectuentunebouclejusqucequuneconditionsoitremplie. Do until condition Bloc de code Loop Danscecas,laboucleestexcutejusqucequelaconditionsoitvraie.Sielleestvraiedsledbutdelaboucle,le blocdecodeneserajamaisexcut.Pourgarantiraumoinsuneexcutiondublocdecode,ilconvientdutiliserla syntaxesuivantequitestelaconditionlafindelexcutiondublocdecode. Do Bloc de code Loop until condition Leblocdecodesexcuteaumoinsunefoispuistestelaconditionetbouclejusqucequelaconditionsoitvraie. Commedanslecasdelabouclewhile,linstruction Exit Doprovoqueraunesortieanticipeetinconditionnelledela boucle.

c.StructureFor...Next
Lorsque vous connaissez le nombre ditrations raliser dans une boucle, il est prfrable dutiliser la structure for ... next.Pourpouvoirutilisercetteinstruction,unevariabledecompteurdoittredclaredanslecode,pour votreboucle. Lasyntaxegnraleestlasuivante : For Compteur=valeur initiale To valeur Finale Bloc de code Next Audbutdelaboucle,lavariable Compteurestinitialiseavecla valeur initialepuisleblocdecodeestexcut. Linstruction next provoque lincrmentationdelavariable Compteuretlacomparaisondelavaleurobtenueavecla valeur Finale de la boucle. Si la variable compteur est infrieure ou gale la valeur Finale, le bloc de code est excutnouveau,sinonlexcutionsepoursuitlinstructionquisuitlenext. Pardfaut,lincrmentestdeun vouspouvezspcifierunevaleurpourlincrmentenajoutantlemotclstepeten spcifiantensuitelincrment.Cettevaleurpeuttrengativemaisdanscecas,une valeurinitialesuprieurela valeurfinaledevratreindique. ommepourlesautresstructures,ilestpossibledesortirimmdiatementduneboucle for nextenutilisant C linstructionexit for.

d.StructureForeach...next
Uneautresyntaxedelaboucle for nextpermetdexcuterunblocdecodepourchaquelmentcontenudansun tableauoudansunecollection.Lasyntaxegnraledecetteinstructionestlasuivante : For each element in tableau Bloc de code Next Il ny a pas de notion de compteur dans cette structure, puisquelle effectue ellemme les itrations sur tous les lmentsprsentsdansletableauoulacollection.

- 4-

ENI Editions - All rigths reserved

Lavariableelementsertextraireleslmentsdutableauoudelacollectionpourqueleblocpuisselemanipuler.Le typedelavariable elementdoittrecompatibleavecletypedeslmentsstocksdansletableauoulacollection. Parcontre,vousnavezpasvoussoucierdunombredlmentscarlinstruction for eachestcapabledegrerelle mmeledplacementdansletableauoulacollection.Voiciunpetitexemplepourclarifierlasituation! Avecuneboucleclassique : Dim tablo() As String = {"rouge", "vert", "bleu", "blanc"} Dim cpt As Integer For cpt = 0 To UBound(tablo) Console.WriteLine(tablo(cpt)) Next Aveclabouclefor each : Dim tablo() As String = {"rouge", "vert", "bleu", "blanc"} Dim s As String For Each s In tablo Console.WriteLine(s) Next

omme pour la boucle for next, vous pouvez provoquer une sortie de la boucle avant davoir parcouru C lensembledutableau,enutilisantlinstructionexit for.

e.Autresstructures
Deuxautresstructurespluttdestinessimplifierledveloppementsontdisponibles : StructureUsingEndUsing Cette structure est destine accueillir un bloc de code utilisant une ressource externe, comme par exemple une connexionunserveurdebasededonnes.Cettestructureprendenchargeautomatiquementlalibrationdela ressourcelafindublocdecode.Laressourcepeuttrecredanslastructureoubienexisterauparavantettre passesouscontrledelastructure.lafindelastructure,laressourceestlibreenappelantlamthodeDispose. Exemple Dim ctn As New .SqlConnection ctn = New SqlConnection("Data Source=TG;Initial Catalog=Northwind;Integrated Security=True") Using ctn ... Utilisation de la connexion ... End Using La connexion est libre StructureWithEndWith Cettestructurepermetdexcuterunesriedoprationssurunobjetsansavoirrappelerchaquefoissonnom. Ellefacilitenormmentlalectureducodeetamlioregalementlesperformances. Ilsuffitdespcifier,laidedumotclWith,lenomdelavariableutiliseretjusquaumotclEnd With cenomsera sousentendu.Lesdiffrentslmentsdelobjetserontdisponiblessanslesprfixerparlenomdelavariable. Exemple Dim ctn As New SqlConnection ctn = New SqlConnection("Data Source=TG;Initial Catalog=Northwind;Integrated Security=True") With ctn .Open() .... .... .Close() End With

ENI Editions - All rigths reserved

- 5-

- 6-

ENI Editions - All rigths reserved

Lesprocduresetfonctions
DansuneapplicationVisualBasic,touteslesinstructionsdoiventobligatoirementtreplacesdansuneprocdureou une fonction. Ces procdures ou fonctions nous permettent de crer des blocs de code qui pourront ensuite tre appelsdansdautresportionsdevotreapplication.Lappellaprocdureoufonctionseferasimplementenutilisant lidentifiantdelaprocdure. Pour que ces procdures soient plus facilement rutilisables, vous avez la possibilit dutiliser des paramtres. Les valeursdecesparamtresserontspcifiesaumomentdelappeldelaprocdure. Au cours du dveloppement, nhsitez pas crer de nombreuses procdures et fonctions. Le dcoupage de votre application en de nombreuses procdures et fonctions facilitera le dbogage (une dizaine de blocs de code dune quinzainedelignesestplusfaciletesterquunpavdecentcinquantelignes).Certainesprocdurespeuventmme trerutilisesplusieursfoisdansvotreapplication. DansVisualBasic,quatretypesdeprocduressontdisponibles.
q

LesprocduresSubquiexcutentsimplementunblocdecodelademande. Lesprocduresvnementiellesquisontappelesautomatiquementlorsquunvnementseproduitpendantle fonctionnementdevotreapplication(clicsouris,toucheclavier...). Lesfonctionsquiexcutentunblocdecodeetrenvoientlersultatdeleurcalculaucodequilesaappeles. Lesprocdurespropertyquipermettentdemanipulerlespropritsdesobjetscrsdanslapplication. Les procdures oprateur utilises pour modifier le fonctionnement dun oprateur lorsquil sapplique une classeouunestructure.

Voyonsmaintenantcommentdclarerdesprocduresetfonctions.

1.ProcdureSub
Lecodeduneprocduredoittreplacentrelesmotscls Subet End Sub.Laprocduredoittrenomme.Cenom serautilislorsdelappel.Lasyntaxegnralededclarationestlasuivante : Sub AfficheResultat() Instruction 1 ... console.System.Writeline( "a marche !!! ") ... Instruction n End Sub Lesparenthsesaprslenomsontutilisespourspcifierlescaractristiquesdesparamtresquiserontpassslors de lappel. Les parenthses sont obligatoires dans la dclaration mme si aucun paramtre nest requis pour la procdure. De nombreux mots cls sont utilisables, dans la dclaration dune procdure, pour modifier les possibilits de rutilisationdecetteprocdure.Laplupartdentreeuxsontlislaprogrammationobjetetseronttudisdansun autre chapitre. Par contre, pour modifier la visibilit de votre procdure, vous pouvez utiliser les mots cls que nous avons dj utiliss pour la dclaration des variables ( Private Public Friend). Sans spcification, une procdure sera considrepublique. Pourdemanderlexcutiondevotreprocduredanslecode,ilsuffitdespcifiersonnom.Uneautremthodeutilisant lemotclCallestaussipossible,lasyntaxeestalorslasuivante : Call AfficheResultat() Si votre procdure nattend pas de paramtres, lutilisation des parenthses est optionnel (lenvironnement de dveloppementVblesajouteracependant,automatiquement,dansvotrecode).

2.Procdurevnementielle
ENI Editions - All rigths reserved - 1-

Deuxlmentsdistinguentuneprocdureclassiqueduneprocdurevnementielle :
q

lappeldelaprocduresefaitautomatiquementlorsquelvnementgrparlaprocdureseproduitdans votreapplication, lenomdelaprocdurecorrespondlaconcatnationdunomdellmentpourlequelellegrelvnement, ducaractredesoulignement(_)puisdunomdelvnementgr.Parexemple,laprocduresuivantesera excutelorsquelvnementclickseproduirasurleboutonBpOk.

Sub BpOk_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

LemotclHandlesspcifielobjetetlvnementpourlesquelslaprocdureseraexcute.

3.Fonction
Unefonctionsedclaresuivantlemmeprincipequuneprocdure,enutilisantlesmotsclsFunctionetEnd Function. Vous devez, par contre, fournir une information supplmentaire. Puisque la fonction doit renvoyer au code appelant unevaleur,vousdevezprciserletypedelavaleurquiserarenvoye.Lasyntaxededclarationestdonclasuivante : Function calcul() As Integer Instruction 1 ... ... Instruction n End Function Dans le code de votre fonction, vous allez devoir spcifier quelle valeur sera renvoye par votre fonction. Pour cela, deuxsolutionssontpossibles :
q

Utilisation du mot cl Return en indiquant la valeur que vous voulez renvoyer par la fonction. Dans ce cas, returnprovoqueimmdiatementlasortiedelafonction,mmesicenestpasladernireinstruction. Vouspouvezgalement,danslecodedelafonction,utiliserlenomdelafonctioncommeunevariableetlui affecterlavaleurderetourdelafonction.Lexcutiondelafonctionsepoursuitdanscecasjusquladernire instruction.

Une fonction peut ensuite tre utilise dans le code la place dune valeur du mme type que celui renvoy par la fonction. Elle peut galement tre utilise comme une procdure Sub dans ce cas, la valeur renvoye sera tout simplementignore.

4.ProcduresProperty
Lesprocdures Propertyvontnouspermettredajouteruneproprituneclasse,unmoduleouunestructure.Ces procduressontparfoisappelesaccesseurs.Ellesserontutiliseslorsquelonmodifie(Set)ouquelonutilise(Get) laproprit.Leurutilisationsemblesimilairelutilisationdunevariable,onpeutaffecterunevaleuruneproprit oulirelavaleurduneproprit.Cependant,ilexistedenombreusesdiffrencesimportantesentrelesvariablesetles proprits :
q

Lesvariablesnencessitentquuneseulelignedecodepourladclaration. Lespropritsncessitentunblocdecodepourladclaration. Laccsunevariableseffectuedirectement. Laccsunepropritimpliquelexcutionduneportiondecode. Lecontenudunevariableesttoujoursrcuprtelquel.


ENI Editions - All rigths reserved

- 2-

Lecontenudunepropritpeuttremodifiparlecode,lorsdelaccslaproprit.

Lasyntaxegnraledecrationdunepropritestlasuivante : Property nomProprit () as typeDeLaProprit Get ... Return ... End Get Set ... End Set (...) End Property Danscettedclaration
q

nomPropritcorrespondaunomparlequellapropritestmanipulabledanslecode. TypeDeLaPropritcorrespondautypededonnesassocilaproprit.Vouspouvezutilisernimportequel type de donnes pour une proprit (les types de base du langage ou un type personnalis comme par exempleuneclasse). LebloccomprisentreGetetEnd Getcontientlecodeexcutlorsdelalecturedelaproprit. LebloccomprisentreSetetEnd Setcontientlecodeexcutlorsdelaffectationdunevaleurlaproprit.Le paramtre est destin, comme dans le cas dune procdure classique, faire passer de linformation vers le blocdecode.

CommepourtoutlmentdclardansVisualBasic,vouspouvezspcifierunmodificateurdeniveaudaccspourune proprit. Il sapplique au bloc Get et Set. Vous pouvez galement spcifier un modificateur de niveau daccs pour chacundesblocsGetetSet.Danscecas,ilsdoiventtreplusrestrictifsqueceluiindiquauniveaudelaproprit.

Les proprits peuvent galement tre en lecture seule ou en criture seule. Vous devez, dans ce cas, ajouter ReadOnly ou WriteOnly devant le nom de la proprit, en liminant bien sr le bloc de code Set dans le cas dun propritenlectureseule,etleblocGetdanslecasdunepropritencritureseule.

5.Lesprocduresoprateur
Ce type de procdure permet la redfinition dun oprateur<$I[] standard du langage pour lutiliser sur des types personnaliss(classeoustructure).Prenonsunexempleaveclastructureclientdjutilise. Public Structure Client Public Code As Integer Public Nom As String Public Prenom As String End Structure Essayonslecodesuivant :

ENI Editions - All rigths reserved

- 3-

Visiblement,lecompilateurnestpascoopratiflidedadditionnerdeuxclients. Pourquececodefonctionne,nousdevonsluiindiquerlaprocduresuivrepourralisercetteopration.Nousdevons doncredfinirloprateur+pourlutiliseravecdeuxclients. Public Structure Client Public Code As Integer Public Nom As String Public Prenom As String Public Shared Operator +(ByVal c1 As Client, ByVal c2 As Client) As Client Dim c As Client c.Code = c1.Code + c2.Code c.Nom = c1.Nom & c2.Nom c.Prenom = c1.Prenom & c2.Prenom Return c End Operator End Structure Aprs cette modification, le compilateur se montre plus coopratif et lexcution de la procdure prcdente test affichelersultatsuivant : 325 client1client2 prenom1prenom2

6.Lesargumentsdesprocduresetfonctions
Pour que le code soit plus facilement rutilisable, les valeurs qui sont manipules par les procdures et fonctions peuventtrepassescommeparamtresaumomentdelappeldelaprocdureoufonction.Lorsdeladclarationde la procdure, vous devez spcifier la liste des paramtres qui seront attendus. Cette liste est situe entre les parenthsesdeladclarationdelaprocdure.Vousdevezindiquer,pourchaqueparamtre,sonnometsontype.Si plusieursparamtressontattendus,ilconvientdelessparerparunevirgule. Danslecodedelaprocdure,lesparamtressontconsidrscommedesvariablesdclareslocalement. Lors de lappeldelaprocdure,unevaleur,pourchacundesparamtresattendus,devratreindique.Prenonsun exemplededclarationetdutilisation : Function CalculTTC(Pht as double, taux as double) as double CalculTTC = Pht * (1 + (taux / 100)) End function PrixHt = 100 PrixTtc = CalculTTC (PrixHt,5.5) Console .Writeline (PrixTtc) Pour passer une variable comme paramtre une procdure (le PrixHt de lexemple prcdent), il existe deux possibilits :
q

lepassageparvaleur : danscecas,linformationtransmiselaprocdureserasimplementlecontenudela variablepassecommeparamtre.LepassageparvaleurestloptionpardfautdansVisualBasic. Le passage par rfrence : dans ce cas, linformation transmise la procdure nest plus le contenu de la

- 4-

ENI Editions - All rigths reserved

variable mais lemplacement o est stocke la variable, dans la mmoire de la machine. Le code de la procdure va donc chercher cet emplacement la valeur dont elle a besoin. Le code de la procdure peut galementmodifierlecontenudelavariableet,danscecas,lesmodificationsserontvisiblesdanslecodequia appelvotreprocdure.Pourutilisercemodedepassage,vousdevezutiliserlemotclByRefdevantlenom du paramtre dans la dclaration de la procdure. Bien quil ne soit pas ncessaire, le mot cl ByVal est galementdisponiblepourspcifierunpassageparvaleur. Vouspouvezgalementindiquer,danslalistedesparamtresduneprocdure,quecertainsserontoptionnels en plaant le mot cl optional devant le nom du paramtre. Les paramtres optionnels doivent toutefois respectercertainesrgles :
q

Pour chaque paramtre optionnel, une valeur par dfaut doit tre spcifie dans la dclaration de la procdure. Function CalculTTC(Pht as double, Optional taux as double = 19.6) as double

Lorsquun paramtre est dclar optionnel dans une procdure, tous les suivants doivent galement tredclarsoptionnels.Ladclarationsuivanteestinvalidecarletroisimeparamtredoitgalement treoptionnel : Function CalculTTC(Pht as double, Optional taux as double = 19.6,devise as string) as double

Lasyntaxedoittrelasuivante : Function CalculTTC(Pht as double, Optional taux as double = 19.6,optional devise as string = "") as double Lorsdelappeldelaprocdure,vousavezdeuxpossibilitspourindiquerlavaleurutilisepourchaqueparamtre.
q

le passage par position : Les valeurs des paramtres doivent apparatre dans le mme ordre que dans la dclaration de la procdure. Si vous voulez omettre une valeur pour un paramtre, sa place devra tout de mmetrerservedanslappeldelaprocdure.

Resultat=calculTTC(250,,"$")
q

Le passage par nom : Vous devez dans ce cas, lors de lappel de la procdure, indiquer le nom de chaque paramtre et la valeur que vous voulez lui affecter. Lordre des paramtres na pas dimportance mais vous tesquandmmeobligdespcifierunevaleurpourlesparamtresnonoptionnels.

Resultat=calculTTC(devise := "$",Pht := 250) Une autre possibilit permet de crer une procdure qui pourra prendre un nombre quelconque de paramtres. IndiquezlemotclParamArraypourdclareruntableaudeparamtre. Dans lexemple suivant, nous allons crer une fonction qui calcule la moyenne de tous les paramtres qui lui sont passs. Function moyenne(ByVal ParamArray notes() As Double) As Double Dim note As Double Dim somme As Double For Each note In notes somme = somme + note Next moyenne = somme / notes.Length End Function Lafonctionpeutensuitetreappeleavecunnombrequelconquedeparamtres. Resultat=moyenne(1,6,23,45) ou Resultat=moyenne(12,78)

ENI Editions - All rigths reserved

- 5-

Assemblies,Namespaceetattributs
1.Lesassemblies
VisualBasicestconuautourduframework.NET,cequiluipermetdebnficierdenombreuxavantagesnotamment entermesdescurit,lorsdelexcutionetdelagestiondelammoire.Cetteimbricationpermetgalementdassurer lacompatibilitentreducodecritdanslesdiffrentslangagesdisponibles.VouspouvezainsiutiliserdansVisualBasic deslmentsconusavecdautreslangages(etinversement),demaniretotalementtransparentesansmmevous soucierdulangagedanslequelllmentatdvelopp. Llment de base de cette rutilisation dans le framework .NET est lassembly. Il peut tre considr comme le regroupementdetypes,deressourcesetdefonctionnalitsconuspourfonctionnerensemble. Les assemblies sont stocks dans des fichiers .exe ou .dll en fonction du type. Ils sont simplement gnrs par la compilationduprojetcorrespondant. Ilssontautodescriptifscarilscontiennentlesinformationsncessairespourleurutilisationdansunautreprojet.Ces informationssontcontenuesdansle manifestdelassembly.Lemanifestcontiententreautres :
q

lidentitdelassembly(sonnometsaversion) une liste des fichiers utiliss par lassembly (par exemple les autres assemblies utiliss par celuici, les ressourcesbitmap,etc.).

Pourpouvoirutiliserunassemblydansunprojet,ajoutezsimplementunerfrenceverslassembly.Pourcela,utilisez lemenucontextueldudossierrfrenceduprojet.

Labotededialoguesuivantepermetalorsdechoisirlesrfrencesajouterauprojet.

ENI Editions - All rigths reserved

- 1-

Lesdiffrentsongletspermettentdechoisir,parcatgorie,letypederfrenceajouterauprojet : .NET LensembledescomposantsduFramework.NETdisponibles. COM LescomposantsCOMetActiveXenregistrssurlesystme. Projects Lesautresprojetsdelasolutioncourante. Browse Recherchedunfichier(dll,ocx...)contenantlesressources. Ilestpossibledajouterplusieursrfrencessimultanment,enutilisantlatouche[Ctrl]lorsdelaslectiondanscette botededialogue. Aprsavoirraliscesdeuxoprations,lesressourcesprsentesdanslassemblysontdirectementaccessiblesdans lecodeduprojet.

2.LesNamespaces
Les namespaces organisent logiquement les objets disponibles dans un assembly. Ils sont utiliss pour lever les ambiguitslorsque,dansunprojet,desrfrencessontajoutessurdesassembliescontenantdeslmentsayant desnomsidentiques. Parexemple,laclasse ListBoxexistedanslesassembliesSystem.Webet System.Windows.Forms.Sidesrfrencessont ajoutesdansunprojetverscesdeuxassemblies,lecompilateurrisquedenepaspouvoirdterminerlaquelledeces classesvoussouhaitezrellementutiliser. Lutilisationdunompleinementqualifi,incluantlenamespacedanslequellaclasseestdfinie,permetdersoudrece genredeproblme. Vouspouvezparexempleutiliserlecodesuivant : Exemple Dim listeWindows As System.Windows.Forms.ListBox

- 2-

ENI Editions - All rigths reserved

Dim listeWeb As System.Web.UI.WebControls.ListBox. Cependant,lutilisationdunompleinementqualifipeutdevenirpesantdanslcritureducode.Ilestpossibledutiliser lemotclimportspourallgerlecode.Ilindiqueaucompilateurquecertainsnamespacessontsousentendus. Par exemple linstruction Imports System.Data.SqlClient autorise lutilisationdeladclarationsuivante : Dim ctn As SqlConnectionquisansimportationdunamespaceauraitprovoquuneerreurdecompilation :

LesinstructionsImportsdoiventtrelespremireslignesdecodedunfichiersourcevb. Cependant,soyezvigilantpournepasretombersurleproblmeprcdent.

LinstructionImportsproposeunesolutionlganteencrantunaliaslorsdelimportationdunamespace. Imports ctrlWin = System.Windows.Forms Imports ctrlWeb = System.Web.UI.WebControls Module TestCompta Dim listeWindows As ctrlWin.ListBox Dim listeWeb As ctrlWeb.ListBox Cettesolutionautoriselutilisationdenomsdunelongueurraisonnableenvitantlesconflits. Il est galement noter que, en fonction du type de projet sur lequel vous travaillez, des rfrences et des importationssontralisespardfaut. Vous pouvez vrifier ces rfrences par dfaut et, ventuellement les modifier, en affichant les proprits de votre projetparlemenucontextueldisponibledanslexplorateurdesolutions.

ENI Editions - All rigths reserved

- 3-

Lesimportationspardfautserontactivesdanschaquemoduledevotreprojet. Les namespaces seront dclars dans le code laide des mots cls Namespace nom du namespace et End Namespace. Tousleslmentsdclarsentrecesdeuxmotsclsserontaccessiblesenlesprfixantaveclenomdunamespace. Namespace Facturation Public Class Tarification Public Shared Function calculTTC(prixHt As Decimal, tauxTva As Decimal) As Decimal Return prixHt * (1 + tauxTva / 100) End Function End Class End Namespace Danslexempleprcdent,lafonction calculTTCdfiniedanslaclasse Tarificationestaccessibleenlaprfixantpar le nom du namespace. Toutefois le nom du namespace racine spcifi devra galement tre ajout au niveau des propritsduprojet,enlesparantdesautresnomsdenamespaceparunpoint.

- 4-

ENI Editions - All rigths reserved

Dansnotreexemple,lafonctioncalculTTCestdoncaccessibleparlecodesuivant : Sub Main() prixTtc = Compta.Facturation.Tarification.calculTTC(100, 5.5) End Sub Utilisezlammetechnique,danslecasdenamespacesimbriqus commedanslexemplesuivant : Namespace Gestion Namespace Paye Public Class Salaire .... End Class End Namespace Namespace Facturation Public Class Facture .... End Class End Namespace End Namespace LaclasseSalaireseradoncaccessibleaveclenomCompta.Gestion.Paye.Salaire.

3.Lesattributs
Les attributs sont des marques que vous pouvez placer dans votre code afin dajouter des informations supplmentairesauxlmentsdevotreapplication. Ils sont sauvegards dans les mtadonnes de lassembly pendant la compilation du projet. Les mtadonnes sont utilises par le runtime pour grer le dbogage, le suivi des versions, la compilation et dautres informations sur lutilisation de votre code. Les attributs peuvent sappliquer un assembly, un module ou une portion de code plus petite,tellequuneprocdureoufonction.Ilspourrontparfoisaccepterdesargumentspourmodifierleursignification. Lesattributssontplacsdanslecodeentrelessymboles<et>commeunebaliseHtml.Siplusieursattributssont utiliss, ils doivent tre spars par des virgules. Les ventuels paramtres dun attribut seront placs entre parenthses. LaportedunattributpeutgalementtretendueparlesmotsclAssembly : ouModule : placsavantlattribut.La syntaxedutilisationdunattributestdonc :

ENI Editions - All rigths reserved

- 5-

<[Assembly ou Module :] Attribut1([paramtre1,paramtre2]),Attribut2

a.AttributslespluscourantsenVisualBasic
Parmi les attributs disponibles, certains dentres eux sont trs frquemment utiliss dans le dveloppement avec VisualBasic.Nousallonstudierleurutilisationetlillustrerparunexemple. VBFixedStringAttribute: Cet attribut force la cration dune variable de type chane de caractres de longueur fixe. Il est utilis lors de la dclaration dune structure, en vue de lenregistrement dans un fichier pour avoir des enregistrements de taille constante. Exemple Structure Client <VBFixedString(15)> public nom as String <VBFixedString(15)> public prenom as String End Structure ComClassAttribute: Cetattributdemandeaucompilateurlagnrationdecodesupplmentairepourrendrecompatibleuneclasseavec lemodleCOM.Cetteclasseseraensuitecompatibleavecdancienslangagesdeprogrammationincompatiblesavec laplateforme.NET. Exemple <ComClass()> Public Class Impots Public Sub New() MyBase.New() End Sub Function CalculImpots(ByVal salaire As Integer) Return salaire * 0.3 End Function End Class Pourcompilerlecodedecetexemple,ilfautactiverloptionauniveaudespropritsduprojetdansloptionInscrire pourComInterop. Aprs compilation, cette classe peut tre utilise dans un langage compatible COM, simplement en rfrenant la bibliothquedllgnre. LafiguresuivanteprsentelutilisationpartirdeVb6.

- 6-

ENI Editions - All rigths reserved

SerializableAttribute,NonSerializedAttribute Cesdeuxattributscontrlentlasrialisationduneclasseetdecesmembres.Lasrialisationpermetlenregistrement duneinstancedeclasse,dansunfichierassurantainsilapersistancedesinformations.Lefichiergnrpeuttreau format binaire ou XML, dans ce cas, il facilite lchange dinformations entre applications. Pour quune classe soit utilisableparlemcanismedesrialisation,cellecidoittremarqueaveclattribut SerializableAttribute.Lors deloprationdesrialisation,lecontenudechacundesmembresdelinstancedelaclasseestenregistrdansle fichier.Sicertainsdentreeuxnedoiventpastresauvegardsdanslefichier,ilsdoiventtremarqusaveclattribut NonSerializedAttribute. LexempleciaprsdfinitlaclassePersonneavecdeuxmembres(NometPrenom)quiserontsrialissetunmembre (Age)quineserapassrialis.UneinstancedelaclasseestcrepuissauvegardedansunfichierauformatXML. Exemple Imports Imports Imports Imports System System.IO System.Runtime.Serialization System.Runtime.Serialization.Formatters.Soap

<Serializable()> Public Class Personne Public Nom As String Public Prenom As String <NonSerialized()> Public Age As Integer Public Sub New() End Sub End Class Module test Public Sub Main() Dim UnePersonne As New Personne() UnePersonne.Nom = "Dupond" UnePersonne.Prenom = "Paul" UnePersonne.Age = 25 Dim stream As Stream = File.Open("donnees.xml", FileMode.Create) Dim formatter As New SoapFormatter() formatter.Serialize(stream, UnePersonne) stream.Close() End Sub End Module LexcutiondececodegnrelefichierXMLsuivant : <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap. org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/ " xmlns:clr=http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV: encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <a1:Personne id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/ serializable/serializable%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20 PublicKeyToken%3Dnull"> <Nom id="ref-3">Dupond</Nom> <Prenom id="ref-4">Paul</Prenom> </a1:Personne> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Onretrouve,sauvegardedanscefichier,notreinstancedelaclassePersonneavecsesdeuxmembresNometPrenom et,commenouslavonsindiqudansladfinitiondelaclasse,lemembreAgenestpassauvegard. DllImportAttribute Cetattributestutilispourindiquerquunefonctionestimportepartirdunebibliothquedecodenonmanag.Il permet notamment lutilisation de fonctions dfinies dans une bibliothque du systme. Dans lexemple suivant, la fonctionMoveFilepeuttreutilisecommeunefonctionclassique. Exemple <DllImport("KERNEL32.DLL")>Public Function ByVal dst As String) As Boolean End Function MoveFile(ByVal src As String,

ENI Editions - All rigths reserved

- 7-

- 8-

ENI Editions - All rigths reserved

Introduction
Avec Visual Basic.NET, la notion dobjet est devenue omniprsente et ncessite un minimum dapprentissage. Nous allons donc voir dans un premier temps le principe de la programmation objet et le vocabulaire associ, puis nous verronscommentmettrecelaenapplicationavecVisualBasic. Dans un langage procdural classique, le fonctionnement dune application est rgl par une succession dappels aux diffrentesprocduresetfonctionsdisponiblesdanslecode.Ilnyaaucuneliaisonentrelesdonnesetlesprocdures quilesmanipulent.Dansunlangageobjet,onvaaucontraireessayerderegrouperaumaximumlesdonnesetlecode pour les manipuler. Les classes sont la reprsentation symbolique des objets. Elles dcrivent les champs, proprits, mthodesetvnementsdelammemanirequunplandarchitectedcritlesdiffrentespartiesdunbtiment. Poursuivons notre analogie entre une classe et un plan de btiment. Nous savons quIl est possible de construire plusieursbtimentspartirdummeplan.Delammemanire,plusieursobjetspeuventtreconstruitspartirdela mmeclasse.Uneclassepeutdonctreutilisepourcrerautantdinstancesquencessaire. Surunplandebtiment,certaineszonespeuventavoirunaccslimitcertainespersonnes.Delammefaon,dans uneclasse,certainslmentspeuventavoirunaccsrestreint.Cestleprincipedencapsulation. Les termes classe et objet sont souvent confondus mais il sagit, en fait, dlments bien distincts. Une classe reprsente la structure dun lment alors que lobjet est un exemplaire cr sur le modle de cette structure. La modificationdun lment dans un objet ne change absolument pas les autres objets crs partir du mme modle (classe).Dansnotreexempledeplandebtiment,lajout dunenouvellepiceunbtimentexistantnechangerien aux autres btiments construits suivant le mme plan. Par contre, la modification du plan (de la classe) entrane des modificationspourtouslesnouveauxbtiments(touslesnouveauxobjets). Les classes sont constitues de champs, proprits, mthodes et vnements. Les champs et les proprits reprsentent les informations contenues dans les objets. Les champs sont considrs comme des variables et il est possible de lire leur contenu ou de leur affecter une valeur directement. Par exemple, si vous avez une classe reprsentantunclient,vouspouvezenregistrersonnomdansunchamp. Lespropritssemanipulentdelammefaonqueleschamps,maissontmisesen uvrepartirdeprocduresde proprit Getet Set. Ceci autorise plus de contrle sur la faon dont les valeurs sont lues ou affectes et permet de validerlesdonnesavantleurutilisation. Les mthodes reprsentent les actions quun objet peut effectuer. Elles sont mises en uvre par la cration de procduresoufonctionsdansuneclasse. Lesvnementssontdesinformationsquunobjetreoitoutransmetdepuisouversunautreobjetouapplication.Les vnementspermettentauxobjetsdexcuterdesactionslorsquunesituationparticulireseproduit.CommeWindows est un systme dexploitation vnementiel, les vnements peuvent provenir dautres objets, du systme ou des actionsdelutilisateursurlasourisetleclavier. Cecinestquunefacettedelaprogrammationorienteobjet.Troisautreslmentssontgalementfondamentaux :
q

Lencapsulation. Lhritage. Lepolymorphisme.

Lencapsulation est la capacit permettant de crer et de contrler laccs un groupe dlments. Les classes fournissentlemoyenleplusfiabledassurerlencapsulation.Sinousprennonslexempleduncomptebancaire,dansune programmation classique, il nous faudrait de nombreuses variables et procdures ou fonctions pour manipuler les informations.Lasituationseraitencorepluscomplexesinousdevionsgrersimultanmentplusieurscomptesbancaire. Il faudrait alors travailler avec des tableaux et jongler avec les index. Lencapsulation permet de regrouper les informations et le code les manipulant dans une classe. Si vous devez travailler avec plusieurs comptes bancaire simultanmentvousaurezalorsplusieursinstancesdelammeclasse,limitantainsilerisquederreurs.Lencapsulation assure galement un contrle sur lutilisation des donnes et des procdures ou fonctions. Vous pouvez utiliser les modificateurs daccs, tels que Private ou Protected, pour restreindre laccs certaines mthodes, proprits ou champs. Une rgle fondamentale de lencapsulation stipule que les donnes dune classe ne doivent tre manipules queparlecodedelaclasse(procduresdepropritsoumthodes).Cettetechniqueestparfoisappeledissimulation dedonnes.Elleassurelascuritdefonctionnementdevotrecodeenmasquantlesdtailsinternesdelaclasseeten vitant ainsi quils ne soient utiliss de manire inapproprie. Elle autorise aussi la modification dune partie du code sansperturberlefonctionnementdurestedelapplication. Lhritagepermetlacrationdunenouvelleclasse,basesuruneclasseexistante.Laclasseservantdemodlepourla crationduneautreclasseestappeleclassedebase.Laclasseainsicrehritedeschamps,proprits,mthodes etvnementsdelaclassedebase.Lanouvelleclassepeuttrepersonnaliseenyajoutantdeschamps,proprits, mthodes et vnements. Les classes cres partir dune classe de base sont appeles classes drives. Vous pouvezdoncdfiniruneclassedebaseetlarutiliserplusieursfoispourcrerdesclassesdrives. Le polymorphisme est une autre notion importante de la programmation oriente objet. Par son intermdiaire, il est
ENI Editions - All rigths reserved - 1-

possible dutiliser plusieurs classes de manire interchangeable mme si ces classes implmentent leurs proprits et mthodesdemanirediffrente.Cespropritsetmthodessontutilisablesparlemmenom,indpendammentdela classepartirdelaquellelobjetatconstruit. Trois autres concepts sont galement associs au polymorphisme. La surcharge, la substitution et le masquage de membrespermettentladfinitiondemembresduneclasseportantlemmenom.Ilexistecependantquelquespetites distinctionsentrecestroistechniques. Lasurchargeestutilisepourconcevoirdespropritsoudesmthodesportantlemmenommaisayantunnombrede paramtresdiffrentsoudestypesdeparamtresdiffrents. Lasubstitutionpermetlaredfinitiondemthodesoupropritshritesduneclassedebase.Lesmembressubstitus peuventaccepterlemmenombreettypedeparamtresquelamthodeoupropritdelaclassedebase. Le masquage sert remplacer localement, dans une classe, un membre duneclasse.Nimporte quel type de membre peutmasquerunautremembre.Parexemple,unepropritpeutmasquerunemthodehrite.Lemasquagesefait uniquementgrceaunom.Lesmembresmasqusnesontpashritables.

- 2-

ENI Editions - All rigths reserved

MiseenuvreavecVisualBasic
Dans le reste de ce chapitre, nous allons travailler sur la classe Personne dont la reprsentation UML ( Unified Modeling Language)estdisponiblecidessous.

UML est un langage graphique ddi la reprsentation des concepts de programmation orient objet. Pour plus dinformationssurcelangage,vouspouvezconsulterlouvrageUML2danslammecollection.

1.Crationduneclasse
Lacrationduneclassepasseparladclarationdelaclasseellemmeetdetousleslmentslaconstituant.

a.Dclarationdelaclasse
Ladclarationduneclassesefaitenutilisantlesmotscls Classet End Class.Entrecesdeuxmotscls,ontrouve des dclarations de variables qui seront les champs de la classe et des procdures qui seront les mthodes de la classe. Lasyntaxegnralededfinitionduneclasseestdonclasuivante : [ Public | Private | Protected | Friend | Protected Friend ] [ MustInherit | NotInheritable ] Class nom de la classe [ Inherits nom de la classe de base ] [ Implements nom de linterface ] End Class Denombreuxmotsclssontdisponiblespourlapersonnalisationduneclasse.Aumomentdesadclaration,onpeut spcifierlavisibilitdelaclasse.Lesmotsclssuivantssontdisponibles : Public Laclassepourratreutilisedanstoutvotreprojetmaisaussidansdautresprojets. Friend Laccslaclasseestlimitauprojetdanslequelelleestdfinie. Private Laclassenepeuttreutilisequedanslemoduledanslequelelleestdfinie. Protected La classe ne peut tre utilise que dans une sousclassedecelledanslaquelleelleestdfinie.Cemotclnepeut treutilisquepouruneclassedclaredansuneautreclasse. Protected Friend Identiqueluniondesportesprotectedetfriend. Vous pouvez galement indiquer comment votre classe va se comporter visvis de lhritage. Deux options sont possibles : MustInherit

ENI Editions - All rigths reserved

- 1-

Indiquequelaclassesertdeclassedebasedansunerelationdhritage.Vousnepourrezpascrerdinstancesde cetteclasse.Engnral,danscegenredeclasse,seuleslesdclarationsdesmthodessontdfinies,ilfaudradans lesclassesdrivescrirelecontenudecesmthodes. NotInheritable Cetteclasseseraladerniredelahirarchie.Ilneseradoncpaspossibledutilisercetteclassecommesuperclasse duneautreclasse. Pourindiquerquevotreclassercuprelescaractristiquesduneautreclasseparunerelationdhritage,vousdevez utiliserlemotclInheritssuividunomdelaclassedebase.Vouspouvezgalementimplmenterdansvotreclasse uneouplusieursinterfaces.Cesdeuxnotionsserontvuesendtailplusloindanscechapitre. LedbutdeladclarationdenotreclassePersonneestdonclesuivant : Public Class Personne Dim nom As String Dim prenom As String Dim date_naiss As Date End Class

b.Classepartielle
Ladfinitionduneclassepeuttrerpartiesurplusieursdclarationsenutilisantlemotcl Partial.Cettetechnique autorise la dfinition de la classe dans plusieurs fichiers sources. Elle est trs utilise dans Visual Studio pour permettrelapersonnalisationdeclassesgnresautomatiquement.Lecodegnrestengnralplacdansun fichier nomm .designer.vb qui ne doit, en principe, pas tre modifi directement. Lors de la compilation, le compilateurregroupetouteslesdfinitionspartiellespourobtenirlecodesourcedelaclasse.Lesdiffrentesparties deladfinitionduneclassedoiventparcontretredanslemmeprojetetfairepartiedummenamespace.Ilyaun autrepetitpigevitergalement.Regardonslecodesuivant: Namespace Compta Partial Public Class Personne Public Sub procedure1() End Sub End Class Module Module1 Partial Public Class Personne Public Sub Procedure2() End Sub End Class End Module End Namespace Au premier abord rien dillgal puisque le compilateur gnre le code correctement. Par contre, il na pas la mme visiondeschosesquenous.Regardonscequenousprsentelexplorateurdeclasses.

- 2-

ENI Editions - All rigths reserved

DeuxclassesPersonnesontdisponibles.Lecompilateuraenfaitconsidrquenosdeuxdfinitionsdeclassenefont paspartiedummenamespace.Eneffetlunedentreelleestsituedanslemodule,etlenomdeceluiciestrajout automatiquementcommeprfixelaclasse.

c.Crationdeproprits
Vous pouvez crer des variables simples pour stocker les informations de votre classe mais les procdures de proprit fournissent davantagedeflexibilitetdecontrlesurlestockagedesinformationsdansuneclasse.Elles permettentlaclassedeprotgeretvalidersespropresdonnes.Uneprocduredepropritestdfinieentreles motscls Propertyet End Property.Entrecesdeuxmotscls,deuxblocsdecodesontdfinislaidedesmotscls Get,End GetetSet End Set leblocdecodeGetestexcutlorsdelalecturedelaproprit,leblocdecode Setest excutlorsdelaffectationdunevaleurlaproprit. NotreclassePersonnepeuttreamlioredelafaonsuivante : Public Class Personne Private leNom As String Private lePrenom As String Private laDate_naiss As Date Public Property nom() As String Get Return leNom End Get Set(ByVal Value As String) leNom = Value End Set End Property Public Property prenom() As String Get Return lePrenom End Get Set(ByVal Value As String) lePrenom = Value End Set End Property Public Property date_naiss() As Date Get Return laDate_naiss End Get Set(ByVal Value As Date) LaDate_naiss = Value End Set End Property End Class Lacrationdespropritspermetmaintenantdaccderdemanireindirecteauxchampsdelaclasse.Nouspouvons doncnouspermettredemodifierlavisibilitdeschampsdelaclasseetlesrendreprivs.Cestdailleursunepratique recommande pour respecter le principe dencapsulation. Nous avons donc la possibilit dtre plus exigeant concernant les informations enregistres dans notre classe. Nous allons mettre en pratique les quelques rgles de gestionsuivantes :
q

Lenomserastockenmajuscules. Leprnomserastockenminuscules. Ladatedenaissanceneserapasinfrieure1900.

Lesprocduresdepropritsontdoncchargesdelapplicationdecesrgles. Property nom() As String Get Return leNom End Get Set(ByVal Value As String) leNom = UCase(Value)

ENI Editions - All rigths reserved

- 3-

End Set End Property Property prenom() As String Get Return lePrenom End Get Set(ByVal Value As String) lePrenom = LCase(Value) End Set End Property Property date_naiss() As Date Get Return laDate_naiss End Get Set(ByVal Value As Date) If Value.Year >= 1900 Then laDate = Value End If End Set End Property

noterquelesprocduresdepropritontunaccscompletauxchampsdelaclasse,ycomprisceuxdclars privs.

Lectureseuleetcritureseule Ilpeutparfoistreintressantderestreindrelesaccspossiblesuneproprit.Ellespeuventdonctredfiniesen lecture seule ou en criture seule. Pour indiquer votre intention, vous devez utiliser les mots clsReadOnly ou WriteOnly,lorsdeladclarationdelaproprit. Leblocdecode Getdoittreomispourunepropritencritureseule.Pourunepropritenlectureseule,cestle bloc de code Set qui doit tre omis. Pour mettre cela en application, nous allons ajouter la classe Personne une proprit MotDePasseencritureseuleetunepropritAgeenlectureseule.Lgepeutsedduiredirectementdela datedenaissanceetlemotdepassenapastreaccessibledelextrieurdelaclasse. ReadOnly Property age() As Long Get Return DateDiff(DateInterval.Year, date_naiss, Now()) End Get End Property WriteOnly Property MotDePasse() as String Set (ByVal Value As String) LeMotDePasse=value End Set End Property Propritpardfaut Lapropritpardfautduneclasseestlapropritquiestutiliselorsquaucunepropritparticulirenestindique pourunobjet.Cestengnrallapropritlaplusutiliseduneclasse.Ellepermetderendrelecodeplusconcisen vitantlarptitionfrquentedummenomdeproprit. Lapropritpardfautdoitcependantrespectercertainescontraintes :
q

Elledoitaccepteraumoinsunargument. Ellepeutnepastrepriveoupartage. Siunepropritsurchargeestlapropritpardfautalorstouteslesautrespropritssurchargesayantle mmenomdoiventgalementtredespropritspardfaut. Ilnepeutyavoirquuneseulepropritpardfautdansuneclasse.Cetterglesappliquegalementpour

- 4-

ENI Editions - All rigths reserved

lespropritshrites.
q

Si une proprit par dfaut dune classe de base est masque par une proprit qui nest la proprit par dfaut dune sousclasse, alors la proprit par dfaut de la classe de base est toujours accessible en nutilisantquelenomdelobjet.

Mettonscelaenapplicationenajoutant,laclassePersonne,lalistedesenfantsdecettepersonneetendfinissant cettepropritcommepropritpardfaut. LecodedenotreclassePersonnedevientdonc : Public Class Personne Private leNom As String Private lePrenom As String Private laDate_naiss As Date Private leMotDePasse As String Private lesEnfants(9) As Personne Property nom() As String Get Return leNom End Get Set(ByVal Value As String) leNom = UCase(Value) End Set End Property Property prenom() As String Get Return lePrenom End Get Set(ByVal Value As String) lePrenom = LCase(Value) End Set End Property Property date_naiss() As Date Get Return laDate_naiss End Get Set(ByVal Value As Date) If Value.Year >= 1900 Then laDate_naiss = (Value) End If End Set End Property ReadOnly Property age() As Long Get Return DateDiff(DateInterval.Year, date_naiss, Now()) End Get End Property WriteOnly Property MotDePasse() As String Set(ByVal Value As String) LeMotDePasse = value End Set End Property Default Public Property enfant(ByVal index As Integer) As Personne Get Return lesEnfants(index) End Get Set(ByVal value As Personne) lesEnfants(index) = value End Set End Property End Class

ENI Editions - All rigths reserved

- 5-

noterquenoussommesobligsdecrerunnouveauchampdanslaclassePersonneafindassurerlestockagedela listedesenfants.Pourlinstant,cechampestconstituduntableaudepersonnemaispourratreavantageusement remplacparunestructureplussouplegrer,commeparexempleunecollection.Laproprit enfantattenddonc enparamtreunindexpermettantdespcifierlenfantsurlequelnoussouhaitonstravailler. Lecodesuivantnouspermetdetesterlebonfonctionnementdenotreclasse : Module Principal Sub Main() Dim p As New Personne Dim enfant1 As New Personne Dim enfant2 As New Personne p.nom = "dupond" p.prenom = "paul" p.date_naiss = #12/23/1954# enfant1.nom = "dupond" enfant1.prenom = "pascal" enfant1.date_naiss = #10/5/1979# nous pouvons galement utiliser le nom du parent pour initialiser le nom de lenfant enfant2.nom = p.nom enfant2.prenom = "marc" enfant2.date_naiss = #4/18/1982# nous pouvons affecter un enfant une personne en utilisant la proprit enfant p.enfant(0) = enfant1 comme cest galement la proprit par dfaut de la classe nous pouvons utiliser cette syntaxe p(1) = enfant2 vrifions que nos informations sont correctes Console.WriteLine("Mr {0} {1} n le {2} a 2 enfants", p.nom, p.prenom, p.date_naiss) Console.WriteLine("{0} {1} qui a {2} ans", p(0).nom, p(0).prenom, p(0).age) Console.WriteLine("{0} {1} qui a {2} ans", p(1).nom, p(1).prenom, p(1).age) Console.WriteLine("appuyer sur une touche pour quitter") Console.ReadLine() End Sub End Module Nousobtenonssurlaconsolelersultatsuivant : MrDUPONDpaulnle23/12/195400:00:00a2enfants DUPONDpascalquia26ans DUPONDmarcquia23ans Appuyersurunetouchepourquitter. ous pouvons en profiter pour vrifier que nos rgles concernant le nom et le prnom sont bien prises en N compte : lenomestenmajuscules,leprnomestenminuscules.

d.Crationdemthodes
Lesmthodessontdesprocduresoufonctionsdfinieslintrieurduneclasse.Ellessontengnralutilisespour manipulerleschampsetlespropritsdelaclasse.Pourpouvoirutiliserunemthode,ilsuffitdeprfixerlenomdela mthodeparlenomdelobjetsurlequelvousvoulezappelerlamthode. AjoutonslaclassePersonne,lafonctionCalcul_age()etlaprocdureAffichageeninsrantlecodesuivant: Public Function Calcul_age() As Integer Return DateDiff(DateInterval.Year, date_naiss, Now()) End Function Public Sub affichage() Console.Write(Mr {0} {1} n le {2}, leNom, lePrenom, date_naiss) End Sub

- 6-

ENI Editions - All rigths reserved

noterquedansceslignesdecode,nouspouvonsmanipulerleschampsdelaclassemmesilssontdclars privs, car nous sommes lintrieur de la classe. Il est galement possible daccder aux informations de la classe en utilisant les proprits. Dans ce cas, les rgles de gestion concernant le nom et le prnom seront appliques. Nouspouvonsmodifiernotrecodedetestpourutiliserlaprocdureetlafonctionajouteslaclasse. p.affichage() Console.WriteLine(" a 2 enfants") Console.WriteLine("{0} {1} qui a {2} ans", p(0).nom, p(0).prenom, p(0).Calcul_age) Console.WriteLine("{0} {1} qui a {2} ans", p(1).nom, p(1).prenom, p(1).Calcul_age) Console.WriteLine("appuyer sur une touche pour quitter") Console.ReadLine() Surchargedemthode Lasurchargedemthodeestlacration,auseinduneclasse,demthodesayantunnomidentiquemaisunnombre deparamtresoudestypesdeparamtresdiffrents.Cecinouspermetdeconserverunnomcohrentpourplusieurs mthodesetdontlebutestsimilairemaispourlesquelles,seulsquelquesdtailschangent.Lesparamtressuivants nesontpasprisencomptepourdistinguerdeuxmthodessurcharges :
q

Lenomdesparamtres. Letypederetourdunefonction. LesmodificateursByValouByRefappliqusauxparamtresdelamthode.

Nouspouvons,parexemple,surchargerlamthodeaffichagedelaclassePersonnepourprendreencomptelalangue danslaquelledoitsefairelaffichage.Leparamtreattenduparlaprocdurepermetdechoisirlalangue. Public overloads Sub affichage(ByVal langue As String) Select Case langue Case "fr" Console.Write("Mr {0} {1} n le {2}", leNom, lePrenom, date_naiss) Case "en" Console.Write("Mr {0} {1} was born the {2}", leNom, lePrenom, date_naiss) End Select End Sub Le mot cloverloads est optionnel lors de la surcharge dunemthodelintrieur dune classe. Cependant, silest spcifipourunemthodesurcharge,ildoitltrepourtouteslesautres.

Lesmthodeshritesdautres classes peuvent galement tre surcharges. Il convient cependant dtreprudent, dans ce cas, avec lutilisation ou non du mot cloverloads. Sil nest pas utilis pour la surcharge alors toutes les autres surcharges de la classe de base seront inaccessibles. Par contre, sil est utilis, toutes les mthodes surcharges seront disponibles. Pour illustrer cela, nous allons considrer que nous avons une classe salarie qui hrite de la classe Personne. Nous verrons un petit peu plus loin comment mettre cet hritage en uvre. Nous pouvons,dansnotreclasseSalarie,surchargerlamthode Affichage().Sinousnutilisonspaslemotcloverloads, Visual Studio nous prvient dunproblmepotentiel,lilinaccessibilit des mthodes Affichage()delaclassede base.

ENI Editions - All rigths reserved

- 7-

Si, par contre, le mot overloads est utilis, nous pouvons avoir accs par la classe Salarie toutes les mthodes surcharges ycompriscellesdfiniesdanslaclassePersonne.

Substitutiondemthode Lesclassesdriveshritentdespropritsetmthodesdeleurclassedebase.Vouspouvezdonclesrutiliser, partir dune sousclasse, sans aucune modification. Par contre, si le fonctionnement de cette proprit ou mthode nestpasadaptlanouvelleclasse,vousavezlapossibilitdelasubstituerparunenouvelleimplmentationdans laclassedrive.Ilfautdanscecasutiliserlemotcl overrideslorsdelasubstitutiondanslaclassedrive.Ilest galementimpratifquelaclassedebaseaitautoriscettesubstitutionparlutilisationdumotclOverridable.Sans indication particulire, une mthode ou une proprit nest pas substituable. En gnral, la substitution est utilise pour assurer le polymorphisme entre classes. Les mthodes substitues doivent bien sr avoir le mme nom mais galement le mme nombre et type de paramtres que les mthodes de la classe de base auxquelles elles se substituent.NouspouvonsainsidanslaclasseSalariesubstituerlamthodeAffichage. Public Overrides Sub affichage() Console.Write("Mr {0} {1} n le {2} gagne {3} euros par mois", nom, prenom, date_naiss, salaire) End Sub Avec cette dclaration, la mthode affichage de la classe Personne nest plus visible aux utilisateurs de la classe Salarie.SeulelamthodeAffichagedelaclasse Salarieestaccessible.Cependant,lecodedelamthodeAffichage delaclasse Salariepeutquandmmeavoiraccscettemthodeenutilisantlemotcl Mybase.Nousaurionsdonc pucrirepourlamthodeAffichedelaclasseSalarie. Public Overrides Sub affichage() Appel de la mthode affichage de la classe Personne MyBase.affichage() Ajout des fonctionnalits spcifiques la classe Salarie Console.WriteLine("gagne {0} euros par mois", salaire) End Sub Ds quune mthode est dclare comme tant substituable dans une classe, elle le sera pour toutes ses sous classesquelquesoitledegrdeparent(classefille,petitefille...).LemotclNotOverridablepeuttreutilispour bloquerpartirdunniveaudonncettefonctionnalit.Parexemple,danslaclasseSalarienousaurionspucrire : Public NotOverridable Overrides Sub affichage() MyBase.affichage() Console.WriteLine("gagne {0} euros par mois", salaire) End Sub Cettesyntaxeannule,pourlessousclassesdelaclasse Salarie,lautorisationdesubstitutionquitaitmiseenplace parlaclassePersonne.SinousessayonsdesubstituercettemthodedansuneclasseChefquihritedeSalarienous obtenonslemessagesuivant :

linverse,nouspouvonsexigerquuneclassehritesubstitueunemthodedfiniedansuneclassedebase.Cette mthode doit tre marque avec le mot clMustOverride. Pour une telle mthode, il ne doit pas y avoir dimplmentationmaisjustesadfinition. Public MustOverride Function etat_civil() As String Unetellemthodeestparfoisappelemthodeabstraite.Elleexigequelaclassedanslaquelleelleestdfiniesoit galementmarquecommeabstraiteaveclemotclMustInherit.

- 8-

ENI Editions - All rigths reserved

Masquagedemthode Lorsque des lments dun programme partagent le mme nom, lun deux peut masquer lautre. Dans un tel cas, llmentmasqunestplusaccessibleetlecompilateurutiliselaplacellmentlemasquant.Lemasquagepeutse faire entre des lments de type diffrent. Seul le nom de llment est utilis pour assurer le masquage. Lors du masquage,ilconvientdutiliserlemotclShadows,devantlenomdumembreassurantlemasquage.Nouspouvonspar exemplemasquerlamthodeAffichagedansuneclassedrivedelaclassePersonne. Public Shadows Sub Affichage() End Sub Pourcetteclasse,ilnyadornavantquunseullmentappelAffichage.Toutcequipeutexistercommelment, danslaoulesclassesdebasedecetteclasse,etquiestnommAffichageestmasquetinaccessible. ettetechniqueestutiliseravecprcautioncarenfonctiondelemplacementosetrouveuneinstruction,le C mmenompeutfairerfrencedeslmentsdenaturediffrente.

Mthodepartielle Les mthodes partielles sont utilises pour nous permettre de personnaliser le code dune classe partielle gnre par un outil de Visual Studio. Elles sont principalement utilises pour fournir une notification de changement. Loutil gnreuniquementlesquelettedelamthodeetyfaitappellorsquelanotificationdoitseproduire.Lutilisateurdela classepeutventuellementdfinirsapropreversiondelamthodeetdanscecascelleciseraappelelaplacede celle gnre automatiquement. Voyons comment mettre cela en application avec la classe Personne. Nous devons tout dabord dfinir la classe comme tant une classe partielle puis prvoir lintrieur de la classe une mthode partielleenrespectantlesrglessuivantes :
q

lamthodedoittreuneprocdureetnonunefonction, lecorpsdelamthodedoittrevide, lamthodedoittreprive.

Partial Public Class Personne Private leNom As String Private lePrenom As String Private laDate_naiss As Date Partial Private Sub nomChanged() End Sub Public Property nom() As String Get Return leNom End Get Set(ByVal Value As String) leNom = Value nomChanged() End Set End Property End Class Ilnousrestemaintenantpersonnalisercetteclassedansunautrefichiersourceettesterlersultat.Pourcela, dansunmodule,ajoutonslecodesuivant :

ENI Editions - All rigths reserved

- 9-

Partial Class Personne Private Sub nomChanged() Console.WriteLine("un nouveau nom est affect") End Sub End Class Module Module1 Public Sub main() Dim p As Personne p = New Personne p.nom = "Dupont" Console.WriteLine(p.nom) Console.ReadLine() End Sub End Module lexcution,nousavonslersultatsuivant: un nouveau nom est affect Dupont Cestbienlecodedenotreversiondelamthode nomChangedquivientdtreexcuteretpourtantnousnavonspas touchlecodeoriginaldelaclassePersonne. Mthodedextension Lesmthodesdextensionpermettentlajoutdefonctionnalitsuneclassedjdfiniesansbiensravoirmodifier lecodedecetteclasse.Ellessontsimplementcritesdansdesmodulesetsontensuiteappelesexactementdela mmefaonquelesmthodesdisponiblesdirectementdanslaclasse.Ilyacependantquelquesrglesrespecter:
q

ellespeuventtredetypeprocdureoufonctionmaispasdetypeproprit. Ellesdoiventtremarquesaveclattribut<Extension()>. Letypedupremierparamtredelamthodedtermineletypetenduparcettemthode. Aumomentdelexcutioncepremierparamtrereprsentelinstancedelaclassesurlaquellelamthodeest appele.

Danslexemplecidessous,nousajoutonsunemthodelaclassePersonne. Module Module1 <Extension()> Public Sub affichage(ByVal p As Personne) Console.WriteLine("nom : {0}", p.nom) Console.WriteLine("prnom : {0}", p.prenom) Console.WriteLine("date de naissance : {0}", p.date_naiss) End Sub Public Sub main() Dim p As Personne p = New Personne p.nom = "dupont" p.prenom = "paul" p.date_naiss = #6/7/1955# p.affichage() Console.ReadLine() End Sub End Module LesmthodesdextensionpeuventgalementtredfiniespourlestypesdebaseduFrameworkcommeparexemple laclasseString.LecodesuivantajoutelaclasseStringunemthodepermettantdeconvertirlepremiercaractre dunechaneenmajuscule. <Extension()> Public Function FirstToUpper(ByVal s As String) As String If IsNothing(s) OrElse s.Length = 0 Then Return s ElseIf s.Length = 1 Then
- 10 ENI Editions - All rigths reserved

Return s.ToUpper Else Return s.Substring(0, 1).ToUpper & s.Substring(1, s.Length - 1) End If End Function Si nous utilisons ensuite une variable de type String, notre nouvelle mthode devient disponible et est mme proposeparIntelliSense.

noterlicnediffrenteutilisepourdiffrencierunemthodedextensiondunemthodenormaledelaclasse.

e.Constructeursetdestructeurs
Les constructeurs sont des mthodes particulires dune classe par diffrents aspects. Le constructeur sappelle toujoursNewdansuneclasse.Ilnestjamaisappelexplicitementdanslecodemaisdemanireimplicite,lacration dune instance de classe. Comme pour une mthode classique, un constructeur peut attendre des paramtres. Le constructeurduneclassequinattendpasdeparamtreestdsigncommeleconstructeurpardfautdelaclasse. Le rle du constructeur est principalement linitialisation des champs dune instance de classe. Les constructeurs peuventgalementtresurchargsmais,danscecas,lutilisationdumotcloverloadsestinterdite. AjoutonslaclassePersonnedesconstructeurs. Public Sub New() leNom = "" lePrenom = "" leMotDePasse = "" End Sub Public Sub New(ByVal nom As String, ByVal prenom As String, ByVal pwd As String) leNom = nom lePrenom = prenom leMotDePasse = pwd End Sub Lorsquenouscronsuneclassedrive,ellepeutaussidisposerdesespropresconstructeurs.Sinousajoutonsdans laclassedriveunconstructeurpardfaut,nousdevonssuivrequelquesrgles :
q

Si dans la classe de base il existe un constructeur surcharg, nous devons appeler explicitement, dans le constructeurpardfautdelaclassedrive,leconstructeurpardfautdelaclassedebase. Sil nexiste, dans la classe de base, que le constructeur par dfaut, son appel est implicite dans le constructeurpardfautdelaclassedrive. Dansnotrecas,leconstructeurpardfautdelaclasseSalariedevraitavoirlaformesuivante.

Public Sub New() MyBase.New() leSalaire = 0 End Sub LaligneMyBase.new()provoquelappelimpliciteduconstructeurdelaclasse Personne.Cettelignedoitobligatoirement tre la premire du constructeur. Les destructeurs sont dautres mthodes particulires dune classe. Comme les constructeurs, ils sont appels implicitement mais uniquement lors de la destruction dune instance de classe. La signaturedudestructeurestimpose.Cettemthodedoittre protected,senommer finalizeetneprendreaucun paramtre.Dufaitdecettesignatureimpose,ilnepeutyavoirquunseuldestructeurpouruneclasse,doncpasde surchargepossiblepourlesdestructeurs.

ENI Editions - All rigths reserved

- 11 -

Ladclarationdundestructeurestdonclasuivante : Protected Overrides Sub finalize() End Sub LemotcloverridesestobligatoirecarledestructeursesubstitueaudestructeurhritdelaclasseObject.Lecode prsentdansledestructeurdoitpermettrelalibrationdesressourcesutilisesparlaclasse.Onpeut,parexemple,y trouverducodefermantunfichierouvertparlaclasseoulafermetureduneconnexionversunserveurdebasede donnes. ousverronsendtaildansleparagrapheDestructionduneinstance,lescirconstancesdanslesquellesest N appelledestructeur.

f.Membrespartags
Lesmembrespartagssontdeschamps,propritsoumthodesquisontaccessiblespartouteslesinstancesdune classe.Onparlegalement,danscertainslangages,demembresstatiques. Ils sont trs utiles lorsque vous avez grer, dans une classe, des informations qui ne sont pas spcifiques une instance de classe mais la classe ellemme. Par opposition aux membres dinstance, pour lesquels il existe un exemplaireparinstancedelaclasse,lesmembrespartagsexistentenunexemplaireunique.Lamodificationdela valeurdun membre dinstancenemodifielavaleurquepourcetteinstancedeclassealorsquelamodificationdela valeur dun membre partag modifie la valeur pour toutes les instances de la classe. Les membres partags sont assimilablesdesvariablesglobales,dansuneapplication.Ilssontutilisablesdanslecodeenyfaisantrfrencepar lenomdelaclasseougrceuneinstancedelaclasse. noter que dans ce cas le compilateur ne trouve pas cette dmarche logique et provoque un avertissement sur la lignedecodecorrespondante.Ilestdoncprfrabledetoujoursutiliserlenomdelaclassepouraccderunmembre partag. Les mthodes partages suivent les mmes rgles et peuvent servir la cration de bibliothques de fonctions. LexempleclassiqueestlaclasseMathdanslaquelledenombreusesfonctionspartagessontdfinies.Lesmthodes partages possdent cependant une limitation car elles ne peuvent utiliser que des variables locales ou dautres membres partags de la classe. Elles ne doivent jamais utiliser des membres dinstance duneclasse,carilsepeut quelamthodesoitutilisesansquilexisteuneinstancedelaclasse.Lecompilateurvrifieracegenrederreurs.

Lesmembrespartagsdoiventtredclarsaveclemotcl Shared.Vouspouvezgalement,commepournimporte quelautremembreduneclasse,spcifierunevisibilit.Parcontre,unevariablelocaleuneprocdureoufonctionne peutpastrepartage.

2.Utilisationduneclasse
Lutilisationduneclasse,dansuneapplication,passepardeuxtapes.
q

Ladclarationdunevariablepermettantlaccslobjet. Lacrationdelobjet.

Danscertainscas,cesdeuxtapespeuventtreomises,VisualBasicleseffectuantluimme.Onparlealorsdobjets intrinsques.Cestlecas,parexemple,pourlesobjetsdenomMy.

a.Crationduneinstance
Les variables objet sont des variables de type rfrence. Elles diffrent des variables classiques par le fait que la variable ne contient pas directement les donnes mais une rfrence sur lemplacement dans la mmoire de la machine o se trouvent les informations. Comme pour toutes les variables, elles doivent tre dclares avant leur utilisation.Ladclarationseffectuedemanireidentiquecelledunevariableclassique(Integerouautre). Dim p as Personne

- 12 -

ENI Editions - All rigths reserved

Aprscettetape,lavariableexistemaisnerfrencepasdemplacementvalide.EllecontientlavaleurNothing. Ladeuximetapeconsisterellementcrerlinstancedelaclasse.Lemotcl Newestutilisceteffet.Ilattend commeparamtrelenomdelaclassedontilestchargdecreruneinstance.Loprateur Newfaitunedemandeau systmepourobtenirlammoirencessaireaustockagedelinstancedelaclasse,puisinitialiselavariableaveccette adressemmoire.Leconstructeurdelaclasseestensuiteappelpourinitialiserlanouvelleinstancecre. p = New Personne Lesdeuxoprationspeuventtrecombinesenuneseuleligne. Dim p as New Personne Leconstructeurpardfautestappel,danscecas.Pourutiliserunautreconstructeur,vousdevezspcifieruneliste de paramtres et en fonction du nombre et du type des paramtres, loprateur New appelle le constructeur correspondant. Dim p as New Personne(Dupond,"Paul",#12/24/1953#)

b.Initialisationduneinstance
Aprs avoir cr une instance de classe, vous pouvez initialiser les membres de celleci par lintermdiaire des proprits de classe. Il est possible de combiner ces deux tapes en une seule. Pour cela, lors de la cration de linstance,ilfautfournirunelistedepropritsetdevaleursaffectercesproprits.Voicicidessouslasyntaxe exacteutiliser : Dim p As Personne p = New Personne With {.nom = "dupont", .prenom = "paul"} Ilnyapasdelimitationsurlenombredepropritsinitialisesnisurlordredapparitiondespropritsdanslaliste dinitialisation. Cette unique ligne de code est lquivalent de la syntaxe moins condense et plus traditionnelle suivante : Dim p As Personne p = New Personne With p .nom = "Dupont" .prenom = "Paul" End With

c.Destructionduneinstance
La destruction dune instance de classe est automatique dans une application. Le Common Language Runtime surveille intervalles rguliers que toutes les instances de classes, cres dans lapplication, sont encore accessibles cestdirequilexisteencoredanslapplicationunevariableouunepropritpermettantlaccscette instance. Si aucun moyen daccder cette instance nest trouv, lobjet est alors marqu comme tant orphelin. Lorsque les rserves mmoire de lapplication deviennent trop faibles, le Garbage Collector intervient et limine les objetsorphelins.Cestlorsdecetteliminationquelesdestructeursdechacundesobjetssontappels.Ilnyaaucun moyen de prcipiter les choses en demandant llimination immdiate de la mmoire dune instance particulire de classe. Cette situation est parfois problmatique lorsque lobjet utilise une ressource externe comme, par exemple, uneconnexionversunserveurdebasededonnes.Silafermeturedelaconnexionestprvuedansledestructeurde laclasse,ilpeutsepasserassezlongtempsentrelemomentolobjetdevientinaccessibleetceluioledestructeur estappel. Pourpallierceproblme,ilestpossibledemettreen uvreuneautresolution.Lecodechargdelalibrationdes ressourcesestplacdansuneautremthodeetcettemthodeestappeleexplicitementdanslecode.Engnral, cettemthodeestnomme Dispose.Pourtrecertainquelesressourcessontbienlibres,vouspouvezgalement prvoirunappelcettemthodedansledestructeurdelaclasse. Unautreproblmepeutalorssurvenir : silamthodeatappeleexplicitementdanslecodedelapplication,ellele seranouveau,demanireimplicite,lorsqueleGarbageCollectorentreraenaction.Vousdevez,donc,faireensorte quelecodedecettemthode Dispose puisse tre excut deux fois sans causer derreur.Vouspouvezgalement indiquerauGarbageCollector,quilnedoitpasexcuterledestructeurdecetteinstancede classe.Pourcela,dansla mthode Dispose, vous devez le prvenir que le travail de nettoyage est dj ralis, en appelant la mthode SuppressFinalize.LecodedelamthodeDisposeetdudestructeurdoitalorsavoirlaformesuivante : Public Sub Dispose() inserer le code charg de la libration des ressources

ENI Editions - All rigths reserved

- 13 -

Demande au Garbage Collector de ne pas appeler le destructeur GC.SuppressFinalize(Me) End Sub Protected Overrides Sub finalize() Dispose() End Sub Une dernire solution consiste demander au Garbage Collector dentrer en action immdiatement en appelant la mthodecollect. GC.Collect() Cettesolutionnestcependantpasrecommande,carelleconsommenormmentderessourcessurlesystmepour parfoisnercuprerquequelquescentainesdoctetsenmmoire.

d.Liaisontardive,liaisonprcoce
Le compilateur Visual Basic effectue une opration appele liaison lorsquun objet est affect une variable. Cette liaisonestditeprcocelorsquelavariableestcrepartirduneclassespcifique.Cettefonctionnalitpermetau compilateur deffectuer des optimisations sur le code gnr. Laffection dun objet peut aussi se raliser une variabledetypeObject.Cetypedevariableestcapablederfrencernimportequelautretypedeclasse.Dansce cas, la liaison est dite tardive car le type rel de lobjet ne sera dcouvert qu lexcution de lapplication. Cette technique est viter car elle gnre un code moins efficace et surtout elle ne permet pas de bnficier de la compltionautomatiqueducodedanslditeurnidelaidedynamique.Eneffet,danscecasVisualBasicnepeutpas dterminerletypereldelobjetmanipul. Cependant, certaines fonctions retournent un type Object, mais pour pouvoir le manipuler, il convient de prendre quelques prcautions. La premire solution consiste nutiliser, avec la valeur renvoye par la fonction, que des membresdelaclasseObject.Cettesolutionestrelativementlimitativequantauxfonctionnalitsdisponibles. Ladeuximesolutionconsisteaffecter,unevariableduntypeparticulier,lavaleurrenvoyeparlafonction.Cette solutionpermetdutilisertouteslesfonctionnalitsdelobjetretournparlafonction.Cependant,ilfauttrecertain que lobjet retourn est bien une instance de la classe que lon souhaite manipuler. Dailleurs, le compilateur se chargeradenouslerappeler.

Nousdevonsdoncnousassurerdutypedelobjetretournetdemanderexplicitementletranstypage.Nouspouvons obtenirlenomdutypedelobjeteteffectuerunecomparaisondechanedecaractres. Dim fils As Personne If TypeName(p.getEnfant(0)).Equals("Personne") Then fils = CType(p.getEnfant(0), Personne) End If Cette solution fonctionne mais comporte le risque de mal orthographier le nom de la classe lors de la comparaison. Loprateur TypeOf ... Is ...estplusadaptcettesituation. Dim fils As Personne If TypeOf p.getEnfant(0) Is Personne Then fils = CType(p.getEnfant(0), Personne) End If noter que le transtypage ne change pas le type de lobjet en mmoire mais permet simplement de le voir dune autrefaon.SiparexemplenousavonsenmmoireuneinstancedelaclasseSalarie,letranstypagenouspermetde levoircommeunObject,unePersonneouunSalariemaiscelaresteratoujoursuneinstancedelaclasseSalarie.

3.Hritage
Lhritageestunepuissantefonctionnalitdunlangageorientobjetmaispeutparfoistreutilisemalpropos.Deux types de relations peuvent tre utiliss entre deux classes. Nous pouvons avoir la relation est une sorte de et la relation concerne un. La relation dhritage doit tre envisage lorsque la relation est une sorte de peut tre appliqueentredeuxclasses.Prenonsunexempleavectroisclasses : Personne,Client,Commande.

- 14 -

ENI Editions - All rigths reserved

Essayonslesrelationspourchacunedesclasses. 1.Unecommandeestunesortedeclient 2.Unecommandeestunesortedepersonne 3.Unclientestunesortedecommande 4.Unclientestunesortedepersonne 5.Unepersonneestunesortedeclient 6.Unepersonneestunesortedecommande Parmi toutes ces tentatives, il ny en a quune seule qui nous semble logique : un client est une sorte de personne. Nous pouvons donc envisager une relation dhritage entre ces deux classes. La mise en uvre est trs simple au niveauducodepuisque,dansladclarationdelaclasse,ilsuffitjustedespcifierlemotclInheritssuividunomdela classe dont on souhaite hriter. Visual Basic nacceptant pas lhritage multiple, vous ne pouvez spcifier quun seul nomdeclassedebase. Public Class Client Inherits Personne Private leCode As Integer Public Property code() As Integer Get Return leCode End Get Set(ByVal value As Integer) leCode = value End Set End Property End Class La classe peut ensuite tre utilise et propose toutes les fonctionalits dfinies dans la classe Client plus celles hritesdelaclassePersonne.

a.MyBaseetMyClass
Il est lgitime de vouloir ensuite modifier le fonctionnement de certaines mthodes hrites pour les adapter la classe Client. Par exemple, la mthode Affichage peut tre substitue pour tenir compte des nouveaux champs disponiblesdanslaclasse. Public Overrides Sub affichage() Console.Write(Mr {0} {1} n le {2}", nom, prenom, date_naiss) Console.Write( code Client : {0}", leCode) End Sub Ce code fonctionne trs bien mais ne respecte pas lun des principes de la programmation objet qui veut que lon rutiliseaumaximumcequiexistedj.Dansnotrecas,nousavonsdjuneportiondecodechargedelaffichage du nom, du prnom et de la date de naissance dune personne. Pourquoi ne pas la rutiliser dans la mthode affichagedelaclasseClientpuisquelonenhrite ? Notremthodedevientdonc :

ENI Editions - All rigths reserved

- 15 -

Public Overrides Sub affichage() affichage() Console.Write(" code Client : {0}", leCode) End Sub Essayonsdelutiliser : Dim c As Client c = New Client c.nom = "dupond" c.prenom = "paul" c.date_naiss = #12/23/1954# c.code = 12345 c.affichage() Hlas,lersultatnestpaslahauteurdenosesprances !

Quesestilpasslorsdelexcution ? Lorsdelappeldelamthode affichage,lapremirelignedecodeaconsistappelerlamthode affichagedela classedebase.Enfait,VisualBasicrecherchelapremiremthode affichagequiltrouveetappelleainsienbouclela mthodeaffichagedelaclasseClientdolerreurdedbordementdepilequenousobtenons. Pour viter ce genre de problme, nous devons lui prciser que la mthode affichage appeler se trouve dans la classedebase.Pourcela,nousdevonsutiliserlemotclMyBasepourqualifierlamthodeaffichageappele. Public Overrides Sub affichage() MyBase.affichage() Console.Write( code Client : {0}, leCode) End Sub Aprscettemodification,toutrentredanslordreetnotrecodeaffiche. Mr DUPOND paul n le 23/12/1954 00:00:00 code Client : 12345 Lammesyntaxepeuttreutilisepourappelerleconstructeurdelaclassedebase. Lappelauconstructeurdelaclassedebasedoittrelapremirelignedunconstructeur. NouspouvonsdonccrerunconstructeurpourlaclasseClientquiutiliseleconstructeurdelaclassePersonne. Public Sub New(ByVal nom As String, ByVal prenom As String, ByVal pwd As String, ByVal leCode As Integer) MyBase.New(nom, prenom, pwd) leCode = leCode End Sub Vrifionsquelenouveauconstructeurfonctionne : Dim c As Client c = New Client("dupond", "paul", "secret", 12345) c.date_naiss = #12/23/1967# c.affichage() Console.ReadLine()

- 16 -

ENI Editions - All rigths reserved

Nousaffiche : Mr dupond paul n le 23/12/1967 00:00:00 code Client : 0 Lesinformationsontbientprisesencompte,sauflecodeclientquirestezro.Regardonsdeplusprslecodedu constructeur. Nous dcouvrons quun paramtre du constructeur porte le mme nom quun champ de la classe. Lorsquenouscrivonslaligne CodeCli=CodeClilecompilateurconsidrequenoussouhaitonsaffecterauparamtre CodeCli la valeur contenue dans le paramtre CodeCli. Rien dillgal, mais ce nest absolument pas ce que nous souhaitonsfaire.Nousdevonsindiquerquelaffectationdoitsefairelavariablemembredelaclasse.Pourcela,nous devonslaprfixeraveclemotclMyClass. Leconstructeurdevientdonc : Public Sub New(ByVal nom As String, ByVal prenom As String, ByVal pwd As String, ByVal leCode As Integer) MyBase.New(nom, prenom, pwd) MyClass.leCode = leCode End Sub Notrecodedetestnousaffichealorslesbonnesinformations : Mr dupond paul n le 23/12/1967 00:00:00 code Client : 12345

b.Classesabstraites
Les classes abstraites sont des classes qui peuvent uniquement tre utilises comme classe de base dans une relation dhritage. Il est impossible de crer une instance dune classe abstraite. Elles servent essentiellement de modle pour la cration de classe, devant toutes avoir un minimum de caractristiques identiques. Elles peuvent contenirdeschamps,despropritsetdesmthodescommeuneclasseordinaire.Cettetechniquefacilitelvolution delapplication,carsiunenouvellefonctionnalitdoittredisponibledanslesclassesdrives,ilsuffitdajoutercette fonctionnalitdanslaclassedebase.Ilestgalementpossibledenepasfournirdimplmentationpouruneclasse abstraiteetainsilaisserlutilisateurdelaclasselesoindecrerlimplmentationdanslaclassedrive. Pourquuneclassedevienneuneclasseabstraite,vousdevezutiliserlemotcl MustInheritdansladclarationdela classe. Public MustInherit Class Modele End Class

c.Classesfinales
Lesclassesfinalessontdesclassesordinairesquipeuventtreinstanciesmaisnesontpasutilisablescommeclasse de base dans une relation dhritage. Cest le cas de plusieurs classes du Framework.NET, comme par exemple la classeString.

UneclassefinaledoittredfinieaveclemotclNotInheritable. Public NotInheritable Class Client Inherits Personne End Class

d.Classesanonymes
Visual Basic nous fournit la possibilit de crer des objets sans crire de code pour la dfinition de la classe correspondante. Cest le compilateur qui va prendre en charge la gnration de la classe. videmment il va falloir laiderunpetitpeuetluifournirquelquesinformationspourquilpuissegnrerlaclasseetencreruneinstance.La dclarationduneinstancedeclasseanonymesebaseprincipalementsurleprincipevuauparagraphebconcernant linitialisation dune instance. Lors de la dclaration dune telle instance nous devons fournir la liste des proprits souhaitesainsiqueleursvaleurs.Voyonsdoncunpremierexemple.

ENI Editions - All rigths reserved

- 17 -

Dim produit = New With {.Nom = "biscuit", .Prix = 1.56} LavariableproduitfaitrfrenceuneinstancedeclassecontenantdeuxpropritsNometPrix.Cesdeuxproprits sont initialises respectivement avec les valeurs biscuit" et 1.56. Pour vrifier cela, demandons encore une fois IntelliSensesonavis.

Ilnousindiquebienquepournotrevariableproduit,lesdeuxpropritssontdisponibles.Parcontreilnouspropose galementplusieursmthodes.Doviennentelles ?Enfait,lesclassesanonymesrespectentlesmmesrglesque touteslesautresclassescarelleshritentpardfautdelaclasse Object.Lesmthodesproposessontdonccelles hritesdelaclasse Object.Cesontdailleurslesseulesquilpourrayavoirdansuneclasseanonymecarpource genredeclasseilestimpossiblededfinirautrechosequedesproprits,doncpasdemthodesnidvnements. Vousdevezcertainementvousposerlaquestion : Commentlecompilateurfaitilpoursyretrouversilexisteplusieurs instances de classe anonyme ? En fait, ces classes sont anonymes pour nous mais pas pour lui car pendant la compilationilvagnrerautomatiquementunnompourcesclasses.Pourlevrifier,demandonslavariableproduit denousindiquersontype. Console.WriteLine(produit.GetType.Name) Nousobtenonslarponsesuivantelexcution. VB$AnonymousType_0`2 Il existe donc bien un nom pour ces classes. Par contre, ce nom nest connu quaprs la compilation donc hors de questiondelutiliserdansnotrecode.Ceseraitdailleursunetrsmauvaiseidecarilestsusceptibledechanger chaquecompilationdelapplication. En fait, le compilateur ne cre pas une nouvelle classe pour chaque instanciation car il vrifie, avant de crer une nouvelleclasse,silnapasdjtraitunedfinitionidentique.Pourcela,ilsebasesurleslmentssuivants :
q

lenombredeproprits lenomdesproprits letypedesproprits lordredespropritsdansladfinition.

Sitousceslmentssontidentiquesalorsilrutiliseralaclassequil a dj gnre pour crer linstance.Vrifions cela : Dim produit1 = New With {.Nom = Dim produit2 = New With {.Nom = Console.WriteLine("la classe de Console.WriteLine("la classe de "biscuit", .prix = 1.56} "confiture", .prix = 2.24} produit1 est :{0}", produit1.GetType.Name) produit2 est :{0}", produit2.GetType.Name)

Nousobtenonslersultatsuivant : la classe de produit1 est :VB$AnonymousType_0`2 la classe de produit2 est :VB$AnonymousType_0`2 Toutestnormalcarlesdeuxvariablesontrigoureusementlammedfinition.Sinousfaisonsunepetitemodification eninversantsimplementlordredesproprits : Dim produit1 = New With {.Nom = "biscuit", .prix = 1.56}

- 18 -

ENI Editions - All rigths reserved

Dim produit2 = New With {.prix = 2.24, .Nom = "confiture"} Console.WriteLine("la classe de produit1 est :{0}", produit1.GetType.Name) Console.WriteLine("la classe de produit2 est :{0}", produit2.GetType.Name) Nousobtenonscettefoislersultatsuivant : la classe de produit1 est :VB$AnonymousType_0`2 la classe de produit2 est :VB$AnonymousType_1`2 Lecompilateuracettefoisgnrdeuxclassespuisquelesdfinitionssontdiffrentes. Lors de la dclaration dune instance de classe anonyme, certaines proprits peuvent tre dfinies comme des proprits cls de linstance. Ces proprits ont un rle important pour la comparaison dinstances de classes anonymes.Ellessontidentifiesgrceaumotclkeyplacdevantlenomdelaproprit.Lespropritsdclares ainsisontenlectureseule.

Pourcomparerdeuxinstancesdeclasseanonyme,nousdevonsutiliserlamthodeEquals.Cettemthodeesthrite de la classe Object mais substitue par le compilateur au moment de la gnration de la classe anonyme. Cette mthodeindiqueraquedeuxinstancessontidentiquessitouteslesconditionssuivantessontrespectes.
q

Lesdeuxobjetsdoiventtredclarsdanslemmeassembly. Lespropritsdoiventavoirlemmenom,lemmetypeettredclaresdanslemmeordre. IldoityavoiraumoinsunepropritdclareaveclemotclKey. LesmmespropritsdoiventtredclaresaveclemotclKeydanslesdeuxinstances. LesvaleursdespropritsdclaresaveclemotclKeydoiventtreidentiquesdanslesdeuxinstances. Uneinstancedeclasseanonymequinapasdepropritdclareaveclemotcl Keynepeuttregalequ ellemme.

Vrifionscesrglesencomparantdiffrentsproduits. Dim produit1 = New With {Key .code = 12854, .Nom = "biscuit", .prix = 1.56} Dim produit2 = New With {Key .code = 12854, .Nom = "biscuit", .prix = 1.56} Console.WriteLine(produit1.Equals(produit2)) CecodenousafficheTruecarlesdeuxinstancesrespectentlensembledesrglesdgalitcitescidessus. EssayonsdenfreindreunedesrglesenoubliantparexemplelemotclKey. Dim produit1 = New With {.code = 12854, .Nom = "biscuit", .prix = 1.56} Dim produit2 = New With {Key .code = 12854, .Nom = "biscuit", .prix = 1.56} Console.WriteLine(produit1.Equals(produit2)) Lersultatestsansappel : lesdeuxinstancesnesontplusidentiques.

4.Interfaces
Nous avons vu que lon pouvait obliger une classe implmenter une mthode en la dclarant avec le mot cl MustOverride.Sinousavonsplusieursclassesquidoiventimplmenterlammemthode,ilestpluspratiquedutiliser les interfaces. Comme les classes, les interfaces permettent de dfinir un ensemble de proprits, mthodes, vnements.Cependant,ellesnecontiennentaucuncode.Limplmentationdoitseffectuerauniveaudelaclasseelle mme.Linterfaceconstitueuncontratquevoussignez.Endclarantquevotreclasseimplmenteuneinterface,vous vous engagez fournir, dans votre classe, tout ce qui est dfini dans linterface. Il convient dtre prudent si vous

ENI Editions - All rigths reserved

- 19 -

utilisez les interfaces et de ne jamais modifier une interface dj utilise sinon vous courez le risque de devoir reprendrelecodedetouteslesclassesquiimplmententcetteinterface. Pourpouvoirutiliseruneinterface,ilconvientdeladfiniraupralable.Ladclarationestsimilaireladclarationdune classemaisenutilisantlesmotsclsInterfaceetEnd Interface. VouspouvezventuellementutiliserlemotclInheritspourintroduireunerelationdhritagedansvotreinterface.Les seules instructions qui doivent apparatre dans une interface sont des dclarations de proprits avec Property, de procdures et fonctions avec Sub et Function, ou dvnements avec Event. Il ne doit y avoir aucun code dans les procduresetfonctionsmmepasdeEnd SubnideEnd Function.Cronsdoncnotrepremireinterface. Public Interface Comparable Function compare(ByVal o1 As Object) As Integer End Interface Cetteinterfacenousobligeracrerdanslesclassesquilimplmenterontunefonctionnouspermettantdecomparer linstancecourantedunobjetetlobjetquiserapasscommeparamtre.Lafonctionretourneraunevaleurgale1si lobjet pass comme paramtre est suprieur linstance courante, une valeur gale zro si les deux objets sont gaux,unevaleurgale1silinstancecouranteestsuprieurelobjetpasscommeparamtre. Maisquelscritresallonsnousutiliserpourdirequunobjetestsuprieurunautre? Dansladescriptiondenotreinterface,cenestpasnotresouci!Nouslaissonslesoinlapersonnequivadfinirune classe utilisant notre linterface de dfinir quels sont les critres de comparaison. Par exemple, dans notre classe Client, nous pourrions implmenter linterface comparable de la manire suivante en choisissant de comparer deux clientssurlenom : Public Class Client Inherits Personne Implements Comparable ... ... Public Function compare(ByVal o1 As Object) As Integer Implements Comparable.compare Select Case nom Case Is < o1.nom Return -1 Case o1.nom Return 0 Case Else Return 1 End Select End Function Deuxmodificationssontvisiblesdanslaclasse :
q

lefaitquelleimplmentelinterfaceComparable. Limplmentation relle de la fonction compare avec lindication de linterface et de la mthode quelle implmente.

Danscettefonction,lacomparaisonseferasurlenomdesclients.Trsbienmaisasertquoi? Ilarrivefrquemmentquelonaitbesoindetrierdeslmentsdansuneapplication.Deuxsolutions :
q

crerunefonctiondetrispcifiquepourchaquetypedlmentquelonveuttrier. Creruneroutinedetrignriqueetfaireensortequeleslmentsquelonutilisesoienttriablesparcette routine.

Lesinterfacesvontnousaidermettreen uvrecettedeuximesolution.Pourpouvoirtrierdeslments,etquelle que soit la mthode utilise pour le tri, nous aurons besoin de comparer deux lments. Pour tre certain que notre routine de tri fonctionnera sans problme, il faut sassurer que les lments quelle devra trier auront la possibilit dtrecomparslesunsauxautres.Nousnepouvonsgarantircelaquesitousnoslmentsimplmententlinterface Comparable.Nousallonsdonclexigerdansladclarationdenotreroutinedetri. Public Sub tri(ByVal tablo As Comparable())

- 20 -

ENI Editions - All rigths reserved

Dfinieainsi,notreprocdureseracapabledetriertoutessortesdetableauxpourvuqueleurslmentsimplmentent linterfaceComparable.Nouspouvonsdonccrirelecodesuivantetutiliserlamthodecomparesansrisque. Public Sub tri(ByVal tablo As Comparable()) Dim i As Integer Dim j As Integer Dim o As Object For i = 0 To UBound(tablo) - 1 For j = i + 1 To UBound(tablo) If (tablo(j).compare(tablo(i))) < 0 Then o = tablo(j) tablo(j) = tablo(i) tablo(i) = o End If Next Next End Sub Puispourtesternotreprocdure,cronsquelquesclients,essayonsdelestrieretpuisdafficherleursnoms. Dim tab(4) As Client tab(0) = New Client("toto2", "prenom2 tab(1) = New Client("toto1", "prenom1 tab(2) = New Client("toto5", "prenom5 tab(3) = New Client("toto3", "prenom3 tab(4) = New Client("toto4", "prenom4 tri(tab) Dim i As Integer For i = 0 To 4 Console.WriteLine(tab(i).nom) Next Nousobtenonslersultatsuivant : Mr Mr Mr Mr Mr toto1 toto2 toto3 toto4 toto5 prenom1 prenom2 prenom3 prenom4 prenom5 n n n n n le le le le le 01/01/0001 01/01/0001 01/01/0001 01/01/0001 01/01/0001 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 code code code code code Client Client Client Client Client : : : : : 1 2 3 4 5

", ", ", ", ",

"secret", "secret", "secret", "secret", "secret",

2) 1) 5) 3) 4)

Nousavonsbienlalistedenosclientstrieparordrealphabtiquesurlenom. EssayonsdutilisernotreprocduredetriavecuntableaudobjetsquinimplmententpaslinterfaceComparable. Dim tab(4) As Voiture tab(0) = New Voiture("Fiat", "500") tab(1) = New Voiture("Peugeot","205") tab(2) = New Voiture("Opel", "Corsa") tab(3) = New Voiture("Renault", "Laguna") tab(4) = New Voiture(Lancia", "Delta") tri(tab) Dim i As Integer For i = 0 To 4 Console.WriteLine(tab(i).nom) Next Pasdeproblmelacompilation,parcontreleschosessecompliquentpendantlexcution.

ENI Editions - All rigths reserved

- 21 -

Cette erreur intervient au moment de lappel de la procdure de tri. Les lments du tableau que nous avons pass comme paramtre nimplmentent pas linterface Comparable et nous ne sommes pas certains quils contiennent une fonction compare. noter que, mme sil existe une fonction compare correcte dans la classe voiture, il faut obligatoirementspcifierquecetteclasseimplmentelinterfaceComparable,pourquenotrecodepuissefonctionner.

5.Lesvnements
Les mthodes nous permettent de communiquer avec les objets qui composent une application mais les objets ont galementlapossibilitdenousfairepartdeleursractionsengnrantdesvnements.Cesvnementsdoivent ensuitetreprisencomptepourragircequivientdesepasserdanslapplication. Lesvnementssonttrslargementutilissdanslaconceptiondelinterfacegraphiqueduneapplicationcarilsnous permettentdavoirdesinformationssurlesactionseffectusparlutilisateurdelapplication.

a.Dclarationetdclenchementdvnements
Voyons, tout dabord, comment gnrer un vnement dans une classe. La premire chose faire est de dclarer lvnement dans la classe. Cette dclaration seffectue de la mme manire que celle des variables internes la classe. On utilise pour cela le mot cl event suivi du nom de lvnement. Nous pouvons galement, lors de la dclaration,spcifierdesparamtresquifournirontdesinformationssupplmentairessurlvnementluimmeousur ltatdelobjet,aumomentolvnementsedclenche.Nouspouvons,parexemplecrerdansnotreclasseClient un vnement qui se dclenchera chaque ajout dune nouvelle commande. Comme information supplmentaire, notrevnementfourniralenombredecommandesaprslajout. Public Event NouvelleCommande(ByVal nbCommandes As integer) Ilnousrestemaintenantdfinirdansquellesconditionsnotrevnementseradclenchetbiensrledclencher cemomentl.PournotreclasseClient,leplusvidentestdegnrernotrevnementaumomentolonexcute la mthode permettant dajouter une commande. Pour cela, nous allons crer la mthode AjoutCommande. Cette mthode reoit comme paramtre le numro de la commande ajouter. La seule action de cette mthode sera dincrmenterlenombredecommandesduclient. Public Sub AjoutCommande(ByVal numero As Integer) nbCommandes = nbCommandes + 1 End Sub Danslamthode AjoutCommande,nousallonsdoncdclencherlvnementaveclinstructionRaiseEventsuiviedunom delvnementdclaraupralabledanslaclasse.Nousdevonsgalementfournirlesventuelsparamtresdclars avecnotrevnement. Public Sub AjoutCommande(ByVal numero As Integer) nbCommandes = nbCommandes + 1 RaiseEvent NouvelleCommande(nbCommandes) End Sub Aprs lexcution de linstruction RaiseEvent, lvnement sera transmis tous les lments qui se seront dclars

- 22 -

ENI Editions - All rigths reserved

intresssparcetvnement.Siplusieurslmentssontintresssparlvnement,ilsrecevrontlesunsaprsles autreslanotificationdelvnement. notertoutefoisquilnestpaspossibledeprdirelordredanslequelleslmentsdenotreapplicationseront prvenus,nideprvenirunnouvellmenttantqueleprcdentnaurapasfinidetraiterlvnement.

b.Grerlesvnements
Regardonsmaintenantcommentrcuprerlesvnementsdansnotreapplication.Deuxsolutionssontpossibles :
q

dclarerunevariableaveclemotclWithEventsetutiliserlaclauseHandles. Ajoutermanuellementungestionnairedvnement.

a deuxime solution est plus souple car elle nous permettra dajouter ou de supprimer dynamiquement des L gestionnairesdvnementpendantlefonctionnementdenotreapplication,maisellencessiteunpeuplusde codequelapremiresolution.

UtilisationdelaclauseHandles Cettesolutionncessiteunedclarationdevariablespcifique.Ladclarationdunevariablepouvantrfrencerune instancedelaclasseClientseffectuedelamaniresuivante. Dim WithEvents unClient As Client Ilconvientmaintenantdedciderquelcodeseraexcutlorsquecetvnementseproduira.Uneprocdureliela rception de cet vnement doit tre cre. Pour cela, lenvironnement de dveloppement nous facilite la tche. En hautdenotrefentredecode,nousavonsdeuxlistesdisponibles. Lapremirenousindiquetouteslessourcesdvnementsdisponiblesetnouspermetdoncdechoisirdoproviendra notrevnement.

Lasecondeindique,pourlasourcedvnementactuellementslectionne,quelssontlesvnementssusceptibles dtredclenchs.

Aprs avoir fait notre choix dans les deux listes, lenvironnement gnre automatiquement le squelette de la procdurequiseraappeleparledclenchementdelvnement. Private Sub unClient_NouvelleCommande(ByVal nbCommandes As Integer) Handles unClient.NouvelleCommande End Sub Cettemthodeestidentiquecellesquelonacritjusquprsent,avecenpluslemotclHandlessuividunomde lvnementquiseratraitparcetteprocdure.Parconvention,lenomdelaprocdureestconstituparlenomde llmentsuiviparlenomdelvnementgrsurcetobjet.Maisceciresteuneconventionpermettantdefaciliterla lectureducode.Laseuleobligationestquelaprocdurerespectelasignaturedfiniedanslvnement. Nouspouvonsgalementajouterplusieursprocduresquiserontappelesparlemmevnement,maisilfautdans cecasreprendrelecodemanuellementetbiensrutiliserdesnomsdiffrentspourlesprocdures.Cettemthode manquedesouplessecarilestimpossibledechoisir,pendantlexcution,quelgestionnairedvnementserautilis.

ENI Editions - All rigths reserved

- 23 -

Il existe galement une autre contrainte lie au fait que les variables dclares WithEvents doivent obligatoirement tredclaresendehorsdetouteprocdureoufonction. Ajoutetsuppressiondegestionnairedvnement Pourviterceslimitations,nousavonslapossibilitdajoutermanuellementdesgestionnairesdvnement.Dansce cas,lavariabledoittredclaresanslemotclWithEvents.OnutiliseensuitelemotclAddHandlerpourassocier unvnementuneprocdurepourlegrer. AddHandler unClient.NouvelleCommande, AddressOf unClient_NouvelleCommande Le premier paramtre de AddHandler est lvnement que lon veut grer puis on lui indique galement, par lintermdiairede AddressOf,lemplacementosetrouvelaprocdurequiseraexcutepourgrercetvnement. Nous pouvons ainsi dcider, au cours du fonctionnement de lapplication, qui grera un vnement particulier. Par exemple,sinousavonsuneapplicationquifonctionneenmodeconsoleouenmodeWindows,nousauronsunmode daffichagediffrent. Dim mode As String = "console" Dim unClient As Client unClient = New Client("Dupond", "paul ", "secret", 12345) If mode = "graphique" Then AddHandler unClient.NouvelleCommande, AddressOf gestion_graph Else AddHandler unClient.NouvelleCommande, AddressOf gestion_texte End If unClient.AjoutCommande(10) Public Sub gestion_graph(ByVal nbcmd As Integer) MsgBox("nombre de commandes " & nbcmd) End Sub Public Sub gestion_texte(ByVal nbcmd As Integer) Console.WriteLine(nombre de commandes " & nbcmd) End Sub De la mme manire, nous pouvons supprimer un gestionnaire dvnement qui est dj rfrenc, en utilisantRemoveHandler. RemoveHandler unClient.NouvelleCommande, AddressOf gestion_graph Cette instruction ne supprime pas la procdure gestion_graph mais coupe simplement la liaison avec lvnement leChef.augmentation_salaire.CetteliaisonpourratrertablieparlasuiteenutilisantnouveauAddHandler. vnementsethritage Dernierpointclaircir : commentvontsecomporterlesvnementslorsquenotreclasseserasousclasse. Les vnements suivent les mmes rgles dhritage que les proprits et mthodes. Un vnement dclar dans une classe sera accessible dans toutes ces sousclasses. Une petite restriction existe quand mme, puisque le dclenchementdelvnement pourra navoirlieuquedanslaclassedanslaquelleilestdclar.Pourcontournerle problme,ilsuffitdedclarerunemthode protecteddanslaclasseetsimplementfairedclencherlvnementpar cettemthode.Nousauronsensuitelapossibilitdedclencherlvnementdansnimportequelleautresousclasse, nonpasenutilisantdirectementleRaiseEvent,maisenutilisantlamthodeprotgequileferapournous. Par exemple, pour pouvoir dclencher lvnement dans une sousclasse de Client nous pourrions crire le code suivant : DanslaclasseClient : Protected Sub declenche_NouvelleCommande(ByVal nb as integer) RaiseEvent NouvelleCommande (nb) End sub DanslasousclassedeClient : Public Sub plusUne() ... declenche_NouvelleCommande(numero) ... End Sub

- 24 -

ENI Editions - All rigths reserved

6.Lesdlgus
Ilpeuttreparfoisutiledepouvoirpassercommeparamtreunefonctionouuneprocdurenonpasuntypesimple ouobjetmaisdirectementuneprocdureoufonction.Parexemple,sinousvoulonschoisirlecritresuivantlequelnous allonsfaireletridenosemploys,nousdevonscrireunefonctiondecomparaisonpourchacundescritres.Lorsde lappeldelaprocduredetri,nousspcifieronsquellemthodeutiliserpoureffectuerlacomparaison.

a.Dclarationetcrationdundlgu
Lapremiretapeconsistedclarerledlgu.Cettedclarationutiliselemotcl Delegatesuividelasignaturede laprocdureoufonction. Public Delegate Function comparaison(ByVal o1 As Object, ByVal o2 As Object) As Integer Ilfautensuitecreruneprocdureoufonctionquirespectelasignaturedudlgu.Dansnotrecas,nousallonscrer deuxfonctionscapablesdecomparerdeuxClients. Nousencreronsunepoureffectuerlacomparaisonsurlecodeetunedeuximepourlacomparaisonsurlenombre de commandes. Ces fonctions peuvent tre crites dans un module ou dans une classe. Dans ce dernier cas, la fonctiondoittredclarepartage,aveclemotcl sharedpourquellesoitaccessiblesansavoircrerdinstance delaclasse. Function compareCode(ByVal c1 As Client, ByVal c2 As Client) As Integer Select Case c1.code Case Is < c2.code Return -1 Case c2.code Return 0 Case Else Return 1 End Select End Function Function compareNbCommandes(ByVal c1 As Client, ByVal c2 As Client) As Integer Select Case c1.nbcommande Case Is < c2.nbcommande Return -1 Case c2.nbcommande Return 0 Case Else Return 1 End Select End Function Ilfautmaintenantmodifiernotrefonctiondetripourquenplusdutableautrier,elleprenne,commeparamtre,la fonctionutilisepourlacomparaisondedeuxlmentsdutableau.Notrefonctiondetridevientdonc : Public Sub tri(ByVal tablo() As Object, ByVal comparateur As comparaison) Dim i As Integer Dim j As Integer Dim o As Object For i = 0 To UBound(tablo) - 1 For j = i + 1 To UBound(tablo) If comparateur.Invoke(tablo(j), tablo(i)) < 0 Then o = tablo(j) tablo(j) = tablo(i) tablo(i) = o End If Next Next End Sub Deuxmodificationsdansnotrecode :

ENI Editions - All rigths reserved

- 25 -

lajoutduparamtrecomparateurcommedlgupournotrefonctiondetri, lutilisationdecedlgupourcomparerdeuxlmentsdutableauenutilisantlamthodeinvoke.

LeslmentsdutableaunesontplusobligsdimplmenterlinterfaceComparablecarunmoyendelescomparerdeux deuxestpasselafonction.

b.Utilisationdesdlgus
Pourutiliserlafonctiondetri,nousdevonsmaintenantluifournirdeuxparamtres : letableautrieretuneinstance dundlguutilispourtrierletableau.Nousdevonsdonccreruneinstancedundlgu. Dim fct As comparaison fct = New comparaison(AddressOf compareCode) Le constructeur attend un paramtre lui permettant de trouver le code de la fonction. Loprator AddressOf extrait ladressemmoiredelafonctionetlapassedoncauconstructeur. Nouspouvonsensuiteappelerlafonctiondetrienluipassantcommedeuximeparamtrelinstancedudlgu. tri(tab, fct)

inoussouhaitonsutiliserunautrecritredetri,nousdevonssimplementcreruneautrefonctionrespectant S lasignaturedudlguetconstruireundlgupartirdecettefonction.

c.Expressionslambda
Une expression lambda est comparable une fonction sans nom effectuant un traitement et retournant une simple valeur.Ellespeuventtreutilisespartoutoundlguestattendu.

- 26 -

ENI Editions - All rigths reserved

Lestypesgnriques
Les types gnriques sont des lments dun programme qui sadaptent, automatiquement, pour raliser la mme fonctionnalit sur diffrents types de donnes. Lorsque vous crez un lment gnrique, vous navezpasbesoinde concevoiruneversiondiffrentepourchaquetypededonneaveclequelvoussouhaitezraliserunefonctionnalit. Pourfaireuneanalogieavecunobjetcourant,nousallonsprendrelexempleduntournevis.Enfonctiondutypedevis utiliser, vous pouvez prendre un tournevis spcifique pour ce type de vis (plat, cruciforme, torx...). Une technique frquemment utilise par un bricoleur averti consiste acqurir un tournevis universel avec de multiples embouts. En fonction du type de vis, il choisit lembout adapt. Le rsultat final est le mme que sil dispose dune multitude de tournevisdiffrents : Ilpeutvisseretdvisser. Lorsque vous utilisez un type gnrique, vous le paramtrez avec un type de donnes. Ceci permet au code de sadapter automatiquement et de raliser la mme action indpendamment du type de donnes. Une alternative pourraittrelutilisationdutypeuniversel Object. Lutilisationdestypesgnriquesprsenteplusieursavantagespar rapportcettesolution :
q

Elleimposelavrificationdestypesdedonnesaumomentdelacompilationetvitelesvrificationsquidoivent treeffectuesmanuellementaveclutilisationdutypeObject. Elle vite les oprations de conversion, du type Object vers un type plus spcifique et inversement, consommatricesderessources. Ellevitelutilisationdelaliaisontardive,incontournableavecletypeObject. LcritureducodeestfaciliteparlenvironnementdedveloppementgrceIntelliSense. Ellefavoriselcrituredalgorithmesindpendantsdestypesdedonnes.

Les types gnriques peuvent cependant imposer certaines restrictions concernant le type de donne utilis. Ils peuvent,parexemple,imposerqueletypeutilisimplmenteuneouplusieursinterfaces,quilsoituntyperfrenceou possdeunconstructeurpardfaut. Ilestimportantdebiencomprendrequelquestermesutilissaveclesgnriques : Letypegnrique Cest la dfinition dune classe, structure, interface ou procdure pour laquelle vous spcifiez au moins un type de donnes,aumomentdesadclaration. Letypeparamtre Cestlemplacementrservpourletypededonnesdansladclarationdutypegnrique. Letypeargument Cest le type de donnes qui remplace le type de paramtre, lors de la construction dun type partir dun type gnrique. Lescontraintes Cesontlesconditionsquevousimposezquilimitentletypeargumentquevouspouvezfournir. Letypeconstruit Cest la classe, interface, structure ou procdure dclare partir dun type gnrique pour lequel vous avez spcifi destypesargument.

1.Lesclassesgnriques
Uneclassequiattenduntypedeparamtreestappeleclassegnrique.Vouspouvezgnreruneclasseconstruite enfournissantlaclassegnriqueuntypeargumentpourchacundecestypesparamtre.

ENI Editions - All rigths reserved

- 1-

a.Dfinitionduneclassegnrique
Vouspouvezdfiniruneclassegnriquequifournitlesmmesfonctionnalitssurdiffrentstypesdedonnes.Pour cela,vousdevezfournirunouplusieurstypesdeparamtredansladfinitiondelaclasse.Prenonslexempledune classe,capabledegrerunelistedlmentsaveclesfonctionnalitssuivantes :
q

Ajouterunlment Supprimerunlment Sedplacersurlepremierlment Sedplacersurledernierlment Sedplacersurllmentsuivant Sedplacersurllmentprcdent Obtenirlenombredlments.

Nousdevonstoutdaborddfinirlaclassecommeuneclasseordinaire. Public Class ListeGenerique End Class Latransformationdecetteclasseenclassegnriqueseffectueenajoutantuntypedeparamtreimmdiatement aprslenomdelaclasse. Public Class ListeGenerique(Of typeDeDonnee) End Class Siplusieurstypesdeparamtressontncessaires,ildoiventtresparspardesvirgulessansrpterlemotclOf. Sivotrecodedoitraliserdautresoprationsquedesaffectations,vousdevezajouterdescontraintessurletypede paramtre.Pourcela,ajouterlemotcl Assuividelacontrainte.Parexemple,sileparamtredoitimplmenterune interfaceparticulire,utilisezlasyntaxesuivante : Public Class ListeGenerique(Of typeDeDonnee As ICloneable) End Class Silnyapasdecontraintedespcifie,lesseulesoprationsautorisesserontcellessupportesparletypeObject. Dans le code de la classe, chaque membre qui doit tre du type du paramtre doit tre dfini avec la syntaxe As typeDeDonnee,dansnotrecas.Voyonsmaintenantlecodecompletdelaclasse. Public Class ListeGenerique(Of typeDeDonnee) tableau pour stocker les lments de la liste Private liste() As typeDeDonnee pointeur de position dans la liste Private position = 0 pointeur pour lajout dun nouvel element Private elementSuivant = 0 nombre dlmments de la liste Private nbElements = 0 dimension de la liste Private taille As Integer indique si la liste est pleine Private complet As Boolean = False constructeur avec un parametre permettant de dimensionner la liste Public Sub New(ByVal taille As Integer) liste = New typeDeDonnee(taille - 1) {} MyClass.taille = taille

- 2-

ENI Editions - All rigths reserved

End Sub Public Sub ajout(ByVal element As typeDeDonnee) on verifie si la liste est complete avant dajouter un element If Not complet Then liste(elementSuivant) = element nbElements = nbElements + 1 complet = (nbElements = taille) si la liste nest pas complete on positionne le pointeur pour lajout de lelement suivant If Not complet Then elementSuivant = elementSuivant + 1 End If Else Beep() End If End Sub Public Sub supprime(ByVal index As Integer) Dim i As Integer on verifie si lindex nest pas superieur au nombre delements si lindex nest pas inferieur 0 If index<+>>= nbElements OrElse index < 0 Then Beep() Exit Sub End If on decale les elements dune position vers le haut For i = index To nbElements - 2 liste(i) = liste(i + 1) Next on positionne le pointeur pour lajout dun nouvel lment elementSuivant = elementSuivant - 1 on met a jour le nombre delements nbElements = nbElements - 1 End Sub Public ReadOnly Property tailleListe() As Integer Get Return nbElements End Get End Property Public Function premier() As typeDeDonnee If nbElements = 0 Then Err.Raise(1000, , "liste vide") End If on deplace le pointeur sur le premier element position = 0 Return liste(0) End Function Public Function dernier() As typeDeDonnee If nbElements = 0 Then Err.Raise(1000, , "liste vide") End If on deplace le pointeur sur le dernier element position = nbElements - 1 Return liste(position) End Function Public Function suivant() As typeDeDonnee If nbElements = 0 Then Err.Raise(1000, , "liste vide") End If on verifie si on nest pas a la fin de la liste If position = nbElements - 1 Then Beep() Err.Raise(1000, , "pas delement suivant") Exit Function End If on deplace le pointeur sur lelement suivant position = position + 1

ENI Editions - All rigths reserved

- 3-

Return liste(position) End Function Public Function precedent() As typeDeDonnee If nbElements = 0 Then Err.Raise(1000, , "liste vide") End If on verifie si on nest pas sur le premier element If position = 0 Then Beep() Err.Raise(1000, , "pas delement precedent") Exit Function End If on se deplace sur lelement precedent position = position - 1 Return liste(position) End Function End Class

b.Utilisationduneclassegnrique
Pourpouvoirutiliseruneclassegnrique,vousdeveztoutdabordgnreruneclasseconstruiteenfournissantun type argument pour chacun de ces types paramtre. Vous pouvez alors instancier la classe construite par un des constructeursdisponibles.Nousallonsutiliserlaclasseconueprcdemmentpourtravailleravecunelistedentiers. Dim liste As New ListeGenerique(Of Integer)(5) Cettedclarationpermetdinstancierunelistedecinqentiers.Lesmthodesdelaclassesontalorsdisponibles. liste.ajout(10) liste.ajout(11) Le compilateur vrifie bien sr que nous utilisons notre classe correctement, notamment en vrifiant les types de donnesquenousluiconfions.

Voicilecodedunepetiteapplicationpermettantdetesterlebonfonctionnementdenotreclassegnrique : Module testGenerique Dim liste As New ListeGenerique(Of Integer)(5) Public Sub main() liste.ajout(10) liste.ajout(11) liste.ajout(12) liste.ajout(13) liste.ajout(14) liste.ajout(15) menu() End Sub Public Sub menu() Dim choix As Char On Error GoTo gestionerreur Console.SetCursorPosition(1, 24) Console.WriteLine("p (premier) < (precedent) >(suivant) d (dernier) f (fin)") While choix <> "f" choix = Console.ReadLine() Console.Clear() Console.SetCursorPosition(1, 1) Select Case choix Case "p"

- 4-

ENI Editions - All rigths reserved

Console.WriteLine("le premier {0}", liste.premier()) Case "<" Console.WriteLine("le precedent {0}", liste.precedent()) Case ">" Console.WriteLine("le suivant {0}", liste.suivant()) Case "d" Console.WriteLine("le dernier {0}", liste.dernier()) End Select Console.SetCursorPosition(1, 24) Console.WriteLine("p (premier) < (precedent) >(suivant) d (dernier) f (fin)") End While Exit Sub gestionerreur: Console.ForegroundColor = ConsoleColor.Red Console.WriteLine(Err.Description) Console.ResetColor() Resume Next End Sub End Module Nouspouvonsgalementvrifierquenotreclassefonctionnesansproblmesinousluidemandonsdetravailleravec deschanesdecaractres. Public Sub main() liste.ajout("premier") liste.ajout("deuxieme") liste.ajout("troisieme") liste.ajout("quatrieme") liste.ajout("cinquieme") menu() End Sub

2.Procduresetfonctionsgnriques
Uneprocdureouunefonctiongnriquesontdesmthodesdfiniesavecaumoinsuntypeparamtre.Cecipermet aucodeappelantdespcifierletypededonnesdontilabesoinchaqueappeldelaprocdureoufonction.Unetelle mthodepeutcependanttreutilisesansindiquerdinformationpourletypeargument.Danscecas,lecompilateur essaie de dterminer le type, en fonction des arguments passs la mthode. Cette solution doit toutefois tre utiliseavecprcaution,carsilecompilateurnepeutpasdterminerletypedesarguments,ilgnreuneerreurde compilation.

a.Crationduneprocdureoufonctiongnrique
Ladclarationduneprocdureoufonctiongnriquedoitconteniraumoinsuntypeparamtre.Cetypeparamtre estdfiniparlutilisationdumotclOfsuividunidentifiant.Cetidentifiantestensuiteutilisdansleresteducode, chaquefoisquevousavezbesoindutiliserletypeparamtre. Nousallonscrerunefonctiongnriquecapablederechercherunlmentparticulierdansuntableaudenimporte queltype.Cettefonctionvautiliseruntypeparamtreindiquantlanaturedeslmentsprsentsdansletableau. Pourpouvoirrechercherunlmentdansletableau,nousdevronslecompareravecceuxprsentsdanstoutesles cases du tableau. Pour sassurer que cette comparaison sera possible, nous ajoutons une contrainte sur le type paramtre : il doit implmenter linterface Icomparable afin de garantir que la mthode CompareTo utilise dans la fonctionsoitdisponiblepourchaquelmentdutableau.Ladclarationdelafonctionprendlaformesuivante : Public function rechercheGenerique(Of typeDonnee As Icomparable) (byval tablo As typeDonne(), elementRecherche As typeDonnee) As Integer Aprsavoirvrifiqueletableaucontientaumoinsunlment,nousdevonscomparerllmentrecherchaveccelui prsentdanschaquecasedutableau.Silyagalit,lafonctionretournelindexollmentattrouv,sinonla fonction retourne 1. Pour effectuer la comparaison, nous utiliserons la fonction CompareTo de chaque lment du tableau. Public Function rechercheGenerique(Of typeDonnee As Icomparable)(ByVal tablo As typeDonnee(), ByVal elementRecherche As typeDonnee) As Integer test si le tableau a plus dune dimension If tablo.Rank() > 1 Then
ENI Editions - All rigths reserved - 5-

Return -1 End If test si le tableau est vide If tablo.Length = 0 Then Return -1 End If For i As Integer = 0 To tablo.GetUpperBound(0) If tablo(i).CompareTo(elementRecherche) = 0 Then Return i End If Next Return -1 End Function

b.Utilisationduneprocdureoufonctiongnrique
Lutilisationduneprocdureoufonctiongnriqueestidentiquecelleduneprocdureoufonctionclassique,hormis lancessitdespcifieruntypeargumentpourleoulestypesparamtre. Lecodesuivantpermetdetesterlebonfonctionnementdenotrefonction. Public Sub main() Dim t() As Integer = {12, 45, 85, 47, 62, 95, 81} Dim resultat As Integer resultat = rechercheGenerique(Of Integer)(t, 47) If resultat = -1 Then Console.WriteLine("valeur non trouve") Else Console.WriteLine("valeur trouve la position {0}", resultat) End If Console.ReadLine() Dim s() As String = {"un", "deux", "trois", "quatre", "cinq"} resultat = rechercheGenerique(Of String)(s, "six") If resultat = -1 Then Console.WriteLine("valeur non trouve") Else Console.WriteLine("valeur trouve la position {0}", resultat) End If Console.ReadLine() End Sub

- 6-

ENI Editions - All rigths reserved

Lescollections
Les applications ont trs frquemment besoin de manipuler de grandes quantits dinformation. De nombreuses structures sont disponibles en Visual Basic pour faciliter la gestion de ces informations. Elles sont regroupes sous le terme collection. Comme dans la vie courante, il y a diffrents types de collection. Il peut y avoir des personnes qui rcuprent toute sorte de choses mais qui nont pas dorganisation particulire pour les ranger, dautres qui sont spcialisesdanslacollectiondecertainstypesdobjets,lesmaniaquesquiprennenttouteslesprcautionspossibles pourpouvoirretrouvercoupsrunobjet... IlexistedansleFramework.NETdesclassescorrespondantchacunedecessituations.

1.Lescollectionsprdfinies
Lesdiffrentesclassespermettantlagestiondecollectionssontrpartiesdansdeuxespacesdenom :
q

System.Collections System.Collections.Generic

Le premier contient les classes normales alors que le deuxime contient les classes gnriques quivalentes permettant la cration de collections fortement types. Ces collections fortement types sont spcialises dans la gestion dun type prcis de donnes. Bien que ces nombreuses classes fournissent des fonctionnalits diffrentes, elles ont quand mme des points communs, ds au fait quelles implmentent les mmes interfaces. Par exemple, toutes ces classes sont capables de fournir un objet enumerator permettant de parcourir lensembledelacollection. CestcetobjetquiestdailleursutilisparlinstructionFor EachdeVisualBasic.

a.Array
La classe Array ne fait pas partie de lespace de nom System.Collections mais elle peut quand mme tre considrecommeunecollectioncarelleimplmentelinterface Ilist.Lestableauxcrspartirdelaclasse Array sont de taille fixe, mme sil est possible dutiliser linstruction redim pour redimensionner un tableau. En fait, linstruction redim nagrandit pas le tableau mais cre un nouveau tableau plus grand ou plus petit et recopie ventuellement les valeurs existantes, si le mot cl Preserve est utilis. Cette classe contient galement une multitude de mthodes partages, permettant lexcution de nombreuses fonctionnalits sur des tableaux. Deux propritssonttrsutilespourlutilisationdelaclasseArray :
q

Lengthquireprsentelenombretotaldlmentsdansletableau. Rankquicontientlenombrededimensionsdutableau.

CetteclasseestrarementutilisepourlacrationduntableaucarlonprfreutiliserlasyntaxeVisualBasicpour cela.

b.ArrayListetList
La classe ArrayList ou sa version gnrique List sont des volutions de la classe Array. Elles apportent de nombreusesamliorationsparrapportcettedernire.
q

La taille dun ArrayList est dynamique et est automatiquement ajuste en fonction des besoins. Le traitement,quipourunArraydevaittreralisparlinstructionRedim,esteffectuautomatiquement. Elle propose des mthodes permettant lajout, linsertion et la suppression de plusieurs lments simultanmentenuneseuleopration.

Parcontre,surcertainspoints,laclasseArrayListestmoinsefficacequunsimpletableau :
q

LesArrayListnontquuneseuledimension. Untableaudedonnesduntypespcifiqueestplusefficacequun ArrayListdontleslmentssontgrs

ENI Editions - All rigths reserved

- 1-

en tant quObject. Lutilisation de la version gnrique (List) permet dobtenir des performances quivalentes. Comme toute classe, un ArrayList doit tre instanci avant de pouvoir tre utilis. Deux constructeurs sont disponibles.Lepremierestleconstructeurpardfautetcreun ArrayListavecunecapacitinitialedezro.Ilsera ensuite dimensionn, automatiquement, lors de lajout dlments. Cette solution nest pas conseille car lagrandissement de lArrayList consomme beaucoup de ressources. Si vous avez une estimation du nombre dlments stocker, il est prfrable dutiliser le deuxime constructeur qui attend comme paramtre la capacit initialedelArrayList.Ceciviteledimensionnementautomatiquelorsdelajout. noter que la taille indique nest pas dfinitive et lArrayList pourra contenir plus dlments prvus initialement. La proprit Capacity permet de connatre le nombre dlments que lArrayList peut contenir. La proprit Count indiquelenombreactueldlmentsdanslArrayList.Lesmthodes Addet AddRangeajoutentdeslmentslafin de la liste. Les mthodes Insert et InsertRange permettent de choisir lemplacement o va seffectuer lajout. La propritItem,quiestlapropritpardfautdeclasse,sutilisepouratteindreunlmentunepositiondonne.La suppression dlments se fait par la mthode RemoveAt ou RemoveRange la premire attend comme paramtre lindexdellmentsupprimer,ladeuximeexigeenpluslenombredlmentssupprimer.Lamthode Clearest plusradicaleetsupprimetousleslments. Lecodesuivantillustrelefonctionnementdecetteclasse : Public Sub main() Dim liste As ArrayList Dim c As Client liste = New ArrayList() Console.WriteLine("capacit initiale de la liste {0}", liste.Capacity) Console.WriteLine("nombre dlments de la liste {0}", liste.Count) Console.WriteLine("ajout dun client") c = New Client("client1", "prenom1", "secret", 1001) liste.Add(c) Console.WriteLine("capacit de la liste {0}", liste.Capacity) Console.WriteLine("nombre dlments de la liste {0}", liste.Count) Console.WriteLine("ajout de quatre clients) c = New Client("client2", "prenom2", "secret", 1002) liste.Add(c) c = New Client("client3", "prenom3", "secret", 1003) liste.Add(c) c = New Client("client4", "prenom4", "secret", 1004) liste.Add(c) c = New Client("client5", "prenom5", "secret", 1005) liste.Add(c) Console.WriteLine("capacit de la liste {0}", liste.Capacity) Console.WriteLine("nombre dlments de la liste {0}", liste.Count) Console.WriteLine("affichage de la liste des clients") For Each c In liste c.affichage() Console.WriteLine() Next Console.WriteLine("effacement des clients 1002, 1003, 1004") liste.RemoveRange(1, 3) Console.WriteLine("capacit de la liste {0}", liste.Capacity) Console.WriteLine("nombre dlments de la liste {0}", liste.Count) Console.WriteLine("affichage de la liste des clients") For Each c In liste c.affichage() Console.WriteLine() Next Console.WriteLine("affichage du deuxime client de la liste") liste(1).affichage() Console.WriteLine() Console.WriteLine("effacement de tous les clients") liste.Clear() Console.WriteLine("capacit de la liste {0}, liste.Capacity) Console.WriteLine("nombre dlments de la liste {0}, liste.Count) Console.ReadLine() End Sub

- 2-

ENI Editions - All rigths reserved

Ilaffichelersultatsuivant : capacit initiale de la liste 0 nombre dlments de la liste 0 ajout dun client capacit de la liste 4 nombre dlments de la liste 1 ajout de quatre clients capacit de la liste 8 nombre dlments de la liste 5 affichage de la liste des clients Mr client1 prenom1 n le 01/01/0001 00:00:00 Mr client2 prenom2 n le 01/01/0001 00:00:00 Mr client3 prenom3 n le 01/01/0001 00:00:00 Mr client4 prenom4 n le 01/01/0001 00:00:00 Effacement des clients 1002, 1003, 1004 capacit de la liste 8 nombre dlments de la liste 2 affichage de la liste des clients Mr client1 prenom1 n le 01/01/0001 00:00:00 Mr client5 prenom5 n le 01/01/0001 00:00:00 affichage du deuxime client de la liste Mr client5 prenom5 n le 01/01/0001 00:00:00 Effacement de tous les clients capacit de la liste 8 nombre dlments de la liste 0

code code code code

Client Client Client Client

: : : :

1001 1002 1003 1004

code Client : 1001 code Client : 1005 code Client : 1005

L acapacitdelalistenediminuepaslorsdelasuppressiondunlment,mmelorsquelalisteestvide.

c.HashtableetDictionary
Une Hashtableousaversiongnrique Dictionaryenregistrelesinformationssousformedecoupleclsvaleur.La Hashtableestconstitueeninternedecompartimentscontenantleslmentsdelacollection.Pourchaquelment delacollection,uncodeestgnrparunefonctiondehachage,basesurlacldechaquelment.Lecodeest ensuite utilis pour identifier le compartiment dans lequel est stock llment. Lors de la recherche dun lment dans la collection, lopration inverse est effectue. Le code de hachage est gnr partir de la cl de llment recherch.Cetteclsertensuite identifierlecompartimentdanslequelsetrouvellmentrecherch.Pourquune Hashtablepuissestockerunobjet,celuicidoittrecapabledefournirsonproprecodedehachage.

d.Queue
Cetypedecollectionestutilislorsquevousavezbesoindunespacedestockagetemporaire.Lorsquunlmentest rcuprpartirdelacollection,ilestenmmetempssupprimerdelacollection. LescollectionsdetypeQueuesontadaptes,sivousavezbesoindaccderauxinformationsdanslemmeordreque celuidanslequelellesonttstockesdanslacollection.CetypedegestionestparfoisappelFirstInFirstOut (FiFo).Lestroisprincipalesoprationsdisponiblessont :
q

Enqueuepourajouterunlmentlafindelaqueue, Dequeuepourobtenirllmentleplusanciendelaqueueetlesupprimer, Peekpourobtenirllmentleplusanciensanslesupprimerdelaqueue.

Lexemplesuivantillustrelutilisationdecestroismthodes. Public Sub main() Dim q As Queue q = New Queue Dim c As Client c = New Client("client1", "prenom1", "secret", 1001) Console.WriteLine("arrive du premier client:{0}", c.nom) q.Enqueue(c)

ENI Editions - All rigths reserved

- 3-

c = New Client("client2", "prenom2", "secret", 1002) Console.WriteLine("arrive du deuxime client:{0}", c.nom) q.Enqueue(c) c = New Client("client3", "prenom3", "secret", 1003) Console.WriteLine("arrive du troisime client:{0}", c.nom) q.Enqueue(c) Console.WriteLine("dpart du premier client:{0}", q.Dequeue.nom) Console.WriteLine("il reste {0} clients", q.Count) Console.WriteLine("dpart du deuxime client:{0}", q.Dequeue.nom) Console.WriteLine("il reste {0} client", q.Count) Console.WriteLine("le troisime client sincruste:{0}", q.Peek.nom) Console.WriteLine("il reste {0} client", q.Count) Console.WriteLine("dpart du troisime client:{0}, q.Dequeue.nom) Console.WriteLine("il reste {0} client", q.Count) Console.ReadLine() End Sub

e.Stack
LescollectionsdecetypeutilisentlemmeprincipequelesQueue : lorsquunlmentestrcuprdelacollection,il en est supprim. La seule distinction par rapport la classe Queue est lordre dans lequel les lments sont rcuprs. Ce type de collection utilise la technique last in - first out (lifo). Lexemple classique de ce type de gestion est la pile dassiettes de votre cuisine. Aprs avoir fait la vaisselle, vous empilez les assiettes sur une tagre. Le lendemain lorsque vous mettez le couvert, la premire assiette disponible est la dernire, range la veille. Lestroisprincipalesoprationsdisponiblessont :
q

Pushpourajouterunlmentausommetdelapile Poppourobtenirllmentausommetdelapileetlesupprimer Peekpourobtenirllmentausommetdelapilesanslesupprimerdelapile.

2.Choisiruntypedecollection
Voiciquelquesconseilspourchoisirletypedecollectionadaptvosbesoins.
q

Vousavezbesoindaccderauxlmentsdelacollectionparunindex : utilisezuneArrayList. Laccsauxlmentsdoitseffectuerdanslordredelajoutdanslacollectionoudanslordreinverse : utilisez uneQueueouuneStack. Vous avez besoin de trier les lments dans un ordre diffrent de celui dans lequel ils sont ajouts la collection : utilisezuneArrayListouuneHashtable. Leslmentsstockerdanslalistesontdescouplescllment : utilisezuneHashtable.

- 4-

ENI Editions - All rigths reserved

Lesobjetsintrinsques
De nombreux objets sont disponibles automatiquement partir de Visual Basic sans que vous ayez en crer une instance. Ces objets sont accessibles par le mot cl My. Ils permettent la manipulation et laccs des informations, frquemmentutilisesaucoursdufonctionnementduneapplication.Ilsfournissent,parexemple,unmoyendaccder auxpropritsdelamachinesurlaquellesexcutelapplication,parlintermdiairedeMy.Computer,ouauxpropritsde lapplicationellemmeparlintermdiairede My.Application.Enfonctiondutypedeprojetsurlequelvoustravaillez,il est possible que certains objets ne soient pas disponibles. Le tableau suivant prsente les objets existants et le contextedanslequelilssontdisponibles. Bibliothque decontrles Windows Oui Oui Oui Oui Oui Oui Oui

Application Windows

Bibliothque declasses

Application Console

Service Windows

My.Application My.Computer My.Forms My.Resources My.Settings My.User My.WebServices

Oui Oui Oui Oui Oui Oui Oui

Oui Oui Non Oui Oui Oui Oui

Oui Oui Non Oui Oui Oui Oui

Oui Oui Non Oui Oui Oui Oui

Enfonctiondutypedeprojetdanslequelilssontutiliss,certainespropritsdecesobjetspeuventtreindisponibles. Parexemple,lapropritMainFormdelobjetApplicationnestutilisablequedanslesprojetsdapplicationWindows.
q

LobjetApplicationfournitdespropritsmthodesetvnementsconcernantlapplicationcourante.Ilpermet, parexemple,larcuprationdinformationssurlaconfigurationlinguistiquedelapplication,lesparamtresdela ligne de commande utiliss pour lancer lapplication ou encore les informations concernant la version de lapplication. Lobjet Computer facilite laccs aux diffrentes ressources, accessibles sur la machine. Il permet par exemple laccsdirectausystmeaudiodelamachine,auclavier,lasourisouencoreaurseau. LobjetFormsmetvotredispositionuneinstancedechacunedesfentresdisponiblesdansleprojet.Laccsse faitparlenomdeclassecorrespondantlafentrequidevientainsiunepropritdelobjetForms. Lobjet Resources permet laccs aux ressources audio, icnes, images et chanes de caractres dfinies au niveauduprojet. LobjetSettingspermetlaccsauxparamtresdelapplicationdfinisparlespropritsduprojet. Lobjet User reprsente lutilisateur de lapplication. Si aucune authentification spcifique nest utilise dans lapplicationalorslobjetUsercorrespondlutilisateuraveclequellasessionWindowsatouverte. Lobjet Webservices fournit une instance de chaque service web rfrenc dans lapplication. Comme pour la propritForms,laccsseffectueparlenomduserviceWeb.

ENI Editions - All rigths reserved

- 1-

Lesdiffrentstypesderreurs
Pourundveloppeur,leserreurssontunedesprincipalessourcesdestress.Enfait,nouspouvonsclasserceserreurs entroiscatgories.Regardonschacunedentreellesetlessolutionsdisponiblespourlestraiter.

1.Leserreursdesyntaxe
Ce type derreur se produit au moment de la compilation, lorsquun mot cl du langage est mal orthographi. Trs frquentes avec les premiers outils de dveloppement o lditeur de code et le compilateur taient deux entits spares, elles deviennent de plus en plus rares avec les environnements tels que Visual Studio. La plupart de ces environnementsproposentuneanalysesyntaxiqueaufuretmesuredelasaisieducode.Decepointdevue,Visual Studioproposedenombreusesfonctionnalitsnouspermettantdliminerceserreurs. Ilsurveille,parexemple,quechaqueinstructionIfestbientermineparunEnd If.

Si une erreur de syntaxe est dtecte, Visual Basic propose les solutions possibles pour corriger cette erreur. Elles sontaffichesencliquantsurlicneassocielerreur.

Dautrepartlesfautesdorthographedanslesnomsdepropritsoudemthodessontfacilementliminesgrce auxfonctionnalitsIntelliSense.IntelliSenseprendenchargelesfonctionnalitssuivantes :
q

Laffichageautomatiquedelalistedesmembresdisponibles :

Laffichagedelalistedesparamtresfournirpourlappelduneprocdureoufonction :

ENI Editions - All rigths reserved

- 1-

i plusieurs surcharges sont disponibles, IntelliSense affiche leur nombre et vous permet de les parcourir en S utilisantlesflcheshautetbasduclavier.

Laffichagedinformationsponctuellessurmembresduneclasse :

Le complment automatique de mots : commencez saisir un dbut de mot puis utilisez la combinaison de touches [Ctrl] [Espace] pour afficher tout ce que vous pouvez utiliser comme mot, cet emplacement, commenant par les caractres dj saisis. Sil ny a quune seule possibilit, le mot est ajout automatiquement,sinonslectionnezledanslalisteetvalidezaveclatouche[Tab]. Laffichagedelalistedesvaleurspossiblespourunepropritdetypenumration.

Avectoutescesfonctionnalits,ilestpratiquementimpossibledegnrerdesfautesdesyntaxedanslecode.

2.Leserreursdexcution
Ceserreursapparaissentaprslacompilation,lorsquevouslancezlexcutiondevotreapplication.Lasyntaxeducode estcorrectemaislenvironnementdevotreapplicationnepermetpaslexcutionduneinstructionutilisedansvotre application. Cest, par exemple, le cas si vous essayez douvrir un fichier qui nexiste pas sur le disque de votre machine.Vousobtiendrezsrementunebotededialoguedecetype.

- 2-

ENI Editions - All rigths reserved

Cetypedebotededialoguenestpastrssympathiquepourlutilisateur! Heureusement, Visual Basic permet la rcupration de ce type derreur et vite ainsi laffichage de cette inquitante botededialogue.Deuxtechniquessontdisponiblespourlagestiondecetypederreurs :
q

lagestionenligne lesexceptions.

Nousdtailleronscelaunpeuplusloindanscechapitre. Leserreursdelogique Lespiresennemisdesdveloppeurs.Toutsecompilesansproblme,toutsexcutesansproblmeetpourtantane marchepas!!! Il convient, dans ce cas, de revoir la logique de fonctionnement de lapplication. Les outils de dbogage nous permettent de suivre le droulement de lapplication, de placer des points darrt, de visualiser le contenu des variables,etc.

ENI Editions - All rigths reserved

- 3-

Traitementdeserreurs
DeuxtechniquessontdisponiblespourletraitementdeserreursdansVisualBasic :
q

lagestionenligne letraitementparexception.

1.Lagestionenligne
LinstructionOn Errorestllmentdebasedelagestiondeserreursenligne.Lorsquecetteinstructionestexcute, dans une procdure ou fonction, elle active la gestion des erreurs pour cette procdure ou fonction. Il convient cependant dindiquer comment notre gestionnaire doit ragir lorsquune instruction dclenche une erreur. Deux solutions : On error resume next Lexcutionducodevasepoursuivreparlalignesuivantcellequiaprovoqulerreur. On error goto etiquette Lexcutionducodevasepoursuivreparlalignerepreparetiquette. Lasyntaxeestdonclasuivante : Private Sub Nom_de_procedure() On Error Goto gestionErreurs ... "Instructions dangereuses ... Exit Sub gestionErreurs: ... code de gestion des erreurs ... End Sub Ltiquetteverslaquellelegestionnairederreursvaredirigerlexcutiondoitsetrouverdanslammeprocdureque linstruction on error goto.Linstruction Exit sub est obligatoire pour que le code de gestion derreurs ne soit pas excutlasuitedesinstructionsnormalesmaisseulementencasderreur. Lecodedugestionnairederreurdoitdterminerlaconduitetenirencasderreur. Troissolutions : Resume Onessaienouveaudexcuterlalignequiaprovoqulerreur. resume next Oncontinuelexcutionparlalignesuivantcellequiaprovoqulerreur. exit subouexit function Onabandonnelexcutiondecetteprocdureoufonction. Typiquement,legestionnairederreursafficheraunebotededialoguedemandantlutilisateurcequilsouhaite. Enfonctiondesarponse,onutiliseraluneoulautredessolutions. Private Sub OuvertureFichier() On Error GoTo gestionErreurs My.Computer.FileSystem.OpenTextFileReader("c:\essai") Exit Sub

ENI Editions - All rigths reserved

- 1-

gestionErreurs: Dim reponse As Integer reponse = MsgBox("impossible de lire le fichier", MsgBoxStyle.AbortRetryIgnore) Select Case reponse Case MsgBoxResult.Retry Resume Case MsgBoxResult.Ignore Resume Next Case MsgBoxResult.Abort Exit Sub End Select End Sub Il nous reste encore un problme rsoudre : notre gestionnaire derreurs ragira quelle que soit lerreur. Pour pouvoirdterminerquelleerreurvientdeseproduiredanslapplication,nousavonsnotredispositionlobjet errqui nousfournitdesinformationssurla dernire erreurapparue.Cetobjetcontient,entreautres,deuxproprits,number etdescription,nouspermettantdobtenirlecodedelerreuretsadescription.Nouspouvonsdoncmodifiernotrecode pourragirdefaondiffrenteenfonctiondelerreur. Private Sub OuvertureFichierBis() On Error GoTo gestionErreurs My.Computer.FileSystem.OpenTextFileReader("a:\essai") Exit Sub gestionErreurs: Dim reponse As Integer Console.WriteLine(Err.Number) Stop If Err.Number = 53 Then reponse = MsgBox("impossible de trouver le fichier, MsgBoxStyle. AbortRetryIgnore) Select Case reponse Case MsgBoxResult.Retry Resume Case MsgBoxResult.Ignore Resume Next Case MsgBoxResult.Abort Exit Sub End Select End If If Err.Number = 57 Then reponse = MsgBox("insrer une disquette dans le lecteur", MsgBoxStyle.OKCancel) Select Case reponse Case MsgBoxResult.OK Resume Case MsgBoxResult.Cancel Exit Sub End Select End If End Sub Ungestionnairederreurspeuttredsactivenutilisantlinstruction on error goto 0.Siuneerreurseproduitaprs cetteinstruction,ellenestpasrcupreetlapplicationsarrte. En fait, lapplication ne sarrte pas immdiatement mais Visual Basic recherche dans les fonctions appelantes si un gestionnairederreurestactifetsilentrouveun,illuiconfielagestiondelerreur. Private Sub procedure1() On Error GoTo gestionErreurs procedure2() Exit Sub gestionErreurs: MsgBox("erreur dexecution") End Sub Private Sub procedure2() Dim x, y As Integer x = 0 y = (1 / x)
- 2 ENI Editions - All rigths reserved

End Sub Dans cet exemple, la procedure2 va excuter une instruction dclenchant une erreur (1 / x). Comme il ny a pas de gestionnairederreursdanscetteprocdure,VisualBasicvarechercherdanslapiledesappelssiungestionnaireest actif.Lepremierrencontrsetrouvedanslaprocedure1,ceseradoncceluiciquisechargeradelagestiondelerreur.

2.Lesexceptions
a.Rcuprationdexceptions
La gestion des exceptions donne la possibilit de protger un bloc de code contre les erreurs dexcution qui pourraientsyproduire.Lecodedangereuxdoittreplacdansunbloc Try End Try.Siuneexceptionestdclenche dans ce bloc de code, Visual Basic regarde les instructionsCatch qui suivent. Sil en existe une capable de traiter lexception, le code correspondant est excut sinon la mme exception est dclenche pour ventuellement tre rcupre par un bloc Try End Try, de plus haut niveau. Une instruction Finallypermet de marquer un groupe dinstructions,excutesavantlasortiedublocTry,quuneerreursesoitproduiteounon. Lasyntaxegnraleestdonclasuivante : Try ... Instructions dangereuses ... catch exception1 ... code excut si une exception de type Exception1 se produit ... catch exception2 ... code excut si une exception de type Exception1 se produit ... Finally ... code excut dans tous les cas avant la sortie du bloc Try ... End Try Cette structure a un fonctionnement trs similaire au select casedjtudi.Chaquetypederreurestassoci une classe dexception et lorsque cette erreur se produit, une instance de la classe exception correspondante est cre.Nouspourronsdoncdterminer,pourchaqueinstructioncatch,queltypedexceptionelledoittraiter. Laclassedebaseestlaclasse Exceptionpartirdelaquelleestcreunemultitudedesousclassesspcialises chacunepouruntypederreurparticulier.VoicilalistedesclassesdrivantdirectementdelaclasseException.
q

Microsoft.Build.BuildEngine.InternalLoggerException Microsoft.Build.BuildEngine.InvalidProjectFileException Microsoft.Build.Framework.LoggerException Microsoft.JScript.CmdLineException Microsoft.JScript.ParserException Microsoft.VisualBasic.ApplicationServices Microsoft.VisualBasic.ApplicationServices.NoStartupFormException Microsoft.VisualBasic.CompilerServices.IncompleteInitialization Microsoft.VisualBasic.CompilerServices.InternalErrorException

ENI Editions - All rigths reserved

- 3-

Microsoft.VisualBasic.FileIO.MalformedLineException Microsoft.WindowsMobile.DirectX.DirectXException System.ApplicationException System.ComponentModel.Design.ExceptionCollection System.Configuration.Provider.ProviderException System.Configuration.SettingsPropertyCannotBeSetForAnonymousUserException System.Configuration.SettingsPropertyIsReadOnlyException System.Configuration.SettingsPropertyNotFoundException System.Configuration.SettingsPropertyWrongTypeException System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectExistsException System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException System.DirectoryServices.Protocols.DirectoryException System.IO.IsolatedStorage.IsolatedStorageException System.Net.Mail.SmtpException System.Runtime.Remoting.MetadataServices.SUDSGeneratorException System.Runtime.Remoting.MetadataServices.SUDSParserException System.SystemException System.Web.Security.MembershipCreateUserException System.Web.Security.MembershipPasswordException System.Web.UI.ViewStateException System.Windows.Forms.AxHost.InvalidActiveXStateException

ette liste ne prsente que le premier niveau de la hirarchie. Chacune de ces classes a elle aussi de C nombreuxdescendants.

Ces diffrentes classes sont utilises pour indiquer dans chaque instruction Catch le type dexception quelle doit grer. Private Sub OuvertureFichier() Try My.Computer.FileSystem.OpenTextFileReader("a:\essai")

- 4-

ENI Editions - All rigths reserved

Catch ex As System.IO.IOException MsgBox("erreur douverture du fichier", MsgBoxStyle.OKOnly) Finally MsgBox("fin de la procdure douverture de fichier") End Try End Sub Si, parmi tous les Catch, aucun ne correspond lexception gnre, lexception est propage dans le code des procdures ou fonctions appelantes, la recherche dune instruction catch capable de prendre en compte cette exception.Siaucunblocnesttrouv,uneerreurdexcutionestdclenche. LesblocsCatchpeuventgalementtreconditionnels,enajoutantlemotWhensuividuneexpressionpouvanttre valuecommeunBoolean. Catch ex As Exception When choix < 0 ... Catch ex As Exception When choix > 10 ... End Try LeblocCatchestalorsexcutsiuneexceptiondecetypeestdclencheetsilaconditionestvrifie. Si le paramtre indiqu linstruction Catch est une classe dexception gnrale, cette instruction Catch sera capable de capturer toutes les exceptions cres partir de cette classe ou de ces sousclasses. Le code suivant nouspermetdoncdecapturertouteslesexceptions. Private Sub OuvertureFichier() Try My.Computer.FileSystem.OpenTextFileReader("a:\essai") Catch ex As Exception MsgBox("erreur douverture du fichier", MsgBoxStyle.OKOnly) Finally MsgBox("fin de la procdure douverture de fichier") End Try End Sub Lesdiffrentesclassesdisposentdespropritssuivantes,nouspermettantdavoirplusdinformationssurlorigine delexception. Message Chanedecaractresassocielexception. Source Nomdelapplicationquiadclenchlexception. StackTrace Listedetouteslesmthodesparlesquelleslapplicationestpasseavantledclenchementdelerreur. TargetSite Nomdelamthodeayantdclenchlexception. InnerException Obtientlexceptionoriginale,sideuxexceptionssontdclenchesencascade.

b.Crationetdclenchementdexceptions
Lesexceptionssontavanttoutdesclasses,ilestdoncpossibledecrernospropresexceptionsenhritantdune des nombreuses classes dexception dj disponibles. Pour respecter les conventions du Framework .Net, il est conseill de conserver le terme Exception dans le nom de la classe. Nous pouvons par exemple crire le code suivant : Public Class CaMarchePasException

ENI Editions - All rigths reserved

- 5-

Inherits Exception Public Sub New() End Sub Public Sub New(ByVal message As String) MyBase.New(message) End Sub Public Sub New(ByVal message As String, ByVal inner As Exception) MyBase.New(message, inner) End Sub End Class Cette classe peut ensuite tre utilise pour le dclenchement dune exception personnalise. Le code suivant dclencheuneexceptionpersonnalisedansunbloccatch. Catch ex As Exception Throw New CaMarchePasException("erreur dans lapplication", ex) End Try

- 6-

ENI Editions - All rigths reserved

Lesoutilsdedbogage
Danslechapitreconsacrlagestiondeserreurs,nousavonsvuqueleserreursdelogiquesontlesplusdifficiles liminer dune application. Heureusement, Visual Studio.NET nous propose de nombreux outils de dbogage la fois performantsetsimplesutiliser.Ilspermettentnotammentdecontrlerledroulementdelexcution de lapplication (enplaantdespointsdarrtetenfaisantexcuterlesinstructionsuneparune),devisualiseretdemodifierlecontenu des variables, de visualiser le contenu de la mmoire un emplacement particulier, de vrifier la liste de toutes les fonctionsutilises,etc.CesdiffrentsoutilssontaccessiblesparlabarredoutilsDboguer.

LemenuDboguerfournitgalementlaccsdenombreuxoutils :

EnfonctiondelaconfigurationdelenvironnementdeVisualStudio,certainsoutilsneserontpeuttrepasdisponibles. Vous pouvez reconfigurer Visual Studio pour intgrer ces outils supplmentaires par le menu Outils Importation et exportation de paramtres. Les diffrentes botes de dialogue vous proposent de sauvegarder votre environnement actuelavantdelemodifier,puisdechoisirunenvironnementtypeimporter.

ENI Editions - All rigths reserved

- 1-

Parmilesconfigurationsdisponibles,cestlaconfigurationParamtresdedveloppementgnrauxquiproposeleplus defonctionnalits. Aprscetteimportation,denombreuxoutilssupplmentairessontajoutsaumenuDboguer :

Pourlesexplicationssuivantesdecechapitre,nousallonsconsidrerquecestcetteconfigurationquiestutilisedans VisualStudio.

1.Contrledelexcution
a.Dmarragedelasolution
UnprojetdansVisualStudiopeuttredanstroistatsdistincts :
q

enconception enexcution enmodearrt(lexcutionatinterrompue).

Lelancementdelexcutionpeutseffectuerparlabarredoutilsouparleraccourciclavier[F5]ou[Ctrl][F5].Si,cest cette dernire solution qui est utilise, lapplication est lance en mode normal et aucun outil de dbogage nest disponible.

Si la solution contient plusieurs projets, lun dentre eux doit tre configur comme projet de dmarrage pour la solution. Ce projet doit galement avoir un objet de dmarrage configur, cest par son excution que va dbuter lapplication.

b.Arrterlasolution

- 2-

ENI Editions - All rigths reserved

Larrt de lapplication peut seffectuer en fermant toutes les fentres pour une application Windows, ds que la dernire fentre est ferme, lapplication sarrte ou par la combinaison de touches [Ctrl] c pour une application console.Labarredoutilsouleraccourciclavier[Ctrl][Alt][Pause]permettentaussidarrterlapplication.

Leraccourci[Shift][F5]permetderelancerlexcutiondelasolution.

c.Interromprelasolution
Linterruptiondelexcutionseffectueaveclacombinaisondetouches[Ctrl][Pause]ouparlabarredoutils :

Linterruption se produit sur linstruction suivant celle en cours dexcution au moment de la demande darrt. La fentredecodedevientnouveauvisibleavecunrepreenfacedelaligneolexcutionsestinterrompue.

Cettemthodenestpastrspratiquecarilfautavoirbeaucoupdechancepourinterromprelexcutionunendroit prcis. Nous verrons un peu plus loin que les points darrts sont une bien meilleure solution pour interrompre lexcutionducode.

d.Poursuivrelexcution
Unefoisenmodearrt,nousavonsdenombreusespossibilitspourcontinuerlexcutiondelapplication. Lapremirepossibilitpermetdereprendrelexcutionnormaledelapplicationenutilisantlammetechniqueque pour le dmarrage du programme (barre doutilsouraccourciclavier [F5]). Cependant une technique plus courante lorsdundbogageestlexcutionenpaspas. Troissolutionssontdisponibles :
q

Paspasdtaill([F8]) Paspasprincipal([Shift][F8]) Paspassortant([Ctrl][Shift][F8])

LePaspasdtailletlePaspasprincipaldiffrentsimplementparleurfaondegrerlesappelsdeprocdures et fonctions. Si nous sommes en mode arrt sur une ligne de code contenant un appel une procdure ou une fonction,lemodePaspasdtaillvapermettrederentrerdanslecodedelafonctionpuisdelancerlexcutionde soncodeligneparligne.LemodePaspasprincipalexcuteralaprocdureoulafonctionenuneseulefoissans quevouspuissiezvoircequisepasselintrieurdelaprocdureoufonction.

ENI Editions - All rigths reserved

- 3-

LePaspassortantpermetlexcutionducodejusqulafinduneprocdureoufonction,sansdcomposerligne parligne,puisrepasseenmodearrtsurlalignesuivantlappeldelafonction.

Unederniresolutionnouspermetfacilementdexcuterunblocdecodepuisdesarrtersurunelignespcifique. Pour cela, un menu contextuel sur la fentre de code nous offre la possibilit de relancer lexcution jusqu lemplacementducurseur,sanssarrtersurtouteslesinstructionsentrelaligneactuelleetlapositionducurseur (trsutilepourexcuterrapidementtouteslesitrationsduneboucle).

- 4-

ENI Editions - All rigths reserved

Inversement,sivoussouhaitezignorerlexcutiondunblocdecodeouaucontrairenouveauexcuterunblocde code, il est possible de dplacer le point dexcution pour dsigner la prochaine instruction excute. Il suffit de dplacerlaflchejauneaffichesurlamargeenfacedelaprochaineinstructionexcuter.

omme nous lindique Microsoft, cette commande doit tre utilise avec prcaution. Il faut notamment se C souvenirdespointssuivants :lesinstructionssituesentrelancienetlenouveaupointdexcutionneseront pas excutes, dplacer le point dexcution en arrire nannule pas les instructions dj traites et le point dexcutionnepeuttredplacqulintrieurdunefonctionouprocdure.

2.PointsdarrtetTracePoint
Nous avons vu que la solution pour passer en mode arrt tait lutilisation des touches [Ctrl] [Alt] [Pause]. Cette solution prsente un gros inconvnient : lexcution sarrte nimporte o. Les points darrt nous fournissent une solutionpluslgantegrcelaquellenouspouvonschoisirlemplacementoauralieulinterruptiondelexcution. Les points darrt peuvent aussi tre conditionnels. Diffrents types de conditions sont pris en charge pour leur activation(condition,nombredepassage...). Les TracePoint sont pratiquement identiques aux points darrt mis part que pour un TracePoint vous pouvez spcifier laction excute lorsque le point est atteint. Ce peut tre le passage en mode arrt de lapplication et/ou laffichage dun message. Les points darrt ou les TracePoint sont affichs, dans lenvironnement Visual Studio, par unesriedicnes.Lesicnesvidesreprsententunlmentdsactiv. reprsenteunpointdarrtnormal,activoudsactiv. reprsenteunpointdarrtavanc(condition,nombredepassageoufiltre).

ENI Editions - All rigths reserved

- 5-

reprsenteunTracePointnormal,activoudsactiv.

reprsenteunTracePointavanc(condition,nombredepassageoufiltre). reprsenteunpointdarrtouunTracePointenerreur.

reprsenteunavertissementsurunpointdarrtouunTracePoint.

a.Placerunpointdarrt
Pourplacerunpointdarrt,denombreusespossibilitssontdisponibles :
q

effectuerunclicsurlamargedelafentredecode, positionnerlecurseursurlalignecorrespondanteetutiliserleraccourciclavier[Ctrl]B, utiliserloptionPointdarrt Insrerunpointdarrtdumenucontextueldelafentredecode.

Toutescestechniquesinsrentlepointdarrtetmatrialisentsonemplacementparunpointrougedanslamargeet lesurlignementenrougedelalignecorrespondante.

Pour toutes ces solutions, le code doit tre visible dans lditeur. Loption Interrompre la fonction du menu Dboguer Nouveau point darrt permet de placer un point darrt sur une procdure ou fonction en saisissant simplementsonnom.

ttention,labotededialoguevousproposedeprcisersurquellelignedelafonctionvoussouhaitezplacer A unpointdarrtmaiscettefonctionnalitnestpasdisponiblepourlespointsdarrtsurdesfonctions.

Lespointsdarrtainsiplacssontinconditionnels.Dsquelexcutionarrivesurcetteligne,lapplicationpasseen modearrt.Onpeutperfectionnerlefonctionnementdespointsdarrtenyajoutantdesconditions,unnombrede passageouenletransformantenTracePoint.Ilconvientpourcelademodifierlespropritsdupointdarrtparle menucontextueldisponibleparunclicdroitsurlaligneconcerneparlepointdarrt.

- 6-

ENI Editions - All rigths reserved

Ajoutdunecondition Le passage en mode arrt peut tre soumis condition. La bote de dialogue suivante permet de prciser les conditionsdexcutiondupointdarrt.

Nous devons saisir, dans cette bote de dialogue, une expression qui sera value chaque passage sur le point darrt.Lexcutionsarrteraalors :
q

silersultatdelvaluationdelaconditionestvraie, si le rsultat de lvaluation de la condition a t modifi depuis le dernier passage sur ce point darrt. noterque,danscecas,aumoinsdeuxpassagessontncessairespourprovoquerlarrtdelapplication(le premierservantsimplementmmoriserlersultatdelexpression).

Modificationdunombredepassages Lespointsdarrtsontgalementcapablesdecompterlenombredefoisoilssontatteintsetdesexcuterpourun nombreparticulierdepassages.

Cettebotededialoguenouspermetdedfinirlenombredepassagessurlepointdarrtpourqueceluiciarrte effectivementlapplication.Quatreoptionssontdisponiblespourlaconditiondarrtsurlenombredepassages.

ENI Editions - All rigths reserved

- 7-

Attention,siuneconditionestindiquepourlepointdarrt,lenombredepassagecorrespondaunombredefoiso lexcution de lapplication est passe sur cette ligne avec la condition vrifie. Avec la configuration de notre exemple, nous nous arrterons dans la boucle au 100000ime passage (la condition sera vraie pour i=0,100,200,300,400,500,600,700,800,900). Filtrage Lesfiltrespermettentdajouterdescritressupplmentairespourlexcutiondunpointdarrt.Cescritresportent surlenomdelamachineosexcutelapplication,ainsiqueleprocessusoulethread.

LaconditiondoittreexprimeaveclesmotsclsMachineName,ProcessId, ProcessName,ThreadId,ThreadName etlesoprateurs&(et),||(ou), !(not). TransformationenTracePoint Un point darrt peut tre transform en TracePoint en prcisant une action particulire excuter lorsquil sera atteint.

- 8-

ENI Editions - All rigths reserved

Cette bote de dialogue attend le libell du message affich dans la fentre de sortie lorsque le point darrt est atteint. Elle autorise galement lexcution dune macro. Pour que le point darrt soit vraiment transform en TracePoint,loptionContinuerlexcutiondoittreactive.

b.Activer,dsactiver,supprimerunpointdarrt
Lespointsdarrtpeuventgalementtremomentanmentdsactivsenutilisantlemenucontextuel.

Le point darrt peut ensuite tre nouveau activ en utilisant nouveau le menu contextuel. Ce mme menu permetaussilasuppressiondunpointdarrt,maisilestplusrapidedeffectuerundoubleclicsurlepointdarrtlui mme.Lemenu DboguerproposegalementloptionSupprimertouslespointsdarrt,vitantdavoirparcourir denombreuseslignesdecodepourliminerlensembledespointsdarrt. Pournousfaciliterlatchelorsdudbogageduneapplication,unefentrenousproposeunrcapitulatifdetousles points darrt placs dans votre projet. Cette fentre est accessible par lintermdiaire du menu Dboguer Fentres Pointsdarrt.Cettefentreproposeunmenucontextuelpermettantderaliserlesprincipalesactions surunpointdarrt.

ENI Editions - All rigths reserved

- 9-

ContrairementdesversionsplusanciennesdeVisualBasic(version6.0),lespointsdarrtsontconservslorsque vousfermezvotreprojet.

3.Examenducontenudevariables
Lintrtdudbogueurestdepouvoirsuivrelefonctionnementdelapplicationaucoursdesonfonctionnement.Ilest galement primordial de pouvoir visualiser, lorsque lapplication est en mode arrt, les valeurs contenues dans les diffrentes variables de lapplication. Cette visualisation nous permet de vrifier le rsultat des traitements dj effectusoudanticipersurlestraitementseffectusdanslasuiteducode.

a.DataTips
LesDataTipsfournissentunmoyenrapidepourvisualiserlecontenudunevariable.Ilsuffitdedplacerlecurseurde lasourisaudessusdunometaprs,uncourtinstant,unefentreprsentantlecontenudelavariablesaffiche.Sila variableestuntypecomplexe,uneinstancedeclasseparexemple,leDataTipsproposeunpetitsigne+permettant de descendredanslastructuredelavariable.Lesinformationsvisualisessontgalementmodifiablesdirectement dansleDataTips.LeDataTipsdisparatautomatiquementlorsquelasourisquittesasurface.

Pourafficherlersultatducalculduneexpression,ilconvientaupralabledeslectionnerlexpressionpuisdeplacer lecurseurdelasourissurlaslection.Ledbogueurvaluelexpressionetaffichelersultat.LeDataTipsnepeut afficherquelesvariablesaccessiblesdanslaportecourante(variablesdclaresdanslafonctionolonestarrt ouvariablesglobales). nepetiteastuce,sivoussouhaitezvisualiserlecodemasquparleDataTipssanslefairedisparatre,vous U pouvezutiliserlatouche[Ctrl]quilerendtransparent.

b.FentreAutomatique
- 10 ENI Editions - All rigths reserved

La fentre Automatique affiche les variables utilises dans linstruction courante dans les trois instructions prcdentesetdanslestroisinstructionssuivantes.CettefentreestaccessibleparlemenuDboguer Fentres Automatique.

Cettefentrepermetgalementlamodificationducontenudunevariableendoublecliquantsurlavaleur,dansla fentre,etenvalidantlamodification,aprssaisieparlatouche[Entre].Lapplicationcontinuerasexcuteravec cettenouvellevaleurpourlavariable.

c.FentreVariableslocales
La fentre Variables locales est accessible par le mme Dboguer Fentres Variables locales et possde un fonctionnement identique la fentre Automatique mis part quelle affiche toutes les variables dans la porte actuelle, cestdire les variables globales et les variables dclares dans la procdure ou fonction en cours dexcution.

ans toutes ces fentres, vous ne pouvez pas contrler la liste des variables qui sont affiches puisque le D dbogueurendterminelaliste,enfonctionducontextedanslequelsetrouvevotreapplication.Ilestparfois plus pratique de configurer manuellement la liste des variables et expressions surveiller pendant le fonctionnementdelapplication.

d.LesfentresEspion
Lafentre Espionpermetlaffichage des variables semblant intressantes pour le dbogage de lapplication.Cette fentre ou plutt ces fentres, puisque quatre fentres Watch sont disponibles, sont affiches par le menu Dboguer Fentres Espionpuis Espion1 Espion4.Nousdevonsensuiteconfigurerlafentreenajoutantles variables et expressions que nous souhaitons visualiser. En effectuant un double clic dans la colonne Nom, vous pouvez saisir ce que vous souhaitez afficher dans la fentre. Vous pouvez galement effectuer un glisserdplacer depuis la fentre de code. Si vous saisissez un nom de variable complexe (une instance de classe par exemple), lensembledesespropritsestaffichdanslafentresousformedarborescence. Lecontenudesvariablesneseraaffichquesilapplicationestenmodearrtsurunelignedecodeocettevariable peuttreutilise.Parexemple,lecontenudesvariableslocalesuneprocdureoufonctionnestaffichquesile codeestarrtdanscetteprocdureoufonction.
ENI Editions - All rigths reserved - 11 -

Dans le cas contraire, la fentre Espion nous indique simplement que cette variable nest pas dclare dans la portiondecodeonousnoustrouvons,enlaffichantencaractresgriss.

Dans cet exemple, les variables sont dclares dans une autre procdure que celle o se trouve le pointeur dexcution. Commepourlesautresfentres,lecontenudelavariablepeuttremodifiendoublecliquantdessuspourpasser enmodeditionetenvalidantlasaisieparlatouche[Entre].

e.LafentreEspionexpress
Lafentre Espionexpress propose le mme principe de fonctionnement et est accessible par le menu Dboguer Espionexpress.Danscecas,lavariableoulexpressionsurlaquellesetrouvelecurseurestaffichedanslafentre Espionexpress.Cettefentretantmodale,vousdevrezobligatoirementlafermeravantdepoursuivreledbogage devotreapplication.

LeboutonAjouterunespionpermetdajouterrapidementlexpressiondanslafentre Espionpourpouvoirltudier danslasuitedudbogage.

4.Lesautresfentresdedbogage
Denombreusesautresfentressontdisponiblespourledbogagemaiscertainesnesontpasvraimentutilespourle dveloppement dapplications avec Visual Basic. Elles sont plutt rserves pour le test dapplications dveloppes avecdautreslangages,C++parexemple. Il sagit, par exemple, de la fentre mmoire permettant la visualisation du contenu dune zone mmoire dont on connatladresse.

- 12 -

ENI Editions - All rigths reserved

Sivousledsirez,vouspouvezvisualiserlecodemachinecorrespondantauxinstructionsVB.NET.

ENI Editions - All rigths reserved

- 13 -

Autrestechniquesdedbogage
Lacompilationconditionnelle Vous pouvez utiliser la compilation conditionnelle pour spcifier des portions de code qui seront ou non compiles, en fonctiondelavaleurduneconstantequevousaurezaupralabledfinie.Parexemple,vouspouveztesterplusieurs solutionspourrsoudreunproblme,enutilisantplusieursalgorithmesetvrifierleplusefficacedentreeux. Leblocdecodedontlacompilationestsoumiseconditiondoittreencadrparlesinstructions#if condition Thenet #endif en fonction de la valeur de la condition, le bloc de code sera ou non compil. Il faut bien sr que la ou les variablesutilisesdanslaconditionsoi(en)tinitialise(s)avantsonapparitiondansuneinstruction#if. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer #Const version = 2 #If version = 1 Then For i = 0 To 1000000 calcul(i) Next #End If #If version = 2 Then Do While i < 100000 calcul(i) i = i + 1 Loop #End If End Sub Les constantes peuvent tre dclares avec linstruction #const, comme dans lexemplecidessus, ou encore dans les propritsduprojet.

ttention cependant, car les constantes dclares avec ces deux mthodes ne sont utilisables que pour la A compilationconditionnelleetnesontpasaccessiblesdanslecode.

ENI Editions - All rigths reserved - 1-

UtilisationdelaclasseDebug La classe Debug dispose de plusieurs mthodes statiques, donc utilisables sans avoir crer dinstance de la classe nouspermettantdinsrerdanslecodedesinstructionsafindesuivreledroulementdelapplication. Avec la mthode assert, vous affirmez que, lorsque cette ligne de code sera excute, la condition spcifie dans la mthodeseravraie. Debug.Assert(y <> 5) Silaconditionestfausse,VisualBasicafficheunebotededialoguersumantlasituation.

Cettebotededialogueproposetroissolutionspourcontinuer : Abandonner Arrtelexcutiondelapplication. Recommencer LapplicationpasseenmodearrtsurlalignecontenantlinstructionAssert,permettantainsidessayerdanalyserla situation. Ignorer Lexcutiondelapplicationcontinuenormalement. La mthode Fail est plus radicale, puisquelle provoque laffichage de la mme bote de dialogue, mais sans aucune condition.EllepeuttreutiliseparexempledansunblocTry End Try. Try z = 1 / x Catch ex As Exception Debug.Fail(division par zro) End Try Les mthodes Write et WriteLine permettent de suivre lvolution dune expression sans que lapplication passe en modearrt.Linstructionaffichera,danslafentredesortie,lersultatdelvaluationdelexpression. LesmthodesIndentetUnindentformatentlaffichagedanslafentreSortie. Debug.WriteLine("dbut de la boucle") Debug.Indent() For x = 1 To 5 Debug.WriteLine("passage n" & x) ... ... Next Debug.Unindent() Debug.WriteLine("fin de la boucle") Lersultatsuivantestobtenudanslafentredesortie :

- 2-

ENI Editions - All rigths reserved

ENI Editions - All rigths reserved

- 3-

Lesdiffrentstypesdapplication
Les applications Windows sont bases sur une ou plusieurs fentres constituant linterface entre lutilisateur et lapplication.Pourdveloppercetypedapplication,nousavonsnotredispositiondansleFramework.NETunensemble de classes permettant la conception de linterface de lapplication. Ces lments sont frquemment regroups sous le termeTechnologieWindowsForms.UneapplicationbasesurlesWindowsFormsutiliseraunouplusieursformulaires pourconstruirelinterfaceutilisateurdelapplication.Surcesformulaires(oufeuilles),nousplaceronsdescontrlesafin de dfinir exactement laspect de linterface de lapplication. Les formulaires seront crs partir de classes du Framework.NETquelonspcialiseraparlajoutdefonctionnalits.Leformulaireainsicrtantluimmeuneclasse,il sera possible de le rutiliser, dans une autre application, en lui ajoutant des fonctionnalits supplmentaires par une relation dhritage. Les Windows Forms peuvent tre crs directement par le code mais lenvironnement de dveloppement Visual Studio propose toute une panoplie doutils graphiques pour nous faciliter la tche. Nous utiliseronsprincipalementcettetechnique.

1.Modesdeprsentationdesfentres
DansuneapplicationWindows,troisstylesdeprsentationsontdisponiblespourlesfentresdelapplication.

a.Interfacemonodocument(SDI)
Uneseulefentreestdisponibledanslapplication.Pourpouvoirouvrirunnouveaudocument,ledocumentactifde lapplicationdoitobligatoirementtreferm.LeblocnotesdeWindowsestuneapplicationSDI.

b.Interfacemultidocuments(MDI)
Lapplicationestconstituedunefentreprincipale(lafentremre)danslaquellevontapparatreplusieursfentres (fentres filles) contenant les documents sur lesquels vous souhaitez travailler. En rgle gnrale, ce type dapplicationdisposedunmenupermettantlarorganisationdesdiffrentesfentresfilles.Cetypedeprsentation estutilisparlaplupartdesapplicationsbureautiques.

c.Interfacedestyleexplorateur
ENI Editions - All rigths reserved - 1-

Cestyledinterfacesedveloppedeplusenplusaudtrimentdesdeuxautres.Danscecas,lafentreestdivise en deux zones. La zone de gauche prsente une vue, sous forme darborescence, des lments pouvant tre manipuls par lapplication. La zone de droite prsente llment slectionn dans larborescence et permet sa modification.Denombreuxoutilsdadministrationutilisentcetteprsentation.

- 2-

ENI Editions - All rigths reserved

LesfentresdansVB.NET
Lorsque vous commencez une nouvelle application Windows Forms, lenvironnement de dveloppement ajoute automatiquement au projet un formulaire. Ce formulaire sert de point de dpart pour lapplication. Vous pouvez immdiatementlancerlexcutiondelasolutionettoutfonctionne.Certes,lapplicationnepermetpasdeffectuergrand chose,maiselleatouteslesfonctionnalitsduneapplicationWindowset,cela,sanscrireuneseulelignedecode.En fait, il existe bien du code correspondant cette application mais il a t gnr automatiquement par Visual Studio. Commececodenedoitjamaistremodifimanuellement,lesfichierslecontenantsontmasqusdanslexplorateurde solutions.Pourlesafficher,vouspouvezutiliserlebouton delabarredoutils de lexplorateurdesolutions.Vous pouvezalorsconstaterquedenombreuxfichiersexistentdjdansleprojet.LesfichiersrservsdeVisualStudioont touslextension.designer.vb.Vouspouvezbiensrvisualiserlecontenudecesfichiers. VoiciparexemplelecontenudufichierApplication.designer.vb. ------------------------------------------------ <auto-generated> This code was generated by a tool. Runtime Version:2.0.50727.1433 Changes to this file may cause incorrect behavior and will be lost if the code is regenerated. </auto-generated> -------------------------------------------------Option Strict On Option Explicit On

Namespace My NOTE: This file is auto-generated; do not modify it directly. To make changes, or if you encounter build errors in this file, go to the Project Designer (go to Project Properties or double-click the My Project node in Solution Explorer), and make changes on the Application tab. Partial Friend Class MyApplication <Global.System.Diagnostics.DebuggerStepThroughAttribute()> Public Sub New() _

MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) Me.IsSingleInstance = false Me.EnableVisualStyles = true Me.SaveMySettingsOnExit = true Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses End Sub <Global.System.Diagnostics.DebuggerStepThroughAttribute()> Protected Overrides Sub OnCreateMainForm() Me.MainForm = Global.WindowsApplication1.Form1 End Sub End Class End Namespace _

Lescommentairesplacsdanscefichiersontsuffisammentclairs : nejamaismodifiercefichier manuellement!Ilestmis jour automatiquement chaque modification des proprits du projet. Le deuxime fichier, mis jour automatiquement, est associ la fentre de lapplication. Dans notre premire application, il est nomm form1.designer.vb.Ilvacontenirladescriptiondetouteslesactions,traduitesencodeVB,quevousallezraliserpour personnaliserlescaractristiquesdelafentre. Regardonslecontenudecefichier : <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class Form1 Inherits System.Windows.Forms.Form Form overrides dispose to clean up the component list.

ENI Editions - All rigths reserved

- 1-

<System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing AndAlso components IsNot Nothing Then components.Dispose() End If Finally MyBase.Dispose(disposing) End Try End Sub Required by the Windows Form Designer Private components As System.ComponentModel.IContainer NOTE: The following procedure is required by the Windows Form Designer It can be modified using the Windows Form Designer. Do not modify it using the code editor. <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() components = New System.ComponentModel.Container() Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.Text = "Form1" End Sub Ilcontientladfinitiondelaclassecorrespondantlafentrehritantdelaclasse System.Windows.Forms.Form.Cette dfinition comporte une petite particularit par rapport la dfinition dune classe telle que nous lavons vue dans le chapitre consacr la programmation objet. Le mot cl Partial est spcifi devant le nom de la classe. Ce mot cl indiqueaucompilateurquelefichiernecontientquunepartiedeladfinitiondelaclasse,lautrepartietantdisponible danslefichierForm1.vb.Cettetechniquepermetderpartirlesrles :
q

Visual Studio se charge de gnrer, dans le fichier form1.designer.vb, le code correspondant la personnalisationdelaspectdelafentre. Vous tes responsable du code, contenu dans le fichier form1.vb, charg de la personnalisation du fonctionnementdelafentre.

Cettesolutionlimitelesrisquesdemodificationinvolontairedelapartiedecoderserve VisualStudio.Llmentle plus important est constitu par la mthode InitializeComponent. Cette mthode est appele automatiquement la crationduneinstancedelafentre,lorsdelappelduconstructeur.Pourvousenconvaincre,vouspouvezajouterun constructeur par dfaut dans le fichier Form1.vb et constater que Visual Studio le transforme automatiquement en y ajoutantunappelcettemthode. Public Class Form1 Public Sub New() This call is required by the Windows Form Designer. InitializeComponent() Add any initialization after the InitializeComponent() call. End Sub Parcontre,sivousajoutezunconstructeursurcharg,voustesresponsabledecetappel.Leplussimpledanscecas tantdefaireappelauconstructeur,pardfaut,lapremirelignedevotreconstructeursurcharg. Public Sub New(ByVal i As Integer) MyClass.New() End Sub

ensezgalementbienrespecter,dansleconstructeurpardfaut,lemplacementquivousestrservpourvos P initialisationsparticulires.SiellessontplacesavantlappellamthodeInitializeComponent,celuicirisquede les modifier. Avant lappel de la mthode InitializeComponent les lments graphiques de la fentre ne sont pas disponiblescarcestlerleprincipaldecettemthodedelescreretdinitialisercertainesdeleursproprits. Une mthode dispose est galement cre pour pouvoir supprimer tous les objets instancis par la classe. Cette mthodecommenceparsupprimerlesobjetscrspuiselleappellelamthodedisposedelaclasseparente. Form overrides dispose to clean up the component list. <System.Diagnostics.DebuggerNonUserCode()> _

- 2-

ENI Editions - All rigths reserved

Protected Overrides Sub Dispose(ByVal disposing As Boolean) If disposing AndAlso components IsNot Nothing Then components.Dispose() End If MyBase.Dispose(disposing) End Sub Nous avons fait le tour du code gnr automatiquement. Regardons maintenant comment modifier lapparence et le comportementdenotrefentreparlintermdiairedecesproprits.

1.Dimensionetpositiondesfentres
Lapositiondelafeuillesurlcran(ousursonconteneur)estmodifieparlaproprit location.Cettepropritest une structure compose de deux membres, indiquant les coordonnes du coin suprieur gauche de la feuille par rapportaucoinsuprieurgauchedelcran.Lesmembresdecettestructurepeuventtremodifisdanslafentrede proprits de vb. En fait, lorsque vous modifiez des proprits, du code est ajout pour prendre en compte vos modifications.Parexemple,sinousvoulonsquenotrefentreapparaisseauxcoordonnes100100,nousmodifionsla propritLocation.

Sinousregardonsdanslecode,nousretrouvonslamodificationdenotreproprit. Me.Location = New System.Drawing.Point(100, 100) Les dimensions de la fentre sont modifiables par la proprit size qui contient deux membres Width et Height indiquantlalargeuretlahauteurdelafentre. Rsumonstoutcelaparunpetitschma :

Lesunitssontdespixels,pourtouteslesproprits,concernantlesdimensionsetpositionsdobjet.Lesproprits Left, Top, Heightet Widthsontdisponiblesdanslecodemaispasdanslafentredeproprits.Lacorrespondance aveclespropritsLocationetSizedecespropritsestindiqueentreparenthsessurleschma. Ces proprits sont mises jour pendant lexcution de lapplication, si la fentre est dplace ou redimensionne. Ellessontaccessiblesparlecodedelapplication. La largeur et la hauteur de la fentre peuvent voluer entre les limites fixes par les proprits MinimumSize et

ENI Editions - All rigths reserved

- 3-

MaximumSize. Par dfaut ces deux proprits sont initialises 0 0 indiquant, dans ce cas, quilny a pas de limite fixepourlatailledelafentre. Deuxautrespropritsindiquentlecomportementdelafentreaudmarragedelapplication. La proprit StartPosition permet dimposer une position la fentre, au dmarrage de lapplication. Les valeurs possiblessontrsumesdansletableausuivant :

Valeurdelaproprit
Manual

Effetsurlafentre
LespropritsLocationetSizesontutilisespour laffichagedelafentre. Lafentreestcentredanslafentremre. Lafentreestcentresurlcran. Lesystmepositionneautomatiquementlesfentres enpartantducoinsuprieurgauchedelcran.Les fentressontdcalesverslebasdroitdelcran chaqueaffichagedunenouvellefentre.Lataillede chaquefentreestspcifieparlapropritSize. Mmeprincipequecidessus,maislatailleest dtermineparlesystmelaffichagedelafentre.

CenterParent CenterScreen

WindowsDefaultLocation

WindowsDefaultBounds

LapropritWindowStateindiqueltatdelafeuille.Lestroisvaleurspossiblessont :

Valeurdelaproprit
Normal Minimized Maximized

tatdelafentre
TailledfinieparlapropritSize. Fentreenicnesurlabarredestches. Fentreenpleincran.

Cespropritspeuvent,biensr,tremodifiesparlecodedelapplication.Parcontre,ilestplusefficacedutiliserles mthodes SetLocation et SetSizequipermettentdirectementledimensionnementetlepositionnementdelafeuille. LutilisationdecesmthodesoulamanipulationdirectedespropritsdclenchentlesvnementsResizeet Movesur lafeuillecorrespondante. Lecodesuivantnouspermetdesuivrelapositionetladimensiondelafeuille : Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.Event Args)Handles MyBase.Resize System.Console.WriteLine(" Ma largeur : " & Me.Size.Width) System.Console.WriteLine(" Ma hauteur : " & Me.Size.Height) End Sub Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move System.Console.WriteLine(" Je suis la position X :" & Me.Location.X ) System.Console.Writeline(" Je suis la position Y :" & Me.Location.Y) End Sub Nousobtenonslesinformationssuivantes : Je Je Ma Ma suis la suis la largeur : hauteur : position X :263 position Y :311 364 122

Unepetitecuriositpourtermineraveclatailleetpositiondesfentres.Sinousrduisonsnotrefentreenicne,en cliquantsurleboutonRduire ouenmodifiantlapropritWindowState,nousobtenonslesvaleurssuivantes : Je suis la position X :-32000 Je suis la position Y :-32000 Ma largeur : 160
- 4 ENI Editions - All rigths reserved

Ma hauteur : 24 LespositionsXetYdelafeuillesontbiendesvaleursngatives!Enfait,vouspouvezutiliserdesvaleurscomprises danslalimitedecellesacceptablespourunentier.Seulelapartiedevotrefentrecompriseentrezroetlalargeuret hauteurdevotrecranseravisible.VouspouvezdailleursutiliserlamthodeGetBoundsdelobjetScreenpourobtenir latailledelcran. Private Sub Form1_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Move System.Console.WriteLine(" System.Console.WriteLine(" System.Console.Write(" sur System.Console.WriteLine(" End Sub Je suis la position X :" & Me.Location.X) Je suis la position Y :" & Me.Location.Y) un cran de :" & Screen.GetBounds(Me).Size.Width) par " & Screen.GetBounds(Me).Size.Height)

Cecodenouspermetdeconnatreladimensiondelcranquiaffichelapplication. Je suis la position X : 115 Je suis la position Y : 203 sur un cran de : 1024 par 768 Pourquelutilisateurpuissedplaceroumodifierlatailledelafentre,ildoitdisposerdesoutilsncessaires :
q

unebarredetitrepourpouvoiragripperlafentreetladplacer unebordurepourpouvoirladimensionner desboutonspourpouvoirlagrandir,larduireetlafficheravecsataillenormale.

Pourpouvoirredimensionnerlafentre,cellecidoitdisposerduneborduredetypesizable affectesaproprit FormBorderStyle. Pourtredplace,unefentredoitavoirunebarredetitre.Cettebarredetitrepeuttremasqueparlaproprit ControlBox positionne sur False dans ce cas, mme le titre de la fentre spcifi par la proprit Textnest plus affich. Dans le cas o la barre de titre est affiche, ltat des diffrents boutons apparaissant dessus peut tre contrlaveclespropritssuivantes : MinimizeBox Affichageounonduboutondemiseenicnedelafentre. MaximizeBox Affichageounonduboutondagrandissementdelafentre. HelpButton Affichageduboutondaide.Visibleseulementsilesdeuxboutonsprcdentsnesontpasvisibles.

2.CouleursetPoliceutilisessurlesfentres
La proprit BackColor indique la couleur de fond utilise sur la fentre. Cette couleur sera galement utilise pour touslescontrlesquiseront,parlasuite,placssurlafeuille.Laproprit ForeColorindiquelacouleurdeslments quiseronttracsdirectementsurlafeuilleoulacouleurdelalgendedescontrlesplacssurcettefeuille.Ilexiste quatrepossibilitspouraffecterunevaleurcespropritsdecouleur :
q

parlafentredeproprits,enchoisissantunecouleurdanslongletPersonnaliser. par la fentre de proprits, en choisissant une couleur web. Ces couleurs correspondent aux couleurs disponiblesenlangageHTML. par la fentre de proprits, en choisissant une couleur systme. Dans ce cas, votre application sadaptera automatiquementlenvironnementdupostedetravailsurlequelelleestinstalle.Silutilisateuraconfigur sonpostepouravoirdesboutonsdecouleurrosefluo,ilretrouveralammeapparencedansvotreapplication.

ENI Editions - All rigths reserved

- 5-

Enfabriquantvousmmevotrecouleuravecunpeuderouge,unpeudevert,unpeudebleu.Pourmlanger tout cela et obtenir la couleur finale, utilisez la mthodeFromARGB qui prend comme paramtre la quantit de rouge,laquantitdevert,laquantitdebleuetfournitlacouleurrsultante.Lesquantitsdechaquecouleur sontdesvaleurscomprisesentre0et255,cettedernirevaleurcorrespondantunecouleurpure.

Laproprit Opacitypermetderglerlatransparencedevotrefeuille.Lavaleurdoittrecompriseentrezro(fentre transparente) et un (fentre opaque). Attention, cette proprit ne sera prise en compte que sur certains systmes (Windows2000,WindowsXP,Windows 2003,Vista).Vouspouvezgalementfairedelatapisserieenindiquantune imagedefondpourvotrefentreaveclaproprit BackgroundImage.Silimagenestpasassezgrandepourcouvrirla fentre,elleestreproduiteenmosaque. Delammemanire,vouspouvezspcifierquunecouleurseraconsidretransparentesurvotrefentre.Pourcela, vousdevezaffecterlapropritTransparencyKeylavaleurdecettecouleur. Pourillustrerlutilisationpeuvidentedecetteproprit,nousavonsindiqudanslafentrecidessousquelacouleur blanchetaittransparente(onaperoitunepartiedelafentredepropritstraverslazonedetexte).

Laproprit Fontpermetdespcifierlescaractristiquesdelapolicedecaractres,utilisepourlaffichagedetexte, directementsurlafentre.Cettepoliceseragalementutilisepourtouslescontrlesquelonplacerasurlafentre. Vous pouvez modifier les proprits directement dans la fentre de proprit, en droulant la proprit Font en cliquantsurlesigneplus(+)enfacedelaproprit.

Vouspouvezgalementmodifierlescaractristiquesdelapoliceaveclabotededialoguestandarddechoixdepolice. Celleciestafficheenutilisantlebouton ,enregarddelapropritFontdanslafentredeproprits.

- 6-

ENI Editions - All rigths reserved

3.LesfentresMDI
LesapplicationsMDIsontconstituesdedeuxtypesdefeuilles :
q

lesfeuillesmres, lesfeuillesfilles.

DansVB.NET,lammeclassedebaseestutilisepourlesdeuxtypesdefentre.Danslepremiercas,onindiquera simplementlefaitquelafentreestunefentremreMDIenpositionnantsurTruesapropritIsMdiContainer.Pour ajouterensuiteunefentrefille,ilconvientbiensrdaborddecrerlafentrepuisdelassocierunefentremre parsapropritMdiParent. VoiciuncodequicretroisfentresetlestransformeenfentresfillesMDI : Dim fenetre1 As Form Dim fenetre2 As Form Dim fenetre3 As Form fenetre1 = New Form() fenetre1.Text = "fenetre 1" fenetre1.MdiParent = Me fenetre1.Show() fenetre2 = New Form() fenetre2.Text = "fenetre 2" fenetre2.MdiParent = Me fenetre2.Show() fenetre3 = New Form() fenetre3.Text = "fenetre 3" fenetre3.MdiParent = Me fenetre3.Show()

ENI Editions - All rigths reserved

- 7-

Pourobtenirdesfentresfillesbienrangesdansleurfentremre,vouspouvezfaireappellamthode LayoutMdi enluipassantcommeparamtrelunedesconstantesprdfiniesdelnumrationMdiLayout : Me.LayoutMdi(MdiLayout.TileHorizontal)

Me.LayoutMdi(MdiLayout.TileVertical)

- 8-

ENI Editions - All rigths reserved

Me.LayoutMdi(MdiLayout.Cascade)

es diffrentes mthodes sont, en gnral, appeles par un menu de lapplication qui fournit la liste des C fentresouvertesdanslapplication.Nousverronscommentmettrecelaen uvredanslasectionconsacreaux menus.

PourillustreruneautremanipulationpossibledesfentresMDI,nousallonslesutiliserpourraliseruneapplicationde styleExplorateur.Voicicidessouslaspectgnraldelapplication.

ENI Editions - All rigths reserved

- 9-

Dans la partie gauche, toujours visible, nous avons sous forme darborescence les documents disponibles dans lapplication. En fonction de la slection faite dans cette arborescence, la zone de droite sadapte pour afficher soit limagesoitletextedunerecette.Nousavonsdoncbesoindetroisfentresdiffrentes :
q

lafentreprincipalequivacontenirlecontrleTreeView,etparlasuitelesfentreschargesdevisualiserles documents, unefentrepourlaffichagedesimages, unefentrepourlaffichagedutexte.

Prparonslafentreprincipale:
s

ModifiezlapropritIsMdiContainersurTruepouractiverlafonctionnalitdefentremreMDI. AjoutezuncontrleTreeView. ModifiezlapropritDockducontrleTreeViewsurLeftpourquilsoitassocilaborduregauchedelafentre. AjoutezleslmentsdanslecontrleTreeViewenvousaidantdelditeurden uds.

Pournotreapplication,laproprit Namedesn udsracinesestutilisepourdterminerletypededocument (txpourfichiertexte,grpourfichiergraphique).Pourlesautresn udsdelarborescence,ellemmoriselenom

- 10 -

ENI Editions - All rigths reserved

dufichierconcern. Lesfentresenfantssonttoutesaussisimplesconfigurer. Pourlafentregraphique:


s

ModifiezlapropritBorderStylesurnone. AjoutezuncontrlePictureBox. ModifiezlapropritdockdececontrlesurFillpourquiloccupetoutelasurfacedisponibledelafentre. Modifiezlaproprit SizeModedececontrlesurStretchImagepourquelimagesadaptelatailleducontrle(donc delafentre).

Pourlafentretexte:
s

ModifiezlapropritBorderStylesurnone. AjoutezuncontrleRichTextBox. ModifiezlapropritdockdececontrlesurFillpourquiloccupetoutelasurfacedisponibledelafentre.

Ilnenousresteplusmaintenantqucrirequelqueslignesdecodepourafficherlabonnefentrelorsduneslection danslecontrleTreeView.Voicicidessouscesquelqueslignesdecode. Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect If Not IsNothing(e.Node.Parent) Then Dim f As Form For Each f In Me.MdiChildren f.Close() Next Select case e.Node.Parent.Name case "gr" Dim fGr As Graphique fGr = New Graphique fGr.MdiParent = Me fGr.Show() fGr.Dock = DockStyle.Fill fGr.PictureBox1.Image = Image.FromFile("../../" & e.Node.Name) case "tx" Dim fTx As Texte fTx = New Texte fTx.MdiParent = Me fTx.Show() fTx.Dock = DockStyle.Fill fTx.RichTextBox1.LoadFile("../../" & e.Node.Name) End Select End If End Sub La totalit du code se trouve dans la procdure vnementielle TreeView1_AfterSelect appele automatiquement aprs la slection par lutilisateur dun lment dans le contrle TreeView. Notre premier travail consiste tester si cest un n ud enfant qui vient dtre slectionn. Si cest le cas, nous fermons toutes les fentres enfants dj prsentes (toutes est un bien grand mot puisque avec ce mcanisme il ne pourra jamais y en avoir plus dune daffichelafois).Ensuite,noustestonsletypededocumentdemandenvrifiantlapropritNamedun udparent de llment slectionn (gr ou tx). En fonction du rsultat, nous crons une instance de la fentre adapte la situation.Noustablissonssonliendeparentaveclafentreprincipale(propritMdiParent).Lafentreestensuite affiche en occupant toute la surface libre de la fentre mre Mdi (proprit Dock=DockStyle.Fill).Ultimetape,nous affichonsledocumentdanslecontrleadapt,RichTextBoxouPictureBox.

ENI Editions - All rigths reserved

- 11 -

Lesvnementsclavieretsouris
La gestion du clavier et de la souris seffectue exclusivement en utilisant les diffrents vnements que ces deux priphriques sont capables de dclencher. La plupart des contrles sont capables de grer ces vnements, il nous fautsimplementconnatrequelmomentilssontdclenchsetquellesinformationsilsfournissent.

1.Lesvnementsclavier
Lespossibilitsdactiondelutilisateursursonclaviersontlimites : ilpeutsimplementfrapperunetoucheduclavier. DansVisualBasic.NET,cetteactionestdcomposeentroisvnementsdistincts : KeyDown Cetvnementseproduitlorsdelenfoncementdelatouche. KeyUp Cetvnementseproduitlorsdurelchementdelatouche. KeyPress Cetvnementseproduitlorsdelenfoncement,uniquementsilatouchecorresponduncaractreASCII. Danslesvnements KeyDownet KeyUp,unargumentdetype KeyEventArgsdonnedesinformationscomplmentaires surlvnement. Lespropritssuivantessontnotammentdisponibles :
q

[Alt]indiqueltatdelatouche[Alt]duclavieraumomentolvnementseproduit. [Ctrl]et[Shift]fournissentdesinformationsidentiquespourlestouches[Ctrl]et[Shift]. KeyCodeindiquelenumrodelatouchesurleclavier.

Lvnement KeyDown est utilis principalement pour travailler avec les touches de fonction. Nous pouvons, par exemple,convertirenmajusculesletexteduncontrle TextBoxsilutilisateurfrappelacombinaisondetouches[Shift] [Ctrl][Alt][F8]. Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown If e.Alt And e.Control And e.Shift And (e.KeyCode = Keys.F8) Then TextBox1.Text = UCase(TextBox1.Text) End If End Sub UneautresolutionestpossibleenutilisantlapropritModifiersquiregroupeltatdestouches[Shift],[Ctrl]et[Alt]. Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows. Forms.KeyEventArgs) Handles TextBox1.KeyDown If e.Modifiers = Keys.Shift + Keys.Control + Keys.Alt And e.KeyCode = Keys.F8 Then TextBox1.Text = UCase(TextBox1.Text) End If End Sub Enfin,ladernirepossibilitconsisteutiliserlapropritKeyDataquiregroupeltatdestouches[Shift],[Ctrl],[Alt]et unetouchedefonction. Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown If e.KeyData = Keys.Shift + Keys.Control + Keys.Alt + Keys.F8 Then

ENI Editions - All rigths reserved

- 1-

TextBox1.Text = UCase(TextBox1.Text) End If End Sub Lvnement KeyPressnousinformesimplement,parlintermdiaireduparamtre e de type KeyPressEventArgs,surle caractrequivientdtresaisi.Nouspouvonsparexempleutilisercetvnementpourvrifierquetouslescaractres saisissontnumriques,sicenestpaslecas,nousmettonsunbeep. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If Not IsNumeric(e.KeyChar) Then Beep() End If End Sub Cette procdure informe simplement lutilisateurquilasaisiuncaractreinvalide,maislecaractreapparattoutde mmedanslazonedetexte.Ilseraitplusjudicieuxdviterquelecaractreatteignelazonedetexte.Laproprit Handled du paramtre permet, en lui affectant la valeur true, dindiquer que lvnement clavier vient dtre gr et quilnedoitpastreprisencompteparlecontrle. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If Not IsNumeric(e.KeyChar) Then Beep() e.Handled = True End If End Sub Si plusieurs contrles TextBox doivent avoir le mme fonctionnement, vous pouvez recopier ce code dans les vnements KeyPress de chacun des contrles. Une solution plus lgante nous permet de centraliser le traitement danslvnement KeyPressdelafentre.Pourcela,ilconvientdindiquerlapropritKeyPreviewdelafentrequelle recevralesvnementsclavieravantlecontrledelafentrequialefocus.Ilfautsimplementtesterlecontrleactif delafeuilleetvrifiersildoitsubirletraitement. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System. Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress If Me.ActiveControl Is TextBox1 Then If Not IsNumeric(e.KeyChar) Then Beep() e.Handled = True End If End If End Sub

2.Lesvnementssouris
Cesvnementssontprincipalementlislutilisationdesboutonsoudelamolettedelasouris.Lvnement click est le plus utilis des vnements souris. Il correspond un appui suivi dun relchement du bouton principal de la souris. Il faut bien parler de bouton principal de la souris car en fonction de la configuration du poste de travail, ce boutonprincipalpeuttreaussileboutondroit(configurationpourgaucher).Lvnement DoubleClicknest pas pris enchargepartouslescontrles,ainsi,parexemple,lescontrlesButtonnesontpascapablesdegrerledoubleclic, ilsgnrentenfaitdeuxvnementsclicklasuite. Desvnementssourispluslmentairessontaussidisponibles :
q

MouseDownlorsquunboutondelasourisestenfonc MouseUplorsquunboutondelasourisestrelch MouseWheellorsquelamoletteestactionne.

Pour ces trois vnements, un paramtre de type MouseEventArgs est fourni. Par lintermdiaire des proprits disponiblesdanscetteclasse,onobtientlesinformationssuivantes :
q

leboutonloriginedelvnementaveclapropritButton

- 2-

ENI Editions - All rigths reserved

lenombredefoisoleboutonestenfoncourelchaveclapropritClicks lenombredecransdedplacementdelarouletteaveclapropritDelta.Cettepropritestunentierpositif oungatif,suivantlesensderotationdelamolette.Chaquedplacementdelamoletteduncranincrmente oudcrmentecettepropritdunevaleurde120 lespropritsxetyindiquentlemplacementsurlecontrleolvnementsourisvientdeseproduire.

Lesdplacementsdelasourisgnrentquatrevnements :
q

MouseEnterlorsquelasourisentreaudessusduncontrle MouseMovelorsquelasourissedplacesurlecontrle MouseLeavelorsquelasourisquittelasurfaceducontrle MouseHoverlorsquelasourisresteaudessusduncontrlependantuneseconde.

Commepourlesvnementslisauxboutonsdelasouris,unparamtredetypeMouse EventArgsnousestfournidans cesvnements. Unpetitexemplepourtestercelaavecuneapplicationdedessintrsrudimentaire.

chaquedplacementdelasouris,unpointesttracsurlafeuilleaveclacouleurindiqueparlestroiszonesdetexte (rouge, vert, bleu). Pour modifier la couleur, il suffit de dplacer la souris audessus de la zone de texte correspondante (le focus se place automatiquement grace lvnement MouseHover) et dactionner la molette de la sourispourincrmenteroudcrmenterlepourcentage. Public Class telecran Dim rouge, vert, bleu As Integer Private Sub telecran_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove Dim g As Graphics Dim crayon As Pen If e.Button = MouseButtons.Left Then g = Graphics.FromHwnd(Me.Handle) crayon = New Pen(Color.FromArgb(rouge * 2.55, vert * 2.55, bleu * 2.55)) g.DrawEllipse(crayon, e.X, e.Y, 1, 1) End If End Sub Private Sub txtRouge_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txtRouge.MouseWheel rouge += e.Delta / 120 If rouge > 100 Then

ENI Editions - All rigths reserved

- 3-

rouge = 100 txtRouge.Text = "100%" ElseIf rouge < 0 Then rouge = 0 txtRouge.Text = "0%" Else txtRouge.Text = rouge & "%" End If End Sub Private Sub txtVert_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txtVert.MouseWheel vert += e.Delta / 120 If vert > 100 Then vert = 100 txtVert.Text = "100%" ElseIf rouge < 0 Then vert = 0 txtVert.Text = "0%" Else txtVert.Text = vert & "%" End If End Sub Private Sub txtBleu_MouseWheel(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txtBleu.MouseWheel bleu += e.Delta / 120 If bleu > 100 Then bleu = 100 TxtBleu.Text = "100%" ElseIf bleu < 0 Then bleu = 0 TxtBleu.Text = "0%" Else TxtBleu.Text = bleu & "%" End If End Sub Private Sub txtRouge_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtRouge.MouseHover txtRouge.Focus() End Sub Private Sub txtVert_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtVert.MouseHover txtVert.Focus() End Sub Private Sub txtBleu_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBleu.MouseHover TxtBleu.Focus() End Sub End Class

3.LeDragandDrop
Le Drag and Drop est une fonctionnalit trs utilise dans les applications Windows. Elle permet le dplacement dinformationsdansuneapplicationouentreapplications,enaccrochantunlmentaucurseurdelasourisetenle lchantensuiteaudessusdesadestination. Onpeutpratiquementaccrochernimportequellmentaucurseurdelasourispourensuiteledplaceroulecopier (texte,image,fichier...).Pourguiderlutilisateursurcespossibilits,lecurseurdelasourisestmodifienfonctiondes contrlesquisontsurvolsparlasouris. UneoprationdeDragandDropsedrouleentroistapes :
q

accrochagedunlmentlasouris dplacementdelasourisversladestination

- 4-

ENI Editions - All rigths reserved

largageaudessusdeladestination.

Lorsdeloprationdelargage,nousavonsdeuxpossibilits :
q

llment accroch la souris est dplac. Dans ce cas, il disparat du contrle de dpart au moment du largageaudessusducontrlededestination. Llment accroch est copi. Dans ce cas, cest une copie qui est largue audessus du contrle de destination.

Regardons en dtail le code ncessaire pour mener bien une opration de Drag and Drop. Nous prendrons un exemplesimpleralisantunecopieentredeuxzonesdetexte( TxtSource,TxtDestination).

a.DmarrageduDragandDrop
Engnral,uneoprationdeDragandDropestdmarrelorsquelasourissedplaceaudessusduncontrleetle slectionnesansrelchementduboutondelasouris.Onconsidre,danscecas,quelutilisateurvientdaccrocherle contrlesasouris. Danslecode,celacetraduitsimplementparlappeldelamthodeDoDragDropducontrlededpart.Lappeldecette mthodencessitedeuxparamtres :
q

Llmentquenousaccrochonsaucurseurdelasouris(unechanedecaractres,uneimagebitmapouune imagemtafile), Lesoprationsautorisespourlobjetaccroch(copie,dplacement...).

Private Sub txtsource_MouseMove(ByVal sender As Object, ByVal e As System. Windows.Forms.MouseEventArgs) Handles txtsource.MouseMove If e.Button = MouseButtons.Left Then txtsource.DoDragDrop(txtsource.Text, DragDropEffects.Move + DragDropEffects.Copy) End If End Sub

b.Configurationdescontrlespourlarception
Il convient avant tout de configurer les contrles de destination pour quils acceptent la rception dun lment en modifiantlapropritAllowDropsurtrue. Ensuite, nous devons grer lvnement DragEnter qui se produit lorsque la souris entre sur la surface du contrle avecunlmentaccroch.Danslagestiondecetvnement,ilfautdterminercequiestaccrochaucurseurdela sourispoursavoirsilecontrlepeutlaccepter.Enfin,ilfautdterminersilutilisateursouhaitefaireundplacement ouunecopiedellmentaccrochaucurseurdelasouris. Poureffectuerceladanslecode,danslvnementDragEnter,nousavonsnotredispositionleparamtre equiest une instance de la classe DragEventArg.Cetteclassenousfournitdenombreusespropritspournousaiderdans nosdcisions : AllowedEffect PermetdesavoirquellessontlesoprationsautorisesparlecontrlelorigineduDragandDrop. Data Contientlesinformationsaccrochesaucurseurdelasouris.Parlintermdiairede cette proprit,onpeutobtenirle typedinformationenappelantlamthodeGetDataPresentouobtenirlesdonnesenappelantlamthodeGetData. Effect Indique laction autorise par le contrle de destination. Cette proprit est utilise pour contrler lapparence du curseurdelasouris.

ENI Editions - All rigths reserved

- 5-

KeyState Indique ltat des touches [Shift], [Ctrl], [Alt] nous permettant de savoir si lutilisateur souhaite effectuer un dplacementouunecopie. X, Y Indiquelescoordonnesdelasourissurlecontrle. Private Sub txtdestination_DragEnter(ByVal sender As Object, ByVal e As System. Windows.Forms.DragEventArgs) Handles txtdestination.DragEnter quest ce quil y a daccroch ? If e.Data.GetDataPresent(DataFormats.Text) Then est ce que la touche Ctrl est enfonce If (e.KeyState And 8) = 8 Then curseur copie e.Effect = DragDropEffects.Copy Else curseur souris dplacement e.Effect = DragDropEffects.Move End If End If End Sub

c.Rcuprationdellmentaccroch
Lorsque lutilisateur relche le bouton de la souris, lvnement DragDrop se produit sur le contrle de destination. Danscetvnement,ilfautrcuprerllmentaccrochetleplacerdanslecontrlededestination.Silsagitdun dplacement, il faut aussi supprimer linformation du contrle source. Problme ! qui est le contrle source ? Nous navonsaucuneinformationsursonidentit.Lasolutionconsistestocker,dansunevariableunerfrenceversle contrleloriginedeloprationdeDragandDropaudbutdelopration. Dim ctrlSource As TextBox Private Sub txtsource_MouseMove(ByVal sender As Object, ByVal e As System. Windows.Forms.MouseEventArgs) Handles txtsource.MouseMove If e.Button = MouseButtons.Left Then ctrlSource = txtsource txtsource.DoDragDrop(txtsource.Text, DragDropEffects.Move + Drag DropEffects.Copy) End If End Sub Private Sub txtdestination_DragDrop(ByVal sender As Object, ByVal e As System. Windows.Forms.DragEventArgs) Handles txtdestination.DragDrop rcupration de linfo est stockage dans le controle de destination txtdestination.Text = e.Data.GetData(DataFormats.Text) vrification si cest une copie ou un dplacement If (e.KeyState And 8) 8 Then effacement du controle source ctrlSource.Clear() End If End Sub

- 6-

ENI Editions - All rigths reserved

Lesbotesdedialogue
Les botes de dialogue sont des fentres qui ont une fonction spciale dans une application. Elles sont, en gnral, utilises pour demander la saisie dinformations lutilisateur. Pour sassurer que ces informations sont bien saisies avantdecontinuerlexcutiondelapplication,lesbotesdedialoguesontsouventaffichesenmodemodal,cestdire quelerestedelapplicationestbloqutantquelabotededialogueestaffiche.Ilarrivefrquemmentquedansune application,onaitbesoindesmmesinformations : unnomdefichierouvrir,unepolicedecaractrechoisir,etc.Pour nousviterdavoirrecrer,chaquefois,unenouvellebotededialogue,nousavonsnotredispositionunesriede botesdedialogueprdfinies.

1.Labotedesaisie
La bote de saisie permet de demander lutilisateur la saisie dune chane de caractres. Cette possibilit est accessibleparlintermdiairedelafonctionInputBox.Cettefonctionattendtroisparamtres :
q

letexteaffichdanslabote(engnrallaquestionposelutilisateur) letitredelabotededialogue unevaleurpardfautaffichedanslazonedesaisie.

Lafonctionrenvoieenretourunechanedecaractrescorrespondantautextesaisiparlutilisateur,siceluicivalidesa saisieparleboutonOKsinonellerenvoieunechanedecaractresvide. Dim resultat As String resultat = InputBox("Veuillez saisir votre nom", "identification", "votre nom")

2.Labotedemessage
Lesbotesdemessagepermettentdepasseruneinformationlutilisateuretluidonnentlapossibilitderpondre parlintermdiairedesboutonsdecommandedelabotedemessage. Labotedemessageestdisponibleparlintermdiairedelamthodeshowdisponibledanslaclasse MessageBox.Cette mthode prend de nombreux paramtres pour configurer la bote de dialogue. Le premier paramtre correspond au messageaffich.Leparamtresuivantspcifieletitredelabotedemessage.Lesparamtressuivantsdoiventtre choisisparmidesconstantesprdfiniespourindiquerrespectivement :
q

lesboutonsdisponiblessurlabotedemessage licneaffichesurlabotedemessage leboutonslectionnpardfautlaffichagedelabotedemessage.

Lesconstantesdisponiblessont :
q

pourlesboutons :

Constante

Signification
ENI Editions - All rigths reserved - 1-

OK OKCancel AbortRetryIgnore YesNoCancel YesNo RetryCancel

BoutonOKseul BoutonsOKetAnnuler BoutonsAbandonner,RessayeretIgnorer BoutonsOui,NonetAnnuler BoutonsOuietNon BoutonsRessayeretAnnuler

pourlesicnes :

Constante
IconInformation

Signification

IconExclamation IconError IconQuestion

pourleboutonpardfaut :

Constante
DefaultButton1 DefaultButton2 DefaultButton3

Signification
Premierbouton Deuximebouton Troisimebouton

Pourobtenirlabotedemessagesuivante,

nousutiliseronslecodesuivant : Dim reponse As Integer MessageBox.Show("Voulez vous enregistrer en quittant lapplication", _ "Fin de programme", MessageBoxButtons.YesNoCancel, _ MessageBoxIcon.Question,MessageBoxDefaultButton.Button1) Commenousposonsunequestionlutilisateur,nousdevonsrcuprersarponsepourdciderdelaconduitetenir dans lapplication. Pour cela, la mthode Show renvoie une valeur indiquant le bouton utilis pour fermer la bote de message.Iciencore,unesriedeconstantesestdfiniepouridentifierchaquecaspossible.

- 2-

ENI Editions - All rigths reserved

Valeurrenvoye Boutonutilis
Ok Cancel Abort Retry Ignore Yes No BoutonOk BoutonAnnuler BoutonAbandonner BoutonRessayer BoutonIgnorer BoutonOui BoutonNon

Nouspouvonsensuitetesterlarponse : Select Case reponse Case DialogResult.Yes ... Case DialogResult.No ... Case DialogResult.Cancel ... End Select

3.LesbotesdedialoguedeWindows
De nombreuses botes de dialogue sont dj dfinies au niveau du systme Windows luimme. Pour pouvoir les utiliserdansnosapplications,nousavonsnotredispositionunesriedeclasses.Regardonscommentlesconfigurer etlesutiliserdansuneapplication.

a.Dialoguedouverturedefichier

Cette bote de dialogue nous permet la slection dun ou de plusieurs noms de fichier avec la possibilit de se dplacerdanslarborescencedelamachine.Laclasseutiliseestlaclasse OpenFileDialog.Nousdevonsdonccrer uneinstancedansnotreapplication.

ENI Editions - All rigths reserved

- 3-

Dim dlgOuvrir As OpenFileDialog dlgOuvrir = New OpenFileDialog() Ilconvientgalementdeconfigurernotrebotededialogue.LapropritInitialDirectoryindiquelerpertoiresur lequel se trouve la bote de dialogue son ouverture. Il est possible de nafficher que certains fichiers dans les rpertoiresquiserontparcourus,ilfautdoncconfigurerparlintermdiairedelapropritFilterlescorrespondances entre la description du contenu et lextension associe. La proprit Filter stocke linformation sous forme dune chane de caractres. La description et lextension sont spares dans la chane par le caractre | ([AltGr] 6). Si plusieurs extensions sont disponibles pour une mme description, elles doivent tre spares par un pointvirgule dans la chane. Vous pouvez galement indiquer si une extension doit tre ajoute aux noms de fichiers saisis manuellement,siceuxcinencomportentpas. La proprit DefaultExt contient lextension ajouter et AddExtension indique si cette extension est ajoute automatiquement.Danslamesureolonpermetlutilisateurdesaisirmanuellementlecheminetlenomdufichier ouvrir,vouspouvezconfierlabotededialoguelesoindevrifierque le nometlechemindaccssontcorrects. Les proprits CheckFileExistet CheckPathExist grent ces vrifications. Vous pouvez galement autoriser les slectionsmultiplesparlintermdiairedelapropritMultiselect. Enfin,pourafficherlabotededialogue,onutiliselamthodeShowDialog : dlgOuvrir.InitialDirectory = "c:\dos" dlgOuvrir.Title = "selection du fichier ouvrir" dlgOuvrir.Filter ="tous|*.*|Images|*.bmp;*.gif;*.jpg|texte|*.txt" dlgOuvrir.DefaultExt = "toto" dlgOuvrir.AddExtension = True dlgOuvrir.CheckFileExists = False dlgOuvrir.Multiselect = True dlgOuvrir.ShowDialog() Les noms du fichier ou des fichiers slectionns sont disponibles dans la proprit FileNames pour une slection unique ou dans la proprit FileNames pour les slections multiples. Cette proprit FileNames est un tableau de chanesdecaractresavec,danschaquecasedutableau,lenomcompletdundesfichiersslectionns. Dim nomFichier As String For Each nomFichier In dlgOuvrir.FileNames System.Console.WriteLine(nomFichier) Next

b.Dialoguedenregistrementdefichier
Labotededialoguedenregistrementdefichierestsimilairelaprcdente,mis part la propritMultiselectqui disparat et les proprits CreatePrompt et OverwritePrompt permettant dafficher un message davertissement, si le nomdufichiersaisinexistepasouaucontrairesilexistedj.

c.Dialoguedechoixderpertoire

Cettebotededialogueestutilisepourlaslectionoulacrationdunrpertoire.Elleestcrepartirdelaclasse

- 4-

ENI Editions - All rigths reserved

FolderBrowserDialog.Cettedernirecomportetrspeudeproprits.Laplusutiliseestcertainementlaproprit SelectedPathpermettantlarcuprationduchemindaccsaurpertoireslectionn.Lerpertoireracinedelabote de dialogue est indiqu par la proprit RootFolder. Cette proprit reoit une des valeurs de lnumration Environment.SpecialFolderreprsentantlesprincipauxrpertoirescaractristiquesdusystmecomme,parexemple, le rpertoire Mes documents. Si cette proprit est utilise la slection ne pourra se faire que dans un sous rpertoiredurpertoireracine.Lajoutdunboutonpermettantlacrationdunnouveaurpertoirepeuttreautoris enmodifiantlapropritShowNewFolderButton.Laffichagedelabotededialoguesefaitdemanireclassiqueparla mthodeShowDialog : dlgChoixRep.RootFolder = Environment.SpecialFolder.MyDocuments dlgChoixRep.ShowDialog() MsgBox(dlgChoixRep.SelectedPath, , "Rpertoire slectionn") Ilfautgalementnoterquelechemindaccsretournparcettebotededialogueestuncheminabsolucommedans lexemplecidessous :

d.Dialoguedechoixdunecouleur
La bote de dialogue de choix de couleur cre partir de la classe ColorDialog peut avoir deux configurations diffrentes. Uneversionsimpleoseuleslescouleursdebasesontdisponibles.

Uneversioncompltedanslaquellelutilisateurpourracrerdescouleurspersonnalises.

ENI Editions - All rigths reserved

- 5-

La proprit Color permet dinitialiser la bote de dialogue avant son affichage et ensuite de rcuprer la couleur choisieparlutilisateur.Vouspouvezinterdirelutilisationdescouleurspersonnalisesouaucontraireafficherlabote de dialogue complte ds son ouverture. Pour interdire laffichage des couleurs personnalises, on modifie la propritAllowFullOpen.Pourforcerlaffichagecomplet,onutiliselapropritFullOpen. Laffichage de la bote de dialogue seffectue toujours par la mthode ShowDialog. Pour conserver une qualit daffichagecorrecte,vouspouvezgalementnautoriserquelutilisationdecouleurspures(lescouleursobtenuespar juxtapositiondediffrentspixelsserontliminesdeschoixpossibles).Cetteoptionestutilisersivousavezune cartegraphiqueconfigureen256couleurs. Cetexemplemodifielacouleurdefonddenotrefeuille. Dim dlgColor As ColorDialog dlgColor = New ColorDialog() dlgColor.FullOpen = True dlgColor.SolidColorOnly = True dlgColor.Color = Me.BackColor dlgColor.ShowDialog() Me.BackColor = dlgColor.Color

e.Dialoguedechoixdunepolice

- 6-

ENI Editions - All rigths reserved

Laclassedebaseutilisepourlaslectiondunepoliceestlaclasse FontDialog.LapropritFontpermetdedfinir la police de caractres utilise pour initialiser la bote de dialogue ou, aprs fermeture, de rcuprer la police slectionne.Vouspouvezgalementafficherunebotededialoguesimplifiesanslechoixdecouleuroudeseffets. Pourcela,lesproprits ShowColoretShowEffectscontrlentlaffichagedecesparamtresdanslabotededialogue. Afin de garantir que les paramtres slectionns correspondent bien une police existant sur la machine, vous pouvez utiliser la proprit FontMustExist. Cette proprit obligera la bote de dialogue vrifier lexistence dune policecorrespondantesurlesystmeavantdesefermer.Certainespolicesproposentplusieursjeuxdecaractres. Vous pouvez autoriser les utilisateurs choisir lun de ces jeux de caractres en modifiant la proprit AllowScriptChange. La taille de la police slectionne peut galement tre limite par les proprits MaxSize et MinSize. Pourvousrendrecomptedeleffetdelapoliceslectionne,unaperusurquelquescaractresestdisponible.Sicet aperu nest pas suffisant, vous avez la possibilit dafficherun bouton Appliquer sur votre bote de dialogue par lintermdiairedelapropritShowApply.CeboutondclencheunvnementApplysurlabotededialogue.Dansla gestiondecetvnement,vouspouvezutiliserlaproprit Fontdelabotededialoguepourvisualiserleffetdela police actuellement slectionne sur votre texte. La variable faisant rfrence la bote de dialogue doit tre dclareaveclemotcl WithEventsdoncendehorsduneprocdure.Unpetitexemplepourvisualiserlutilisationde cesproprits :

Public Class TestPolice Inherits System.Windows.Forms.Form Dim WithEvents dlgFont As FontDialog Private Sub cmdPolice_click(ByVal sender As System.Object, _ ByVal e As System.EventArgs)Handles cmdPolice.Click dlgFont = New FontDialog() dlgFont.ShowApply = True dlgFont.ShowColor = True

ENI Editions - All rigths reserved

- 7-

dlgFont.ShowEffects = True dlgFont.MaxSize = 20 dlgFont.MinSize = 12 dlgFont.FontMustExist = True dlgFont.AllowScriptChange = True dlgFont.ShowDialog() txtEchantillon.Font = dlgFont.Font End Sub Private Sub dlgFont_Apply(ByVal sender As Object, ByVal e As System.EventArgs) Handles dlgFont.Apply txtEchantillon.Font = dlgFont.Font End Sub End Class

f.Dialoguedemiseenpage
Parlintermdiairedecettebotededialogue,vousallezpouvoirconfigurerlesparamtresdemiseenpagedevotre document(marges,orientation...).

Cettebotededialogueestcrepartirdelaclasse PageSetupDialog.Pourtravailler,cetteclasseabesoindedeux classes auxiliaires : la classePageSettings sert stocker la configuration de la mise en page, la classe PrinterSettingsstockelaconfigurationdelimprimanteslectionne.Ilfautcreruneinstancedecesdeuxclasses etlesassocierauxproprits PageSettingset PrinterSettingsdelabotededialogue.Vousserezobligdimporter lespacedenomsSystem.Drawing.Printingpourpouvoirutilisercesdeuxclasses. Lutilisation des diffrentes rubriques de la bote de dialogue peut tre interdite par la modification des proprits suivantes :
q

AllowMarginspourlamodificationdesmarges AllowOrientationpourlamodificationdelorientation AllowPaperpourlechoixdupapier AllowPrinterpourlechoixdelimprimante.

LeschoixdelutilisateurserontensuitercuprslaidedespropritsPageSettingsetPrinterSettingsdelabote

- 8-

ENI Editions - All rigths reserved

dedialogue. Voiciunexempledutilisation : Imports System.Drawing.Printing Public Class Form2 Inherits System.Windows.Forms.Form Private Sub TestPgSetup_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles testPgSetup.Click Dim configPg As PageSettings Dim configPrt As PrinterSettings configPg = New PageSettings() configPrt = New PrinterSettings() dlgPgSetup.PageSettings() = configPg dlgPgSetup.AllowPrinter = True dlgPgSetup.PrinterSettings = configPrt dlgPgSetup.ShowDialog() MessageBox.Show("vous avez choisi dimprimer avec limprimante " _ & dlgPgSetup.PrinterSettings.PrinterName _ & " sur du papier " _ & dlgPgSetup.PageSettings.PaperSize.PaperName _ & " en format " _ &(IIf(dlgPgSetup.PageSettings.Landscape, "paysage", "portrait"))) End Sub End Class

g.Dialoguedeconfigurationdimpression
Aveccettebotededialogue,vouspouvezconfigurerlesparamtresdimpressiondevotredocument.Elleseracre partirdelaclasse PrintDialog.

Commepourlabotededialoguedemiseenpage,labotededialoguedeconfigurationdimpressionabesoindune instancedelaclassePrinterSettingspourstockerlesinformationsdeconfigurationdelimprimante. Lesdiffrentesrubriquespeuventtreinterditesdutilisation,parlamodificationdespropritssuivantes :


q

AllowSelectionautoriselutilisationduboutonSlection.Engnralceboutonestaccessibleuniquementsil yaquelquechosedeslectionndansledocumentquevousvoulezimprimer. AllowSomePages autorise la slection dune page de dbut et dune page de fin pour limpression du document.Ceboutondoittredisponiblesiledocumentcontientplusieurspages. AllowPrintToFileindiquesilacasecocher Impressiondansunfichierestdisponible.Cettefonctionnalit

ENI Editions - All rigths reserved

- 9-

permet par exemple la rcupration dun fichier au format PostScript pour limporter dans une autre application. Le rsultat des diffrentes options slectionnes est disponible aprs fermeture de la bote de dialogue, par lintermdiairedelapropritPrinterSettings. Voiciunnouvelexemplepourcettebotededialogue. Dim configPrt As PrinterSettings Dim dlgprinter As PrintDialog configPrt = New PrinterSettings() dlgprinter = New PrintDialog() dlgprinter.PrinterSettings = configPrt dlgprinter.AllowSomePages = True dlgprinter.AllowSelection = True dlgprinter.ShowDialog() Select Case dlgprinter.PrinterSettings.PrintRange Case PrintRange.AllPages MessageBox.Show("vous avez demand limpression de tout Case PrintRange.SomePages MessageBox.Show("vous avez demand l impression de & dlgprinter.PrinterSettings.FromPage & & dlgprinter.PrinterSettings.ToPage) Case PrintRange.Selection MessageBox.Show("vous avez demand limpression de End Select

le document") la page " _ " la page " _

la slection")

4.Botededialoguepersonnalise
Aprs ce bref aperu des botes de dialogue prdfinies, nous allons voir comment crer nos propres botes de dialogue.Labasedecrationdunebotededialogueestunefentreclassiquepourlaquelleonmodifielesproprits suivantes :
q

Lestyledelabordure,pouravoirunefentrenonredimensionnable. Laproprit ShowInTaskBarquiestpositionne Falsepourquelafentrenapparaissepassurlabarredes tches. Ilfautgalementprvoirunboutondevalidationetunboutondannulationpourlafermeturedelabotede dialogue.

Vouspouvezcrerunebotededialogueenmodifiantmanuellementcespropritssurunefentrenormale,ouchoisir aumomentdelajoutdunlmentauprojetloptionDialog.

- 10 -

ENI Editions - All rigths reserved

Laffichage de la bote de dialogue se fera par lappel de la mthode ShowDialog au lieu de la mthode Show car la mthode ShowDialog affiche la fentre en mode modal (notre bote de dialogue sera la seule partie utilisable de lapplicationtantquelleseraouverte). lafermeturedelabote,ilfautpouvoirdterminerquelboutonaprovoqulafermeturedelabotededialogue.Cest en fait la mthode Showdialog qui va nous fournir la solution. Elle nous retourne une des valeurs de lnumration System.Windows.Forms.DialogResult.Lavaleurretournenestbiensurpaspriseauhasard.Voustesdoncobligs, au moment de la conception de la bote de dialogue, de fournir la valeur retourner pour chacun des boutons provoquant la fermeture de la bote de dialogue. Vous pouvez le faire en modifiant la proprit DialogResult de la bote de dialogue dans lvnement Click de chacun des boutons ou en modifiant la proprit DialogResult des boutons concerns par la fermeture de la bote de dialogue. noter que dans ce cas il ny a pas besoin de grer lvnement Click sur le bouton pour provoquer la fermeture de la bote de dialogue. Si les deux solutions sont utilises simultanment, la proprit DialogResult de la bote de dialogue sera prioritaire pour dterminer la valeur renvoyeparlamthodeShowDialog. Maintenant que nous savons comment configurer et afficher une bote de dialogue, le plus dur reste faire : crer linterfacevisuelledelabotededialogue.

ENI Editions - All rigths reserved

- 11 -

Utilisationdescontrles
Lescontrlesvontnouspermettredecrerlinterface entre lapplicationetsonutilisateur.Cestparleurintermdiaire quelutilisateurpourraagirsurlefonctionnementdelapplicationensaisissantdutexte,enchoisissantdesoptions,en lanantlexcutiondunepartiespcifiquedenotreapplication,etc. Les contrles seront disponibles, en VB.NET, par lintermdiairedunesriedeclassesquidevronttreinstanciesau coursdelexcutiondelapplication. Cesdiffrentesclassessontissuesdunehirarchiequicommenceparlaclassedebase Control.Cetteclasseassure les fonctions lmentaires des contrles (positions, dimensions...) puis une classe drive ajoute des fonctionnalits supplmentairesetainsidesuitejusqulaclassefinaledelahirarchie.

1.Ajoutdecontrles
Les contrles peuvent tre ajouts sur une fentre de deux manires diffrentes. La plus simple, et la plus rapide galement,passeparlutilisationdelaboteoutils.Iciencoreilexistetroispossibilitspourlajoutdescontrles.
q

Effectuezundoubleclicsurlecontrledanslaboteoutils.Cettemthodepermetdenplacerunexemplaire, avecunetaillepardfautaucentredelafentre. Effectuezunglisserdplacerentrelaboteoutilsetlafentre.Dsquevoussurvolezlafeuille,lecurseurde lasourisvousindique,parlaprsencedunpetitsigneplus(+),quevousallezajouterquelquechosesurvotre feuille. La position laquelle vous lcherez le bouton de votre souris correspondra la position du coin suprieurgauchedevotrecontrle.Ilseradimensionnaveclesvaleurspardfaut. Slectionnezlecontrledanslaboteoutilspuiscliquersurlafentrelendroitovousvoulezplacerlecoin suprieurgauchedevotrecontrle,puissansrelcherleboutondelasouris,agrandissezlerectanglejusqu latailledsirepourvotrecontrle.

Si vous souhaitez placer plusieurs exemplaires du mme contrle sur votre fentre, il est possible de bloquer la slectiondanslaboteoutilsenutilisantlatouche[Ctrl]lorsquevousslectionnezlecontrledanslaboteoutils. Vouspourrezalorsplacerplusieursexemplairesdummecontrlesansavoirlereslectionnerdanslaboteoutils enconservantlatouche[Ctrl]enfonce. Certains contrles nontpasdinterface visible au moment de la conception de la fentre. Pour viter dencombrerla surfacedelafentre,ilssontplacsdansunezonesitue en basdelafentredeconceptiongraphique cestlecas par exemple des contrles ImageList et Timer que nous verrons un peu plus loin dans ce chapitre. Il est possible dajouter des contrles la bote outils. Ces contrles peuvent tre des contrles .net ou des contrles ActiveX. Lutilisation de contrles ActiveX va entraner quelques inconvnients pour votre application. Le code de votre applicationseramoinsefficace(desoprationssupplmentairesserontncessairespouraccderaucontrleActiveX). Le dploiement de votre application ncessitera des modifications dans la base de registre des machines pour lenregistrementdescontrlesActiveX. LescontrlesajoutssontnommsautomatiquementparVisualStudioaufuretmesuredelajout.Parcontre,les nomsutilisspardfautnesontpastrsexplicites. Lecodesuivantnedoitpasvousparatretrslimpide. Button1.Enabled = False TextBox1.Clear() CheckBox1.Checked = True RadioButton1.Checked = False RadioButton2.Checked = True Ilestdoncprimordial,pourlalisibilitducode,derenommerlescontrlesdeprfrencedslacrationou,auplus tard,avantdelesutiliserdanslecode.Ilsuffitsimplementdechangerlapropritnamedechacundentreeuxlaide de la fentre de proprits. Il ny a pas de rgle absolue respecter pour les noms des contrles. Une solution frquemment utilise consiste associer un prfixe reprsentatif du type du contrle un nom explicite pour lapplication.Lesprfixesnesontpasnormalissmaislesrglessuivantessubsistentdepuislespremiresversionsde VisualBasic.

Prfixe
cbo lst

Contrle
ComboBox Listbox
ENI Editions - All rigths reserved - 1-

chk opt cmd txt lbl

CheckBox RadioButton Button TextBox Label

Aveclerespectdecesconventionsetunpeudebonsens,lecodeestnettementplusclair : cmdValidation.Enabled = False txtNom.Clear() chkItalique.Checked = True optBleu.Checked = False optVert.Checked = True

2.Positionetdimensiondescontrles
Aprs avoir plac les contrles sur la fentre, il est bien sr possible de les repositionner ou de les redimensionner. Lorsquevousdplacezlasourisaudessusduncontrle,lecurseurchangedapparencepourindiquerlapossibilitde dplacerlecontrle.

Ilsuffitdecliquersurlecontrlepuisdedplacerlasouris.Unrectanglenoirsuitalorsvotrecurseurdesouris,pour reprsenter la future position de votre contrle. Des lignes de guidage sont affiches pendant le dplacement du contrle pour faciliter son alignement avec les autres contrles dj placs sur la fentre. Les lignes bleues reprsentent les alignements possibles sur les bordures des autres contrles, les lignes roses reprsentent les alignements possibles sur les libells des contrles. Le contrle sera effectivement dplac au moment o vous relcherezleboutondevotresouris.

Lutilisationdesflchesduclavierestgalementpossibleetapporteplusdeprcisiondanslesdplacements. Vous pouvez aussi modifier la position dun contrle par sa proprit Location dans la fentre de proprits. Cette propritestdailleursmodifielorsquevousdplacezuncontrleaveclasourisouleclavier. Enfin, la dernire possibilit est de modifier les proprits Left et Top du contrle par le code. Le morceau de code suivantpermetdedplacerleboutondecommandeunepositionalatoirechaquefoisquevouscliquezdessus. Private Sub cmdtest_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdtest.Click cmdtest.Left = Rnd() * (Me.ClientSize.Width - cmdtest.Size.Width) cmdtest.Top = Rnd() * (Me.ClientSize.Height - cmdtest.Size.Height) End Sub Des fonctionnalits plus volues permettent le positionnement des contrles les uns par rapport aux autres. Pour pouvoir les utiliser, il faut au pralable slectionner plusieurs contrles sur votre feuille. Pour cela, deux solutions possibles :

- 2-

ENI Editions - All rigths reserved

Dessinerunrectangledeslection,aveclasouris,autourdescontrles. Cliquersurlescontrleslesunsaprslesautresenmaintenantlatouche[Ctrl]enfonce.Lepremiercontrle slectionnapparatavecdespoignesdeslectionblanches.

LesoptionsdumenuFormatdeVB.NETsontmaintenantdisponiblesetvousfournissentdenombreusesoptionspour positionner les contrles. Le contrle qui apparat dans la slection avec des poignes de slection blanches est considrcommerfrencepourlalignement.

Denombreusesautresoptionssontdisponiblespourorganiserleplacementdescontrlessurvotrefeuille. Leredimensionnementdescontrlesestgalementtrssimplemettreen uvrepuisquilsuffitdeslectionnerleou les contrles redimensionner et de placer le curseur de la souris sur lune des poignes de slection, pour faire apparatreuneflchevousindiquantdansquelledirectionvouspouvezredimensionnerlecontrle.Ilfautalorscliquer surlecarrcorrespondantetdplacerlasourisjusqucequelecontrleaitatteintlatailledsire.

ENI Editions - All rigths reserved

- 3-

Vouspouvezgalementutiliserlesflchesduclavierenassociationaveclatouche[Shift]pourledimensionnementdes contrles. Leredimensionnementparlecodeutiliselamthode SetBoundsquipermetlafoisdefixerlapositionetlatailledu contrle.Lecodesuivantdiminuelatailleduboutonchaquefoisqueloncliquedessus. Private Sub cmdMincir_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles cmdMincir.Click cmdMincir.SetBounds(cmdMincir.Left, cmdMincir.Top, cmdMincir.Size.Width - 5, cmdMincir.Size.Height - 5) End Sub Aprs de nombreux efforts pour positionner et dimensionner les contrles, il serait dommage quune erreur de manipulation vienne remettre tout en cause. Pour viter ces soucis, il est possible de verrouiller les contrles sur la feuille, par le menu Format Verrouiller les contrles. Cette commande bloque le dplacement et le redimensionnementdetouslescontrlesprsentssurlafeuilleainsiqueleredimensionnementdelafeuilleellemme. Les contrles peuvent ensuite tre dverrouills par la mme option de menu. Vous pouvez galement dverrouiller lescontrlesindividuellementparlapropritlocked. Sivousconcevezuneapplicationdanslaquellelutilisateurpeutredimensionnerlafentreaumomentdelexcution, lescontrlesdoiventsuivrelesmodificationsdetailledelafentre.Pourautoriserleredimensionnementautomatique duncontrle,vouspouvezutiliserlaproprit Anchorducontrle.Parlintermdiairedecetteproprit,vousindiquez queladistanceentrelesbordsducontrleetlespositionsdancrageseraconservelorsduredimensionnementdela fentre. la cration, les contrles sont ancrs aux bords haut et gauche de la feuille. La modification de cette propritseffectueparunpetitassistant,disponibledanslafentredeproprits.

Pour modifier la proprit anchor, slectionnez la branche de ltoile correspondant au ct avec lequel vous voulez raliserunancrage,ousupprimerunancrageexistant. Parexemple,pourlafentresuivante,lescontrlessontancrsgaucheetdroite.

Sinousredimensionnonslafentre,lescontrlessuiventlagrandissementhorizontaldelafeuille.

- 4-

ENI Editions - All rigths reserved

Vous pouvez galement indiquer quun contrle doit adapter une ou plusieurs de ces dimensions celle de son conteneur.Pourcela,vousutilisezlapropritDockducontrleenindiquantsurquelleborduredesonconteneurnotre contrlevaadapterunedesesdimensions. Parexemple,nouspouvonsplaceruncontrlePictureBoxendemandantlamarrerlabordurebassedelafentre.

NotrePictureBoxsadapteautomatiquementlalargeurdelafentreetrestecollesabordurebasse.

3.Passagedufocusentrecontrles
Lorsquevousconcevezvotreapplication,vousdevezpenserauxpersonnesrfractaireslutilisationdelasourisen leur permettant quand mme dutiliser lapplication. Il convient donc de concevoir lapplication pour quelle puisse fonctionneruniquementenutilisantleclavier(sansclaviernisourisceserabeaucoupplusdifficile!). Dans une application Windows, on dit dun contrle quil dtient le focus lorsquil est prt recevoir la saisie de lutilisateur. Le focus peut se dplacer de contrle en contrle en utilisant la touche [Tab]. Deux proprits des contrlesrglentlepassagedufocusparlatouche[Tab].
q

LapropritTabStopindiquesiuncontrlepourrarecevoirlefocusparlutilisationdelatouche[Tab]. LapropritTabIndexindiquelordredanslequellefocusserapassentrelescontrles.

Pardfaut,lespropritsTabIndexsontnumrotesdanslordredanslequellescontrlessontcrs. Pourmodifiercetordre,vouspouvezmodifierdirectementlaproprit TabIndexdechaquecontrleouutiliserlemenu Affichage Ordredetabulation.Lescontrlessontalorsaffichsavec,dansleurcoinsuprieurgauche,lavaleurde leurpropritTabIndex.

ENI Editions - All rigths reserved

- 5-

Vousdevezensuitecliquersurlescontrles,danslordredanslequelvousvoulezquelefocussoitpass. Lordresuivantsemblebeaucouppluslogiquepourcettebotededialogue.

Vouspouvezensuiterevenirenmodenormalenutilisantnouveaulemenu Affichage Ordre de tabulationouen utilisantlatouche[Echap].

4.Raccourcisclavier
Certainsutilisateurspressssouhaitentpouvoirsedplacerdirectementsuruncontrleparticuliersansavoirpasser le focus sur tous ceux qui le prcdent dans lordre des tabulations. Vous pouvez, pour cela, ajouter un raccourci clavierquiseraactivparlintermdiaire de la touche [Alt] et un caractre. Pour spcifier le caractre utiliser pour activerlecontrle,ilfautajouterdanslaproprit Textducontrleuncaractre&devantlecaractreutilispourle raccourciclavier associ au contrle. Cela provoque lactivation du raccourci et le soulignement du caractre dans le texteapparaissantsurlecontrle.

Siparcontre,vousvoulezinsreruncaractre&danslalgendedevotrecontrle,ilfautlerpterdeuxfoisdanssa propritText.

- 6-

ENI Editions - All rigths reserved

Pourcertainscontrles(boutons,casecocher,boutondoption...),lutilisationduraccourciclavierestquivalentun clic de souris et lance laction correspondante, pour les autres, le raccourciclavier place simplement le focus sur le contrlecorrespondant. Pour les contrles nayant pas de lgende, il faudra passer par lintermdiairedun contrle label qui lui servira de lgendeetactiveragalementleraccourciclavier.Nousverronscelaunpeuplusloindanscechapitre. Maintenantquenoussavonsutiliserlescontrlesdansuneapplication,nousallonsexaminerdansledtaillesplus utiliss.

ENI Editions - All rigths reserved

- 7-

LescontrlesdeVB.NET
ChaquecontrleutilisabledansVB.NETestreprsentparuneclassedontnousallonspouvoircrerdesinstancespour concevoirlinterfacedelapplication.Lamajoritdescontrlesdriventdelaclasse Controletdecefait,hritentdun bonnombredepropritsdemthodesetdvnements. NousallonsdonctudierleslmentslesplusutilesdelaclasseControl.

1.LaclasseControl
a.Dimensionsetposition
Les proprits Left, Top, Width, Height permettent le positionnement des contrles. Ces proprits peuvent tre modifiesindividuellementetacceptentdesvaleursdetypeInteger. Ilestdoncpossibledansnotrecodedutiliserlasyntaxesuivante : TextBoxNom.Left = 100 TextBoxNom.Top = 50 TextBoxNom.Width = 150 TextBoxNom.Height = 50 Deux autres proprits permettent de travailler avec la position et la taille dun contrle : la proprit Location accepte un objet de type point grce auquel nous pouvons spcifier la position de notre contrle de la mme manire,lapropritSizequiaccepteunobjetdetypeSize,grelesdimensionsducontrle.Leslignesprcdentes peuventtreremplacespar : TextBoxNom.Location = New Point(100, 50 TextBoxNom.Size = New Size(150, 50) dans lesquelles nous construisons une instance de Point et de Size, avant de les associer aux proprits correspondantes. Unetroisimepossibilitnouspermetdemanipuler,lafois,lapositionetlatailledescontrles : lapropritBounds attenduneinstancedelaclasseRectanglepourdfinirlescaractristiquesducontrle.Notrecodesersumedonc uneseuleligne : TextBoxNom.Bounds = New Rectangle(100, 50, 150, 50) Lamthode SetBoundspermetgalementdemodifierlespositionsetdimensionsdescontrlessansavoircrerde nouvelleinstancedelaclasseRectanglemaisenmodifiantcelledjassocieaucontrle. TextBoxNom.SetBounds(100, 50, 150, 50) La modification de ces proprits entrane le dclenchement des vnements Resize et Move sur le contrle. Ces vnementssontbiensrdclenchslorsquelavaleurdespropritsestmodifiedanslecode,maisaussilorsque, par exemple, la modification de taille de la fentre entrane un repositionnement ou un redimensionnement du contrle. Lecomportementdescontrleslorsquelafentreestredimensionneestspcifiparlesproprits Anchoret Dock. Nousavonsdjvucommentmodifiercesproprits,parlintermdiairedelafentredeproprits.Pourlesmodifier parlecode,ilsuffitdyaffecterunedesvaleursdfiniesdanslesnumrationsAnchorStyleetDockStyle.

ENI Editions - All rigths reserved

- 1-

Jusqu prsent, les positions avec lesquelles nous avons travaill taient des positions exprimes par rapport au coinsuprieurgaucheduconteneurducontrle.Danscertainscas,ilpeuttreutiledobtenirlescoordonnesdun pointducontrlenonpasrapportaucoinsuprieurgaucheducontrle,maisparrapportaucoinsuprieurgauche de lcran. La mthode PointToScreen permet cette conversion. Elle attend, comme paramtre, une instance de la classe Pointaveclescoordonnesexprimesparrapportaucontrleetrenvoieunenouvelleinstancedelaclasse Pointaveclescoordonnesexprimesparrapportlcran. Lecodesuivantconvertit,encoordonnescran,lapositionsuprieuregaucheduncontrleTextBox : System.Console.Write(Controle/fenetre :) System.Console.WriteLine(Button2.Location) Dim p As Point p = Button2.PointToScreen(Button2.Location) System.Console.Write(Controle/ecran :) System.Console.WriteLine(p) Rsultat : Controle/fenetre :{X=107,Y=72} Controle/ecran :{X=306,Y=255} Lopration inverse peut tre ralise par la mthode pointToClient qui elle, prend comme paramtre un point en coordonnescranetrenvoieunpointexprimencoordonnesliesaucontrle.Siloneffectueloprationinverse, cestdireenpartantdescoordonnescran,onobtientbienlammevaleur : System.Console.WriteLine("controle / fenetre partir de lcran" & Button2.PointToClient(p).ToString) Rsultat controle / fenetre partir de lcran{X=107,Y=72}

b.Apparencedescontrles
La couleur de fond du contrle peut tre modifie par la proprit BackColor tandis que la couleur du texte du contrleestmodifieparlapropritForeColor. Onpeutaffectercespropritsdesvaleursdfiniesdanslespacedenom System.Drawing.Colorpourobtenirdes couleursprdfiniesdansVisualBasic. TextBoxNom.BackColor = System.Drawing.Color.Yellow Onpeutgalementutiliserlesconstantesdfiniesdanslespace de nom System.Drawing.SystemColorspourutiliser une des couleurs dfinies au niveau du systme luimme. Lintrt, dans ce cas, est que votre application va sadapterenfonctiondelaconfigurationdelamachinesurlaquelleellefonctionnera. TextBoxNom.BackColor=System.Drawing.SystemColors.InactiveCaptionText Latroisimesolutionconsisteeffectuerlemlangedecouleurvousmme,enutilisantlafonction FromArgb et en spcifiantcommeparamtrelaquantitdechacunedescouleursdebase(Rouge,Vert,Bleu).

- 2-

ENI Editions - All rigths reserved

TextBoxNom.BackColor = System.Drawing.Color.FromArgb (127, 0, 127) LapoliceestmodifiableparlapropritFontducontrle.Onpeut,pourloccasion,crerunenouvelleinstancedela classe Font et laffecter au contrle. Il y a treize constructeurs diffrents pour la classe Font donc treize faons diffrentes de crer une police de caractre. Nous utiliserons la plus simple en indiquant, simplement, le type de policeetlataille. TextBoxNom.Font = New Font(System.Drawing.FontFamily.GenericMonospace, 16) Aprs avoir effectu des modifications sur ces proprits, il est possible de revenir une configuration normale en appelant les mthodes ResetBackColor, ResetForeColor, ResetFont. Les proprits correspondantes sont rinitialisesaveclesvaleursdfiniespourleconteneurducontrle. LapropritBackgroundImagepermetdespcifieruneimagequiserautilisecommefondpourlecontrle.Silimage nestpasassezgrandepourrecouvrirlecontrle,elleestreprsenteenmosaque : BtnValider.BackgroundImage = New Bitmap("open.bmp")

Lersultatestparfoisdroutant! Pourrevenirquelquechosedeplusclassique : BtnValider.BackgroundImage = Nothing Laproprit Cursorpermetdechoisirlapparenceducurseurlorsquelasourissetrouvesurlasurfaceducontrle. PlusieurscurseurssontprdfinisdansWindows.

Ces curseurs sont rangs dans une collection Cursors et peuvent tre utiliss directement en les affectant la propritCursorducontrle. BtnValider.Cursor = Cursors.WaitCursor Si,parmiceuxci,aucunnevousconvient,vouspouvezutiliseruncurseurpersonnalisencrantuneinstancedela classeCursoretenlaffectantlapropritCursorducontrle. BtnValider.Cursor = New Cursor("h_nodrop.cur") Ladtectiondelentreetdelasortiedelasourissurlecontrleetlamodificationducurseurenconsquenceest greautomatiquementparlecontrleluimme. ommepourlapolicedecaractre,ilestpossiblederestaurerlecurseurpardfautenappelantlamthode C ResetCursor.

Lamodificationdelaplupartdespropritsdescontrlesdclencheunvnement.Cesvnementssontidentifis
ENI Editions - All rigths reserved - 3-

par le nom de la proprit suivi du suffixe Changed. Ils peuvent tre utiliss pour sauvegarder les prfrences de lutilisateurlorsquilpersonnaliselapplication. Private Sub Form1_BackColorChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.BackColorChanged My.Settings.CouleurFond = Me.BackColor My.Settings.Save() End Sub

c.Comportementdescontrles
Les contrles placs sur une feuille peuvent tre masqus en modifiant la proprit Visible ou dsactivs en modifiantlaproprit Enabled.Danscecas,lecontrleesttoujoursvisiblemaisapparatavecunaspectgrispour indiquerlutilisateurquececontrleestinactifpourlemoment. BtnValider.Enabled = False

Lescontrlesdanscettatnepeuventbiensrpasrecevoirlefocusdanslapplication.Vouspouvezvrifiercelaen examinant la proprit CanFocus qui renvoie un Boolean. Vous pouvez galement vrifier si un contrle dtient actuellement le focus, en vrifiant la proprit Focused ou la proprit ContainsFocus. Cette dernire est utiliser aveclescontrlesconteneurs(cestdirelescontrlesquipeuventcontenirdautrescontrles),danscecascette propritestpositionnesurTruesilundescontrlesplacslintrieurduconteneuralefocus. Lefocuspeuttreplacsuruncontrlesanslinterventiondelutilisateur,enappelantlamthodefocusducontrle. BtnValider.Focus() Poursurveillerlepassagedufocusduncontrlelautre,quatrevnementssontvotredisposition :
q

Enterindiquequelefocusarrivesurundescontrlesdunconteneur. GotFocusindiquequuncontrleparticulierareulefocus. LostFocusindiquequuncontrleaperdulefocus. Leaveindiquequelefocusnestplussurundescontrlesduconteneur.

Parexemple,pourbienvisualiserquuncontrlealefocus,onpeututiliserlecodesuivantquimodifielacouleurdu textelorsquelecontrlereoitouperdlefocus : Private Sub TxtNom_GotFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles TextBoxNom.GotFocus TextBoxNom.ForeColor = System.Drawing.Color.Red End Sub Private Sub TxtNom_LostFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles TextBoxNom.LostFocus TextBoxNom.ResetForeColor() End Sub Danscertainscas,ilestsouhaitabledevrifierlasaisiedelutilisateurdansunformulaireavantdecontinuerdans lapplication. Cette vrification peut tre effectue la fermeture du formulaire ou au fur et mesure de la saisie, danslesdiffrentscontrlesduformulaire. Chaque contrle peut tre configur pour permettre la vrification de la saisie en modifiant la proprit CausesValidationsur True.Justeavantquelecontrleneperdelefocus,lvnement Validatingestdclenchpour permettrelavrificationdelasaisiedelutilisateur.Silasaisienestpascorrecte(enfonctiondescritresquenous avonsfixs),nouspouvonsbloquerlepassagedufocusversunautrecontrleenmodifiantlaproprit Cancelde lobjet CancelEventArgquiestpasscommeparamtre.Danscecas,lefocusrestesurlecontrlepourlequellasaisie nestpascorrecte.Parcontre,silasaisieestcorrecte,lvnement Validatedestdclenchsurlecontrleetlefocus sedplacesurlecontrlesuivant.

- 4-

ENI Editions - All rigths reserved

Parexemple,poursaisirunnumrodetlphone,nouspouvonsvrifierqueseulesdesvaleursnumriquesontt saisies.Encasderreurnousgnronsunbeep,modifionslacouleurdutexteetbloquonslepassagedufocussurun autrecontrle. Private Sub TxtTel_Validating(ByVal sender As Object, ByVal e As System. ComponentModel.CancelEventArgs) Handles txtTel.Validating If Not IsNumeric(txtTel.Text) And txtTel.Text Then Beep() txtTel.ForeColor = System.Drawing.Color.Red e.Cancel = True End If End Sub Private Sub TxtTel_Validated(ByVal sender As Object, ByVal e As System. EventArgs) Handles txtTel.Validated txtTel.ResetForeColor() End Sub Deuxpropritssontparfoisutileslorsquenoustravaillonsavecdescontrlesconteneur.Laproprit HasChildren nous permet de savoir si des contrles sont placs dans notre conteneur. Si cest le cas, la collection Controls contientlalistedetouscescontrles.Nouspouvonsparexemplemodifierlacouleurdetextedetouslescontrles dunconteneurlorsquelefocusestplacsurlundentreeux. Private Sub GroupBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles GrBoxIdent.Enter If GrBoxIdent.HasChildren Then Dim x As Object For Each x In GrBoxIdent.Controls x.forecolor = System.Drawing.Color.YellowGreen Next End If End Sub Private Sub GroupBox1_Leave(ByVal sender As Object, ByVal e As System. EventArgs) Handles GrBoxIdent.Leave If GrBoxIdent.HasChildren Then Dim x As Object For Each x In GrBoxIdent.Controls x.resetforecolor() Next End If End Sub Lopration inverse est galement possible cestdire, qu partir dun contrle, nous pouvons rcuprer les propritsdesonconteneur.LapropritParentfournitunerfrenceversleconteneurducontrle.Nouspouvons, par exemple, faire en sorte que la couleur de fond de chaque contrle change en mme temps que celle de son conteneur. Private Sub GrBoxIdent_BackColorChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GrBoxIdent.BackColorChanged If GrBoxIdent.HasChildren Then Dim x As Object For Each x In GrBoxIdent.Controls x.backcolor = x.parent.backcolor Next End If End Sub Maintenant que nous avons explor les proprits communes aux diffrents contrles disponibles, nous allons les tudierunparunenexplorantleursspcificits.

2.Lescontrlesdaffichagedinformations
a.LecontrleLabel
LecontrleLabelestutilispourafficher,surunformulaire,untextequineserapasmodifiableparlutilisateur.Ilsert

ENI Editions - All rigths reserved

- 5-

essentiellement fournir une lgende des contrles qui nen possde pas (zones de texte par exemple, liste droulante...).Danscecas,ilpermettragalementdefournirunraccourciclavierpouratteindrelecontrle. Letexteaffichparlecontrleestindiquparlaproprit Text.Cettepropritpourrabiensrtremodifieparle code lapplication. Il faut cependant tre prudent car, par dfaut, le contrle conservera la taille que vous lui avez donne la conception. Si la nouvelle chane de caractres affecte la proprit Text est plus longue que celle spcifie au moment de la conception, seul le dbut sera visible. Pour viter ce problme, il faut demander au contrleLabeldadaptersalargeurenfonctiondutexteafficher,enmodifiantlapropritAutoSizesurTrue. Pardfaut,lecontrleLabelnapasdebordure.Vouspouvezenajouteruneenmodifiantlaproprit BorderStyle, enutilisantlunedestroisvaleursdisponibles.

Vous avez aussi la possibilit dindiquer la position du texte dans le contrle par lintermdiaire de la proprit TextAlign.Danslecode,vousutiliserezlunedesconstantesprdfinies.

Parlafentredeproprit,ilsuffitdecliquersurlapositiondsirepourletextelintrieurdevotrecontrle.

noter cependant que la proprit TextAlign modifiera la position du texte uniquement si la proprit AutoSizeestpositionnesurFalse.

Les contrles Label peuvent galement afficher des images. Vous pouvez indiquer limage afficher laide de la proprit Image. Une autre solution consiste utiliser un contrle ImageList qui servira, en quelque sorte, de stockagepourlesimagesdelapplication.Danscecas,vousindiquez,parlintermdiairedelaproprit ImageList, dansquelcontrlevousallezchercherlimage, et par la proprit ImageIndexquelendroitellesetrouvedansle contrle ImageList.Sivousutilisezuncontrle ImageList,laproprit Imagedevotrecontrleseraignore.Comme pourletexte,vouspouvezmodifierlapositiondelimagedanslecontrleparlapropritImageAlignaveclesmmes constantesquepourlapropritTextAlign. Nous avons indiqu que le contrle Label pouvait tre utilis comme raccourciclavier pour un autre contrle. Pour cela,troisprcautionssontprendre.
q

Comme pour les autres contrles, ajouter un & dans la proprit Text pour le caractre utilis comme raccourci. IndiqueraucontrleLabelsonrledegestionnairederaccourciclavierenmodifiantlapropritUseMnemonic surTrue. Vrifierquelecontrle,quidoitrecevoirlefocus,estimmdiatementaprslecontrle Labeldanslordredes tabulations(propritTabIndex).

- 6-

ENI Editions - All rigths reserved

b.LecontrleLinkLabel
LecontrleLinkLabelhritedetouteslescaractristiquesducontrleLabeletajoutesimplementdesfonctionnalits delienstyle Web.Lespropritssupplmentairesparrapportaucontrle Labelgrentlesdiffrentsparamtresdu lien. La proprit LinkArea indique quelle portion du texte activera le lien. Cette proprit peut tre modifie, par lintermdiairedelafentredeproprits,avecunpetitutilitairedanslequelvousdevezslectionnerlaportionde texteconstituantlelien.

Lescouleursutilisespourleliensontmodifiablespartroisproprits : LinkColor couleurdulienltatnormal. VisitedLinkColor couleurdulienaprsunepremireutilisation. ActiveLinkColor couleurdulienaumomentoloncliquedessus. LapparencedulienestmodifiableparlapropritLinkBehavior.

Lesquatrevaleurspossiblespermettentrespectivement :
q

dutiliserlammeconfiguration,pourlesliens,quevotrenavigateur davoirleslienstoujourssouligns davoirleslienssoulignslorsquelasourislessurvole denejamaisavoirleslienssouligns.

Lorsque lutilisateurcliquesurlelien,lvnement LinkClicked est dclench dans lapplication vous dcriredu code,pourexcuteruneactiondansvotreapplication. Vousdevezgalementmodifierlaproprit LinkVisitedenlapositionnantsurTrue,pourindiquerquecelienadj tutilisdanslapplication. Laction peut tre louverture dune page dun site Web dans le navigateur par dfaut, comme dans lexemple suivant : Private Sub LienMicrosoft_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.

ENI Editions - All rigths reserved

- 7-

LinkClicked System.Diagnostics.Process.Start(" http ://www.microsoft.fr ") LinkLabel1.LinkVisited = True End Sub Ouencore,laffichagedunenouvellefeuilledansnotreapplicationcommedanslexemplesuivant : Private Sub LienMicrosoft_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LienMicrosoft. LinkClicked Dim feuille As dlgPerso feuille = New dlgPerso() feuille.ShowDialog() LienMicrosoft.LinkVisited = True End Sub

c.LecontroleStatusStrip
Le contrle StatusStrip est gnralement utilis pour prsenter des informations lutilisateur, concernant le fonctionnementdelapplication.Ilpeutafficherlesinformationssurplusieurstypeszones.Lesinformationspeuvent tre affiches sous forme de texte, de barre de progression, de menu ou de bouton de commande associ un menu.UnditeurspcifiqueaccessibleparlapropritItemsducontrlepermetsaconfiguration.

Chaquelmentajoutsurlecontrle StatusStripdoitensuitetreconfigurindividuellement.Lespropritsdes lments pouvant tre utiliss pour la construction dune StatusStrip sont trs semblables celles des contrles normaux.Parexemple,llmentToolStripStatusLabelestpratiquementidentiqueaucontrleLinkLabel.

d.LecontrleToolTip
Cecontrlepermetlaffichagedunebulledaideassocieuncontrle.Cecontrlenapasdinterfacevisible,ilsera doncplacdanslazonesitueendessousdelafentredeconception.Ileffectuebeaucoupdetravailsansaucun effort de programmation. Il surveille, par exemple, en permanence o se trouve la souris si celleci est sur un contrle,ilvrifiesilyauneinfobulleassocieaucontrleetsicestlecas,ilaffichelinfobullependantladure spcifieparlapropritAutoPopDelay. Pour pouvoir fonctionner, le contrle ToolTip doit associer une chane de caractres chacun des contrles de linterface.Pourcela,dsquuncontrle ToolTipestdisponiblesurunefeuille,uneproprit ToolTipestajoute chacundescontrles,permettantainsidespcifierletextedelinfobulleassocieaucontrle.

- 8-

ENI Editions - All rigths reserved

Leschanesdecaractresassocieschaquecontrlepeuventgalementtreindiquesparlintermdiaireducode, enappelantlamthodeSetToolTipetenindiquantcommeparamtre,lenomducontrleetlachanedecaractres, quiluiestassocie. ToolTip1.SetToolTip(RadioButton3, " Couleur bleu pour le texte ") Cette technique permet de conserver des lgendes relativement courtes pour les contrles, tout en fournissant suffisammentdinformationssurlutilisationdelapplication.

e.LeContrleErrorProvider
Ce contrle permet dindiquer facilement lutilisateur des problmes sur les donnes quil a saisies, sur un formulaire.Engnral,ilintervientlorsdelaphasedevalidationdesdonnesduformulaire,enaffichantenfacede chaque contrle une petite icne afin dattirer lattention de lutilisateur. Des informations supplmentaires peuventtrefourniesparuneinfobulleassocieaucontrleErrorProvider. UnmmecontrleErrorProviderpeuttreutilispourtouslescontrlesdunformulaire. Lactivationducontrle ErrorProviderpeutseffectuerlafermetureduformulairelorsquelutilisateurcliquesurle bouton OK,maisilestgalementpossibledesurveillerla saisieaufuretmesureoelleesteffectueengrant parexemplelesvnementsValidating.Cetvnementestdclenchparuncontrleaumomentoceluiciperdle focus.Nouspouvons,danscecas,vrifierimmdiatementlavaleursaisiedanslecontrleetragirenconsquence en affichant notre contrle ErrorProvider. Pour cela, nous appelons la mthode SetError en spcifiant le nom du contrlequinousposeproblmeetlachanedecaractresaffichedanslinfobulleassocieaucontrle.Silnya pasderreur,ilfautrinitialiserlachanepourfairedisparatrelicneducontrleErrorProvider. Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System. ComponentModel.CancelEventArgs) Handles TextBox1.Validating If Not IsNumeric(TextBox1.Text) Then ErrorProvider1.SetError(TextBox1, " Valeur numrique Obligatoire ") Else ErrorProvider1.SetError(TextBox1, "") End If End Sub

f.LecontrleNotifyIcon
Cecontrleestprincipalementutilispourafficherdesinformationssurlefonctionnementdunprocessussexcutant entchedefonddanslapplication.Ilestaffichdanslazonedestatutdusystme.Laproprit Iconducontrle dterminelicneaffiche.LapropritTextreprsentelalgendeaffichelorsquelasourissurvolelecontrle.

En grant lvnement DoubleClick du contrle, vous pouvez afficher une bote de dialogue permettant la configurationduprocessusassociaucontrle.

ENI Editions - All rigths reserved

- 9-

Private Sub IconService_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles IconService.DoubleClick Dim dlg As ConfigService dlg = New ConfigService dlg.ShowDialog() End Sub Il est galement possible dassocier un menu contextuel, en renseignant la proprit ContextMenuStrip. Ce menu peut,parexemple,contrlerlefonctionnementduprocessusauquelestassocilecontrle.

g.LecontrleHelpProvider
Lecontrle HelpProviderassurelaliaisonentreunfichierdaideetlapplication.Lefichierdaidedoittregnrpar loutilHtml Help Workshop,disponibleentlchargementsurlesiteMicrosoft.Pournosexemples,nousutiliseronsun fichierdaideexistantsurlesystme : lefichierC:\WINDOWS\Help\charmap.chmcorrespondantlutilitaireTabledes caractres. Ce fichier doit tre associ au contrle par la proprit HelpNamespace. La prsence dun contrle HelpProvidersurunefentre,ajouteautomatiquementtroispropritschaquecontrleprsentsurlafentre : HelpKeyword Indiquelemotclassociaucontrledanslefichierdaide. HelpNavigator Indiquelactionexcutelorsdelaffichagedelaide. HelpString Contient la chane de caractres affiche lors de lutilisation du bouton dune bote de dialogue. Pour que ce

bouton soit disponible sur la bote de dialogue, il faut modifier la propritHelpButton de la fentre sur True et masquer les boutons dagrandissement et de rduction de la fentre, en modifiant les proprits MaximizeBox et MinimizeBoxsurFalse. Lexemple suivant associe au bouton de commande CmdOk, la rubrique daide Vue densemble de la table de caractres du fichier charmap.chm et configure le systme daide, pour que cette rubrique soit affiche automatiquementlorsquelatouche[F1]estutilise.

h.LecontrleProgressBar
Ce contrle est utilis pour informer lutilisateur sur la progression dune action lance dans lapplication. Il affiche cette information sous la forme dune zone rectangulaire, qui sera plus ou moins remplie en fonction de ltat davancementdelactionexcute.Laspectdela ProgressBarestcontrlparsaproprit Style.Troisvaleurssont disponibles : Continuous Laprogressionestafficheparunebarrebleuepleine. Blocks Laprogressionestafficheparunesriedepetitsrectangles.
- 10 ENI Editions - All rigths reserved

Marquee Cetteprsentationestidentiquelaprcdenteavec,enplus,undfilementlintrieurdelaProgressBar. Lapositiondelabarredeprogressionestcontrleparlaproprit Value.Cettepropritpeutvolueentreles deuxextrmesindiqusparlespropritsMinimumetMaximum. Troistechniquessontdisponiblespourfairevoluerlabarredeprogression :


q

Modifierdirectementlaproprit Valueducontrle.noterquedanscecas,silavaleurdecetteproprit dpasselesextrmes,uneexceptionestdclenche. UtiliserlamthodePerformStepquiincrmentechaqueappellapropritValuedelavaleurcontenuedans la proprit Step. Le contrle vrifie, dans ce cas, la valeur contenue dans la proprit Value et sassure quellenedpasserapaslesextrmes. Utiliser la mthode Increment en indiquant comme paramtre, la valeur utilise comme incrment pour la propritValue.LavaleurdelapropritValueestgalementvrifielorsdelexcutiondecettemthode.

ilaProgressBaralestyleMarquee,lapropritValuenaaucuneffetsurlatailledelabarredeprogressionet S lesmthodesPerformStepetIncrementnedoiventpastreutilises,sinonuneexceptionestdclenche.

LexemplesuivantprsenteunehorlogeoriginaleolheureestaffichepartroisProgressBar : Public Class Horloge Public Sub New() This call is required by the Windows Form Designer. InitializeComponent() Add any initialization after the InitializeComponent() call. pgbHeure.Minimum = 0 pgbHeure.Maximum = 23 pgbHeure.Style = ProgressBarStyle.Continuous pgbMinute.Minimum = 0 pgbMinute.Maximum = 59 pgbMinute.Style = ProgressBarStyle.Continuous pgbSeconde.Minimum = 0 pgbSeconde.Maximum = 59 pgbSeconde.Style = ProgressBarStyle.Continuous Timer1.Interval = 500 Timer1.Enabled = True End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick pgbHeure.Value = Now.Hour pgbMinute.Value = Now.Minute pgbSeconde.Value = Now.Second End Sub End Class

3.Lescontrlesdditiondetexte
ENI Editions - All rigths reserved - 11 -

a.LecontrleTextBox
LecontrleTextBoxestutilispourpermettrelutilisateurdesaisirdesinformations.Lecontrlepeuttreconfigur poursaisirdutextesuruneouplusieurslignes.Lataillemaximaledutextevariede200032000caractres,suivant laconfigurationducontrle(simpleligneoumultiligne).Lecontrleestgalementcapabledegrerlaslectionde texte et les oprations avec le pressepapiers. De nombreuses proprits et mthodes sont disponibles pour travailleraveccecontrle.Letexteaffichdanslecontrlepeuttremodifiourcuprparlaproprit Text.Le formatdaffichagedutexteestmodifiablepardiffrentesproprits.Laproprit Autosizepermetdedemanderau contrleTextBoxdeseredimensionner,enfonctiondelatailledelapolicedecaractres.Cettepropritestpresque toujourspositionnesurTrue.Laproprit CharacterCasingautoriselecontrlemodifiertouslescaractressaisis soitenminusculessoitenmajuscules.

Laproprit Linespermetdercuprerletextesaisi,ligneparligne.Cettepropritestuntableaudechanesde caractres qui contient autant de cases quil y a de lignes. Elle na dintrt que si le contrle est configur pour accepterlasaisiesurplusieurslignesaveclapropritMultilinepositionnesurTrue.Danscecas,ilfautgalement prvoirlapossibilitdefairedfilerletexte,enajoutantdesbarresdedfilementaveclapropritScrollBars.Les diffrentes possibilits permettront davoir une barre de dfilement horizontale, verticale ou les deux. Attention cependantcarlabarrededfilementverticaleneseravisiblequesilaproprit WordWrapestpositionnesur False sinonlecontrlegreluimmeleretourlalignelorsquelalongueurdelalignedpasselalargeurducontrle.Par contre,danscecaslesretourschariotajoutsautomatiquementnesontpasinsrsdansletexte.

Danscetexemple,laproprit Linescontiendradeuxlmentscarlepremierretourchariotestsimplementajout parlecontrlepourlaffichage. Lines(0)>Ilfaitbeauaujourdhuisurlargionnantaise Lines(1)>Pourvuqueacontinue LalongueurmaximaledutexteducontrleestfixeparlapropritMaxLength.noterquedanslecasduncontrle multiligne,lescaractresretourchariotetsautdelignesontgalementcompts.Cettepropritestfrquemment utilise lorsque lon utilise le contrle TextBox pour la saisie dun mot de passe. Dans ce cas, la proprit PasswordCharindiquelecaractreutilislaffichage,pourmasquerlasaisiedelutilisateur.Engnral,onutilisele caractre * ou #. Cette proprit ninfluence bien sr que laffichage, et les caractres saisis par lutilisateur sont toujoursrcuprsdanslapropritText. La gestion de la slection du texte se fait automatiquement par le contrle. La proprit SelectedTextpermet de rcuprer la chane de caractres actuellement slectionne dans le contrle. Les proprits SelectionStart et SelectionLengthindiquentrespectivementlecaractrededbutdelaslection(lepremiercaractrelindice0)etle nombre de caractres de la slection. Ces proprits sont galement utilises pour insrer du texte dans le contrle : lapropritSelectionStartindique,danscecas,lepointdinsertionetlaproprit SelectedText,letexte insrer. Pour lajout de texte la suite de celui dj prsent dans le contrle, il est plus pratique dutiliser la mthodeAppendTextenpassantcommeparamtrelachanedecaractrseajouter. Leremplacementduneportiondetextedanslecontrle TextBoxsefaitendeuxtapes.Ilfautdabordslectionner letextequelonveutremplacerlaidedesproprits SelectionStartet SelectionLength,puisindiquerletextede remplacement avec la proprit SelectedText. Le texte remplac et le texte de remplacement ne doivent pas forcmentavoirlammetaille. TextBox1.SelectionStart = 39 TextBox1.SelectionLength = 8 TextBox1.SelectedText = "Ouest"

aslectiondetextepeutgalementseffectueraveclamthode Select,enindiquantlecaractrededbut L delaslectionetlenombredecaractresdelaslection.

TextBox1.Select(39,8)

- 12 -

ENI Editions - All rigths reserved

TextBox1.SelectedText = "Ouest"

La slection de la totalit du texte peut tre effectue avec la mthode SelectAll. Par exemple, on peut forcer la slectiondetoutletextelorsquelecontrlereoitlefocus. Private Sub TextBox1_GotFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles TextBox1.GotFocus TextBox1.SelectAll() End Sub Demanireclassique,dsquuncontrleperdlefocus,laslectiondetextequilyavaitlintrieurducontrlenest plus visible. La proprit HideSelection positionne sur False permet de conserver la slection visible, mme si le contrlenapluslefocus.

Pour la gestion du pressepapiers, le contrle TextBox dispose dun menu contextuel permettant deffectuer les oprations courantes. Vous avez cependant la possibilit dappelerlesmthodes copy, cut et pastepourgrerles oprationsdecopiercollerduneautremanire,parexempleunmenudelapplication.Lesoprationscouperetcoller ne seront cependant pas possibles si le contrle TextBox est configur en lecture seule avec la proprit ReadOnly positionnesurTrue,lamodificationdutexteparlutilisateurestbiendanscecasimpossible. Tout le monde ayant droit lerreur, le contrle TextBox nous propose la mthode Undo permettant dannuler la dernire modification de texte effectue sur le contrle. Cette mthode est dj utilisable par loption annuler du menucontextuelducontrle TextBoxouparleraccourciclavier[Ctrl]Z.Ellepeutbiensrtreappeleparunautre menudevotreapplication.Ilnyaquunseulniveaude Undo,vousnepourrezrevenirautextequevousavezsaisi, ilyadeuxheures! Est galement disponible sur ce contrle, lvnement TextChanged qui se produit lorsque la proprit Text du contrleestmodifie(parlecodedelapplicationouparlutilisateur).AttentionnepasmodifierlapropritTextde votrecontrledanslecodedecetvnementsinonvousrisquezdegnrerundbordementdepilelexcutionde lapplication,commedanslexemplecidessous. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged TextBox1.Text = Rnd() End Sub

b.LecontrleMaskedTextBox
Cecontrleestuneamliorationducontrle TextBoxcarilpermetdevrifierautomatiquementquelesinformations saisiescorrespondentcequiestattenduparlapplication.Laproprit Maskdtermineleformatdesinformations pouvanttresaisiesdanslecontrle.Lditeuraccessibleparlafentredeproprits,permetdechoisirunmasque existantoudeconfigurervotrepropremasque.

ENI Editions - All rigths reserved

- 13 -

PourlapropritMask,certainscaractresontunesignificationparticulire : 0reprsenteunchiffreobligatoire(09) 9reprsenteunchiffreouunespaceoptionnel Lreprsenteunelettreobligatoire(deazouAZ). ?reprsenteunelettreoptionnelle. Creprsenteuncaractrequelconque .reprsentelesparateurdcimal ,reprsentelesparateurdesmilliers :reprsentelesparateurhoraire /reprsentelesparateurdedate $reprsentelesymbolemontaire <lescaractressuivantsseronttransformsenminuscules. >lescaractressuivantsseronttransformsenmajuscules |annuleleffetdesdeuxcaractres>et< \caractredchappementfaisantperdresasignificationspcialeaucaractresuivant Touslesautrescaractressontaffichstelsquelsdanslecontrle. Lemasquesuivantpeut,parexemple,treutilispourlasaisieduneadresseIP : 000\.000\.000\.000

c.LecontrleRichTextBox
Lecontrle RichTextBoxpermetlaffichage,lasaisieetlamanipulationdetexteavecmiseenforme.Ilpossdeles mmesfonctionnalitsquelecontrleTextBoxmaisilestcapabledegrerdespolicesdecaractrediffrentes,des

- 14 -

ENI Editions - All rigths reserved

couleursdiffrentes,desimages,etc.Ilproposeenfaittouteslesfonctionsdebaseduneapplicationdetraitement detexte.Nousallonsdoncdtaillercesprincipalesfonctions. Chargementetenregistrementdefichier Lesmthodes LoadFileet SaveFilepermettentlechargementetlenregistrementdepuisouversunfichier.Leseul paramtre obligatoire pour ces deux fonctions reprsente le chemin daccs complet vers le fichier charger ou sauvegarder. Le format de fichier utilis par dfaut par ces deux fonctions est le format rtf (Rich Text Format). Si dautresformatsdefichierdoiventtreutilissnousdevonsalorslespcifierparundeuximeparamtrequiestune constante de lnumration RichTextBoxStreamType. Dans le cas dune lecture de fichier il est important que les informationscontenuesdanslefichiersoientenaccordaveclaconstanteutilise. Parexemple,lalecturedunfichiertextenormalaveclalignedecodesuivantedclencherauneexception. rtb.LoadFile(dlgOuvrir.FileName, RichTextBoxStreamType.RichText) Par contre, il ny a pas de problme pour lenregistrement car cest le contrle RichTextBox qui gre luimme le format des informations inscrites dans le fichier. Le seul risque est de perdre les informations de mise en page contenues dans le contrle si un format denregistrement inadapt est utilis. Par exemple la ligne suivante fera perdretouteslesinformationsdeformatagelorsdelenregistrementdufichier. rtb.SaveFile(dlgEnregistrer.FileName, RichTextBoxStreamType.PlainText) Ajoutdetexte LecontrleRichTextBoxgresoncontenugrcedeuxproprits:
q

la proprit Text qui, comme pour les autres contrles, dfinit les informations affiches dans le contrle. Cestletextebrutquieststockdanscetteproprit. Laproprit Rtfcontientelleaussiletexteaffichparlecontrlemaisellecontientenpluslesinformations concernantlaprsentationdutexte.

PourajouterdutexteuncontrlenouspouvonsdfinirlapropritTextoulaproprit Rtf.Danscesecondcas,il fautgalementinclurelescaractresdeformatageutilissparlecontrlepourlamiseenformedutexte.Lescodes Rtftantloindtresimplescettesolutionestrarementutilise.Heureusementunesolutionplussoupleexiste. LamthodeAppendTextpermetdajouterunechanedecaractresaucontenuducontrleRichTextBox.Leformatage delachaneajouterdoittredfiniaupralableparlintermdiairedespropritsdelaslection. LapropritSelectionFontdterminelapoliceutilisepourlaffichagedutexteajout.Pourajouterdutexteengras etsoulignilfautdoncmodifierlescaractristiquesdelapolice.Plusexactementilfautcrerlapolicedsirecaril nest pas possible de modifier les caractristiques dune police existante puisque ses proprits sont en lecture seule.

Lasyntaxesuivanteestcorrectepourlamodificationdescaractristiquesdelapoliceexistante. rtb.SelectionFont = New Font(rtb.SelectionFont, FontStyle.Bold + FontStyle.Underline) LescouleursdutexteetdufondsontdterminesparlespropritsSelectionColoretSelectionBackColor. rtb.SelectionBackColor = Color.Beige rtb.SelectionColor = Color.Red Lalignement du texte est reprsent par la proprit SelectionAlignment laquelle vous devez affecter une des valeursdelnumrationHorizontalAlignment. rtb.SelectionAlignment = HorizontalAlignment.Center

4.Lescontrlesdedclenchementdactions

ENI Editions - All rigths reserved

- 15 -

a.LecontrleButton
Lecontrle Buttonestprincipalementutilis,dansuneapplication,pourlancerlexcutionduneaction.Cetteaction peuttrelexcution duneportiondecodeoulafermeturedunebotededialogue.Commepourlescontrlesvus jusqu prsent, le libell du bouton est modifiable par la proprit Text du contrle. Cette proprit Text peut contenirun&pourcrerunraccourciclavier.Lorsqueleboutonestutilispourlafermeturedunebotededialogue, vousdevezindiquerparlintermdiairedelaproprit DialogResult,lavaleurquiserarenvoyelorsquelabotede dialogue sera ferme par ce bouton. Les valeurs utilisables pour cette proprit, correspondent aux boutons standardsrencontrssousWindows.

Lorsque lon cre une bote de dialogue, il y a gnralement au moins un bouton de validation et un bouton dannulation.Onpeutindiquerque,pourcettebotededialogue,lutilisationdelatouche[Entre]seraquivalente un clic sur le bouton de validation, et lutilisation de la touche [Echap] sera quivalente lutilisation du bouton dannulation. Il convient, pour cela, dindiquer dans la proprit AcceptButton de la fentre, le nom du contrle correspondantauboutondevalidationetdanslapropritCancelButton,lenomducontrleutilispourlannulation.

b.LecontrleMenuStrip
La majorit des applications disposent dunebarredemenus.Parlintermdiaire de ces menus, lutilisateurpourra activerlesdiffrentesfonctionnalitsdelapplication.Lesmenussontconstitusdlmentsdemenuspermettantle lancementdactionsdanslapplicationoulapparitiondunsousmenu.Danscecas,unpetittrianglectdulibell demenuprvientlutilisateurdelaprsencedunsousmenu.Lesmenuspeuventgalementserviractiverounon uneoption,danscecas,unpetitrepreestaffichdevantlelibelldumenupourmarquerlactivation de loption. Pour les inconditionnels du clavier, il est galement possible dassocier un menu une combinaison de touches quivalenteunclicsurlemenu. Lafiguresuivanteprsentetoutescesnotions.

Voyons maintenant comment mettre tout cela en uvre. La premire chose faire est dinsrer un contrle MenuStripsurlafeuille.Cecontrleseplacedeuxendroitsdansleconcepteur :
q

danslazonerserveauxcontrlesinvisibles directementsurlafentre,laplacedunebarredemenustandard.

- 16 -

ENI Editions - All rigths reserved

Cest partir de cet endroit que vous allez pouvoir composer le menu. Le concepteur de menu vous propose les diffrenteszonesdanslesquellesvouspouvezsaisirlesinformationsconstituantlemenu.

Vouspouvezainsicomposercompltementlabarredemenuetvisualisersonapparenceaufuretmesuredesa conception. chaquefoisquevousinsrezunlment,leconcepteurcreunenouvelleinstancedelaclasse ToolStripMenuItem etlinsredanslacollection Items,pourlestitresdemenusetdanslacollectionDropDownItems,pourleslments demenuetdesousmenu. Lemenucontextuel,affichparunclicdroit,permetlajoutdunebarredesparation.

Ilrestemaintenantconfigurerlespropritsdechacundeslmentsdemenu. Regardonslespropritslesplusintressantes : Text Contientlelibelldumenu. Visible Permetdemasquerunlmentdemenu. Enabled Permetdinterdirelutilisationdellment.Ilapparatalorsengrisdanslemenu. Checked Indiquesillmentdemenuestcochounon. CheckOnClick

ENI Editions - All rigths reserved

- 17 -

Permetdechangerautomatiquementltatdumenuchaqueclic.LavaleurdelapropritCheckedest,danscecas, inversechaqueclicsurlemenu. ShortcutKeys Dfinitlacombinaisondetouchesquivalenteunclicsurlemenu. Cettepropritestfacilementmodifiableparlafentredeproprits :

LapropritShowShortCutKeysautoriselaffichageduraccourcictdulibelldumenu. Cespropritssontaussimodifiablesparlecode.Si,parexemple,unebarredoutilsestgalementdisponible,les actionsralisesaveccellecidoiventbiensragirsurltatdumenucorrespondantetlarciproquedoitaussitre vraie. Private Sub btnGras_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles btnGras.Click MnuGras.Checked = btnGras.Checked End Sub Private Sub btnItalique_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnItalique.Click MnuItalique.Checked = btnItalique.Checked End Sub Private Sub btnSouligne_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSouligne.Click MnuSouligne.Checked = btnSouligne.Checked End Sub Private Sub MnuGras_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MnuGras.Click btnGras.Checked = MnuGras.Checked End Sub Private Sub MnuItalique_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuItalique.Click btnItalique.Checked = MnuItalique.Checked End Sub Private Sub MnuSouligne_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuSouligne.Click btnSouligne.Checked = MnuSouligne.Checked End Sub Dans certains cas, il est ncessaire dajouter dynamiquement des lments pendant le fonctionnement de lapplicationpourajouterparexemplelalistedesderniersfichiersutilissdanslapplication. Lasolutionconsisteajouter,lacollectionDropDownItems,unnouvellmentenutilisantlamthodeAdd. MnuFichier.DropDownItems.Add("essai.txt") Cetteoprationajoutebienunlmentaumenu,maisilnenousserapasdunegrandeutilit !Ilnousesteneffet impossibledepouvoirrcuprerlesvnementsClicksurcemenu. Pour rsoudre ce problme, nous devons utiliser une syntaxe diffrente de la mthode Add nous permettant dassocierungestionnairedvnementaunouvellmentajout. Ilfautdabordcrerlaprocdurequiserautilisepourlagestiondecetvnement : Private Sub FichiersRecent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

- 18 -

ENI Editions - All rigths reserved

End Sub Puis, au moment dajouter llment de menu, nous devons indiquer que notre procdure sera responsable de la gestiondesvnementsClicksurlemenu. MnuFichier.DropDownItems.Add(essai.txt, Nothing, New System.EventHandler (AddressOf FichiersRecent_Click))

c.LemenuContextMenuStrip
Lemenucontextuelpermetdassocierauxdiffrentscontrlesdelinterfacedelapplication,unmenuquiseraaffich lorsdunclicavecleboutondroitdelasourissurlecontrle. Les menusdoiventdabordtreconusenajoutantsur lafeuilledescontrlesContextMenuStrip. Ce contrle apparat, sur la barre de menu de lapplication, juste pour vous permettre de saisir les diffrents lments du menu. noter quun menu contextuel ne comporte pas de titre mais permet simplement la saisie dlmentsdemenuetdesousmenus.Ilfautensuiteassocier,chaquecontrle,lemenucontextuelcorrespondant parlintermdiairedelapropritContextMenuStrip.

Laffichagedumenuseferaautomatiquementlorsquelutilisateurferaunclicdroitsurlecontrlecorrespondant.

d.LecontrleToolStrip
LecontrleToolStripettouteslesclassesassociessontutilisspourlacrationdebarresdoutils.Cecontrlesert en fait de conteneur pour les lments constituant une barre doutils. Ces lments sont ajouts au contrle ToolStrip par lintermdiaire du menu qui est affich en cliquant sur la petite flche prsente gauche sur le contrle.

CettesolutionpermetdecrerunebarredoutilsdeAZenyajoutanttousleslmentsunun.Dansbeaucoup dapplications, les barres doutils comportent un ensemble de boutons standard. Pour nous faciliter la tche, le contrle ToolStrip contient un assistant pour gnrer automatiquement une barre doutils avec toutes les fonctionnalitsdebaseduneapplication.Vousdevezpourcelacliquersurlapetiteflcheprsentesurladroitedu contrleetchoisirloptionAjouterdeslmentsstandard.Labarredoutilsprendalorslapparencesuivante.

Lesboutonsclassiquessontajoutsautomatiquementlabarredoutils.Lamagiedelassistantsarrteicicarilny a,biensr,pasdecodegnrautomatiquementpourragirauxclicssurcesdiffrentsboutons.Vousdevezdonc

ENI Editions - All rigths reserved

- 19 -

lcrirevousmmecommepourtouslesautrescontrlesdelinterfacedelapplication.

e.LecontrleToolStripContainer
Lebutdececontrleestdefaciliterlaconceptiondunefentrelorsquecellecidoitcontenirplusieursbarresdoutils. CecontrleestgnralementplacsurunefentreaveclapropritDockpositionnesurFillpouroccupertoutela surfacedisponibledelafentre. Ildisposesurchacunedesesborduresdunconteneurpouraccueillirlesdiffrentesbarresdoutils.Pardfautces conteneursnesontpasvisiblesetilfautdonclesactiveravantdepouvoiryajouterdeslments.Pourcela,vous devezcliquersurlespetitesflchesprsentessurlesongletsenpriphrieducontrle.

Une nouvelle zone devient active sur laquelle il est possible de placer un ou plusieurs ToolStrip. Attention ces diffrentes zones ne peuvent contenir que des contrles ToolStrip. La zone centrale peut par contre contenir nimportequelcontrle. Lavantage de lutilisation du contrle ToolStripContainer rside dans la possibilit de modifier la disposition des barres doutils pendant lexcution de lapplication. Pour dplacer une barre doutils, lutilisateur doit la saisir en cliquantsurlestroispointsprsentssurlabarredoutilsetraliserunglisserdplacerversunedesborduresdela fentre.Labarredoutilsvientalorssancrersurlabordurecorrespondante.

5.Contrlesdeslection
- 20 ENI Editions - All rigths reserved

a.LecontrleCheckBox
LecontrleCheckBoxestutilispourproposerlutilisateurplusieursoptions,parmilesquellesilpourraenchoisirune ouplusieurs.Lecontrle CheckBoxpeutengnralprendredeuxtats : cochlorsqueloptionestslectionneou noncochlorsqueloptionnestpasslectionne.Unetroisimepossibilitcorresponduntatindtermindela case cocher dans ce cas, elle apparat en gris. Ltat de la case cocher peut tre vrifi ou modifi par la proprit Checked.Cettepropritfournitunbooleanquireflteltatdelacase.Silacasecocherestconfigure pourfonctionneravectroistatspossibles,enpositionnantlapropritThreeStatesurTrue,lapropritCheckState indiqueltatdelacasecocherparlintermdiairedunedesvaleursdfiniesdanslnumration.

Commepourlesautrescontrles,laproprit TextAlignpermetdemodifierlapositiondutextesurlecontrle.La proprit CheckAlign, suivant le mme principe, permet de modifier la position de la case cocher par rapport au texte. Par dfaut, le contrle CheckBox gre luimme laffichage de la coche et la modification des proprits Checked et CheckStateenfonctiondesactionsdelutilisateur.Vouspouvezreprendrelaresponsabilitdelagestiondeltatde lacasecocher,enmodifiantlaproprit AutoChecksur False.Danscecas,vousdevezgrerlvnementClicket modifierparlecode,danslagestiondecetvnement,lapropritCheckedoulapropritCheckState.Lexemplede code,ciaprs,permetdemodifierlescaractristiquesdelapolicedecaractreduncontrleTextBox. Danscetexemple,noustravaillonsaveclvnement CheckedChangedducontrle CheckBoxquinousindiquechaque changementdeltatdelacasecocher.

Private Sub chkGras_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkGras.CheckedChanged Dim style As Integer style = TxtExemple.Font.Style If chkGras.Checked Then style = style Or FontStyle.Bold Else style = style And Not FontStyle.Bold End If TxtExemple.Font = New Font(TxtExemple.Font, style) End Sub Private Sub chkItalique_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkItalique.CheckedChanged Dim style As Integer style = TxtExemple.Font.Style If chkItalique.Checked Then

ENI Editions - All rigths reserved

- 21 -

style = style Or FontStyle.Italic Else style = style And Not FontStyle.Italic End If TxtExemple.Font = New Font(TxtExemple.Font, style) End Sub Private Sub chkSouligne_CheckedChanged(ByVal sender As System.Object, As System.EventArgs) Handles chkSouligne.CheckedChanged Dim style As Integer style = TxtExemple.Font.Style If chkSouligne.Checked Then style = style Or FontStyle.Underline Else style = style And Not FontStyle.Underline End If TxtExemple.Font = New Font(TxtExemple.Font, style) End Sub ByVal e

b.LecontrleRadioButton
LecontrleRadioButtonpermetgalementdeproposerlutilisateurdiffrentesoptionsparmilesquellesilnepourra en slectionner quune seule. Comme son nom lindique, ce contrle fonctionne comme les boutons permettant de slectionner une station sur un poste de radio (Vous ne pouvez pas couter trois stations de radio en mme temps!).LespropritssontstrictementidentiquescellesdisponiblesdanslecontrleCheckBoxhormislaproprit CheckState car ce contrle ne peut avoir que deux tats et un boolean est suffisant pour reprsenter ltat du contrle. Compltonsnotreexempleprcdentenajoutantdesoptionspourlalignementdutexte :

Private Sub optGauche_CheckedChanged(ByVal sender As System.Object, By Val e As System.EventArgs) Handles optGauche.CheckedChanged If optGauche.Checked Then TxtExemple.TextAlign = HorizontalAlignment.Left End If End Sub Private Sub optDroite_CheckedChanged(ByVal sender As System.Object, By Val e As System.EventArgs) Handles optDroite.CheckedChanged If optDroite.Checked Then TxtExemple.TextAlign = HorizontalAlignment.Right End If End Sub Private Sub optCentre_CheckedChanged(ByVal sender As System.Object, By Val e As System.EventArgs) Handles optCentre.CheckedChanged If optCentre.Checked Then

- 22 -

ENI Editions - All rigths reserved

TxtExemple.TextAlign = HorizontalAlignment.Center End If Ilestconseill,lorsquelinterfacedevotreapplicationcontientdescontrlesRadioButton,quilyenaittoujoursunde slectionnlaffichageduformulaire(correspondantloptionpardfaut). Compltonsnotreapplicationenajoutantlechoixdelacouleurdutexte :

Private Sub optNoir_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optNoir.CheckedChanged TxtExemple.ForeColor = System.Drawing.Color.Black End Sub Private Sub optVert_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optVert.CheckedChanged TxtExemple.ForeColor = System.Drawing.Color.GreenYellow End Sub Private Sub optBleu_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optBleu.CheckedChanged TxtExemple.ForeColor = System.Drawing.Color.Blue End Sub Nous avons quelques soucis pour le fonctionnement de notre application, car il nest pas possible de choisir une optiondalignementetuneoptiondecouleursimultanment.Lescontrles RadioButtontantconusdetellesorte quils ne puissent pas y en avoir deux slectionns simultanment dans un mme conteneur. La solution notre problmepassedoncparlutilisationdunconteneurpourisolerlescontrleslesunsdesautres.Cestcequenous verronsaveclescontrlesGroupBoxetPanel.

c.LecontrleListBox
Lecontrle ListBoxproposelutilisateurunelistedechoixdanslaquelleilpourraenslectionnerunouplusieurs. Lecontrlegreautomatiquementlaffichagedeslmentsavec,aubesoin,lajoutdunebarrededfilementsurle contrle. Les lments affichs dans la liste peuvent tre saisis au moment de la conception, dans la fentre de proprits,oumodifisparlecode.Enrglegnrale,leslmentsdelalistesontdeschanesdecaractresmais peuvent tre nimportequeltypedobjet. Par dfaut, le contrle ListBox propose les lments sous forme de liste avecundfilementvertical.

LapropritMultiColumnpositionnesurTruepermetdavoirundfilementhorizontaldelaliste.

Danscecas,laproprit ColumnWidthindiquelalargeurdechacunedescolonnes.Laproprit IntegralHeightvite


ENI Editions - All rigths reserved - 23 -

davoirunlmentdelalistepartiellementvisible.

SicettepropritestpositionnesurTrue,lalisteseredimensionnepournafficherquedeslmentscomplets. Leslmentsdelalistesontgrssousformedecollection,parlapropritItems.Nouspouvonsdoncajouterdes lmentslalisteenutilisantlamthodeAdddelacollectionetenpassant,commeparamtre,lobjetinsrerdans laliste.Danslamajoritdescas,lobjetinsrestunechanedecaractresmaisnimportequelautretypedobjet peuttreutilis.Ilfautcependantquelobjetajoutdisposedunemthode ToStringpourpermettrelaffichagepar lecontrleListBox. Public Class couleur Public nom As String Public valeur As System.Drawing.Color Public Sub New(ByVal n As String, ByVal v As System.Drawing.Color) nom = n valeur = v End Sub Public Overrides Function toString() As String Return nom End Function End Class

... ... LstCouleurs.Items.Add(New couleur("rouge", System.Drawing.Color.Red)) LstCouleurs.Items.Add(New couleur("vert", System.Drawing.Color.Green)) LeslmentssontajoutslafindelalistesaufsilapropritSortedestpositionnesur Truecar,danscecas,les lments de la liste sont tris par ordre croissant. La mthode Insert ajoute un lment dans la liste, un emplacement prcis (le premier lment de la liste se trouve lemplacement zro). Pour insrer un lment en deuximeposition,nousutiliseronslecodeciaprs : LstCouleurs.Items.Insert(1, New couleur(Jaune,System.Drawing.Color.Yellow)) Leffacement dunlmentdelalisteseffectue avec la mthode RemoveAt en passant comme paramtre lindexde llmentsupprimer. LstCouleurs.Items.RemoveAt(0) OnpeutaussieffectuerunnettoyagecompletdelalisteaveclamthodeClear. LstCouleurs.Items.Clear() Deux mthodes sont utiles, lors de lajout dlments dans la liste, si lon veut viter les doublons. La mthode FindString recherche le premier lment de la liste qui commence par la chane de caractres spcifie. Cette fonction renvoie lindex de llment correspondant au critre ou la valeur 1, si rien nest trouv. La mme chose peuttreeffectueaveclamthode FindString Exactmais,danscecas,ilfautuneconcordanceexactedeschanes decaractres. Par dfaut, les ListBox nautorisent que la slection dun lment. La proprit SelectionMode permet de choisir quatremodesdeslection :

Lepremier(None)risquedtrefrustrantpourlutilisateurcarlaListBoxserapleinementfonctionnellemaisle clicsourisneproduiraaucuneffet.

- 24 -

ENI Editions - All rigths reserved

LoptionOneestlavaleurpardfautochaqueclicdesourisslectionnellmentetdslectionnellment prcdemmentslectionndanslaliste. Avec loption MultiSimple, chaque clic sur un lment inverse son tat. Il peut y avoir plusieurs lments slectionnsenmmetemps. La dernire option MultiExtended permet galement la slection de plusieurs lments mais offre la possibilit de slectionner plusieurs lments successifs rapidement. En slectionnant le premier, puis en utilisant la touche [Shift] et en cliquant sur le dernier, tous les lments prsents entre les deux sont galementslectionns.

Il faut bien sr rcuprer, dans le code, la ou les slections de lutilisateur. Dans le cas dune slection simple, la proprit SelectedIndex indique lindice, dans la collection Items, de llment slectionn alors que la proprit SelectedItemfournitunerfrenceverslobjetslectionndanslaliste. Pourlesslectionsmultiples,leprincipedefonctionnementestlemmemaislesinformationssontrenvoyessous formedecollection.LacollectionSelectedIndicesnousproposelalistedesindicesdeslmentsslectionns,alors que la collection SelectedItems nous donne la liste des objets slectionns. Dans les deux cas, il faut parcourir la listepourextraireleslments. Dim o As Object For Each o In ListBox1.SelectedItems System.Console.WriteLine(o) Next Lefaitdestockerdesobjetsdanslacollection Itemsnouspermetdavoiraccs,parlintermdiairedelaproprit SelectedItem,touteslespropritsdelobjet.Nouspouvonsainsi,parexemple,danslecasonousavonsutilis desobjetscouleurs,utiliserlapropritvaleur. Dans lexemple suivant, nous modifions la couleur de fond de la feuille en fonction de la slection dans la ListBox. Pourcela,nousgronslvnement SelectedIndexChangedquiseproduitchaquenouvelleslectiondelutilisateur. Private Sub LstCouleur_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged Me.BackColor = ListBox2.SelectedItem.valeur End Sub

d.LecontrleNumericUpDown
Le contrle NumericUpDown est lassociation dune zone de texte et de deux boutons. Ces deux boutons servent incrmenteroudcrmenterlavaleuraffichedanslazonedetexte.Cecontrleesttrssimpleutiliser.Lavaleur quilestchargdegrereststockedanslapropritvalue.Ellepeutvoluerentredeuxextrmesreprsentspar lesproprits Minimum et Maximum.Lepasdincrmentationestdfiniparlaproprit Increment.Toutescesvaleurs peuvent tre des valeurs dcimales. Le format daffichage peut tre modifier par la proprit DecimalsPlaces qui permetdespcifierlenombrededcimalesaffiches.Cettepropritintervientuniquementauniveaudelaffichage et ne change pas la valeur de la proprit Value. Voici comme exemple un petit morceau de code qui simule le fonctionnement dun thermostat de chauffage. Ce nest bien sr pas la temprature de votre bureau qui sera modifie par lapplication, mais la couleur de fond de la fentre du bleu pour le plus "froid" au rouge pour le plus "chaud". Private Sub NumericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Thermostat.ValueChanged Me.BackColor = Color.FromArgb(25 * (Thermostat.Value - 15), 0, 25 * (25 - Thermostat.Value)) End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.Thermostat.DecimalPlaces = 1 Me.Thermostat.Increment = 0.1 Me.Thermostat.Maximum = 25 Me.Thermostat.Minimum = 15 Me.Thermostat.Value = 15 End Sub

ENI Editions - All rigths reserved

- 25 -

e.LecontrleTrackBar
CecontrleproposeunaspectplusvisuelducontrleNumericUpDowntoutenfournissantlesmmesfonctionnalits.Il se prsente sous la forme dun potentiomtre sur lequel lon peut dplacer un curseur pour ajuster une valeur numrique. Contrairement au contrle NumericUpDown, il ny a pas daffichage de la valeur et celleci ne peut tre quunevaleurentire.LesdeuxvaleursextrmessontdfiniesparlespropritsMinimumetMaximum. Deuxpas dincrmentationsontgalementdisponiblesaveclesproprits SmallChangeet LargeChange.Laproprit SmallChangeestutilisepourincrmenteroudcrmenter lavaleurlorsdelutilisationdesflchesdedplacementdu clavier.Laproprit LargeChangeestutilisesuitelafrappedestouchespagesuivanteoupageprcdente.Sile curseurdupotentiomtreestdplaclaidedelasouris,laproprit Valuecorrespondlemplacementducurseur. Aucundesdeuxpasdincrmentation nestutilisdanscecas.Pourfaciliterlajustementdunevaleur,desrepres sontplacssurlepotentiomtre.LeurespacementestdterminparlapropritTickFrequency.

f.LecontrleDomainUpDown
Ce contrle a pratiquement le mme fonctionnement que le contrle Listbox. Il se prsente comme une zone de texte laquelle sont associs deux boutons permettant le dplacement dans une liste dlments. La principale propritdececontrleestlapropritItemsquicontientleslmentspropossdanslaliste.Lesseulesdiffrences aveclecontrle ListboxsontliesauxslectionsmultiplesquisontimpossiblespourcecontrleetlapropritWrap permettantleparcoursdelalistedemanirecirculaire.

g.LecontrleCheckedListBox
Cecontrleestuneamliorationducontrle ListBoxetdecefaitfonctionnepratiquementdelammemanire.La seulelimitationparrapportaucontrleListBoxestquilnacceptepaslesslectionsmultiples.Lvolutionparrapport aucontrleListBoxrsidedanslescasescocherprsentesdevantleslmentsdelaliste.Cescasespeuventtre coches indpendamment de la slection des lments. La rcupration des cases coches est possible par lintermdiairedelapropritCheckedItems.Cettecollectioncontienttousleslmentscochsdelaliste. For Each elt In CheckedListBox1.CheckedItems Console.WriteLine(elt.ToString) Next Une autre solution pour obtenir les lments cochs de la liste consiste parcourir la liste et tester avec la mthodeGetItemCheckedsilacasecorrespondanteestcoche. For i = 0 To CheckedListBox1.Items.Count - 1 If CheckedListBox1.GetItemChecked(i) Then Console.WriteLine(CheckedListBox1.Items(i)) End If Next Laproprit CheckOnClickdterminesilactivationouladsactivationdelacasecochersefaitsurlepremierclic dunlmentdanslaliste(true)ousiundoubleclicestncessairepourchangerltatdelacasecocher(false).

h.LecontrleComboBox
Lecontrle ComboBoxestlassociationdun contrle ListBoxetdun contrle TextBox.Lutilisateurpourra,suivantla configurationducontrle,choisirunlmentdanslalisteousaisirdutexte. LapropritDropDownStyleindiquelemodedefonctionnementdelaComboBox.

Simple Lutilisateur slectionne un lment dans la liste ou saisit du texte dans la zone de texte. La liste est affiche en permanence. DropDown

- 26 -

ENI Editions - All rigths reserved

Mmeconfiguration,maislalistenestaffichequlademandedelutilisateur. DropDownList Lutilisateur ne peut plus saisir dans la zone de texte mais simplement choisir un lment de la liste, aprs avoir demandsonaffichage. Ltatdelaffichagedelalisteestcontrlparlaproprit DroppedDown.Onpeut,parexemple,crireducodepour quelalistesoitdrouledsquelecontrlereoitlefocus. Private Sub ComboBox1_GotFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles ComboBox1.GotFocus ComboBox1.DroppedDown = True End Sub Ilnestpaspossiblederaliserdesslectionsmultiplesaveclecontrle ComboBox.Letextepeuttrercuprdans laproprit Text.Cettepropritestmisejour mme si lutilisateuraslectionnunlmentdanslaliste.Dansce cas, la proprit SelectedIndex est gale lindex de llment slectionn. Si lutilisateur a saisi du texte directement,cettepropritestgale1.

i.LecontrleTreeView
Le contrle TreeView permet la prsentation dinformations, sous forme dune arborescence identique la prsentationdesfichiersetdesdossiersdanslexplorateurdeWindows.Chaquelmentestreprsentsousforme dun n ud pouvant ventuellement contenir des n ud enfants. Chaque lment peut tre affich sous forme dveloppeourduite,parlintermdiairedusigne(plus(+)oumoins())affichenfacedechaquen ud.

La proprit Nodes contient la liste de tous les n uds de premier niveau de larborescence. Chacun dentre eux disposegalementduneproprit Nodes,quistockesontourlalistedetoussesn udsenfantsetainsidesuite jusquaudernierniveaudelarborescence.CespropritsNodessontmodifiablesaumomentdelaconception,parun diteurspcifiqueaccessibleparlafentredeproprits.

ENI Editions - All rigths reserved

- 27 -

Le bouton Ajouter une racine ajoute un lment racine la proprit Nodes du contrle TreeView. Pour chaque lment, il convient galement dindiquer son libell par la proprit Text, limage affiche sur le n ud par la propritImageIndexainsique limageaffiche,lorsquelen udestslectionndanslarborescence,parlaproprit SelectedImageIndex. Cesimagessontextraitesducontrle ImagelListquevousaurez,aupralable,associlapropritImagelistdu contrle. Ce contrle ImageList doit bien sr tre cr et rempli avant la modification des proprits du contrle TreeView. Chaque n ud possde donc une image, pour son affichage normal, et une image, pour son affichage lorsquil est slectionn.Lavaleur(Default)pourcesdeuximagesindiquequelen udnutiliserapasuneimagespcifique,mais lesimagespardfautquisontindiquesdanslespropritsImageIndexetSelectedImageIndexducontrleTreeView. Vous pouvez de cette faon utiliser des images identiques pour tous les n uds. Seuls ceux ayant un affichage particulierncessiterontlamodificationdesvaleurspardfaut. Lajoutden uddanslarborescenceparlecodeestunpetitpeupluscomplexe.Ilfautcrerunnouveaun uden instanciant la classe TreeNodeetenindiquant,danslappel du constructeur de la classe, la lgende affiche sur le n ud.Limageetlimagedeslectionsontgalementprcisersivousnevoulezpasutiliserlesvaleurspardfaut. Lacrationdunn udpeutdoncprendrelesdeuxformessuivantes. Dim noeud As TreeNode noeud = New TreeNode("Twingo") oubien Dim noeud As TreeNode noeud = New TreeNode("Twingo ", 2, 3) enindiquant,danscecas,lindexdelimagepourlaffichagenormal,suividelindexpourlaffichagelorsquelen ud seraslectionn. Il faut ensuite raccrocher ce nouveau n ud une branche de notre arborescence, en utilisant mthode Add du n udquivadevenirleparentdupetitnouveau. Ainsi,pourajouterunenfantladeuximeracinedelarborescence,nousutiliseronslecodesuivant : TreeView1.Nodes(1).Nodes.Add(noeud) Vouspouvezaussisupprimerunn udparlecode,enutilisantlamthodeRemoveAtdelacollectioncorrespondante. Parexemple,poursupprimerlaPeugeot206,nousutiliseronslecodesuivant : TreeView1.Nodes(0). Nodes.RemoveAt(0) Lorsque lon travaille avec le contrle TreeView, on a frquemment besoin de savoir sur quel lment du contrle lutilisateuracliqu(pourafficherlescaractristiquesduvhiculedansnotrecas).

- 28 -

ENI Editions - All rigths reserved

Danslvnement AfterSelect du contrle TreeView, on dispose, par lintermdiaire du paramtre e, une rfrence surlen udsurlequellutilisateuracliqu.Laproprit Textdecetlmentnouspermetdoncdidentifierlen ud ducontrleTreeViewetderagirenconsquence. Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect Select Case e.Node.Text Case "Peugeot" System.Console.WriteLine("Peugeot") Case "Renault" System.Console.WriteLine("Renault") Case "Opel" System.Console.WriteLine("Opel") End Select End Sub

j.LecontrleListView
Cecontrlefournitlapossibilitdeprsenterdesinformations,lutilisateur,dequatrefaonsdiffrentescommele permetlevoletdroitdelexplorateurdeWindows.

Comme pour le contrle TreeView, ce contrle dispose dune collection Items stockant les informations afficher. Cettecollectionpeuttreremplieparunditeurspcifiqueaccessibledepuislafentredepropritsdevb.

ENI Editions - All rigths reserved

- 29 -

Cetditeurpermetdajouteroudesupprimerdeslmentsdanslaffichageducontrleetpourchacundentreeux, la modification de la lgende par la proprit Text et de limage associe par la proprit ImageIndex. La proprit SubItems est galement une collection utilise lors de laffichage dtaill. Cette collection contient les informationsaffichesdanschacunedescolonnesdumodedtaill. LescolonnessontcresparlapropritColumnsducontrle.Unditeurspcifiqueestgalementdisponiblepourla gestiondescolonnes.

LapropritTextcorrespondautitredescolonnes.Chaquecolonneestassocieauxlmentsquiauronttsaisis danslapropritSubItems.Rsumonstoutcelaaveclaprsentationdenosvhiculesetdeleurscaractristiques. Pourchaquevhiculeafficher,ilfautinsrerunlmentdanslacollection ItemsducontrleListView.Pourchacun deceslments,lapropritSubItemsdoitcontenirlesinformationsutilisespourlaffichageenmodedtail(letype duvhicule,sonprixetsapuissance). IlfautensuiteajoutertroiscolonneslapropritColumnsducontrleListView(type,prix,puissance). Pour terminer la configuration, les proprits LargeImageList et SmallImageList indiquent respectivement les contrlesImageListoserontrcupreslesimagespourlaffichageenmodeGrandesIcnesouPetitesIcnes. LetypedeprsentationdelaffichageestmodifiableparlapropritView :

- 30 -

ENI Editions - All rigths reserved

Private Sub optGrande_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optGrande.CheckedChanged ListView1.View = View.LargeIcon End Sub Private Sub optPetites_CheckedChanged(ByVal sender As System.Object, ByVal eAs System.EventArgs) Handles optPetites.CheckedChanged ListView1.View = View.SmallIcon End Sub Private Sub optListe_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optListe.CheckedChanged ListView1.View = View.List End Sub Private Sub optDetail_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optDetail.CheckedChanged ListView1.View = View.Details End Sub

6.Lescontrlesderegroupement
a.LecontrleGroupBox
Lecontrle GroupBoxpermetleregroupementlogiqueetvisueldecontrlessurunformulaire.Lecontrlepossde une bordure et une lgende apparaissant sur la bordure haute. Ce contrle facilite galement le placement des contrles sur la fentre, car aprs avoir plac les contrles sur le GroupBox, ceuxci se dplacent en bloc avec le contrleGroupBox.IlpermetgalementdisolerlesRadioButtons,lesunsdesautres,lorsquilsdoiventfonctionnerde manireindpendante.

b.LecontrlePanel
Le contrle Panel dispose des mmes fonctionnalits que le contrle GroupBox. Il ne dispose cependant pas de proprit Text et ne permet donc pas laffichage dune lgende. Par contre, il possde une proprit BorderStyle permettant de supprimer laffichage de la bordure. Nous avons, dans ce cas, des contrles qui sont regroups logiquement sans indication visible de ce regroupement. La proprit AutoScroll du contrle permettra dafficher automatiquementdesbarresdedfilementsisasurfacenestpassuffisantepourafficherlensembledescontrles quiluisontconfis.

Pourcesdeuxcontrles,lamodificationdelaproprit Enableddsactiveragalementlensembledescontrlesqui sontplacslintrieur,sansavoirmodifiercettepropritpourchacundescontrles.

ENI Editions - All rigths reserved

- 31 -

c.LecontrleTabControl
Lecontrle TabControlafficheplusieursongletssimilairesauxintercalairesdunclasseur.Lutilisationprincipaledece contrleestlacrationdebotededialogueplusieursonglets. La proprit principale TabPages contient la liste de toutes les pages associes au contrle. Un diteur spcifique nouspermetlamanipulationdecespages.

Chaqueongletestconsidrcommeunepage,surlaquelleonpourraplacerdescontrles.Pourchacundesonglets, onretrouvedailleursbeaucoupdepropritsdjdisponiblessurlesfentres.

Linsertion de contrles seffectue en slectionnant au pralable longlet de destination, puis en dessinant les contrles dessus, de la mme manire que sur une fentre classique. Si votre bote de dialogue contient de nombreux onglets, vous pouvez choisir de les afficher sur plusieurs lignes en modifiant la proprit Multiline du contrle.
- 32 ENI Editions - All rigths reserved

Ilestgalementpossibledinterdirelutilisationdetouslescontrlesprsentssurunonglet,enmodifiantlaproprit Enableddelonglet.Parexemple,pourinterdirelutilisationdelongletCouleur : TabControl1.TabPages(1).Enabled = False Comme pour beaucoup dautrescontrles,uneproprit ImageList permet dassocierdesimagesbitmapchacun desonglets,parlintermdiairedelapropritImageIndexdechaqueonglet.

d.LecontrleSplitContainer
Ce contrle permet la cration dinterface utilisateur comparable lexplorateur Windows. Il spare la fentre en deux parties par une barre horizontale ou verticale. Cette barre peut tre dplace par lutilisateur pour redimensionnerchacunedeszonesdlimites.Ilestfrquemmentassociavecuncontrle TreeViewdanssapartie gaucheetunensembledecontrlesdanslapartiedroitepermettantlamodificationdellmentslectionndansle TreeView.CetteprsentationestparexempleutilisedansloutilMMC(MicrosoftManagementConsole),parlequelde nombreux paramtres de fonctionnement du systme sont configurables. Chaque partie du contrle est utilisable commeuncontaineurpourdautrescontrles.

La proprit Orientation indique le sens dans lequel est dcoup la surface du contrle. Le dimensionnement de chacunedesdeuxzonespeuttreinterditaveclaproprit IsSplitterFixedpositionnesur True.Ilestgalement possible dinterdire le redimensionnement dune seule zone avec la proprit FixedPanel. Dans ce cas, si les dimensionsduconteneurducontrle(lafentre)sontmodifies,uneseulezoneestredimensionne.Laproprit Orientationdterminebiensrlesensdedcoupageducontrle.

e.LecontrleFlowLayoutPanel
Lecontrle FlowLayoutPanelorganiseautomatiquementleplacementdescontrlesquevousluiconfiez.Enfonction delavaleurdelapropritFlowDirection,lescontrlesserontdisposs :
q

delagaucheversladroite deladroiteverslagauche duhautverslebas dubasverslehaut.

ENI Editions - All rigths reserved

- 33 -

Silespacedisponiblenestpassuffisantpourlajoutduncontrlesupplmentaire,lapropritWrapContentsindique siunenouvellecolonneouligneestajoute,enfonctiondelorientation dans laquelle le contrle FlowLayoutPanel travailleousilescontrlessupplmentairessonttronqus.

f.LecontrleTableLayoutPanel
Ilestparfoisimportantquunformulaireconserveunaspectcorrectlorsquilestredimensionn.Lapremiresolution nous venant lesprit consiste grer un des vnements survenant pendant le dimensionnement de la fentre, Resize, Layoutparexempleetdemodifierlespositionsetdimensionsdescontrlesenconsquence.Cettesolution esttrslourdemettreen uvreetdoittrerptesurchaqueformulaire.Lautresolution,plusefficaceestde demanderungestionnairedepositionnementdegrerlatailleetpositiondescontrlesquonluiconfie.Lecontrle TableLayoutPanelestspcialispourcetravail.Ceconteneurorganisesoncontenusousformedunegrilleunpetit peudelammemanirequuntableauenlangageHTML. IlfauttoutdabordplacersurleformulaireuncontrleTableLayoutPanel.Pardfautlecontrleestgnravecdeux lignes et deux colonnes. Pour modifier cette disposition il suffit simplement dactiver les options du contrle en cliquantsurlapetiteflchesituesurlecoinsuprieurdroitpuisenutilisantloptioncorrespondante.

ChaqueligneetcolonnepeutgalementtremodifieaprssacrationenchoisissantloptionModifierlesligneset lescolonnes. Lescontrlespeuventensuitetreplacsdanschacunedescases.Ilnepeutyavoirquunseulcontrleparcase. Le principal intrt de ce contrle se situe pendant le dimensionnement du formulaire puisque les contrles vont suivre automatiquement les modifications de taille du formulaire. Pour cela, le contrle TableLayoutPanel doit tre ancrsurlesborduresgaucheetdroiteduformulaire.

- 34 -

ENI Editions - All rigths reserved

IlenvademmepourtouslescontrlesplacsdansleTableLayoutPanel. Aprsunemodificationdelatailledelafentre,nousconservonstoujoursunaspectcorrectduformulaire.

Pour comprendre lintrt du contrle TableLayoutPanel essayez la manipulation suivante. Ajoutez un nouveau formulaire puis faites un copiercoller des deux zones de texte et des deux boutons sur ce formulaire. Excutez lapplicationetmodifiezlatailleduformulaire.Lersultatprouvebienlutilitdececontrle.

7.Lescontrlesgraphiques
a.LecontrlePictureBox
Le contrle PictureBox est utilis pour afficher des images dans une application. Plusieurs formats de fichiers sont prisenchargeparlecontrle :
q

LesfichiersBitmap(*.bmp)

ENI Editions - All rigths reserved

- 35 -

LesfichiersIcones(*.ico) LesfichiersGif(*.gif) Lesmtafichiers(*.wmf) LesfichiersJPEG(*.jpg)

Lecontenuducontrleestspcifidanslaproprit Picture.Danslafentredeproprits,vouspouvezrechercher lefichierchargerdanslecontrlegrcelabotededialogueciaprs.

LeboutonEffacerpermetderinitialiserlapropritpourliminerunfichierdjprsent. Pourmodifierlimageaffiche,parlintermdiaireducode,nousdevonschargerlecontenudufichieretlaffecterla proprit Picture qui attend une instance de la classe Image. Pour crer cette instance, nous utilisons la mthode statique FromFile de la classe Image qui prend comme paramtre le nom du fichier et qui renvoie linstance de la classeImagecre. PictureBox1.Image = Image.FromFile("titi.gif") Poureffaceruneimageparlecode,vouspouvezutiliserlecodesuivant : PictureBox1.Image = Nothing Par lintermdiaire de la proprit SizeMode, vous pouvez choisir comment le contrle et limage vont adapter leur taillerespective : normal Lesdeuxlmentsconserventleursdimensions.Limageestplacedanslecoinsuprieurgaucheducontrle. StretchImage Limageestagrandiepouroccupertoutelasurfaceducontrle.Danslecasdimagesnonvectorielles,lersultatest parfoisdcevant. AutoSize Lecontrlesadaptelatailledelimage. CenterImage Lesdeuxlmentsconserventleursdimensionsmaislimageestcentreparrapportaucontrle.
- 36 ENI Editions - All rigths reserved

Zoom Limageestagrandieourtrciepouroccupertoutelalargeurouhauteurducontrlemaislemmeratioestutilis verticalementethorizontalement.

b.LecontrleImageList
Le contrle ImageList est utilis dans une application pour servir de rservoir dimages. Il ne fournit aucune fonctionnalit pour laffichage des images, mais permet simplement leur stockage dans lapplication. De nombreux typesdefichierspeuventtreutilissdanscecontrle(bmp,ico,gif,jpg...).Toutefois,lesimagesstockesdansce contrlenesontpasforcmentdummetype.Vouspouvez,parexemple,mlangerdesfichiersbmpetdesfichiers ico. Une petite restriction tout de mme : les images issues de metafile (wmf) ne sont pas prises en compte. Ce contrlenapasdinterfacevisibleaumomentdelexcutiondoncilneserapasplacdirectementsurlafeuille,mais dansunezonerservecetypedecontrlesdanslinterfacedeconceptiongraphique. Ce contrle sera utilis en association avec tout type de contrle possdant une proprit ImageList, SmallImageList, ou LargeImageList. Pour ces contrles, une autre proprit, en gnral la proprit ImageIndex, indique limage stocke dans le contrle ImageList que vous voulez lui associer. De cette manire, vous pouvez rapidement modifier limage affiche sur un bouton en modifiant la proprit ImageIndex du bouton, afin de slectionnerlunedesimagesdisponiblesdanslecontrleImageList. La proprit Images est la proprit principale du contrle ImageList.Cest une collection dans laquelle les images sontstockes.Chaqueimageestaccessibleparlintermdiairedesonindexdanslacollection. Cettepropritpeuttremodifieaumomentdelaconceptiondelapplication,parlintermdiairedelafentrede lditeurdecollectionsdimagesaffichelorsquelonmodifielapropritImagesducontrle.

Parlintermdiairedecetditeur,onpeutnotammentajouterdesimages,ensupprimeroumodifierleurclassement dans la collection. Cependant, il ny a pas possibilit de modifier limage une fois insre dans la collection. Il faut, danscecas,lasupprimereteninsrerunenouvelleaveclecontenudufichiercorrespondant. Linsertionduneimagepeutgalementseffectuerparlintermdiaireducode,enutilisantlamthode Adddisponible danslacollectionImagesducontrle.

ENI Editions - All rigths reserved

- 37 -

ImageList1.Images.Add(Image.FromFile(dome.bmp)) De la mme faon, on peut supprimer, par le code, une image dj prsente dans la liste en utilisant la mthode RemoveAtetenindiquantlindexdellmentsupprimer. ImageList1.Images.RemoveAt(6) Lamthode Clearpermetdevidercompltementlacollection Imagessupprimantainsitouteslesimagesducontrle ImageList. Pourtouteslesimagesdelaliste,vouspouvezgalementindiquerparlintermdiairedelaproprit ColorDepthle nombredecouleursgresparlecontrle ImageList.Laproprit ImageSizeindiquelatailledesimages.Cettetaille sera identique pour toutes les images places dans le contrle. Les images insres seront ventuellement agrandiesoudiminuespoursadaptercettetaille(lesrsultatssontparfoisdcevants).

8.Lescontrlesdegestiondutemps
Deuxcontrlessontdisponiblespourlasaisiededates.Lecontrle DateTimePickerpermetlasaisiedunedatealors quelecontrleMonthCalendarautoriselasaisieduneplagededates.

a.LecontrleDateTimePicker
Cecontrleassocieunezonedetexteetuncalendrier.Ladateserasoitsaisiedirectementdanslazonedetexte (avecquandmmeunevrificationdesinformationssaisies),soitbeaucoupplusfacilementenaffichantlecalendrier enutilisantleboutonsitucotdelazonedetexte(commepouruneComboBox).

La proprit Value permet de rcuprer la date saisie ou au contraire de spcifier la date slectionne sur le calendriersonaffichage.Pardfaut,lecalendrierestinitialisavecladatedujour.

b.LecontrleMonthCalendar
Ce contrle correspond, en fait, au calendrier associ au contrle DateTimePickeravecbiensrdesfonctionnalits supplmentaires. Vous pouvez, par exemple, indiquer une liste de dates qui apparatront en gras sur le calendrier (parexemplelesjoursfris).LapropritAnnuallyBoldedDatescontientlalistedetouscesjoursspciaux.

- 38 -

ENI Editions - All rigths reserved

Laproprit MonthlyBoldedDatespermetdindiquerlesjoursquiapparatrontengraschaquemois(lejourovous avezunefacturepayerparexemple!). Lintrtprincipaldececontrleestquilpermetlaslectionduneplagededates.Laproprit MaxSelectionCount indiquelenombredejoursmaximaldelaslection(pardfaut,7).Ilresteunproblmecependant,carilnyapasde solutionsimplepourchoisiruneplagededatechevalsurplusieursmois.Lescalendriersdesmoiscomprisdansla slectiondoiventtretousvisibles,pourpermettrelaslectionduneplagesurplusieursmois.Lasolutionconsiste doncconfigurerlecontrlepourquilafficheplusieursmoissimultanment.LapropritCalendarDimensionsfixele formatducalendrier. Parexemple,uneapplicationutilisepourgrerunplanningdevacancespourraitutiliserlaconfigurationsuivante : indique les jours fris pour affichage en gras Me.Planning.AnnuallyBoldedDates = New Date() {New Date(2006, 7, 14, 0, 0, 0, 0), New Date(2006, 8, 15, 0, 0, 0, 0)} affichage de trois mois en largeur sur un mois en hauteur Me.Planning.CalendarDimensions = New System.Drawing.Size(3, 1) Me.Planning.Location = New System.Drawing.Point(40, 128) limite les possiblits de dplacement du 1 Juin au 31 Aout 2002 Me.Planning.MinDate = New Date(2006, 6, 1, 0, 0, 0, 0) Me.Planning.MaxDate = New Date(2006, 8, 31, 0, 0, 0, 0) Autorise la slection dau maximum 28 jours (4 semaines de congs) Me.Planning.MaxSelectionCount = 28 Me.Planning.Name = "Planning" Me.Planning.TabIndex = 6 Me.Planning.TodayDate = New Date(2006, 6, 4, 0, 0, 0, 0)

Vouspouvez,ensuite,obtenirlintervalleslectionnenutilisantlaproprit SelectionRangequicontientellemme une proprit Start et une proprit End. Lvnement DateSelected se dclenche lorsque lune des bornes de la slection est modifie. On peut donc lutiliser pour mettre jour une zone de texte, comme dans lexemple ci dessous. Private Sub Planning_DateSelected(ByVal sender As Object, ByVal e As
ENI Editions - All rigths reserved - 39 -

System.Windows.Forms.DateRangeEventArgs) Handles Planning.DateSelected TxtVacances.Text = "vous tes en vacances du " & Planning.Selection Range.Start & " au " & Planing.SelectionRange.End End Sub

c.LecontrleTimer
Cecontrlevanouspermettrededclencherdesvnementsintervallesrguliersdanslapplication.Cecontrle esttrssimpledutilisationpuisquilnepossdequedeuxproprits. Interval Indiqueledlaientredeuxvnements.Cedlaiestexprimenmillisecondes. Enabled Indiquesilecontrlegnredesvnementsouestinactif. chaqueexpirationdudlai,unvnementTickestdclench. Ilfautcependanttreprudentlorsdelutilisationdececontrleentenantcomptedesremarquessuivantes :
q

Silesystmeesttrscharg(parcequileffectuedesoprationsdentre/sortierseauparexemple),ilse peutquelesvnementsTicknesoientpasdclenchsrgulirement. Laprcisionducontrle TimernestpasdignedunemontreSuisse.Ilnefautpas,parexemple,incrmenter une variable sur lvnement Tick dun contrle Timer pour mesurer une dure, mais plutt se servir de lhorlogesystmecommedanslexemplecidessous :

Dim depart As Date Private Sub Form16_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load depart = Now End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Timer1.Tick Dim dure As Double calcul de la dure heure courante-heure depart et conversion en jour dure = DateDiff(DateInterval.Second, depart, Now) / (24 * 3600) conversion de la valeur en date et formatage en minutes : secondes lblDure.Text = Format(Date.FromOADate(dure), "vous travaillez depuis mm minutes ss secondes") End Sub

d.LecomposantBackGroundWorker
Il arrive parfois davoir effectuer, dans une application, des oprations relativement longues comme par exemple des chargements dimages ou des recherches sur un disque dur. Ces oprations entranent un blocage de lapplicationpendantleurexcution.Lutilisateuralimpressionquelapplicationnerpondplusetilestparfoistent demettrefinlapplicationbrutalement.Unesolutionenvisageableestdefournirlutilisateuruneinformationsur lavancement du traitement avec par exemple laffichage dune barre de progression. Mme avec cette solution lutilisateur sera oblig dattendre la fin du traitement pour pouvoir continuer utiliser lapplication. Le composant BackGroundWorkerpermetdersoudreceproblmeenexcutantcesoprationsdefaonasynchroneenarrireplan. Lecodeestexcutsurunthreaddiffrentduthreadprincipaldelapplicationquiluicontinueragrerlinterfacede lapplication. Vous devez juste indiquer au BackGroundWorker le code quil doit excuter puis appeler sa mthode RunWorkerAsync. la fin de lexcution, celuici vous prviendra en dclenchant lvnement RunWorkerCompleted. Nousallonstestercecienralisantuneapplicationcalculantcombienilyadenombrespremiersentre0etunevaleur fixe.Toutdabordvoicilecodedunefonctionvrifiantsiunnombreestpremier. Public Function estPremier(ByVal nb As Integer) As Boolean If nb < 2 Then Return False

- 40 -

ENI Editions - All rigths reserved

End If If nb = 2 Then Return True End If If nb Mod 2 = 0 Then Return False End If Dim i As Integer i = 3 Do While (i * i <= nb) If nb Mod i = 0 Then Return False Else i = i + 1 End If Loop Return True End Function Cecodeestloindtreleplusefficaceentempsdecalculpourralisercetteoprationmaiscestunpetitpeulebut recherch.Ladeuximefonctionvacalculercombienilyadenombrespremiersentre0etlavaleurpassecomme paramtre. Public Function comptePremier(ByVal maxi As Integer) Dim i, nb As Integer For i = 0 To maxi If estPremier(i) Then nb = nb + 1 End If Next Return nb End Function NousdevonsensuiteplacersurleformulaireuncontrleBackGroundWorker,deuxTextBoxetdeuxButton.Lapremire zone de texte servira pour la saisie de la valeur maximum de calcul, la deuxime pour laffichage du rsultat. Le premier bouton lancera le calcul par lintermdiaire du BackGroundWorker, le deuxime lancera le calcul directement. Pourvrifierlaractivitdelapplication,nousajoutonsgalementuncontrleTextBoxmultiligneparexemple. crivons maintenant les gestionnaires dvnements pour les deux boutons. Le premier est simple puisque nous appelonssimplementlafonctioncomptePremierenluipassantlavaleursaisiedanslazonedetexte txtNbCalculset nous affichons le rsultat dans la zone de texte txtResultat. La modification des proprits Enabled des boutons vitedelancerunedeuximefoislecalculavantqueleprcdentsoittermin. Private Sub cmdNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNormal.Click cmdNormal.Enabled = False cmdBackGround.Enabled = False txtResultat.Text = comptePremier(txtNbCalculs.Text) cmdNormal.Enabled = True cmdBackGround.Enabled = True End Sub LecodeduboutonBackGroundestaussisimple.Laseulegrossediffrencesesitueauniveaudelappeldelafonction comptePremier qui est en fait appele indirectement par la mthode RunWorkerAsync. Le paramtre pass cette mthodeseraensuiteenvoylafonctioncomptePremier. Private Sub cmdBackGround_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBackGround.Click cmdBackGround.Enabled = False cmdNormal.Enabled = False txtResultat.Text = "" bgw.RunWorkerAsync(txtNbCalculs.Text) End Sub Il nous reste encore deux choses prciser pour que lapplication soit oprationnelle. Nous devons indiquer au BackGroundWorkerquelcodeildoitexcuterentchedefond.PourcelailfautgrersonvnementDoWorkquilui,est
ENI Editions - All rigths reserved - 41 -

excutsurlethreadassociau BackGroundWorker.Linformationfournirlafonction comptePremier est obtenue parlintermdiairedelapropritArgumentduparamtre. Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork e.Result = comptePremier(e.Argument) End Sub LersultatdoittretransmisdanslapropritResult.LeBackGroundWorkernousprvientquilaterminletravailen dclenchant lvnement RunWorkerCompleted. En rponse cet vnement, nous rcuprons le rsultat par lintermdiairedelapropritResultetnouslaffichonsdanslazonedetextedersultat. Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted txtResultat.Text = e.Result cmdBackGround.Enabled = True cmdNormal.Enabled = True End Sub Il y a juste un pige viter dans lutilisation du BackGroundWorker. Le code de lvnement DoWork ne doit absolument pas accder aux autres contrles du formulaire car ils ne sont pas grs par le mme Thread. Si vous tentezdelefaire,vousobtiendrezlexceptionsuivante.

Pourtesterlefonctionnement,vousdevezsimplementfournirunevaleur(environ10000000)puislancerlecalculpar lundesdeuxboutons.Pendantquelecalculsexcutevouspouvezessayerdutiliserletroisimecontrle TextBox. Danslecasdutraitementparle BackGroundWorker,cecontrleestutilisableencoursdecalcul.Lappeldirectdela fonctioncomptePremierbloquelinterfacedelapplicationpendantsonexcution.

- 42 -

ENI Editions - All rigths reserved

Lhritagedeformulaires
Vouspouvezparfoisavoirbesoinquunprojetappelleunformulairesimilaireunautrequevousavezdjcrdans unautreprojet.Vouspouvezgalementcrerunformulairedebasecontenantdesparamtrestelquunarrireplan statiqueouuneprsentationparticuliredescontrlesquevouscomptezrutiliserplusieursfoisdansunprojet,chaque nouvelleversioncontenantdesmodificationsparrapportaumodledorigine.Lhritagedeformulairevouspermetde crerunformulairedebasepuisdenhriterpourpersonnaliserlesnouvellesversionsainsicres. Pourpouvoircrerunformulairehrit,ilfautbiensraupralableconcevoirleformulairedebase.Pourquelhritage de formulaire soit accessible, le projet contenant le formulaire de base doit obligatoirement avoir t compil. Lajout dun formulaire hrit est ralisable par lutilisation de la bote de dialogue classique dajoutdlment un projet en choisissantloptionFormulairehrit.

Nommezensuitevotrenouveauformulaireetcliquezsurlebouton Ajouter.Labotededialogue Slecteurdhritage souvre et si le projet actuel contient dj des formulaires, ils sont affichs dans cette bote de dialogue. Pour hriter dunformulairedisponibledansunautreassembly,cliquezsurleboutonParcouriretslectionnezlefichier(.exeou.dll) contenant le formulaire de base puis validez votre choix avec le bouton OK. Le nouveau formulaire est alors ajout votreprojet.Surceformulaire,lescontrlesprovenantdelhritagesontmarqusgrceausymbole . LapropritModifiersdechacundescontrlesduformulairedebasedterminelesactionspossiblessurcescontrles dansunformulairehrit.Lesrglesstandarddelhritagesontappliques.Letableausuivantrsumecesrglesde visibilit.
q

Public : les contrles peuvent tre redimensionns et dplacs. Le contrle est accessible en interne par la classequiledclareetenexterneparlesautresclasses. Protected : lescontrlespeuventtreredimensionnsetdplacs.Lecontrleestaccessibleeninterneparla classequiledclareetpartouteclassehritantdelaclasseparente,maisilnestpasaccessibleauxclasses externes. Protected Friend : les contrles peuvent tre redimensionns et dplacs. Peuvent tre accessibles en interne par la classe qui les dclare, par toute classe qui hrite de la classe parente, et par dautres membres de lassemblyquilescontient. Friend : touslesaspectsducontrlesontconsidrscommeaccessiblesseulementenlecture.Vousnepouvez pas le dplacer ou le redimensionner, ni modifier ses proprits. Le contrle est accessible uniquement par dautresmembresdelassemblyquilecontient. Private : touslesaspectsducontrlesontconsidrscommeaccessiblesseulementenlecture.Vousnepouvez pasledplacerouleredimensionner,nimodifiersesproprits.Lecontrlenestaccessiblequedepuislaclasse quiledclare.

ENI Editions - All rigths reserved

- 1-

Dautrescontrlespeuventbiensrtreajoutssurleformulairehritpourpersonnalisersonaspect.Sileformulaire debaseestmodifiaprssonutilisationdansunerelationdhritage,lesmodificationssontpropagesauxformulaires hritslorsdelacompilationduformulairedebase.

- 2-

ENI Editions - All rigths reserved

Principedefonctionnementdunebasededonnes
Lesbasesdedonnessontdevenuesdeslmentsincontournablesdelamajoritdesapplications.Ellessesubstituent lutilisationdefichiersgrsparledveloppeurluimme.Cetapportpermetungaindeproductivitimportantlorsdu dveloppementetuneamliorationsignificativedesperformancesdesapplications.Ellesfacilitentgalementlepartage dinformations entre utilisateurs. Pour pouvoir utiliser une base de donnes, vous devez connatre un minimum de vocabulairelicettetechnologie.

1.Terminologie
Danslecontextedesbasesdedonnes,lestermessuivantssontfrquemmentutiliss : Basededonnesrelationnelle Une base de donne relationnelle est un type de base de donnes qui utilise des tables pour le stockage des informations. Elles utilisent des valeurs issues de deux tables, pour associer les donnes dune table aux donnes dune autre table. En rgle gnrale, dans une base de donnes relationnelle, les informations ne sont stockes quuneseulefois. Table Unetableestuncomposantdunebasededonnesquistockelesinformationsdansdesenregistrements(lignes)et dansdeschamps(colonnes).Lesinformationssont,engnral,regroupesparcatgorieauniveaudunetable.Par exemple,nousauronslatabledesClients,desProduitsoudescommandes. Enregistrement Lenregistrement est lensemble des informations relatives un lment dune table. Les enregistrements sont les quivalents,auniveaulogique,deslignesdunetable.Parexemple,unenregistrementdelatableClientscontientles caractristiquesdunclientparticulier. Champ Un enregistrement est compos de plusieurs champs. Chaque champ dun enregistrement contient une seule information sur lenregistrement. Par exemple, un enregistrement Client peut contenir les champs CodeClient, Nom, Prnom... Clprimaire Uneclprimaireestutilisepouridentifier,demanireunique,chaquelignedunetable.Laclprimaireestunchamp ouunecombinaisondechampsdontlavaleurestuniquedanslatable.Parexemple,lechamp CodeClientestlacl primairedelatableClient.Ilnepeutpasyavoirdeuxclientsayantlemmecode. Cltrangre Une cl trangre reprsente un ou plusieurs champs dune table, qui font rfrence aux champs de la cl primaire duneautretable.Lesclstrangresindiquentlamaniredontlestablessontlies. Relation Unerelationestuneassociationtablieentredeschampscommunsdansdeuxtables.Unerelationpeuttredeun un,deunplusieursoudeplusieursplusieurs.Grceauxrelations,lesrsultatsderequtespeuventcontenirdes donnesissuesdeplusieurstables.Unerelationdeunplusieursentrelatable Clientetlatable Commandepermet unerequtederenvoyertouteslescommandescorrespondantunclient.

2.LelangageSQL
AvantdepouvoircrireuneapplicationVisualBasicutilisantdesdonnes,vousdeveztrefamiliarisaveclelangage SQL (Structured Query Language). Ce langage permet de dialoguer avec la base de donnes. Il existe diffrentes versions du langage SQL, en fonction de la base de donnes utilise. Cependant, SQL dispose galement dune syntaxelmentaire,normalise,indpendantedetoutesbasesdedonnes.

ENI Editions - All rigths reserved

- 1-

a.Recherchedinformations
LelangageSQLpermetdespcifierlesenregistrementsextraireainsiquelordredanslequelvoussouhaitezles extraire. Vous pouvez crer une instruction SQL qui extrait des informations de plusieurs tables simultanment, ou creruneinstructionquiextraituniquementunenregistrementspcifique. LinstructionSELECT est utilise pour renvoyer des champs spcifiques dune ou de plusieurs tables de la base de donnes. LinstructionsuivanterenvoielalistedesnomsetprnomsdetouslesenregistrementsdelatableClient : SELECT Nom,Prenom FROM Client Vouspouvezutiliserlesymbole*laplacedelalistedeschampspourlesquelsvoussouhaitezlavaleur : SELECT * FROM Client Vous pouvez limiter le nombre denregistrements slectionns, en utilisant un ou plusieurs champs pour filtrer le rsultatdelarequte.Diffrentesclausessontdisponiblespourexcutercefiltrage. ClauseWHERE Cetteclausepermetdespcifierlalistedesconditions,quedevrontremplirlesenregistrementspourfairepartiedes rsultatsretourns.LexemplesuivantpermetderetrouvertouslesclientshabitantNantes : SELECT * FROM Client WHERE Ville=Nantes

L asyntaxedecetteclausencessitelutilisationdesimplecotepourladlimitationdeschanesdecaractres.

ClauseWHERE...IN Vous pouvez utiliser la clause WHERE ... IN pour renvoyer tous les enregistrements qui rpondent une liste de critres.Parexemple,vouspouvezrecherchertouslesclientshabitantenFranceouenEspagne : SELECT * FROM Client WHERE Pays IN (France,Espagne) ClauseWHERE...BETWEEN Vous pouvez galement renvoyer une slection denregistrements qui se situent entre deux critres spcifis. La requtesuivantepermetdercuprerlalistedescommandespassesaumoisdenovembre2005 : SELECT * from Commandes WHERE DateCommande BETWEEN 01/11/05 AND 30/11/05 ClauseWHERE...LIKE Vous pouvez utiliser la clause WHERE ... LIKE pour renvoyer tous les enregistrements pour lesquels il existe une conditionparticulirepourunchampdonn.Parexemple,lasyntaxesuivanteslectionnetouslesclientsdontlenom commenceparund : SELECT * FROM Client WHERE Nom LIKE d%

Danscetteinstruction,lesymbole%estutilispourremplacerunesquencedecaractresquelconque.

ClauseORDERBY... Vous pouvez utiliser la clause ORDER BY pour renvoyer les enregistrements dans un ordre particulier. Loption ASC indiqueunordrecroissant,loptionDESCindiqueunordredcroissant.Plusieurschampspeuventtrespcifiscomme critredetri.Ilssontanalyssdelagaucheversladroite.Encasdgalitsurlavaleurdunchamp,lechampsuivant estutilis : SELECT * FROM Client ORDER BY Nom DESC,Prenom ASC

- 2-

ENI Editions - All rigths reserved

ette instruction retourne les clients tris par ordre dcroissant sur le nom et, en cas dgalit, par ordre C croissantsurleprnom.

b.Ajoutdinformations
Lacrationdenregistrementsdansunetableseffectueparlacommande INSERT INTO.Vousdevezindiquerlatable danslaquellevoussouhaitezinsreruneligne,lalistedeschampspourlesquelsvousspcifiezunevaleuret,enfin, lalistedesvaleurscorrespondantes.Lasyntaxecomplteestdonclasuivante : INSERT INTO client (codeClient,nom,prenom) VALUES (1000,Dupond,Pierre) Lorsdelajoutdecenouveauclient,seulslenometleprnomserontrenseignsdanslatable.Lesautreschamps prendrontlavaleur NULL.Silalistedeschampsnestpasindique,linstruction insertexigequevousspcifiezune valeurpourchaquechampdelatable.Voustesdoncobligsdutiliserlemotcl NULLpourindiquerque,pourun champ particulier, il ny a pas dinformation. Si la table Client est compose de cinq champs (codeClient,nom,prenom,adresse,pays),linstructionprcdentepeuttrecriteaveclasyntaxesuivante : INSERT INTO client VALUES (1000,Dupond,Pierre,NULL,NULL)

D anscecas,lesdeuxmotsclsNULLsontobligatoirespourleschampsadresseetpays.

c.Misejourdinformations
Lamodificationdeschampspourdesenregistrementsexistants,seffectue par linstructionUPDATE. Cette instruction peutmettrejourplusieurschampsdeplusieursenregistrementsdunetable,partirdesexpressionsquiluisont fournies.Pourcela,vousdevezfournirlenomdelatablemettrejourainsiquelavaleuraffecterauxdiffrents champs.Lalisteestindiqueparlemotcl SETsuividelaffectationdelanouvellevaleurauxdiffrentschamps.Si vousvoulezquelesmodificationsneportentquesurunensemblelimitdenregistrements,vousdevezspcifierla clause WHERE,afindelimiterlaportedelamisejour.Siaucuneclause WHEREnestindique,lamodificationsefera surlensembledesenregistrementsdelatable. Parexemple,pourmodifierladressedunclientparticulier,vouspouvezutiliserlinstructionsuivante : UPDATE Client SET adresse= 4 rue de Paris 44000 Nantes WHERE codeClient=1000 Si la modification porte sur lensemble des enregistrements de la table, la clause WHERE est inutile. Par exemple, si voussouhaitezaugmenterleprixunitairedetousvosarticles,vouspouvezutiliserlinstructionsuivante : UPDATE CATALOGUE SET prixUnitaire=prixUnitaire*1.1

d.Suppressiondinformations
LinstructionDELETE FROMpermetdesupprimerunouplusieursenregistrementsdunetable.Vousdevez,auminimum, fournirlenomdelatablesurlaquellevaseffectuerlasuppression.Sivousnindiquezpasplusdeprcisions,toutes les lignes de la table sont supprimes. En gnral, une clause WHERE est ajoute pour limiter ltendue de la suppression.LacommandesuivanteeffacetouslesenregistrementsdelatableClient : DELETE FROM Client Lacommandesuivanteestmoinsradicaleetnesupprimequunenregistrementparticulier : DELETE FROM Client WHERE codeClient=1000 Le langage SQL est, bien sr, beaucoup plus complet que cela et ne se rsume pas ces cinq instructions. Nanmoins, elles sont suffisantes pour la manipulation de donnes partir de Visual Basic. Si vous souhaitez approfondirlapprentissagedulangageSQL,consultezundesouvragesdisponiblesdanslammecollectiontraitant decesujetdemanirepluspousse.

ENI Editions - All rigths reserved

- 3-

PrsentationdADO.NET
ADO.NET est un ensemble de classes, dinterfaces, de structures et dnumrations permettant la manipulation des donnes. Les diffrents composantsdADO.NETpermettentdesparerlaccsauxdonnesdelamanipulationdesdonnes.ADO.NETfacilitegalementlutilisationdu langageXML,enpermettantlaconversiondedonnesrelationnellesauformatXMLoulimportationdedonnesauxformatsXMLdansunmodle relationnel.DeuxmodesdefonctionnementsontdisponiblesdansADO.NET :
q

lemodeconnect lemodenonconnect.

1.Modeconnect
Dans un environnement connect, lapplication ou lutilisateur est en permanence connect la source de donnes. Depuis les dbuts de linformatique,ctaitleseulmodedisponible.Cemodeprsentecertainsavantagesdanssonfonctionnement :
q

Ilestfacilegrer : laconnexionestraliseaudbutdelapplicationpuisestcoupesafermeture. Laccs concurrentiel est plus facile contrler : comme tous les utilisateurs sont connects en permanence, il est plus facile de contrlerlequeltravaillesurlesdonnes. Lesdonnessontjour : toujoursgrcelaconnexionpermanenteauxdonnes,ilestfacilementenvisageabledeprvenirtoutesles applicationsutilisantlesdonnesquedesmodificationsviennentdytreapportes.

Parcontre,certainsinconvnientsviennentunpeunoircirletableau :
q

La connexion rseau doit tre constamment maintenue : en cas dutilisation de lappli cation sur un ordinateur portable, laccs au rseaurisquedenepastredisponibleenpermanence. Il y a un risque de gaspillage de ressources sur le serveur : au moment de ltablis sement dune connexion entre une application cliente et un serveur, des ressources sont alloues sur le serveur pour la gestion de cette connexion. Ces ressources restent monopolisesparlaconnexion,mmesiaucuneinformationnetransiteparcetteconnexion.

Cependant,danscertainessituations,lutilisationdunmodeconnectestincontournable.Cestlecas,parexemple,desapplicationseffectuant destraitementsentempsrel.

2.Modenonconnect
Unmodenonconnectsignifiequuneapplicationouunutilisateurnestpasconstammentconnectunesourcededonnes.Lesapplications Internetutilisentsouventcemodedefonctionnement.Laconnexionauxdonnesestouverte,lesdonnessontextraitespuislaconnexionest coupe.Lutilisateur travaille avec les donnes, partir de son navigateur, et la connexion est nouveau ouverte pour la mise jour de la sourcededonnesoulobtentiondautresdonnes.Lesutilisateurs,travaillantsurdesordinateursportables,sontgalementlesprincipaux utilisateursdenvironnementsdconnects.Unmdecinpeut,parexemplelematin,chargerlesdossiersmdicauxdespatientsquilvavisiter dans la journe, puis le soir, fusionner les modifications dans la base de donnes. Les avantages dun environnement dconnect sont les suivants :
q

Lesconnexionssontutilisespendantlapluscourtedurepossible.Decettefaon,unpetitnombredeconnexionsdisponiblessurun serveursuffisentpourdenombreuxutilisateurs. Un environnement dconnect amliore lvolutivit et les performances dune appli cation, en optimisant la disponibilit des connexions.

Lenvironnementdconnectcomportecependantquelquesinconvnients :
q

Les donnes disponibles dans lapplication ne sont pas toujours jour. Par exemple, dans le cas de notre mdecin, si sa secrtaire ajoutedesrsultatsdanalyseaprsquilaitrcuprlesdossiersmdicauxdecespatients,ilnepourrapasdisposerimmdiatement desinformations. Desconflitspeuventparfoissurvenirlorsdelamisejourdesinformationsdanslabase.Cetypedeproblmesdoittreprisencharge lorsdelaconceptiondelapplication.Diffrentesapprochessontdisponiblespourlagestiondecesconflits :
q

Autoriserlaprdominancedesmisesjour,lesplusrcentes,encrasantlesdonnesdjprsentesdanslabase. Autoriserlaprdominancedesmisesjour,lesplusanciennes,enabandonnantlesnouvellesmisesjour. Prvoirducodepermettantlutilisateurdechoisircequilsouhaitefaireencasdeconflitlorsdunemisejour.

3.ArchitecturedADO.NET

ENI Editions - All rigths reserved

- 1-

Le but dADO.NET est de fournir un ensemble de classes permettant laccs aux bases de donnes. Deux types de composants sont disponibles :
q

Lesfournisseursdedonnes,spcifiquesuntypedebasededonnes.Ilsassurentlacommunicationavecuntypespcifiquedebase dedonnesetpermettentlamanipulationdesdonnesdirectementdanslabaseenmodeconnect.Lespossibilitssontcependant limitespuisqueuniquementunaccsenlectureseuleestdisponible. Les classes de manipulation des donnes, indpendantes du type de base de donnes, voire utilisables sans base de donnes, permettentlamanipulationlocaledesdonnesdanslapplication.

4.Lesfournisseursdedonnes
Les fournisseurs de donnes servent de passerelle entre une application et une base de donnes. Ils sont utiliss pour rcuprer les informations, partir de la base de donnes, et transfrer les changements effectus sur les donnes par lapplication vers la base de donnes.QuatrefournisseursdedonnessontdisponiblesdansleFramework.NET :
q

lefournisseurpourSQLServer lefournisseurpourOLEDB lefournisseurpourODBC lefournisseurpourOracle.

Ilsproposenttouslimplmentationdequatreclasses,debase,ncessairespourledialogueaveclabasededonnes :
q

LaclasseConnectionpermetdtabliruneconnexionavecleserveurdebasededonnes. LaclasseCommandpermetdedemanderlexcutionduneinstructionoudunensembledinstructionsSQLunserveur. La classe DataReader procure un accs en lecture seule et un dfilement, en avant seulement, aux donnes, (mme principe quun fichiersquenciel). LaclasseDataAdapterestutilisepourassurerletransfertdesdonnesversunsystmedecachelocallapplication(leDataSet)et mettrejourlabasededonnes,enfonctiondesmodificationseffectueslocalementdansleDataSet.

Quelquesautresclassessontdisponiblespour,parexemple,lagestiondestransactions,oulepassagedeparamtresuneinstructionSQL.

a.SQLServer
LefournisseurdedonnespourSQLServerutiliseunprotocolenatifpourdialogueravecleserveurdebasededonnes.Ilestgalementpeu consommateurderessourcespuisquilaccdeauserveur,sansutiliserdecouchelogiciellesupplmentairetellequeOLEDBouODBC.Ilest utilisableavecSQLServerpartirdelaversion7.Touteslesclassesdecefournisseurdedonnessontdisponiblesdanslespacedenom System.Data.SqlClient.Danscetespacedenom,lenomdechaqueclasseestprfixpar Sql.Ainsi,laclassepermettantdeseconnecter unserveurSQLServersappelleSqlConnection.

b.OLEDB
Le fournisseur OLE DB utilise la couche logicielle OLE DB pour communiquer avec le serveur de base de donnes. Vous pouvez utiliser ce fournisseurpourdialogueravecunebasededonnespourlaquelleilnexistepasdefournisseurspcifique,maispourlaquellelepiloteOLE DB est disponible. Avec cette solution, le fournisseur ne contacte pas le serveur directement mais passe par le pilote OLE DB pour communiquer.Pourquecettecommunicationsoitpossible,lepilotedoitimplmentercertainesinterfaces.Touteslesclassessontdisponibles dans lespace de nom System.Data.OleDb. Les noms de classe de cet espace de nom sont prfixs par OleDb. Pour pouvoir fonctionner correctement,cefournisseurexigelinstallationdeMDAC2.6surlamachine(MicrosoftDataAccessComponents).

c.ODBC
LefournisseurODBCutiliseunpiloteODBCnatifpourcommuniqueravecleserveurdebasededonnes.CefournisseurutiliseunpiloteODBC natif pour la communication. Le principe est identique celui utilis pour le fournisseur OLE DB. Toutes les classes sont disponibles dans lespacedenomSystem.Data.Odbc.Lesnomsdeclassessontprfixspar Odbc.Pourpouvoirfonctionnercorrectement,cefournisseurexige linstallationsurlamachinedeMDAC2.6(MicrosoftDataAccessComponents).

d.ORACLE
LefournisseurpourOraclepermetlaconnexionunesourcededonnesOracle,traverslesoutilsclientOracle.Cesoutilsclientdoiventtre installssurlesystmepourpouvoirseconnecterunebaseOracle.Laversion8.1.7ousuprieureestexige.Lesclassessontlocalises dans lespace de nom System.Data.OracleClient et utilisent Oracle comme prfixe de nom. Pour utiliser le fournisseur pour Oracle, vous devrezgalementajouterunerfrenceverslabibliothqueSystem.Data.OracleClient.dll.

- 2-

ENI Editions - All rigths reserved

5.Rechercherlesfournisseursdisponibles
Pourassurerlebonfonctionnementduneapplicationutilisantunaccsauxdonnes,les fournisseursdedonnesdoiventtredisponiblessur le poste client. La classe DbProviderFactories propose la mthode partage GetFactoryClasses, permettant dnumrer les fournisseurs de donnesdisponiblessurleposte.Lexempledecodesuivantaffichelenom,ladescriptionetlespacedenomracinedechacundesfournisseurs installssurlepostedetravail. Imports System.Data Imports System.Data.Common Module ListeProviders Sub Main() Dim resultat As DataTable rcupration de la liste des fournisseurs dans une dataTable resultat = DbProviderFactories.GetFactoryClasses() Dim colonne As DataColumn Dim ligne As DataRow parcours des colonnes de la dataTable et affichage du nom For Each colonne In resultat.Columns Console.Write(colonne.ColumnName & vbTab) Next Console.WriteLine() parcours de la dataTable et affichage de chaque ligne For Each ligne In resultat.Rows parcours de chaque ligne et affichage de chaque champ For Each colonne In resultat.Columns Console.Write(ligne(colonne.ColumnName) & vbTab) Next Console.WriteLine() Next Console.ReadLine() Stop End Sub End Module

6.Compatibilitducode
Enfonctiondufournisseurutilis,vousdevezimporterlespace de nom correspondant pour avoir un accs facile aux classes du fournisseur. Cependant,commelesclassesdechacundesfournisseursneportentpaslemmenom,votrecodeseraspcifiqueuntypedefournisseur.Il esttoutefoispossibledcrireducodepratiquementindpendantdutypedefournisseur.Pourcela,aulieudutiliserlesclassesspcifiques chacundesfournisseurs,vouspouvezutilisercommetypededonneslesinterfacesquellesimplmentent.Lutilisationduneclassespcifique nest indispensable que pour la cration de la connexion. Une fois que la connexion est cre, vous pouvez travailler uniquement avec des interfaces.LexempledecodesuivantlistelecontenudunetabledunebaseSQLServer,enutilisantuniquementdesinterfaces. Module accesBdParInterfaces Dim ctn As IDbConnection Public Sub main() cest la seule ligne de code spcifique un fournisseur ctn = New System.Data.SqlClient.SqlConnection("Data Source=TG;Initial Catalog=Northwind;Integrated Security=True") Dim cmd As IDbCommand cmd = ctn.CreateCommand ctn.Open() cmd.CommandText = "select * from products Dim lecteur As IDataReader lecteur = cmd.ExecuteReader Console.WriteLine("Lecture des donnes dans une base SQL Server") Do While lecteur.Read Console.WriteLine("numro : {0} nom produit : {1}", lecteur.GetInt32(0), lecteur.GetString(1)) Loop End Sub End Module Lexcutiondececodeaffichelersultatsuivant : Lecture des numro : 56 numro : 57 numro : 58 numro : 59 numro : 60 numro : 61 numro : 62 donnes dans une base SQL Server nom produit : Gnocchi di nonna Alice nom produit : Ravioli Angelo nom produit : Escargots de Bourgogne nom produit : Raclette Courdavault nom produit : Camembert Pierrot nom produit : Sirop derable nom produit : Tarte au sucre

Sicetteapplicationdoitensuitemigrerversunautretypedebasededonnes,ilnyaquelaligneconcernantlaconnexionmodifier.Siles donnessontmaintenantdisponiblesdansunebaseAccess,lacrationdelaconnexionprendalorslaformesuivante : ctn = New System.Data.OleDb.OleDbConnection (Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Documents and Settings\tgroussard\Mes documents\livre vb.net 2005\ accs aux bases de donnes\exemples\NWIND.MDB)

ENI Editions - All rigths reserved

- 3-

Lexcutionducodeainsimodifignrebienlemmersultat : Lecture des numro : 56 numro : 57 numro : 58 numro : 59 numro : 60 numro : 61 numro : 62 donnes dans une base Access nom produit : Gnocchi di nonna Alice nom produit : Ravioli Angelo nom produit : Escargots de Bourgogne nom produit : Raclette Courdavault nom produit : Camembert Pierrot nom produit : Sirop derable nom produit : Tarte au sucre

Ilconvient,parcontre,dtreprudentetdenepasutiliserdinstructionsSQLspcifiquesuntypedebasededonnesparticulier.Pourfaciliter larelectureducode,ilestprfrablederegroupertouteslesinstructionsSQLsousformedeconstantesdetypechanedecaractresaudbut de chaque module. Avec cette technique, vous naurez pas chercher des instructions SQL au milieu de centaines de lignes de code Visual Basic.IlconvientdtregalementprudentlorsdelutilisationdeparamtresdansuneinstructionSQL.LefournisseurpourSQLServerutilise desparamtresnommsdonclordredecrationdesparamtresnapasdimportance. Le fournisseur pour OLE DB utilise la position des paramtres dans linstruction SQL, pour le remplacement lors de lexcution. Lordre de la crationdesparamtresestdonc,danscecas,capitalpourlebonfonctionnementdelinstruction.

- 4-

ENI Editions - All rigths reserved

Utilisationdumodeconnect
Danscechapitre,nousallonsaborderlesoprationspouvanttreexcutessurunebasededonnes,enutilisantle modeconnect.Certainesnotionstudiesdanscechapitreserontgalementutilespourlefonctionnementenmode dconnect. Pour tester les diffrentes fonctionnalits tudies dans ce chapitre, nous utiliserons un serveur SQL Server 2000. La base de donnes utilise sera la base Northwind qui est cre par dfaut linstallation du serveur. Unepartiedelastructuredelabaseestdisponiblesurleschmacidessous.

1.Connexionunebase
Pourpouvoirtravailleravecunserveurdebasededonnes,uneapplicationdoittabliruneconnexionrseauavecle serveur. La classe SqlConnection est capable de grer une connexion vers un serveur SQL Server version 7.0 ou ultrieure.Commepourtoutobjet,nousdevonsenpremierlieudclarerunevariable. Dim ctn As System.Data.SqlClient.SqlConnection Puis, nous devons crer linstance de la classe et linitialiserenappelantunconstructeur.Linitialisation va consister essentiellement indiquer les paramtres utiliss pour tablir la connexion avec le serveur. Ces paramtres sont dfinissousformedunechanedecaractres.Ilspeuventtreindiquslorsdelappelduconstructeuroumodifispar lasuiteparlapropritConnectionString.

a.Chanedeconnexion
Leformatstandarddunechanedeconnexionestconstitudunesriedecouplesmotcl/valeursparspardes pointsvirgules.Lesigne=estutilispourlaffectationdunevaleurunmotcl.Lanalysedelachaneesteffectue lors de laffectation de la chane la proprit ConnectionString. Les valeurs associes aux mots cls sont alors extraites et affectes aux diffrentes proprits de la connexion. Si une erreur de syntaxe est trouve alors une exception est gnre immdiatement et aucune proprit nest modifie. Par contre, certaines proprits ne pourront tre contrles que lors de louverture de la connexion. Cest alors ce moment quune exception sera dclenche si la chane de connexion contient une erreur. La chane de connexion ne peut tre modifie que si la connexionestferme.Lesmotsclssuivantssontdisponiblespourunechanedeconnexion : ConnectTimeout Dure en secondes pendant laquelle lapplication attendra une rponse du serveur sa demande de connexion. Passcedlai,uneexceptionestdclenche.

ENI Editions - All rigths reserved

- 1-

DataSource Nom ou adresse rseau du serveur vers lequel est tablie la connexion. Le numro du port peut tre spcifi la suitedunomoudeladresserseau.Silnestpasindiqu,lenumrodeportestgal1433. InitialCatalog Nomdelabasesurlaquelledoitseffectuerlaconnexion. IntegratedSecurity Sicettevaleurestpositionnesur falsealorsunnomdutilisateuretunmotdepassedoiventtrefournisdansla chanedeconnexion.Sinon,lecompteWindowsdelutilisateurestutilispourlauthentification. PersistSecurityInfo Si cette valeur est positionne sur true, alors le nom de lutilisateur et son mot de passe sont accessibles par la connexion. Pour des raisons de scurit, cette valeur doit tre positionne sur false. Cestdailleurs le cas si vous nindiquezriendansvotrechanedeconnexion. Pwd MotdepasseassociaucompteSQLServerutilispourlaconnexion.Silnyapasdemotdepasseassociun compte,cetteinformationpeuttreomisedanslachanedeconnexion. UserID NomducompteSQLServerutilispourlaconnexion. ConnectionLifeTime Indiqueladuredevieduneconnexiondansunpooldeconnexions.Unevaleurgalezroindiqueunedurede vieinfinie. ConnectionReset Indiquesilaconnexionestrinitialiselorsdesaremisedanslepool. MaxPoolSize Nombremaximumdeconnexionsdanslepool. MinPoolSize Nombreminimumdeconnexionsdanslepool. Pooling Indiquesilaconnexionpeuttreextraitedunpooldeconnexion. Unechanedeconnexionprenddonclaformeminimalesuivante : ctn.ConnectionString = "Data Source=Minerve;Initial Catalog=Northwind;Integrated Security=true"

b.Pooldeconnexions
Les pools de connexions permettent damliorer les performances dune application, en vitant la cration de connexionssupplmentaires.Lorsquuneconnexionestouverte,unpooldeconnexionsestcrensebasantsurun algorithme bas, luimme sur la chane de connexion. Chaque pool est donc associ une chane de connexion particulire. Si une nouvelle connexion est ouverte et quil nexiste pas de pool correspondant exactement sa chanedeconnexion,alorsunnouveaupoolestcr.Lespoolsdeconnexionsainsicrsexisterontjusqulafinde lapplication.Lorsdelacrationdupool,dautresconnexionspeuventtrecresautomatiquementpoursatisfairela

- 2-

ENI Editions - All rigths reserved

valeurMin Pool Sizeindiquedanslachanedeconnexion.Dautresconnexionspourront,parlasuite,treajoutes aupooljusquatteindrelavaleur Max Pool Sizedelachanedeconnexion.Lorsquuneconnexionestrequise,elle peuttreobtenuepartirdunpooldeconnexion(silenexisteuncorrespondantexactementauxcaractristiques delaconnexiondemande).Ilfautbiensrquelepoolencontienneunedisponibleetactive. Silenombremaximumdeconnexiondanslepoolestatteint,lademandeestmiseenfiledattentejusqucequune connexionsoitnouveaudisponible.Uneconnexionestremiseladispositiondupool,lorsdesafermetureoulors delappeldelamthodeDisposesurlaconnexion.Pourcetteraison,ilestrecommanddefermerexplicitementles connexionslorsquellesnesontplusutilisesdanslapplication.Lesconnexionssontretiresdupoollorsqueceluici dtectequelaconnexionnapastutilisedepuisuncertaintemps,indiquparlavaleur ConnectionLifeTimedela chane de connexion. Elles sont galement retires du pool, sil dtecte que la connexion avec le serveur a t interrompue.

c.vnementsdeconnexion
La classe SQLConnection propose deux vnements vous permettant dtre prvenu lorsque ltat de la connexion changeouquunmessagedinformationestenvoypar le serveur.LvnementStateChangedestdclenchlorsdun changement dtat de la connexion. Le gestionnaire de cet vnement reoit un paramtre de type StateChangeEventArg permettant dobtenir, avec la proprit CurrentState, ltat actuel de la connexion et avec la proprit OriginalState,ltatdelaconnexionavantledclenchementdelvnement.Pourtesterlavaleurdeces deuxproprits,vouspouvezutiliserlnumrationConnectionState.

Lvnement InfoMessage est dclench lorsque le serveur vous informe dune situation, anormale, mais qui ne justifiepasledclenchementduneexception(svritdumessageinfrieure10).Legestionnairedvnements associreoitunparamtredetypeInfoMessageEventArgs.ParlapropritErrorsdeceparamtre,vousavezaccs des objets SqlErrors correspondant aux informations envoyes par le serveur. Le code suivant affiche, sur la console,lesmessagesdinformationsenprovenanceduserveur. Private Sub ctn_InfoMessage(ByVal sender As Object, ByVal e As System.Data. SqlClient.SqlInfoMessageEventArgs) Handles ctn.InfoMessage Dim info As SqlClient.SqlError For Each info In e.Errors Console.WriteLine(info.Message) Next End Sub

2.Excutiondunecommande
Aprsavoirtabliuneconnexionversunserveurdebasededonnes,vouspouvezluitransmettredesinstructions SQL. La classeSqlCommand est utilise pour demander au serveur lexcution dune commande SQL. Cette classe contient plusieurs mthodes permettant lexcution de diffrents types de requtes SQL. La classe SqlCommand peut tre instancie de faon classique, en utilisant un de ses constructeurs o une instance peut tre obtenue par la mthodeCreateCommanddelaconnexion.

a.Crationdunecommande
La premire possibilit pour crer une SqlCommand est dutiliser un des constructeurs de la classe. Lutilisation du constructeur par dfaut vous oblige par la suite utiliser diffrentes proprits, pour fournir les informations concernantlinstructionSQLexcuter. Laproprit CommandTextcontientletextedelinstructionSQLexcuter.LapropritConnectiondoitfairerfrence uneconnexionvalideversleserveurdebasededonnes.Lecodesuivantrsumecesdiffrentesoprations : Dim cmd As SqlCommand cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = SELECT * FROM Products

ENI Editions - All rigths reserved

- 3-

La deuxime solution est dutiliser un constructeur surcharg, acceptant comme paramtres, linstruction SQL sous forme dune chane de caractres et la connexion utilise par cette SqlCommand. Le code prcdent peut donc se rsumerlalignesuivante : Dim cmd As new SqlCommand( " SELECT * FROM Products",ctn) Latroisimesolutionestdutiliserlamthode CreateCommanddelaconnexion.Danscecas,seulelinstructionSQLa besoindtrespcifieparlasuite. Dim cmd as SqlCommand cmd = ctn.CreateCommand cmd.CommandText = " SELECT * FROM Products"

b.Lecturedinformations
Frquemment, linstruction SQL dune SqlCommand slectionne un ensemble denregistrements dans la base, ou ventuellementunevaleuruniquetantlersultatduncalculeffectusurdesvaleurscontenuesdanslabase.Une instructionSQL,renvoyantunensembledenregistrements,doittreexcuteparlamthode ExecuteReader.Cette mthoderetourneunobjetDataReaderquivapermettre,parlasuite,lalecturedesinformationsenprovenancedela base de donnes. Si linstruction SQL ne renvoie quune valeur unique, la mthodeExecuteScalar se charge de lexcutionetretourneellemmelavaleurenprovenancedelabasededonnes. Lecodesuivantpermetlarcuprationdunombredecommandespassesparunclient : cmd.CommandText = " select count(orderid) from orders where customerid=FRANK" Console.WriteLine("le client FRANK a pass {0} commande(s)", cmd.ExecuteScalar()) Lecasdinstructionsrenvoyantplusieursenregistrementsestunpeupluscomplexe.Aprsavoirexcutlinstruction par la mthode ExecuteReader et rcupr lobjet DataReader vous pouvez utiliser ce dernier pour parcourir les rsultats renvoys. La mthode Read de la classe DataReader permet le dplacement dans lensemble des enregistrements renvoys. Cette mthode retourne un boolean indiquant sil reste un enregistrement suivant. Le dplacementnestpossiblequedupremieraudernierenregistrement.Cetypededplacementestappel Forward Only.LesinformationscontenuesdanslenregistrementcourantsontaccessiblesparunedesmthodesGet...dela classe DataReader.Cesmthodespermettentdextrairelesdonnesdelenregistrementetdelesconvertirdansun typededonnes.NET.IlenexisteuneversionpourchaquetypededonnesduFramework.NET.Ilfautbiensrque les informations prsentes dans lenregistrement, puissent tre converties dans le type correspondant. Si la conversionestimpossible,ilyadclenchementduneexception.Lesmthodes Get...attendent,commeparamtre, lenumroduchamppartirduquelellesrcuprentlinformation.Vouspouvezaussiutiliserlaproprit,pardfaut, Item du DataReader en indiquant le nom du champ concern. Il ny a pas, dans ce cas, de conversion et la valeur renvoyeestdetypeObject. Lecodesuivantaffichelalistedetouteslescatgoriesdeproduitsdisponibles : Imports System.Data.SqlClient Module TestExecuteReader Dim cmd As SqlCommand Dim ctn As SqlConnection Dim lecteur As SqlDataReader Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " select * from categories" lecteur = cmd.ExecuteReader Do While lecteur.Read Console.WriteLine("numero de la categorie:{0}" & vbTab & "Description:{1}", lecteur.GetInt32(0), lecteur("CategoryName")) Loop lecteur.Close() ctn.Close() End Sub End Module

- 4-

ENI Editions - All rigths reserved

LutilisationduneconnexionparunDataReaderseffectuedemanireexclusive.Pourquelaconnexionsoitnouveau disponiblepouruneautrecommande,vousdevezobligatoirementfermerleDataReaderaprssonutilisation.

c.Modificationdesinformations
LamodificationdesinformationsdansunebasededonnesseffectueprincipalementparlesinstructionsSQL INSERT, UPDATE, DELETE. Ces instructions ne retournent pas denregistrements en provenance de la base de donnes. Pour utiliser ces instructions, vous devez crer une SqlCommand, puis demander lexcution de cette commande par la mthode ExecuteNonQuery. Cette mthode retourne le nombre denregistrements affects par lexcution de linstructionSQLcontenuedanslaSqlCommand.SilapropritCommandTextcontientplusieursinstructionsSQL,alorsla valeur renvoye par la mthode ExecuteNonQuery correspond au nombre total de lignes affectes par toutes les instructionsSQLdelaSqlCommand. LecodesuivantajouteunenouvelleentreprisedelivraisondanslatableShippers : Imports System.Data.SqlClient Module TestExecuteNonQuery Dim cmd As SqlCommand Dim ctn As SqlConnection Public Sub main() ctn = New SqlClient.SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" ctn.Open() cmd = New SqlClient.SqlCommand cmd.Connection = ctn cmd.CommandText = "Insert into shippers (companyname,phone) values (DHL,02 40 41 42 43)" Console.WriteLine("{0} ligne(s) ajoute(s) dans la table", cmd.ExecuteNonQuery) ctn.Close() End Sub End Module

d.Utilisationdeparamtres
LamanipulationdinstructionsSQLpeuttrefaciliteparlacrationdeparamtres.Ilspermettentdeconstruiredes instructions SQL gnriques, pouvant facilement tre rutilises. Le principe de fonctionnement est semblable aux procdures et fonctions de Visual Basic. Une alternative lutilisation de paramtres pourrait tre la construction dynamiquedinstructionSQLparconcatnationdechanesdecaractres. Cidessous,unexempleutilisantcettetechniqueetpermettantlarecherchedunclientparsoncode(nousverrons ensuitecommentamliorercecodeenutilisantdesparamtres) : Imports System.Data.SqlClient Module TestRequeteConcat Dim cmd As SqlCommand Dim ctn As SqlConnection Dim lecteur As SqlDataReader Dim codeClient As String Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn Console.Write("saisir le code du client recherche :") codeClient = Console.ReadLine() cmd.CommandText = " SELECT * from Customers WHERE CustomerID = " & codeClient & "" lecteur = cmd.ExecuteReader Do While lecteur.Read Console.WriteLine("nom du client:{0}", lecteur("ContactName")) Loop lecteur.Close() ctn.Close()

ENI Editions - All rigths reserved

- 5-

Console.ReadLine() End Sub End Module Lapartieimportantedececodesesituelorsdelaffectationdunevaleurlaproprit CommandText.Uneinstruction SQL correcte doit tre construite par concatnation de chanes de caractres. Dans notre cas, cest relativement simplepuisquilnyaquunevaleurvariabledanslinstructionSQL,maissiplusieursinformationsdoiventvarier,ilya unemultitudedeconcatnationsraliser.Leserreursclassiquesdanscesconcatnationssont :
q

loublidunespace loublidescaractrespourencadrerunevaleurdetypechanedecaractres unnombredecaractreimpair.

Toutesceserreursont,pourmmeeffet,lacrationduneinstructionSQLinvalidequiserarejetelexcutionpar leserveur. Lutilisationdesparamtressimplifieconsidrablementlcrituredecetypederequte.Lesparamtressontutiliss pourmarquerunemplacementdansunerequteoseraplac,aumomentdelexcution,unevaleurlittralechane de caractres ou numrique. Les paramtres peuvent tre nomms ou anonymes. Un paramtre anonyme est introduitdansunerequteparlecaractre ?.Lesparamtresnommssontspcifisparlecaractre@suividunom duparamtre. Larequtedenotreexempleprcdentpeutprendrelesformessuivantes : cmd.CommandText = " SELECT * from Customers WHERE CustomerID = ?" ou cmd.CommandText = " SELECT * from Customers WHERE CustomerID = @Code LexcutiondelaSqlCommandchouemaintenantsiaucuneinformationnestfourniepourleoulesparamtres.

La SqlCommand doit avoir une liste de valeurs utilises pour le remplacement des paramtres, au moment de lexcution. Cette liste est stocke dans la collection Parameters de la SqlCommand. Avant lexcution de la SqlCommand,ilfautdonccrerlesobjets SqlParameteretlesajouterlacollection.PourchaqueSqlParameter,ilfaut fournir :
q

lenomduparamtre lavaleurduparamtre ladirectiondutilisationduparamtre.

- 6-

ENI Editions - All rigths reserved

Lesdeuxpremiresinformationssontindiqueslorsdelaconstructiondelobjet : Dim paramCodeClient As SqlParameter paramCodeClient = New SqlParameter("@Code", codeClient) La direction dutilisation indique si linformation contenue dans le paramtre, est passe au code SQL pour son excution (Input) ou si cest lexcution du code SQL qui va modifier la valeur du paramtre (Output) ou les deux (InputOutput).LapropritDirectiondelaclasseSqlParameterindiquelemodedutilisationduparamtre.

LeparamtreestmaintenantprttreajoutlacollectionParameters.Ilconvientdtrevigilantceniveau,sila requteutiliselesparamtresanonymes.Lesparamtresdoiventobligatoirementtreajoutslacollection,dans lordre de leur apparition dans la requte. Si les paramtres nomms sont utiliss, il nest pas indispensable de respecter cette rgle, mais il est prudent de sy conformer, si un jour le code SQL est modifi et nutilise plus les paramtres nomms. Ceci pourra tre le cas si vous devez changer de type fournisseur de donnes et que le nouveaunacceptepaslesparamtresnommsdansuneinstructionSQL.La SqlCommandestmaintenantprtepour lexcution. noter quavec cette solution nous navons pas nous soucier du type de valeur attendue par linstructionSQLpoursavoirsinousdevonslencadreravecdescaractres.Sidesparamtressontutilissensortie delinstructionSQL,ilsneserontdisponiblesquaprslafermeturedu DataReader.Lexemplesuivantafficheenplus dunomduclient,lenombredecommandesquiladjpasses : Imports System.Data.SqlClient Module TestRequeteConcat Dim cmd As SqlCommand Dim ctn As SqlConnection Dim lecteur As SqlDataReader Dim codeClient As String Dim paramCodeClient As SqlParameter Dim paramNbCommandes As SqlParameter Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn Console.Write("saisir le code du client recherche :") codeClient = Console.ReadLine() cmd.CommandText = " SELECT * from Customers WHERE CustomerID = @Code;select @nbCmd=count(orderid) from orders where customerid=@code" paramCodeClient = New SqlParameter("@Code", codeClient) paramCodeClient.Direction = ParameterDirection.Input cmd.Parameters.Add(paramCodeClient) paramNbCommandes = New SqlParameter("@nbCmd", Nothing) paramNbCommandes.Direction = ParameterDirection.Output cmd.Parameters.Add(paramNbCommandes) lecteur = cmd.ExecuteReader Do While lecteur.Read Console.WriteLine("nom du client:{0}, lecteur("ContactName")) Loop lecteur.Close() Console.WriteLine("ce client a passe {0} commande(s)", cmd.Parameters ("@nbCmd").Value) ctn.Close() Console.ReadLine() End Sub End Module

e.Excutiondeprocdurestocke

ENI Editions - All rigths reserved

- 7-

LesprocduresstockessontdeslmentsdunebasededonnescorrespondantunensembledinstructionsSQL, pouvanttreexcutesparsimpleappeldeleurnom.CesontdesvritablesprogrammesSQLpouvantrecevoirdes paramtresetrenvoyerdesvaleurs.Deplus,lesprocduresstockessontenregistresdanslecachemmoiredu serveur, sous forme compile lors de leur premire excution, ce qui accrot les performances pour les excutions suivantes.Unautreavantagedesprocduresstockesestdecentralisersurleserveurdebasededonnestousles codesSQLduneapplication.SidesmodificationsdoiventtreapportesdanslesinstructionsSQL,vousnaurezque des modifications effectuer sur le serveur sans avoir reprendre le code de lapplication, donc sans avoir regnreretredployerlapplication. Lappel une procdure stocke, partir de Visual Basic, est pratiquement similaire lexcution duneinstruction SQL.Laproprit CommandTextcontientlenomdelaprocdurestocke.Vousdevezgalementmodifierlaproprit CommandTypeaveclavaleur CommandType.StoredProcedurepourindiquerquelaproprit CommandTextcontientlenom duneprocdurestocke.CommepouruneinstructionSQL,uneprocdurestockepeututiliserdesparamtresen entre ou en sortie. Il y a un troisime type de paramtre disponible pour les procdures stockes le type ReturnValue. Ce type de paramtre sert rcuprer la valeur renvoye par linstruction Return de la procdure stocke (mme principe quune fonction Visual Basic). Pour tester ces nouvelles notions, nous allons utiliser la procdurestockesuivante,quiretournelemontanttotaldetouteslescommandespassesparunclient. CREATE PROCEDURE TotalClient @code nchar(5) AS declare @total money select @total=sum(UnitPrice*Quantity*(1-Discount)) from Orders,[Order Details] where customerid=@code and Orders.orderid=[order details].orderid return @total GO AuniveauducodeVisualBasic,nousdevonsindiquerquilsagitdelexcutionduneprocdurestockeetajouterun paramtrepourrcuprerlavaleurderetourdelaprocdurestocke.CeparamtredoitsappelerRETURN_VALUE. Imports System.Data.SqlClient Module TestProcedureStockee Dim cmd As SqlCommand Dim ctn As SqlConnection Dim paramCodeClient As SqlParameter Dim paramMontant As SqlParameter Dim codeclient As String Public Sub main() Console.Write("saisir le code du client recherche :") codeClient = Console.ReadLine() ctn = New SqlConnection() ctn.ConnectionString = Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true ctn.Open() cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = "TotalClient" cmd.CommandType = CommandType.StoredProcedure paramCodeClient = New SqlParameter("@Code", codeClient) paramCodeClient.Direction = ParameterDirection.Input cmd.Parameters.Add(paramCodeClient) paramMontant = New SqlParameter("RETURN_VALUE", SqlDbType.Decimal) paramMontant.Direction = ParameterDirection.ReturnValue cmd.Parameters.Add(paramMontant) cmd.ExecuteNonQuery() Console.WriteLine("Ce client a passe pour {0} Euros de commande", paramMontant.Value) Console.ReadLine() ctn.Close() End Sub End Module

- 8-

ENI Editions - All rigths reserved

Utilisationdumodenonconnect
Dansunmodenonconnect,laliaisonavecleserveurdebasededonnesnestpaspermanente.Ilfautdoncconserver localementlesdonnessurlesquellesonsouhaitetravailler.Lideestderecrer,laidedediffrentesclasses,une organisationsimilairecelledunebasededonnes.Lesprincipalesclassessontreprsentessurleschmasuivant : DataSet Cestleconteneurdeplushautniveau,iljouelemmerlequelabasededonnes. DataTable Commesonnomlindique,cestlquivalentdunetabledebasededonnes. DataRow Cetteclassejouelerledunenregistrement(ligne). DataColumn Cetteclasseremplaceunchamp(colonne)dunetable. UniqueConstraint Cestlquivalentdelaclprimairedunetable. ForeignKeyConstraint Cestlquivalentdelacltrangre. DataRelation Reprsenteunlienparent/enfantentredeuxDataTable. Leschmacidessousreprsentecetteorganisation.

Nousallonsvoirmaintenantcommentcreretmanipulertoutescesclasses.

1.RemplirunDataSetpartirdunebasededonnes
Pour pouvoir travailler localement avec les donnes, nous devons les rapatrier depuis la base de donnes dans un DataSet. Chaque fournisseur de donnes fournit une classe DataAdapter, assurant le dialogue entre la base de donnes et un DataSet. Tous les changes se font par lintermdiaire de cette classe, aussi bien de la base vers le

ENI Editions - All rigths reserved

- 1-

DataSet que du DataSet vers la base pour la mise jour des donnes. Le DataAdapter utilisera une connexion pour contacterleserveuretuneouplusieurscommandespourletraitementdesdonnes.

a.UtilisationdunDataAdapter
Lapremirechoseraliserestdecreruneinstancedelaclasse SQLDataAdapter.Nousdevonsensuiteconfigurer le DataAdapter afin de lui indiquer quelles donnes nous souhaitons rapatrier partir de la base de donnes. La proprit SelectCommand doit rfrencer un objet Command, contenant linstruction SQL charge de slectionner les donnes. Lobjet Command utilis peut galement appeler une procdure stocke. La seule contrainte est que linstructionSQLexcuteparlobjet Commandsoituneinstruction SELECT.Laclasse DataAdaptercontientgalement lespropritsInsertCommand, DeleteCommandetUpdateCommandrfrenantlesobjets Command,utilisslorsdelamise jourdelabasededonnes.Tantquenousnesouhaitonspaseffectuerdemisejourdelabase,cesproprits sont facultatives. Elles seront tudies plus en dtail dans le chapitre consacr la mise jour de la base de donnes. Lamthode Filldelaclasse DataAdapterestensuiteutilisepourremplirle DataSetaveclersultatdelexcution delacommande SelectCommand.Cette mthodeattend,commeparamtre,le DataSetquelledoitrempliretunobjet DataTableouunechanedecaractresutilisepournommerla DataTabledansleDataSet.LeDataAdapterutilise,en interne,unobjet DataReaderpourobtenirlenomdeschampsetletypedeschampspourcrerla DataTabledansle Datasetetensuitelerempliraveclesdonnes.La DataTableetlesDataColumnsontcrsuniquementsilsnexistent pas dj, sinon la mthode Fill utilise la structure existante. Si une DataTable est cre, elle est ajoute la collectionTablesdu DataSet.Letypededonnesdes DataColumnestdfinienfonctiondesmappagesprvusparle fournisseur de donnes, entre les types de la base de donnes et les types .NET. Lexemple suivant remplit un DataSetaveclescode,nom,adresseetvilledesclients. Imports System.Data.SqlClient Module TestDataSet1 Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT CustomerId,ContactName,Address,city from Customers" ds = New DataSet da = New SqlDataAdapter() da.SelectCommand = cmd da.Fill(ds, "Customers") End Sub End Module Dans ce code, la connexion na pas t ouverte et ferme, explicitement. En effet, la mthode Fill ouvre la connexionsiellenestpasdjouverteetdanscecas,larefermegalementlafindesonexcution.Toutefois,si vousavezbesoindutiliser plusieurs fois la mthode Fill, il est plus efficace de grer vousmmelouverture et la fermeturedeconnexion.Danstouslescas,lamthodeFilllaisselaconnexiondansltatoellelatrouve. Un DataSet peut bien sr contenir plusieurs DataTable cres partir de DataAdapter diffrents. Les donnes peuventmmeprovenirdebasesdedonnesdiffrentes,voiredetypesdeserveursdiffrents. Lorsque le DataAdapter construit la DataTable, les noms des champs de la base sont utiliss pour nommer les DataColumn.Ilestpossibledepersonnalisercesnomsencrant desobjetsDataTableMappingetenlesajoutantla collection TableMappings du DataAdapter. Ces objets DataTableMapping contiennent euxmmes des objets DataColumnMappingutilissparlamthode Fill,commetraducteursentrelesnomsdeschampsdanslabaseetles nomsdes Datacolumn dans le DataSet.Danscecas,lorsdelappel de la mthode Fillnousdevonsluiindiquerle nomduDataTableMappingutiliser. Si,pourunouplusieurschamps,ilnyapasdemappagedisponible,alorslenomduchampdanslabaseestutilis comme nom pour la DataColumn correspondante. Nous pouvons, par exemple, utiliser cette technique pour traduire leschampsdelabaseNorthwind. LecodesuivanteffectuecettetraductionetaffichelenomdesDatacolumnduDataTablecr : Imports System.Data.SqlClient Imports System.Data.Common

- 2-

ENI Editions - All rigths reserved

Module TestTableMapping Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Dim mappage As DataTableMapping Dim dc As DataColumn Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT CustomerId,ContactName,Address,city from Customers ds = New DataSet da = New SqlDataAdapter() da.SelectCommand = cmd mappage = New DataTableMapping("Customers", "Clients") mappage.ColumnMappings.Add("CustomerId", "CodeClient") mappage.ColumnMappings.Add("ContactName", "Nom") mappage.ColumnMappings.Add("Address", "Adresse") mappage.ColumnMappings.Add("city", "Ville") da.TableMappings.Add(mappage) da.Fill(ds, "Customers") For Each dc In ds.Tables("Clients").Columns Console.Write(dc.ColumnName & vbTab) Next Console.ReadLine() End Sub End Module Nousobtenonslaffichage : CodeClient Nom Adresse Ville

b.AjoutdecontraintesexistantesunDataSet
Lamthode Fillnefaitquetransfrer,versle DataSet,lesdonnesenprovenancedelabase.Biensouvent,des contraintesdeclsprimairessontutilisesdanslabasededonneset,pardfaut,lamthode Fillnelesrapatrie pasdansleDataSet.PourpouvoirrcuprercescontraintesdansleDataSet,ilyadeuxsolutionspossibles :
q

ModifierlapropritMissingSchemaActionduDataAdapteraveclavaleurMissingSchemaAction.AddWithKey

da.MissingSchemaAction = MissingSchemaAction.AddWithKey

Procderendeuxtapesenappelantdabordlamthode FillSchemadu DataAdapterpourcrerlastructure compltedelaDataTable,puisensuiteappelerlamthodeFillpourremplirlaDataTableaveclesdonnes.

da.FillSchema(ds, SchemaType.Mapped, "Customers") da.Fill(ds, "Customers") Le deuxime paramtre de la mthode FillSchema indique si le mappage doit tre pris en compte ou si les informationsissuesdelabasesontutilises. Ilestimportantdajouterlescontraintesdeclsprimairescarlamthode Fillvasecomporterdiffremmentsielles existentoupas. SilescontraintesexistentauniveauduDataSet,lorsquelamthodeFillimporteunenregistrementdepuislabase, ellevrifiesilnexistepasdjuneligneaveclammevaleurdeclprimairedansla DataTable.Sicestlecas,elle metuniquementjourleschampsdelaligneexistante.Si,parcontre,ilnyapasdeligneavecunevaleurdecl primaireidentique,alorslaligneestcredanslaDataTable. Sil ny a pas de contrainte de cl primaire sur la DataTable, la mthode Fill ajoute tous les enregistrements en provenance de la base. Il risque dans ce cas dy avoir des doublons dans la DataTable. Ceci est particulirement

ENI Editions - All rigths reserved

- 3-

importantlorsquelamthodeFilldoittreappeleplusieursfoispour,parexemple,obtenirlesdonnesmodifies paruneautrepersonnedanslabasededonnes.

2.ConfigurerunDataSetsansbasededonnes
Il nest pas ncessaire de disposer dune base de donnes pour pouvoir utiliser des DataSet. Ils peuvent servir dalternativelutilisationdetableauxpourlagestioninternedesdonnesduneapplication.Danscecas,toutesles oprations effectues automatiquement par le DataAdapter devront tre ralises manuellement par le code. Ceci inclutnotammentlacrationdes DataTable avec leurs DataColumn.Lapremireoprationraliserestdecrerune instancedelaclasseDataTable.Leconstructeurattend,comme paramtre,lenomdelaDataTable.Cenomestensuite utilis pour identifier la DataTable dans la collection Tables du DataSet. Aprs sa cration, la DataTable ne contient aucune structure. Nous devons donc crer une ou plusieurs DataColumn et les ajouter la collection Columns de la DataTable. LesDataColumnpeuventtrecres,enutilisantundesconstructeursdelaclasse,ouautomatiquementlorsdelajout la collection Columns. La premire solution fournit plus de souplesse puisquelle permet la configuration de nombreuses proprits de la DataColumn au moment de sa cration. Vous devez au minimum indiquer un nom et un typededonnespourlaDataColumn. col = New DataColumn(("Ht", Type.GetType("int")) table.Columns.Add(col) table.Columns.Add("Tva", Type.GetType("decimal")) Une DataColumn peut galement tre construite comme tant une expression base sur une ou plusieurs autres DataColumn.Vousdevez,danscecas,indiquerlorsdelacrationdela DataColumn,lexpressionservantaucalculdesa valeur. Le type de donnes gnr par lexpression doit bien sr tre compatible avec le type de donnes de la DataColumn. Vous devez galement tre vigilant dans la conception de lexpression, en respectant la casse et en veillantnepascrerderfrencecirculaireentrelesDataColumn. table.Columns.Add("Ttc", Type.GetType("System.Decimal"), "Ht * (1 + (Tva /100))") PourassurerlunicitdesvaleursduneDataColumn,ilestpossibledutiliseruntypedeDataColumnautoincrment.La proprit AutoIncrement de cette DataColumn doit tre positionne sur true. Vous pouvez galement modifier le pas dincrmentation avec la proprit AutoIncrementStep et la valeur de dpart avec la proprit AutoIncrementSeed.La valeur contenue dans cette DataColumn est calcule automatiquement lors de lajout duneligneune DataTableen fonctiondecespropritsetdeslignesexistantdjdanslaDataTable. CetypedeDataColumnestgnralementutiliscommeclprimairedune DataTable.Vousavezlapossibilitdedfinir la cl primaire dune DataTable en fournissant la proprit PrimaryKey un tableau contenant les diffrentes DataColumn devant composer la cl primaire. Les DataColumn concernes verront certaines de leurs proprits automatiquementmodifies.Laproprit Uniqueserapositionnesur trueetlaproprit AllowDBNullsur false.Sila clprimaireestconstituedeplusieursDataColumn,seulelapropritAllowDBNullseramodifiesurcesDataColumn. col = New DataColumn("Numero", Type.GetType("System.Int32")) col.AutoIncrement = True col.AutoIncrementSeed = 1000 col.AutoIncrementStep = 1 table.Columns.Add(col) table.PrimaryKey = New DataColumn() {col}

3.ManipulerlesdonnesdansunDataSet
Quellequesoitlamthodeutilisepourremplirun DataSet,lebutdetouteapplicationestdemanipulerlesdonnes prsentes dans le DataSet. La classe DataTable contient de nombreuses proprits et mthodes facilitant la manipulationdesdonnes.

a.Lecturedesdonnes
La lecture des donnes est lopration la plus frquente ralise sur un DataSet. Il faut tout dabord obtenir une rfrence sur la DataTablecontenantlesdonnes,puisnouspouvonsparcourirlacollection Rows de la DataTable. Cette collection est une instance de la classe DataRowCollection. Elle dispose de la proprit Item, par dfaut, permettantlaccsuneligneparticulireparunindex.Laproprit countpermetdeconnatrelenombredelignes disponibles.LeshabitusdeADOserontunpeuperdusaudbut,cardansune DataTable,ilnyapasdenotionde pointeurdenregistrement,denregistrementcourant,demthodesdedplacementdanslejeudersultats.Sivous

- 4-

ENI Editions - All rigths reserved

voulezgrer toutescesnotions,vousdevezleprvoirexplicitementdansvotrecode.LamthodeGetEnumeratormet notredispositionuneinstancedeclasseimplmentantlinterface IEnumerator.Parcetteinstancedeclasse,nous avons accs aux mthodes MoveNext et Reset ainsi qua la proprit Current. Ces trois lments permettent de parcourirfacilementtoutesleslignesdelaDataTable.Chaquelignecorresponduneinstancedelaclasse DataRow. Cette classe possde galement une proprit Item, par dfaut, fournissant un accs aux diffrents champs de la DataRow.Chaquechamppeuttreobtenuparsonnomouparsonindex. Lecodesuivantillustrecesnotionsenaffichantlalistedesclients : Imports System.Data.SqlClient Module TestLectureDataTable Dim Dim Dim Dim Dim cmd As SqlCommand ctn As SqlConnection ds As DataSet da As SqlDataAdapter en As IEnumerator

Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT ContactTitle,ContactName from Customers" ds = New DataSet da = New SqlDataAdapter() da.SelectCommand = cmd da.Fill(ds, "Customers") on recupere lenumerateur sur les lignes de la DataTable en = ds.Tables("Customers").Rows.GetEnumerator on se replace au debut de la table (par securite) en.Reset() on boucle tant que la mthode MoveNext nous indique quil reste des lignes Do While en.MoveNext on accede aux champs par le nom Console.Write(en.Current("ContactName") & vbTab) ou par le numero Console.WriteLine(en.Current(0)) Loop Console.ReadLine() End Sub End Module

b.CrationdecontraintessuruneDataTable
Vous pouvez utiliser des contraintes pour mettre en uvre des restrictions sur les donnes prsentes dans une DataTable.Lescontraintesconstituentdesrglesquisontappliquesune DataColumnouses DataColumnlies. Ellesdterminentlesactionseffectueslorsquelavaleurcontenuedansuneligneestmodifie.Ellessontprisesen comptepourunDataSet,uniquement,sisapropritEnforceConstraintsestpositionnesurtrue. Deuxtypesdecontraintessontutilisables : UniqueConstraint Cetypedecontraintevagarantirquelaoulesvaleursprsentesdansune DataColumnouungroupede DataColumn sont uniques. La mise en place dune contrainte unique seffectue en crant une instance de la classe UniqueConstraint avec la liste des DataColumn concernes par la contrainte. Cette UniqueConstraint doit, ensuite, treajoutelacollectionConstraintsdelaDataTable. table.Constraints.Add(New UniqueConstraint(New DataColumn() {col})) SilacontrainteneportequesuruneDataColumn,ilestaussipossibledemodifiersimplementlaproprit Uniquede cette DataColumn sur true, pour crer une contrainte unique. noter galement que la cration dune cl primaire gnreautomatiquementunecontrainteunique,parlinversenestpasvrai.Laviolationdelacontrainte,lasuite delamodificationduneligne,dclencheuneexception.

ENI Editions - All rigths reserved

- 5-

ForeignKeyConstraint Les ForeignKeyConstraintcontrlentcommentvontsecomporterles DataTablelieslorsdelamodificationoudela suppression dune valeur dans la DataTable principale. Une action diffrente peut tre envisage pour une suppression et une modification. La classe ForeignKeyConstraint dispose des proprits DeleteRuleet UpdateRule indiquantlecomportement,lorsdelasuppressionoudelamodification.Lesvaleurssuivantessontpossibles : Cascade Lasuppressionoumodificationestpropagelaouauxligneslies. SetNull LavaleurestmodifieDBNulldanslesligneslies. SetDefault Lavaleurpardfautestprisedanslesligneslies. None Aucuneactionnesteffectuesurlesligneslies. Lajout dune ForeignkeyConstraint se fait par la cration dune instance de la classe en lui indiquant la ou les DataColumnde DataTableparentetlaoules DataColumndelatableenfant.Siplusieurs DataColumnfontpartiedela contrainte,ellessontfourniessousformedetableau. Le code suivant ajoute une contrainte entre la DataTable Factures et la DataTable LignesFacture, pour que la suppressiondunefactureentranelasuppresiondetoutesseslignes. fkFact_LignesFact = New ForeignKeyConstraint("FK_FACT_LIGNESFACT", ds.Tables("Factures").Columns("Numero"), ds.Tables("LignesFacture").Columns("NumFact")) fkFact_LignesFact.AcceptRejectRule = AcceptRejectRule.Cascade fkFact_LignesFact.DeleteRule = Rule.Cascade ds.EnforceConstraints = True

c.AjoutderelationsentrelesDataTables
DansunDataSetcontenantplusieursDataTable,vouspouvezajouterdesrelationsentrelesDataTable.Cesrelations permettentlanavigationentreleslignesdesdiffrentesDataTable.Uneinstancedelaclasse DataRelationdoittre creetajoutelacollectionRelationsduDataSet.LacrationpeutsefairedirectementparlamthodeAdddela collectionDataRelations.Lesinformationsfournirsont :
q

LenomdelarelationpermettantderetrouverparlasuitelaDataRelationdanslacollection. LaoulesDataColumnparentessousformeduntableaudeDataColumnsilyenaplusieurs. LaoulesDataColumnenfantssousformeduntableau,silyenaplusieurs.

LecodesuivantajouteunerelationentrelatableCustomersetlatableOrders : ds.Relations.Add("Client_Commandes", ds.Tables("Customers"). Columns("CustomerId"), ds.Tables("Orders").Columns("CustomerId")) noterqueles DataRelationfonctionnentparalllementavecles ForeignKeyConstaintetles UniqueConstraint.Par dfaut,lacrationdelarelationvaplaceruneUniqueConstraintsurlatableparentetuneForeignKeyConstraintsur la table enfant. Si vous ne souhaitez pas que ces contraintes soient ajoutes automatiquement si elles nexistent pas,vousdevezajouterunbooleanfalsecommequatrimeparamtre,lorsdelajoutdelaDataRelation.

d.Parcourirlesrelations

- 6-

ENI Editions - All rigths reserved

LebutprincipaldesrelationsestdepermettrelanavigationduneDataTableversuneautrelintrieurdunDataSet. Nous pouvons ainsi obtenir tous les objets DataRow dune table lis une DataRow dune autre DataTable. Par exemple, aprs avoir charg les tables Customers et Orders dans le DataSet et tabli une relation entre ces deux tables,nouspouvons,partirdunelignedela DataTable Clientsobtenirdepuisla DataTable Orderstoutes les commandes de ce client. La mthode GetChildRows retourne, sous forme dun tableau de DataRow, toutes les lignescontenantlescommandesdececlient. Cettemthodeprend,commeparamtre,lenomdela DataRelationutilisepourlelien.Lexempleducodesuivant metcelaenapplication,enaffichantpourchaqueclientlenumroetladatedesescommandes : Imports System.Data.SqlClient Module TestRelations Dim cmdCustomers, cmdOrders As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim daCustomers, daOrders As SqlDataAdapter Dim ligneClient, ligneCommandes As DataRow Public Sub main() ds = New DataSet ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" cmdCustomers = New SqlCommand cmdCustomers.Connection = ctn cmdCustomers.CommandText = " SELECT * from Customers daCustomers = New SqlDataAdapter() daCustomers.SelectCommand = cmdCustomers daCustomers.Fill(ds, "Customers") cmdOrders = New SqlCommand cmdOrders.Connection = ctn cmdOrders.CommandText = " SELECT * from Orders" daOrders = New SqlDataAdapter() daOrders.SelectCommand = cmdOrders daOrders.Fill(ds, "Orders") ds.Relations.Add("Client_Commandes", ds.Tables("Customers").Columns ("CustomerId"), ds.Tables("Orders").Columns("CustomerId")) For Each ligneClient In ds.Tables("Customers").Rows Console.WriteLine(ligneClient("ContactName")) For Each ligneCommandes In ligneClient.GetChildRows("Client_Commandes") Console.WriteLine(vbTab & "commande N {0} du {1}", ligneCommandes("OrderId"), ligneCommandes("OrderDate")) Next Next End Sub End Module Lanavigationduneligneenfantversuneligneparentestaussipossible,enutilisantlamthode GetParentRowqui, elleaussi,attendcommeparamtrelenomdelarelationutilisecommelien. Lapartieducodesuivantaffichepourchaquecommandelenomduclientlayantpasse : For Each ligneCommandes In ds.Tables("Orders").Rows Console.WriteLine("la commande {0} a ete passee par {1}", ligneCommandes("OrderId"), ligneCommandes.GetParentRow("Client_Commandes") ("ContactName")) Next

e.tatetversionsduneDataRow
La classe DataRow est capable de suivre les diffrentes modifications apportes aux donnes quelle contient. La propritRowStatepermetdecontrlerlesmodificationsapporteslaligne. Cinqvaleursdfiniesdansunenumrationsontpossiblespourcetteproprit : Unchanged Lalignenapaschangdepuisleremplissagedu DataSetparlamthodeFilloulavalidationdesmodificationspar lamthodeAcceptChanges.
ENI Editions - All rigths reserved - 7-

Added LaligneatajoutemaislesmodificationsnontpasencoretvalidesparlamthodeAcceptChanges. Modified Unouplusieurschampsdelaligneonttmodifis. Deleted LaligneateffacemaislesmodificationsnontpasencoretvalidesparlamthodeAcceptChanges. Detached LaligneatcremaisnefaitpasencorepartiedelacollectionRowsduneDataTable. Lesdiffrentesversionsdunelignesontgalementdisponibles.Lorsquevousaccdezauxvaleurscontenuesdans uneligne,vouspouvezspcifierlaversionquivousintresse. Pourcela,lnumrationDataRowVersionproposequatrevaleurs : Current Versionactuelledelaligne.CetteversionnexistepaspourunelignedontltatestDeleted. Default Versionpardfautdelaligne.PourunelignedontltatestAdded,Modified,Unchanged,cetteversionestquivalente laversionCurrent.PourunelignedontltatestDeleted,cetteversionestquivalentelaversion Original.Pour unelignedontltatestDetached,cetteversionestgalelaversionProposed. Original Versionoriginaledelaligne.PourunelignedontltatestAdded,cetteversionnexistepas. Proposed Version transitoire disponible pendant une opration de modification de la ligne ou pour une ligne ne faisant pas partiedunecollectionRowsduneDataTable. Lindicationdelaversiondsiredoittrespcifie,lorsdelaccsunchampparticulierduneDataRow.Pourcela,il faut utiliser lune des constantes prcdentes, la suite du nom ou de lindex du champ, lors de lutilisation de la propritItem,pardfaut,delaDataRow.

Cesdiffrentesversionsserontutilises,lorsdelamisejourdelabasededonnes,pourparexemplegrerles accsconcurrents.

f.Ajoutdedonnes
Lajout dune ligne une DataTable seffectue simplement en ajoutant une DataRow la collection Rows dune DataTable.Ilfaut,aupralable,creruneinstancedelaclasse DataRow.Cestceniveauquenousrencontronsun problme.

- 8-

ENI Editions - All rigths reserved

IlnyapasdeconstructeurdisponiblepourlaclasseDataRow.RassurezvouscenestpasuneerreurdeVisualBasic, mais cest bien volontairement quil nexiste pas de constructeur pour cette classe. En effet, lorsque nous avons besoin dune nouvelle instance dune DataRow, nous ne voulons pas une DataRow quelconque mais une DataRow spcifique au schma de notre DataTable. Cest pour cette raison que cest elle quest confi le soin de crer linstancedontnousavonsbesoinparlintermdiairedelamthodeNewRow. Dim nouvelleLigne As DataRow nouvelleLigne = ds.Tables("Customers").NewRow() Ltat de cette ligne est, pour linstant, Detached. Nous pouvons ensuite ajouter des donnes dans cette nouvelle ligne. nouvelleLigne("ContactName") = "Dupond" Aprscela,ilnousresteajouterlalignelacollectionRowsdelaDataTable. ds.Tables("Customers").Rows.Add(nouvelleLigne) LtatdecettenouvelleligneestmaintenantAdded.

g.Modificationdedonnes
La modification des donnes contenues dans une ligne est ralise, simplement, en affectant aux champs correspondants,lesvaleurssouhaites.Cesvaleurssontstockesdanslaversion Currentdelaligne.Ltatdela ligneestalors Modified.Cettesolutionprsenteunpetitinconvnient.Siplusieurschampsdunelignedoiventtre modifis,ilpeutyavoirpendantlamodification,destatstransitoiresquiviolentuneouplusieurscontraintesplaces surla DataTable.Cest,parexemple,lecassilyasurla DataTable,unecontraintedeclprimaireplacesurdeux DataColumn. Ceci a pour effet de dclencher une exception. Pour pallier ce problme, nous pouvons demander temporairement larrt de la vrification des contraintes pour cette ligne. La mthode BeginEdit passe la ligne en modeditionetsuspenddonclavrificationdescontraintespourcetteligne.Lesvaleursaffectesauxchampsne sontpasstockesdanslaversionCurrentdelalignemaisdanslaversionProposed.Lorsquetouteslesmodifications sonteffectuessurlaligne,vouspouvezlesvalideroulesannulerenappelantlamthode EndEditoulamthode CancelEdit.Vouspouvezgalementvrifierlesvaleurs,engrantlvnement ColumnChangeddelaDataTable.Dans le gestionnaire dvnements, vous recevez un argument de type DataColumnChangeEventArg permettant de savoir quelle DataColumn a t modifie (args.Column.ColumnName), la valeur propose pour cette DataColumn (args.ProposedValue)etpermettantdannuler les modifications (args.row.CancelEdit).Encasdevalidationavecla mthode EndEdit, la version Proposed de la ligne est recopie dans la version Current et ltat de la ligne devient Modified. Si, par contre, vous annulez les modifications avec la mthode CancelEdit, la version Current nest pas modifieetltatdelaligneestinchang.Danstouslescas,aprslappeldunedecesdeuxmthodes,lavrification descontraintesestractive. Lexemplesuivantpermetlamodificationducodepostaldunclientenvrifiantqueceluiciestbiennumrique : Imports System.Data.SqlClient Module TestModificationLigne Dim cmd As SqlCommand Dim ctn As SqlConnection Dim codeClient As String Dim codePostal As String Dim paramCodeClient As SqlParameter Dim ds As DataSet Dim da As SqlDataAdapter Dim WithEvents table As DataTable Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog= Northwind;Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn Console.Write("saisir le code du client a modifier:") codeClient = Console.ReadLine() cmd.CommandText = " SELECT * from Customers WHERE CustomerID = @Code" paramCodeClient = New SqlParameter("@Code", codeClient) paramCodeClient.Direction = ParameterDirection.Input cmd.Parameters.Add(paramCodeClient) ds = New DataSet da = New SqlDataAdapter(cmd)

ENI Editions - All rigths reserved

- 9-

da.Fill(ds, "Clients") table = ds.Tables("Clients") table.Rows(0).BeginEdit() Console.Write("saisir le nouveau code postal du client:") codePostal = Console.ReadLine() table.Rows(0)("PostalCode") = codePostal table.Rows(0).EndEdit() Console.WriteLine("le nouveau code postal est : {0}", table.Rows(0)("PostalCode")) Console.ReadLine() End Sub Private Sub table_ColumnChanged(ByVal sender As Object, ByVal e As System.Data.DataColumnChangeEventArgs) Handles table.ColumnChanged If e.Column.ColumnName = "PostalCode" Then If Not IsNumeric(e.ProposedValue) Then e.Row.CancelEdit() End If End If End Sub End Module

h.Suppressiondedonnes
Deux solutions diffrentes sont disponibles. Vous pouvez effacer une ligne ou supprimer une ligne. La nuance est subtileentrecesdeuxsolutions : LasuppressiondunedonnesefaitaveclamthodeRemovequiretiredfinitivementlaDataRowdelacollectionRows delaDataTable.Cettesuppressionestdfinitive. Lamthode Deletednefaitquemarquerlalignepourlasupprimerultrieurement.LtatdelalignepasseDeleted et ce nest quau moment de la validation des modifications que la ligne est rellement supprime de la collection RowsdelaDataTable.Silesmodificationssontannules,lalignerestedanslacollectionRows. LamthodeRemoveestunemthodedelacollection Rows(elleagitdirectementsursoncontenu),lamthodeDelete estunemthodedelaclasseDataRow(ellenefaitquechangerunepropritdelaligne). efface la ligne table.Rows(1).Delete() supprime la ligne table.Rows.Remove(table.Rows(1))

i.Validerouannulerlesmodifications
Jusqu prsent, les modifications effectues sur une ligne sont temporaires, il est encore possible de revenir la versionprcdente,ouaucontrairedevaliderdefaondfinitivelesmodificationsdansleslignes(maisencoredans labase).LesmthodesAcceptChangesouRejectChangespermettentrespectivementlavalidationoulannulationdes modifications.EllespeuventsappliquersuruneDataRowindividuelle,une DataTableouun DataSetentier.Lorsquela mthodeAcceptChangesestexcute,lesactionssuivantessontralises :
q

LamthodeEndEditestappeleimplicitementpourlaligne. Siltat de la ligne tait Addedou Modified, il devient Unchanged et la version Current est recopie dans la versionOriginale. SiltatdelalignetaitDeleted,alorslaligneestsupprime.

LamthodeRejectChangesexcutelesactionssuivantes :
q

LamthodeCancelEditestappeleimplicitementpourlaligne. Siltatdelalignetait Deletedou Modified,ilrevientUnchangedetlaversion Originalestrecopiedans laversionCurrent.

- 10 -

ENI Editions - All rigths reserved

SiltatdelalignetaitAdded,alorselleestsupprime.

Silexistedescontraintesdecltrangre,lactiondelamthodeAcceptChangesouRejectChangesestpropageaux lignesenfantsenfonctiondelapropritAcceptRejectRuledelacontrainte.

j.Filtrerettrierdesdonnes
Il est frquent davoir besoin de limiter la quantit de donnes visibles dans une DataTable ou encore de modifier lordredeslignes.LapremiresolutionquivientlespritestderecrerunerequteSQLavecunerestrictionouune clauseORDERBY.Cestoublierquenoussommesdansunmodedefonctionnementdconnectetquilestsouhaitable de limiter les accs la base, voire pire, que la base nest pas disponible. Nous devons donc nutiliser que les donnes disponibles, en faisant attention ne pas en perdre. La classe DataView va nous tre trs utile pour solutionner nos problmes. Cette classe va nous servir modifier la vision des donnes dans la DataTable sans risque pour les donnes ellesmmes. Il peut y avoir plusieurs DataView pour une mme DataTable, elles correspondentdespointsdevuediffrentsdelaDataTable.Pratiquementtouteslesoprationsralisablessurune DataTablelesontaussiparlintermdiaireduneDataView. DeuxsolutionssontdisponiblespourobteniruneDataView :
q

Creruneinstanceparlundesconstructeurs. Utiliserlinstance,pardfaut,fournieparlapropritDefaultView.

LepremierconstructeurutilisableattendsimplementcommeparamtrelaDataTablepartirdelaquelleestgnre la DataView. Dans ce cas, il ny a aucun filtre ni aucun tri deffectu sur les donnes visibles par la DataView. Un rsultatquivalentestobtenuenutilisantlaproprit DefaultViewduneDataTable. Ledeuximeconstructeurpermetdespcifierunfiltre,unordredetrietlaversiondeslignesconcernes.Pourtre visibles dans la DataView, les lignes devront correspondre tous ces critres. Les diffrents critres peuvent aussi tremodifispartroisproprits. RowFilter Cettepropritaccepteunechanedecaractresreprsentantlaconditiondevanttrerempliepourquunelignesoit visible.CetteconditionaunesyntaxetoutfaitsimilaireauxconditionsduneclauseWHERE.LesoprateursAndetOr peuventgalementtreutilisspourassocierplusieursconditions. LexemplesuivantaffichelenomdesclientscommerciauxoudirecteursdeventeenFrance : Imports System.Data.SqlClient Module TestDataView Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Dim table As DataTable Dim ligne As DataRowView Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT * from Customers" ds = New DataSet da = New SqlDataAdapter(cmd) da.Fill(ds, "Clients") table = ds.Tables("Clients") table.DefaultView.RowFilter = "Country=France and (contactTitle= Sales Agent or contactTitle=Sales Manager) For Each ligne In table.DefaultView Console.WriteLine("nom : {0}", ligne("ContactName")) Next End Sub End Module

ENI Editions - All rigths reserved

- 11 -

UnfiltrepeuttreannulenaffectantunechanevidelapropritRowFilter.

Sort Cette proprit accepte, elle aussi, une chane de caractres reprsentant le ou les critres utiliss pour le tri. La syntaxeestquivalentecelledelaclauseORDER BY. Lexemplesuivantaffichelesclientstrisparpayspuisparnom,pourunmmepays : on annule le filtre precedent table.DefaultView.RowFilter = "" toutes les lignes sont maintenant visibles on ajoute un critere de tri table.DefaultView.Sort = "Country ASC,ContactName ASC" For Each ligne In table.DefaultView Console.WriteLine("Pays : {0}" & vbTab & vbTab & " nom : {1}, ligne("Country"), ligne("ContactName")) Next RowStateFilter Cettepropritdtermineltatdeslignesetquelleversiondelaligneestvisibledansla DataView.Huitpossibilits sontdisponibles : CurrentRows PrsentelaversionCurrentdetoutesleslignesajoutes,modifiesouinchanges. Added PrsentelaversionCurrentdetoutesleslignesajoutes. Deleted PrsentelaversionOriginaldetouteslesligneseffaces. ModifiedCurrent PrsentelaversionCurrentdetoutesleslignesmodifies. ModifiedOriginal PrsentelaversionOriginaldetoutesleslignesmodifies. None Aucuneligne. OriginalRows PrsentelaversionOriginaldetoutesleslignesmodifies,supprimesouinchanges. Unchanged PrsentelaversionCurrentdetoutesleslignesinchanges. Lexemplesuivantsupprimedeuxlignesetlesafficheparlintermdiairedunfiltre : on supprime deux lignes table.Rows(2).Delete() table.Rows(5).Delete() on annule<+>le filtre table.DefaultView.RowFilter = "" on affiche la version original des lignes supprimees

- 12 -

ENI Editions - All rigths reserved

table.DefaultView.RowStateFilter = DataViewRowState.Deleted For Each ligne In table.DefaultView Console.WriteLine("Pays : {0}" & vbTab & vbTab & " nom : {1}", ligne("Country"), ligne("ContactName")) Next

k.Rechercherdesdonnes
LarecherchepeutseffectueraveclesdeuxmthodesFindet FindRows.Pourquecesdeuxmthodesfonctionnent,il estimpratifdavoiraupralabletrilesdonnesaveclapropritSort. Find Cette mthode retourne lindex de la premire ligne correspondant au critre de recherche. Si aucune ligne nest trouve,cettemthoderetourne1.Elleattendcommeparamtrelavaleurrecherche.Cettevaleurestrecherche dans le champ utilis comme critre de tri. Si le critre de tri est compos de plusieurs champs, il faut passer la mthodeFinduntableaudobjetscontenantlesvaleursrecherchespourchaquechampducritredetridanslordre dapparitiondanslapropritSort. Cettemthodeestsouventutilisepourrechercherunelignepartirdelaclprimaire. Imports System.Data.SqlClient Module TestFind Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Dim table As DataTable Dim ligne As DataRowView Dim codeClient As String Dim index As Integer Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true ctn.Open() cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT * from Customers ds = New DataSet da = New SqlDataAdapter(cmd) da.Fill(ds, "Clients") table = ds.Tables("Clients") Console.Write("saisir le code client : ") codeClient = Console.ReadLine() table.DefaultView.Sort = "CustomerID ASC" index = table.DefaultView.Find(codeClient) If index = -1 Then Console.WriteLine("il ny a pas de client avec ce code") Else Console.WriteLine("le code {0} correspond au client {1}", codeClient, table.DefaultView(index)("ContactName")) End If Console.ReadLine() End Sub End Module FindRows Cettemthoderecherchetoutesleslignescorrespondantaucritrederechercheetretourneceslignessousforme duntableaudeDataRowView. Lecodesuivantrecherchetouslesclientsdunpaysetdunevilledonns : Imports System.Data.SqlClient Module TestFindRows Dim cmd As SqlCommand

ENI Editions - All rigths reserved

- 13 -

Dim Dim Dim Dim Dim Dim Dim Dim

ctn As SqlConnection ds As DataSet da As SqlDataAdapter table As DataTable ligne As DataRowView pays, ville As String lignesTrouvees() As DataRowView criteres() As Object

Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT * from Customers" ds = New DataSet da = New SqlDataAdapter(cmd) da.Fill(ds, "Clients") table = ds.Tables("Clients") Console.Write("saisir le Pays : ") pays = Console.ReadLine() Console.Write("saisir la ville: ") ville = Console.ReadLine() table.DefaultView.Sort = "Country ASC,City ASC" criteres = (New Object() {pays, ville}) lignesTrouvees = table.DefaultView.FindRows(criteres) If lignesTrouvees.Length = 0 Then Console.WriteLine("il ny a pas de client correspondant") Else Console.WriteLine("les clients suivants correspondent ") For Each ligne In lignesTrouvees Console.WriteLine("Nom :{0}", ligne("ContactName")) Next End If Console.ReadLine() End Sub End Module

4.Mettrejourlabasededonnes
Tout le travail effectu sur les donnes avec les mthodes vues prcdemment est irrmdiablement perdu la fermeturedelapplication,sinousneprenonspassoindesauvegarderlesdonnes. Dans la majorit des cas, les donnes proviennent dune base de donnes, il faut donc la mettre jour avec les modificationscontenuesdansun DataSet,une DataTable ou une DataRow.Le DataAdapteratutilispourremplirle DataSet,cestgalementluiquelonvafaireappelpourmettrejourlabasededonnes. CommelamthodeFill,lamthodeUpdatevautiliserdesinstructionsSQLpourledialogueaveclabasededonnes. En fonction des besoins, elle utilisera linstruction contenue dans la commande InsertCommand, UpdateCommand ou DeleteCommand.Silamthode Updateabesoindunecommandeetquellenestpasdisponible,alorsuneexceptionest gnre.Lamthode Fillparcourtleslignesdela DataTablequelledoitmettrejouret,enfonctiondeltatdela ligne (Added, Deleted, Modified), appelle la commande InsertCommand, DeleteCommand, UpdateCommand. Lordre dans lequellesmisesjoursonteffectuesdanslabase,peutavoirdelimportance.Pourcontrlerlordredexcutiondes insertions,modificationsetsuppressions,vouspouvezprocderentroistapes,enneproposantlamthodeUpdate quun jeu restreint de lignes mettre jour. Vous pouvez, par exemple, ne slectionner que les lignes effaces et demanderlamisejourdelabaseaveccetensembledelignespuisprocderdemmeavecleslignesmodifieset leslignesajoutes. LamthodeSelectpermetdobteniruntableaudeDataRowcorrespondantuncritrespcifique.Cestcetableaude DataRowquiestpasscommeparamtrelamthodeUpdate. Lexemplesuivantraliselessuppressions,lesmodificationspuislesajoutsdanslabasededonnes. Dim lignes() As DataRow recupere les lignes supprimees et demande la mise a jour de la base lignes = table.Select(Nothing, Nothing, DataViewRowState.Deleted) da.Update(table)
- 14 ENI Editions - All rigths reserved

recupere les lignes modifiees et demande la mise a jour de la base lignes = table.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent) da.Update(table) recupere les lignes ajoutees et demande la mise a jour de la base lignes = table.Select(Nothing, Nothing, DataViewRowState.Added) da.Update(table)

etexemplesupposebiensrquelescommandes InsertCommand,DeleteCommand,UpdateCommandsoientdfinies C aupralable.

a.Gnrationautomatiquedecommandes
Les commandes charges de la mise jour de la base peuvent tre gnres automatiquement par un objet SqlCommandBuilder.Pourfonctionnercorrectement,leSqlCommandBuilderaquelquesexigences :
q

LapropritSelectCommanddoittredfiniepourleDataAdaptercarcestpartirdecetteinstructionSQLquil vagnrerlesinstructionsINSERT,UPDATE,DELETE. LaclprimairedoittredisponibledanslaDataTable. Lesdonnesnedoiventpasprovenirdunejointureentreplusieurstables.

Si une ou plusieurs de ces exigences ne sont pas respectes, il y a dclenchement dune exception lors de la gnrationdescommandes. Lescommandessontgnresenrespectantlescritressuivants : InsertCommand Insre une ligne dans la base pour toutes les lignes dont ltat est Added. Tous les champs, hormis les champs identit,expressionouTimeStampsontmisjour. UpdateCommand Metjourdanslabasetoutesleslignesdontltatest Modified.Tousleschampssontmisjoursaufleschamps identit,expressionouTimeStamp.Lalignemettrejourestrecherchedanslabase,parlaclprimaire,maisil fautgalementquelesvaleursdes autreschampsdanslabasecorrespondentlaversion Originalduchampdans laDataRow. DeleteCommand Effacedelabasetoutesleslignesdontltatest Deleted.Ilfautgalementquelesvaleursprsentesdanslabase correspondentlaversion Originaldeschampsdansla DataRow.Lescommandesgnressontdisponiblesviales mthodesGetInsertCommand,GetUpdateCommand,GetDeleteCommand. Lexemple suivant affiche les instructions SQL des trois commandes gnres automatiquement pour la table Customers : Imports System.Data.SqlClient Module TestOrdreMAJBase Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Dim table As DataTable Dim ligne As DataRowView Dim codeClient As String Dim index As Integer Dim bldr As SqlCommandBuilder Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" ctn.Open() cmd = New SqlCommand

ENI Editions - All rigths reserved

- 15 -

cmd.Connection = ctn cmd.CommandText = " SELECT * from Customers" ds = New DataSet da = New SqlDataAdapter(cmd) da.Fill(ds, "Clients") table = ds.Tables("Clients") bldr = New SqlCommandBuilder(da) Console.WriteLine("Instruction SQL de UpadteCommand : {0}", bldr.GetUpdateCommand.CommandText) Console.WriteLine("Instruction SQL de InsertCommand : {0}", bldr.GetInsertCommand.CommandText) Console.WriteLine("Instruction SQL de DeleteCommand : {0}", bldr.GetDeleteCommand.CommandText) End Sub End Module Cecodeaffichelesinformationssuivantes : Instruction SQL de UpadteCommand : UPDATE [Customers] SET [CustomerID] = @p1, [CompanyName] = @p2, [ContactName] = @p3, [ContactTitle] = @p4, [Address] = @p5, [City] = @p6, [Region] = @p7, [PostalCode] = @p8, [Country] = @p9, [Phone] = @p10, [Fax] = @p11 WHERE (([CustomerID] = @p12) AND ([CompanyName] = @p13) AND ((@p14 = 1 AND [ContactName] IS NULL) OR ([ContactName] = @p15)) AND ((@p16 = 1 AND [ContactTitle] IS NULL) OR ([ContactTitle] = @p17)) AND ((@p18 = 1 AND [Address] IS NULL) OR ([Address] = @p19)) AND ((@p20 = 1 AND [City] IS NULL) OR ([City] = @p21)) AND ((@p22 = 1 AND [Region] IS NULL) OR ([Region] = @p23)) AND ((@p24 = 1 AND [PostalCode] IS NULL) OR ([PostalCode] = @p25)) AND ((@p26 = 1 AND [Country] IS NULL) OR ([Country] = @p27)) AND ((@p28 = 1 AND [Phone] IS NULL) OR ([Phone] = @p29)) AND ((@p30 = 1 AND [Fax] IS NULL) OR ([Fax] = @p31))) Instruction SQL de InsertCommand : INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11) Instruction SQL de DeleteCommand : DELETE FROM [Customers] WHERE (([CustomerID] = @p1) AND ([CompanyName] = @p2) AND ((@p3 = 1 AND [ContactName] IS NULL) OR ([ContactName] = @p4)) AND ((@p5 = 1 AND [ContactTitle] IS NULL) OR ([ContactTitle] = @p6)) AND ((@p7 = 1 AND [Address] IS NULL) OR ([Address] = @p8)) AND ((@p9 = 1 AND [City] IS NULL) OR ([City] = @p10)) AND ((@p11 = 1 AND [Region] IS NULL) OR ([Region] = @p12)) AND ((@p13 = 1 AND [PostalCode] IS NULL)OR ([PostalCode] = @p14)) AND ((@p15 = 1 AND [Country] IS NULL) OR ([Country] = @p16)) AND ((@p17 = 1 AND [Phone] IS NULL) OR ([Phone] = @p18)) AND ((@p19 = 1 AND [Fax] IS NULL) OR ([Fax] = @p20))) Lemoinsquelonpuissedire,cestquececodenestpastrsparlant! Rassurezvousdansleparagraphesurlesaccsconcurrents,nousallonsclaircirlaprsencedecesinnombrables paramtres dans ces trois instructions SQL. Limportant, pour le moment, est que ces instructions ralisent correctementlamisejourdelabasededonnes. Nous allons le vrifier en ralisant un ajout, une modification et une suppression dans la table Customers sur des clientsFranais.Regardonsltatdelatableavantdeffectuernosmodifications.

Excutonsensuitelecodecidessous :

- 16 -

ENI Editions - All rigths reserved

Imports System.Data.SqlClient Module TestMAJBase Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Dim table As DataTable Dim ligne As DataRow Dim bldr As SqlCommandBuilder Public Sub main() ctn = New SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" ctn.Open() cmd = New SqlCommand cmd.Connection = ctn cmd.CommandText = " SELECT * from Customers where country=France" ds = New DataSet da = New SqlDataAdapter(cmd) da.Fill(ds, "Clients") table = ds.Tables("Clients") efface Frederique Citeaux table.Rows(7).Delete() change adresse Carine Schmitt table.Rows(4)("Address") = "9 rue Benjamin Franklin" ajout dun nouveau client ligne = table.NewRow ligne("CustomerID") = "ENIEC" ligne("CompanyName") = "Eni Ecole Informatique" ligne("ContactName") = "Marcel dupond" ligne("ContactTitle") = "Directeur" ligne("Address") = "24 rue Crbilon" ligne("Country") = "France" ligne(_City")="Nantes" table.Rows.Add(ligne) bldr = New SqlCommandBuilder(da) da.Update(table) End Sub End Module ComparonslecontenuactuelaveclecontenuprcdentdelatableCustomers,pourvrifierquelesmodificationsont bientprisesencompte.

b.Utilisationdecommandespersonnalises
Lutilisationdecommandespersonnalisespermetdechoisirletypedactioneffectulorsdelamisejourdelabase de donnes. Par exemple, leffacement dune ligne peut se traduire par laffectation dune valeur particulire un champ de lenregistrement. Dans ce cas, linstruction SQL excute dans la DeleteCommand sera une instruction UPDATEpluttquuneinstructionDELETE. Parexemple,lecodesuivantcreunecommandepersonnalisepourlasuppression :

ENI Editions - All rigths reserved

- 17 -

delCmd = New SqlCommand delCmd.Connection = ctn delCmd.CommandText = " UPDATE Customers set Archive=1 where CustomerID=@num" codeClient = New SqlParameter("@num", SqlDbType.NChar, 5, ParameterDirection. Input, False, Nothing, Nothing, "CustomerID", DataRowVersion.Current, Nothing) delCmd.Parameters.Add(codeClient) da.DeleteCommand = delCmd bldr = New SqlCommandBuilder(da)

es commandes personnalises sont compatibles avec les commandes gnres automatiquement par le L SqlCommandBuilderpuisqueceluicinegnreunecommandequesilapropritInsertCommand,DeleteCommand ou UpdateCommandestgale nothingdansle DataAdapter.Siunecommandeexiste,ellenestpasremplacepar leSqlCommandBuilder.

c.Gestiondesaccsconcurrents
Dansunenvironnementmultiutilisateurs,deuxtechniquesexistentpourlagestiondesmisesjour : leverrouillage optimisteetleverrouillagepessimiste. Le verrouillage pessimiste est le plus contraignant pour les utilisateurs puisque, pour viter les conflits lors des modifications de la base, ds quun utilisateur souhaite modifier un enregistrement, celuici est verrouill dans la base.Tantquelamodificationdelenregistrementnestpastermine,leverrouresteactif,bloquantainsilaccsdes autresutilisateurs.Loptiquedecettesolutionestdviterlapparitiondeconflits. Le verrouillage optimiste nest pas rellement un verrouillage puisque les enregistrements sont pratiquement disponiblesenpermanence.Cestaumomentdelamisejourquuntestesteffectu,pourvrifiersilesdonnes prsentes dans la base sont identiques aux donnes utilises pour remplir le DataSet. Si les donnes sont diffrentes,cestquunautreutilisateurlesamodifiesentreleremplissageduDataSetetlademandedemisejour delabase.Ilconvientalorsdeprendreunedcisionconcernantlesmisesjour. Troissolutionssontenvisageables :
q

Onabandonnelesmisesjour. Oncraselaversionexistante. Ondemandelutilisateurcequilsouhaite.

Cettesolutionpeuttremiseen uvreavecdeuxtechniquescourantes. La premire est dutiliser, dans la table, un champ de type TimeStamp. La particularit de ce type de champ est davoir une valeur changeant automatiquement chaque modification effectue sur lenregistrement. Il suffit donc deffectuerunecomparaisondelavaleurprsentedanslabaseaveclavaleurprsentedanslapplication.Silyaune diffrence,cestquelabaseatmodifiedepuislechargementduDataSet. Pourquecettesolutionsoitenvisageable,ilfautquelabasededonnessoitcapabledegrercetypedechamp. Cette solution augmente aussi le volume des donnes puisque, par exemple pour SQL Server, ce type de champ utilisehuitoctets. La deuxime solution est de grer cela au niveau de lapplication, en conservant les donnes originales et en les comparantaveclesdonnesprsentesdanslabaseaumomentdelamisejour.Cestcettesolutionquiestutilise danslescommandesgnresautomatiquementparlobjet SqlCommandBuilder. Analysonslecodedunerequtedemodificationgnreparcetobjet. UPDATE [Customers] SET [CustomerID] = @p1, [CompanyName] = @p2, [ContactName] = @p3, [ContactTitle] = @p4, [Address] = @p5, [City] = @p6, [Region] = @p7, [PostalCode] = @p8, [Country] = @p9, [Phone] = @p10, [Fax] = @p11 WHERE (([CustomerID] = @p12) AND ([CompanyName] = @p13) AND ((@p14 = 1 AND [ContactName] IS NULL) OR ([ContactName] = @p15)) AND ((@p16 = 1 AND [ContactTitle] IS NULL) OR ([ContactTitle] = @p17)) AND ((@p18 = 1 AND [Address]IS NULL) OR ([Address] = @p19)) AND ((@p20 = 1 AND [City] IS NULL) OR ([City] = @p21)) AND ((@p22 = 1 AND [Region] IS NULL) OR ([Region] = @p23)) AND ((@p24 = 1AND [PostalCode] IS NULL) OR ([PostalCode] = @p25)) AND ((@p26 = 1 AND [Country]IS NULL) OR ([Country] = @p27)) AND ((@p28 = 1 AND [Phone] IS NULL) OR<+>([Phone] = @p29)) AND ((@p30 = 1 AND [Fax] IS NULL) OR ([Fax] = @p31)))

- 18 -

ENI Editions - All rigths reserved

Cettecommandeutiliseunnombreimpressionnantdeparamtres : trenteetunenfait.Essayonsdexpliquerlerle dechacundecesparamtres. Lesparamtresde@p1@p11sontutilisspourspcifierlesnouvellesvaleursdelenregistrement. Leparamtre@p12estutilispouridentifierlenregistrementmettrejoureneffectuantuntestsurlaclprimaire. Lesautresparamtresnesontlquepourlagestionduverrouillageoptimiste.Pourchaquechamp,onvrifieque lesdonnesprsentesdanslabasesontidentiquesauxdonnesdu DataSet.Pourleschampsnautorisantpasles valeursnulles,lavrificationesttrssimple.Cestlecasduchamp CompanyNamequiestcomparavecleparamtre @p13. Pourleschampsautorisantlesvaleursnulles,ilfaututiliserunepetiteastuce.Eneffet,ilestseulementpossiblede vrifierquunchampestnuloupasdanslabase,maisilnepeutpasyavoirdecomparaisonaveclavaleurNull.Pour pallier cette limitation, les paramtres @p14,@p16,@p18,@p20,@p22 @p24,@p26,@p28,@p30 sont utiliss pour reprsenterlavaleur Nullpourunchampdansle DataSet.Sileurvaleurestgale1,cestquelechampestgal Nulldansle DataSet.Letestsurlavaleurdecesparamtresestdonccombinavecloprateur Andpourvrifierla nullitsimultaneduchampcorrespondantdanslabase.Lorsdelexcutiondelacommande,lesparamtressont remplacsparlesvaleursprsentesdansle DataSet.Enfonctionduparamtre,desversionsdiffrentesdelaligne sontutilises. Pourlesparamtres@p1@p11,lesversions Currentsontutilises.Cesontlesdonnesquelonveuttransfrer dans la base de donnes. Pour les autres paramtres, ce sont les versions Original des paramtres qui sont utilises. La version de la ligne utiliser est dtermine au moment de la cration du paramtre, avant son ajout dans la collectionParameters.Pourcela,leconstructeursuivantestutilis : Public Sub New (parameterName As String, dbType As SqlDbType, ,size As Integer, direction As ParameterDirection, isNullable As Boolean, precision As Byte, scaleAs Byte, sourceColumn As String, sourceVersion As DataRowVersion, value As Object ) Ilpermetdassocierautomatiquementuneversiondunchampparticulierunparamtre.Cestlerledesarguments sourceColumnet sourceVersion.Lexcution de la commande renvoie le nombre denregistrementsrellementmis jour.Silacommandenepeutpasmettrejourleschamps,alorslavaleurrenvoyeparlexcutiondelacommande estgalezro.Danscecas,ilyadclenchementduneexception :

Une solution moins brutale permet de surveiller les mises jour au fur et mesure de lexcution des instructions SQL. Il faut pour cela grer lvnement RowUpdated du DataAdapter qui est dclench aprs lappel de chaque InsertCommand,DeleteCommand, UpdateCommand.LeparamtredetypeRowUpdatedEventArgspermetdesavoirparla propritRecordsAffectedcombiendenregistrementsonttmisjour. Si aucun enregistrement na t mis jour, vous pouvez choisir laction entreprendre en modifiant la proprit StatusaveclunedesvaleursdelnumrationUpdateStatus : Continue Lamisejoursepoursuitcommesiriennestaitpass. ErrorsOccurred Uneexceptionvatredclenche.

ENI Editions - All rigths reserved

- 19 -

SkipAllRemainingRows Arrtdelamisejourdeslignesrestantes. SkipCurrentRow Arrtdelamisejourdelalignecourante.Lamisejourcontinueavecleslignesrestantes. Le type daction entreprendre doit, en principe, tre laiss lapprciation de lutilisateur comme dans lexemple suivant : Private Sub da_RowUpdated(ByVal sender As Object, ByVal e As System.Data. SqlClient.SqlRowUpdatedEventArgs) Handles da.RowUpdated Dim reponse As Integer If e.RecordsAffected = 0 Then Console.WriteLine("Une erreur sest produite lors de la mise jour de la base de donnes") Console.WriteLine("vous souhaitez :") Console.WriteLine("1 - continuer les mises a jour") Console.WriteLine("2 - annuler les mises a jour") Console.WriteLine("3 - annuler la mise a jour de cette ligne mais continuer pour les autres lignes) reponse = Console.ReadLine() Select Case reponse Case 1 e.Status = UpdateStatus.Continue Case 2 e.Status = UpdateStatus.SkipAllRemainingRows Case 3 e.Status = UpdateStatus.SkipCurrentRow End Select End If End Sub

5.Lestransactions
Les transactions permettent de regrouper dans une entit, un ensemble de commandes SQL. Ce regroupement va garantirque,silunedesinstructionscontenuesdanslatransactionchoue,labasededonnespourraretrouverson tatinitial.Lexempleclassiqueestlevirementduncomptebancaireunautre.Imaginezquevousayez,dansvotre basededonnes,unetablepourlescomptesdesparticuliersetunetablepourlescomptesdesentreprises. Letransfertduncompteentrepriseversuncompteparticulier(lepaiementdevotresalaire)pourraitseffectueravec lesinstructionssuivantes : Imports System.Data.SqlClient Module TestTransaction Dim cmdPart, cmdEnt As SqlCommand Dim ctn As SqlConnection Dim numParticulier, numEntreprise, montantPart, montantEnt As SqlParameter Public Sub main() ctn = New SqlClient.SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" ctn.Open() cmdEnt = New SqlClient.SqlCommand cmdEnt.Connection = ctn cmdEnt.CommandText = "Update ComptesEntreprise set solde= solde-@montant where numCompte=@numCompte" numEntreprise = New SqlParameter("@numCompte", SqlDbType.Int) numEntreprise.Value = 1234 cmdEnt.Parameters.Add(numEntreprise) montantEnt = New SqlParameter("@montant", SqlDbType.Decimal) montantEnt.Value = 3000 cmdEnt.Parameters.Add(montantEnt) cmdEnt.ExecuteNonQuery() cmdPart = New SqlClient.SqlCommand
- 20 ENI Editions - All rigths reserved

cmdPart.Connection = ctn cmdPart.CommandText = "Update ComptesParticulier set solde= solde+@montant where numCompte=@numCompte" numParticulier = New SqlParameter("@numCompte", SqlDbType.Int) numParticulier.Value = 5678 cmdPart.Parameters.Add(numParticulier) montantPart = New SqlParameter("@montant", SqlDbType.Decimal) montantPart.Value = 3000 cmdPart.Parameters.Add(montantPart) cmdPart.ExecuteNonQuery() ctn.Close() End Sub End Module Quesepassetil,sipendantlexcutiondececodeleserveurdebasededonnesdevientindisponiblecausedun problmerseauparexemple ?Loprationdedbitpeutavoirteffectuealorsqueloprationdecrditnapaspu sexcutercorrectement.Ilrisquedoncdyavoirungrosproblmedanslefonctionnementdelapplication(etpourle paiement de votre salaire). Les transactions vont permettre de rsoudre ce problme, en regroupant lexcution dinstructionsSQLpourgarantirquellesseronttoutesexcutesouquaucuneneseraexcute. Les transactions sont gres au niveau de la connexion, cest donc elle qui va nous permettre de dmarrer une transaction. La mthode BeginTransaction nous retourne une instance de la classe SqlTransaction. Pour chaque excutiondecommande,nouspouvonsalorsindiquersilexcutiondoitsepasserdanslecontextedelatransaction ou lextrieur. la fin du traitement, nous pouvons valider toutes les instructions confies la transaction ou au contrairelesannulertoutes.LamthodeCommitvalidelatransactionalorsquelamthodeRollBacklannule. Pourscuriserlecodeprcdent,nouspourrionsutiliserlaversionsuivante : Imports System.Data.SqlClient Module TestTransaction Dim cmdPart, cmdEnt As SqlCommand Dim ctn As SqlConnection Dim numParticulier, numEntreprise, montantPart, montantEnt As SqlParameter Dim trans As SqlTransaction Public Sub main() ctn = New SqlClient.SqlConnection() ctn.ConnectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" ctn.Open() trans = ctn.BeginTransaction Try cmdEnt = New SqlClient.SqlCommand cmdEnt.Connection = ctn cmdEnt.CommandText = "Update ComptesEntreprise set solde=solde@montant where numCompte=@numCompte" numEntreprise = New SqlParameter("@numCompte", SqlDbType.Int) numEntreprise.Value = 1234 cmdEnt.Parameters.Add(numEntreprise) montantEnt = New SqlParameter("@montant", SqlDbType.Decimal) montantEnt.Value = 3000 cmdEnt.Parameters.Add(montantEnt) place lexecution de la commande dans la transaction cmdEnt.Transaction = trans cmdEnt.ExecuteNonQuery() cmdPart = New SqlClient.SqlCommand cmdPart.Connection = ctn cmdPart.CommandText = "Update ComptesParticuliers set solde=solde+ @montant where numCompte=@numCompte" numParticulier = New SqlParameter("@numCompte", SqlDbType.Int) numParticulier.Value = 5678 cmdPart.Parameters.Add(numParticulier) montantPart = New SqlParameter("@montant", SqlDbType.Decimal) montantPart.Value = 3000 cmdPart.Parameters.Add(montantPart) cmdPart.Transaction = trans cmdPart.ExecuteNonQuery() trans.Commit() Catch ex As Exception trans.Rollback()

ENI Editions - All rigths reserved

- 21 -

Console.WriteLine("toutes les oprations ont ete annulees") End Try ctn.Close() End Sub End Module

ilaconnexionestinterrompue,linstruction RollBackou Commitnepourrapastreachemineversleserveur. S Dans ce cas, le serveur prend linitiative dexcuter un RollBack sur toutes les transactions en cours, si la connexionavecleclientestperdue.

- 22 -

ENI Editions - All rigths reserved

PrsentationdeLINQ
Aprs de nombreuses annes dvolution les langages objets sont devenus incontournables dans les dveloppements informatiques.Paralllementlessystmesdestockageontgalementvolusprincipalementsurdeuxaxes : lesbases dedonnesetlesfichiersXML.Lacohabitationentreconceptsobjetsetdonnessefaittantbienquemalparlajoutaux langages objets de quelques capacits pour dialoguer avec les donnes. Cette solution nest pas entirement satisfaisantecarelleprsentelesinconvnients suivants:
q

Lelangageutilispourmanipulerlesdonnesesttrssouventspcifiqueuntypedesourcededonnes. Les mots cls de ce langage sont inconnus du langage de programmation qui les considre comme de simples chanesdecaractresdoncpasdevrificationsyntaxiqueavantlexcution. Lechangementdetypedesourcededonnesentranedelourdesmodificationsducodeetunenouvellepriode dapprentissagepourledveloppeur. Lestypesdedonnessontparfoisincompatiblesentrelelangagedeprogrammationetlasourcededonnes.Il fautdanscecasraliserdesconversionssouventgourmandesentempsetmmeparfoisdangereuses.

AvecLINQtoutcecivadevenirquedesmauvaissouvenirs.Maisquesecachetilderrirecesquatrelettres : Language IntegratedQuery ou Langage de requte intgr ? Il sagit donc dunlangagederequtepermettantlinterrogationde sourcesdedonnes.MaisquatildeplusquecebraveSQL ?Lacldumystresesituedansletermeintgr.Eneffet contrairementdautresmthodesutilisespourinterrogerdessourcesdedonnes(SQL,XPATH),LINQfaitpartiedu langagedanslequellapplicationestdveloppe(VB,C#).UnautrepointtrsimportantconcernantLINQrsidedansla syntaxe mme du langage. Celleci sera identique quel que soit le type de source de donnes interroge : tableau, collection,basededonnes,fichierXML,datasetLedernierpointimportantdecetteprsentationdeLINQconcerneles donnesmanipules.VotreapplicationestdveloppeavecunlangageobjetetbienLINQluiaussimanipuledesobjets. Il ny a donc pas besoin de raliser manuellement les oprations de conversion. Si elles sont ncessaires, elles seront ralisesautomatiquementparLINQ.Aprscebrefaperu,regardonsmaintenantlasyntaxedeLINQ.

ENI Editions - All rigths reserved

- 1-

SyntaxedulangageLINQ
Avant de dtailler la syntaxe de LINQ, nous allons tudier un premier exemple trs simple. Dans les exemples de ce paragraphe, nous utiliserons comme source de donnes deux listes remplies avec des instances des classes du diagrammeciaprs.

Les donnes utilises pour crer ces instances de classe sont extraites de la base de donnes Northwind. Elles sont placesdansunfichiertextequiestensuiteluparlecodepourrecrerlesinstancesdeclasseenmmoire.Voicilextrait decodepermettantderalisercesoprations. Dim listeCommandes As List(Of Commande) Dim listeClients As List(Of Client) Sub Main() listeCommandes = New List(Of Commande) listeClients = New List(Of Client) Dim co As Commande Dim cl As Client Dim f As IO.StreamReader Dim ligne As String Dim col As String() Dim nom As String = "" f = New IO.StreamReader("c:\data.txt", IO.FileMode.Open) Do ligne = f.ReadLine If Not IsNothing(ligne) Then col = ligne.Split(New Char() {vbTab}) If nom <> col(0) Then nom = col(0) cl = New Client() With {.nom = col(0), .adresseFacture = New Adresse With {.rue = col(1), .ville = col(2), .codePostal = col(3)}, .telephone = col(4)} listeClients.Add(cl) End If co = New Commande() With {.codeCommande = col(5), .dateCommande = col(6), .port = col(7), .adresseLivraison = New Adresse With {.rue = col(8), .ville = col(0), .codePostal = col(10)}} listeCommandes.Add(co) co.LeClient = cl

ENI Editions - All rigths reserved

- 1-

cl.LesCommandes.Add(co) End If Loop Until ligne Is Nothing f.Close() End Sub Danslesexemplesquisuivent,noussupposeronsquecetteportiondecodeadjtexcutepourremplirlesdeux listes.Cettebauchedeprojetestdisponibleentlchargementsurlesitedelditeur.

1.PremiresrequtesLINQ
UnerequteLINQestconstituedetroisactions :
q

lobtentiondesdonnes lacrationdelarequteellemme lexcutiondelarequte.

La premire tape est trs simple puisque pour pouvoir tre utilise comme source de donnes, une classe doit simplementimplmenterlinterfacegnriqueIEnumerable(T).CestlecasdenombreusesclassesduFramework.NET quisontdoncdirectementutilisablesdansdesrequtesLINQ. Pourlessourcesdedonnesnimplmentantpascetteinterface,commeparexempleundocumentXML,desclasses utilitairespermettentdelesrendrecompatiblesavecLINQ. Leplusgrosdutravailestconstituparladeuximetape : lacrationdelarequteellemme. Danslarequte,nousallonsindiquerquellesinformationsnoussouhaitonsobtenirdelasourcededonnes,comment ellesseronttries,regroupesoustructures. Larequtecontienttroisclauses :
q

From : indiquantloriginedesdonnes. Where : spcifielaoulesconditionspourquelesdonnessoientcomprisesdanslesvaleursretournes. Select : indiquequellessontlesinformationsretournespartirdelasourcededonnes.

VoicidonccidessousnotrepremirerequteLINQ. Dim requete = From unClient In listeClients _ Where unClient.nom Like "A*" _ Select unClient GnralementunerequteLINQeststockedansunevariablepuisestexcuteultrieurement.Ilestimportantde bien se souvenir que la variable contenant la requte nexcute aucune action et ne retourne aucune donne. Elle stocke simplement la dfinition de la requte. Lexcution de la requte na lieu que lorsque lon sintresse aux donnesquelle retourne. Cest le cas dans lexemplesuivantonousparcouronslesrsultatsdansuneboucle For Each. For Each unClient In requete Console.WriteLine(unClient.nom) Next Cemcanismepermetdexcuterplusieursfoislammerequtesanstreobligdelaredfinirchaqueexcution. Cependant,danscertainscas,lavariablecontientlersultatdelarequteetnonlarequteellemme.Cestlecas parexemple,lorsquequilyauncalculdagrgatdanslarequte.Danslexemplesuivant,nousrecherchonscombienil yadeclientsdontlenomcommenceparlalettreA.Lersultatdelarequteestdanscecasunsimpleentierquiest calculdsladfinitiondelarequte. Dim nbClients = (From unClient In listeClients _ Where unClient.nom Like "A*" _ Select unClient).Count Console.WriteLine(nbClients)

- 2-

ENI Editions - All rigths reserved

VouspouvezgalementutiliserplusieurssourcesdedonnesdanslaclauseFrom.Pourcela,lemotclJoinpermetde combinerlesdonnesdesdiffrentessources.LexemplesuivantrecherchelesclientsdontlenomcommenceparunA etpourchacunrcupreladatedetouteslescommandes. Dim requete3 =From unClient In listeClients _ Join uneCommande In listeCommandes _ On unClient.nom Equals uneCommande.LeClient.nom _ Where unClient.nom Like "A*" _ Select nomCli = unClient.nom, _ dateCde = uneCommande.dateCommande For Each r In requete3 Console.WriteLine(r.nomCli & " Next

" & r.dateCde)

CecodemriteunpetitcommentairesupplmentaireconcernantlaclauseSelect.Noussouhaitonsobtenirlenomdu clientetladatedescommandessoitunechanedecaractresetunedate.Ilestinutiledutiliseruneinstancedela classe Client et une instance de la classe Commande pour simplement ces deux informations. Le compilateur gnre doncuneclasseanonymepourcesdeuxinformationsavecuneproprit nomClietuneproprit dateCde.Letypede lavariable rutilisedanslaboucleFor Eachpourparcourirlersultatdelarequteseradterminimplicitementpour correspondreautypeanonymecrparlecompilateur.

2.Lesoprateursderequte
LesoprateurspermettantlacrationderequteLINQpeuventtreclasssenhuitcatgories :
q

Tridedonnes Oprationssurdesensemblesdedonnes Filtrage Projection Partitionnement Jointures,regroupements Quantificateurs Agrgation

Pour crire des requtes LINQ efficaces, il convient de bien connatre ces oprateurs. Nous allons donc les dtailler avecdenombreuxexemples.

a.Tridedonnes
Iltrsfaciledobtenirlesrsultatsdunerequtetrisselonunouplusieurscritres.Grceloprateur Order By, nousdevonsindiquerlapropritsurlaquellevatreralisletri.Larequtesuivantetrielesclientsenfonctionde leurnombredecommandes. Dim requeteTri1 = From unclient In listeClients _ Order By unclient.LesCommandes.Count _ Select unclient For Each unClient In requeteTri1 Console.WriteLine(unClient.nom & "nb commandes:" & unClient.LesCommandes.Count) Next Par dfaut le tri se fait par ordre croissant. Pour obtenir les meilleurs clients en dbut de liste, il est prfrable dutiliserlemotclDescendinglasuiteducritredetri.
ENI Editions - All rigths reserved - 3-

Dim requeteTri2 = From unclient In listeClients _ Order By unclient.LesCommandes.Count Descending _ Select unclient For Each unClient In requeteTri2 Console.WriteLine(unClient.nom & "nb commandes:" & unClient.LesCommandes.Count) Next Plusieurscritresdetripeuventtreindiquspourleverlesambigutslorsquedeuxpropritsontlammevaleur. Lescritresdetridoiventtresparspardesvirgulesdanslarequte.Larequtetrielesclientssurlenombrede commandesdanslordredcroissantpuissurlenomduclientdanslordrecroissantencasdgalitdunombrede commandes. Dim requeteTri3 = From unclient In listeClients _ Order By unclient.LesCommandes.Count Descending, unclient.nom Ascending _ Select unclient For Each unClient In requeteTri3 Console.WriteLine(unClient.nom & "nb commandes:" & unClient.LesCommandes.Count) Next

b.Oprationssurdesensemblesdedonnes
Le seul oprateur disponible dans cette catgorie permet llimination des doublons lors de la recherche dinformations. Le mot clDistinct plac la fin de la clause Select indique que les doublons seront limins. LensembledeslmentsdelaclauseSelectestprisencomptepourlliminationdesdoublons.Larequtesuivante dterminelesdiffrentesvillesonousavonsdesclients.Sinousavonsplusieursclientsdanslammeville,celleci neseralistequuneseulefois. Dim requeteEnsemble = From unclient In listeClients _ Order By unclient.adresseFacture.ville _ Select unclient.adresseFacture.ville Distinct For Each ville In requeteEnsemble Console.WriteLine(ville) Next

c.Filtragededonnes
Le filtrage consiste rduire le nombre dlments retourns par la requte. Une ou plusieurs expressions sont ajouteslarequtelaidedelaclause Where.Ellesdoiventfournirunboolenlorsdelvaluationdelarequte. LesoprateursdecomparaisonstandarddeVisualBasicpeuventtreutilisslintrieurdelexpression.Lutilisation dechanesdecaractresdansuneclause Wheremriteunepetiteprcision.Bienquelonpuisseutiliserloprateur =pouruncritredefiltrageportantsurunechanedecaractres,lutilisationdelamthode Equalsoffrebeaucoup plus de fonctionnalits. En effet, avec loprateur = il doit y avoir une stricte galit avec une distinction entre minuscules et majuscules pendant le test. La mthode Equals est plus souple puisque elle permet dindiquer commentdoitsefairelacomparaisonetventuellementignorerladistinctionentreminusculesetmajusculescomme danslexemplecidessous. Dim requeteFiltrage = From unclient In listeClients _ Where unclient.adresseFacture.ville.Equals("nantes", StringComparison.OrdinalIgnoreCase) _ Select unclient For Each unclient In requeteFiltrage Console.WriteLine(unclient.nom) Next

d.Projections
Uneoprationdeprojectioncorrespondlatransformationdunobjetenunenouvelleforme.Cettenouvelleforme estconstitueparlensemble des proprits de lobjet spcifi dans la clause Select.Enutilisantlaprojection,on peutautomatiquementcrerunnouveautypequiestconstruitpartirdechaqueobjet.Vouspouvezprojeterune proprit directement ou bien excuter une fonction prenant comme paramtre la proprit. Cest dans ce cas le
- 4 ENI Editions - All rigths reserved

rsultatdelafonctionquiestutiliscommevaleurpourlapropritdelobjetcr.Vouspouvezaussiprojeterlobjet originalsanslemodifier. Dim requeteProjection = From unclient In listeClients _ Select nomCli = unclient.nom.ToUpper, villeCli = unclient.adresseFacture.ville.ToLower For Each r In requeteProjection Console.WriteLine(r.nomCli & " " & r.villeCli) Next Les projections sont galement ralisables en indiquant plusieurs clauses From dans la requte. Dans ce cas, le rsultatdelarequtefaitcorrespondrechaqueobjetdechacunedessourcesdedonnesavectouslesobjetsdes autressources. Dim requeteProjection1 = From unclient In listeClients _ From unCommande In listeCommandes _ Select cli = unclient, cmd = unCommande For Each r In requeteProjection1 Console.WriteLine(r.cli.nom & " " & r.cmd.dateCommande) Next Ce genre dopration conduit trs rapidement une explosion combinatoire. En effet, le nombre dobjets dans le rsultatdelarequteestgalauproduitdesnombresdobjetsdanschacunedessourcesdedonnes.Unfiltrage permettantderestreindrelenombredobjetsdanslersultatestengnralsouhaitableaveccetypedeprojection. Dim requeteProjection2 = From unclient In listeClients _ From unCommande In listeCommandes _ Where unclient.Equals(unCommande.LeClient) _ Select cli = unclient, cmd = unCommande For Each r In requeteProjection2 Console.WriteLine(r.cli.nom & " " & r.cmd.dateCommande) Next

e.Partitionnement
Le partitionnement consiste dcouper en deux parties un ensemble de donnes et retourner une des deux parties.Lalimitedudcoupagepeuttreabsolue,etdanscecasexprimeennombredobjets, ou conditionnelle. Deuxclausessontutilisespourlepartitionnement :
q

Skipindique que lon souhaite obtenir la deuxime partie de la liste (en fait on sauteles objets placs au dbut) Takeindiquequelonsouhaiteobtenirledbutdelalistesanstenircomptedesenregistrementsdelafinde liste.

Voyonscommentutilisercesdeuxoprateursaveclasyntaxeabsolueetlasyntaxeconditionnelle. La requte suivante permet dobtenir la liste des dix plus mauvais clients (en se basant sur le nombre de commandes). Dim requetePartition = From unclient In listeClients _ Order By unclient.LesCommandes.Count _ Skip listeClients.Count - 10 _ Select unclient For Each unclient In requetePartition Console.WriteLine(unclient.nom) Next Pourillustrerlasyntaxeconditionnelle,nousrecherchonsmaintenanttouslesclientsayantunnombredecommandes infrieurougal5. Dim requetePartition1 = From unclient In listeClients _ Order By unclient.LesCommandes.Count Descending _ Skip While unclient.LesCommandes.Count > 5 _ Select unclient For Each unclient In requetePartition1

ENI Editions - All rigths reserved

- 5-

Console.WriteLine(unclient.nom & " " & unclient.LesCommandes.Count) Next Pourrcompensernosclientsfidles,recherchonsmaintenantlesdixmeilleursdentreeux. Dim requetePartition2 = From unclient In listeClients _ Order By unclient.LesCommandes.Count Descending _ Take 10 _ Select unclient For Each unclient In requetePartition2 Console.WriteLine(unclient.nom) Next Etenfinrecherchonslesclientsayantpasssaumoinsdixcommandes. Dim requetePartition3 = From unclient In listeClients _ Order By unclient.LesCommandes.Count Descending _ Take While unclient.LesCommandes.Count >= 10 _ Select unclient For Each unclient In requetePartition3 Console.WriteLine(unclient.nom & " " & unclient.LesCommandes.Count) Next

f.Jointuresetregroupements
Lajointurededeuxsourcesdedonnescorrespondlassociationdunedessourcesdedonnesaveclesobjetsde lautre source de donnes ayant une proprit commune. En programmation objet, les jointures permettent de remplacerdesassociationsincompltes.Danslexemplequenousutilisonsdepuisledbutdecechapitre,laclasse Clientcontientunepropritpermettantdobtenirlalistedescommandesdunclient(LesCommandes)etlaclasse Commandecontientunattributpermettantderfrencerleclientayantpasslacommande(LeClient).Lassociationest donc, dans notre cas, bidirectionnelle. Si par conomie ou par oubli, la proprit LesCommandes de la classe Client nexiste pas, il faut dans ce cas parcourir la liste des commandes et tester chacune delles pour trouver toutes les commandesdunclientprcis.Cestcetravailqueraliselajointure.Larequtesuivanteobtientlescommandesde chaqueclient. Dim requeteJoin = From unclient In listeClients _ Join uneCommande In listeCommandes On unclient Equals uneCommande.LeClient _ Select unclient, uneCommande For Each r In requeteJoin Console.WriteLine(r.unclient.nom & " " & r.uneCommande.dateCommande) Next Pour chaque commande les informations concernant le client sont rptes. Une solution plus efficace consiste excuterlarequtepourquelleajoutechaqueclientlalistedesescommandes.Laclause Group Joinpermetde raliser ce regroupement. Il est galement ncessaire dans ce cas de spcifier avec la clause Into, le nom de la propritutilisepouraccderauregroupement,dansnotrecaslalistedescommandesduclient.noterpournous quecettepropritferadoublonaveccellequenousavonsdjprvuedansnotreclasseClient. Dim requeteGroupJoin = From unclient In listeClients _ Group Join uneCommande In listeCommandes On unclient Equals uneCommande.LeClient _ Into CommandesDuClient = Group _ Select unclient, CommandesDuClient For Each r In requeteGroupJoin Console.WriteLine(r.unclient.nom) For Each c In r.CommandesDuClient Console.WriteLine(vbTab & c.dateCommande) Next Next Un regroupement peut galement tre ralis sans pour autant faire de jointure entre deux sources de donnes. Nouspouvons,parexemple,rechercherpourchaquevillelalistedesclientsyrsidant.Pourcela,laclauseGroup By Into est idale. Il suffit simplement dindiquer que nous souhaitons regrouper les clients avec comme cl de regroupement leur ville de rsidence et indiquer le nom de la proprit qui sera gnre pour contenir le regroupement. La requte gnre alors, lors de son excution, une liste dinstances de classes contenant deux proprits :
q

Lenomdelaville.

- 6-

ENI Editions - All rigths reserved

Lalistedesclientsparlintermdiairedelapropritindiquedanslarequte.

Dim requeteGroup = From unclient In listeClients _ Group unclient By unclient.adresseFacture.ville _ Into ClientsParVille = Group _ Select ville, ClientsParVille For Each r In requeteGroup Console.WriteLine(r.ville) For Each c In r.ClientsParVille Console.WriteLine(vbTab & c.nom) Next Next

g.Quantificateurs
Lesquantificateurssontutilisspourcontrlersidansunelisteaumoinsunlmentremplituneconditionousitous leslmentsremplissentunecondition.Ilsfournissentlersultatducontrlesousformedunboolenquiengnral estutilisdansuneclause Where.Commeexemple,nousrecherchonslesclientsdonttouteslescommandesontt passesen2007. Dim requeteQuantifier = From unclient In listeClients _ Where (Aggregate cmd In unclient.LesCommandes Into All (cmd.dateCommande.Year = 2007)) _ Select unclient For Each unclient In requeteQuantifier Console.WriteLine(unclient.nom) For Each c In unclient.LesCommandes Console.WriteLine(vbTab & c.dateCommande) Next Next Ladeuximeversionpermetderechercherlesclientsayantpassaumoinsunecommandeen2008. Dim requeteQuantifier1 = From unclient In listeClients _ Where (Aggregate cmd In unclient.LesCommandes Into Any (cmd.dateCommande.Year = 2008)) _ Select unclient For Each unclient In requeteQuantifier1 Console.WriteLine(unclient.nom) For Each c In unclient.LesCommandes Console.WriteLine(vbTab & c.dateCommande) Next Next

h.Agrgations
Lesoprationsdagrgationsontutilisespourlecalculdunevaleuruniquepartirdevaleurscontenuesdansune listedlments.Lesoprationslespluscourantessont :
q

lecalculdemoyenne larecherchedunmaximum larecherchedunminimum lecalculduntotal.

Lexemplesuivantappliquecesquatreoprateurssurlesfraisdeportdetouteslescommandes. Dim moyennePort = Aggregate unCommande In listeCommandes Into Average(unCommande.port) Console.WriteLine("moyenne des frais de port : " & moyennePort)

ENI Editions - All rigths reserved

- 7-

Dim maxiPort = Aggregate unCommande In listeCommandes Into Max(unCommande.port) Console.WriteLine("maximum des frais de port : " & maxiPort) Dim miniPort = Aggregate unCommande In listeCommandes Into Min(unCommande.port) Console.WriteLine("minimum des frais de port : " & miniPort) Dim totalPort = Aggregate unCommande In listeCommandes Into Sum(unCommande.port) Console.WriteLine("total des frais de port : " & totalPort) Cecodeestgalementunbonexemplederequteexcuteimmdiatement,puisquepourobtenirlersultat,laliste doitobligatoirementtreparcouruedupremieraudernierlment. Aprs avoir tudi la syntaxe du langage, nous allons voir maintenant comment lutiliser en association avec une basededonnes.

- 8-

ENI Editions - All rigths reserved

LINQversSQL
CommenouslavonsvudanslesparagraphesprcdentsledomainedeprdilectiondeLINQestlemondedesobjets.Il saitparfaitementmanipulerleslistes,lesobjetsetlespropritsdecesobjets.Pourtantceslmentsprsententun gravehandicap : ilsdisparaissentinexorablementdslafindelapplication.Lasolutionlapluscourammentutilisepour pallier ce problme consiste confier une base de donnes le soin dassurer la persistance des informations aprs larrtdelapplication.LelangageSQLestlepluscourammentutilispourledialogueavecunebasededonnes.Bien quelesprincipauxmotsclssoientidentiqueslessyntaxesdecesdeuxlangagesnesontpascompatibles.Lesrequtes LINQ sont donc automatiquement transformes en leurs homologues SQL pour raliser les traitements. Un autre problme doit galement tre pris en compte. Jusqu prsent nous avons manipul, par lintermdiaire des requtes LINQ,desobjetsetrienquedesobjets.Leconceptobjettantparfaitementtrangerunebasededonnesilfaut trouverunesolutionpourqueLINQpuisseaccderauxinformations.Lacldelnigmeconsistetoutsimplementcrer desclassespourreprsenterdanslapplicationlesdonnesprsentesdanslabasededonnes.Cettetechniqueest galementappelemappageobjetrelationnel.CedoittrelapremiretapedanslutilisationdeLINQavecunebase dedonnes.Nousallonsdoncregardercommentcrercesclasses.

1.Lemappageobjetrelationnel
Ilexistetroissolutionspourgnrerlesclassesreprsentantlesinformationsstockesdanslabasededonnes.
q

Crer les classes manuellement comme nimporte laquelle des classes de votre application en utilisant un diteur de code. Cette solution est extrmement fastidieuse et nest en gnral utilise que pour les modificationsminimesdeclassesexistantes. UtiliserloutilenlignedecommandeSQLMetal. UtiliserleconcepteurObjet/Relationnelenmodegraphique.

a.SQLMetal
CetoutilestdisponiblepartirdunefentredecommandedelenvironnementVisualStudio.Lesoptionsindiques surlalignedecommandepermettentdeconfigurerlefonctionnement.Lesoptionsdisponiblesconcernent :
q

Lagnrationpartirdunebasededonnesducodesourcedesclassesetdesattributsdemappage. Lagnrationpartirdunebasededonnesdunfichierintermdiairedemappage(.dbml). Lagnrationpartirdunfichierdemappagedesclassesetdesattributsdemappage.

Chaqueoptiondoittreprcdeparuncaractre/etsuivieparlecaractre :etdelavaleurdeloptionsibesoin. Lesoptionsdeconnexion : /server:<nomduserveur> IndiquelenomouladresseIPduserveurdebasededonnes. /database:<nomdelabasededonnes> Indiquelenomdelabasededonnespartirdelaquellelagnrationdoittreeffectue. /user:<nomdeconnexion> Indiquelecompteutilisateuraveclequellaconnexionverslabasededonnesseraouverte.Sicetteoptionnestpas spcifie,cestlauthentificationWindowsquiserautilise. /password:<motdepasse> Indiquelemotdepasseassociaucompteutilispourtablirlaconnexion. /conn:<chanedeconnexion>

ENI Editions - All rigths reserved

- 1-

Peut tre utilise la place des quatre options prcdentes pour fournir les informations concernant la connexion versleserveurdebasededonnes. timeout:<secondes> Indique la dure maximum pendant laquelle SqlMetal tente dtablir la connexion vers la base de donnes. Une valeurgalezroindiqueunedureillimite. Lesoptionsdesortie : /dbml :<nomdufichier> Gnreunfichierdemappage. /code :<nomdufichier> Gnrelecodesourcedesclassesdanslefichierindiqu. Lesoptionsdegnration : /language :<vboucsharp> Indique le langage dans lequel le code sera gnr. Les deux options valides sont vb pour Visual Basic et csharp pourC#. /namespace :<nom> Indiquelespacedenomdanslequellesclassesserontgnres.Pardfaut,ilnyapasdespacedenom. /context :<nom> Spcifielenomdudatacontextgnr.Pardfaut,cenomestdduitdunomdelabasededonnes. /entitybase :<nom> Spcifielaclassedebasedesclassesgnres.Pardfaut,lesclassesgnresnontpasdeclassedebase. Enfin la dernire information fournir correspond au nom du fichier de mappage partir duquel la gnration des classes sera ralise. Cette information est inutile si la gnration est excute directement depuis la base de donnes. Voiciquelquesutilisationslespluscourantesdecetoutil. GnrationenVisualBasicdesclassesdelabaseNorthwindsituesurlordinateurlocal : SqlMetal /server:localhost /database:northwind /language:vb /code:nw.vb Lecodegnrtanttropvolumineuxpourlelisterici(environ3500lignes),voicisimplementciaprslediagramme desclassesquionttgnres.

- 2-

ENI Editions - All rigths reserved

NousavonslaclasseNorthwindquihritedelaclasseDataContextetquivatrsrapidementnousservirpourque LINQpuissedialogueraveclabasededonnes.Nousavonsgalementuneclassegnrepourchacunedestables delabasededonnes.Cesontdesinstancesdecesclassesquenousmanipuleronsdanslapplication. GnrationdufichierdemappagedelabaseNorthwindsituesurlordinateurlocal : SqlMetal /server:localhost /database:northwind /dbml:nw.dbml Cettecommandegnreunfichierxmldontvoiciunextrait : <Table Name="dbo.Customers" Member="Customers"> <Type Name="Customers"> <Column Name="CustomerID" Type="System.String" DbType="NChar(5) NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> <Column Name="CompanyName" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="false" /> <Column Name="ContactName" Type="System.String" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="ContactTitle" Type="System.String" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="Address" Type="System.String" DbType="NVarChar(60)" CanBeNull="true" /> <Column Name="City" Type="System.String" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Region" Type="System.String" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="PostalCode" Type="System.String" DbType="NVarChar(10)" CanBeNull="true" /> <Column Name="Country" Type="System.String" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Phone" Type="System.String" DbType="NVarChar(24)" CanBeNull="true" /> <Column Name="Fax" Type="System.String" DbType="NVarChar(24)" CanBeNull="true" /> <Association Name="FK_CustomerCustomerDemo_Customers" Member= "CustomerCustomerDemo" OtherKey="CustomerID" Type="CustomerCustomerDemo" DeleteRule="NO ACTION" /> <Association Name="FK_Orders_Customers" Member="Orders" OtherKey= "CustomerID" Type="Orders" DeleteRule="NO ACTION" /> </Type> </Table> Ce fichier peut tre modifi pour, par exemple, changer le nom des classes et des proprits associes aux informationsenprovenancedelabasededonnes.Danslexemplecidessous,nousavonsfrancislesnoms. <Table Name="dbo.Customers" Member="Clients"> <Type Name="Clients"> <Column Name="CustomerID" Member="CodeClient" Storage="_CustomerID"

ENI Editions - All rigths reserved

- 3-

Type="System.String" DbType="NChar(5) NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> <Column Name="CompanyName" Member="NomSociete" Storage="_CompanyName" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="false" /> <Column Name="ContactName" Member="NomContact" Storage="_ContactName" Type="System.String" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="ContactTitle" Member="Fonction" Storage="_ContactTitle" Type="System.String" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="Address" Member="Adresse" Storage="_Address" Type="System.String" DbType="NVarChar(60)" CanBeNull="true" /> <Column Name="City" Member="Ville" Storage="_City" Type="System.String" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Region" Type="System.String" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="PostalCode" Member="CodePostal" Storage="_PostalCode" Type="System.String" DbType="NVarChar(10)" CanBeNull="true" /> <Column Name="Country" Member="Pays" Storage="_Country" Type="System.String" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Phone" Member="Tel" Storage="_Phone" Type="System.String" DbType="NVarChar(24)" CanBeNull="true" /> <Column Name="Fax" Type="System.String" DbType="NVarChar(24)" CanBeNull="true" /> <Association Name="Clients_CustomerCustomerDemo" Member= "CustomerCustomerDemo" ThisKey="CodeClient" OtherKey="CustomerID" Type="CustomerCustomerDemo" /> <Association Name="Clients_Orders" Member="Orders" ThisKey="CodeClient" OtherKey="CustomerID" Type="Orders" /> </Type> </Table> Dans cet exemple, pour pouvoir utiliser des noms de proprits diffrents des noms de colonnes dans la base de donnes, nous avons ajout lattribut Member chaque balise <Column> pour spcifier le nom de la proprit et lattributStoragepourindiquerlenomdelavariableinternedelaclassequicontiendralinformation. Nouspouvonsmaintenantgnrerlecodepartirdufichierdemappagemodifiaveclacommandesuivante. SqlMetal /code:nw.vb /language:vb nw.dbml Ilnousrestevisualiserlaclassegnrepourvrifierquenosmodificationsontbientprisesencompte.

- 4-

ENI Editions - All rigths reserved

Cet outil est trs facile utiliser mais prsente le petit inconvnient de ne pouvoir gnrer les classes que pour lintgralit dune base de donnes. De plus, les ventuelles modifications sont faire manuellement soit dans le code source gnr soit dans le fichier de mappage intermdiaire. Pour la gnration et la personnalisation de quelquesclasses,ilestprfrabledutiliserleconcepteurObjet/RelationnelintgrVisualStudio.

b.ConcepteurObjet/Relationnel
Le concepteur Objet/Relationnel fournit une solution trs pratique pour crer le modle objet dune application reprsentantlesinformationsdisponiblesdansunebasededonnes.Ilpermetgalementlacrationdeprocdures et fonctions autorisant lutilisation des procdures stockes et fonctions prsentes dans la base de donnes. Il comportecependantquelqueslimitations :
q

seuleslesbasesdedonnesSQLServer2000,SQLServer2005,SQLServerExpresssontsupportes. Lemappagenestpossiblequentreuneclasseetunetable.Cestdirequilnestpaspossibledecrerune classepourreprsenterlersultatdunejointureentreplusieurstables. Le concepteur fonctionne en sens unique car seules les modifications effectues dans le concepteur sont rpercutesdanslecodegnr.Silecodeestmodifimanuellementlesmodificationsnesontpasprisesen compte dans le concepteur. Pire encore si des modifications sont faites dans le concepteur aprs des modificationsmanuellesducode,cesmodificationssontperdueslorsdelenregistrementduconcepteurcar danscecaslecodeestrgnrautomatiquement.Lasolutionconsistecreruneclassepartielledansun fichierindpendantdeceluimanipulparleconcepteur.

Le concepteur Objet/Relationnel est lanc automatiquement lors de lajout dun lment de type LINQ to SQL Classes.Lajoutunprojetdunfichier.dbmlprovoquegalementlouverturedecetoutil.louverture,lasurfacedu concepteurestspareendeuxparties.Lazonedegauchevaaccueillirlesclassesassociesauxtablesalorsquela

ENI Editions - All rigths reserved

- 5-

zonededroitevaaccueillirlesprocduresetfonctionsassociesauxprocduresstockes.Lensemblereprsentele DataContextgnr.

Ajoutdeclasses Vouspouvezcrerlesclassesreprsentantlestablesdunebasededonnesenralisantunglisserdplacerdune oudeplusieurstablespartirdelexplorateurdeserveursverslapartiegaucheduconcepteur.Lepremierlment ajout au concepteur Objet/Relationnel est galement utilis pour configurer les proprits de connexion du DataContext. Si un autre lment provenant duneautrebasededonnesestajout,unebotededialoguevous demandealorssivoussouhaitezremplacerlaconnexionexistante.Sivousacceptezlamodificationlesclassesdj prsentesdansleconcepteurnepourrontbiensurplustreutilises.Lajoutdunetablegnrelecodencessaire pourqueleDataContextinitialiselespropritsduneinstancedelaclassepartirdesinformationsprsentesdans unelignedelabasededonnes.Ilajoutegalementlecodencessairepourquelesmodificationsapportesaux propritsdelinstancepuissenttrerpercutesdanslabasededonnes.Leconcepteursebasesurlastructure de la table et sur la cl primaire pour effectuer les mises jour. Vous pouvez galement indiquer vousmme comment seront effectues les mises jour. Pour cela, chaque classe possde trois proprits Insert, Update, Delete.Pardfaut,cespropritssontinitialisesaveclavaleurUseRuntimepourindiquerquelecodechargdes misesjourestgnrautomatiquement.Pourmodifiercecomportementvouspouvezassignercespropritsdes procduresstockes.Unebotededialoguepermetlaconfigurationdecesproprits.

- 6-

ENI Editions - All rigths reserved

Aprslaslectiondelaprocdurestockevousdevezindiquercommentserontrenseignslesparamtresattendus enentreparlaprocdurestocke.Lesvaleursdisponiblescorrespondentauxdiffrentespropritsdelaclasse. Pourchaquepropritlaversionactuelleouoriginaleestdisponible. Ajoutdassociations Aprsavoirdposplusieurstablessurleconcepteurilestensuitepossibledecrerdesassociationsentrecertaines dentre elles. Les associations sont tout fait similaires aux relations entre tables dans une base de donnes. Dailleurssilexistedanslabasededonnesunerelationdecltrangreentredeuxtablesuneassociationsera creautomatiquementlorsquecesdeuxtablessontdposessurleconcepteur. Pour ajouter manuellement une association vous devez passer par le menu contextuel du concepteur Objet/Relationnel.

Unebotededialoguevousproposealorsdeconfigurerlarelation.Vousdevezdoncchoisirlaclasseparenteetla classe enfant de la relation. La classe parente est la classe qui se trouve lextrmit un dune relation un plusieurs,laclasseenfantreprsentelextrmitplusieursdelarelation.Parexemple,danslassociationentreles classes Product et Category, la classe Category reprsente le ct un de la relation et la classe Product le ct plusieurs.Eneffetunproduitappartientunecatgorieetunecatgoriecontientplusieursproduits.Vousdevez ensuiteindiquerpourchacunedesclasseslaoulespropritsquivontparticiperlarelation.Ilfautveillerceque lespropritsparticipantlassociationsoitdummetypechaqueextrmitdelassociation.Aprslacrationde

ENI Editions - All rigths reserved

- 7-

lassociation,vouspouvezconfigurercertainespropritsquinesontpasdisponiblesaumomentdelacration.
q

Cardinality : dterminesilassociationestdetypeunplusieurs(onetomany)oudetypeunun(oneto one). Child Property : indique si une proprit doit tre cre dans la classe parente pour rfrencer les informationsdelaclasseenfant.Letypedecettepropritestdterminparletypedelaclasseenfantetla cardinalit.Silacardinalitestunun,lapropritestunesimplerfrenceversuneinstancedelaclasse concerne. Si la cardinalit est un plusieurs la proprit est une collection dinstances de la classe concerne. LespropritsNamepermettentdidentifierlespropritscrespourraliserlassociation.

Ajoutdemthodes Les procdures stockes et les fonctions peuvent tre ajoutes au concepteur Objet/Relationnel pour ensuite tre transformesenmthodesduDataContext.Lappeldecesmthodesprovoqueralexcutiondelaprocdurestocke oudelafonctionparleserveurdebasededonnes.Sidesparamtressontattendusenentreparlaprocdure stocke,ilsdevronttrefournislamthodelorsdesonexcution.LajoutdunemthodeauDataContextseralise trssimplementeneffectuantunglisserdplacerentrelexplorateurdeserveursetleconcepteurObjet/Relationnel. Il faut cependant tre attentif lorsque vous ajoutez une procdure stocke ou une fonction car lemplacement o auralieuledplacementdtermineletypederetourdelamthodegnre.Sillmentestdplacverslazonede droiteduconcepteur,letypederetourseragnrautomatiquement. Parcontre,sillmentestdplacversuneclasseexistanteduconcepteur,letypederetourcorrespondracette classe condition toutefois que linformation renvoye par la procdure stocke soit compatible avec cette classe. Nous allons faire quelques manipulations avec la procdure stocke [Ten Most Expensive Products] dont voici le code: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE procedure [dbo].[Ten Most Expensive Products] AS SET ROWCOUNT 10 SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice FROM Products ORDER BY Products.UnitPrice DESC Cette procdure retourne le nom et le prix des dix produits les plus onreux. Si nous essayons dajouter cette procdure au DataContext en effectuant un glisserdplacer sur la surface de la classe Product nous obtenons le messagesuivant.

Eneffetleslmentsrenvoysparlaprocdurestockenesontpasdesproduitsmaissimplementlenometleprix duproduit. Par contre, si nous ralisons un glisser dplacer vers la zone de droite du concepteur, lopration se ralise sans problme.LafonctionsuivanteestajouteauDataContext. Public Function Ten_Most_Expensive_Products() As ISingleResult (Of Ten_Most_Expensive_ProductsResult) Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo. GetCurrentMethod,MethodInfo)) Return CType(result.ReturnValue,ISingleResult(Of Ten_Most_Expensive_ ProductsResult)) End Function Cette fonction ne retourne pas une liste de produits mais une liste de Ten_Most_Expensive_ProductsResult qui corresponduneclassegnreautomatiquementenfonctiondesinformationsrenvoyesparlaprocdurestocke dontvoicilastructure.
- 8 ENI Editions - All rigths reserved

Pour que la classe Product puisse tre utilise comme type de retour pour la fonction, nous sommes obligs de lgrementmodifierlaprocdurestockepourquelleretournedesproduitsetnonjustelenometleprixduproduit. set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go

ALTER procedure [dbo].[Ten Most Expensive Products] AS SET ROWCOUNT 10 SELECT * FROM Products ORDER BY Products.UnitPrice DESC Nouspouvonsmaintenantrefairelammeoprationetobtenirlafonctionsuivantequicettefois,retournebienune listedeproduits. Public Function Ten_Most_Expensive_Products() As ISingleResult(Of Product) Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo. GetCurrentMethod,MethodInfo)) Return CType(result.ReturnValue,ISingleResult(Of Product)) End Function Hritagedeclasses Commenimportequelleclasse,lesclassesgnresparleConcepteurObjet/Relationnelpeuventutiliserlhritage. Parcontre,ctbasededonnes,cestunenotionparfaitementinconnue.Ilfautavoirrecoursquelquespetites astucespoursimulercettetechniquedansunebasededonnes.Lasolutionfrquemmentutilise,consistecrer unetableuniquequicontiendralafoislesinformationsdesobjetsdelaclassedebaseetlesinformationsdela

ENI Editions - All rigths reserved

- 9-

sousclasse.Unecolonnesupplmentaireestajoutelatableetsertdediscriminateur.Enfonctiondelavaleurde cettecolonne,ilestfacilededterminersilalignedoittrereprsenteparuneinstancedelaclassedebaseou une instance de la sousclasse. Nous allons modifier la table Products pour pouvoir mettre cette technique en application.NousajoutonslatableunecolonnenommePrissabledetypeentier.Cettecolonnevanousservirde discriminateur.Silavaleurquellecontientestgale1,ilsagitdunproduitnonprissable.Silavaleurestgale 2,ilsagitdunproduitprissable.Danscecasladeuximecolonneajoute,nommeDLCdetypedate,contientla date limite de consommation du produit. Pour les produits non prissable cette colonne ne contient aucune valeur (null). Modifiez les informations pour quelques produits afin quils deviennent des produits prissables (Camembert Pierrot,EscargotsdeBourgogne,MascarponeFabioli). Maintenantquelabasededonnesestprte,nouspouvonsajouterlesclassesauDataContext.Lapremiretape consiste ajouter la table constituant la classe de base. Puis ajoutez un deuxime exemplaire de cette table et renommezlaclassecorrespondantequivadevenirlaclassedrive.Ajoutezensuitepartirdelaboteoutilsune relationdhritageentrelesdeuxclassesenladessinantdepuislaclassefilleverslaclasseparente.Danschacune desclasses,supprimezlespropritsinutiles.Parexemple,enneconservantdanslaclassedrivequelaproprit DLCetenlasupprimantdanslaclassedebase.Aprsavoirslectionnlarelationdhritagesurlediagrammevous devezmodifiersesproprits.
q

indiquezparlintermdiairedelapropritDiscriminator Property,lapropritservantfaireladistinction entreuneinstancedelaclassedebaseetuneinstancedelasousclasse. Configurez ensuite les proprits Base Class Discriminator Value et Derived Class Discriminator Valueavec les valeurs de la proprit configure prcdemment reprsentant une instance de la classe de baseetuneinstancedelasousclasse. La proprit Inheritance Defaultindique quelle classe sera utilise si le discriminateur contient une valeur inconnue.

Nousobtenonslesclassessuivantes :

Maintenantquenosclassessontdisponibles,regardonscommentlesutiliserparlintermdiairederequtesLINQ.

c.UtilisationderequtesLINQversSQL
LesrequtesLINQpourSQLutilisentrigoureusementlammesyntaxequecellesquenousavonstudiesdansle paragraphe2.Laseulepetitedistinctionprovientdesdonnesquidanscecas,sontextraitesdelabasededonnes ettransformeseninstancesdeclassespartirdesinformationsdemappage.Ledialogueaveclabasededonnes estentirementprisenchargeparleDataContext.IlfautdonccreruneinstanceduDataContextetcestparson intermdiairequelesdonnesserontdisponiblespourlexcutiondelarequteLINQ.Voicicidessousnotrepremire requteLINQverslabasededonnes. Dim dc As NorthWind dc = New NorthWind Dim requete = From unClient In dc.Customers _ Where unClient.ContactName Like "A*" _ Select unClient

- 10 -

ENI Editions - All rigths reserved

For Each Client In requete Console.WriteLine(Client.ContactName) Next Danscecode,laclasseNorthWindcorrespondauDataContextetcestdoncparsonintermdiairequelesdonnes sontdisponiblespourlarequteLINQ.Maiscommentlesdonnessontellesslectionnes ? En fait la mthode la plus naturelle pour obtenir des informations en provenance dune base de donnes est de demandercellecidexcuterunerequteSQL.CesteffectivementcettesolutionquiestutiliseparLINQ.Pourle vrifier, nous pouvons demander au DataContext (NorthWind dans notre cas) dafficher sur la console le code SQL quilgnreautomatiquement.Pourcela,ilsuffitsimplementdinitialiserlapropritLogduDataContextendirection delaconsoleavantlacrationdelarequteLINQ. Dim dc As NorthWind dc = New NorthWind dc.Log = Console.Out Dim requete = From unClient In dc.Customers _ Where unClient.ContactName Like A* _ Select unClient For Each Client In requete Console.WriteLine(Client.ContactName) Next lexcution,nousobtenonslaffichagesuivant : SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax] FROM [dbo].[Customers] AS [t0] WHERE [t0].[ContactName] LIKE @p0 -- @p0: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [A%] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8 Ana Trujillo Antonio Moreno Ann Devon Aria Cruz Andr Fonseca Annette Roulet Alexander Feuer Alejandra Camino Art Braunschweiger Anabela Domingues Nous avons effectivement une requte SQL avec paramtres qui est cre automatiquement par le DataContext. Cette requte nest pas trs complique et elle aurait t facilement crite en utilisant directement ADO.NET. Essayonsdexcuteruneautrerequteenreprenantlarequtenouspermettantdobtenirlesdatesdecommande dechacundesclients. Dim requeteGroupJoin = From unclient In dc.Customers _ Group Join uneCommande In dc.Orders On unclient Equals uneCommande.Customer _ Into CommandesDuClient = Group _ Select unclient, CommandesDuClient For Each r In requeteGroupJoin Console.WriteLine(r.unclient.ContactName) For Each c In r.CommandesDuClient Console.WriteLine(vbTab & c.OrderDate) Next Next VoicilecodeSQLgnrpourlexcutiondecetterequte : SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[Contact Title], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun try], [t0].[Phone], [t0].[Fax], [t1].[OrderID], [t1].[CustomerID] AS [CustomerID 2], [t1].[EmployeeID], [t1].[OrderDate], [t1].[RequiredDate], [t1].[ShippedDate] , [t1].[ShipVia], [t1].[Freight], [t1].[ShipName], [t1].[ShipAddress], [t1].[Ship City], [t1].[ShipRegion], [t1].[ShipPostalCode], [t1].[ShipCountry], (

ENI Editions - All rigths reserved

- 11 -

SELECT COUNT(*) FROM [dbo].[Orders] AS [t2] WHERE [t0].[CustomerID] = [t2].[CustomerID] ) AS [value] FROM [dbo].[Customers] AS [t0] LEFT OUTER JOIN [dbo].[Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID] ORDER BY [t0].[CustomerID], [t1].[OrderID] Cela commence srieusement se compliquer. Lcriture dune telle requte directement en SQL demanderait certainementunebonnematrisedecelangagealorsquelasyntaxeLINQdemeuretrssimple.Cesteffectivement ceniveauquersidelapuissancedeLINQversSQL. Cette facilit ne se limite pas lextraction dinformations depuis la base de donnes car LINQ vers SQL est galementcapabledegrerlesmisesjourdesinformationsverslabasededonnes.

d.Misejourdesdonnes
Lamisejourdelabasededonnesseralisegalementtrssimplementuniquementenmanipulantdesobjetset sanscrirelamoindrelignedeSQL. Modificationdedonnesexistantes Lapremiretapeconsisteobtenirlesdonnesquelonsouhaitemodifierenexcutantunerequtedeslection ordinaire. Une fois que les donnes sont disponibles sous forme dinstancesdeclasses,nouspouvonssimplement modifier les proprits de ces instances. Pour transfrer les modifications dans la base de donnes, il suffit simplementdedemanderauDataContextdepropagerlesmodificationsverslabasededonnes.Nousallonstester cettetechniqueenfaisantdmnagernosclientsNantaisversSaintHerblain. Dim clientsNantais = From unclient In dc.Customers _ Where unclient.City = "Nantes" _ Select unclient For Each unclient In clientsNantais unclient.City = "Saint Herblain" unclient.PostalCode = "44800" Next dc.SubmitChanges() Danscecode,cestlinstructionSubmitChangesduDataContextquiprovoquelamisejourdelabasededonnesen excutantautomatiquementlarequteSQLUpdatesuivantepourchaqueobjetayanttmodifi. UPDATE [dbo].[Customers] SET [City] = @p10, [PostalCode] = @p11 WHERE ([CustomerID] = @p0) AND ([CompanyName] = @p1) AND ([ContactName] = @p2) AND ([ContactTitle] = @p3) AND ([Address] = @p4) AND ([City] = @p5) AND ([Region]IS NULL) AND ([PostalCode] = @p6) AND ([Country] = @p7) AND ([Phone] = @p8) AND ([Fax] = @p9) -- @p0: Input NChar (Size = 5; Prec = 0; Scale = 0) [FRANR] -- @p1: Input NVarChar (Size = 19; Prec = 0; Scale = 0) [France restauration] -- @p2: Input NVarChar (Size = 14; Prec = 0; Scale = 0) [Carine Schmitt] -- @p3: Input NVarChar (Size = 17; Prec = 0; Scale = 0) [Marketing Manager] -- @p4: Input NVarChar (Size = 14; Prec = 0; Scale = 0) [54, rue Royale] -- @p5: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [Nantes] -- @p6: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [44000] -- @p7: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [France] -- @p8: Input NVarChar (Size = 11; Prec = 0; Scale = 0) [40.32.21.21] -- @p9: Input NVarChar (Size = 11; Prec = 0; Scale = 0) [40.32.21.20] -- @p10: Input NVarChar (Size = 14; Prec = 0; Scale = 0) [Saint Herblain] -- @p11: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [44800] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8 Suppressiondedonnes Comme pour la modification, nous devons au pralable obtenir les lments que nous souhaitons supprimer en excutantunerequtedeslection,puisindiquerpourchacun dentreeuxquenoussouhaitonslessupprimer.Pour cela, nous appelons la mthode DeleteOnSubmit de la table laquelle appartient llment, en lui passant comme paramtrelobjetsupprimer.Pourvaliderlessuppressions,nousdevonsensuiteappelerlamthodeSubmitChanges duDataContext.NousallonstestercelaensupprimantlesclientsBrsiliensdelabasededonnes.

- 12 -

ENI Editions - All rigths reserved

Dim suppressionClient = From unclient In dc.Customers _ Where unclient.Country = "Brazil" _ Select unclient For Each unclient In suppressionClient dc.Customers.DeleteOnSubmit(unclient) Next dc.SubmitChanges() lexcutiondececode,nousobtenonscettemagnifiqueException.

Dans notre prcipitation, nous avons simplement oubli un petit dtail. Dans la base de donnes, les tables Customers, Orders et OrdersDetails sont lies par des contraintes de cl trangre. Il est donc impossible de supprimer un client sil possde encore des commandes et de la mme faon il est impossible de supprimer une commandesiellecontientencoredeslignesdecommande.LeproblmevientdufaitqueLINQnestpascapablede grerlessuppressionsencascade.Pourrsoudrenotreproblmenousavonsdeuxsolutions :
q

ActiverlargleONDELETECASCADEsurlescontraintesdecltrangres. Grernousmmelasuppressiondesobjetsenfantsavantlasuppressiondesobjetsparents.

Cest cette dernire solution que nous allons utiliser. Puisque notre modle objet est correctement conu, cette solution est trs facile mettre en uvre. En effet dans la classe Customers, nous avons la collection Orders qui reprsente les commandes du client. De mme dans la classe Orders, nous avons la collection Order_Details qui reprsente toutes les lignes dune commande. Il suffit simplement dexcuter trois boucles imbriques qui vont supprimerleslignesdechaquecommande,lescommandesdechaqueclientpuislesclientseuxmmes. Dim suppressionClient = From unclient In dc.Customers _ Where unclient.Country = Brazil _ Select unclient For Each unclient In suppressionClient For Each uneCommande In unclient.Orders For Each uneLigne In uneCommande.Order_Details dc.Order_Details.DeleteOnSubmit(uneLigne) Next dc.Orders.DeleteOnSubmit(uneCommande) Next dc.Customers.DeleteOnSubmit(unclient) Next dc.SubmitChanges() Aveccettesolution,ilnyaplusdeproblmesetnosclientsBrsilienssontbieneffacsdelabasededonnes. Ajoutdedonnes Lajoutdedonnesseraliseentroistapes.Ilfauttoutdabordcreruneinstancedelaclassereprsentantles donnesinsrerdanslabase.Lespropritsdecetteinstancesontensuiteinitialisesaveclesvaleursquelon souhaite ajouter dans la base de donnes. Lobjet ainsi configur doit tre ensuite insr dans la table du DataContext.Finalementlesmodificationssonttransfresverslabasededonnes.Pourillustrercestapes,nous allonsajouterunnouveauclientdanslabasededonnes. Dim nouveauClient As Customer

ENI Editions - All rigths reserved

- 13 -

nouveauClient = New Customer With nouveauClient .CustomerID = "MDUPO" .ContactName = "Michel Dupond" .CompanyName = "ENI" .ContactTitle = "Formateur" .Country = "France" .City = "Saint Herblain" .Address = "rue Benjamin Franklin" .Fax = "02.28.03.17.29" .Phone = "02.28.03.17.28" .PostalCode = "44800" End With dc.Customers.InsertOnSubmit(nouveauClient) dc.SubmitChanges()

e.Conflitsdesmisesjour
Ilarrivefrquemmentqueplusieursutilisateurstravaillentsimultanmentsurlammebasededonnes.Ilpeutse produire des conflits lorsque les mmes enregistrements de la base de donnes sont mis jour par plusieurs utilisateurs.LINQproposeunmcanismepermettantdetraiterceproblme.Cemcanismesedcomposeenquatre tapes :
q

configurerpourquellesinformationsdelabasededonneslesconflitsserontsurveills, dtecterquunconflitsurvient, obtenirdesinformationssurleconflit, rsoudreleconflit.

Configurationdesclassespourladtectiondesconflits LorsdelacrationdesclassesavecleconcepteurObjet/Relationnelnouspouvonsindiquerpourchaquepropritsi elledoittreinclusedanslemcanismededtectiondesconflit.Chaquemembredelaclassegnrepossdeune propritUpdate Checklaquellenouspouvonsaffectertroisvaleursdiffrentes :


q

Always : ladtectiondesconflitsesttoujoursactivepourcetlment. WhenChanged : activeladtectionuniquementsilavaleuratmodifie. Never : nepastenircomptedecetlmentpourladtectiondesconflits.

Pardfaut,touteslespropritssontutilisespourladtectiondesconflits. Dtectiondesconflits Lesconflitssurviennentlorsdutransfertdesinformationsverslabasededonnes.Cestdoncceniveauquenous devonsintervenir.Pourcela,lorsdelappeldelamthodeSubmitChangesduDataContext,nousindiquonsenpassant unparamtrecettemthodecommentdoitsecomporterlemcanismededtectiondesconflits.Deuxsolutions sontpossibles :


q

FailOnFirstConflict : signaleleproblmedsquelepremierconflitintervient. ContinueOnConflict : essaiedeffectuertouteslesmisesjouretsignalelafinsiunconflitestsurvenu.

Si un conflit est dtect une exception de typeChangeConflictException est dclenche. Lappel de la mthode SubmitChangesdoitdonctreplacedansunblocTryCatchpourrcuprerlexception. Obtenirlesinformationssurlesconflits DansleblocCatch,nouspouvonsobtenirdesinformationssurlesconflitsenparcourantlacollectionChangeConflicts

- 14 -

ENI Editions - All rigths reserved

duDataContext.Cettecollectioncontientunouplusieursobjetsdetype ObjectChangeConflict. La proprit Object nouspermetdobtenirunerfrencesurllmentlorigineduproblme.LapropritMemberConflictsfournitquant elle,lalistedetouslesmembresdecetobjetquisontlorigineduproblme. Pourchacun,nousavonsnotredispositionlavaleuroriginaleaumomentdelacrationdelinstancedelaclasse partirdesinformationsdelabasededonnes,lavaleuractuellepourlinstancedelaclasse,lavaleuractuelledans labasededonnes. Rsoudrelesconflits Pour rsoudre les conflits survenus lors de la mise jour de la base de donnes trois hypothses sont envisageables.
q

Remplacerlesvaleursdespropritsenconflitsaveclesinformationsprsentesdanslabasededonnes.Il faut pour cela appeler la mthode Resolve de lobjet ObjectChangeConflict en lui passant la constante Overwrite CurrentValues. Remplacerlesvaleursdelabasededonnesparlesinformationscontenuesdanslespropritsdelobjet. Comme pour la solution prcdente, nous devons appeler la mthode Resolve de lobjet ObjectChangeConflictenluipassantcettefoislaconstanteKeepCurrentValues. Fusionnerlespropritsdelobjetaveclesinformationsdelabasededonnes.Lesinformationsdelabase de donnes ne sont modifies que si la proprit correspondante de lobjet a t modifie. La mthode ResolvedoitdanscecastreappeleaveclaconstanteKeepChanges.

Le code suivant vous permet de tester ces diffrentes solutions en remplaant simplement la constante lors de lappeldelamthodeResolve. Dim cl As Customer Dim rqt = From unClient In dc.Customers _ Where unClient.CustomerID = "BOLID" _ Select unClient For Each cl In rqt cl.City = "Barcelone" Next Console.WriteLine("modifier le code postal du client BOLID dans la base puis taper une touche") Console.ReadLine() Try dc.SubmitChanges(ConflictMode.FailOnFirstConflict) Catch ex As ChangeConflictException For Each o As ObjectChangeConflict In dc.ChangeConflicts o.Resolve(RefreshMode.KeepChanges) o.Resolve(RefreshMode.KeepCurrentValues) o.Resolve(RefreshMode.OverwriteCurrentValues) Next End Try Console.WriteLine("lobjet client :") Console.WriteLine("city:" & cl.City) Console.WriteLine("postalCode:" & cl.PostalCode) For Each cli In rqt Console.WriteLine("le client dans la base :") Console.WriteLine("city:" & cli.City) Console.WriteLine("postalCode:" & cli.PostalCode) Next

ENI Editions - All rigths reserved

- 15 -

Prsentation
Le langage XML (eXtensible Markup Language) est un langage permettant la reprsentation de donnes. Il permet dencapsulertouttypededonnes,enlesreprsentantsouslaformedune arborescence. Cellescisontcritesentre desbalisesousousformedattributs.Ceformatpermetdedcriredesdonnesmaisnepermetpasdemettreenforme nidelesexploiter.Ilestprincipalementutilispourpermettrelchangededonnesentreapplicationsetmmeentre systmesdiffrents.Ilest,galement,souventutiliscommeformatdestockagepourlesparamtresdeconfiguration dune application. Visual Studio et Windows lutilisent cet effet de manire courante. Ce langage a t conu par le W3C( WorldWideWebConsortium).Cestdoncsurlesite http://www.w3.org/XMLquevouspourrezobtenirledtail desspcificationsdecelangage. LelangageXMLestsouventconfonduaveclelangageHTML.Bienquecomportantdessimilitudes,cesdeuxlangages nontpaslammevocation.VoicilespointscommunsentreleslangagesXMLetHTML :
q

Cesdeuxlangagesseprsententsousformetexteseulement. Lecontenudesdocumentsestreprsentaumoyendebalises. Cesbalisespeuventcomporterdesattributs. Lesbalisespeuventtreimbriqueslesuneslintrieurdesautres. Cesdeuxlangagessontissustousdeuxdunemmebase : leSGML(StandardGeneralizedMarkupLanguage).

LelangageXMLsedistinguedulangageHTMLparlespointssuivants :
q

LelangageXMLautoriselacrationdevospropresbalises. Lesoutilschargsdutraitementgrentlasyntaxedefaonplusrigoureuse. HTMLestunlangageconupourlaprsentationdesdonnes.linverse,XMLestutilispourladescriptiondes donnes.

Pourpouvoirtrefacilementmanipules,lesdonnesXMLdoiventtreconfiesunprocesseurXML. UnprocesseurXMLestunmodulelogiciel,spcialementcritpourmanipulerXML.Lerecoursunmoduleexternepour le traitement XML sexplique par la complexit que reprsente le dveloppement dun processeur XML, totalement fonctionnel.Eneffet,pourquunprocesseurXMLsoitconsidrtotalementfonctionnel,sonfonctionnementdoitsuivre lesvolutionsdulangagedfiniesparleW3C.IlestdoncimportantdevisiterrgulirementlesiteMicrosoftpourvrifier silexisteuneversionplusrcenteduprocesseurXMLquecelleinstallesurvotremachine.

ENI Editions - All rigths reserved

- 1-

StructuredundocumentXML
Avant de manipuler des documents XML partir de Visual Basic, il est important de bien comprendre la structure de ce type de document. Les paragraphes suivants vont prsenter les notions lmentaires connatre avant de se lancer dans lutilisation de documentsXML.

1.ConstituantsdundocumentXML
UndocumentXMLpeuttreconstitudeslmentssuivants : Instructiondetraitement Lesinstructionsdetraitementpermettentdincorporer,dansundocumentXML,desinformationsdestinesauprocesseurXMLou dautresapplicationsdevantmanipulerledocument.Cesinstructionsdetraitementsontutilisespourfourniruneinstructionspciale uneapplicationtravaillantsurledocument. Linstructiondetraitementestinsredansledocumentaveclasyntaxesuivante : < ?nomApplication instruction ?> Lapremirepartieestlenomdelapplicationquiestdestinecetteinstruction.Ladeuximepartieestletextedelinstruction. UndocumentXMLcontientengnraluneinstructiondetraitementspcialepourdfinirlaversiondeXMLaveclaquelleledocument estconformeetlecodagedescaractresutilisparledocument. <?xml version="1.0" encoding="utf-8" ?> Commentaires Lescommentairesserventincluredansledocumentdesinformationsdestinesauxutilisateursdudocument.Ilssontignorspar leprocesseurXMLouparlesapplicationsutilisantledocument.Ilsnedoiventpastreincorporsdansunebalise. Lasyntaxesuivantedoittreutilisepourplaceruncommentairedansledocument. <!--ceci est un commentaire> lintrieurducommentairelutilisationdescaractresestinterdite :

Caractresrservs CertainscaractressontrservsparlelangageXMLcomme,parexemple,lecaractre&delexemplesuivant : PourpouvoirutilisercescaractresdansundocumentXML,vousdevezlesremplacerparlasyntaxesuivante :

Caractre & < >


Lasyntaxecorrecteestdonc : <menu>fromage &amp; dessert</menu>

utiliserlaplace &amp &lt &gt &apos &quot

Dessquencesdecaractrespluslonguespeuventtreincorpores,enutilisantunesectionCDATA.Lasyntaxeestlasuivante : <![CDATA[{ Select * from desserts where prix < 10} and calories > 500]]>

Aveccettesyntaxe,nimportequelcaractrepeuttreutilissansprcautionparticulire.

lmentsXML Un lment XML est un conteneur qui accueille des donnes et dautres lments. Il se compose dune balise de dbut et dune balisedefin.LasyntaxedunlmentXMLestlasuivante :

ENI Editions - All rigths reserved

- 1-

<NomElement>contenu</NomElement> Leslmentsdoiventrespectercertainesrglesconcernantleurforme :
q

Lesnomsdlmentsnepeuventpascontenirdespace. Ilsnepeuventpasdbuterparunnombreouunsignedeponctuation. Ilsnepeuventpasdbuterparxml(quellequesoitlacasse). Ilsdoiventdbuterjusteaprslesigne,sansespace. Lesbalisesdedbutetdefindoiventavoirlammecasse. UndocumentXMLdoitconteniraumoinsunlment : cestllmentracine. Tousleslmentsquisuiventllmentracinedoiventtreimbriqusdansceluici. Siunlmentnapasdecontenu,ilpeuttreconstituuniquementparunebalisedefin. Seulllmentracinedoitavoirunebalisededbutetunebalisedefin,mmesilnapasdecontenu.

Exemple : <?xml version="1.0" encoding="utf-8" ?> <restaurant> <menu> <entrees> <nom>radis</nom> <nom>pate</nom> <nom>saucisson</nom> </entrees> <plats> <nom>choucroute</nom> <nom>cassoulet</nom> <nom>couscous</nom> </plats> <fromages> <nom>camembert</nom> <nom>brie</nom> <nom>roquefort</nom> </fromages> <desserts> <nom>glace</nom> <nom>tarte</nom> <nom>creme brule</nom> </desserts> </menu> </restaurant> Attributsdlments Les attributs dlments sont utiliss pour qualifier un lment. Ils sont placs dans la balise de dbut de llment. Comme les lments,ilsdoiventsuivrecertainesrgles :
q

Unattributestconstitudunnometduneaffectationdevaleur. Unlmentpeutcontenirunnombrequelconquedattributs. Lesnomsdattributssontsparspardesespaces. Unnomdattributnepeutapparatrequuneseulefoisdansunlment. Unnomdattributpeutapparatredansplusieurslments. Unnomdattributnepeutpascontenirdespace.

- 2-

ENI Editions - All rigths reserved

Laffectationdunevaleurunattributsefaitaveclesignegalsuividelavaleurentourededoublescotes.

Exemple : <?xml version="1.0" encoding="utf-8" ?> <restaurant> <menu type="gastronomique"> <entrees> <nom calories="50">radis</nom> <nom calories="300">pate</nom> <nom calories="350">saucisson</nom> </entrees> <plats> <nom calories="1000">choucroute</nom> <nom calories="2000">cassoulet</nom> <nom calories="1700">couscous</nom> </plats> <fromages> <nom calorie="240">camembert</nom> <nom calories="300">brie</nom> <nom calories="120">roquefort</nom> </fromages> <desserts> <nom calories="340" parfum="chocolat">glace</nom> <nom calories="250" fruits="pommes">tarte</nom> <nom calories="400">creme brule</nom> </desserts> </menu> </restaurant> Espacesdenoms Unespacedenomestunensembledenomsdlmentsidentifisparunerfrenceunique.Ilspermettentdviterlesconfusions lorsquedesdonnesXMLsontfusionnespartirdediffrentessources. Sinousprenonslexemplesuivantquipourraittreunfichierdeconfigurationduneapplication : <?xml version="1.0" encoding="utf-8" ?> <application> <menu nom="fichier"> <entrees>nouveau</entrees> <entrees>ouvrir</entrees> <entrees>fermer</entrees> </menu> <menu nom="edition"> <entrees>copier</entrees> <entrees>couper</entrees> <entrees>coller</entrees> </menu> </application> Danscefichier,nousavonsdeslmentsdjdfinisdansunautrefichier.Ilestclairqueleslmentsmenuetentreesnontpasla mmesignificationquedanslefichierutilisprcdemment.Pourvitertouteambigut,ilfautajouterdanschacundesfichiersune dfinitiondespacedenomrendantuniquechaquelment.Ladfinitiondunespacedenomseffectueparlattribut xmlnssuividun prfixeetdelidentifiantdelespacedenom. Lasyntaxeestlasuivantepourchacundenosdeuxfichiers : <restaurant xmlns:resto="http://www.eni-ecole.fr/restaurant"> <application xmlns:appli="http://www.eni-ecole.fr/configappli"> Ilesttrsimportantquelesidentifiantsdespacesdenomsoientuniques,sivoussouhaitezchangerdesinformationsavecdautres personnes.Cestpourquoi,ilestcourantdutiliserlenomdedomainedelentreprisedanslidentifiant(celuicitantsupposunique). Avec cettemodification,nouspouvonsutiliserdanslemmefichierdeslments menuet entrees,enajoutantdevantleprfixede lespacedenomdanslequelilsontunesignification. <fusion xmlns:appli="http://www.eni-ecole.fr/configappli" xmlns:resto= "http://www.eni-ecole.fr/restaurant"> <appli:menu nom="fichier"> <appli:entrees>enregistrer</appli:entrees> </appli:menu> <resto:menu nom="economique"> <resto:entrees>avocat</resto:entrees> </resto:menu> </fusion>

ENI Editions - All rigths reserved

- 3-

2.Documentbienformetdocumentvalide
Grce au langage XML, nous avons la possibilit de crer facilement des documents structurs et comprhensibles. Il existe galement deux notions permettant de vrifier la qualit dun document XML : un document peut tre bien form et un document peuttrevalide.

a.Documentbienform
Un document est bien form sil obit aux rgles syntaxiques du langage XML. Ces rgles sont beaucoup moins strictes que les rglesdevalidit.Ellesgrentlesattributionsdenoms,lescrationsetlesimbricationsdlments.Pourpouvoirtretraitparun processeurXML,undocumentdoittrebienform.Sileprocesseurdtecteuneerreur,ilarrteimmdiatementletraitementdu document.

b.Documentvalide
Un document valide est un document XML auquel est lie une DTD (dfinition du type de document) et qui respecte toutes les rglesdeconstructiondfiniesdanscettedernire.LorsquunprocesseurXMLanalyseledocument,ilrecherchedanslaDTDune dfinitionpourtoutlment,attribut,entitdecedocument.Dsquilrencontreuneerreur,ilarrteletraitement.

- 4-

ENI Editions - All rigths reserved

ManipulationdundocumentXML
La manipulation dun document XML dans une application VB.NET est facilite par lutilisation de DOM (DocumentObject Model). Le DOM vous permet de lire, de manipuler et de modifier un document XML par programme. Ce dernier rgit la reprsentation en mmoire des donnes XML, bien que les donnes XML vritables soient stockes de faon linaire lorsquellessetrouventdansunfichierouquellesproviennentdunautreobjet. Parexemple,ledocumentsuivant : <?xml version="1.0"?> <restaurant> <menu prix="10"> <entree>radis</entree> <plat>cassoulet</plat> <dessert>glace</dessert> </menu> <vins> <rouge>bordeaux</rouge> <blanc>muscadet</blanc> </vins> </restaurant> estreprsentsouscetteformeenmmoiredansuneapplication :

DanslastructuredundocumentXML,chaquecercledecetteillustrationreprsenteunn ud,appelobjet XmlNodequi estlobjet de base de larborescence DOM. La classe XmlDocumentprendenchargedesmthodesdestinesexcuter des oprations sur le document dans son ensemble, par exemple pour le charger en mmoire ou lenregistrer sous la forme dun fichier. Les objets XmlNode comportent un ensemble de mthodes et de proprits, ainsi que des caractristiquesdebasebiendfinies.Voicicertainesdecescaractristiques :
q

Unn udnepossdequunseuln udparent,quiestlen udsitujusteaudessusdelui. Leseuln udquiestdpourvudeparentestlaracinedudocument,puisquilsagitdun uddepremierniveau quicontientledocumentluimmeetlesfragmentsdedocument. Laplupartdesn udspeuventcomporterplusieursn udsenfants,quisontlesn udssitusdirectementsous eux. Lesn udssitusaummeniveau,reprsentsdanslediagrammeparlesn udsmenuetvins,sontdesn uds frres.

LunedescaractristiquesduDOMestlamaniredontilgrelesattributs.Lesattributsnesontpasdesn udsquifont partiedesrelationsparentenfantetfrre.Ilssontconsidrscommeunepropritdun udetsontconstitusdune paire,composedunnometdunevaleur.

ENI Editions - All rigths reserved

- 1-

Dansnotreexemple,prix="10"associllmentmenu,lemotprixcorrespondaunometlavaleurdelattributprixest 10.Pourextrairelattributprix="10"dun udmenu,vousappelezlamthode GetAttributelorsquelecurseursetrouve surlen udmenu. Pourlesexemplesquisuivent,nousutiliseronsledocumentXMLsuivant : <?xml version="1.0" encoding="utf-8" ?> <restaurant> <menu type="gastronomique"> <entrees> <nom calories="50">radis</nom> <nom calories="300">pate</nom> <nom calories="350">saucisson</nom> </entrees> <plats> <nom calories="1000">choucroute</nom> <nom calories="2000">cassoulet</nom> <nom calories="1700">couscous</nom> </plats> <fromages> <nom calorie="240">camembert</nom> <nom calories="300">brie</nom> <nom calories="120">roquefort</nom> </fromages> <desserts> <nom calories="340" parfum="chocolat">glace</nom> <nom calories="250" fruits="pommes">tarte</nom> <nom calories="400">creme brule</nom> </desserts> </menu> <menu type="economique"> <entrees> <nom calories="50">pain</nom> </entrees> <plats> <nom calories="1700">jambon</nom> </plats> <fromages> <nom calorie="240">camembert</nom> </fromages> <desserts> <nom calories="340" parfum="a leau">glace</nom> </desserts> </menu> </restaurant>

1.UtilisationdeDOM
Lapremiretape,lorsdelutilisationdeDOM,consistechargerledocumentXMLdansunarbreden udsDOM.Vous devezpourceladclarerunobjet XmlDocumentpuisutiliserlamthode Loadpourremplircetobjetpartirdunfichier XML. dim as XmlDocument doc = New Xml.XmlDocument() doc.Load(resto.xml) IlestgalementpossibledechargerdesdonnesXMLpartirdunechanedecaractres.Vousdevez,danscecas, utiliserlamthodeLoadXMLenluifournissantlachanedecaractrescontenantlesdonnesXML. UnefoislesdonnesXMLchargesdanslarbre,vouspouvezlocaliserdesn udsparticuliersafindelessoumettre desoprationsdetraitement,demanipulationoudemodification.Lamthode GetElementsByTagNamepermetdobtenir unobjet XmlNodeListcontenantlesn udsconcerns.Vouspouvezalorsobtenirlesattributsdun udenutilisantla propritAttributesouvrifiersilspossdentdesn udsenfantsaveclapropritHasChildNodes.Sicestlecas,vous avezaccscesn udslaidedelapropritChildNodessousformedunobjetXmlNodeList. Lexemplesuivantrecherchelesn udsmenudanslarboresenceetaffichelattributtype. menus = doc.GetElementsByTagName("menu")

- 2-

ENI Editions - All rigths reserved

For Each unMenu In menus Console.WriteLine(unMenu.Attributes("type").Value) Next Lescaractristiquesdesn udspeuventgalementtremodifiesenyajoutantunattribut.Lesn udsmenupeuvent parexemplerecevoirunattributprix. menus = doc.GetElementsByTagName("menu") Dim att As XmlAttribute For Each unMenu In menus If unMenu.Attributes("type").Value = "gastronomique" Then att = doc.CreateAttribute(prix") att.Value = "50 " unMenu.Attributes.Append(att) End If If unMenu.Attributes("type").Value = "economique" Then att = doc.CreateAttribute(prix") att.Value = "15 " unMenu.Attributes.Append(att) End If Next Il est galement possible dajouter des n uds enfants des n uds existant dans larboresence, en crant des instances de la classe XmlNode et en les reliant leur n ud parent. Lexemple suivant ajoute un digestif au menu gastronomique. menus = doc.GetElementsByTagName("menu") Dim att As XmlAttribute For Each unMenu In menus If unMenu.Attributes("type").Value = "gastronomique" Then Dim n1, n2, n3 As XmlNode n1 = doc.CreateNode(XmlNodeType.Element, "digestif", "") n2 = doc.CreateNode(XmlNodeType.Element, "nom", "") n3 = doc.CreateNode(XmlNodeType.Text, , ) n3.Value = "Cognac" n2.AppendChild(n3) n1.AppendChild(n2) unMenu.AppendChild(n1) End If Next Aprslexcutiondesdeuxexemplesprcdents,ledocumentXMLdoitavoirlaformesuivante : <?xml version="1.0" encoding="Windows-1252"?> <restaurant> <menu type="gastronomique" prix="50 <$&euro[-]>"> <entrees> <nom calories="50">radis</nom> <nom calories="300">pate</nom> <nom calories="350">saucisson</nom> </entrees> <plats> <nom calories="1000">choucroute</nom> <nom calories="2000">cassoulet</nom> <nom calories="1700">couscous</nom> </plats> <fromages> <nom calorie="240">camembert</nom> <nom calories="300">brie</nom> <nom calories="120">roquefort</nom> </fromages> <desserts> <nom calories="340" parfum="chocolat">glace</nom> <nom calories="250" fruits="pommes">tarte</nom> <nom calories="400">creme brule</nom> </desserts> <digestif> <nom>Cognac</nom> </digestif> </menu>

ENI Editions - All rigths reserved

- 3-

<menu type="economique" prix="15 <$&euro[-]>"> <entrees> <nom calories="50">pain</nom> </entrees> <plats> <nom calories="1700">jambon</nom> </plats> <fromages> <nom calorie="240">camembert</nom> </fromages> <desserts> <nom calories="340" parfum="a leau">glace</nom> </desserts> </menu> </restaurant> En fait, seule la reprsentation en mmoire du document XML est modifie. Si vous souhaitez conserver les modifications, il faut enregistrer le document dans un fichier pour assurer la persistance des informations. Pour cela, vous devez utiliser la mthode save de la classe XmlDocument, en lui fournissant le nom du fichier dans lequel vous souhaitezeffectuerlasauvegarde. doc.Save("resto2.xml")

2.UtilisationdeXPath
LobjectifprincipaldeXPathestdedfinirlamaniredadresserdespartiesdundocumentXML.LenomXPathvientde lutilisationdunecrituredetypepath,commedanslesshellsDOSetUNIX.Lebutestdesedplacerlintrieurde la structure hirarchique dun document XML comme dans une arborescence de rpertoires. Pour avoir une ide de lintrtdeXPath,nouspourrionsdirequilestlquivalentdulangageSQLpourundocumentXML.Lacomparaisondoit sarrterlcarlasyntaxenavraimentrienvoir !

a.RecherchedansundocumentXML
La premire tape, pour rechercher un lment dans document XML, consiste crer une instance de la classe XPathNavigator. Cette instance de classe doit connatre le document sur lequel elle va devoir faire des recherches,cestpourquoicestledocumentluimmequiparlintermdiairedelamthodeCreateNavigatorvafournir cetteinstancedeclasse. Dim navigateur As XPathNavigator = document.CreateNavigator() partirdecetteinstance,nousallonspouvoirlancerdesrecherchesdansledocumentlaidedelamthodeSelect. Cette mthode utilise comme paramtre une chane de caractres contenant le chemin XPath de recherche. Nous obtenons,aprslexcution,unobjetXPathNodeIteratorpermettantdeparcourirlalistedesn udstrouvs. Lexemplesuivantrecherchedansledocumentresto.xml,lesentresdisponiblesdanslesdiffrentsmenus : Dim document As XmlDocument = New XmlDocument () document.Load("resto.xml") Dim navigateur As XPathNavigator = document.CreateNavigator() Dim noeuds As XPathNodeIterator = navigateur.Select("/restaurant/menu/entrees") While noeuds.MoveNext() Console.WriteLine(noeuds.Current.OuterXml) Console.WriteLine() End While Nousobtenonslersultatsuivant : <entrees> <nom calories="50">radis</nom> <nom calories="300">pate</nom> <nom calories="350">saucisson</nom> </entrees> <entrees> <nom calories="50">pain</nom>

- 4-

ENI Editions - All rigths reserved

</entrees> IlestgalementpossibledajouterlarequteXPathdescritresdeslectionsurlavaleurdecertainsattributs. Lexemplesuivantrecherchelesdessertsdumenugastronomiquepourlesquelslescaloriessontinfrieures350 . Dim document As XmlDocument = New XmlDocument () document.Load("resto.xml") Dim navigateur As XPathNavigator = document.CreateNavigator() Dim noeuds As XPathNodeIterator = navigateur.Select("/restaurant/menu[@type= gastronomique]/desserts/nom[@calories^]) While noeuds.MoveNext() Console.WriteLine(noeuds.Current.Value) Console.WriteLine() End While

b.ModificationdesdonnesdundocumentXML
Aprsavoirtrouvunlmentdanslarborescencedundocument,ilestbiensrpossibledenmodifiersavaleur. Lexemplesuivantdiminuede50%lescaloriesdechaquedessertdumenugastronomique. Dim document As XmlDocument = New XmlDocument() document.Load(resto.xml) Dim navigateur As XPathNavigator = document.CreateNavigator() Dim noeuds As XPathNodeIterator = navigateur.Select(/restaurant/menu [ @type=gastronomique]/desserts/nom) While noeuds.MoveNext() noeuds.Current.MoveToAttribute(calories, ) noeuds.Current.SetValue(noeuds.Current.Value * 0.5) End While document.Save(resto.xml) Voicilecontenudufichieraprsexcutionducodeprcdent. <?xml version="1.0" encoding="utf-8"?> <restaurant> <menu type="gastronomique"> <entrees> <nom calories="50">radis</nom> <nom calories="300">pate</nom> <nom calories="350">saucisson</nom> </entrees> <plats> <nom calories="1000">choucroute</nom> <nom calories="2000">cassoulet</nom> <nom calories="1700">couscous</nom> </plats> <fromages> <nom calorie="240">camembert</nom> <nom calories="300">brie</nom> <nom calories="120">roquefort</nom> </fromages> <desserts> <nom calories="170" parfum="chocolat">glace</nom> <nom calories="125" fruits="pommes">tarte</nom> <nom calories="200">creme brule</nom> </desserts> </menu> <menu type="economique"> <entrees> <nom calories="50">pain</nom> </entrees> <plats> <nom calories="1700">jambon</nom> </plats> <fromages>

ENI Editions - All rigths reserved

- 5-

<nom calorie="240">camembert</nom> </fromages> <desserts> <nom calories="340" parfum="a leau">glace</nom> </desserts> </menu> </restaurant>

c.AjoutdenudundocumentXML
Aprslarecherchedunn uddansundocument,ilestpossibledyajouterdesn udsenfantsetdesn udsfrres. Les mthodes InsertAfter et InsertBefore ajoutent un n ud frre aprs ou avant le n ud actuel. La mthode AppendChildajouteunn udenfantaun udactuel. Lexemplesuivantajouteunnouveaudessertaumenugastronomique. Dim document As XmlDocument = New XmlDocument() document.Load(resto.xml) Dim navigateur As XPathNavigator = document.CreateNavigator() Dim noeuds As XPathNodeIterator = navigateur.Select("/restaurant/menu[@type= gastronomique]/desserts") noeuds.MoveNext() noeuds.Current.AppendChild("<nom calories=800>crepes</nom>") document.Save("resto.xml") Aprslexcutiondececode,ledocumentdevient : <?xml version="1.0" encoding="utf-8"?> <restaurant> <menu type="gastronomique"> <entrees> <nom calories="50">radis</nom> <nom calories="300">pate</nom> <nom calories="350">saucisson</nom> </entrees> <plats> <nom calories="1000">choucroute</nom> <nom calories="2000">cassoulet</nom> <nom calories="1700">couscous</nom> </plats> <fromages> <nom calorie="240">camembert</nom> <nom calories="300">brie</nom> <nom calories="120">roquefort</nom> </fromages> <desserts> <nom calories="340" parfum="chocolat">glace</nom> <nom calories="250" fruits="pommes">tarte</nom> <nom calories="400">creme brule</nom> <nom calories="800">crepes</nom> </desserts> </menu> <menu type="economique"> <entrees> <nom calories="50">pain</nom> </entrees> <plats> <nom calories="1700">jambon</nom> </plats> <fromages> <nom calorie="240">camembert</nom> </fromages> <desserts> <nom calories="340" parfum="a leau">glace</nom> </desserts> </menu> </restaurant>

- 6-

ENI Editions - All rigths reserved

Introduction
Maintenantquevotreapplicationesttermine,teste,dbogueetdoncquellefonctionnesansproblmes,ilesttemps depenseraumoyendelamettreladispositiondesutilisateurs.Deuxsolutionssontdisponibles :
q

LatechnologiededploiementWindowsInstaller.Lapplicationestempaquetedansunouplusieursfichiersqui sontensuitedistribusauxutilisateurs ceuxciexcutentlefichierSetup.exepourinstallerlapplication. LedploiementClickOnce.Aveccettesolution,lapublicationdesfichiersdelapplicationsefaitunemplacement centralisetlutilisateurinstalleouexcutelapplicationpartirdecetemplacement.

Nousallonsdoncdtaillerchacunedecesdeuxtechniquesdedploiement.

ENI Editions - All rigths reserved

- 1-

DploiementavecWindowsInstaller
Microsoft Windows Installer est un service dinstallation et de configuration dapplication disponible sur tous les systmes dexploitation Microsoft. Le principe de base du fonctionnement de Windows Installer repose sur le regroupement dans un seul lment de toutes les donnes et instructions ncessaires pour le dploiement dune application. Cest une volution importante par rapport aux procdures dinstallations classiques qui consistaient essentiellement fournir lensemble des fichiers ncessaires pour le bon fonctionnement de lapplication et un script chargdelarecopiedecesfichierssurledisquedurdelamachine. Avec Windows Installer, le systme conserve une trace de toutes oprations effectues pendant linstallation : rpertoirescrs,fichierscopis,entresdelabasederegistremodifies,etc.Cesinformationssontpar la suite utilises lors de la dsinstallation de lapplication. Windows Installer effectue alors les oprations inverses pendantladsinstallationdelapplication.Uncontrleestcependantralispoursassurerquaucuneautreapplication nencessiteunfichier,uneclderegistreouuncomposantquisapprtetresupprim.Cettevrificationpermetde sassurer que la suppression dune application nentrane pas de problmes de fonctionnement sur une autre application. Windows Installer gre galement la rparation dune application en rinstallant automatiquement les fichiers manquantsquiontputresupprims,parmgarde,parlutilisateur. La procdure dinstallation est effectue lintrieur dune transaction, garantissant que lapplication sera installe compltementouque,encasdchecaucoursdelinstallation,lesystmeretrouverasontatinitial. Lesprocduresdinstallationssontenfaitdevritablesapplications,ellessontdailleursgresparVisualStudiocomme desprojetspartentire.

1.Crationdunprojetdinstallation
Lamthodedecrationdunprojetdinstallationestidentiquecelleutilisepournimportequelautretypedeprojet deVisualStudio.DanslemenuFichier,slectionnez Ajouter,puis Nouveauprojet.DanslabotededialoguedAjout deprojet,slectionnezensuite Autrestypesdeprojetset Projetsdinstallationetdedploiement.Enfinchoisissez parmilesmodlesceluiquicorrespondvosbesoins(Projetdinstallationdansnotrecas).Leprojetestalorsajout la solution actuelle et lditeur du systme de fichiers est ouvert automatiquement. Vous pouvez maintenant configurer les proprits du programme dinstallation qui vont dterminer son comportement. Voici cidessous les principalespropritsdunprogrammedinstallation :
q

AddRemoveProgramsIcon : indique licne utilise pour reprsenter lapplication dans la bote de dialogue Ajout/Suppressiondeprogrammes. Author : spcifielenomdelauteurdelapplication.Pardfautcettepropritcorrespondaunomdudtenteur delalicencedeVisualStudioutilispourdvelopperlapplication. DetectNewerInstalledVersion : indique si le programme dinstallation vrifie lexistence dune version plus rcentedelapplicationsurleposteclient.Sicestlecaslaprocduredinstallationestannule. ManufacturerUrl : adressedusiteWebdufabricantdelapplication.Elleestaffichedanslabotededialogue Informations de support technique accessible partir de la bote de dialogue Ajout/Suppression de programmes. ProductCode : Windows Installer utilise cette proprit pour identifier une application lors de chaque installation ou mise jour deux applications diffrentes ne peuvent pas comporter le mme code ProductCode. ProductName : contient le nom dcrivant lapplicationquiestinstallesurunordinateurcible.Pardfaut,ce nom est identique celui du projet de dploiement. Cette proprit ProductName est affiche dans la description de lapplication sur la bote de dialogue Ajout/Suppression de programmes. Elle est galement utilisedanslacrationduchemindinstallationpardfaututilislorsdelinstallation. RemovePreviousVersions : spcifie si le programme dinstallation doit supprimer, lors de linstallation, toute versionantrieureduneapplication.SicettepropritalavaleurTrueetquunnumrodeversionantrieure estdtectlorsdelinstallation,lafonctiondedsinstallationdecetteversionestappele. TargetPlatform : spcifie la plateforme matrielle pour laquelle lapplication a t conue. Au moment de linstallation, cette proprit est vrifie par rapport lordinateur cible pour dterminer si linstallation peut continuer.

ENI Editions - All rigths reserved

- 1-

Version : spcifie le numro de version du programme dinstallation. Cette proprit doit tre modifie pour chaque version finale de votre programme dinstallation. Si vous modifiez cette proprit, vous devez galementmettrejourlapropritProductCode.

Un petit dtail doit vous sembler bizarre car parmi toutes ces proprits aucune dentre elles ne permet dindiquer quelleapplicationdoittreinstalle.Cetteinformationdoitenfaittrefournielorsdelaconfigurationduprogramme dinstallation.Cestcequenousallonsvoirdansltapesuivante.

2.Configurationduprogrammedinstallation
La configuration du fonctionnement du programme dinstallation se fait par lintermdiaire dun diteur spcifique chacunedesfonctionnalits.Cesditeurssontdisponiblesparlemenucontextuelafficheneffectuantunclicdroitsur lenomduprojetdedploiementdanslexplorateurdesolutions.

Cesditeursvontpermettredeconfigurerlefonctionnementduprogrammedinstallation.
q

Lditeur du systme de fichiers va permettre dajouter un projet de dploiement les fichiers constituant lapplicationdployer. LditeurduregistreconfigurelesclsetlesvaleursdeRegistreajouterauRegistredelordinateurcible. Lditeurdestypesdefichiersspcifielesassociationsentrelestypesdefichiersetlesactionsautorisespour chaquetypedefichier. Lditeurdelinterfaceutilisateurpermetdespcifieretdeconfigurerlesbotesdedialogueaffichespendant linstallationdelapplication. Lditeur des actions personnalises permet de spcifier les actions supplmentaires excuter pendant linstallation. Lditeurdesconditionsdelancementspcifielesconditionsrequisespourlinstallation.

Nousallonstudierendtailchacundecesditeurs.

a.Lditeurdusystmedefichiers
Cestcertainementlditeurleplusimportantdelaconfigurationdunprojetdedploiement.Parsonintermdiaire, nousallonsindiquerlesmodificationsapporterausystmedefichiersdelordinateursurlequellapplicationvatre dploye.

- 2-

ENI Editions - All rigths reserved

Il est compos de deux parties : un volet de navigation gauche et un volet dinformations droite. Le volet de navigation contient la liste hirarchique des dossiers correspondant au systme de fichiers de lordinateur dinstallation. Les noms des dossiers correspondent aux dossiers Windows standard. Par exemple, la rubrique dossier dapplication dsigne le sousdossier du dossier Program Files o lapplication sera installe. Le menu contextuel de chacun des dossiers permet dy ajouter diffrents lments. Dans le dossier dapplication, nous pouvonsparexempleajouterunsousdossier,unfichier,unassemblyou,optionlaplusfrquemmentutilise,une sortiedeprojet(lesfichierscrsparlacompilationdunprojet).Cestdoncgrcecetditeurquenousallonsenfin pouvoirindiquerquelprojetnoussouhaitonsdployer.Labotededialoguesuivantenouspermetdechoisirleprojet dployeretlesquelsdeceslmentsnoussouhaitonsdployersurlespostesdesclients.

Pour que lapplication puisse sexcuter sur lordinateur client, il faut au minimum slectionner loption Sortie principale. Par contre, loption Source Files est plus rarement utilise. Vous devez galement indiquer si vous souhaitezdployerlaversionDebugoulaversionReleasedelapplication.Lajoutdeplusieurslmentssefaiten maintenantlatouche[Ctrl]enfoncependantlaslection. LesdossiersUsersDesktopetUsersProgramMenureoiventgnralementunsimpleraccourciverslapplication.Ce raccourcidoitaupralabletrecrparlemenucontextueldelasortieprincipaledelapplication.

ENI Editions - All rigths reserved

- 3-

Il doit ensuite tre dplac vers le dossier correspondant (Bureau de lutilisateur ou Menu Programmes de lutilisateur). Pour que chacun de ces dossiers soient crs mme sil ne contient aucun lment, il faut modifier sa proprit AlwaysCreatesurTrue.

b.Lditeurduregistre
LditeurduRegistrepermetdajouterdesclsdeRegistreunprojetdedploiement.Siuneclnexistepasdans leregistredelamachinelorsdudploiement,elleestajoutependantlinstallation.Ilestpossibledajouterdescls sousnimportequellecldeniveausuprieurdanslditeurduregistre.

Pour ajouter une cl dans le registre, vous devez au pralable slectionner un n uddeniveausuprieur,ouune souscl puis laide du menu contextuel utiliser loption New Key. La cl doit ensuite tre renomme et ses proprits modifies en fonction des besoins. La principale modification consiste configurer la proprit DeleteAtUninstallpourquecetteclderegistresoitsupprimelorsdeladsinstallationdelapplication. La suppression dune cl est ralise tout aussi simplement avec loption Supprimer du menu contextuel. Il faut cependant tre prudent car la suppression dune cl entrane la suppression de toutes les souscls et valeurs contenuesdanscelleci.Unmessagedavertissementestaffichpourvousprvenirdecettesituationdangereuseet vousdemandedeconfirmervotrechoix.

- 4-

ENI Editions - All rigths reserved

Lditeur du registre est galement utilis pour spcifier les valeurs des nouvelles cls ou modifier les valeurs existantes. Vous pouvez ajouter des valeurs de type chane, binaire et DWORD. Pendant linstallation, les valeurs sontcritesdansleRegistre lesvaleursexistantessontremplacesparlesvaleursspcifiesdansleprogramme dinstallation. Il est possible dajouter des cls et des valeurs de registre un projet de dploiement en important un fichier de registre(.reg)danslditeurduregistre.Celavouspermettradecopierunesectioncompltedunregistreexistant enuneseulefoispourgagnerdutemps.Lesfichiersderegistrepeuventtrecrslaidedoutilstelsquelditeur duregistredeWindows(regedit.exe).Cettesolutionesttrspratiquepourtransfrersurlepostedesutilisateurs une portion de registre rcupre sur le poste utilis pour le dveloppement de lapplication. Le menu contextuel disponible sur llment Registre de lordinateur cible propose loption Importer permettant de raliser cette opration.Vousdevezsimplementchoisirlefichier(.reg)contenantlesinformationsimporter.

c.Lditeurdestypesdefichiers
Lditeurdestypesdefichiersestutilispourindiquerlestypesdedocumentsetlesextensionsdefichierassocis votreapplicationlorsdesoninstallationsurunordinateur.Unefoislassociationinstalle,lextensionetladescription dutypedefichierfigurentdanslalistedestypesdefichiersdusystme. Lassociationduntypedefichieravecuneapplicationncessitetroistapes :
q

Lajoutduntypededocument. Lassociationduneextensiondefichier. Lassociationdunfichierexcutable.

Pour ajouter un type de fichier vous devez utiliser le menu contextuel de lditeur des types de fichiers et choisir loption Ajouter un type de fichier. Il faut ensuite modifier le nom de llment qui vient dtre ajout. Ltape suivante consiste indiquer lextension ou les extensions associes ce type de fichier. Elles doivent tre saisies danslafentredeproprits,danslarubrique Extensions,sanstreprcdesdunpoint.Siplusieursextensions sontdisponibles,ellesdoiventtresparesparunpointvirgulelorsdelasaisiedanslafentredeproprits.La dernire tape est maintenant dassocier une application (un fichier excutable) ce type de fichier. La proprit Command est utilise cet effet. Un diteur particulier vous permet de rechercher parmi les dossiers du projet lexcutablequiserautilispourmanipulercetypededocument.

Cest cet excutable qui sera lanc lorsque lutilisateur effectuera un double clic sur un fichier de ce type dans lExplorateur Windows. Il est possible dajouterdautres actions qui seront disponibles par lintermdiaire du menu contextueldelexplorateurWindows.Ceslmentspeuventtreajoutsenutilisantlemenucontextueldisponible suruntypedefichieretenchoisissantloptionAjouteruneaction.Lactiondoitensuitetreconfigureenindiquant
ENI Editions - All rigths reserved - 5-

lesparamtressuivants :
q

nom de laction : utilis pour reprsenter laction dans le menu contextuel de lexplorateur Windows. Pour inclure une touche daccs rapide dans le nom de laction, faites prcder du signe & la lettre utilise pour accderlacommande. Arguments : reprsente les paramtres passs sur la ligne de commande permettant la ralisation de laction.Parexemple,lachanesuivantepeuttreassocielactiondimpressiondundocument.:/p%1". Danscettechanedecaractres,lapartie%1"reprsentelenomdufichiersurlequellemenucontextuela t activ. Les caractres sont obligatoires pour viter les problmes si le nom de fichier comporte un espace. Il faut bien sur que votre application ait t conue pour traiter ces paramtres lors de son dmarrage. Verb : indiqueleverbeutilispourdemanderlexcutiondelaction.

d.Lditeurdelinterfaceutilisateur
Avec lditeur de linterface utilisateur, vous pouvez spcifier et dfinir les proprits des botes de dialogue prdfiniesquiserontaffichespendantlinstallationsurlordinateur. Cet diteur contient deux sections : Install et Administrative Install. La section Install contient les botes de dialogue qui seront affiches quand lutilisateur final excutera le programme dinstallation la section Administrative Install contient des botes de dialogue qui seront affiches quand un administrateur systme tlchargeraleprogrammedinstallationversunemplacementrseau. Un ensemble de botes de dialogue prdfinies est affich dans lditeur vous pouvez les rorganiser ou les supprimer. Lesbotesdedialogueprdfiniesserpartissententroiscatgories :
q

Lesbotesdedialogue Dbutsaffichentavantquelinstallationnecommence.Ellesserventgnralement rcuprerdesinformationssurlutilisateuroupermettredechangerderpertoiredinstallation. UnebotededialogueProgressiondonnedesinformationssurlavancementduneinstallation. Lesbotesdedialogue Finsaffichentlorsquelinstallationarussi.Ellesserventgnralementsignaler lutilisateurquelinstallationesttermineouluipermettredelancerlapplication.

Vouspouvezdplacerdesbotesdedialogueentrelesn udsdescatgoriesparunglisserdplaceroulaidedes commandesCouperetCollerdumenuEdition. Pour que linstallation se fasse sans botes de dialogue vous devez supprimer toutes les botes de dialogue dans lditeurdelinterfaceutilisateur. Chaquebotededialoguepeuttrepersonnaliseenfonctiondesbesoins.Pourchacunedentreelleslesproprits disponibles modifient laspectdelabotededialogue.Surtoutescesbotesdedialogue,laproprit BannerBitmap reprsente le logo affich sur la bote de dialogue. Des proprits spcifiques sont accessibles sur chacune des botesdedialogue. BotededialogueBienvenue
q

LapropritWelcomeTextcontientlemessagedeprsentationdelapplication. LapropritCopyrightWarningindiquelesinformationsrelativesaucopyrightdelapplication.

BotededialogueDossierdinstallation
q

La proprit InstallAllUsersVisible dtermine si les boutons permettant de choisir le type dinstallation (pourunseulutilisateuroupourtouslesutilisateurs)sontvisibles.

BotededialogueProgression
q

Laffichage dune barre de progression au cours de linstallation est dtermin par la proprit ShowProgressBar.

- 6-

ENI Editions - All rigths reserved

BotededialogueTermin LesinformationsconcernantlesmisesjourdisponiblessontaffichesparlapropritUpdateText.

e.Lditeurdesactionspersonnalises
Cet diteur permet de spcifier des actions supplmentaires excuter sur lordinateur pendant linstallation. Par exemple,ilpeuttreutiledexcuterunprogrammecrantunebasededonnessurunserveur. Avantdepouvoirtreajoutesunprojetdedploiement,lesactionspersonnalisesdoiventtrecompilessous formedefichier.dllou.exe,ouajoutesunprojetentantquescriptouassembly.Ellesnepeuventtreexcutes qulafindelinstallation. Lditeurcontientquatredossiersquicorrespondentchacununephasedelinstallation : Installer Lesactionspersonnalisesplacessouscen udserontexcuteslafindelaphasedinstallation,unefoistous lesfichiersinstalls. Valider Lesactionspersonnalisesplacessouscen udserontexcuteslafindelaphasedevalidationdelinstallation, quialieuunefoislaphasedinstallationterminesanserreur. Restaurer Les actions personnalises places sous ce n ud seront excutes la fin de la phase de restauration de linstallation,quiestdclenchelorsquuneerreurdinstallationseproduit. Dsinstaller Les actions personnalises places sous ce n ud seront excutes la fin de la phase de dsinstallation de linstallation,quialieulorsquuneapplicationestdsinstalle. Pour chacune de ces rubriques vous pouvez ajouter une action personnalise par loption Add Custom Action du menu contextuel. Vous devez ensuite slectionner parmi les lments disponibles dans le projet celui charg de raliservotreactionpersonnalise(.exe,.dll,.vbs). Les actions personnalises seront excutes dans leur ordre daffichage dans lditeur. Vous pouvez modifier cet ordreparunglisserdplaceroulaidedescommandesCouperetCollerdumenuEdition.

f.Lditeurdesconditionsdelancement
Cet diteur doit tre utilis pour spcifier les conditions requises pour linstallation de votre application. Les conditionspeuventconcernerlarecherchedunfichier,duneentreduregistreouduncomposant.Lersultatdela rechercheestretournsousformedunepropritquiestensuitevaluedurantlinstallation.Linstallationchoue siuneconditionnestpasremplie. Lditeur des conditions de lancement est constitu dune arborescence compose de deux sections : la section RecherchedelordinateurciblepourconfigurerlesrecherchesetlasectionConditionsdelancementpourtablir lesconditionsbasessurlersultatdesrecherches. Dansunpremiertempsvousdevezajouter,parlemenucontextueldelarubrique Recherchedelordinateurcible, lesrechercheseffectueravantlinstallation. Recherchesurunfichier Pourcettecatgoriederecherche,lespropritssuivantessontdisponibles :
q

Depth : spcifie le nombre de niveaux de sousdossiers dans lesquels rechercher un fichier. La valeur par dfautest 0indiquantqueseulledossierindiquseraparcouru. FileName : spcifielenomdufichierrechercher.Lescaractresgnriques(* ?)nesontpasautoriss. Folder : spcifie le dossier dans lequel la recherche va dbuter. Les noms des dossiers spciaux reconnus parWindowsInstallerdoiventtresaisieentrelescaractres[et].Lavaleurpardfautest [SystemFolder].

ENI Editions - All rigths reserved

- 7-

MaxDate : lefichierrecherchnedoitpastreplusrcentquecettedate. MaxSize : spcifielataillemaximale(enoctets)dufichierrecherch.Ellenedoitpastresuprieurecette valeur. MaxVersion :spcifielenumrodeversionmaximaldunfichier. MinDate : lefichierrecherchdoittreplusrcentqueladateindique. MinSize : spcifie la taille minimale (en octets) dun fichier lors dune recherche de fichiers. Elle doit tre suprieurecettevaleur. MinVersion : spcifie le numro de version minimal dun fichier. Ce numro doit tre saisi avec le format n.n.n.n,onestunentier. Name : spcifie le nom utilis dans lditeur des conditions de lancement pour identifier cette recherche de fichiers. Property : spcifie le nom de la proprit utilise au moment de linstallation pour tester le rsultat de la recherche.

Recherchedansleregistre Lespropritssuivantespermettentdeconfigurercetypederecherche :
q

Name : spcifielenomutilisdanslditeurdesconditionsdelancementpouridentifiercetterecherchedansle registreslectionn. Property : spcifie le nom de la proprit utilise au moment de linstallation pour tester le rsultat de la recherche. RegKey : spcifieuneclduregistrerechercher.Cettevaleurdoitreprsenterlechemincompletdelacldu registre. Elle doit correspondre exactement au nom et au chemin daccs qui figurent dans le registre, espacesventuelscompris,sinonlarecherchedelacldansleregistrechoue. Root : spcifielepointdedpartdelarecherchedansleRegistre.Lesvaleurspossiblessont :HKLM : dbute la recherche dans HKEY_LOCAL_MACHINE, HKCU : dbute la recherche dans HKEY_CURRENT_USER, HKCR : dbutelarecherchedansHKEY_CLASSES_ROOTetHKU : dbutelarecherchedansHKEY_USERS. Value : spcifie la valeur rechercher dans la base de registre. Cette proprit doit tre une chane correspondantlavaleuraffichedanslacolonneDonnesdelditeurduregistreWindows.

Recherchedecomposants Cette recherche permet de vrifier quun composant requis par votre application est disponible sur la machine dinstallation.Lespropritsderecherchesontlessuivantes :
q

ComponentId : spcifieleGUIDducomposantrechercher.cettevaleurdoittrefourniessouslaformedune chanemiseenformecommeunGUID,laideduformat{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}oX estunchiffrehexadcimal(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F).Lesaccoladessontobligatoires. Name : spcifielenomutilisdanslditeurdesconditionsdelancementpouridentifiercetterecherchedansle Registreslectionne. Property : spcifie le nom de la proprit utilise au moment de linstallation pour tester le rsultat de la recherche.

Lersultatdecesrecherchespeutensuitetreutilispourajouterdesconditionsdelancementdelinstallationpar lemenucontextueldelarubriqueConditionsdelancement. Pourchaqueconditiondelancement,lespropritssuivantessontdisponibles:


- 8 ENI Editions - All rigths reserved

InstallUrl : indique lemplacement o les fichiers manquant peuvent tre tlchargs si une condition de lancementassocielaprsencedunfichierchoue. Message : spcifielemessageafficherlorsquuneconditionalavaleurfalseaumomentdelinstallation. Name : spcifie le nom utilis dans lditeur des conditions de lancement pour identifier cette condition de lancement. Condition : spcifie une condition qui doit tre remplie (prendre la valeur true) au moment de linstallation pourquelinstallationpuissecontinuer.

Laderniretapeconsistelancerlagnrationduprojetettestersonbonfonctionnementparlintermdiairede loptionInstalldumenuProject.

ENI Editions - All rigths reserved

- 9-

DploiementavecClickOnce
ClickOnceestunetechnologiededploiementpermettantdecrerdesapplicationsWindowsdontlamisejourpeut treeffectueautomatiquement.Linstallationdecetypedapplicationesteffectueavecunminimumdinterventionde lapartdelutilisateur.Cettetechniquesimplifieltapededploiementquiparfoissetransformeenvritablecassette. Lesproblmessuivantssontfrquemmentrencontrslorsdudploiementduneapplication. Misejourdelapplication Avecunemthodededploiementclassique,lorsquunenouvelleversiondelapplicationestdisponible,lutilisateurdoit engnralrinstallerlapplicationpourbnficierdesmisesjour.LatechnologieClickOnceestcapabledefournirles misesjourautomatiquement.Danscecasseuleslespartiesdelapplicationquiontchangessonttlcharges,puis, lapplicationcomplte,misejourestrinstalleautomatiquementpartirdunnouveaudossier. Composantspartags Les applications dpendent souvent de composants partags, do lexistence dun risque potentiel de conflit de versions.DanslecasdundploiementavecClickOnce,chaqueapplicationestautonomeetnepeutpasinterfreravec lesautresapplications. Autorisationsdescurit Gnralementlinstallationduneapplicationavecunemthodeclassiqueexigedesautorisationsadministrativessurle poste de travail o est effectue linstallation. Le dploiement avec ClickOnce autorise les utilisateurs nayant pas de privilges administratifs effectuer linstallation et nattribue que les autorisations de scurit daccs du code ncessairesaubonfonctionnementdelapplication. Toutes ces contraintes ont parfois conduit les dveloppeurs choisir une technologie Web au lieu dapplications Windowsclassiquessimplementpourbnficierdesfacilitsdedploiementdecetypedapplications.Lacontrepartie de ce choix se retrouve au niveau de la moins bonne ractivit de lapplication et dune interface utilisateur moins labore. La technologie ClickOnce rend le dploiement dapplications Windows aussi simple que le dploiement dapplications Web. Nimporte quelle application console ou Windows Forms peut tre publie avec ClickOnce. Trois techniquesdepublicationsontdisponibles :
q

partirdunepageWeb partirdunpartagedefichiersrseau partirdunsupporttelquunCDRomouDVD.

Lexcutiondelapplicationdisposegalementdedeuxvariantes.Lapplicationpeuttreinstallesurlordinateurdun utilisateuretexcutemmesilordinateuresthorsconnexion.Ellepeutgalementtreexcuteuniquementenmode enlignesansinstalleraucunlmentdefaonpermanentesurlordinateur.LesapplicationsClickOncesontisolesles unesdesautresetlinstallationoulexcutionduneapplicationnepeutpasinterrompredesapplicationsexistantes.Par dfaut,lesapplicationsClickOncesexcutentdansleszonesdescuritInternetouIntranet.Enfonctiondesbesoins lapplicationpeutdemanderdesautorisationsdescuritplusleves. La mise jour de lapplication peut galement avoir plusieurs modes de fonctionnement. Elles peuvent tre automatiquesetdanscecas,lapplicationvrifiechaquedmarragesidesmisesjoursontdisponibles,puiselleles installeautomatiquement.Lutilisateurpeutmanuellementvrifierlexistencedunemisejouretdciderounondeson installation.Ladministrateurpeutaussirendreobligatoirelinstallationdunemisejour.

1.PrincipedefonctionnementdeClickOnce
LemcanismededploiementClickOncereposesurdeuxfichiersXML appelsmanifestes :
q

Unmanifestedapplication. Unmanifestededploiement.

Le manifeste dapplication dcrit lapplication ellemme, les assemblies et les fichiers qui la composent, les dpendances, les autorisations requises pour lexcution et lemplacement dans lequel les mises jour seront disponibles.

ENI Editions - All rigths reserved

- 1-

Le manifeste de dploiement dcrit comment lapplication est dploye, y compris lemplacement du manifeste dapplicationetlaversiondelapplicationquelesclientsdoiventexcuter.CesdeuxfichierssontgnrsparVisual Studio. Le manifeste de dploiement est copi vers lemplacement de dploiement. Cet emplacement peut tre un serveur Web,unrpertoirepartagsurlerseauoudessupportsamoviblestelsquunCDRom.Lemanifestedapplicationet tous les fichiers de lapplication sont galement copis vers un lemplacement de dploiement spcifi dans le manifestededploiement.Cesfichierspeuventtrecopisverslemmeemplacementoudansdeuxemplacements distincts.VisualStudioprendgalementenchargelescopiesdecesfichiers. Aprs le dploiement de lapplication dans lemplacement de dploiement, les utilisateurs peuvent tlcharger et installerlapplication en cliquant sur licnereprsentantlefichiermanifestededploiementdisponiblesurunepage Web ou dans un dossier. Lutilisateur voit simplement safficher une simple bote de dialogue lui demandant de confirmer linstallation. Aprs validation, linstallation continue et lapplication est lance sans autre intervention. Si lapplication ncessite des autorisations dexcution plus leves, la bote de dialogue demande lutilisateur daccorderlesautorisationspourquelinstallationpuissesepoursuivre. Lapplication est ajoute au menu Dmarrer de lutilisateur et la rubrique Ajout/Suppression de programmes du Panneau de configuration. Contrairement dautres technologies de dploiement, rien nest ajout au dossier ProgramFiles,danslabasederegistreousurlebureau.Deplusaucundroitdadministrationnestncessairepour linstallation. Lorsque vous crez une version mise jour de lapplication, vous devez galement gnrer un nouveau manifeste dapplicationetcopierlesfichiersversunemplacementdedploiement,gnralementundossierfrredudossierde dploiement dorigine. Le manifeste doit aussi tre mis jour pour quil pointe vers lemplacement de la nouvelle versiondelapplication.

2.Lesdiffrentesmthodesdedploiement
Pour dployer une application ClickOnce, trois stratgies sont possibles. La stratgie que vous choisissez dpend principalementdutypedapplicationquevousdployez.Lestroisstratgiesdedploiementsontlessuivantes :
q

InstallationpartirduWeboudunpartagerseau InstallationpartirdunCDRom DmarragedelapplicationpartirduWeboudunpartagerseau.

InstallationpartirduWeboudunpartagerseau CettestratgiepermetdedployervotreapplicationsurunserveurWebouunpartagedefichiersrseau.Lorsquun utilisateurfinalsouhaiteinstallerlapplication,ilcliquesuruneicnedunepageWeboudoublecliquesuruneicnedu partage de fichiers. Lapplication est ensuite tlcharge, installe et dmarre sur lordinateur de lutilisateur. Des lments sont ajouts au menu Dmarrer et au groupe Ajout/Suppression de programmes dans le Panneau de configuration. tant donn que cette stratgie dpend de la connexion rseau, elle fonctionne de manire optimale pour les applications qui seront dployes pour les utilisateurs qui ont accs un rseau local ou une connexion Internet rapide. InstallationpartirdunCDRom Cette stratgie permet de dployer votre application sur un support amovible tel quun CDRom ou un DVD. Comme pourloptionprcdente,lorsquelutilisateurchoisitdinstallerlapplication,cettedernireestinstalle,lanceetdes lments sont ajouts au menu Dmarrer et au groupe Ajout/Suppression de programmes dans le Panneau de configuration. Cette stratgie fonctionne mieux dans le cas dapplications dployes sur les ordinateurs dutilisateurs qui ne possdentpasuneconnectivitrseaupersistanteouquiontdesconnexionsfaiblebandepassante.Lapplication tant installe partir dun support amovible, aucune connexion rseau nest ncessaire pour linstallation la connectivitrseauestnanmoinsncessairepourlesmisesjourdelapplication. DmarragedelapplicationpartirduWeboudunpartagerseau Cette stratgie est similaire la premire, sauf que lapplication se comporte comme une application Web. Lorsque lutilisateur clique sur un lien dune page Web (ou double clic sur une icne du partage de fichiers), lapplication est lance. Lorsque les utilisateurs ferment lapplication, cette dernire nest plus disponible sur leur ordinateur local. AucunlmentnestajoutaumenuDmarrerouaugroupeAjout/SuppressiondeprogrammesdanslePanneaude configuration. Techniquement, lapplication est tlcharge et installe dans un cache dapplication de lordinateur local, de la mme faon quune application Web est tlcharge vers le cache Web. Comme pour le cache Web, les
- 2 ENI Editions - All rigths reserved

fichiers sont nettoys du cache dapplication en fin dutilisation. Toutefois, lutilisateur a limpression que lapplication estexcutepartirduWeboudupartagedefichiers. Cettestratgieestprivilgierpourlesapplicationsrarementutilises.

3.Lesmisesjourdelapplication
ClickOncepeutfournirautomatiquementlesmisesjourdelapplication.UneapplicationClickOncelitpriodiquement son fichier manifeste de dploiement pour vrifier si les mises jour de lapplication sont disponibles. Si elle est disponible, la nouvelle version de lapplication est tlcharge et excute. Pour des raisons defficacit, seuls les fichiersmodifissonttlchargs. Troisstratgiesdebasesontpossibles pourlesmisesjour :
q

Lavrificationdesmisesjouraudmarragedelapplication Lavrificationdesmisesjouraprsledmarragedelapplication(excutedansunthreaddarrireplan) Laprsentationduneinterfaceutilisateurdestineauxmisesjour.

Vous pouvez galement dterminer la frquence de vrification des mises jour effectue par lapplication ou configurerunemisejourobligatoire.Lesmisesjourdapplicationexigentuneconnexionaurseau.Enlabsence duneconnexionrseau,lapplicationsexcutesansvrifierlesmisesjour,quellequesoitlastratgiedemisejour choisie. Vrificationdesmisesjouraprsledmarrage Par dfaut, lapplication tente de localiser et de lire le fichier manifeste de dploiement en arrireplan pendant son excution.Siunemisejourestdisponible,lorsdelaprochaineexcution,lutilisateurserainvittlchargeret installerlamisejour. Cette stratgie est tout particulirement adapte aux connexions rseau bande passante restreinte ou aux applicationsvolumineuses,pouvantncessiterdelongstlchargements. Vrificationdesmisesjouraudmarrage Aveccettestratgie,lapplicationtentedelocaliseretdelirelefichiermanifestededploiementchaquelancement.Si une mise jour est disponible, elle sera tlcharge et excute sinon, la version existante de lapplication sera excute. Cettestratgieestbienadapteauxconnexionsrseaulargebandepassante ledlaincessaireaulancementde lapplicationpeuttreinacceptablesurdesconnexionsbandepassanteplusrestreintedufaitdutlchargementdes misesjour. Misesjourobligatoire Ilestparfoissouhaitabledobligerlesutilisateursexcuteruneversionmisejourdelapplicationsi,parexemple, vousavezmodifiuneressourcequirisquedeperturberlefonctionnementdelancienneversiondelapplication.Vous pouvezdanscecasmarquerlamisejourcommetantobligatoireetdecefait,empcherlexcutionduneversion plusanciennedelapplication.Cettestratgiedoittreassocieaveclavrificationdesmisesjouraudmarrage. Intervallesdemisejour Danslecadredesmisesjourautomatiquesvouspouvezgalementspcifierlafrquencedevrificationdesmises jour.Parexemple,vouspouvezsouhaiterunevrificationchaqueexcutiondelapplication,unefoisparsemaineou une fois par mois. Si aucune connexion rseau nest disponible au moment spcifi pour la vrification, celleci est effectuelaprochaineexcutiondelapplication. Blocagedesmisesjour Ilestgalementpossibledefaireensortequevotreapplicationnevrifiejamaislesmisesjour.Parexemple,vous pouvez dployer une application simple qui ne sera jamais mise jour tout en bnficiant de la facilit dinstallation fournieparClickOnce.

4.MiseenuvredelapublicationClickOnce

ENI Editions - All rigths reserved

- 3-

LapublicationduneapplicationaveclatechnologieClickOnceestgrandementfaciliteparunassistantpermettantde recueillirlamajoritdesinformationsncessairesaudploiement.Cetassistantestdisponibleenchoisissantloption Publierdumenucontextuelaccessiblesurleprojetdployerdanslexplorateurdesolutions.Certainesoptionsde dploiementnesontcependantpasgresparcetassistantetdoiventtreconfiguresmanuellementvialabotede dialoguedepropritsduprojet. Lapremiretapedelassistantconsisteconfigurerlemplacementodoitsefairelapublication.

Cetemplacementpeuttre :
q

Unrpertoiredelamachine. Un rpertoire partag sur une autre machine en indiquant un chemin UNC de la forme suivante \\nom de la machine\nom du rpertoire. Vous devez avoir lautorisation dcrire sur le partage pour que la publication puissetreralise. LeserveurWebIISdelamachinesurlequelvousdevezavoiraupralableajoutunrpertoirevirtuelpour accueillirlesfichiers. Un serveur ftp pour lequel vous devez fournir les informations de connexion laide de la bote de dialogue suivante :

- 4-

ENI Editions - All rigths reserved

Vousdevezindiquer :
q

LadresseIPoulenomduserveurftp. Lenumroduportutilispourcontacterleserveur(engnral21). Le rpertoire du serveur dans lequel sera effectue la copie des fichiers. Vous devez avoir lautorisation dcrituredanscerpertoire. SivoustessituderrireunparefeuenactivantloptionModepassif. Si vous vous connectez de faon anonyme ou sinon le nom dutilisateur et le mot de passe utiliss pour la connexion.

Ladeuximetapedterminecommentlesutilisateursvontinstallerlapplication.

ENI Editions - All rigths reserved

- 5-

Lesoptionspossiblessont :
q

partirdunsiteWebdontvousindiquezlURL. partirdunpartagerseaudontvousspcifiezlecheminUNC.Lesutilisateursdevrontbiensravoirledroit deliresurlepartage.Ledroitdcriturenestpasobligatoireetmmefortementdconseill. partirdunCDRomouDVDquevousfournirez.Lacrationdecesupportnestpasralisparlassistantet doittreeffectuparuneapplicationdegravureexterne.

Lassistantvousproposeensuitedeconfigurerlastratgiedemisejour.

- 6-

ENI Editions - All rigths reserved

Si vous souhaitez activer les mises jour, il faut indiquer lemplacement partir duquel elles seront obtenues. Cet emplacement nest pas forcment le mme que celui utilis pour linstallation. Lultime tape affiche un rsum des informationsslectionnesetpermetdelancerlapublicationavecleboutonFinish.

la fin de linstallation une page html est ouverte sur lemplacement utilis pendant la publication permettant le lancementdelinstallationoulexcutiondelapplication.

LesoptionsdedploiementplusspcifiquesdoiventtreconfiguresvialarubriquePublierdespropritsduprojet. Cettebotededialoguereprendlespropritsconfiguresparlassistantdepublication.

ENI Editions - All rigths reserved

- 7-

Les boutons Fichiers dapplication, Composants requis, Mises jour et Options permettent de peaufiner les rglages. LeboutonFichiersdapplicationaffichelabotededialoguesuivanteconcernantlesfichiersconstituantlapplication.

Ltatdelapublicationdechaquefichierpeuttreconfiguravectroisvaleursdiffrentes :
q

Inclure : lefichierseradisponiblepourlesutilisateurssurlesupportdedploiement. Exclure : lefichiernestpasrecopisurlesupportdedploiement. Fichier de donnes : le fichier contient des donnes ncessaires au bon fonctionnement de lapplication et sera inclus dans la publication. Le bouton Composants requisest utilis pour configurer les lments ncessairespourlefonctionnementdelapplication.

- 8-

ENI Editions - All rigths reserved

Vous pouvez choisir de crer un programme dinstallation pour les composants requis pour le fonctionnement de lapplication en cochant la case Crer un programme dinstallation des composants requis. Les composants concerns sont choisir dans la liste prsente. Vous devez galement indiquer partir de quel emplacement ces composantsserontinstalls.Troisoptionssontpossibles :
q

partirdusiteWebdufournisseurducomposant partirdummeemplacementqueceluiutilispourinstallerlapplication partirdelemplacementindiqu.

La configuration des mises jour prvue lors de lutilisation de lassistant peut tre modifie par le bouton Mises jour.

ENI Editions - All rigths reserved

- 9-

La case cocher Lapplication doit vrifier la disponibilit de mises jourspcifie que lapplication doit vrifier la disponibilit de mises jour ds son installation. Si vous slectionnez cette option, les autres options deviennent disponibles. Elles permettent de choisir le moment o aura lieu la vrification de la disponibilit dune mise jour. LoptionAvantledmarragedelapplicationindiquequelapplicationdoitvrifieladisponibilitdemisesjouravant ledmarrage.Celagarantitquelesutilisateursquisontconnectsaurseaudisposenttoujoursdelaversionlaplus rcentedelapplication.Cetteoptionpeutralentirledmarragedelapplicationdanslecasodesmisesjoursont disponibles. Loption Aprs le dmarrage de lapplication planifie lexcution de la mise jour lors du prochain redmarrage de lapplication. La frquence de vrification des mises jour peut galement tre indique par un nombre dheures, de jours ou de semaines ou bien tre excute chaque dmarrage de lapplication. Vous devez aussiindiquerlemplacementpartirduquellesmisesjoursontdisponiblessiceluiciestdiffrentdelemplacement dinstallation. Ledernierboutonvaservirconfigurerdiversesoptionsdedploiement.

- 10 -

ENI Editions - All rigths reserved

Lesoptionssuivantessontdisponibles : Languedepublication Spcifielalangue(etlesparamtresrgionaux)danslaquellelapplicationdoittrepublie. Nomdelditeur Spcifielenomdelditeurdelapplication.Sicettezoneestvide,lavaleurdelaproprit RegisteredOrganizationde lordinateurserautilise.Sicettevaleurestnulle,lenomduprojetestutilis. Nomduproduit Spcifielenomdeproduitdelapplication.Silenomdeproduitestvide,lenomdelassemblyestutilis. URLdusupporttechnique SpcifieunsiteWebquicontientdesinformationsdassistancepourvotreapplication.LaspcificationdecetteURLest facultative. Si elle est utilise, cette URL apparat dans lentre Ajout/Suppression de programmes pour votre applicationdanslePanneaudeconfigurationdeWindows. PageWebdedploiement SpcifieunnompourlapageWebdedploiement.LenomdefichierpardfautestPublish.htm. GnrerautomatiquementlapageWebdedploiementaprschaquepublication Si cette option est slectionne, le processus de publication gnre une page Web de dploiement chaque publication.CetteoptionnestdisponiblequesiunePageWebdedploiementestspcifie. OuvrirlapageWebdedploiementaprslapublication Sicetteoptionestslectionne,lapageWebdedploiementgnreautomatiquementsouvreaprslapublication.

ENI Editions - All rigths reserved

- 11 -

BloquerlactivationdelapplicationviauneURL Si cette option est dsactive, lapplication sexcute automatiquement aprs linstallation. Si elle est active, lutilisateurdevradmarrerlapplicationpartirduraccourcideprogrammedansleMenuDmarrer. Utiliserlextensiondefichier.deploy Si cette option est slectionne, le fichier de dploiement utilise lextension .deploy. Certains serveurs Web sont configurspourbloquer,parraisondescurit,lesfichiersquinesontpashabituellementprsentsdansuncontenu Web. Par exemple, les fichiers portant les extensions suivantes peuvent tre bloqus : .dll, .config, .mdf. Les applications Windows contiennent gnralement des fichiers portant certaines de ces extensions. Si un utilisateur essaiedexcuteruneapplicationClickOncequiaccdeunfichierbloqusurunserveurWeb,uneerreurseproduit. Plutt que de dbloquer toutes les extensions de fichier, chaque fichier dapplication est publi par dfaut avec une extensiondefichier.deploy.Sicetteoptionestutilise,leserveurWebnedoittreconfigurquepourdbloquerles troisextensionsdefichiersuivantes :
q

.application .manifest .deploy

AutoriserletransfertdesparamtresdURLverslapplication Pardfautcetteoptionestdsactive.Sicetteoptionestactive,lapplicationseracapabledaccderetdetraiterles informationsdeparamtredelURL. PourlesinstallationsdepuisunCDROM,dmarrerautomatiquementlinstallationdslinsertionduCDROM Sicetteoptionestslectionne,elleajouteunfichierAutorun.inflaracinedusupportpourlesapplicationsClickOnce quisontinstallesviaCDRomouDVDRom. VrifierlesfichierstransfrssurunserveurWeb Sicetteoptionestactive,leprocessusdepublicationtlchargechaquefichierpourvrifierquilspeuventbientre tlchargs.Voustesinformsdesfichiersquinepeuventpastretlchargs. Utiliserlemanifestedapplicationpourlesinformationsdapprobation Lorsque cette option est slectionne, vous pouvez signer nouveau le manifeste de lapplication laide dun certificatcontenantvosproprescoordonnes.

- 12 -

ENI Editions - All rigths reserved

Vous aimerez peut-être aussi