VB.NET
VB.NET
NET
([Link])
ThierryGROUSSARD
Rsum
Ce livre sur [Link] sadresse aux dveloppeurs, mme dbutants, dsireux de matriser Visual [Link]. Aprs une description de lenvironnement de dveloppement (Visual Studio 2008), le lecteur dcouvrira les bases de la programmation oriente objet avec [Link]. 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 [Link] 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 [Link] 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
- 1-
Introduction
[Link] unesolutionpourpratiquementtouslestypesdapplications :
q
Touscestypesdapplicationssontralisablesgrceunlmentessentiel : [Link] 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 [Link].
Leframeworkcontientdeuxlmentsprincipaux : [Link] Framework. Le Common Language Runtime est la base du .NET Framework. Le runtime peut tre considr comme un moteur [Link] CommonlanguageRuntimeestappelcodemanag. La bibliothque de classes est un ensemble de classes pouvant tre utilis pour le dveloppement de tout type [Link].
[Link]
DanslesapplicationsWindowstraditionnelles,[Link], 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 [Link] unestationdetravailSUN,quiutiliseuntypedemicroprocesseurradicalementdiffrent,[Link] 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,[Link],pourquoiperdredutempstraduire ducodeMSIL,[Link] 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 [Link] pourlesplatesformessuivantes :
q
Ellessontdisponiblesentlchargementsurlesite[Link] Leschmasuivantreprendlensembledecesoprations :
[Link]
[Link], ce qui sousentend quun certain nombre doprations supplmentaires seront ralises sur le code au moment de [Link].
ClassLoader Ilgrelechargementenmmoiredesinstancesdeclasses.
- 2-
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.
[Link]
[Link] une solution rapideunemajoritdeproblmesrencontrslorsdelaralisationduneapplication. [Link] 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).[Link],onretrouvedans [Link]. [Link] 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
- 3-
[Link] laclasseObject,[Link]. [Link] IlcontientlensembledeslmentspermettantlacrationdinterfacesutilisateursWindows. [Link] IlcontienttouteslesressourcesncessairespourlacrationdapplicationsWeb,avecparexemple,lesclassesdela [Link]. [Link] Ilcontientunensembledeclassesspcialisesdanslaccsauxbasesdedonnes,[Link]. [Link] Le langage Xml est devenu omniprsent et cet espace de nom contient les classes assurant la manipulation de documentsXml.
[Link]
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 [Link] :
q
[Link](anciennementMicrosoftMobileInternetToolkit)[Link] 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,[Link]. LapriseenchargedelanouvellemisejourduprotocoleInternetcourammentappeleIPversion 6ouplus simplement IPv6. Ce protocole est conu pour augmenter sensiblement lespace dadressage qui est utilis pouridentifierlespointsdentredecommunicationdInternet.
La prise en charge de la nouvelle gnration dordinateurs 64 bits permettant la cration dapplicationsplus performantes. UnevolutionmajeuredanslaccsauxbasesdedonnesavecADO.NET2.0amliorantlutilisationdeXML. [Link] proposantunemultitudedenouveauxcontrles. LutilisationdelaclasseConsoleestoptimiseaveclajoutdenouvellespropritsetmthodes(gestiondes couleurs,effacement,positionducurseur). Le.NETFramework2.0rintroduitlafonctionnalitModifier&Continuerpermettantlutilisateurquidbogue [Link] 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-
WindowsPresentationFoundation(WPF) [Link] unmoteurderenduvectorieletpermetunesparationplusclaireentreladfinitiondelinterfacegraphique [Link](eXtensibleApplicationMarkupLanguage).Les tchespeuventainsitreplusfacilementrpartiesentredesignersetdveloppeurs. Windows Communication Foundation (WCF) constitue la nouvelle base de dveloppement dapplications [Link] 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. [Link] lammevocationqueMicrosoftPassportmaisnestpasspcifiqueauxapplicationsMicrosoft(Hotmail,MSDN).
- 5-
criture,compilationetexcutionduneapplication
Danscechapitrenousallonsdtaillerlecycledevieduneapplication,depuislardactionducodejusqulexcutionde lapplication,entudiantendtaillesmcanismesmisen uvre.
[Link]
Limmensemajoritdesapplicationssontdveloppesgrceunenvironnementintgrquiregroupelesprincipaux outilsncessaires,savoir :
q
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. [Link] blocnotesdeWindowsoudetoutautrediteurdetexte,conditionqueceluicinerajoutepasdecodedemiseen pagelintrieurdudocument,commelefontparexempleleslogicielsdetraitementdetexte. Exemple Imports System public Module test dim message as string="bonjour" public sub main () [Link](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 [Link],il faudrait utiliser les noms pleinement qualifis pour tous les lments contenus dans le namespace. Dans notre cas, nousdevrionsalorsutiliser :[Link]("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 [Link] ces procdures et fonctions, lune dentre elles est dsigne comme le point dentre dans lapplication. Cest par
- 1-
[Link]. [Link](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.
[Link]
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 [Link]. Aprs un bref instant, le compilateur nous rend la main. Nous pouvons vrifier la prsence du fichier excutable et vrifiersonbonfonctionnement.
- 2-
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:[Link] [Link],cestlenomdufichiersource encoursdecompilationquiestutilis. /target :exe Cetteoptiondemandeaucompilateurlagnrationdunfichierexcutablepouruneapplicationenmodeconsole. /target :winexe CetteoptiondemandeaucompilateurlagnrationdunfichierexcutabledapplicationWindows. /target :library Cetteoptiondemandeaucompilateurlagnrationdunfichierbibliothquedll. /reference :liste de fichiers [Link] nomsdesfichiersdoiventtresparsparunevirgule.
[Link]
Maintenantquenotrefichierexcutableestcr,essayonsdevoircequilcontient. Premiresolution : louvriravecleblocnotesdeWindows
- 3-
Lersultatnestpastrsparlant,cestlemoinsquelonpuissedire! [Link]. PourvisualiserlecontenudunfichierMSIL,[Link]. 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 : [Link]
- 4 ENI Editions - All rigths reserved
Nous retrouvons dans ce manifest des informations indiquant que, pour que lapplication puisse fonctionner, elle a besoindesassemblagesexternesmscorlib,[Link]. [Link] desinformations. Symbole Plusdinfos Espacedenoms Classe Interface Classedevaleurs Enumration Mthode Mthodestatique Champ Champstatique vnement Signification
- 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 [Link],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) { [Link](message); } } Aprscompilationetdsassemblageparildasm,voicicequilnousprsentepourlamthodeMain.
IlnyaaucunediffrenceparrapportlaversionVisualBasicdelamthodeMain. Il est galement possible de faire la dmarche inverse en transformant un fichier texte contenant du code MSIL en [Link] fichier texte contenant le code MSIL car mme si la syntaxe est comprhensible, elle nest pas trs intuitive. Une solutionpeuttrededemanderloutilildasm(ledsassembleur)[Link],avoir ouvertlefichierexcutableoulabibliothquedllavecildasm,vousdevezutiliserloptionDumpdumenu [Link] tesalorsinvitchoisirlenomdufichiergnrer([Link]).
- 6 ENI Editions - All rigths reserved
[Link] 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 [Link]: ilasm [Link] /output=[Link] Loption /output=[Link] fichier source qui sera utilis. Vous pouvez maintenant lancer le nouvel excutable et vrifier le message affich. [Link] [Link] : 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...)[Link] consiste rendre le code gnr par le dcompilateur le plus incomprhensible possible. Pour cela, il faut agir au niveaudufichierexcutableoudelabibliothquedllenmodifiantlesinformationsquilscontiennentsans,biensr,en [Link] [Link] [Link] renommer les identifiants contenus dans le fichier (nom des variables, nom des procdures et fonctions)avec des valeurstrspeuexplicites,[Link] aprstraitementparDofuscatorCommunityEdition. .class private auto ansi beforefieldinit a extends [mscorlib][Link] { .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][Link]::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][Link]::.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
- 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 = [Link](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 = [Link](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 [Link]
[Link]
Lorsquun utilisateur excute une application manage, le chargeur de code du systme dexploitation charge le [Link] 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 [Link] :
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-
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
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([Link])car,contrairementdeslangagescommeC++,VBnutilisepaslinterface deprogrammationWIN32pourappelerlesfonctionsdusystmedexploitation. [Link] 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 [Link]. Les versions 2003 et 2005 suivent lvolution du [Link] (version 1.1 puis 2.0) apportant toujours plus de fonctionnalitsetdoutilsfacilitantetacclrantledveloppeentdapplications. [Link] :
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).
- 1-
Installationetpremierdmarrage
[Link]
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
[Link]
Leslmentsncessairessont :
q
AprsinsertiondupremierCDRometquelquessecondesdechargement,lcransuivantsaffiche :
- 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-
Lcransuivantvousproposedepersonnaliserlinstallationenchoisissantlesoutilsetlangagesinstallsainsiquele rpertoire dans lequel ils seront installs. En fonction de vos choix, lespace disque ncessaire pour linstallationest [Link] linstallation.
AprsvalidationdevosparamtresparleboutonInstaller,leprogrammedinstallationdbutelacopiedesfichiers.
- 3-
Lcransuivantaffichelaprogressiondelinstallation :
- 4-
Aprs la fermeture de cet cran par le bouton Terminer, vous revenez lcran initial et pouvez alors choisir linstallationdeladocumentationMSDN. CommepourlinstallationdeVisualStudio,unassistantvousguidedanslesdiffrentestapes.
VousdevezaccepterlecontratdelicenceMSDNpourpouvoirpoursuivrelinstallation.
- 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-
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.
[Link]
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.
- 7-
VisualStudioappliqueensuitevoschoixavantdedmarrer.
Nousallonsmaintenantexplorerlesoutilsnotredisposition.
- 8-
Dcouvertedelenvironnement
[Link]
Cette page est affiche chaque lancement de Visual Studio. Elle vous permet daccder rapidement aux derniers projetssurlesquelsvousaveztravaill,[Link] [Link] 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.
[Link]
Lenvironnementestcomposdetroistypesdlments:
q
Lensembleprsentetoutdemmeunaspectcharget,aprslajoutduneoudeuxbarresdoutilsetlapparitionde quelquesfentressupplmentaires,lazonedetravaildevientrestreintesurtoutsuruncranclassiquede15pouces.
- 1-
Heureusement,plusieurssolutionssontdisponiblespourgrernotreespacedetravail:
q
Lancragedefentresnepermetpasdegagnerdelaplacesurlcranmaisnouspermetdaccrocher,unebordurede lcranouduneautrefentre,[Link],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 [Link]
- 2-
icnes
formedunongletsupplmentairepourlafentre. Plusintressantespourgagnerdelaplacesurlcran,lesfentresmasquablesnesontvisiblesquesilecurseurdela [Link],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.
- 3-
Lesoutilsdisponibles
Regardonsunpeuplusendtaillesdiffrentesbarresdoutilsetfentresquisontnotredisposition.
[Link]
[Link] 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.
[Link]
Cest partir de la bote outils que nous allons choisir les lments utiliss pour la conception de linterface de lapplication.
- 1-
Laboteoutilsestorganiseparrubriquepermettantdefacilementretrouverlescontrles. Chacunpourrapersonnalisersaboteoutilsenyajoutantparexemple,[Link] peut tre judicieux, avant dajouter des contrles votre bote outils, de crer une nouvelle rubrique pour les [Link],affichezlemenucontextueldelaboteoutils(encliquantavecleboutondroitdelasourissurla boteoutils),[Link] 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 [Link] paslieauprojetactifmaislenvironnementluimme(laboteoutilsseraidentiquequelquesoitleprojetouvert).
[Link]
Lexplorateur de serveurs est disponible par le menu Affichage Explorateur de serveursouparleraccourciclavier [Ctrl][Alt]S .Ilsaffichesurunnouvelongletdelafentreassocielaboteoutils.
- 2-
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 [Link] [Link] = New [Link] [Link] = "Mmoire" [Link] = "Kilo-octets disponibles" [Link] = "portableTG"
[Link]
Lexplorateur de solutions permet laffichage des lments constituant une solution et la modification de leurs proprits.
- 3-
utilisationdelexplorateurdesolutionsestprsentendtaildanslechapitreconsacrlorganisationdune L application.
[Link]
Laffichage de classes est accessible par le menu Affichage Autres fentres Affichage de classes ou par le raccourciclavier[Ctrl][Shift][Link].
- 4-
Laffichage de classe permet davoir une vision logique dune solution en prsentant les diffrentes classes utilises danscettesolution.
[Link]
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.
- 5-
Les lments dont vous pouvez modifier les caractristiques peuvent tre slectionns directement dans la liste droulanteousurlinterfacedelapplication. Deuxprsentationssontdisponiblespourlalistedesproprits : LemodeAlphabtiquequevousactivezencliquantsurlicne LemodeParcatgoriequevousactivezencliquantsurlicne . .
[Link]
LaidedynamiquedeVisualStudioslectionnelesrubriquesdaidequipourraientvoustreutilesenfonctiondevotre activitoudescommandesetoutilsutiliss.
Dans lexemple ci contre, un bouton de commande vient juste dtre slectionn sur linterface. Les diffrentes rubriquesproposessontdonccentressurlobjetboutondecommande.
- 6-
[Link]
[Link],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 [Link] :
q
Pour chaque tche, une case cocher permet dindiquerquelle a t ralise. Sa description apparat alors barre [Link],pourlestchesutilisateur,deliaisonautomatiqueavecuneportionquelconque decode.
[Link]
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 [Link] quelerreurestcorrige,elledisparatautomatiquementdelalistedeserreurs. Lesboutonserreur,avertissement,messageactiventunfiltragesurlesmessagesaffichsdanslalistedeserreurs.
[Link]
Cest certainement dans cette fentre que nous allons passer le plus de temps. Elle propose de nombreuses fonctionnalitspermettantdautomatiserlesactionslespluscourantes.
[Link]
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,[Link] :
q
Pour les deux premires mthodes, Visual Studio vous propose de choisir dans une liste le Snippet qui vous [Link] [Link] leSnippet. Danslexemplesuivant,unSnippetatutilispourajouterunenouvelleproprituneclasse.
LamodificationdesvaleursnewPropertyValue,IntegeretNewPropertyseraeffectueencascadesurlensembledu codeduSnippet. [Link] [Link]. Pour vous aider dans la cration dun Snippet, Microsoft a prvu un Snippet. Vous pouvez lincorporer dans votre fichierXMLparlemenucontextuelInsrerunextrait Snippet.
- 8-
Vousdevezalorsobtenirledocumentsuivant: <?xml version="1.0" encoding="utf-8" ?> <CodeSnippet Format="1.0.0" xmlns="[Link] <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="[Link] <CodeSnippet Format="1.0.0"> Vousdevezgalementajouterlabalisedefermeturesuivantelafindufichier. </CodeSnippets> [Link],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>
- 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 ]]> [Link]. Pourcela,vousactivezlegestionnairedeSnippetparlemenuOutils Gestionnairedesextraitsdecode.
- 10 -
VotreSnippetestmaintenantdisponibledanslditeurdecode.
Ilnevousresteplusqupersonnaliserlecodegnr.
[Link]
Vous pouvez visualiser les portions de code ayant t modifies depuis le dmarrage de Visual Studio. Les modificationssontidentifiesparuneborduredecouleurapparaissantdanslamargedelditeurdecode.
q
Unebordurejauneindiquequelecodeatmodifimaispasencoresauvegard. Unebordureverteindiquequelecodeatmodifietsauvegard.
- 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.
[Link]
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 [Link], [Link] et [Link]. Ces macros seront ensuite associes trois boutonsdunenouvellebarredoutils. [Link] Outils Macros [Link] le code dsir, puis arrter lenregistrement grce la barre doutils affiche au dbut de lenregistrement de la macro.
Effectuezcesoprationspourchacunedestroislignesdecodesuivantesendonnantunnomdiffrentchacunedes macros. Imports [Link] Imports [Link] Imports [Link] Pour rendre plus facile lutilisation de ces macros, nous allons les regrouper sur une nouvelle barre doutils. Vous deveztoutdabordcrerunenouvellebarredoutilsenutilisantloptionPersonnaliserdumenucontextueldisponible surunebarredoutilsexistante.
- 12 -
La barre doutils est maintenant disponible mais ne contient aucun bouton. Vous pouvez maintenant ajouter vos boutonslaidedelabotededialoguedepersonnalisationdelabarredoutils.
[Link] [Link],vous devez associer des images aux diffrentes commandes en utilisant loption Modifier limage du bouton du menu
- 13 -
contextueldechaquecommande.
Choisissez galement pour chaque bouton le style par dfaut. Votre barre doutils est maintenant prte tre utilise.
Maintenantquevoustesfamiliarisaveclenvironnementdedveloppement,vousdevezvousfamiliariseravecle codeVisualBasic.
- 14 -
Lessolutions
[Link]
Pourvousaiderdanslacrationdapplications,VisualStudiovousproposeplusieurslmentsservantregrouperles [Link] [Link],leurtour,tousleslmentspourquelecompilateursoitcapablede gnrer le fichier excutable ou dll du projet. Lexplorateur de solutions va nous permettre de manipuler tous ces lments.
[Link]
La cration [Link] crationdunouveauprojet,ilvousserademandplusieursinformationsleconcernant.
Parlintermdiairedecettebotededialogue,vousallezfournirlesinformationssuivantes :
q
- 1-
Aprsvalidationdecettebotededialogue,lexplorateurdesolutionsvousprsentelanouvellesolutionsurlaquelle vous allez pouvoir travailler. Tous les fichiers de votre solution sont dj crs et sauvegards sur votre disque, lemplacementquevousavezspcifi. Unesolutioncontiendraaumoinslesfichierssuivants :
q
[Link],[Link] la liste de tous les projets composant la solution. Il est complt au fur et mesure que vous ajoutez des nouveauxprojetslasolution. [Link],[Link] 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. [Link] listedesressourcesutilisessurcettefeuille. Aufinal,unesolutioncontientdenombreuxautresfichiersenfonctiondeslmentsutilissdansvotreprojet (accsunebasededonnes,fichiershtml...).
[Link]
Lessolutionstantdesconteneurs,[Link],supprimer, renommerdeslmentsdanslasolution.
[Link]
Plusieurspossibilitssontdisponiblespourlajoutdunprojet :
s
Si vous souhaitez crer un nouveau projet, choisissez loption Nouveau Projet du menu Fichier Ajouter. Une [Link] [Link] paslemplacementovousdsirezenregistrerleprojet,[Link] 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 [Link] voussouhaitezajouterlasolution.
noterqueleprojetrestesonemplacementdoriginesurledisque.
[Link]
s
Poursupprimerunprojet,utilisezlemenucontextueldelexplorateurdesolutionseneffectuantunclicdroitsurle nomduprojetquevoussouhaitezsupprimerdelasolution.
Le projet est limin de la solution, mais reste enregistr sur le disque. Pour le supprimer dfinitivement, utilisez [Link],leprojetpeut,parla suite,tredenouveauajoutunesolution.
[Link]
- 2-
Pourrenommerunprojet,utilisezlemenucontextueldelexplorateurdesolutionseneffectuantunclicdroitsurle nomduprojetquevoussouhaitezrenommer.
[Link]
Lorsque vous souhaitez exclure temporairement un projet du processus de gnration ou rendre ldition de ses composantsimpossible,vouspouvezdchargerleprojetdelasolutiongrceloptionDchargerleprojet. U nprojetdchargnestpasretirdelasolutionmaissimplementmarqucommeindisponible.
Leprojetpeut,biensr,trerhabilitdanslasolutionenutilisantloptionRechargerleprojetdumenucontextuel.
[Link]
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.
[Link]
Undossierdesolutionpeuttrecrpartroismthodesdiffrentes.
s
- 3-
Quellequesoitlamthodeutilise,vousdevezfournirunnompourledossiercr.
[Link]
La cration dun projet dans un dossier de solution est identique la cration dun projet directement dans la solution.
s
Slectionnezsimplement,aupralable,ledossierdanslequelvoussouhaitezcrerleprojet.
[Link]
Il arrive frquemment que la ncessit dorganiser une solution avec des dossiers se fasse sentir alors que des projetsexistentdjdanslasolution.
s
Crez,danscecas,lesdossierspuiseffectuezunglisserdplacerdesprojetsdanslesdossierscorrespondants.
[Link]
Lessolutionscontiennentprincipalementdesprojets,cependantilestpossibledavoir,dansunesolution,desfichiers [Link],parexemple,dunfichiericne [Link] placsdansundossierspcifiquedelasolution.
s
Pour ajouter un nouvel lment de solution, utilisez le menu contextuel sur le nom de la solution en choisissant loptionAjouter NouvellmentouloptionAjouter lmentexistant.
[Link],par dfaut, dans une solution mais il est cr automatiquement lors de lajout du premier lment de solution. Les lmentsdesolutionpeuventensuitetremodifisavecunditeurspcifiqueautypedefichiercr.
[Link]
Vous pouvez, parfois, vouloir visualiser le contenu dun fichier alors que vous travaillez sur une solution, comme par [Link] pouvezlouvriravecunditeurexterneetbasculerentreVisualStudioetcetditeurexterne,maisilestpluspratique devisualiserlefichierdirectementdanslenvironnementVisualStudio.
s
UtilisezloptionOuvrirunfichierdumenuFichier.
[Link],unditeurpardfautlui [Link] un fichier. Pour cela, le bouton Ouvrir de la bote de dialogue dispose dun menu proposant loption Ouvrir avec permettantlechoixdelditeurassociaufichier.
- 4-
Labotededialoguesuivantevousproposelalistedesditeursdisponibles.
Choisissezlditeurassociaufichiersurlequelvoussouhaiteztravailleretvalidez.
[Link],le dossierFichiersdiversnexistepas,pardfaut,danslasolutionmaisestcrautomatiquementlorsdelouverturedun fichier. Ilseravisibledanslexplorateurdesolutionsuniquementsiloptioncorrespondanteestactivedanslenvironnement Visual Studio. Pour cela, ouvrez le menu Outils Options, puis dans la bote de dialogue, choisissez loption [Link] dossier lments de solution, ce dossier est un dossier "logique" et ne correspond pas un emplacement sur le disque.
[Link]
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 [Link] :
- 5-
Regardonsdansledtailchacunedentreselles.
[Link]
Cettepagedepropritsdelasolutiondtermine,parmilesprojetsdisponibles,celuiouceuxlancsaudmarrage delasolution.
Deuxoptionssontdisponibles : Projetdedmarrageunique Une combobox propose la liste des projets disponibles dans la solution parmi lesquels vous devez choisir celui qui [Link] nom apparaissant en gras. Cette slection peut galement se faire par le menu contextuel de lexplorateur de solutionsenchoisissantloptionDfinircommeprojetdedmarrage. Plusieursprojetsdedmarrage [Link],vousdevezindiquer [Link] :
q
Sivouschoisissezdedmarrerplusieursprojetsaulancementdelasolution,vousdevezgalementindiquerlordre dans lequel ces projets seront dmarrs. Cet ordre correspond en fait lordre des projets dans le tableau. Les boutons et permettentdemodifiercetordre.
- 6-
[Link]
[Link],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,[Link], 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 [Link],leprojet1dpendduprojet2etinversement.
Lesdpendancesdeprojetpeuventtregalementconfiguresparlemenucontextueldelexplorateurdesolutions avecloptionDpendancesduprojet.
[Link]
Lorsdudbogageduneapplication,lenvironnementVisualStudioabesoindaccderaufichiersourceducodequil est en train de dboguer. Cette page de proprit permet de spcifier les rpertoires qui seront analyss la rechercheducodesource.
- 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.
[Link]
Lesoptionsdeconfigurationpermettentdedfinircommentdiffrentesversionsdunesolutionetdesprojetsquila composent seront gnres. Par dfaut, deux configurations sont disponibles pour une solution dans Visual Studio : laconfigurationDebugetlaconfigurationRelease. Pourchacundesprojetsprsentsdanslasolution,[Link] du projet, les configurations permettent de dfinir des options de compilations. La configuration Debug est utilise [Link] projet.
- 8-
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 [Link].
- 9-
Lesprojets
[Link], grer,[Link],engnral,unfichier [Link],unfichiersource (.vb)etlefichierdeprojet(.vbproj).Plusgnralement,lesprojetscontiennentdenombreuxfichierssource,desscripts debasededonnes,desrfrencesversdesservicesWeb,desressourcesgraphiques,etc. [Link] [Link],vouspouvezcrervos propresmodlesdeprojet.
[Link]
s
Pourlacrationdunprojet,activezlemenuFichier [Link] choisirlescaractristiquesdunouveauprojet. Choisissez tout dabord la version du Framework pour laquelle vous souhaitez dvelopper le projet. La version choisieinfluencelestypesdeprojetsquevouspouvezcrer. [Link] [Link],nouschoisissonsbiensrVisualBasic. Choisissez ensuite le type de projet que vous souhaitez dvelopper. La bote de dialogue propose alors les diffrentsmodlesdeprojetdisponiblesenfonctiondutypedeprojetchoisi. Aprsavoirfaitvotrechoix,indiquezunnompourleprojet,unemplacementpourlesfichiersduprojetetunnom [Link].
Aprsquelquesinstantsleprojetestdisponibledanslexplorateurdesolutions.
s
Personnalisezmaintenantlbauchecre.
[Link]
[Link] 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,[Link] des rfrences et des importations par dfaut pour les bibliothques et les espaces de noms les plus utiles en fonctiondutypedeprojet. ApplicationWindows [Link] modleajouteauprojetleslmentssuivants :
q
Un fichier [Link] utilis pour la description de lapplication avec notamment les informations concernantlaversion. [Link].
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q
- 1-
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q
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 [Link] :
q
[Link] version. Une classe UserControl1 hritant de la classe [Link] Control fournissant les fonctionnalitsdebasepouruncontrleWindows,[Link].
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q
- 2-
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
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q
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
[Link] version. Une classe de base avec le squelette des procdures OnStart et OnStop appeles automatiquement au dmarrageetlarrtduservice.
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
ENI Editions - All rigths reserved - 3-
ApplicationWPF Ce modle de projet permet de bnficier du nouveau systme daffichage graphique de Windows, utilis dans WindowsVista. Leslmentssuivantssontautomatiquementajoutsauprojet :
q
Un fichier [Link] utilis pour la description de lapplication avec notamment les informations concernantlaversion. Un fichier [Link] et son fichier de code associ, [Link], permettant la gestion des vnementsdclenchsauniveaudelapplication. [Link],[Link].
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q
BibliothquedecontrlesWPF Comme la bibliothque de contrles Windows, ce type de projet permet dtendre la bote outils dj disponible [Link].
- 4-
Un fichier [Link] utilis pour la description de lapplication avec notamment les informations concernantlaversion. [Link]. [Link].
Lesrfrencessuivantessontautomatiquementajoutesetimportes :
q
BibliothquedecontrlesWPFpersonnaliss Ce type de projet a galement pour vocation dtendre la bote outils disponible pour les applications WPF. Contrairementautypedeprojetprcdent,lescontrlesnesontpascrsdetoutepice,maissontbasssurdes contrlesexistantsdontilstendentlescaractristiques. Lesrfrencesetimportationssontidentiquesautypedeprojetprcdent. Projetvide [Link]. Parcontre,aucunautrelmentnestajoutautomatiquementetaucunerfrencenestcreouimporte.
[Link]
Vouspouvezcrervotrepropremodledeprojetenfonctiondevoshabitudesdedveloppementetfaireensorte quilapparaisseparmilesmodlesprdfinis. Vousdevezconcevoirleslmentssuivants :
q
Un fichier de dfinition contenant les mtadonnes du modle. Ce fichier est utilis par Visual Studio pour laffichageduprojetdanslenvironnementdedveloppementetpourlaffectationdepropritspardfautau [Link]. Unfichierpourleprojet(.vbproj). Lesfichierssourcesetressourcesincluspardfautlorsdelacrationdunprojetpartirdecemodle.
[Link] C etnonledossierdanslequelilssontplacs.
[Link] :
ENI Editions - All rigths reserved - 5-
<VSTemplate Version="2.0.0" xmlns="[Link] 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="[Link]"> <ProjectItem>[Link]</ProjectItem> <ProjectItem>[Link]</ProjectItem> <ProjectItem>[Link]</ProjectItem> <ProjectItem>[Link]</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 [Link]. DanslessectionsProjectItem [Link].
[Link]
Lamodificationdunmodleconsisteutiliserunfichierzipexistantcontenantleslmentsncessairesauprojetet [Link],ilsdoiventtreplacsdanslefichier [Link] rpertoire C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates\ VisualBasic. Pour que les modificationssoientprisesencompte,[Link] :
s
OuvrezunefentredecommandeVisualStudio. Saisissez la commande devenv /setup. Soyez patient car cette commande est assez longue sexcuter. Aprs excutiondelacommande,vosmodificationssontdisponiblesdanslemodledeprojet.
[Link]
Cestpeuttrelasolutionlaplussimplepourconstruireunmodledeprojet.
- 6-
Dansunpremiertemps,crezlemodlecommeunprojetordinaire. Une fois votre projet finalis, exportezle comme modle. Le menu Fichier Exporter le modle dmarre un assistantpourvousguiderpendantlacrationdumodle.
Cettepremirebotededialoguevousproposedechoisirleprojetquevoussouhaitezexporterainsique,larubrique delabotededialoguedecrationdeprojetdanslaquelleseraplaclefuturmodle.
Cettedeuximebotededialoguevousinvitechoisiruneicnepourvotremodledeprojet,unnompourlemodle [Link] modledansVisualStudioetdevousprsenterlersultatdelagnrationenvousaffichantlecontenudufichierzip [Link],lenouveaumodledeprojetestdisponibledansVisual Studio. ette mthode est trs simple pour construire un nouveau modle de projet et vite de se torturer lesprit C [Link].
- 7-
Danslecadredundveloppementenquipe,ilpeuttreintressantdepartagerlesmodlespersonnalissentre touslesmembresdelquipe.
s
Recopiezlesfichierszipsurunpartagerseau. Configurez lenvironnement Visual Studio pour lui permettre daccder aux modles. Cette modification seffectue parlabotededialoguedisponibleparlemenuOutilsOptions.
[Link]
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
- 8-
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.
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][Link] [Link],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 [Link][Ctrl][Shift]lorsducliqugliss.
Afin de retirer un lment dun projet, deux options sont accessibles par le menu contextuel de lexplorateur de solutions :
q
[Link]
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.
[Link]
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 [Link] associeaufichierdpenddutypeduprojet. Typedapplication Cette proprit dtermine le type dapplication gnre par la compilation du projet. En rgle gnrale, cette [Link] 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,[Link],ellecorrespond la fentre principale de lapplication ou une procdure Sub Main. Cette proprit nest disponible que pour les [Link]. 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 [Link] lemcanisme UserAccountControl(UAC)[Link] [Link]
q
- 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 [Link],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 [Link],lvnementStartupNextInstanceestgalementdclench. [Link] Cette option indique si les proprits personnalises de lapplication sont sauvegardes la fermeture de [Link],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 [Link] 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 -
[Link]
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 [Link] 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. [Link] 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. [Link] [Link] Espaces de noms imports reprend les espaces de nom imports automatiquement dans tous les codes du projet. Vous pouvezcompltercettelisteensaisissantdanslazonedetextelenomdelespacedenomimportetenvalidant avecleboutonAjouteruneimportationutilisateur.
[Link]
Lespropritsprsentessurcettepagedterminentlecomportementduprojetlorsdesondbogage.
Actiondedmarrage [Link] :
q
[Link] projetsdapplicationWindowsoulesprojetsdapplicationconsole. Dmarrer le programme externe permet de provoquer lexcution dune application externe qui va se [Link] 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. [Link], lenomdelamachinedistante,surlaquellelecodevasexcuter,estindiquer. Activerlesdbogueurs
- 14 -
Cesoptionsdterminentlesdiffrentstypesdedbogueuractifs,encomplmentdudbogueurdecodemanagde VisualStudio.
[Link]
Lespropritsdecettepageconcernentlefonctionnementducompilateuretsonventuelleoptimisation.
Chemindesortiedelagnration [Link],il sagitdusousrpertoirebindurpertoiredanslequelsetrouveleprojet. OptionExplicit [Link] [Link],pourunfichierparticulier,demodifiercetteoptionenajoutantla directiveOption Explicit OnouOption Explicit Offendbutdefichier. OptionStrict [Link],lecompilateur [Link],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 [Link]. OptionInfer Cette option indique si linfrence des types des variables locales est active. Avec cette option, le compilateur dterminedeluimmeletypedesvariablespartirdesvaleursquileursontaffectes. Avertissements Lecompilateurestcapablededtecterdesproblmespotentielsdansvotrecodeetdegnrerdesavertissements [Link]
- 15 -
[Link] :
q
Cettebotededialoguepermetlaconfigurationdesoptionssuivantes :
q
- 16 -
Indiquerlaversionduframeworkutilisepourlexcutiondelapplication.
[Link]
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,[Link] 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 [Link] contient simplement un lien vers le fichier original. Une ressource [Link],lesressources serontcompilesdanslexcutabledelapplication. Voyons maintenant comment accder aux ressources partir du code de lapplication. Toutes les ressources sont [Link] :
q
Private Sub Form1_Load(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link] = [Link] [Link] = [Link] [Link]([Link], [Link]) MsgBox([Link]) End Sub
[Link]
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.
- 17 -
Pourchaqueparamtre,vousdevezfournirunnom,utilispourmanipulerleparamtredanslecodeetuntype,pour leparamtre. [Link] : 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,[Link] propritSettingsdelobjetMy.
[Link]()
q
Pendant lexcution de lapplication, nous avons accs aux paramtres galement par cette proprit SettingsdelobjetMy,[Link] duparamtreoulaffectationdunevaleurauparamtre.
lafermeturedelapplication,nousdevonsenfinsauvegarderlesparamtresenutilisantlamthodeSave :
[Link]() Pourchaqueutilisateurdelapplication,uneversiondistinctedesparamtresestsauvegarde.
[Link]
Les autres rubriques de configuration du projet concernant le dploiement de lapplication sont traites dans un chapitrespcifique.
- 18 -
Lesvariables,constantesetnumrations
[Link]
Les variables vont vous permettre de mmoriser, pendant lexcution de votre application, diffrentes valeurs utiles [Link] [Link],vousfixezsescaractristiques.
[Link]
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).
[Link]
Enspcifiantuntypepourunevariable,nousindiquonsquellesinformationsnousallonspouvoirstockerdanscette variable. Deuxcatgoriesdetypesdevariablessontdisponibles:
q
[Link] 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
- 1-
0 0 0 0
Siparcontrevoussouhaitezoptimiserlavitessedexcutiondevotrecode,ilestprfrabledutiliserletypeInteger. Lestypesdcimaux Single Double 3.40282347E+38 1.7976931348623157E+308 79228162514264337593543950335 3.40282347E+38 1.7976931348623157E+308 4octets 8octets
Decimal
79228162514264337593543950335
16octets
[Link], une rapidit dexcution maximale est obtenue avec le type Double. Le type Decimal est plus spcialement recommandpourlescalculsfinancierspourlesquelsleserreursdarrondissontprohibes,maisaudtrimentdela rapiditdexcutionducode. Lestypescaractres LetypeChar(caractres)[Link] 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 [Link],lorsdelaffectationdunevaleurunechane decaractres,[Link],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 [Link],lamanipulationseferaparlesmthodesdisponiblesdans [Link].
LetypeBoolean LetypeBooleanpermetdutiliserunevariablequipeutprendredeuxtatsvrai/faux,oui/non,on/off.
- 2-
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#[Link] peuvent tre spcifies au format 12 heures ou 24 heures. De toute faon, lenvironnement de dveloppement [Link],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 [Link] : Jour=#12 :35 :30# Correspondaupremierjanvierdelan112heures35minutes30secondes. Inversementsivousaffectez,unevariabledetypeDate,unevaleurcontenantsimplementunedate,VisualBasic considrequilsagitdujourquevousavezindiqu,minuit. LetypeObject [Link],vouspouvezstockernimportequoi. Enfait,[Link],maisladresse,dans la mmoire de la machine, o lon pourra trouver la valeur de la variable. Rassurezvous, tout ce mcanisme est transparentetvousnaurezjamaismanipulerlesadressesmmoiredirectement. nevariabledetypeObjectpourradoncfairerfrencenimportequelautretypedevaleurycomprisdes U [Link],lecodeseramoinsrapidedufaitdelutilisationdunerfrence.
LestypesNullables [Link] lorsdelarcuprationdinformationenprovenancedunebasededonnessipourcertainschampsaucunevaleur na t affecte dans la base. Comment reprsenter cette situation avec des variables dans Visual Basic. Une [Link],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 [Link] type Boolean pour lequel il ny a que deux valeurs admises, true ou false, comment reprsenter le fait que le contenudelavariablenestpasnonrenseign. Pourrsoudreceproblme,[Link] 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 [Link],ilfauttesterlapropritHasValuedelavariablepourdterminersiellecontient
- 3-
effectivement une valeur. Si cest le cas cette valeur est disponible via la proprit Value de la variable. Cette propritestenlectureseulecarlaffectationdunevaleursefaitdirectementsurlavariable. codePostal=17000 If [Link] Then [Link](codePostal) Else [Link]("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 [Link]. 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
[Link] codesuivant : Dim condition As Boolean? If condition Then [Link]("le test est positif") Else [Link]("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-
[Link]
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 [Link](" valeur de x : " & x) [Link](" 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
- 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 [Link] rsultatdsir. Certainsformatsstandardssontprdfinismaisilestgalementpossibledepersonnaliserlersultatdelafonction [Link],lesparamtresdecettefonctionsontprsents. Formatagedevaleursnumriques Currency Formatmontairetelquedfinidanslesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. Exemple :format(12.35,"Currency")
- 6-
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 [Link]. Exemple :format(245813,"X") Rsultat : 3C035 Yes/No True/False On/Off RetourneNo,False,OffsilavaleurestgalezrosinonretourneYes,True,Onpourtouteslesautresvaleurs.
Chanedeformatagepersonnalisepourvaleursnumriques
- 7-
0 [Link]. Exemple : format(245813.12,"00000000000.0000") Rsultat : 00000245813,1200 # [Link]. 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. , [Link] configurationdesoptionsrgionalesetlinguistiquesdupanneaudeconfigurationdusystme. \ Permet lutilisation dun caractre ayant une signification spciale comme caractre ordinaire dans une chane de [Link],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-
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 [Link],cestleseulcaractredelachanedeformatage,ilfautdanscecasutiliser%y aayyAnnesurdeuxchiffres yyyyAnnesurquatrechiffres zzzDcalageparrapportautempsuniversel(GMT).
Conversiondepuisunechanedecaractres [Link] paramtrejusqurencontreruncaractreautrequunchiffre,unespace,unetabulation,[Link] ensuite cette portion de chane en valeur numrique, en tenant compte des ventuels paramtres de formatage dfinisauniveaudusystme,[Link]&Hou&Oplacsen
ENI Editions - All rigths reserved - 9-
[Link]
Pardfaut,lecompilateurVisualBasicconsidrequetoutevariablequiapparatdansuneapplicationdoitavoirt [Link] : 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 [Link],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 [Link],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] [Link],elleauraletype pardfautdevbcestdireObject. Silavaleurinitialeestomise,lavariableserainitialisezrosiellecorresponduntypenumrique,unechane decaractrevidesielleestdutypeString,lavaleurNothingsielleestdutypeObjectetfalsesielleestdutype Boolean. Siplusieursnomssontspcifis,lesvariablescorrespondantesseronttoutesdutypeindiqu.
[Link]
Nousavonsvudanslessectionsprcdentesquilestfortementsouhaitabledetoujoursdclarerlesvariablesavant leur utilisation. Cependant, dans certains cas, il est envisageable de laisser le compilateur raliser une partie du [Link],lecompilateurpeutdterminerletypeutiliserpourunevariablelocaledclare [Link],[Link] suivantlavariableestconsidrecommeunechanedecaractres. Dim nom = "Dupont" Pour sassurer que cette variable est bien considre comme une chane de caractres, il suffit de demander
- 10 -
IntelliSensecequilnousproposepourutilisercettevariable.
NousavonsbiendispositionlesmthodesetpropritsdutypeString. Pourquelinfrencedetypefonctionnecorrectement,ilfautimprativementrespecterquelquesrgles :
q
Linfrence ne fonctionne que pour les variables locales, cestdire les variables dclares dans une procdureoufonction. [Link] estconsidrecommetantdetypeObject.
[Link],elleestconsidrecommetantdutypeObject.
[Link]
[Link] 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
- 11 -
[Link]("valeur de j :{0}", j) [Link]("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 [Link] variableestparfoisnomm [Link] le mot cl Dim peut tre utilis pour la dclaration dunevariable dansuneprocdureoufonction. Porteniveaumodule Cetteportecorrespond,enfait,unevariabledclarelextrieurduneprocdureoufonction,cestdiredans unmodule,[Link](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.
[Link]
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 [Link] Publicnepeutcependantpastreutilispourladclarationlintrieurduneprocdureoufonction. Protected [Link],aucode delaclasseetaucodedetouteslesclasseshritantdecelleci. Friend [Link] peutpastreutilislintrieurduneprocdureoufonction. ProtectedFriend Ce niveau daccs est lunion des niveaux daccs Protected et Friend. Il rend visible la variable lensemble de lassemblagedanslequelelleestdclareettouteslesclasseshritantdecelleoelleestdclare. Private Cemotclrestreintlaccslavariableaumodule,[Link] peutpastreutilislintrieurduneprocdureoufonction. LemotclDimpeuttoutefoistreutilispartoutpourladclarationdunevariable,ilfautsesouvenirquedanslecas
- 12 ENI Editions - All rigths reserved
[Link]
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,[Link],lorsdupremierappel delaprocdureoufonction,lavariableestcreenmmoiremaisellenestpasdtruitelafindelaprocdureou [Link],lemmeemplacementmmoireserautilis etlavariableretrouverasoncontenuprcdent.
[Link]
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 [Link](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.
- 13 -
[Link]
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,[Link] [Link] : 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 [Link] [Link](Taille) Taille =45 Invalide
- 14 -
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 [Link] 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).
[Link]
Lestableauxvontnouspermettredefairerfrenceunensembledevariablesparlemmenometdutiliserunindex [Link](jusqu32,maisaudeldetroisonadumal sereprsenterlecontenudutableau).Lepremierlmentduntableauatoujourspourindex,zro. Lindex maximum [Link] 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 [Link]. ChiffreAffaire(1)=12097 Une autre solution est disponible pour la cration dun tableau. Elle permet simultanment la cration du tableau et [Link] : Dim tauxTva() As Decimal = {0, 5.5, 19.6, 33} [Link] 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.
- 15 -
Redimensionnementduntableau [Link] Redimpermetdemodifierlatailleduntableau. Redim ChiffreAffaire(52) [Link],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 [Link],parcontre,pastremodifi paruneinstructionRedim.
Manipulationscourantesdestableaux Lorsquelontravailleaveclestableaux,[Link] lesoprationslespluscourantesralisessurlestableaux. Obtenirlatailleduntableau Il suffit dutiliser la proprit Length du tableau pour connatre le nombre dlments [Link] duntableaumultidimensionnel,lersultatcorrespondaunombretotaldecasesdutableausoitleproduitdelataille [Link] casesdutableau. Dim Grille(,) As Integer = {{1, 2}, {3, 4}} [Link]("taille totale du tableau : {0}", [Link]) Pour obtenir loccupationmmoiredutableau,ilfautmultipliersatailleparlenombredoctetsutilisspourunecase lmentairedutableau. Obtenirlatailledunedesdimensionsduntableau LamthodeGetLengthattendcommeparamtreladimensiondutableaupourlaquellelonsouhaiteobtenirlataille : Dim Matrice(,) As Integer = {{1, 2}, {3, 4}, {5, 6}} [Link]("taille de la premiere dimension : {0}", [Link](0)) [Link]("taille de la deuxieme dimension : {0}", [Link](1)) Affichelersultatsuivant : taille de la premiere dimension : 3 taille de la deuxieme dimension : 2 Obtenirladimensionduntableau LapropritRankduntableaurenvoiedirectementladimensiondutableau :
- 16 -
Dim Grille(,) As Integer = {{1, 2}, {3, 4}, {5, 6}} [Link](" ce tableau comporte {0} dimensions", [Link]) 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"} [Link]([Link](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 [Link](gouter) For Each plat In gouter [Link](plat) Next Affichelersultatsuivant : beurre confiture moutarde pain
[Link]
[Link] choixentredeuxpossibilitspourtravailleravecleschanesdecaractres :
q
UtiliserlesfonctionsdeVisualBasic [Link]
Nousallonsregardercommentraliserlesoprationslespluscourantessurleschanesdecaractres. Affectationdunevaleurunechane Nousavonsvuquepour,affecterunevaleurunechane,ilfautlaspcifierentrelescaractreset,unproblmese [Link] dbutoudefindechane,ilfautdoublerlecaractrecommedanslexemplecidessous. Dim Chane as String Chane=" il a dit : "" a suffit ! """ [Link](Chane) Nousobtenonslaffichage : iladit : asuffit! Pourlesexemplessuivants,nousallonstravailleravecdeuxchanes. chane1 = "lhiver sera pluvieux"
- 17 -
Extractionduncaractreparticulier Pour obtenir le caractre prsent une position donne dune chane de caractres, lon peut considrer la chane commeuntableaudecaractresetainsiatteindrelecaractresouhaitparunindex. [Link]("Le troisime caractre de la chane1 est : {0}", chane1(2)) Autresolution,maiscettefoisenutilisantlapropritCharsdelaclasseString. [Link]("Le troisime caractere de la chane1 est : {0}", [Link](2)) Rsultat : Le troisime caractre de la chane est : h Danslesdeuxcas,lanumrotationdescaractrescommencezrocommepouruntableau. Obtentiondelalongueurdunechane Pourdterminerlalongueurdunechane,lapropritLengthdelaclasseStringoulafonctionLendeVisualBasicsont [Link]. [Link]("la chane1 contient {0} caractres", [Link]) [Link]("la chane2 contient {0} caractres", Len(chane2)) Rsultat : La chane 1 contient 21 caractres. La chane 2 contient 18 caractres.
Dcoupagedechane Plusieurssolutionssontdisponiblesenfonctiondelaportiondechanequelonsouhaitercuprer. Ledbutdelachane LafonctionLeftrenvoielesxpremierscaractresdelachane. [Link]("les cinq premiers caractres de la chane1 sont {0}", Left(chane1,5)) Rsultat : Les cinq premiers caractres de la chane sont lhiv. Lafindelachane LafonctionRightrenvoielesxdernierscaractresdelachane. [Link]("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 [Link] Midncessiteenplusla chanepartirdelaquellevaseffectuerledcoupage.
- 18 -
[Link]("Un morceau de la chane1 {0}", Mid(chane1, 2, 5)) [Link]("Un morceau de la chane2 {0}", [Link](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 [Link]("ce sont les mmes") Else [Link]("ce ne sont pas les mmes") End If If [Link](chane2) Then [Link]("ce sont les mmes") Else [Link]("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 [Link],[Link] lacomparaisonestretournsousformedunentierinfrieurzrosilapremirechaneestinfrieureladeuxime, galzrosilesdeuxchanessontidentiques,etsuprieurzrosilapremirechaneestsuprieureladeuxime. Select Case [Link](chane2) Case Is < 0 [Link]("chane1 est infrieure chane2") Case 0 [Link]("chane1 est gale chane2") Case Is > 0 [Link]("chane1 est suprieure chane2") End Select Insertiondansunechane Lamthode insertdelaclasse [Link] unentieretunechaneetnousretournelachanededpartdanslaquellesetrouveinsre,lapositionspcifie,la chanepasseenparamtre. Dim chane3 As String chane3 = [Link](13, "tres ") [Link](chane3) Linstructionprcdentenousaffichelalignecorrespondante : lhiver sera tres froid
Suppressiondesespaces
q
- 19 -
Changementdelacasse
q
Toutenmajuscules:[Link](Ucase(chane1))[Link]([Link]()) Toutenminuscules:[Link](Lcase(chane1))[Link]([Link]())
Recherchedansunechane Lafonction InStroulamthode IndexOfdelaclasse Stringpermettentlarecherchedunechanelintrieurdune [Link],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) [Link]("chane trouve la position {0}", position) position = InStr(position + 1, chane1, recherche) End While [Link]("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 [Link] :
q
chane3 = Replace(chane1, "hiver", "ete", 1, -1) [Link](chane3) Nousobtenonslaffichage : lete sera pluvieux
[Link]
Les structures offrent la possibilit de combiner des donnes de diffrents types pour crer un nouveau type
- 20 -
[Link] 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.
[Link]
LadclarationdunestructuresefaitentrelesmotsclsStructureetEnd [Link],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,[Link],ilestimpossibledinitialiserles membresdunestructureaumomentdeladclaration. Exemple Public Structure Client Public Code As Integer Public Nom As String Public Prenom As String Public Coordonnees As String End Structure [Link] 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 [Link] 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 & [Link] End Function End Structure
[Link]
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.
- 21 -
Exemple [Link] = 999 [Link] = "LeNom" [Link] = "lePrenom" Silundesmembresdelastructureestluimmedetypestructure,vousdevezgalementutiliserloprateurdaccs pourpouvoirmanipulerlesmembresimbriqus. Exemple [Link] = 42 [Link] = "rue de Paris" [Link] = 44000 [Link] = "Nantes" Lestypesstructuresontdestypesdedonnesparvaleur,cestdirequelavariablecontientvraimentlesdonnes de la structure ( mettre en opposition avec les variables de type rfrence o la variable ne contient que lemplacement,danslammoire,osetrouventlesdonnes). [Link], danscecas,recopiedesinformationsdechaquemembredelavariablesourcedanslemembrecorrespondantdela variabledestination. Exemple Dim Client2 As Client Client2 = Client1 [Link]("Client1 : " & vbCrLf & [Link]) [Link]("Client2 : " & vbCrLf & [Link]) 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 -
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.
[Link]
Leseuloprateurdisponibledanscettecatgorieestloprateur=.[Link] mmeoprateurestutilisquelquesoitletypedelavariable(numrique,chanedecaractres...).
[Link]
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
[Link]
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
[Link]
Lesoprateursdecomparaisonsontutilissdanslesstructuresdecontrleduneapplication(ifthen,doloop...).Ils [Link]
- 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
IsNot
Comparaisondedeux variablesobjets
O1IsNotO2
TypeOf...Is...
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?[Link] 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-
LapropritOption Comparepermetdespcifierlemodedecomparaisonutilisparlecompilateur.
q
Avec loption Text, le compilateur ne fera pas de diffrence entre les minuscules et les majusculeslorsdela comparaison. Loptionbinaireexigeraunestrictegalitdeschanespourobtenirunrsultattrue.
[Link]
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 [Link] :
q
Silesdeuxoprandessontnumriques,alorsilyaaddition. SilesdeuxoprandessontdetypeStringalorsilyaconcatnation. [Link] compilateurestconfiguravecloptionStrict [Link] configur avec loption Strict Off, la chane de caractres est implicitement convertie en type Double puis [Link].
Pourviterdeseposertoutescesquestions,prfrezlutilisationdeloprateur&.Aveccetoprateur,silundesdeux oprandesnestpasdutypeString,ilestautomatiquementconvertiverscetypeavantlaconcatnation. Linconvnientdeloprateur&[Link] surunechane,ilestprfrabledutiliserlaclasseStringBuilder. Exemple Dim duree, i As Integer Dim lievre As String Dim tortue As String Dim debut, fin As Date debut = Now
- 3-
For i = 0 To 100000 tortue = tortue & " " & i Next fin = Now duree = DateDiff([Link], debut, fin) [Link]("dure pour la tortue : {0} secondes", duree) debut = Now Dim sb As New StringBuilder For i = 0 To 100000 [Link](" ") [Link](i) Next lievre = [Link] fin = Now duree = DateDiff([Link], debut, fin) [Link]("dure pour le livre : {0} secondes", duree) If [Link](tortue) Then [Link]("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!
[Link]
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-
[Link]
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
- 5-
Lesstructuresdecontrle
Les structures de contrle permettent de modifier [Link] structuressontdisponibles :
q
Les structures de dcision : elles aiguilleront lexcution de votre code en fonction des valeurs que pourra prendreuneexpressiondetest. Lesstructuresdeboucle : ellesferontexcuteruneportiondevotrecodeuncertainnombredefois,jusquce quuneconditionsoitremplieoutantquuneconditionestremplie.
[Link]
Deuxsolutionssontpossibles.
[Link]
QuatresyntaxessontutilisablespourlinstructionIf. If condition then instruction Si la condition est vraie alors linstructionestexcute danscecas, conditiondoittreuneexpressionqui,une foisvalue,doitfournirunboolean trueou [Link],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 ...
- 1-
Instruction n Else Instruction 1 ... Instruction n End if Danscecas,[Link],sinonon teste la suivante et ainsi de suite. Si aucune condition nest vrifie, le bloc de code spcifi aprs le else est [Link] [Link],ilsepeutquaucuneinstructionne soitexcutesiaucunedesconditionsnestvraie.
[Link]
Lastructure select casepermetunfonctionnementquivalent,[Link] 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 [Link] 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" [Link]("reponse positive") Case "non","NON" [Link]("reponse negative") Case else [Link]("reponse de normand") End select Oubiendfiniessousformedintervalleoudecomparaison : Select case heure Case 8 to 12 [Link]("Matin") Case 13 to 18 [Link]("aprs-midi") Case 19 to 22 [Link]("soir") Case is >=22 [Link]("nuit") Case else [Link]("heure invalide")
- 2-
End select Il existe galement trois instructions permettant dobtenirlemmersultatquavec un if then else ou un select casemaisavecuneseuleinstruction :
q
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 [Link](de14).
[Link]
Quatrestructuressontnotredisposition : While ... End While Do ... Loop For ... Next For Each ... Next Ellesonttoutespourbutdexcuterunblocdecodeuncertainnombredefoisenfonctiondunecondition.
[Link]...EndWhile
While condition Bloc de code End While [Link] 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 [Link] boucleenutilisantlinstructionExit [Link] While.
[Link]...Loop
LastructureDo Loopnousproposequatrevariantes : Do While condition Bloc de code Loop
- 3-
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,[Link],le [Link],ilconvientdutiliserla syntaxesuivantequitestelaconditionlafindelexcutiondublocdecode. Do Bloc de code Loop until condition Leblocdecodesexcuteaumoinsunefoispuistestelaconditionetbouclejusqucequelaconditionsoitvraie. Commedanslecasdelabouclewhile,linstruction Exit Doprovoqueraunesortieanticipeetinconditionnelledela boucle.
[Link]...Next
Lorsque vous connaissez le nombre ditrations raliser dans une boucle, il est prfrable dutiliser la structure for ... [Link],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 [Link],une valeurinitialesuprieurela valeurfinaledevratreindique. ommepourlesautresstructures,ilestpossibledesortirimmdiatementduneboucle for nextenutilisant C linstructionexit for.
[Link]...next
Uneautresyntaxedelaboucle for nextpermetdexcuterunblocdecodepourchaquelmentcontenudansun [Link] : 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-
[Link] typedelavariable elementdoittrecompatibleavecletypedeslmentsstocksdansletableauoulacollection. Parcontre,vousnavezpasvoussoucierdunombredlmentscarlinstruction for eachestcapabledegrerelle [Link]! Avecuneboucleclassique : Dim tablo() As String = {"rouge", "vert", "bleu", "blanc"} Dim cpt As Integer For cpt = 0 To UBound(tablo) [Link](tablo(cpt)) Next Aveclabouclefor each : Dim tablo() As String = {"rouge", "vert", "bleu", "blanc"} Dim s As String For Each s In tablo [Link](s) Next
omme pour la boucle for next, vous pouvez provoquer une sortie de la boucle avant davoir parcouru C lensembledutableau,enutilisantlinstructionexit for.
[Link]
Deuxautresstructurespluttdestinessimplifierledveloppementsontdisponibles : StructureUsingEndUsing Cette structure est destine accueillir un bloc de code utilisant une ressource externe, comme par exemple une [Link] [Link] [Link],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 [Link]. Exemple Dim ctn As New SqlConnection ctn = New SqlConnection("Data Source=TG;Initial Catalog=Northwind;Integrated Security=True") With ctn .Open() .... .... .Close() End With
- 5-
- 6-
Lesprocduresetfonctions
DansuneapplicationVisualBasic,touteslesinstructionsdoiventobligatoirementtreplacesdansuneprocdureou une fonction. Ces procdures ou fonctions nous permettent de crer des blocs de code qui pourront ensuite tre [Link] 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.
[Link]
Lecodeduneprocduredoittreplacentrelesmotscls Subet End [Link] [Link] : Sub AfficheResultat() Instruction 1 ... [Link]( "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 [Link] 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,[Link] lemotclCallestaussipossible,lasyntaxeestalorslasuivante : Call AfficheResultat() Si votre procdure nattend pas de paramtres, lutilisation des parenthses est optionnel (lenvironnement de dveloppementVblesajouteracependant,automatiquement,dansvotrecode).
[Link]
ENI Editions - All rigths reserved - 1-
Deuxlmentsdistinguentuneprocdureclassiqueduneprocdurevnementielle :
q
LemotclHandlesspcifielobjetetlvnementpourlesquelslaprocdureseraexcute.
[Link]
Unefonctionsedclaresuivantlemmeprincipequuneprocdure,enutilisantlesmotsclsFunctionetEnd Function. Vous devez, par contre, fournir une information supplmentaire. Puisque la fonction doit renvoyer au code appelant unevaleur,[Link] : 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 [Link] 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.
[Link]
Lesprocdures Propertyvontnouspermettredajouteruneproprituneclasse,[Link] [Link](Set)ouquelonutilise(Get) [Link],onpeutaffecterunevaleuruneproprit [Link],ilexistedenombreusesdiffrencesimportantesentrelesvariablesetles proprits :
q
- 2-
Lecontenudunepropritpeuttremodifiparlecode,lorsdelaccslaproprit.
Lasyntaxegnraledecrationdunepropritestlasuivante : Property nomProprit () as typeDeLaProprit Get ... Return ... End Get Set ... End Set (...) End Property Danscettedclaration
q
nomPropritcorrespondaunomparlequellapropritestmanipulabledanslecode. [Link] type de donnes pour une proprit (les types de base du langage ou un type personnalis comme par exempleuneclasse). LebloccomprisentreGetetEnd Getcontientlecodeexcutlorsdelalecturedelaproprit. LebloccomprisentreSetetEnd [Link] 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 [Link],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.
[Link]
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 :
- 3-
Visiblement,lecompilateurnestpascoopratiflidedadditionnerdeuxclients. Pourquececodefonctionne,[Link] 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 [Link] = [Link] + [Link] [Link] = [Link] & [Link] [Link] = [Link] & [Link] 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
[Link]
Pour que le code soit plus facilement rutilisable, les valeurs qui sont manipules par les procdures et fonctions [Link] la procdure, vous devez spcifier la liste des paramtres qui seront attendus. Cette liste est situe entre les [Link],pourchaqueparamtre,[Link] plusieursparamtressontattendus,ilconvientdelessparerparunevirgule. Danslecodedelaprocdure,lesparamtressontconsidrscommedesvariablesdclareslocalement. Lors de lappeldelaprocdure,unevaleur,pourchacundesparamtresattendus,[Link] 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 [Link]. Le passage par rfrence : dans ce cas, linformation transmise la procdure nest plus le contenu de la
- 4-
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 [Link],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 [Link] 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 / [Link] End Function Lafonctionpeutensuitetreappeleavecunnombrequelconquedeparamtres. Resultat=moyenne(1,6,23,45) ou Resultat=moyenne(12,78)
- 5-
Assemblies,Namespaceetattributs
[Link]
[Link],cequiluipermetdebnficierdenombreuxavantagesnotamment entermesdescurit,[Link] [Link] 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. [Link] informationssontcontenuesdansle [Link] :
q
lidentitdelassembly(sonnometsaversion) une liste des fichiers utiliss par lassembly (par exemple les autres assemblies utiliss par celuici, les ressourcesbitmap,etc.).
Pourpouvoirutiliserunassemblydansunprojet,[Link],utilisez lemenucontextueldudossierrfrenceduprojet.
Labotededialoguesuivantepermetalorsdechoisirlesrfrencesajouterauprojet.
- 1-
Lesdiffrentsongletspermettentdechoisir,parcatgorie,letypederfrenceajouterauprojet : .NET [Link]. COM LescomposantsCOMetActiveXenregistrssurlesystme. Projects Lesautresprojetsdelasolutioncourante. Browse Recherchedunfichier(dll,ocx...)contenantlesressources. Ilestpossibledajouterplusieursrfrencessimultanment,enutilisantlatouche[Ctrl]lorsdelaslectiondanscette botededialogue. Aprsavoirraliscesdeuxoprations,lesressourcesprsentesdanslassemblysontdirectementaccessiblesdans lecodeduprojet.
[Link]
Les namespaces organisent logiquement les objets disponibles dans un assembly. Ils sont utiliss pour lever les ambiguitslorsque,dansunprojet,desrfrencessontajoutessurdesassembliescontenantdeslmentsayant desnomsidentiques. Parexemple,laclasse [Link] [Link] ajoutesdansunprojetverscesdeuxassemblies,lecompilateurrisquedenepaspouvoirdterminerlaquelledeces classesvoussouhaitezrellementutiliser. Lutilisationdunompleinementqualifi,incluantlenamespacedanslequellaclasseestdfinie,permetdersoudrece genredeproblme. Vouspouvezparexempleutiliserlecodesuivant : Exemple Dim listeWindows As [Link]
- 2-
Dim listeWeb As [Link]. Cependant,[Link] [Link]. Par exemple linstruction Imports [Link] autorise lutilisationdeladclarationsuivante : Dim ctn As SqlConnectionquisansimportationdunamespaceauraitprovoquuneerreurdecompilation :
LesinstructionsImportsdoiventtrelespremireslignesdecodedunfichiersourcevb. Cependant,soyezvigilantpournepasretombersurleproblmeprcdent.
LinstructionImportsproposeunesolutionlganteencrantunaliaslorsdelimportationdunamespace. Imports ctrlWin = [Link] Imports ctrlWeb = [Link] Module TestCompta Dim listeWindows As [Link] Dim listeWeb As [Link] 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.
- 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-
Dansnotreexemple,lafonctioncalculTTCestdoncaccessibleparlecodesuivant : Sub Main() prixTtc = [Link](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 [Link].
[Link]
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,[Link]. Lesattributssontplacsdanslecodeentrelessymboles<et>[Link] utiliss, ils doivent tre spars par des virgules. Les ventuels paramtres dun attribut seront placs entre parenthses. LaportedunattributpeutgalementtretendueparlesmotsclAssembly : ouModule : [Link] syntaxedutilisationdunattributestdonc :
- 5-
[Link]
Parmi les attributs disponibles, certains dentres eux sont trs frquemment utiliss dans le dveloppement avec [Link]. 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 [Link] [Link]. Exemple <ComClass()> Public Class Impots Public Sub New() [Link]() 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-
SerializableAttribute,NonSerializedAttribute [Link] duneinstancedeclasse,[Link] format binaire ou XML, dans ce cas, il facilite lchange dinformations entre applications. Pour quune classe soit utilisableparlemcanismedesrialisation,cellecidoittremarqueaveclattribut [Link] deloprationdesrialisation,lecontenudechacundesmembresdelinstancedelaclasseestenregistrdansle [Link],ilsdoiventtremarqusaveclattribut NonSerializedAttribute. LexempleciaprsdfinitlaclassePersonneavecdeuxmembres(NometPrenom)quiserontsrialissetunmembre (Age)[Link]. Exemple Imports Imports Imports Imports System [Link] [Link] [Link]
<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() [Link] = "Dupond" [Link] = "Paul" [Link] = 25 Dim stream As Stream = [Link]("[Link]", [Link]) Dim formatter As New SoapFormatter() [Link](stream, UnePersonne) [Link]() End Sub End Module LexcutiondececodegnrelefichierXMLsuivant : <SOAP-ENV:Envelope xmlns:xsi="[Link] xmlns: xsd="[Link] xmlns:SOAP-ENC="[Link] org/soap/encoding/" xmlns:SOAP-ENV="[Link] " xmlns:clr=[Link] SOAP-ENV: encodingStyle="[Link] <SOAP-ENV:Body> <a1:Personne id="ref-1" xmlns:a1="[Link] 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 [Link] permet notamment lutilisation de fonctions dfinies dans une bibliothque du systme. Dans lexemple suivant, la fonctionMoveFilepeuttreutilisecommeunefonctionclassique. Exemple <DllImport("[Link]")>Public Function ByVal dst As String) As Boolean End Function MoveFile(ByVal src As String,
- 7-
- 8-
Introduction
Avec Visual [Link], 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 [Link] [Link],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 [Link],plusieursobjetspeuventtreconstruitspartirdela [Link]. Surunplandebtiment,[Link],dans uneclasse,[Link]. 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. [Link] [Link] est un systme dexploitation vnementiel, les vnements peuvent provenir dautres objets, du systme ou des actionsdelutilisateursurlasourisetleclavier. [Link] :
q
Lencapsulation est la capacit permettant de crer et de contrler laccs un groupe dlments. Les classes [Link],dansune programmation classique, il nous faudrait de nombreuses variables et procdures ou fonctions pour manipuler les [Link]. 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,[Link] 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 [Link] vitant ainsi quils ne soient utiliss de manire inapproprie. Elle autorise aussi la modification dune partie du code sansperturberlefonctionnementdurestedelapplication. Lhritagepermetlacrationdunenouvelleclasse,[Link] [Link],proprits,mthodes [Link],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 [Link],indpendammentdela classepartirdelaquellelobjetatconstruit. Trois autres concepts sont galement associs au polymorphisme. La surcharge, la substitution et le masquage de [Link] distinctionsentrecestroistechniques. Lasurchargeestutilisepourconcevoirdespropritsoudesmthodesportantlemmenommaisayantunnombrede paramtresdiffrentsoudestypesdeparamtresdiffrents. [Link] peuventaccepterlemmenombreettypedeparamtresquelamthodeoupropritdelaclassedebase. Le masquage sert remplacer localement, dans une classe, un membre [Link] quel type de membre [Link],[Link] [Link].
- 2-
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.
[Link]
Lacrationduneclassepasseparladclarationdelaclasseellemmeetdetousleslmentslaconstituant.
[Link]
Ladclarationduneclassesefaitenutilisantlesmotscls Classet End [Link],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 [Link],onpeut [Link] : Public Laclassepourratreutilisedanstoutvotreprojetmaisaussidansdautresprojets. Friend Laccslaclasseestlimitauprojetdanslequelelleestdfinie. Private Laclassenepeuttreutilisequedanslemoduledanslequelelleestdfinie. Protected La classe ne peut tre utilise que dans une [Link] treutilisquepouruneclassedclaredansuneautreclasse. Protected Friend Identiqueluniondesportesprotectedetfriend. Vous pouvez galement indiquer comment votre classe va se comporter visvis de lhritage. Deux options sont possibles : MustInherit
- 1-
[Link] [Link],danscegenredeclasse,seuleslesdclarationsdesmthodessontdfinies,ilfaudradans lesclassesdrivescrirelecontenudecesmthodes. NotInheritable [Link] duneautreclasse. Pourindiquerquevotreclassercuprelescaractristiquesduneautreclasseparunerelationdhritage,vousdevez [Link] [Link]. LedbutdeladclarationdenotreclassePersonneestdonclesuivant : Public Class Personne Dim nom As String Dim prenom As String Dim date_naiss As Date End Class
[Link]
Ladfinitionduneclassepeuttrerpartiesurplusieursdclarationsenutilisantlemotcl [Link] autorise la dfinition de la classe dans plusieurs fichiers sources. Elle est trs utilise dans Visual Studio pour [Link] fichier nomm .[Link] qui ne doit, en principe, pas tre modifi directement. Lors de la compilation, le [Link] [Link] [Link]: 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 [Link].
- 2-
[Link]
Vous pouvez crer des variables simples pour stocker les informations de votre classe mais les procdures de proprit fournissent [Link] [Link] motscls Propertyet End [Link],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 [Link] [Link] 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
Lesprocduresdepropritsontdoncchargesdelapplicationdecesrgles. Property nom() As String Get Return leNom End Get Set(ByVal Value As String) leNom = UCase(Value)
- 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 [Link] >= 1900 Then laDate = Value End If End Set End Property
noterquelesprocduresdepropritontunaccscompletauxchampsdelaclasse,ycomprisceuxdclars privs.
Lectureseuleetcritureseule [Link] lecture seule ou en criture seule. Pour indiquer votre intention, vous devez utiliser les mots clsReadOnly ou WriteOnly,lorsdeladclarationdelaproprit. Leblocdecode [Link],cestle bloc de code Set qui doit tre omis. Pour mettre cela en application, nous allons ajouter la classe Personne une proprit [Link] datedenaissanceetlemotdepassenapastreaccessibledelextrieurdelaclasse. ReadOnly Property age() As Long Get Return DateDiff([Link], 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 [Link] vitantlarptitionfrquentedummenomdeproprit. Lapropritpardfautdoitcependantrespectercertainescontraintes :
q
- 4-
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 [Link] >= 1900 Then laDate_naiss = (Value) End If End Set End Property ReadOnly Property age() As Long Get Return DateDiff([Link], 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
- 5-
noterquenoussommesobligsdecrerunnouveauchampdanslaclassePersonneafindassurerlestockagedela [Link],cechampestconstituduntableaudepersonnemaispourratreavantageusement remplacparunestructureplussouplegrer,[Link] enfantattenddonc enparamtreunindexpermettantdespcifierlenfantsurlequelnoussouhaitonstravailler. Lecodesuivantnouspermetdetesterlebonfonctionnementdenotreclasse : Module Principal Sub Main() Dim p As New Personne Dim enfant1 As New Personne Dim enfant2 As New Personne [Link] = "dupond" [Link] = "paul" p.date_naiss = #12/23/1954# [Link] = "dupond" [Link] = "pascal" enfant1.date_naiss = #10/5/1979# nous pouvons galement utiliser le nom du parent pour initialiser le nom de lenfant [Link] = [Link] [Link] = "marc" enfant2.date_naiss = #4/18/1982# nous pouvons affecter un enfant une personne en utilisant la proprit enfant [Link](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 [Link]("Mr {0} {1} n le {2} a 2 enfants", [Link], [Link], p.date_naiss) [Link]("{0} {1} qui a {2} ans", p(0).nom, p(0).prenom, p(0).age) [Link]("{0} {1} qui a {2} ans", p(1).nom, p(1).prenom, p(1).age) [Link]("appuyer sur une touche pour quitter") [Link]() 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.
[Link]
[Link] [Link],ilsuffitdeprfixerlenomdela mthodeparlenomdelobjetsurlequelvousvoulezappelerlamthode. AjoutonslaclassePersonne,lafonctionCalcul_age()etlaprocdureAffichageeninsrantlecodesuivant: Public Function Calcul_age() As Integer Return DateDiff([Link], date_naiss, Now()) End Function Public Sub affichage() [Link](Mr {0} {1} n le {2}, leNom, lePrenom, date_naiss) End Sub
- 6-
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. [Link]() [Link](" a 2 enfants") [Link]("{0} {1} qui a {2} ans", p(0).nom, p(0).prenom, p(0).Calcul_age) [Link]("{0} {1} qui a {2} ans", p(1).nom, p(1).prenom, p(1).Calcul_age) [Link]("appuyer sur une touche pour quitter") [Link]() Surchargedemthode Lasurchargedemthodeestlacration,auseinduneclasse,demthodesayantunnomidentiquemaisunnombre [Link] mthodesetdontlebutestsimilairemaispourlesquelles,[Link] nesontpasprisencomptepourdistinguerdeuxmthodessurcharges :
q
Nouspouvons,parexemple,surchargerlamthodeaffichagedelaclassePersonnepourprendreencomptelalangue [Link]. Public overloads Sub affichage(ByVal langue As String) Select Case langue Case "fr" [Link]("Mr {0} {1} n le {2}", leNom, lePrenom, date_naiss) Case "en" [Link]("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.
- 7-
Si, par contre, le mot overloads est utilis, nous pouvons avoir accs par la classe Salarie toutes les mthodes surcharges ycompriscellesdfiniesdanslaclassePersonne.
Substitutiondemthode [Link], partir dune sousclasse, sans aucune modification. Par contre, si le fonctionnement de cette proprit ou mthode nestpasadaptlanouvelleclasse,vousavezlapossibilitdelasubstituerparunenouvelleimplmentationdans [Link] [Link] [Link] 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 [Link]. Public Overrides Sub affichage() [Link]("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 [Link] [Link],lecodedelamthodeAffichage delaclasse Salariepeutquandmmeavoiraccscettemthodeenutilisantlemotcl [Link] pucrirepourlamthodeAffichedelaclasseSalarie. Public Overrides Sub affichage() Appel de la mthode affichage de la classe Personne [Link]() Ajout des fonctionnalits spcifiques la classe Salarie [Link]("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 [Link],danslaclasseSalarienousaurionspucrire : Public NotOverridable Overrides Sub affichage() [Link]() [Link]("gagne {0} euros par mois", salaire) End Sub Cettesyntaxeannule,pourlessousclassesdelaclasse Salarie,lautorisationdesubstitutionquitaitmiseenplace [Link] obtenonslemessagesuivant :
linverse,[Link] 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 [Link] galementmarquecommeabstraiteaveclemotclMustInherit.
- 8-
Masquagedemthode Lorsque des lments dun programme partagent le mme nom, lun deux peut masquer lautre. Dans un tel cas, [Link] faire entre des lments de type diffrent. Seul le nom de llment est utilis pour assurer le masquage. Lors du masquage,ilconvientdutiliserlemotclShadows,[Link] exemplemasquerlamthodeAffichagedansuneclassedrivedelaclassePersonne. Public Shadows Sub Affichage() End Sub Pourcetteclasse,[Link], 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 [Link] 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
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 [Link], dansunmodule,ajoutonslecodesuivant :
- 9-
Partial Class Personne Private Sub nomChanged() [Link]("un nouveau nom est affect") End Sub End Class Module Module1 Public Sub main() Dim p As Personne p = New Personne [Link] = "Dupont" [Link]([Link]) [Link]() End Sub End Module lexcution,nousavonslersultatsuivant: un nouveau nom est affect Dupont Cestbienlecodedenotreversiondelamthode nomChangedquivientdtreexcuteretpourtantnousnavonspas touchlecodeoriginaldelaclassePersonne. Mthodedextension Lesmthodesdextensionpermettentlajoutdefonctionnalitsuneclassedjdfiniesansbiensravoirmodifier [Link] [Link]:
q
Danslexemplecidessous,nousajoutonsunemthodelaclassePersonne. Module Module1 <Extension()> Public Sub affichage(ByVal p As Personne) [Link]("nom : {0}", [Link]) [Link]("prnom : {0}", [Link]) [Link]("date de naissance : {0}", p.date_naiss) End Sub Public Sub main() Dim p As Personne p = New Personne [Link] = "dupont" [Link] = "paul" p.date_naiss = #6/7/1955# [Link]() [Link]() End Sub End Module LesmthodesdextensionpeuventgalementtredfiniespourlestypesdebaseduFrameworkcommeparexemple [Link] dunechaneenmajuscule. <Extension()> Public Function FirstToUpper(ByVal s As String) As String If IsNothing(s) OrElse [Link] = 0 Then Return s ElseIf [Link] = 1 Then
- 10 ENI Editions - All rigths reserved
Return [Link] Else Return [Link](0, 1).ToUpper & [Link](1, [Link] - 1) End If End Function Si nous utilisons ensuite une variable de type String, notre nouvelle mthode devient disponible et est mme proposeparIntelliSense.
noterlicnediffrenteutilisepourdiffrencierunemthodedextensiondunemthodenormaledelaclasse.
[Link]
Les constructeurs sont des mthodes particulires dune classe par diffrents aspects. Le constructeur sappelle [Link],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,[Link] 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() [Link]() leSalaire = 0 End Sub [Link]()provoquelappelimpliciteduconstructeurdelaclasse [Link] 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 [Link] protected,senommer finalizeetneprendreaucun [Link],ilnepeutyavoirquunseuldestructeurpouruneclasse,doncpasde surchargepossiblepourlesdestructeurs.
- 11 -
Ladclarationdundestructeurestdonclasuivante : Protected Overrides Sub finalize() End Sub [Link] [Link],parexemple,y trouverducodefermantunfichierouvertparlaclasseoulafermetureduneconnexionversunserveurdebasede donnes. ousverronsendtaildansleparagrapheDestructionduneinstance,lescirconstancesdanslesquellesest N appelledestructeur.
[Link]
Lesmembrespartagssontdeschamps,propritsoumthodesquisontaccessiblespartouteslesinstancesdune [Link],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,[Link] valeurdun membre dinstancenemodifielavaleurquepourcetteinstancedeclassealorsquelamodificationdela valeur dun membre partag modifie la valeur pour toutes les instances de la classe. Les membres partags sont assimilablesdesvariablesglobales,[Link] lenomdelaclasseougrceuneinstancedelaclasse. noter que dans ce cas le compilateur ne trouve pas cette dmarche logique et provoque un avertissement sur la [Link] partag. Les mthodes partages suivent les mmes rgles et peuvent servir la cration de bibliothques de fonctions. [Link] 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 [Link].
[Link]
Lutilisationduneclasse,dansuneapplication,passepardeuxtapes.
q
Ladclarationdunevariablepermettantlaccslobjet. Lacrationdelobjet.
Danscertainscas,cesdeuxtapespeuventtreomises,[Link] [Link],parexemple,pourlesobjetsdenomMy.
[Link]
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 [Link](Integerouautre). Dim p as Personne
- 12 -
Aprscettetape,[Link]. [Link] [Link] [Link] Newfaitunedemandeau systmepourobtenirlammoirencessaireaustockagedelinstancedelaclasse,puisinitialiselavariableaveccette [Link]. p = New Personne Lesdeuxoprationspeuventtrecombinesenuneseuleligne. Dim p as New Personne Leconstructeurpardfautestappel,[Link],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#)
[Link]
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,[Link] 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
[Link]
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 [Link] 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, [Link] laclasse,ilpeutsepasserassezlongtempsentrelemomentolobjetdevientinaccessibleetceluioledestructeur estappel. Pourpallierceproblme,ilestpossibledemettreen [Link] [Link], cettemthodeestnomme [Link],vouspouvezgalement prvoirunappelcettemthodedansledestructeurdelaclasse. Unautreproblmepeutalorssurvenir : silamthodeatappeleexplicitementdanslecodedelapplication,ellele seranouveau,demanireimplicite,[Link],donc,faireensorte quelecodedecettemthode Dispose puisse tre excut deux fois sans causer [Link] indiquerauGarbageCollector,quilnedoitpasexcuterledestructeurdecetteinstancede [Link],dansla mthode Dispose, vous devez le prvenir que le travail de nettoyage est dj ralis, en appelant la mthode [Link] : Public Sub Dispose() inserer le code charg de la libration des ressources
- 13 -
Demande au Garbage Collector de ne pas appeler le destructeur [Link](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. [Link]() Cettesolutionnestcependantpasrecommande,carelleconsommenormmentderessourcessurlesystmepour parfoisnercuprerquequelquescentainesdoctetsenmmoire.
[Link],liaisonprcoce
Le compilateur Visual Basic effectue une opration appele liaison lorsquun objet est affect une variable. Cette [Link] compilateur deffectuer des optimisations sur le code gnr. Laffection dun objet peut aussi se raliser une [Link] 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 [Link],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 [Link]. Ladeuximesolutionconsisteaffecter,unevariableduntypeparticulier,[Link] [Link],ilfauttrecertain que lobjet retourn est bien une instance de la classe que lon souhaite manipuler. Dailleurs, le compilateur se chargeradenouslerappeler.
[Link] obtenirlenomdutypedelobjeteteffectuerunecomparaisondechanedecaractres. Dim fils As Personne If TypeName([Link](0)).Equals("Personne") Then fils = CType([Link](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 [Link](0) Is Personne Then fils = CType([Link](0), Personne) End If noter que le transtypage ne change pas le type de lobjet en mmoire mais permet simplement de le voir dune [Link],letranstypagenouspermetde levoircommeunObject,unePersonneouunSalariemaiscelaresteratoujoursuneinstancedelaclasseSalarie.
[Link]
[Link] 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 [Link] : Personne,Client,Commande.
- 14 -
Essayonslesrelationspourchacunedesclasses. [Link] [Link] [Link] [Link] [Link] [Link] 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.
[Link]
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() [Link](Mr {0} {1} n le {2}", nom, prenom, date_naiss) [Link]( 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 [Link],nousavonsdjuneportiondecodechargedelaffichage du nom, du prnom et de la date de naissance dune personne. Pourquoi ne pas la rutiliser dans la mthode affichagedelaclasseClientpuisquelonenhrite ? Notremthodedevientdonc :
- 15 -
Public Overrides Sub affichage() affichage() [Link](" code Client : {0}", leCode) End Sub Essayonsdelutiliser : Dim c As Client c = New Client [Link] = "dupond" [Link] = "paul" c.date_naiss = #12/23/1954# [Link] = 12345 [Link]() Hlas,lersultatnestpaslahauteurdenosesprances !
Quesestilpasslorsdelexcution ? Lorsdelappeldelamthode affichage,lapremirelignedecodeaconsistappelerlamthode affichagedela [Link],VisualBasicrecherchelapremiremthode affichagequiltrouveetappelleainsienbouclela mthodeaffichagedelaclasseClientdolerreurdedbordementdepilequenousobtenons. Pour viter ce genre de problme, nous devons lui prciser que la mthode affichage appeler se trouve dans la [Link],nousdevonsutiliserlemotclMyBasepourqualifierlamthodeaffichageappele. Public Overrides Sub affichage() [Link]() [Link]( 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) [Link](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# [Link]() [Link]()
- 16 -
Nousaffiche : Mr dupond paul n le 23/12/1967 00:00:00 code Client : 0 Lesinformationsontbientprisesencompte,[Link] 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 [Link],nous devonslaprfixeraveclemotclMyClass. Leconstructeurdevientdonc : Public Sub New(ByVal nom As String, ByVal prenom As String, ByVal pwd As String, ByVal leCode As Integer) [Link](nom, prenom, pwd) [Link] = leCode End Sub Notrecodedetestnousaffichealorslesbonnesinformations : Mr dupond paul n le 23/12/1967 00:00:00 code Client : 12345
[Link]
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,[Link] delapplication,carsiunenouvellefonctionnalitdoittredisponibledanslesclassesdrives,ilsuffitdajoutercette [Link] abstraiteetainsilaisserlutilisateurdelaclasselesoindecrerlimplmentationdanslaclassedrive. Pourquuneclassedevienneuneclasseabstraite,vousdevezutiliserlemotcl MustInheritdansladclarationdela classe. Public MustInherit Class Modele End Class
[Link]
Lesclassesfinalessontdesclassesordinairesquipeuventtreinstanciesmaisnesontpasutilisablescommeclasse de base dans une relation dhritage. Cest le cas de plusieurs classes du [Link], comme par exemple la classeString.
[Link]
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 [Link] dclarationduneinstancedeclasseanonymesebaseprincipalementsurleprincipevuauparagraphebconcernant linitialisation dune instance. Lors de la dclaration dune telle instance nous devons fournir la liste des proprits [Link].
- 17 -
Dim produit = New With {.Nom = "biscuit", .Prix = 1.56} [Link] sont initialises respectivement avec les valeurs biscuit" et 1.56. Pour vrifier cela, demandons encore une fois IntelliSensesonavis.
Ilnousindiquebienquepournotrevariableproduit,[Link] [Link] ?Enfait,lesclassesanonymesrespectentlesmmesrglesque touteslesautresclassescarelleshritentpardfautdelaclasse [Link] hritesdelaclasse [Link] genredeclasseilestimpossiblededfinirautrechosequedesproprits,doncpasdemthodesnidvnements. Vousdevezcertainementvousposerlaquestion : Commentlecompilateurfaitilpoursyretrouversilexisteplusieurs instances de classe anonyme ? En fait, ces classes sont anonymes pour nous mais pas pour lui car pendant la [Link],demandonslavariableproduit denousindiquersontype. [Link]([Link]) 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 [Link] chaquecompilationdelapplication. En fait, le compilateur ne cre pas une nouvelle classe pour chaque instanciation car il vrifie, avant de crer une nouvelleclasse,[Link],ilsebasesurleslmentssuivants :
q
Sitousceslmentssontidentiquesalorsilrutiliseralaclassequil a dj gnre pour crer [Link] cela : Dim produit1 = New With {.Nom = Dim produit2 = New With {.Nom = [Link]("la classe de [Link]("la classe de "biscuit", .prix = 1.56} "confiture", .prix = 2.24} produit1 est :{0}", [Link]) produit2 est :{0}", [Link])
Nousobtenonslersultatsuivant : la classe de produit1 est :VB$AnonymousType_0`2 la classe de produit2 est :VB$AnonymousType_0`2 [Link] eninversantsimplementlordredesproprits : Dim produit1 = New With {.Nom = "biscuit", .prix = 1.56}
- 18 -
Dim produit2 = New With {.prix = 2.24, .Nom = "confiture"} [Link]("la classe de produit1 est :{0}", [Link]) [Link]("la classe de produit2 est :{0}", [Link]) 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 [Link] ainsisontenlectureseule.
Pourcomparerdeuxinstancesdeclasseanonyme,[Link] de la classe Object mais substitue par le compilateur au moment de la gnration de la classe anonyme. Cette mthodeindiqueraquedeuxinstancessontidentiquessitouteslesconditionssuivantessontrespectes.
q
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} [Link]([Link](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} [Link]([Link](produit2)) Lersultatestsansappel : lesdeuxinstancesnesontplusidentiques.
[Link]
Nous avons vu que lon pouvait obliger une classe implmenter une mthode en la dclarant avec le mot cl [Link],ilestpluspratiquedutiliser les interfaces. Comme les classes, les interfaces permettent de dfinir un ensemble de proprits, mthodes, [Link],[Link] [Link],vous vous engagez fournir, dans votre classe, tout ce qui est dfini dans linterface. Il convient dtre prudent si vous
- 19 -
utilisez les interfaces et de ne jamais modifier une interface dj utilise sinon vous courez le risque de devoir reprendrelecodedetouteslesclassesquiimplmententcetteinterface. Pourpouvoirutiliseruneinterface,[Link] classemaisenutilisantlesmotsclsInterfaceetEnd Interface. [Link] 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 [Link]. 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 [Link] Select Case nom Case Is < [Link] Return -1 Case [Link] 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,[Link]? [Link] :
q
Lesinterfacesvontnousaidermettreen [Link],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 [Link] [Link]. Public Sub tri(ByVal tablo As Comparable())
- 20 -
Dfinieainsi,notreprocdureseracapabledetriertoutessortesdetableauxpourvuqueleurslmentsimplmentent [Link]. 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 [Link](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
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 [Link](tab(i).nom) Next Pasdeproblmelacompilation,parcontreleschosessecompliquentpendantlexcution.
- 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.
[Link]
Les mthodes nous permettent de communiquer avec les objets qui composent une application mais les objets ont [Link] ensuitetreprisencomptepourragircequivientdesepasserdanslapplication. Lesvnementssonttrslargementutilissdanslaconceptiondelinterfacegraphiqueduneapplicationcarilsnous permettentdavoirdesinformationssurlesactionseffectusparlutilisateurdelapplication.
[Link]
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,[Link],parexemplecrerdansnotreclasseClient un vnement qui se dclenchera chaque ajout dune nouvelle commande. Comme information supplmentaire, notrevnementfourniralenombredecommandesaprslajout. Public Event NouvelleCommande(ByVal nbCommandes As integer) Ilnousrestemaintenantdfinirdansquellesconditionsnotrevnementseradclenchetbiensrledclencher [Link],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 [Link] 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 -
[Link]
[Link] :
q
dclarerunevariableaveclemotclWithEventsetutiliserlaclauseHandles. Ajoutermanuellementungestionnairedvnement.
a deuxime solution est plus souple car elle nous permettra dajouter ou de supprimer dynamiquement des L gestionnairesdvnementpendantlefonctionnementdenotreapplication,maisellencessiteunpeuplusde codequelapremiresolution.
UtilisationdelaclauseHandles [Link] instancedelaclasseClientseffectuedelamaniresuivante. Dim WithEvents unClient As Client [Link] 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 [Link] End Sub Cettemthodeestidentiquecellesquelonacritjusquprsent,avecenpluslemotclHandlessuividunomde [Link],lenomdelaprocdureestconstituparlenomde [Link] [Link]. Nouspouvonsgalementajouterplusieursprocduresquiserontappelesparlemmevnement,maisilfautdans [Link] manquedesouplessecarilestimpossibledechoisir,pendantlexcution,quelgestionnairedvnementserautilis.
- 23 -
Il existe galement une autre contrainte lie au fait que les variables dclares WithEvents doivent obligatoirement tredclaresendehorsdetouteprocdureoufonction. Ajoutetsuppressiondegestionnairedvnement Pourviterceslimitations,[Link] cas,[Link] unvnementuneprocdurepourlegrer. AddHandler [Link], 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 [Link], AddressOf gestion_graph Else AddHandler [Link], AddressOf gestion_texte End If [Link](10) Public Sub gestion_graph(ByVal nbcmd As Integer) MsgBox("nombre de commandes " & nbcmd) End Sub Public Sub gestion_texte(ByVal nbcmd As Integer) [Link](nombre de commandes " & nbcmd) End Sub De la mme manire, nous pouvons supprimer un gestionnaire dvnement qui est dj rfrenc, en utilisantRemoveHandler. RemoveHandler [Link], 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 [Link] problme,ilsuffitdedclarerunemthode protecteddanslaclasseetsimplementfairedclencherlvnementpar [Link], 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 -
[Link]
Ilpeuttreparfoisutiledepouvoirpassercommeparamtreunefonctionouuneprocdurenonpasuntypesimple [Link],sinousvoulonschoisirlecritresuivantlequelnous allonsfaireletridenosemploys,[Link] lappeldelaprocduredetri,nousspcifieronsquellemthodeutiliserpoureffectuerlacomparaison.
[Link]
[Link] Delegatesuividelasignaturede laprocdureoufonction. Public Delegate Function comparaison(ByVal o1 As Object, ByVal o2 As Object) As Integer [Link],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 [Link] Case Is < [Link] Return -1 Case [Link] Return 0 Case Else Return 1 End Select End Function Function compareNbCommandes(ByVal c1 As Client, ByVal c2 As Client) As Integer Select Case [Link] Case Is < [Link] Return -1 Case [Link] Return 0 Case Else Return 1 End Select End Function Ilfautmaintenantmodifiernotrefonctiondetripourquenplusdutableautrier,elleprenne,commeparamtre,la [Link] : 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 [Link](tablo(j), tablo(i)) < 0 Then o = tablo(j) tablo(j) = tablo(i) tablo(i) = o End If Next Next End Sub Deuxmodificationsdansnotrecode :
- 25 -
lajoutduparamtrecomparateurcommedlgupournotrefonctiondetri, lutilisationdecedlgupourcomparerdeuxlmentsdutableauenutilisantlamthodeinvoke.
LeslmentsdutableaunesontplusobligsdimplmenterlinterfaceComparablecarunmoyendelescomparerdeux deuxestpasselafonction.
[Link]
Pourutiliserlafonctiondetri,nousdevonsmaintenantluifournirdeuxparamtres : letableautrieretuneinstance [Link]. 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.
[Link]
Une expression lambda est comparable une fonction sans nom effectuant un traitement et retournant une simple [Link].
- 26 -
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,[Link] 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.
[Link]
[Link] enfournissantlaclassegnriqueuntypeargumentpourchacundecestypesparamtre.
- 1-
[Link]
[Link] cela,[Link] classe,capabledegrerunelistedlmentsaveclesfonctionnalitssuivantes :
q
Nousdevonstoutdaborddfinirlaclassecommeuneclasseordinaire. Public Class ListeGenerique End Class Latransformationdecetteclasseenclassegnriqueseffectueenajoutantuntypedeparamtreimmdiatement aprslenomdelaclasse. Public Class ListeGenerique(Of typeDeDonnee) End Class Siplusieurstypesdeparamtressontncessaires,ildoiventtresparspardesvirgulessansrpterlemotclOf. Sivotrecodedoitraliserdautresoprationsquedesaffectations,vousdevezajouterdescontraintessurletypede [Link],ajouterlemotcl [Link],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,[Link]. 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) {} [Link] = taille
- 2-
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 [Link](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 [Link](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 [Link](1000, , "liste vide") End If on verifie si on nest pas a la fin de la liste If position = nbElements - 1 Then Beep() [Link](1000, , "pas delement suivant") Exit Function End If on deplace le pointeur sur lelement suivant position = position + 1
- 3-
Return liste(position) End Function Public Function precedent() As typeDeDonnee If nbElements = 0 Then [Link](1000, , "liste vide") End If on verifie si on nest pas sur le premier element If position = 0 Then Beep() [Link](1000, , "pas delement precedent") Exit Function End If on se deplace sur lelement precedent position = position - 1 Return liste(position) End Function End Class
[Link]
Pourpouvoirutiliseruneclassegnrique,vousdeveztoutdabordgnreruneclasseconstruiteenfournissantun type argument pour chacun de ces types paramtre. Vous pouvez alors instancier la classe construite par un des [Link]. Dim liste As New ListeGenerique(Of Integer)(5) [Link]. [Link](10) [Link](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() [Link](10) [Link](11) [Link](12) [Link](13) [Link](14) [Link](15) menu() End Sub Public Sub menu() Dim choix As Char On Error GoTo gestionerreur [Link](1, 24) [Link]("p (premier) < (precedent) >(suivant) d (dernier) f (fin)") While choix <> "f" choix = [Link]() [Link]() [Link](1, 1) Select Case choix Case "p"
- 4-
[Link]("le premier {0}", [Link]()) Case "<" [Link]("le precedent {0}", [Link]()) Case ">" [Link]("le suivant {0}", [Link]()) Case "d" [Link]("le dernier {0}", [Link]()) End Select [Link](1, 24) [Link]("p (premier) < (precedent) >(suivant) d (dernier) f (fin)") End While Exit Sub gestionerreur: [Link] = [Link] [Link]([Link]) [Link]() Resume Next End Sub End Module Nouspouvonsgalementvrifierquenotreclassefonctionnesansproblmesinousluidemandonsdetravailleravec deschanesdecaractres. Public Sub main() [Link]("premier") [Link]("deuxieme") [Link]("troisieme") [Link]("quatrieme") [Link]("cinquieme") menu() End Sub
[Link]
[Link] [Link] [Link],lecompilateur essaie de dterminer le type, en fonction des arguments passs la mthode. Cette solution doit toutefois tre utiliseavecprcaution,carsilecompilateurnepeutpasdterminerletypedesarguments,ilgnreuneerreurde compilation.
[Link]
[Link] [Link], chaquefoisquevousavezbesoindutiliserletypeparamtre. Nousallonscrerunefonctiongnriquecapablederechercherunlmentparticulierdansuntableaudenimporte [Link]. 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 [Link] : Public function rechercheGenerique(Of typeDonnee As Icomparable) (byval tablo As typeDonne(), elementRecherche As typeDonnee) As Integer Aprsavoirvrifiqueletableaucontientaumoinsunlment,nousdevonscomparerllmentrecherchaveccelui [Link],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 [Link]() > 1 Then
ENI Editions - All rigths reserved - 5-
Return -1 End If test si le tableau est vide If [Link] = 0 Then Return -1 End If For i As Integer = 0 To [Link](0) If tablo(i).CompareTo(elementRecherche) = 0 Then Return i End If Next Return -1 End Function
[Link]
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 [Link]("valeur non trouve") Else [Link]("valeur trouve la position {0}", resultat) End If [Link]() Dim s() As String = {"un", "deux", "trois", "quatre", "cinq"} resultat = rechercheGenerique(Of String)(s, "six") If resultat = -1 Then [Link]("valeur non trouve") Else [Link]("valeur trouve la position {0}", resultat) End If [Link]() End Sub
- 6-
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... [Link].
[Link]
Lesdiffrentesclassespermettantlagestiondecollectionssontrpartiesdansdeuxespacesdenom :
q
[Link] [Link]
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.
[Link]
La classe Array ne fait pas partie de lespace de nom [Link] mais elle peut quand mme tre considrecommeunecollectioncarelleimplmentelinterface [Link] 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.
[Link]
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
- 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 [Link] [Link] 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 [Link]. 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 [Link] Addet AddRangeajoutentdeslmentslafin de la liste. Les mthodes Insert et InsertRange permettent de choisir lemplacement o va seffectuer lajout. La propritItem,quiestlapropritpardfautdeclasse,[Link] suppression dlments se fait par la mthode RemoveAt ou RemoveRange la premire attend comme paramtre lindexdellmentsupprimer,[Link] Clearest plusradicaleetsupprimetousleslments. Lecodesuivantillustrelefonctionnementdecetteclasse : Public Sub main() Dim liste As ArrayList Dim c As Client liste = New ArrayList() [Link]("capacit initiale de la liste {0}", [Link]) [Link]("nombre dlments de la liste {0}", [Link]) [Link]("ajout dun client") c = New Client("client1", "prenom1", "secret", 1001) [Link](c) [Link]("capacit de la liste {0}", [Link]) [Link]("nombre dlments de la liste {0}", [Link]) [Link]("ajout de quatre clients) c = New Client("client2", "prenom2", "secret", 1002) [Link](c) c = New Client("client3", "prenom3", "secret", 1003) [Link](c) c = New Client("client4", "prenom4", "secret", 1004) [Link](c) c = New Client("client5", "prenom5", "secret", 1005) [Link](c) [Link]("capacit de la liste {0}", [Link]) [Link]("nombre dlments de la liste {0}", [Link]) [Link]("affichage de la liste des clients") For Each c In liste [Link]() [Link]() Next [Link]("effacement des clients 1002, 1003, 1004") [Link](1, 3) [Link]("capacit de la liste {0}", [Link]) [Link]("nombre dlments de la liste {0}", [Link]) [Link]("affichage de la liste des clients") For Each c In liste [Link]() [Link]() Next [Link]("affichage du deuxime client de la liste") liste(1).affichage() [Link]() [Link]("effacement de tous les clients") [Link]() [Link]("capacit de la liste {0}, [Link]) [Link]("nombre dlments de la liste {0}, [Link]) [Link]() End Sub
- 2-
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
: : : :
L acapacitdelalistenediminuepaslorsdelasuppressiondunlment,mmelorsquelalisteestvide.
[Link]
Une Hashtableousaversiongnrique [Link] [Link] delacollection,uncodeestgnrparunefonctiondehachage,[Link] 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 [Link] [Link] Hashtablepuissestockerunobjet,celuicidoittrecapabledefournirsonproprecodedehachage.
[Link]
[Link] rcuprpartirdelacollection,ilestenmmetempssupprimerdelacollection. LescollectionsdetypeQueuesontadaptes,sivousavezbesoindaccderauxinformationsdanslemmeordreque [Link] (FiFo).Lestroisprincipalesoprationsdisponiblessont :
q
Lexemplesuivantillustrelutilisationdecestroismthodes. Public Sub main() Dim q As Queue q = New Queue Dim c As Client c = New Client("client1", "prenom1", "secret", 1001) [Link]("arrive du premier client:{0}", [Link]) [Link](c)
- 3-
c = New Client("client2", "prenom2", "secret", 1002) [Link]("arrive du deuxime client:{0}", [Link]) [Link](c) c = New Client("client3", "prenom3", "secret", 1003) [Link]("arrive du troisime client:{0}", [Link]) [Link](c) [Link]("dpart du premier client:{0}", [Link]) [Link]("il reste {0} clients", [Link]) [Link]("dpart du deuxime client:{0}", [Link]) [Link]("il reste {0} client", [Link]) [Link]("le troisime client sincruste:{0}", [Link]) [Link]("il reste {0} client", [Link]) [Link]("dpart du troisime client:{0}, [Link]) [Link]("il reste {0} client", [Link]) [Link]() End Sub
[Link]
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
[Link]
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-
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, [Link],parexemple,unmoyendaccder auxpropritsdelamachinesurlaquellesexcutelapplication,[Link],ouauxpropritsde lapplicationellemmeparlintermdiairede [Link],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
Enfonctiondutypedeprojetdanslequelilssontutiliss,certainespropritsdecesobjetspeuventtreindisponibles. Parexemple,lapropritMainFormdelobjetApplicationnestutilisablequedanslesprojetsdapplicationWindows.
q
[Link], 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. [Link] 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.
- 1-
Lesdiffrentstypesderreurs
Pourundveloppeur,[Link],nouspouvonsclasserceserreurs [Link].
[Link]
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 [Link],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 [Link] :
q
Laffichageautomatiquedelalistedesmembresdisponibles :
Laffichagedelalistedesparamtresfournirpourlappelduneprocdureoufonction :
- 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.
[Link]
Ceserreursapparaissentaprslacompilation,[Link] estcorrectemaislenvironnementdevotreapplicationnepermetpaslexcutionduneinstructionutilisedansvotre application. Cest, par exemple, le cas si vous essayez douvrir un fichier qui nexiste pas sur le disque de votre [Link].
- 2-
Cetypedebotededialoguenestpastrssympathiquepourlutilisateur! Heureusement, Visual Basic permet la rcupration de ce type derreur et vite ainsi laffichage de cette inquitante [Link] :
q
lagestionenligne lesexceptions.
Nousdtailleronscelaunpeuplusloindanscechapitre. Leserreursdelogique [Link],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.
- 3-
Traitementdeserreurs
DeuxtechniquessontdisponiblespourletraitementdeserreursdansVisualBasic :
q
lagestionenligne letraitementparexception.
[Link]
LinstructionOn [Link], 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 [Link] 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 [Link]("c:\essai") Exit Sub
- 1-
gestionErreurs: Dim reponse As Integer reponse = MsgBox("impossible de lire le fichier", [Link]) Select Case reponse Case [Link] Resume Case [Link] Resume Next Case [Link] 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 [Link],entreautres,deuxproprits,number etdescription,[Link] pourragirdefaondiffrenteenfonctiondelerreur. Private Sub OuvertureFichierBis() On Error GoTo gestionErreurs [Link]("a:\essai") Exit Sub gestionErreurs: Dim reponse As Integer [Link]([Link]) Stop If [Link] = 53 Then reponse = MsgBox("impossible de trouver le fichier, MsgBoxStyle. AbortRetryIgnore) Select Case reponse Case [Link] Resume Case [Link] Resume Next Case [Link] Exit Sub End Select End If If [Link] = 57 Then reponse = MsgBox("insrer une disquette dans le lecteur", [Link]) Select Case reponse Case [Link] Resume Case [Link] Exit Sub End Select End If End Sub Ungestionnairederreurspeuttredsactivenutilisantlinstruction on error goto [Link] 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.
[Link]
[Link]
La gestion des exceptions donne la possibilit de protger un bloc de code contre les erreurs dexcution qui [Link] Try End [Link] 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 [Link] une classe dexception et lorsque cette erreur se produit, une instance de la classe exception correspondante est [Link],pourchaqueinstructioncatch,queltypedexceptionelledoittraiter. Laclassedebaseestlaclasse Exceptionpartirdelaquelleestcreunemultitudedesousclassesspcialises [Link].
q
- 3-
[Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link]
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 [Link]("a:\essai")
- 4-
Catch ex As [Link] MsgBox("erreur douverture du fichier", [Link]) 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 [Link],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 [Link]("a:\essai") Catch ex As Exception MsgBox("erreur douverture du fichier", [Link]) 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.
[Link]
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
- 5-
Inherits Exception Public Sub New() End Sub Public Sub New(ByVal message As String) [Link](message) End Sub Public Sub New(ByVal message As String, ByVal inner As Exception) [Link](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-
Lesoutilsdedbogage
Danslechapitreconsacrlagestiondeserreurs,nousavonsvuqueleserreursdelogiquesontlesplusdifficiles liminer dune application. Heureusement, Visual [Link] nous propose de nombreux outils de dbogage la fois [Link] de lapplication (enplaantdespointsdarrtetenfaisantexcuterlesinstructionsuneparune),devisualiseretdemodifierlecontenu des variables, de visualiser le contenu de la mmoire un emplacement particulier, de vrifier la liste de toutes les fonctionsutilises,[Link].
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.
- 1-
Pourlesexplicationssuivantesdecechapitre,nousallonsconsidrerquecestcetteconfigurationquiestutilisedans VisualStudio.
[Link]
[Link]
UnprojetdansVisualStudiopeuttredanstroistatsdistincts :
q
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.
[Link]
- 2-
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 [Link][Ctrl][Alt][Pause]permettentaussidarrterlapplication.
Leraccourci[Shift][F5]permetderelancerlexcutiondelasolution.
[Link]
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.
[Link]
Unefoisenmodearrt,nousavonsdenombreusespossibilitspourcontinuerlexcutiondelapplication. Lapremirepossibilitpermetdereprendrelexcutionnormaledelapplicationenutilisantlammetechniqueque pour le dmarrage du programme (barre doutilsouraccourciclavier [F5]). Cependant une technique plus courante lorsdundbogageestlexcutionenpaspas. Troissolutionssontdisponibles :
q
LePaspasdtailletlePaspasprincipaldiffrentsimplementparleurfaondegrerlesappelsdeprocdures et fonctions. Si nous sommes en mode arrt sur une ligne de code contenant un appel une procdure ou une fonction,lemodePaspasdtaillvapermettrederentrerdanslecodedelafonctionpuisdelancerlexcutionde [Link] quevouspuissiezvoircequisepasselintrieurdelaprocdureoufonction.
- 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-
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.
[Link]
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 [Link]. reprsenteunpointdarrtnormal,activoudsactiv. reprsenteunpointdarrtavanc(condition,nombredepassageoufiltre).
- 5-
reprsenteunTracePointnormal,activoudsactiv.
reprsenteunTracePointavanc(condition,nombredepassageoufiltre). reprsenteunpointdarrtouunTracePointenerreur.
reprsenteunavertissementsurunpointdarrtouunTracePoint.
[Link]
Pourplacerunpointdarrt,denombreusespossibilitssontdisponibles :
q
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.
- 6-
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 [Link] :
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).
Cettebotededialoguenouspermetdedfinirlenombredepassagessurlepointdarrtpourqueceluiciarrte [Link].
- 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 [Link] 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-
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.
[Link],dsactiver,supprimerunpointdarrt
Lespointsdarrtpeuventgalementtremomentanmentdsactivsenutilisantlemenucontextuel.
Le point darrt peut ensuite tre nouveau activ en utilisant nouveau le menu contextuel. Ce mme menu permetaussilasuppressiondunpointdarrt,maisilestplusrapidedeffectuerundoubleclicsurlepointdarrtlui [Link] DboguerproposegalementloptionSupprimertouslespointsdarrt,vitantdavoirparcourir denombreuseslignesdecodepourliminerlensembledespointsdarrt. Pournousfaciliterlatchelorsdudbogageduneapplication,unefentrenousproposeunrcapitulatifdetousles points darrt placs dans votre projet. Cette fentre est accessible par lintermdiaire du menu Dboguer Fentres [Link] surunpointdarrt.
- 9-
ContrairementdesversionsplusanciennesdeVisualBasic(version6.0),lespointsdarrtsontconservslorsque vousfermezvotreprojet.
[Link]
[Link] 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.
[Link]
[Link] lasourisaudessusdunometaprs,uncourtinstant,[Link] variableestuntypecomplexe,uneinstancedeclasseparexemple,leDataTipsproposeunpetitsigne+permettant de [Link] [Link].
[Link]
- 10 ENI Editions - All rigths reserved
La fentre Automatique affiche les variables utilises dans linstruction courante dans les trois instructions [Link] Fentres Automatique.
[Link]
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,[Link] plus pratique de configurer manuellement la liste des variables et expressions surveiller pendant le fonctionnementdelapplication.
[Link]
Lafentre Espionpermetlaffichage des variables semblant intressantes pour le dbogage de [Link] fentre ou plutt ces fentres, puisque quatre fentres Watch sont disponibles, sont affiches par le menu Dboguer Fentres Espionpuis Espion1 [Link] 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 [Link],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].
[Link]
Lafentre Espionexpress propose le mme principe de fonctionnement et est accessible par le menu Dboguer [Link],lavariableoulexpressionsurlaquellesetrouvelecurseurestaffichedanslafentre [Link],vousdevrezobligatoirementlafermeravantdepoursuivreledbogage devotreapplication.
[Link]
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 -
Sivousledsirez,[Link].
- 13 -
Autrestechniquesdedbogage
Lacompilationconditionnelle Vous pouvez utiliser la compilation conditionnelle pour spcifier des portions de code qui seront ou non compiles, en [Link],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 [Link], ByVal e As [Link]) Handles [Link] 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.
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. [Link](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 [Link] End Try. Try z = 1 / x Catch ex As Exception [Link](division par zro) End Try Les mthodes Write et WriteLine permettent de suivre lvolution dune expression sans que lapplication passe en [Link],danslafentredesortie,lersultatdelvaluationdelexpression. LesmthodesIndentetUnindentformatentlaffichagedanslafentreSortie. [Link]("dbut de la boucle") [Link]() For x = 1 To 5 [Link]("passage n" & x) ... ... Next [Link]() [Link]("fin de la boucle") Lersultatsuivantestobtenudanslafentredesortie :
- 2-
- 3-
Lesdiffrentstypesdapplication
Les applications Windows sont bases sur une ou plusieurs fentres constituant linterface entre lutilisateur et [Link],[Link] de classes permettant la conception de linterface de lapplication. Ces lments sont frquemment regroups sous le [Link] [Link](oufeuilles),nousplaceronsdescontrlesafin de dfinir exactement laspect de linterface de lapplication. Les formulaires seront crs partir de classes du [Link],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.
[Link]
DansuneapplicationWindows,troisstylesdeprsentationsontdisponiblespourlesfentresdelapplication.
[Link](SDI)
[Link],ledocumentactifde [Link].
[Link](MDI)
Lapplicationestconstituedunefentreprincipale(lafentremre)danslaquellevontapparatreplusieursfentres (fentres filles) contenant les documents sur lesquels vous souhaitez travailler. En rgle gnrale, ce type [Link] estutilisparlaplupartdesapplicationsbureautiques.
[Link]
ENI Editions - All rigths reserved - 1-
[Link],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 [Link].
- 2-
[Link]
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 [Link],lapplicationnepermetpasdeffectuergrand chose,maiselleatouteslesfonctionnalitsduneapplicationWindowset,cela,[Link] fait, il existe bien du code correspondant cette application mais il a t gnr automatiquement par Visual Studio. Commececodenedoitjamaistremodifimanuellement,lesfichierslecontenantsontmasqusdanslexplorateurde [Link],vouspouvezutiliserlebouton delabarredoutils de [Link] [Link] [Link]. [Link]. ------------------------------------------------ <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 <[Link]()> Public Sub New() _
[Link]([Link]) [Link] = false [Link] = true [Link] = true [Link] = [Link] End Sub <[Link]()> Protected Overrides Sub OnCreateMainForm() [Link] = 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 [Link],traduitesencodeVB,quevousallezraliserpour personnaliserlescaractristiquesdelafentre. Regardonslecontenudecefichier : <[Link]()> _ Partial Class Form1 Inherits [Link] Form overrides dispose to clean up the component list.
- 1-
<[Link]()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing AndAlso components IsNot Nothing Then [Link]() End If Finally [Link](disposing) End Try End Sub Required by the Windows Form Designer Private components As [Link] 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. <[Link]()> _ Private Sub InitializeComponent() components = New [Link]() [Link] = [Link] [Link] = "Form1" End Sub Ilcontientladfinitiondelaclassecorrespondantlafentrehritantdelaclasse [Link] 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 [Link] :
q
Visual Studio se charge de gnrer, dans le fichier [Link], le code correspondant la personnalisationdelaspectdelafentre. Vous tes responsable du code, contenu dans le fichier [Link], charg de la personnalisation du fonctionnementdelafentre.
Cettesolutionlimitelesrisquesdemodificationinvolontairedelapartiedecoderserve [Link] plus important est constitu par la mthode InitializeComponent. Cette mthode est appele automatiquement la crationduneinstancedelafentre,[Link],vouspouvezajouterun constructeur par dfaut dans le fichier [Link] 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,[Link] tantdefaireappelauconstructeur,pardfaut,lapremirelignedevotreconstructeursurcharg. Public Sub New(ByVal i As Integer) [Link]() End Sub
ensezgalementbienrespecter,dansleconstructeurpardfaut,lemplacementquivousestrservpourvos P [Link],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. <[Link]()> _
- 2-
Protected Overrides Sub Dispose(ByVal disposing As Boolean) If disposing AndAlso components IsNot Nothing Then [Link]() End If [Link](disposing) End Sub Nous avons fait le tour du code gnr automatiquement. Regardons maintenant comment modifier lapparence et le comportementdenotrefentreparlintermdiairedecesproprits.
[Link]
Lapositiondelafeuillesurlcran(ousursonconteneur)estmodifieparlaproprit [Link] une structure compose de deux membres, indiquant les coordonnes du coin suprieur gauche de la feuille par [Link] proprits de vb. En fait, lorsque vous modifiez des proprits, du code est ajout pour prendre en compte vos [Link],sinousvoulonsquenotrefentreapparaisseauxcoordonnes100100,nousmodifionsla propritLocation.
Sinousregardonsdanslecode,nousretrouvonslamodificationdenotreproprit. [Link] = New [Link](100, 100) Les dimensions de la fentre sont modifiables par la proprit size qui contient deux membres Width et Height indiquantlalargeuretlahauteurdelafentre. Rsumonstoutcelaparunpetitschma :
Lesunitssontdespixels,pourtouteslesproprits,[Link] Left, Top, Heightet [Link] 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
- 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 [Link] fentressontdcalesverslebasdroitdelcran [Link] chaquefentreestspcifieparlapropritSize. Mmeprincipequecidessus,maislatailleest dtermineparlesystmelaffichagedelafentre.
CenterParent CenterScreen
WindowsDefaultLocation
WindowsDefaultBounds
[Link] :
Valeurdelaproprit
Normal Minimized Maximized
tatdelafentre
TailledfinieparlapropritSize. Fentreenicnesurlabarredestches. Fentreenpleincran.
Cespropritspeuvent,biensr,[Link],ilestplusefficacedutiliserles mthodes SetLocation et SetSizequipermettentdirectementledimensionnementetlepositionnementdelafeuille. LutilisationdecesmthodesoulamanipulationdirectedespropritsdclenchentlesvnementsResizeet Movesur lafeuillecorrespondante. Lecodesuivantnouspermetdesuivrelapositionetladimensiondelafeuille : Private Sub Form1_Resize(ByVal sender As Object, ByVal e As [Link] Args)Handles [Link] [Link](" Ma largeur : " & [Link]) [Link](" Ma hauteur : " & [Link]) End Sub Private Sub Form1_Move(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link](" Je suis la position X :" & [Link].X ) [Link](" Je suis la position Y :" & [Link].Y) End Sub Nousobtenonslesinformationssuivantes : Je Je Ma Ma suis la suis la largeur : hauteur : position X :263 position Y :311 364 122
[Link],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 [Link] [Link] latailledelcran. Private Sub Form1_Move(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link](" [Link](" [Link](" sur [Link](" End Sub Je suis la position X :" & [Link].X) Je suis la position Y :" & [Link].Y) un cran de :" & [Link](Me).[Link]) par " & [Link](Me).[Link])
Cecodenouspermetdeconnatreladimensiondelcranquiaffichelapplication. Je suis la position X : 115 Je suis la position Y : 203 sur un cran de : 1024 par 768 Pourquelutilisateurpuissedplaceroumodifierlatailledelafentre,ildoitdisposerdesoutilsncessaires :
q
Pourpouvoirredimensionnerlafentre,cellecidoitdisposerduneborduredetypesizable affectesaproprit FormBorderStyle. Pourtredplace,[Link] 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 [Link].
[Link]
La proprit BackColor indique la couleur de fond utilise sur la fentre. Cette couleur sera galement utilise pour touslescontrlesquiseront,parlasuite,[Link] ForeColorindiquelacouleurdeslments [Link] 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 [Link] sonpostepouravoirdesboutonsdecouleurrosefluo,ilretrouveralammeapparencedansvotreapplication.
- 5-
Enfabriquantvousmmevotrecouleuravecunpeuderouge,unpeudevert,[Link] tout cela et obtenir la couleur finale, utilisez la mthodeFromARGB qui prend comme paramtre la quantit de rouge,laquantitdevert,[Link] sontdesvaleurscomprisesentre0et255,cettedernirevaleurcorrespondantunecouleurpure.
Laproprit [Link](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 [Link] fentre,elleestreproduiteenmosaque. Delammemanire,[Link], vousdevezaffecterlapropritTransparencyKeylavaleurdecettecouleur. Pourillustrerlutilisationpeuvidentedecetteproprit,nousavonsindiqudanslafentrecidessousquelacouleur blanchetaittransparente(onaperoitunepartiedelafentredepropritstraverslazonedetexte).
Laproprit Fontpermetdespcifierlescaractristiquesdelapolicedecaractres,utilisepourlaffichagedetexte, [Link]. Vous pouvez modifier les proprits directement dans la fentre de proprit, en droulant la proprit Font en cliquantsurlesigneplus(+)enfacedelaproprit.
- 6-
[Link]
LesapplicationsMDIsontconstituesdedeuxtypesdefeuilles :
q
lesfeuillesmres, lesfeuillesfilles.
[Link],[Link],onindiquera [Link] ajouterensuiteunefentrefille,ilconvientbiensrdaborddecrerlafentrepuisdelassocierunefentremre parsapropritMdiParent. VoiciuncodequicretroisfentresetlestransformeenfentresfillesMDI : Dim fenetre1 As Form Dim fenetre2 As Form Dim fenetre3 As Form fenetre1 = New Form() [Link] = "fenetre 1" [Link] = Me [Link]() fenetre2 = New Form() [Link] = "fenetre 2" [Link] = Me [Link]() fenetre3 = New Form() [Link] = "fenetre 3" [Link] = Me [Link]()
- 7-
[Link]([Link])
- 8-
[Link]([Link])
es diffrentes mthodes sont, en gnral, appeles par un menu de lapplication qui fournit la liste des C [Link] uvredanslasectionconsacreaux menus.
PourillustreruneautremanipulationpossibledesfentresMDI,nousallonslesutiliserpourraliseruneapplicationde [Link].
- 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 [Link] :
q
Prparonslafentreprincipale:
s
- 10 -
Pourlafentretexte:
s
Ilnenousresteplusmaintenantqucrirequelqueslignesdecodepourafficherlabonnefentrelorsduneslection [Link]. Private Sub TreeView1_AfterSelect(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] If Not IsNothing([Link]) Then Dim f As Form For Each f In [Link] [Link]() Next Select case [Link] case "gr" Dim fGr As Graphique fGr = New Graphique [Link] = Me [Link]() [Link] = [Link] [Link] = [Link]("../../" & [Link]) case "tx" Dim fTx As Texte fTx = New Texte [Link] = Me [Link]() [Link] = [Link] [Link]("../../" & [Link]) 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 [Link](propritMdiParent).Lafentreestensuite affiche en occupant toute la surface libre de la fentre mre Mdi (proprit Dock=[Link]).Ultimetape,nous affichonsledocumentdanslecontrleadapt,RichTextBoxouPictureBox.
- 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.
[Link]
Lespossibilitsdactiondelutilisateursursonclaviersontlimites : ilpeutsimplementfrapperunetoucheduclavier. [Link],cetteactionestdcomposeentroisvnementsdistincts : KeyDown Cetvnementseproduitlorsdelenfoncementdelatouche. KeyUp Cetvnementseproduitlorsdurelchementdelatouche. KeyPress Cetvnementseproduitlorsdelenfoncement,uniquementsilatouchecorresponduncaractreASCII. Danslesvnements KeyDownet KeyUp,unargumentdetype KeyEventArgsdonnedesinformationscomplmentaires surlvnement. Lespropritssuivantessontnotammentdisponibles :
q
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 [Link]) Handles [Link] If [Link] And [Link] And [Link] And ([Link] = Keys.F8) Then [Link] = UCase([Link]) End If End Sub UneautresolutionestpossibleenutilisantlapropritModifiersquiregroupeltatdestouches[Shift],[Ctrl]et[Alt]. Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As [Link]. [Link]) Handles [Link] If [Link] = [Link] + [Link] + [Link] And [Link] = Keys.F8 Then [Link] = UCase([Link]) End If End Sub Enfin,ladernirepossibilitconsisteutiliserlapropritKeyDataquiregroupeltatdestouches[Shift],[Ctrl],[Alt]et unetouchedefonction. Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As [Link]) Handles [Link] If [Link] = [Link] + [Link] + [Link] + Keys.F8 Then
- 1-
[Link] = UCase([Link]) End If End Sub Lvnement KeyPressnousinformesimplement,parlintermdiaireduparamtre e de type KeyPressEventArgs,surle [Link] saisissontnumriques,sicenestpaslecas,nousmettonsunbeep. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As [Link]) Handles [Link] If Not IsNumeric([Link]) Then Beep() End If End Sub Cette procdure informe simplement lutilisateurquilasaisiuncaractreinvalide,maislecaractreapparattoutde [Link] 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 [Link]) Handles [Link] If Not IsNumeric([Link]) Then Beep() [Link] = 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 [Link],ilconvientdindiquerlapropritKeyPreviewdelafentrequelle [Link] delafeuilleetvrifiersildoitsubirletraitement. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System. [Link]) Handles [Link] If [Link] Is TextBox1 Then If Not IsNumeric([Link]) Then Beep() [Link] = True End If End If End Sub
[Link]
[Link] 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
Pour ces trois vnements, un paramtre de type MouseEventArgs est fourni. Par lintermdiaire des proprits disponiblesdanscetteclasse,onobtientlesinformationssuivantes :
q
leboutonloriginedelvnementaveclapropritButton
- 2-
Lesdplacementsdelasourisgnrentquatrevnements :
q
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 [Link]) Handles [Link] Dim g As Graphics Dim crayon As Pen If [Link] = [Link] Then g = [Link]([Link]) crayon = New Pen([Link](rouge * 2.55, vert * 2.55, bleu * 2.55)) [Link](crayon, e.X, e.Y, 1, 1) End If End Sub Private Sub txtRouge_MouseWheel(ByVal sender As Object, ByVal e As [Link]) Handles [Link] rouge += [Link] / 120 If rouge > 100 Then
- 3-
rouge = 100 [Link] = "100%" ElseIf rouge < 0 Then rouge = 0 [Link] = "0%" Else [Link] = rouge & "%" End If End Sub Private Sub txtVert_MouseWheel(ByVal sender As Object, ByVal e As [Link]) Handles [Link] vert += [Link] / 120 If vert > 100 Then vert = 100 [Link] = "100%" ElseIf rouge < 0 Then vert = 0 [Link] = "0%" Else [Link] = vert & "%" End If End Sub Private Sub txtBleu_MouseWheel(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] bleu += [Link] / 120 If bleu > 100 Then bleu = 100 [Link] = "100%" ElseIf bleu < 0 Then bleu = 0 [Link] = "0%" Else [Link] = bleu & "%" End If End Sub Private Sub txtRouge_MouseHover(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link]() End Sub Private Sub txtVert_MouseHover(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link]() End Sub Private Sub txtBleu_MouseHover(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link]() End Sub End Class
[Link]
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-
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).
[Link]
Engnral,uneoprationdeDragandDropestdmarrelorsquelasourissedplaceaudessusduncontrleetle [Link],danscecas,quelutilisateurvientdaccrocherle contrlesasouris. Danslecode,[Link] mthodencessitedeuxparamtres :
q
Private Sub txtsource_MouseMove(ByVal sender As Object, ByVal e As System. [Link]) Handles [Link] If [Link] = [Link] Then [Link]([Link], [Link] + [Link]) End If End Sub
[Link]
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 [Link],ilfautdterminercequiestaccrochaucurseurdela [Link],ilfautdterminersilutilisateursouhaitefaireundplacement ouunecopiedellmentaccrochaucurseurdelasouris. Poureffectuerceladanslecode,danslvnementDragEnter,nousavonsnotredispositionleparamtre equiest une instance de la classe [Link] nosdcisions : AllowedEffect PermetdesavoirquellessontlesoprationsautorisesparlecontrlelorigineduDragandDrop. Data [Link] cette proprit,onpeutobtenirle typedinformationenappelantlamthodeGetDataPresentouobtenirlesdonnesenappelantlamthodeGetData. Effect Indique laction autorise par le contrle de destination. Cette proprit est utilise pour contrler lapparence du curseurdelasouris.
- 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. [Link]) Handles [Link] quest ce quil y a daccroch ? If [Link]([Link]) Then est ce que la touche Ctrl est enfonce If ([Link] And 8) = 8 Then curseur copie [Link] = [Link] Else curseur souris dplacement [Link] = [Link] End If End If End Sub
[Link]
Lorsque lutilisateur relche le bouton de la souris, lvnement DragDrop se produit sur le contrle de destination. Danscetvnement,[Link] dplacement, il faut aussi supprimer linformation du contrle source. Problme ! qui est le contrle source ? Nous [Link],dansunevariableunerfrenceversle contrleloriginedeloprationdeDragandDropaudbutdelopration. Dim ctrlSource As TextBox Private Sub txtsource_MouseMove(ByVal sender As Object, ByVal e As System. [Link]) Handles [Link] If [Link] = [Link] Then ctrlSource = txtsource [Link]([Link], [Link] + Drag [Link]) End If End Sub Private Sub txtdestination_DragDrop(ByVal sender As Object, ByVal e As System. [Link]) Handles [Link] rcupration de linfo est stockage dans le controle de destination [Link] = [Link]([Link]) vrification si cest une copie ou un dplacement If ([Link] And 8) 8 Then effacement du controle source [Link]() End If End Sub
- 6-
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 [Link] application,onaitbesoindesmmesinformations : unnomdefichierouvrir,unepolicedecaractrechoisir,[Link] nousviterdavoirrecrer,chaquefois,unenouvellebotededialogue,nousavonsnotredispositionunesriede botesdedialogueprdfinies.
[Link]
La bote de saisie permet de demander lutilisateur la saisie dune chane de caractres. Cette possibilit est [Link] :
q
Lafonctionrenvoieenretourunechanedecaractrescorrespondantautextesaisiparlutilisateur,siceluicivalidesa saisieparleboutonOKsinonellerenvoieunechanedecaractresvide. Dim resultat As String resultat = InputBox("Veuillez saisir votre nom", "identification", "votre nom")
[Link]
Lesbotesdemessagepermettentdepasseruneinformationlutilisateuretluidonnentlapossibilitderpondre parlintermdiairedesboutonsdecommandedelabotedemessage. Labotedemessageestdisponibleparlintermdiairedelamthodeshowdisponibledanslaclasse [Link] mthode prend de nombreux paramtres pour configurer la bote de dialogue. Le premier paramtre correspond au [Link] choisisparmidesconstantesprdfiniespourindiquerrespectivement :
q
Lesconstantesdisponiblessont :
q
pourlesboutons :
Constante
Signification
ENI Editions - All rigths reserved - 1-
pourlesicnes :
Constante
IconInformation
Signification
pourleboutonpardfaut :
Constante
DefaultButton1 DefaultButton2 DefaultButton3
Signification
Premierbouton Deuximebouton Troisimebouton
Pourobtenirlabotedemessagesuivante,
nousutiliseronslecodesuivant : Dim reponse As Integer [Link]("Voulez vous enregistrer en quittant lapplication", _ "Fin de programme", [Link], _ [Link],MessageBoxDefaultButton.Button1) Commenousposonsunequestionlutilisateur,nousdevonsrcuprersarponsepourdciderdelaconduitetenir dans lapplication. Pour cela, la mthode Show renvoie une valeur indiquant le bouton utilis pour fermer la bote de [Link],unesriedeconstantesestdfiniepouridentifierchaquecaspossible.
- 2-
Valeurrenvoye Boutonutilis
Ok Cancel Abort Retry Ignore Yes No BoutonOk BoutonAnnuler BoutonAbandonner BoutonRessayer BoutonIgnorer BoutonOui BoutonNon
Nouspouvonsensuitetesterlarponse : Select Case reponse Case [Link] ... Case [Link] ... Case [Link] ... End Select
[Link]
De nombreuses botes de dialogue sont dj dfinies au niveau du systme Windows luimme. Pour pouvoir les utiliserdansnosapplications,[Link] etlesutiliserdansuneapplication.
[Link]
Cette bote de dialogue nous permet la slection dun ou de plusieurs noms de fichier avec la possibilit de se [Link] [Link] uneinstancedansnotreapplication.
- 3-
Dim dlgOuvrir As OpenFileDialog dlgOuvrir = New OpenFileDialog() [Link] 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 [Link] ouvrir,vouspouvezconfierlabotededialoguelesoindevrifierque le nometlechemindaccssontcorrects. Les proprits CheckFileExistet CheckPathExist grent ces vrifications. Vous pouvez galement autoriser les slectionsmultiplesparlintermdiairedelapropritMultiselect. Enfin,pourafficherlabotededialogue,onutiliselamthodeShowDialog : [Link] = "c:\dos" [Link] = "selection du fichier ouvrir" [Link] ="tous|*.*|Images|*.bmp;*.gif;*.jpg|texte|*.txt" [Link] = "toto" [Link] = True [Link] = False [Link] = True [Link]() 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 [Link] [Link](nomFichier) Next
[Link]
Labotededialoguedenregistrementdefichierestsimilairelaprcdente,mis part la propritMultiselectqui disparat et les proprits CreatePrompt et OverwritePrompt permettant dafficher un message davertissement, si le nomdufichiersaisinexistepasouaucontrairesilexistedj.
[Link]
[Link]
- 4-
[Link] [Link] de dialogue est indiqu par la proprit RootFolder. Cette proprit reoit une des valeurs de lnumration [Link],parexemple, le rpertoire Mes documents. Si cette proprit est utilise la slection ne pourra se faire que dans un sous [Link] [Link] mthodeShowDialog : [Link] = [Link] [Link]() MsgBox([Link], , "Rpertoire slectionn") Ilfautgalementnoterquelechemindaccsretournparcettebotededialogueestuncheminabsolucommedans lexemplecidessous :
[Link]
La bote de dialogue de choix de couleur cre partir de la classe ColorDialog peut avoir deux configurations diffrentes. Uneversionsimpleoseuleslescouleursdebasesontdisponibles.
Uneversioncompltedanslaquellelutilisateurpourracrerdescouleurspersonnalises.
- 5-
La proprit Color permet dinitialiser la bote de dialogue avant son affichage et ensuite de rcuprer la couleur [Link] de dialogue complte ds son ouverture. Pour interdire laffichage des couleurs personnalises, on modifie la [Link],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() [Link] = True [Link] = True [Link] = [Link] [Link]() [Link] = [Link]
[Link]
- 6-
Laclassedebaseutilisepourlaslectiondunepoliceestlaclasse [Link] la police de caractres utilise pour initialiser la bote de dialogue ou, aprs fermeture, de rcuprer la police [Link]. 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 [Link]. 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,[Link] aperu nest pas suffisant, vous avez la possibilit dafficherun bouton Appliquer sur votre bote de dialogue par [Link] gestiondecetvnement,vouspouvezutiliserlaproprit Fontdelabotededialoguepourvisualiserleffetdela police actuellement slectionne sur votre texte. La variable faisant rfrence la bote de dialogue doit tre dclareaveclemotcl [Link] cesproprits :
Public Class TestPolice Inherits [Link] Dim WithEvents dlgFont As FontDialog Private Sub cmdPolice_click(ByVal sender As [Link], _ ByVal e As [Link])Handles [Link] dlgFont = New FontDialog() [Link] = True [Link] = True
- 7-
[Link] = True [Link] = 20 [Link] = 12 [Link] = True [Link] = True [Link]() [Link] = [Link] End Sub Private Sub dlgFont_Apply(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub End Class
[Link]
Parlintermdiairedecettebotededialogue,vousallezpouvoirconfigurerlesparamtresdemiseenpagedevotre document(marges,orientation...).
Cettebotededialogueestcrepartirdelaclasse [Link],cetteclasseabesoindedeux classes auxiliaires : la classePageSettings sert stocker la configuration de la mise en page, la classe [Link] etlesassocierauxproprits PageSettingset [Link] [Link]. Lutilisation des diffrentes rubriques de la bote de dialogue peut tre interdite par la modification des proprits suivantes :
q
LeschoixdelutilisateurserontensuitercuprslaidedespropritsPageSettingsetPrinterSettingsdelabote
- 8-
dedialogue. Voiciunexempledutilisation : Imports [Link] Public Class Form2 Inherits [Link] Private Sub TestPgSetup_Click(ByVal sender As [Link], ByVal e As System. EventArgs) Handles [Link] Dim configPg As PageSettings Dim configPrt As PrinterSettings configPg = New PageSettings() configPrt = New PrinterSettings() [Link]() = configPg [Link] = True [Link] = configPrt [Link]() [Link]("vous avez choisi dimprimer avec limprimante " _ & [Link] _ & " sur du papier " _ & [Link] _ & " en format " _ &(IIf([Link], "paysage", "portrait"))) End Sub End Class
[Link]
Aveccettebotededialogue,[Link] partirdelaclasse PrintDialog.
[Link] yaquelquechosedeslectionndansledocumentquevousvoulezimprimer. AllowSomePages autorise la slection dune page de dbut et dune page de fin pour limpression du [Link]. AllowPrintToFileindiquesilacasecocher [Link]
- 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() [Link] = configPrt [Link] = True [Link] = True [Link]() Select Case [Link] Case [Link] [Link]("vous avez demand limpression de tout Case [Link] [Link]("vous avez demand l impression de & [Link] & & [Link]) Case [Link] [Link]("vous avez demand limpression de End Select
la slection")
[Link]
Aprs ce bref aperu des botes de dialogue prdfinies, nous allons voir comment crer nos propres botes de [Link] suivantes :
q
Vouspouvezcrerunebotededialogueenmodifiantmanuellementcespropritssurunefentrenormale,ouchoisir aumomentdelajoutdunlmentauprojetloptionDialog.
- 10 -
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,[Link] en fait la mthode Showdialog qui va nous fournir la solution. Elle nous retourne une des valeurs de lnumration [Link], 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.
- 11 -
Utilisationdescontrles
Lescontrlesvontnouspermettredecrerlinterface entre [Link] quelutilisateurpourraagirsurlefonctionnementdelapplicationensaisissantdutexte,enchoisissantdesoptions,en lanantlexcutiondunepartiespcifiquedenotreapplication,etc. Les contrles seront disponibles, en [Link], par lintermdiairedunesriedeclassesquidevronttreinstanciesau coursdelexcutiondelapplication. Cesdiffrentesclassessontissuesdunehirarchiequicommenceparlaclassedebase [Link] les fonctions lmentaires des contrles (positions, dimensions...) puis une classe drive ajoute des fonctionnalits supplmentairesetainsidesuitejusqulaclassefinaledelahirarchie.
[Link]
Les contrles peuvent tre ajouts sur une fentre de deux manires diffrentes. La plus simple, et la plus rapide galement,[Link].
q
[Link], avecunetaillepardfautaucentredelafentre. [Link],lecurseurde lasourisvousindique,parlaprsencedunpetitsigneplus(+),quevousallezajouterquelquechosesurvotre feuille. La position laquelle vous lcherez le bouton de votre souris correspondra la position du coin [Link]. 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. [Link],les nomsutilisspardfautnesontpastrsexplicites. Lecodesuivantnedoitpasvousparatretrslimpide. [Link] = False [Link]() [Link] = True [Link] = False [Link] = True Ilestdoncprimordial,pourlalisibilitducode,derenommerlescontrlesdeprfrencedslacrationou,auplus tard,[Link] 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 [Link] VisualBasic.
Prfixe
cbo lst
Contrle
ComboBox Listbox
ENI Editions - All rigths reserved - 1-
Aveclerespectdecesconventionsetunpeudebonsens,lecodeestnettementplusclair : [Link] = False [Link]() [Link] = True [Link] = False [Link] = True
[Link]
Aprs avoir plac les contrles sur la fentre, il est bien sr possible de les repositionner ou de les redimensionner. Lorsquevousdplacezlasourisaudessusduncontrle,lecurseurchangedapparencepourindiquerlapossibilitde dplacerlecontrle.
[Link],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 [Link], _ ByVal e As [Link]) Handles [Link] [Link] = Rnd() * ([Link] - [Link]) [Link] = Rnd() * ([Link] - [Link]) 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-
[Link] 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 [Link] surlecarrcorrespondantetdplacerlasourisjusqucequelecontrleaitatteintlatailledsire.
- 3-
Vouspouvezgalementutiliserlesflchesduclavierenassociationaveclatouche[Shift]pourledimensionnementdes contrles. Leredimensionnementparlecodeutiliselamthode SetBoundsquipermetlafoisdefixerlapositionetlatailledu [Link]. Private Sub cmdMincir_Click(ByVal sender As [Link], _ ByVal e As [Link]) Handles [Link] [Link]([Link], [Link], [Link] - 5, [Link] - 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, [Link] duncontrle,vouspouvezutiliserlaproprit [Link],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-
Vous pouvez galement indiquer quun contrle doit adapter une ou plusieurs de ces dimensions celle de son [Link],vousutilisezlapropritDockducontrleenindiquantsurquelleborduredesonconteneurnotre contrlevaadapterunedesesdimensions. Parexemple,nouspouvonsplaceruncontrlePictureBoxendemandantlamarrerlabordurebassedelafentre.
NotrePictureBoxsadapteautomatiquementlalargeurdelafentreetrestecollesabordurebasse.
[Link]
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.
- 5-
Vousdevezensuitecliquersurlescontrles,danslordredanslequelvousvoulezquelefocussoitpass. Lordresuivantsemblebeaucouppluslogiquepourcettebotededialogue.
[Link]
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-
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 [Link]. Maintenantquenoussavonsutiliserlescontrlesdansuneapplication,nousallonsexaminerdansledtaillesplus utiliss.
- 7-
[Link]
[Link] [Link] Controletdecefait,hritentdun bonnombredepropritsdemthodesetdvnements. NousallonsdonctudierleslmentslesplusutilesdelaclasseControl.
[Link]
[Link]
Les proprits Left, Top, Width, Height permettent le positionnement des contrles. Ces proprits peuvent tre modifiesindividuellementetacceptentdesvaleursdetypeInteger. Ilestdoncpossibledansnotrecodedutiliserlasyntaxesuivante : [Link] = 100 [Link] = 50 [Link] = 150 [Link] = 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,[Link] peuventtreremplacespar : [Link] = New Point(100, 50 [Link] = 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 [Link] uneseuleligne : [Link] = New Rectangle(100, 50, 150, 50) Lamthode SetBoundspermetgalementdemodifierlespositionsetdimensionsdescontrlessansavoircrerde nouvelleinstancedelaclasseRectanglemaisenmodifiantcelledjassocieaucontrle. [Link](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,[Link] parlecode,ilsuffitdyaffecterunedesvaleursdfiniesdanslesnumrationsAnchorStyleetDockStyle.
- 1-
Jusqu prsent, les positions avec lesquelles nous avons travaill taient des positions exprimes par rapport au [Link],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 : [Link](Controle/fenetre :) [Link]([Link]) Dim p As Point p = [Link]([Link]) [Link](Controle/ecran :) [Link](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 [Link], cestdireenpartantdescoordonnescran,onobtientbienlammevaleur : [Link]("controle / fenetre partir de lcran" & [Link](p).ToString) Rsultat controle / fenetre partir de lcran{X=107,Y=72}
[Link]
La couleur de fond du contrle peut tre modifie par la proprit BackColor tandis que la couleur du texte du contrleestmodifieparlapropritForeColor. Onpeutaffectercespropritsdesvaleursdfiniesdanslespacedenom [Link] couleursprdfiniesdansVisualBasic. [Link] = [Link] Onpeutgalementutiliserlesconstantesdfiniesdanslespace de nom [Link] une des couleurs dfinies au niveau du systme luimme. Lintrt, dans ce cas, est que votre application va sadapterenfonctiondelaconfigurationdelamachinesurlaquelleellefonctionnera. [Link]=[Link] Latroisimesolutionconsisteeffectuerlemlangedecouleurvousmme,enutilisantlafonction FromArgb et en spcifiantcommeparamtrelaquantitdechacunedescouleursdebase(Rouge,Vert,Bleu).
- 2-
[Link] = [Link] (127, 0, 127) [Link],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. [Link] = New Font([Link], 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. [Link] nestpasassezgrandepourrecouvrirlecontrle,elleestreprsenteenmosaque : [Link] = New Bitmap("[Link]")
Ces curseurs sont rangs dans une collection Cursors et peuvent tre utiliss directement en les affectant la propritCursorducontrle. [Link] = [Link] Si,parmiceuxci,aucunnevousconvient,vouspouvezutiliseruncurseurpersonnalisencrantuneinstancedela classeCursoretenlaffectantlapropritCursorducontrle. [Link] = New Cursor("h_nodrop.cur") Ladtectiondelentreetdelasortiedelasourissurlecontrleetlamodificationducurseurenconsquenceest greautomatiquementparlecontrleluimme. ommepourlapolicedecaractre,ilestpossiblederestaurerlecurseurpardfautenappelantlamthode C ResetCursor.
[Link]
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 [Link]) Handles [Link] [Link] = [Link] [Link]() End Sub
[Link]
Les contrles placs sur une feuille peuvent tre masqus en modifiant la proprit Visible ou dsactivs en modifiantlaproprit [Link],lecontrleesttoujoursvisiblemaisapparatavecunaspectgrispour indiquerlutilisateurquececontrleestinactifpourlemoment. [Link] = False
[Link] 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. [Link]() Poursurveillerlepassagedufocusduncontrlelautre,quatrevnementssontvotredisposition :
q
Parexemple,pourbienvisualiserquuncontrlealefocus,onpeututiliserlecodesuivantquimodifielacouleurdu textelorsquelecontrlereoitouperdlefocus : Private Sub TxtNom_GotFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles [Link] [Link] = [Link] End Sub Private Sub TxtNom_LostFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles [Link] [Link]() 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 [Link],lvnement Validatingestdclenchpour [Link](enfonctiondescritresquenous avonsfixs),nouspouvonsbloquerlepassagedufocusversunautrecontrleenmodifiantlaproprit Cancelde lobjet [Link],lefocusrestesurlecontrlepourlequellasaisie [Link],silasaisieestcorrecte,lvnement Validatedestdclenchsurlecontrleetlefocus sedplacesurlecontrlesuivant.
- 4-
Parexemple,poursaisirunnumrodetlphone,nouspouvonsvrifierqueseulesdesvaleursnumriquesontt [Link],modifionslacouleurdutexteetbloquonslepassagedufocussurun autrecontrle. Private Sub TxtTel_Validating(ByVal sender As Object, ByVal e As System. [Link]) Handles [Link] If Not IsNumeric([Link]) And [Link] Then Beep() [Link] = [Link] [Link] = True End If End Sub Private Sub TxtTel_Validated(ByVal sender As Object, ByVal e As System. EventArgs) Handles [Link] [Link]() End Sub [Link] HasChildren nous permet de savoir si des contrles sont placs dans notre conteneur. Si cest le cas, la collection Controls [Link] dunconteneurlorsquelefocusestplacsurlundentreeux. Private Sub GroupBox1_Enter(ByVal sender As Object, ByVal e As [Link]) Handles [Link] If [Link] Then Dim x As Object For Each x In [Link] [Link] = [Link] Next End If End Sub Private Sub GroupBox1_Leave(ByVal sender As Object, ByVal e As System. EventArgs) Handles [Link] If [Link] Then Dim x As Object For Each x In [Link] [Link]() Next End If End Sub Lopration inverse est galement possible cestdire, qu partir dun contrle, nous pouvons rcuprer les [Link], 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 [Link]) Handles [Link] If [Link] Then Dim x As Object For Each x In [Link] [Link] = [Link] Next End If End Sub Maintenant que nous avons explor les proprits communes aux diffrents contrles disponibles, nous allons les tudierunparunenexplorantleursspcificits.
[Link]
[Link]
LecontrleLabelestutilispourafficher,surunformulaire,[Link]
- 5-
essentiellement fournir une lgende des contrles qui nen possde pas (zones de texte par exemple, liste droulante...).Danscecas,ilpermettragalementdefournirunraccourciclavierpouratteindrelecontrle. Letexteaffichparlecontrleestindiquparlaproprit [Link] 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,[Link] BorderStyle, enutilisantlunedestroisvaleursdisponibles.
Vous avez aussi la possibilit dindiquer la position du texte dans le contrle par lintermdiaire de la proprit [Link],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 [Link],vousindiquez,parlintermdiairedelaproprit ImageList, dansquelcontrlevousallezchercherlimage, et par la proprit ImageIndexquelendroitellesetrouvedansle contrle [Link] ImageList,laproprit [Link] 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-
[Link]
LecontrleLinkLabelhritedetouteslescaractristiquesducontrleLabeletajoutesimplementdesfonctionnalits delienstyle [Link] Labelgrentlesdiffrentsparamtresdu lien. La proprit LinkArea indique quelle portion du texte activera le lien. Cette proprit peut tre modifie, par lintermdiairedelafentredeproprits,avecunpetitutilitairedanslequelvousdevezslectionnerlaportionde texteconstituantlelien.
Lesquatrevaleurspossiblespermettentrespectivement :
q
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 [Link], ByVal e As [Link]) Handles LinkLabel1.
- 7-
LinkClicked [Link](" http ://[Link] ") [Link] = True End Sub Ouencore,laffichagedunenouvellefeuilledansnotreapplicationcommedanslexemplesuivant : Private Sub LienMicrosoft_LinkClicked(ByVal sender As [Link], ByVal e As [Link]) Handles LienMicrosoft. LinkClicked Dim feuille As dlgPerso feuille = New dlgPerso() [Link]() [Link] = True End Sub
[Link]
Le contrle StatusStrip est gnralement utilis pour prsenter des informations lutilisateur, concernant le [Link] tre affiches sous forme de texte, de barre de progression, de menu ou de bouton de commande associ un [Link].
Chaquelmentajoutsurlecontrle [Link] lments pouvant tre utiliss pour la construction dune StatusStrip sont trs semblables celles des contrles [Link],llmentToolStripStatusLabelestpratiquementidentiqueaucontrleLinkLabel.
[Link]
[Link],ilsera [Link] 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 [Link],dsquuncontrle ToolTipestdisponiblesurunefeuille,uneproprit ToolTipestajoute chacundescontrles,permettantainsidespcifierletextedelinfobulleassocieaucontrle.
- 8-
Leschanesdecaractresassocieschaquecontrlepeuventgalementtreindiquesparlintermdiaireducode, enappelantlamthodeSetToolTipetenindiquantcommeparamtre,lenomducontrleetlachanedecaractres, quiluiestassocie. [Link](RadioButton3, " Couleur bleu pour le texte ") Cette technique permet de conserver des lgendes relativement courtes pour les contrles, tout en fournissant suffisammentdinformationssurlutilisationdelapplication.
[Link]
Ce contrle permet dindiquer facilement lutilisateur des problmes sur les donnes quil a saisies, sur un [Link],ilintervientlorsdelaphasedevalidationdesdonnesduformulaire,enaffichantenfacede chaque contrle une petite icne afin dattirer lattention de lutilisateur. Des informations supplmentaires peuventtrefourniesparuneinfobulleassocieaucontrleErrorProvider. UnmmecontrleErrorProviderpeuttreutilispourtouslescontrlesdunformulaire. Lactivationducontrle ErrorProviderpeutseffectuerlafermetureduformulairelorsquelutilisateurcliquesurle bouton OK,maisilestgalementpossibledesurveillerla saisieaufuretmesureoelleesteffectueengrant [Link] [Link],danscecas,vrifierimmdiatementlavaleursaisiedanslecontrleetragirenconsquence en affichant notre contrle ErrorProvider. Pour cela, nous appelons la mthode SetError en spcifiant le nom du [Link] pasderreur,ilfautrinitialiserlachanepourfairedisparatrelicneducontrleErrorProvider. Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System. [Link]) Handles [Link] If Not IsNumeric([Link]) Then [Link](TextBox1, " Valeur numrique Obligatoire ") Else [Link](TextBox1, "") End If End Sub
[Link]
Cecontrleestprincipalementutilispourafficherdesinformationssurlefonctionnementdunprocessussexcutant [Link] Iconducontrle [Link].
En grant lvnement DoubleClick du contrle, vous pouvez afficher une bote de dialogue permettant la configurationduprocessusassociaucontrle.
- 9-
Private Sub IconService_DoubleClick(ByVal sender As Object, ByVal e As [Link]) Handles [Link] Dim dlg As ConfigService dlg = New ConfigService [Link]() End Sub Il est galement possible dassocier un menu contextuel, en renseignant la proprit ContextMenuStrip. Ce menu peut,parexemple,contrlerlefonctionnementduprocessusauquelestassocilecontrle.
[Link]
Lecontrle [Link] loutilHtml Help Workshop,[Link],nousutiliseronsun fichierdaideexistantsurlesystme : lefichierC:\WINDOWS\Help\[Link] 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 [Link] et configure le systme daide, pour que cette rubrique soit affiche automatiquementlorsquelatouche[F1]estutilise.
[Link]
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 [Link] ProgressBarestcontrlparsaproprit [Link] disponibles : Continuous Laprogressionestafficheparunebarrebleuepleine. Blocks Laprogressionestafficheparunesriedepetitsrectangles.
- 10 ENI Editions - All rigths reserved
Modifierdirectementlaproprit [Link],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 [Link].
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. [Link] = 0 [Link] = 23 [Link] = [Link] [Link] = 0 [Link] = 59 [Link] = [Link] [Link] = 0 [Link] = 59 [Link] = [Link] [Link] = 500 [Link] = True End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link] = [Link] [Link] = [Link] [Link] = [Link] End Sub End Class
[Link]
ENI Editions - All rigths reserved - 11 -
[Link]
[Link] poursaisirdutextesuruneouplusieurslignes.Lataillemaximaledutextevariede200032000caractres,suivant laconfigurationducontrle(simpleligneoumultiligne).Lecontrleestgalementcapabledegrerlaslectionde texte et les oprations avec le pressepapiers. De nombreuses proprits et mthodes sont disponibles pour [Link] [Link] [Link] Autosizepermetdedemanderau contrleTextBoxdeseredimensionner,[Link] [Link] CharacterCasingautoriselecontrlemodifiertouslescaractressaisis soitenminusculessoitenmajuscules.
Laproprit Linespermetdercuprerletextesaisi,[Link] caractres qui contient autant de cases quil y a de lignes. Elle na dintrt que si le contrle est configur pour [Link],ilfautgalement prvoirlapossibilitdefairedfilerletexte,[Link] diffrentes possibilits permettront davoir une barre de dfilement horizontale, verticale ou les deux. Attention cependantcarlabarrededfilementverticaleneseravisiblequesilaproprit WordWrapestpositionnesur False [Link] contre,danscecaslesretourschariotajoutsautomatiquementnesontpasinsrsdansletexte.
Danscetexemple,laproprit Linescontiendradeuxlmentscarlepremierretourchariotestsimplementajout parlecontrlepourlaffichage. Lines(0)>Ilfaitbeauaujourdhuisurlargionnantaise Lines(1)>Pourvuqueacontinue [Link] multiligne,[Link] utilise lorsque lon utilise le contrle TextBox pour la saisie dun mot de passe. Dans ce cas, la proprit PasswordCharindiquelecaractreutilislaffichage,[Link],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 [Link] letextequelonveutremplacerlaidedesproprits SelectionStartet SelectionLength,puisindiquerletextede remplacement avec la proprit SelectedText. Le texte remplac et le texte de remplacement ne doivent pas forcmentavoirlammetaille. [Link] = 39 [Link] = 8 [Link] = "Ouest"
[Link](39,8)
- 12 -
[Link] = "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 [Link] [Link]() 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,[Link] 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][Link] [Link] 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 [Link], ByVal e As [Link]) Handles [Link] [Link] = Rnd() End Sub
[Link]
Cecontrleestuneamliorationducontrle TextBoxcarilpermetdevrifierautomatiquementquelesinformations [Link] Maskdtermineleformatdesinformations [Link],permetdechoisirunmasque existantoudeconfigurervotrepropremasque.
- 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
[Link]
Lecontrle RichTextBoxpermetlaffichage,[Link] mmesfonctionnalitsquelecontrleTextBoxmaisilestcapabledegrerdespolicesdecaractrediffrentes,des
- 14 -
couleursdiffrentes,desimages,[Link] [Link]. Chargementetenregistrementdefichier Lesmthodes LoadFileet [Link] 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. [Link]([Link], [Link]) 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. [Link]([Link], [Link]) Ajoutdetexte LecontrleRichTextBoxgresoncontenugrcedeuxproprits:
q
la proprit Text qui, comme pour les autres contrles, dfinit les informations affiches dans le contrle. Cestletextebrutquieststockdanscetteproprit. Laproprit Rtfcontientelleaussiletexteaffichparlecontrlemaisellecontientenpluslesinformations concernantlaprsentationdutexte.
PourajouterdutexteuncontrlenouspouvonsdfinirlapropritTextoulaproprit [Link],il [Link] [Link]. [Link] delachaneajouterdoittredfiniaupralableparlintermdiairedespropritsdelaslection. [Link] [Link] nest pas possible de modifier les caractristiques dune police existante puisque ses proprits sont en lecture seule.
Lasyntaxesuivanteestcorrectepourlamodificationdescaractristiquesdelapoliceexistante. [Link] = New Font([Link], [Link] + [Link]) LescouleursdutexteetdufondsontdterminesparlespropritsSelectionColoretSelectionBackColor. [Link] = [Link] [Link] = [Link] Lalignement du texte est reprsent par la proprit SelectionAlignment laquelle vous devez affecter une des valeursdelnumrationHorizontalAlignment. [Link] = [Link]
[Link]
- 15 -
[Link]
Lecontrle Buttonestprincipalementutilis,dansuneapplication,[Link] peuttrelexcution [Link] jusqu prsent, le libell du bouton est modifiable par la proprit Text du contrle. Cette proprit Text peut contenirun&[Link], 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 [Link],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.
[Link]
La majorit des applications disposent [Link] de ces menus, lutilisateurpourra [Link] [Link],unpetittrianglectdulibell [Link] 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 [Link] :
q
danslazonerserveauxcontrlesinvisibles directementsurlafentre,laplacedunebarredemenustandard.
- 16 -
Cest partir de cet endroit que vous allez pouvoir composer le menu. Le concepteur de menu vous propose les diffrenteszonesdanslesquellesvouspouvezsaisirlesinformationsconstituantlemenu.
Ilrestemaintenantconfigurerlespropritsdechacundeslmentsdemenu. Regardonslespropritslesplusintressantes : Text Contientlelibelldumenu. Visible Permetdemasquerunlmentdemenu. Enabled [Link]. Checked Indiquesillmentdemenuestcochounon. CheckOnClick
- 17 -
LapropritShowShortCutKeysautoriselaffichageduraccourcictdulibelldumenu. [Link],parexemple,unebarredoutilsestgalementdisponible,les actionsralisesaveccellecidoiventbiensragirsurltatdumenucorrespondantetlarciproquedoitaussitre vraie. Private Sub btnGras_Click(ByVal sender As [Link], ByVal e As System. EventArgs) Handles [Link] [Link] = [Link] End Sub Private Sub btnItalique_Click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub btnSouligne_Click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub MnuGras_Click(ByVal sender As [Link], ByVal e As System. EventArgs) Handles [Link] [Link] = [Link] End Sub Private Sub MnuItalique_Click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub MnuSouligne_Click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Dans certains cas, il est ncessaire dajouter dynamiquement des lments pendant le fonctionnement de lapplicationpourajouterparexemplelalistedesderniersfichiersutilissdanslapplication. Lasolutionconsisteajouter,lacollectionDropDownItems,unnouvellmentenutilisantlamthodeAdd. [Link]("[Link]") 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 [Link], ByVal e As [Link])
- 18 -
End Sub Puis, au moment dajouter llment de menu, nous devons indiquer que notre procdure sera responsable de la gestiondesvnementsClicksurlemenu. [Link]([Link], Nothing, New [Link] (AddressOf FichiersRecent_Click))
[Link]
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 [Link],chaquecontrle,lemenucontextuelcorrespondant parlintermdiairedelapropritContextMenuStrip.
Laffichagedumenuseferaautomatiquementlorsquelutilisateurferaunclicdroitsurlecontrlecorrespondant.
[Link]
[Link] 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.
[Link] 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 [Link] [Link].
[Link] a,biensr,[Link]
- 19 -
lcrirevousmmecommepourtouslesautrescontrlesdelinterfacedelapplication.
[Link]
Lebutdececontrleestdefaciliterlaconceptiondunefentrelorsquecellecidoitcontenirplusieursbarresdoutils. CecontrleestgnralementplacsurunefentreaveclapropritDockpositionnesurFillpouroccupertoutela surfacedisponibledelafentre. [Link] [Link],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 [Link].
[Link]
- 20 ENI Editions - All rigths reserved
[Link]
LecontrleCheckBoxestutilispourproposerlutilisateurplusieursoptions,parmilesquellesilpourraenchoisirune [Link] CheckBoxpeutengnralprendredeuxtats : cochlorsqueloptionestslectionneou [Link] case cocher dans ce cas, elle apparat en gris. Ltat de la case cocher peut tre vrifi ou modifi par la proprit [Link] pourfonctionneravectroistatspossibles,enpositionnantlapropritThreeStatesurTrue,lapropritCheckState indiqueltatdelacasecocherparlintermdiairedunedesvaleursdfiniesdanslnumration.
Commepourlesautrescontrles,laproprit [Link] 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 [Link] lacasecocher,enmodifiantlaproprit AutoChecksur [Link],vousdevezgrerlvnementClicket modifierparlecode,danslagestiondecetvnement,[Link] code,ciaprs,permetdemodifierlescaractristiquesdelapolicedecaractreduncontrleTextBox. Danscetexemple,noustravaillonsaveclvnement CheckedChangedducontrle CheckBoxquinousindiquechaque changementdeltatdelacasecocher.
Private Sub chkGras_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] Dim style As Integer style = [Link] If [Link] Then style = style Or [Link] Else style = style And Not [Link] End If [Link] = New Font([Link], style) End Sub Private Sub chkItalique_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] Dim style As Integer style = [Link] If [Link] Then
- 21 -
style = style Or [Link] Else style = style And Not [Link] End If [Link] = New Font([Link], style) End Sub Private Sub chkSouligne_CheckedChanged(ByVal sender As [Link], As [Link]) Handles [Link] Dim style As Integer style = [Link] If [Link] Then style = style Or [Link] Else style = style And Not [Link] End If [Link] = New Font([Link], style) End Sub ByVal e
[Link]
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 [Link], By Val e As [Link]) Handles [Link] If [Link] Then [Link] = [Link] End If End Sub Private Sub optDroite_CheckedChanged(ByVal sender As [Link], By Val e As [Link]) Handles [Link] If [Link] Then [Link] = [Link] End If End Sub Private Sub optCentre_CheckedChanged(ByVal sender As [Link], By Val e As [Link]) Handles [Link] If [Link] Then
- 22 -
Private Sub optNoir_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub optVert_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub optBleu_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Nous avons quelques soucis pour le fonctionnement de notre application, car il nest pas possible de choisir une [Link] RadioButtontantconusdetellesorte quils ne puissent pas y en avoir deux slectionns simultanment dans un mme conteneur. La solution notre [Link] verronsaveclescontrlesGroupBoxetPanel.
[Link]
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,[Link],leslmentsdelalistesontdeschanesdecaractresmais peuvent tre nimportequeltypedobjet. Par dfaut, le contrle ListBox propose les lments sous forme de liste avecundfilementvertical.
LapropritMultiColumnpositionnesurTruepermetdavoirundfilementhorizontaldelaliste.
davoirunlmentdelalistepartiellementvisible.
SicettepropritestpositionnesurTrue,lalisteseredimensionnepournafficherquedeslmentscomplets. Leslmentsdelalistesontgrssousformedecollection,[Link] lmentslalisteenutilisantlamthodeAdddelacollectionetenpassant,commeparamtre,lobjetinsrerdans [Link],lobjetinsrestunechanedecaractresmaisnimportequelautretypedobjet [Link] ToStringpourpermettrelaffichagepar lecontrleListBox. Public Class couleur Public nom As String Public valeur As [Link] Public Sub New(ByVal n As String, ByVal v As [Link]) nom = n valeur = v End Sub Public Overrides Function toString() As String Return nom End Function End Class
... ... [Link](New couleur("rouge", [Link])) [Link](New couleur("vert", [Link])) 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 : [Link](1, New couleur(Jaune,[Link])) Leffacement dunlmentdelalisteseffectue avec la mthode RemoveAt en passant comme paramtre lindexde llmentsupprimer. [Link](0) OnpeutaussieffectuerunnettoyagecompletdelalisteaveclamthodeClear. [Link]() 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 -
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 [Link],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 [Link] [Link](o) Next Lefaitdestockerdesobjetsdanslacollection Itemsnouspermetdavoiraccs,parlintermdiairedelaproprit SelectedItem,[Link],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 [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub
[Link]
Le contrle NumericUpDown est lassociation dune zone de texte et de deux boutons. Ces deux boutons servent [Link] [Link] lesproprits Minimum et [Link] [Link] peuvent tre des valeurs dcimales. Le format daffichage peut tre modifier par la proprit DecimalsPlaces qui [Link] 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 [Link]) Handles [Link] [Link] = [Link](25 * ([Link] - 15), 0, 25 * (25 - [Link])) End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link] = 1 [Link] = 0.1 [Link] = 25 [Link] = 15 [Link] = 15 End Sub
- 25 -
[Link]
[Link] 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 [Link]. Deuxpas dincrmentationsontgalementdisponiblesaveclesproprits SmallChangeet [Link] SmallChangeestutilisepourincrmenteroudcrmenter lavaleurlorsdelutilisationdesflchesdedplacementdu [Link] [Link] curseurdupotentiomtreestdplaclaidedelasouris,laproprit Valuecorrespondlemplacementducurseur. Aucundesdeuxpasdincrmentation [Link],desrepres [Link].
[Link]
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 [Link] aveclecontrle ListboxsontliesauxslectionsmultiplesquisontimpossiblespourcecontrleetlapropritWrap permettantleparcoursdelalistedemanirecirculaire.
[Link]
Cecontrleestuneamliorationducontrle [Link] [Link] [Link] coches indpendamment de la slection des lments. La rcupration des cases coches est possible par [Link]. For Each elt In [Link] [Link]([Link]) 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 [Link] - 1 If [Link](i) Then [Link]([Link](i)) End If Next Laproprit CheckOnClickdterminesilactivationouladsactivationdelacasecochersefaitsurlepremierclic dunlmentdanslaliste(true)ousiundoubleclicestncessairepourchangerltatdelacasecocher(false).
[Link]
Lecontrle ComboBoxestlassociationdun contrle ListBoxetdun contrle [Link],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 -
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 [Link],parexemple,crireducodepour quelalistesoitdrouledsquelecontrlereoitlefocus. Private Sub ComboBox1_GotFocus(ByVal sender As Object, ByVal e As System. EventArgs) Handles [Link] [Link] = True End Sub Ilnestpaspossiblederaliserdesslectionsmultiplesaveclecontrle [Link] laproprit [Link] mme si [Link] cas, la proprit SelectedIndex est gale lindex de llment slectionn. Si lutilisateur a saisi du texte directement,cettepropritestgale1.
[Link]
Le contrle TreeView permet la prsentation dinformations, sous forme dune arborescence identique la [Link] 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 [Link],parun diteurspcifiqueaccessibleparlafentredeproprits.
- 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 [Link](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 [Link] uden instanciant la classe TreeNodeetenindiquant,danslappel du constructeur de la classe, la lgende affiche sur le n [Link]. 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 : [Link](1).[Link](noeud) Vouspouvezaussisupprimerunn udparlecode,enutilisantlamthodeRemoveAtdelacollectioncorrespondante. Parexemple,poursupprimerlaPeugeot206,nousutiliseronslecodesuivant : [Link](0). [Link](0) Lorsque lon travaille avec le contrle TreeView, on a frquemment besoin de savoir sur quel lment du contrle lutilisateuracliqu(pourafficherlescaractristiquesduvhiculedansnotrecas).
- 28 -
Danslvnement AfterSelect du contrle TreeView, on dispose, par lintermdiaire du paramtre e, une rfrence surlen [Link] Textdecetlmentnouspermetdoncdidentifierlen ud ducontrleTreeViewetderagirenconsquence. Private Sub TreeView1_AfterSelect(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] Select Case [Link] Case "Peugeot" [Link]("Peugeot") Case "Renault" [Link]("Renault") Case "Opel" [Link]("Opel") End Select End Sub
[Link]
Cecontrlefournitlapossibilitdeprsenterdesinformations,lutilisateur,dequatrefaonsdiffrentescommele permetlevoletdroitdelexplorateurdeWindows.
Comme pour le contrle TreeView, ce contrle dispose dune collection Items stockant les informations afficher. Cettecollectionpeuttreremplieparunditeurspcifiqueaccessibledepuislafentredepropritsdevb.
- 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. [Link] gestiondescolonnes.
[Link] [Link]. Pourchaquevhiculeafficher,ilfautinsrerunlmentdanslacollection [Link] deceslments,lapropritSubItemsdoitcontenirlesinformationsutilisespourlaffichageenmodedtail(letype duvhicule,sonprixetsapuissance). IlfautensuiteajoutertroiscolonneslapropritColumnsducontrleListView(type,prix,puissance). Pour terminer la configuration, les proprits LargeImageList et SmallImageList indiquent respectivement les contrlesImageListoserontrcupreslesimagespourlaffichageenmodeGrandesIcnesouPetitesIcnes. LetypedeprsentationdelaffichageestmodifiableparlapropritView :
- 30 -
Private Sub optGrande_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub optPetites_CheckedChanged(ByVal sender As [Link], ByVal eAs [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub optListe_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub Private Sub optDetail_CheckedChanged(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = [Link] End Sub
[Link]
[Link]
Lecontrle [Link] 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 [Link],lesunsdesautres,lorsquilsdoiventfonctionnerde manireindpendante.
[Link]
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.
- 31 -
[Link]
Lecontrle [Link] contrleestlacrationdebotededialogueplusieursonglets. La proprit principale TabPages contient la liste de toutes les pages associes au contrle. Un diteur spcifique nouspermetlamanipulationdecespages.
Chaqueongletestconsidrcommeunepage,[Link], 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 [Link],pourinterdirelutilisationdelongletCouleur : [Link](1).Enabled = False Comme pour beaucoup dautrescontrles,uneproprit ImageList permet dassocierdesimagesbitmapchacun desonglets,parlintermdiairedelapropritImageIndexdechaqueonglet.
[Link]
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 [Link] TreeViewdanssapartie gaucheetunensembledecontrlesdanslapartiedroitepermettantlamodificationdellmentslectionndansle [Link](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 [Link] possible dinterdire le redimensionnement dune seule zone avec la proprit FixedPanel. Dans ce cas, si les dimensionsduconteneurducontrle(lafentre)sontmodifies,[Link] Orientationdterminebiensrlesensdedcoupageducontrle.
[Link]
Lecontrle [Link] delavaleurdelapropritFlowDirection,lescontrlesserontdisposs :
q
- 33 -
[Link]
[Link] nous venant lesprit consiste grer un des vnements survenant pendant le dimensionnement de la fentre, Resize, [Link] esttrslourdemettreen [Link],plusefficaceestde [Link] [Link] peudelammemanirequuntableauenlangageHTML. [Link] lignes et deux colonnes. Pour modifier cette disposition il suffit simplement dactiver les options du contrle en cliquantsurlapetiteflchesituesurlecoinsuprieurdroitpuisenutilisantloptioncorrespondante.
ChaqueligneetcolonnepeutgalementtremodifieaprssacrationenchoisissantloptionModifierlesligneset lescolonnes. [Link]. 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 -
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 [Link].
[Link]
[Link]
Le contrle PictureBox est utilis pour afficher des images dans une application. Plusieurs formats de fichiers sont prisenchargeparlecontrle :
q
LesfichiersBitmap(*.bmp)
- 35 -
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. [Link] = [Link]("[Link]") Poureffaceruneimageparlecode,vouspouvezutiliserlecodesuivant : [Link] = Nothing Par lintermdiaire de la proprit SizeMode, vous pouvez choisir comment le contrle et limage vont adapter leur taillerespective : normal [Link]. StretchImage [Link],lersultatest parfoisdcevant. AutoSize Lecontrlesadaptelatailledelimage. CenterImage Lesdeuxlmentsconserventleursdimensionsmaislimageestcentreparrapportaucontrle.
- 36 ENI Editions - All rigths reserved
[Link]
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 [Link],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 [Link] une collection dans laquelle les images [Link]. 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.
- 37 -
[Link]([Link]([Link])) De la mme faon, on peut supprimer, par le code, une image dj prsente dans la liste en utilisant la mthode RemoveAtetenindiquantlindexdellmentsupprimer. [Link](6) Lamthode Clearpermetdevidercompltementlacollection Imagessupprimantainsitouteslesimagesducontrle ImageList. Pourtouteslesimagesdelaliste,vouspouvezgalementindiquerparlintermdiairedelaproprit ColorDepthle nombredecouleursgresparlecontrle [Link] [Link] sera identique pour toutes les images places dans le contrle. Les images insres seront ventuellement agrandiesoudiminuespoursadaptercettetaille(lesrsultatssontparfoisdcevants).
[Link]
[Link] DateTimePickerpermetlasaisiedunedatealors quelecontrleMonthCalendarautoriselasaisieduneplagededates.
[Link]
[Link] (avecquandmmeunevrificationdesinformationssaisies),soitbeaucoupplusfacilementenaffichantlecalendrier enutilisantleboutonsitucotdelazonedetexte(commepouruneComboBox).
La proprit Value permet de rcuprer la date saisie ou au contraire de spcifier la date slectionne sur le [Link],lecalendrierestinitialisavecladatedujour.
[Link]
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 -
Laproprit MonthlyBoldedDatespermetdindiquerlesjoursquiapparatrontengraschaquemois(lejourovous avezunefacturepayerparexemple!). [Link] MaxSelectionCount indiquelenombredejoursmaximaldelaslection(pardfaut,7).Ilresteunproblmecependant,carilnyapasde [Link] slectiondoiventtretousvisibles,[Link] [Link] formatducalendrier. Parexemple,uneapplicationutilisepourgrerunplanningdevacancespourraitutiliserlaconfigurationsuivante : indique les jours fris pour affichage en gras [Link] = 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 [Link] = New [Link](3, 1) [Link] = New [Link](40, 128) limite les possiblits de dplacement du 1 Juin au 31 Aout 2002 [Link] = New Date(2006, 6, 1, 0, 0, 0, 0) [Link] = New Date(2006, 8, 31, 0, 0, 0, 0) Autorise la slection dau maximum 28 jours (4 semaines de congs) [Link] = 28 [Link] = "Planning" [Link] = 6 [Link] = 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 -
[Link]) Handles [Link] [Link] = "vous tes en vacances du " & [Link] [Link] & " au " & [Link] End Sub
[Link]
[Link] esttrssimpledutilisationpuisquilnepossdequedeuxproprits. Interval [Link]. Enabled Indiquesilecontrlegnredesvnementsouestinactif. chaqueexpirationdudlai,unvnementTickestdclench. Ilfautcependanttreprudentlorsdelutilisationdececontrleentenantcomptedesremarquessuivantes :
q
Silesystmeesttrscharg(parcequileffectuedesoprationsdentre/sortierseauparexemple),ilse peutquelesvnementsTicknesoientpasdclenchsrgulirement. Laprcisionducontrle [Link],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 [Link]) Handles [Link] depart = Now End Sub Private Sub Timer1_Tick(ByVal sender As [Link], ByVal e As System. EventArgs) Handles [Link] Dim dure As Double calcul de la dure heure courante-heure depart et conversion en jour dure = DateDiff([Link], depart, Now) / (24 * 3600) conversion de la valeur en date et formatage en minutes : secondes [Link] = Format([Link](dure), "vous travaillez depuis mm minutes ss secondes") End Sub
[Link]
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 [Link] [Link] 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 [Link]. Public Function estPremier(ByVal nb As Integer) As Boolean If nb < 2 Then Return False
- 40 -
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,[Link] 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 [Link], ByVal e As [Link]) Handles [Link] [Link] = False [Link] = False [Link] = comptePremier([Link]) [Link] = True [Link] = True End Sub [Link] comptePremier qui est en fait appele indirectement par la mthode RunWorkerAsync. Le paramtre pass cette mthodeseraensuiteenvoylafonctioncomptePremier. Private Sub cmdBackGround_click(ByVal sender As [Link], ByVal e As [Link]) Handles [Link] [Link] = False [Link] = False [Link] = "" [Link]([Link]) End Sub Il nous reste encore deux choses prciser pour que lapplication soit oprationnelle. Nous devons indiquer au [Link],est
ENI Editions - All rigths reserved - 41 -
excutsurlethreadassociau [Link] comptePremier est obtenue parlintermdiairedelapropritArgumentduparamtre. Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link] = comptePremier([Link]) End Sub [Link] dclenchant lvnement RunWorkerCompleted. En rponse cet vnement, nous rcuprons le rsultat par lintermdiairedelapropritResultetnouslaffichonsdanslazonedetextedersultat. Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As [Link]) Handles [Link] [Link] = [Link] [Link] = True [Link] = 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.
- 42 -
Lhritagedeformulaires
Vouspouvezparfoisavoirbesoinquunprojetappelleunformulairesimilaireunautrequevousavezdjcrdans [Link] statiqueouuneprsentationparticuliredescontrlesquevouscomptezrutiliserplusieursfoisdansunprojet,chaque [Link] crerunformulairedebasepuisdenhriterpourpersonnaliserlesnouvellesversionsainsicres. Pourpouvoircrerunformulairehrit,[Link] 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 [Link] Slecteurdhritage souvre et si le projet actuel contient dj des formulaires, ils sont affichs dans cette bote de dialogue. Pour hriter dunformulairedisponibledansunautreassembly,cliquezsurleboutonParcouriretslectionnezlefichier(.[Link]) contenant le formulaire de base puis validez votre choix avec le bouton OK. Le nouveau formulaire est alors ajout [Link],lescontrlesprovenantdelhritagesontmarqusgrceausymbole . LapropritModifiersdechacundescontrlesduformulairedebasedterminelesactionspossiblessurcescontrles [Link] visibilit.
q
Public : les contrles peuvent tre redimensionns et dplacs. Le contrle est accessible en interne par la classequiledclareetenexterneparlesautresclasses. Protected : [Link] 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 : [Link] pas le dplacer ou le redimensionner, ni modifier ses proprits. Le contrle est accessible uniquement par dautresmembresdelassemblyquilecontient. Private : [Link] pasledplacerouleredimensionner,[Link] quiledclare.
- 1-
- 2-
Principedefonctionnementdunebasededonnes
[Link] [Link] [Link] dinformations entre utilisateurs. Pour pouvoir utiliser une base de donnes, vous devez connatre un minimum de vocabulairelicettetechnologie.
[Link]
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,[Link] exemple,nousauronslatabledesClients,desProduitsoudescommandes. Enregistrement Lenregistrement est lensemble des informations relatives un lment dune table. Les enregistrements sont les quivalents,auniveaulogique,[Link],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,[Link] [Link],lechamp CodeClientestlacl [Link]. Cltrangre Une cl trangre reprsente un ou plusieurs champs dune table, qui font rfrence aux champs de la cl primaire [Link]. Relation [Link] un,[Link],lesrsultatsderequtespeuventcontenirdes [Link] Clientetlatable Commandepermet unerequtederenvoyertouteslescommandescorrespondantunclient.
[Link]
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.
- 1-
[Link]
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 [Link]. ClauseWHERE Cetteclausepermetdespcifierlalistedesconditions,quedevrontremplirlesenregistrementspourfairepartiedes [Link] : 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 [Link],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 [Link],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,[Link] [Link],lechampsuivant estutilis : SELECT * FROM Client ORDER BY Nom DESC,Prenom ASC
- 2-
ette instruction retourne les clients tris par ordre dcroissant sur le nom et, en cas dgalit, par ordre C croissantsurleprnom.
[Link]
Lacrationdenregistrementsdansunetableseffectueparlacommande INSERT [Link] danslaquellevoussouhaitezinsreruneligne,lalistedeschampspourlesquelsvousspcifiezunevaleuret,enfin, [Link] : INSERT INTO client (codeClient,nom,prenom) VALUES (1000,Dupond,Pierre) Lorsdelajoutdecenouveauclient,[Link] prendrontlavaleur [Link],linstruction insertexigequevousspcifiezune [Link] 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.
[Link]
Lamodificationdeschampspourdesenregistrementsexistants,seffectue par linstructionUPDATE. Cette instruction peutmettrejourplusieurschampsdeplusieursenregistrementsdunetable,partirdesexpressionsquiluisont [Link],vousdevezfournirlenomdelatablemettrejourainsiquelavaleuraffecterauxdiffrents [Link] [Link] vousvoulezquelesmodificationsneportentquesurunensemblelimitdenregistrements,vousdevezspcifierla clause WHERE,[Link] 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
[Link]
LinstructionDELETE [Link],auminimum, [Link],toutes les lignes de la table sont supprimes. En gnral, une clause WHERE est ajoute pour limiter ltendue de la [Link] : 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.
- 3-
[Link]
[Link] est un ensemble de classes, dinterfaces, de structures et dnumrations permettant la manipulation des donnes. Les diffrents [Link] langageXML,enpermettantlaconversiondedonnesrelationnellesauformatXMLoulimportationdedonnesauxformatsXMLdansunmodle [Link] :
q
lemodeconnect lemodenonconnect.
[Link]
Dans un environnement connect, lapplication ou lutilisateur est en permanence connect la source de donnes. Depuis les dbuts de linformatique,[Link] :
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,[Link],parexemple,desapplicationseffectuant destraitementsentempsrel.
[Link]
[Link] [Link],lesdonnessontextraitespuislaconnexionest [Link] travaille avec les donnes, partir de son navigateur, et la connexion est nouveau ouverte pour la mise jour de la [Link],travaillantsurdesordinateursportables,sontgalementlesprincipaux [Link],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
[Link],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. [Link] [Link] :
q
[Link]
- 1-
Le but [Link] est de fournir un ensemble de classes permettant laccs aux bases de donnes. Deux types de composants sont disponibles :
q
Lesfournisseursdedonnes,[Link] [Link] limitespuisqueuniquementunaccsenlectureseuleestdisponible. Les classes de manipulation des donnes, indpendantes du type de base de donnes, voire utilisables sans base de donnes, permettentlamanipulationlocaledesdonnesdanslapplication.
[Link]
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 [Link] :
q
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.
[Link]
[Link] consommateurderessourcespuisquilaccdeauserveur,[Link] [Link] [Link],lenomdechaqueclasseestprfixpar [Link],laclassepermettantdeseconnecter unserveurSQLServersappelleSqlConnection.
[Link]
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 [Link],[Link] dans lespace de nom [Link]. Les noms de classe de cet espace de nom sont prfixs par OleDb. Pour pouvoir fonctionner correctement,cefournisseurexigelinstallationdeMDAC2.6surlamachine(MicrosoftDataAccessComponents).
[Link]
[Link] natif pour la communication. Le principe est identique celui utilis pour le fournisseur OLE DB. Toutes les classes sont disponibles dans [Link] [Link],cefournisseurexige linstallationsurlamachinedeMDAC2.6(MicrosoftDataAccessComponents).
[Link]
LefournisseurpourOraclepermetlaconnexionunesourcededonnesOracle,[Link] [Link] dans lespace de nom [Link] et utilisent Oracle comme prfixe de nom. Pour utiliser le fournisseur pour Oracle, vous [Link].
- 2-
[Link]
Pourassurerlebonfonctionnementduneapplicationutilisantunaccsauxdonnes,les fournisseursdedonnesdoiventtredisponiblessur le poste client. La classe DbProviderFactories propose la mthode partage GetFactoryClasses, permettant dnumrer les fournisseurs de [Link],ladescriptionetlespacedenomracinedechacundesfournisseurs installssurlepostedetravail. Imports [Link] Imports [Link] Module ListeProviders Sub Main() Dim resultat As DataTable rcupration de la liste des fournisseurs dans une dataTable resultat = [Link]() Dim colonne As DataColumn Dim ligne As DataRow parcours des colonnes de la dataTable et affichage du nom For Each colonne In [Link] [Link]([Link] & vbTab) Next [Link]() parcours de la dataTable et affichage de chaque ligne For Each ligne In [Link] parcours de chaque ligne et affichage de chaque champ For Each colonne In [Link] [Link](ligne([Link]) & vbTab) Next [Link]() Next [Link]() Stop End Sub End Module
[Link]
Enfonctiondufournisseurutilis,vousdevezimporterlespace de nom correspondant pour avoir un accs facile aux classes du fournisseur. Cependant,commelesclassesdechacundesfournisseursneportentpaslemmenom,[Link] [Link],aulieudutiliserlesclassesspcifiques chacundesfournisseurs,[Link] nest indispensable que pour la cration de la connexion. Une fois que la connexion est cre, vous pouvez travailler uniquement avec des [Link],enutilisantuniquementdesinterfaces. Module accesBdParInterfaces Dim ctn As IDbConnection Public Sub main() cest la seule ligne de code spcifique un fournisseur ctn = New [Link]("Data Source=TG;Initial Catalog=Northwind;Integrated Security=True") Dim cmd As IDbCommand cmd = [Link] [Link]() [Link] = "select * from products Dim lecteur As IDataReader lecteur = [Link] [Link]("Lecture des donnes dans une base SQL Server") Do While [Link] [Link]("numro : {0} nom produit : {1}", lecteur.GetInt32(0), [Link](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,[Link] donnessontmaintenantdisponiblesdansunebaseAccess,lacrationdelaconnexionprendalorslaformesuivante : ctn = New [Link] (Provider=[Link].4.0; Data Source=C:\Documents and Settings\tgroussard\Mes documents\livre [Link] 2005\ accs aux bases de donnes\exemples\[Link])
- 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,[Link] larelectureducode,ilestprfrablederegroupertouteslesinstructionsSQLsousformedeconstantesdetypechanedecaractresaudbut de chaque module. Avec cette technique, vous naurez pas chercher des instructions SQL au milieu de centaines de lignes de code Visual [Link] 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-
Utilisationdumodeconnect
Danscechapitre,nousallonsaborderlesoprationspouvanttreexcutessurunebasededonnes,enutilisantle [Link] 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.
[Link]
Pourpouvoirtravailleravecunserveurdebasededonnes,uneapplicationdoittabliruneconnexionrseauavecle serveur. La classe SqlConnection est capable de grer une connexion vers un serveur SQL Server version 7.0 ou [Link],nousdevonsenpremierlieudclarerunevariable. Dim ctn As [Link] Puis, nous devons crer linstance de la classe et [Link] va consister essentiellement indiquer les paramtres utiliss pour tablir la connexion avec le serveur. Ces paramtres sont [Link] lasuiteparlapropritConnectionString.
[Link]
Leformatstandarddunechanedeconnexionestconstitudunesriedecouplesmotcl/valeursparspardes [Link]=[Link] 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 [Link] : ConnectTimeout Dure en secondes pendant laquelle lapplication attendra une rponse du serveur sa demande de connexion. Passcedlai,uneexceptionestdclenche.
- 1-
DataSource Nom ou adresse rseau du serveur vers lequel est tablie la connexion. Le numro du port peut tre spcifi la [Link],lenumrodeportestgal1433. InitialCatalog Nomdelabasesurlaquelledoitseffectuerlaconnexion. IntegratedSecurity Sicettevaleurestpositionnesur falsealorsunnomdutilisateuretunmotdepassedoiventtrefournisdansla [Link],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 [Link] compte,cetteinformationpeuttreomisedanslachanedeconnexion. UserID NomducompteSQLServerutilispourlaconnexion. ConnectionLifeTime [Link] vieinfinie. ConnectionReset Indiquesilaconnexionestrinitialiselorsdesaremisedanslepool. MaxPoolSize Nombremaximumdeconnexionsdanslepool. MinPoolSize Nombreminimumdeconnexionsdanslepool. Pooling Indiquesilaconnexionpeuttreextraitedunpooldeconnexion. Unechanedeconnexionprenddonclaformeminimalesuivante : [Link] = "Data Source=Minerve;Initial Catalog=Northwind;Integrated Security=true"
[Link]
Les pools de connexions permettent damliorer les performances dune application, en vitant la cration de [Link],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,[Link] [Link],dautresconnexionspeuventtrecresautomatiquementpoursatisfairela
- 2-
valeurMin Pool [Link],parlasuite,treajoutes aupooljusquatteindrelavaleur Max Pool [Link],elle peuttreobtenuepartirdunpooldeconnexion(silenexisteuncorrespondantexactementauxcaractristiques delaconnexiondemande).Ilfautbiensrquelepoolencontienneunedisponibleetactive. Silenombremaximumdeconnexiondanslepoolestatteint,lademandeestmiseenfiledattentejusqucequune [Link],lorsdesafermetureoulors [Link],ilestrecommanddefermerexplicitementles [Link] dtectequelaconnexionnapastutilisedepuisuncertaintemps,indiquparlavaleur ConnectionLifeTimedela chane de connexion. Elles sont galement retires du pool, sil dtecte que la connexion avec le serveur a t interrompue.
[Link]
La classe SQLConnection propose deux vnements vous permettant dtre prvenu lorsque ltat de la connexion changeouquunmessagedinformationestenvoypar le [Link] 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,[Link] deuxproprits,vouspouvezutiliserlnumrationConnectionState.
Lvnement InfoMessage est dclench lorsque le serveur vous informe dune situation, anormale, mais qui ne justifiepasledclenchementduneexception(svritdumessageinfrieure10).Legestionnairedvnements [Link],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 [Link]. [Link]) Handles [Link] Dim info As [Link] For Each info In [Link] [Link]([Link]) Next End Sub
[Link]
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.
[Link]
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 [Link] [Link] : Dim cmd As SqlCommand cmd = New SqlCommand [Link] = ctn [Link] = SELECT * FROM Products
- 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 [Link],seulelinstructionSQLa besoindtrespcifieparlasuite. Dim cmd as SqlCommand cmd = [Link] [Link] = " SELECT * FROM Products"
[Link]
Frquemment, linstruction SQL dune SqlCommand slectionne un ensemble denregistrements dans la base, ou [Link] instructionSQL,renvoyantunensembledenregistrements,doittreexcuteparlamthode [Link] mthoderetourneunobjetDataReaderquivapermettre,parlasuite,lalecturedesinformationsenprovenancedela base de donnes. Si linstruction SQL ne renvoie quune valeur unique, la mthodeExecuteScalar se charge de lexcutionetretourneellemmelavaleurenprovenancedelabasededonnes. Lecodesuivantpermetlarcuprationdunombredecommandespassesparunclient : [Link] = " select count(orderid) from orders where customerid=FRANK" [Link]("le client FRANK a pass {0} commande(s)", [Link]()) [Link] 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 [Link] Forward [Link]...dela classe [Link] [Link] les informations prsentes dans lenregistrement, puissent tre converties dans le type correspondant. Si la conversionestimpossible,[Link] Get...attendent,commeparamtre, [Link],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 [Link] Module TestExecuteReader Dim cmd As SqlCommand Dim ctn As SqlConnection Dim lecteur As SqlDataReader Public Sub main() ctn = New SqlConnection() [Link] = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link] = " select * from categories" lecteur = [Link] Do While [Link] [Link]("numero de la categorie:{0}" & vbTab & "Description:{1}", lecteur.GetInt32(0), lecteur("CategoryName")) Loop [Link]() [Link]() End Sub End Module
- 4-
[Link] disponiblepouruneautrecommande,vousdevezobligatoirementfermerleDataReaderaprssonutilisation.
[Link]
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 [Link],alorsla valeur renvoye par la mthode ExecuteNonQuery correspond au nombre total de lignes affectes par toutes les instructionsSQLdelaSqlCommand. LecodesuivantajouteunenouvelleentreprisedelivraisondanslatableShippers : Imports [Link] Module TestExecuteNonQuery Dim cmd As SqlCommand Dim ctn As SqlConnection Public Sub main() ctn = New [Link]() [Link] = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" [Link]() cmd = New [Link] [Link] = ctn [Link] = "Insert into shippers (companyname,phone) values (DHL,02 40 41 42 43)" [Link]("{0} ligne(s) ajoute(s) dans la table", [Link]) [Link]() End Sub End Module
[Link]
[Link] 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 [Link] Module TestRequeteConcat Dim cmd As SqlCommand Dim ctn As SqlConnection Dim lecteur As SqlDataReader Dim codeClient As String Public Sub main() ctn = New SqlConnection() [Link] = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link]("saisir le code du client recherche :") codeClient = [Link]() [Link] = " SELECT * from Customers WHERE CustomerID = " & codeClient & "" lecteur = [Link] Do While [Link] [Link]("nom du client:{0}", lecteur("ContactName")) Loop [Link]() [Link]()
- 5-
[Link]() End Sub End Module Lapartieimportantedececodesesituelorsdelaffectationdunevaleurlaproprit [Link] SQL correcte doit tre construite par concatnation de chanes de caractres. Dans notre cas, cest relativement simplepuisquilnyaquunevaleurvariabledanslinstructionSQL,maissiplusieursinformationsdoiventvarier,ilya [Link] :
q
Toutesceserreursont,pourmmeeffet,lacrationduneinstructionSQLinvalidequiserarejetelexcutionpar leserveur. [Link] pourmarquerunemplacementdansunerequteoseraplac,aumomentdelexcution,unevaleurlittralechane de caractres ou numrique. Les paramtres peuvent tre nomms ou anonymes. Un paramtre anonyme est introduitdansunerequteparlecaractre ?.Lesparamtresnommssontspcifisparlecaractre@suividunom duparamtre. Larequtedenotreexempleprcdentpeutprendrelesformessuivantes : [Link] = " SELECT * from Customers WHERE CustomerID = ?" ou [Link] = " 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 [Link],ilfaut fournir :
q
- 6-
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.
[Link],sila [Link],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 [Link] SqlCommandestmaintenantprtepour lexcution. noter quavec cette solution nous navons pas nous soucier du type de valeur attendue par [Link] delinstructionSQL,ilsneserontdisponiblesquaprslafermeturedu [Link] dunomduclient,lenombredecommandesquiladjpasses : Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind; Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link]("saisir le code du client recherche :") codeClient = [Link]() [Link] = " SELECT * from Customers WHERE CustomerID = @Code;select @nbCmd=count(orderid) from orders where customerid=@code" paramCodeClient = New SqlParameter("@Code", codeClient) [Link] = [Link] [Link](paramCodeClient) paramNbCommandes = New SqlParameter("@nbCmd", Nothing) [Link] = [Link] [Link](paramNbCommandes) lecteur = [Link] Do While [Link] [Link]("nom du client:{0}, lecteur("ContactName")) Loop [Link]() [Link]("ce client a passe {0} commande(s)", [Link] ("@nbCmd").Value) [Link]() [Link]() End Sub End Module
[Link]
- 7-
LesprocduresstockessontdeslmentsdunebasededonnescorrespondantunensembledinstructionsSQL, [Link] [Link],lesprocduresstockessontenregistresdanslecachemmoiredu serveur, sous forme compile lors de leur premire excution, ce qui accrot les performances pour les excutions [Link] [Link],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 [Link] [Link] CommandTypeaveclavaleur [Link] CommandTextcontientlenom [Link],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 [Link]=[order details].orderid return @total GO AuniveauducodeVisualBasic,nousdevonsindiquerquilsagitdelexcutionduneprocdurestockeetajouterun paramtrepourrcuprerlavaleurderetourdelaprocdurestocke.CeparamtredoitsappelerRETURN_VALUE. Imports [Link] 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() [Link]("saisir le code du client recherche :") codeClient = [Link]() ctn = New SqlConnection() [Link] = Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true [Link]() cmd = New SqlCommand [Link] = ctn [Link] = "TotalClient" [Link] = [Link] paramCodeClient = New SqlParameter("@Code", codeClient) [Link] = [Link] [Link](paramCodeClient) paramMontant = New SqlParameter("RETURN_VALUE", [Link]) [Link] = [Link] [Link](paramMontant) [Link]() [Link]("Ce client a passe pour {0} Euros de commande", [Link]) [Link]() [Link]() End Sub End Module
- 8-
Utilisationdumodenonconnect
Dansunmodenonconnect,[Link] [Link],laidedediffrentesclasses,une [Link] : DataSet Cestleconteneurdeplushautniveau,iljouelemmerlequelabasededonnes. DataTable Commesonnomlindique,cestlquivalentdunetabledebasededonnes. DataRow Cetteclassejouelerledunenregistrement(ligne). DataColumn Cetteclasseremplaceunchamp(colonne)dunetable. UniqueConstraint Cestlquivalentdelaclprimairedunetable. ForeignKeyConstraint Cestlquivalentdelacltrangre. DataRelation Reprsenteunlienparent/enfantentredeuxDataTable. Leschmacidessousreprsentecetteorganisation.
Nousallonsvoirmaintenantcommentcreretmanipulertoutescesclasses.
[Link]
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
- 1-
DataSet que du DataSet vers la base pour la mise jour des donnes. Le DataAdapter utilisera une connexion pour contacterleserveuretuneouplusieurscommandespourletraitementdesdonnes.
[Link]
Lapremirechoseraliserestdecreruneinstancedelaclasse [Link] 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 [Link] DataAdaptercontientgalement lespropritsInsertCommand, DeleteCommandetUpdateCommandrfrenantlesobjets Command,utilisslorsdelamise [Link],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 [Link] mthodeattend,commeparamtre,le DataSetquelledoitrempliretunobjet DataTableouunechanedecaractresutilisepournommerla [Link],en interne,unobjet DataReaderpourobtenirlenomdeschampsetletypedeschampspourcrerla DataTabledansle [Link] DataTableetlesDataColumnsontcrsuniquementsilsnexistent pas dj, sinon la mthode Fill utilise la structure existante. Si une DataTable est cre, elle est ajoute la collectionTablesdu [Link] DataColumnestdfinienfonctiondesmappagesprvusparle fournisseur de donnes, entre les types de la base de donnes et les types .NET. Lexemple suivant remplit un DataSetaveclescode,nom,adresseetvilledesclients. Imports [Link] Module TestDataSet1 Dim cmd As SqlCommand Dim ctn As SqlConnection Dim ds As DataSet Dim da As SqlDataAdapter Public Sub main() ctn = New SqlConnection() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true cmd = New SqlCommand [Link] = ctn [Link] = " SELECT CustomerId,ContactName,Address,city from Customers" ds = New DataSet da = New SqlDataAdapter() [Link] = cmd [Link](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,[Link],si vousavezbesoindutiliser plusieurs fois la mthode Fill, il est plus efficace de grer vousmmelouverture et la [Link],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 [Link] desobjetsDataTableMappingetenlesajoutantla collection TableMappings du DataAdapter. Ces objets DataTableMapping contiennent euxmmes des objets DataColumnMappingutilissparlamthode Fill,commetraducteursentrelesnomsdeschampsdanslabaseetles nomsdes Datacolumn dans le [Link],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 [Link] Imports [Link]
- 2-
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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" cmd = New SqlCommand [Link] = ctn [Link] = " SELECT CustomerId,ContactName,Address,city from Customers ds = New DataSet da = New SqlDataAdapter() [Link] = cmd mappage = New DataTableMapping("Customers", "Clients") [Link]("CustomerId", "CodeClient") [Link]("ContactName", "Nom") [Link]("Address", "Adresse") [Link]("city", "Ville") [Link](mappage) [Link](ds, "Customers") For Each dc In [Link]("Clients").Columns [Link]([Link] & vbTab) Next [Link]() End Sub End Module Nousobtenonslaffichage : CodeClient Nom Adresse Ville
[Link]
Lamthode Fillnefaitquetransfrer,versle DataSet,[Link],des contraintesdeclsprimairessontutilisesdanslabasededonneset,pardfaut,lamthode Fillnelesrapatrie [Link],ilyadeuxsolutionspossibles :
q
[Link]
[Link] = [Link]
[Link](ds, [Link], "Customers") [Link](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 [Link],elle [Link],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
- 3-
importantlorsquelamthodeFilldoittreappeleplusieursfoispour,parexemple,obtenirlesdonnesmodifies paruneautrepersonnedanslabasededonnes.
[Link]
Il nest pas ncessaire de disposer dune base de donnes pour pouvoir utiliser des DataSet. Ils peuvent servir [Link],toutesles oprations effectues automatiquement par le DataAdapter devront tre ralises manuellement par le code. Ceci inclutnotammentlacrationdes DataTable avec leurs [Link] [Link],comme paramtre,[Link] 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", [Link]("int")) [Link](col) [Link]("Tva", [Link]("decimal")) Une DataColumn peut galement tre construite comme tant une expression base sur une ou plusieurs autres [Link],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. [Link]("Ttc", [Link]("[Link]"), "Ht * (1 + (Tva /100))") PourassurerlunicitdesvaleursduneDataColumn,[Link] 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 [Link] valeur contenue dans cette DataColumn est calcule automatiquement lors de lajout duneligneune DataTableen fonctiondecespropritsetdeslignesexistantdjdanslaDataTable. CetypedeDataColumnestgnralementutiliscommeclprimairedune [Link] 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 [Link] Uniqueserapositionnesur trueetlaproprit AllowDBNullsur [Link] clprimaireestconstituedeplusieursDataColumn,seulelapropritAllowDBNullseramodifiesurcesDataColumn. col = New DataColumn("Numero", [Link]("System.Int32")) [Link] = True [Link] = 1000 [Link] = 1 [Link](col) [Link] = New DataColumn() {col}
[Link]
Quellequesoitlamthodeutilisepourremplirun DataSet,lebutdetouteapplicationestdemanipulerlesdonnes prsentes dans le DataSet. La classe DataTable contient de nombreuses proprits et mthodes facilitant la manipulationdesdonnes.
[Link]
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, [Link] countpermetdeconnatrelenombredelignes [Link],cardansune DataTable,ilnyapasdenotionde pointeurdenregistrement,denregistrementcourant,[Link]
- 4-
voulezgrer toutescesnotions,[Link] notredispositionuneinstancedeclasseimplmentantlinterface [Link],nous avons accs aux mthodes MoveNext et Reset ainsi qua la proprit Current. Ces trois lments permettent de [Link] DataRow. Cette classe possde galement une proprit Item, par dfaut, fournissant un accs aux diffrents champs de la [Link]. Lecodesuivantillustrecesnotionsenaffichantlalistedesclients : Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" cmd = New SqlCommand [Link] = ctn [Link] = " SELECT ContactTitle,ContactName from Customers" ds = New DataSet da = New SqlDataAdapter() [Link] = cmd [Link](ds, "Customers") on recupere lenumerateur sur les lignes de la DataTable en = [Link]("Customers").[Link] on se replace au debut de la table (par securite) [Link]() on boucle tant que la mthode MoveNext nous indique quil reste des lignes Do While [Link] on accede aux champs par le nom [Link]([Link]("ContactName") & vbTab) ou par le numero [Link]([Link](0)) Loop [Link]() End Sub End Module
[Link]
Vous pouvez utiliser des contraintes pour mettre en uvre des restrictions sur les donnes prsentes dans une [Link] DataColumnouses DataColumnlies. [Link] 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. [Link](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,[Link],lasuite delamodificationduneligne,dclencheuneexception.
- 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,[Link] : 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 [Link] 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", [Link]("Factures").Columns("Numero"), [Link]("LignesFacture").Columns("NumFact")) fkFact_LignesFact.AcceptRejectRule = [Link] fkFact_LignesFact.DeleteRule = [Link] [Link] = True
[Link]
DansunDataSetcontenantplusieursDataTable,[Link] [Link] DataRelationdoittre [Link] [Link] :
q
LecodesuivantajouteunerelationentrelatableCustomersetlatableOrders : [Link]("Client_Commandes", [Link]("Customers"). Columns("CustomerId"), [Link]("Orders").Columns("CustomerId")) noterqueles DataRelationfonctionnentparalllementavecles ForeignKeyConstaintetles [Link] dfaut,lacrationdelarelationvaplaceruneUniqueConstraintsurlatableparentetuneForeignKeyConstraintsur la table enfant. Si vous ne souhaitez pas que ces contraintes soient ajoutes automatiquement si elles nexistent pas,vousdevezajouterunbooleanfalsecommequatrimeparamtre,lorsdelajoutdelaDataRelation.
[Link]
- 6-
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 [Link] metcelaenapplication,enaffichantpourchaqueclientlenumroetladatedesescommandes : Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" cmdCustomers = New SqlCommand [Link] = ctn [Link] = " SELECT * from Customers daCustomers = New SqlDataAdapter() [Link] = cmdCustomers [Link](ds, "Customers") cmdOrders = New SqlCommand [Link] = ctn [Link] = " SELECT * from Orders" daOrders = New SqlDataAdapter() [Link] = cmdOrders [Link](ds, "Orders") [Link]("Client_Commandes", [Link]("Customers").Columns ("CustomerId"), [Link]("Orders").Columns("CustomerId")) For Each ligneClient In [Link]("Customers").Rows [Link](ligneClient("ContactName")) For Each ligneCommandes In [Link]("Client_Commandes") [Link](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 [Link]("Orders").Rows [Link]("la commande {0} a ete passee par {1}", ligneCommandes("OrderId"), [Link]("Client_Commandes") ("ContactName")) Next
[Link]
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. [Link] uneligne,vouspouvezspcifierlaversionquivousintresse. Pourcela,lnumrationDataRowVersionproposequatrevaleurs : Current [Link]. Default [Link],Modified,Unchanged,cetteversionestquivalente [Link],cetteversionestquivalentelaversion [Link] unelignedontltatestDetached,cetteversionestgalelaversionProposed. Original [Link],cetteversionnexistepas. Proposed Version transitoire disponible pendant une opration de modification de la ligne ou pour une ligne ne faisant pas partiedunecollectionRowsduneDataTable. Lindicationdelaversiondsiredoittrespcifie,[Link],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.
[Link]
Lajout dune ligne une DataTable seffectue simplement en ajoutant une DataRow la collection Rows dune [Link],aupralable,creruneinstancedelaclasse [Link] problme.
- 8-
[Link], 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 = [Link]("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. [Link]("Customers").[Link](nouvelleLigne) LtatdecettenouvelleligneestmaintenantAdded.
[Link]
La modification des donnes contenues dans une ligne est ralise, simplement, en affectant aux champs correspondants,[Link] [Link] ligneestalors [Link] modifis,ilpeutyavoirpendantlamodification,destatstransitoiresquiviolentuneouplusieurscontraintesplaces surla [Link],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 [Link] [Link] sonteffectuessurlaligne,vouspouvezlesvalideroulesannulerenappelantlamthode EndEditoulamthode [Link],engrantlvnement [Link] le gestionnaire dvnements, vous recevez un argument de type DataColumnChangeEventArg permettant de savoir quelle DataColumn a t modifie ([Link]), la valeur propose pour cette DataColumn ([Link])etpermettantdannuler les modifications ([Link]).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 [Link],aprslappeldunedecesdeuxmthodes,lavrification descontraintesestractive. Lexemplesuivantpermetlamodificationducodepostaldunclientenvrifiantqueceluiciestbiennumrique : Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog= Northwind;Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link]("saisir le code du client a modifier:") codeClient = [Link]() [Link] = " SELECT * from Customers WHERE CustomerID = @Code" paramCodeClient = New SqlParameter("@Code", codeClient) [Link] = [Link] [Link](paramCodeClient) ds = New DataSet da = New SqlDataAdapter(cmd)
- 9-
[Link](ds, "Clients") table = [Link]("Clients") [Link](0).BeginEdit() [Link]("saisir le nouveau code postal du client:") codePostal = [Link]() [Link](0)("PostalCode") = codePostal [Link](0).EndEdit() [Link]("le nouveau code postal est : {0}", [Link](0)("PostalCode")) [Link]() End Sub Private Sub table_ColumnChanged(ByVal sender As Object, ByVal e As [Link]) Handles [Link] If [Link] = "PostalCode" Then If Not IsNumeric([Link]) Then [Link]() End If End If End Sub End Module
[Link]
Deux solutions diffrentes sont disponibles. Vous pouvez effacer une ligne ou supprimer une ligne. La nuance est subtileentrecesdeuxsolutions : LasuppressiondunedonnesefaitaveclamthodeRemovequiretiredfinitivementlaDataRowdelacollectionRows [Link]. Lamthode [Link] et ce nest quau moment de la validation des modifications que la ligne est rellement supprime de la collection [Link],lalignerestedanslacollectionRows. LamthodeRemoveestunemthodedelacollection Rows(elleagitdirectementsursoncontenu),lamthodeDelete estunemthodedelaclasseDataRow(ellenefaitquechangerunepropritdelaligne). efface la ligne [Link](1).Delete() supprime la ligne [Link]([Link](1))
[Link]
Jusqu prsent, les modifications effectues sur une ligne sont temporaires, il est encore possible de revenir la versionprcdente,ouaucontrairedevaliderdefaondfinitivelesmodificationsdansleslignes(maisencoredans labase).LesmthodesAcceptChangesouRejectChangespermettentrespectivementlavalidationoulannulationdes [Link],une DataTableouun [Link] 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
- 10 -
SiltatdelalignetaitAdded,alorselleestsupprime.
Silexistedescontraintesdecltrangre,lactiondelamthodeAcceptChangesouRejectChangesestpropageaux lignesenfantsenfonctiondelapropritAcceptRejectRuledelacontrainte.
[Link]
Il est frquent davoir besoin de limiter la quantit de donnes visibles dans une DataTable ou encore de modifier [Link] [Link] 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 [Link] 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,[Link] visibles dans la DataView, les lignes devront correspondre tous ces critres. Les diffrents critres peuvent aussi tremodifispartroisproprits. RowFilter Cettepropritaccepteunechanedecaractresreprsentantlaconditiondevanttrerempliepourquunelignesoit [Link] peuventgalementtreutilisspourassocierplusieursconditions. LexemplesuivantaffichelenomdesclientscommerciauxoudirecteursdeventeenFrance : Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link] = " SELECT * from Customers" ds = New DataSet da = New SqlDataAdapter(cmd) [Link](ds, "Clients") table = [Link]("Clients") [Link] = "Country=France and (contactTitle= Sales Agent or contactTitle=Sales Manager) For Each ligne In [Link] [Link]("nom : {0}", ligne("ContactName")) Next End Sub End Module
- 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 [Link] = "" toutes les lignes sont maintenant visibles on ajoute un critere de tri [Link] = "Country ASC,ContactName ASC" For Each ligne In [Link] [Link]("Pays : {0}" & vbTab & vbTab & " nom : {1}, ligne("Country"), ligne("ContactName")) Next RowStateFilter Cettepropritdtermineltatdeslignesetquelleversiondelaligneestvisibledansla [Link] sontdisponibles : CurrentRows PrsentelaversionCurrentdetoutesleslignesajoutes,modifiesouinchanges. Added PrsentelaversionCurrentdetoutesleslignesajoutes. Deleted PrsentelaversionOriginaldetouteslesligneseffaces. ModifiedCurrent PrsentelaversionCurrentdetoutesleslignesmodifies. ModifiedOriginal PrsentelaversionOriginaldetoutesleslignesmodifies. None Aucuneligne. OriginalRows PrsentelaversionOriginaldetoutesleslignesmodifies,supprimesouinchanges. Unchanged PrsentelaversionCurrentdetoutesleslignesinchanges. Lexemplesuivantsupprimedeuxlignesetlesafficheparlintermdiairedunfiltre : on supprime deux lignes [Link](2).Delete() [Link](5).Delete() on annule<+>le filtre [Link] = "" on affiche la version original des lignes supprimees
- 12 -
[Link] = [Link] For Each ligne In [Link] [Link]("Pays : {0}" & vbTab & vbTab & " nom : {1}", ligne("Country"), ligne("ContactName")) Next
[Link]
LarecherchepeutseffectueraveclesdeuxmthodesFindet [Link],il estimpratifdavoiraupralabletrilesdonnesaveclapropritSort. Find Cette mthode retourne lindex de la premire ligne correspondant au critre de recherche. Si aucune ligne nest trouve,[Link] 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 [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true [Link]() cmd = New SqlCommand [Link] = ctn [Link] = " SELECT * from Customers ds = New DataSet da = New SqlDataAdapter(cmd) [Link](ds, "Clients") table = [Link]("Clients") [Link]("saisir le code client : ") codeClient = [Link]() [Link] = "CustomerID ASC" index = [Link](codeClient) If index = -1 Then [Link]("il ny a pas de client avec ce code") Else [Link]("le code {0} correspond au client {1}", codeClient, [Link](index)("ContactName")) End If [Link]() End Sub End Module FindRows Cettemthoderecherchetoutesleslignescorrespondantaucritrederechercheetretourneceslignessousforme duntableaudeDataRowView. Lecodesuivantrecherchetouslesclientsdunpaysetdunevilledonns : Imports [Link] Module TestFindRows Dim cmd As SqlCommand
- 13 -
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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link] = " SELECT * from Customers" ds = New DataSet da = New SqlDataAdapter(cmd) [Link](ds, "Clients") table = [Link]("Clients") [Link]("saisir le Pays : ") pays = [Link]() [Link]("saisir la ville: ") ville = [Link]() [Link] = "Country ASC,City ASC" criteres = (New Object() {pays, ville}) lignesTrouvees = [Link](criteres) If [Link] = 0 Then [Link]("il ny a pas de client correspondant") Else [Link]("les clients suivants correspondent ") For Each ligne In lignesTrouvees [Link]("Nom :{0}", ligne("ContactName")) Next End If [Link]() End Sub End Module
[Link]
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 [Link] DataAdapteratutilispourremplirle DataSet,cestgalementluiquelonvafaireappelpourmettrejourlabasededonnes. CommelamthodeFill,lamthodeUpdatevautiliserdesinstructionsSQLpourledialogueaveclabasededonnes. En fonction des besoins, elle utilisera linstruction contenue dans la commande InsertCommand, UpdateCommand ou [Link] Updateabesoindunecommandeetquellenestpasdisponible,alorsuneexceptionest [Link] Fillparcourtleslignesdela DataTablequelledoitmettrejouret,enfonctiondeltatdela ligne (Added, Deleted, Modified), appelle la commande InsertCommand, DeleteCommand, UpdateCommand. Lordre dans lequellesmisesjoursonteffectuesdanslabase,[Link] insertions,modificationsetsuppressions,vouspouvezprocderentroistapes,enneproposantlamthodeUpdate quun jeu restreint de lignes mettre jour. Vous pouvez, par exemple, ne slectionner que les lignes effaces et demanderlamisejourdelabaseaveccetensembledelignespuisprocderdemmeavecleslignesmodifieset leslignesajoutes. [Link] DataRowquiestpasscommeparamtrelamthodeUpdate. Lexemplesuivantraliselessuppressions,lesmodificationspuislesajoutsdanslabasededonnes. Dim lignes() As DataRow recupere les lignes supprimees et demande la mise a jour de la base lignes = [Link](Nothing, Nothing, [Link]) [Link](table)
- 14 ENI Editions - All rigths reserved
recupere les lignes modifiees et demande la mise a jour de la base lignes = [Link](Nothing, Nothing, [Link]) [Link](table) recupere les lignes ajoutees et demande la mise a jour de la base lignes = [Link](Nothing, Nothing, [Link]) [Link](table)
[Link]
Les commandes charges de la mise jour de la base peuvent tre gnres automatiquement par un objet [Link],leSqlCommandBuilderaquelquesexigences :
q
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 [Link] identit,[Link],parlaclprimaire,maisil fautgalementquelesvaleursdes autreschampsdanslabasecorrespondentlaversion Originalduchampdans laDataRow. DeleteCommand Effacedelabasetoutesleslignesdontltatest [Link] correspondentlaversion Originaldeschampsdansla [Link] mthodesGetInsertCommand,GetUpdateCommand,GetDeleteCommand. Lexemple suivant affiche les instructions SQL des trois commandes gnres automatiquement pour la table Customers : Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" [Link]() cmd = New SqlCommand
- 15 -
[Link] = ctn [Link] = " SELECT * from Customers" ds = New DataSet da = New SqlDataAdapter(cmd) [Link](ds, "Clients") table = [Link]("Clients") bldr = New SqlCommandBuilder(da) [Link]("Instruction SQL de UpadteCommand : {0}", [Link]) [Link]("Instruction SQL de InsertCommand : {0}", [Link]) [Link]("Instruction SQL de DeleteCommand : {0}", [Link]) 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 [Link].
Excutonsensuitelecodecidessous :
- 16 -
Imports [Link] 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() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" [Link]() cmd = New SqlCommand [Link] = ctn [Link] = " SELECT * from Customers where country=France" ds = New DataSet da = New SqlDataAdapter(cmd) [Link](ds, "Clients") table = [Link]("Clients") efface Frederique Citeaux [Link](7).Delete() change adresse Carine Schmitt [Link](4)("Address") = "9 rue Benjamin Franklin" ajout dun nouveau client ligne = [Link] 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" [Link](ligne) bldr = New SqlCommandBuilder(da) [Link](table) End Sub End Module ComparonslecontenuactuelaveclecontenuprcdentdelatableCustomers,pourvrifierquelesmodificationsont bientprisesencompte.
[Link]
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 :
- 17 -
delCmd = New SqlCommand [Link] = ctn [Link] = " UPDATE Customers set Archive=1 where CustomerID=@num" codeClient = New SqlParameter("@num", [Link], 5, ParameterDirection. Input, False, Nothing, Nothing, "CustomerID", [Link], Nothing) [Link](codeClient) [Link] = delCmd bldr = New SqlCommandBuilder(da)
es commandes personnalises sont compatibles avec les commandes gnres automatiquement par le L SqlCommandBuilderpuisqueceluicinegnreunecommandequesilapropritInsertCommand,DeleteCommand ou UpdateCommandestgale nothingdansle [Link],ellenestpasremplacepar leSqlCommandBuilder.
[Link]
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 [Link],leverrouresteactif,bloquantainsilaccsdes [Link]. Le verrouillage optimiste nest pas rellement un verrouillage puisque les enregistrements sont pratiquement [Link],pourvrifiersilesdonnes prsentes dans la base sont identiques aux donnes utilises pour remplir le DataSet. Si les donnes sont diffrentes,cestquunautreutilisateurlesamodifiesentreleremplissageduDataSetetlademandedemisejour [Link]. Troissolutionssontenvisageables :
q
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 [Link] 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 [Link] 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 -
Cettecommandeutiliseunnombreimpressionnantdeparamtres : [Link] dechacundecesparamtres. Lesparamtresde@p1@p11sontutilisspourspcifierlesnouvellesvaleursdelenregistrement. Leparamtre@p12estutilispouridentifierlenregistrementmettrejoureneffectuantuntestsurlaclprimaire. [Link],onvrifieque lesdonnesprsentesdanslabasesontidentiquesauxdonnesdu [Link] valeursnulles,[Link] CompanyNamequiestcomparavecleparamtre @p13. Pourleschampsautorisantlesvaleursnulles,[Link],ilestseulementpossiblede vrifierquunchampestnuloupasdanslabase,[Link] pallier cette limitation, les paramtres @p14,@p16,@p18,@p20,@p22 @p24,@p26,@p28,@p30 sont utiliss pour reprsenterlavaleur Nullpourunchampdansle DataSet.Sileurvaleurestgale1,cestquelechampestgal Nulldansle [Link] Andpourvrifierla [Link],lesparamtressont remplacsparlesvaleursprsentesdansle [Link],desversionsdiffrentesdelaligne sontutilises. Pourlesparamtres@p1@p11,lesversions [Link] 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 [Link],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 ) [Link] sourceColumnet [Link] de la commande renvoie le nombre denregistrementsrellementmis [Link],alorslavaleurrenvoyeparlexcutiondelacommande [Link],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, [Link] propritRecordsAffectedcombiendenregistrementsonttmisjour. Si aucun enregistrement na t mis jour, vous pouvez choisir laction entreprendre en modifiant la proprit StatusaveclunedesvaleursdelnumrationUpdateStatus : Continue Lamisejoursepoursuitcommesiriennestaitpass. ErrorsOccurred Uneexceptionvatredclenche.
- 19 -
SkipAllRemainingRows Arrtdelamisejourdeslignesrestantes. SkipCurrentRow [Link]. 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 [Link]. [Link]) Handles [Link] Dim reponse As Integer If [Link] = 0 Then [Link]("Une erreur sest produite lors de la mise jour de la base de donnes") [Link]("vous souhaitez :") [Link]("1 - continuer les mises a jour") [Link]("2 - annuler les mises a jour") [Link]("3 - annuler la mise a jour de cette ligne mais continuer pour les autres lignes) reponse = [Link]() Select Case reponse Case 1 [Link] = [Link] Case 2 [Link] = [Link] Case 3 [Link] = [Link] End Select End If End Sub
[Link]
Les transactions permettent de regrouper dans une entit, un ensemble de commandes SQL. Ce regroupement va garantirque,silunedesinstructionscontenuesdanslatransactionchoue,labasededonnespourraretrouverson [Link],dansvotre basededonnes,unetablepourlescomptesdesparticuliersetunetablepourlescomptesdesentreprises. Letransfertduncompteentrepriseversuncompteparticulier(lepaiementdevotresalaire)pourraitseffectueravec lesinstructionssuivantes : Imports [Link] Module TestTransaction Dim cmdPart, cmdEnt As SqlCommand Dim ctn As SqlConnection Dim numParticulier, numEntreprise, montantPart, montantEnt As SqlParameter Public Sub main() ctn = New [Link]() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" [Link]() cmdEnt = New [Link] [Link] = ctn [Link] = "Update ComptesEntreprise set solde= solde-@montant where numCompte=@numCompte" numEntreprise = New SqlParameter("@numCompte", [Link]) [Link] = 1234 [Link](numEntreprise) montantEnt = New SqlParameter("@montant", [Link]) [Link] = 3000 [Link](montantEnt) [Link]() cmdPart = New [Link]
- 20 ENI Editions - All rigths reserved
[Link] = ctn [Link] = "Update ComptesParticulier set solde= solde+@montant where numCompte=@numCompte" numParticulier = New SqlParameter("@numCompte", [Link]) [Link] = 5678 [Link](numParticulier) montantPart = New SqlParameter("@montant", [Link]) [Link] = 3000 [Link](montantPart) [Link]() [Link]() End Sub End Module Quesepassetil,sipendantlexcutiondececodeleserveurdebasededonnesdevientindisponiblecausedun problmerseauparexemple ?Loprationdedbitpeutavoirteffectuealorsqueloprationdecrditnapaspu [Link](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 [Link]. Pourscuriserlecodeprcdent,nouspourrionsutiliserlaversionsuivante : Imports [Link] 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 [Link]() [Link] = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=true" [Link]() trans = [Link] Try cmdEnt = New [Link] [Link] = ctn [Link] = "Update ComptesEntreprise set solde=solde@montant where numCompte=@numCompte" numEntreprise = New SqlParameter("@numCompte", [Link]) [Link] = 1234 [Link](numEntreprise) montantEnt = New SqlParameter("@montant", [Link]) [Link] = 3000 [Link](montantEnt) place lexecution de la commande dans la transaction [Link] = trans [Link]() cmdPart = New [Link] [Link] = ctn [Link] = "Update ComptesParticuliers set solde=solde+ @montant where numCompte=@numCompte" numParticulier = New SqlParameter("@numCompte", [Link]) [Link] = 5678 [Link](numParticulier) montantPart = New SqlParameter("@montant", [Link]) [Link] = 3000 [Link](montantPart) [Link] = trans [Link]() [Link]() Catch ex As Exception [Link]()
- 21 -
[Link]("toutes les oprations ont ete annulees") End Try [Link]() 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 -
PrsentationdeLINQ
Aprs de nombreuses annes dvolution les langages objets sont devenus incontournables dans les dveloppements [Link] : lesbases [Link] 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. [Link] fautdanscecasraliserdesconversionssouventgourmandesentempsetmmeparfoisdangereuses.
[Link] : Language IntegratedQuery ou Langage de requte intgr ? Il sagit donc dunlangagederequtepermettantlinterrogationde [Link] ?[Link] 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 [Link]. Il ny a donc pas besoin de raliser manuellement les oprations de conversion. Si elles sont ncessaires, elles seront [Link],regardonsmaintenantlasyntaxedeLINQ.
- 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 [Link] 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 [Link] Dim ligne As String Dim col As String() Dim nom As String = "" f = New [Link]("c:\[Link]", [Link]) Do ligne = [Link] If Not IsNothing(ligne) Then col = [Link](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)} [Link](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)}} [Link](co) [Link] = cl
- 1-
[Link](co) End If Loop Until ligne Is Nothing [Link]() End Sub Danslesexemplesquisuivent,noussupposeronsquecetteportiondecodeadjtexcutepourremplirlesdeux [Link].
[Link]
UnerequteLINQestconstituedetroisactions :
q
La premire tape est trs simple puisque pour pouvoir tre utilise comme source de donnes, une classe doit simplementimplmenterlinterfacegnriqueIEnumerable(T).[Link] quisontdoncdirectementutilisablesdansdesrequtesLINQ. Pourlessourcesdedonnesnimplmentantpascetteinterface,commeparexempleundocumentXML,desclasses utilitairespermettentdelesrendrecompatiblesavecLINQ. Leplusgrosdutravailestconstituparladeuximetape : lacrationdelarequteellemme. Danslarequte,nousallonsindiquerquellesinformationsnoussouhaitonsobtenirdelasourcededonnes,comment ellesseronttries,regroupesoustructures. Larequtecontienttroisclauses :
q
VoicidonccidessousnotrepremirerequteLINQ. Dim requete = From unClient In listeClients _ Where [Link] Like "A*" _ Select unClient [Link] 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 [Link]([Link]) Next Cemcanismepermetdexcuterplusieursfoislammerequtesanstreobligdelaredfinirchaqueexcution. Cependant,danscertainscas,[Link] parexemple,[Link],nousrecherchonscombienil [Link] calculdsladfinitiondelarequte. Dim nbClients = (From unClient In listeClients _ Where [Link] Like "A*" _ Select unClient).Count [Link](nbClients)
- 2-
[Link],lemotclJoinpermetde [Link] etpourchacunrcupreladatedetouteslescommandes. Dim requete3 =From unClient In listeClients _ Join uneCommande In listeCommandes _ On [Link] Equals [Link] _ Where [Link] Like "A*" _ Select nomCli = [Link], _ dateCde = [Link] For Each r In requete3 [Link]([Link] & " Next
[Link] [Link] classe Client et une instance de la classe Commande pour simplement ces deux informations. Le compilateur gnre doncuneclasseanonymepourcesdeuxinformationsavecuneproprit nomClietuneproprit [Link] lavariable rutilisedanslaboucleFor Eachpourparcourirlersultatdelarequteseradterminimplicitementpour correspondreautypeanonymecrparlecompilateur.
[Link]
LesoprateurspermettantlacrationderequteLINQpeuventtreclasssenhuitcatgories :
q
Pour crire des requtes LINQ efficaces, il convient de bien connatre ces oprateurs. Nous allons donc les dtailler avecdenombreuxexemples.
[Link]
[Link] Order By, [Link] leurnombredecommandes. Dim requeteTri1 = From unclient In listeClients _ Order By [Link] _ Select unclient For Each unClient In requeteTri1 [Link]([Link] & "nb commandes:" & [Link]) 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 [Link] Descending _ Select unclient For Each unClient In requeteTri2 [Link]([Link] & "nb commandes:" & [Link]) Next Plusieurscritresdetripeuventtreindiquspourleverlesambigutslorsquedeuxpropritsontlammevaleur. [Link] commandesdanslordredcroissantpuissurlenomduclientdanslordrecroissantencasdgalitdunombrede commandes. Dim requeteTri3 = From unclient In listeClients _ Order By [Link] Descending, [Link] Ascending _ Select unclient For Each unClient In requeteTri3 [Link]([Link] & "nb commandes:" & [Link]) Next
[Link]
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. [Link] [Link],celleci neseralistequuneseulefois. Dim requeteEnsemble = From unclient In listeClients _ Order By [Link] _ Select [Link] Distinct For Each ville In requeteEnsemble [Link](ville) Next
[Link]
Le filtrage consiste rduire le nombre dlments retourns par la requte. Une ou plusieurs expressions sont ajouteslarequtelaidedelaclause [Link]. [Link] dechanesdecaractresdansuneclause [Link] =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 [Link]("nantes", [Link]) _ Select unclient For Each unclient In requeteFiltrage [Link]([Link]) Next
[Link]
[Link] estconstitueparlensemble des proprits de lobjet spcifi dans la clause [Link],on [Link] proprit directement ou bien excuter une fonction prenant comme paramtre la proprit. Cest dans ce cas le
- 4 ENI Editions - All rigths reserved
[Link] originalsanslemodifier. Dim requeteProjection = From unclient In listeClients _ Select nomCli = [Link], villeCli = [Link] For Each r In requeteProjection [Link]([Link] & " " & [Link]) 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 [Link]([Link] & " " & [Link]) Next Ce genre dopration conduit trs rapidement une explosion combinatoire. En effet, le nombre dobjets dans le [Link] permettantderestreindrelenombredobjetsdanslersultatestengnralsouhaitableaveccetypedeprojection. Dim requeteProjection2 = From unclient In listeClients _ From unCommande In listeCommandes _ Where [Link]([Link]) _ Select cli = unclient, cmd = unCommande For Each r In requeteProjection2 [Link]([Link] & " " & [Link]) Next
[Link]
Le partitionnement consiste dcouper en deux parties un ensemble de donnes et retourner une des deux [Link],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 [Link] _ Skip [Link] - 10 _ Select unclient For Each unclient In requetePartition [Link]([Link]) Next Pourillustrerlasyntaxeconditionnelle,nousrecherchonsmaintenanttouslesclientsayantunnombredecommandes infrieurougal5. Dim requetePartition1 = From unclient In listeClients _ Order By [Link] Descending _ Skip While [Link] > 5 _ Select unclient For Each unclient In requetePartition1
- 5-
[Link]([Link] & " " & [Link]) Next Pourrcompensernosclientsfidles,recherchonsmaintenantlesdixmeilleursdentreeux. Dim requetePartition2 = From unclient In listeClients _ Order By [Link] Descending _ Take 10 _ Select unclient For Each unclient In requetePartition2 [Link]([Link]) Next Etenfinrecherchonslesclientsayantpasssaumoinsdixcommandes. Dim requetePartition3 = From unclient In listeClients _ Order By [Link] Descending _ Take While [Link] >= 10 _ Select unclient For Each unclient In requetePartition3 [Link]([Link] & " " & [Link]) Next
[Link]
Lajointurededeuxsourcesdedonnescorrespondlassociationdunedessourcesdedonnesaveclesobjetsde lautre source de donnes ayant une proprit commune. En programmation objet, les jointures permettent de [Link],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 [Link] chaqueclient. Dim requeteJoin = From unclient In listeClients _ Join uneCommande In listeCommandes On unclient Equals [Link] _ Select unclient, uneCommande For Each r In requeteJoin [Link]([Link] & " " & [Link]) Next Pour chaque commande les informations concernant le client sont rptes. Une solution plus efficace consiste [Link] Group Joinpermetde raliser ce regroupement. Il est galement ncessaire dans ce cas de spcifier avec la clause Into, le nom de la propritutilisepouraccderauregroupement,[Link] quecettepropritferadoublonaveccellequenousavonsdjprvuedansnotreclasseClient. Dim requeteGroupJoin = From unclient In listeClients _ Group Join uneCommande In listeCommandes On unclient Equals [Link] _ Into CommandesDuClient = Group _ Select unclient, CommandesDuClient For Each r In requeteGroupJoin [Link]([Link]) For Each c In [Link] [Link](vbTab & [Link]) Next Next Un regroupement peut galement tre ralis sans pour autant faire de jointure entre deux sources de donnes. Nouspouvons,parexemple,[Link],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-
Lalistedesclientsparlintermdiairedelapropritindiquedanslarequte.
Dim requeteGroup = From unclient In listeClients _ Group unclient By [Link] _ Into ClientsParVille = Group _ Select ville, ClientsParVille For Each r In requeteGroup [Link]([Link]) For Each c In [Link] [Link](vbTab & [Link]) Next Next
[Link]
Lesquantificateurssontutilisspourcontrlersidansunelisteaumoinsunlmentremplituneconditionousitous [Link] estutilisdansuneclause [Link],nousrecherchonslesclientsdonttouteslescommandesontt passesen2007. Dim requeteQuantifier = From unclient In listeClients _ Where (Aggregate cmd In [Link] Into All ([Link] = 2007)) _ Select unclient For Each unclient In requeteQuantifier [Link]([Link]) For Each c In [Link] [Link](vbTab & [Link]) Next Next Ladeuximeversionpermetderechercherlesclientsayantpassaumoinsunecommandeen2008. Dim requeteQuantifier1 = From unclient In listeClients _ Where (Aggregate cmd In [Link] Into Any ([Link] = 2008)) _ Select unclient For Each unclient In requeteQuantifier1 [Link]([Link]) For Each c In [Link] [Link](vbTab & [Link]) Next Next
[Link]
Lesoprationsdagrgationsontutilisespourlecalculdunevaleuruniquepartirdevaleurscontenuesdansune [Link] :
q
Lexemplesuivantappliquecesquatreoprateurssurlesfraisdeportdetouteslescommandes. Dim moyennePort = Aggregate unCommande In listeCommandes Into Average([Link]) [Link]("moyenne des frais de port : " & moyennePort)
- 7-
Dim maxiPort = Aggregate unCommande In listeCommandes Into Max([Link]) [Link]("maximum des frais de port : " & maxiPort) Dim miniPort = Aggregate unCommande In listeCommandes Into Min([Link]) [Link]("minimum des frais de port : " & miniPort) Dim totalPort = Aggregate unCommande In listeCommandes Into Sum([Link]) [Link]("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-
LINQversSQL
[Link] saitparfaitementmanipulerleslistes,[Link] gravehandicap : [Link] pallier ce problme consiste confier une base de donnes le soin dassurer la persistance des informations aprs [Link] [Link] 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,[Link] [Link] [Link] [Link] [Link].
[Link]
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.
[Link]
[Link] [Link] :
q
Chaqueoptiondoittreprcdeparuncaractre/etsuivieparlecaractre :etdelavaleurdeloptionsibesoin. Lesoptionsdeconnexion : /server:<nomduserveur> IndiquelenomouladresseIPduserveurdebasededonnes. /database:<nomdelabasededonnes> Indiquelenomdelabasededonnespartirdelaquellelagnrationdoittreeffectue. /user:<nomdeconnexion> [Link] spcifie,cestlauthentificationWindowsquiserautilise. /password:<motdepasse> Indiquelemotdepasseassociaucompteutilispourtablirlaconnexion. /conn:<chanedeconnexion>
- 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> [Link],ilnyapasdespacedenom. /context :<nom> [Link],cenomestdduitdunomdelabasededonnes. /entitybase :<nom> [Link],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:[Link] Lecodegnrtanttropvolumineuxpourlelisterici(environ3500lignes),voicisimplementciaprslediagramme desclassesquionttgnres.
- 2-
NousavonslaclasseNorthwindquihritedelaclasseDataContextetquivatrsrapidementnousservirpourque [Link] [Link]. GnrationdufichierdemappagedelabaseNorthwindsituesurlordinateurlocal : SqlMetal /server:localhost /database:northwind /dbml:[Link] Cettecommandegnreunfichierxmldontvoiciunextrait : <Table Name="[Link]" Member="Customers"> <Type Name="Customers"> <Column Name="CustomerID" Type="[Link]" DbType="NChar(5) NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> <Column Name="CompanyName" Type="[Link]" DbType="NVarChar(40) NOT NULL" CanBeNull="false" /> <Column Name="ContactName" Type="[Link]" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="ContactTitle" Type="[Link]" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="Address" Type="[Link]" DbType="NVarChar(60)" CanBeNull="true" /> <Column Name="City" Type="[Link]" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Region" Type="[Link]" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="PostalCode" Type="[Link]" DbType="NVarChar(10)" CanBeNull="true" /> <Column Name="Country" Type="[Link]" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Phone" Type="[Link]" DbType="NVarChar(24)" CanBeNull="true" /> <Column Name="Fax" Type="[Link]" 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 [Link],nousavonsfrancislesnoms. <Table Name="[Link]" Member="Clients"> <Type Name="Clients"> <Column Name="CustomerID" Member="CodeClient" Storage="_CustomerID"
- 3-
Type="[Link]" DbType="NChar(5) NOT NULL" IsPrimaryKey="true" CanBeNull="false" /> <Column Name="CompanyName" Member="NomSociete" Storage="_CompanyName" Type="[Link]" DbType="NVarChar(40) NOT NULL" CanBeNull="false" /> <Column Name="ContactName" Member="NomContact" Storage="_ContactName" Type="[Link]" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="ContactTitle" Member="Fonction" Storage="_ContactTitle" Type="[Link]" DbType="NVarChar(30)" CanBeNull="true" /> <Column Name="Address" Member="Adresse" Storage="_Address" Type="[Link]" DbType="NVarChar(60)" CanBeNull="true" /> <Column Name="City" Member="Ville" Storage="_City" Type="[Link]" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Region" Type="[Link]" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="PostalCode" Member="CodePostal" Storage="_PostalCode" Type="[Link]" DbType="NVarChar(10)" CanBeNull="true" /> <Column Name="Country" Member="Pays" Storage="_Country" Type="[Link]" DbType="NVarChar(15)" CanBeNull="true" /> <Column Name="Phone" Member="Tel" Storage="_Phone" Type="[Link]" DbType="NVarChar(24)" CanBeNull="true" /> <Column Name="Fax" Type="[Link]" 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:[Link] /language:vb [Link] Ilnousrestevisualiserlaclassegnrepourvrifierquenosmodificationsontbientprisesencompte.
- 4-
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.
[Link]/Relationnel
Le concepteur Objet/Relationnel fournit une solution trs pratique pour crer le modle objet dune application [Link] et fonctions autorisant lutilisation des procdures stockes et fonctions prsentes dans la base de donnes. Il comportecependantquelqueslimitations :
q
seuleslesbasesdedonnesSQLServer2000,SQLServer2005,SQLServerExpresssontsupportes. [Link] classepourreprsenterlersultatdunejointureentreplusieurstables. Le concepteur fonctionne en sens unique car seules les modifications effectues dans le concepteur sont [Link] compte dans le concepteur. Pire encore si des modifications sont faites dans le concepteur aprs des modificationsmanuellesducode,cesmodificationssontperdueslorsdelenregistrementduconcepteurcar [Link] fichierindpendantdeceluimanipulparleconcepteur.
Le concepteur Objet/Relationnel est lanc automatiquement lors de lajout dun lment de type LINQ to SQL [Link],lasurfacedu [Link]
- 5-
[Link] DataContextgnr.
Ajoutdeclasses Vouspouvezcrerlesclassesreprsentantlestablesdunebasededonnesenralisantunglisserdplacerdune [Link] ajout au concepteur Objet/Relationnel est galement utilis pour configurer les proprits de connexion du DataContext. Si un autre lment provenant duneautrebasededonnesestajout,unebotededialoguevous [Link] [Link] pourqueleDataContextinitialiselespropritsduneinstancedelaclassepartirdesinformationsprsentesdans [Link] [Link] 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, [Link],cespropritssontinitialisesaveclavaleurUseRuntimepourindiquerquelecodechargdes [Link] [Link].
- 6-
Aprslaslectiondelaprocdurestockevousdevezindiquercommentserontrenseignslesparamtresattendus [Link]. 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.
[Link] classe enfant de la relation. La classe parente est la classe qui se trouve lextrmit un dune relation un plusieurs,[Link],danslassociationentreles classes Product et Category, la classe Category reprsente le ct un de la relation et la classe Product le ct [Link] [Link] [Link]
- 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 [Link] [Link],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 [Link] [Link] stocke,[Link] trssimplementeneffectuantunglisserdplacerentrelexplorateurdeserveursetleconcepteurObjet/Relationnel. Il faut cependant tre attentif lorsque vous ajoutez une procdure stocke ou une fonction car lemplacement o [Link] 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 [Link] AS TenMostExpensiveProducts, [Link] FROM Products ORDER BY [Link] 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 [Link]. Public Function Ten_Most_Expensive_Products() As ISingleResult (Of Ten_Most_Expensive_ProductsResult) Dim result As IExecuteResult = [Link](Me, CType(MethodInfo. GetCurrentMethod,MethodInfo)) Return CType([Link],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 [Link] DESC Nouspouvonsmaintenantrefairelammeoprationetobtenirlafonctionsuivantequicettefois,retournebienune listedeproduits. Public Function Ten_Most_Expensive_Products() As ISingleResult(Of Product) Dim result As IExecuteResult = [Link](Me, CType(MethodInfo. GetCurrentMethod,MethodInfo)) Return CType([Link],ISingleResult(Of Product)) End Function Hritagedeclasses Commenimportequelleclasse,lesclassesgnresparleConcepteurObjet/Relationnelpeuventutiliserlhritage. Parcontre,ctbasededonnes,[Link] [Link],consistecrer unetableuniquequicontiendralafoislesinformationsdesobjetsdelaclassedebaseetlesinformationsdela
- 9-
[Link] cettecolonne,ilestfacilededterminersilalignedoittrereprsenteparuneinstancedelaclassedebaseou une instance de la sousclasse. Nous allons modifier la table Products pour pouvoir mettre cette technique en [Link] discriminateur.Silavaleurquellecontientestgale1,[Link] 2,[Link],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,[Link] consiste ajouter la table constituant la classe de base. Puis ajoutez un deuxime exemplaire de cette table et [Link] [Link] desclasses,[Link],enneconservantdanslaclassedrivequelaproprit [Link] 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.
[Link]
LesrequtesLINQpourSQLutilisentrigoureusementlammesyntaxequecellesquenousavonstudiesdansle [Link],sontextraitesdelabasededonnes [Link] [Link] [Link] requteLINQverslabasededonnes. Dim dc As NorthWind dc = New NorthWind Dim requete = From unClient In [Link] _ Where [Link] Like "A*" _ Select unClient
- 10 -
For Each Client In requete [Link]([Link]) Next Danscecode,laclasseNorthWindcorrespondauDataContextetcestdoncparsonintermdiairequelesdonnes [Link] ? En fait la mthode la plus naturelle pour obtenir des informations en provenance dune base de donnes est de [Link] vrifier, nous pouvons demander au DataContext (NorthWind dans notre cas) dafficher sur la console le code SQL [Link],ilsuffitsimplementdinitialiserlapropritLogduDataContextendirection delaconsoleavantlacrationdelarequteLINQ. Dim dc As NorthWind dc = New NorthWind [Link] = [Link] Dim requete = From unClient In [Link] _ Where [Link] Like A* _ Select unClient For Each Client In requete [Link]([Link]) 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 [Link]. Essayonsdexcuteruneautrerequteenreprenantlarequtenouspermettantdobtenirlesdatesdecommande dechacundesclients. Dim requeteGroupJoin = From unclient In [Link] _ Group Join uneCommande In [Link] On unclient Equals [Link] _ Into CommandesDuClient = Group _ Select unclient, CommandesDuClient For Each r In requeteGroupJoin [Link]([Link]) For Each c In [Link] [Link](vbTab & [Link]) 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], (
- 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 [Link] ceniveauquersidelapuissancedeLINQversSQL. Cette facilit ne se limite pas lextraction dinformations depuis la base de donnes car LINQ vers SQL est galementcapabledegrerlesmisesjourdesinformationsverslabasededonnes.
[Link]
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 [Link] cettetechniqueenfaisantdmnagernosclientsNantaisversSaintHerblain. Dim clientsNantais = From unclient In [Link] _ Where [Link] = "Nantes" _ Select unclient For Each unclient In clientsNantais [Link] = "Saint Herblain" [Link] = "44800" Next [Link]() 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) [[Link]] -- @p9: Input NVarChar (Size = 11; Prec = 0; Scale = 0) [[Link]] -- @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 [Link] cela, nous appelons la mthode DeleteOnSubmit de la table laquelle appartient llment, en lui passant comme [Link],nousdevonsensuiteappelerlamthodeSubmitChanges [Link].
- 12 -
Dim suppressionClient = From unclient In [Link] _ Where [Link] = "Brazil" _ Select unclient For Each unclient In suppressionClient [Link](unclient) Next [Link]() 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 [Link] [Link] :
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 [Link] _ Where [Link] = Brazil _ Select unclient For Each unclient In suppressionClient For Each uneCommande In [Link] For Each uneLigne In uneCommande.Order_Details dc.Order_Details.DeleteOnSubmit(uneLigne) Next [Link](uneCommande) Next [Link](unclient) Next [Link]() Aveccettesolution,ilnyaplusdeproblmesetnosclientsBrsilienssontbieneffacsdelabasededonnes. Ajoutdedonnes [Link] [Link] souhaite ajouter dans la base de donnes. Lobjet ainsi configur doit tre ensuite insr dans la table du [Link],nous allonsajouterunnouveauclientdanslabasededonnes. Dim nouveauClient As Customer
- 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 = "[Link].29" .Phone = "[Link].28" .PostalCode = "44800" End With [Link](nouveauClient) [Link]()
[Link]
[Link] produire des conflits lorsque les mmes enregistrements de la base de donnes sont mis jour par plusieurs [Link] tapes :
q
Si un conflit est dtect une exception de typeChangeConflictException est dclenche. Lappel de la mthode SubmitChangesdoitdonctreplacedansunblocTryCatchpourrcuprerlexception. Obtenirlesinformationssurlesconflits DansleblocCatch,nouspouvonsobtenirdesinformationssurlesconflitsenparcourantlacollectionChangeConflicts
- 14 -
[Link] ObjectChangeConflict. La proprit Object [Link] 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
[Link] 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. [Link] 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 [Link] _ Where [Link] = "BOLID" _ Select unClient For Each cl In rqt [Link] = "Barcelone" Next [Link]("modifier le code postal du client BOLID dans la base puis taper une touche") [Link]() Try [Link]([Link]) Catch ex As ChangeConflictException For Each o As ObjectChangeConflict In [Link] [Link]([Link]) [Link]([Link]) [Link]([Link]) Next End Try [Link]("lobjet client :") [Link]("city:" & [Link]) [Link]("postalCode:" & [Link]) For Each cli In rqt [Link]("le client dans la base :") [Link]("city:" & [Link]) [Link]("postalCode:" & [Link]) Next
- 15 -
Prsentation
Le langage XML (eXtensible Markup Language) est un langage permettant la reprsentation de donnes. Il permet dencapsulertouttypededonnes,enlesreprsentantsouslaformedune arborescence. Cellescisontcritesentre [Link] [Link] [Link],galement,souventutiliscommeformatdestockagepourlesparamtresdeconfiguration dune application. Visual Studio et Windows lutilisent cet effet de manire courante. Ce langage a t conu par le W3C( WorldWideWebConsortium).Cestdoncsurlesite [Link] desspcificationsdecelangage. [Link],cesdeuxlangages [Link] :
q
LelangageXMLsedistinguedulangageHTMLparlespointssuivants :
q
Pourpouvoirtrefacilementmanipules,lesdonnesXMLdoiventtreconfiesunprocesseurXML. UnprocesseurXMLestunmodulelogiciel,[Link] le traitement XML sexplique par la complexit que reprsente le dveloppement dun processeur XML, totalement [Link],pourquunprocesseurXMLsoitconsidrtotalementfonctionnel,sonfonctionnementdoitsuivre [Link] silexisteuneversionplusrcenteduprocesseurXMLquecelleinstallesurvotremachine.
- 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.
[Link]
UndocumentXMLpeuttreconstitudeslmentssuivants : Instructiondetraitement Lesinstructionsdetraitementpermettentdincorporer,dansundocumentXML,desinformationsdestinesauprocesseurXMLou [Link] uneapplicationtravaillantsurledocument. Linstructiondetraitementestinsredansledocumentaveclasyntaxesuivante : < ?nomApplication instruction ?> [Link]. UndocumentXMLcontientengnraluneinstructiondetraitementspcialepourdfinirlaversiondeXMLaveclaquelleledocument estconformeetlecodagedescaractresutilisparledocument. <?xml version="1.0" encoding="utf-8" ?> Commentaires [Link] [Link]. Lasyntaxesuivantedoittreutilisepourplaceruncommentairedansledocument. <!--ceci est un commentaire> lintrieurducommentairelutilisationdescaractresestinterdite :
Dessquencesdecaractrespluslonguespeuventtreincorpores,[Link] : <![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 [Link] :
- 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
- 2-
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 [Link] 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,[Link] [Link],ilfautajouterdanschacundesfichiersune [Link] xmlnssuividun prfixeetdelidentifiantdelespacedenom. Lasyntaxeestlasuivantepourchacundenosdeuxfichiers : <restaurant xmlns:resto="[Link] <application xmlns:appli="[Link] Ilesttrsimportantquelesidentifiantsdespacesdenomsoientuniques,sivoussouhaitezchangerdesinformationsavecdautres [Link],ilestcourantdutiliserlenomdedomainedelentreprisedanslidentifiant(celuicitantsupposunique). Avec cettemodification,nouspouvonsutiliserdanslemmefichierdeslments menuet entrees,enajoutantdevantleprfixede lespacedenomdanslequelilsontunesignification. <fusion xmlns:appli="[Link] xmlns:resto= "[Link] <appli:menu nom="fichier"> <appli:entrees>enregistrer</appli:entrees> </appli:menu> <resto:menu nom="economique"> <resto:entrees>avocat</resto:entrees> </resto:menu> </fusion>
- 3-
[Link]
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.
[Link]
Un document est bien form sil obit aux rgles syntaxiques du langage XML. Ces rgles sont beaucoup moins strictes que les [Link],[Link] processeurXML,[Link],ilarrteimmdiatementletraitementdu document.
[Link]
Un document valide est un document XML auquel est lie une DTD (dfinition du type de document) et qui respecte toutes les [Link],ilrecherchedanslaDTDune dfinitionpourtoutlment,attribut,[Link],ilarrteletraitement.
- 4-
ManipulationdundocumentXML
La manipulation dun document XML dans une application [Link] 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 [Link] :
q
Unn udnepossdequunseuln udparent,quiestlen udsitujusteaudessusdelui. Leseuln udquiestdpourvudeparentestlaracinedudocument,puisquilsagitdun uddepremierniveau quicontientledocumentluimmeetlesfragmentsdedocument. Laplupartdesn udspeuventcomporterplusieursn udsenfants,quisontlesn udssitusdirectementsous eux. Lesn udssitusaummeniveau,reprsentsdanslediagrammeparlesn udsmenuetvins,sontdesn uds frres.
- 1-
Dansnotreexemple,prix="10"associllmentmenu,lemotprixcorrespondaunometlavaleurdelattributprixest [Link]="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>
[Link]
Lapremiretape,lorsdelutilisationdeDOM,consistechargerledocumentXMLdansunarbreden [Link] devezpourceladclarerunobjet XmlDocumentpuisutiliserlamthode Loadpourremplircetobjetpartirdunfichier XML. dim as XmlDocument doc = New [Link]() [Link]([Link]) [Link],danscecas, utiliserlamthodeLoadXMLenluifournissantlachanedecaractrescontenantlesdonnesXML. UnefoislesdonnesXMLchargesdanslarbre,vouspouvezlocaliserdesn udsparticuliersafindelessoumettre desoprationsdetraitement,[Link] GetElementsByTagNamepermetdobtenir unobjet XmlNodeListcontenantlesn [Link] udenutilisantla propritAttributesouvrifiersilspossdentdesn [Link],vous avezaccscesn udslaidedelapropritChildNodessousformedunobjetXmlNodeList. Lexemplesuivantrecherchelesn udsmenudanslarboresenceetaffichelattributtype. menus = [Link]("menu")
- 2-
For Each unMenu In menus [Link]([Link]("type").Value) Next Lescaractristiquesdesn [Link] udsmenupeuvent parexemplerecevoirunattributprix. menus = [Link]("menu") Dim att As XmlAttribute For Each unMenu In menus If [Link]("type").Value = "gastronomique" Then att = [Link](prix") [Link] = "50 " [Link](att) End If If [Link]("type").Value = "economique" Then att = [Link](prix") [Link] = "15 " [Link](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 = [Link]("menu") Dim att As XmlAttribute For Each unMenu In menus If [Link]("type").Value = "gastronomique" Then Dim n1, n2, n3 As XmlNode n1 = [Link]([Link], "digestif", "") n2 = [Link]([Link], "nom", "") n3 = [Link]([Link], , ) [Link] = "Cognac" [Link](n3) [Link](n2) [Link](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>
- 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. [Link]("[Link]")
[Link]
[Link] lutilisationdunecrituredetypepath,[Link] la structure hirarchique dun document XML comme dans une arborescence de rpertoires. Pour avoir une ide de lintrtdeXPath,[Link] sarrterlcarlasyntaxenavraimentrienvoir !
[Link]
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 = [Link]() partirdecetteinstance,nousallonspouvoirlancerdesrecherchesdansledocumentlaidedelamthodeSelect. Cette mthode utilise comme paramtre une chane de caractres contenant le chemin XPath de recherche. Nous obtenons,aprslexcution,unobjetXPathNodeIteratorpermettantdeparcourirlalistedesn udstrouvs. [Link],lesentresdisponiblesdanslesdiffrentsmenus : Dim document As XmlDocument = New XmlDocument () [Link]("[Link]") Dim navigateur As XPathNavigator = [Link]() Dim noeuds As XPathNodeIterator = [Link]("/restaurant/menu/entrees") While [Link]() [Link]([Link]) [Link]() 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-
</entrees> IlestgalementpossibledajouterlarequteXPathdescritresdeslectionsurlavaleurdecertainsattributs. Lexemplesuivantrecherchelesdessertsdumenugastronomiquepourlesquelslescaloriessontinfrieures350 . Dim document As XmlDocument = New XmlDocument () [Link]("[Link]") Dim navigateur As XPathNavigator = [Link]() Dim noeuds As XPathNodeIterator = [Link]("/restaurant/menu[@type= gastronomique]/desserts/nom[@calories^]) While [Link]() [Link]([Link]) [Link]() End While
[Link]
Aprsavoirtrouvunlmentdanslarborescencedundocument,ilestbiensrpossibledenmodifiersavaleur. Lexemplesuivantdiminuede50%lescaloriesdechaquedessertdumenugastronomique. Dim document As XmlDocument = New XmlDocument() [Link]([Link]) Dim navigateur As XPathNavigator = [Link]() Dim noeuds As XPathNodeIterator = [Link](/restaurant/menu [ @type=gastronomique]/desserts/nom) While [Link]() [Link](calories, ) [Link]([Link] * 0.5) End While [Link]([Link]) 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>
- 5-
<nom calorie="240">camembert</nom> </fromages> <desserts> <nom calories="340" parfum="a leau">glace</nom> </desserts> </menu> </restaurant>
[Link]
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() [Link]([Link]) Dim navigateur As XPathNavigator = [Link]() Dim noeuds As XPathNodeIterator = [Link]("/restaurant/menu[@type= gastronomique]/desserts") [Link]() [Link]("<nom calories=800>crepes</nom>") [Link]("[Link]") 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-
Introduction
Maintenantquevotreapplicationesttermine,teste,dbogueetdoncquellefonctionnesansproblmes,ilesttemps [Link] :
q
Nousallonsdoncdtaillerchacunedecesdeuxtechniquesdedploiement.
- 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,[Link] la suite utilises lors de la dsinstallation de lapplication. Windows Installer effectue alors les oprations inverses [Link] nencessiteunfichier,[Link] 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.
[Link]
Lamthodedecrationdunprojetdinstallationestidentiquecelleutilisepournimportequelautretypedeprojet [Link],slectionnez Ajouter,puis [Link] deprojet,slectionnezensuite Autrestypesdeprojetset [Link] 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 : [Link] delalicencedeVisualStudioutilispourdvelopperlapplication. DetectNewerInstalledVersion : indique si le programme dinstallation vrifie lexistence dune version plus [Link]. ManufacturerUrl : [Link] 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 [Link],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 [Link] 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.
- 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 [Link] [Link].
[Link]
La configuration du fonctionnement du programme dinstallation se fait par lintermdiaire dun diteur spcifique [Link] 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.
[Link]
[Link], nousallonsindiquerlesmodificationsapporterausystmedefichiersdelordinateursurlequellapplicationvatre dploye.
- 2-
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 [Link] 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 [Link] maintenantlatouche[Ctrl]enfoncependantlaslection. [Link] raccourcidoitaupralabletrecrparlemenucontextueldelasortieprincipaledelapplication.
- 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.
[Link]
[Link] leregistredelamachinelorsdudploiement,[Link] 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 [Link] vousdemandedeconfirmervotrechoix.
- 4-
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)[Link] [Link] duregistredeWindows([Link]).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 [Link](.reg)contenantlesinformationsimporter.
[Link]
Lditeurdestypesdefichiersestutilispourindiquerlestypesdedocumentsetlesextensionsdefichierassocis [Link],lextensionetladescription dutypedefichierfigurentdanslalistedestypesdefichiersdusystme. Lassociationduntypedefichieravecuneapplicationncessitetroistapes :
q
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,[Link] sontdisponibles,[Link] 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 [Link] [Link]
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 [Link],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.
[Link]
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
Vouspouvezdplacerdesbotesdedialogueentrelesn udsdescatgoriesparunglisserdplaceroulaidedes commandesCouperetCollerdumenuEdition. Pour que linstallation se fasse sans botes de dialogue vous devez supprimer toutes les botes de dialogue dans lditeurdelinterfaceutilisateur. [Link] disponibles modifient [Link],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-
BotededialogueTermin LesinformationsconcernantlesmisesjourdisponiblessontaffichesparlapropritUpdateText.
[Link]
Cet diteur permet de spcifier des actions supplmentaires excuter sur lordinateur pendant linstallation. Par exemple,ilpeuttreutiledexcuterunprogrammecrantunebasededonnessurunserveur. Avantdepouvoirtreajoutesunprojetdedploiement,lesactionspersonnalisesdoiventtrecompilessous [Link],[Link] 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.
[Link]
Cet diteur doit tre utilis pour spcifier les conditions requises pour linstallation de votre application. Les conditionspeuventconcernerlarecherchedunfichier,[Link] [Link] 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 : [Link](* ?)nesontpasautoriss. Folder : spcifie le dossier dans lequel la recherche va dbuter. Les noms des dossiers spciaux reconnus parWindowsInstallerdoiventtresaisieentrelescaractres[et].Lavaleurpardfautest [SystemFolder].
- 7-
MaxDate : lefichierrecherchnedoitpastreplusrcentquecettedate. MaxSize : spcifielataillemaximale(enoctets)[Link] 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 : [Link] registre. Elle doit correspondre exactement au nom et au chemin daccs qui figurent dans le registre, espacesventuelscompris,sinonlarecherchedelacldansleregistrechoue. Root : [Link] :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 [Link] :
q
ComponentId : [Link] 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.
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.
- 9-
DploiementavecClickOnce
ClickOnceestunetechnologiededploiementpermettantdecrerdesapplicationsWindowsdontlamisejourpeut [Link] [Link]. Lesproblmessuivantssontfrquemmentrencontrslorsdudploiementduneapplication. Misejourdelapplication Avecunemthodededploiementclassique,lorsquunenouvelleversiondelapplicationestdisponible,lutilisateurdoit [Link] [Link],puis, lapplicationcomplte,misejourestrinstalleautomatiquementpartirdunnouveaudossier. Composantspartags Les applications dpendent souvent de composants partags, do lexistence dun risque potentiel de conflit de [Link],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 [Link] 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
[Link] [Link] [Link] [Link] dfaut,[Link] lapplicationpeutdemanderdesautorisationsdescuritplusleves. La mise jour de lapplication peut galement avoir plusieurs modes de fonctionnement. Elles peuvent tre automatiquesetdanscecas,lapplicationvrifiechaquedmarragesidesmisesjoursontdisponibles,puiselleles [Link] [Link].
[Link]
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.
- 1-
Le manifeste de dploiement dcrit comment lapplication est dploye, y compris lemplacement du manifeste [Link] Studio. Le manifeste de dploiement est copi vers lemplacement de dploiement. Cet emplacement peut tre un serveur Web,[Link] tous les fichiers de lapplication sont galement copis vers un lemplacement de dploiement spcifi dans le [Link] [Link]. 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,[Link] 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.
[Link]
Pour dployer une application ClickOnce, trois stratgies sont possibles. La stratgie que vous choisissez dpend [Link] :
q
InstallationpartirduWeboudunpartagerseau [Link] 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 [Link] 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.
[Link]
[Link] 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
Vous pouvez galement dterminer la frquence de vrification des mises jour effectue par lapplication ou [Link] duneconnexionrseau,lapplicationsexcutesansvrifierlesmisesjour,quellequesoitlastratgiedemisejour choisie. Vrificationdesmisesjouraprsledmarrage Par dfaut, lapplication tente de localiser et de lire le fichier manifeste de dploiement en arrireplan pendant son [Link],lorsdelaprochaineexcution,lutilisateurserainvittlchargeret installerlamisejour. Cette stratgie est tout particulirement adapte aux connexions rseau bande passante restreinte ou aux applicationsvolumineuses,pouvantncessiterdelongstlchargements. Vrificationdesmisesjouraudmarrage Aveccettestratgie,[Link] 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, [Link] pouvezdanscecasmarquerlamisejourcommetantobligatoireetdecefait,empcherlexcutionduneversion [Link]. Intervallesdemisejour Danslecadredesmisesjourautomatiquesvouspouvezgalementspcifierlafrquencedevrificationdesmises [Link],vouspouvezsouhaiterunevrificationchaqueexcutiondelapplication,unefoisparsemaineou une fois par mois. Si aucune connexion rseau nest disponible au moment spcifi pour la vrification, celleci est effectuelaprochaineexcutiondelapplication. Blocagedesmisesjour [Link],vous pouvez dployer une application simple qui ne sera jamais mise jour tout en bnficiant de la facilit dinstallation fournieparClickOnce.
[Link]
- 3-
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-
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.
- 5-
Lesoptionspossiblessont :
q
Lassistantvousproposeensuitedeconfigurerlastratgiedemisejour.
- 6-
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.
- 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-
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 [Link] :
q
La configuration des mises jour prvue lors de lutilisation de lassistant peut tre modifie par le bouton Mises jour.
- 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 [Link] [Link] 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 -
Lesoptionssuivantessontdisponibles : Languedepublication Spcifielalangue(etlesparamtresrgionaux)danslaquellelapplicationdoittrepublie. Nomdelditeur [Link],lavaleurdelaproprit RegisteredOrganizationde [Link],lenomduprojetestutilis. Nomduproduit [Link],lenomdelassemblyestutilis. URLdusupporttechnique [Link] facultative. Si elle est utilise, cette URL apparat dans lentre Ajout/Suppression de programmes pour votre applicationdanslePanneaudeconfigurationdeWindows. PageWebdedploiement [Link]. GnrerautomatiquementlapageWebdedploiementaprschaquepublication Si cette option est slectionne, le processus de publication gnre une page Web de dploiement chaque [Link]. OuvrirlapageWebdedploiementaprslapublication Sicetteoptionestslectionne,lapageWebdedploiementgnreautomatiquementsouvreaprslapublication.
- 11 -
BloquerlactivationdelapplicationviauneURL Si cette option est dsactive, lapplication sexcute automatiquement aprs linstallation. Si elle est active, lutilisateurdevradmarrerlapplicationpartirduraccourcideprogrammedansleMenuDmarrer. [Link] 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 [Link],leserveurWebnedoittreconfigurquepourdbloquerles troisextensionsdefichiersuivantes :
q
AutoriserletransfertdesparamtresdURLverslapplication [Link],lapplicationseracapabledaccderetdetraiterles informationsdeparamtredelURL. PourlesinstallationsdepuisunCDROM,dmarrerautomatiquementlinstallationdslinsertionduCDROM Sicetteoptionestslectionne,[Link] quisontinstallesviaCDRomouDVDRom. VrifierlesfichierstransfrssurunserveurWeb Sicetteoptionestactive,leprocessusdepublicationtlchargechaquefichierpourvrifierquilspeuventbientre [Link]. Utiliserlemanifestedapplicationpourlesinformationsdapprobation Lorsque cette option est slectionne, vous pouvez signer nouveau le manifeste de lapplication laide dun certificatcontenantvosproprescoordonnes.
- 12 -