Você está na página 1de 751

http://www.free-livres.

com/

Microsoft

Visual Basic 2010

Codes sources sur

www.pearson.fr

Michel Martin

LE P R O G RAM M E U R

Visual Basic 2010


Michel Martin

Pearson Education France a apport le plus grand soin la ralisation de ce livre afin de vous fournir une information complte et fiable. Cependant, Pearson Education France nassume de responsabilits, ni pour son utilisation, ni pour les contrefaons de brevets ou atteintes aux droits de tierces personnes qui pourraient rsulter de cette utilisation. Les exemples ou les programmes prsents dans cet ouvrage sont fournis pour illustrer les descriptions thoriques. Ils ne sont en aucun cas destins une utilisation commerciale ou professionnelle. Pearson Education France ne pourra en aucun cas tre tenu pour responsable des prjudices ou dommages de quelque nature que ce soit pouvant rsulter de lutilisation de ces exemples ou programmes. Tous les noms de produits ou marques cits dans ce livre sont des marques dposes par leurs propritaires respectifs.

Publi par Pearson Education France 47 bis, rue des Vinaigriers 75010 PARIS Tl. : 01 72 74 90 00 www.pearson.fr Mise en pages : TyPAO Collaboration ditoriale : Herv Guyader ISBN : 978-2-7440-4160-0 Copyright 2010 Pearson Education France Tous droits rservs

Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de la proprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sans le respect des modalits prvues larticle L. 122-10 dudit code.

Sommaire

Introduction. ......................................................  XIII

13. Traitements multitches/multicurs. ........ 315 14. Manipulation du Registre de Windows. .... 337 15. Fonctions API............................................... 353

I Faisons connaissance avec Visual Basic 2010

16. Implmenter un systme daide. ................ 361 17. Personnaliser Windows7............................ 383 18. Visual Basic et Microsoft Office.................. 403 19. Programmation WPF.................................. 413

1. Avant de commencer...................................  3 2. Le langage et lenvironnement. ..................  23 3. Nouveauts et concepts utiles du langage et de lenvironnement..................................  39

II Programmation Windows

151

III Programmation Internet

457

20. Composeur tlphonique. ........................... 459 21. Clients HTTP et FTP................................... 471 22. Applications web.......................................... 483 23. Annuaire de sites web.................................. 511 24. Favoris web................................................... 551 25. Services web. ................................................ 587 26. Silverlight. .................................................... 607 27. LINQ............................................................. 643 Annexe. Routines utiles..................................... 705 Index. .................................................................. 725

4. Botes de dialogue communes..................... 153 5. Un peu plus loin........................................... 169 6. Implmenter des menus.............................. 185 7. Barres doutils et barres dtat. ................. 201 8. Manipulation dobjets graphiques............. 213 9. Fichiers et dossiers. ..................................... 241 10. Jouer des sons WAV..................................... 259 11. Manipuler des donnes tabulaires. ............ 269 12. Bases de donnes.......................................... 287

Table des matires

Introduction. ......................................................  XIII

Commentaires..........................................  25 Oprateurs...............................................  26

I Faisons connaissance avec Visual Basic 2010

Tests.........................................................  26 Boucles. ...................................................  28 Conversion de donnes............................  28 Chanes de caractres. ............................  29 Dates et heures. .......................................  29 Collections dobjets.................................  29 Lenvironnement Visual Studio 2010..............  31 Dfinition dun nouveau projet................  32 Le systme de menus................................  33 Les barres doutils...................................  34 Les fentres filles. ....................................  35 3. Nouveauts et concepts utiles du langage et de lenvironnement........................................  39 Innovations de lenvironnement de dveloppement...........................................  41 Intgration de WPF dans lIDE...............  41 Projets fonds sur des modles................  42 Gestion des projets rcents......................  43

1. Avant de commencer......................................  3 Configuration requise pour utiliser Visual Basic 2010...........................................  4 Les diffrentes ditions de Visual Basic 2010. 4 Installation de Visual Studio 2010..................  6 Premier contact avec Visual Basic 2010.........  10 Les "solutions" Visual Basic....................  11 criture dun programme en Visual Basic.........................................  12 Modification des proprits des objets....  14 criture du code. .....................................  14 Test et dbogage. .....................................  15 2. Le langage et lenvironnement. ....................  23 Le langage Visual Basic..................................  24 Variables..................................................  24 Tableaux...................................................  25

VI

Visual Basic 2010

Multitargetting.........................................  44 Zoom dans le code...................................  45 Intellisense...............................................  45 Naviguer vers...........................................  45 Surbrillance des rfrences. ....................  46 Recherche des rfrences.........................  47 Gnrer partir de lutilisation..............  48 Gestionnaire dextensions. ......................  49 Data Binding avec un glisser-dposer dans WPF. ...............................................  49 Dbogage Intellitrace..............................  50 Publication en un clic..............................  50 Tests unitaires..........................................  52 Migrer un projet existant vers le Framework .NET 4.0....................  55 Innovations du langage Visual Basic 2010.....  57 Continuation de ligne implicite...............  57 Implmentation automatique des proprits. .........................................  58 Initialiseurs de collections.......................  58 Syntaxe simplifie pour dclarer des tableaux.............................................  60 Expressions Lambda multilignes et sous-routine. ........................................  61 Covariance et contravariance gnriques................................................  62 Prise en charge dquivalence de type....  63 Prise en charge dynamique. ....................  63 Programmation parallle. .......................  64 Concepts avancs issus des versions prcdentes de Visual Basic............................  64 Infrence de type......................................  64 Initialiseurs dobjets................................  66 Types anonymes.......................................  67

Mthodes dextension..............................  68 Gnriques...............................................  69 Types Valeur Nullable..............................  71 Oprateur IIf............................................  72 Support tendu du code XML..................  72 Dlgus non stricts.................................  73 Expressions Lambda................................  75 Mthodes partielles. ................................  76 Le langage LINQ.....................................  76 Techniques volues de Visual Studio 2005/2008 toujours dactualit dans Visual Studio 2010................  77 Alignement des contrles.........................  77 Menus. .....................................................  77 Barres doutils.........................................  80 Info-bulles................................................  81 Zone de texte avec marque de saisie. ......  82 Fentre des tches....................................  83 Navigateur web........................................  83 Refactoring..............................................  83 Extraits. ...................................................  84 Documenter le code en XML...................  88 Lespace de nom My................................  89 Assistant Publication...............................  148 Assistant Mise niveau...........................  149

II Programmation Windows

151

4. Botes de dialogue communes....................... 153 La bote de dialogue Ouvrir............................ 154 La bote de dialogue Enregistrer sous............. 157 La bote de dialogue Couleur.......................... 158 Exemple. ..................................................  158 Ralisation...............................................  159


La bote de dialogue Police de caractres....... 160 Exemple. ..................................................  161 Ralisation...............................................  161 La bote de dialogue Imprimer. ....................... 163 Exemple. ..................................................  164 Ralisation...............................................  165 La bote de dialogue Rechercher un dossier... 166 Exemple. ..................................................  166 Ralisation...............................................  167 5. Un peu plus loin............................................. 169 Une application MDI...................................... 169 Cration dun formulaire parent. ............  170 Cration dun modle de fentre enfant. .  171 Polices de caractres....................................... 173 Le Presse-papiers............................................ 179 Accs traditionnel au presse-papiers. .....  180 Accs au presse-papiers via .NET 4.0.....  182 6. Implmenter des menus................................ 185 Systme de menus traditionnel....................... 185 Menu contextuel. ............................................. 194 7. Barres doutils et barres dtat..................... 201 Le contrle ImageList..................................... 202 Mise en place de la barre doutils................... 203 Mise en place de la barre dtat...................... 205 criture du code.............................................. 206 Plus loin avec les contrles ToolStrip............. 211 8. Manipulation dobjets graphiques............... 213 Le systme daffichage graphique GDI+........ 214 Mise en place dun conomiseur dcran....... 223 Mise en place visuelle de lapplication...  223

Table des matires

VII

Dfinition des procdures de traitement..  224 Excution de lapplication.......................  227 Affichage dune horloge aiguilles................ 228 Avant de commencer................................  229 Mise en place visuelle de lapplication...  229 Dfinition des procdures de traitement..  230 Excution de lapplication.......................  233 La capture dcran programme..................... 234 Dfinition de lapplication.......................  234 9. Fichiers et dossiers......................................... 241 Fichiers accs squentiel.............................. 242 Fichiers accs direct..................................... 246 Manipulation de dossiers et de fichiers........... 254 10. Jouer des sons WAV..................................... 259 Mise en place de lapplication........................ 259 Alimentation du contrle TreeView. ............... 261 Utilisation du contrle TreeView. ................... 266 Excution du fichier audio.............................. 266 11. Manipuler des donnes tabulaires.............. 269 Minitableur. ..................................................... 269 Minigrapheur.................................................. 277 12. Bases de donnes.......................................... 287 Accs une base de donnes locale. ............... 287 Accs une base de donnes distante. ............ 294 Dfinition du service web. .......................  294 Utilisation du service web ......................  298 Utilisation plus complte du service web . .......................................  302 Accs une base de donnes via LINQ.......... 312 13. Traitements multitches/multicurs. ........ 315 Excution dun calcul en tche de fond.......... 316

VIII

Visual Basic 2010

Excution dune application externe............... 322 Paralllisation des boucles.............................. 324 Utilisation de plusieurs curs laide de tches............................................. 333 14. Manipulation du Registre de Windows. .... 337 Lditeur du Registre...................................... 338 Modification du Registre..........................  339 Dplacements dans le Registre................  340 Recherches dans le Registre. ...................  341 Structure du Registre ..................................... 342 HKEY_CLASSES_ROOT.........................  342 HKEY_LOCAL_MACHINE.....................  342 HKEY_CURRENT_CONFIG..................  343 HKEY_USERS.........................................  343 HKEY_CURRENT_USER. ......................  343 Importations et exportations dans le Registre............................................... 343 Visualiser un fichier REG........................  345 Excuter un fichier REG..........................  345 Crer un fichier REG...............................  345 Exemple de fichier REG...........................  346 Visual Basic et le Registre.............................. 346 Ajout, visualisation et suppression dune cl. .................................................  348 Accs au Registre par une requte LINQ. 352 15. Fonctions API............................................... 353 Principales API............................................... 353 Utilisation des API natives et traditionnelles.. 357 16. Implmenter un systme daide. ................ 361 Premire tape: collecte des informations utilises par le systme daide........................ 363 Deuxime tape: conception des pages HTML des rubriques...................... 363

Troisime tape: conception du fichier daide .CHM................................................... 371 Dfinition du sommaire. ..........................  377 Dfinition de lindex................................  379 Quatrime tape: interfaage du fichier daide avec un projet Visual Basic ................. 380 17. Personnaliser Windows7............................ 383 Informations de la base de donnes................ 384 Excution de programmes. ......................  384 Amlioration du fonctionnement de Windows..............................................  385 Paramtrage de Windows. .......................  388 Ralisation...................................................... 390 18. Visual Basic et Microsoft Office.................. 403 Prise de contrle de Microsoft Word.............. 403 Mise en place visuelle..............................  404 Dfinition des procdures de traitement..  405 Excution de lapplication.......................  407 Prise de contrle de Microsoft Excel.............. 408 Mise en place visuelle..............................  408 Dfinition des procdures de traitement..  409 Excution de lapplication.......................  411 19. Programmation WPF.................................. 413 Une premire application WPF. ...................... 413 Les contrles WPF par dfaut......................... 419 Manipuler des lments multimdias............. 421 Graphiques 2D................................................ 423 Gomtries 2D................................................ 424 Segments de droites. ................................  424 Polygones.................................................  425 Arcs elliptiques........................................  426 Courbes de Bzier. ..................................  427


Ellipses. ...................................................  429 Rectangles. ..............................................  430 Gomtries combines.............................  431 Le pinceau. ..............................................  433 Gomtries 3D................................................ 437 tape 1 Dfinition dun objet Viewport3D.............................  437 tape 2 Dfinition dune camra..........  438 tape 3 Dfinition de lclairage..........  438 tape 4 Implmentation dun objet. .....  439 Le code XAML complet. ..........................  439 Transformations 2D........................................ 441 Rotation. ..................................................  441 Modification de lchelle.........................  442 Inclinaison...............................................  443 Translation...............................................  443 Transformations 3D........................................ 444 Rotation. ..................................................  446 Modification dchelle.............................  447 Translation...............................................  447 Animations...................................................... 448 Animation de couleurs.............................  448 Animer un objet avec ses proprits........  451 Animer un objet avec une transformation. .................................  453 Pour aller plus loin.......................................... 455

Table des matires

IX

Gestion du ComboBox Nom. ...................  465 Gestion du bouton de commande. ...........  466 21. Clients HTTP et FTP................................... 471 Un client HTTP lmentaire........................... 471 Avant de commencer................................  472 Mise en place de lapplication. ...............  472 Dfinition des procdures de traitement..  474 Excution de lapplication.......................  475 Un client FTP lmentaire.............................. 476 Mise en place de lapplication. ...............  477 Dfinition des procdures de traitement..  478 Excution de lapplication.......................  480 22. Applications web.......................................... 483 Une premire application web........................ 484 Une application web en un seul contrle........ 488 Valider les donnes......................................... 493 Envoyer des e-mails avec une application web........................................ 504 23. Annuaire de sites web.................................. 511 Mise en place de lapplication........................ 512 Dfinition des procdures de traitement......... 514 Conversion des fichiers HTML en donnes ... 529 Dfinition du service web............................... 533 Utilisation du service web ............................. 537 24. Favoris web................................................... 551 Mise en place du projet................................... 551 Dfinition des procdures de traitement......... 554 Dfinition et implmentation du fichier daide.............................................. 578 Premire tape: collecte des informations utilises par le systme daide.................  579

III Programmation Internet

457

20. Composeur tlphonique. ........................... 459 Avant de commencer. ...................................... 460 Mise en place visuelle de lapplication........... 460 Dfinition des procdures de traitement......... 461 Gestion du menu Port..............................  464

Visual Basic 2010

Deuxime tape: conception des pages HTML des rubriques...............  579 Troisime tape: utilisation de lapplication HTML Help Workshop. .  582 Quatrime tape: interfaage du fichier daide .CHM avec le projet. ....................  586 25. Services web. ................................................ 587 Conception du service. .................................... 588 Utilisation du service...................................... 593 Utilisation dun service web existant.............. 598 Accs traditionnel au service web...........  600 Accs au service web via My.WebServices................................  603 26. Silverlight. .................................................... 607 Une premire application................................ 608 Les fichiers gnrs par Visual Studio.....  610 Les contrles Silverlight................................. 617 Mise en page............................................  617 Contrles daffichage...............................  622 Contrles de commande. .........................  631 Transformation dobjets.................................. 632 Rotation. ..................................................  632 Transformation dchelle.........................  633 Translation...............................................  634 Inclinaison...............................................  634 Combiner des transformations................  635 Animation dobjets......................................... 636 Modification de la largeur dun contrle. 637 Modification de lopacit dun contrle..  638 Ne pas dmarrer une animation au chargement de la page........................  639

Interaction avec le code behind...............  639 Animer la couleur du canevas.................  641 Pour aller plus loin.......................................... 642 27. LINQ............................................................. 643 LINQ to Objects. ............................................. 643 Liste des processus en cours dexcution. .............................................  643 Accs au Registre.....................................  645 Liste des documents rcents. ...................  647 Liste des fichiers crs ces quinze derniers jours.........................  648 LINQ to XML................................................. 649 Axe XML..................................................  650 LINQ to XML et LINQ to Objects. ..........  651 Sauvegarder dans un fichier XML...........  657 Lire un fichier XML. ................................  658 Accs aux attributs des marqueurs XML.  660 Utiliser un index pour accder aux lments dune collection. ................  662 Extraire des lments XML dun XElement.........................................  663 Utiliser des espaces de nom. ...................  664 Requtes LINQ to XML types..................  666 LINQ to DataSet............................................. 680 LINQ to SQL.................................................. 683 Les tapes ncessaires linterrogation LINQ to SQL............................................  684 Requtes LINQ to SQL types...................  689 Pour aller plus loin..................................  704 Annexe. Routines utiles..................................... 705 Routine de tri.................................................. 705 Une image en fond de fiche............................ 707 Excuter un programme externe..................... 708


Connatre le chemin de lapplication.............. 710 Chemin des dossiers spciaux de Windows.... 710 Liste des units de disque disponibles ........... 711 Excuter les modules du Panneau de configuration........................... 714 Rsolution de lcran...................................... 715 Mettre lcran en veille................................... 716 Dplacer la souris et suivre ses dplacements............................................. 718

Table des matires

XI

Jouer un son WAV........................................... 721 Ouvrir et fermer une application. .................... 721 Relancer et arrter Windows........................... 721 Savoir si lordinateur est connect Internet......................................................... 722 Crer un e-mail............................................... 722 Afficher une page web.................................... 723 Index. .................................................................. 725

Introduction

Cet ouvrage est ddi au langage de programmation vedette de Microsoft: Visual Basic 20101. De nombreuses raisons font quaujourdhui ce langage est un des plus utiliss au monde:

Il est facile apprendre, y compris pour des personnes nayant jamais "touch" la programmation. Il offre une approche totalement oriente objet, ce qui simplifie le dveloppement dapplications de grande envergure et/ou complexes. Il est suffisamment puissant pour fournir toutes les ressources ncessaires aux pro grammeurs avancs. Il est extensible. De nombreuses socits proposent des composants annexes qui limitent dans de grandes proportions le dveloppement de code spcialis. Il produit tout aussi facilement des applications destines tre excutes dans un environnement Windows (Windows Forms ou WPF) ou Internet (ASP.NET ou Silverlight). Il est totalement compatible avec Windows 7, le dernier systme dexploitation de Microsoft. Il sait parfaitement dialoguer avec les applications de bureautique les plus utilises au monde(le traitement de texte Microsoft Word et le tableur Microsoft Excel) afin dautomatiser la cration de fichiers dans ces applications. Il utilise un langage de requtage universel trs puissant appel LINQ. Grce lui, le programmeur peut interroger toutes sortes de collections, quelles proviennent dobjets

1. Dans certains crits ou sur certains sites web, Visual Basic 2010 est aussi appel Visual Basic 10. Il sagit en effet de la dixime version du langage.

XIV

Visual Basic 2010

crs par les mthodes propres Visual Basic, dune base de donnes locale ou distante ou encore de documents XML. Enfin, il est arm pour la programmation parallle, afin de tirer le meilleur parti des processeurs multicurs qui occupent aujourdhui la plupart de nos ordinateurs. Cet ouvrage est divis en trois parties indpendantes: "Faisons connaissance avec Visual Basic 2010", "Programmation Windows" et "Programmation Internet". Chaque lecteur, en fonction de ses objectifs, peut tudier la partie qui lui convient sans tre pnalis sil na pas abord les autres sujets. Ce livre se dcompose de la faon suivante: Faisons connaissance avec Visual Basic 2010 (Chapitres 1 3). Cette partie vous aide dbuter dans lunivers de la programmation en Visual Basic. Aprs avoir pris connaissance de la procdure dinstallation de Visual Studio2010, vous aurez un aperu de ses principales nouveauts (implmentation automatique des proprits, initialiseurs de collections, continuation de ligne implicite, expressions Lambda multilignes et sousroutine, prise en charge dquivalence de type, prise en charge dynamique, covariance et contravariance, programmation parallle, etc.). Nous rappellerons galement un certain nombre de techniques Visual Studio 2008/Visual Basic 2008 toujours utilisables dans Visual Studio 2010/Visual Basic 2010 (multitargetting, infrence de type, types anonymes, dlgus non stricts, expressions Lambda, LINQ, etc.). Vous dcouvrirez ensuite les instructions du langage et vous verrez comment convertir les programmes crits dans une version antrieure de Visual Basic. Programmation Windows (Chapitres4 19). La deuxime partie de louvrage est la plus volumineuse. travers de nombreux exemples, elle vous montre comment aborder la plupart des domaines de programmation Windows: utilisation des botes de dialogue, mise en place de menus, barres doutils et barres dtat, manipulations graphiques, accs au systme de fichiers, exploitation de donnes tabulaires, bases de donnes locales et distantes, accs au Registre de Windows, interfaage de Word et dExcel, etc. Tous les codes prsents dans cette partie sont rutilisables: un copier-coller est gnralement suffisant pour les incorporer dans vos propres dveloppements. Cette partie sintresse essentiellement aux applications Winform, bases sur GDI+, mais galement aux applications WPF (Windows Presentation Foundation), bases sur un mode graphique vectoriel extrmement performant. Programmation Internet (Chapitres 20 27). Cette troisime partie aborde diffrents aspects de la programmation Tlcom, Internet et Silverlight. Aprs avoir appris composer des numros de tlphone par lintermdiaire dun modem RTC, vous verrez quel point il est simple de crer un client HTTP pour naviguer sur le Web et un client FTP pour tlcharger des fichiers. Vous dcouvrirez galement comment dfinir et exploiter vos propres services web. Enfin, vous apprendrez raliser des programmes ASP.NET et Silverlight destins tre utiliss dans un navigateur web et vous verrez comment tirer parti de la technologie LINQ.

Introduction

XV

Les sources de louvrage


Les ditions Pearson mettent votre disposition lensemble des solutions passes en revue au fil des pages, sur le site www.pearson.fr, la page ddie cet ouvrage. Ces solutions sont rassembles dans une archive au format ZIP compose de deux dossiers principaux: Projects et WebSites. Pour faciliter laccs aux solutions contenues dans ces dossiers, il suffit de copier ces derniers dans le dossier Documents\Visual Studio2010\ de votre disque dur principal. Lorsque vous lancerez les commandes Ouvrir/Projet-Solution et Ouvrir/Site web dans le menu Fichier de Visual Studio, toutes les solutions de louvrage seront ainsi directement accessibles. Pour utiliser ce livre, vous devez possder une dition de Visual Studio2010/Visual Basic 2010 (y compris la version gratuite Visual Studio/Visual Basic 2010 dition Express). Si vous disposez dune connexion Internet haut dbit, rendez-vous ladresse http://www. microsoft.com/express/downloads/. Vous pourrez y tlcharger gratuitement Visual Basic 2010 Express (voir Figure0.1).
Figure0.1 La page de tlchar gement de Visual Basic 2010 Express.

Notez quil est galement possible de tlcharger la version Professionnelle de Visual Studio 2010, limite 90 jours dutilisation, en vous rendant sur la page http://www.microsoft.com/france/visualstudio/download?CR_CC=_100352438_&wt.srch=1&CR_ SCC=100352438 (voir Figure0.2).

XVI

Visual Basic 2010

Figure0.2 La page de tlchargement de Visual Studio 2010 Professional.

Rubriques spciales de ce livre


ce Astu

Les Astuces fournissent des remarques particulires ou des raccourcis inha bituels du langage.

Info

Les Infos donnent des informations complmentaires sur le sujet tudi, sans tre indispensables pour la tche en cours.

ntion Atte

Ces avertissements portent sur des actions risque, lorsquune tche nest pas accomplie de faon correcte.

ition Dfin

Les nouveaux termes sont placs en italique et explicits dans le texte.

I
Faisons connaissance avec Visual Basic 2010
Cette partie va vous aider dbuter dans lunivers de la programmation en Visual Basic 2010. Aprs avoir vrifi que votre ordinateur et votre systme dexploitation sont compatibles avec lenvironnement de dveloppement Visual Studio 2010, vous dcouvrirez les diffrentes ditions du langage et vous apprendrez les installer. Ensuite, vous ferez connaissance avec les instructions du langage, puis avec lenvironnement de dvelop pement. Enfin, si vous ntes toujours pas convaincu des immenses possibilits de Visual Basic 2010, un chapitre passant en revue les nouveauts du langage et de lenvironnement vous persuadera, jen suis sr.

1
Avant de commencer
Au sommaire de ce chapitre

Configuration requise pour utiliser Visual Basic 2010 Les diffrentes versions de Visual Basic 2010 Installation de Visual Studio 2010 Premier contact avec Visual Basic 2010
Les lments qui composent votre ordinateur (processeur, mmoire, disque dur, carte graphique) sont-ils assez puissants pour vous permettre dutiliser Visual Basic 2010 ? Quen est-il de votre systme dexploitation? Devrez-vous en changer ou faire une mise jour? Ce premier chapitre rpond toutes ces questions. Une fois ces problmes matriels et logiciels rgls, vous dcouvrirez les diffrentes ditions de Visual Basic/Visual Studio et vous verrez comment les installer. Enfin, vous apprendrez les diffrentes notions quil est bon davoir lesprit pour programmer en Visual Basic 2010.

Visual Basic 2010

Configuration requise pour utiliser Visual Basic 2010


Pour tre en mesure dinstaller et dutiliser Visual Basic 2010, vous devez disposer dun PC quip comme suit:

Processeur Pentium 1600MHz ou plus. Systme dexploitation: Windows XP SP3 x86 (toutes les ditions sauf Starter); WindowsVista SP2 x86 et x64 (toutes les ditions sauf Starter); Windows 7 x86 et x64; Windows Server 2003 x86 et x64 SP2; Windows Server 2003 R2 x86 et x64; Windows Server 2008 SP2 x86 et x64; Windows Server 2008 x64. Mmoire: 1Go (1,5Go si lexcution se fait dans une machine virtuelle). Un disque dur disposant au minimum dun espace libre de 3Go. Un cran capable dafficher en 1024768 points ou plus. Un lecteur de DVD-ROM, ou un outil de virtualisation de lecteur de DVD-ROM si vous utilisez une image ISO tlcharge sur Internet.

Les diffrentes ditions de Visual Basic 2010


Pour rpondre au mieux aux attentes des diffrents dveloppeurs Visual Basic, Microsoft propose plusieurs dclinaisons de son langage vedette:

Visual Basic 2010 Express dition. Ce produit regroupe tous les outils ncessaires pour dvelopper des applications Windows et Internet. Il est particulirement bien adapt aux programmeurs dbutants qui veulent faire leurs premiers pas avec ce langage. Vous pourrez tlcharger gratuitement Visual Basic 2010 Express dition ladresse http:// www.microsoft.com/express/downloads/. Visual Studio 2010 Professional. Ce produit permet au dveloppeur de dployer des applications sur diverses plateformes dont Windows, le Web, les services Cloud, Office et SharePoint. Il prend en charge plusieurs crans, donne accs des concepteurs visuels pour exploiter diverses plateformes (dont Windows 7) et propose des fonctionnalits capables deffectuer des tests complets du code. Visual Studio 2010 Premium. Cette dition inclut une panoplie doutils qui simplifient le dveloppement dapplications, individuellement ou en quipe. Les tests cods

Chapitre 1

Avant de commencer

de linterface utilisateur permettent dautomatiser les essais dapplications web et Windows. Les outils de couverture garantissent que les tests englobent tout le code. Lanalyse dimpact de test gnre une liste de tests recommands aprs une modification de code. Les outils de cycle de vie (dveloppement hors ligne de schmas de bases de donnes, participation des mthodologies agile, etc.) peuvent sappliquer aux tches de dveloppement de bases de donnes. Les outils danalyse du code vous aident vrifier les erreurs de codage les plus courantes avant ltape de production. Enfin, ldition Premium permet de gnrer des donnes de test pour alimenter une base de donnes, afin de ne pas utiliser les donnes relles.

Visual Studio 2010 Ultimate. Cette dition inclut une suite doutils de gestion du cycle de vie des applications afin de permettre des quipes de dveloppeurs de garantir des rsultats de qualit, de la conception au dploiement. Visual Studio 2010 Ultimate cible un grand nombre de plateformes et de technologies, dont les services Cloud et le calcul en parallle. La fonctionnalit Intellitrace permet aux testeurs darchiver les bogues et aux dveloppeurs de les reproduire dans lenvironnement exact o ils ont t rencontrs. Lexplorateur darchitectures facilite la comprhension des fonctionnalits du code existant et de leurs interdpendances. Le diagramme de couches permet de dfinir et de communiquer une architecture dapplication logique, et de valider des artefacts de code par rapport larchitecture requise. Vous pouvez ainsi contrler vos efforts de dveloppement afin dobtenir une application conforme au projet dorigine. Visual Studio Test Professional 2010 est inclus dans Visual Studio. Il permet de capturer et de mettre jour les tests, dautomatiser la navigation dans les tests manuels et dacclrer le cycle de correction et dacceptation en capturant tout le contexte de test. Enfin, cette dition est optimise pour les processus de dveloppement interactif actuels. Elle offre des fonctionnalits qui vous aident rester productif et ragir aux risques potentiels avant quils ne se concrtisent. Lintgrit du projet est ainsi surveille de faon automatique laide de rapports gnrs automatiquement. Visual Studio 2010 Test Professional. Destine aux quipes dassurance qualit, cette dition inclut un ensemble doutils qui simplifient la planification et lexcution manuelle de tests. Elle permet aux testeurs et aux dveloppeurs de collaborer efficacement tout au long du cycle de dveloppement dune application. Entre autres possibilits: alignement et suivi des objectifs dun projet, capture automatique dinformations importantes pendant un test et inclusion de ces informations dans les rapports de bogues, archivage des bogues interactifs et dtaills dans les informations systme, rutilisation de tests manuels, amlioration du processus de test (plans, suites et scnarii de tests).

Vous voulez en savoir plus sur les diffrences entre les ditions de linterface de dveloppement ? Rendez-vous sur la page http://www.microsoft.com/france/visualstudio/ products/2010-editions/ qui donne accs aux caractristiques dtailles de chaque dition (voir Figure1.1).

Visual Basic 2010

Figure1.1 Les liens En savoir plus donnent accs aux caract ristiques dtailles des ditions de Visual Studio 2010.

Installation de Visual Studio 2010


Insrez le DVD-ROM dinstallation de Visual Studio dans le lecteur1. Au bout de quelques instants, une bote de dialogue vous propose dinstaller Visual Studio 2010. Cliquez sur Installer Microsoft Visual Studio 2010 et patientez jusqu laffichage de la fentre principale dinstallation (voir Figure1.2). Cliquez sur Suivant, parcourrez les termes du contrat de licence, slectionnez loption Jai lu les termes du contrat de licence et je les accepte, entrez la cl du produit, votre nom dutilisateur puis cliquez sur Suivant. LAssistant dinstallation vous propose dinstaller plusieurs langages et environnements de dveloppement (voir Figure1.3). Si vous slectionnez loption Complte, tous les composants ncessaires la gnration de solutions pour Windows, le Web, Azure, Office System, SharePoint et SQL Server laide des langages Visual Basic, Visual C#, Visual C++ et Visual F# seront installs. Ces composants seront complts par le kit de dveloppement Windows SDK, Sync Framework, une bibliothque de graphiques et des outils de tests unitaires.

1. Si vous avez tlcharg limage ISO de Visual Studio sur MSDN, Microsoft Technet, ou un autre site du mme type, il est inutile de la graver sur un DVD pour installer Visual Studio: tlchargez gratuitement lutilitaire Daemon Tools sur www.daemon-tools.cc, installez cette application et montez limage de Visual Studio pour installer votre nouvel environnement de dveloppement.

Chapitre 1

Avant de commencer

Figure1.2 Bote de dialogue principale dinstallation de Visual Studio 2010.

Figure1.3 Quels langages voulez-vous installer?

Si vous ne souhaitez nutiliser quune partie de ces composants, slectionnez loption Personnalise, cliquez sur Suivant, cochez les cases correspondant aux langages/environnements installer (voir Figure 1.4), dsignez le dossier dinstallation puis cliquez sur Installer.

Visual Basic 2010

Figure1.4 Cette bote de dialogue vous permet de limiter linstallation aux seuls composants qui vous seront utiles.

Armez-vous de patience, le processus dinstallation est trs long et demande un redmarrage de lordinateur Lorsque Visual Studio est entirement install, une dernire bote de dialogue affiche des normes de scurit (voir Figure1.5). Prenez-en connaissance et cliquez sur Terminer. Pour accder lapplication Microsoft Visual Studio, il vous suffit maintenant de lancer la commande Tous les programmes/Microsoft Visual Studio 2010/Microsoft Visual Studio 2010, dans le menu Dmarrer. Si vous utilisez Windows7 ou Vista, le lancement de Visual Studio est quelque peu simplifi: cliquez sur Dmarrer, tapez visual dans zone de texte Rechercher et cliquez sur Microsoft Visual Studio 2010, dans la partie suprieure du menu Dmarrer.

Info

Au premier dmarrage, vous devez indiquer le langage de programmation que vous utiliserez le plus frquemment (voir Figure1.6).

Chapitre 1

Avant de commencer

Figure1.5 Linstallation est termine.

Figure1.6 Quel langage allez-vous utiliser le plus frquemment?

Slectionnez Paramtres de dveloppement Visual Basic dans la liste et cliquez sur Dmarrer Visual Studio (voir Figure1.7).

10

Visual Basic 2010

Figure1.7 La fentre de Visual Studio, juste aprs son ouverture.

Premier contact avec Visual Basic 2010


Les premiers langages informatiques taient de type "procdural". Regroup dans un unique listing, le code sexcutait en squences, de la premire la dernire instruction. Les instructions le plus frquemment utilises taient regroupes dans des procdures qui pouvaient tre appeles une ou plusieurs fois dans le code principal. Aujourdhui, la plupart des langages sont "orients objets". limage de tous ses contemporains, Visual Basic 2010 suit cette volution et manipule diffrents "objets" fournis par Microsoft ou des dautres socits. Un ou plusieurs blocs dinstructions sont attachs chacun des objets utiliss dans une application. Lorsquun objet est sollicit par un clic de souris, une frappe au clavier ou un vnement dun autre type, Visual Basic recherche le bloc de code correspondant. Sil existe, il est excut; dans le cas contraire, aucune action nen dcoule. Une application crite en Visual Basic est donc constitue dun ensemble de petits programmes indpendants qui sont excuts lorsque certains vnements propres aux objets utiliss surviennent. Cest la raison pour laquelle Visual Basic 2010 est qualifi de "langage orient objets". Lutilisation dobjets offre plusieurs avantages dignes dintrt, en particulier:

La programmation devient facilement modulaire. La POO (programmation oriente objets) rattache en effet un ou plusieurs blocs de code chaque objet. Ces blocs sont excuts de faon vnementielle. Le programmeur na pas connatre de faon dtaille le fonctionnement des objets quil utilise. Il suffit quil ait une ide de leur fonction et sache comment les interfacer par

Chapitre 1

Avant de commencer

11

lintermdiaire des variables et des mthodes qui leur sont propres. Dans la plupart des cas, les lments permettant dinterfacer un objet sont largement comments par ses auteurs. Parfois mme, un ou plusieurs exemples lmentaires sont fournis avec chaque objet.

Le dbogage dune application oriente objets se limite celui du code vnementiel que vous avez crit. Les objets utiliss sont (en principe) totalement dbogus et prts lemploi.

Les "solutions" Visual Basic


Les applications crites en Visual Basic 2010 sont appeles "solutions". Elles peuvent consister en un ou plusieurs projets1. Chaque projet peut contenir une ou plusieurs feuilles (galement appeles formulaires, ou forms en anglais). Enfin, diffrents fichiers identifis par leur extension sont associs chaque feuille. Examinons les fichiers crs pour une hypothtique solution de type "Application Windows Forms" constitue dun projet unique et dune feuille unique appele Premier:

Premier.sln. Ce fichier contient diverses informations relatives la solution et au projet qui la compose. Cest ce fichier qui est ouvert lorsque vous lancez la commande Ouvrir dans le menu Fichier de Visual Studio 2010. Form1.vb. Ce fichier contient les procdures vnementielles (et ventuellement non vnementielles) relatives la feuille Form1. Form1.Designer.vb. Ce fichier dcrit les caractristiques de la feuille (dimensions, titre, apparence, bordure, couleur, etc.) et des contrles placs sur la feuille (position, dimensions et autres proprits). Form1.resx. Ce fichier dcrit les ressources utilises par la feuille Form1. Ces ressources sont automatiquement intgres lexcutable ou la DLL de lapplication lors de la compilation. Si lune delles change, il suffit donc de recompiler le programme pour que la modification soit prise en compte. Premier.vbproj. Ce fichier dcrit le projet et les diffrents fichiers qui le composent. Premier.vbproj.user. Ce fichier contient les options propres au projet. Grce lui, vous retrouverez toutes les personnalisations faites sur votre projet ds son ouverture. App.config (ou Web.config). Fichier de configuration de lapplication.

Tous ces fichiers sont grs de faon transparente par Visual Studio. En tant que programmeur Visual Basic 2010, vous naurez de relle interaction quavec le fichier .sln, lors de son ouverture dans lenvironnement de dveloppement.
1. Toutes les solutions dveloppes dans cet ouvrage sont constitues dun seul et unique projet.

12

Visual Basic 2010

criture dun programme en Visual Basic


Les programmes que vous crirez peuvent tre courts ou longs, simples ou complexes tout dpend des objectifs atteindre. Par exemple, pour calculer et afficher le sinus dun angle, une seule instruction suffit. Par contre, pour simuler le fonctionnement dune calculatrice de poche, une bonne centaine de lignes de code sont ncessaires. Comment devez-vous programmer pour tre efficace? La plupart des programmeurs dbutants sont tents par la saisie directe de code dans lditeur. Cette technique donne dassez bons rsultats tant que le programme dvelopper est court et/ou simple. Mais vous courez lchec si votre programme est constitu dun grand nombre de lignes ou repose sur des concepts que vous ne matrisez pas parfaitement. Mais alors, comment programmer? Nous allons partir dune remarque. La plupart des programmes peuvent tre modliss sous la forme dune bote noire (voir Figure1.8).
Figure1.8 Modlisation lmentaire dun programme.

Une ou plusieurs donnes sont fournies au programme. Le rsultat atteindre est obtenu en appliquant un ou plusieurs traitements ces donnes. Par exemple, pour calculer les solutions dune quation du second degr, lutilisateur doit fournir les valeurs des constantes a, b et c:
ax2 + bx + x = 0

Le traitement consiste appliquer les formules que tout bon lycen se doit de connatre
delta = b2 4ac

Si le dterminant delta est ngatif, il nexiste aucune solution. Si le dterminant est positif, les solutions sont (b racine(delta)) / 2a et (b+racine(delta))/2a. Si le dterminant est nul, il existe une solution unique gale b/2a. Le schma "bote noire" est donc conforme la Figure1.9.

Chapitre 1

Avant de commencer

13

Figure1.9 Modlisation de la rsolution dune quation du second degr.

La plupart des programmes peuvent tre diviss en trois parties: acquisition des donnes; calculs; affichage des rsultats. La plupart du temps, lacquisition des donnes se fait par lintermdiaire de linterface utilisateur, cest--dire via la fentre dexcution du programme. Vous devez concevoir une interface aussi simple et intuitive que possible pour ne pas drouter lutilisateur. Parfois lacquisition des donnes peut se faire lintrieur dune base de donnes locale ou distante. Dans ce cas, assurez-vous que vous connaissez lemplacement, le nom, la structure et ventuellement le mot de passe de la table qui contient les donnes. Les calculs sont gnralement dclenchs par lutilisateur : appui sur un bouton de commande, fin de la saisie des donnes, etc. Placez le "dclencheur" des calculs lendroit le mieux appropri. Lorsque les calculs effectuer sont complexes, veillez les dcomposer en plusieurs tapes lmentaires, simples comprendre et mettre en uvre. Les rsultats peuvent safficher dans la fentre dexcution, enregistrs dans un fichier local, envoys sur un site FTP ou dans un e-mail, etc. Assurez-vous que vous disposez de tous les renseignements ncessaires laffichage ou lenregistrement des rsultats avant de commencer la saisie du programme. Vous laurez compris, il est important de rflchir aux objectifs du programme, sa prsentation et la faon dont les rsultats vont tre calculs avant de vous installer devant votre clavier. Apportez un soin particulier la conception de linterface utilisateur. Nhsitez pas en crer plusieurs versions sur papier et en parler votre entourage (toute personne trangre au projet peut en effet tre de bon conseil). Si la cohrence et la simplicit de linterface sont des paramtres trs importants pour lutilisateur final, ne ngligez pas pour autant le code de votre programme. Veillez en particulier le documenter et hirar chiser autant que possible les tches complexes pour les dcomposer en un enchanement de tches lmentaires, faciles mettre au point et contrler Quelles que soient la nature et lenvergure dun projet Visual Basic, vous respecterez les tapes chronologiques suivantes: 1. Rflexion. Cette tape se fait gnralement sur papier. Identifiez les donnes traiter et les donnes recueillir. Dduisez ensuite les traitements mettre en uvre pour obtenir les secondes partir des premires.

14

Visual Basic 2010

2. Cration de linterface. Mettez en place les objets (ou contrles) ncessaires pour acqurir les donnes traiter en utilisant les icnes de la Bote outils. 3. Modification des proprits des objets. Utilisez la fentre des Proprits pour modifier lapparence et/ou le comportement des objets dans linterface. 4. criture du code. Employez lditeur de code pour crire les instructions de traitement vnementiel des objets dans linterface. 5. Test et dbogage. Passez en revue tous les contextes possibles pour dbusquer dventuelles erreurs lexcution. Si ncessaire, implmentez un "pige erreurs" afin den faciliter lidentification (voir la section "Test et dbogage" plus loin). 6. Diffusion. crivez un fichier texte qui indique comment utiliser votre programme. Placez ensuite votre programme et tous ses fichiers annexes sur un support facilement accessible (CD-ROM, archive compresse sur Internet, disque dur partag sur un rseau) aux personnes concernes.

Modification des proprits des objets


Jusquici, nous avons parl des instructions et des fonctions propres au langage. Un autre point a une importance fondamentale en Visual Basic: laccs aux proprits des objets. Tous les objets ont un nom (qui est lui-mme une proprit). Pour affecter une valeur une proprit dun objet donn, vous utiliserez une instruction du type:
Nom.Proprit = Valeur

Supposons que vous vouliez affecter le contenu de la variable chane R la proprit Text du contrle zone de texte nomm Rsultat. Vous utiliserez linstruction ci-aprs:
Rsultat.Text = R

Supposons maintenant que vous vouliez redfinir la hauteur de la feuille nomme Form1. Vous devez modifier la proprit Height par une instruction du type:
Form1.Height = 3000

criture du code
Lcriture du code se fait dans le volt central de lenvironnement de dveloppement, sous longlet FormX.vb1. Cet onglet apparat automatiquement lorsque vous double-cliquez sur un objet dpos sur la feuille de linterface. La procdure vnementielle la plus probable est alors cre (voir Figure1.10).
1. Ici, FormX reprsente le nom par dfaut donn la feuille X de la solution.

Chapitre 1

Avant de commencer

15

Figure1.10 Cration de la procdure Form1_Load() aprs un double-clic sur la fentre de lapplication.

Vous pouvez galement accder lditeur de code laide de la commande Code du menu Affichage (raccourci clavier: toucheF7). Pour crer la procdure vnementielle de votre choix, il suffit de slectionner un objet dans la liste droulante Nom de la classe, et un vnement dans la liste droulante Nom de la mthode (voir Figure1.11).
Figure1.11 Ces deux listes droulantes permettent de crer la procdure vnementielle de votre choix.

Test et dbogage
Cette section tudie les diffrents types derreurs que vous pouvez rencontrer pendant la ralisation et la mise au point dun projet. Ces erreurs peuvent tre rparties dans quatre grands groupes:

Les erreurs de saisie. Comme lindique leur nom, elles interviennent lors de la saisie du code. Gnralement anodines, elles ne demandent quun ou deux clics pour disparatre. Les erreurs de compilation. Il sagit essentiellement derreurs de saisie qui nont pas t corriges, par tourderie ou par paresse! Le "boguicide" intgr Visual Basic2010 localise instantanment toutes ces erreurs. Les erreurs dexcution. Elles sont causes par une instruction dont la syntaxe est correcte, mais dont les paramtres ne sont pas autoriss. La ligne mise en cause est clairement indique par Visual Basic pendant lexcution.

16

Visual Basic 2010

Les comportements anormaux lexcution. De toutes les erreurs, ce sont les plus difficiles identifier, surtout si le code est long et/ou complexe. Pour les dpister, vous utiliserez le dbogueur intgr de Visual Basic : points darrt, excution pas pas, fentre de dbogage, etc. Bref, la grosse artillerie!

Les erreurs de saisie


Pendant la saisie, la touche Entre du clavier permet de passer dune ligne de code la suivante. Quand vous appuyez sur cette touche, le compilateur de Visual Basic analyse le code de la ligne et tente de dbusquer une erreur de syntaxe. Dans lexemple ci-aprs, linstruction For nest pas complte. Visual Basic dtecte lerreur lorsquon appuie sur la touche Entre. Le problme est signal dans la fentre Liste derreurs, gnralement affiche dans la partie infrieure de lIDE (voir Figure1.12).
Figure1.12 Une instruction For sans To gnre une erreur pendant la saisie.

Vous pouvez:

Double-cliquer sur lentre correspondante dans la fentre Liste derreurs pour accder la ligne de code contenant lerreur. Appuyer sur F1 pour avoir plus dinformations sur le type de lerreur. Une fentre daide plus complte saffiche.

Les erreurs de compilation


Lorsque vous lancez une application en appuyant sur F5, seule la partie de code ncessaire laffichage de la fentre de dpart est excute. Il est possible quune ou plusieurs lignes

Chapitre 1

Avant de commencer

17

dune procdure annexe contiennent des erreurs de syntaxe. Ces erreurs ne sont dcouvertes que lorsque la portion de code correspondante est excute.

Les erreurs dexcution


Les instructions sont toutes correctes, et pourtant une erreur est gnre lors de lexcution. Il peut sagir dune utilisation incorrecte dune fonction mathmatique ou dun passage de paramtre incorrect une fonction Visual Basic. Dans lexemple ci-aprs, une instruction Math.Sin tente de calculer le sinus dune valeur chane:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim a As Double = 0 Dim st As String st = 1 / a Print(st) End Sub

La valeur affecte la variable st ne peut pas tre affiche, car infinie. Le code produit une erreur dexcution (voir Figure1.13).
Figure1.13 La bote de dialogue affiche suite une erreur dexcution.

Utilisez les informations affiches dans la bote de dialogue pour corriger lerreur. Si ncessaire, cliquez sur un conseil de dpannage ou sur une action pour accder aux informations correspondantes.

18

Visual Basic 2010

Les comportements anormaux


Pour travailler sur un exemple concret, vous allez ouvrir la solution OutilsEtat.sln. Ce projet se trouve dans le dossier Projects\Debug des sources de louvrage. Excutez ce projet en choisissant la commande Dmarrer le dbogage du menu Dboguer (raccourci clavier: toucheF5). Aucune erreur de compilation nest dtecte. Loutil Crayon tant slectionn, tracez quelques courbes harmonieuses en maintenant le bouton gauche de la souris enfonc. Maldiction! Le trac ne suit pas la souris et se comporte dune faon plutt trange.
Figure1.14 Loutil Crayon ne donne pas le rsultat escompt.

Do peut bien provenir le problme? Certainement de la procdure MouseMove, puisquil se produit pendant le dplacement de la souris. Examinons cette procdure:
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseMove If (OutilEnCours = 0) And (Trac = True) Then G.DrawLine(pen, AncX, AncY, e.X, e.Y) AncX = e.X AncY = e.X End If End Sub

Lerreur est facilement identifiable. Elle se trouve dans linstruction qui mmorise lordonne de la souris dans la variable AncY. Il faut bien entendu crire:
AncY = e.Y

et non:
AncY = e.X

Chapitre 1

Avant de commencer

19

Relancez le programme. Maintenant, loutil Crayon fonctionne. Slectionnez loutil Trait et tentez de tracer quelques lignes droites. Cet outil se comporte comme loutil Crayon. Daprs vous, dans quelle procdure lerreur se trouve-t-elle? Rponse: dans la procdure ToolStrip1_ItemClicked(), qui slectionne loutil de dessin Trait lorsque lutilisateur clique sur le deuxime bouton de la barre doutils. Examinons cette procdure dun peu plus prs:
Private Sub ToolStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStrip1.ItemClicked Select Case e.ClickedItem.Text Case "Crayon" ToolStripStatusLabel1.Text = "Outil Crayon actif" OutilEnCours = 0 Case "Trait" ToolStripStatusLabel1.Text = "Outil Trait actif" OutilEnCours = 0 Case "Rectangle" ToolStripStatusLabel1.Text = "Outil Rectangle actif" OutilEnCours = 2 Case "Ellipse" ToolStripStatusLabel1.Text = "Outil Ellipse actif" OutilEnCours = 3 End Select End Sub

Lerreur se trouve dans la deuxime instruction Case. Il faut slectionner non pas le premier outil:
OutilEnCours = 0

mais le second:
OutilEnCours = 1

Lorsque la localisation de lerreur est moins vidente, on a recours une "division dicho tomique" de la procdure incrimine. Dans un programme, une division dichotomique consiste dfinir un point darrt au milieu de la procdure qui pose problme. Si lapplication sexcute jusquau point darrt sans erreur, la suite du code est nouveau divise en deux et le point darrt est report sur la seconde moiti du code, et ainsi de suite. Deux ou trois migrations du point darrt suffisent en gnral pour localiser la source de lerreur.

Info

20

Visual Basic 2010

Pour placer un point darrt, il suffit de cliquer dans la marge de la ligne concerne; une puce rouge saffiche (voir Figure1.15).
Figure1.15 La ligne AncX = e.X contient un point darrt.

Le programme sarrte juste avant linstruction marque dun point darrt. Vous pouvez poursuivre lexcution de quatre faons diffrentes. Appuyez sur:

F11 pour continuer en mode "pas pas dtaill". Linstruction suivante est excute et le programme sarrte. Maj+F10 pour continuer en mode "pas pas principal". Linstruction suivante est excute. Sil sagit dun appel de procdure, toutes les instructions qui composent la procdure sont excutes (contrairement au pas pas dtaill) et le programme sarrte. F9 pour continuer vitesse normale jusqu linstruction sur laquelle est plac le point dinsertion. F5 pour poursuivre lexcution vitesse normale jusqu ce que le point darrt soit nouveau rencontr.

Pour supprimer un point darrt, il suffit de cliquer sur la puce rouge correspondante, dans la marge du code. Pour aller encore plus loin, vous pouvez dfinir une trace (TracePoint). Cliquez du bouton droit sur la puce rouge qui matrialise le point darrt et choisissez lentre Lorsquil est atteint dans le menu. Une bote de dialogue semblable la Figure1.16 saffiche.
Figure1.16 Dfinition dune trace.

Chapitre 1

Avant de commencer

21

Cochez la case Afficher un message et dfinissez lexpression afficher. Par exemple, pour connatre la valeur de la proprit e.X, vous utiliserez le message suivant:
La proprit e.X a pour valeur {e.X}

Validez en cliquant sur OK. La puce rouge se transforme en un losange afin de matrialiser la trace. Excutez le programme en appuyant sur la touche de fonction F5. Les messages gnrs par la trace saffichent dans la fentre de sortie, comme la Figure1.17. Si cette fentre nest pas apparente dans lIDE, lancez la commande Sortie dans le menu Affichage ou appuyez sur Ctrl+Alt+O.
Figure1.17 La valeur de la proprit saffiche dans la fentre dexcution.

Les piges erreurs


Dans certaines situations, il est impossible dviter des erreurs pendant lexcution; par exemple, lorsque lutilisateur quitte une bote de dialogue commune (voir Chapitre4) sans avoir effectu de slection. Dans ce cas, vous devez mettre en place un pige erreur (error trap). Lorsque lerreur se produit, le programme interrompt lexcution en squence et excute une ou plusieurs instructions ddies au traitement de lerreur.

ce Astu

Lexemple ci-aprs tente de lire le contenu dun fichier dont le nom est spcifi dans le contrle TextBox1. Les instructions "sensibles" sont insres aprs le mot-cl Try. Si une instruction provoque une erreur, le bloc situ aprs le mot-cl Catch est excut. Dans le cas contraire, ce bloc est ignor. Dans tous les cas, lexcution du bloc Try se termine par lexcution du bloc situ entre les mots-cls Finally et End Try. Considrez le code suivant:
Try FileOpen(1, "c:\TextBox1.txt", OpenMode.Input) While Not EOF(1) texte = texte + LineInput(1) End While TextBox2.Text = tout Catch

22

Visual Basic 2010

MsgBox("Le fichier spcifi nexiste pas") Finally FileClose(1) End Try

La premire instruction du bloc Try tente douvrir le fichier dont le nom est spcifi dans le contrle TextBox1:
FileOpen(1, "c:\TextBox1.txt", OpenMode.Input)

Si ce fichier nexiste pas, la prochaine instruction excute est celle qui suit le mot-cl Catch. Dans cet exemple, cette instruction affiche un message derreur dans une bote de dialogue:
Catch MsgBox("Le fichier spcifi nexiste pas")

Si le fichier existe, lexcution se poursuit en squence. La totalit du fichier est lue et stocke dans la variable texte:
While Not EOF(1) texte = texte + LineInput(1) End While

Puis le rsultat saffiche dans la zone de texte multiligne TextBox2:


TextBox2.Text = tout

Le bloc Catch est alors saut. Quune erreur se soit produite ou nom, le bloc Finally est alors excut, ce qui provoque la fermeture du fichier:
Finally FileClose(1) End Try

2
Le langage et lenvironnement
Au sommaire de ce chapitre

Le langage Visual Basic Lenvironnement Visual Studio 2010


Peut-tre avez-vous du mal faire la distinction entre Visual Basic et Visual Studio. Si tel est le cas, ce chapitre va vous clairer. Dans un premier temps, vous dcouvrirez les objets (variables, tableaux, structures), les oprateurs et les instructions utiliss dans le langage. Dans un second temps, vous apprendrez dfinir des solutions Visual Basic, exploiter le systme de menus, les barres doutils et les nombreuses fentres filles de lenvironnement de dveloppement.

24

Visual Basic 2010

Le langage Visual Basic


Vous trouverez dans les pages suivantes quelques rappels sur le langage de programmation. Nhsitez pas consulter laide en ligne pour parfaire vos connaissances.

Variables
Pour dfinir une variable, vous utiliserez linstruction Dim. Par exemple:
Dim v1 as Integer

ou encore:
Dim v2 as String

Les types autoriss dans Visual Basic sont les suivants:


Type
Integer Long Single Double Currency String

Signification
Nombres entiers compris entre 32768 et 32767 Nombres entiers compris entre 2147483648 et 2147483647 Nombres rels avec sept chiffres aprs la virgule Nombres rels avec quinze chiffres aprs la virgule Nombres rels comprenant quinze chiffres avant la virgule et quatre aprs Chanes de caractres dont la longueur ne peut excder 231caractres

Il est possible dutiliser un symbole pour dfinir implicitement le type dune variable. Dans lexemple ci-aprs, les deux premires instructions sont quivalentes la troisime:
Dim v1 as Integer v1= 45 v1%=45

Pour en terminer avec les variables, voici la liste des symboles qui dfinissent implici tement le type des variables.
Symbole
% & !

Variable
Integer Long Single

Chapitre 2


Variable
Double Currency String

Le langage et lenvironnement 

25

Symbole
# @ $

Notez quil est galement possible de dfinir une numration laide du mot-cl Enum, comme dans lexemple suivant:
Enum NiveauSecurite Illegal = -1 Niveau1 = 0 Niveau 2 = 1 End Enum

Cette instruction ne peut tre utilise que dans un module.

Tableaux
Un tableau contient des donnes de mme type accessibles par un indice. Pour dclarer un tableau contenant vingt valeurs entires, vous utiliserez une instruction du type:
Dim Tableau1(0 To 20) As Integer

Si le tableau doit comprendre plusieurs dimensions, il suffit de les dclarer dans la parenthse. Par exemple, linstruction suivante dfinit un tableau deux dimensions contenant 201000donnes de type Long:
Dim Tableau2(0 To 20, 0 To 1000) As Long

Pour accder un lment dans un tableau, il suffit dindiquer son ou ses indices. Par exemple: Tableau1(5) correspond au cinquime lment du tableau Tableau1. Tableau2(2,10) correspond llment dindices2 et 10 dans le tableau Tableau2.

Commentaires
Il est souvent ncessaire dinsrer des commentaires dans un programme pour faciliter sa maintenance et son volution. Pour cela, vous utiliserez indiffremment le signe ou le mot-cl REM. Les deux instructions ci-aprs sont quivalentes:
Ceci est un commentaire REM Ceci est un commentaire

26

Visual Basic 2010

Oprateurs
Tous les oprateurs mathmatiques, de comparaison et logiques habituels sont disponibles. Le signe = affecte une valeur une variable. Par exemple, linstruction ci-aprs affecte la valeur12 llment dindice4 dans le tableau Ta:
Ta(4)=12

Les oprateurs +, -, *, /, ^, \ et Mod sutilisent comme dans les autres langages. Vous pouvez utiliser une ou plusieurs paires de parenthses pour forcer lordre dexcution des oprateurs. Linstruction suivante, par exemple, calcule le dterminant dune quation du second degr:
Delta = b^2 - 4 * a * c

Les oprateurs de comparaison =, <>, <, <=, > et >= sont essentiellement utiliss dans linstruction If then else:
If Delta < 0 then Text1.TEXT = "Pas de solution" End If

Enfin, les oprateurs logiques Not, And et Or permettent dinverser une valeur logique ou de combiner deux valeurs logiques. Linstruction de test ci-aprs affecte la valeur1 la variable Rsultat si a est plus grand que 10 ou si b est diffrent de 0:
If a>10 or b<>0 then Rsultat = 1 End If

Tests
Linstruction de test la plus utilise est If then else. Voici sa structure:
If c1 then Instructions ElseIf c2 then Instructions ElseIf c3 then Instructions Else Instructions End if 1 2 3

Si la condition c1 est vrifie, le bloc dinstructions Instructions 1 est excut. Dans le cas contraire, si la condition c2 est vrifie, le bloc dinstructions Instructions 2 est

Chapitre 2

Le langage et lenvironnement 

27

excut, et ainsi de suite jusquau dernier ElseIf. Si aucune des instructions prcdentes nest vrifie, le bloc dinstructions Instructions N est excut. Bien quun peu lourde, la structure If Then Else est trs simple utiliser. Lorsque laction accomplie consiste affecter une valeur ou une autre en fonction du rsultat du test, vous gagnerez utiliser linstruction IIf (Immediate If):
Variable=IIf(Condition, Valeur si vrai, Valeur si faux)

Par exemple, linstruction suivante affecte la valeur5 la variable Rsultat si a est suprieur 0 et la valeur6 dans le cas contraire:
Rsultat = IIf(a > 0, 5, 6)

Pour terminer, sachez que, si vous devez effectuer des tests rptitifs sur la valeur dune variable, vous avez tout intrt utiliser linstruction Select Case:
Select Case Variable Case liste de valeurs Bloc dinstructions Case liste de valeurs Bloc dinstructions Case Else Bloc dinstructions End Select 1 1 2 2

titre dexemple, les instructions If et Case ci-aprs sont quivalentes:


If a = 1 Then b = 57 ElseIf a = 2 Then b = 12 ElseIf a = 3 Then b = 39 Else b = 9 End If Select Case a Case 1 b = 57 Case 2 b = 12 Case 3 b = 39 Else b = 9 End Select

28

Visual Basic 2010

Boucles
Lorsquun traitement doit tre rpt, utilisez une boucle. La plus classique fait appel linstruction For Next. Par exemple, linstruction suivante affecte les valeurs1 10 aux lments dindice1 10 du tableau T:
For i = 1 To 10 T(i) = i Next i

Lorsque le nombre de passages dans la boucle nest pas connu lavance, vous pouvez utiliser une instruction Do Loop ou While Wend: Les deux blocs dinstructions suivants sont quivalents:
i = 1 Do T(i) = i i = i+1 Loop Until i > 10 i = 1 While i < 10 T(i) = i i = i+1 Wend

Info

Les conditions sont inverses dans les deux instructions. Do Loop effectue un bouclage jusqu ce quune condition soit vraie, alors que While Wend effectue un bouclage tant quune condition est vraie.

Notre petit tour dhorizon des instructions est termin; seules les plus courantes ont t dcrites. Pour avoir des informations plus compltes, consultez laide des manuels en ligne la rubrique Instructions. Nous allons maintenant passer en revue quelques fonctions spcialises particulirement utiles.

Conversion de donnes
La plupart du temps, vous utiliserez des variables types (Integer, Long, String, etc.). Si vous tes amen affecter un type de donnes une variable dun autre type, une erreur se produira lexcution de linstruction daffectation, moins que vous nutilisiez une

Chapitre 2

Le langage et lenvironnement 

29

onction de conversion. Par exemple, pour affecter une valeur numrique une variable f chane, vous utiliserez la fonction Val. Pour connatre le nom et les modalits dutilisation des fonctions de conversion, consultez laide en ligne la rubrique Conversion.

Chanes de caractres
Le type chane de caractres est un des plus utiliss dans le code Visual Basic; un ensemble de fonctions lui est ddi. Consultez laide en ligne la rubrique Chanes(fonctions), liste pour avoir de plus amples renseignements.

Dates et heures
Nous allons terminer par les fonctions ddies la manipulation des dates et heures. Pour accder la liste de ces fonctions, consultez laide en ligne la rubrique Dates(fonctions), liste.

Collections dobjets
Lobjet Collection constitue un moyen pratique de faire rfrence un groupe dlments analogues, en les considrant comme un seul objet. Les lments contenus dans une collection sont appels membres. Pour crer une nouvelle collection, vous utiliserez une instruction du type suivant:
Dim Objet As New Collection

o Objet est le nom de lobjet Collection crer. Une fois lobjet Collection cr, il est possible de lui ajouter des membres avec la mthode Add:
Objet.Add Nom

o Nom est le nom du membre ajouter lobjet Collection. Il est galement possible de supprimer des objets avec la mthode Remove:
objet.Remove index

o Index est une expression qui indique la position dun membre de la collection. Des membres donns peuvent tre renvoys partir de lobjet Collection au moyen de la mthode Item:
objet.Item(index)

30

Visual Basic 2010

o Index est une expression qui indique la position dun membre de la collection. Le parcours de lensemble de la collection est possible au moyen de linstruction For Each Next. la diffrence des tableaux, le redimensionnement des collections est dynamique. Vous navez donc pas besoin dutiliser des instructions Redim ou Redim Preserve: lobjet Collection le fait pour vous.

Info

Plusieurs collections prdfinies sont disponibles. En voici la liste:


Collection
ArrayList BitArray CollectionBase DictionaryBase HashTable Queue SortedList Stack

Type
Collection simple dobjets. Les lments sont obtenus par leur index. Collection de boolens. Les lments sont obtenus par leur index. Classe abstraite servant de base pour vos propres collections. Classe abstraite servant de base pour vos propres collections. Les lments sont stocks suivant une cl. Collection dobjets associs une cl. Les lments sont obtenus par leur index ou par leur cl. Collection de type FIFO (first in, first out, premier entr, premier sorti). Collection identique HashTable, ceci prs que les lments sont tris suivant leur cl. Les lments sont obtenus par leur index ou leur cl. Collection de type LIFO (last in, first out, dernier entr, premier sorti).

Voici un petit exemple qui vous donnera une ide des immenses possibilits offertes par les collections.
Dim ColMois as New ArrayList ColMois.Add("Janvier") ColMois.Add("Fvrier") ColMois.Add("Mars") ColMois.add("Mai") ColMois.Add("Juin") ColMois.Add("Juillet") ColMois.Add("Aot") ColMois.Add("Septembre") ColMois.Add("Octobre") ColMois.Add("Novembre") ColMois.Add("Dcembre")

Chapitre 2

Le langage et lenvironnement 

31

Le mois "Avril" a t oubli en quatrime position. Pour lajouter, il suffit dutiliser linstruction suivante:
ColMois.Insert(3,"Avril")

Pour supprimer ce mme objet, vous utiliserez linstruction suivante:


ColMois.Remove(0)

Pour afficher les membres de la collection, vous utiliserez une structure For du type suivant:
Dim obj as Object For Each o in ColMois Write o.ToString Next

Enfin, pour trier les lments de la liste par ordre alphabtique, vous utiliserez linstruction suivante:
ColMois.Sort

Lenvironnement Visual Studio 2010


Visual Studio uniformise le dveloppement des applications en Visual Basic, Visual C#, Visual C++, Visual F#, ASP.NET, Silverlight et Cloud. Dautre part, en installant des modules complmentaires (appels SDK, ou Software Development Toolkit), il est possible dajouter dautres langages lenvironnement de dveloppement. titre dexemple, il suffit dinstaller le SDK de BlackBerry pour tre en mesure de dvelopper des applications pour terminaux BlackBerry dans Visual Studio, tout en profitant de lintellisense et du dbogueur de lenvironnement de dveloppement. Comme dans les versions prcdentes de Visual Basic, les applications se composent de formulaires (Forms). La conception et la mise au point dapplications se font selon le modle qui a fait ses preuves depuis la premire version de Visual Basic:

La conception de linterface utilisateur se fait par le dplacement de contrles, depuis la Bote outils vers le formulaire de lapplication. Le code vnementiel relatif un objet est saisi dans un diteur de code intelligent qui colorise diffremment les mots-cls, les instructions et les commentaires. La mise au point dune application se fait dans le dbogueur intgr. Il est ainsi possible dexcuter le code instruction par instruction, de connatre le contenu de certaines variables sensibles ou encore dexcuter un bloc dinstructions dune seule traite.

32

Visual Basic 2010

Dfinition dun nouveau projet


Lorsque vous dfinissez un nouveau projet avec la commande Nouveau/Projet dans le menu Fichier, une bote de dialogue vous demande de prciser le modle sur lequel doit tre construit le projet (voir Figure2.1).
Figure2.1 Dfinition dun nouveau projet.

Vous pouvez crer un projet pour cibler des versions antrieures du .NET Framework en utilisant la liste droulante Framework, dans la partie suprieure de la bote de dialogue. Choisissez une entre dans cette liste avant de slectionner un modle de projet, car seuls les modles compatibles avec cette version du .NET Framework saffichent dans la liste. Dans le volet gauche de la bote de dialogue, slectionnez Modles installs, dveloppez lentre Visual Basic et cliquez sur Windows.

Dans le volet central, vous choisirez essentiellement: Application console. Pour crer une application dont les sorties seffectuent uniquement en mode texte. Application Windows Forms. Pour crer une application Windows traditionnelle. Bibliothque de classes. Pour crer une classe ou un composant rutilisable. Bibliothque de contrles Windows Forms. Pour crer un contrle personnalis. Application WPF. Pour crer une application Windows Presentation Foundation. Consultez le Chapitre 19 pour en savoir plus sur ce type dapplications.

Une fois le type de lapplication slectionn, le bureau contient plusieurs fentres, volets et palettes (voir Figure2.2).

Chapitre 2

Le langage et lenvironnement 

33

Figure2.2 Lenvironnement de dveloppement Visual Studio 2010 pendant la cration dune application Windows.

ce Astu

Si votre systme graphique le permet, utilisez une rsolution daffichage suprieure 1024 768 points. Travaillez si possible en 1280 1024 points ou plus, sur deux ou trois crans. Vous pourrez ainsi dispatcher les composantes de lenvironnement de dveloppement sur une plus grande surface de telle sorte quelles ne se chevauchent pas.

Le systme de menus
La partie suprieure de lcran donne accs au systme de menus et la barre doutils Standard du langage. Le systme de menus est trs classique:

Le menu Fichier permet de charger et de sauvegarder des projets Visual Basic. Le menu dition donne accs aux commandes Couper, Copier et Coller classiques. Le menu Affichage est utilis pour afficher/masquer les onglets et barres doutils de lEnvironnement de dveloppement. Le menu Projet permet dajouter des lments au projet en cours ddition. Le menu Gnrer est utilis pour crer la version finale excutable dun projet. Le menu Dboguer permet de compiler, de lancer et de tester le projet. Le menu quipe permet de se connecter Team Foundation Server dans le cas dun travail au sein dune quipe.

34

Visual Basic 2010

Le menu Donnes donne accs aux sources de donnes associes au projet. Le menu Format permet de dfinir des options de mise en forme des lments affichs dans la fentre du projet. Le menu Outils donne accs de nombreuses options permettant de personnaliser lIDE, dtablir une connexion avec une base de donnes ou encore daccder lditeur de macros. Le menu Test permet de lancer des tests unitaires manuels ou gnrs sur votre code Visual Basic ou ASP.NET. Enfin, le menu Fentre permet daccder aux diffrentes fentres ouvertes et de choisir leur disposition sur les crans.

Les barres doutils


Les barres doutils facilitent laccs aux commandes les plus frquentes. Pour les faire apparatre, slectionnez la commande Barre doutils du menu Affichage (voir Figure2.3) ou cliquez du bouton droit sur une barre doutils existante.
Figure2.3 Visual Studio donne accs de nombreuses barres doutils thmatiques.

Chapitre 2

Le langage et lenvironnement 

35

Info

Pour transformer une fentre secondaire en palette flottante (et inversement), il suffit de double-cliquer sur sa barre de titre.

Vous emploierez essentiellement les barres doutils Standard, Disposition et diteur de texte. La barre doutils Standard facilite laccs aux commandes de menu les plus frquemment utilises : ouverture/sauvegarde dun projet, excution/arrt de lapplication, placement dun point darrt, etc. (voir Figure2.4).
Figure2.4 Les icnes de la barre doutils Standard.

La barre doutils Disposition permet dajuster les contrles dposs sur les feuilles des applications (voir Figure2.5).
Figure2.5 Les icnes de la barre doutils Disposition.

La barre doutils diteur de texte propose des fonctionnalits ddies lditeur de code de Visual Studio (voir Figure2.6).
Figure2.6 Les icnes de la barre doutils diteur de texte.

Les fentres filles


Lenvironnement de dveloppement contient plusieurs fentres secondaires (galement appeles fentres filles) ancres sur la priphrie de la fentre ou affiches sous la forme de palettes flottantes. Vous utiliserez en particulier:

lexplorateur de solutions; la bote outils; la fentre des proprits.

LExplorateur de solutions donne la liste des lments qui constituent lapplication (voir Figure2.7).

36

Visual Basic 2010

Figure2.7 Dans cet exemple, le projet ne comprend quune feuille, nomme Form1.

La Bote outils regroupe sous diffrents onglets les contrles qui seront utiliss pour constituer la partie visuelle de lapplication. Pour placer un nouveau contrle sur une feuille, il suffit de le slectionner dans la Bote outils et de tracer une zone rectangulaire sur la feuille (voir Figure2.8).
Figure2.8 La Bote outils contient plusieurs onglets thmatiques.

Pour accder des contrles supplmentaires, lancez la commande Choisir des lments de bote outils, dans le menu Outils. Slectionnez longlet Composants COM, Composants .NET Framework, Composants WPF ou Composants Silverlight, cochez les cases correspondant aux composants que vous souhaitez rendre disponibles et cliquez sur OK (voir Figure2.9).

Chapitre 2

Le langage et lenvironnement 

37

Figure2.9 Cette fentre liste les composants additionnels disponibles.

La fentre Proprits (voir Figure 2.10) liste les proprits associes la feuille ou au contrle slectionn. Certaines proprits ne sont accessibles quen mode Cration. Dautres, au contraire, ne sont accessibles que pendant lexcution, laide de lignes de code.
Figure2.10 La fentre Proprits donne les caractristiques de la feuille ou de lobjet slectionn.

38

Visual Basic 2010

Enfin, par lintermdiaire de plusieurs onglets, la feuille de travail donne accs la reprsentation visuelle des formulaires de lapplication et aux codes correspondants (voir Figure2.11).
Figure2.11 Cette application est compose dun formulaire contenant quatre labels, trois champs texte et deux boutons de commande.

3
Nouveauts et concepts utiles du langage et de lenvironnement
Au sommaire de ce chapitre

Innovations de lenvironnement de dveloppement Innovations du langage Techniques volues de Visual Studio 2008 toujours dactualit dans Visual Studio
2010
Le tableau ci-aprs dcrit les volutions du langage Visual Basic et de lenvironnement Visual Studio depuis 2002.

40

Visual Basic 2010

2002
EnvironVS.NET 2002 nement de dveloppement Visual Basic

2003
VS.NET 2003

2005
VS 2005

2006
VS 2005 + Extensions

2007
VS 2008

2010
VS 2010

VB.NET (v7.0) VB.NET (v7.1) NetFx v1.1 1.1

VB 2005 (v8.0) VB 2005 (v8.0) VB 9 NetFx v2.0 2.0 NetFx v3.0 2.0

VB 2010

Librairies du NetFx v1.0 Framework CLR 1.0

NetFx v3.5 .NET 4.0 2.0 4.0

Comme vous pouvez le voir, le CLR (Common Language Runtime) de Visual Basic 2010 est dsormais en version 4.0. Le CLR fournit divers services lexcution: compilation JIT, gestion de la mmoire, de la scurit, des exceptions, etc. Il met galement la disposition des langages de lenvironnement de dveloppement la librairie des classes de base. On est donc en droit de craindre le pire au niveau de linteroprabilit1. Le CLR apporte une solution lgante ce sujet: les diffrentes versions du CLR peuvent dsormais cohabiter dans un seul et mme process. Ainsi, si une application utilise des composants bass sur une version prcdente du CLR, elle continuera utiliser ces mmes composants. Si de nouveaux composants relatifs du CLR 4.0 sont ajouts cette application, ils utiliseront tout simplement, de faon automatique et totalement transparente, cette version du CLR. Les anciennes applications Visual Basic sont donc totalement compatibles avec la nouvelle version du CLR et peuvent mme tre mises jour sans provoquer de problmes de compatibilit. Cette volution majeure du moteur dexcution du Framework .NET apporte son lot de nouveauts. Citons entre autres:

TLBIMP (Type LiBrary IMPorter). Cet outil permettant de convertir les dfinitions de types prsentes dans une bibliothque de types COM en leur quivalent dans un assembly de CLR, est dsormais disponible en Shared Source sur Codeplex, ladresse http://clrinterop.codeplex.com/. Linteroprabilit avec de nouveaux langages. IronPython, IronRuby et F#. Cette tape a ncessit limplmentation de nouveaux types, notamment Tuple et BigInteger. Le Framework. ParallelFX Il fournit des mcanismes puissants pour mettre en place la paralllisation des traitements tout en fournissant un haut niveau dabstraction, et donc une facilit dutilisation jusquici ingale. Ce Framework peut galement tre utilis

1. Linteroprabilit dun programme Visual Basic est sa capacit fonctionner dans diffrents systmes dexploitation et/ou versions .NET.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

41

pour dcouper lexcution des requtes LINQ qui sexcutent en mmoire en diffrents threads afin doptimiser leur traitement sur les systmes plusieurs processeurs et/ou curs.

Le processus de gestion de la mmoire (Garbage Collector). Il a t amlior, tant au niveau serveur que client. Ct serveur, la collecte de gnration 21 gnre une notification laquelle il suffit de sabonner. Lorsquune telle collecte a lieu, il suffit alors de rpercuter le traitement sur une autre machine. Ct client, les collectes de gnration 0, 1 et 2 se font en arrire-plan, et donc, noccasionnent aucun temps de latence dans lexcution de lapplication. Corrupted State Exceptions. Certaines exceptions qui ne peuvent pas tre captures par le mcanisme Try Catch (par exemple les exceptions de type Invalid Memory, Stack Overflow ou encore A/V Exception) peuvent dsormais tre captures laide dun nouveau type de gestion des exceptions: Corrupted State Exceptions. Historical debogger. Lors du dbogage dune application, toute la session de dbogage est enregistre. Cette nouvelle fonctionnalit, appele "historical debogger", permet de rejouer autant de fois que ncessaire la session afin de trouver do vient le problme. Le dbogueur. Il supporte dsormais le 64-bit en mixed-mode, pour le live et les dumps. Contraintes. Il est dsormais possible de dfinir des contraintes avant (Requires), pendant (Invariant) et aprs (Ensures) lexcution dune mthode. Tous les tests unitaires lis aux contraintes peuvent alors tre gnrs automatiquement.

Dans ce chapitre, nous allons passer en revue les volutions majeures de lenvironnement de dveloppement Visual Studio 2010, ainsi que les principales nouveauts, volutions et facilits dcriture de la version 10 de Visual Basic. Nous rappellerons galement les techniques volues de Visual Studio 2008/Visual Basic 2008, toujours en vigueur dans Visual Studio 2010/Visual Basic 2010.

Innovations de lenvironnement de dveloppement


En quelques pages, nous allons lister les principales innovations de lenvironnement de dveloppement.

Intgration de WPF dans lIDE


Lenvironnement de dveloppement de Visual Studio 2010 a t entirement rcrit en tirant parti de la technologie WPF (Windows Presentation Foundation). De cette volution
1. Les collectes de gnration 0 et 1 concernent les petits objets. Elles sont rapides car le segment trait est de petite taille. Par contre, les collectes de gnration 2 concernent les objets de grande taille et peuvent introduire des temps de latence dans lexcution dune application.

42

Visual Basic 2010

ergonomique dcoule la possibilit dutiliser plusieurs crans. Le cas chant, vous pouvez y rpartir votre gr les diffrentes fentres qui composent lIDE (voir Figure3.1).
Figure3.1 Les lments de lIDE peuvent tre rpartis sur plusieurs crans.

Dans chacune des fentres de lIDE, une icne en forme de flche oriente vers le bas (dans langle suprieur droit de la fentre), vous permet dancrer, de laisser flotter ou de cacher la fentre (voir Figure3.2). Pour dplacer une fentre flottante (ventuellement sur un autre cran), il suffit de pointer sa barre de titre et dutiliser la technique de glisser-dposer de Windows.
Figure3.2 Choix de la position dune fentre.

Projets fonds sur des modles


Lorsque vous dfinissez un nouveau projet, il est par dfaut bas sur les modles installs sur lordinateur. En slectionnant lentre Modles en ligne, dans la partie infrieure gauche de la fentre Nouveau projet, vous pouvez tendre les modles existants avec ceux proposs en ligne par Microsoft (voir Figure3.3).

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

43

Figure3.3 Un nouveau projet peut tre bas sur un modle en ligne. Ici, par exemple, un conomiseur dcran WPF qui affiche les posts dun flux Twitter.

Info

Lorsque vous ajoutez un lment votre projet, il est galement possible de le piocher dans les lments disponibles sur lordinateur ou dans la bibliothque en ligne, en cliquant sur lentre Modles en ligne dans la bote de dialogue Ajouter un nouvel lment.

Gestion des projets rcents


Lorsque vous lancez Visual Studio, les projets rcemment ouverts sont directement accessibles dans la page de dmarrage (voir Figure3.4). Un clic suffit pour retourner au projet sur lequel vous travailliez la veille.
Figure3.4 Les projets rcents sont directement accessibles sur la page de dmarrage.

44

Visual Basic 2010

Si vous cliquez du bouton droit sur un projet rcent, vous pouvez louvrir dans Visual Studio, ouvrir le dossier dans lequel il est stock ou le supprimer de la liste des projets rcents (voir Figure3.5).
Figure3.5 Le menu contextuel des projets rcents.

Il est galement possible dancrer un projet dans la liste en cliquant devant son icne. Une punaise saffiche pour matrialiser sa persistance.

Multitargetting
Lorsque vous lancez la commande Nouveau/Projet dans le menu Fichier pour concevoir un nouveau projet Visual Basic 2010, la bote de dialogue Nouveau projet apparat. Utilisez la liste droulante affiche dans la partie suprieure droite de la bote de dialogue pour choisir le Framework cible: 2.0, 3.0, 3.5 ou 4.0 (voir Figure3.6).
Figure3.6 Choisissez le Framework utiliser.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

45

Info

Un projet cr avec une version prcdente de Visual Basic peut tre complt dans Visual Studio 2010. Les anciens composants, bass sur les versions 1.0, 1.1 et/ou 2.0 du CLR continueront fonctionner comme auparavant. Les composants ajouts dans le projet et bass sur la version 4.0 du CLR cohabiteront avec eux sans quaucun problme de compatibilit napparaisse : diffrentes versions du CLR peuvent en effet tre abrites dans un seul et mme process.

Zoom dans le code


Lditeur de code de Visual Studio 2010 implmente (enfin!) la fonctionnalit de zoom rapide avec la roulette de la souris. Il vous suffit dsormais de maintenir la touche Ctrl enfonce et dutiliser la roulette pour modifier le facteur de zoom du code. Cette technique se rvle trs pratique, notamment lors de prsentations et de dmonstrations.

Intellisense
Lintellisense est une fonctionnalit trs intressante qui vous permet dcrire du code plus rapidement et de faon plus exacte. Ds que vous commencez taper un mot-cl reconnu par le compilateur, il affiche le modle qui permettra de complter linstruction en cours (voir Figure3.7).
Figure3.7 Lintellisense de Visual Basic 2010.

Lorsque vous poursuivez la frappe, lintellisense sadapte automatiquement au contenu. Cette fonctionnalit est utilisable lors de dveloppement VB.NET et XAML. Elle a galement t amliore pour le langage JavaScript: non content de proposer les variables et fonctions crites par lutilisateur, Intellisense inclut dsormais les objets grs dynamiquement. noter que les commentaires sont galement pris en charge par cette fonctionnalit.

Naviguer vers
La commande Naviguer vers du menu dition (ou le raccourci Ctrl+,) donne accs une bote de dialogue de recherche volue qui complte merveille lancienne bote de

46

Visual Basic 2010

ialogue Rechercher et remplacer. Entrez un terme dans la zone de texte Rechercher les d termes, et les rsultats correspondants apparaissent dans la partie centrale de la bote de dialogue Naviguer vers (voir Figure3.8).
Figure3.8 La bote de dialogue Naviguer vers est bien plus pratique et directe que la bote de dialogue Rechercher et remplacer.

Il vous suffit de slectionner un des rsultats et de cliquer sur OK pour ouvrir le code source correspondant et y surligner lobjet de la recherche. Si ncessaire, vous pouvez utiliser:

les caractres de remplacement "?" et "*" pour remplacer (respectivement) un caractre quelconque et un nombre quelconque de caractres dans llment recherch; plusieurs mots pour affiner votre recherche; une ou plusieurs lettres majuscules pour rechercher les termes qui contiennent les majuscules spcifies (par exemple, MU identifiera les objets Form1_MouseUp(), Form2_ MouseUp(), mais galement, si elle existe, la fonction MindUp().

Surbrillance des rfrences


Le simple fait de cliquer sur un nom de variable, un paramtre ou un champ provoque la mise en surbrillance des mmes lments dans le reste du code (voir Figure3.9). Pour vous dplacer rapidement dune occurrence la suivante, vous utiliserez le raccourci Ctrl+Maj+Bas. Pour atteindre loccurrence prcdente, vous utiliserez le raccourci Ctrl+ Maj+Haut.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

47

Figure3.9 Il a suffi de cliquer sur une des occurrences de la variable OutilEnCours pour que les autres occurrences soient surlignes dans le code.

Info

Une fois arriv la dernire occurrence dune rfrence, le raccourci Ctrl+Maj+Bas affiche la premire occurrence dans le code. Inversement, une fois arriv la premire occurrence dune rfrence, le raccourci Ctrl+Maj+Haut affiche la dernire occurrence dans le code.

Recherche des rfrences


Pour avoir un aperu des mthodes qui appellent et qui sont appeles par un lment (mthode, attribut ou variable), il suffit de cliquer du bouton droit sur cet lment et de slectionner Rechercher toutes les rfrences dans le menu contextuel. Vous pouvez galement double-cliquer sur llment et appuyer sur Maj+F12 pour parvenir au mme rsultat (voir Figure3.10).
Figure3.10 Il a suffi de cliquer sur une des occurrences de la variable OutilEnCours pour que les autres occurrences soient surlignes dans le code.

48

Visual Basic 2010

Gnrer partir de lutilisation


Avec Visual Studio 2010, il est dsormais possible de dfinir une dclaration de fonction pendant lcriture du code qui appelle cette fonction. Le code dfinitif de la fonction pourra alors tre dfini dans un deuxime temps. la Figure3.11 par exemple, la fonction calcul() est appele dans la solution Premier alors quelle na pas encore t dfinie. Le mot calcul est automatiquement soulign dune ligne ondule bleue et dun marqueur rectangulaire rouge.
Figure3.11 La fonction calcul() na pas encore t implmente.

Pointez le marqueur pour faire apparatre licne doptions de correction derreur. Cliquez sur cette icne, puis sur lentre Gnrer un stub de mthode pour calcul dans Premier. Form1 (voir Figure3.12).
Figure3.12 Le rectangle rouge donne accs aux options de correction derreur.

Le squelette de la fonction calcul() est alors automatiquement cr en sadaptant aux contraintes imposes par le code. Ici, passage dun Double et rcupration dun String (voir Figure3.13).
Figure3.13 La fonction calcul() a t gnre partir de son utilisation.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

49

Gestionnaire dextensions
Le Gestionnaire dextensions de Visual Studio 2010 permet de tlcharger et dinstaller des "extensions" en ligne, proposes par Microsoft ou par des utilisateurs de Visual Studio. Cesextensions vont des contrles aux modles en passant par divers types doutils. Pour accder aux extensions en ligne, lancez la commande Gestionnaire dextensions dans le menu outils, slectionnez longlet Galerie en ligne, choisissez un type dextensions dans le volet gauche, une extension dans le volet central et cliquez sur le bouton Tlcharger correspondant (voir Figure3.14).
Figure3.14 Le contrle ComponentOne Studio for iPhone est sur le point dtre tlcharg.

Info

Il existe un grand nombre dextensions disponibles sur le Web. Si vous connaissez le nom (complet ou partiel) de lextension recherche, il est pratique dutiliser la case de recherche, dans la partie suprieure droite du Gestionnaire dextensions, comme vous le feriez dans une fentre de lExplorateur de fichiers de Windows 7 ou Vista.

Data Binding avec un glisser-dposer dans WPF


Aprs avoir ajout une source de donnes un projet WPF, de simples glisser-dposer permettent de relier les contrles Windows Presentation Foundation aux champs de donnes (voir Figure3.15).

50

Visual Basic 2010

Figure3.15 Le Data Binding se fait par simples copier-coller depuis la source de donnes.

Dbogage Intellitrace
Traditionnellement, lorsquune exception se produit dans une application, le programmeur insre des points darrt dans le code pour localiser linstruction ou le groupe dinstructions qui pose problme. partir de ces points darrt, il teste la valeur des variables et objets quil souponne tre la source du problme. La recherche du bogue se fait alors par dichotomies successives. Son aboutissement est li aux connaissances du programmeur et la complexit du code. Il peut parfois ncessiter de longues minutes pour aboutir! Le dbogage Intellitrace est une nouveaut de Visual Studio 2010 dition Ultimate. Prcdemment connue sous le nom d"Historical Debugger", cette fonctionnalit permet de dboguer une application en enregistrant les vnements diffrents vnements qui sy produisent, ou en journalisant de faon automatique les appels de mthodes (trace) et la navigation dans ces traces. Cette fonctionnalit dpasse le cadre de cet ouvrage, qui se limite ldition professionnelle de Visual Studio 2010. Si vous travaillez avec ldition Ultimate, vous pouvez vous reporter larticle MSDN "Dbogage avec Intellitrace", ladresse http://msdn.microsoft.com/fr-fr/library/dd264915.aspx.

Publication en un clic
Visual Studio 2010 est en mesure de raliser un interfaage direct dIIS pour dployer un site ASP.NET en un simple clic de souris.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

51

Pour arriver cette prouesse, une tape dinitialisation est ncessaire. Cliquez du bouton droit sur une barre doutils de Visual Studio et slectionnez Publication web en un clic. Dans cette nouvelle barre doutils, droulez la liste Publier et slectionnez <Nouveau>. Paramtrez la bote de dialogue Publier le site web en accord avec la mthode de publi cation et les paramtres de votre site (voir Figure3.16).
Figure3.16 Le site ASP.NET en cours ddition va tre publi sur un serveur FTP.

Une fois le paramtrage effectu, il vous suffira de cliquer sur licne Publier le site web de la barre doutils Publication web en un clic pour que votre application soit publie sur le serveur cibl. Pendant la publication, la fentre Sortie vous tiendra au courant des actions effectues:
------ Dbut de la gnration: Projet: WebApplication1, Configuration: Debug Any CPU -----WebApplication1 -> c:\users\x4\documents\visual studio 2010\Projects\WebApplication1\WebApplication1\bin\WebApplication1.dll ------ Dmarrage de la publication: Projet: WebApplication1, Configuration: Debug Any CPU -----Connexion ftp://ftp.ftp.monserveur.fr... Web.config transform en obj\Debug\TransformWebConfig\transformed\Web.config avec Web.Debug.config. Copie de tous les fichiers lemplacement temporaire suivant pour le package/ la publication:

52

Visual Basic 2010

obj\Debug\Package\PackageTmp. Publication du dossier / en cours... Publication du dossier Account en cours... Publication du dossier bin en cours... Publication du dossier Scripts en cours... Publication du dossier Styles en cours... ======= Gnration: 1 a russi ou est jour, 0 a chou, 0 a t ignor ====== ======= Publication: 1 a russi, 0 a chou, 0 a t ignor ==========

Tests unitaires
Une des grandes nouveauts de Visual Studio 2010 est la possibilit de crer des tests unitaires. Par leur intermdiaire, il est possible de tester une fonction particulire dun programme afin de mettre en vidence un ou plusieurs problmes dans le code ou dans les donnes. Considrons le code suivant:
Public Class Form1 Private Function calcul() As Single calcul = Rnd(1) * 2 + 1 End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Label3.Text = CStr(calcul()) End Sub End Class

La fonction calcul() retourne un Single alatoire et la fonction vnementielle Button1_ Click affiche, aprs conversion en un String, la valeur retourne par calcul() dans lobjet Label3. Supposons que la valeur retourne par calcul() doit tre comprise entre 0 et 2. Nous allons dfinir un test unitaire sur la fonction Button1_Click() pour mettre en vidence un dysfonctionnement dans calcul(). Dans lditeur de code, cliquez du bouton droit sur la fonction Button1_Click() et slectionnez Crer des tests unitaires dans le menu contextuel. La bote de dialogue Crer des tests unitaires saffiche. Sous Slection actuelle, une arborescence affiche la hirarchie de classes et de membres de lassembly qui hberge la classe du projet. Dans lexemple de la Figure3.17, cette classe a pour nom Premier. Vous pouvez utiliser cette page pour gnrer des tests unitaires pour toute slection de ces membres et pour choisir un projet de test dans lequel vous souhaitez placer les tests unitaires gnrs.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

53

Figure3.17 Cration dun test unitaire sur la fonction Button1_ Click().

Cliquez sur OK pour valider la cration du test unitaire. Aprs quelques instants, le projet de test apparat dans lExplorateur de solutions (voir Figure3.18).
Figure3.18 Le projet de test TestProject1 a t ajout lExplorateur de solutions.

Lancez la commande Fentres/Affichage des tests dans le menu Test pour afficher la fentre Affichage des tests. Dans cette fentre, cliquez sur le bouton Actualiser pour faire apparatre le test (voir Figure3.19).

54

Visual Basic 2010

Figure3.19 Le test est accessible dans la fentre Affichage des tests.

Toujours dans la fentre Affichage des tests, cliquez du bouton droit sur Button1_ClickTest et slectionnez Excuter la slection dans le menu contextuel. La fentre Rsultats des tests donne son verdict (voir Figure3.20).
Figure3.20 Le test nest pas concluant.

Ce

rsultat

provient

de

linstruction

Assert.Inconclusive()

de

la

fonction

Button1_ClickTest():
Public Sub Button1_ClickTest() Dim target As Form1_Accessor = New Form1_Accessor() TODO: initialisez une valeur approprie Dim sender As Object = Nothing TODO: initialisez une valeur approprie Dim e As EventArgs = Nothing TODO: initialisez une valeur approprie target.Button1_Click(sender, e) Assert.Inconclusive("Une mthode qui ne retourne pas une valeur ne peut pas tre vrifie.") End Sub

Supprimez cette instruction et remplacez-la par une instruction de test du type suivant:
Assert.AreEqual(1, target.calcul(), 1)

Cette instruction va tester si le rsultat renvoy par la fonction calcul() est compris entre 0 et 2: le premier paramtre de Assert.AreEqual() reprsente la valeur cible, le deuxime, la valeur renvoye par la fonction calcul() et le troisime la tolrance sur la valeur cible. Dans la fentre Affichage des tests, cliquez sur Actualiser pour mettre jour le test en fonction de la modification du code. Cliquez du bouton droit sur Button1_ClickTest et slectionnez Excuter la slection dans le menu contextuel.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

55

Selon la valeur tire alatoirement dans la fonction calcul(), vous pourrez avoir une russite ou un chec, comme la Figure3.21.
Figure3.21 Le test a chou.

Il est clair que lerreur vient de la fonction calcul(). Pour solutionner le problme, linstruction responsable du rsultat pourrait tre modifie comme suit:
calcul = Rnd(1) + 1

Cet exemple simpliste donne un aperu des immenses possibilits des tests unitaires de Visual Studio 2010 : en quelques clics et en dfinissant le code de test appropri, vous pouvez trouver les causes du dysfonctionnement dune fonction. Cette technique ne supprime en aucun cas lintrt de la mthode de dbogage traditionnelle qui consiste insrer des points darrt dans le code et tester les valeurs de variables ou de proprits. Elle vient en complment et peut savrer plus efficaces dans certains cas. vous de tester les deux techniques et de trouver celle qui vous convient le mieux dans chaque cas de figure.

Migrer un projet existant vers le Framework .NET 4.0


Si vous voulez modifier le code ou linterface dun projet bas sur une version prcdente du Framework .NET en utilisant Visual Studio 2010, il vous suffit douvrir ce projet dans Visual Studio 2010. Cette action provoque lexcution de lAssistant Conversion de Visual Studio (voir Figure3.22).
Figure3.22 La commande Fichier> Ouvrir> Projet> Solution a provoqu lexcution de lAssistant Conversion.

56

Visual Basic 2010

Cliquez sur Suivant et validez la cration dune sauvegarde avant conversion (voir Figure3.23).
Figure3.23 Le projet original sera sauvegard avant doprer la conversion.

Cliquez sur Suivant puis sur Terminer. Aprs quelques instants, lAssistant vous informe du statut de la conversion. Le cas chant, consultez le journal de conversion pour visualiser les avertissements ou erreurs rencontrs lors de la conversion (voir Figure3.24). Aprs conversion, la version prcdente du Framework continuera tre utilise et vous pourrez travailler avec Visual Studio 2010 comme si de rien ntait. Si vous voulez utiliser les nouvelles possibilits offertes par le Framework4.0, vous devrez modifier le Framework cible. Ouvrez le projet, double-cliquez sur licne My Project dans lExplorateur de solutions, slectionnez longlet Compiler, cliquez sur Options avances de compilation, dans la partie infrieure de la page, slectionnez .NET Framework 4 Client Profile dans la liste droulante Framework cible et validez en cliquant sur OK.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

57

Figure3.24 La conversion sest bien droule.

Figure3.25 Modification du Framework cible.

Innovations du langage Visual Basic 2010


De nombreuses amliorations ont t apportes au langage Visual Basic 2010. Nous allons passer en revue les plus importantes dans cette section.

Continuation de ligne implicite


Jusqu la version 2010 de Visual Basic, les lignes trop longues devaient tre prolonges par lintermdiaire du caractre de continuation "_".

58

Visual Basic 2010

Dsormais, il est tout fait possible dcrire quelque chose comme ceci sans provoquer derreur de syntaxe:
Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End Sub

Implmentation automatique des proprits


Pour dfinir une proprit laide de code Visual Basic 2008 ou infrieur, vous deviez utiliser quelque chose comme ceci:
Private _nombre As Integer = 0 Public Property MonNombre As Integer Rcupration de "_nombre" Get Return _nombre End Get Affectation "_nombre" Set _nombre = valeur End Set End Property

Dsormais, avec Visual Basic 2010, la syntaxe est bien plus simple:
Property MonNombre as Integer

Pour affecter une valeur par dfaut une proprit, vous utiliserez la syntaxe suivante:
Property Ville As String = "Paris"

Pour instancier un objet, vous utiliserez la syntaxe suivante:


Property Villes As New List(Of String)

Initialiseurs de collections
En Visual Basic9, linstruction With simplifiait laccs aux diffrents membres dun objet (collection, tableau). titre dexemple, le code ci-aprs cre un tableau de capitales et linitialise avec quatre lignes de donnes:
Partial Class pays Public Nom As String Public Pays As String

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

59

End Class Dim Capitales = New Ville() { _ New Ville With { _ .Nom = "Paris", _ .Pays = "France"}, _ New Ville With { _ .Nom = "Londres", _ .Pays = "Royaume-Uni"}, _ New Ville With { _ .Nom = "Madrid", _ .Pays = "Espagne"}, _ New Ville With { _ .Nom = "Washington", _ .Pays = "Etats-Unis"} _ }

Grce linstruction With, lcriture des lments "Ville.Nom" et "Ville.Pays" est simplifie en ".Nom" et ".Pays". Linitialisation dobjets fonctionne galement pour les objets crs dans les classes du projet. titre dexemple, nous allons crer un nouveau projet de type Application Windows Forms. Nous ajoutons une nouvelle classe dans ce projet que nous nommons Ville. Nous ajoutons deux proprits la classe Ville que nous nommons Nom et Pays:
Public Class Ville Private intNom As String Public Property Nom() As String Get Return intNom End Get Set(ByVal value As String) intNom = value End Set End Property Private intPays As String Public Property Pays() As String Get Return intPays End Get Set(ByVal value As String)

60

Visual Basic 2010

intPays = value End Set End Property End Class

Info

Pour crer une proprit dans une classe, il suffit de taper Property, dappuyer sur la touche Tab du clavier et de changer les valeurs la suite des mots P rivate et Property.

Retournons au code de la classe principale du projet. Pour crer et manipuler un objet de classe Ville en Visual Basic 9, vous faisiez quelque chose comme ceci:
Dim Capitale As New Ville Capitale.Nom = "Paris" Capitale.Pays = "France"

En Visual Basic 2010, le code deviendra:


Dim Capitale = New Ville With _ {.Nom = "Paris", .Pays = "France"}

Info

Il nest pas ncessaire dinitialiser toutes les proprits dans les accolades : elles pourront tre dfinies dans la suite du code.

En Visual Basic10, linitialisation de collections est encore plus simple, grce au mot-cl From.
Dim capitales = New New Capitale With New Capitale With New Capitale With New Capitale With } List (Of Capitale) From { {.Nom = "Paris", .Pays = "France"}, {.Nom = "Londres", .Pays = "Royaume-Uni"}, {.Nom = "Madrid", .Pays = "Espagne"}, {.Nom = "Washington", .Pays = "Etats-Unis"}

Syntaxe simplifie pour dclarer des tableaux


Linfrence de type simplifie grandement la dclaration des tableaux:
Dim tab1 = {12, 25, 19} Dim tab2 = {12.2, 6.5}

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

61

Dim tab3 = {1, tab2, "texte"} Dim tab4 = {"texte 1", "texte 2", "texte 3"} Console.WriteLine("Type Console.WriteLine("Type Console.WriteLine("Type Console.WriteLine("Type de de de de tab1 tab2 tab3 tab4 : : : : " " " " & & & & tab1.ToString()) tab2.ToString()) tab3.ToString()) tab4.ToString())

Voici laffichage dans la fentre Sortie


Type Type Type Type de de de de tab1 tab2 tab3 tab4 : : : : System.Int32[] System.Double[] System.Object[] System.String[]

Info

Cette syntaxe stend galement aux tableaux multidimensionnels.

Expressions Lambda multilignes et sous-routine


Une expression Lambda est une fonction sans nom qui renvoie une valeur unique. titre dexemple, lexpression Lambda suivante consiste en une fonction qui admet un argument entier et qui renvoie un calcul rel bas sur cet argument:
Dim monExpressionLambda = Function(nombre As Integer) (nombre + 7) / 3

Pour appeler lexpression Lambda, il suffit de prciser son nom et son argument. Par exemple:
Console.WriteLine(monExpressionLambda(12))

Visual Basic 2010 permet dsormais dcrire une expression Lambda sur plusieurs lignes. Considrez le code suivant:
Dim monExpressionLambda = Function(nombre As Integer) As String If (nombre > 10) Then Return "est suprieur 10" Else Return "est infrieur ou gal 10" End If End Function

Dans cet exemple, le code de la fonction lambda repose sur une structure If Then Else. Si ncessaire, il peut tre bien plus complexe et compter autant de lignes que ncessaires.

62

Visual Basic 2010

Cette possibilit nest pas la seule nouveaut lie aux expressions Lambda: dsormais, le compilateur de Visual Basic 2010 autorise galement les expressions Lambda de types Sub. Le code suivant est donc tout fait licite:
Dim monExpressionLambda = Sub(nombre As Integer) If (nombre > 10) Then TextBox1.Text = "Argument > 10" Else TextBox1.Text = "Argument <= 10" End If End Sub

Il est galement possible de dfinir une expression Lambda de type Sub sur une seule ligne de code, comme dans le code suivant:
Dim monExpressionLambda = Sub(nombre As Integer) TextBox1.Text = nombre monExpressionLambda(12)

Dans cet exemple, lappel de lexpression Lambda provoquera laffichage de largument dans la zone de texte TextBox1.

Covariance et contravariance gnriques


Dans les versions antrieures de Visual Basic, les gnriques se comportaient de faon invariante en ce qui concerne le sous-typage. Les conversions entre les types gnriques prsentant diffrents arguments de types ntaient donc pas autorises. Considrez le code suivant:
Dim textboxCollection As IEnumerable(Of TextBox) = New List(Of TextBox) From {New TextBox} Dim ctrlCollection As IEnumerable(Of Control) = textboxCollection

Dans Visual Basic 2008, ce code produit une erreur:


IEnumerable(Of TextBox) ne peut pas tre converti en IEnumerable (Of Control)

Et pourtant, une valeur de type TextBox peut tout fait tre convertie en un contrle! De mme, le code suivant nest pas autoris dans Visual Basic 2008:
Dim tbCollection As IList(Of TextBox) = New List(Of TextBox) From {New TextBox} Dim ctrlCollection As IList(Of Control) = tbCollection

Il produit une erreur de type InvalidCastException, car la deuxime ligne convertit un IList(Of TextBox) en un IList(Of Control). Si vous tentez dcrire les deux codes prcdents dans un programme Visual Basic 2010 qui cible le Framework .NET 4, le premier code sera autoris mais pas le second. En effet les

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

63

IEnumerable(Of T) sont des interfaces "de sortie" alors que les IList(Of T) sont des interfaces "dentre-sortie". Dans les premiers, il nest possible que de faire sortir des contrles alors que dans les seconds, il est possible de faire sortir, mais aussi entrer des contrles.

Dans Visual Studio 2010, linfrastructure a t rcrite de la faon suivante:


Interface IEnumerable(Of Out T) End Interface Interface IList(Of T) End Interface

Le mot Out dans IEnumerable(Of Out T) indique que si une mthode dans IEnumerable mentionne T, elle ne le fera quen sortie. Il est donc dsormais possible deffectuer un cast dun IEnumerable(Of driv) en un IEnumerable(Of base) sans gnrer dexception InvalidCastException. Cette nouvelle fonctionnalit porte le nom de covariance gnrique. Dans le mme ordre dides, il est possible de retreindre "en entre" un IComparer:
Interface IComparer(Of In T) End Interface

Il est donc possible de considrer un IComparer(Of Object) comme un IComparer(Of String)! En effet, si un IComparer(Of T) peut comparer deux objets quelconques de type Object, il peut galement comparer deux objets de type String. Cette nouvelle fonction nalit porte le nom de contravariance gnrique.

Prise en charge dquivalence de type


Avec Visual Basic 2010, vous pouvez dsormais dployer une application dote dinformations de type incorpor (et non de type import) partir dun assembly PIA (Primary Interop Assembly). En utilisant des informations de type incorpor, lapplication peut utiliser les types dun runtime sans ncessiter de rfrence lassembly de runtime. Si diffrentes versions de lassembly de runtime sont publies, lapplication peut fonctionner avec les diffrentes versions sans avoir tre recompile.

Prise en charge dynamique


Visual Basic cre une liaison avec les objets de langages dynamique tels que IronPython et IronRuby. Cette liaison se fait laide de linterface IDynamicMetaObjectProvider. Les classes DynamicObject et ExpandoObject constituent des exemples de classes qui implmentent linterface IDynamicMetaObjectProvider.

64

Visual Basic 2010

Si un appel liaison tardive est effectu vers un objet qui implmente linterface IDynamicMetaObjectProvider, Visual Basic utilise cette interface pour crer une liaison avec lobjet dynamique. Si un appel liaison tardive est effectu vers un objet qui nimplmente pas linterface
IDynamicMetaObjectProvider, ou si lappel linterface IDynamicMetaObjectProvider

choue, Visual Basic cre une liaison avec lobjet laide des fonctions de liaison tardive de lexcution Visual Basic. Vous en saurez plus ce sujet en consultant le site CodePlex, ladresse http://dlr.codeplex.com/.

Programmation parallle
Aujourdhui, le microprocesseur de la plupart des ordinateurs personnels et des stations de travail est dot de 2 ou 4 curs qui permettent plusieurs threads de sexcuter simultanment. Pour tirer parti de ces processeurs, vous pouvez parallliser le code Visual Basic. Ainsi, le travail effectu par vos applications est distribu sur plusieurs curs et lexcution du code est bien plus performante. Nayez crainte, le code reste compatible avec les microprocesseurs dots dun seul cur! Visual Studio 2010 et le .NET Framework4 amliorent grandement la prise en charge de la programmation parallle en fournissant de nouvelles bibliothques de classes. Par leur intermdiaire, il est "assez simple" dcrire un code parallle efficace. En particulier, la classe Parallel permet de rpartir lexcution de boucles For et For Each sur les diffrents curs disponibles. Vous pouvez galement utiliser des tches pour affecter des blocs de code des curs diffrents. Vous en saurez plus ce sujet en consultant le Chapitre13.

Concepts avancs issus des versions prcdentes de Visual Basic


Cette section regroupe quelques innovations et concepts apparus dans les versions prcdentes de Visual Basic (en particulier dans Visual Basic 2008) quil est bon davoir en tte pour utiliser Visual Basic 2010 aussi efficacement que possible.

Infrence de type
Lorsque lon parle de Visual Basic, on le qualifie souvent de "langage fortement typ". Cela signifie que les types de donnes utiliss dcrivent de faon explicite les donnes

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

65

manipules. titre dexemple, le langage PHP nest pas fortement typ. Les instructions PHP suivantes sont ainsi tout fait correctes:
$maVariable = "mon texte"; // Un texte est affect la variable maVariable $maVariable = 5; // Puis la valeur entire 5 est affecte cette mme variable

Visual Basic nautorise pas ce genre de largesse. Par contre, le compilateur de Visual Basic 2010 est en mesure de dfinir une variable type de faon implicite, en examinant lexpression qui sert linitialiser. Ainsi, par exemple, ces deux instructions sont quivalentes:
Dim monEntier = 3276 Dim monEntier as Integer = 3276

De mme, les deux instructions suivantes sont quivalentes:


Dim nom = "Michel" Dim nom As String = "Michel"

Info

Linfrence de type est initialise par dfaut. Si vous voulez la dsactiver, utilisez linstruction Option Infer Off.

Notez que linfrence de type est galement applicable aux tableaux. Par exemple, pour dfinir et initialiser un tableau contenant des Integer, vous crirez quelque chose comme ceci:
Dim Tableau = New Integer() {12, 25, 2}

Comme le montre la Figure3.26, le compilateur affecte automatiquement lobjet tableau le type tableau dentiers.
Figure3.26 Lobjet tableau a pour type tableau dInteger.

Enfin, linfrence de type peut tre utilise sur un retour dappel de mthode (voir Figure3.27).
Figure3.27 Linfrence de type va bien plus loin que la simple reconnaissance du type dune donne.

66

Visual Basic 2010

Le compilateur a vu que le retour de la fonction GetProcesses() tait un tableau de Process. Ce type a donc t affect la variable mesprocesses.

Initialiseurs dobjets
Linstruction With simplifie laccs aux diffrents membres dun objet (collection, tableau). titre dexemple, le code ci-aprs cre un tableau de capitales et linitialise avec quatre lignes de donnes:
Partial Class pays Public Nom As String Public Pays As String End Class Dim Capitales = New Ville() { _ New Ville With { _ .Nom = "Paris", _ .Pays = "France"}, _ New Ville With { _ .Nom = "Londres", _ .Pays = "Royaume-Uni"}, _ New Ville With { _ .Nom = "Madrid", _ .Pays = "Espagne"}, _ New Ville With { _ .Nom = "Washington", _ .Pays = "Etats-Unis"} _ }

Grce linstruction With, lcriture des lments "Ville.Nom" et "Ville.Pays" est simplifie en ".Nom" et ".Pays". Linitialisation dobjets fonctionne galement pour les objets crs dans les classes du projet. titre dexemple, nous allons crer un nouveau projet de type Application Windows Forms. Nous ajoutons une nouvelle classe dans ce projet que nous nommons Ville. Nous ajoutons deux proprits la classe Ville que nous nommons Nom et Pays:
Public Class Ville Private intNom As String Public Property Nom() As String Get Return intNom End Get

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

67

Set(ByVal value As String) intNom = value End Set End Property Private intPays As String Public Property Pays() As String Get Return intPays End Get Set(ByVal value As String) intPays = value End Set End Property End Class

Info

Pour crer une proprit dans une classe, il suffit de taper Property, dappuyer sur la touche Tab du clavier et de changer les valeurs la suite des mots P rivate et Property.

Retournons au code de la classe principale du projet. Pour crer et manipuler un objet de classe Ville en Visual Basic 2008, vous faisiez quelque chose comme ceci:
Dim Capitale As New Ville Capitale.Nom = "Paris" Capitale.Pays = "France"

En Visual Basic 2010, le code deviendra:


Dim Capitale = New Ville With _ {.Nom = "Paris", .Pays = "France"}

Info

Il nest pas ncessaire dinitialiser toutes les proprits dans les accolades : elles pourront tre dfinies dans la suite du code.

Types anonymes
Les dclarations dobjets contenant un ou plusieurs membres peuvent se faire sans spcifier leur type. Dans ce cas, un type anonyme, bas sur les types et noms des membres est cr.

68

Visual Basic 2010

Considrez le code suivant:


Dim Employes = New With {.Nom = "Pierre Ledoyen", .Age = 27}

tant donn quaucun type nest prcis lors de la cration de lobjet Employes, ce dernier sera de type anonyme. Il hritera de la classe Object et possdera les proprits spcifies dans laccolade (ici Nom et Age). Ds quun nouveau type anonyme a t dfini, vous pouvez utiliser lintellisense pour accder ses proprits (voir Figure3.28).
Figure3.28 Intellisense est actif.

Info

Les types anonymes ont un dfaut: il est impossible dy faire rfrence en tant que types, puisquils nont pas de nom.

Mthodes dextension
Visual Basic 2010 permet dtendre une classe, mme si vous ne possdez pas le code de cette classe. Voyons comment procder sur un exemple concret. Nous allons ajouter une mthode la classe Ville (voir la section intitule "Initialiseurs dobjets") pour connatre le nombre dhabitants de la ville spcifie. Ajoutez un module la solution avec la commande Ajouter un module dans le menu Projet. Donnez le nom MethExtensions.vb ce module. Dfinissez enfin la fonction Population() comme suit:
Public Function Population(ByVal uneVille As Ville) As Integer Select Case uneVille.Nom Case "Paris" Return 2153600 Case "Madrid" Return 3162304 Case Else Return 0 End Select End Function

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

69

Pour transformer ce code en une mthode dextension de la classe Ville, il suffit de faire prcder linstruction Function par <Extension()>. Comme vous pouvez le voir la Figure3.29, le terme Extension ne convient pas au compilateur.
Figure3.29 La fonction a t transforme en une extension de la classe Ville.

Pointez le terme soulign. Un point dexclamation apparat. Cliquez dessus et choisissez Modifiez Extension en Runtime.CompilerServices.Extension dans la liste (voir Figure3.30) pour ajouter le NameSpace adquat.
Figure3.30 Dfinition in extenso du terme Extension.

Cette fois-ci, la fonction est rellement devenue une extension de la classe Ville. Retournez dans le code du formulaire. La mthode Population est maintenant accessible par Intellisense (voir Figure3.31).
Figure3.31 La mthode Population est bien accessible.

Gnriques
Les types gnriques permettent de crer des classes, des procdures, des structures, des interfaces et des dlgus qui manipulent des donnes dont le type nest pas dfini au dpart.

70

Visual Basic 2010

Pour comprendre le fonctionnement des gnriques, examinez le code ci-aprs:


Private Sub echange(Of TypeDeDonnee)(ByRef donnee1 As TypeDeDonnee, ByRef donnee2 As TypeDeDonnee) Dim tampon As TypeDeDonnee tampon = donnee2 donnee2 = donnee1 donnee1 = tampon Console.Write("Aprs echange, donnee1 = ") Console.Write(donnee1) Console.Write(" et donnee2 = ") Console.WriteLine(donnee2) End Sub Sub Main() Dim int1 = 1 Dim int2 = 2 Dim st1 = "premier" Dim st2 = "deuxieme" echange(Of Integer)(Int1, int2) echange(Of String)(st1, st2) Console.Read() End Sub

La procdure echange est dfinie de faon gnrique (Of TypeDeDonnee), et deux paramtres gnriques lui sont passs:
Private Sub echange(Of TypeDeDonnee)(ByRef donnee1 As TypeDeDonnee, ByRef donnee2 As TypeDeDonnee)

Dans cette procdure, la variable gnrique tampon va permettre dchanger les deux donnes passes en entre:
Dim tampon As TypeDeDonnee

Une fois lchange effectu, les deux donnes saffichent dans la fentre de texte:
Console.Write("Aprs echange, donnee1 = ") Console.Write(donnee1) Console.Write(" et donnee2 = ") Console.WriteLine(donnee2)

La procdure principale appelle successivement la procdure echange en lui transmettant deux valeurs entires puis deux valeurs chanes. Remarquez comment le type des variables est spcifi lors de lappel:
echange(Of Integer)(Int1, int2) echange(Of String)(st1, st2)

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

71

En utilisant une technique similaire, vous pouvez dfinir des classes, des structures, des interfaces et des dlgus gnriques. Les gnriques offrent plusieurs avantages: ils sont fortement typs; ils sont compatibles avec la fonctionnalit Intellisense de Visual Studio; lexcution, ils sont plus rapides que des Objects; les ventuelles erreurs sont dtectes la compilation et non lexcution.

Types Valeur Nullable


Le type gnrique Nullable permet dtendre les types valeur en vue daccepter une valeur traditionnelle ou une valeur Null. Considrez le bloc de code suivant:
Module Module1 Dim monInteger As Nullable(Of Integer) Sub Main() monInteger = Nothing Console.Write("monInteger.HasValue avant initialisation: ") Console.WriteLine(monInteger.HasValue) monInteger = 57 Console.Write("monInteger.HasValue aprs initialisation: ") Console.WriteLine(monInteger.HasValue) Console.Read() End Sub End Module

La variable monInteger est dclare de type Integer Nullable:


Dim monInteger As Nullable(Of Integer)

Si la valeur Nothing est affecte la variable monInteger, la proprit HasValue renverra la valeur False. Si, par contre, une valeur non nulle est affecte cette variable, la proprit HasValue renverra la valeur True (voir Figure3.32).
Figure3.32 Illustration de type Valeur Nullable.

72

Visual Basic 2010

Dans Visual Basic 2010, trois syntaxes permettent de dclarer un type Nullable:
Dim monInteger? As Integer Dim monInteger As Integer? Dim monInteger As Nullable(Of Integer)

Vous utiliserez:

la proprit HasValue pour savoir si une variable de type Nullable nest pas affecte; la proprit Value pour rcuprer la valeur de la variable Nullable.

Oprateur IIf
Loprateur IIf (Immediate If) affecte une valeur ou une autre en fonction du rsultat dun test:
Dim Variable As Type = IIf(Condition, Valeur si vrai, Valeur si faux)

Par exemple, linstruction suivante affecte la valeur5 la variable Resultat si a est suprieur 0 et la valeur6 dans le cas contraire:
Dim Resultat as Integer = IIf(a > 0, 5, 6)

Dans Visual Basic 2010, vous pouvez indiffremment utiliser les oprateurs If et IIf pour parvenir au mme rsultat. Linstruction prcdente devient donc:
Dim Resultat as Integer = If(a > 0, 5, 6)

En combinant cette nouvelle criture avec linfrence de type, lexpression est encore simplifie:
Dim Resultat = IIf(a > 0, 5, 6)

Support tendu du code XML


Visual Basic 2010 vous permet de dfinir des objets XML en exprimant littralement leur contenu dans le code:
Dim livres = <Livres> <livre Nom="Le programmeur Visual Basic 2010"> <Auteur>Michel Martin</Auteur> <Editeur>CampusPress</Editeur> </livre> <Livre Nom="Ajax et PHP"> <Auteur>Ralph Steyer</Auteur> <Editeur>CampusPress</Editeur> </Livre> </Livres>

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

73

Comme vous pouvez le remarquer, aucun caractre terminateur de ligne nest ncessaire lorsque vous dfinissez un objet contenant du code XML littral. Quelques termes de vocabulaire quil est bon davoir lesprit avant de poursuivre la lecture sur le code XML:

Les marqueurs XML sont appels lments ou nuds. La racine dun objet XML est llment le plus extrieur (<Livres> dans lexemple prcdent). Un attribut est une valeur incorpore lintrieur dun lment (dans lexemple prcdent, Nom dans llment <Livre>). Les proprits daxe XML permettent daccder aux nuds enfants, aux nuds descendants et aux attributs des littraux XML: laxe enfant nomLittral.<NomElment> donne accs tous les enfants NomElment du littral XML nomLittral; laxe dattribut nomLittral.@NomAttribut donne accs aux attributs NomAttribut du littral XML nomLittral; laxe descendant nomLittral<NomElment> donne accs aux descendants <NomElment> du littral XML nomLittral, et ce, quel que soit leur niveau dimbrication dans la structure XML: lindexeur dextension nomLittral<NomElment>(i) donne llment de rang i du descendant <NomElment> du littral nomLittral; la valeur nomLittral<NomElment>.Value donne la valeur String du premier lment <NomElment> du littral XML nomLittral.
Info

Intellisense a t tendu pour fonctionner dans les lments XML.

Dlgus non stricts


Pour ceux qui ne seraient pas encore familiers avec les dlgus, nous allons commencer par introduire ces entits. Un dlgu est un lment qui fait rfrence une mthode (un pointeur de mthode en quelque sorte). Une fois initialis, il suffit de linvoquer pour appeler la mthode affrente. Voici un exemple de cration et dutilisation dun dlgu:
Module Module1 Delegate Sub monDelegue()

74

Visual Basic 2010

Sub MaProcedure() System.Console.WriteLine("Ce texte est affich par la Sub MaProcedure") System.Console.ReadLine() End Sub Sub Main() Dim Mondelegue As New monDelegue(AddressOf MaProcedure) Mondelegue() End Sub End Module

La premire instruction cre le dlgu MonDelegue:


Delegate Sub monDelegue()

Le bloc dinstructions suivant dfinit la procdure MaProcedure() sur laquelle pointera le dlgu. Cette procdure se contente dafficher un texte en mode console et dattendre lappui sur la touche Entre du clavier.
Sub MaProcedure() System.Console.WriteLine("Ce texte est affich par la Sub MaProcedure") System.Console.ReadLine() End Sub

La procdure principale initialise le dlgu avec ladresse de la procedure:


Dim Mondelegue As New monDelegue(AddressOf MaProcedure)

Puis elle excute la procdure via le dlgu:


Mondelegue()

De faon native, Visual Basic utilise des dlgus pour lier les vnements aux mthodes de traitement des objets. Ainsi par exemple, lorsque vous double-cliquez sur un bouton dans linterface de conception de Visual Studio, un gestionnaire dvnements est automati quement cr et associ lvnement clic par lintermdiaire dun dlgu. Dans Visual Basic 2010, les paramtres transmis une mthode vnementielle pointe par un dlgu peuvent tre omis. Ainsi, par exemple, les deux instructions suivantes sont quivalentes:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Private Sub Button1_Click() Handles Button1.Click

Cette facilit dcriture est appele "dlgus non stricts" (relaxed delegates en anglais).

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

75

Expressions Lambda
Par dfinition, une expression Lambda est une fonction sans nom qui renvoie une valeur unique. titre dexemple, lexpression Lambda suivante consiste en une fonction qui admet un argument entier et qui renvoie un calcul rel bas sur cet argument:
Dim monExpressionLambda = Function(nombre As Integer) (nombre + 7) / 3

Pour appeler lexpression Lambda, il suffit de prciser son nom et son argument. Par exemple:
Console.WriteLine(monExpressionLambda(12))

Un autre exemple, un peu plus complexe:


Sub ExecuteExpressionLambda(ByVal data As Integer, ByVal maFonction As Func (Of Integer, Boolean)) If maFonction(data) Then Console.WriteLine("Lexpression Lambda a reu la valeur 7") Else Console.WriteLine("Lexpression Lambda na pas reu la valeur 7") End If End Sub Sub Main() ExecuteExpressionLambda(7, Function(num) num = 7) Console.ReadLine() End Sub

Le premier bloc dinstructions dfinit la procdure ExecuteExpressionLambda():


Sub ExecuteExpressionLambda(ByVal data As Integer, ByVal maFonction As Func (Of Integer, Boolean))

Cette procedure admet deux arguments: la valeur entire data et la fonction maFonction (cest lexpression Lambda), qui admet un argument entier et renvoie un argument boolen. Le code de maFonction() est lmentaire. Selon la valeur boolenne renvoye, un message ou un autre saffiche sur la console:
If maFonction(data) Then Console.WriteLine("Lexpression Lambda a reu la valeur 7") Else Console.WriteLine("Lexpression Lambda na pas reu la valeur 7") End If

76

Visual Basic 2010

Il ne reste plus qu appeler la procdure ExecuteExpressionLambda() en lui transmettant la valeur et la fonction:


ExecuteExpressionLambda(7, Function(num) num = 7)

Ici, la fonction se contente de tester si la valeur passe en argument est gale 7.

Mthodes partielles
Dans Visual Basic 2010, la dfinition dune classe (ou dune structure) peut tre divise en plusieurs dclarations partielles. titre dexemple, les deux instructions Partial Class ci-aprs dfinissent partiellement la classe maClasse. La premire implmente la mthode meth1, et la deuxime la mthode meth2
Partial Public Public Sub End Sub End Class Partial Public Public Sub End Sub End Class Class maClasse meth1()

Class maClasse meth2()

Les diffrents lments Partial peuvent se trouver dans le mme fichier ou dans des fichiers diffrents.

Le langage LINQ
LINQ est lacronyme de Language INtegrated Query (langage dinterrogation intgr). Cette fonctionnalit est un vritable pas en avant: en utilisant une syntaxe proche de celle du langage SQL, il est dsormais possible de manipuler des objets IEnumerable, du code XML, des Datasets et des bases de donnes SQL Server. Reportez-vous au Chapitre 27 pour savoir comment tirer parti de ces volutions travers les quatre principales techno logies associes:

LINQ to Objects; LINQ to XML; LINQ to Dataset; LINQ to SQL. simplifie lcriture des requtes;

Dans ce chapitre, vous verrez que LINQ prsente de nombreux avantages. Entre autres, il:

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

77

utilise une syntaxe indpendante de la source de donnes; facilite la vie du dveloppeur; gre les erreurs lors de la compilation (et non lexcution); supporte lIntellisense et le dbogage dans Visual Studio.

Techniques volues de Visual Studio 2005/2008 toujours dactualit dans Visual Studio 2010
Cette section recense un certain nombre de techniques volues de Visual Studio 2005-2008/ Visual Basic 2005-2008, toujours utilisables dans Visual Studio 2010/Visual Basic 2010.

Alignement des contrles


Lorsque vous placez plusieurs contrles sur une feuille, il est trs simple de les aligner entre eux: cliquez sur le contrle que vous voulez aligner, maintenez le bouton de la souris enfonc et dplacez le contrle horizontalement et/ou verticalement jusqu lapparition des marques dalignement (snap lines). Relchez le bouton de la souris; le contrle est align (voir Figure3.33).
Figure3.33 Alignement sur la partie infrieure dun contrle Label et dun contrle TextBox.

Menus
Les contrles MenuStrip et ContextMenuStrip remplacent les contrles MainMenu et ContextMenu. Ces deux contrles ont fait leur apparition dans la version2 du Framework. Les menus peuvent dsormais tre composs de commandes traditionnelles (MenuItem), mais galement de listes droulantes (ComboBox) et de zones de texte (TextBox), et ce, un quelconque niveau dindentation (voir Figure3.34).

78

Visual Basic 2010

Figure3.34 Les trois types dentres dun menu Visual Basic.

Pour dfinir rapidement les menus standard dune application, il suffit dsormais de cliquer doit sur la barre dun contrle MenuStrip et de slectionner Insrer des lments standard dans le menu contextuel (voir Figure3.35).
Figure3.35 Cette commande augmentera sensiblement votre productivit.

Les commandes de menu que lon rencontre le plus traditionnellement sont alors automatiquement ajoutes (voir Figure3.36). Il ne vous reste plus qu jouer de la touche Suppr pour supprimer les commandes inutiles et ajouter vos propres commandes. Les menus et commandes de menu peuvent apparatre horizontalement ou verticalement en utilisant les valeurs (Horizontal, Vertical90 ou Vertical270) de la proprit Text Direction (voir Figure3.37).

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

79

Figure3.36 Les menus traditionnels ont t mis en place dun simple clic de souris.

Figure3.37 Affichage vertical de la commande de menu Fichier.

Lorsque vous cliquez sur un contrle MenuStrip dans la feuille, une petite flche apparat dans sa partie suprieure droite. Il suffit de cliquer dessus pour accder aux proprits les plus courantes (voir Figure3.38).
Figure3.38 Cette nouveaut se rvle trs pratique lutilisation.

80

Visual Basic 2010

Pour terminer, signalons quil est trs simple dassocier une icne chaque commande de menu: 1. Slectionnez la commande dans la feuille de conception. 2. Cliquez sur la proprit Image dans la fentre des proprits pour faire apparatre un bouton contenant trois points de suspension. 3. Cliquez sur ce bouton et dsignez limage en utilisant les ressources locales ou le fichier de ressources associ au projet (voir Figure3.39).
Figure3.39 Association dune icne une commande de menu.

Vous trouverez un exemple dutilisation des contrles MenuStrip et ContextMenuStrip au Chapitre6.

Barres doutils
Le contrle ToolStrip succde dignement au contrle ToolBar. Il manipule des lments bien plus diversifis que son prdcesseur (voir Figure3.40). Pour ajouter les icnes que lon retrouve traditionnellement dans une barre doutils, cliquez droit sur le contrle ToolStrip puis cliquez sur la commande Insrer des lments standard (voir Figure3.41). Le contrle StatusStrip est le pendant Visual Basic 2010 du contrle StatusBar. Il peut contenir un ou plusieurs StatusLabel, ProgressBar, DropDownButton et/ou SplitButton. Les contrles StatusLabel peuvent tre transforms en des liens hypertextes grce la proprit IsLink. Vous les utiliserez par exemple pour mettre jour lapplication dun simple clic de lutilisateur.

Info

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

81

Figure3.40 De nombreux types dlments peuvent tre insrs dans un ToolStrip.

Figure3.41 Cette barre doutils a t complte en deux clics de souris.

Vous trouverez un exemple dutilisation des contrles ToolStrip et StatusStrip au Chapitre7.

Info-bulles
Le contrle NotifyIcon fait son apparition. Grce lui, vous pouvez afficher une info-bulle dans la barre de notification de Windows (galement appele Systray). Pour cela, vous devez, dans un premier temps, renseigner quelques proprits:

Icne dans la zone de notification:


NotifyIcon1.Icon = SystemIcons.Asterisk

Titre de linfo-bulle:
NotifyIcon1.BalloonTipTitle = "titre du ballon"

82

Visual Basic 2010

Texte affich dans linfo-bulle:


NotifyIcon1.BalloonTipText = "texte du ballon"

Icne dans linfo-bulle:


NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info

Ces proprits tant initialises, rendez linfo-bulle visible:


NotifyIcon1.Visible = True

Puis appelez la mthode ShowBalloonTip() en prcisant le nombre de secondes daffichage de linfo-bulle:


NotifyIcon1.ShowBalloonTip(20)

La Figure3.42 prsente le rsultat de lexcution de ces quelques lignes de code.


Figure3.42 Quelques instructions suffisent pour afficher cette info-bulle.

Zone de texte avec marque de saisie


Le contrle MaskedTextBox facilite la saisie de donnes en utilisant un masque de saisie. Ilsuffit pour cela de choisir un des masques prdfinis ou de crer le vtre en cliquant sur le bouton contenant trois points de suspension de la proprit Mask (voir Figure3.43).
Figure3.43 Masque de saisie de date, au format court.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

83

Fentre des tches


Lorsque vous insrez un contrle "complexe" dans une feuille, une petite flche oriente vers la droite saffiche dans sa partie suprieure droite. En cliquant dessus, vous avez directement accs aux proprits et tches les plus courantes associes ce contrle (voir Figure3.44).
Figure3.44 Proprits et tches associes au contrle DataGridView.

Navigateur web
Le contrle WebBrowser fait partie du jeu de composants par dfaut (il nest plus ncessaire dimporter le composant AxWebBrowser. Vous trouverez un exemple dutilisation de ce contrle au Chapitre21.

Refactoring
Le refactoring est une fonctionnalit trs utile pour les programmeurs. Il permet dextraire un code, de dclarer automatiquement des variables, de modifier le nom dun symbole (et bien dautres choses encore) en quelques clics de souris. Voyons comment mettre en uvre cette fonctionnalit en raisonnant sur le code suivant:
Public Class Form1 Sub calcul(ByVal i As Integer) une ou plusieurs lignes de code End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Dim i As Integer For i = 1 To 10 calcul(i) Next End Sub End Class

84

Visual Basic 2010

Ce code est un modle de simplicit: la procdure vnementielle Button1_Click() appelle dix fois de suite une procdure de calcul. Supposons que vous vouliez modifier le nom de la procdure. Placez le pointeur au-dessus dun des mots "calcul", cliquez droit et choisissez Renommer dans le menu contextuel (voir Figure3.45). Il ne vous reste plus qu choisir le nouveau nom dans la bote de dialogue Renommer (voir Figure3.46).
Figure3.45 Accs la commande Renommer.

Figure3.46 Choix du nouveau nom de la procdure.

Extraits
En quelques clics de souris, les extraits (snippets) permettent dinsrer des blocs de code prdfinis dans lditeur. Fini les recherches interminables pour retrouver lextrait de codequi vous aidera dfinir laction que vous voulez accomplir! Pour insrer un extrait, cliquez du bouton droit dans lditeur de code et slectionnez la commande Insrer un extrait (voir Figure3.47).
Figure3.47 Insertion dun extrait.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

85

Choisissez un dossier, un sous-dossier, puis un extrait. Le code est alors insr dans la feuille de lapplication, lemplacement du point dinsertion (voir Figure3.48).
Figure3.48 Insertion du snippet Notions de base/Mathmatiques/ Calculer le remboursement mensuel dun emprunt.

ce Astu

Les amateurs de raccourcis clavier peuvent galement appuyer sur Ctrl+K, puis sur Ctrl+X pour simuler la commande Insrer un extrait dans le menu contextuel de la fentre de code.

Pour terminer la dfinition de lextrait, il vous suffit de modifier les paramtres qui apparaissent en caractres surligns. Mme sils reprsentent une base de dpart intressante, les extraits proposs dans Visual Studio sont assez restreints; tt ou tard, vous prouverez le besoin de dfinir vos propres extraits de code. Pour cela, il vous suffit de dfinir un fichier XML contenant la description de lextrait de code. Voyons comment procder. Par dfaut, Visual Basic 2010 stocke ses extraits dans le dossier Program Files\Microsoft Visual Studio 10.0\VB\Snippets\1036. Voici, titre dexemple, le contenu du fichier CalculateaMonthlyPaymentonaLoan.snippet, utilis dans les lignes prcdentes pour insrer lextrait Calculer le remboursement mensuel dun emprunt:
<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2010/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Calculer le remboursement mensuel dun emprunt</Title> <Author>Microsoft Corporation</Author> <Description>Calcule le montant des remboursements mensuels dun emprunt.</Description> <Shortcut>mathPayLoan</Shortcut> </Header> <Snippet> <Imports> <Import> <Namespace>System</Namespace> </Import>

86

Visual Basic 2010

<Import> <Namespace>Microsoft.VisualBasic</Namespace> </Import> </Imports> <Declarations> <Literal> <ID>annualInterestRate</ID> <Type>Double</Type> <ToolTip>Remplacez par un Double pour le taux dintrt annuel (p. ex. 0,05 pour 5%).</ToolTip> <Default>.05</Default> </Literal> <Literal> <ID>numberOfPayments</ID> <Type>Double</Type> <ToolTip>Remplacez par le code qui retourne un Double pour le nombre total de versements mensuels.</ToolTip> <Default>36</Default> </Literal> <Literal> <ID>loanAmount</ID> <Type>Double</Type> <ToolTip>Remplacez par le code qui retourne un Double pour le montant de lemprunt.</ToolTip> <Default>1000</Default> </Literal> </Declarations> <Code Language="VB" Kind="method body"><![CDATA[Dim futureValue As Double = 0 Dim payment As Double payment = Pmt($annualInterestRate$ / 12, $numberOfPayments$, -$loanAmount$, futureValue, DueDate.EndOfPeriod)]]></Code> </Snippet> </CodeSnippet> </CodeSnippets>

Examinons les lments contenus dans ce code:

Le nom de lextrait apparat entre les balises <Title> et </Title>:


<Title>Calculer le remboursement mensuel dun emprunt</Title>

La description de lextrait apparat entre les balises <Description> et </Description>:


<Description>Calcule le montant des remboursements mensuels dun emprunt. </Description>

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

87

Le bloc de code situ entre les balises <Imports> et </Imports> dfinit les Assembly utiliss par lextrait. Ainsi, le cas chant, une clause Imports sera ajoute au dbut du code:
<Imports> <Import> <Namespace>System</Namespace> </Import> <Import> <Namespace>Microsoft.VisualBasic</Namespace> </Import> </Imports>

Le bloc de code situ entre les balises <Declarations> et </Declarations> dfinit les variables qui doivent tre ajustes par le programmeur (identificateur, type, info-bulle et valeur par dfaut):
<Declarations> <Literal> <ID>annualInterestRate</ID> <Type>Double</Type> <ToolTip>Remplacez par un Double pour le taux dintrt annuel (p. ex. 0,05 pour 5%).</ToolTip> <Default>.05</Default> </Literal> </Declarations>

Enfin, les dernires instructions dfinissent le code de lextrait (les diffrentes variables sont repres par leur champ ID et sont encadres par des caractres "$"):
<Code Language="VB" Kind="method body"><![CDATA[Dim futureValue As Double = 0 Dim payment As Double payment = Pmt($annualInterestRate$ / 12, $numberOfPayments$, -$loanAmount$, futureValue, DueDate.EndOfPeriod)]]></Code>

Vous avez maintenant tous les lments ncessaires pour crer vos propres extraits. Pour les rendre accessibles, donnez-leur lextension .snippet et stockez-les dans le dossier Program Files\Microsoft Visual Studio 10.0\VB\Snippets\1036. Dans les versions prcdentes de Visual Studio, les snippets ntaient disponibles que dans les diteurs de code C# et Visual Basic. Dsormais, cette fonctionnalit est tendue au code HTML/ASP.NET et au JavaScript.

Info

88

Visual Basic 2010

Documenter le code en XML


Il est fondamental de bien documenter votre code si vous travaillez en quipe ou que vous dveloppiez un projet de grande envergure dont le temps dcriture dpasse les six mois. Visual Basic automatise la cration de documentation au format XML. Voyons comment mettre en uvre cette fonctionnalit. Sur la ligne qui prcde une dclaration Sub ou Function, insrez trois apostrophes conscutives. Un bloc XML est automatiquement cr (voir Figure3.49). Il ne reste plus qu remplir les diffrents champs pour obtenir une documentation XML digne de programmeurs professionnels.
Figure3.49 Ces commentaires XML ont t crs par Visual Studio.

Un fichier XML est automatiquement gnr lors de la compilation du programme. Par exemple, pour le gabarit de commentaires cr la Figure3.49, le fichier XML gnr est le suivant:
<?xml version="1.0"?> <doc> <assembly> <name> WindowsApplication1 </name> </assembly> <members> <member name="M:WindowsApplication1.Form1.Form1_Load(System.Object, System.EventArgs)"> <summary> </summary> <param name="sender"></param> <param name="e"></param> <remarks></remarks> </member> </members> </doc>

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

89

Ces types de donnes sont facilement rcuprables dans de nombreux programmes. En prenant quelques instants pour documenter tous les passages complexes de vos programmes, vous en assurerez la prennit moindres frais.

Lespace de nom My
Lespace de nom (NameSpace) My est apparu dans Visual Basic 2005. Il est entirement compatible Visual Basic 2010. Son approche rsolument pratique facilite la vie du programmeur. Les lments contenus dans ce nouvel espace de nom peuvent tre rpartis dans deux catgories:

Raccourcis vers les classes du Framework: accs rapide et intuitif aux classes de base de la BCL (Base Class Library) du .NET Framework. lments dynamiques crs lors de la dfinition de linterface et/ou de lexcution du code: accs aux formulaires, contrles, paramtres, ressources et services web crs lors de la conception ou de lexcution de lapplication.

Comme le montre la Figure3.50, lespace de nom My se dcompose en plusieurs branches indpendantes.


Figure3.50 Structure de lespace de nom My.

Dans cette section, nous allons vous montrer comment tirer parti de ce nouvel espace de nom en dveloppant plusieurs petites applications qui exploitent les proprits, procdures et fonctions affrentes au principaux objets qui le composent.

90

Visual Basic 2010

My.Application
Lobjet My.Application donne accs des mthodes, proprits et vnements en rapport avec lapplication en cours dexcution et son environnement. Test des possibilits de lobjet My.Application Pour vous faire une ide des possibilits de lobjet My.Application, dfinissez une nouvelle application Windows Forms et donnez-lui le nom TestMyApplication. Affectez la valeur Test de lobjet My.Application la proprit Text de lobjet Form1. Ajoutez un objet Label. Double-cliquez sur une partie inoccupe de la feuille et testez les fonctions et proprits de lobjet My.Application dans la procdure Form1_Load() (voir Figure3.51).
Figure3.51 Intellisense facilite la saisie du code.

La Figure 3.52 donne un exemple dexcution de lapplication. La proprit teste est My.Application.Info.DirectoryPath.
Figure3.52
My.Application.Info. DirectoryPath renvoie

le chemin complet de lapplication.

Paramtres de la ligne de commande Les ventuels paramtres passs au programmes lors de son excution (nom dun fichier, valeur numrique, etc.) sont rcuprs dans lobjet My.Application.CommandLineArgs. Pour vous montrer comment utiliser cet objet, vous allez dfinir une mini-application. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom RecupParam lapplication et validez. Affectez la valeur Paramtres de la ligne de commande la proprit

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

91

Text de la feuille. Ajoutez un contrle Label, affectez la valeur False sa proprit AutoSize et redimensionnez le contrle de sorte quil occupe la plus grande partie de la feuille

(voir Figure3.53).
Figure3.53 La feuille de lapplication en mode dition.

Double-cliquez sur une partie inoccupe de la feuille et compltez la procdure Form1_ Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = LigneCom() End Sub

Lunique instruction de cette procdure affecte la valeur renvoye par la fonction LigneCom() la proprit Text du contrle Label1. Dfinissez la fonction LigneCom() comme suit:
Private Function LigneCom() As String Dim i = 0 Dim st = "" For Each s As String In My.Application.CommandLineArgs i = i + 1 st = st + "argument " + Str(i) + " : " + s.ToString + Chr(13) Next If st = "" Then st = "Aucun paramtre na t pass lapplication." Return st End Function

92

Visual Basic 2010

Aprs avoir dclar les deux variables utilises dans la fonction:


Dim i As Integer = 0 Dim st As String = ""

une boucle For Each Next parcourt les ventuels paramtres passs lapplication:
For Each s As String In My.Application.CommandLineArgs Next

lintrieur de la boucle, lindex de parcours est incrment:


i = i + 1

Et la chane rsultat est mise jour avec le paramtre en cours:


st = st + "argument " + Str(i) + " : " + s.ToString + Chr(13)

Si la chane est vide, cela signifie quaucun paramtre na t pass lapplication. La chane rsultat est alors initialise avec un texte indiquant labsence de paramtre:
If st = "" Then st = "Aucun paramtre na t pass lapplication."

La chane rsultat est alors retourne par la fonction LigneCom():


Return st

Lancez le programme en appuyant sur la touche F5. Un message indique quaucun paramtre na t pass lapplication (voir Figure3.54).
Figure3.54 Un message indique labsence de paramtre.

Copiez le fichier Projects\RecupParam\bin\Debug\RecupParam.exe dans un dossier plus facile atteindre (par exemple dans le dossier C:\test). Droulez le menu Dmarrer et entrez la commande reprsente Figure3.55.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

93

Figure3.55 Excution du programme avec trois paramtres.

Info

Si vous travaillez sous Windows XP, lancez la commande Excuter dans le menu Dmarrer et tapez la commande de la Figure 3.55 dans la bote de dialogue Excuter.

La Figure3.56 montre que les trois paramtres ont bien t rcuprs par lapplication.
Figure3.56 Les trois paramtres sont lists dans le contrle Label.

94

Visual Basic 2010

My.Application.Info Lobjet My.Application.Info est trs intressant. Comme le montre le tableau ci-aprs, il donne accs des proprits qui dcrivent lapplication en cours dexcution.
Proprit
AssemblyName CompanyName Copyright Description DirectoryPath LoadedAssemblies ProductName StackTrace Title Trademark Version WorkingSet

Description
Nom, sans extension, de lassembly de lapplication Nom de socit associ lapplication Note de copyright associe lapplication Description associe lapplication Dossier partir duquel lapplication sexcute Collection de tous les assemblies chargs par lapplication Nom de lapplication Trace de la pile de lapplication Titre de lapplication Marque dpose de lapplication Numro de version de lapplication Quantit de mmoire physique associe au processus en cours dexcution

Pour dfinir ces informations, vous pouvez initialiser les proprits correspondantes dans le code de lapplication:
My.Application.Info.ProductName = "Nom de lapplication" My. Application.Info.Version = "Numro de version" My.Application.Info.Copyright = "Informations de copyright" My.Application.Info.CompanyName = "Nom de la socit lorigine de lapplication" My.Application.Info.Description = "Description de lapplication"

Mais il est bien plus pratique dutiliser la mthode suivante: 1. Lancez la commande Proprits de Projet1 du menu Projet. Cette commande affiche un nouvel onglet dans linterface (voir Figure3.57). 2. Cliquez sur le bouton Informations de lAssembly et remplissez la bote de dialogue reprsente la Figure3.58.

1. Dans la commande de menu Proprits de Projet, Projet reprsente le nom de votre projet (par exemple, Windows Application1 par dfaut pour une application Windows).

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

95

Figure3.57 Cet onglet donne accs aux informations relatives lapplication.

Figure3.58 Personnalisez lAssembly de lapplication dans cette bote de dialogue.

Bote de dialogue "A propos" Dfinissez une nouvelle application Windows Forms et nommez-la AutoApropos. Lancez la commande Proprits de projet du menu Projet, cliquez sur Informations de lassembly et paramtrez la bote de dialogue Informations de lassembly comme montr la Figure3.59.

96

Visual Basic 2010

Figure3.59 Un exemple de paramtrage.

Ajoutez une bote de dialogue "A propos" au projet. Pour cela, lancez la commande Ajouter un formulaire Windows, du menu Projet, slectionnez Bote de dialogue A propos de, dans la bote de dialogue Ajouter un nouvel lment (voir Figure3.60), et validez en cliquant sur Ajouter.
Figure3.60 Ajout dune bote de dialogue "A propos" au projet.

Ajoutez un bouton de commande dans la feuille principale de lapplication. Affectez la valeur Apropos sa proprit Name et la valeur A propos sa proprit Text. Doublecliquez sur ce bouton et compltez la procdure Apropos_Click() comme suit:

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

97

Private Sub APropos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles APropos.Click AboutBox1.Show() End Sub

Excutez le projet en appuyant sur la touche F5 et cliquez sur le bouton A propos. Comme le montre la Figure3.61, les champs de la bote de dialogue A propos ont t automati quement renseigns.
Figure3.61 Tous les renseignements sont issus de la bote de dialogue Informations de lassembly.

Cette application se trouve dans le dossier Projects\AutoApropos des sources de louvrage.

My.Computer
Lobjet My.Computer fournit des mthodes, proprits et vnements permettant de manipuler des composants en rapport avec lordinateur et ses priphriques: horloge systme, clavier, systme audio, systme graphique, etc. Lobjet My.Computer compte douze membres:

Audio; Clipboard; Clock; FileSystem; Info;

98

Visual Basic 2010

Keyboard; Mouse; Name; Network; Ports; Registry; Screen. Nous allons passer en revue leurs possibilits dans les pages suivantes. Lecture de sons WAV

La procdure My.Computer.Audio.Play permet de lire un son en tche de fond. Supposons que le son "ExtraitSonore.wav" se trouve la racine du disqueC:. Vous pourrez utiliser une des trois instructions suivantes:
My.Computer.Audio.Play("c:\ExtraitSonore.wav", AudioPlayMode.Background) My.Computer.Audio.Play("c:\ExtraitSonore.wav", AudioPlayMode.BackgroundLoop) My.Computer.Audio.Play("c:\ExtraitSonore.wav", AudioPlayMode.WaitToComplete)

La premire instruction joue le son en tche de fond, sans bloquer lexcution du programme. Ce son peut tre arrt tout moment en invoquant la procdure Stop():
My.Computer.Audio.Stop

La deuxime instruction est semblable la premire, ceci prs que le son se joue en boucle jusqu ce quil soit arrt par la procdure Stop(). La troisime instruction bloque lexcution du programme jusqu ce que le son soit entirement jou. Si le deuxime paramtre nest pas spcifi, le son est jou en tche de fond.

Info

Windows utilise une pliade de "sons systme" afin de faciliter lidentification dvnements tels que la rception de-mails, la fin dune opration qui sexcute en tche de fond, la connexion et la dconnexion de priphriques, etc. Pour avoir une ide plus prcise des sons disponibles, lancez la commande Panneau de configuration du menu Dmarrer. Tapez sons dans la case de recherche (dans la partie suprieure droite de la bote de dialogue) puis cliquez sur Modifier les sons systme. Les sons associs aux vnements systme sont regroups sous longlet Sons (voir Figure3.62).

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

99

Figure3.62 Association vnements/sons systme.

Info

Si vous utilisez Windows XP, vous devrez cliquer sur Sons, voix et priphriques audio, puis sur Sons et priphriques audio dans le Panneau de configuration pour parvenir au mme rsultat.

Pour modifier une association, slectionnez un vnement, cliquez sur Parcourir et choisissez un son systme dans la bote de dialogue Parcourir (voir Figure3.63).
Figure3.63 Affectation dun nouveau son systme lvnement Dconnecter le priphrique.

100

Visual Basic 2010

Pour jouer un son systme, vous utiliserez la procdure PlaySystemSound() en prcisant le nom du son jouer:
My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Asterisk)

Les sons systme accessibles par le biais de lobjet System.Media.SystemSounds sont les suivants:

Asterisk; Beep; Exclamation; Hand; Question. Cependant, rien ne vous empche daccder aux autres sons systme en piochant dans le dossier Windows\Mdia. Presse-papiers

Lobjet My.Computer.Clipboard permet de lire et dcrire dans le presse-papiers de Windows. Vous utiliserez essentiellement les procdures et fonctions suivantes:
Procdure
SetText() SetImage() SetAudio() ContainsText ContainsImage ContainsAudio GetText GetImage GetAudio

Action
Place le texte spcifi dans le presse-papiers. Place limage spcifie dans le presse-papiers. Place le son spcifi dans le presse-papiers. Teste si le presse-papiers contient du texte. Teste si le presse-papiers contient une image. Teste si le presse-papiers contient un son audio. Renvoie le contenu texte du presse-papiers. Renvoie limage contenue dans le presse-papiers. Renvoie le son plac dans le presse-papiers.

Reportez-vous au Chapitre5 pour examiner un exemple pratique dutilisation de lobjet My.Computer.Clipboard. Accs lhorloge systme Lobjet My.Computer.Clock donne accs lhorloge systme. Vous utiliserez les trois onctions suivantes: f

Chapitre 3


Action

Nouveauts et concepts utiles du langage et de lenvironnement 

101

Fonction
GmtTime LocalTime TickCount

Renvoie la date et lheure GMT. quivalente la proprit System.DateTime. UtcNow. Date et heure locales systme. quivalente la proprit DateTime.Now. Compteur de temps systme, incrment toutes les millisecondes depuis le dmarrage de lordinateur.

Dfinissez une nouvelle application Windows Forms que vous nommerez My Computer Clock. Ajoutez trois contrles Label et trois contrles Button cette application. Modifiez les proprits de ces contrles comme suit:
Contrle
Form1 Label1 Label2 Label3 Button1 Button2 Button3

Proprit
Text Text Text Text Text Text Text

Valeur
Test de lobjet My.Computer.Clock

Date et heure GMT Date et heure locales Timer systme

Double-cliquez sur le premier bouton de commande et compltez la procdure Button1_ Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Date et heure GMT : " + My.Computer.Clock.GmtTime.ToString End Sub

Lunique instruction de cette procdure convertit en une chane la valeur renvoye par la fonction GmtTime() et laffecte la proprit Text du contrle Label1. Double-cliquez sur le deuxime bouton de commande et compltez la procdure Button2_ Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Label2.Text = "Date et heure locale : " + My.Computer.Clock.LocalTime.ToString End Sub

102

Visual Basic 2010

Cette procdure est trs proche de la prcdente, mais ici, la fonction invoque est LocalTime(). Double-cliquez enfin sur le troisime bouton de commande et compltez la procdure
Button3_Click() comme suit:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Label3.Text = "Timer systme : " + My.Computer.Clock.TickCount.ToString End Sub

Ici, la fonction invoque est TickCount(). La valeur renvoye est un Integer. Elle est donc convertie en un String avant dtre affecte la proprit Text du contrle Label3. Vous trouverez un autre exemple dutilisation de lobjet My.Computer.Clock au Chapitre8 ddi laffichage dune horloge graphique et la mise en place dun conomiseur dcran personnalis. Lecture/criture dans des fichiers Lobjet My.Computer.FileSystem propose plusieurs procdures et fonctions pour lire ou crire dans un fichier.
Fonction
My.Computer.FileSystem.ReadAllText(Nom du fichier) My.Computer.FileSystem.ReadAllText(Nom du fichier, Type dencodage) My.Computer.FileSystem.ReadAllBytes(Nom du fichier) My.Computer.FileSystem.WriteAllText (Nom du fichier, Chane, False) My.Computer.FileSystem.WriteAllText (Nom du fichier, Chane, True)

Action
Lit un fichier texte. Lit un fichier texte encod. Lit un fichier binaire. crit dans un fichier texte. crit la fin dun fichier texte.

My.Computer.FileSystem.WriteAllBytes(Nom du fichier, Donnes, crit dans un fichier binaire. True)

Voyons comment utiliser ces nouvelles procdures et fonctions du Framework .NET4 au travers dun exemple concret. Un bloc-notes en quatre lignes de code Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Mmo2 la nouvelle

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

103

application. Ajoutez un contrle TextBox et deux contrles Button la feuille de lapplication. Modifiez les proprits de ces contrles comme suit:
Contrle
Form1 TextBox1 TextBox1 TextBox1 Button1 Button2

Proprit
Text Multiline (Name) ScrollBars Text Text

Valeur
Accs un fichier texte True Mmo Vertical Effacer Quitter

Double-cliquez sur un endroit inoccup de la feuille et compltez la procdure Form1_ Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Mmo.Text = My.Computer.FileSystem.ReadAllText("c:\memo.txt") End Sub

Lunique instruction de cette procdure effectue les actions suivantes:

ouverture du fichier texte c:\memo.txt en lecture; lecture de toutes les lignes qui le composent; affectation des donnes lues la proprit Text du contrle Mmo; fermeture du fichier c:\memo.txt.

titre dinformation, voici les instructions quivalentes, sans recourir lobjet My.Computer. FileSystem:
dim tout as String = "" Try FileOpen(1, "c:\memo.txt", OpenMode.Input) While Not EOF(1) texte = LineInput(1) tout = tout + texte + Chr(13) + Chr(10) End While Mmo.Text = tout Catch Finally FileClose(1) End Try

104

Visual Basic 2010

Avouez quil est bien plus agrable de mettre en uvre un objet My.Computer.FileSystem! Double-cliquez sur le premier bouton de commande et compltez la procdure Button1_ Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Mmo.Text = "" End Sub

Laction effectue par cette procdure est trs simple comprendre: elle efface le contenu du contrle Mmo. Enfin, double-cliquez sur le deuxime bouton de commande et compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click My.Computer.FileSystem.WriteAllText("c:\memo.txt", Mmo.Text, False) End End Sub

La premire instruction effectue trois actions:

ouverture du fichier texte c:\memo.txt en criture; copie du contenu du contrle Mmo dans le fichier texte; fermeture du fichier c:\memo.txt.

Voici, titre de comparaison, les instructions quivalentes, sans recourir lobjet


My.Computer.FileSystem:
Try FileOpen(1, "c:\memo.txt", OpenMode.Output) Print(1, Mmo.Text) Catch Finally FileClose(1) End Try End

Aprs avoir crit le contenu de la zone de texte dans le fichier, le programme utilise une instruction End pour mettre fin au programme. Voici le listing complet du programme. Tous les fichiers de la solution correspondante se trouvent dans le dossier Projects\Memo2 des sources de louvrage.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs)Handles MyBase.Load

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

105

Mmo.Text = My.Computer.FileSystem.ReadAllText("c:\memo.txt") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Mmo.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click My.Computer.FileSystem.WriteAllText("c:\memo.txt", Mmo.Text, False) End End Sub End Class

Lecture dans un fichier texte dlimit La plupart des applications qui manipulent des donnes tabulaires (Microsoft Excel par exemple) sont en mesure de stocker ces donnes dans des fichiers texte dlimits. Visual Basic utilise une technique particulire pour accder ces fichiers. Pour rester pratiques, nous allons raisonner sur le fichier texte suivant:
,1800,1900,1940,1983 Amsterdam,201000,511000,794000,994062 Londres,959000,6581000,8700000,6754500 Madrid,160000,540000,1048000,3188297 Moscou,250000,1039000,4137000,8546000 New York,79000,3437000,7455000,7086096 Paris,547000,2714000,2725000,2176243 Pkin,700000,1000000,1556000,9230687

Info

Dans la suite, nous supposerons que ce fichier a pour nom "data.txt" et quil se trouve dans le dossier C:\test.

Dfinissez un nouveau projet de type Application Windows Forms et donnez-lui le nom LectDlim. Ajoutez un contrle DataGridView dans la feuille de lapplication. Affectez la valeur Lecture dun fichier texte dlimit la proprit Text du contrle Form1, et la valeur Dock la proprit Dock du contrle DataGridView1. Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dfinition du TextFieldParser

106

Visual Basic 2010

Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser ("c:\test\data.txt") Dfinition du type de champs et du dlimiteur MyReader.TextFieldType = FileIO.FieldType.Delimited MyReader.SetDelimiters(",") Lecture des donnes et affichage Dim ligne As String() Dim i As Integer Dim s(0 To 5) As String DataGridView1.ColumnCount = 5 While Not MyReader.EndOfData Try ligne = MyReader.ReadFields() i = 0 Dim champ As String For Each champ In ligne i = i + 1 s(i) = champ Next DataGridView1.Rows.Add(New String() {s(1), s(2), s(3), s(4), s(5)}) Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException MsgBox("Lenregistrement " & ex.Message & _ "nest pas valide. Il a t ignor.") End Try End While End Using End Sub

Examinons les instructions contenues dans cette procdure. Le code repose sur une structure Using End Using dans laquelle on manipule un objet FileIO.TextFieldParser:
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser ("c:\test\data.txt") ... End Using

Cette simple instruction ouvre le fichier texte dlimit c:\test\data.txt. Le mot-cl Using a fait son apparition dans le Framework .NET2.0. Il permet de crer un bloc de code qui sera dispos (enlev de la mmoire) lorsque son excution sera termine. Les programmeursC# connaissent ce principe depuis belle lurette

Info

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

107

Le bloc dinstructions suivant spcifie le type du fichier et dcrit le dlimiteur utilis entre les divers champs dun enregistrement:
MyReader.TextFieldType = FileIO.FieldType.Delimited MyReader.SetDelimiters(",")

La procdure se poursuit par la dclaration de quelques variables:


Dim ligne As String() Dim i As Integer Dim s(0 To 5) As String

Le nombre de colonnes du contrle DataGridView est alors fix 5:


DataGridView1.ColumnCount = 5

La lecture des enregistrements se fait lintrieur dune boucle While End While qui prend fin lorsque toutes les donnes du fichier ont t lues:
While Not MyReader.EndOfData ... End While

Pour lire un enregistrement, il suffit dinvoquer la fonction ReadFields():


Try ligne = MyReader.ReadFields()

Lextraction des champs se fait laide dune instruction For Each Next:
For Each champ In ligne

Les champs lus sont stocks dans le tableau de String s:


i = i + 1 s(i) = champ

Les donnes dun enregistrement sont ensuite places dans le contrle DataGridView laide de la procdure Add():
DataGridView1.Rows.Add(New String() {s(1), s(2), s(3), s(4), s(5)})

Si une erreur se produit pendant la lecture des enregistrements, elle est capture par linstruction Catch et provoque laffichage dun message derreur:
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException MsgBox("Lenregistrement " & ex.Message & _ "nest pas valide. Il a t ignor.") End Try

108

Visual Basic 2010

La Figure3.64 reprsente lexcution du programme LectDlim. Les virgules ont bien t interprtes comme dlimiteurs de champs.
Figure3.64 Les donnes sont bien reprsentes sous une forme tabulaire.

Lecture de champs de longueur fixe Certains fichiers de donnes contiennent des champs de longueur fixe. Pour accder ce type de fichiers, vous utiliserez une instruction Using, comme dans la section prcdente:
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("c:\data. txt")

Vous indiquerez ensuite que les champs ont une longueur fixe:
Microsoft.VisualBasic.FileIO.FieldType.FixedWidth

Puis vous dfinirez la longueur de chaque champ. Par exemple, si un enregistrement est constitu de trois champs de longueurs respectives5,12 et6caractres, vous crirez:
Reader.SetFieldWidths(5, 12, 6)

Info

Si un champ a une longueur variable, vous utiliserez la valeur "1" dans la procdure SetFieldWidths(), par exemple:
Reader.SetFieldWidths(5, 12, -1)

Comparaison de deux fichiers binaires Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom CompareBin la nouvelle application. Ajoutez trois Label, deux TextBox et un Button la feuille de lapplication. Modifiez les proprits de ces contrles comme suit:

Chapitre 3


Proprit Valeur
Text Text Text Text Text

Nouveauts et concepts utiles du langage et de lenvironnement 

109

Contrle
Form1 Label1 Label2 Button Label3

Comparaison de fichiers binaires Nom complet du premier fichier Nom complet du second fichier Comparer Entrez le nom des deux fichiers binaires comparer, puis cliquez sur Comparer.

Repositionnez ces contrles pour obtenir un aspect visuel proche de la Figure3.65.


Figure3.65 La feuille de lapplication en mode Conception.

Double-cliquez sur le bouton Comparer et compltez la procdure Button1_Click() comme suit:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If TextBox1.Text = "" Then Label3.Text = "Entrez le nom complet du premier fichier comparer" If TextBox2.Text = "" Then Label3.Text = "Entrez le nom complet du second fichier comparer" If My.Computer.FileSystem.FileExists(TextBox1.Text) = False Then Label3.Text = "Le premier fichier nexiste pas" If My.Computer.FileSystem.FileExists(TextBox2.Text) = False Then Label3.Text = "Le second fichier nexiste pas" If TextBox1.Text <> "" And TextBox2.Text <> "" And _ My.Computer.FileSystem.FileExists(TextBox1.Text) And _ My.Computer.FileSystem.FileExists(TextBox2.Text) Then Dim val1 As Byte() = My.Computer.FileSystem.ReadAllBytes(TextBox1.Text) Dim val2 As Byte() = My.Computer.FileSystem.ReadAllBytes(TextBox2.Text) Dim resultat As Boolean Dim i As Integer

110

Visual Basic 2010

If val1.Length <> val2.Length Then resultat = False Else resultat = True For i = 0 To val1.Length - 1 If val1(i) <> val2(i) Then resultat = False Next End If If resultat = True Then Label3.Text = "Les deux fichiers sont identiques" Else Label3.Text = "Les deux fichiers sont diffrents" End If End If End Sub

Le premier bloc dinstructions teste si lutilisateur a bien entr deux noms de fichiers et, le cas chant, si ces fichiers existent. Si une de ces conditions est mise en dfaut, un message derreur apparat dans le contrle Label3:
If TextBox1.Text = "" Then Label3.Text = "Entrez le nom complet du premier fichier comparer" If TextBox2.Text = "" Then Label3.Text = "Entrez le nom complet du second fichier comparer" If My.Computer.FileSystem.FileExists(TextBox1.Text) = False Then Label3.Text = "Le premier fichier nexiste pas" If My.Computer.FileSystem.FileExists(TextBox2.Text) = False Then Label3.Text = "Le second fichier nexiste pas"

Si les quatre tests sont concluants:


If TextBox1.Text <> "" And TextBox2.Text <> "" And _ My.Computer.FileSystem.FileExists(TextBox1.Text) And _ My.Computer.FileSystem.FileExists(TextBox2.Text) Then

les deux fichiers binaires sont lus et stocks dans les variables val1 et val2:
Dim val1 As Byte() = My.Computer.FileSystem.ReadAllBytes(TextBox1.Text) Dim val2 As Byte() = My.Computer.FileSystem.ReadAllBytes(TextBox2.Text)

Deux variables sont alors dclares: resultat pour mmoriser le rsultat de la comparaison, et i pour parcourir le contenu des fichiers binaires:
Dim resultat As Boolean Dim i As Integer

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

111

Si les deux fichiers ont des tailles diffrentes, ils sont forcment diffrents:
If val1.Length <> val2.Length Then resultat = False

Dans le cas contraire, tous les octets des deux fichiers sont compars un un. Ds quune diffrence est trouve, la variable resultat est initialise False:
Else resultat = True For i = 0 To val1.Length - 1 If val1(i) <> val2(i) Then resultat = False Next End If

Pour terminer, un message saffiche dans le contrle Label3 pour indiquer si les deux fichiers sont identiques ou diffrents.
If resultat = True Then Label3.Text = "Les deux fichiers sont identiques" Else Label3.Text = "Les deux fichiers sont diffrents" End If

Accs aux dossiers particuliers de Windows Lobjet My.Computer.FileSystem.SpecialDirectories donne accs aux dossiers particuliers de Windows : AllUsersApplicationData, CurrentUserApplicationData, Desktop, MyDocuments, MyMusic, MyPictures, ProgramFiles, Programs et Temp. Il est trs simple de mettre en uvre cet objet pour lire ou crire des fichiers lemplacement souhait. Par exemple, pour lire un hypothtique fichier texte data.txt situ dans le dossier Mes documents, vous utiliserez linstruction suivante:
Dim s As String = My.Computer.FileSystem.ReadAllText(My.Computer.FileSystem. SpecialDirectories.MyDocuments + "c:\memo.txt")

Manipulation de fichiers et de dossiers


Au Chapitre 9, vous apprendrez manipuler des fichiers et des dossiers en utilisant les instructions traditionnelles de Visual Basic, telles que File.Copy, File.Delete, Directory. CreateDirectory et Directory.Delete. Dans cette section, nous allons vous montrer comment employer leurs quivalents .NET4. Liste des fichiers dun dossier Pour obtenir la liste des fichiers contenus dans un dossier, il suffit de faire appel la fonction My.Computer.FileSystem.GetFiles(). Le rsultat est renvoy sous la forme dune collection de chanes.

112

Visual Basic 2010

Dans sa forme la plus simple, la fonction GetFiles() admet un seul argument: le nom du dossier parcourir. Pour tendre les possibilits de cette fonction, vous pouvez utiliser une seconde syntaxe mettant en jeu trois arguments:
My.Computer.FileSystem.GetFiles(dossier, type_recherche, modle)

o:

dossier est le dossier dans lequel est effectue la recherche. type_recherche peut limiter la recherche au dossier spcifi (valeur FileIO.Search Option.SearchTopLevelOnly) ou ltendre aux ventuels sous-dossiers du dossier spcifi (valeur FileIO.SearchOption.SearchAllSubDirectories). modle est un modle de recherche pouvant contenir un ou plusieurs caractres de remplacement (?remplace un caractre, *remplace un nombre quelconque de caractres).

Pour illustrer la fonction GetFiles(), nous allons raliser une petite application dans laquelle lutilisateur visualisera le contenu dun dossier de son choix. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom ListeFichiers lapplication et validez en cliquant sur OK. Ajoutez les contrles suivants dans la feuille de lapplication:

trois Button; un FolderBrowserDialog (dossier Botes de dialogue, situ dans la Bote outils); un ListView.

Modifiez les proprits de ces contrles comme indiqu dans le tableau ci-aprs.
Contrle
Form1 Button1 Button2 Button3 ListView1

Proprit
Text Text Text Text Dock

Valeur
Liste des fichiers dun dossier Dossier Enregistrer Quitter Top

Modifiez la disposition de ces contrles pour obtenir une feuille semblable la Figure3.66.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

113

Figure3.66 La feuille de lapplication en mode Conception.

Nous allons maintenant dfinir les procdures vnementielles de lapplication. Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load FolderBrowserDialog1.Description = "Slectionnez un dossier" FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer FolderBrowserDialog1.ShowNewFolderButton = False ListView1.View = View.List ListView1.Sorting = SortOrder.Ascending End Sub

Cette procdure initialise les contrles FolderBrowserDialog et ListView. La premire instruction dfinit le texte affich dans la bote de dialogue:
FolderBrowserDialog1.Description = "Slectionnez un dossier"

La deuxime instruction dfinit le point de dpart de larborescence, ici le dossier Poste de travail (My Computer):
FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer

La troisime instruction cache le bouton Nouveau dossier. Ainsi, lutilisateur ne pourra pas crer un nouveau dossier dans larborescence des mmoires de masse:
FolderBrowserDialog1.ShowNewFolderButton = False

La quatrime instruction dfinit le type daffichage dans le contrle ListView (vous avez le choix entre cinq reprsentations: Details, LargeIcon, List, SmallIcon et Title):
ListView1.View = View.List

Enfin, la dernire instruction demande que les fichiers lists soient classs par ordre croissant:
ListView1.Sorting = SortOrder.Ascending

114

Visual Basic 2010

Vous allez maintenant crire le code responsable de laffichage de la bote de dialogue commune Rechercher un dossier. Double-cliquez sur le bouton Dossier et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then ListView1.Clear() For Each fichier As String In My.Computer.FileSystem. GetFiles(FolderBrowserDialog1.SelectedPath) ListView1.Items.Add(fichier) Next End If End Sub

Si lutilisateur slectionne un dossier:


If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then

le contenu du contrle ListView est effac:


ListView1.Clear()

Une instruction For Each parcourt la liste des fichiers du dossier slectionn:
For Each fichier As String In My.Computer.FileSystem. GetFiles(FolderBrowserDialog1.SelectedPath)

et les fichiers trouvs sont ajouts au contrle ListView:


ListView1.Items.Add(fichier)

Nous allons permettre lutilisateur de sauvegarder la liste des fichiers qui apparaissent dans le contrle ListView. Double-cliquez sur le bouton Enregistrer et compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Try My.Computer.FileSystem.DeleteFile("C:\test\resultat.txt") Catch End Try For Each fichier As String In My.Computer.FileSystem.GetFiles(FolderBrowser Dialog1.SelectedPath)

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

115

fichier = fichier + vbCrLf My.Computer.FileSystem.WriteAllText ("C:\test\resultat.txt", fichier, True) Next End Sub

Le premier bloc dinstructions tente de supprimer le fichier c:\test\resultat.txt. Lors de la premire excution du programme, ce fichier nexistait pas. Cest la raison pour laquelle nous avons plac linstruction qui efface le fichier dans une structure Try afin de capturer et dannuler le message derreur:
Try My.Computer.FileSystem.DeleteFile("C:\test\resultat.txt") Catch End Try

Le bloc dinstructions suivant parcourt le dossier slectionn par lutilisateur laide dune instruction For Each:
For Each fichier As String In My.Computer.FileSystem. GetFiles(FolderBrowserDialog1.SelectedPath)

Chaque nom de fichier est suivi dun retour la ligne:


fichier = fichier + vbCrLf

Puis la chane ainsi obtenue est copie la fin (troisime paramtre True) du fichier texte c:\test\resultat.txt:
My.Computer.FileSystem.WriteAllText ("C:\test\resultat.txt", fichier, True)

Double-cliquez sur le bouton Quitter et ajoutez une instruction End la procdure Button3_Click():
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub

Vous pouvez lancer lapplication en appuyant sur la toucheF5 du clavier. Une fois la feuille de lapplication ouverte, cliquez sur Dossier et choisissez un dossier quelconque. Validez en cliquant sur OK. Les fichiers contenus dans le dossier apparaissent dans le contrle ListView (voir Figure3.67). Cliquez sur Enregistrer. Le fichier Rsultat.txt contenant la liste des fichiers de la racine du disque C:\ est immdiatement cr (voir Figure3.68).

116

Visual Basic 2010

Figure3.67 Liste des fichiers contenus dans la racine du disque C:\.

Figure3.68 Le fichier c:\test\resultat.txt contient la liste des fichiers de la racine du disque C:\.

Voici le listing complet de lapplication. Les fichiers correspondants se trouvent dans le dossier Projects\ListeFichiers des sources de louvrage.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs)Handles MyBase.Load FolderBrowserDialog1.Description = "Slectionnez un dossier" FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer FolderBrowserDialog1.ShowNewFolderButton = False ListView1.View = View.List

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

117

ListView1.Sorting = SortOrder.Ascending End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs)Handles Button1.Click If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then ListView1.Clear() For Each fichier As String In My.Computer.FileSystem.GetFiles(Folder BrowserDialog1.SelectedPath) ListView1.Items.Add(fichier) Next End If End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click Try My.Computer.FileSystem.DeleteFile("C:\test\resultat.txt") Catch End Try For Each fichier As String In My.Computer.FileSystem.GetFiles(Folder BrowserDialog1.SelectedPath) fichier = fichier + vbCrLf My.Computer.FileSystem.WriteAllText _ ("C:\test\resultat.txt", fichier, True) Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button3.Click End End Sub End Class

Copie dun fichier La mthode de base permettant de copier un fichier est My.Computer.FileSystem.
CopyFile().

Par exemple, pour copier le fichier c:\test\data.txt dans le dossier c:\destination, vous utiliserez linstruction suivante:
My.Computer.FileSystem.CopyFile("c:\test\data.txt", "c:\destination")

118

Visual Basic 2010

Pour copier le fichier c:\test\data.txt dans le dossier c:\destination en lui donnant le nom data_sav.txt, servez-vous de linstruction suivante:
My.Computer.FileSystem.CopyFile("c:\test\data.txt", "c:\destination", "data_sav.txt")

Enfin, pour copier le fichier c:\test\data.txt dans le dossier c:\destination en lui donnant le nom data_sav.txt et en crasant un ventuel fichier de mme nom, optez pour linstruction suivante:
My.Computer.FileSystem.CopyFile("c:\test\data.txt", "c:\destination", "data_sav. txt", FileIO.UICancelOption.DoNothing)

Pour faire une copie dun fichier dans le mme dossier (par exemple pour dupliquer c:\test\ data.txt en le renommant c:\test\data2.txt), vous utiliserez lune des instructions suivantes:
My.Computer.FileSystem.CopyFile("C:\test\data.txt", "C:\test\data2.txt") My.Computer.FileSystem.CopyFile("C:\test\data.txt", "C:\test\data2.txt", True)

La premire instruction produit une exception lexcution si le fichier cible existe dj (voir Figure3.69). Dans ce cas, la seconde exception lcrase sans provoquer dexception.
Figure3.69 La premire instruction nest pas en mesure dcraser un fichier existant.

Copie de tous les fichiers correspondant un modle Pour copier tous les fichiers dun dossier correspondant un modle, servez-vous de la fonction GetFiles() combine la fonction CopyFile(). Par exemple, pour copier tous les fichiers dextension.jpg du dossier Mes Documents dans le dossier c:\data, employez les instructions suivantes:
For Each fichier As String In My.Computer.FileSystem.GetFiles(My.Computer.File System.SpecialDirectories.MyDocuments, FileIO.SearchOption.SearchTopLevelOnly,

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

119

"*.jpg") My.Computer.FileSystem.CopyFile(fichier, "C:\data\") Next

Dcomposons la premire instruction. La fonction GetFiles() obtient la liste des fichiers dextension .jpg du dossier Mes documents:
My.Computer.FileSystem.GetFiles(My.Computer.FileSystem.SpecialDirectories. MyDocuments, FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")

Cette liste est renvoye par GetFiles() sous la forme dune collection. Cette dernire est parcourue par lintermdiaire dune structure For Each In:
For Each fichier As String In

La seconde instruction utilise la procdure CopyFile() pour copier chacun des lments de la collection, cest--dire chacun des fichiers dans le dossier c:\data:
My.Computer.FileSystem.CopyFile(fichier, "C:\data\")

Test de lexistence dun fichier Pour savoir si un fichier existe, il suffit dinvoquer la fonction My.Computer.FileSystem. FileExists(). La valeur renvoye en retour est True si le fichier existe, et False dans le cas contraire. Test de lexistence dun dossier Pour savoir si un dossier existe, il suffit dinvoquer la fonction My.Computer.FileSystem. DirectoryExists(). La valeur renvoye en retour est True si le dossier existe, et False dans le cas contraire. Copie dun dossier Pour copier le contenu dun dossier, vous utiliserez la procdure My.Computer.FileSystem.CopyDirectory(). Par exemple, pour copier le contenu du dossier c:\data dans le dossier c:\data2, employez linstruction suivante:
My.Computer.FileSystem.CopyDirectory("C:\data", "data2", True)

Le troisime paramtre indique si les ventuels fichiers de mme nom contenus dans le dossier de destination doivent (True) ou ne doivent pas (False) tre crass par les fichiers provenant du dossier source.

120

Visual Basic 2010

Cration dun dossier Pour crer un nouveau dossier, vous utiliserez la procdure My.Computer.FileSystem.
CreateDirectory().

Par exemple, pour crer le dossier c:\data\NouveauDossier, employez linstruction suivante:


My.Computer.FileSystem.CreateDirectory("C:\data\NouveauDossier")

Suppression dun dossier Plusieurs syntaxes peuvent tre utilises pour supprimer un dossier:

Suppression dun dossier uniquement sil est vide:


My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.DeleteDirectory Option.ThrowIfDirectoryNonEmpty)

Envoi dun dossier vers la Corbeille avec demande de confirmation:


My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.UIOption.AllDia logs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.ThrowException)

Suppression dfinitive dun dossier:


My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.DeleteDirectory Option.DeleteAllContents)

Suppression dfinitive dun dossier avec demande de confirmation:


My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.UIOption.AllDialogs, FileIO.DeleteDirectoryOption.DeletePermanently, FileIO.UICancelOption.ThrowException)

Modification du nom dun fichier Pour modifier le nom dun fichier, vous utiliserez la procdure My.Computer.FileSystem. RenameFile(). Par exemple, pour renommer le fichier c:\data.txt en data2.txt, employez linstruction suivante:
My.Computer.FileSystem.RenameFile("C:\data.txt", "data2.txt")

Modification du nom dun dossier Pour modifier le nom dun fichier, vous utiliserez la procdure My.Computer.FileSystem. RenameDirectory(). Par exemple, pour renommer le dossier c:\data en c:\data2, employez linstruction suivante:
My.Computer.FileSystem.RenameFile ("C:\data", "data2")

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

121

Suppression dun fichier Pour supprimer un fichier, vous utiliserez la procdure My.Computer.FileSystem.DeleteFile(). Vous pouvez:

Ne pas demander la confirmation lutilisateur:


My.Computer.FileSystem.DeleteFile("Nom_du_fichier")

Demander la confirmation lutilisateur:


My.Computer.FileSystem.DeleteFile("Nom_du_fichier", FileIO.UIOption.AllDialogs, FileIO.RecycleOption.DeletePermanently, FileIO.UICancelOption.DoNothing)

Envoyer le fichier supprim vers la Corbeille:


My.Computer.FileSystem.DeleteFile("Nom_du_fichier", FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)

Dplacement dun dossier Pour dplacer un dossier ainsi que les fichiers et sous-dossiers qui le composent, vous utiliserez la procdure MoveDirectory():
My.Computer.FileSystem.MoveDirectory(DossierSource, DossierDestination) My.Computer.FileSystem.MoveDirectory(DossierSource, DossierDestination, True)

La premire syntaxe copie le dossier source dans le dossier de destination sans craser les ventuels fichiers/dossiers de mme nom dans le fichier de destination. La seconde syntaxe crase les ventuels fichiers/dossiers de mme nom dans le dossier de destination. Chemin et nom dun fichier Pour obtenir facilement le dossier et le nom dun fichier partir dun chemin complet, tel que "c:\data\projets\Visual Basic 2010\livre.doc", employez les proprits DirectoryName et Name dun objet System.IO.FileInfo:
Dim fichier As System.IO.FileInfo fichier = My.Computer.FileSystem.GetFileInfo("c:\data\projets\Visual Basic 2010\livre.doc") Dim dossier As String = fichier.DirectoryName Dim nom As String = fichier.Name Label1.Text = "Le chemin du fichier est " + dossier Label2.Text = "Le nom du fichier est " + nom

La premire instruction dfinit lobjet System.IO.FileInfo fichier:


Dim fichier As System.IO.FileInfo

122

Visual Basic 2010

La fonction GetFileInfo() est alors invoque pour obtenir des informations sur le fichier spcifi en argument:
fichier = My.Computer.FileSystem.GetFileInfo("c:\data\projets\Visual Basic 2010\ livre.doc")

Les variables String dossier et nom sont alors dfinies et initialises avec les proprits DirectoryName et Name de lobjet fichier:
Dim dossier As String = fichier.DirectoryName Dim nom As String = fichier.Name

Il ne reste plus qu afficher ces deux valeurs sur la feuille ici, par lintermdiaire de deux contrles Label:
Label1.Text = "Le chemin du fichier est " + dossier Label2.Text = "Le nom du fichier est " + nom

Suppression de tous les fichiers dun dossier Pour supprimer tous les fichiers dun dossier, vous utiliserez la fonction GetFiles() combine la fonction DeleteFile(). titre dexemple, voici le code permettant de supprimer de faon permanente tous les fichiers du dossier Ma musique:
For Each fichier As String In My.Computer.FileSystem.GetFiles(My.Computer.FileSystem. SpecialDirectories.MyMusic, FileIO.SearchOption.SearchAllSubDirectories, "*.*") My.Computer.FileSystem.DeleteFile(fichier, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.DeletePermanently) Next

La premire instruction parcourt tous les lments de la collection renvoye par la fonction GetFiles(), en tendant la recherche tous les ventuels sous-dossiers du dossier Ma Musique (FileIO.SearchOption.SearchAllSubDirectories) et en slectionnant tous les fichiers(*.*). La seconde instruction supprime de faon permanente chacun des fichiers slectionns dans la structure For Each In.
Info

Lobjet SpecialDirectories donne accs plusieurs dossiers propres indows : AllUsersApplicationData, CurrentUserApplicationData, Desktop, W MyDocuments, MyMusic, MyPictures, ProgramFiles, Programs et Temp. Pour permettre lutilisateur de slectionner le dossier quil souhaite supprimer, il suffit dinsrer un contrle FolderBrowserDialog dans lapplication et dutiliser sa proprit SelectedPath comme premier argument de la fonction GetFiles().

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

123

Dplacement dun fichier Pour dplacer un fichier vers un autre dossier, vous pouvez combiner la fonction My.Computer.FileSystem.CopyFile() avec la fonction My.Computer.FileSystem.Delete File() ou bien utiliser une fonction ddie: My.Computer.FileSystem.MoveFile(). Cette dernire fonction admet trois syntaxes:
My.Computer.FileSystem.MoveFile(source, destination) My.Computer.FileSystem.MoveFile(source, destination,crasement) My.Computer.FileSystem.MoveFile(source, destination, crasement, exception)

o:

source est le chemin complet du fichier dplacer. destination est le chemin complet du fichier de destination. crasement est une variable boolenne qui indique si un ventuel fichier ayant le mme chemin que la destination doit (True) ou ne doit pas (False) tre cras. exception indique si une ventuelle exception gnre par la fonction MoveFile doit (FileIO.UICancelOption.THrowException) ou ne doit pas (FileIO.UICancelOption. DoNothing) tre prise en compte.

Par exemple, pour dplacer le fichier data.txt du dossier c:\ vers le dossier d:\data, employez linstruction suivante:
My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data\data.txt")

Info

Bien entendu, pour fonctionner, cette instruction ncessite la prsence du fichier data.txt dans le dossier c:\ et labsence du fichier data.txt dans le dossier d:\ data.

Pour dplacer le fichier data.txt du dossier c:\ vers le dossier d:\data et lui donner le nom data2.txt, vous utiliserez linstruction suivante:
My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data\data2.txt")

Info

Comme prcdemment, pour fonctionner, cette instruction ncessite la prsence du fichier data.txt dans le dossier c:\ et labsence du fichier data2.txt dans le dossier d:\data.

Pour dplacer le fichier data.txt du dossier c:\ vers le dossier d:\data en crasant lventuel fichier data.txt dj prsent, vous utiliserez linstruction suivante:
My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data\data2.txt", True)

124

Visual Basic 2010

Enfin, pour dplacer le fichier data.txt du dossier c:\ vers le dossier d:\data en ignorant tous les ventuels vnements gnrs, employez linstruction suivante:
My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data", FileIO.UIOption.AllDialog, FileIO.UICancelOption.DoNothing)

Dplacement de tous les fichiers correspondant un modle Pour dplacer tous les fichiers dun dossier correspondant un modle, vous utiliserez la fonction GetFiles() combine la fonction MoveFile(). Par exemple, pour dplacer tous les fichiers dextension.txt du dossier Mes Documents vers le dossier c:\data, employez les instructions suivantes:
For Each fichier As String In My.Computer.FileSystem.GetFiles(My.Computer.FileSystem. SpecialDirectories.MyDocuments, FileIO.SearchOption.SearchTopLevelOnly, "*.txt") My.Computer.FileSystem.MoveFile(fichier, "C:\data\") Next

Recherche de sous-dossiers Pour rechercher les sous-dossiers contenus dans un dossier, vous utiliserez la fonction My.Computer.FileSystem.GetDirectories(). titre dexemple, pour afficher les sous-dossiers du dossier c:\, employez les instructions suivantes:
For Each dossier As String In My.Computer.FileSystem.GetDirectories("c:\") TextBox1.Text = TextBox1.Text & dossier & vbCrLf Next

Dans la premire ligne, la fonction GetDirectories() renvoie une collection contenant le nom des sous-dossiers:
My.Computer.FileSystem.GetDirectories("c:\")

Cette collection est dcrite laide dune instruction For Each:


For Each dossier As String In

La seconde ligne ajoute le nom du dossier point au texte affich dans la zone de texte multiligne TextBox1. Remarquez lutilisation du code &vbCrLf pour ajouter un passage la ligne:
TextBox1.Text = TextBox1.Text & dossier & vbCrLf

Deux paramtres complmentaires peuvent tre utiliss avec la fonction GetDirectories():


My.Computer.FileSystem.GetDIrectories(NomDossier,InclureSousDossiers,Modle)

o:

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

125

NomDossier est le nom du dossier dans lequel vous voulez effectuer la recherche. InclureSousDossiers vaut True pour inclure les ventuels sous-dossiers dans la recherche, et False pour les exclure. Modle est le modle de la recherche (ce modle peut contenir un ou plusieurs caractres de remplacement:?pour remplacer un caractre unique; *pour en remplacer un nombre quelconque).

Nombre de fichiers dans un dossier Pour connatre le nombre de fichiers contenus dans un dossier, vous utiliserez la proprit Count de la fonction My.Computer.FileSystem.GetFiles(). titre dexemple, les lignes de code suivantes affichent dans un contrle Label le nombre de fichiers contenus dans le dossier c:\:
Dim Dossier as String = "c:\" Dim fichiers As System.Collections.ObjectModel.ReadOnlyCollection(Of String) fichiers = My.Computer.FileSystem.GetFiles(Dossier) Label1.Text = "Le dossier " + Dossier + "contient " + CStr(fichiers.Count) + "fichiers."

La premire instruction dfinit la variable String Dossier et y stocke le chemin de recherche:


Dim Dossier as String = "c:\"

La deuxime instruction dfinit lobjet fichiers de type ReadOnlyCollection(Of String):


Dim fichiers As System.Collections.ObjectModel.ReadOnlyCollection(Of String)

La troisime instruction interroge la fonction GetFiles() pour connatre les fichiers c ontenus dans le dossier "c:\":
fichiers = My.Computer.FileSystem.GetFiles(Dossier)

Enfin, la quatrime instruction affiche le nombre de fichiers renvoys par GetFiles() laide de la proprit Count:
Label1.Text = "Le dossier " + Dossier + "contient " + CStr(fichiers.Count) + "fichiers."

Info

Il est possible de compter les fichiers contenus dans les sous-dossiers du dossier spcifi dans le dossier de recherche. Il suffit pour cela dajouter la valeur True en deuxime argument de la fonction GetFiles(). En ajoutant un troisime argument chane contenant un modle de slection, vous pouvez limiter le comptage aux fichiers qui respectent ce modle1.

1. Le modle peut inclure un ou plusieurs caractres de remplacement: ?pour remplacer un caractre unique; *pour en remplacer un nombre quelconque.

126

Visual Basic 2010

Informations sur un fichier La fonction My.Computer.FileSystem.GetFileInfo() renvoie un objet FileInfo permettant de connatre diffrentes informations au sujet du fichier spcifi en argument. titre dexemple, les lignes de code ci-aprs affichent quelques informations sur le fichier c:\test\data.txt dans un contrle TextBox:
Dim st As String Dim info As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo ("c:\test\data.txt") st st st st st st st st = = = = = = = = "Dossier : " + info.DirectoryName + vbCrLf st + "Nom complet : " + info.FullName + vbCrLf st + "Nom du fichier : " + info.Name + vbCrLf st + "Taille du fichier : " + info.Length.ToString + " octets" + vbCrLf st + "Attributs : " + info.Attributes.ToString + vbCrLf st + "Date de cration : " + info.CreationTime + vbCrLf st + "Dernier accs : " + info.LastAccessTime + vbCrLf st + "Dernire sauvegarde : " + info.LastWriteTime + vbCrLf

TextBox1.Text = st

La premire ligne dfinit lobjet String st dans lequel seront stockes les informations concernant lobjet info:
Dim st As String

La deuxime ligne affecte la valeur retourne par la fonction GetFileInfo() lobjet System.IO.FileInfo information:
Dim information As System.IO.FileInfo information = My.Computer.FileSystem. GetFileInfo("c:\test\data.txt")

Le bloc dinstructions suivant extrait les informations de lobjet info en interrogeant ses proprits. Par exemple, pour connatre la taille du fichier c:\test\data.txt, il suffit de lire la proprit Length:
st = st + "Taille du fichier : " + info.Length.ToString + " octets" + vbCrLf

Une fois que toutes les donnes souhaites ont t extraites (et ventuellement converties au format chane laide de loprateur ToString), elles saffichent dans le contrle TextBox:
TextBox1.Text = st

Voici un exemple dinformations obtenues par lintermdiaire de lobjet System. IO.FileInfo et de la fonction GetFileInfo():

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

127

Dossier : c:\ Nom complet : c:\test\data.txt Nom du fichier : data.txt Taille du fichier : 294 octets Attributs : Archive Date de cration : 21/03/2010 09:07:10 Dernier accs : 21/03/2010 09:07:10 Dernire sauvegarde : 21/03/2010 09:07:14

Info

Les objets System.IO.FileInfo possdent de nombreuses proprits. Pour faciliter leur utilisation, nhsitez pas employer la fonctionnalit AutoComplete et les bulles daide associes (voir Figure3.70).

Figure3.70 AutoComplete et les bulles daide vous assisteront pour crire votre code de faon intuitive.

Informations sur un dossier Pour obtenir des informations sur un dossier, il suffit dinvoquer la fonction My.Computer. FileSystem.GetDirectoryInfo() en spcifiant son chemin complet dans largument. GetDirectoryInfo() renvoie un objet DirectoryInfo dont il suffit alors de parcourir les proprits.
Dim st As String Dim Info As System.IO.DirectoryInfo = My.Computer.FileSystem. GetDirectoryInfo("C:\Program Files") st st st st st st = = = = = = "Nom st + st + st + st + st + du dossier : " + Info.Name + vbCrLf "Ce dossier existe : " + Info.Exists.ToString "Attributs : " + Info.Attributes.ToString + vbCrLf "Date de cration : " + info.CreationTime + vbCrLf "Dernier accs : " + info.LastAccessTime + vbCrLf "Dernire sauvegarde : " + Info.LastWriteTime + vbCrLf

TextBox1.Text = st

128

Visual Basic 2010

Aprs avoir dclar un objet String st:


Dim st As String

lobjet System.IO.DirectoryInfo Info est dfini par lintermdiaire de la fonction GetDirectoryInfo():


Dim Info As System.IO.DirectoryInfo = My.Computer.FileSystem. GetDirectoryInfo("C:\Program Files")

Le bloc dinstructions suivant interroge les proprits de lobjet Info pour obtenir les informations souhaites, par exemple le type du dossier:
st = st + "Attributs : " + Info.Attributes.ToString + vbCrLf

Une fois que toutes les informations ont t rcupres et stockes dans la chane st, elles apparaissent dans une zone de texte multiligne:
TextBox1.Text = st

Voici un exemple dinformations obtenues par lintermdiaire de lobjet System. IO.DirectoryInfo et de la fonction GetDirectoryInfo():
Nom du dossier : Program Files Ce dossier existe : TrueAttributs : ReadOnly, Directory Date de cration : 15/11/2010 07:12:31 Dernier accs : 25/12/2010 19:44:47 Dernire sauvegarde : 19/12/2010 10:59:50

Documents et fichiers rcents Windows mmorise la liste des documents utiliss rcemment. Cette liste apparat partiellement dans le menu Dmarrer. Si vous le souhaitez, vous pouvez consulter une liste bien plus complte en faisant appel la fonction DirectoryInfo().GetFiles et en la filtrant par une requte LINQ. Consultez la section intitule "Liste des documents rcents" au Chapitre27 pour avoir plus dinformations sur le code utiliser. Une technique similaire permet de lister les fichiers crs depuis un jour, une semaine, un mois ou une tout autre priode. Consultez la section intitul "Liste des fichiers crs ces quinze derniers jours" au Chapitre 27 pour en savoir plus. Nom dune unit de stockage de masse Pour obtenir des informations sur une unit de stockage de masse (disquette, disque dur, CD, DVD, cl USB, etc.), vous utiliserez la fonction My.Computer.FileSystem.GetDriveInfo() en spcifiant la lettre dunit dans largument. GetDriveInfo() renvoie un objet DriveInfo dont il suffit alors de parcourir les proprits.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

129

Ces quelques lignes de code affichent des informations sur lunit "c:\":
Dim st As String Dim disque As System.IO.DriveInfo = My.Computer.FileSystem.GetDriveInfo("c:\") st = "Nom du volume : " + disque.VolumeLabel + vbCrLf st = st + "Dossier racine : " + disque.RootDirectory.ToString + vbCrLf st = st + "Systme de fichiers : " + disque.DriveFormat + vbCrLf st = st + "Type du disque : " + disque.DriveType.ToString + vbCrLf st = st + "Espace disponible : " + disque.AvailableFreeSpace.ToString + " octets" + vbCrLf TextBox1.Text = st

Aprs avoir dclar lobjet String st:


Dim st As String

la fonction My.Computer.FileSystem.GetDriveInfo() est invoque pour obtenir des informations sur le disque c:\. Le rsultat de la fonction est stock dans lobjet System.
IO.DriveInfo disque:
Dim disque As System.IO.DriveInfo = My.Computer.FileSystem.GetDriveInfo("c:\")

Le bloc dinstructions suivant interroge les proprits de lobjet DriveInfo disque et stocke les valeurs renvoyes dans la chane st. Par exemple, pour connatre lespace disponible sur lunit, il suffit de consulter la proprit AvailableFreeSpace:
st = st + "Espace disponible : " + disque.AvailableFreeSpace.ToString + " octets" + vbCrLf

La dernire instruction affiche le rsultat dans la zone de texte multiligne TextBox1:


TextBox1.Text = st

Voici un exemple dinformations retournes lorsque lunit interroge est un disque dur:
Nom du volume : Disque principal Dossier racine : C:\ Systme de fichiers : NTFS Type du disque : Fixed Espace disponible : 30703894528 octets

Les informations renvoyes sont trs diffrentes lorsque lunit interroge est un lecteur de CD-ROM contenant un CD audio:
Nom du volume : Audio CD Dossier racine : D:\ Systme de fichiers : CDFS Type du disque : CDRom Espace disponible : 0 octet

130

Visual Basic 2010

Accs aux feuilles du projet


Lobjet My.Forms donne accs aux feuilles dfinies dans un projet: My.Forms.Form1 reprsente la premire feuille de lapplication. My.Forms.Form2 reprsente la deuxime feuille de lapplication. My.Forms.MaFeuille reprsente une des feuilles de lapplication renomme en MaFeuille proprit (Name). Utilisez la fonctionnalit Intellisense et les bulles daide de Visual Studio pour accder aux proprits, procdures et fonctions dun objet My.Forms (voir Figure3.71).
Figure3.71 Intellisense et les bulles daide sont trs apprciables pendant lcriture du code.

Accs au clavier
Lobjet My.Computer.Keyboard donne accs au clavier. Vous lutiliserez pour tester les touches presses et/ou actives et pour simuler lappui sur les touches de votre choix. Pour tester les touches spciales du clavier, employez les proprits de lobjet My.Computer. Keyboard, comme indiqu dans le tableau ci-aprs.
Proprit de My.Computer.Keyboard
AltKeyDown CapsLock CtrlKeyDown NumLock ScrollLock ShiftKeyDown True si

Touche Alt enfonce Touche Verr Maj active Touche Ctrl enfonce Touche Verr Num active Touche Arrt dfil active Touche Maj enfonce

titre dexemple, cette ligne de code affiche une bote de dialogue si la touche Maj est enfonce au moment du test:
If My.Computer.Keyboard.ShiftKeyDown Then MsgBox("La touche Maj est enfonce")

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

131

Pour simuler lappui sur une ou plusieurs touches du clavier, employez la fonction SendKeys(). Cette fonction admet deux syntaxes:
My.Computer.Keyboard. SendKeys("texte envoyer") My.Computer.Keyboard. SendKeys("texte envoyer", attente)

o attente peut prendre lune des valeurs True (attente de la prise en compte des touches frappes avant de poursuivre) ou False (poursuite du programme sans attendre). titre dexemple, ces quelques lignes de code ouvrent le Bloc-Notes de Windows et lui "envoient" un court texte:
Dim Processus As Integer Processus = Shell("notepad.exe", AppWinStyle.NormalFocus) AppActivate(Processus) My.Computer.Keyboard.SendKeys("Ce texte est envoy au Bloc-Notes" + vbCrLf + vbCrLf) My.Computer.Keyboard.SendKeys("par Visual Basic 2010", True)

La premire instruction dfinit la variable Integer Processus:


Dim Processus As Integer

Cette variable est utilise pour obtenir lidentifiant dun processus cr avec la fonction Shell():
Processus = Shell("notepad.exe", AppWinStyle.NormalFocus)

Pour lancer lapplication correspondante, il suffit dinvoquer AppActivate():


AppActivate(Processus)

Plusieurs lments textuels sont alors envoys au Bloc-Notes:


My.Computer.Keyboard.SendKeys("Ce texte est envoy au Bloc-Notes" + vbCrLf + vbCrLf) My.Computer.Keyboard.SendKeys("par Visual Basic 2010", True)

La Figure 3.72 reprsente la fentre du Bloc-Notes aprs lexcution de ces quelques instructions.
Figure3.72 Le texte spcifi dans les procdures SendKeys() a bien t envoy au Bloc-Notes.

132

Visual Basic 2010

Accs la souris
Lobjet My.Computer.Mouse donne accs trois proprits concernant la souris:
Proprit
ButtonSwapped WheelsExists WheelScrollLines

Effet
True si les boutons gauche et droit de la souris sont inverss, sinon False. True si la souris est dote dune roulette, sinon False.

Amplitude de la rotation de la roulette.

Accs au rseau
Lobjet My.Computer.Network donne accs de nombreuses fonctionnalits concernant le rseau local et la liaison Internet. Vrifier ltat du rseau Pour savoir si lordinateur est reli un rseau local ou Internet, vous testerez la proprit IsAvailable de lobjet My.Computer.NetWork:
If My.Computer.Network.IsAvailable then Label1.Text = "Lordinateur est reli un rseau local et/ou Internet" Else Label1.Text = "Lordinateur nest reli ni un rseau local ni Internet" End If

Vrifier la disponibilit dun ordinateur Pour vrifier la disponibilit dun ordinateur1 dont vous connaissez ladresse IP ou URL, il suffit dappeler la fonction Ping(). La valeur retourne est True si lordinateur rpond au ping, et False dans le cas contraire.
If My.Computer.Network.Ping("192.168.0.125") then Label1.Text = "Lordinateur 192.168.0.125 a rpondu au ping" Else Label1.Text = "Lordinateur 192.168.0.125 na pas rpondu au ping" End If

1. Cet ordinateur peut faire partie du rseau local ou tre connect Internet.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

133

Info

Si vous ne connaissez pas ladresse IP de lordinateur que vous voulez tester, ouvrez une fentre Invite de commandes. Sous Windows7 ou Vista, cliquez sur Dmarrer, tapez invite puis cliquez sur Invite de commandes. Sous Windows XP, cliquez sur Dmarrer, slectionnez Tous les programmes, Accessoires, puis Ligne de commande dans le menu Dmarrer. Tapez ipconfig et appuyez sur la touche Entre du clavier. Ladresse IP de lordinateur apparat clairement (voir Figure3.73).

Figure3.73 Ladresse IP de cet ordinateur est 192.168.1.64.

Si lordinateur destinataire du ping se trouve sur Internet, vous pouvez spcifier un dlai de retour maximal en millisecondes. Par exemple, pour savoir si le site www.monsite.com rpond en moins de 500milli secondes, utilisez linstruction If de la faon suivante:
If My.Computer.Network.Ping("www.monsite.com", 500) then Label1.Text = "La page www.monsite.com a rpondu dans le dlai imparti" Else Label1.Text = "La page www.monsite.com na pas rpondu dans les 500 ms imparties" End If

Envoyer un fichier sur un serveur Pour envoyer un fichier sur un serveur FTP ou HTTP, vous utiliserez la procdure UploadFile():
My.Computer.Network.UploadFile("NomFichier", "AdresseServeur", "NomUtilisateur", "MotPasse", Interface, TimeOut)

134

Visual Basic 2010

o:

NomFichier est le nom complet du fichier envoyer. AdresseServeur est ladresse FTP ou HTTP du serveur sur lequel le fichier doit tre

copi.
NomUtilisateur est le nom fournir au serveur pour accder au compte (si ncessaire). MotPasse est le mot de passe fournir au serveur pour accder au compte (si ncessaire). Interface est une valeur boolenne qui indique si lindicateur de progression du trans-

fert doit (True) ou ne doit pas (False) tre affich.


TimeOut dfinit le dlai de rponse maximal du serveur, en millisecondes.

Supposons que le fichier c:\test\vide.bmp doive tre transfr sur les pages perso FTP Free de lutilisateur bertrand.lebolduc en utilisant le mot de passe "cadeau". Linstruction utiliser est la suivante:
My.Computer.Network.UploadFile("C:\test\vide.bmp", "ftp://ftpperso.free.fr/vide. bmp", "bertrand.lebolduc", "cadeau", True, 500)

Lorsque cette instruction est excute, un indicateur indique la progression du transfert (voir Figure3.74).
Figure3.74 Indicateur de progression du transfert.

Tlcharger un fichier depuis un serveur Pour tlcharger un fichier sur votre ordinateur depuis un serveur FTP ou HTTP, vous utiliserez la procdure DownloadFile():
My.Computer.Network.DownloadFile("AdresseServeur", "NomFichier", "NomUtilisateur", "MotPasse", Interface, TimeOut, Ecrasement)

o:

AdresseServeur est ladresse FTP ou HTTP du fichier sur le serveur. NomFichier contient le chemin de stockage sur votre ordinateur et le nom donner au

fichier tlcharg.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

135

NomUtilisateur est le nom fournir au serveur pour accder au compte (si ncessaire). MotPasse est le mot de passe fournir au serveur pour accder au compte (si ncessaire). Interface est une valeur boolenne qui indique si lindicateur de progression du transfert doit (True) ou ne doit pas (False) tre affich. TimeOut dfinit le dlai de rponse maximal du serveur, en millisecondes. Ecrasement est une variable boolenne qui indique si un fichier de mme nom doit (True) ou ne doit pas (False) tre cras sur votre ordinateur.

Supposons que vous vouliez tlcharger le fichier Total Commander depuis le site Infosdu-net.com. Ladresse de tlchargement est http://download.infos-du-net.com/52282/ tcmdr700.exe. Ce fichier est librement tlchargeable, sans quil soit ncessaire de fournir un nom dutilisateur et un mot de passe. Pour copier le fichier dans le dossier c:\test, sous le nom tcmdr700.exe, vous utiliserez linstruction suivante:
My.Computer.Network.DownloadFile("http://download.infos-du-net.com/52282/ tcmdr700.exe", "c:\test\tcmdr700.exe", "", "", True, 500, True)

Lorsque cette instruction est excute, un indicateur indique la progression du transfert (voir Figure3.75).
Figure3.75 Indicateur de progression du transfert.

Manipulation du Registre
Lobjet My.Computer.Registry donne accs de nouvelles procdures en rapport avec le Registre de Windows:
Procdure
My.Computer.Registry.CurrentUser.CreateSubKey() My.Computer.Registry.SetValue() My.Computer.Registry.GetValue() My.Computer.Registry.CurrentUser.DeleteSubKey()

Utilit
Cration dune cl Dfinition de la valeur dune cl Lecture dune cl Suppression dun cl

136

Visual Basic 2010

Lecture dune valeur Vous utiliserez la fonction GetValue() pour lire une valeur dans le Registre:
resultat = My.Computer.Registry.GetValue(Nom, Valeur, RetourParDefaut)

RetourParDefaut est un Object contenant le rsultat retourn par la fonction si la valeur spcifie dans le deuxime argument nexiste pas. La valeur HKEY_USERS\.DEFAULT\Control Panel\Keyboard\InitialKeyboardIndicators indique si la touche Verr Num est active(2) ou dsactive(0) au dmarrage de lordinateur. Ces quelques lignes de code lisent la valeur InitialKeyboardIndicators et affichent un message en fonction de son contenu:
Dim valeur As String valeur = My.Computer.Registry.GetValue("HKEY_USERS\.DEFAULT\Control Panel\Keyboard", "InitialKeyboardIndicators", Nothing) If valeur = "0" Then MsgBox("La touche Verr Num est dsactive au dmarrage de lordinateur") Else MsgBox("La touche Verr Num est active au dmarrage de lordinateur") End If

o:
Nom est un String contenant le nom de la cl laquelle accder. Valeur est un String contenant le nom de la valeur laquelle accder dans la cl.

Test de lexistence dune valeur Pour tester lexistence dune valeur dans le Registre, il suffit dutiliser la fonction GetValue() et de dterminer si la valeur renvoye est gale au troisime argument de la fonction:
If My.Computer.Registry.GetValue(Nom, Valeur, RetourParDefaut) Is RetourParDefaut Then MsgBox("La valeur " + Valeur + " nexiste pas.) End If

criture dune valeur Vous utiliserez la fonction SetValue() pour lire une valeur dans le Registre:
My.Computer.Registry.SetValue(Nom, Valeur, Donne, type)

o:

Nom est un String contenant le nom de la cl laquelle accder. Valeur est un String contenant le nom de la valeur laquelle accder dans la cl. Donne est la donne crire dans la valeur.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

137

Type est le type de la valeur (cet argument est facultatif): Microsoft.Win32.RegistryValueKind.Binary: REG_BINARY Microsoft.Win32.RegistryValueKind.Dword: REG_DWORD Microsoft.Win32.RegistryValueKind.ExpandString: REG_EXPAND_SZ Microsoft.Win32.RegistryValueKind.MultiString: REG_MULTI_SZ Microsoft.Win32.RegistryValueKind.QWord: REG_QWORD Microsoft.Win32.RegistryValueKind.String: REG_SZ

Linstruction ci-aprs active la touche Verr Num au dmarrage de lordinateur en stockant la chane 2 dans la valeur HKEY_USERS\.DEFAULT\Control Panel\Keyboard\ InitialKeyboardIndicators:
My.Computer.Registry.SetValue("HKEY_USERS\.DEFAULT\Control Panel\Keyboard", "InitialKeyboardIndicators", "2")

Cration dune cl La procdure CreateSubKey() permet de crer une nouvelle cl:


CreateSubKey("Nom")

o Nom est le nom de la cl que vous souhaitez crer. Cette fonction est accessible partir des objets lists dans le tableau ci-aprs.
Objet
ClassesRoot CurrentConfig CurrentUser LocalMachine Users

Accs
HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS

Par exemple, pour crer la cl CleTest dans la branche HKEY_CURRENT_CONFIG, vous utiliserez linstruction suivante:
My.Computer.Registry.CurrentConfig.CreateSubKey("CleTest")

Une fois la cl CleTest cre, vous pouvez dfinir la valeur ValeurTest et y stocker une valeur quelconque laide de la procdure SetValue():
My.Computer.Registry.SetValue("HKEY_CURRENT_CONFIG\CleTest", "ValeurTest", "Donne test", Microsoft.Win32.RegistryValueKind.String)

138

Visual Basic 2010

Comme le montre la Figure3.76, aprs lexcution de ces deux instructions, la cl et la valeur ont bien t cres.
Figure3.76 CleTest et ValeurTest ont bien t cres.

ntion Atte

Si vous travaillez sous Windows 7 ou Vista, vous devez disposer des privilges de ladministrateur pour modifier le Registre. Pour les acqurir, affichez le dossier contenant lexcutable du projet, cliquez du bouton droit sur son icne et slectionnez Excuter en tant quadministrateur dans le menu (voir Figure3.77). Si cela vous est demand, entrez le nom de lutilisateur et le mot de passe associ puis validez.

Figure3.77 Demande dexcution du programme en tant quadministrateur.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

139

Suppression dune cl Pour supprimer une cl et les ventuelles valeurs quelle hberge, vous utiliserez la fonction DeleteSubKey():
CreateSubKey("Nom")

o Nom est le nom de la cl que vous souhaitez supprimer. linstar de la fonction CreateSubKey(), DeleteSubKey() est accessible partir des objets ClassesRoot, CurrentConfig, CurrentUser, LocalMachine et Users. titre dexemple, pour supprimer la cl HKEY_CURRENT_CONFIG\CleTest, employez instruction ci-aprs: l
My.Computer.Registry.CurrentConfig.DeleteSubKey("CleTest")

Comme le montre la Figure3.78, la cl CleTest a bien t supprime.


Figure3.78 CleTest a disparu de la branche
HKEY_CURRENT_CONFIG.

Ports srie
Les ports srie de lordinateur sont accessibles via lobjet My.Computer.Ports. Vous utiliserez essentiellement les fonctions, procdures et proprits de cet objet pour dialoguer avec un modem RTC et pour changer des donnes entre deux ordinateurs relis par un cble srie. Liste des ports srie La proprit SerialPortNames donne accs une collection de String contenant le nom des ports srie de lordinateur. Pour connatre le nom des diffrents ports srie, il suffit de dcrire la collection avec une instruction For Each:

140

Visual Basic 2010

Dim st As String = "Les ports srie de cet ordinateur sont :" + vbCrLf For Each PortSerie As String In My.Computer.Ports.SerialPortNames st = st + " - " + PortSerie + vbCrLf Next TextBox1.Text = st

Communiquer avec un modem Pour communiquer avec un modem, vous devez lui envoyer des commandes de type AT, par exemple:

Composition du numro de tlphone 0145894465:


ATDT0145894465;<cr>

Interruption de la liaison:
ATH<cr>

Rglage du volume du haut-parleur sur Faible:


ATL0<cr>

Lobjet My.Computer.Ports simplifie lextrme la communication avec un modem: 1. Identifiez le port srie sur lequel est connect le modem. 2. Utilisez la fonction My.Computer.Ports.OpenSerialPort() pour ouvrir le port de communication. 3. Employez une commande Write pour envoyer les commandes voulues au modem. Supposons que le modem soit connect sur le port srie COM2. Pour lui demander de composer le numro 0145894465, mettez en uvre les instructions suivantes:
Dim com2 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM2", 9600) com2.Write("ATDT0145894465" & vbCrLf)

Envoyer et recevoir des donnes sur un port srie Pour envoyer des donnes sur un port srie, procdez comme suit: 1. Dfinissez un objet IO.Ports.SerialPorts. 2. Instanciez-le avec la valeur retourne par la fonction OpenSerialPort(). 3. Utilisez la procdure Write() pour envoyer les donnes chanes souhaites:
Dim com1 As IO.Ports.SerialPort com1 = My.Computer.Ports.OpenSerialPort("COM1", 19200) com1.Write("chane 1" & vbCrLf) com1.Write("chane n" & vbCrLf)

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

141

Pour recevoir des donnes sur un port srie, procdez comme suit: 1. Dfinissez un objet IO.Ports.SerialPorts. 2. Instanciez-le avec la valeur retourne par la fonction OpenSerialPort(). 3. Utilisez la fonction ReadLine() en boucle pour acqurir les chanes qui parviennent sur le port srie:
Dim com1 As IO.Ports.SerialPort com1 = My.Computer.Ports.OpenSerialPort("COM1", 19200) Dim st as String = "" Do st = com1.ReadLine() Label1.Text = st Loop

Systme daffichage
Lobjet My.Computer.Screen donne accs des fonctions, procdures et proprits en rapport avec le systme daffichage. Le tableau ci-aprs dresse la liste des principales proprits de cet objet.
Proprit
My.Computer.Screen.WorkingArea.Size My.Computer.Screen.WorkingArea.Height ou My.Computer.Screen.WorkingArea.Bounds.Height My.Computer.Screen.WorkingArea.Width ou My.Computer.Screen.WorkingArea.Bounds.Width My.Computer.Screen.WorkingArea.X My.Computer.Screen.WorkingArea.Y

Signification
Taille de lcran Hauteur de lcran Largeur de lcran Abscisse du coin suprieur gauche de la zone de trac (System.Drawing.Rectangle) Ordonne du coin suprieur gauche de la zone de trac (System.Drawing.Rectangle)

My.Computer.Info
Lobjet My.Computer.Info donne accs aux informations concernant lordinateur sur lequel le code est excut: mmoire, assemblies, nom de lapplication, nom du systme dexploitation, etc.

142

Visual Basic 2010

Proprit
AvailablePhysicalMemory AvailableVirtualMemory OSFullName OSPlatform OSversion InstalledUICulture TotalPhysicalMemory TotalVirtualMemory

Signification
Mmoire physique disponible Mmoire virtuelle disponible Nom du systme dexploitation Nom de la plateforme Version du systme dexploitation Langue du systme Mmoire physique totale Mmoire virtuelle totale

titre dexemple, nous allons dfinir une petite application qui affiche les proprits dcrites dans le tableau prcdent. Aprs avoir cr un nouveau projet de type Application Windows Forms, nous ajoutons huit contrles Label et huit contrles TextBox la feuille de lapplication. Les proprits des contrles sont modifies comme suit:
Contrle
Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Form1

Proprit
Text Text Text Text Text Text Text Text Text

Valeur
Mmoire RAM totale Mmoire RAM disponible Mmoire virtuelle totale Mmoire virtuelle disponible Nom complet du systme Plateforme Version Culture Informations sur le systme

Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load TextBox1.Text = My.Computer.Info.TotalPhysicalMemory TextBox2.Text = My.Computer.Info.AvailablePhysicalMemory TextBox3.Text = My.Computer.Info.TotalVirtualMemory TextBox4.Text = My.Computer.Info.AvailableVirtualMemory

Chapitre 3


= = = =

Nouveauts et concepts utiles du langage et de lenvironnement 

143

TextBox5.Text TextBox6.Text TextBox7.Text TextBox8.Text End Sub

My.Computer.Info.OSFullName My.Computer.Info.OSPlatform My.Computer.Info.OSVersion My.Computer.Info.InstalledUICulture.ToString

Cette procdure se contente de lire les proprits de lobjet My.Computer.Info et de les afficher dans les contrles TextBox (voir Figure3.79).
Figure3.79 Informations systme provenant de lobjet My.Computer.Info.

Tous les fichiers relatifs cette application se trouvent dans le dossier Projects\Infos Systeme des sources de louvrage.

My.User
Vous utiliserez lobjet My.User pour obtenir des informations sur la personne qui excute le programme. Vous pourrez en particulier connatre:

son nom de domaine: premire partie de la proprit Name; son nom dutilisateur: seconde partie de la proprit Name; son type (simple utilisateur, administrateur): proprit BuiltInRole.

Les lignes de code suivantes lisent les proprits de lobjet My.User et les affichent dans un contrle TextBox multiligne:
Dim st As String Dim nom() As String = Split(My.User.Name, "\") st = "Nom de domaine : " + nom(0) + vbCrLf

144

Visual Basic 2010

st = st + "Nom dutilisateur : " + nom(1) + vbCrLf If My.User.IsInRole(ApplicationServices.BuiltInRole.Guest) Then st = st + "Lutilisateur nest pas un administrateur" If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then st = st + "Lutilisateur est un administrateur" TextBox1.Text = st

Aprs avoir dfini la variable String st:


Dim st As String

la proprit Name de lobjet My.User est lue et ses deux composantes sont stockes dans le tableau de String nom():
Dim nom() As String = Split(My.User.Name, "\")

Le nom de domaine et le nom dutilisateur sont alors extraits du tableau et stocks dans la variable st:
st = "Nom de domaine : " + nom(0) + vbCrLf st = st + "Nom dutilisateur : " + nom(1) + vbCrLf

Les deux instructions suivantes testent le type de lutilisateur et ajoutent linformation correspondante dans la variable st:
If My.User.IsInRole(ApplicationServices.BuiltInRole.Guest) Then st = st + "Lutilisateur nest pas un administrateur" If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then st = st + "Lutilisateur est un administrateur"

Enfin, le contenu de la variable st saffiche dans le contrle TextBox multiligne:


TextBox1.Text = st

My.Resources
Lorsque vous prvoyez dutiliser des icnes, des images, des sons ou tout autre type de fichier dans une application Visual Basic 2010, vous pouvez les placer dans un dossier particulier (par exemple celui dans lequel se trouve lexcutable) ou bien les inclure dans les "ressources" de lapplication. Dans le second cas, ils feront partie intgrante de lexcutable et ne pourront pas en tre discerns par les utilisateurs. Pour inclure une nouvelle ressource dans lapplication en cours ddition, procdez comme suit: 1. Lancez la commande Proprits de Nom (o Nom est le nom de lapplication) du menu Projet.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

145

2. Slectionnez longlet Ressources (voir Figure3.80).


Figure3.80 Longlet Ressources des proprits de lapplication.

3. Choisissez le type de ressource ajouter lapplication dans la premire liste droulante : Chanes, Images, Icnes, Audio, Fichiers ou Autre (vous pouvez galement utiliser les raccourcis Ctrl+1 Ctrl+6). 4. Droulez la liste Ajouter une ressource et slectionnez Ajouter un fichier existant. 5. Choisissez le fichier que vous souhaitez ajouter dans les ressources de lapplication (voir Figure3.81).
Figure3.81 Le fichier WAV ding a t ajout lapplication.

Pour accder aux ressources de lapplication dans le code, il suffit dutiliser lobjet My.Resources. Par exemple, pour jouer le son WAV ding, employez linstruction suivante:
My.Computer.Audio.Play(My.Resources.ding, AudioPlayMode.Background)

146

Visual Basic 2010

La fonctionnalit AutoComplete de Visual Basic 2010 facilite laccs aux ressources incluses dans lapplication : entrez My.Computer dans lditeur de code et faites votre choix dans la liste droulante (voir Figure3.82).
Figure3.82 AutoComplete donne accs aux diffrentes ressources incluses dans lapplication.

My.Settings
Lobjet My.Settings donne accs un ensemble de procdures, fonctions et proprits lies au paramtrage de lapplication. Par son intermdiaire, vous pouvez stocker de faon dynamique toute information juge ncessaire et retrouver celle-ci lors des prochaines excutions de lapplication. Cela permet de mmoriser les prfrences de lutilisateur (couleurs, polices, particularits daffichage, etc.) ou encore de savoir combien de fois lapplication a t lance. titre dexemple, nous allons ajouter la variable Integer NombreExecution dans les paramtres de lapplication et lui affecter la valeur0: 1. Lancez la commande Proprits de Nom (o Nom est le nom de lapplication) du menu Projet. 2. Slectionnez longlet Proprits et remplissez les champs Nom, Type, Porte et Valeur (voir Figure3.83).

Info

Pour tre en mesure de modifier un lment dfini sous longlet Paramtres, vous devez lui affecter une porte Utilisateur (et non Application).

3. Retournez dans le code. La proprit NombreExecution est directement accessible dans lobjet My.Settings (voir Figure3.84).

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

147

Figure3.83 Longlet Paramtres permet de crer des paramtres propres lapplication.

Figure3.84 Le paramtre NombreExecution est directement accessible dans le code.

Si vous dveloppez des programmes en shareware, vous souhaiterez peut-tre limiter le nombre dexcutions de la version non enregistre de vos crations. Il suffit pour cela dincrmenter le paramtre NombreExecution chaque excution du programme et de tester sa valeur:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load My.Settings.NombreExecution = My.Settings.NombreExecution + 1 If My.Settings.NombreExecution = 30 Then MsgBox("Vous avez excut lapplication 30 fois." + vbCrLf + "Pour continuer lutiliser, vous devez vous enregistrer." + vbCrLf + "Pour cela, rendez-vous sur le site www.MonSite.com") End End If End Sub

148

Visual Basic 2010

My.WebServices
Lobjet My.WebServices facilite grandement linterfaage avec un service web. Aprs avoir rfrenc le service web dans le projet laide de la commande Ajouter une rfrence web du menu Projet, les fonctions et procdures du service sont directement accessibles par lintermdiaire de lobjet My.WebServices. Par exemple, pour accder la fonction NomFonction du service NomService, vous utiliserez la syntaxe suivante:
Dim resultat as Type = My.WebServices.NomService.NomFonction(param1, , paramN)

o:

resultat est la variable de type Type dans laquelle le rsultat de la fonction NomFonction est stock. NomService est le nom du service web interrog. NomFonction est le nom de la fonction du service web interroge. param1 paramN sont les paramtres transmis la fonction NomFonction.

Vous trouverez un exemple concret dutilisation de lobjet My.WebServices au Chapitre25 ddi aux services web.

Assistant Publication
Lorsquune application aura donn les rsultats escompts, vous souhaiterez certainement la diffuser. Pour cela, Visual Studio vous propose son Assistant Dploiement. Lancez la commande Publier Nom dans le menu Gnrer (o Nom est le nom de la solution en cours ddition). Cette commande lance lAssistant Publication. Spcifiez lemplacement de publication de votre solution. Comme le montre la Figure3.85, vous pouvez indiquer un dossier sur le disque dur, un chemin sur le serveur local, ou bien une adresse FTP ou HTTP. Si vous dcidez de publier la solution sur votre disque dur ou sur un disque dur partag du rseau, un fichier Setup.exe est automatiquement gnr (voir Figure3.86). Pour installer votre solution, il suffit de copier le contenu du dossier de publication sur le CD-ROM/DVD-ROM et dexcuter le fichier Setup.exe.

Chapitre 3

Nouveauts et concepts utiles du langage et de lenvironnement 

149

Figure3.85 Lassistant Publication est la dernire tape dans le dveloppement dune solution.

Figure3.86 Ces fichiers ont t gnrs par lAssistant Publication.

Assistant Mise niveau


Pour convertir un projet crit dans une version antrieure de Visual Basic en Visual Basic 2010, ouvrez-le dans Visual Studio laide de la commande Ouvrir un projet du menu Fichier. Cette action provoque lexcution de lAssistant Mise niveau (voir Figure3.87).

150

Visual Basic 2010

Figure3.87 La premire bote de dialogue de lAssistant Mise niveau de Visual Basic.

LAssistant Mise niveau vous guide tout au long du processus et cre un nouveau projet Visual Basic 2010. Votre ancien projet demeure intact. Cependant, ce processus est sens unique: le nouveau projet Visual Basic 2010 ne peut plus tre ouvert dans lenvironnement de dveloppement prcdent. Aprs la mise jour de votre projet, le langage est modifi pour tout changement de syntaxe et vos anciens formulaires sont convertis au format Visual Basic 2010. Dans la plupart des cas, vous devrez ensuite apporter quelques modifications votre code, car certains objets et fonctionnalits du langage nont pas dquivalent dans Visual Basic 2010 (ou celui propos est trop diffrent pour une mise niveau automatique). Aprs la mise niveau, vous pourrez galement modifier votre application afin de tirer parti des nouvelles fonctionnalits de Visual Basic 2010.

II
Programmation Windows
Au travers de nombreux exemples, cette partie vous montre comment aborder la plupart des domaines de programmation Windows: utilisation de botes de dialogue communes, mise en place de menus, barres doutils et barres dtat, manipulations graphiques, accs au systme de fichiers, exploitation de donnes tabulaires, bases de donnes locales et distantes, accs au Registre de Windows, interfaage de Word et dExcel, accs aux fonctions API, traitement multitche/multicur, etc. Tous les codes prsents dans cette partie sont rutilisables: un copier-coller est gnralement suffisant pour les incorporer dans vos propres dveloppements.

4
Botes de dialogue communes
Windows met la disposition des programmeurs un ensemble de botes de dialogue "communes". En les utilisant, les applications ont un look and feel constant, ce qui facilite lapprentissage de leurs utilisateurs. La mise en uvre des botes de dialogue communes est des plus simple. Il suffit dinitialiser des proprits et dappeler la mthode adquate. Les botes de dialogue accessibles par ce procd concernent louverture, lenregistrement et limpression de fichiers, la slection de dossiers, de couleurs et de polices. Chacune de ces botes de dialogue est attache un contrle spcifique dans la Bote outils:

OpenFileDialog pour la bote de dialogue Ouvrir; SaveFileDialog pour la bote de dialogue Enregistrer sous; ColorDialog pour la bote de dialogue Couleur; FontDialog pour la bote de dialogue Polices de caractres; PrintDialog pour la bote de dialogue Imprimer;

154

Visual Basic 2010

PrintPreviewDialog pour la bote de dialogue Aperu avant impression; FolderBrowserDialog pour la bote de dialogue Rechercher un dossier.

La bote de dialogue Ouvrir


La bote de dialogue Ouvrir permet de slectionner un fichier dans les mmoires de masse de lordinateur: disquettes, disques durs, CD-ROM, etc. Elle est attache la mthode ShowDialog. Pour pouvoir afficher une bote de dialogue Ouvrir, une ou plusieurs proprits doivent tre renseignes. Le tableau suivant dresse la liste des principales proprits utilisables.
Proprit
DefaultExt Title FileName Filter

Effet
Dfinit lextension par dfaut du nom du fichier ouvrir. Dfinit la chane affiche dans la barre de titre de la bote de dialogue. Dfinit le chemin daccs et le nom du fichier slectionn par dfaut. Dfinit les filtres utiliser. Ces filtres apparaissent dans la liste modifiable Type de la bote de dialogue. La syntaxe est objet.Filter [= description1 |filtre1 |description2 |filtre2]. Spcifie le filtre utiliser par dfaut dans la bote de dialogue Ouvrir. La syntaxe est objet.FilterIndex [= 1 | 2 | 3 | 4]. Dfinit le rpertoire des fichiers affichs louverture de la bote de dialogue.

FilterIndex InitialDirectory

Une fois que les proprits de votre choix ont t renseignes, un simple appel la mthode ShowDialog() affiche la bote de dialogue Ouvrir. Vous pouvez ensuite utiliser la proprit FileName pour connatre le nom du fichier slectionn. Lancez la commande Nouveau/Projet du menu Fichier pour dfinir un nouveau projet. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Ouvrir au projet et cliquez sur OK. Ajoutez deux boutons de commande (Button), une zone de texte (TextBox) et une bote de dialogue Ouvrir (OpenFileDialog) dans la feuille. Modifiez les proprits des diffrents contrles comme suit:
Contrle
Form1 Button1

Proprit
Text Text

Valeur
La bote de dialogue Ouvrir Ouvrir

Chapitre 4


Proprit
Text Multiline (Name)

Botes de dialogue communes 

155

Contrle
Button2 TextBox1 OpenFileDialog

Valeur
Quitter True CMD

Si vous avez suivi nos indications, la feuille du projet doit maintenant ressembler la Figure4.1.
Figure4.1 La bote de dialogue du projet, en mode Cration.

Vous allez maintenant dfinir le code des deux boutons de commande. Double-cliquez sur le bouton Ouvrir et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click CMD.Title = "Choisissez un fichier" CMD.Filter = "Bitmap (*.BMP)|*.BMP|DLL (*.DLL)|*.DLL|Excutables (*.EXE)|*. EXE|Fichiers daide (*.HLP)|*.HLP" CMD.FilterIndex = 1 CMD.InitialDirectory = "C:\WINDOWS" CMD.ShowDialog() Message affich selon la slection de lutilisateur If (CMD.FileName <> "") Then TextBox1.Text = "Le fichier " + CMD.FileName + " a t slectionn." Else TextBox1.Text = "Vous navez slectionn aucun fichier." End Sub

156

Visual Basic 2010

Les quatre premires lignes paramtrent la bote de dialogue Ouvrir:

Title dfinit le texte qui apparat dans la barre de titre. Filter dfinit le filtre de slection des fichiers de la liste droulante Fichiers de type. FilterIndex dsigne lentre slectionne par dfaut dans la liste droulante Fichiers

de type.
InitialDirectory dfinit le dossier par dfaut.
CMD.Title = "Choisissez un fichier" CMD.Filter = "Bitmap (*.BMP)|*.BMP|DLL (*.DLL)|*.DLL|Excutables (*.EXE)|*. EXE|Fichiers daide (*.HLP)|*.HLP" CMD.FilterIndex = 1 CMD.InitialDirectory = "C:\WINDOWS"

Lorsque la bote de dialogue a t paramtre, elle saffiche:


CMD.ShowDialog()

Lors de sa fermeture, la proprit FileName du contrle CMD contient lentre slectionne par lutilisateur. En fonction de cette entre, un message apparat dans la zone de texte:
If (CMD.FileName <> "") Then TextBox1.Text = "Le fichier " + CMD.FileName + " a t slectionn." Else TextBox1.Text = "Vous navez slectionn aucun fichier."

Double-cliquez sur le bouton de commande Quitter et compltez la procdure Button2_ Click() en ajoutant le mot End:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub

Cette instruction met fin au programme lorsquon clique sur le bouton Quitter. Excutez la solution en cliquant sur le bouton Dmarrer le dbogage de la barre doutils Standard. Les boutons Ouvrir et Quitter sont totalement oprationnels (voir Figure4.2).
Figure4.2 Un fichier a t slectionn dans le dossier c:\Windows.

Cette application se trouve dans le dossier Ouvrir aprs installation des sources de louvrage.

Chapitre 4

Botes de dialogue communes 

157

La bote de dialogue Enregistrer sous


Les botes de dialogue Enregistrer sous et Ouvrir sont assez semblables. Seule la mthode utiliser est diffrente. Vous trouverez dans le dossier Projects\Enreg des sources de louvrage une application permettant de dfinir le nom dun fichier de sauvegarde dans une bote de dialogue Enregistrer sous (voir Figure4.3).
Figure4.3 Les deux botes de dialogue affiches par le projet ENREG.

Voici le listing de la procdure associe au clic sur le premier bouton de commande:


Private Sub Command1_Click() - - - - - - - - - - - - - - - - - - - - - - - - - Dfinition des proprits de la bote de dialogue - - - - - - - - - - - - - - - - - - - - - - - - - CMD.DialogTitle = "Enregistrer le fichier sous " CMD.CancelError = True CMD.Filter = "Perso (*.PER)|(*.PER)|Tous les fichiers (*.*)|*.*" CMD.FilterIndex = 1 CMD.InitDir = "C:\WINDOWS" CMD.filename = "Agenda.per" CMD.ShowSave If (CMD.FileName <> "") Then Text1.TEXT = "La sauvegarde sera ralise dans le fichier "+CMD.filename+"." Else Text1.Text = "Vous navez slectionn aucun fichier." End Sub

158

Visual Basic 2010

Remarquez en particulier la dfinition restreinte des filtres de sauvegarde:


CMD.Filter = "Perso (*.PER)|(*.PER)|Tous les fichiers (*.*)|*.*"

et la slection du nom de la sauvegarde par dfaut:


CMD.filename = "Agenda.per"

Ce projet se trouve dans le dossier Enreg aprs installation des sources de louvrage.

La bote de dialogue Couleur


La bote de dialogue Couleur permet de slectionner une couleur dans un ensemble de couleurs de base. En agrandissant cette bote, vous pouvez galement dfinir une couleur par ses composantes: teinte, saturation, luminance, rouge, vert, bleu. Pour faire apparatre la bote de dialogue Couleur, il suffit dappeler la fonction ShowDialog(). Cette fonction renvoie une valeur qui indique sur quel bouton lutilisateur a cliqu pour la fermer: Windows.Forms.DialogResult.OK (bouton OK) ou Windows.Forms.Dialog Result.Cancel (bouton Annuler). Le cas chant, lobjet Color donne tous les rensei gnements ncessaires sur la couleur slectionne.

Exemple
Nous allons dfinir un projet qui permettra lutilisateur de slectionner une couleur dans une bote de dialogue Couleur. Le rsultat atteindre est reprsent la Figure4.4.
Figure4.4 Utilisation dune bote de dialogue Couleurs pour slectionner une couleur prdfinie ou personnalise.

Chapitre 4

Botes de dialogue communes 

159

Ralisation
Dfinissez un nouveau projet. Ajoutez le contrle ColorDialog1 dans la feuille de lapplication. Cliquez dessus et donnez-lui le nom CMD (proprit Name). Dfinissez deux boutons de commande et une zone de texte. Nommez les deux boutons Couleur et Quitter (proprit Caption). Dfinissez enfin le titre de la bote de dialogue: Choix dune couleur (proprit Caption de la bote de dialogue). La feuille du projet doit maintenant ressembler la Figure4.5.
Figure4.5 La bote de dialogue du projet, en mode Cration.

Affectez prsent des lignes de code aux deux boutons de commande. La procdure associe au bouton Quitter comprend une seule instruction qui met fin au programme:
Private Sub Command2_Click() End End Sub

La procdure associe au bouton Couleur est plus complexe. Double-cliquez sur le bouton Couleur et dfinissez les lignes de code suivantes:
Private Sub Command1_Click() If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then TextBox1.Text = "Le code RGB de la couleur est : R=" + Str(CMD.Color.R) + " V=" + Str(CMD.Color.G) + " B=" + Str(CMD.Color.B) Else TextBox1.Text = "Aucune couleur na t slectionne" EndIf End Sub

La procdure consiste en une seule instruction If Then Else:


If CMD.ShowDialog() = Windows.Forms.DialogResult.OK

1. Ce contrle se trouve sous longlet Botes de dialogue de la Bote outils.

160

Visual Basic 2010

Si lutilisateur clique sur le bouton OK pour quitter la bote de dialogue Couleurs, la procdure CMD.ShowDialog() renvoie la valeur Windows.Forms.DialogResult.OK. Le code qui suit linstruction Then est donc excut:
TextBox1.Text = "Le code RGB de la couleur est : R=" + Str(CMD.Color.R) + " V=" + Str(CMD.Color.G) + " B=" + Str(CMD.Color.B)

La zone de texte TextBox1 affiche les valeurs RGB de la couleur slectionne par lutilisateur. Notez la simplicit avec laquelle les trois composantes sont extraites de lobjet Color. Si lutilisateur clique sur le bouton Annuler pour quitter la bote de dialogue Couleurs, la condition suivant linstruction If nest pas vrifie. Le code suivant linstruction Else est donc excut:
TextBox1.Text = "Aucune couleur na t slectionne"

Ce code affiche un message indiquant quaucune couleur na t slectionne dans la bote de dialogue Couleurs. Pour initialiser la couleur dun objet, il suffit de transmettre ses composantes Rouge, Vert et Bleu la fonction RGB:
Objet.Color = RGB(Composante Rouge, Composante Vert, Composante Bleu)

Info

Ce projet se trouve dans le dossier Couleur aprs installation des sources de louvrage.

La bote de dialogue Police de caractres


La bote de dialogue Police de caractres permet de slectionner une police et ses attributs. Elle est attache la mthode ShowDialog. Tout comme pour les autres botes de dialogue communes, il est possible de connatre le bouton sur lequel lutilisateur a cliqu lors de la fermeture de la bote de dialogue, en contrlant la valeur renvoye par la fonction ShowDialog(). Les objets manipuls par la bote de dialogue Police de caractres sont de type Font. Voici leurs principales proprits:
Proprit
Font.Bold Font.Italic Font.Name

Effet
Dfinit le style Gras Dfinit le style Italique Dfinit la police

Chapitre 4


Effet
Dfinit la taille

Botes de dialogue communes 

161

Proprit
Font.Size Font.Strikeout Font.Underline

Dfinit le style Barr Dfinit le style Soulign

Exemple
Nous allons dfinir un projet qui permettra lutilisateur de slectionner une police, un style, une taille et des effets. Le rsultat atteindre est montr la Figure4.6.
Figure4.6 Utilisation de la bote de dialogue Police de caractres pour slectionner une police et ses attributs.

Ralisation
Dfinissez un nouveau projet. Ajoutez le contrle FontDialog1 dans la feuille de lappli cation. Cliquez dessus et donnez-lui le nom CMD (proprit Name). Dfinissez deux boutons de commande et une zone de texte. Nommez les deux boutons Police et Quitter (proprit Caption). Dfinissez enfin le titre de la bote de dialogue : Choix dune police (proprit Caption de la bote de dialogue).
1. Ce contrle se trouve sous longlet Botes de dialogue de la Bote outils.

162

Visual Basic 2010

La feuille du projet doit maintenant ressembler la Figure4.7.


Figure4.7 La bote de dialogue du projet, en mode Cration.

Vous allez prsent affecter des lignes de code aux deux boutons de commande. La procdure associe au clic sur le bouton Quitter se contente dexcuter linstruction End pour mettre fin au programme. La procdure associe au bouton Police est plus complexe. Double-cliquez sur le bouton Police et dfinissez les lignes de code suivantes:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Dim tampon As String If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then Tampon = "Police " + CMD.Font.Name + ", " + Str(CMD.Font.Size) + " points " If CMD.Font.Bold = True Then Tampon = Tampon + "gras " If CMD.Font.Italic = True Then Tampon = Tampon + "italique " If CMD.Font.Underline = True Then Tampon = Tampon + "soulign " If CMD.Font.Strikeout = True Then Tampon = Tampon + "barr " TextBox1.Text = Tampon Else TextBox1.Text = "Vous navez slectionn aucune police." End If End Sub

Aprs avoir dfini la variable String Tampon:


Dim tampon As String

la bote de dialogue FontDialog saffiche. Une instruction If permet de connatre le bouton cliqu par lutilisateur lors de la fermeture de la bote de dialogue:
If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then

Si le bouton OK est cliqu, un texte indiquant les caractristiques de la police slectionne est calcul dans la variable Tampon:

Chapitre 4

Botes de dialogue communes 

163

Tampon = "Police " + CMD.Font.Name + ", " + Str(CMD.Font.Size) + " points " If CMD.Font.Bold = True Then Tampon = Tampon + "gras " If CMD.Font.Italic = True Then Tampon = Tampon + "italique " If CMD.Font.Underline = True Then Tampon = Tampon + "soulign " If CMD.Font.Strikeout = True Then Tampon = Tampon + "barr "

Les lments suivants sont extraits de lobjet CMD.Font:

Nom de la police. Name. Taille des caractres, en points. Size. Attributs des caractres. Bold, Italic, Underline et Strikeout.
TextBox1.Text = Tampon

Le contenu de la variable Tampon apparat dans le contrle TextBox: Si lutilisateur clique sur le bouton Annuler, un message indiquant quaucune police na t slectionne saffiche dans le contrle TextBox:
Else TextBox1.Text = "Vous navez slectionn aucune police."

Ce projet se trouve dans le dossier Police aprs installation des sources de louvrage.

La bote de dialogue Imprimer


La bote de dialogue Imprimer est utilise pour dfinir les paramtres de limpression: nom de limprimante, nombre de copies, numros des pages imprimer, etc. Si ncessaire, ces paramtres peuvent devenir les paramtres dimpression par dfaut. Cette bote est attache la mthode ShowDialog. Tout comme pour les autres botes de dialogue communes, il est possible de connatre le bouton cliqu par lutilisateur la fermeture de la bote de dialogue, en contrlant la valeur renvoye par la fonction ShowDialog(). Plusieurs proprits peuvent tre initialises avant dappeler la mthode ShowDialog pour modifier lapparence de la bote de dialogue Imprimer:
Proprit
PrinterSettings.Copies PrinterSettings.PrintToFile AllowCurrentPage AllowPrintToFile

Effet
Nombre dexemplaires imprimer. tat de la case cocher Imprimer dans un fichier. Affichage du contrle Page en cours. Affichage du contrle Imprimer dans un fichier.

164

Visual Basic 2010

Proprit
AllowSelection AllowSomePages PrinterSettings.MaximumPage PrinterSettings.MinimumPage PrinterSettings.FromPage PrinterSettings.ToPage

Effet
Affichage du contrle Slection. Affichage du contrle Pages. Le plus grand numro de page que lutilisateur peut entrer dans la zone de texte A. Le plus petit numro de page que lutilisateur peut entrer dans la zone de texte De. Numro de la premire page imprimer. Numro de la dernire page imprimer.

Une fois que les proprits de votre choix ont t renseignes, un appel la mthode ShowDialog() affiche la bote de dialogue Imprimer. Aprs la fermeture de cette bote, vous pouvez utiliser les proprits PrinterSettings.Copies, PrinterSettings.FromPage, PrinterSettings.ToPage, PrinterSettings.MaximumPage et PrinterSettings.MinimumPage pour connatre les paramtres slectionns par lutilisateur.

Exemple
Nous allons dfinir un projet qui permettra lutilisateur de modifier le paramtrage par dfaut de limpression et, ventuellement, de choisir une autre imprimante. Lobjectif atteindre est reprsent la Figure4.8.
Figure4.8 Utilisation des botes de dialogue Impression et Configuration de limpression pour modifier le paramtrage par dfaut de limprimante.

Chapitre 4

Botes de dialogue communes 

165

Ralisation
Dfinissez un nouveau projet. Ajoutez le contrle PrintDialog dans la feuille de lappli cation. Cliquez dessus et donnez-lui le nom CMD (proprit Name). Dfinissez deux boutons de commande et une zone de texte. Nommez les deux boutons Paramtres dimpression et Quitter (proprit Caption). Dfinissez enfin le titre de la bote de dialogue: Paramtres dimpression (proprit Caption de la bote de dialogue). La feuille du projet doit maintenant ressembler la Figure4.9.
Figure4.9 La bote de dialogue du projet, en mode Cration.

Ensuite, affectez des lignes de code aux deux boutons de commande. Comme dans les miniapplications prcdentes, la procdure associe au clic sur le bouton Quitter se contente dexcuter linstruction End pour mettre fin au programme. La procdure associe au bouton Paramtres dimpression est plus complexe:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click CMD.PrinterSettings.Copies = 3 Trois copies par dfaut CMD.AllowCurrentPage = True Bouton Tout affich CMD.AllowPrintToFile = True Option Impression dans un fichier affiche CMD.PrinterSettings.PrintToFile = False Option Impression dans un fichier dcoche par dfaut CMD.AllowSelection = True Bouton Slection affich CMD.AllowSomePages = True Bouton Pages affich If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then TextBox1.Text = "Paramtres enregistrs." Else TextBox1.Text = "Les paramtres nont pas t pris en compte." End If End Sub

166

Visual Basic 2010

Le premier bloc dinstructions dfinit les options de la bote de dialogue Imprimer:


CMD.PrinterSettings.Copies = 3 Trois copies par dfaut CMD.AllowCurrentPage = True Bouton Tout affich CMD.AllowPrintToFile = True Option Impression dans un fichier affiche CMD.PrinterSettings.PrintToFile = False Option Impression dans un fichier dcoche par dfaut CMD.AllowSelection = True Bouton Slection affich CMD.AllowSomePages = True Bouton Pages affich

La bote de dialogue Imprimer apparat en appelant la mthode ShowDialog(). Si lutilisateur clique sur le bouton OK, ShowDialog renvoie la valeur Windows.Forms.DialogResult.
OK:
If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then

Dans ce cas, un message indiquant que le paramtrage a t pris en compte saffiche dans la zone de texte:
TextBox1.Text = "Paramtres enregistrs."

Si le bouton Annuler est choisi par lutilisateur, un message indiquant que le paramtrage na pas t pris en compte saffiche dans la zone de texte:
Else TextBox1.Text = "Les paramtres nont pas t pris en compte."

Cette application se trouve dans le dossier Imprimer aprs installation des sources de louvrage.

La bote de dialogue Rechercher un dossier


La bote de dialogue Rechercher un dossier est utilise pour slectionner un dossier sur les disques de lordinateur local ou sur le rseau. Sil le souhaite, lutilisateur peut galement crer un nouveau dossier et lui donner le nom de son choix. Tout comme pour les autres botes de dialogue communes, il est possible de connatre le bouton cliqu par lutilisateur la fermeture de la bote de dialogue, en contrlant la valeur renvoye par la fonction ShowDialog().

Exemple
Nous allons dfinir un projet qui permettra lutilisateur de dsigner un dossier de son choix et, ventuellement, de crer un nouveau dossier. Lobjectif atteindre est reprsent la Figure4.10.

Chapitre 4

Botes de dialogue communes 

167

Figure4.10 Utilisation de la bote de dialogue commune Rechercher un dossier.

Ralisation
Dfinissez un nouveau projet. Ajoutez le contrle FolderBrowserDialog dans la feuille de lapplication. Cliquez dessus et donnez-lui le nom CMD (proprit Name). Dfinissez deux boutons de commande et une zone de texte. Nommez les deux boutons Rechercher et Quitter (proprit Caption). Dfinissez enfin le titre de la bote de dialogue: Rechercher un dossier (proprit Caption de la bote de dialogue). La feuille du projet doit maintenant ressembler la Figure4.11.
Figure4.11 La bote de dialogue du projet, en mode Cration.

Vous allez donner vie aux deux boutons de commande en leur affectant des lignes de code. Comme dans les mini-applications prcdentes, la procdure associe au clic sur le bouton Quitter se contente dexcuter linstruction End pour mettre fin au programme.

168

Visual Basic 2010

La procdure associe au bouton Rechercher est plus complexe:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click CMD.Description = "Choisissez un dossier" CMD.ShowNewFolderButton = True CMD.RootFolder = Environment.SpecialFolder.MyDocuments If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then TextBox1.Text = CMD.SelectedPath Else TextBox1.Text = "Aucun dossier na t slectionn" End If End Sub

Les trois premires instructions initialisent la bote de dialogue Rechercher un dossier:


CMD.Description = "Choisissez un dossier" CMD.ShowNewFolderButton = True CMD.RootFolder = Environment.SpecialFolder.MyDocuments

La proprit Description dfinit le texte affich dans la partie suprieure de la bote de dialogue. La proprit ShowNewFolderButton indique si le bouton Crer un nouveau dossier doit tre affich (True) ou masqu (False). Enfin, la proprit RootFolder dtermine le dossier affich la racine de larborescence. SpecialFolder donne accs de nombreux dossiers spciaux, tels que Application Data, Desktop, Favorites, History, My Documents, My Pictures, Program Files, StartMenu, etc. Linstruction suivante teste la valeur renvoye par la fonction ShowDialog() pour connatre le bouton cliqu par lutilisateur pour fermer la bote de dialogue Rechercher un dossier:
If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then

Si le bouton OK a t cliqu, le dossier slectionn saffiche dans la zone de texte TextBox1:


TextBox1.Text = CMD.SelectedPath

Dans le cas contraire, un message indiquant quaucun dossier na t slectionn apparat dans la zone de texte TextBox1:
Else TextBox1.Text = "Aucun dossier na t slectionn"

Cette application se trouve dans le dossier Project\OuvrirDossier des sources de louvrage.

5
Un peu plus loin
Par lintermdiaire de trois exemples, ce chapitre vous montre quel point Visual Basic 2010 facilite laccs aux fonctionnalits avances de Windows. Dans un premier temps, vous apprendrez raliser une application MDI qui manipule plusieurs fentres enfants. En vous servant des autres chapitres du livre et en y ajoutant quelques instructions de votre cru, vous pourrez la transformer en un bloc-notes volu, un logiciel de traitement dimages, un navigateur web, ou tout autre application dans laquelle plusieurs fentres de document peuvent tre ouvertes. Dans un deuxime temps, vous ferez connaissance avec le systme daffichage GDI+ et vous verrez comment utiliser certaines de ses fonctions pour afficher du texte sous une forme graphique dans la feuille dune application Visual Basic 2010. Enfin, vous apprendrez manipuler le presse-papiers de Windows, en utilisant les procdures et fonctions traditionnelles de lenvironnement .NET, ou par lintermdiaire de lespace de nom My, apparu avec la version2.0 de .NET.

Une application MDI


Certaines applications Windows ne peuvent manipuler quune seule fentre la fois. Cest le cas de lapplication graphique Microsoft Paint, livre en standard depuis la version 95 de Windows. Dautres applications, comme le clbre Word pour Windows, autorisent

170

Visual Basic 2010

ouverture simultane de plusieurs documents. Cette possibilit est intressante plus l dun titre, en particulier: Elle facilite les copier-coller entre documents. Elle permet de voir plusieurs parties dun mme document. Elle permet de construire un document en ayant un ou plusieurs autres documents sous les yeux. En utilisant Visual Basic 2010, il est trs simple de dfinir des applications comprenant plusieurs documents. Ces applications sont dites MDI (Multiple Document Interface). Elles partagent en gnral un systme de menus, une barre doutils et/ou une barre dtat. Les fentres dun document sont galement appeles fentres enfants (child). La fentre de base, qui contient le systme de menus, la barre doutils et la barre dtat, est la fentre parent. Pour concevoir une application MDI, vous devez au minimum dfinir une feuille parent et une feuille enfant. Chaque document ouvert ou cr dans lapplication utilisera la mme feuille parent en arrire-plan et une feuille enfant personnelle lintrieur de la feuille parent. La fentre parent est une feuille Visual Basic traditionnelle pour laquelle la proprit IsMDIContainer a t initialise True. La fentre enfant est matrialise par une feuille Windows Form traditionnelle.

Cration dun formulaire parent


Le formulaire MDI parent est le fondement dune application MDI. Il donne accs et contient toutes les fentres MDI enfants. Pour dfinir un formulaire MDI parent, commencez par crer une nouvelle application avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Lentre Visual Basic/Windows tant slectionne sous Modles installs, choisissez le modle Application Windows Forms, nommez le projet Bloc Notes et validez en cliquant sur OK. Dans la fentre des proprits, attribuez la valeur True la proprit IsMDIContainer. Cette simple action dsigne le formulaire en cours ddition comme un conteneur MDI de fentres enfants. Ajoutez un contrle MenuStrip au formulaire et dfinissez le menu suivant:
lment de menu principal
Fichier Fichier Fentre

lment de menu secondaire


Nouveau Quitter

Chapitre 5

Un peu plus loin

171

La commande de menu Fichier/Nouveau sera utilise pour crer des fentres enfants, et le menu Fentre, pour basculer entre les diverses fentres enfants ouvertes. Cliquez sur le contrle MenuStrip dans la feuille de lapplication et affectez la valeur FentreToolStripMenuItem sa proprit MdiWindowListItem. Cette simple action affecte au menu Fentre la liste des fentres MDI enfants ouvertes et indique par une coche la fentre enfant active.

Cration dun modle de fentre enfant


Lancez la commande Ajouter un formulaire Windows dans le menu Projet pour ajouter un nouveau formulaire au projet. Choisissez Windows Form dans la bote de dialogue Ajouter un nouvel lment, donnez le nom Modle Enfant au nouveau formulaire et cliquez sur Ajouter. Faites glisser un contrle RichTextBoxControl de la Bote outils jusquau nouveau formulaire. Dans la fentre des proprits, droulez la liste Dock et cliquez sur le rectangle central (voir Figure5.1). Cette action affecte la valeur Fill la proprit Dock et la valeur Top, Left la proprit Anchor. Le contrle RichTextBox remplira totalement la zone du formulaire MDI enfant, mme si ce dernier est redimensionn.
Figure5.1 Cliquez ici pour maximiser le contrle RichTextBox.

Droulez le menu Fichier dans la feuille de lapplication et double-cliquez sur la commande Nouveau. Cette action affiche le squelette de la procdure NouveauToolStripMenuItem_ Click(). Compltez cette procdure comme suit:
Private Sub NouveauToolStripMenuItem_Click(ByVal sender As System.Object,

172

Visual Basic 2010

ByVal e As System.EventArgs) Handles NouveauToolStripMenuItem.Click Dim NewMDIChild As New Modle_Enfant NewMDIChild.MdiParent = Me NewMDIChild.Show() End Sub

La premire ligne dfinit lobjet fentre fille MDI NewMDIChild:


Dim NewMDIChild As New Form2()

La deuxime instruction associe la fentre fille avec le conteneur mre:


NewMDIChild.MDIParent = Me

Enfin, la troisime instruction affiche la fentre fille lintrieur de la fentre mre:


NewMDIChild.Show()

Pour complter le programme, droulez le menu Fichier dans la feuille de lapplication et double-cliquez sur la commande Quitter. Compltez la procdure QuitterToolStripMenuItem_Click() comme suit:
Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click End End Sub

Vous pouvez maintenant compiler et lancer lapplication en appuyant sur la touche F5. La commande Fichier/Nouveau affiche une fentre fille dans la fentre principale de lapplication. Si vous ouvrez plusieurs fentres avec cette commande, vous pouvez utiliser le menu Fentres pour basculer de lune lautre (voir Figure5.2).
Figure5.2 Deux fentres filles ont t ouvertes dans cette application MDI.

Chapitre 5

Un peu plus loin

173

Le code de lapplication se rduit aux deux procdures vnementielles NouveauTool StripMenuItem_Click () et QuitterToolStripMenuItem_Click (). Lapplication se trouve dans le dossier Bloc Notes aprs installation des sources de louvrage:
Public Class Form1 Private Sub NouveauToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NouveauToolStripMenuItem.Click Dim NewMDIChild As New Modle_Enfant NewMDIChild.MdiParent = Me NewMDIChild.Show() End Sub Private Sub QuitterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterToolStripMenuItem.Click End End Sub End Class

Polices de caractres
Les polices installes relvent de la classe FontFamily et laffichage de texte utilise le systme daffichage GDI+. Pour mieux comprendre comment utiliser ces deux lments, nous allons dfinir un petit projet dans lequel les polices installes seront accessibles travers une liste droulante. Lorsque lutilisateur slectionnera une entre dans cette liste, un texte de corps20 saffichera dans la police choisie (voir Figure5.3).
Figure5.3 Le programme Polices de caractres en mode Excution.

174

Visual Basic 2010

Dfinissez un nouveau projet avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows. Choisissez le modle Application Windows Forms et validez. Ajoutez un Label, un ComboBox et un contrle Button la feuille du projet. Modifiez les proprits de ces contrles comme suit:
Contrle
Form1 Label1 Button1

Proprit
Text Text Text

Valeur
Polices de caractres Choisissez une police Quitter

Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim strFonts As New Collections.ArrayList(10) Dim Font As FontFamily For Each Font In FontFamily.Families strFonts.Add(Font.Name) Next ComboBox1.DataSource = strFonts End Sub

La premire instruction dfinit lobjet collection strFonts, dans lequel seront stocks les noms des polices installes:
Dim strFonts As New Collections.ArrayList(10)

La deuxime instruction dfinit lobjet FontFamily Font, qui sera utilis pour accder chacune des polices installes:
Dim Font As FontFamily

Pour parcourir toutes les polices installes, le plus simple consiste utiliser une instruction For Each:
For Each Font In FontFamily.Families

Le nom de chacune des polices est alors ajout la collection strFonts:


strFonts.Add(Font.Name)

Chapitre 5

Un peu plus loin

175

Lorsque toutes les polices ont t parcourues, la liste droulante est remplie en initialisant sa proprit DataSource avec la collection strFonts:
Next ComboBox1.DataSource = strFonts

Pour tre en mesure de faire rfrence aux fonctions de manipulation de texte de GDI+, vous devez inclure une instruction Imports en tte de code:
Imports System.Drawing

Dfinissez galement lobjet Graphics g, juste aprs la dclaration de classe Public Class Form1. Cet objet sera utilis pour raliser laffichage du texte:
Dim g As Graphics

Pour tre en mesure dafficher un texte ds le lancement du programme, vous allez dfinir la procdure Form1_Paint(). Slectionnez lentre (Form1 Evnements) dans la premire la procliste droulante de la fentre de code et lentre Paint dans la seconde. Compltez dure Form1_Paint comme suit:
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms. PaintEventArgs) Handles MyBase.Paint g = Me.CreateGraphics g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1. Text, 20), Brushes.Black, New PointF(30, 100)) End Sub

La premire instruction donne accs au systme graphique g:


g = Me.CreateGraphics

La seconde instruction utilise la procdure DrawString() pour afficher du texte dans la fentre:
g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), Brushes.Black, New PointF(30, 100))

La procdure DrawString() existe en plusieurs dclinaisons:


DrawString(str, DrawString(str, DrawString(Str, DrawString(Str, DrawString(Str, DrawString(Str, police, police, police, police, police, police, pinceau, pinceau, pinceau, pinceau, pinceau, pinceau, PF) RF) PF, RF, Sx, Sx,

Format) Format) Sy) Sy, Format)

Voici la signification des arguments de cette procdure:

str est la chane afficher.

176

Visual Basic 2010

police est le nom de la police utiliser. pinceau est le pinceau avec lequel les caractres doivent tre peints. PF est une rfrence un objet PointF qui identifie le coin suprieur gauche de la zone de trac. RF est une rfrence un objet RectangleF qui identifie la zone de trac (coordonnes du point suprieur gauche, longueur et hauteur). Sx et Sy sont les coordonnes Single du coin suprieur gauche de la zone de trac. Format est une rfrence un objet StringFormat qui spcifie le format daffichage

(espacement, alignement, etc.).

Dans cet exemple, la procdure DrawString() est utilise dans sa plus simple expression. Remarquez la dfinition de la police et de lobjet PointF, directement dans lappel la procdure:
g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), Brushes.Black, New PointF(30, 100))

Pour modifier laffichage lorsque lutilisateur slectionne une police dans la liste droulante, nous allons utiliser des instructions du mme type. Double-cliquez sur le contrle ComboBox1 et compltez la procdure ComboBox1_SelectedIndexChanged() comme suit:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged g = Me.CreateGraphics g.Clear(Me.BackColor) g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1. Text, 20), Brushes.Black, New PointF(30, 100)) End Sub

La premire instruction donne accs lobjet graphique g:


g = Me.CreateGraphics

Pour ne pas interfrer avec laffichage prcdent, la zone graphique de la fentre est efface laide de la procdure Clear(). La couleur utilise est la couleur de fond actuelle (Me. BackColor):
g.Clear(Me.BackColor)

Enfin, un appel la procdure DrawString() affiche le nouveau texte en utilisant la police slectionne:
g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), Brushes.Black, New PointF(30, 100))

Chapitre 5

Un peu plus loin

177

Pour terminer cette application, double-cliquez sur le bouton de commande et ajoutez une instruction End dans la procdure Button1_Click():
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub

Voici le listing complet de lapplication. Vous trouverez les fichiers correspondants dans le dossier Polices aprs installation des sources de louvrage.
Imports System.Drawing Public Class Form1 Dim g As Graphics Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dim strFonts As New Collections.ArrayList(10) Dim Font As FontFamily For Each Font In FontFamily.Families strFonts.Add(Font.Name) Next ComboBox1.DataSource = strFonts End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged g = Me.CreateGraphics g.Clear(Me.BackColor) g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), Brushes.Black, New PointF(30, 100)) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows. Forms.PaintEventArgs) Handles MyBase.Paint g = Me.CreateGraphics g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), Brushes.Black, New PointF(30, 100)) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click End End Sub End Class

178

Visual Basic 2010

Les possibilits offertes par GDI+ au niveau des polices de caractres sont trs tendues. Il est par exemple possible deffectuer des rotations ou des inclinaisons sur le texte ou encore dutiliser un pinceau non uniforme pour dessiner les caractres. Les rotations et inclinaisons se font laide de la procdure RotateTransform(). Par exemple, linstruction suivante provoque une inclinaison de 45degrs du texte:
G.RotateTransform(45)

Pour utiliser un pinceau non uniforme, il suffit de le dfinir comme tel. titre dexemple, linstruction suivante dfinit un objet Bitmap partir du fichier c:\test\colorwir.bmp:
Dim Bmap = New Bitmap("C:\\test\\colorwir.bmp")

Cet objet Bitmap est utilis pour dfinir un pinceau TextureBrush B:


Dim B = New TextureBrush(Bmap)

Il suffit maintenant dutiliser ce pinceau dans la procdure DrawString() pour obtenir un texte textur:
g.DrawString(ComboBox1.Text, New Font(ComboBox1.Text, 120, FontStyle.Bold), B, New PointF(30, 60))

La Figure 5.4 reprsente leffet obtenu dans le programme prcdent lorsque la police Agency FB est slectionne.
Figure5.4 Un exemple de texturage laide dun fichier bitmap.

Voici le code de lapplication. Les fichiers correspondants se trouvent dans le dossier Polices2 aprs installation des sources de louvrage:
Imports System.Drawing.Text

Public Class Form1 Dim g As Graphics

Chapitre 5


Dim Bmap = New Bitmap("C:\\test\\colorwir.bmp") Dim B = New TextureBrush(Bmap)

Un peu plus loin

179

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dim strFonts As New Collections.ArrayList(10) Dim Font As FontFamily For Each Font In FontFamily.Families strFonts.Add(Font.Name) Next ComboBox1.DataSource = strFonts End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged g = Me.CreateGraphics g.Clear(Me.BackColor) g.DrawString(ComboBox1.Text, New Font(ComboBox1.Text, 120, FontStyle. Bold), B, New PointF(30, 60)) End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows. Forms.PaintEventArgs) Handles MyBase.Paint g = Me.CreateGraphics g.DrawString(ComboBox1.Text, New Font(ComboBox1.Text, 120, FontStyle. Bold), B, New PointF(30, 60)) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click End End Sub End Class

Le Presse-papiers
Pour accder au presse-papiers de Windows, vous pouvez utiliser:

les procdures et fonctions traditionnelles de .NET, telles que SetDataObject() et GetDataObject(); les procdures et fonctions apparues dans la version 2.0 de .NET, relatives lobjet My.Computer.Clipboard.

Nous allons examiner ces deux approches dans les pages suivantes.

180

Visual Basic 2010

Accs traditionnel au presse-papiers


Visual Basic 2010 possde un certain nombre de fonctions qui lui permettent de manipuler le presse-papiers de Windows:

SetDataObject() place un objet dans le presse-papiers. GetDataObject().GetDataPresent("typeObjet") permet de tester le type de lobjet

prsent dans le presse-papiers.


GetDataObject().GetData("typeObjet") permet de rcuprer le contenu du pressepapiers sous la forme dun objet dont le type est spcifi dans la fonction GetData().

Lapplication dveloppe dans ce chapitre montre comment copier un objet bitmap dans le presse-papiers, le rcuprer et laffecter un contrle PictureBox. Dfinissez un nouveau projet de type Application Windows Forms avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Lentre Visual Basic/Windows tant slectionne dans le volet gauche, choisissez le modle Application Windows Forms, nommez le projet OutilsEtat et validez en cliquant sur OK. Ajoutez un contrle PictureBox sur la feuille du projet. Maximisez la taille de ce contrle en donnant la valeur Fill sa proprit Dock (pour cela, dveloppez la liste droulante de la proprit Dock et cliquez sur le rectangle central). Affectez une image quelconque au contrle PictureBox par lintermdiaire de sa proprit Image (dans cet exemple, le programme utilise les images Colorwir.bmp et Vide.bmp, qui se trouvent dans le dossier Presse papiers aprs installation des sources de louvrage). Ajoutez un contrle ContextMenuStrip au projet et dfinissez les entres de menu suivantes: Couper, Copier, Coller, Effacer et Quitter. Renommez ces commandes limage de leurs noms respectifs (la proprit Name de la commande Couper est initialise "Couper", la proprit Nom de la commande Coller est initialise "Coller", etc.). Pour rendre le menu oprationnel, vous devez modifier la proprit ContextMenuStrip des objets sur lesquels vous voulez lutiliser. Slectionnez Form1 dans la fentre des proprits et affectez la valeur ContextMenuStrip1 la proprit ContextMenuStrip. Double-cliquez sur la commande Couper et compltez la procdure Couper_Click() comme suit:
Private Sub Couper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Couper.Click Clipboard.SetDataObject(PictureBox1.Image) PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub

La premire instruction place le contenu de limage (Picture1.Image) dans le pressepapiers (Clipboard.SetDataObject()). La deuxime instruction affecte limage blanche c:\vide.bmp au contrle PictureBox1.

Chapitre 5

Un peu plus loin

181

Double-cliquez sur la commande Copier et compltez la procdure Copier_Click() comme suit:


Private Sub Copier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Copier.Click Clipboard.SetDataObject(PictureBox1.Image) End Sub

Cette procdure ressemble Couper_Click(). Mais ici, aprs la copie de limage dans le presse-papiers, le contrle PictureBox nest pas effac. Double-cliquez sur la commande Coller. La procdure Coller_Click() est lgrement plus complexe que les prcdentes:
Private Sub Coller_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Coller.Click If (Clipboard.GetDataObject().GetDataPresent("Bitmap")) Then PictureBox1.Image = (Clipboard.GetDataObject().GetData("Bitmap")) End If End Sub

Linstruction if teste le contenu du presse-papiers laide de la fonction GetDataObject(). GetDataPresent("Bitmap").


If (Clipboard.GetDataObject().GetDataPresent("Bitmap")) Then

Si la valeur True est renvoye par cette fonction, cela signifie que le contenu du presse-papiers est bien de type bitmap. Dans ce cas, la fonction GetDataObject().GetData("Bitmap") rcupre le contenu du presse-papiers et laffecte au contrle PictureBox:
PictureBox1.Image = (Clipboard.GetDataObject().GetData("Bitmap"))

Double-cliquez sur la commande Effacer et compltez la procdure Effacer_Click() comme suit:


Private Sub Effacer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Effacer.Click PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub

Cette procdure se contente de copier limage blanche c:\vide.bmp dans le contrle PictureBox afin de leffacer. Double-cliquez enfin sur la commande Quitter et ajoutez le mot End la procdure
Quitter_Click():
Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System .EventArgs) Handles Quitter.Click End End Sub

182

Visual Basic 2010

Voici le listing complet du programme. Vous trouverez les fichiers correspondants dans le dossier Presse papiers aprs installation des sources de louvrage.
Public Class Form1 Private Sub Couper_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Couper.Click Clipboard.SetDataObject(PictureBox1.Image) PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub Private Sub Effacer_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Effacer.Click PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub Private Sub Copier_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Copier.Click Clipboard.SetDataObject(PictureBox1.Image) End Sub Private Sub Coller_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Coller.Click If (Clipboard.GetDataObject().GetDataPresent("Bitmap")) Then PictureBox1.Image = (Clipboard.GetDataObject().GetData("Bitmap")) End If End Sub Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Quitter.Click End End Sub End Class

Accs au presse-papiers via .NET 4.0


Dupliquez le contenu du dossier Presse papiers dans le dossier Presse papiers2. Ouvrez la solution Presse papiers.sln du dossier Presse papiers2. Pour utiliser les procdures et fonction de .NET4.0, vous allez modifier les procdures vnementielles de lapplication. Lancez la commande Code dans le menu Affichage (ou appuyez sur la touche F7). Modifiez la procdure Couper_Click() comme suit:
Private Sub Couper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Couper.Click

Chapitre 5

Un peu plus loin

183

My.Computer.Clipboard.SetImage(PictureBox1.Image) PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub

La premire instruction place le contenu du contrle PictureBox dans le presse-papiers laide de la procdure SetImage(). La seconde instruction copie le contenu du fichier c:\vide.bmp dans le contrle PictureBox. Vous allez maintenant modifier la procdure Copier_Click() comme suit:
Private Sub Copier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Copier.Click My.Computer.Clipboard.SetImage(PictureBox1.Image) End Sub

Lunique instruction de cette procdure copie le contenu du contrle PictureBox dans le presse-papiers laide de la procdure SetImage(). La dernire action va consister modifier la procdure Coller_Click():
Private Sub Coller_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Coller.Click If (My.Computer.Clipboard.ContainsImage) Then PictureBox1.Image = My.Computer.Clipboard.GetImage() End If End Sub

Linstruction If teste si le presse-papiers contient un objet graphique:


If (My.Computer.Clipboard.ContainsImage) Then

Dans laffirmative, cet objet est affect au presse-papiers:


PictureBox1.Image = My.Computer.Clipboard.GetImage()

Les procdures Effacer_Click() et Quitter_Click() ne changent pas, car elles utilisent des instructions Visual Basic traditionnelles. Voici le listing complet de lapplication. Les fichiers correspondants se trouvent dans le dossier Projects\Presse papiers2 des sources de louvrage.
Public Class Form1 Private Sub Couper_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Couper.Click My.Computer.Clipboard.SetImage(PictureBox1.Image) PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub

184

Visual Basic 2010

Private Sub Copier_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Copier.Click My.Computer.Clipboard.SetImage(PictureBox1.Image) End Sub Private Sub Coller_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Coller.Click If (My.Computer.Clipboard.ContainsImage) Then PictureBox1.Image = My.Computer.Clipboard.GetImage() End If End Sub Private Sub Effacer_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Effacer.Click PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Quitter.Click End End Sub End Class

6
Implmenter des menus
Les menus traditionnels et contextuels sont banaliss sous la forme de simples contrles dans la Bote outils. Dans les pages qui suivent, nous allons crer deux applications. La premire permettra de tracer des ronds et des carrs par lintermdiaire dun systme de menus et la seconde, par lintermdiaire dun menu contextuel.

Systme de menus traditionnel


Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Lentre Visual Basic/Windows tant slectionne dans le volet gauche, choisissez le modle Application Windows Forms, nommez le projet Menu et validez en cliquant sur OK. Insrez un contrle MenuStrip sur la feuille de lapplication. Ce contrle est automatiquement report dans la partie infrieure de la fentre, sous la forme dune icne intitule MenuStrip1. Cliquez sur cette icne et dfinissez les entres principales et secondaires du menu, directement sur la feuille de lapplication:

186

Visual Basic 2010

Commandes principales
Tracer Rond Carr Quitter

Commandes secondaires
Rond et Carr Rouge et Bleu Rouge et Bleu Application

Nous allons associer les raccourcis clavier Ctrl+R et Ctrl+C aux commandes Tracer/Rond et Tracer/Carr. Pour cela:

Cliquez sur lentre secondaire Rond sous Tracer et affectez la valeur Ctrl+R la proprit ShortcutKeys. Cliquez sur lentre secondaire Carr sous Tracer et affectez la valeur Ctrl+C la proprit ShortcutKeys.

Pour vous aider dans la saisie des raccourcis clavier, le plus simple consiste cliquer sur la flche situe droite de la valeur de la proprit ShortcutKey et utiliser la bote de saisie affiche (voir Figure6.1).
Figure6.1 Saisie dun raccourci-clavier.

Le raccourci-clavier saffiche droite de la commande de menu, juste aprs sa saisie (voir Figure6.2).

Chapitre 6

Implmenter des menus

187

Figure6.2 Les deux raccourcis clavier apparaissent en clair.

Par dfaut, la commande secondaire Rond doit tre valide. Cette affectation par dfaut sera signale par une coche devant la commande secondaire Rond. Cliquez sur cette commande et affectez la valeur True la proprit Checked. Cliquez sur la commande principale Carr et affectez la valeur False la proprit Visible pour cacher le menu Carr par dfaut. Pour faciliter la comprhension du listing, vous allez redfinir le nom des commandes de menu comme suit:
Commande
Tracer/Rond Tracer/Carr Rond Carr Rond/Rouge Rond/Bleu Quitter/Application

Proprit Name
TracerRond TracerCarr Rond Carr RondRouge RondBleu QuitterApplication

Nous allons maintenant affecter du code aux commandes de menu. Double-cliquez sur la commande secondaire Tracer/Rond et compltez la procdure TracerRond_Click() comme suit:
Private Sub TracerRond_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles TracerRond.Click TracerRond.Checked = True TracerCarr.Checked = False Rond.Visible = True Carr.Visible = False End Sub

188

Visual Basic 2010

Cette procdure affiche une coche devant la commande secondaire Tracer/Rond, supprime lventuelle coche devant la commande secondaire Tracer/Carr, active le menu principal Rond et cache le menu principal Carr. Double-cliquez sur la commande secondaire Tracer/Carr et compltez la procdure TracerCarr_Click() comme suit:
Private Sub TracerCarr_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles TracerCarr.Click TracerRond.Checked = False TracerCarr.Checked = True Rond.Visible = False Carr.Visible = True End Sub

Cette procdure effectue des actions analogues la prcdente: suppression de la coche devant la commande secondaire Tracer/Rond, affichage dune coche devant la commande secondaire Tracer/Carr, dissimulation de la commande principale Rond et affichage de la commande principale Carr. Construit sur GDI+, le systme Windows Forms donne accs une bibliothque dimagerie graphique et de texte 2-D et 3-D trs fournie. Pour tre en mesure dafficher des lments graphiques dans une feuille, vous devez dfinir un objet Graphics avec la fonction CreateGraphics(). Double-cliquez sur un emplacement libre de la feuille et compltez la procdure Form1_ Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load G = Me.CreateGraphics() End Sub

Lunique instruction de cette procdure dfinit lobjet graphique G. Remarquez lutilisation du mot-cl Me pour rfrencer linstance de la classe en cours dexcution. Pour complter cette procdure, dfinissez lobjet G, dans les premires lignes du code:
Dim G As Graphics

Lobjet graphique G ayant t dfini et implment, double-cliquez sur la commande secondaire Rond/Rouge et compltez la procdure RondRouge_Click() comme suit:
Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As System. EventArgs)Handles RondRouge.Click Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100)

Chapitre 6

Implmenter des menus

189

Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.Black, 3) G.DrawEllipse(Pen, rect) Remplissage du cercle Dim brBrush = New SolidBrush(Color.Red) G.FillEllipse(brBrush, rect) End Sub

La premire ligne dfinit le rectangle dans lequel sinscrit le cercle tracer:


Dim rect As New Rectangle(50, 50, 100, 100)

La deuxime instruction efface le contenu de la fentre afin de ne pas gner le trac en cours. Remarquez lutilisation du mot-cl Me pour rfrencer la fentre en cours dexcution:
G.Clear(Me.BackColor)

Le bloc dinstructions suivant dfinit la couleur du crayon et trace un cercle laide de la fonction DrawEllipse():
Dim Pen As New Pen(Color.Black, 3) G.DrawEllipse(Pen, rect)

Le dernier bloc dinstructions dfinit la couleur de remplissage brBrush et utilise la fonction FillEllipse() pour remplir le cercle:
Dim brBrush = New SolidBrush(Color.Red) G.FillEllipse(brBrush, rect)

Double-cliquez sur la commande secondaire Rond/Bleu et compltez la procdure RondBleu_Click() comme suit:
Private Sub RondBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles RondBleu.Click Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.White, 3) G.DrawEllipse(Pen, rect)

190

Visual Basic 2010

Remplissage du cercle Dim brBrush = New SolidBrush(Color.Blue) G.FillEllipse(brBrush, rect) End Sub

Comme vous pouvez le voir, le code de cette procdure est trs proche de celui de RondRouge_Click(). Seules les couleurs du crayon et du remplissage changent. Nous ny reviendrons pas. Double-cliquez sur la commande secondaire Carr/Rouge et compltez la procdure CarrRouge_Click() comme suit:
Private Sub CarrRouge_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles CarrRouge.Click Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.Black, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect) End Sub

Aprs avoir effac le contenu de la fentre:


G.Clear(Me.BackColor)

La couleur noire est affecte au crayon:


Dim Pen As New Pen(Color.Black, 3)

Un objet rect de type Rectangle est alors dfini et le carr rect est trac en utilisant le crayon Pen:
Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect)

Le dernier bloc dinstructions dfinit la couleur de remplissage dans lobjet brBrush et utilise cet objet pour remplir le carr laide de la fonction FillRectangle():
Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect)

Chapitre 6

Implmenter des menus

191

Double-cliquez sur la commande secondaire Carr/Bleu et compltez la procdure CarrBleu_Click() comme suit:
Private Sub CarrBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles CarrBleu.Click Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.White, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Blue) G.FillRectangle(brBrush, rect) End Sub

Le code de cette procdure est trs proche de celui de CarrRouge_Click(). Seules les couleurs du crayon et du remplissage changent. Nous ny reviendrons pas. Enfin, double-cliquez sur la commande secondaire Quitter/Application et ajoutez une instruction End la procdure QuitterApplication_Click():
Private Sub QuitterApplication_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterApplication.Click End End Sub

Voici le listing complet de lapplication. Le code gnr par Form Designer a t masqu. Seul son en-tte apparat en caractres italiques. Cette application se trouve dans le dossier Menu aprs installation des sources de louvrage.
Public Class Form1 Dim G As Graphics Private Sub MenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles MenuStrip1. ItemClicked End Sub Private Sub TracerRond_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TracerRond.Click TracerRond.Checked = True TracerCarr.Checked = False

192

Visual Basic 2010

Rond.Visible = True Carr.Visible = False End Sub Private Sub TracerCarr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TracerCarr.Click TracerRond.Checked = False TracerCarr.Checked = True Rond.Visible = False Carr.Visible = True End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dfinition de lobjet graphique G = Me.CreateGraphics() End Sub Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RondRouge.Click Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.Black, 3) G.DrawEllipse(Pen, rect) Remplissage du cercle Dim brBrush = New SolidBrush(Color.Red) G.FillEllipse(brBrush, rect) End Sub Private Sub RondBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles RondBleu.Click Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle

Chapitre 6


Dim Pen As New Pen(Color.White, 3) G.DrawEllipse(Pen, rect) Remplissage du cercle Dim brBrush = New SolidBrush(Color.Blue) G.FillEllipse(brBrush, rect) End Sub

Implmenter des menus

193

Private Sub CarrRouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CarrRouge.Click Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.Black, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect) End Sub Private Sub CarrBleu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CarrBleu.Click Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.White, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Blue) G.FillRectangle(brBrush, rect) End Sub Private Sub QuitterApplication_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterApplication.Click End End Sub End Class

Cette application se trouve dans le dossier Menu aprs installation des sources de louvrage.

194

Visual Basic 2010

Menu contextuel
Nous allons tendre les fonctionnalits de lapplication prcdente en lui ajoutant un menu contextuel. Ce menu contiendra deux entres : Rouge et Bleu. En fonction de lentre slectionne sous le menu Tracer, un rond ou un carr bleu ou rouge apparat dans la feuille. Pour mettre en place le menu contextuel, insrez un contrle ContextMenuStrip sur la feuille de lapplication. Ce contrle est automatiquement report dans la partie infrieure de la fentre sous la forme dune icne intitule ContextMenuStrip1. Cliquez sur cette icne et dfinissez les deux entres du menu: Rouge et Bleu. Pour faciliter la comprhension du code, renommez ces deux entres (proprit Name) en Context Rouge et ContextBleu. Si vous excutez lapplication, vous verrez que le menu contextuel nest pas actif lorsque vous cliquez du bouton droit de la souris. Pour le rendre oprationnel, vous devez modifier la proprit ContextMenuStrip du ou des objets sur lesquels vous voulez lutiliser. Cliquez sur un endroit inoccup de la feuille et affectez la valeur ContextMenuStrip1 la proprit ContextMenuStrip. Pour complter lapplication, il ne reste plus qu dfinir les procdures vnementielles associes aux deux entres du menu contextuel. Ces procdures utilisent le mme code que les procdures vnementielles du systme de menus. Pour viter une redondance dans le code, vous allez dfinir les quatre procdures suivantes:
Private Sub TracerRondRouge() Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.Black, 3) G.DrawEllipse(Pen, rect) Remplissage du cercle Dim brBrush = New SolidBrush(Color.Red) G.FillEllipse(brBrush, rect) End Sub Private Sub TracerRondBleu() Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100)

Chapitre 6


Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.White, 3) G.DrawEllipse(Pen, rect)

Implmenter des menus

195

Remplissage du cercle Dim brBrush = New SolidBrush(Color.Blue) G.FillEllipse(brBrush, rect) End Sub Private Sub TracerCarrRouge() Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.Black, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect) End Sub Private Sub TracerCarrBleu() Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.White, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Blue) G.FillRectangle(brBrush, rect) End Sub

Remplacez maintenant le code des procdures RondRouge_Click(), RondBleu_Click(), CarrRouge_Click() et CarrBleu_Click() par des appels aux procdures qui viennent dtre dfinies:
Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles RondRouge.Click

196

Visual Basic 2010

TracerRondRouge() End Sub Private Sub RondBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles RondBleu.Click TracerRondBleu() End Sub Private Sub CarrRouge_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles CarrRouge.Click TracerCarrRouge() End Sub Private Sub CarrBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles CarrBleu.Click TracerCarrBleu() End Sub

Vous allez maintenant dfinir le code associ aux entres du menu contextuel. Cliquez si ncessaire sur licne ContextMenu1 pour afficher le menu contextuel puis double-cliquez sur lentre Rouge. Compltez la procdure ContextRouge_Click() comme suit:
Private Sub ContextRouge_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles ContextRouge.Click If (TracerRond.Checked = True) Then TracerRondRouge() Else TracerCarrRouge() End Sub

Lunique instruction de cette procdure affiche un rond rouge ou un carr rouge en fonction de ltat de la commande Tracer/Rond. Double-cliquez sur lentre Bleu du menu contextuel. Compltez la procdure ContextBleu_Click() comme suit:
Private Sub ContextBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles ContextBleu.Click If (TracerRond.Checked = True) Then TracerRondBleu() Else TracerCarrBleu() End Sub

Cette procdure est comparable la prcdente ceci prs quelle appelle TracerRondBleu() ou TracerCarrBleu() en fonction de lentre slectionne dans le menu Tracer. Lapplication est entirement oprationnelle. Elle se trouve dans le dossier Menu2 aprs installation des sources de louvrage:
Public Class Form1 Dim G As Graphics

Chapitre 6

Implmenter des menus

197

Private Sub TracerRondRouge() Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.Black, 3) G.DrawEllipse(Pen, rect) Remplissage du cercle Dim brBrush = New SolidBrush(Color.Red) G.FillEllipse(brBrush, rect) End Sub Private Sub TracerRondBleu() Cration du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) Effacement de la fentre G.Clear(Me.BackColor) Affichage du cercle Dim Pen As New Pen(Color.White, 3) G.DrawEllipse(Pen, rect) Remplissage du cercle Dim brBrush = New SolidBrush(Color.Blue) G.FillEllipse(brBrush, rect) End Sub Private Sub TracerCarrRouge() Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.Black, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr

198

Visual Basic 2010

Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect) End Sub Private Sub TracerCarrBleu() Effacement de la fentre G.Clear(Me.BackColor) Affichage du carr Dim Pen As New Pen(Color.White, 3) Dim rect As New Rectangle(50, 50, 100, 100) G.DrawRectangle(Pen, rect) Remplissage du carr Dim brBrush = New SolidBrush(Color.Blue) G.FillRectangle(brBrush, rect) End Sub Private Sub TracerRond_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TracerRond.Click TracerRond.Checked = True TracerCarr.Checked = False Rond.Visible = True Carr.Visible = False End Sub Private Sub TracerCarr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TracerCarr.Click TracerRond.Checked = False TracerCarr.Checked = True Rond.Visible = False Carr.Visible = True End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dfinition de lobjet graphique G = Me.CreateGraphics() End Sub Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RondRouge.Click TracerRondRouge() End Sub

Chapitre 6

Implmenter des menus

199

Private Sub RondBleu_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles RondBleu.Click TracerRondBleu() End Sub Private Sub CarrRouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CarrRouge.Click TracerCarrRouge() End Sub Private Sub CarrBleu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CarrBleu.Click TracerCarrBleu() End Sub Private Sub QuitterApplication_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles QuitterApplication.Click End End Sub Private Sub ContextRouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ContextRouge.Click If (TracerRond.Checked = True) Then TracerRondRouge() Else TracerCarrRouge() End Sub Private Sub ContextBleu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ContextBleu.Click If (TracerRond.Checked = True) Then TracerRondBleu() Else TracerCarrBleu() End Sub End Class

7
Barres doutils et barres dtat
Ce chapitre prsente une application de dessin bitmap qui implmente une barre doutils et une barre dtat. La barre doutils donne accs quatre fonctions qui permettent de dessiner main leve, de tracer des segments de droites, des rectangles et des ellipses. La barre dtat indique en permanence loutil actif (voir Figure7.1).
Figure7.1 Lapplication de dessin, en mode Excution.

202

Visual Basic 2010

Cette application utilise: un contrle ToolStrip pour implmenter la barre doutils; un contrle StatusStrip pour implmenter la barre dtat; un contrle ImageList pour stocker les images qui doivent safficher dans la barre doutils.

Le contrle ImageList
Avant dimplanter la barre doutils dans lapplication, vous devez crer les icnes qui doivent y tre affiches et les stocker dans un contrle ImageList. Utilisez une application graphique quelconque (Paint, Paint Shop Pro, PhotoShop, etc.) pour crer les icnes ou pour les capturer dans une autre application. Sauvegardez ces icnes au format BMP, GIF, JPG, PNG, ICO, EMF ou WMF. Crez un nouveau projet avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Lentre Visual Basic/Windows tant slectionne dans le volet gauche, choisissez le modle Application Windows Forms, nommez le projet OutilsEtat et validez en cliquant sur OK. Insrez un contrle ImageList sur la feuille du projet. Ce contrle apparat en dessous de la feuille. Cliquez dessus puis cliquez sur la proprit Images pour faire apparatre un bouton contenant trois points de suspension. Cliquez sur ce bouton. Ajoutez les quatre images du dossier OutilsEtat laide du bouton Ajouter. La bote de dialogue diteur de collections Images doit maintenant se prsenter comme montr la Figure7.2.
Figure7.2 Les quatre images ont t insres dans la collection.

Fermez la bote de dialogue diteur de collections Images en cliquant sur OK. Les icnes sont maintenant prtes tre insres dans la barre doutils.

Chapitre 7

Barres doutils et barres dtat 

203

Mise en place de la barre doutils


Insrez un contrle ToolStrip dans la feuille de lapplication. Ce contrle apparat automatiquement sous la forme dune bande horizontale dans la partie suprieure de la feuille. Cliquez sur licne affiche dans la partie gauche de la barre doutils et slectionnez Button (voir Figure7.3).
Figure7.3 Cration dune nouvelle icne dans la barre doutils.

Procdez de mme pour ajouter trois nouvelles icnes dans la barre doutils. La feuille de lapplication doit maintenant ressembler la Figure7.4.
Figure7.4 Quatre icnes ont t insres dans la barre doutils.

Vous allez affecter les images i1.gif i4.gif du dossier OutilsEtat ces quatre icnes. Cliquez sur la premire icne, puis sur la proprit Image dans la fentre des proprits. Un bouton contenant trois points de suspension saffiche en face de la proprit Image. Cliquez sur ce bouton. Une bote de dialogue intitule Slectionner une ressource apparat (voir Figure7.5).

204

Visual Basic 2010

Figure7.5 Cette bote de dialogue permet daffecter une image aux icnes de la barre doutils.

Cliquez sur le bouton Importer dans le groupe doptions Contexte de la ressource et dsignez le fichier i1.gif du dossier OutilsEtat. Validez en cliquant sur le bouton OK, puis nouveau sur le bouton OK pour fermer la bote de dialogue Slectionner une ressource. Les icnes peuvent galement tre incluses dans un fichier de ressources attach lapplication. Pour cela, il suffit de slectionner loption Fichier de ressources du projet et de dsigner licne en cliquant sur le bouton Importer.

Info

Recommencez la manipulation qui vient dtre dcrite pour affecter les images i2.gif, i3.gif et i4.gif aux trois autres icnes de la barre doutils. Une fois fait, la feuille de lapplication doit ressembler la Figure7.6.
Figure7.6 Les quatre icnes de la barre doutils ont lapparence souhaite.

Chapitre 7

Barres doutils et barres dtat 

205

Info

Larrire-plan des images i1.gif i4.gif a t dfini comme couleur de transparence. Cest la raison pour laquelle ces images sintgrent parfaitement dans la couleur darrire-plan de la barre doutils.

Pour terminer la dfinition de la barre doutils, modifiez la proprit Text des quatre icnes:
Icne
1 2 3 4

Proprit Text
Crayon Trait Rectangle Ellipse

Mise en place de la barre dtat


Insrez un contrle StatusStrip dans la feuille de lapplication. Ce contrle saffiche automatiquement sous la forme dune bande horizontale dans la partie infrieure de la feuille. Cliquez sur le contrle StatusStrip dans la feuille de lapplication. Une icne apparat dans la partie gauche du contrle. Cliquez dessus et slectionnez StatusLabel dans le menu (voir Figure7.7).
Figure7.7 Insertion dun contrle texte dans la barre dtat.

206

Visual Basic 2010

Insrez le texte Slectionnez un outil dans la proprit Text du contrle ToolStrip StatusLabel1 qui vient dtre cr. Tous les contrles ont t placs dans la feuille de lapplication. Vous allez maintenant mettre en place les procdures vnementielles qui donneront vie lapplication.

criture du code
Dfinissez les variables qui seront utilises dans le programme en tte de code:
Dim Dim Dim Dim Dim Dim G As Graphics AncX, AncY As Single OutilEnCours As Integer pen As New pen(Color.Black) br = New SolidBrush(Color.Red) Trac As Boolean

Double-cliquez sur une partie libre de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load G = Me.CreateGraphics() Trac = False End Sub

La premire instruction instancie lobjet Graphics G. La deuxime instruction initialise False la variable Trac, qui sera utilise par la suite pour activer (True) ou dsactiver (False) le trac. Double-cliquez sur la barre doutils et compltez la procdure ToolStrip1_ItemClicked() comme suit:
Private Sub ToolStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStrip1. ItemClicked Select Case e.ClickedItem.Text Case "Crayon" ToolStripStatusLabel1.Text = "Outil Crayon actif" OutilEnCours = 0 Case "Trait" ToolStripStatusLabel1.Text = "Outil Trait actif" OutilEnCours = 1 Case "Rectangle"

Chapitre 7

Barres doutils et barres dtat 

207

ToolStripStatusLabel1.Text = "Outil Rectangle actif" OutilEnCours = 2 Case "Ellipse" ToolStripStatusLabel1.Text = "Outil Ellipse actif" OutilEnCours = 3 End Select End Sub

La proprit e.ClickedItem.Text de lobjet e renvoie la valeur Text de licne clique. En utilisant une structure Select Case portant sur cette proprit, il est donc trs simple deffectuer les tches correspondant lactivation de chaque outil. Ces tches consistent en laffichage dun message dans la barre dtat et en la mmorisation du bouton sur lequel on a appuy dans la variable OutilEnCours. Pour complter le programme, vous allez maintenant dfinir le code correspondant aux vnements souris MouseDown, MouseMove et MouseUp. Dfinissez la procdure Form1_MouseDown() comme suit:
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseDown Trac = True AncX = e.X AncY = e.Y End Sub

Cette procdure est active chaque fois quun bouton de la souris est enfonc. Elle initialise la variable Trac True pour valider lutilisation de loutil Crayon:
Trac = True

Elle initialise galement les variables AncX et AncY avec la position actuelle de la souris:
AncX = e.X AncY = e.Y

Dfinissez la procdure Form1_MouseMove() comme suit:


Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseMove If (OutilEnCours = 0) And (Trac = True) Then G.DrawLine(pen, AncX, AncY, e.X, e.Y) AncX = e.X AncY = e.Y End If End Sub

208

Visual Basic 2010

Cette procdure est active chaque dplacement de la souris. Elle nest utilise que lorsque loutil Crayon est actif, et uniquement si le trac est autoris:
If (OutilEnCours = 0) And (Trac = True) Then

Dans ce cas, une ligne droite est trace entre le point dont les coordonnes sont mmorises dans les variables AncX et AncY et la position courante de la souris:
G.DrawLine(pen, AncX, AncY, e.X, e.Y)

Les coordonnes courantes de la souris sont alors mmorises dans les variables AncX et AncY:
AncX = e.X AncY = e.Y

Dfinissez enfin la procdure Form1_MouseUp() comme suit:


Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseUp Trac = False Select Case OutilEnCours Case 1 G.DrawLine(pen, AncX, AncY, e.X, e.Y) Case 2 G.DrawRectangle(pen, AncX, AncY, e.X - AncX, e.Y - AncY) G.FillRectangle(br, AncX, AncY, e.X - AncX, e.Y - AncY) Case 3 G.DrawEllipse(pen, AncX, AncY, e.X - AncX, e.Y - AncY) G.FillEllipse(br, AncX, AncY, e.X - AncX, e.Y - AncY) End Select End Sub

Lors du relchement de la souris, la variable Trac est initialise False pour interdire tout trac avec le crayon. Les oprations effectuer si un autre outil est slectionn sont dfinies laide dune instruction Select Case:

Si loutil Trait est slectionn, un trait de couleur noire (Dim pen As New pen(Color. Black)) est trac entre les anciennes coordonnes et les coordonnes actuelles:
Case 1 G.DrawLine(pen, AncX, AncY, e.X, e.Y)

Si loutil Rectangle est slectionn, un rectangle noir est trac (DrawRectangle) et rempli (FillRectangle):

Chapitre 7

Barres doutils et barres dtat 

209

Case 2 G.DrawRectangle(pen, AncX, AncY, e.X - AncX, e.Y - AncY) G.FillRectangle(br, AncX, AncY, e.X - AncX, e.Y - AncY)

Enfin, si loutil Ellipse est slectionn, une ellipse noire est trace (DrawEllipse) et remplie (FillEllipse):
Case 3 G.DrawEllipse(pen, AncX, AncY, e.X - AncX, e.Y - AncY) G.FillEllipse(br, AncX, AncY, e.X - AncX, e.Y - AncY)

Lapplication se trouve dans le dossier OutilsEtat aprs installation des sources de louvrage. Voici son listing complet.

Public Class Form1 Dim G As Graphics Dim AncX, AncY As Single Dim OutilEnCours As Integer Dim pen As New Pen(Color.Black) Dim br = New SolidBrush(Color.Red) Dim Trac As Boolean Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load G = Me.CreateGraphics() Trac = False End Sub Private Sub ToolStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStrip1. ItemClicked Select Case e.ClickedItem.Text Case "Crayon" ToolStripStatusLabel1.Text = "Outil Crayon actif" OutilEnCours = 0 Case "Trait" ToolStripStatusLabel1.Text = "Outil Trait actif" OutilEnCours = 1 Case "Rectangle" ToolStripStatusLabel1.Text = "Outil Rectangle actif" OutilEnCours = 2

210

Visual Basic 2010

Case "Ellipse" ToolStripStatusLabel1.Text = "Outil Ellipse actif" OutilEnCours = 3 End Select End Sub Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseDown Trac = True AncX = e.X AncY = e.Y End Sub Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseMove If (OutilEnCours = 0) And (Trac = True) Then G.DrawLine(pen, AncX, AncY, e.X, e.Y) AncX = e.X AncY = e.Y End If End Sub Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ MyBase.MouseUp Trac = False Select Case OutilEnCours Case 1 G.DrawLine(pen, AncX, AncY, e.X, e.Y) Case 2 G.DrawRectangle(pen, AncX, AncY, e.X - AncX, e.Y - AncY) G.FillRectangle(br, AncX, AncY, e.X - AncX, e.Y - AncY) Case 3 G.DrawEllipse(pen, AncX, AncY, e.X - AncX, e.Y - AncY) G.FillEllipse(br, AncX, AncY, e.X - AncX, e.Y - AncY) End Select End Sub End Class

Chapitre 7

Barres doutils et barres dtat 

211

Plus loin avec les contrles ToolStrip


Le contrle ToolStrip a t introduit dans le .NET Framework 2.0. Dans la section prcdente, nous lavons utilis pour mettre en place une barre doutils conventionnelle. Lorsque vous avez dfini les quatre icnes de la barre doutils, vous vous tes peut-tre demand quoi pouvaient bien servir les diffrents lments proposs dans le menu droulant (voir Figure7.8).
Figure7.8 Les boutons ne sont pas les seuls lments pouvant tre insrs dans un menu ToolStrip.

Vous le voyez la Figure7.8, les lments de base pouvant tre insrs dans un menu sont les suivants:

Icne. ToolStripButton; Texte. ToolStripLabel; Liste droulante. ToolStripSplitButton et ToolStripDropDownButton; Sparateur. ToolStripSeparator; Liste modifiable. ToolStripComboBox; Zone de texte. ToolStripTextBox; Barre de progression. ToolStripProgressBar. Le texte affich dans le contrle Label doit tre plac dans la proprit Text du contrle ToolStripLabel. Les lments contenus dans les contrles ToolStripSplitButton et ToolStrip DropDownButton peuvent tre insrs dans la feuille de lapplication, aprs avoir cliqu sur le contrle correspondant et dvelopp sa proprit DropDownItems (voir Figure7.9).

Limplmentation de ces contrles ne reprsente aucune difficult majeure:

212

Visual Basic 2010

Figure7.9 Les ToolStrip(Split/ DropDown)Button peuvent contenir un ou plusieurs MenuItem, ComboBox, Separator et TextBox.

Les lments des contrles ComboBox sont dfinis lors de ldition (proprit Items) ou dans le code [procdure ToolStripCombobox1.Items.Add()]. Le texte affich dans un contrle TextBox peut tre dfini lors de la conception en utilisant la proprit Text. Il peut galement tre saisi par lutilisateur. La valeur entre au clavier se trouve dans cette mme proprit Text. La proprit Value dun contrle ProgressBar dfinit (et permet de connatre) la taille de la barre de progression. Pour accder la procdure vnementielle associe un contrle insr dans un Tool Strip, il suffit de double-cliquer sur ce contrle.

8
Manipulation dobjets graphiques
Ce chapitre est ddi la manipulation dobjets graphiques par lintermdiaire des mthodes de lAPI GDI+ (Graphical Device Interface). La premire section prsente les principales mthodes de cette API. Vous saurez ainsi afficher des points, tracer des droites et des courbes, choisir une couleur de trac ou de remplissage, utiliser un stylet et une brosse. La deuxime section montre comment raliser un conomiseur dcran. Celui-ci entrera automatiquement en action au bout dun dlai paramtrable de non-activit du clavier et de la souris. La troisime section explique comment afficher une horloge du plus bel effet. Vous apprendrez faire bouger ses aiguilles en transformant lheure systme en coordonnes dans le plan. Enfin, la quatrime section montre comment effectuer une copie dcran partielle ou totale. Limage rcupre apparatra dans un contrle PictureBox et pourra tre stocke sur le disque dur dans un fichier BMP.

214

Visual Basic 2010

Le systme daffichage graphique GDI+


Laffichage graphique dans une feuille Visual Basic 2010 repose sur la bibliothque de fonctions GDI+ (Graphical Device Interface +). Grce cette bibliothque, la programmation graphique est indpendante de la configuration matrielle de lordinateur. Llment principal de GDI+ est la classe Graphics qui fournit des mthodes permettant de tracer trs simplement des primitives graphiques (points, droites, polygones, ellipses, etc.). Un objet Graphics peut reprsenter une image ou la surface dun contrle. Avant de pouvoir dessiner, vous devez dfinir un tel objet et linstancier. Par exemple, pour dessiner sur un formulaire, servez-vous du code suivant:
Dim g as Graphics = Me.CreateGraphics

et de celui-ci pour dessiner sur un contrle Panel:


Dim g as Graphics = panel1.CreateGraphics

Cette premire tape franchie, vous pouvez dessiner sur lobjet g en utilisant les mthodes du tableau ci-aprs.
Mthode
DrawArc DrawCurve DrawEllipse DrawIcon DrawImage DrawLine DrawPie DrawPolygon DrawRectangle DrawString

Effet
Trace un arc dellipse. Trace une courbe qui passe par les points spcifis en argument. Trace une ellipse. Affiche une icne. Affiche une image. Trace un trait. Trace un camembert. Trace un polygone. Trace un rectangle. Affiche un texte.

Certaines de ces mthodes ncessitent la cration dobjets annexes, tels que le point, le rectangle, la couleur, le stylet, la brosse, la couleur et/ou la police. Voyons comment dfinir et instancier ces objets.

Chapitre 8

Manipulation dobjets graphiques

215

Point
Pour dfinir un point, il suffit dinvoquer lune des procdures Point() ou PointF() en spcifiant ses coordonnes:
Dim p As New Point(X, Y)

o X et Y sont des valeurs entires qui reprsentent labscisse et lordonne du point;


Dim p As New PointF(X, Y)

o X et Y sont des valeurs Single qui reprsentent labscisse et lordonne du point.

Rectangle
Pour dfinir un rectangle, il suffit dinvoquer lune des procdures Rectangle() ou RectangleF() en indiquant les coordonnes de deux de ses cts opposs:
Dim r as New Rectangle(X1, Y1, X2, Y2)

o X1 et Y1 sont des valeurs entires qui reprsentent labscisse et lordonne dun des angles du rectangle, et X2 et Y2 des valeurs entires qui reprsentent labscisse et lordonne de langle oppos;
Dim r as New RectangleF(X1, Y1, X2, Y2)

o X1 et Y1 sont des valeurs Single qui reprsentent labscisse et lordonne dun des angles du rectangle, et X2 et Y2 des valeurs Single qui reprsentent labscisse et lordonne de langle oppos.

Couleur
La couleur dun objet peut tre choisie parmi un grand nombre de couleurs prdfinies: AliceBlue, AntiqueWhite, Aqua, AquaMarine, Azure, Beige, Bisque, Black, BlanchetAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chartreuse, Chocolate, Coral, ComflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue, DarkCyan, DarkGoldenrod, DarkGray, DarkGreen, DarkKhaki, DarkMagenta, DarkOliveGreen, DarkOrange, DarkOrchid, DarkRed, DarkSalmon, etc. Pour accder lune de ces couleurs, il suffit dutiliser la fonction Intellisense de Visual Studio (voir Figure8.1).

216

Visual Basic 2010

Figure8.1 Il est trs simple daccder aux couleurs prdfinies.

Stylet
Le stylet est utilis pour dessiner des lignes, des arcs, des rectangles et des secteurs. Vous le dfinirez en utilisant une des trois instructions suivantes:
Dim nom As New Pen(couleur) Dim nom As New Pen(couleur, paisseur) Dim nom As New Pen(brosse, paisseur)

o:

nom est le nom du stylet; couleur est la couleur du stylet; paisseur est lpaisseur du trait, en pixels; brosse est la brosse utiliser.

Pour visualiser toutes les couleurs prdfinies, nous allons crer une petite application. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom CouleursPredefinies lapplication et validez en cliquant sur OK. Modifiez les proprits de lobjet Form1 comme indiqu dans le tableau ci-aprs.
Proprit
FormBorderStyle Text BackColor Size.Width Size.Height

Valeur
FixedDialog

Liste alphabtique des couleurs prdfinies de lobjet Color Window 640 480

Chapitre 8

Manipulation dobjets graphiques

217

Lancez la commande Concepteur du menu Affichage. Cliquez sur licne vnements dans la fentre des Proprits et double-cliquez sur lvnement Paint. Compltez la procdure Form1_Paint() comme suit:
Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows. Forms.PaintEventArgs) Handles MyBase.Paint Dfinition du Type Color Dim colorType As Type = System.Drawing.Color.AliceBlue.GetType Obtention des proprits du type Color dans un tableau Dim Couleurs() As System.Reflection.PropertyInfo = colorType.GetProperties Dim Couleur As System.Reflection.PropertyInfo Dim Col As Integer = 0 Dim Lig As Integer = 0 Parcours des couleurs For Each Couleur In Couleurs Try Affichage dun rectangle rempli Dim rect As New Rectangle(Col * 125 + 15, Lig * 13 + 5, 10, 10) e.Graphics.FillRectangle(New SolidBrush(CType(Couleur.GetValue (colorType, Nothing), Color)), rect) e.Graphics.DrawRectangle(Pens.Black, rect) Affichage du nom de la couleur Couleur e.Graphics.DrawString(Couleur.Name, Me.Font, Brushes.Black, rect. Left + rect.Width + 5, rect.Top) Incrmentation des index de ligne et de colonne Lig = Lig + 1 If Lig >= 34 Then Lig = 0 Col = Col + 1 End If Catch ex As Exception End Try Next End Sub

Pour dfinir un objet reprsentant le type Color, il suffit dinterroger la fonction GetType sur un membre quelconque du type Color, par exemple AliceBlue:
Dim colorType As Type = System.Drawing.Color.AliceBlue.GetType

Lobjet colorType va nous permettre dobtenir la liste des membres du type Color en interrogeant la fonction GetProperties:
Dim Couleurs() As System.Reflection.PropertyInfo = colorType.GetProperties

218

Visual Basic 2010

Pour parcourir cette liste, il faut dfinir un objet de type System.Reflection.PropertyInfo:


Dim Couleur As System.Reflection.PropertyInfo

Aprs avoir dfini et initialis deux variables qui indiquent la colonne et la ligne daffichage de chacune des couleurs prdfinies:
Dim Col As Integer = 0 Dim Lig As Integer = 0

une boucle For Each parcourt les diffrentes couleurs du type Color:
For Each Couleur In Couleurs

Un bloc Try Catch End Try ralise laffichage:


Try ... Catch ex As Exception End Try

Dans un premier temps, lobjet Rectangle rect est dfini et instanci un emplacement calcul par lintermdiaire des variables Col et Lig:
Dim rect As New Rectangle(Col * 125 + 15, Lig * 13 + 5, 10, 10)

Il saffiche ensuite laide de la procdure FillRectangle():


e.Graphics.FillRectangle(New SolidBrush(CType(Couleur.GetValue(colorType, Nothing), Color)), rect)

puis dtour en noir laide de la procdure DrawRectangle():


e.Graphics.DrawRectangle(Pens.Black, rect)

Linstruction suivante affiche le nom de la couleur (Couleur.Name) droite du rectangle color:


e.Graphics.DrawString(Couleur.Name, Me.Font, Brushes.Black, rect.Left + rect. Width + 5, rect.Top)

Le parcours des couleurs se termine par lincrmentation des index de ligne et de colonne. Aprs plusieurs essais, il est apparu quune fentre de 640480 points pouvait contenir 34 lignes en utilisant la police et la taille de caractres par dfaut. Il convient donc de changer de colonne quand ce nombre est atteint:
Lig = Lig If Lig >= Lig = Col = End If + 1 34 Then 0 Col + 1

Chapitre 8

Manipulation dobjets graphiques

219

Vous pouvez excuter cette mini-application en appuyant sur la touche de fonction F5. Une fentre analogue celle montre la Figure8.2 apparat.
Figure8.2 Voici toutes les couleurs prdfinies de lobjet Color.

Cette application se trouve dans le dossier Projects\CouleursPredefinies des sources de louvrage.

Brosse
La brosse est utilise pour remplir des surfaces dlimites par un contour ferm. Le remplissage peut se faire avec:

une couleur unie:


Dim brosse = New SolidBrush(Couleur)

o Couleur est la couleur de remplissage, par exemple Color.AliceBlue ou Color. DarkSalmon;

un gradient (dgrad) de couleurs:


Dim brosse= New LinearGradientBrush(Rectangle,Couleur1, Couleur2, Type)

o Rectangle est la zone de rptition du gradient, Couleur1 la couleur de dpart du gradient, Couleur2 la couleur darrive du gradient et Type le type du gradient (Horizontal ou Vertical par exemple);

une image bitmap:


Dim brosse = New TextureBrush(Image)

220

Visual Basic 2010

o Image est limage bitmap utiliser;

des hachures:
Dim brosse = new HatchBrush(Style, Couleur)

o Style est le style des hachures (DiagonalCross, DottedGrid ou Horizontal par exemple) et Couleur la couleur des hachures (Color.Red ou Color.Blue par exemple). Pour illustrer de faon pratique la mise en uvre des brosses, vous allez crire une petite application. Lancez la commande Nouveau Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Brosse lapplication et validez. Longlet Form1.vb (Design) tant slectionn, cliquez sur licne vnements dans la fentre des proprits et double-cliquez sur lvnement Paint. Il ne vous reste plus qu complter la procdure Form1_Paint() comme suit:
Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows. Forms.PaintEventArgs) Handles MyBase.Paint Affichage dun rectangle plein Dim brosse1 = New SolidBrush(Color.Red) Dim rect1 As New Rectangle(10, 10, 190, 50) e.Graphics.FillRectangle(brosse1, rect1) e.Graphics.DrawRectangle(Pens.Black, rect1) Affichage dun rectangle avec un gradient gris vertical Dim rect2 As New Rectangle(10, 70, 50, 50) Dim brosse2 = New System.Drawing.Drawing2D.LinearGradientBrush(rect2, Color. White, Color.Black, Drawing2D.LinearGradientMode.Vertical) e.Graphics.FillRectangle(brosse2, rect2) e.Graphics.DrawRectangle(Pens.Black, rect2) Affichage dun rectangle avec un gradient de couleurs horizontal Dim rect2b As New Rectangle(80, 70, 50, 50) Dim brosse2b = New System.Drawing.Drawing2D.LinearGradientBrush(rect2, Color.Red, Color.Blue, Drawing2D.LinearGradientMode.Horizontal) e.Graphics.FillRectangle(brosse2b, rect2b) e.Graphics.DrawRectangle(Pens.Black, rect2b) Affichage dun rectangle avec un gradient de couleurs en diagonale Dim rect2c As New Rectangle(150, 70, 50, 50) Dim brosse2c = New System.Drawing.Drawing2D.LinearGradientBrush(rect2, Color.Yellow, Color.Green, Drawing2D.LinearGradientMode.ForwardDiagonal)

Chapitre 8

Manipulation dobjets graphiques

221

e.Graphics.FillRectangle(brosse2c, rect2c) e.Graphics.DrawRectangle(Pens.Black, rect2c) Affichage dun rectangle avec une image Dim rect3 As New Rectangle(10, 130, 190, 50) Dim brosse3 = New TextureBrush(My.Resources.colorwir) e.Graphics.FillRectangle(brosse3, rect3) e.Graphics.DrawRectangle(Pens.Black, rect3) Affichage dun rectangle hachur verticalement Dim rect4 As New Rectangle(10, 190, 50, 50) Dim brosse4 = New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle. DarkVertical, Color.Azure) e.Graphics.FillRectangle(brosse4, rect4) e.Graphics.DrawRectangle(Pens.Black, rect4) Affichage dun rectangle hachur horizontalement Dim rect5 As New Rectangle(80, 190, 50, 50) Dim brosse5 = New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle. DarkHorizontal, Color.Azure) e.Graphics.FillRectangle(brosse5, rect5) e.Graphics.DrawRectangle(Pens.Black, rect5) Affichage dun rectangle hachur en diagonale Dim rect6 As New Rectangle(150, 190, 50, 50) Dim brosse6 = New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle. DiagonalCross, Color.Azure) e.Graphics.FillRectangle(brosse6, rect6) e.Graphics.DrawRectangle(Pens.Black, rect6) End Sub

Cette procdure est lmentaire. Elle consiste en plusieurs blocs dinstructions chargs dafficher un rectangle rempli avec une couleur unie, une image, un gradient de couleurs ou des hachures. titre dexemple, examinons le bloc charg de laffichage dun rectangle hachur verticalement:
Dim rect4 As New Rectangle(10, 190, 50, 50) Dim brosse4 = New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle. DarkVertical, Color.Azure) e.Graphics.FillRectangle(brosse4, rect4) e.Graphics.DrawRectangle(Pens.Black, rect4)

La premire instruction dfinit le rectangle tracer:


Dim rect4 As New Rectangle(10, 190, 50, 50)

222

Visual Basic 2010

La deuxime instruction dfinit la brosse utiliser:


Dim brosse4 = New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle.DarkVertical, Color.Azure)

La troisime instruction trace le rectangle dfini dans la premire instruction en utilisant la brosse dfinie dans la deuxime instruction:
e.Graphics.FillRectangle(brosse4, rect4)

Enfin, la quatrime instruction dtoure ce rectangle en utilisant un pinceau noir:


e.Graphics.DrawRectangle(Pens.Black, rect4)

Info

Pour simplifier, vous pouvez viter lcriture des prfixes System.Drawing. Drawing2D (dans la dfinition de lobjet) et Drawing2D (dans le premier argument). Il suffit pour cela dinsrer une clause Imports System.Drawing. Drawing2D juste avant la ligne Public Class Form1.

Une fois le code saisi, appuyez sur la touche de fonction F5 pour excuter lapplication. Vous devriez obtenir une fentre proche de celle montre la Figure8.3.
Figure8.3 Le programme Brosse, en mode Excution.

Cette application se trouve dans le dossier Projects\Brosse des sources de louvrage.

Police
Les objets Font sont utiliss pour dfinir des textes destins tre affichs dans des objets Graphic. Pour dfinir un objet Font, vous utilisez la syntaxe suivante:
Dim f = New Font("Nom", Taille)

o Nom est le nom de la police utiliser et Taille la taille (Single) des caractres, en points.

Chapitre 8

Manipulation dobjets graphiques

223

Cette syntaxe admet de nombreuses surcharges. Vous pouvez en particulier prciser le style du texte:
Dim f = New Font("Nom", Taille, Style)

o Nom est le nom de la police utiliser, Taille la taille (Single) des caractres, en points, et Style le style du texte (FontStyle.Bold, FontStyle.Italic, FontStyle.Regular, FontStyle.Strikeout ou FontStyle.Underline). Pour de plus amples informations sur la manipulation des polices de caractres, reportezvous au Chapitre5.

Mise en place dun conomiseur dcran


Lorsquune mme image reste affiche pendant plusieurs heures lcran, les particules lmentaires responsables de laffichage ont tendance mmoriser linformation. Il en rsulte une trace indlbile qui se superpose aux lments affichs. Pour viter ce dsagrment, il suffit dutiliser un conomiseur dcran. Son principe est simple: au bout dune dure paramtrable de non-utilisation du clavier et de la souris, lconomiseur dcran sactive. Il affiche une image en mouvement, de faon que les pixels changent souvent de couleur. Laffichage normal redmarre ds que le clavier ou la souris sont actionns. Toutes les versions de Windows sont livres avec plusieurs conomiseurs dcran. Ceux-ci tant peu paramtrables, nous allons envisager la cration dun cran de veille en Visual Basic. Vous pourrez ensuite le personnaliser loisir. titre dexemple, nous allons voir comment tracer sur lcran des droites de longueur et de couleur alatoires tous les 1/100seconde au bout dun temps paramtrable.

Mise en place visuelle de lapplication


Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom EconomEcran la nouvelle application. Ajoutez un contrle Timer sur la feuille de ce projet et modifiez les proprits de la feuille comme suit:
Objet
Form1 Form1 Form1 Timer1 Timer1

Proprit
BackColor FormBorderStyle WindowState Enabled Interval

Valeur
Window None Maximised True 10

224

Visual Basic 2010

La feuille de lapplication doit maintenant ressembler la Figure8.4.


Figure8.4 La feuille de lapplication, en mode Conception.

Dfinition des procdures de traitement


Dans un premier temps, nous allons dfinir les objets utiliss par le programme:
Public Class Form1 Dim g As Graphics Dim X1, Y1, X2, Y2 As Integer Dim depart As Long

Lobjet g donnera accs au systme daffichage graphique. Les variables X1, Y1, X2 et Y2 permettront de calculer les coordonnes des droites alatoires traces sur lcran. Enfin, la variable depart permettra de mmoriser le "top dpart" depuis le lancement du programme ou le dernier mouvement de la souris. Pour faciliter la dfinition des couleurs de trac alatoires, nous allons dterminer la fonction Aleatoire() comme suit:
Private Aleatoire As Random = New Random(DateTime.Now.Millisecond)

Double-cliquez sur la feuille et compltez la procdure Form1_Load() comme suit:


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load g = Me.CreateGraphics()

Chapitre 8


depart = My.Computer.Clock.TickCount Cursor.Hide() End Sub

Manipulation dobjets graphiques

225

La premire instruction initialise lobjet graphique g:


g = Me.CreateGraphics()

La deuxime instruction mmorise le nombre de millisecondes coules depuis le dmarrage de lordinateur dans la variable depart:
depart = My.Computer.Clock.TickCount

Enfin, la troisime instruction masque le pointeur de la souris:


Cursor.Hide()

Basculez sur longlet Form1.vb (Design) dans Visual Studio. Cliquez sur licne Timer1, en dessous de la feuille de lapplication. Affichez les vnements lis au contrle Timer1 dans la fentre des proprits et double-cliquez sur la case situe droite de lvnement Tick. Cette action cre lossature de la procdure Timer1_Tick(), active toutes les Interval secondes (ici 10/1000, soit 1/100 seconde). Compltez la procdure Timer1_Tick() comme suit:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Timer1.Tick If (My.Computer.Clock.TickCount - depart) > 5000 Then Dim p As New Pen(Color.FromArgb(255, Aleatoire.Next(0, 255), Aleatoire. Next(0, 255), Aleatoire.Next(0, 255))) X1 = Aleatoire.Next(1, Me.Width) X2 = Aleatoire.Next(1, Me.Width) Y1 = Aleatoire.Next(1, Me.Height) Y2 = Aleatoire.Next(1, Me.Height) g.DrawLine(p, X1, Y1, X2, Y2) End If End Sub

La premire ligne teste sil sest coul plus de 5 secondes depuis le dmarrage de lapplication:
If (My.Computer.Clock.TickCount - depart) > 5000 Then

La fonction My.Computer.Clock.TickCount() renvoie le nombre de millisecondes coules depuis le dmarrage de lordinateur. Il suffit dy soustraire la valeur stocke dans la variable depart pour connatre le temps coul depuis le dmarrage de lapplication. Si ce temps est suprieur 5000millisecondes (5s), lconomiseur dcran se met en action1.
1. Cette temporisation est extrmement courte. Vous la repousserez 10, 20 ou 30min (respectivement 60000, 120000 ou 180000) pour une utilisation plus conventionnelle.

226

Visual Basic 2010

La couleur du Crayon est choisie alatoirement laide de la fonction FromArgb() laquelle on fournit trois arguments alatoires:
FromArgb(255, Aleatoire.Next(0, 255), Aleatoire.Next(0, 255), Aleatoire.Next(0, 255))

La valeur obtenue permet de choisir une couleur alatoire. Cette couleur est passe en argument de la fonction Pen afin de construire un nouvel objet Pen p:
Dim p As New Pen(Color.FromArgb(255, Aleatoire.Next(0, 255), Aleatoire.Next(0, 255), Aleatoire.Next(0, 255)))

Il ne reste plus qu tirer alatoirement les coordonnes de dbut et de fin de la droite que lon souhaite tracer:
X1 X2 Y1 Y2 = = = = Aleatoire.Next(1, Aleatoire.Next(1, Aleatoire.Next(1, Aleatoire.Next(1, Me.Width) Me.Width) Me.Height) Me.Height)

puis communiquer ces cinq paramtres la procdure DrawLine():


g.DrawLine(p, X1, Y1, X2, Y2)

Vous pouvez ds prsent tester cette application en appuyant sur la touche de fonction F5. Au bout de 5s, et tous les 1/100 secondes, une nouvelle droite de longueur et de couleur alatoires saffiche sur lcran. Nous allons ajouter quelques fonctions cet conomiseur dcran. Basculez sur longlet Form1.vb (Design) dans Visual Studio. Cliquez sur la feuille de lapplication. Affichez les vnements lis au contrle Form1 dans la fentre des proprits en cliquant sur licne vnements, puis double-cliquez sur la case situe droite de lvnement MouseMove. Cette action cre lossature de la procdure Form1_MouseMove(). Compltez cette procdure comme suit:
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows. Forms.MouseEventArgs) Handles Me.MouseMove depart = My.Computer.Clock.TickCount g.Clear(Color.White) End Sub

La premire instruction initialise la variable depart avec le nombre de millisecondes coules depuis le dmarrage de lordinateur. Laffichage des droites alatoires sera donc stopp pendant 5s:
depart = My.Computer.Clock.TickCount

La deuxime instruction efface le contenu de lcran:


g.Clear(Color.White)

Chapitre 8

Manipulation dobjets graphiques

227

Chaque fois que vous dplacerez la souris, le dcompte avant activation de lconomiseur dcran sera donc rinitialis et lcran sera effac. Basculez sur longlet Form1.vb (Design) dans Visual Studio. Cliquez sur la feuille de lapplication. Affichez les vnements lis au contrle Form1 dans la fentre des proprits en cliquant sur licne vnements, puis double-cliquez sur la case situe droite de lvnement KeyDown. Cette action cre lossature de la procdure Form1_KeyDown(). Compltez cette procdure comme suit:
Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows. Forms.KeyEventArgs) Handles MyBase.KeyDown End End Sub

Pour quitter lapplication, il vous suffira donc dappuyer sur une touche quelconque du clavier.

Excution de lapplication
Vous pouvez lancer le programme en appuyant sur la touche de fonction F5 et tester son bon fonctionnement. Vrifiez en particulier les points suivants:

Le trac des droites dbute au bout de 5s. Tout mouvement de la souris rinitialise le dcompte avant le trac des droites. Lappui sur une touche du clavier met fin au programme.

Ce projet se trouve dans le dossier Projects\EconomEcran des sources de louvrage. Voici son listing complet:
Public Class Form1 Dim g As Graphics Dim X1, Y1, X2, Y2 As Integer Dim depart As Long Private Aleatoire As Random = New Random(DateTime.Now.Millisecond)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load g = Me.CreateGraphics() depart = My.Computer.Clock.TickCount Cursor.Hide() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Timer1.Tick

228

Visual Basic 2010

If (My.Computer.Clock.TickCount - depart) > 5000 Then Dim p As New Pen(Color.FromArgb(255, Aleatoire.Next(0, 255), Aleatoire.Next(0, 255), Aleatoire.Next(0, 255))) X1 = Aleatoire.Next(1, Me.Width) X2 = Aleatoire.Next(1, Me.Width) Y1 = Aleatoire.Next(1, Me.Height) Y2 = Aleatoire.Next(1, Me.Height) g.DrawLine(p, X1, Y1, X2, Y2) End If End Sub Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove depart = My.Computer.Clock.TickCount g.Clear(Color.White) End Sub Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System. Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown End End Sub End Class

Cet conomiseur dcran est certes trs basique, mais toutes les fonctions ncessaires la mise en uvre dune application plus volue ont t passes en revue. vos claviers

Affichage dune horloge aiguilles


Cette section montre comment raliser une horloge aiguilles cale sur lhorloge systme de lordinateur (voir Figure8.5).
Figure8.5 Lapplication Horloge, en mode Excution.

Cette application requiert un contrle Image et un contrle Timer. La barre de titre se limite au titre de lapplication et la case de fermeture. Toutes les minutes, lheure systme est lue et la position des aiguilles de lhorloge est mise jour.

Chapitre 8

Manipulation dobjets graphiques

229

Les commandes accessibles lutilisateur sont trs limites: la fentre de lapplication peut tre dplace laide de la technique habituelle et ferme dun clic sur la case de fermeture.

Avant de commencer
Le contrle Timer permet dexcuter une ou plusieurs instructions intervalles rguliers. Ilnest jamais visible en mode Excution, mais sa prsence est obligatoire dans la feuille si vous voulez excuter un code intervalles rguliers. La dure de lintervalle est choisie laide de la proprit Interval ou de linstruction Timer1.Interval= priode. Dans cet exemple, le timer a pour nom Timer1 et la valeur priode dfinit la priode dactivation de la procdure Timer1_Tick() en millisecondes. Si ncessaire, vous pouvez placer plusieurs timers sur une feuille. Dans ce cas, Visual Basic leur donnera les noms Timer2, Timer3,etc. Pour dfinir la priode du Timer3, vous utiliserez sa proprit Interval ou linstruction Timer3.Interval = priode. La procdure Timer3_Tick() sera excute rptitivement en respectant un intervalle priode entre chaque excution. Sachez enfin que la proprit Enabled rgle ltat (actif ou en veille) dun contrle Timer. La valeur True rend le contrle actif, et la valeur False le plonge dans un profond sommeil.

Mise en place visuelle de lapplication


Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom HorlogeAiguilles au projet et validez. Insrez un contrle Timer dans lapplication. Pour viter de devoir faire rfrence une image externe au programme, nous allons linclure dans les ressources de lapplication. Lancez la commande Proprits de HorlogeAiguilles dans le menu Projet. Cette commande affiche longlet HorlogeAiguilles dans lEDI. Cliquez sur longlet Ressources. Lancez la commande Ajouter un fichier existant dans le menu Ajouter une ressource et dsignez le fichier horloge.bmp (ce fichier se trouve dans le dossier Projects\HorlogeAiguilles des sources de louvrage). La partie centrale de lenvironnement de dveloppement doit prsent ressembler la Figure8.6. Affectez la valeur Horloge la proprit Text du contrle Form1 pour afficher le mot Horloge dans sa barre de titre. Affectez la valeur FixedToolWindow la proprit FormBorderStyle du contrle Form1 de faon rduire la barre de titre de lapplication une simple case de fermeture de dimensions rduites. La feuille de lapplication doit maintenant ressembler la Figure8.7.

230

Visual Basic 2010

Figure8.6 Le fichier horloge.bmp a t ajout aux ressources de lapplication.

Figure8.7 La feuille de lapplication propose une barre de titre rduite.

Pour que lhorloge puisse fonctionner, vous devez paramtrer le contrle Timer. Affectez les valeurs:

True la proprit Enabled pour activer le contrle. 60000 la proprit Interval pour demander lexcution de la procdure de traitement

du timer toutes les 60000 millisecondes (en dautres termes toutes les minutes). Cette procdure effectuera la mise jour des aiguilles sur lhorloge.

Il est temps de donner vie lhorloge en crivant quelques lignes de code.

Dfinition des procdures de traitement


Affichez la fentre de code en slectionnant longlet Form1.vb et dfinissez la constante pi la suite de la dclaration Public:
Public Class Form1 Const pi = 3.1415926536

Chapitre 8

Manipulation dobjets graphiques

231

Cette constante sera utilise pour effectuer des calculs trigonomtriques sur la position des aiguilles. Compltez cette dfinition en dclarant les variables ncessaires au programme:
Dim Dim Dim Dim x, y As Integer g As Graphics p As New Pen(Color.Black, 1) mybmp As New Bitmap(My.Resources.horloge)

Les entiers x et y serviront calculer les coordonnes des aiguilles. Lobjet Graphics g permettra dafficher lhorloge et les aiguilles dans la feuille. Lobjet Pen p sera utilis pour dfinir la couleur (Color.Black) et l"paisseur" (1) des aiguilles de lhorloge. Enfin, lobjet Bitmap mybmp permettra de manipuler limage horloge, place dans les ressources de lapplication dans la section prcdente. Vous allez maintenant dfinir la procdure qui affichera les aiguilles sur lhorloge. Entrez les instructions suivantes:
Sub Affiche() Effacement des aiguilles g.DrawImage(mybmp, 1, 1) Lecture de lheure systme et mmorisation dans les variables Heures et Minutes Dim h As Integer = System.DateTime.Now.Hour Dim m As Integer = System.DateTime.Now.Minute Affichage des heures x = Math.Round(Math.Sin(2 * pi * (h Mod 12) / 12) * 9) y = Math.Round(Math.Cos(2 * pi * (h Mod 12) / 12) * 9) g.DrawLine(p, 28, 28, 28 + x, 28 - y) Affichage des minutes x = Math.Round(Math.Sin(2 * pi * m / 60) * 12) y = Math.Round(Math.Cos(2 * pi * m / 60) * 12) g.DrawLine(p, 28, 28, 28 + x, 28 - y) End Sub

La premire instruction affiche nouveau limage de lhorloge. Cest un moyen trs pratique pour effacer les aiguilles de leur position prcdente:
g.DrawImage(mybmp, 1, 1)

Le bloc dinstructions suivant lit lheure systme (heures et minutes) laide de la fonction
System.DateTime.Now:
Dim h As Integer = System.DateTime.Now.Hour Dim m As Integer = System.DateTime.Now.Minute

Les instructions suivantes affichent les aiguilles sur lhorloge.

232

Visual Basic 2010

ition Dfin

Quelques rappels de trigonomtrie. Pour afficher les aiguilles sur lhorloge, nous utiliserons les fonctions trigonomtriques Cos (cosinus) et Sin (sinus). Le cosinus nous permettra de connatre la projection sur laxe horizontal (abscisse), et le sinus, la projection sur laxe vertical (ordonne).

La variable h a t initialise par la fonction System.DateTime.Now.Hour. Elle contient la valeur horaire de lheure systme, entre0 et23. Pour connatre ses projections sur les axes X et Y, il suffit dutiliser les fonctions Cos(2*pi*h) et Sin(2*pi*h). Remarquez lutilisation de loprateur Mod pour limiter les valeurs horaires lintervalle [0.. 12]. Remarquez aussi le facteur multiplicatif (ici 9) qui dtermine la taille de laiguille:
x = Math.Round(Math.Sin(2 * pi * (h Mod 12) / 12) * 9) y = Math.Round(Math.Cos(2 * pi * (h Mod 12) / 12) * 9)

Pour afficher laiguille des heures, nous utilisons linstruction GDI+ DrawLine. Ses arguments sont les suivants:

la couleur du trac (p); le point de dpart du trac (28, 28); le point de fin du trac (28 + x, 28 y).
g.DrawLine(p, 28, 28, 28 + x, 28 - y)

La mme technique permet de calculer les coordonnes de laiguille des minutes:


x = Math.Round(Math.Sin(2 * pi * m / 60) * 12) y = Math.Round(Math.Cos(2 * pi * m / 60) * 12)

puis de lafficher sur limage:


g.DrawLine(p, 28, 28, 28 + x, 28 - y)

La procdure Affiche doit tre appele au lancement de lapplication, puis toutes les minutes. Pour cela, vous allez dfinir et complter les procdures Form1_Paint() et Timer1_Tick(). Slectionnez lobjet Form1 dans la bote de dialogue des Proprits, cliquez sur licne vnements, puis double-cliquez sur lvnement Paint pour gnrer le squelette de la procdure Form1_Paint(). Compltez cette procdure comme suit:
Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows. Forms.PaintEventArgs) Handles MyBase.Paint g = Me.CreateGraphics() Affiche() End Sub

La premire instruction initialise lobjet Graphics g et la seconde appelle la procdure Affiche() pour afficher lheure systme.

Chapitre 8

Manipulation dobjets graphiques

233

Double-cliquez maintenant sur le contrle Timer et compltez la procdure Timer1_Tick() comme suit:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Affiche() End Sub

Difficile de faire plus simple! Toutes les minutes, cette procdure est active. Elle appelle la procdure Affiche(), responsable de laffichage des aiguilles sur lhorloge. Pour terminer, vous allez dfinir la procdure Form1_Load() afin de redimensionner la fentre de lapplication. Slectionnez lobjet Form1 dans la bote de dialogue des Proprits, cliquez sur licne vnements, puis double-cliquez sur lvnement Load pour gnrer le squelette de la procdure Form1_Load(). Compltez cette procdure comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Width = 64 Me.Height = 82 End Sub

Excution de lapplication
Le programme peut tre excut: appuyez sur la touche de fonction F5. Si ncessaire, vous pouvez repositionner la fentre en la faisant glisser un endroit quelconque de lcran. Avouez que cette "horloge maison" est plus agrable quune simple horloge numrique... Voici le listing complet du programme:
Public Class Form1 Const pi = 3.1415926536 Dim x, y As Integer Dim g As Graphics Dim p As New Pen(Color.Black, 1) Dim mybmp As New Bitmap(My.Resources.horloge) Sub Affiche() Effacement des aiguilles g.DrawImage(mybmp, 1, 1) Lecture de lheure systme et mmorisation dans les variables Heures et Minutes Dim h As Integer = System.DateTime.Now.Hour Dim m As Integer = System.DateTime.Now.Minute

234

Visual Basic 2010

Affichage des heures x = Math.Round(Math.Sin(2 * pi * (h Mod 12) / 12) * 9) y = Math.Round(Math.Cos(2 * pi * (h Mod 12) / 12) * 9) g.DrawLine(p, 28, 28, 28 + x, 28 - y) Affichage des minutes x = Math.Round(Math.Sin(2 * pi * m / 60) * 12) y = Math.Round(Math.Cos(2 * pi * m / 60) * 12) g.DrawLine(p, 28, 28, 28 + x, 28 - y) End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Timer1.Tick Affiche() End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Me.Width = 64 Me.Height = 82 End Sub Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System. Windows.Forms.PaintEventArgs) Handles MyBase.Paint g = Me.CreateGraphics() Affiche() End Sub End Class

Ce projet se trouve dans le dossier Projects\HorlogeAiguilles des sources de louvrage.

La capture dcran programme


Cette section vous montre comment effectuer une copie dcran partielle ou totale en utilisant une petite application Visual Basic 2010. Limage rcupre apparat dans un contrle PictureBox et peut tre stocke sur le disque dur dans un fichier BMP.

Dfinition de lapplication
Crez une nouvelle application. Ajoutez deux contrles Button, deux contrles RadioButton, quatre contrles Label, quatre contrles TextBox et un contrle PictureBox la feuille. Modifiez les proprits de ces contrles comme indiqu dans le tableau ci-aprs:

Chapitre 8


Proprit
Text Text Text Text Checked Text Text Text Text Text Text Text Text Text Dock

Manipulation dobjets graphiques

235

Contrle
Form1 Button1 Button2 RadioButton1 RadioButton1 RadioButton2 Label1 Label2 Label3 Label4 TextBox1 TextBox2 TextBox3 TextBox4 PictureBox1

Valeur
Capture dcran Capture Sauvegarde disque Tout lcran True Personnalis X dbut Y dbut Largeur Hauteur 0 0

Bottom

Modifiez la taille et la disposition des contrles pour obtenir une feuille semblable la Figure8.8.
Figure8.8 La feuille de lapplication Capture dcran, en mode dition.

236

Visual Basic 2010

Voici le code associ lapplication. Ce projet se trouve dans le dossier Projects\Copie Ecran des sources de louvrage.
Public Class Form1 Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, _ ByVal nYDest As Integer, _ ByVal nWidth As Integer, _ ByVal nHeight As Integer, _ ByVal hdcSrc As IntPtr, _ ByVal nXSrc As Integer, _ ByVal nYSrc As Integer, _ ByVal dwRop As System.Int32) As Boolean Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr Dim Image Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Dfinition des variables qui dlimitent la zone capturer Dim xDeb, xFin, yDeb, yFin As Integer Cration dun objet Graphics qui pointe sur lcran Dim g1 As Graphics = Graphics.FromHwnd(GetDesktopWindow) If RadioButton1.Checked Then xDeb = 0 yDeb = 0 xFin = My.Computer.Screen.WorkingArea.Width yFin = My.Computer.Screen.WorkingArea.Height Else xDeb = Val(TextBox1.Text) yDeb = Val(TextBox2.Text) xFin = Val(TextBox3.Text) yFin = Val(TextBox4.Text) End If Cration dun bitmap de mme taille que la zone capturer Image = New Bitmap(xFin - xDeb + 1, yFin - yDeb + 1, g1) Dim g2 As Graphics = Graphics.FromImage(Image) Cration du contexte de priphrique (Device Context) de la fiche Dim dc1 As IntPtr = g1.GetHdc Cration du contexte de priphrique (Device Context) de limage bitmap Dim dc2 As IntPtr = g2.GetHdc

Chapitre 8

Manipulation dobjets graphiques

237

Copie dcran (Bit Blast) dans limage bitmap BitBlt(dc2, 0, 0, xFin - xDeb + 1, yFin - yDeb + 1, dc1, xDeb, yDeb, 13369376) Affichage de la capture PictureBox1.Image = Image Libration des contextes de priphriques g1.ReleaseHdc(dc1) g2.ReleaseHdc(dc2) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click Sauvegarde de la copie dcran sur le disque dur Image.Save("c:\data\image.bmp") End Sub End Class

Le premier bloc de code dfinit le gabarit de la fonction BitBlt() et linterface avec la bibliothque gdi32.dll:
Private Declare Function BitBlt Lib "gdi32.dll" ( ) As Boolean

Cette fonction copie la totalit ou une partie de lcran dans un conteneur image. Examinons les arguments transmis cette fonction:
Argument
hdcDest nXDest nYDest nWidth nHeight hdcSrc nXSrc nYSrc dwRop

Dfinition
Objet Graphics o limage doit tre copie Abscisse du coin suprieur gauche o limage sera copie Ordonne du coin suprieur gauche o limage sera copie Largeur de limage Hauteur de limage Objet Graphics do limage doit tre copie Abscisse du coin suprieur gauche de limage source Ordonne du coin suprieur gauche de limage source Mthode utilise pour copier limage

Largument dwRop indique la mthode de copie de limage. Vous pouvez utiliser une des constantes du tableau suivant:

238

Visual Basic 2010

Constante
SRCAND SRCCOPY SRCERASE SRCINVERT SRCPAINT NOTSRCCOPY NOTSRCERASE MERGEPAINT DSTINVERT BLACKNESS WHITENESS

Valeur
&H8800C6 &HCC0020 &H440328 &H660046 &HEE0086 &H330008 &H1100A6 &HBB0226 &H550009 &H42 &HFF0062

Dfinition
Combine la source et la destination laide de loprateur AND. Copie de limage source dans limage de destination. Applique un oprateur AND entre la source et linverse de la destination. Combinaison source/destination laide de loprateur XOR. Combinaison source/destination laide de loprateur OR. Inverse la source et la copie dans la destination. Combinaison source/destination laide de loprateur OR puis inverse le rsultat. Applique un oprateur OR entre linverse de la source et la estination. d Inverse la destination (sans tenir compte de la source). Affecte la couleur noire la destination. Affecte la couleur blanche la destination.

Le code se poursuit par la dclaration de la fonction GetDesktopWindow():


Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr

Cette fonction fait partie de la bibliothque user32.dll. Nous lutiliserons pour obtenir le handle du Bureau de Windows. Les dclarations se terminent par la dfinition de la variable Image qui contiendra la capture dcran:
Dim Image

Double-cliquez sur le bouton Capture et compltez la procdure Button1_Click() comme suit:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dfinition des variables qui dlimitent la zone capturer Dim xDeb, xFin, yDeb, yFin As Integer Cration dun objet Graphics qui pointe sur lcran Dim g1 As Graphics = Graphics.FromHwnd(GetDesktopWindow) If RadioButton1.Checked Then xDeb = 0

Chapitre 8

Manipulation dobjets graphiques

239

yDeb = 0 xFin = My.Computer.Screen.WorkingArea.Width yFin = My.Computer.Screen.WorkingArea.Height Else xDeb yDeb xFin yFin End If = = = = Val(TextBox1.Text) Val(TextBox2.Text) Val(TextBox3.Text) Val(TextBox4.Text)

Cration dun bitmap de mme taille que la zone capturer Image = New Bitmap(xFin - xDeb + 1, yFin - yDeb + 1, g1) Dim g2 As Graphics = Graphics.FromImage(Image) Cration du contexte de priphrique (Device Context) de la fiche Dim dc1 As IntPtr = g1.GetHdc Cration du contexte de priphrique (Device Context) de limage bitmap Dim dc2 As IntPtr = g2.GetHdc Copie dcran (Bit Blast) dans limage bitmap BitBlt(dc2, 0, 0, xFin - xDeb + 1, yFin - yDeb + 1, dc1, xDeb, yDeb, &HCC0020) Affichage de la capture PictureBox1.Image = Image Libration des contextes de priphriques g1.ReleaseHdc(dc1) g2.ReleaseHdc(dc2) End Sub

La procdure dbute par la dfinition des variables qui contiendront les coordonnes de la zone capturer:
Dim xDeb, xFin, yDeb, yFin As Integer

La fonction GetDesktopWindow() est alors sollicite pour obtenir le handle du Bureau de Windows. Lobjet graphique associ est stock dans lobjet Graphics g1:
Dim g1 As Graphics = Graphics.FromHwnd(GetDesktopWindow)

Si lutilisateur slectionne le premier bouton radio, cela signifie quil souhaite raliser une copie de la totalit de lcran. Les variables xDeb, yDeb, xFin et yFin sont initialises en consquence:
If RadioButton1.Checked Then xDeb = 0 yDeb = 0 xFin = My.Computer.Screen.WorkingArea.Width yFin = My.Computer.Screen.WorkingArea.Height

240

Visual Basic 2010

Dans le cas contraire, la zone capturer est lue dans les contrles TextBox1 TextBox4:
Else xDeb yDeb xFin yFin End If = = = = Val(TextBox1.Text) Val(TextBox2.Text) Val(TextBox3.Text) Val(TextBox4.Text)

Linstruction suivante cre une image bitmap de mmes dimensions que la zone de capture:
Image = New Bitmap(xFin - xDeb + 1, yFin - yDeb + 1, g1)

Lobjet Graphics g2 est alors initialis avec cette image:


Dim g2 As Graphics = Graphics.FromImage(Image)

Pour pouvoir appeler la fonction BitBlt, les contextes de priphriques des objets g1 et g2 sont obtenus par la fonction GetHdc() et stocks dans les variables InPtr dc1 et dc2:
Dim dc1 As IntPtr = g1.GetHdc Dim dc2 As IntPtr = g2.GetHdc

La copie dcran peut alors tre effectue:


BitBlt(dc2, 0, 0, xFin - xDeb + 1, yFin - yDeb + 1, dc1, xDeb, yDeb, &HCC0020)

Aprs lexcution de cette instruction, limage source est place dans lobjet Bitmap Image (contexte de priphrique dc2 de lobjet Graphics g2). Pour lafficher dans la fentre de lapplication, il suffit daffecter le contrle Image la proprit Image du contrle PictureBox1:
PictureBox1.Image = Image

Pour terminer, les contextes de priphriques crs dans les lignes prcdentes sont librs:
g1.ReleaseHdc(dc1) g2.ReleaseHdc(dc2)

Double-cliquez sur le bouton Sauvegarde disque et compltez la procdure Button2_ Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Sauvegarde de la copie dcran sur le disque dur Image.Save("c:\data\image.bmp") End Sub

Lunique instruction de cette procdure sauvegarde le contenu de lobjet Image dans le fichier C:\data\image.bmp:
Image.Save("c:\data\image.bmp")

9
Fichiers et dossiers
Visual Basic manipule trois types de fichiers:

Les fichiers accs squentiel. Ils ne contiennent que du texte. Lors de leur ouverture, vous devez prciser le mode daccs: en lecture (input), en criture (output) ou en ajout (append). Les fichiers accs direct. Ils sont constitus dun ou de plusieurs enregistrements de longueur fixe. Ils sont simultanment accessibles en lecture et en criture. Les fichiers binaires. Tous les fichiers qui nentrent pas dans les deux prcdentes catgories peuvent tre ouverts comme fichiers binaires. Ils sont simultanment accessibles en lecture et en criture.

Nous allons examiner le fonctionnement des fichiers squentiels et des fichiers accs direct. Les fichiers binaires sont trs proches des fichiers accs direct, si ce nest quils manipulent des donnes de longueur quelconque. Dans un second temps, nous vous montrerons comment copier, dplacer et supprimer des fichiers et des dossiers.

242

Visual Basic 2010

Fichiers accs squentiel


Les fonctions et procdures ddies la manipulation des fichiers texte sont les suivantes: FileOpen(), FileClose(), InputString(), LineInput() et Print(). La procdure FileOpen() est gnralement utilise avec trois arguments:
FileOpen(identificateur, nom, mode)

o:

identificateur est un numro associ au fichier. nom est le nom du fichier ouvrir. mode est le mode douverture, Append, Binary, Input, Output ou Random.

La procdure FileClose() ne demande quun argument, le numro du fichier qui doit tre ferm:
FileClose(identificateur)

La fonction InputString() demande deux arguments:


Resultat = InputString(identificateur, longueur)

o:

identificateur est un numro associ au fichier. longueur correspond au nombre de caractres lire dans le fichier.

La fonction Input() ne demande quun seul argument, le numro du fichier dans lequel la ligne doit tre lue:
Resultat = InputString(identificateur)

La procdure Print() demande deux arguments:


Print(identificateur,valeur)

o:

identificateur est un numro associ au fichier. valeur correspond la valeur crire dans le fichier.

Pour vous montrer comment utiliser ces instructions, nous allons raliser un miniprojet permettant dafficher et de mmoriser des notes textuelles. Dfinissez un nouveau projet de type Application Windows Forms avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application

Chapitre 9

Fichiers et dossiers

243

Windows Forms dans le volet central. Donnez le nom Mmo au projet et validez en cliquant sur OK. Ajoutez un contrle TextBox et deux contrles Button la feuille du projet. Modifiez les proprits de ces contrles comme suit:
Contrle
TextBox1 TextBox1 TextBox1 Button1 Button2

Proprit
Text Multiline (Name) Text Text

Valeur

True Mmo Effacer Quitter

Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load tout = "" Try FileOpen(1, "c:\memo.txt", OpenMode.Input) While Not EOF(1) texte = LineInput(1) tout = tout + texte + Chr(13) + Chr(10) End While Mmo.Text = tout Catch Finally FileClose(1) End Try End Sub

Compltez cette procdure en dfinissant les variables tout et texte:


Dim tout as String Dim texte as String

La procdure Form_Load est essentiellement compose dune instruction Try Catch Finally. Linstruction Try est utilise pour ouvrir le fichier c:\memo.txt en lecture. Si ce fichier nexiste pas, une erreur est gnre et les instructions situes sous linstruction Catch sont excutes. Ici, aucune action nest effectue en cas derreur. Si le fichier c:\memo.txt existe

244

Visual Basic 2010

(cest le cas sil ne sagit pas de la premire excution du programme), son contenu est lu ligne par ligne laide dune boucle While:
While Not EOF(1) texte = LineInput(1)

Aprs chaque lecture, un passage la ligne est ajout la ligne en mmoire:


tout = tout + texte + Chr(13) + Chr(10) End While

Lorsque tout le fichier a t lu, le contrle Mmo est initialis en consquence:


Mmo.Text = tout

Puis le fichier est ferm laide du bloc Finally:


Finally FileClose(1)

Dfinissez les variables texte utilises dans cette procdure en ajoutant la ligne ci-aprs en tte de listing:
Dim tout, texte As String

Pour terminer le projet, il reste encore donner vie aux deux boutons de commande. Le bouton Effacer est dune grande simplicit. Il se contente deffacer le texte affich dans le contrle Mmo. Double-cliquez sur le bouton Effacer et compltez la procdure Button1_ Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Mmo.Text = "" End Sub

Le code affect au bouton Quitter est lgrement plus complexe qu lhabitude. En effet, il est ncessaire de sauvegarder le texte du contrle Mmo dans le fichier c:\memo.txt. Double-cliquez sur le bouton Quitter et compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Try FileOpen(1, "c:\memo.txt", OpenMode.Output) Print(1, Mmo.Text) Catch Finally

Chapitre 9

Fichiers et dossiers

245

FileClose(1) End Try End End Sub

Ici encore, nous utiliserons une instruction Try Catch Finally pour accder au fichier texte. Le code inscrit sous linstruction Try tente douvrir le fichier c:\memo.txt en criture et dy stocker le contenu du contrle Mmo:
Try FileOpen(1, "c:\memo.txt", OpenMode.Output) Print(1, Mmo.Text)

Comme le bloc Catch est laiss vide, aucune action ne se produira si le fichier c:\memo. txt ne peut tre ouvert en criture. Comme dans la procdure Form1_Load(), le fichier est cltur laide du bloc Finally:
Finally FileClose(1)

Voici le code complet de lapplication. Ce code se trouve dans le dossier Mmo aprs installation des sources de louvrage.
Public Class Form1 Dim tout, texte As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs)Handles MyBase.Load tout = "" Try FileOpen(1, "c:\memo.txt", OpenMode.Input) While Not EOF(1) texte = LineInput(1) tout = tout + texte + Chr(13) + Chr(10) End While Mmo.Text = tout Catch Finally FileClose(1) End Try End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.

246

Visual Basic 2010

EventArgs) Handles Button2.Click Try FileOpen(1, "c:\memo.txt", OpenMode.Output) Print(1, Mmo.Text) Catch Finally FileClose(1) End Try End End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Mmo.Text = "" End Sub End Class

Fichiers accs direct


Les fichiers accs direct contiennent des donnes organises dans des enregistrements de longueur fixe. Par exemple, dans un carnet dadresses, la dclaration dun enregistrement peut se faire avec linstruction Public Structure ci-aprs:
Public Structure Struct <VBFixedString(25)> Dim Nom As String <VBFixedString(25)> Dim Prnom As String <VBFixedString(200)> Dim Adresse As String <VBFixedString(20)> Dim Tlphone As String <VBFixedString(25)> Dim Fax As String End Structure

Struct est le nom de la structure denregistrement utiliser. Dans cet exemple, cette structure est compose de cinq champs de chane de longueur dtermine: Nom, Prnom, Adresse, Tlphone et Fax.

Pour utiliser la structure Enreg, il suffira de dfinir une variable de ce type avec linstruction suivante:
Dim Enreg As Struct

Enreg est une variable de type Struct. Pour accder une des variables de ce type, il faudra utiliser une instruction point. Par exemple, Enreg.Fax reprsente la donne Fax de

lenregistrement.

Chapitre 9

Fichiers et dossiers

247

Pour ouvrir un fichier accs direct, vous utiliserez une instruction FileOpen() en indiquant la longueur de chaque enregistrement. Par exemple:
FileOpen(1, "C:\carnet.adr", OpenMode.Random, , , 295)

Cette instruction suppose que la longueur dun enregistrement est de 295octets. Pour lire un enregistrement dans un fichier accs direct, vous utiliserez linstruction FileGet(). titre dexemple, linstruction suivante lit le premier enregistrement du fichier:
FileGet(1, Enreg, 1)

Les donnes lues peuvent tre utilises avec des instructions point, comme Enreg.Nom ou encore Enreg.Adresse. Enfin, pour crire un enregistrement dans un fichier accs direct, vous utiliserez linstruction FilePut(), selon la mme syntaxe que pour linstruction FileGet(). Bien entendu, vous devez avoir initialis les variables de lenregistrement avant dutiliser linstruction FilePut(). Nous allons illustrer lutilisation des fichiers accs direct en crant un carnet dadresses lmentaire. Ce carnet pourra tre consult et complt. Dfinissez un nouveau projet de type Application Windows Forms avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Donnez le nom Carnet au projet et validez en cliquant sur OK. Ajoutez cinq contrles TextBox, cinq Label et cinq contrles Button la feuille du projet. Modifiez les proprits de ces contrles comme suit:
Contrle
Label1 Label2 Label3 Label4 Label5 TextBox1 TextBox2 TextBox3 TextBox4

Proprit
Text Text Text Text Text Text Text Text Text

Valeur
Nom Prnom Adresse Tlphone Fax

248

Visual Basic 2010

Contrle
TextBox5 TextBox1 TextBox2 TextBox3 TextBox4 TextBox5 TextBox3 Button1 Button2 Button3 Button4 Button5 Form1

Proprit
Text Name Name Name Name Name MultiLine Text Text Text Text Text Text

Valeur

Nom Prnom Adresse Tlphone Fax True Quitter << < > >> Carnet dadresses

Modifiez la position et la dimension des contrles pour obtenir quelque chose comme la Figure9.1.
Figure9.1 La fentre de lapplication Carnet dadresses, en mode dition.

Chapitre 9

Fichiers et dossiers

249

Dfinissez la structure et les variables utilises par le programme dans les premires lignes:
Public Structure Struct <VBFixedString(25)> Dim Nom As String <VBFixedString(25)> Dim Prnom As String <VBFixedString(200)> Dim Adresse As String <VBFixedString(20)> Dim Tlphone As String <VBFixedString(25)> Dim Fax As String End Structure Dim Enreg As Struct Dim Numro As Integer

Le premier bloc dinstructions dfinit la structure des enregistrements du carnet dadresses. La variable Enreg, de type Struct, sera utilise pour lire et crire dans le fichier accs direct. Enfin, la variable Numro sera utilise pour pointer lenregistrement auquel accder, en lecture ou en criture. Dfinissez maintenant les procdures Lit() et Ecrit(), qui seront utilises par le programme pour lire et crire un enregistrement dans le carnet dadresses:
Private Sub Lit(ByVal N As Integer) FileGet(1, Enreg, Numro) Nom.Text = Enreg.Nom Prnom.Text = Enreg.Nom Adresse.Text = Enreg.Adresse Tlphone.Text = Enreg.Tlphone Fax.Text = Enreg.Fax End Sub Private Sub Ecrit(ByVal N As Integer) Enreg.Nom = Nom.Text Enreg.Nom = Prnom.Text Enreg.Adresse = Adresse.Text Enreg.Tlphone = Tlphone.Text Enreg.Fax = Fax.Text FilePut(1, Enreg, Numro) End Sub

La procdure Lit() utilise linstruction FileGet() pour lire lenregistrement Numro dans le fichier. Le rsultat est stock dans la variable Struct Enreg:
FileGet(1, Enreg, Numro)

250

Visual Basic 2010

Les donnes lues apparaissent ensuite dans les zones de texte de la feuille:
Nom.Text = Enreg.Nom Prnom.Text = Enreg.Nom Adresse.Text = Enreg.Adresse Tlphone.Text = Enreg.Tlphone Fax.Text = Enreg.Fax

La procdure Ecrit() effectue laction inverse. Aprs avoir initialis la variable Struct Enreg avec le contenu des zones de texte:
Enreg.Nom = Nom.Text Enreg.Nom = Prnom.Text Enreg.Adresse = Adresse.Text Enreg.Tlphone = Tlphone.Text Enreg.Fax = Fax.Text

La variable Struct Enreg est sauvegarde dans le carnet dadresses, lenregistrement Enreg:
FilePut(1, Enreg, Numro)

Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try FileOpen(1, "C:\carnet.adr", OpenMode.Random, , , 295) Numro = 1 Enregistrement en cours = 1 Lit(Numro) Finally End Try End Sub

Au lancement de lapplication, une instruction Try ouvre le fichier c:\carnet.adr en lecture/ criture. Les enregistrements de ce fichier ont une longueur de 295caractres, en accord avec la longueur de la structure Struct:
Try FileOpen(1, "C:\carnet.adr", OpenMode.Random, , , 295)

Lenregistrement numro1 est alors lu et affich dans la feuille:


Numro = 1 Enregistrement en cours = 1 Lit(Numro)

Pour terminer lapplication, il ne reste plus qu associer du code aux cinq boutons de commande.

Chapitre 9

Fichiers et dossiers

251

Double-cliquez sur le quatrime bouton (prochain enregistrement) et compltez la procdure Button4_Click() comme suit:
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click If Nom.Text <> "" Then Ecrit(Numro) Numro = Numro + 1 Lit(Numro) End Sub

Si le champ Nom nest pas vide, lenregistrement Numro est crit dans le carnet:
If Nom.Text <> "" Then Ecrit(Numro)

Lenregistrement suivant est alors lu et affich:


Numro = Numro + 1 Lit(Numro)

Double-cliquez sur le troisime bouton de commande. La procdure permettant de visua liser lenregistrement prcdent est trs proche de la prcdente:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If Nom.Text <> "" Then Ecrit(Numro) If Numro > 1 Then Numro = Numro - 1 Lit(Numro) End Sub

Si le champ Nom nest pas vide, lenregistrement Numro est crit dans le carnet:
If Nom.Text <> "" Then Ecrit(Numro)

Sil existe, lenregistrement prcdent est alors lu et affich:


If Numro > 1 Then Numro = Numro - 1 Lit(Numro)

Les procdures lies aux boutons premier et dernier enregistrement sont du mme acabit. Double-cliquez sur le deuxime bouton et compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click If Nom.Text <> "" Then Ecrit(Numro) Numro = 1 Lit(Numro) End Sub

252

Visual Basic 2010

Si lenregistrement courant nest pas vierge, il est mmoris dans le carnet:


If Nom.Text <> "" Then Ecrit(Numro)

Puis le premier enregistrement de donnes apparat:


Numro = 1 Lit(Numro)

Double-cliquez sur le cinquime bouton et compltez la procdure Button5_Click():


Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button5.Click If Nom.Text <> "" Then Ecrit(Numro) Numro = FileLen("c:\carnet.adr") / 295 Lit(Numro) End Sub

Si lenregistrement courant nest pas vierge, il est mmoris dans le carnet:


If Nom.Text <> "" Then Ecrit(Numro)

Pour connatre le numro du dernier enregistrement, il suffit de diviser la longueur du fichier par la taille dun enregistrement:
Numro = FileLen("c:\carnet.adr") / 295

Cet enregistrement apparat laide de la procdure Lit():


Lit(Numro)

Voici le listing complet de ce projet. Vous le trouverez dans le dossier Carnet aprs installation des sources de louvrage.
Public Class Form1 Public Structure Struct <VBFixedString(25)> Dim Nom As String <VBFixedString(25)> Dim Prnom As String <VBFixedString(200)> Dim Adresse As String <VBFixedString(20)> Dim Tlphone As String <VBFixedString(25)> Dim Fax As String End Structure Dim Enreg As Struct Dim Numro As Integer Private Sub Lit(ByVal N As Integer)

Chapitre 9


FileGet(1, Enreg, Numro) Nom.Text = Enreg.Nom Prnom.Text = Enreg.Prnom Adresse.Text = Enreg.Adresse Tlphone.Text = Enreg.Tlphone Fax.Text = Enreg.Fax End Sub Private Sub Ecrit(ByVal N As Integer) Enreg.Nom = Nom.Text Enreg.Prnom = Prnom.Text Enreg.Adresse = Adresse.Text Enreg.Tlphone = Tlphone.Text Enreg.Fax = Fax.Text FilePut(1, Enreg, Numro) End Sub

Fichiers et dossiers

253

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Try FileOpen(1, "C:\carnet.adr", OpenMode.Random, , , 295) Numro = 1 Enregistrement en cours = 1 Lit(Numro) Finally End Try End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button4.Click If Nom.Text <> "" Then Ecrit(Numro) Numro = Numro + 1 Lit(Numro) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button3.Click If Nom.Text <> "" Then Ecrit(Numro) If Numro > 1 Then Numro = Numro - 1 Lit(Numro) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click

254

Visual Basic 2010

If Nom.Text <> "" Then Ecrit(Numro) Numro = 1 Lit(Numro) End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button5.Click If Nom.Text <> "" Then Ecrit(Numro) Numro = FileLen("c:\carnet.adr") / 295 Lit(Numro) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click If Nom.Text <> "" Then Ecrit(Numro) FileClose(1) End End Sub End Class

Manipulation de dossiers et de fichiers


Les fonctions habituelles permettant de manipuler dossiers et fichiers sont disponibles dans Visual Basic 2010. Pour pouvoir les utiliser, il suffit de prciser la classe laquelle elles appartiennent en dbut de listing:
Imports System.IO

Le tableau suivant donne un aperu des principales fonctions disponibles.


Fonction
File.Copy (source, destination) File.Delete (source) Directory.CreateDirectory (Chemin) Directory.Delete (Chemin)

Effet
Copie le fichier source sur le fichier de destination Supprime le fichier spcifi Cre le dossier spcifi Supprime le dossier spcifi

Pour illustrer ces quatre fonctions, nous allons dvelopper une application qui copie un fichier existant dans un nouveau dossier, puis qui supprime la copie et le dossier crs. Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Lentre Visual Basic/Windows tant slectionne

Chapitre 9

Fichiers et dossiers

255

dans la bote de dialogue Nouveau projet, cliquez sur licne Application Windows Forms dans le volet central, donnez le nom Ouvrir au projet et cliquez sur OK. Insrez deux Label, deux TextBox et un Button dans la feuille. Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Label1 Label2 TextBox1 TextBox2 TextBox1 TextBox2 Button1 Form1

Proprit
Text Text Text Text Name Name Text Text

Valeur
Fichier source Fichier de destination

Source Destin Copier puis Effacer Copie de fichiers

Les procdures de manipulation de fichiers et de dossiers utilisent la classe System.IO. Vous devez donc indiquer la clause Imports suivante en dbut de programme:
Imports System.IO

Double-cliquez sur le bouton de commande et compltez la procdure Button1_Click() comme suit:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim rsultat As Boolean If Dir("c:\Nouveau dossier\" + Destin.Text) <> "" Then rsultat = MsgBox("Le fichier destination " + Destin.Text + " existe. Voulez-vous lcraser?", MsgBoxStyle.OKCancel) If rsultat = False Then Exit Sub End If End If Directory.CreateDirectory("c:\Nouveau dossier\") MsgBox("Le dossier Nouveau dossier a t cr", MsgBoxStyle.Information) File.Copy(Source.Text, Destin.Text) MsgBox("Le fichier a t copi", MsgBoxStyle.Information)

256

Visual Basic 2010

File.Delete(Destin.Text) MsgBox("Le fichier a t effac", MsgBoxStyle.Information) Directory.Delete("c:\Nouveau dossier") MsgBox("Le dossier Nouveau dossier a t supprim", MsgBoxStyle.Information) End Sub

Le premier bloc dinstructions teste si le fichier spcifi dans la zone de texte Destination est dj prsent sur le disque. Si tel est le cas, une bote de message saffiche. Remarquez lutilisation de la fonction Dir() pour tester lexistence dun fichier:
Dim rsultat As Boolean If Dir("c:\Nouveau dossier\" + Destin.Text) <> "" Then rsultat = MsgBox("Le fichier destination " + Destin.Text + " existe. Voulez-vous lcraser?", MsgBoxStyle.OKCancel)

Si lutilisateur indique quil ne souhaite pas craser le fichier existant, le programme prend fin:
If rsultat = False Then Exit Sub End If

Le bloc dinstructions suivant cre le dossier c:\Nouveau dossier laide de la fonction CreateDirectory() et informe lutilisateur que ce dossier a t cr:
Directory.CreateDirectory("c:\Nouveau dossier\") MsgBox("Le dossier Nouveau dossier a t cr", MsgBoxStyle.Information)

Le fichier spcifi est alors copi dans le dossier c:\Nouveau dossier. Lorsque la copie est termine, une bote de message en informe lutilisateur:
File.Copy(Source.Text, Destin.Text) MsgBox("Le fichier a t copi", MsgBoxStyle.Information)

Le fichier copi est ensuite supprim laide de la fonction File.Delete():


File.Delete(Destin.Text) MsgBox("Le fichier a t effac", MsgBoxStyle.Information)

Et le dossier c:\Nouveau est supprim:


Directory.Delete("c:\Nouveau dossier") MsgBox("Le dossier Nouveau dossier a t supprim", MsgBoxStyle.Information)

Chapitre 9

Fichiers et dossiers

257

Voici le listing complet du programme. Le projet correspondant se trouve dans le dossier Projects\CopieDeFichiers des sources de louvrage aprs leur installation.
Imports System.IO Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Dim rsultat As Boolean If Dir("c:\Nouveau dossier\" + Destin.Text) <> "" Then rsultat = MsgBox("Le fichier destination " + Destin.Text + " existe. Voulez-vous lcraser?", MsgBoxStyle.OKCancel) If rsultat = False Then Exit Sub End If End If Directory.CreateDirectory("c:\Nouveau dossier\") MsgBox("Le dossier Nouveau dossier a t cr", MsgBoxStyle.Information) File.Copy(Source.Text, Destin.Text) MsgBox("Le fichier a t copi", MsgBoxStyle.Information) File.Delete(Destin.Text) MsgBox("Le fichier a t effac", MsgBoxStyle.Information) Directory.Delete("c:\Nouveau dossier") MsgBox("Le dossier Nouveau dossier a t supprim", MsgBoxStyle.Information) End Sub End Class

10
Jouer des sons WAV
Visual Basic 2010 est en mesure de jouer des fichiers audio WAV par lintermdiaire dune nouvelle mthode apparue dans la version 2.0 du Framework .NET: My.Computer.Audio. Play(). Ce chapitre va vous montrer comment lutiliser.

Mise en place de lapplication


Nous allons raliser un nouveau projet contenant:

un contrle Treeview pour slectionner le fichier .WAV jouer; un contrle Button pour jouer le son slectionn.

La Figure10.1 reprsente le projet en cours dexcution.

260

Visual Basic 2010

Figure10.1 Un fichier .WAV est prt tre jou.

Dfinissez un nouveau projet de type Application Windows Forms laide de la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Lentre Visual Basic/Windows tant slectionne dans la zone Types de projets, choisissez le modle Application Windows Forms, nommez le projet Player et validez en cliquant sur OK. Ajoutez un contrle Treeview, un contrle ImageList et un contrle Button dans la feuille de ce projet. Les informations affiches dans un contrle Treeview sont prcdes dune icne qui indique leur type. Lorsque ce contrle est utilis pour afficher le contenu dune unit de disque, les icnes peuvent tre de trois types: dossier ferm, dossier ouvert ou document. Pour faciliter leur manipulation, les trois types dicnes vont tre stocks dans le contrle
ImageList. Cliquez sur licne ImageList1, juste en dessous de la feuille de lapplication. Cliquez sur le bouton contenant trois points de suspension dans la proprit Images.

Cette action affiche la bote de dialogue diteur de collections Images. Cliquez sur Ajouter, rendez-vous dans le dossier Projects\Player des sources de louvrage et ajoutez les icnes folder_closed.bmp, folder_open.bmp et document.bmp. La fentre de lditeur de collections Image doit maintenant ressembler la Figure10.2.
Figure10.2 Trois icnes ont t ajoutes au contrle ImageList.

Chapitre 10

Jouer des sons WAV

261

Modifiez les proprits des contrles de lapplication comme suit:


Contrle
Form1 TreeView1 TreeView1 Treeview1 Button1

Proprit
Text Anchor Dock ImageList Text

Valeur
Player WAV Top, Left Top ImageList1 Jouer

Alimentation du contrle TreeView


Nous allons maintenant crire quelques lignes de code afin de rendre le contrle Treeview oprationnel. Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim oNode As New System.Windows.Forms.TreeNode() Try oNode.ImageIndex = 0 Closed folder oNode.SelectedImageIndex = 0 oNode.Text = "C:" TreeView1.Nodes.Add(oNode) oNode.Nodes.Add("") Catch ex As Exception MsgBox("Cannot create initial node:" & ex.ToString) End End Try End Sub

La premire ligne de cette procdure dfinit lobjet oNode de type System.Windows.Forms.


TreeNode:
Dim oNode As New System.Windows.Forms.TreeNode()

Pour pouvoir utiliser un objet de ce type, ajoutez la dclaration Imports suivante en tte de listing:
Imports System.io

262

Visual Basic 2010

Lobjet oNode sera utilis pour crer le nud initial sur la racine du disque C:. Cette cration se fait lintrieur dune instruction Try:
Try oNode.ImageIndex = 0 Dossier ferm oNode.SelectedImageIndex = 0 oNode.Text = "C:"

Les deux premires lignes dfinissent le type dimage afficher en face de lentre correspondant la racine du disque C:. La proprit Text correspond au texte affich la suite de licne. Le nud principal est alors ajout la structure Treeview laide des deux instructions suivantes:
TreeView1.Nodes.Add(oNode) oNode.Nodes.Add("")

Si une erreur se produit, un message apparat laide dune instruction MsgBox:


Catch ex As Exception MsgBox("Cannot create initial node:" & ex.ToString) End End Try

Laffichage dans larborescence Treeview doit tre modifi chaque fois que lutilisateur dplie ou replie un nud. Pour cela, nous dfinirons une procdure vnementielle pour lvnement BeforeExpand. Affichez la fentre de code. Slectionnez Treeview1 dans la premire liste droulante et BeforeExpand dans la deuxime liste droulante. Compltez laprocdure TreeView1_BeforeExpand() comme suit:
Private Sub TreeView1_BeforeExpand(ByVal sender As Object, ByVal e As System. Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand If e.Node.ImageIndex = 2 Then Exit Sub Try If e.Node.GetNodeCount(False) = 1 And e.Node.Nodes(0).Text = "" Then e.Node.Nodes(0).Remove() AfficheFils(e.Node) End If Catch ex As Exception MsgBox("Unable to expand " & e.Node.FullPath & ":" & ex.ToString) End Try If e.Node.GetNodeCount(False) > 0 Then e.Node.ImageIndex = 1 e.Node.SelectedImageIndex = 1 End If End Sub

Chapitre 10

Jouer des sons WAV

263

Si lutilisateur clique sur une entre dindex (2), cest--dire un document et non un dossier ouvert (1) ou ferm (0), aucun traitement ne doit tre effectu:
If e.Node.ImageIndex = 2 Then Exit Sub

Dans le cas contraire, si le nombre de nuds enfants du nud courant est gal 1 et si le texte associ au premier nud fils est vide:
Try If e.Node.GetNodeCount(False) = 1 And e.Node.Nodes(0).Text = ""

ce nud est supprim:


e.Node.Nodes(0).Remove()

Et la procdure AfficheFils() est appele pour afficher tous les nuds fils du nud courant:
AfficheFils(e.Node)

Si une erreur se produit, un message apparat laide de la procdure MsgBox():


Catch ex As Exception MsgBox("Unable to expand " & e.Node.FullPath & ":" & ex.ToString) End Try

Si le nud qui vient dtre ouvert contient un ou plusieurs nuds fils:


If e.Node.GetNodeCount(False) > 0 Then

licne dindex 1 saffiche:


e.Node.ImageIndex = 1 e.Node.SelectedImageIndex = 1

Voyons maintenant comment dcrire les entres du nud courant laide de la procdure AfficheFils():
Private Sub AfficheFils(ByVal oParent As System.Windows.Forms.TreeNode) Dim oFS As New DirectoryInfo(oParent.FullPath & "\") Dim oDir As DirectoryInfo Dim oFile As FileInfo Try For Each oDir In oFS.GetDirectories() Dim oNode As New System.Windows.Forms.TreeNode() oNode.Text = oDir.Name oNode.ImageIndex = 0 oNode.SelectedImageIndex = 0

264

Visual Basic 2010

oParent.Nodes.Add(oNode) oNode.Nodes.Add("") Next chemin = oParent.FullPath + "\" Catch ex As Exception MsgBox("Cannot list folders of " & oParent.FullPath & ":" & ex.ToString) End Try Try For Each oFile In oFS.GetFiles() Dim oNode As New System.Windows.Forms.TreeNode() oNode.Text = oFile.Name oNode.ImageIndex = 2 oNode.SelectedImageIndex = 2 oParent.Nodes.Add(oNode) Next Catch ex As Exception MsgBox("Cannot list files in " & oParent.FullPath & ":" & ex.ToString) End Try End Sub

Les premires lignes dfinissent les objets qui seront utiliss dans la procdure:
Dim oFS As New DirectoryInfo(oParent.FullPath & "\") Dim oDir As DirectoryInfo Dim oFile As FileInfo

oFS est un objet DirectoryInfo qui pointe sur le nud actuel. oDir est un objet Directory Info qui sera utilis pour dcrire les entres du nud actuel. Enfin, iFile est un objet de type FileInfo qui sera utilis pour dcrire les entres terminales du nud courant.

Une instruction For Each dcrit les dossiers du nud courant:


Try For Each oDir In oFS.GetDirectories()

Les donnes correspondant aux entres dcrites seront stockes dans lobjet TreeNode oNode:
Dim oNode As New System.Windows.Forms.TreeNode()

Le nom de lentre et limage correspondante (dossier ferm) sont stocks dans lobjet oNode:
oNode.Text = oDir.Name oNode.ImageIndex = 0

Chapitre 10

Jouer des sons WAV

265

Puis le nud est ajout la structure TreeView:


oNode.SelectedImageIndex = 0 oParent.Nodes.Add(oNode) oNode.Nodes.Add("")

Le chemin du nud courant est mmoris dans la variable chemin:


chemin = oParent.FullPath + "\"

Si une erreur se produit, un message derreur apparat laide de la procdure MsgBox():


Catch ex As Exception MsgBox("Impossible de crer le dossier " & oParent.FullPath & ":" & ex.ToString) End Try

Une nouvelle instruction For Each dcrit alors tous les fichiers prsents dans le nud qui vient dtre dpli:
Try For Each oFile In oFS.GetFiles()

Les donnes correspondant aux entres dcrites seront stockes dans lobjet TreeNode oNode:
Dim oNode As New System.Windows.Forms.TreeNode()

Le nom de lentre et limage correspondante (fichier) sont stocks dans lobjet oNode:
oNode.Text = oFile.Name oNode.ImageIndex = 2

Puis le fichier est ajout la structure TreeView:


oNode.SelectedImageIndex = 2 oParent.Nodes.Add(oNode)

Si une erreur se produit, un message derreur apparat laide de la procdure MsgBox():


Catch ex As Exception MsgBox("Impossible dafficher les fichiers dans le dossier " & oParent.FullPath & ":" & ex.ToString) End Try

Le contrle TreeView est maintenant entirement oprationnel. Vous pouvez lancer le programme en appuyant sur la touche F5 et tester son fonctionnement. Nous allons maintenant jouer le son slectionn par lutilisateur en mettant en uvre la procdure My.Computer.Audio.Play().

266

Visual Basic 2010

Utilisation du contrle TreeView


Lorsque lutilisateur slectionne un fichier dans le contrle Treeview, un vnement AfterSelect est gnr. Nous allons utiliser cet vnement pour mmoriser le nom du fichier slectionn dans un objet String. Basculez dans la fentre de code. Slectionnez lobjet TreeView1 et lvnement AfterSelect puis compltez la procdure TreeView1_After Select() comme suit:
Private Sub TreeView1_AfterSelect(ByVal sender As Object, ByVal e As System. Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect selection = chemin + e.Node.Text End Sub

Lunique instruction de cette procdure mmorise le chemin complet du fichier slectionn par lutilisateur dans la variable selection. Pour terminer le programme, nous allons dfinir la procdure vnementielle lie au clic sur le bouton de commande.

Excution du fichier audio


Double-cliquez sur le bouton de commande et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click My.Computer.Audio.Play(selection) End Sub

Lunique instruction de cette procdure utilise la procdure My.Computer.Audio.Play() pour jouer le son WAV slectionn par lutilisateur: Voici le listing complet de lapplication. Vous trouverez les fichiers correspondants dans le dossier Player aprs installation des sources de louvrage.
Imports System.io Public Class Form1 Dim chemin, selection As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dim oNode As New System.Windows.Forms.TreeNode()

Chapitre 10


Try

Jouer des sons WAV

267

oNode.ImageIndex = 0 oNode.SelectedImageIndex = 0 oNode.Text = "C:" TreeView1.Nodes.Add(oNode) oNode.Nodes.Add("") Catch ex As Exception MsgBox("Impossible de crer le noeud initial:" & ex.ToString) End End Try End Sub Private Dim Dim Dim Try For Each oDir In oFS.GetDirectories() Dim oNode As New System.Windows.Forms.TreeNode() oNode.Text = oDir.Name oNode.ImageIndex = 0 oNode.SelectedImageIndex = 0 oParent.Nodes.Add(oNode) oNode.Nodes.Add("") Next chemin = oParent.FullPath + "\" Catch ex As Exception MsgBox("Impossible de lister larborescence de " & oParent.FullPath & ":" & ex.ToString) End Try Try For Each oFile In oFS.GetFiles() Dim oNode As New System.Windows.Forms.TreeNode() oNode.Text = oFile.Name oNode.ImageIndex = 2 oNode.SelectedImageIndex = 2 oParent.Nodes.Add(oNode) Next Catch ex As Exception MsgBox("Impossible de lister les fichiers dans " & oParent.FullPath & ":" & ex.ToString) End Try End Sub Sub AfficheFils(ByVal oParent As System.Windows.Forms.TreeNode) oFS As New DirectoryInfo(oParent.FullPath & "\") oDir As DirectoryInfo oFile As FileInfo

268

Visual Basic 2010

Private Sub TreeView1_AfterSelect(ByVal sender As Object, ByVal e As System. Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect selection = chemin + e.Node.Text End Sub Private Sub TreeView1_BeforeExpand(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand If e.Node.ImageIndex = 2 Then Exit Sub Try If e.Node.GetNodeCount(False) = 1 And e.Node.Nodes(0).Text = "" Then e.Node.Nodes(0).Remove() AfficheFils(e.Node) End If Catch ex As Exception MsgBox("Impossible de dvelopper " & e.Node.FullPath & ":" & ex.ToString) End Try If e.Node.GetNodeCount(False) > 0 Then e.Node.ImageIndex = 1 e.Node.SelectedImageIndex = 1 End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click My.Computer.Audio.Play(selection) End Sub End Class

11
Manipuler des donnes tabulaires
Ce chapitre propose deux projets qui ont un rapport avec la manipulation de donnes numriques. Le premier reproduit les fonctions lmentaires dun tableur. Le second projet complte le premier en montrant comment reprsenter graphiquement des tableaux de donnes.

Minitableur
Cette application montre comment manipuler des donnes tabulaires en utilisant le contrle DataGridView. Les donnes initialement affiches dans ce contrle sont issues du fichier texte DATA.TXT, qui doit se trouver dans le dossier C:\test lexcution de lapplication. Vous pouvez modifier les donnes, ajouter de nouvelles donnes et calculer la somme de plusieurs cellules, comme vous le feriez dans un tableur. La grille contient 29colonnes et

270

Visual Basic 2010

autant de lignes que vous le souhaitez. Les barres de dfilement permettent de dplacer la fentre de visualisation dans lensemble des cellules du tableau. Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Tableur au projet et validez en cliquant sur OK. Dveloppez longlet Donnes de la Bote outils et double-cliquez sur le contrle DataGridView. Ajoutez deux boutons de commande et une zone de texte. Modifiez les proprits de ces contrles comme suit:
Contrle
Button1 Button1 Button2 Button2 TextBox DataGridView1 Form1

Proprit
Name Text Name Text Name Dock Text

Valeur
Quitter Quitter Somme Somme SommeSel Top Minitableur

Redimensionnez ces contrles et modifiez leur agencement pour obtenir un effet visuel proche de la Figure11.1.
Figure11.1 Disposition des contrles sur la feuille.

Chapitre 11

Manipuler des donnes tabulaires

271

Les donnes qui vont tre intgres dans le tableau proviennent dun fichier texte dont voici le contenu:
1800 1900 1940 1983 Amsterdam 201000 511000 794000 994062 Londres 959000 6581000 8700000 6754500 Madrid 160000 540000 1048000 3188297 Moscou 250000 1039000 4137000 8546000 New York 79000 3437000 7455000 7086096 Paris 547000 2714000 2725000 2176243 Pkin 700000 1000000 1556000 9230687

272

Visual Basic 2010

Chaque ligne du fichier texte correspond une cellule du tableau. Les lignes du tableau contiennent cinq cellules. Le tableau est donc organis comme suit:
1800
Amsterdam Londres Madrid Moscou New York Paris Pkin 201000 959000 160000 250000 79000 547000 700000

1900
511000 6581000 540000 1039000 3437000 2714000 1000000

1940
794000 8700000 1048000 4137000 7455000 2725000 1556000

1983
994062 6754500 3188297 8546000 7086096 2176243 9230687

Double-cliquez sur un endroit inoccup de la feuille et compltez la procdure Form_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim s1, s2, s3, s4, s5 As String DataGridView1.ColumnCount = 30 For i = 0 To 29 DataGridView1.Columns(i).Name = Str(i) Next Try FileOpen(1, "c:\test\data.txt", OpenMode.Input) Do s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) s5 = LineInput(1) DataGridView1.Rows.Add(New String() {s1, s2, s3, s4, s5}) Loop Until EOF(1) Catch Finally FileClose(1) End Try End Sub

Chapitre 11

Manipuler des donnes tabulaires

273

Le premier bloc dinstructions dfinit les variables utilises par lapplication:


Dim i As Integer Dim s1, s2, s3, s4, s5 As String

Le nombre de colonnes du contrle DataGridView est ensuite fix 30 et les colonnes sont nommes:
DataGridView1.ColumnCount = 30 For i = 0 To 29 DataGridView1.Columns(i).Name = Str(i) Next

Enfin, le dernier bloc dinstructions utilise le fichier c:\test\data.txt pour afficher les donnes dans le contrle AxMSFlexGrid1. Louverture et la lecture du fichier se font lintrieur dune instruction Try:
Try FileOpen(1, "c:\test\data.txt", OpenMode.Input)

Dans un premier temps, les cinq donnes afficher sur une ligne sont lues:
Do s1 s2 s3 s4 s5 = = = = = LineInput(1) LineInput(1) LineInput(1) LineInput(1) LineInput(1)

Elles sont ensuite stockes dans le contrle DataGridView:


DataGridView1.Rows.Add(New String() {s1, s2, s3, s4, s5})

Le processus prend fin lorsque la fin du fichier est atteinte:


Loop Until EOF(1)

Le fichier c:\test\data.txt est alors ferm:


Catch Finally FileClose(1) End Try

Vous pouvez excuter lapplication en appuyant sur la touche F5. Les donnes sont lues et apparaissent dans la grille, mais les boutons de commande et la zone de texte sont encore inoprationnels.

274

Visual Basic 2010

Basculez sur la fentre de code. Slectionnez DataGridView1 dans la premire liste droulante et Click dans la seconde. Compltez la procdure DataGridView1_Click() comme suit:
Private Sub DataGridView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.Click SommeSel.Text = DataGridView1.CurrentCell.Value SommeSel.Focus() End Sub

La premire instruction copie la cellule slectionne (ou la premire cellule du bloc slectionn) dans la zone de texte:
SommeSel.Text = DataGridView1.CurrentCell.Value

La seconde instruction donne le focus la zone de texte:


SommeSel.Focus()

Toujours dans la fentre de code, slectionnez SommeSel dans la premire liste droulante et KeyDown dans la seconde. Compltez la procdure SommeSel_KeyDown() comme suit:
Private Sub SommeSel_KeyDown(ByVal sender As Object, ByVal e As System.Windows. Forms.KeyEventArgs) Handles SommeSel.KeyDown DataGridView1.CurrentCell.Value = SommeSel.Text End Sub

Lunique instruction de cette procdure copie le contenu de la zone de texte dans la cellule courante du contrle DataGridView. Double-cliquez sur le bouton Somme et ajoutez les instructions suivantes la procdure Somme_Click():
Private Sub Somme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Somme.Click Dim lig, col, som As Integer Dim i As Integer Dim selectedcellcount As Integer = DataGridView1.GetCellCount(DataGridViewElementStates.Selected) If selectedcellcount > 0 Then som = 0 For i = 0 To selectedcellcount - 1 lig = DataGridView1.SelectedCells(i).RowIndex col = DataGridView1.SelectedCells(i).ColumnIndex som = som + DataGridView1.SelectedCells(i).FormattedValue

Chapitre 11


Next SommeSel.Text = Str(som) End If End Sub

Manipuler des donnes tabulaires

275

Les deux premires lignes dfinissent les variables qui permettront daccder aux cellules slectionnes:
Dim lig, col, som As Integer Dim i As Integer

La variable entire SelectedCellCount est alors dfinie et initialise avec la valeur renvoye par la fonction GetCellCount():
Dim selectedcellcount As Integer = DataGridView1.GetCellCount(DataGridView ElementStates.Selected)

Si au moins une cellule est slectionne:


If selectedcellcount > 0 Then

la somme des cellules slectionnes doit tre calcule. Pour cela, la variable rsultat som est initialise zro et les SelectedCellCount cellules slectionnes sont parcourues:
som = 0 For i = 0 To selectedcellcount - 1

Les index de ligne et de colonne sont calculs dans les variables lig et col laide des proprits RowIndex et ColumnIndex des objets SelectedCell(i):
lig = DataGridView1.SelectedCells(i).RowIndex col = DataGridView1.SelectedCells(i).ColumnIndex

Puis le rsultat est incrment de la valeur contenue dans la cellule pointe:


som = som + DataGridView1.SelectedCells(i).FormattedValue

Pour terminer cette application, double-cliquez sur le bouton Quitter et ajoutez le mot End la procdure Quitter_Click():
Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Quitter.Click End End Sub

Le programme est entirement oprationnel. Vous pouvez modifier une ou plusieurs cellules, slectionner une zone rectangulaire contenant des donnes numriques et en calculer la somme.

276

Visual Basic 2010

Voici le listing complet du programme. Les fichiers correspondants se trouvent dans le dossier Tableur aprs installation des sources de louvrage.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dim i As Integer Dim s1, s2, s3, s4, s5 As String DataGridView1.ColumnCount = 30 For i = 0 To 29 DataGridView1.Columns(i).Name = Str(i) Next Try FileOpen(1, "c:\test\data.txt", OpenMode.Input) Do s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) s5 = LineInput(1) DataGridView1.Rows.Add(New String() {s1, s2, s3, s4, s5}) Loop Until EOF(1) Catch Finally FileClose(1) End Try End Sub Private Sub DataGridView1_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles DataGridView1.Click SommeSel.Text = DataGridView1.CurrentCell.Value SommeSel.Focus() End Sub Private Sub SommeSel_KeyDown(ByVal sender As Object, ByVal e As

Chapitre 11

Manipuler des donnes tabulaires

277

System.Windows.Forms.KeyEventArgs) Handles SommeSel.KeyDown DataGridView1.CurrentCell.Value = SommeSel.Text End Sub Private Sub Somme_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Somme.Click Dim lig, col, som As Integer Dim i As Integer Dim selectedcellcount As Integer = DataGridView1.GetCellCount(DataGridViewElementStates.Selected) If selectedcellcount > 0 Then som = 0 For i = 0 To selectedcellcount - 1 lig = DataGridView1.SelectedCells(i).RowIndex col = DataGridView1.SelectedCells(i).ColumnIndex som = som + DataGridView1.SelectedCells(i).FormattedValue Next SommeSel.Text = Str(som) End If End Sub Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Quitter.Click End End Sub End Class

Minigrapheur
Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Grapheur au projet et validez en cliquant sur OK. Pour mettre en place ce projet, nous allons utiliser deux contrles lis lapplication Microsoft Office 2003: AxSpreadSheet et AxChartSpace.

278

Visual Basic 2010

Ces contrles ntant pas disponibles par dfaut dans la Bote outils, lancez la commande Ajouter une rfrence du menu Projets. Sous longlet COM, slectionnez Microsoft Office Web Components 11.0 (voir Figure11.2).
Figure11.2 Ajout des contrles COM
AxSpreadSheet et AxChartSpace.

Info

Si Office XP est install sur votre ordinateur, slectionnez Microsoft Office Web Components 10.0 pour installer la version10 de ce composant. Si Office 2007 ou 2010 est install sur votre ordinateur, le composant OWC nest plus disponible. Vous pouvez cependant le tlcharger ladresse www. microsoft.com/downloads/details.aspx?FamilyId=7287252C-402E-4F7297A5-E0FD290D4B76&displaylang=fr. Installez ce composant et slectionnez Microsoft Office Web Components 11.0 dans la bote de dialogue Ajouter une rfrence pour le rendre accessible lapplication.

Pour rendre accessibles les contrles AxSpreadSheet et AxChartSpace dans la Bote outils, lancez la commande Choisir des lments de bote outils dans le menu Outils, slectionnez longlet Composants web dans la bote de dialogue Choisir des lments de bote outils, cochez les cases Microsoft Office Chart11.0 et Microsoft Office Spread sheet11.0 (voir Figure11.3). Les contrles AxSpreadSheet et AxChartSpace sont maintenant disponibles sous longlet Gnral de la Bote outils (voir Figure11.4).

Chapitre 11

Manipuler des donnes tabulaires

279

Figure11.3 Ajout des contrles la Bote outils.

Figure11.4 Les deux contrles ont t ajouts la Bote outils.

Longlet Gnral de la Bote outils tant dvelopp, double-cliquez sur Microsoft Office Spreadsheet11.0, puis sur Microsoft Office Chart11.0 (avec Office XP, il vous suffit de double-cliquer sur la version10 de ces deux contrles). Agrandissez la feuille de lapplication, puis redimensionnez et repositionnez ces deux contrles pour obtenir lagencement de la Figure11.5.

280

Visual Basic 2010

Figure11.5 La feuille de lapplication Tableur, en mode dition.

Excutez lapplication en appuyant sur la touche F5. Vous pouvez constater que le tableur est entirement oprationnel, mais que lobjet Chart naffiche aucun graphique (voir Figure11.6).
Figure11.6 La feuille de lapplication, en mode Excution.

Chapitre 11

Manipuler des donnes tabulaires

281

Nous allons donner vie ces deux contrles en insrant les donnes du fichier Data.txt (voir section prcdente) dans le contrle Spreadsheet et en reprsentant ces donnes dans le contrle Chart. Double-cliquez sur une endroit inoccup de la feuille et compltez la procdure Form_ Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Lecture des donnes dans le fichier texte Data.txt i = 0 Try FileOpen(1, "c:\test\data.txt", OpenMode.Input) Do i = i + 1 s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) s5 = LineInput(1) Dim a As Object() = {s1, s2, s3, s4, s5} s = "A" + Chr(48 + i) + ":E" + Chr(48 + i) With AxSpreadsheet1.ActiveSheet .Range(s).Value = a End With Loop Until EOF(1) Catch Finally FileClose(1) End Try Liaison du graphique la feuille de calcul AxChartSpace1.DataSource = AxSpreadsheet1.GetOcx() Dim oChart As OWC11.ChChart, oSer As OWC11.ChSeries oChart = AxChartSpace1.Charts.Add() oChart.HasLegend = True oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "B1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "B2:B8")

282

Visual Basic 2010

oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "C1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "C2:C8") oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "D1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "D2:D8") oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "E1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "E2:E8") End Sub

Le premier bloc dinstructions lit le contenu du fichier c:\test\data.txt. La lecture se fait lintrieur dune structure Try:
Try FileOpen(1, "c:\test\data.txt", OpenMode.Input)

Une boucle Do Loop lit les donnes cinq par cinq:


Do i = i + 1 s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) s5 = LineInput(1)

Ces donnes sont stockes dans la collection S:


Dim a As Object() = {s1, s2, s3, s4, s5} s = "A" + Chr(48 + i) + ":E" + Chr(48 + i)

Puis elles sont copies dans le contrle Spreadsheet1:


With AxSpreadsheet1.ActiveSheet .Range(s).Value = a End With

La lecture se poursuit jusqu la fin du fichier:


Loop Until EOF(1)

Chapitre 11

Manipuler des donnes tabulaires

283

Le fichier est alors ferm:


Catch Finally FileClose(1) End Try

Linstruction suivante relie la feuille de calcul et le graphique:


AxChartSpace1.DataSource = AxSpreadsheet1.GetOcx()

Aprs avoir dfini les objets OWC11.ChChart oChart et OWC11.ChSeries oSer:


Dim oChart As OWC11.ChChart, oSer As OWC11.ChSeries

un nouveau graphisme est initialis:


oChart = AxChartSpace1.Charts.Add()

Puis la proprit HasLegend de lobjet oChart est mise True pour indiquer que le graphisme contient une lgende:
oChart.HasLegend = True

Les quatre blocs dinstructions relient une srie de donnes avec une plage de cellules de la feuille de calcul. Dans un premier temps, la procdure SeriesCollection.Add() est invoque pour ajouter une nouvelle srie de donnes:
oSer = oChart.SeriesCollection.Add

Pour dfinir la nouvelle srie, il faut spcifier:

le nom de la srie:
oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "B1")

les cellules contenant les noms des catgories:


oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8")

les cellules contenant les donnes numriques de la srie reprsenter:


oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "B2:B8")

Pour que ce code soit en mesure de fonctionner, vous devez ajouter une clause Imports en dbut de programme:
Imports OWC11 = Microsoft.Office.Interop.Owc11

284

Visual Basic 2010

et dclarer les variables String et Integer utilises la suite de la ligne Public Class
Form1:
Dim s, s1, s2, s3, s4, s5 As String Dim i As Integer

Appuyez sur la touche F5 pour excuter le programme. La feuille de calcul et la reprsentation graphique apparaissent ds louverture de la fentre (voir Figure11.7).
Figure11.7 Quelques lignes de code ont suffi pour rendre cette application oprationnelle.

Info

La plage de cellules A1:E8 et la reprsentation graphique tant lies, vous pouvez modifier les donnes numriques et voir leur impact dans le graphique.

Voici le listing complet de lapplication. Vous trouverez les fichiers complmentaires dans le dossier Grapheur aprs installation des sources de louvrage.
Imports OWC11 = Microsoft.Office.Interop.Owc11 Public Class Form1 Dim s, s1, s2, s3, s4, s5 As String Dim i As Integer

Chapitre 11

Manipuler des donnes tabulaires

285

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Lecture des donnes dans le fichier texte Data.txt i = 0 Try FileOpen(1, "c:\test\data.txt", OpenMode.Input) Do i = i + 1 s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) s5 = LineInput(1) Dim a As Object() = {s1, s2, s3, s4, s5} s = "A" + Chr(48 + i) + ":E" + Chr(48 + i) With AxSpreadsheet1.ActiveSheet .Range(s).Value = a End With Loop Until EOF(1) Catch Finally FileClose(1) End Try Liaison du graphique la feuille de calcul AxChartSpace1.DataSource = AxSpreadsheet1.GetOcx() Dim oChart As OWC11.ChChart, oSer As OWC11.ChSeries oChart = AxChartSpace1.Charts.Add() oChart.HasLegend = True oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "B1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "B2:B8") oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "C1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "C2:C8")

286

Visual Basic 2010

oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "D1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "D2:D8") oSer = oChart.SeriesCollection.Add oSer.SetData(OWC11.ChartDimensionsEnum.chDimSeriesNames, 0, "E1") oSer.SetData(OWC11.ChartDimensionsEnum.chDimCategories, 0, "A2:A8") oSer.SetData(OWC11.ChartDimensionsEnum.chDimValues, 0, "E2:E8") End Sub End Class

12
Bases de donnes
ADO.NET est le successeur dADO (ActiveX Data Objects). Ses fonctionnalits permettent daccder simplement des bases de donnes locales ou distantes. travers un ensemble de procdures et de fonctions, il est possible de visualiser, de modifier et de supprimer les donnes contenues dans une base de donnes, que celle-ci se trouve sur lordinateur local ou sur un ordinateur distant. Pour illustrer le fonctionnement dADO.NET, nous allons prendre deux exemples. Le premier permettra daccder une base de donnes locale Microsoft Access. Le second sera une copie conforme du premier, ceci prs que les donnes se trouveront sur un serveur distant.

Accs une base de donnes locale


Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Nommez le projet db et validez en cliquant sur OK. Ajoutez un contrle DataGridView et quatre boutons de commande

288

Visual Basic 2010

la feuille du projet et modifiez les proprits de ces objets comme indiqu dans le tableau suivant:
Contrle
Form1 Button1 Button1 Button2 Button2 Button3 Button3 Button4 Button4

Proprit
Text Text Name Text Name Text Name Text Name

Valeur
Accs une base locale Bibliothque Bibliothque Tous Tous Mise jour MiseAJour Quitter Quitter

Pour terminer la mise en forme de lapplication, cliquez sur le contrle DataGridView et affectez la valeur Top sa proprit Dock. Pour cela, dveloppez cette proprit en droulant la liste Dock et cliquez sur le rectangle suprieur (voir Figure12.1).
Figure12.1 Affectation de la valeur Top la proprit Dock du contrle DataGridView1.

La feuille de lapplication devrait maintenant avoir lallure de la Figure12.2.

Chapitre 12

Bases de donnes

289

Figure12.2 Lapplication db mise en forme, en mode dition.

Cette application utilise les bibliothques System.Data et System.Data.OleDB. Ajoutez les deux instructions ci-aprs en tte de listing:
Imports System.Data Imports System.Data.OleDb

Dfinissez les objets utiliss par lapplication la suite du code gnr par Windows Form Designer:
Dim Dim Dim Dim Dim Connexion As String ConnexionOLE As OleDBConnection = New oledbConnection() da As OleDbDataAdapter ds As DataSet dv As DataView

Dim cb As OleDbCommandBuilder

Lexemple choisi repose sur une base de donnes Access librement tlchargeable sur la page http://www.info-3000.com/access/bestofgestion/index.php. Cette base contient plusieurs tables de donnes. Nous allons nous intresser lune dentre elles, qui a pour nom "Catgories". Pour afficher lensemble des enregistrements qui la composent, nous allons dfinir la procdure AfficheTous():
Public Sub AfficheTous() Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion ConnexionOLE.Open() da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable")

290

Visual Basic 2010

dv = ds.Tables("mytable").DefaultView ConnexionOLE.Close() DataGridView1.DataSource = dv dv.AllowEdit = True End Sub

La premire ligne initialise la chane Connexion avec une valeur qui indique le type (Provider) et le nom (Data Source) de la base de donnes laquelle accder:
Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\bestofgestion97.mdb"

Info

Remarquez le sparateur ";" entre les deux paramtres de la chane Connexion. Si ncessaire, vous utiliserez ce mme sparateur pour prciser le nom dutilisateur (User ID) et le mot de passe (password).

Cette chane est passe lobjet OleDBConnexion ConnexionOLE pour tablir la connexion avec la base de donnes:
ConnexionOLE.ConnectionString = Connexion

Puis un objet OleDbDataAdapter est utilis pour accder la table T_TravailObjet de la base:
da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE)

Les donnes de la table T_TravailObjet sont places dans un objet DataSet. Ce dernier est rempli laide de la mthode Fill():
ds = New DataSet() da.Fill(ds, "mytable")

Pour que lobjet DataSet puisse tre dit par lapplication, il est ncessaire de le copier dans un objet DataView:
dv = ds.Tables("mytable").DefaultView

Il suffit maintenant de lassocier au contrle DataGridView et de valider son dition:


DataGridView1.DataSource = dv dv.AllowEdit = True

Pour que tous les enregistrements de la table Catgories soient visualiss dans le contrle DataGrid ds lexcution de lapplication, il suffit dinvoquer la procdure AfficheTous() dans Form1_Load(). Double-cliquez sur un emplacement inoccup de la feuille et compltez la procdure Form1_Load() comme suit:

Chapitre 12

Bases de donnes

291

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AfficheTous() End Sub

La fentre de lapplication se prsente alors comme montr la Figure12.3.


Figure12.3 Affichage de tous les enregistrements de la table T_TravailObjet.

Nous allons maintenant associer du code aux quatre boutons de commande de la feuille. Lebouton Bibliothque va limiter laffichage aux enregistrements dont le champ LibelleObjet vaut "bibliothque". Double-cliquez sur le premier bouton et compltez la procdure Bibliothque_Click() comme suit:
Private Sub Bibliothque_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Condiments.Click Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet where [LibelleObjet] =bibliothque", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") dv = ds.Tables("mytable").DefaultView DataGrid1.DataSource = dv dv.AllowEdit = True End Sub

Cette procdure est trs proche de AfficheTous(), ceci prs que la commande dinitialisation de lobjet OleDbDataAdapter utilise une clause where pour que seuls les enregistrements dont le champ Nom de catgorie vaut Condiments soient slectionns:
da = New OleDbDataAdapter("Select * from T_TravailObjet where [LibelleObjet] =bibliothque", ConnexionOLE)

292

Visual Basic 2010

Double-cliquez sur le bouton Tous. La procdure Tous_Click() est identique la procdure Form1_Load(). Elle se contente dinvoquer AfficheTous() afin dafficher tous les enregistrements de la table Catgories:
Private Sub Tous_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tous.Click AfficheTous() End Sub

Les champs de donnes de la table peuvent tre modifis. Mais, attention, si vous refermez lapplication, ils ne seront pas automatiquement sauvegards dans la base de donnes! Pour cela, vous devrez appeler la mthode Update(). Cette action sera effectue en appuyant sur le bouton Mise jour. Double-cliquez sur ce bouton et compltez la procdure MiseAJour_Click() comme suit:
Private Sub MiseAJour_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MiseAJour.Click Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion cb = New OleDbCommandBuilder(da) da.Update(ds, "mytable") End Sub

Aprs avoir spcifi la base de donnes utiliser:


Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion

lobjet OleDbCommandBuilder cb est cr a partir de lobjet OleDbDataAdapter da:


cb = New OleDbCommandBuilder(da)

Il suffit maintenant dutiliser la mthode Update() pour mettre jour la table avec le contenu de lobjet OleDbDataAdapter:
da.Update(ds, "mytable")

Pour terminer, double-cliquez sur le bouton Quitter et ajoutez une instruction End dans la procdure Quitter_Click():
Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Quitter.Click End End Sub

Voici le listing complet de lapplication. Les fichiers correspondants se trouvent dans le dossier db aprs installation des sources de louvrage.

Chapitre 12

Bases de donnes

293

Imports System.Data Imports System.Data.OleDb Public Class Form1 Dim Connexion As String Dim ConnexionOLE As OleDbConnection Dim da As OleDbDataAdapter Dim ds As DataSet Dim dv As DataView Dim cb As OleDbCommandBuilder Public Sub AfficheTous() Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE = New OleDbConnection ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") dv = ds.Tables("mytable").DefaultView DataGridView1.DataSource = dv dv.AllowEdit = True End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load AfficheTous() End Sub Private Sub Bibliothque_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bibliothque.Click Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet where [LibelleObjet] =bibliothque", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") dv = ds.Tables("mytable").DefaultView DataGridView1.DataSource = dv dv.AllowEdit = True End Sub

294

Visual Basic 2010

Private Sub Tous_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Tous.Click AfficheTous() End Sub Private Sub MiseAjour_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MiseAjour.Click Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion cb = New OleDbCommandBuilder(da) da.Update(ds, "mytable") End Sub Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Quitter.Click End End Sub End Class

Accs une base de donnes distante


Dans cette section, nous allons vous montrer comment crer une application capable dexploiter des donnes contenues dans une base de donnes distante. Cette base a pour nom BestOfGestion.mdb. Elle est librement tlchargeable sur la page www.info-3000.com/ access/bestofgestion/index.php. La technique utilise relve des services web. Pour tous renseignements complmentaires, consultez le Chapitre25.

Dfinition du service web


Lancez la commande Nouveau/Site web du menu Fichier. Slectionnez .NET Framework 3.5 dans la liste droulante Frameworks. Slectionnez le modle Service web ASP.NET, donnez le nom Service1 au nouveau service web et validez en cliquant sur OK. Ajoutez les clauses Imports suivantes en tte de listing:
Imports System.Data Imports System.Data.OleDb

La clause <webservice> (devant le mot-cl Public) indique que la classe Service1 sera utilise comme service web :

Chapitre 12

Bases de donnes

295

<WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService

Info

Lorsque, par la suite, le service sera implant sur un serveur web, vous devrez prciser son nom de domaine la suite du mot-cl NameSpace.

Dfinissez les variables utilises par le service web:


Dim Dim Dim Dim Connexion As String ConnexionOLE As OleDbConnection = New OleDbConnection() da As OleDbDataAdapter ds As DataSet

Supprimez la fonction HelloWorld(), gnre automatiquement par Visual Studio, et remplacez-la par la fonction AfficheTous() suivante:
<WebMethod()> Public Function AfficheTous() As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function

Cette fonction sera exploite sur le Web (<WebMethod()>). Elle ne demande aucun argument; mais renvoie un DataSet:
<WebMethod()> Public Function AfficheTous() As DataSet

Les deux lignes suivantes tablissent une connexion avec la base de donnes. Ici, il sagit de la base Access c:\bestofgestion97.mdb:
Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion

Tous les enregistrements de la table T_TravailObjet sont slectionns et placs dans lobjet OleDbDataAdapter da:
da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE)

296

Visual Basic 2010

Puis le DataSet ds est rempli avec lobjet da:


ds = New DataSet() da.Fill(ds, "mytable")

Enfin, lobjet DataSet ds est retourn par la fonction:


Return ds

Voici le code complet de la classe Service1:


Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.Data Imports System.Data.OleDb

<WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService Dim Connexion As String Dim ConnexionOLE As OleDbConnection = New OleDbConnection() Dim da As OleDbDataAdapter Dim ds As DataSet <WebMethod()> Public Function AfficheTous() As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function End Class

Appuyez sur la touche F5. La fonction AfficheTous() peut tre teste (voir Figure12.4).

Chapitre 12

Bases de donnes

297

Figure12.4 Cette page permet de tester la fonction AfficheTous.

Cliquez sur le lien AfficheTous puis sur le bouton Appeler. Le rsultat de la fonction AfficheTous() apparat sous une forme XML (voir Figure12.5).
Figure12.5 Rsultat de la fonction fficheTous(). A

Dans la barre de notification, une icne indique que le service web est en cours dexcution et prcise le port utilis (voir Figure12.6).

298

Visual Basic 2010

Figure12.6 Dans cet exemple, le service web est accessible sur le port53946.

Ne terminez pas lexcution du service. Nous en aurons besoin dans la section suivante.

Utilisation du service web


Vous allez maintenant dfinir un projet qui exploite le service web dfini dans la section prcdente. Ouvrez une nouvelle instance de Visual Studio et lancez la commande Nouveau> Site web du menu Fichier. Choisissez .NET Framework3.5 dans la premire liste droulante et slectionnez le modle Site web ASP.NET. Donnez le nom TestBDDistante lapplication et validez (cette application se trouve dans le dossier Projects\TestBDDistante des sources de louvrage). Cliquez du bouton droit sur lentre C:\\TestBDDistante dans lExplorateur de solutions et choisissez Ajouter une rfrence web dans le menu surgissant. Saisissez ladresse correspondant au service web en cours de dbogage dans la zone URL (voir Figure12.6). Pour connatre le port utilis par le service en cours de dbogage, il suffit de pointer licne Serveur de dveloppement ASP.NET dans la barre de notifi cation (voir Figure12.7).

Info

Figure12.7 Licne Serveur de dveloppement ASP.NET indique le port utilis par le service web.

Cliquez sur le bouton Aller . La bote de dialogue Ajouter une rfrence web se prsente comme montr la Figure12.8.

Chapitre 12

Bases de donnes

299

Figure12.8 Le service Service1 est sur le point dtre intgr au projet web.

Cliquez sur Ajouter une rfrence. Le service web Service1 est maintenant rfrenc dans le projet. Vous pouvez donc utiliser sa mthode AfficheTous() (voir Figure12.9).
Figure12.9 Le service web Service1 est rfrenc dans le projet.

Ajoutez un contrle GridView sur la page de lapplication (ce contrle se trouve sous longlet Donnes de la Bote outils). La fentre de conception se prsente comme montr la Figure12.10.

300

Visual Basic 2010

Figure12.10 Le contrle GridView a t plac sur la feuille.

Pour rendre ce contrle oprationnel, vous devez linitialiser. Droulez la liste Choisir la source de donnes et slectionnez lentre <Nouvelle source de donnes>. Une bote de dialogue intitule Assistant Configuration de source de donnes saffiche (voir Figure12.11).
Figure12.11 Cet assistant va vous aider associer la fonction fficheTous() au contrle A GridView.

Chapitre 12

Bases de donnes

301

Slectionnez Objet dans la zone partir do lapplication obtiendra-t-elle les donnes, puis validez en cliquant sur OK. Lassistant vous demande alors de choisir un "mtier" par lintermdiaire duquel vous pourrez mettre jour les donnes de la table (voir Figure12.12).
Figure12.12 Choix du mtier localhost. Service.

Choisissez localhost.Service et cliquez sur Suivant. Vous devez maintenant choisir la mthode qui permettra de remplir lobjet GridView. Droulez la liste et choisissez la mthode AfficheTous() (voir Figure12.13).
Figure12.13 La mthode AfficheTous() va permettre de remplir le GridView.

302

Visual Basic 2010

Cliquez sur Terminer. Vous pouvez vrifier que la mthode AfficheTous() du service web Service1 est bien excute en cliquant sur le bouton Dmarrer le dbogage. Une bote de dialogue vous informe que le dbogage ne peut pas tre ralis (voir Figure 12.14). Slectionnez loption Modifier le fichier web.config pour activer le dbogage et validez en cliquant sur OK.
Figure12.14 Vous devez activer le dbogage.

Au bout de quelques secondes, lExplorateur web affiche le contenu de la table renvoye par la mthode AfficheTous() (voir Figure12.15).
Figure12.15 La communication avec le service web a renvoy les donnes escomptes.

Utilisation plus complte du service web


Nous allons maintenant amliorer le service web et lapplication qui lutilise pour adresser des commandes SQL la base de donnes bestofgestion97.mdb.

Chapitre 12

Bases de donnes

303

Ouvrez le service web Service1. Ajoutez la mthode AfficheBiblio() pour ne slectionner que les condiments dans la table Catgories:
<WebMethod()> Public Function AfficheBiblio() As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet where [LibelleObjet] =bibliothque", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function

Cette mthode est trs proche de AfficheTous(), ceci prs que linstruction de slection des enregistrements dans la table T_TravailObjet est plus restrictive. Seuls les enregis trements dont le champ LibelleObjet a pour valeur bibliothque sont slectionns:
da = New OleDbDataAdapter("Select * from T_TravailObjet where [LibelleObjet]=bibliothque", ConnexionOLE)

Dfinissez maintenant la mthode AfficheSQL(). Elle permettra lutilisateur dinterroger la base de donnes en entrant une requte SQL de son choix:
<WebMethod()> Public Function AfficheSQL(ByVal st As String) As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter(st, ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function

Remarquez la dfinition de la fonction AfficheSQL(). Celle-ci admet un argument String et retourne un DataSet:
<WebMethod()> Public Function AfficheSQL(ByVal st As String) As DataSet

La chane st passe en argument de la fonction est utilise pour slectionner les enregis trements dans lobjet da:
da = New OleDbDataAdapter(st, ConnexionOLE)

Voici le code complet du service web Service1. Ce code, ainsi que les fichiers complmentaires au projet, se trouvent dans le dossier Service1 aprs installation des sources de louvrage.

304

Visual Basic 2010

Imports Imports Imports Imports Imports

System.Web System.Web.Services System.Web.Services.Protocols System.Data System.Data.OleDb

<WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService Dim Dim Dim Dim Connexion As String ConnexionOLE As OleDbConnection = New OleDbConnection() da As OleDbDataAdapter ds As DataSet

<WebMethod()> Public Function AfficheTous() As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function <WebMethod()> Public Function AfficheBiblio() As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion da = New OleDbDataAdapter("Select * from T_TravailObjet where [LibelleObjet] =bibliothque", ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function <WebMethod()> Public Function AfficheSQL(ByVal st As String) As DataSet Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\\bestofgestion97.mdb" ConnexionOLE.ConnectionString = Connexion

Chapitre 12

Bases de donnes

305

da = New OleDbDataAdapter(st, ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function End Class

Cliquez sur le bouton Dmarrer le dbogage pour lancer le service web. Une icne dans la barre de notification indique que le service web est actif (voir Figure12.16) et une page web signale que trois mthodes sont accessibles dans le service (voir Figure12.17).
Figure12.16 Dans cet exemple, le service web est accessible sur le port 1202. Figure12.17 Les trois mthodes du service web.

Vous allez maintenant dfinir une application qui utilise les trois mthodes du service web prcdent. Ouvrez une nouvelle instance de Visual Studio et lancez la commande Nouveau/Site web du menu Fichier. Choisissez .NET Framework3.5 dans la premire liste droulante, slectionnez le modle Site Web ASP.NET, donnez le nom TestBDDistante2 lapplication et validez. Une fois que linterface de lapplication a t cre par Visual Studio.NET, cliquez du bouton droit sur lentre C:\\TestBDDistante2 dans lExplorateur de solutions et slectionnez Ajouter une rfrence web dans le menu surgissant. Entrez ladresse correspondant

306

Visual Basic 2010

au service web local cr prcdemment dans la zone URL de la bote de dialogue Ajouter une rfrence web et validez en cliquant sur Aller . Quelques instants plus tard, les mthodes AfficheBiblio(), AfficheSQL() et AfficheTous() proposes par le service sont rfrences dans la bote de dialogue Ajouter une rfrence web (voir Figure12.18).
Figure12.18 Service1 donne accs trois mthodes.

Cliquez sur Ajouter une rfrence. LExplorateur de solutions laisse apparatre le nouveau service (voir Figure12.19).
Figure12.19 Le nouveau service est bien rfrenc dans lapplication.

Chapitre 12

Bases de donnes

307

En utilisant longlet Standard de la Bote outils, ajoutez trois boutons de commande et une zone de texte la feuille de lapplication. Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Button1 Button2 Button3 TextBox1

Proprit
Text Text Text Text

Valeur
Affiche tous Affiche bibliothques Excute SQL

Slectionnez longlet Donnes dans la Bote outils et dposez un contrle GridView sur la feuille de lapplication. Une bote de dialogue vous invite dfinir la source des donnes afficher. Appuyez sur la touche chap du clavier: la dfinition de ce contrle se fera dans le code. La fentre de conception doit prsent avoir lallure de la Figure12.20.
Figure12.20 La feuille de lapplication, en mode dition.

Double-cliquez sur une partie non occupe de la feuille de lapplication et compltez la procdure Page_Load() comme suit:

308

Visual Basic 2010

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheTous GridView1.DataSource = ds GridView1.DataBind() End Sub

La premire instruction donne accs au service web Service au travers de lobjet objds:
Dim objds As New localhost.Service

Aprs avoir dfini un objet DataSet ds, cet objet est initialis grce la fonction AfficheTous du service web:
Dim ds As DataSet ds = objds.AfficheTous

Il suffit maintenant de remplir le GridView de la feuille avec le DataSet ds:


GridView1.DataSource = ds.Tables(0).DefaultView GridView1.DataBind()

Pour pouvoir dfinir lobjet DataSet ds, vous devez insrer une instruction Imports au dbut du code:
Imports System.Data

Il ne reste plus qu donner vie aux boutons de commande et la zone de texte pour terminer lapplication. Fermez la fentre du navigateur pour revenir lenvironnement de dveloppement. Double-cliquez sur le premier bouton de commande et compltez la procdure Button1_ Click() comme suit:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheTous GridView1.DataSource = ds GridView1.DataBind() End Sub

Les instructions de cette procdure sont les mmes que celles excutes au dmarrage de lapplication. Elles affichent donc la totalit des enregistrements de la table.

Chapitre 12

Bases de donnes

309

Double-cliquez sur le deuxime bouton de commande et compltez la procdure Button2_ Click() comme suit:
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheBiblio GridView1.DataSource = ds.Tables(0).DefaultView GridView1.DataBind() End Sub

Cette procdure est analogue Button1_Click(), ceci prs que le DataSet est initialis avec la fonction web AfficheBiblio():
ds = objds.AfficheBiblio

Enfin, double-cliquez sur le troisime bouton de commande et compltez la procdure Button3_Click() comme suit:
Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSQL(TextBox1.Text) GridView1.DataSource = ds.Tables(0).DefaultView GridView1.DataBind() End Sub

Cette procdure est analogue aux deux prcdentes, mais elle remplit le contrle DataSet ds en interrogeant la fonction AfficheSQL() (largument fourni la fonction AfficheSQL() est le contenu du TextBox):
ds = objds.AfficheSQL(TextBox1.Text)

Voici le listing complet de lapplication. Vous le trouverez, ainsi que les fichiers complmentaires, dans le dossier TestBDDistante2.
Imports System.Data Partial Class _Default Inherits System.Web.UI.Page Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button1.Click Dim objds As New localhost.Service

310

Visual Basic 2010

Dim ds As DataSet ds = objds.AfficheTous GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheTous GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button2.Click Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheBiblio GridView1.DataSource = ds.Tables(0).DefaultView GridView1.DataBind() End Sub Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button3.Click Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSQL(TextBox1.Text) GridView1.DataSource = ds.Tables(0).DefaultView GridView1.DataBind() End Sub End Class

Appuyez sur la touche F5 pour excuter lapplication. Les Figures12.21, 12.22 et 12.23 reprsentent le formulaire web aprs avoir appuy (respectivement) sur les boutons Affiche tous, Affiche Bibliothques et Excute SQL. Dans le dernier cas, la requte SQL excute tait la suivante:
select * from T_TravailObjet where [IdTravail]=29

Chapitre 12

Bases de donnes

311

Figure12.21 Tous les enregistrements de la table Catgories saffichent.

Figure12.22 Seuls les enregistrements dont le champ LibelleObjet vaut bibliothque saffichent.

312

Visual Basic 2010

Figure12.23 Seuls les enregistrements correspondant la requte SQL apparaissent.

Accs une base de donnes via LINQ


Les bases de donnes ADO.NET, SQL Server et SQL Server Express peuvent tre accdes par lintermdiaire de requtes LINQ. Voici, titre dexemple une requte permettant de slectionner des enregistrements dans une table dune base de donnes ADO.Net:
Dim objets As DataTable = ds.Tables("T_TravailObjet") Dim query = _ From objet In objets.AsEnumerable() _ Where objet.Field(Of String)("LibelleObjet") = "bibliothque" _ Select New With { _ .IDTravailObjet = objet.Field(Of Integer)("IDTravailObjet"), _ .IDTravail = objet.Field(Of Integer)("IDTravail"), _ .Nombre = objet.Field(Of Integer)("Nombre") }

Cette requte cre un iEnumerable contenant les donnes IDTravailObjet, IDTravail et Nombre. Ces donnes proviennent des champs IDTravailObjet, IDTravail et Nombre de la table T_TravailObjet. Seuls les enregistrements dont le champ LibelleObjet vaut "Bibliothque" sont slectionns par la requte.

Chapitre 12

Bases de donnes

313

Vous vous reporterez la section intitule "LINQ to DataSet", au Chapitre27 pour avoir des informations complmentaire sur linterrogation de bases de donnes ADO.NET. Dans cet autre exemple, la table interroge est de type SQL Server:
Dim query = From orde In db.Orders Order By orde.CustomerID Select orde.CustomerID, orde.OrderID

La requte LINQ extrait les champs CustomerID et OrderID de la table Orders et les classe par ordre croissant sur le champ CustomerID. Pour avoir des informations complmentaires concernant le requtage LINQ des bases de donnes SQL Server et SQL Server Express, vous consulterez la section intitule "LINQ to SQL" au Chapitre 27.

13
Traitements multitches/ multicurs
Il y a quelques annes, on mesurait la puissance de calcul brut dun ordinateur la frquence de son microprocesseur. Aujourdhui, cette frquence se situe la plupart du temps autour des 3 GHz. En ltat actuel de la technologie, cette barrire a du mal tre franchie, essentiellement pour des raisons de dissipation thermique. Pour augmenter la puissance de calcul, les fondeurs ont eu lide de loger plusieurs puces (ou curs) dans un mme chip. Cette solution, fort prometteuse, nest encore quassez mal utilise par les diteurs de logiciels qui, bien souvent, se contentent dutiliser des instructions traditionnelles, de type monocur. Heureusement, avec Visual Basic 2010, la mise en place dun traitement multitches/ multicurs est un vrai jeu denfant. Cette facilit de mise en uvre dcoule de plusieurs techniques:

Le composant BackgroundWorker: grce lui, un traitement consommateur de temps machine peut tre implment dans un thread qui sexcutera en tche de fond. Cela vite de "geler" la machine si un long calcul doit tre effectu, et le programme donne une impression de fluidit ses utilisateurs.

316

Visual Basic 2010

Le .NET Framework4 fournit de nouvelles bibliothques de classes. En particulier, la classe Parallel qui permet de rpartir lexcution de boucles For et For Each sur les diffrents curs disponibles. Le concept de tches, li la classe Task, permet de grer finement lexcution de code par les diffrents curs disponibles.

Deux applications illustrent le composant BackgroundWorker sont dveloppes dans ce chapitre. La premire montre comment effectuer un calcul "lourd" en tche de fond. La seconde propose deux techniques pour excuter une application externe: en tche de fond ou en tche principale. Deux applications illustrent lutilisation de linstruction Parallel.For et montrent sa supriorit par rapport une classique structure For Next. Enfin, une application montre comment affecter lexcution de blocs de code certains curs du processeur utilis. Les instructions de cette application nont aucune incidence sur un processeur dot dun seul cur.

Excution dun calcul en tche de fond


Cette premire application va calculer une factorielle en tche de fond. Lancez commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Multitche au projet et cliquez sur OK. Ajoutez deux Label, un TextBox, deux Button, un ProgressBar et un Background Worker (ce contrle se trouve sous longlet Composants de la Bote outils) pour obtenir leffet visuel de la Figure13.1.
Figure13.1 Agencement de lapplication de traitement multitche.

Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:

Chapitre 13


Proprit
Text Text Text Text Text Text Name WorkerReportsProgress

Traitements multitches/multicurs

317

Contrle
Form1 Label1 TextBox1 Button1 Button2 Label2 BackgroundWorker1 BackgroundWorker1

Valeur
Traitement multitche Entrez un nombre 20 Calculer Arrter Entrez un nombre et cliquez sur Calculer bgw True

Double-cliquez sur le bouton Calculer et compltez la procdure Button1_Click() comme suit:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If CInt(TextBox1.Text) > 20 Or CInt(TextBox1.Text) < 1 Then MsgBox("Le nombre doit tre compris entre 1 et 20") Else Label2.Text = "Calcul en cours..." Button1.Enabled = False bgw.RunWorkerAsync(CInt(TextBox1.Text)) End If End Sub

La premire instruction teste la valeur entre par lutilisateur dans la zone de texte. Pour viter un dpassement dans le calcul de la factorielle, cette valeur doit tre comprise entre 1 et 20. Dans le cas contraire, un message derreur apparat:
If CInt(TextBox1.Text) > 20 Or CInt(TextBox1.Text) < 1 Then MsgBox("Le nombre doit tre compris entre 1 et 20")

Si la valeur entre est comprise entre 1 et 20, trois actions sont effectues. Dans un premier temps, un message saffiche dans la fentre par lintermdiaire du contrle Label2:
Else Label2.Text = "Calcul en cours..."

Dans un deuxime temps, le bouton Calculer est dsactiv pour viter que lutilisateur nappuie dessus avant la fin du calcul:
Button1.Enabled = False

318

Visual Basic 2010

Enfin, dans un troisime temps, le processus asynchrone dmarre:


bgw.RunWorkerAsync(CInt(TextBox1.Text))

Cette dernire instruction gnre un vnement Dowork rattach lobjet Background Worker bgw. Nous allons donc dfinir la procdure vnementielle bgw_Dowork(). Cliquez sur licne bgw (en dessous de la fentre de lapplication), affichez les vnements dans la fentre des proprits et double-cliquez sur la proprit DoWork pour accder la procdure bgw_DoWork(). Compltez cette procdure comme suit:
Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System. ComponentModel.DoWorkEventArgs) Handles bgw.DoWork Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) e.Result = factorielle(e.Argument, worker, e) End Sub

La premire instruction rcupre lobjet BackgroundWorker lorigine de cet vnement:


Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

La seconde instruction appelle la fonction Factorielle() et stocke la valeur renvoye dans la proprit Result de lobjet DoWorkEventArgs:
e.Result = factorielle(e.Argument, worker, e)

Ltape suivante consiste dfinir la fonction Factorielle():


Function factorielle(ByVal n As Integer, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As Long Dim i As Long Dim percentcomplete As Integer resultat = 1 For i = 1 To n resultat = i * resultat percentcomplete = CSng(i) / CSng(n) * 100 worker.ReportProgress(percentcomplete) System.Threading.Thread.Sleep(150) Next (i) Return resultat End Function

Aprs avoir dclar lindex de la boucle de calcul, la variable reprsentant ltat davancement dans le calcul et la variable dans laquelle le rsultat va tre stock:
Dim i As Long Dim percentcomplete As Integer resultat = 1

Chapitre 13

Traitements multitches/multicurs

319

le calcul rcursif de la factorielle prend place:


For i = 1 To n resultat = i * resultat percentcomplete = CSng(i) / CSng(n) * 100 worker.ReportProgress(percentcomplete) System.Threading.Thread.Sleep(150) Next (i)

Remarquez les deux dernires instructions de la boucle:

worker.ReportProgress(percentcomplete) affiche ltat davancement du calcul. Cette instruction va dclencher lvnement ProgressChanged de lobjet BackgroundWorker. System.Threading.Thread.Sleep(150) introduit une pause de 150 millisecondes entre chacune des tapes du calcul. Cela vite un avancement trop rapide de la barre de progression.

Ltape suivante consiste dfinir la procdure vnementielle bgw_ProgressChanged(). Cliquez sur licne bgw (en dessous de la fentre de lapplication), affichez les vnements dans la fentre des proprits et double-cliquez sur la proprit ProgressChanged pour accder la procdure bgw_ProgressChanged(). Compltez cette procdure comme suit:
Private Sub bgw_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged Me.ProgressBar1.Value = e. Private Sub bgw_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged Me.ProgressBar1.Value = e.ProgressPercentage End Sub End Sub

Lunique instruction de cette procdure met jour la barre de progression en utilisant la variable ProgressPercentage. Nous allons maintenant dfinir la procdure excuter en fin de calcul. Cliquez sur licne bgw (en dessous de la fentre de lapplication), affichez les vnements dans la fentre des proprits et double-cliquez sur la proprit RunWorkerCompleted pour accder la procdure bgw_ RunWorkerCompleted(). Compltez cette procdure comme suit:
Private Sub bgw_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted Button1.Enabled = True Label2.Text = "Factorielle(" + TextBox1.Text + ") = " + Str(resultat) End Sub

320

Visual Basic 2010

Cette procdure active nouveau le bouton Calculer et affiche le rsultat du calcul dans le contrle Label2. Pour terminer, double-cliquez sur le bouton Arrter et ajoutez une instruction End dans la procdure Button2_Click:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub

Lapplication est maintenant totalement oprationnelle. Vous pouvez lexcuter en appuyant sur la touche F5. Entrez un nombre compris entre 1 et 20 dans la zone de texte et cliquez sur le bouton Calculer. Vous pouvez voir lavancement de la barre de progression en ayant bien en tte que les calculs sont effectus dans un thread autre que celui de lapplication (voir Figure13.2).
Figure13.2 Lapplication Traitement multitche en cours dexcution.

Voici le code complet de lapplication. Vous trouverez les fichiers correspondants dans le dossier multitche.
Imports System.ComponentModel Public Class Form1 Dim longueur As Integer = 0 Dim resultat As Long = 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click If CInt(TextBox1.Text) > 20 Or CInt(TextBox1.Text) < 1 Then MsgBox("Le nombre doit tre compris entre 1 et 20") Else Label2.Text = "Calcul en cours..." Button1.Enabled = False

Chapitre 13


End If End Sub

Traitements multitches/multicurs

321

bgw.RunWorkerAsync(CInt(TextBox1.Text))

Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System. ComponentModel.DoWorkEventArgs) Handles bgw.DoWork Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) e.Result = factorielle(e.Argument, worker, e) End Sub Function factorielle(ByVal n As Integer, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As Long Dim i As Long Dim percentcomplete As Integer resultat = 1 For i = 1 To n resultat = i * resultat percentcomplete = CSng(i) / CSng(n) * 100 worker.ReportProgress(percentcomplete) System.Threading.Thread.Sleep(150) Next (i) Return resultat End Function Private Sub bgw_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged Me.ProgressBar1.Value = e.ProgressPercentage End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click End End Sub Private Sub bgw_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw. RunWorkerCompleted Button1.Enabled = True Label2.Text = "Factorielle(" + TextBox1.Text + ") = " + Str(resultat) End Sub End Class

322

Visual Basic 2010

Excution dune application externe


Il est parfois utile dappeler une application excutable dans un projet Visual Basic. La technique utiliser diffre selon que vous vouliez lancer lapplication en tant que processus ou attendre sa fermeture pour reprendre le contrle. Dfinissez un nouveau projet fond sur le modle Application Windows Forms et donnezlui le nom LanceBN. Insrez un TextBox et deux Button sur la feuille du projet. Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Form1 TextBox1 Button1 Button2

Proprit
Text Text Text Text

Valeur
Lanceur dapplications Notepad.exe Lancer Lancer et attendre

Modifiez lemplacement et les dimensions de ces contrles de sorte que la feuille de lapplication ressemble la Figure13.3.
Figure13.3 La feuille de lapplication, en mode dition.

Double-cliquez sur le bouton Lancer et compltez la procdure Button1_Click() comme suit:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Process.Start(TextBox1.Text) MessageBox.Show("Lapplication a t lance", "Information") End Sub

La classe Process permet de dmarrer des applications en tant que processus, donc sans bloquer le programme qui les active. Consultez la documentation en ligne pour connatre les nombreuses mthodes de cette classe.

Chapitre 13

Traitements multitches/multicurs

323

La premire instruction lance le processus dont le nom est spcifi dans la zone de texte TextBox1:
Process.Start(TextBox1.Text)

La seconde instruction affiche une bote de message indiquant que lapplication a t lance. tant donn que le lancement dun processus ne bloque pas lordinateur, cette bote de message apparat immdiatement:
MessageBox.Show("Lapplication a t lance", "Information")

Double-cliquez sur le bouton Lancer et attendre, et compltez la procdure Button2_ Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Shell(TextBox1.Text, AppWinStyle.NormalFocus, True) MessageBox.Show("Lapplication vient dtre ferme", "Information") End Sub

La premire instruction utilise la procdure Shell() pour lancer lapplication spcifie dans la zone de texte:
Shell(TextBox1.Text, AppWinStyle.NormalFocus, True)

Le premier argument de la procdure prcise le nom de lapplication lancer. Ce nom doit tre un chemin complet si lapplication ne se trouve pas dans le dossier dinstallation de Windows ou dans le dossier systme. Le deuxime argument indique ltat de lapplication. Il peut tre gal lune des valeurs suivantes:

AppWinStyle.Hide. Fentre cache ayant le focus. AppWinStyle.NormalFocus. Fentre normale ayant le focus. AppWinStyle.MinimizedFocus. Fentre minimise dans la barre des tches ayant le

focus.
AppWinStyle.MaximizedFocus. Fentre ouverte et maximise. AppWinStyle.NormalNoFocus. Fentre normale nayant pas le focus. AppWinStyle.MinimizedNoFocus. Fentre minimise dans la barre des tches nayant

pas le focus.

Enfin, le troisime argument indique si le programme parent Visual Basic doit attendre (True) ou ne pas attendre (False) la fin de lapplication lance pour poursuivre son excution. Sice paramtre nest pas spcifi, la fin de lapplication nest pas attendue.

324

Visual Basic 2010

La deuxime instruction affiche un message qui prcise que lapplication vient dtre ferme. Ce message ne saffiche quaprs la fermeture de lapplication, car le troisime paramtre de la fonction Shell() vaut True:
MessageBox.Show("Lapplication vient dtre ferme", "Information")

Info

Lorsque linstruction Shell ne contient que deux paramtres, lapplication est lance et le contrle est immdiatement redonn linstruction suivante. Cecomportement fait ressembler la procdure Shell() au dmarrage dun processus. Cependant, les possibilits des processus sont bien plus nombreuses. Pour en savoir plus ce sujet, consultez la documentation de Visual Basic.

Voici le listing complet de lapplication. Le projet se trouve dans le dossier LanceBN aprs installation des sources de louvrage.
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Process.Start(TextBox1.Text) MessageBox.Show("Lapplication a t lance", "Information") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click Shell(TextBox1.Text, AppWinStyle.NormalFocus, True) MessageBox.Show("Lapplication vient dtre ferme", "Information") End Sub End

Paralllisation des boucles


La classe Parallel du .NET Framework 4 permet de rpartir lexcution de boucles For et For Each sur les diffrents curs disponibles. Pour illustrer cette classe, nous allons dvelopper une application console qui calcule un million de racines carres, dans un premier arallel. temps laide dune boucle For Next conventionnelle, puis laide dune boucle P For. Les temps de calcul safficheront la suite des deux variantes du code. Lancez la commande Nouveau/Projet dans le menu Fichier. Slectionnez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet

Chapitre 13

Traitements multitches/multicurs

325

gauche. Cliquez sur Application console, donnez le nom ParallelFor1 lapplication et validez en cliquant sur OK. Compltez le code avec les instructions suivantes (cette application se trouve dans le dossier Projects\ParallelFor1 des sources de louvrage aprs leur installation).
Imports System.Threading Imports System.Threading.Tasks Module Module1 Function Calcul(ByVal i As Integer, ByVal result As String) As Boolean result = "Racine carre : " + Math.Sqrt(i).ToString() Return True End Function Sub Main() Dim result As String Dim debut As TimeSpan Console.WriteLine("Dbut du calcul simple thread") debut = DateTime.Now.TimeOfDay For i = 0 To 10000000 Calcul(i,result) Next Console.WriteLine("Fin du calcul simple thread") Console.WriteLine(DateTime.Now.TimeOfDay - debut) Console.WriteLine() Console.WriteLine("Dbut du calcul multithread") debut = DateTime.Now.TimeOfDay Parallel.For(0, 10000000, Function(i) Calcul(i, result)) Console.WriteLine("Fin du calcul multithread") Console.WriteLine(DateTime.Now.TimeOfDay - debut) Console.ReadKey() End Sub End Module

Examinons le code. Aprs avoir dclar les deux espaces de noms ncessaires lexcution multithreads:
Imports System.Threading Imports System.Threading.Tasks

326

Visual Basic 2010

Le bloc de code suivant dfinit la fonction Calcul(), responsable du calcul des 1 million de racines carres:
Function Calcul(ByVal i As Integer, ByVal result As String) As Boolean result = "Racine carre : " + Math.Sqrt(i).ToString() Return True End Function

La procdure Main() se dcompose en quatre blocs. Le premier bloc dfinit les variables utilises dans la procdure:
Dim result As String Dim debut As TimeSpan

Le deuxime bloc effectue une boucle For Next traditionnelle qui appelle la fonction Calcul() 1 million de fois. Aprs avoir affich un message pour indiquer le dbut du calcul:
Console.WriteLine("Dbut du calcul simple thread")

Lheure systme est mmorise dans la variable debut:


debut = DateTime.Now.TimeOfDay

Puis le calcul est lanc:


For i = 0 To 10000000 Calcul(i,result) Next

Lorsque la boucle For Next est termine, une instruction WriteLine indique la fin du calcul:
Console.WriteLine("Fin du calcul simple thread")

Et une autre affiche le temps ncessaire pour effectuer le calcul:


Console.WriteLine(DateTime.Now.TimeOfDay - debut)

Le troisime bloc dinstructions effectue le mme calcul en mode multithreads. Aprs avoir indiqu le dbut du calcul et mmoris lheure systme:
Console.WriteLine("Dbut du calcul multithread") debut = DateTime.Now.TimeOfDay

La fonction Calcul() est appele un million de fois:


Parallel.For(0, 10000000, Function(i) Calcul(i, result))

Remarquez la syntaxe particulire de cette instruction. Les deux premiers paramtres font rfrence aux valeurs minimale et maximale de lindex. Le troisime paramtre spcifie la fonction excuter et les paramtres qui doivent lui tre passs.

Chapitre 13

Traitements multitches/multicurs

327

Lorsque lexcution de linstruction Parallel.For est termine, un message apparat dans la console, accompagn du temps de calcul:
Console.WriteLine("Fin du calcul multithread") Console.WriteLine(DateTime.Now.TimeOfDay - debut)

La dernire instruction attend que lutilisateur appuie sur une touche du clavier pour mettre fin au programme:
Console.ReadKey()

La Figure13.4 reprsente le rsultat de ce programme excut sur un AMD Phenom 9850 cadenc 2,5GHz, dot de 3Go de RAM DDR2 et fonctionnant sous Windows7 32bits.
Figure13.4 Le traitement parallle est effectivement plus rapide sur un multicur.

Les Figures13.5 et 13.6 reprsentent les deux phases dexcution du programme.


Figure13.5 Le deuxime cur est utilis pour effectuer le calcul.

328

Visual Basic 2010

Figure13.6 Les quatre curs effectuent le calcul, amliorant ainsi les performances.

Voici un deuxime exemple qui met en vidence la supriorit de la programmation parallle lorsquil est excut sur un ordinateur muni de plusieurs curs. Ce code est issu de la librairie en ligne MSDN, page http://msdn.microsoft.com/en-us/library/dd460713. aspx. Il consiste en la multiplication de matrices de 180colonnes et 2000lignes. Vous trouverez plusieurs autres exemples de programmation parallle sur cette page. Nhsitez pas vous y reporter. Lancez la commande Nouveau/Projet dans le menu Fichier. Slectionnez .NET Framework4 dans la liste droulante Framework, cliquez sur Application console, donnez le nom ParallelFor2 lapplication et validez en cliquant sur OK. Compltez le code avec les instructions suivantes (cette application se trouve dans le dossier Projects\ParallelFor2 des sources de louvrage aprs leur installation):
Imports System.Threading.Tasks Module Module1 Sub MultiplyMatricesSequential(ByVal matA As Double(,), ByVal matB As Double(,), ByVal result As Double(,)) Dim matACols As Integer = matA.GetLength(1) Dim matBCols As Integer = matB.GetLength(1) Dim matARows As Integer = matA.GetLength(0) For i As Integer = 0 To matARows - 1 For j As Integer = 0 To matBCols - 1

Chapitre 13

Traitements multitches/multicurs

329

For k As Integer = 0 To matACols - 1 result(i, j) += matA(i, k) * matB(k, j) Next Next Next End Sub

Private Sub MultiplyMatricesParallel(ByVal matA As Double(,), ByVal matB As Double(,), ByVal result As Double(,)) Dim matACols As Integer = matA.GetLength(1) Dim matBCols As Integer = matB.GetLength(1) Dim matARows As Integer = matA.GetLength(0) Multiplication de matrices Paralllisation de la boucle externe Parallel.For(0, matARows, Sub(i) For j As Integer = 0 To matBCols - 1 Utilisation dune variable temporaire pour amliorer les performances du traitement parallle Dim temp As Double = 0 For k As Integer = 0 To matACols - 1 temp += matA(i, k) * matB(k, j) Next result(i, j) += temp Next End Sub) End Sub Sub Main() Dfinition des matrices. Utiliser des valeurs de lignes et de colonnes plus leves pour mettre en vidence la supriorit du traitement parallle Dim colCount As Integer = 180 Dim rowCount As Integer = 2000 Dim colCount2 As Integer = 270 Dim m1 As Double(,) = InitializeMatrix(rowCount, colCount) Dim m2 As Double(,) = InitializeMatrix(colCount, colCount2) Dim result As Double(,) = New Double(rowCount - 1, colCount2 - 1) {} Traitement squentiel Console.WriteLine("Excution de la boucle squentielle ...") Dim stopwatch As New Stopwatch() stopwatch.Start()

330

Visual Basic 2010

MultiplyMatricesSequential(m1, m2, result) stopwatch.[Stop]() Console.WriteLine("Temps ncessaire pour excuter la boucle squentielle en millisecondes : {0}", stopwatch.ElapsedMilliseconds) RAZ tu timer et de la matrice des rsultats stopwatch.Reset() result = New Double(rowCount - 1, colCount2 - 1) {} Traitement parallle Console.WriteLine() Console.WriteLine("Excution de la boucle parallle ...") stopwatch.Start() MultiplyMatricesParallel(m1, m2, result) stopwatch.[Stop]() Console.WriteLine("Temps ncessaire pour excuter la boucle squentielle en millisecondes : {0}", stopwatch.ElapsedMilliseconds) Attente dune action de lutilisateur pour fermer lapplication Console.WriteLine() Console.WriteLine("Appuyez sur une touche pour fermer lapplication.") Console.ReadKey() End Sub Function InitializeMatrix(ByVal rows As Integer, ByVal cols As Integer) As Double(,) Dim matrix As Double(,) = New Double(rows - 1, cols - 1) {} Dim r As New Random() For i As Integer = 0 To rows - 1 For j As Integer = 0 To cols - 1 matrix(i, j) = r.[Next](100) Next Next Return matrix End Function End Module

titre dexemple, la Figure13.7 reprsente le rsultat de lexcution de ce code sur un ordinateur base dAMD Phenom 9850 cadenc 2,5GHz, dot de 4Go de RAM DDR2 et fonctionnant sous Windows7 32bits.

Chapitre 13

Traitements multitches/multicurs

331

Figure13.7 Lexcution multicur montre clairement sa supriorit.

Examinons le code. Les premires lignes de la procdure Main() dfinissent les variables utilises dans le code:
Dim Dim Dim Dim Dim Dim colCount As Integer = 180 rowCount As Integer = 2000 colCount2 As Integer = 270 m1 As Double(,) = InitializeMatrix(rowCount, colCount) m2 As Double(,) = InitializeMatrix(colCount, colCount2) result As Double(,) = New Double(rowCount - 1, colCount2 - 1) {}

Les matrices m1 et m2 sont initialises laide de la procdure InitializeMatrix(), que nous dcrirons un peu plus bas. Le bloc dinstructions suivant lance le calcul squentiel:
Console.WriteLine("Excution de la boucle squentielle ...") Dim stopwatch As New Stopwatch() stopwatch.Start() MultiplyMatricesSequential(m1, m2, result) stopwatch.[Stop]() Console.WriteLine("Temps ncessaire pour excuter la boucle squentielle en millisecondes : {0}", stopwatch.ElapsedMilliseconds)

Remarquez lutilisation de lobjet stopwatch de type StopWatch, des mthodes Start() et Stop() et de la proprit ElapsedMilliseconds pour obtenir le temps ncessaire au calcul. Le code responsable de la multiplication des matrices se trouve dans la procdure MultiplyMatricesSequential(). Le bloc dinstructions suivant lance le calcul parallle:
Console.WriteLine() Console.WriteLine("Excution de la boucle parallle ...")

332

Visual Basic 2010

stopwatch.Start() MultiplyMatricesParallel(m1, m2, result) stopwatch.[Stop]() Console.WriteLine("Temps ncessaire pour excuter la boucle squentielle en millisecondes : {0}", stopwatch.ElapsedMilliseconds)

Le code responsable de la multiplication des matrices se trouve dans la procdure MultiplyMatricesParallel(). Ici aussi, le temps de calcul est obtenu laide de lobjet StopWatch stopwatch, manipul par les procdures Start() et Stop() et interrog par la proprit ElapsedMilliseconds. La procdure InitializeMatrix() est responsable de linitialisation des matrices m1 et m2. Elle se contente dinsrer des nombres alatoires dans chaque cellule de la matrice:
Function InitializeMatrix(ByVal rows As Integer, ByVal cols As Integer) As Double(,) Dim matrix As Double(,) = New Double(rows - 1, cols - 1) {} Dim r As New Random() For i As Integer = 0 To rows - 1 For j As Integer = 0 To cols - 1 matrix(i, j) = r.[Next](100) Next Next Return matrix End Function

La procdure MultiplyMatricesSequential() effectue la multiplication des matrices passes en argument laide de trois boucles For Next imbriques:
Sub MultiplyMatricesSequential(ByVal matA As Double(,), ByVal matB As Double(,), ByVal result As Double(,)) Dim matACols As Integer = matA.GetLength(1) Dim matBCols As Integer = matB.GetLength(1) Dim matARows As Integer = matA.GetLength(0) For i As Integer = 0 To matARows - 1 For j As Integer = 0 To matBCols - 1 For k As Integer = 0 To matACols - 1 result(i, j) += matA(i, k) * matB(k, j) Next Next Next End Sub

Enfin, la procdure MultiplyMatricesParallel() utilise une technique similaire, ceci prs que la boucle la plus extrieure est excute dans une instruction Parallel.For:

Chapitre 13

Traitements multitches/multicurs

333

Private Sub MultiplyMatricesParallel(ByVal matA As Double(,), ByVal matB As Double(,), ByVal result As Double(,)) Dim matACols As Integer = matA.GetLength(1) Dim matBCols As Integer = matB.GetLength(1) Dim matARows As Integer = matA.GetLength(0) Multiplication de matrices Paralllisation de la boucle externe Parallel.For(0, matARows, Sub(i) For j As Integer = 0 To matBCols - 1 Utilisation dune variable temporaire pour amliorer les performances du traitement parallle Dim temp As Double = 0 For k As Integer = 0 To matACols - 1 temp += matA(i, k) * matB(k, j) Next result(i, j) += temp Next End Sub) End Sub

Utilisation de plusieurs curs laide de tches


Une autre technique permet de matriser la gestion des curs. Reposant sur la dfinition de tches via la TPL (Task Parallel Library), elle permet dexcuter des traitements en parallle sur les diffrents curs de la machine cible. De faon automatique et sans quaucune recompilation ne soit ncessaire, le runtime .NET 4 dtermine le nombre de curs disponibles sur la machine cible et les gre transparente travers le scheduler de la TPL. Les tches peuvent tre excutes dans lordre voulu, et il est possible dattendre la fin de lexcution dune tche ou de toutes les tches lances. Dautre part, une tche peut (ou non) retourner un rsultat. Ces prouesses rsident dans lutilisation de lespace de nom System.Threading.Tasks. Dans cette section, vous allez voir quel point il est simple de crer de nouvelles tches laide de la mthode Task.Factory.StartNew() applique sur des objets Task de classe Task, et dattendre la fin de leur excution avec la mthode Task.WaitAll(). Lancez la commande Nouveau/Projet dans le menu Fichier. Slectionnez .NET Framework 4 dans la liste droulante Framework, cliquez sur Application console, donnez le nom taches lapplication et validez en cliquant sur OK. Compltez le code avec les instructions suivantes (cette application se trouve dans le dossier Projects\Taches des sources de louvrage aprs leur installation):

334

Visual Basic 2010

Imports System.Threading Imports System.Threading.Tasks Module Module1 Function Racine(ByVal a As Integer, ByRef ret As Double) As Boolean ret = Math.Sqrt(a) Return True End Function Sub Main() Dim Tasks(1) As Task Dim res1 As Integer = 0 Dim res2 As Integer = 0 Tasks(0) = Task.Factory.StartNew(Function() Racine(1233, res1)) Tasks(1) = Task.Factory.StartNew(Function() Racine(541, res2)) Task.WaitAll(Tasks) attente de la fin des tches Console.WriteLine("Les deux racines ont t calcules avec deux curs diffrents.") Console.ReadKey() End Sub End Module

Ce code calcule deux racines carres en utilisant deux curs diffrents (bien entendu condition que la machine cible soit dote dun processeur multicur). Examinons le code. La procdure Main() commence par dfinir le tableau Tasks, compos de deux cellules de type Task, puis dfinit et initialise 0 les variables Integer res1 et res2, dans lesquelles seront stockes les rsultats des racines carres:
Dim Tasks(1) As Task Dim res1 As Integer = 0 Dim res2 As Integer = 0

Les deux instructions suivantes affectent aux cellules du tableau Tasks le calcul des racines carres de 1233 et de 541. Cette affectation se fait via la cration dune nouvelle tche (Task.Factory.StartNew()) qui excute la fonction Racine():
Tasks(0) = Task.Factory.StartNew(Function() Racine(1233, res1)) Tasks(1) = Task.Factory.StartNew(Function() Racine(541, res2))

Linstruction suivante attend que les deux tches aient entirement t excutes:
Task.WaitAll(Tasks)

Chapitre 13

Traitements multitches/multicurs

335

Info

La procdure WaitAll() est trs utile. En effet, elle permet de sassurer que lexcution des tches est termine et que leur rsultat (si rsultat il y a) peut tre rcupr. Parfois, il nest pas possible de lancer toutes les tches en parallle, car lexcution de certaines dentre elles est conditionne par le rsultat dune autre. Dans ce cas, vous utiliserez la mthode WaitAny() pour indiquer les tches dont vous attendez le rsultat:
Task.WaitAny(tache1,, tacheN)

Lorsque lexcution des deux tches est termine, un message saffiche dans la console et le programme se met en attente dune touche clavier pour terminer son excution:
Console.WriteLine("Les deux racines ont t calcules avec deux curs diffrents.") Console.ReadKey()

La fonction Racine() admet deux paramtres: le nombre dont on dsire calculer la racine et le rsultat du calcul. Elle renvoie une valeur True lorsque le calcul est termin:
Function Racine(ByVal a As Integer, ByRef ret As Double) As Boolean ret = Math.Sqrt(a) Return True End Function

Pour avoir des informations complmentaires sur la programmation parallle, consultez laide en ligne de Visual Basic 2010, en particulier les sections relatives aux classes P arallel et Task.

14
Manipulation du Registre de Windows
Depuis ldition95, Windows stocke les diffrents paramtres matriels et logiciels de lordinateur dans une gigantesque base de donnes appele "Base du Registre" ou plus simplement "Registre". Cette base de donnes rfrence les paramtres concernant les lments matriels de lordinateur ainsi que les paramtres relatifs chacun des utilisateurs. Si vous ntes pas familier avec le Registre, consultez les trois premires sections de ce chapitre. Vous y apprendrez utiliser lditeur du Registre, vous ferez connaissance avec la structure hirarchique du Registre et vous verrez comment raliser des importations et exportations dans le Registre afin (respectivement) de lire et de modifier son contenu. Si vous savez comment manipuler le Registre, rendez-vous directement la section intitule "Visual Basic et le Registre". Vous pouvez galement vous reporter au Chapitre17 pour avoir un exemple concret dutilisation du Registre.

338

Visual Basic 2010

Lditeur du Registre
Pour consulter le Registre, un outil appel diteur du Registre est fourni avec Windows. Pour y accder:

Sous Windows 7 ou Vista : cliquez sur Dmarrer, tapez regedit dans la zone de recherche rapide cliquez sur licne regedit, dans la partie suprieure du menu, puis confirmez votre action en cliquant sur Continuer. Sous Windows XP, lancez la commande Excuter du menu Dmarrer. Tapez regedit dans la zone de texte de la bote de dialogue Excuter et appuyez sur la touche Entre.

Quelques instants plus tard, vous vous trouvez face une fentre semblable celle montre la Figure14.1.
Figure14.1 La fentre de lditeur du Registre.

Lditeur du Registre prsente deux volets qui rappellent ceux de lExplorateur de fichiers: gauche, une arborescence rattache au Poste de travail, droite, le dtail de llment slectionn. Le Registre repose sur cinq catgories HKEYS (pour homekeys) qui apparaissent dans le volet gauche : HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_ MACHINE, HKEY_USERS et HKEY_CURRENT_CONFIG. Chaque catgorie est compose de plusieurs sous-catgories (cls) et dlments terminaux (valeurs):

Pour dvelopper une catgorie, cliquez sur le signe + qui la prcde. Pour replier une catgorie, cliquez sur le signe qui la prcde.

Chapitre 14

Manipulation du Registre de Windows

339

Pour visualiser les lments terminaux rattachs une cl, cliquez sur cette cl dans le volet gauche. Les diffrentes valeurs saffichent dans le volet droit.

la Figure14.2, par exemple, les cls HKEY_LOCAL_MACHINE, Hardware et Description ont t dveloppes, puis les valeurs de la cl System ont t visualises en cliquant sur System.
Figure14.2 Un exemple de dveloppement de larborescence du Registre.

Les valeurs peuvent tre de lun des types binaire, chane, DWORD (double mot), chane multiple ou chane extensible. La donne affecte une valeur apparat dans la colonne Donnes, en regard du nom de la cl. Dans lexemple de la Figure14.2, plusieurs types de valeurs sont accessibles.

Modification du Registre
Pour modifier la donne affecte une valeur, il suffit de double-cliquer dessus. Faites la modification souhaite dans la zone de texte Donnes de la valeur, puis cliquez sur OK (voir Figure14.3).
Figure14.3 Modification dune valeur chane.

Pour ajouter une valeur, slectionnez la cl parent dans le volet gauche, cliquez du bouton droit dans le volet droit et slectionnez Nouveau/Valeur chane, Nouveau/Valeur binaire,

340

Visual Basic 2010

Nouveau/Valeur DWORD, Nouveau/Valeur de chanes multiples ou Nouveau/Valeur de chane extensible selon le type de la valeur que vous souhaitez crer. Dfinissez le nom dela valeur et affectez-y la donne de votre choix. Pour supprimer une valeur, cliquez dessus, puis appuyez sur la touche Suppr. La suppression se fait aprs confirmation. Pour ajouter une cl, slectionnez la cl parente dans le volet gauche en cliquant sur son nom. Cliquez du bouton droit dans le volet droit et slectionnez Nouveau, puis Cl dans le menu contextuel. La nouvelle cl apparat dans le volet gauche. Son nom apparat en surbrillance. Saisissez le nom souhait, puis appuyez sur la touche Entre pour le valider. la Figure14.4, la nouvelle cl a t cre aprs slection de la cl Software.
Figure14.4 Cration dune nouvelle cl enfant de la cl Active Setup.

Pour supprimer une cl, cliquez sur son nom, puis sur la touche Suppr du clavier. La suppression se fait aprs confirmation.

Dplacements dans le Registre


Vous lavez vu, il suffit de cliquer sur les signes + et pour dplier et replier les lments de larborescence dans le volet gauche sur une cl pour en visualiser le contenu dans le volet droit. La souris tant un priphrique lent et imprcis, vous souhaiterez peut-tre travailler dans le Registre en utilisant le clavier. Voici les principaux raccourcis utilisables.
Raccourci
+

Effet
Dplie la cl en surbrillance. Replie la cl en surbrillance.

Chapitre 14


Effet

Manipulation du Registre de Windows

341

Raccourci
* Droite Gauche PageSuivante PagePrcdente Origine Fin

Dveloppe toutes les entres de larborescence. Passe la cl suivante, si ncessaire en dveloppant larborescence. Passe la cl prcdente, si ncessaire en repliant larborescence. Dplace la surbrillance dune page vers le bas. Dplace la surbrillance dune page vers le haut. Dplace la surbrillance sur la premire entre (Poste de travail). Dplace la surbrillance sur la dernire entre.

ce Astu

Certaines branches du Registre sont trs touffues. Sil vous arrive de vous perdre dans les arcanes du Registre, vous pouvez double-cliquer sur une des lignes en pointills verticales pour retourner la cl parent. Si vous avez dvelopp de nombreuses cls, il suffit de quitter et de relancer lditeur du Registre pour retrouver une configuration plus "propre" dans laquelle seules les six homekeys sont visibles.

Recherches dans le Registre


En dpliant les homekeys du Registre, vous vous rendrez vite compte de son immensit. Pour vous aider localiser telle ou telle cl, valeur ou donne, vous utiliserez la commande de recherche. Lancez la commande Rechercher du menu dition ou appuyez sur Ctrl+F. Dsignez llment recherch dans la zone de texte Recherche, cochez une ou plusieurs cases dans le groupe doptions Regarder dans et cliquez sur le bouton Suivant (voir Figure14.5). Pour trouver la prochaine occurrence de la recherche, lancez la commande Rechercher le suivant du menu dition ou appuyez sur la touche F3.
Figure14.5 Recherche de la cl ACLFile.

342

Visual Basic 2010

Structure du Registre
Dans les lignes qui suivent, vous allez faire plus ample connaissance avec les six homekeys du Registre.

HKEY_CLASSES_ROOT
La homekey HKEY_CLASSES_ROOT est charge de la gestion des types de fichiers manipuls par Windows. Cest dans cette cl principale que sont dfinies les associations types de fichiers/applications. Supposons par exemple que vous ayez install Word 2007 sur votre ordinateur. Cliquez sur la cl HKEY_CLASSES_ROOT\.docx. La valeur Dfaut contient la donne Word.Document.12. Recherchez cette cl dans la ruche HKEY_CLASSES_ROOT. Dveloppez les cls shell, Open et cliquez sur la cl command. La valeur (par dfaut) contient le nom du programme associ aux fichiers dextension .docx (voir Figure14.6).
Figure14.6 Les fichiers dextension .doc sont associs au programme winword.exe.

Lorsque vous double-cliquez sur un fichier dans le Poste de travail ou lExplorateur, Windows effectue la dmarche qui vient dtre dcrite pour ouvrir le fichier dans lapplication qui y est associe. Si vous modifiez la donne affecte la valeur shell\Open\command\Dfaut, vous modifiez lassociation correspondante.

Info

HKEY_LOCAL_MACHINE
La homekey HKEY_LOCAL_MACHINE recense:

les paramtres relatifs au matriel install dans lordinateur;

Chapitre 14

Manipulation du Registre de Windows

343

les paramtres relatifs aux applications installes.

Ces deux catgories sont communes tous les utilisateurs. Lorsquune application a t paramtre par un utilisateur donn, les paramtres personnels ainsi dfinis sont enregistrs dans la homekey HKEY_USERS.

HKEY_CURRENT_CONFIG
La homekey HKEY_CURRENT_CONFIG fait partie de HKEY_LOCAL_MACHINE. Dans le cas dun profil utilisateur unique, HKEY_CURRENT_CONFIG est le reflet exact de HKEY_LOCAL_MACHINE\Config\001. Si plusieurs profils ont t dfinis, HKEY_CURRENT_CONFIG contient les paramtres du seul utilisateur actif. Lorsque lutilisateur modifie un paramtre, la modification est faite dans HKEY_ CURRENT_CONFIG. Si elle est juge valide par Windows, elle est reporte dans HKEY_LOCAL_MACHINE.

HKEY_USERS
La homekey HKEY_USERS recense les paramtres personnels chaque utilisateur. La branche .DEFAULT contient les paramtres qui seront affects par dfaut aux nouveaux utilisateurs crs dans la fentre Comptes dutilisateurs.

HKEY_CURRENT_USER
La homekey HKEY_CURRENT_USER fait partie de HKEY_USERS. Dans le cas dun profil utilisateur unique, elle est le reflet exact de HKEY_USERS. Si plusieurs profils ont t dfinis, elle contient les paramtres du seul utilisateur actif. Lorsque lutilisateur modifie un paramtre, la modification est faite dans HKEY_CURRENT_ USER. Si elle est juge valide par Windows, elle est reporte dans HKEY_USERS.

Importations et exportations dans le Registre


Pour faciliter les manipulations dans le Registre ou pour permettre la modification du Registre par un public non averti, il est possible dutiliser des fichiers REG. Ces fichiers texte ont une extension .reg. Ils peuvent tre crs partir de nimporte quel diteur de texte, par exemple le Bloc-notes de Windows. Ces fichiers commencent toujours par le label Windows Registry Editor Version5.00. Ils listent ensuite un ensemble de cls et de valeurs.

344

Visual Basic 2010

Voici, titre dexemple, les premires lignes dun fichier REG qui agit sur la branche [HKEY_CURRENT_USER\Control Panel\Desktop] du Registre:
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Control Panel\Desktop] "ActiveWndTrkTimeout"=dword:00000000 "AutoEndTasks"="0" "CaretWidth"=dword:00000001 "CoolSwitch"="1" "CoolSwitchColumns"="7" "CoolSwitchRows"="3" "CursorBlinkRate"="530" "DragFullWindows"="1" "DragHeight"="4" "DragWidth"="4" "FontSmoothing"="2" "FontSmoothingType"=dword:00000001 "ForegroundFlashCount"=dword:00000003 "ForegroundLockTimeout"=dword:00030d40 "GridGranularity"="0" "HungAppTimeout"="5000" "LowPowerActive"="0" "LowPowerTimeOut"="0" "MenuShowDelay"="400" "PaintDesktopVersion"=dword:00000000 "PowerOffActive"="0" "PowerOffTimeOut"="0"

La premire ligne indique que ce fichier a t cr avec lditeur du Registre version5, cest--dire le programme REGEDIT.EXE fourni avec Windows 7, Vista et XP. Les lignes suivantes dfinissent des valeurs dans le Registre. Remarquez la syntaxe utilise:

Le nom de la cl contenant la valeur crer/modifier est spcifi in extenso entre crochets, par exemple [HKEY_LOCAL_MACHINE\Software\CLASSES\CLSID\ {00030007-0000-0000-C000-000000000046}\Ole1Class]. Le nom de la valeur est dfini sur une autre ligne, suivi dun signe = et de la donne y affecter entre guillemets (le nom "@" reprsente la valeur Dfaut).

Chapitre 14

Manipulation du Registre de Windows

345

Visualiser un fichier REG


Pour visualiser un fichier REG, pointez dessus dans le Poste de travail ou lExplorateur, cliquez du bouton droit et slectionnez dition dans le menu contextuel. Le fichier est ouvert dans le Bloc-notes.

Excuter un fichier REG


Pour excuter un fichier REG, il suffit de double-cliquer dessus dans le Poste de travail ou lExplorateur. Les cls et les valeurs spcifies dans le fichier seront mises jour/cres dans le Registre. Il est galement possible dutiliser la commande Importer un fichier du Registre, du menu Registre de lditeur du Registre. Spcifiez le fichier importer et validez pour inclure son contenu dans le Registre.

Crer un fichier REG


Pour crer un fichier REG, vous pouvez saisir les diffrentes cls et valeurs dfinir/modifier dans le Bloc-notes. Vous pouvez galement exporter une partie du Registre de votre ordinateur. Pour cela, cliquez sur la cl que vous souhaitez sauvegarder (toutes les sous-cls et valeurs de cette cl seront sauvegardes), puis lancez la commande Exporter du menu Fichier (voir Figure14.7).
Figure14.7 Exportation dune branche du Registre.

346

Visual Basic 2010

Cliquez si ncessaire sur loption Branche slectionne dans le groupe tendue de lexportation, donnez un nom au fichier, choisissez sa destination, puis cliquez sur le bouton Enregistrer.

Exemple de fichier REG


Supposons que vous souhaitiez modifier le dlai daffichage des lments contenus dans le menu Dmarrer. Vous devez pour cela dfinir la valeur chane MenuShowDelay dans la cl HKEY_CURRENT_USER\Control Panel\Desktop et lui affecter une valeur comprise entre 1 et 10. Cette valeur correspond au dlai, en millisecondes, avant laffichage des lments contenus dans le menu Dmarrer. Lancez le Bloc-notes laide de la commande Programmes > Accessoires > Bloc-notes du menu Dmarrer et saisissez les lignes suivantes:
Windows Registry Editor version 5.00 [HKEY_CURRENT_USER\Control Panel\Desktop] "MenuShowDelay"="1"

Sauvegardez ce fichier en lui attribuant une extension .reg. Pour intgrer cette modification dans le Registre, il suffit de double-cliquer sur le fichier REG qui vient dtre cr.
ntion Atte

La modification du Registre nest prise en compte quaprs le redmarrage de lordinateur.

Visual Basic et le Registre


.NET Framework dispose de deux classes en rapport avec le Registre : Registry et RegistryKey. Ces deux classes sont rfrences dans le systme Microsoft.Win32. Avant de les utiliser, il est donc ncessaire de spcifier la clause Imports suivante:
Imports Microsoft.Win32

Les diffrentes homekeys du Registre sont accessibles laide des membres de la classe Registry:
Membre de la classe Registry
ClassesRoot CurrentConfig

Homekey
HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG

Chapitre 14

Manipulation du Registre de Windows

347

Membre de la classe Registry


CurrentUser DynData LocalMachine PerformanceData Users

Homekey
HKEY_CURRENT_USER HKEY_DYN_DATA HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA HKEY_USERS

Si, par exemple, vous voulez accder la homekey HKEY_USERS, vous utiliserez la syntaxe suivante:
Dim rk as RegistryKey Rk = Registry.Users

Les mthodes de la classe RegistryKey permettent de lire, dajouter, de supprimer et de remplacer des cls dans le Registre. Vous utiliserez essentiellement les mthodes du tableau suivant:
Mthode
Close CreateSubKey DeleteSubKey DeleteSubKeyTree DeleteValue GetSubKeyNames GetValue GetValueNames OpenSubKey SetValue

Fonction
Ferme la cl Cre une cl (si elle nexiste pas) ou ouvre une cl (si elle existe) Supprime une cl Supprime une cl ainsi que ses enfants Supprime une valeur dans une cl Retourne un tableau de Strings qui contient le nom des sous-cls de la cl spcifie Retourne la valeur spcifie Retourne un tableau de Strings qui contient toutes les valeurs associes la cl spcifie Ouvre la cl spcifie Dfinit la valeur spcifie

Lobjet My.Computer.Registry propose plusieurs procdures et fonctions directement lies la manipulation du Registre:

348

Visual Basic 2010

Procdure
My.Computer.Registry.CurrentUser.CreateSubKey() My.Computer.Registry.SetValue() My.Computer.Registry.GetValue() My.Computer.Registry.CurrentUser.DeleteSubKey()

Utilit
Cration dune cl Dfinition de la valeur dune cl Lecture dune cl Suppression dune cl

Pour en savoir plus sur lutilisation de ces nouvelles procdures, consultez la section intitule "Lespace de nom My" au Chapitre3. Vous vous reporterez galement au Chapitre17 pour avoir un exemple concret de lutilisation de quelques-unes de ces procdures.

Ajout, visualisation et suppression dune cl


Nous allons dfinir un projet qui manipule la cl HKEY_CURRENT_USER\Control Panel\ Desktop\MenuShowDelay. Cette cl dtermine le dlai daffichage (en millisecondes) du menu Dmarrer et de ses entres. Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez le modle Application Windows Forms, donnez le nom Registre lapplication et validez. Ajoutez quatre Button et un TextBox au projet. Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Button1 Button2 Button3 Button4 TextBox1 Form1

Proprit
Text Text Text Text Text Text

Valeur
Menu Dmarrer rapide Menu Dmarrer lent Afficher la valeur de MenuShowDelay Supprimer la valeur MenuShowDelay

Manipulation du Registre

Modifiez lemplacement et les dimensions de ces contrles de sorte que la feuille de lapplication ressemble la Figure14.8.

Chapitre 14

Manipulation du Registre de Windows

349

Figure14.8 La feuille de lapplication, en mode dition.

Double-cliquez sur le premier bouton de commande et compltez la procdure Button1_ Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) key.SetValue("MenuShowDelay", "0") key.Close() End Sub

La premire instruction dfinit lobjet key de type RegistryKey qui sera utilis pour manipuler le Registre:
Dim key As RegistryKey

La deuxime instruction cre une rfrence sur la cl HKEY_CURRENT_USER\Control Panel\ Desktop:


key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)

La troisime instruction cre la valeur MenuShowDelay et lui affecte la valeur0. Ainsi, laffichage du menu Dmarrer et de ses entres ne sera pas diffr:
key.SetValue("MenuShowDelay", "0")

Enfin, la quatrime instruction ferme la cl qui a t ouverte avec la fonction OpenSubKey():


key.Close()

Double-cliquez sur le deuxime bouton de commande et ajoutez les instructions suivantes dans la procdure Button2_Click():
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

350

Visual Basic 2010

Handles Button2.Click Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) key.SetValue("MenuShowDelay", "40") key.Close() End Sub

Cette procdure est identique la prcdente, ceci prs quelle affecte la valeur 40 la valeur MenuShowDelay. Le dlai daffichage du menu Dmarrer et de ses commandes sera de 40millisecondes. Double-cliquez sur le troisime bouton de commande et compltez la procdure Button3_ Click() comme suit:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim Key As RegistryKey Key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop") Dim val As Object val = Key.GetValue("MenuShowDelay") TextBox1.Text = val Key.Close() End Sub

Aprs avoir cr une rfrence sur la cl HKEY_CURRENT_USER\Control Panel\Desktop:


Dim Key As RegistryKey Key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop")

la valeur MenuShowDelay est lue et stocke dans lobjet val:


Dim val As Object val = Key.GetValue("MenuShowDelay")

Il suffit maintenant dafficher la valeur retourne par la fonction GetValue() dans la zone de texte puis de refermer la cl ouverte avec la fonction OpenSubKey():
TextBox1.Text = val Key.Close()

Vous allez dfinir une procdure qui efface la valeur MenuShowDelay. Double-cliquez sur le quatrime bouton de commande et compltez la procdure Button4_Click() comme suit:
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)

Chapitre 14


Try

Manipulation du Registre de Windows

351

key.DeleteValue("MenuShowDelay") Catch End Try End Sub

Aprs avoir rfrenc la cl HKEY_CURRENT_USER\Control Panel\Desktop:


Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)

la fonction DeleteValue() est appele pour supprimer la valeur MenuShowDelay. Remarquez lutilisation de la structure Try Catch End Try pour viter toute erreur en cas de suppression dune valeur inexistante:
Try key.DeleteValue("MenuShowDelay") Catch End Try

Voici le listing complet de lapplication. Vous trouverez les fichiers correspondants ce projet dans le dossier Registre aprs installation des sources de louvrage.
Imports Microsoft.Win32 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) key.SetValue("MenuShowDelay", "0") key.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) key.SetValue("MenuShowDelay", "40") key.Close() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button3.Click Dim Key As RegistryKey

352

Visual Basic 2010

Key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop") Dim val As Object val = Key.GetValue("MenuShowDelay") TextBox1.Text = val Key.Close() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button4.Click Dim key As RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True) Try key.DeleteValue("MenuShowDelay") Catch End Try End Sub End Class

Accs au Registre par une requte LINQ


Certaines mthodes de la classe RegistryKey renvoient des collections. Il est donc possible de les interroger avec une requte LINQ pour extraire un sous-ensemble de donnes satisfaisant une ou plusieurs conditions. Reportez-vous la section intitule "Accs au Registre" au Chapitre27 pour savoir comment procder.

15
Fonctions API
Le langage Visual Basic implmente de faon native un grand nombre dAPI Windows. Ces API sont donc directement utilisables, sans avoir recours une instruction Declare du type suivant:
Declare Function nom Lib nomLib ([ByVal|ByRef]param1, , [ByVal|ByRef]paramN) As type

Principales API
Le tableau ci-aprs liste quelques-unes des fonctions API reconnues de faon native. Pour en savoir plus leur sujet et accder lensemble des fonctions API, consultez le site http://allapi.mentalis.org/apilist/apilist.php. Toutes les alternatives VB.NET aux API y sont listes et commentes par ordre alphabtique.

354

_lclose BeginPath CharUpper CloseEventLog CombineRgn CopyImage CreateCompatibleDC CreateDirectoryEx CreateFile CreatePatternBrush CreateProcess CreateToolhelp32Snapshot CryptDestroyHash CryptGetUserKey DeleteFile DestroyWindow Ellipse EnumProcessModules FillRgn FreeEnvironmentStrings FtpFindFirstFile FtpGetCurrentDirectory DrawIcon EmptyClipboard EqualRgn FindClose FreeLibrary FtpGetFile CreateHatchBrush CreatePolygonRgn CreateRoundRectRgn CryptDecrypt CryptGenKey CryptVerifySignature DestroyMenu DuplicateIcon EnumProcesses FillRect FreeConsole CryptDeriveKey CryptGetProvParam DeleteDC CreateSolidBrush CreateThread CreatePolyPolygonRgn CreatePopupMenu CreateMutex CreatePalette CreateEllipticRgn CreateEllipticRgn-Indirect CreateCursor CreateDC CreateDIBPatternBrushPt CopyMemory CoTaskMemFree CreateBitmap CompareFileTime CompareString Connect CopyFile CreateBrushIndirect CreateDIBSection CreateFont CreatePen CreateRectRgn CreateWindowEx CryptDestroyKey CryptHashData DeleteObject DrawIconEx EnableWindow ExitThread FindFirstFile FreeSid FtpPutFile CloseHandle ClosePrinter closesocket CloseWindow CheckMenuRadioItem CHOOSECOLOR CHOOSEFONT ClearEventLog BitBlt BringWindowToTop CallWindowProc CharLower

_lopen

AllocConsole

AngleArc

AppendMenu

Arc

ArcTo

CharLowerBuff

CloseClipboard

Visual Basic 2010

CoCreateGuid

CopyFileEx

CreateCompatibleBitmap

CreateDirectory

CreateFontIndirect

CreatePenIndirect

CreateRectRgnIndirect

CryptAcquireContext CryptCreateHash CryptExportKey

CryptEncrypt

CryptReleaseContext CryptSignHash DestroyIcon DrawTextEx EnumFontFamiliesEx FillMemory FrameRgn FtpDeleteFile

DestroyCursor

DrawText

EnumFontFamilies

ExtTextOut

FindNextFile

FtpCreateDirectory

FtpRemoveDirectory GetArcDirection GetComputerName GetCurrentProcessId GetCurrentThread GetDIBits GetFileInformation- GetFileSize ByHandle GetFileVersionInfo- GetFocus Size GetLocaleInfo GetModuleFileName GetPixel GetRgnBox GetSystemDirectory GetUserName GetWindowRect ImageList_DrawEx IntersectRect IsDebuggerPresent KillTimer LoadImage GetSaveFileName GetSystemTime GetUserNameEx GetWindowText inet_addr InvertRgn IsIconic LineTo LocalFileTimeToFileTime GetPolyFillMode GetModuleFileNameEx GetNearestColor GetLocalTime GetMenu GetForegroundWindow gethostbyaddr GetMenuItemCount GetNumberFormat GetPrinter GetFileSizeEx GetFileTime GetDoubleClickTime GetEnvironmentStrings GetCursor GetCursorPos GetComputerName GetComputerNameEx GetCurrencyFormat GetBitmapBits GetClientRect GetClipboardData GetClipRgn GetCurrentDirectory GetDateFormat

FtpRenameFile

FtpSetCurrentDirectory

GdiGradientFillRect

GdiTransparentBlt

GetActiveWindow

Chapitre 15

GetAncestor

GetCommandLine

GetCurrentProcess

GetDC

GetEnvironmentVari- GetExitCodeProcess able GetFileTitle gethostbyname GetMenuItemID GetOpenFileName GetPriorityClass GetSaveFileNamePre- getsockopt view GetTempFileName GetVersion GetWindowTextLength inet_ntoa IsCharAlpha IsRectEmpty LoadCursor lstrcat GetThreadLocale GetVersionEx GradientFillRect InflateRect IsCharAlphaNumeric IsWindowEnabled LoadCursorFromFile lstrcmp

GetFileAttributes

GetFileVersionInfo

gethostname

GetMenuItemInfo

GetOpenFileNamePre- GetParent view

GetProcessMemoryInfoGetProcessTimes GetSubMenu GetTickCount GetWindowPlacement ImageList_Draw IntersectClipRect IsCharUpper IsZoomed LoadIcon

GetStartupInfo

GetThreadPriority

GetWindowDC

GradientFillTriangle

InsertMenuItem

Fonctions API

IsCharLower

IsWindowVisible

355

LoadIcon

356

lstrcmpi MessageBoxEx MonitorFromRect MulDiv OpenProcess PathStripPath Polyline Process32First ReadFile RegDeleteKey RegQueryValueEx SelectObject SetCursorPos SetMenuItemInfo setsockopt SetWindowText SHFileExists Sleep TerminateProcess TrackPopupMenuEx WinExec SleepEx TextOut UnionRect WriteConsole SetThreadPriority SetPixel SetDIBitsToDevice Send SetArcDirection SetFileAttributes SetPixelV SetTimer RegSetValueEx ReleaseMutex RegDeleteValue RegEnumKeyEx Rectangle recv Process32Next PtInRegion PolylineTo PolyPolygon PolyPolyline QueryPerformanceCounter RegCloseKey RegEnumValue RemoveDirectory SetClipboardData SetFilePointer SetPriorityClass SetWindowPlacement ShellExecute SHGetFileInfo socket timeGetTime UuidCreate WriteFile ShowCursor StretchBlt timeKillEvent UuidToString WSAAsyncSelect Pie PolyBezier PolyBezierTo OutputDebugString PAGESETUPDLG PathFileExists OffsetRect OffsetRgn OpenClipboard OpenFile PathIsDirectory PolyDraw PolyTextOut QueryPerformanceFrequency RegCreateKey RegOpenKey RemoveMenu SetCurrentDirectory SetFileTime SetRect SetWindowPos ShellExecuteEx ShowScrollbar SystemTimeToFileTime timeSetEvent VerQueryValue MonitorFromWindow MoveFile MoveFileEx MoveToEx MessageBoxIndirect ModifyMenu Module32First Module32Next

lstrcpy

lstrcpyn

lstrlen

lstrlenW

MakeSureDirectoryPathExists

MessageBox

MonitorFromPoint

MoveWindow

Visual Basic 2010

OpenIcon

PathIsDirectoryEmpty

Polygon

PrintDialog

ReadConsole

RegCreateKeyEx

RegOpenKeyEx

SelectClipRgn

SetCursor

SetLayeredWindow -Attributes

SetRectEmpty

SetWindowRgn

SHCreateDirectoryEx SHCreateThread SHFileOperation

Shell_NotifyIcon

ShowWindow

TabbedTextOut

TrackPopupMenu

WaitForSingleObject

Chapitre 15

Fonctions API

357

Utilisation des API natives et traditionnelles


titre dexemple, nous allons dvelopper un projet qui utilise de faon native les API ToLower et ToUpper et de faon traditionnelle les API CharLower et CharUpper pour (respectivement) transformer une chane en caractres minuscules et majuscules. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom MinMaj au projet et validez en cliquant sur OK. Ajoutez deux TextBox et quatre Button au projet. Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Form1 TextBox1 TextBox2 Button1 Button2 Button3 Button4

Proprit
Text Text Text Text Text Text Text

Valeur
Minuscules et majuscules

Minuscules .NET ToLower Majuscules .NET ToUpper Minuscules API CharLower() Majuscules API CharUpper()

Modifiez lemplacement et les dimensions de ces contrles de sorte que la feuille de lappli cation ressemble la Figure15.1.
Figure15.1 La feuille de lapplication, en mode dition.

358

Visual Basic 2010

Double-cliquez sur le bouton Minuscules .NET ToLower et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox2.Text = TextBox1.Text.ToLower End Sub

Cette procdure se contente dappeler la fonction ToLower() pour convertir en minuscules le texte plac dans le premier TextBox et pour lafficher dans le deuxime TextBox. Double-cliquez sur le bouton Majuscules .NET ToUpper et compltez la procdure Button2_
Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox2.Text = TextBox1.Text.ToUpper End Sub

Ici, le texte du contrle TextBox1 est converti en utilisant la fonction ToUpper(). Nous allons maintenant utiliser les API CharLower() et CharUpper() par lintermdiaire des boutons Minuscules API CharLower() et Majuscules API CharUpper(). Commencez par dfinir les fonctions API CharLower() et CharUpper() la suite de la rgion "Windows Form Designer generated code":
Declare Function CharLower Lib "user32" Alias "CharLowerA" ( _ ByVal lpsz As String _ ) As String Declare Function CharUpper Lib "user32" Alias "CharUpperA" ( _ ByVal lpsz As String _ ) As String

Ces dclarations sont en tout point banalises. Rendez-vous sur le site http://allapi.mentalis.org/apilist/apilist.php pour avoir une ide de la syntaxe utiliser (voir Figure15.2). Double-cliquez sur le bouton Minuscules API CharLower() et compltez la procdure Button3_Click() comme suit:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim s As String s = TextBox1.Text s = CharLower(s) TextBox2.Text = s End Sub

Chapitre 15

Fonctions API

359

Figure15.2 Le site allapi.mentalis.org donne la syntaxe de toutes les fonctions API.

Le contenu de la premire zone de texte est plac dans la variable String s:


Dim s As String s = TextBox1.Text

La fonction API CharLower() est alors applique la variable s. Le rsultat est stock dans la variable s elle-mme:
s = CharLower(s)

Le rsultat de la conversion est apparat dans le deuxime TextBox:


TextBox2.Text = s

Double-cliquez sur le bouton Majuscules API CharUpper() et compltez la procdure Button4_Click() comme suit:
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Dim s As String s = TextBox1.Text s = CharUpper(s) TextBox2.Text = s End Sub

Les instructions de cette procdure sont comparables celles de la procdure Button3_ Click(), mais, ici, la conversion seffectue avec lAPI CharUpper().

360

Visual Basic 2010

Voici le listing complet de lapplication. Ce projet se trouve dans le dossier Projects\MinMaj des sources de louvrage aprs leur installation.
Public Class Form1 Declare Function CharLower Lib "user32" Alias "CharLowerA" ( _ ByVal lpsz As String _ ) As String Declare Function CharUpper Lib "user32" Alias "CharUpperA" ( _ ByVal lpsz As String _ ) As String Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click TextBox2.Text = TextBox1.Text.ToLower End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click TextBox2.Text = TextBox1.Text.ToUpper End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button3.Click Dim s As String s = TextBox1.Text s = CharLower(s) TextBox2.Text = s End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button4.Click Dim s As String s = TextBox1.Text s = CharUpper(s) TextBox2.Text = s End Sub End Class

16
Implmenter un systme daide
Les fichiers daide Microsoft existent sous deux formats: .HLP et .CHM. Le premier format est trs ancien puisquil date de Windows3.1. Apparu avec les systmes Windows32bits, le deuxime format offre des avantages indniables:

possibilit de dfinir une table des matires, un index et/ou un onglet de favoris; compilation des fichiers daide pour diminuer leur taille; utilisation possible des fichiers CHM sur le Web via une mthode Visual Basic.

Signalons en outre que la mise en uvre de fichiers CHM est plus simple que celle des fichiers HLP et quelle permet dutiliser de nombreuses fonctionnalits du HTML, telles que CSS ou JavaScript. Les utilisateurs dOfficeXP et 2003 peuvent se servir du programme HTML Help Workshop (qui est fourni) pour crer des fichiers daide au format .CHM.

362

Visual Basic 2010

Si vous utilisez une version plus ancienne de Microsoft Office, vous pouvez tlcharger gratuitement le programme HTML Help Workshop. Pour cela, rendez-vous (par exemple) sur le site Microsoft Download Center, ladresse http://www.microsoft.com/downloads/ details.aspx?FamilyID=00535334-c8a6-452f-9aa0-d597d16580cc&DisplayLang=en (voir Figure16.1).
Figure16.1 Cette page permet de tlcharger le programme HTML Help Workshop.

Pour faciliter la prise en main du programme HTML Help Workshop, nous allons raisonner sur un exemple concret en ajoutant de laide au projet "Personnaliser Windows7", dvelopp au Chapitre17 (voir Figure16.2).
Figure16.2 La fentre de lapplication Personnalisation de Windows7.

Chapitre 16

Implmenter un systme daide

363

Premire tape: collecte des informations utilises par le systme daide


Dans la premire tape du projet, vous allez mettre plat tous les sujets qui doivent tre abords par le systme daide. Comme vous pouvez le voir la Figure 16.2, les diffrentes fonctionnalits du projet Personnalisation de WindowsXP sont regroupes sous trois onglets. Les informations qui apparaissent sous ces onglets peuvent tre personnalises et tendues loisir par chaque utilisateur. Les rubriques daide pourraient donc tre les suivantes:

Message de bienvenue; Historique de lapplication; Utilisation du produit; Onglet Raccourcis; Onglet Astuces; Onglet Personnalisation; Extension du produit; Extension de longlet Raccourcis; Extension de longlet Astuces; Extension de longlet Personnalisation.

Deuxime tape: conception des pages HTML des rubriques


Pour chacune des rubriques numres dans la premire tape, une page HTML doit tre labore. Utilisez lditeur HTML de votre choix (le Bloc-notes de Windows ou un diteur spcialis HTML, comme Notepad++ par exemple) pour crer les diffrentes pages. Voici quelques conseils pratiques:

Utilisez un modle de page de faon uniformiser le look and feel de votre systme daide. Choisissez un titre (marqueur <title>) parlant pour chacune des rubriques afin de faciliter votre futur travail dans le compilateur. Si vous insrez des images, des sons ou des vidos dans les pages HTML, rfrencez-les de faon relative (et non par rapport la racine du projet daide).

364

Visual Basic 2010

Voici le code source et linterprtation HTML des huit fichiers intgrer dans laide.
Prsentation.htm
<html> <head> <title>Prsentation </title> </head> <body> Lapplication "Personnalisation de Windows7" propose trois faons de faciliter lutilisation de Windows7: <ul> <li>Excution de programmes dun simple clic de souris; <li>Exposition dtaille de techniques permettant damliorer le fonctionnement de Windows7; <li>Modification de paramtres en agissant sur le Registre de Windows7. </ul> Un ensemble de raccourcis, astuces et commandes est propos avec lapplication. <p> Si vous le souhaitez, il est possible de supprimer ou de complter loisir les lments accessibles par lintermdiaire de cette application, et ce, sans avoir recours la programmation. </body> </html>

Figure16.3 La page Prsentation.htm.

Chapitre 16

Implmenter un systme daide

365

Historique.htm
<html> <head> <title>Historique </title> </head> <body> Lapplication "Personnalisation de Windows7" a t dveloppe en Visual Basic 2010. <p> La version actuelle est 4.0. Elle date du 25 Mai 2010. </body> </html>

Figure16.4 La page Historique.htm.

OngletRaccourcis.htm
<html> <head> <title>Onglet Raccourcis </title> </head> <body>

366

Visual Basic 2010

Longlet "Raccourcis" donne accs un ensemble de programmes difficiles lancer via le menu Dmarrer. <p> Pour lancer un programme, slectionnez-le dans la liste droulante et cliquez sur "Excuter". </body> </html>

Figure16.5 La page Onglet


Raccourcis.htm.

OngletAstuces.htm
<html> <head> <title>Onglet Astuces </title> </head> <body> Longlet "Astuces" regroupe un ensemble dastuces destines amliorer le fonction nement de Windows. <p>

Chapitre 16

Implmenter un systme daide

367

Pour afficher le texte associ une astuce, il suffit de slectionner une entre dans la liste droulante. </body> </html>

Figure16.6 La page Onglet Astuces.htm.

OngletPersonnalisation.htm
<html> <head> <title>Onglet Personnalisation </title> </head> <body> Longlet "Personnalisation" donne accs un ensemble de paramtres qui agissent sur le Registre de Windows7. <p> Pour excuter une des actions listes sous longlet Personnalisation, il suffit de faire votre choix dans la liste droulante et de cliquer sur "Excuter". </body> </html>

368

Visual Basic 2010

Figure16.7 La page OngletPersonnalisation.htm.

PersoRaccourcis.htm
<html> <head> <title>Etendre longlet Raccourcis </title> </head> <body> Pour modifier la liste des programmes excutables sous longlet Raccourcis, un simple diteur de texte suffit. <p> Ouvrez le fichier "raccourcis.txt" et dfinissez trois lignes de texte pour chaque programme que vous voulez rpertorier dans la liste: <ul> <li>Le nom qui doit apparatre dans la liste droulante; <li>Le texte daide afficher lorsque le programme est slectionn dans la liste droulante; <li>La syntaxe complte de lancement du programme. </ul> Aprs chaque modification du fichier "raccourcis.txt", vous devez, si ncessaire, trier les informations selon le premier champ. </body> </html>

Chapitre 16

Implmenter un systme daide

369

Figure16.8 La page PersoRaccourcis.htm.

PersoAstuces.htm
<html> <head> <title>Etendre longlet Astuces </title> </head> <body> Pour modifier la liste des astuces affiches sous longlet Astuces, un simple diteur de texte suffit. <p> Ouvrez le fichier "astuces.txt" et dfinissez deux lignes de texte pour chaque astuce rpertorier: <ul> <li>Le nom qui doit apparatre dans la liste droulante; <li>Le texte daide afficher lorsque le programme est slectionn dans la liste droulante. </ul> Aprs chaque modification du fichier "raccourcis.txt", vous devez, si ncessaire, trier les informations selon le premier champ. </body> </html>

370

Visual Basic 2010

Figure16.9 La page Perso Astuces.htm.

PersoPersonnalisation.htm
<html> <head> <title>Onglet Personnalisation </title> </head> <body> Pour modifier la liste des commandes rpertories sous longlet Personnalisation, un simple diteur de texte suffit. <p> Ouvrez le fichier "perso.txt" et dfinissez six lignes de texte pour chacune des commandes que vous souhaitez afficher : <ul><li>Le texte qui doit apparatre dans la liste droulante <li>Le nom de la ruche <li>Le chemin de la cl <li>Le nom de la valeur <li>La donne affecter cette valeur

Chapitre 16

Implmenter un systme daide

371

<li>Le type de la valeur</ul> Aprs chaque modification du fichier "perso.txt", vous devez, si ncessaire, trier les informations selon le premier champ. </body> </html>

Figure16.10 La page PersoPersonnalisation.htm.

Troisime tape: conception du fichier daide .CHM


Pour crer le fichier daide au format .CHM, vous allez devoir dfinir:

un fichier projet dextension .HHP; un fichier sommaire dextension .HHC; un fichier index dextension .HHK.

Lancez lapplication HTML Help Workshop avec la commande Tous les programmes/ HTML Help Workshop/HTML Help Workshop dans le menu Dmarrer (voir Figure16.11).

372

Visual Basic 2010

Figure16.11 La fentre principale de HTML Help Workshop.

Lancez la commande New dans le menu File. Choisissez Project dans la bote de dialogue et validez en cliquant sur OK. Un assistant vous aide dfinir les informations qui permettront de construire le projet daide. La premire bote de dialogue demande sil sagit de la conversion dun fichier WinHelp, cest--dire dun fichier daide 16bits au format .HLP (voir Figure16.12).
Figure16.12 LAssistant sait convertir un fichier .HLP en un fichier .CHM.

Chapitre 16

Implmenter un systme daide

373

Laissez la case Convert WinHelp project dcoche et cliquez sur Suivant. Dfinissez le chemin complet du projet daide (disque, dossier et nom) puis cliquez sur Suivant. La troisime bote de dialogue vous demande si vous avez dj conu un fichier sommaire, un fichier index et/ou des fichiers HTML (voir Figure16.13).
Figure16.13 Quels sont les fichiers dj conus?

Cochez la case HTML files (.htm) et cliquez sur Suivant. Vous devez maintenant spcifier les fichiers HTML intgrer au projet daide. Cliquez sur Add et utilisez la bote de dialogue slection multiple Ouvrir pour dsigner en une seule opration lensemble des fichiers utiliser. La bote de dialogue New Project doit maintenant ressembler la Figure16.14.
Figure16.14 Huit fichiers HTML doivent tre intgrs au projet daide.

374

Visual Basic 2010

Cliquez sur Suivant puis sur Terminer pour gnrer le projet daide. La fentre de lapplication HTML Help Workshop se prsente comme la Figure16.15.
Figure16.15 La fentre de lapplication HTML Help Workshop aprs lutilisation de lAssistant.

Vous allez maintenant crer un fichier sommaire et un fichier index. Slectionnez longlet Contents. La bote de dialogue reprsente la Figure16.16 saffiche.
Figure16.16 Dfinition du fichier sommaire.

Choisissez loption Create a new contents file. Cliquez sur OK. Donnez un nom au fichier sommaire et cliquez sur Enregistrer pour crer le fichier dextension .HHC. Slectionnez longlet Index. La bote de dialogue reprsente la Figure16.17 saffiche.

Chapitre 16

Implmenter un systme daide

375

Figure16.17 Dfinition de lindex.

Choisissez loption Create a new index file. Cliquez sur OK. Donnez un nom au fichier index et cliquez sur Enregistrer pour crer le fichier dextension .HHK. Basculez sur longlet Project et cliquez sur licne Add/Modify window definitions pour dfinir le style de la fentre daide. Utilisez les onglets de la bote de dialogue Windows types pour choisir le titre de la fentre, les boutons afficher dans la fentre, la position de la fentre sur lcran, etc. (voir Figure16.18).
Figure16.18 Cette bote de dialogue dfinit le style de la fentre daide.

Dfinissez un fichier texte qui rfrence les diffrentes pages de laide comme la Figure16.19. Sauvegardez ce fichier en lui donnant lextension .H.

376

Visual Basic 2010

Figure16.19 Chaque page a un numro didentification unique.

Cliquez sur le bouton HtmlHelp API Information (quatrime icne dans la fentre HTML Help Workshop). Une bote de dialogue intitule HtmlHelp API Information saffiche. Cliquez sur le bouton Header file puis sur le bouton Browse et dsignez le fichier dextension .H que vous venez de crer. Vous devriez obtenir quelque chose comme la Figure16.20.
Figure16.20 Le fichier dalias a t rfrenc.

Basculez sur longlet Alias de la bote de dialogue HtmlHelp API information. Cliquez autant de fois que ncessaire sur le bouton Add pour dfinir tous les alias (voir Figure16.21).

Chapitre 16

Implmenter un systme daide

377

Figure16.21 Dfinition dun alias.

Lorsque tous les alias ont t dfinis, vous devez obtenir quelque chose qui ressemble la Figure16.22.
Figure16.22 Tous les alias ont t dfinis.

Fermez la bote de dialogue HtmlHelp API information.

Dfinition du sommaire
Vous allez maintenant concevoir le sommaire de laide. Cliquez sur longlet Contents. Les rubriques seront cres laide de licne Insert a page et les chapitres laide de licne Insert a heading.

378

Visual Basic 2010

titre dexemple, la Figure16.23 reprsente la rubrique Prsentation. Linformation qui apparat dans la zone File/URL and their information types a t dfinie en appuyant sur le bouton Add.
Figure16.23 Entre de sommaire Prsentation.

Lorsque toutes les entres du sommaire ont t dfinies, la fentre HTML Help Workshop doit ressembler la Figure16.24.
Figure16.24 Le sommaire est entirement dfini.

Chapitre 16

Implmenter un systme daide

379

Dfinition de lindex
Basculez sur longlet Index. Pour dfinir une entre dindex, cliquez sur licne Insert a keyword. Entrez un mot dans la zone de texte Keyword et cliquez autant de fois que ncessaire sur le bouton Add pour lier le mot-cl aux pages de laide. la Figure16.25, par exemple, plusieurs pages sont relies au mot-cl Onglet.
Figure16.25 Dfinition de lentre onglet dans lindex.

Cliquez sur le bouton Save file lorsque toutes les entres dindex ont t cres. Vous allez maintenant compiler le projet daide pour crer le fichier .CHM correspondant. Basculez sur longlet Project et cliquez sur licne Save all files and compile. Le fichier daide .CHM est cr. Vrifiez quaucune erreur na t dtecte en parcourant le fichier de log (voir Figure16.26).
Figure16.26 Aucune erreur na t dtecte dans le projet daide.

380

Visual Basic 2010

Quatrime tape: interfaage du fichier daide avec un projet Visual Basic


Pour intgrer un fichier daide .CHM (ou .HLP) un projet Visual Basic 2010, procdez comme suit: 1. Ajoutez un contrle HelpProvider au projet et indiquez le nom du fichier daide utiliser dans sa proprit HelpNameSpace. 2. Slectionnez lobjet Form1 dans la fentre des proprits et initialisez True sa proprit ShowHelp sur HelpProvider. La Figure 16.27 donne un exemple daffichage de laide depuis lapplication Personna lisation de Windows7 dveloppe au Chapitre17.
Figure16.27 La fentre daide a t affiche avec la touche F1.

Il est galement possible daccder lindex de laide avec la mthode ShowHelpIndex():


Help.ShowHelpIndex(Me, "c:\FichierAide.chm")

ou avec la mthode ShowHelp():


Help.ShowHelp(Me, "c:\FichierAide.chm", HelpNavigator.Index)

Chapitre 16

Implmenter un systme daide

381

Si ncessaire, vous pouvez galement accder la page de recherche, la page concernant un mot-cl particulier ou une rubrique particulire en utilisant la mthode ShowHelp():
Accs la page de recherche Help.ShowHelp(Me, "c:\FichierAide.chm", Accs la page relative un mot cl Help.ShowHelp(Me, "c:\FichierAide.chm", Accs la rubrique dont le numro est Help.ShowHelp(Me, "c:\FichierAide.chm", HelpNavigator.Find) "mot cl") spcifi HelpNavigator.Topic, numro de rubrique)

Info

Le deuxime argument de la mthode ShowHelp() peut galement tre une adresse URL. Utilisez dans ce cas le caractre sparateur "\" la place du "/".

17
Personnaliser Windows7
Au sommaire de ce chapitre

Informations de la base de donnes Ralisation


Le projet dvelopp dans ce chapitre est une base de donnes ouverte qui rassemble des trucs, des astuces et des rglages pour Windows7 et qui permet de lancer les applications difficilement accessibles par le menu Dmarrer. Notez bien que cette base de donnes nest utilisable que sous lenvironnement Windows7. Toute utilisation dans un autre systme dexploitation pourrait entraner des dgradations matrielles ou logicielles irrversibles. Les informations incluses dans cette base de donnes ont t rcupres sur le Web et sur divers livres informatiques. Certains rglages agissent directement sur le Registre de Windows7. Dautres sont exposs en dtail, et vous devrez vous-mme effectuer les manipulations adquates. Si vous utilisez de manire inconsidre ces rglages, il peut sensuivre une dstabilisation matrielle ou logicielle de votre ordinateur. CampusPress ne saurait en aucun cas tre tenu pour responsable de telles dtriorations. Prenez donc toutes les prcautions ncessaires et nagissez quen toute connaissance de cause

384

Visual Basic 2010

Informations de la base de donnes


La base de donnes dveloppe dans ce chapitre propose trois types de services:

excution de programmes dun simple clic de souris; exposition dtaille de techniques permettant damliorer le fonctionnement de Windows7; modification de paramtres en agissant sur le Registre de Windows7.

Excution de programmes
La base de donnes est accessible laide de trois onglets : Raccourcis, Astuces et Personnalisation. Longlet Raccourcis donne accs un ensemble de programmes difficiles lancer via le menu Dmarrer (voir Figure17.1).
Figure17.1 Le premier onglet donne accs un ensemble de programmes que lon peut lancer dun simple clic.

Le tableau suivant donne un aperu des programmes rpertoris sous longlet Raccourcis:
Programme lancer
Gestion de lordinateur Gestionnaire de priphriques Gestion des disques

Commande
c:\windows\system32\mmc.exe c:\windows\system32\compmgmt.msc c:\windows\system32\mmc.exe c:\windows\system32\devmgmt.msc c:\windows\system32\mmc.exe c:\windows\system32\diskmgmt.msc

Chapitre 17


Commande

Personnaliser Windows7

385

Programme lancer
Observateur dvnements Dossiers partags Utilisateurs et groupes locaux Performance Services

c:\windows\system32\mmc.exe c:\windows\system32\eventvwr.msc c:\windows\system32\mmc.exe c:\windows\system32\fsmgmt.msc c:\windows\system32\mmc.exe c:\windows\system32\lusrmgr.msc c:\windows\system32\mmc.exe c:\windows\system32\perfmon.msc c:\windows\system32\mmc.exe c:\windows\system32\services.msc

Ces informations sont regroupes dans un fichier texte nomm raccourcis.txt. Chacun des programmes rpertoris demande trois informations:

le nom qui doit apparatre dans la liste droulante; le texte daide afficher lorsque le programme est slectionn dans la liste droulante; la syntaxe complte de lancement du programme.

Les informations sont tries par ordre alphabtique sur le premier champ:
Dfragmenteur de disque Le Dfragmenteur de disque est un utilitaire systme qui permet danalyser des volumes locaux et de localiser et dunir les fichiers et dossiers fragments. Vous pouvez galement dfragmenter des disques partir dune ligne de commande laide de la commande defrag. c:\windows\system32\mmc.exe c:\windows\system32\dfrg.msc Utilisateurs et groupes locaux Lapplication Utilisateurs et groupes locaux est ddie la gestion des utilisateurs et des groupes locaux. c:\windows\system32\mmc.exe c:\windows\system32\lusrmgr.msc

Si vous le souhaitez, il est possible dajouter un ou plusieurs programmes dans le fichier raccourcis.txt, en respectant la structure du fichier et lordre de classement selon le premier champ.

Amlioration du fonctionnement de Windows


Longlet Astuces regroupe un ensemble dastuces destines amliorer le fonctionnement de Windows (voir Figure17.2).

386

Visual Basic 2010

Figure17.2 Le deuxime onglet prsente un ensemble dastuces.

Le tableau suivant donne un aperu des astuces numres sous longlet Astuces:
Effet recherch
Amliorer la gestion de la mmoire

Manipulation
Windows 7 nutilise, par dfaut, que 512ko de mmoire vive en tant que mmoire tampon pour ses changes avec le disque dur. Si vous disposez dau moins 1 Go de mmoire vive, vous pouvez augmenter la quantit de mmoire alloue: la lecture et lcriture de fichiers seront acclres. Tapez RegEdit. Accdez au chemin IoPageLockLimit. Affectez-lui la valeur 000F0000.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management. Dfinissez la variable dword

Crer des noms dunits personnaliss

Lancez la commande Excuter dans le menu Dmarrer. Tapez RegEdit. Accdez au chemin HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows\CurrentVersion\Explorer. Crez la cl DriveIcons. Crez une nouvelle cl que vous nommerez par la lettre du lecteur qui vous intresse ("D" par ex). Ouvrez cette nouvelle cl et crez une dernire cl lintrieur que vous nommerez DefaultLabel. Donnez le nom du lecteur cette cl. Cliquez sur Dmarrer, tapez regsvr32 /u zipfldr.dll dans la zone de saisie et validez. Ouvrez le Panneau de configuration. Double-cliquez sur licne Systme. Slectionnez longlet Avanc. Cliquez sur le bouton Rapports derreur. Cochez la case Dsactiver le rapport derreur. Lancez la commande Excuter dans le menu Dmarrer. Tapez RegEdit. Accdez au chemin HKEY_CURRENT_USER\software\Microsoft\Windows\CurrentVersion\Run\. Supprimer la cl MsnMsgr. Cliquez droit sur un emplacement vide du Bureau et choisissez Nouveau puis Raccourci dans le menu. Dfinissez la commande shutdown -s pour teindre lordinateur.

Dsactiver les "dossiers ZIP" Dsactiver les rapports derreur

Empcher le dmarrage automatique de Windows Messenger teindre lordinateur avec un raccourci

Chapitre 17


Manipulation

Personnaliser Windows7

387

Effet recherch
Dsactiver les info-bulles

Lancez lditeur du Registre avec la commande regedit dans le menu Dmarrer. Dveloppez larborescence HKEY_CURRENT_USER\
Software\Microsoft\Windows\CurrentVersion\Explorer\ Advanced. Crez une nouvelle cl de type DWORD nomme EnableBalloonTips et donnez-lui la valeur 0 pour dsactiver les info-bulles, ou 1 pour les activer.

Afficher un message au dmarrage

Pour afficher un message, juste avant de choisir un utilisateur, excutez lditeur du Registre. Dveloppez larborescence jusqu
HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon. Donnez la valeur de votre choix aux donnes REG_SZ LegalNoticeCaption (titre) et LegalNoticeText (texte).

Modifier le nom de la Corbeille

Lancez lditeur du Registre avec la commande Regedit dans le menu Dmarrer. Dveloppez larborescence HKEY_CLASSES_ROOT, cherchez la cl {645FF040-5081-101B-9F08-00AA002F954E}. Cliquez dessus. Double-cliquez sur la chane (par default) dont la valeur par dfaut est Corbeille, et donnez-lui le nom que vous souhaitez. Ouvrez lditeur du Registre avec la commande regedit dans le menu Dmarrer. Dveloppez larborescence HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion. Double-cliquez sur la cl ProgramFilesDir et indiquez le chemin du nouveau dossier Program Files. Droulez le menu Dmarrer, cliquez du bouton droit sur le dossier Documents et choisissez Proprits dans le menu contextuel. Slectionnez longlet Location, cliquez sur Dplacer, dsignez le dossier utiliser et cliquez sur OK pour valider.
dll32.exe advapi32.dll,ProcessIdleTasks et validez.

Modifier lemplacement du dossier Program Files

Dplacer le dossier Documents

Lancer loptimisation des fichiers Mieux grer la priorit des processus

Lancez la commande Excuter dans le menu Dmarrer. Tapez RunAppuyez simultanment sur les touches CTRL, ALT et SUPPR. Slectionnez Ouvrir le Gestionnaire des tches dans le menu. Cliquez sur longlet Processus. Cliquez droit sur le programme auquel vous voulez allouer plus de ressources, et choisissez une des entres proposes sous la commande Dfinir la priorit. Cliquez droit sur un emplacement vide du Bureau et choisissez Nouveau puis Raccourci dans le menu. Dfinissez la commande shutdown -r pour redmarrer lordinateur.

Redmarrer lordinateur avec un raccourci Retirer les programmes qui se lancent au dmarrage par le registre

Lancez lditeur du Registre avec la commande RegEdit dans le menu Dmarrer. Accdez au chemin HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Supprimez les valeurs qui correspondent aux programmes que vous voulez retirer au dmarrage.

388

Visual Basic 2010

Ces informations sont regroupes dans un fichier texte nomm astuces.txt. Chacune des astuces rpertories demande deux informations:

le nom qui doit apparatre dans la liste droulante; le texte daide afficher lorsque le programme est slectionn dans la liste droulante.
Amliorer la gestion de la mmoire Windows 7 nutilise, par dfaut, que 512 ko de mmoire vive en tant que mmoire tampon pour ses changes avec le disque dur. Si vous disposez dau moins 1 Go de mmoire vive, vous pouvez augmenter la quantit de mmoire alloue: la lecture et lcriture de fichiers seront acclres. Tapez RegEdit. Accdez au chemin HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management. Dfinissez la variable dword IoPageLockLimit. Affectez-lui la valeur 000F0000. Retirer les programmes qui se lancent au dmarrage par le registre Lancez lEditeur du Registre avec la commande RegEdit dans le menu Dmarrer. Accdez au chemin HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ Run. Supprimez les valeurs qui correspondent aux programmes que vous voulez retirer au dmarrage.

Les informations sont tries par ordre alphabtique sur le premier champ:

Si vous le souhaitez, il est possible dajouter une ou plusieurs astuces dans le fichier astuces. txt, en respectant la structure du fichier et lordre de classement selon le premier champ.

Paramtrage de Windows
Longlet Personnalisation donne accs un ensemble de paramtres qui agissent sur le Registre de Windows7 (voir Figure17.3).
Figure17.3 Les commandes du troisime onglet modifient le Registre.

Chapitre 17

Personnaliser Windows7

389

Le tableau suivant donne un aperu des commandes numres sous longlet Personnalisation:
Effet recherch
Acclrer le menu Dmarrer Restaurer la vitesse du menu Dmarrer Dsactiver les info-bulles

Ruche principale
CurrentUser CurrentUser

Chemin
Control Panel\ Desktop Control Panel\ Desktop

Valeur
MenuShowDelay MenuShowDelay

Donne
5 400

Type de la valeur
REG_SZ REG_SZ

CurrentUser

Software\Microsoft\ EnableBalloonTips Windows\CurrentVersion\Explorer\ Advanced Software\Microsoft\ EnableBalloonTips Windows\CurrentVersion\Explorer\ Advanced SOFTWARE\ Microsoft\Dfrg\ BootOptimizeFunction SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction Enable

REG_DWORD

Ractiver les info-bulles

CurrentUser

REG_DWORD

Dsactiver la d- LocalMachine fragmentation des fichiers systme au boot Ractiver la LocalMachine dfragmentation des fichiers systme au boot Augmenter la LocalMachine mmoire tampon pour les accs au disque dur

REG_SZ

Enable

REG_SZ

SYSTEM\CurrentIoPageLockLimit ControlSet\Control\ Session Manager\ Memory Management

983040 REG_DWORD

Ces informations sont regroupes dans un fichier texte nomm perso.txt. Chacune des entres rpertories demande six informations:

le texte qui doit apparatre dans la liste droulante; la ruche principale; la cl modifier dans le Registre; la valeur affecter cette cl; la donne affecter cette valeur; le type de la valeur (REG_SZ, REG_EXPAND_SZ, REG_DWORD ou REG_BINARY).

390

Visual Basic 2010

Les informations sont tries par ordre alphabtique sur le premier champ.
Acclrer le menu Dmarrer CurrentUser Control Panel\Desktop MenuShowDelay 5 REG_SZ Restaurer la vitesse du menu Dmarrer CurrentUser Control Panel\Desktop MenuShowDelay 400 REG_SZ

Si vous le souhaitez, il est possible dajouter une ou plusieurs commandes dans le fichier perso.txt, en respectant la structure du fichier et lordre de classement selon le premier champ.

Ralisation
Vous allez maintenant crer lapplication Visual Basic qui gre la base de donnes: 1. Dfinissez le projet Tweak7 fond sur le modle Application Windows Forms. 2. Insrez un contrle TabControl sur la feuille de lapplication. 3. Cliquez sur les points de suspension qui apparaissent dans la proprit TabPages du contrle TabControl. 4. Ajoutez un troisime onglet en cliquant sur le bouton Ajouter. 5. Dfinissez le nom des onglets laide de la proprit Text (voir Figure17.4), puis refermez la bote de dialogue diteur de collections TabPage. 6. Agrandissez la fentre de lapplication, puis affectez la valeur Fill la proprit Dock du contrle TabControl pour lui faire occuper la totalit de lespace disponible dans la fentre. Pour cela, il suffit de dvelopper la liste droulante Dock et de cliquer sur le rectangle central (voir Figure17.5). 7. Sous longlet Raccourcis, ajoutez un contrle ComboBox, un bouton de commande, un contrle GroupBox et un Label pour obtenir leffet visuel de la Figure17.6.

Chapitre 17

Personnaliser Windows7

391

Figure17.4 La proprit Text permet de dfinir le nom des onglets (Raccourcis, Astuces et Personnalisation).

Figure17.5 Maximisation de lespace occup par le contrle TabControl.

Figure17.6 Le premier onglet de lapplication.

392

Visual Basic 2010

8. Modifiez les proprits des contrles du premier onglet comme suit:


Objet
Combo1 Button1 GroupBox1 Label1 Label1 Label1

Proprit
Text Text Text Text AutoSize Font

Valeur

Excuter

Slectionnez une entre dans la liste pour excuter la commande correspondante


False1

Microsoft Sans Serif corps 12

1. Une fois que la proprit AutoSize du contrle Label1 a t initialise False, vous devez redimensionner ce contrle pour quil occupe la quasi-totalit du contrle GroupBox.

9. Sous longlet Astuces, ajoutez un contrle ComboBox, un contrle GroupBox et un Label pour obtenir leffet visuel de la Figure17.7.
Figure17.7 Le deuxime onglet de lapplication.

10. Modifiez les proprits des contrles du deuxime onglet comme suit:
Objet
Combo2 GroupBox2

Proprit
Text Text

Valeur

Chapitre 17


Proprit
Text AutoSize Font

Personnaliser Windows7

393

Objet
Label2 Label1 Label2

Valeur
Slectionnez une entre dans la liste pour afficher lastuce correspondante False2 MS Sans Serif corps 12

2. Une fois que la proprit AutoSize du contrle Label1 a t initialise False, vous devez redimensionner ce contrle pour quil occupe la quasi-totalit du contrle GroupBox.

11. Sous longlet Personnalisation, ajoutez un contrle ComboBox, un bouton de commande, un contrle GroupBox et un Label pour obtenir leffet visuel de la Figure17.8.
Figure17.8 Le troisime onglet de lapplication.

12. Modifiez les proprits des contrles du troisime onglet comme suit:
Objet
Combo3 Button2 GroupBox3 Label3 Label3

Proprit
Text Text Text Text Font

Valeur

Excuter

Slectionnez une entre dans la liste pour excuter la commande correspondante MS Sans Serif corps 12

394

Visual Basic 2010

Linterface de lapplication est entirement dfinie. Vous allez maintenant passer lcriture de code. Slectionnez Form1 dans la fentre Proprits, cliquez sur licne vnements, double-cliquez sur lvnement Load et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ----------------------------------------------- Lecture du fichier de donnes du premier onglet -----------------------------------------------cd = CurDir() FileOpen(1, cd + "\raccourcis.txt", OpenMode.Input) For i = 1 To 8 ListeRaccourcis.Add(LineInput(1)) Comment1(i) = LineInput(1) commande1(i) = LineInput(1) Next ComboBox1.DataSource = ListeRaccourcis FileClose(1) ----------------------------------------------- Lecture du fichier de donnes du deuxime onglet -----------------------------------------------FileOpen(1, cd + "\astuces.txt", OpenMode.Input) For i = 1 To 15 ListeAstuces.Add(LineInput(1)) Comment2(i) = LineInput(1) Next ComboBox2.DataSource = ListeAstuces FileClose(1) ----------------------------------------------- Lecture du fichier de donnes du troisime onglet -----------------------------------------------FileOpen(1, cd + "\perso.txt", OpenMode.Input) For i = 1 To 7 ListePerso.Add(LineInput(1)) HotKey(i) = LineInput(1) chemin(i) = LineInput(1) cl(i) = LineInput(1) valeur(i) = LineInput(1)

Chapitre 17


TypeVal(i) = LineInput(1) Next ComboBox3.DataSource = ListePerso FileClose(1)

Personnaliser Windows7

395

End Sub

Cette procdure initialise les listes droulantes et place le contenu des trois fichiers de donnes dans des tableaux. Le premier bloc dinstructions est ddi la gestion du fichier raccourcis.txt. Aprs avoir initialis lobjet cd avec le dossier courant:
cd = CurDir()

le fichier contenant les donnes relatives longlet Raccourcis est ouvert en lecture:
FileOpen(1, cd + "\raccourcis.txt", OpenMode.Input)

Une boucle For Next lit les triplets de donnes. La premire donne est place dans la collection ListeRaccourcis laide de la procdure Add(). Les autres donnes sont places dans les tableaux comment1() et commande1():
For i = 1 To 8 ListeRaccourcis.Add(LineInput(1)) Comment1(i) = LineInput(1) commande1(i) = LineInput(1) Next

Lorsque la boucle est termine, la liste droulante de longlet Raccourcis est initialise laide de la collection ListeRaccourcis, puis le fichier raccourcis.txt est ferm:
ComboBox1.DataSource = ListeRaccourcis FileClose(1)

Des instructions similaires permettent dinitialiser les deux autres listes droulantes et les tableaux comment2(), HotKey(), chemin(), cl() et valeur(). Pour complter cette procdure, dfinissez les objets ci-aprs:
Dim Dim Dim Dim Dim Dim Dim Dim cd As String ListeRaccourcis As New Collections.ArrayList() ListeAstuces As New Collections.ArrayList() ListePerso As New Collections.ArrayList() i As Integer Comment1(9), commande1(9) As String Comment2(21) As String HotKey(22), chemin(22), cl(22), valeur(22) As String

396

Visual Basic 2010

Vous allez maintenant dfinir les actions correspondant aux contrles de chaque onglet. Sous longlet 1, le programme doit ragir aux choix dans la liste droulante et au clic sur le bouton de commande. Basculez dans la fentre de code, slectionnez le contrle ComboBox1 dans la premire liste droulante et lvnement SelectedIndexChanged dans la deuxime. Ajoutez linstruction suivante la procdure ComboBox1_SelectedIndexChanged():
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Label1.Text = Comment1(ComboBox1.SelectedIndex + 1) End Sub

Lunique instruction de cette procdure initialise le contenu du label en fonction de lentre slectionne dans la liste droulante. ComboBox1.SelectedIndex renvoie le numro de lentre slectionne dans la liste droulante. Pour accder linformation correspondante, il suffit de se servir de cette information comme index dans le tableau comment1(). Double-cliquez sur le bouton de commande et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim s As String s = commande1(ComboBox1.SelectedIndex + 1) Shell(s, 1) End Sub

Lindex de lentre slectionne dans la liste droulante est utilis pour trouver la commande correspondante dans le tableau commande1(). Le libell de la commande est stock dans lobjet String s:
Dim s As String s = commande1(ComboBox1.SelectedIndex + 1)

La troisime instruction utilise la fonction Shell() pour excuter la commande qui se trouve dans la variable s:
Shell(s, 1)

Passons au deuxime onglet. Basculez dans la fentre de code. Slectionnez le contrle ComboBox2 dans la premire liste droulante et lvnement SelectedIndexChanged dans la deuxime. Ajoutez linstruction suivante la procdure ComboBox2_SelectedIndexChanged():
Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object,

Chapitre 17

Personnaliser Windows7

397

ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged Label2.Text = Comment2(ComboBox2.SelectedIndex + 1) End Sub

Cette procdure ressemble beaucoup ComboBox1_SelectedIndexChanged (). Lindex de lentre slectionne dans la liste est utilis pour trouver linformation correspondante dans le tableau comment2(). Cette information est affecte la proprit Text du label et apparat dans le cadre. Nous allons maintenant nous occuper du troisime onglet. Double-cliquez sur le bouton de commande et compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim hk, ch, c, v, t As String Dim key As RegistryKey hk = LCase(HotKey(ComboBox3.SelectedIndex + 1)) ch = chemin(ComboBox3.SelectedIndex + 1) c = cl(ComboBox3.SelectedIndex + 1) v = valeur(ComboBox3.SelectedIndex + 1) If hk = "classesroot" Then key = Registry.ClassesRoot.OpenSubKey(ch, True) If hk = "currentconfig" Then key = Registry.CurrentConfig.OpenSubKey(ch, True) If hk = "currentuser" Then key = Registry.CurrentUser.OpenSubKey(ch, True) If hk = "dyndata" Then key = Registry.DynData.OpenSubKey(ch, True) If hk = "localmachine" Then key = Registry.LocalMachine.OpenSubKey(ch, True) If hk = "performancedata" Then key = Registry.PerformanceData.OpenSubKey(ch, True) If hk = "users" Then key = Registry.Users.OpenSubKey(ch, True) If t = "REG_SZ" Then key.SetValue(c, v) If t = "REG_DWORD" Then key.SetValue(c, v, Microsoft.Win32.Registry ValueKind.DWord) key.Close() End Sub

Les deux premires instructions dfinissent les objets utiliss dans la procdure:
Dim hk, ch, c, v, t As String Dim key As RegistryKey

Pour pouvoir dclarer un objet RegistryKey, vous devez ajouter une instruction Imports en dbut de listing:
Imports Microsoft.Win32

398

Visual Basic 2010

Dans le bloc dinstructions suivant, lindex de lentre slectionne dans la liste droulante (ComboBox3.SelectedIndex) est utilis pour extraire les informations des tableaux HotKey(), chemin(), cl() et valeur(). Ces donnes sont mmorises dans les variables hk, ch, c et v:
hk = LCase(HotKey(ComboBox3.SelectedIndex + 1)) ch = chemin(ComboBox3.SelectedIndex + 1) c = cl(ComboBox3.SelectedIndex + 1) v = valeur(ComboBox3.SelectedIndex + 1)

Le bloc dinstructions suivant fait appel la procdure OpenSubKey() pour ouvrir une cl dans le Registre. Linstruction Registry.xxx.OpenSubKey() utiliser dpend de la hotkey:
If hk = "classesroot" Then key = Registry.ClassesRoot.OpenSubKey(ch, True) If hk = "currentconfig" Then key = Registry.CurrentConfig.OpenSubKey(ch, True) If hk = "currentuser" Then key = Registry.CurrentUser.OpenSubKey(ch, True) If hk = "dyndata" Then key = Registry.DynData.OpenSubKey(ch, True) If hk = "localmachine" Then key = Registry.LocalMachine.OpenSubKey(ch, True) If hk = "performancedata" Then key = Registry.PerformanceData.OpenSubKey(ch, True) If hk = "users" Then key = Registry.Users.OpenSubKey(ch, True)

Lorsque la cl a t ouverte, une valeur est dfinie laide de la procdure SetValue() puis la cl est ferme:
If t = "REG_SZ" Then key.SetValue(c, v) If t = "REG_DWORD" Then key.SetValue(c, v, Microsoft.Win32.RegistryValueKind.DWord) key.Close()

Lapplication est entirement oprationnelle et prte lemploi. Vous pouvez loisir complter cette base de donnes en utilisant des informations complmentaires sur les revues, les livres dinformatique et les sites web ddis Windows7. Pour complter lun des trois fichiers qui composent la base de donnes (astuces.txt, perso.txt et raccourcis. txt), un simple diteur de texte suffit. Vous pouvez, par exemple, utiliser le Bloc-notes de Windows. Dans tous les cas, veillez respecter la structure de chaque fichier et lordre alphabtique des informations affiches dans les listes droulantes. Voici le listing complet du programme. Les fichiers du projet se trouvent dans le dossier Projects\Tweak7 des sources de louvrage aprs leur installation.
Imports Microsoft.Win32 Public Class Form1 Dim cd As String Dim ListeRaccourcis As New Collections.ArrayList() Dim ListeAstuces As New Collections.ArrayList() Dim ListePerso As New Collections.ArrayList()

Chapitre 17


Dim Dim Dim Dim

Personnaliser Windows7

399

i As Integer Comment1(9), commande1(9) As String Comment2(21) As String HotKey(22), chemin(22), cl(22), valeur(22), TypeVal(22) As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load ----------------------------------------------- Lecture du fichier de donnes du premier onglet -----------------------------------------------cd = CurDir() FileOpen(1, cd + "\raccourcis.txt", OpenMode.Input) For i = 1 To 8 ListeRaccourcis.Add(LineInput(1)) Comment1(i) = LineInput(1) commande1(i) = LineInput(1) Next ComboBox1.DataSource = ListeRaccourcis FileClose(1) ----------------------------------------------- Lecture du fichier de donnes du deuxime onglet -----------------------------------------------FileOpen(1, cd + "\astuces.txt", OpenMode.Input) For i = 1 To 15 ListeAstuces.Add(LineInput(1)) Comment2(i) = LineInput(1) Next ComboBox2.DataSource = ListeAstuces FileClose(1) ----------------------------------------------- Lecture du fichier de donnes du troisime onglet -----------------------------------------------FileOpen(1, cd + "\perso.txt", OpenMode.Input) For i = 1 To 7 ListePerso.Add(LineInput(1)) HotKey(i) = LineInput(1)

400

Visual Basic 2010

chemin(i) = LineInput(1) cl(i) = LineInput(1) valeur(i) = LineInput(1) TypeVal(i) = LineInput(1) Next ComboBox3.DataSource = ListePerso FileClose(1) End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Label1.Text = Comment1(ComboBox1.SelectedIndex + 1) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click Dim s As String s = commande1(ComboBox1.SelectedIndex + 1) Shell(s, 1) End Sub Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged Label2.Text = Comment2(ComboBox2.SelectedIndex + 1) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click Dim hk, ch, c, v, t As String Dim key As RegistryKey hk = LCase(HotKey(ComboBox3.SelectedIndex + 1)) ch = chemin(ComboBox3.SelectedIndex + 1) c = cl(ComboBox3.SelectedIndex + 1) v = valeur(ComboBox3.SelectedIndex + 1) t = TypeVal(ComboBox3.SelectedIndex + 1) If hk = "classesroot" Then key = Registry.ClassesRoot.OpenSubKey(ch, True) If hk = "currentconfig" Then key = Registry.CurrentConfig.OpenSubKey(ch, True) If hk = "currentuser" Then key = Registry.CurrentUser.OpenSubKey(ch, True) If hk = "dyndata" Then key = Registry.DynData.OpenSubKey(ch, True)

Chapitre 17

Personnaliser Windows7

401

If hk = "localmachine" Then key = Registry.LocalMachine.OpenSubKey(ch, True) If hk = "performancedata" Then key = Registry.PerformanceData. OpenSubKey(ch, True) If hk = "users" Then key = Registry.Users.OpenSubKey(ch, True) If t = "REG_SZ" Then key.SetValue(c, v) If t = "REG_DWORD" Then key.SetValue(c, v, Microsoft.Win32.Registry ValueKind.DWord) key.Close() End Sub End Class

18
Visual Basic et Microsoft Office
Les applications de la suite Microsoft Office peuvent tre commandes par des programmes externes, crits avec un langage de script, tel que VBA, ou un langage compil tel que Visual Basic 2010. Dans ce chapitre, nous allons vous montrer comment manipuler les applications Word et Excel en utilisant la technique de lOLE Automation.

Prise de contrle de Microsoft Word


Cette section explique comment accder Microsoft Word en utilisant des objets dynamiques OLE Automation. Lapplication prsente permet deffectuer les actions suivantes:

ouverture et fermeture de Word; cration dun nouveau document vierge;

404

Visual Basic 2010

ouverture dun document existant; modification du document ouvert; sauvegarde du document en cours ddition.

Mise en place visuelle


Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Word lapplication etvalidez en cliquant sur OK. Dposez sept contrles Button et un contrle TextBox sur la feuille. Modifiez les proprits de ces contrles comme indiqu dans le tableau ci-aprs.
Contrle
Form1 Button1 Button2 Button3 Button4 Button5 Button6 Button7 Edit

Proprit
Text Text Text Text Text Text Text Text Text

Valeur
Manipulation de Word Ouvrir Word Nouveau document Fermer Word Ouvrir le fichier exemple Taille des caractres = 15 points Texte en italique Sauvegarder le fichier et quitter Word c:\exemple.doc

Repositionnez et redimensionnez les contrles pour obtenir une feuille semblable celle montre la Figure18.1.
Figure18.1 La feuille de lapplication Manipulation de Word, en mode dition.

Chapitre 18

Visual Basic et Microsoft Office 

405

Dfinition des procdures de traitement


Dfinissez les trois variables Object suivantes, juste aprs linstruction Public Class Form1:
Dim WordApp As Object Dim WordDoc As Object Dim WordRng As Object

Ces variables seront utilises pour manipuler lapplication Word et les documents ouverts. Double-cliquez sur le bouton Ouvrir Word et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WordApp = CreateObject("Word.Application") WordApp.Visible = True End Sub

La premire instruction instancie lobjet WordApp. La seconde instruction provoque lexcution de lapplication Microsoft Word. Double-cliquez sur le bouton Nouveau document et compltez la procdure Button2_ Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click WordDoc = WordApp.Documents.Add() End Sub

Lunique instruction de cette procdure ouvre un document vierge, Add(), dans lapplication Microsoft Word. Double-cliquez sur le bouton Fermer Word et compltez la procdure Button3_Click() comme suit:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click WordApp.Quit() End Sub

Vous laurez compris, lunique instruction de cette procdure ferme la fentre de lapplication Microsoft Word. Double-cliquez sur le bouton Ouvrir le fichier exemple. Voici le code de la procdure Button4_Click():
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click WordDoc = WordApp.Documents.Open(TextBox1.Text) End Sub

406

Visual Basic 2010

Pour ouvrir le document dont le nom est spcifi dans la zone de texte, il suffit dinvoquer la procdure Open(). Nous allons maintenant dfinir le code relatif aux traitements. Double-cliquez sur le bouton Taille des caractres = 15 points et compltez la procdure Button5_Click() comme suit:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click WordDoc = WordApp.ActiveDocument WordRng = WordDoc.Range WordRng.Font.Size = 15 End Sub

La premire instruction affecte le document actif lobjet WordDoc:


WordDoc = WordApp.ActiveDocument

La deuxime instruction dfinit le domaine daction de la troisime instruction (ici tout le document):
WordRng = WordDoc.Range

Enfin, la troisime instruction modifie la taille des caractres:


WordRng.Font.Size = 15

La mme technique permet dappliquer lattribut Italique la totalit du document. Doublecliquez sur le bouton Texte en italique et compltez la procdure Button6_Click() comme suit:
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click WordDoc = WordApp.ActiveDocument WordRng = WordDoc.Range WordRng.Font.Italic = True End Sub

Pour terminer, double-cliquez sur le bouton Sauvegarder le fichier et quitter Word et compltez la procdure Button7_Click() comme suit:
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click WordDoc.Save() WordApp.Quit() End Sub

La premire instruction sauvegarde le document et la seconde ferme lapplication Microsoft Word.

Chapitre 18

Visual Basic et Microsoft Office 

407

Excution de lapplication
Appuyez sur la touche F5 pour lancer lapplication et vrifiez le bon fonctionnement de tous les boutons de commande. Voici le listing complet de lapplication. Ce projet se trouve dans le dossier Projects\Word des sources de louvrage.
Public Class Form1 Dim WordApp As Object Dim WordDoc As Object Dim WordRng As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click WordApp = CreateObject("Word.Application") WordApp.Visible = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click WordDoc = WordApp.Documents.Add() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button3.Click WordApp.Quit() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button4.Click WordDoc = WordApp.Documents.Open(TextBox1.Text) End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button5.Click WordDoc = WordApp.ActiveDocument WordRng = WordDoc.Range WordRng.Font.Size = 15 End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button6.Click WordDoc = WordApp.ActiveDocument WordRng = WordDoc.Range WordRng.Font.Italic = True End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.

408

Visual Basic 2010

EventArgs) Handles Button7.Click WordDoc.Save() WordApp.Quit() End Sub End Class

Prise de contrle de Microsoft Excel


Cette section explique comment accder Microsoft Excel en utilisant des objets dynamiques OLE Automation. Cette application propose les fonctionnalits suivantes:

ouverture et fermeture dExcel; cration dun nouveau classeur; ouverture dun classeur existant; modification dune feuille du classeur ouvert; sauvegarde du classeur en cours ddition.

Mise en place visuelle


Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Excel au projet et validez en cliquant sur OK. Dposez sept boutons de commande et une zone de texte sur la feuille, de la mme faon que dans lapplication Word prcdente. Modifiez les proprits de ces contrles comme indiqu dans le tableau ci-aprs.
Contrle
Form1 Button1 Button2 Button3 Button4 Button5 Button6 Button7 Edit

Proprit
Text Text Text Text Text Text Text Text Text

Valeur
Manipulation dExcel Ouvrir Excel Nouveau classeur Fermer Excel Ouvrir le fichier exemple Divise la cellule B2 par 2 Change la couleur de B2-C4 Sauvegarder le fichier exemple c:\exemple.xls

Chapitre 18

Visual Basic et Microsoft Office 

409

Repositionnez et redimensionnez les contrles pour obtenir une feuille analogue celle montre la Figure18.2.
Figure18.2 La feuille de lapplication Manipulation dExcel, en mode dition.

Dfinition des procdures de traitement


Dfinissez les variables ci-aprs la suite de la dclaration Public Class Form1:
Dim Dim Dim Dim ExcelApp As Object ExcelCla As Object ExcelFeuille As Object ExcelPlage As Object

Double-cliquez sur le bouton Ouvrir Excel et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ExcelApp = CreateObject("Excel.Application") ExcelApp.Visible = True End Sub

La premire instruction instancie lobjet ExcelApp et la seconde ouvre la fentre de lapplication associe cet objet. Double-cliquez sur le bouton Nouveau classeur et compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ExcelCla = ExcelApp.Workbooks.Add() End Sub

Lunique instruction de cette procdure instancie le classeur ExcelCla laide de la mthode Workbooks.Add(). Un nouveau classeur vide est donc ouvert dans Microsoft Excel.

410

Visual Basic 2010

Double-cliquez sur le bouton Fermer Excel et compltez la procdure Button3_Click() comme suit:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click ExcelApp.Quit() End Sub

Vous laurez certainement compris, lunique instruction de cette procdure ferme lapplication Microsoft Excel. Double-cliquez sur le bouton Ouvrir le fichier exemple et compltez la procdure Button4_ Click() comme suit:
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click ExcelCla = ExcelApp.Workbooks.Open(TextBox1.Text) End Sub

La mthode Workbooks.Open() est utilise pour ouvrir le classeur dont le nom est spcifi dans la zone de texte TextBox1. Le rsultat de cette fonction est employ pour instancier lobjet ExcelCla. Double-cliquez sur le bouton Diviser la cellule B2 par 2 et compltez la procdure TForm1. DiviseB2Click() comme suit:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click ExcelFeuille = ExcelCla.Sheets("Feuil1") Dim c As Single = ExcelFeuille.Cells.Item(2, 2).Value ExcelFeuille.Cells.Item(2, 2).Value = c / 2 End Sub

La premire instruction affecte la premire feuille du classeur lobjet ExcelFeuille:


ExcelFeuille = ExcelCla.Sheets("Feuil1")

La deuxime instruction dfinit la variable Single c et lui affecte la valeur contenue dans la cellule B2. Remarquez laccs la cellule, Cells.Item(2,2), puis la valeur contenue dans la cellule, .Value:
Dim c As Single = ExcelFeuille.Cells.Item(2, 2).Value

Enfin, la troisime instruction affecte la cellule B2 la moiti de la valeur quelle contenait:


ExcelFeuille.Cells.Item(2, 2).Value = c / 2

Chapitre 18

Visual Basic et Microsoft Office 

411

Avant de dfinir la procdure relative au bouton Change la couleur de B2-C4, vous allez initialiser la variable boolenne ChangeCouleur False dans la procdure Form1_Load():
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ChangeCouleur = False End Sub

Double-cliquez sur le bouton Plage B2-C4 en gras et compltez la procdure Button6_ Click() comme suit:
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click ExcelFeuille = ExcelCla.Sheets("Feuil1") ExcelPlage = ExcelFeuille.Range("B2:C4") ExcelPlage.Font.Bold = True End Sub

La premire instruction affecte la premire feuille du classeur lobjet ExcelFeuille:


ExcelFeuille = ExcelCla.Sheets("Feuil1")

La deuxime instruction dfinit lobjet ExcelPlage et lui affecte la plage de cellules B2:C4:
ExcelPlage = ExcelFeuille.Range("B2:C4")

Enfin, la troisime instruction met en gras la plage de cellules slectionne:


ExcelPlage.Font.Bold = True

Pour terminer le projet, double-cliquez sur le bouton Sauvegarder le classeur et compltez la procdure Button7_Click() comme suit:
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click ExcelCla.Save() End Sub

Lunique instruction de cette procdure sauvegarde le classeur en cours ddition laide de la mthode Save().

Excution de lapplication
Appuyez sur la touche F5 pour lancer lapplication et vrifiez le bon fonctionnement de tous les boutons de commande. Voici le listing complet de lapplication. Ce projet se trouve dans le dossier Projects\Excel des sources de louvrage.

412

Visual Basic 2010

Public Class Form1 Dim Dim Dim Dim ExcelApp As Object ExcelCla As Object ExcelFeuille As Object ExcelPlage As Object

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click ExcelApp = CreateObject("Excel.Application") ExcelApp.Visible = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button2.Click ExcelCla = ExcelApp.Workbooks.Add() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button3.Click ExcelApp.Quit() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button4.Click ExcelCla = ExcelApp.Workbooks.Open(TextBox1.Text) End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button5.Click ExcelFeuille = ExcelCla.Sheets("Feuil1") Dim c As Single = ExcelFeuille.Cells.Item(2, 2).Value ExcelFeuille.Cells.Item(2, 2).Value = c / 2 End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button6.Click ExcelFeuille = ExcelCla.Sheets("Feuil1") ExcelPlage = ExcelFeuille.Range("B2:C4") ExcelPlage.Font.Bold = True End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button7.Click ExcelCla.Save() End Sub End Class

19
Programmation WPF
Les applications WPF reprsentent une alternative complmentaire aux traditionnelles applications Windows Forms. Capables dtre excutes sous Windows 7, Vista, Windows Vista SP1 et suprieur, Windows XP SP2 et suprieur et Windows Server 2003 SP1 et suprieur, ces applications utilisent le langage XAML et de nouvelles API graphiques pour manipuler simplement des objets 2D et 3D vectoriels et des lments multimdias. Ce chapitre laisse entrevoir les immenses possibilits des applications WPF. Si vous tes un programmeur web, rassurez-vous: la plupart des possibilits offertes par WPF sont communes au tout nouveau langage Silverlight (anciennement WPF/e pour WPF everywhere).

Une premire application WPF


Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Sous Modles installs, dveloppez Visual Basic, cliquez sur Windows puis sur Application WPF (voir Figure19.1), puis validez en cliquant sur OK.

414

Visual Basic 2010

Figure19.1 Vous tes sur le point de crer une nouvelle application WPF.

Quelques instants plus tard, Visual Studio revt un aspect quelque peu inhabituel (voir Figure19.2).
Figure19.2 Lenvironnement de dveloppement est diffrent de celui utilis pour les projets WinForm.

Chapitre 19

Programmation WPF

415

Linterface de lapplication est dfinie dans le volet central (Concepteur). Trs classiquement, il suffit dy dposer un ou plusieurs contrles issus de la Bote outils de Visual Studio. Au fur et mesure de lagencement de linterface, le volet Design est modifi en consquence. Ce volet contient la description de linterface en langage XAML. Si vous le souhaitez, vous pouvez y insrer des instructions XAML manuel lement, mais il faut avouer quil est bien plus simple de passer par le volet du concepteur.

Info

ntion Atte

Le concepteur WPF de Visual Studio Express ne fonctionne que partiellement. Si vous voulez tirer pleinement parti de cette fonctionnalit, vous devrez vous rabattre sur une version commerciale de Visual Studio.

Pour vous faire une premire ide de la programmation WPF, nous allons crer un blocnotes qui mmorisera tout ce que vous tapez au clavier. Dfinissez une nouvelle application WPF. Ajoutez un contrle TextBox et deux contrles Button au concepteur et modifiez leurs tailles et emplacement pour obtenir un agencement visuel comparable celui de la Figure19.3.
Figure19.3 Le concepteur WPF, aprs avoir plac et redimensionn les contrles.

titre dinformation, voici le code XAML cr a partir du concepteur:


<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid>

416

Visual Basic 2010

<TextBox Margin="16,17,14,56" Name="TextBox1" /> <Button Height="31" HorizontalAlignment="Left" Margin="17,0,0,11" Name="Button1" VerticalAlignment="Bottom" Width="87">Effacer</Button> <Button Height="31" HorizontalAlignment="Right" Margin="0,0,15,11" Name="Button2" VerticalAlignment="Bottom" Width="96">Quitter</Button> </Grid> </Window>

Cliquez successivement sur les deux boutons et modifiez leur proprit Content pour les renommer en "Effacer" et "Quitter" (voir Figure19.4).
Figure19.4 Les deux boutons ont t renomms.

Vous allez maintenant dfinir le code de lapplication. Lancez la commande Code dans le menu Affichage ou appuyez sur la touche de fonction F7. Slectionnez Window1Evnements dans la liste droulante Nom de la classe et Loaded dans la liste droulante Nom de la mthode. La procdure Window1_Loaded est automatiquement cre:
Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows. RoutedEventArgs) Handles Me.Loaded End Sub

Cette procedure est lquivalent Windows Form de Form1_Load(). Vous allez la complter avec les lignes de code suivantes:
Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows. RoutedEventArgs) Handles Me.Loaded tout = "" Try FileOpen(1, "c:\test\memo.txt", OpenMode.Input) While Not EOF(1)

Chapitre 19

Programmation WPF

417

texte = LineInput(1) tout = tout + texte + Chr(13) + Chr(10) End While TextBox1.Text = tout Catch Finally FileClose(1) End Try End Sub

Cette procdure lit le contenu du fichier texte c:\test\memo.txt:


tout = "" Try FileOpen(1, "c:\test\memo.txt", OpenMode.Input) While Not EOF(1) texte = LineInput(1) tout = tout + texte + Chr(13) + Chr(10) End While

Ce contenu est affect la proprit Text du contrle TextBox1:


TextBox1.Text = tout

Puis le fichier texte est ferm:


Catch Finally FileClose(1) End Try

Pour completer cette procedure, dfinissez les variables String tout et texte en dbut de listing:
Class Window1 Dim tout As String Dim texte As String

Vous allez maintenant dfinir les procdures vnementielles associes au clic sur les deux boutons. Slectionnez Button1 dans la liste droulante Nom de la classe et Click dans la liste droulante Nom de la mthode, puis compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. Windows.RoutedEventArgs) Handles Button1.Click TextBox1.Text = "" End Sub

418

Visual Basic 2010

Cette procdure se contente deffacer le contenu de contrle TextBox1. Slectionnez Button2 dans la liste droulante Nom de la classe et Click dans la liste droulante Nom de la mthode, puis compltez la procdure Button2_Click() comme suit:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. Windows.RoutedEventArgs) Handles Button2.Click Try FileOpen(1, "c:\test\memo.txt", OpenMode.Output) Print(1, TextBox1.Text) Catch Finally FileClose(1) End Try End End Sub

Comme vous pouvez le voir, cette procdure sauvegarde le contenu du contrle textBox dans le fichier texte c:\test\memo.txt:
Try FileOpen(1, "c:\test\memo.txt", OpenMode.Output) Print(1, TextBox1.Text)

Puis referme le fichier texte:


Catch Finally FileClose(1) End Try

Info

Pour dfinir la procdure vnementielle dun bouton, il est galement possible de double-cliquer dessus dans le volet du concepteur. Le gabarit de la procdure est alors automatiquement cr.

Le programme est entirement oprationnel. Appuyez sur la touche de fonction F5 pour lexcuter (voir Figure19.5). Si vous redimensionnez la fentre de lapplication (et cest l un des gros avantages des applications WPF), les contrles seront automatiquement redimensionns la vole.

Info

Chapitre 19

Programmation WPF

419

Figure19.5 Une ligne de texte a t mmorise dans le contrle TextBox.

Les contrles WPF par dfaut


Cette section fait le tour des contrles disponibles par dfaut dans une application WPF.
Icne Contrle
Border Button Canvas CheckBox ComboBox ContentControl DockPanel DocumentViewer Ellipse Expander

Fonction
Bordure autour dun contenu. Permet lutilisateur deffectuer une action lorsquil clique sur le bouton. Dfinit une zone dans laquelle des lments enfants peuvent tre positionns laide des coordonnes relatives la zone du Canvas Case cocher. Contrle de slection assorti dune liste droulante qui peut tre affiche ou masque dun clic sur la flche du contrle. Conteneur destine hberger un type unique de contenu. Dfinit une zone o les lments enfants peuvent tre rorganiss horizontalement ou verticalement lun par rapport lautre. Conteneur pouvant hberger un objet FixedDocument. Trace une ellipse. Ce contrle est compos dun en-tte et dune fentre rductible affichant un contenu.

420

Visual Basic 2010

Icne

Contrle
Frame Grid GridSplitter GroupBox Image Label ListBox ListView MediaElement Menu PasswordBox ProgressBar RadioButton Rectangle RichTextBox ScrollBar ScrollViewer Separator Slider StackPanel

Fonction
Contrle de contenu qui prend en charge la navigation. Grille flexible qui se compose de lignes et de colonnes. Rpartit lespace entre les lignes ou les colonnes dun contrle Grid. Zone de groupe, utilise pour rassembler plusieurs contrles. Affiche une image. Affiche un texte sur un formulaire. Liste droulante. Ce contrle regroupe une liste dlments. Conteneur audio ou vido. Menu Windows. Contrle ddi la saisie dun mot de passe. Indique la progression dune opration. Bouton radio. Permet lutilisateur de choisir un lment dans un ensemble o les diffrents lments sont mutuellement exclusifs. Trace un rectangle. Conteneur de documents riches de type FlowDocument. Barre dfilante vertical ou horizontale. Zone dont le contenu peut dfiler. Sparateur de contrles. Ce contrle permet de slectionner une valeur dans une plage. Permet dempiler des contrles enfants, verticalement ou horizonta lement.

Chapitre 19


Fonction
Contrle barre dtat.

Programmation WPF

421

Icne

Contrle
StatusBar TabControl TextBox ToolBar ToolBarPanel ToolBarTray Treeview ViewBox WindowsFormsHost WrapPanel

Arrange le contenu visual sous la dorme dun tableau. Zone de texte utilise pour saisir le texte entr au clavier par lutilisateur. Contrle barre doutils. Permet dorganiser les divers lments inclus dans un contrle ToolBar. Gre la disposition des lments contenus dans un contrle ToolBar. Ce contrle affiche une arborescence dans laquelle les divers lments peuvent tre plis et dplis. Dcorateur de contenu utilis pour ajuster un contrle enfant afin doccuper lespace disponible. Conteneur de contrle Windows Forms dans une page WPF. Ce contrle positionne squentiellement, de gauche droite, des lments enfants.

Manipuler des lments multimdias


Le contrle MediaElement permet de manipuler des lments multimdias vido (au format avi, jpg, mpg ou .wmv) et audio (au format mid ou wma). Ces lments peuvent se trouver sur lordinateur, sur un des ordinateurs dun rseau local ou sur Internet. Dans cette mini-application, nous allons utiliser un contrle MediaElement pour jouer:

un diaporama web au format wmv; un fichier local au format mid.

Crez une nouvelle application WPF, insrez un contrle MediaElement, deux contrles RadioButton et deux contrles Button sur la feuille de lapplication. Positionnez, redimensionnez et modifiez la proprit Content de ces contrles pour obtenir quelque chose comme la Figure19.6.

422

Visual Basic 2010

Figure19.6 La fentre de lapplication WPF.

Info

Pour assurer un ancrage dans la partie gauche de la fentre pour les contrles RadioButton et Button, veillez initialiser leur proprit HorizontalAlignment Left.

Double-cliquez sur le bouton Jouer et compltez la procdure Button1_Click() comme suit:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. Windows.RoutedEventArgs) Handles Button1.Click If RadioButton1.IsChecked Then MediaElement1.Source = New Uri("http://lem.korp.free.fr/divers/usa.wmv") MediaElement1.LoadedBehavior = MediaState.Play End If If RadioButton2.IsChecked Then MediaElement1.Source = New Uri("c:\windows\media\flourish.mid") MediaElement1.LoadedBehavior = MediaState.Play End If End Sub

Cette procdure est compose de deux blocs If End If dans lesquels on teste ltat des boutons radio. Si le premier bouton radio est slectionn, la proprit Source du contrle MediaElement est initialise avec ladresse URL dun mdia vido sur le Web, et le mdia est lu:
If RadioButton1.IsChecked Then MediaElement1.Source = New Uri("http://lem.korp.free.fr/divers/usa.wmv") MediaElement1.LoadedBehavior = MediaState.Play End If

Chapitre 19

Programmation WPF

423

Si le deuxime bouton radio est slectionn, la proprit Source du contrle MediaElement est initialise avec le chemin dun fichier audio local, et le mdia est lu:
If RadioButton2.IsChecked Then MediaElement1.Source = New Uri("c:\windows\media\flourish.mid") MediaElement1.LoadedBehavior = MediaState.Play End If

Double-cliquez sur le bouton Arrter et compltez la procdure Button2_Click comme suit:


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System. Windows.RoutedEventArgs) Handles Button3.Click MediaElement1.LoadedBehavior = MediaState.Stop End Sub

Quel que soit le type de media en cours dexcution, cette procedure se contente dy mettre fin en invoquant la mthode MediaState.Stop. Aprs installation des sources de louvrage, cette mini-application se trouve dans le dossier Wpf-Media.

Graphiques 2D
WPF propose des fonctionnalits graphiques et danimation bien plus avances que celles accessibles aux Windows Forms via GDI (Graphics Device Interface). Pour tracer un lment en deux dimensions, vous utiliserez les contrles Ellipse et Rectangle de la Bote outils. Vous agirez sur les proprits de ces objets pour modifier la faon dont ils saffichent:
Proprit
BitmatEffect BitmapEffect/BevelWidth BitmapEffect/LightAngle Fill

Signification
Effet appliqu lobjet: BlurBitmapEffect, EmbossBitmapEffect, BevelBitmapEffect, DrowShadowBitmapEffect ou OuterGlowBitmapEffect Largeur de la bordure Angle dclairage de lobjet Couleur de trac, choisir dans une liste prdfinie, de AliceBlue
YellowGreen

La Figure19.7 reprsente quelques exemples dutilisation de ces proprits sur des objets Ellipse. Le code correspondant se trouve dans le dossier Projects\Wpf-Ellipse des codes sources de louvrage aprs leur installation.

424

Visual Basic 2010

Figure19.7 Les objets Ellipse peuvent avoir des aspects trs diffrents.

Gomtries 2D
La classe Geometry permet de dcrire la gomtrie des formes 2D. En ltat de dveloppement actuel de Visual Strudio 2010, la Bote outils nimplmente pas les gomtries. Vous devrez donc crire le code correspondant manuellement, dans le volet XAML. Les lignes suivantes vous montrent comment tracer les gomtries les plus courantes. Les couleurs utilises comme paramtres des marqueurs de gomtrie XAML peuvent tre spcifies en clair (red, black, yellow, etc.) ou sous la forme dun nombre hexadcimal 8 digits:
#abcdefgh

Info

o: ab reprsente la transparence alpha: entre 00 (transparent) et FF (opaque); cd reprsente la composante rouge de la couleur; ef reprsente la composante verte de la couleur; gh reprsente la composante bleue de la couleur.

Segments de droites
Pour tracer un segment de droite, vous utiliserez le marqueur <LineGeometry>. Par exemple, pour tracer une droite de couleur rouge et dpaisseur 5 entre les coordonnes 10, 10 et 200, 300, vous utiliserez les instructions suivantes (voir Figure19.8).

Chapitre 19


<Path.Data>

Programmation WPF

425

<Path Stroke="Red" StrokeThickness="5" > <LineGeometry StartPoint="10,10" EndPoint="200,300" /> </Path.Data> </Path>

Figure19.8 Trac dune droite rouge dpaisseur 5.

Polygones
Pour tracer un polygone, vous utiliserez le marqueur <PolyLineSegment>. titre dexemple, le code ci-aprs trace un carr dpaisseur 3, de couleur CornglowerBlue entre les coordonnes 50,50 et 250,250 (voir Figure19.9):
<Path Stroke="CornflowerBlue" StrokeThickness="3" > <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="50,50"> <PathFigure.Segments> <PolyLineSegment Points "250,50 250,250 50,250 50,50" /> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

426

Visual Basic 2010

Figure19.9 Trac dun carr avec PolyLineSegment.

Arcs elliptiques
Pour tracer un arc de cercle ou dellipse, vous utiliserez le marqueur <ArcSegment>. Par exemple, pour tracer un arc dellipse entre les points 50,50 et 50,150, vous utiliserez les instructions suivantes (voir Figure19.10):
<Path Stroke="CornflowerBlue" StrokeThickness="3" > <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="50,50"> <PathFigure.Segments> <ArcSegment Size="20,10" RotationAngle="45" IsLargeArc="True" SweepDirection="Clockwise" Point="50,150"> </ArcSegment> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

Chapitre 19

Programmation WPF

427

Figure19.10 Trac dun arc dellipse avec ArcSegment.

Info

Pour simplifier lcriture du code XAML, vous pouvez utiliser la syntaxe abrge suivante:
<Path Stroke="CornflowerBlue" StrokeThickness="3" Data="M 50,50 A 20,10 45 1 1 250,150" />

Courbes de Bzier
Pour tracer des courbes de Bzier1, vous utiliserez les marqueurs suivants:
Marqueur
<BezierSegment> <PolyBezierSegment> <QuadraticBezierSegment>. <PolyQuadraticBezierSegment>

Description
Courbe de Bzier cubique entre deux points Srie de courbes de Bzier cubiques Courbe de Bzier quadratique Srie de courbes de Bzier quadratiques

Pour tracer une courbe de Bzier cubique entre les points 10,100 et 300,200, en utilisant les points de contrle 100,0 et 200,300, vous utiliserez les instructions suivantes (voir Figure19.11):
1. Les courbes de Bzier sont des courbes polynomiales dcrites par lingnieur franais Pierre Bzier, en 1962. Elles peuvent tre linaires (quations de degr 1), quadratiques (quations de degr 2) ou cubiques (quations de degr 3).

428

Visual Basic 2010

<Path Stroke="CornflowerBlue" StrokeThickness="3" > <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="10,100"> <PathFigure.Segments> <BezierSegment Point1="100,0" Point2="200,300" Point3="300,200"/> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

Figure19.11 Trac dune courbe de Bzier cubique.

Info

Pour simplifier lcriture du code XAML, vous pouvez utiliser la syntaxe abrge suivante:
<Path Stroke="CornflowerBlue" StrokeThickness="3" Data="M 10,100 C 100,0 200,300 300,200" />

Pour tracer une courbe de Bzier quadratique entre les points 10,100 et 200,100, en utilisant le point de contrle 300,200, vous utiliserez les instructions suivantes (voir Figure19.12):
<Path Stroke="CornflowerBlue" StrokeThickness="3" > <Path.Data> <PathGeometry> <PathGeometry.Figures>

Chapitre 19

Programmation WPF

429

<PathFigure StartPoint="10,100"> <PathFigure.Segments> <QuadraticBezierSegment Point1="300,200" Point2="200,100"/> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

Figure19.12 Trac dune srie de courbes de Bzier quadratique.

Info

Pour simplifier lcriture du code XAML, vous pouvez utiliser la syntaxe abrge suivante:
<Path Stroke="CornflowerBlue" StrokeThickness="3" Data="M 10,100 Q 300,200 200,100" />

Ellipses
Pour tracer une ellipse, vous utiliserez le marqueur <EllipseGeometry>. titre dexemple, pour tracer une ellipse de contour rouge pais de 3 pixels, remplie en vert, de centre 150,150, de rayon X 100 et de rayon Y 50, vous utiliserez les instructions suivantes (voir Figure19.13):
<Path Fill="Green" Stroke="Red" StrokeThickness="3"> <Path.Data> <EllipseGeometry Center="150,150" RadiusX="100" RadiusY="50" /> </Path.Data> </Path>

430

Visual Basic 2010

Figure19.13 Trac dune ellipse avec <EllipseGeometry>.

Rectangles
Pour tracer un rectangle, vous utiliserez le marqueur <RectangleGeometry>. titre dexemple, pour tracer un rectangle de contour noir pais de 1 pixel, rempli en rouge, entre les points de coordonnes 50,50 et 200,100, vous utiliserez les instructions suivantes (voir Figure19.14):
<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="50,50,200,100" /> </Path.Data> </Path>

Figure19.14 Trac dun rectangle avec <RectangleGeometry>.

Chapitre 19

Programmation WPF

431

Gomtries combines
Vous pouvez utiliser le mode Exclude (exclusion), Intersect (intersection), Union (runion) ou Xor (ou exclusif) pour combiner deux formes gomtriques. Par exemple, pour dfinir lunion entre un rectangle dont les bords opposs ont pour coordonnes 50,50 et 200,10 et une ellipse de centre 125,75 et de rayons X et Y 50, vous utiliserez les instructions suivantes (voir Figure19.15):
<Path Stroke="Black" StrokeThickness="5" Fill="PowderBlue"> <Path.Data> <CombinedGeometry GeometryCombineMode="Union"> <CombinedGeometry.Geometry1> <RectangleGeometry Rect="50,50,200,100" /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" /> </CombinedGeometry.Geometry2> </CombinedGeometry> </Path.Data> </Path>

Figure19.15 Union dun rectangle et dun cercle.

En appliquant le mode Xor ces deux objets, le rsultat est totalement diffrent (voir Figure19.16):
<Path Stroke="Black" StrokeThickness="5" Fill="PowderBlue"> <Path.Data> <CombinedGeometry GeometryCombineMode="Xor"> <CombinedGeometry.Geometry1>

432

Visual Basic 2010

<RectangleGeometry Rect="50,50,200,100" /> </CombinedGeometry.Geometry1> <CombinedGeometry.Geometry2> <EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" /> </CombinedGeometry.Geometry2> </CombinedGeometry> </Path.Data> </Path>

Figure19.16 Ou exclusif entre un rectangle et un cercle.

Leffet est galement intressant lorsque le paramtre StrokeThickness est initialis 0 (voir Figure19.17).
Figure19.17 Ou exclusif entre un rectangle et un cercle, sans bordures.

Chapitre 19

Programmation WPF

433

Le pinceau
Pour remplir une forme gomtrique avec une couleur unie, il suffit de spcifier cette couleur dans le paramtre Fill. titre dexemple, les instructions ci-aprs dfinissent un rectangle bord noir et le remplissent avec la couleur jaune (voir Figure19.18):
<Path Fill="yellow" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="50,50,200,100" /> </Path.Data> </Path>

Pour crer un rectangle centr sur la zone daffichage, vous pouvez galement utiliser la syntaxe simplifie suivante:
<Rectangle Width="150" Height="50" Fill="yellow" />

Figure19.18 Remplissage uniforme dune figure 2D.

Le remplissage peut galement seffectuer en utilisant un gradient de couleurs. Vous utiliserez pour cela les marqueurs <LinearGradientBrush> et <GradientStop>. Par exemple, pour crer un rectangle centr de largeur 200, de hauteur 100 et dont la couleur varie du jaune au rouge, du bord suprieur gauche (0.0) au bord infrieur droit (1.1), vous utiliserez les instructions suivantes (voir Figure19.19):
<Rectangle Width="200" Height="100"> <Rectangle.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="Yellow" Offset="0.0" /> <GradientStop Color="Red" Offset="1.1" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle>

434

Visual Basic 2010

Figure19.19 Dgrad uniforme dun ct du rectangle au ct oppos.

Rien ne vous empche dutiliser plusieurs marqueurs <GradientStop> pour raliser autant de dgrads que ncessaire dans le mme objet (voir Figure19.20):
<Rectangle Width="200" Height="100"> <Rectangle.Fill> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="Yellow" Offset="0.0" /> <GradientStop Color="Black" Offset="0.25" /> <GradientStop Color="Red" Offset="0.50" /> <GradientStop Color="Green" Offset="0.75" /> <GradientStop Color="Blue" Offset="1.0" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle>

Figure19.20 Quatre dgrads de couleurs ont t insrs dans ce rectangle.

Chapitre 19

Programmation WPF

435

Pour modifier le sens du dgrad, il suffit de changer les paramtres StartPoint et/ou EndPoint du marqueur <LinearGradientBrush>. Ici, par exemple, nous dfinissons un gradient de couleur horizontal (voir Figure19.21).
<Rectangle Width="200" Height="100"> <Rectangle.Fill> <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5"> <GradientStop Color="White" Offset="0.0" /> <GradientStop Color="Black" Offset="1.1" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle>

Figure19.21 Dgrad de couleurs horizontal.

Et ici, un gradient de couleurs vertical (voir Figure19.22).


<Rectangle Width="200" Height="100"> <Rectangle.Fill> <LinearGradientBrush StartPoint="0.0,0" EndPoint="0.0,1"> <GradientStop Color="White" Offset="0.0" /> <GradientStop Color="Black" Offset="1.1" /> </LinearGradientBrush> </Rectangle.Fill> </Rectangle>

436

Visual Basic 2010

Figure19.22 Dgrad de couleurs vertical.

Les objets peuvent galement tre remplis par des images en utilisant le marqueur <ImageBrush>. Limage est automatiquement redimensionne pour occuper lespace qui lui est allou dans lapplication (voir Figure19.23).
<Rectangle Width="200" Height="200"> <Rectangle.Fill> <ImageBrush ImageSource="c:\windows\web\wallpaper\img5.jpg" /> </Rectangle.Fill> </Rectangle>

Figure19.23 Remplissage avec une image.

Le remplissage dimage peut galement tre utilis sur un texte (voir Figure19.24):

Chapitre 19

Programmation WPF

437

<TextBlock Name="textBlock" TextWrapping="Wrap" TextAlignment="Center" FontSize="150" FontWeight="Ultrabold"> Texte textur <TextBlock.Foreground> <ImageBrush ImageSource="c:\windows\web\wallpaper\img5.jpg" /> </TextBlock.Foreground> </TextBlock>

Figure19.24 Remplissage dun texte avec une image.

Info

Vous pouvez galement utiliser un dessin (marqueur <DrawingBrush>) ou un visuel (marqueur <VisualBrush>) pour peindre un objet. Vous trouverez des renseignements complmentaires ce sujet sur la page http://msdn2.microsoft. com/fr-fr/library/aa970904.aspx.

Gomtries 3D
Pour afficher un objet 3D, vous procderez selon les quatre tapes dcrites ci-aprs. Dans cet exemple, nous afficherons une pyramide de couleur verte.

tape 1 Dfinition dun objet Viewport3D


Lobjet Viewport va permettre de positionner la scne sur le cannevas:
<Viewport3D Canvas.Top="50" Canvas.Left="50" Width="300" Height="300" Name="monViewport"> </Viewport3D>

438

Visual Basic 2010

tape 2 Dfinition dune camra


Le marqueur <Viewport3D.Camera> va vous permettre de dcrire le point dobservation:
<Viewport3D.Camera> <PerspectiveCamera Position="-3,0.5,7" LookDirection="3,-1,-6" UpDirection="0,1,0" FieldOfView="30" NearPlaneDistance="0.15" /> </Viewport3D.Camera>

Imaginez quun observateur regarde votre scne 3D:

Position est la position de lobservateur; LookDirection dfinit la position observe; UpDirection dfinit linclinaison vers le haut; FieldOfView dfinit langle de visibilit de la scne; NearPlaneDistance dfinit la profondeur de vue.

Info

Pour comprendre la signification de ces paramtres, le plus simple consiste exprimenter plusieurs valeurs.

tape 3 Dfinition de lclairage


Pour tre en mesure de voir la scne, vous devez lclairer en dfinissant une lumire.
<ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup x:Name="group3D"> // Dfinition de la lumire </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D>

La lumire peut tre ambiante:


<AmbientLight Color="#404040"/>

Ou directionnelle, cest--dire mise depuis un point particulier:


<DirectionalLight Color="#C0C0C0" Direction="-0.5,-0.25,-1"/>

Chapitre 19

Programmation WPF

439

tape 4 Implmentation dun objet


Pour dfinir un objet, vous devez dclarer sa gomtrie en crant un marqueur <GeometryModel3D>.
<GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,1,0 1,-1,1 -1,-1,1 1,-1,1 -1,-1,-1" Normals="0,1,0 -1,0,1 1,0,1 -1,0,-1 1,0,-1" TriangleIndices="0,2,1 0,3,1 0,3,4 0,2,4" /> </GeometryModel3D.Geometry> </GeometryModel3D>

o:
Positions dfinit les coordonnes des triangles qui dlimitent lobjet; Normals dfinit les vecteurs perpendiculaires aux faces des triangles qui dlimitent

lobjet;
TriangleIndices dfini si les triangles sont sur une face visible ou cache.

Vous devez ensuite dfinir les couleurs davant et darrire-plan laide de balises
<GeometryModel3D.Material>:
<GeometryModel3D.Material> <DiffuseMaterial Brush="Bisque" /> </GeometryModel3D.Material> <GeometryModel3D.BackMaterial> <DiffuseMaterial Brush="AntiqueWhite"/> </GeometryModel3D.BackMaterial>

Le code XAML complet


Voici le code XAML complet. Il correspond aux quatre tapes dcrites prcdemment:
<Viewport3D Canvas.Top="50" Canvas.Left="50" Width="300" Height="300" Name="monViewport"> <Viewport3D.Camera> <PerspectiveCamera Position="-3,0.5,7" LookDirection="3,-1,-6" UpDirection="0,1,0" FieldOfView="30" NearPlaneDistance="0.15" /> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup x:Name="group3D">

440

Visual Basic 2010

<DirectionalLight Color="#00FF00" <GeometryModel3D> <GeometryModel3D.Geometry>

Direction="-0.5,-0.25,-1"/>

<MeshGeometry3D Positions="0,1,0 1,-1,1 -1,-1,1 1,-1,1 -1,-1,-1" Normals="0,1,0 -1,0,1 1,0,1 -1,0,-1 1,0,-1" TriangleIndices="0,2,1 0,3,1 0,3,4 0,2,4" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Bisque" /> </GeometryModel3D.Material> <GeometryModel3D.BackMaterial> <DiffuseMaterial Brush="AntiqueWhite"/> </GeometryModel3D.BackMaterial> </GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D>

La Figure19.25 reprsente linterprtation de ce code dans le volet Design de Visual Studio 2010.
Figure19.25 La pyramide apparat en 3D.

Cette premire approche des gomtries 3D dans le langage XAML est loin dtre exhaustive. Pour aller plus loin, je ne saurais trop vous conseiller de consulter le site MSDN, ladresse http://msdn2.microsoft.com/fr-fr/library/system.windows.media.media3d. aspx.

Chapitre 19

Programmation WPF

441

Transformations 2D
Plusieurs types de transformations peuvent tre effectus sur les objets 2D crs en XAML:
Classe
RotateTransform ScaleTransform SkewTransform TranslateTransform

Description
Fait pivoter lobjet Modifie lchelle de lobjet selon les valeurs ScaleX et ScaleY spcifies Incline lobjet selon les valeurs AngleX et AngleY spcifies Dplace lobjet selon les valeurs X et Y spcifies

Nous allons partir du rectangle XAML dfini par les instructions ci-aprs:
<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="50,50,200,100" /> </Path.Data> </Path>

Rotation
Figure19.26 Lobjet Rectangle, avant et aprs la rotation.

Pour effectuer une rotation, vous dfinirez un marqueur <RotateTransform>. Ici, par exemple, nous effectuons une rotation de centre 175,100 et dangle 45 (voir Figure19.26):

442

Visual Basic 2010

<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="150,100,200,100" /> </Path.Data> <Path.RenderTransform> <RotateTransform CenterX="175" CenterY="100" Angle="45" /> </Path.RenderTransform> </Path>

Modification de lchelle
Pour effectuer une modification dchelle, vous dfinirez un marqueur <ScaleTransform>. Ici, par exemple, nous effectuons une rduction dchelle 20% de la taille initiale, centre sur les coordonnes 175,150 (voir Figure19.27):
<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="150,100,200,100" /> </Path.Data> <Path.RenderTransform> <ScaleTransform CenterX="175" CenterY="150" ScaleX="0.2" ScaleY="0.2" /> </Path.RenderTransform> </Path>

Figure19.27 Lobjet Rectangle, avant et aprs la modification dchelle.

Chapitre 19

Programmation WPF

443

Inclinaison
Pour effectuer une inclinaison, vous dfinirez un marqueur <SkewTransform>. Ici, par exemple, nous effectuons une inclinaison de centre 100,100, et dangles 45,10 selon les axes X et Y (voir Figure19.28):
<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="150,100,200,100" /> </Path.Data> <Path.RenderTransform> <SkewTransform CenterX="100" CenterY="100" AngleX="45" AngleY="10" /> </Path.RenderTransform> </Path>

Figure19.28 Lobjet Rectangle, avant et aprs linclinaison.

Translation
Pour effectuer une translation, vous dfinirez un marqueur <TranslateTransform>. Ici, par exemple, nous effectuons une translation de 50 points sur les axes X et Y (voir Figure19.29):
<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1"> <Path.Data> <RectangleGeometry Rect="150,100,200,100" />

444

Visual Basic 2010

</Path.Data> <Path.RenderTransform> <TranslateTransform X="50" Y="50" /> </Path.RenderTransform> </Path>

Figure19.29 Lobjet Rectangle, avant et aprs la translation.

Transformations 3D
Plusieurs types de transformations peuvent tre effectus sur les objets 3D crs en XAML:
Classe
RotateTransform3D ScaleTransform3D TranslateTransform3D

Description
Fait pivoter lobjet Modifie lchelle de lobjet selon les valeurs ScaleX, ScaleY et ScaleZ spcifies Dplace lobjet selon les valeurs X, Y et Z spcifies

Chapitre 19

Programmation WPF

445

Nous allons partir de la pyramide XAML dfinie dans la section "Gomtries 3D". Le code de la transformation sera insr la place des trois lignes de commentaire qui apparaissent en gras dans le listing ci-aprs.
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="326" Width="453"> <Grid Height="259" Width="397"> <Viewport3D Canvas.Top="50" Canvas.Left="50" Width="300" Height="300" Name="monViewport"> <Viewport3D.Camera> <PerspectiveCamera Position="-3,0.5,7" LookDirection="3,-1,-6" UpDirection="0,1,0" FieldOfView="30" NearPlaneDistance="0.15" /> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup x:Name="group3D"> <DirectionalLight Color="#00FF00" Direction="-0.5,-0.25,-1"/> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,1,0 1,-1,1 -1,-1,1 1,-1,1 -1,-1,-1" Normals="0,1,0 -1,0,1 1,0,1 -1,0,-1 1,0,-1" TriangleIndices="0,2,1 0,3,1 0,3, 4 0,2,4" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Bisque" /> </GeometryModel3D.Material> <GeometryModel3D.BackMaterial> <DiffuseMaterial Brush="AntiqueWhite"/> </GeometryModel3D.BackMaterial> <!- Insrer --> <!- le code de la transformation 3D --> <!- ici -->

446

Visual Basic 2010

</GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D> </Grid> </Window>

Rotation
Pour effectuer une rotation, vous dfinirez un marqueur <RotateTransform3D>. Ici, par exemple, nous effectuons une rotation de 20 degrs sur les axes X et Y (voir Figure19.30):
<GeometryModel3D.Transform> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="myAngleRotation" Axis="1,1,0" Angle="20" /> </RotateTransform3D.Rotation> </RotateTransform3D> </GeometryModel3D.Transform>

Figure19.30 La pyramide, avant et aprs la rotation.

Chapitre 19

Programmation WPF

447

Modification dchelle
Pour effectuer une modification dchelle, vous dfinirez un marqueur <ScaleTransform3D>. Ici, par exemple, nous affectons un multiplicateur dchelle 1, 0.5, 2 selon les axes X, Y et Z (voir Figure19.31):
<GeometryModel3D.Transform> <ScaleTransform3D ScaleX="1" ScaleY="0.5" ScaleZ="2" CenterX="0" CenterY="0" CenterZ="0" /> </GeometryModel3D.Transform>

Figure19.31 La pyramide, avant et aprs la modification dchelle.

Translation
Pour effectuer une translation, vous dfinirez un marqueur <TranslateTransform3D>. Ici, par exemple, nous affectons un multiplicateur dchelle 1, 0.5, 2 selon les axes X, Y et Z (voir Figure19.32):
<GeometryModel3D.Transform> <TranslateTransform3D x:Name="monTranslateTransform3D" OffsetX="-0.2" OffsetY="0.2" OffsetZ="1" /> </GeometryModel3D.Transform>

448

Visual Basic 2010

Figure19.32 La pyramide, avant et aprs la translation.

Animations
WPF est dot dun ensemble de fonctionnalits ddies lanimation des objets 2D et 3D. Le principe gnral de lanimation WPF consiste modifier une ou plusieurs proprits intervalles rguliers ou lors des actions de lutilisateur. Ces modifications peuvent seffectuer dans le XAML ou dans le code Visual Basic. Dans cette section, nous allons vous montrer comment raliser une animation sans utiliser le langage Visual Basic.

Animation de couleurs
titre dexemple, nous allons modifier intervalles rguliers la couleur et lopacit dun SolidolorBrush appliqu un rectangle. Ces modifications se feront en raction aux actions de lutilisateur:

La couleur passera progressivement du rouge au noir lorsque le pointeur de la souris sera plac sur le rectangle. La couleur passera du noir au rouge lorsque le pointeur de la souris quittera le rectangle. Lopacit deviendra progressivement totale lorsque lutilisateur cliquera sur le rectangle.

Dans une premier temps, nous dfinissons le seul et unique objet de lapplication et nous le remplissons dune couleur uniforme rouge:

Chapitre 19

Programmation WPF

449

<Rectangle Width="150" Height="150"> <Rectangle.Fill> <SolidColorBrush x:Name="BrushAnimee" Color="Red" /> </Rectangle.Fill>

Pour animer la couleur du rectangle lorsque la souris le survole, nous dfinissons une balise <Rectangle.Triggers> et un vnement Rectangle.MouseEnter:
<Rectangle.Triggers> <EventTrigger RoutedEvent="Rectangle.MouseEnter">

Lanimation se fait dans la balise <StoryBoard>. Par touches successives (toutes les secondes), elle modifie la proprit Color de lobjet BrushAnimee jusqu obtenir la couleur noire:
<BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Color" To="Black" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger>

La modification de lopacit est trs similaire. Le bloc de code est excut lorsque lutilisateur clique sur le bouton gauche de la souris (MouseLeftButtonDown), au dessus du rectangle (Rectangle). La proprit affecte est Opacity. Les retouches se font toutes les secondes (0:0:1), jusqu atteindre une opacit nulle (To "0"), cest--dire la transparence complte: Animation de la proprit Opacity lorsque lutilisateur clique sur le rectangle
<EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger>

Enfin, le dernier bloc de code est excut lorsque le pointeur de la souris sort du rectangle (Rectangle.MouseLeave). Simultanment, les proprits Color et Opacity sont rajustes: la proprit color passe progressivement au rouge, et la proprit Opacity une opacit

450

Visual Basic 2010

totale (cette dernire animation ne fonctionne que dans la cas o lutilisateur a prc demment cliqu sur le rectangle, modifiant ainsi son opacit):
<EventTrigger RoutedEvent="Rectangle.MouseLeave"> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Color" To="Red" Duration="0:0:1" /> <DoubleAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Rectangle.Triggers> </Rectangle>

Info

Dans cet exemple, nous avons utilis le mot-cl To pour spcifier la valeur finale dune proprit. Vous pouvez galement utiliser les mots-cls From et By pour spcifier (respectivement) la valeur de dpart et le pas de la progression.

Voici le code XAML complet:


<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <!-- The Opacity and Color of the SolidColorBrush used to fill this rectangle is animated. --> <Rectangle Width="150" Height="150"> <Rectangle.Fill> <SolidColorBrush x:Name="BrushAnimee" Color="Red" /> </Rectangle.Fill> <!-- Animates the brushs color to gray When the mouse enters the rectangle. --> <Rectangle.Triggers> <EventTrigger RoutedEvent="Rectangle.MouseEnter"> <BeginStoryboard> <Storyboard>

Chapitre 19

Programmation WPF

451

<ColorAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Color" To="Black" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger> <!-- Animates the brushs color to red when the mouse leaves the rectangle. --> <EventTrigger RoutedEvent="Rectangle.MouseLeave"> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Color" To="Red" Duration="0:0:1" /> <DoubleAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger> <!-- Animates the brushs opacity when the left mouse button is pressed over the rectangle. --> <EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BrushAnimee" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Rectangle.Triggers> </Rectangle> </Grid> </Window>

Animer un objet avec ses proprits


Le dplacement dun objet peut se faire en agissant sur une de ses proprits. Ici, par exemple, nous allons dplacer un objet Ellipse en agissant sur sa proprit Center par lintermdiaire dun PointAnimation.

452

Visual Basic 2010

Dans un premier temps, nous dfinissons une ellipse de centre 20,20 et de rayons 15,15. Cette ellipse est remplie avec la couleur rouge et entoure dune bordure noire paisse de 3 pixels:
<Path Fill="Red" Stroke="Black" StrokeThickness="3"> <Path.Data> <EllipseGeometry x:Name="MonEllipse" Center="20,20" RadiusX="15" RadiusY="15" /> </Path.Data>

Nous dfinissons ensuite un gestionnaire dvnements qui se dclenchera lexcution du programme:


<Path.Triggers> <EventTrigger RoutedEvent="Path.Loaded">

Il suffit maintenant dy inclure une balise PointAnimation pour raliser lanimation de lellipse. Lanimation sexcuter indfiniment (RepeatBehavior="Forever"), elle reviendra automatiquement au point de dpart (AutoReverse="True"), elle stendra entre les points de coordonnes 20,20 et 200,200:
<BeginStoryboard Name="MonStoryboard"> <Storyboard> <PointAnimation Storyboard.TargetProperty="Center" Storyboard.TargetName="MonEllipse" Duration="0:0:2" From="20,20" To="200,200" AutoReverse="True" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard>

Voici le code XAML complet:


<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Canvas> <Path Fill="Red" Stroke="Black" StrokeThickness="3"> <Path.Data> <EllipseGeometry x:Name="MonEllipse" Center="20,20" RadiusX="15" RadiusY="15" /> </Path.Data> <Path.Triggers> <EventTrigger RoutedEvent="Path.Loaded">

Chapitre 19

Programmation WPF

453

<BeginStoryboard Name="MonStoryboard"> <Storyboard> <PointAnimation Storyboard.TargetProperty="Center" Storyboard.TargetName="MonEllipse" Duration="0:0:2" From="20,20" To="200,200" AutoReverse="True" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Path.Triggers> </Path> </Canvas> </Page>

Animer un objet avec une transformation


titre dexemple, nous allons animer la pyramide dfinie dans la section " Gomtries 3D". Pour ce faire, nous dfinissions un marqueur de transformation <TranslateTransform3D>:
<GeometryModel3D.Transform> <TranslateTransform3D x:Name="monTranslateTransform3D" OffsetX="1" OffsetY="0" OffsetZ="0" /> </GeometryModel3D.Transform>

Puis nous lanimons laide dun marqueur <DoubleAnimation>:


<!-- Animation du TranslateTransform3D au chargement de lobjet --> <Viewport3D.Triggers> <EventTrigger RoutedEvent="Viewport3D.Loaded"> <BeginStoryboard> <Storyboard> <!-- Animation selon laxe des X du TranslateTransform3D --> <DoubleAnimation Storyboard.TargetName="monTranslateTransform3D" Storyboard.TargetProperty="OffsetX" To="-0.2" AutoReverse="True" RepeatBehavior="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Viewport3D.Triggers>

454

Visual Basic 2010

Voici le code XAML complet:


<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="326" Width="453"> <Grid Height="259" Width="397">

<Viewport3D Canvas.Top="50" Canvas.Left="50" Width="300" Height="300" Name="monViewport"> <Viewport3D.Camera> <PerspectiveCamera Position="-3,0.5,7" LookDirection="3,-1,-6" UpDirection="0,1,0" FieldOfView="30" NearPlaneDistance="0.15" /> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <Model3DGroup x:Name="group3D"> <DirectionalLight Color="#00FF00" Direction="-0.5,-0.25,-1"/> <GeometryModel3D> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,1,0 1,-1,1 -1,-1,1 1, -1,1 -1,-1,-1" Normals="0,1,0 -1,0,1 1,0,1 -1,0,-1 1,0,-1" TriangleIndices="0,2,1 0,3,1 0,3,4 0,2,4" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="Bisque" /> </GeometryModel3D.Material> <GeometryModel3D.BackMaterial> <DiffuseMaterial Brush="AntiqueWhite"/> </GeometryModel3D.BackMaterial> <GeometryModel3D.Transform> <TranslateTransform3D x:Name="monTranslateTrans form3D" OffsetX="1" OffsetY="0" OffsetZ="0" /> </GeometryModel3D.Transform> </GeometryModel3D> </Model3DGroup> </ModelVisual3D.Content>

Chapitre 19

Programmation WPF

455

</ModelVisual3D> <!-- Animation du TranslateTransform3D au chargement de lobjet --> <Viewport3D.Triggers> <EventTrigger RoutedEvent="Viewport3D.Loaded"> <BeginStoryboard> <Storyboard> <!-- Animation selon laxe des X du TranslateTransform3D --> <DoubleAnimation Storyboard.TargetName="monTranslate Transform3D" Storyboard.TargetProperty="OffsetX" To="-0.2" AutoReverse="True" RepeatBehavior ="Forever" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Viewport3D.Triggers> </Viewport3D> </Grid> </Window>

Nous navons fait queffleurer lanimation dobjets en XAML. Cependant, en utilisant les techniques de cette section, vous pouvez mettre en place des animations bien plus complexes et ce, sans quaucune ligne de code Visual Basic ne soit ncessaire. Pour aller plus loin dans lanimation XAML, je vous conseille de consulter le site MSDN, et en particulier la page http://msdn2.microsoft.com/fr-fr/library/ms752312.aspx.

Pour aller plus loin


Vous avez encore du mal avec les applications WPF? Vous pouvez:

Visionner le Webcast de Mitsu Furuta, ladresse www.microsoft.com/france/vision/ WebcastMsdn.aspx?eID=663df81a-29bb-4290-959f-e48af116acbb. Vous rendre sur MSDN, ladresse http://msdn2.microsoft.com/fr-fr/library/ ms754130.aspx. Rechercher des ressources complmentaires en effectuant une recherche sur le terme WPF dans votre navigateur web prfr.

III
Programmation Internet
Cette troisime partie aborde diffrents aspects de la programmation Internet. Aprs avoir appris composer des numros de tlphone par lintermdiaire dun modem RTC, vous verrez quel point il est simple de raliser un client HTTP pour naviguer sur le Web et un client FTP pour tlcharger des fichiers. Vous dcouvrirez galement comment raliser des programmes ASP.NET destins tre utiliss dans un navigateur web. Enfin, vous apprendrez consommer et dfinir vos propres services web.

20
Composeur tlphonique
Dans ce chapitre, vous allez apprendre utiliser lobjet My.Computer.Ports pour commander un modem afin de composer des numros de tlphone (voir Figure20.1).
Figure20.1 Lapplication Numroteur, en mode Excution.

460

Visual Basic 2010

Avant de commencer
Lapplication Numroteur contient:

un systme de menus; une liste modifiable; une zone de texte; un bouton de commande.

Le menu Port permet de dfinir le port sur lequel est connect le modem (COM1, COM2, COM3 ou COM4). Un des ports peut ventuellement tre slectionn par dfaut ; dans notre exemple, il sagit du port COM2. Ds louverture de lapplication, la liste modifiable donne accs aux noms des correspondants. Pour composer un numro, il suffit de slectionner un des correspondants. Son numro de tlphone apparat dans la zone de texte. Un clic sur le bouton Numroter dclenche la numrotation. Les mthodes de lobjet My.Computer.Ports permettent dutiliser les ports srie de lordinateur pour communiquer, par cble ou par modem, avec dautres ordinateurs. Pour dialoguer avec un port srie, vous devez au pralable louvrir laide de la fonction My.Computer. Ports.OpenSerialPort(). Il suffit alors dinvoquer la procdure Write() pour envoyer des donnes au modem et la fonction ReadLine() pour en recevoir. Pour communiquer avec un modem, vous utiliserez des commandes de type AT:
ATDT45894465;<cr> compose le numro de tlphone 45894465, ATH<cr> interrompt la liaison, ATL0<cr> rgle sur faible le volume du haut-parleur.

Mise en place visuelle de lapplication


Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom NumTel au projet et validez en cliquant sur OK. Ajoutez un contrle MenuStrip, un contrle ComboBox, un contrle TextBox et un contrle Button lapplication. Modifiez les proprits de ces contrles comme indiqu dans le tableau ci-aprs.
Contrle
Form1 ComboBox1

Proprit
Caption (Name)

Valeur
Numroteur tlphonique Nom

Chapitre 20


Proprit
Sorted Text Text (Name) Text

Composeur tlphonique

461

Contrle
ComboBox1 ComboBox1 TextBox1 TextBox1 Button1

Valeur
True Choisissez un correspondant

Numro Composer

Pour terminer, vous allez dfinir le menu de lapplication. Cliquez sur la bande reprsentant le menu. Dfinissez la commande principale Port et les commandes secondaires COM1, COM2, COM3 et COM4. Donnez enfin les noms COM1 COM4 [proprit (Name)] aux commandes secondaires de menu. Si vous avez suivi nos indications, la fentre de lapplication doit maintenant ressembler la Figure20.2.
Figure20.2 Tous les contrles ont t mis en place.

ntion Atte

Si vous envisagez dutiliser systmatiquement le modem sur le mme port, affectez la valeur Checked la proprit CheckState correspondante. Ce port sera ainsi utilis par dfaut.

Dfinition des procdures de traitement


Ds le lancement de lapplication, deux tches doivent tre accomplies:

linitialisation de la liste modifiable Nom; la dfinition du port utilis pour la numrotation.

Double-cliquez sur un endroit libre de la feuille et compltez la procdure Form1_Load() comme suit:

462

Visual Basic 2010

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer = 1 Try FileOpen(1, "c:\test\agend.txt", OpenMode.Input) Do NomTel(i) = LineInput(1) NumTel(i) = LineInput(1) Nom.Items.Add(NomTel(i)) i = i + 1 Loop Until EOF(1) FileClose() Catch ex As Exception MsgBox("Le fichier c:\test\agend.txt nexiste pas") End Try Max = i - 1 If COM1.Checked If COM2.Checked If COM3.Checked If COM4.Checked End Sub Then Then Then Then CommPort CommPort CommPort CommPort = = = = 1 2 3 4

Les noms des correspondants et les numros de tlphone sont stocks dans un fichier texte au format ANSI. Ils ne sont pas modifiables par lapplication. En revanche, vous pouvez utiliser un traitement de texte ou un diteur de texte quelconques pour les mettre jour ou les complter. Le format utilis est trs simple:
Nom du Numro Nom du Numro Nom du Numro correspondant 1<cr> du correspondant 1<cr> correspondant 2<cr> du correspondant 2<cr> dernier correspondant<cr> du dernier correspondant<cr>

Les <cr> reprsentent des passages la ligne volontaires. Ils correspondent lappui sur la touche Entre du clavier. Aprs avoir dclar lindex de boucle i:
Dim i As Integer = 1

Une structure FileOpen tente douvrir le fichier c:\test\agend.txt en lecture, lintrieur dune structure Try Catch End Try:
Try FileOpen(1, "c:\test\agend.txt", OpenMode.Input)

Chapitre 20

Composeur tlphonique

463

Si le fichier c:\test\agend.txt a pu tre ouvert, lexcution se poursuit en squence. La lecture des donnes se fait lintrieur dune boucle Do Loop:
Do NomTel(i) = LineInput(1) NumTel(i) = LineInput(1) Nom.Items.Add(NomTel(i)) i = i + 1 Loop Until EOF(1)

Puis le fichier c:\test\agend.txt est ferm:


FileClose()

Si le fichier c:\test\agend.txt nest pas trouv, une exception est gnre, ce qui provoque lexcution de linstruction situe aprs linstruction Catch:
Catch ex As Exception MsgBox("Le fichier c:\test\agend.txt nexiste pas")

La variable Max est mise jour pour reflter le nombre de donnes lues dans le fichier c:\test\data.txt:
Max = i - 1

Le dernier bloc dinstructions initialise la variable CommPort en fonction de la commande de menu prcde dune coche:
If If If If COM1.Checked COM2.Checked COM3.Checked COM4.Checked Then Then Then Then CommPort CommPort CommPort CommPort = = = = 1 2 3 4

La procdure Form1_Load() utilise des variables communes dautres portions de code. Vous devez donc les dclarer entre linstruction Public Class Form1 et la dclaration Private de la procdure Form1_Load():
Dim Class Form1 Dim max, CommPort as Integer Dim NomTel(0 To 20), NumTel(0 to 20) As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load

Info

Si le nombre de correspondants stocker est plus important, modifiez le nombre dlments des tableaux NumTel et NomTel en consquence.

464

Visual Basic 2010

Gestion du menu Port


Vous allez maintenant dfinir les procdures associes aux commandes du menu Port. Ces procdures dterminent le port utiliser pour numroter. La commande choisie doit tre repre par une coche. Affichez longlet Form1.vb (Design) dans linterface de dveloppement, droulez le menu Port, double-cliquez sur la commande COM1 et compltez la procdure COM1_Click() comme suit:
Private Sub COM1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM1.Click CommPort = 1 COM1.Checked = True COM2.Checked = False COM3.Checked = False COM4.Checked = False End Sub

La premire instruction indique au contrle MSComm1 que le modem est reli sur le port COM1:
CommPort = 1

Les instructions suivantes cochent la commande COM1 et dcochent les autres commandes:
COM1.Checked COM2.Checked COM3.Checked COM4.Checked = = = = True False False False

Les procdures Com2_Click() Com4_Click() sont trs semblables. Droulez le menu Port, double-cliquez sur la commande COM2 et entrez les instructions suivantes:
Private Sub COM2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM1.Click CommPort = 2 COM1.Checked = False COM2.Checked = True COM3.Checked = False COM4.Checked = False End Sub

Droulez le menu Port, double-cliquez sur la commande COM3 et entrez les instructions suivantes:

Chapitre 20

Composeur tlphonique

465

Private Sub COM3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM1.Click CommPort = 3 COM1.Checked = False COM2.Checked = False COM3.Checked = True COM4.Checked = False End Sub

Droulez le menu Port, double-cliquez sur la commande COM4 et entrez les instructions suivantes:
Private Sub COM4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COM1.Click CommPort = 4 COM1.Checked = False COM2.Checked = False COM3.Checked = False COM4.Checked = True End Sub

Gestion du ComboBox Nom


Nous allons maintenant nous intresser au contrle ComboBox Nom. Lorsque lutilisateur slectionne un nom dans cette liste, la procdure Nom_Click() est excute. Elle doit provoquer laffichage du numro de tlphone correspondant, dans la zone de texte Numro. Dans la fentre de code, slectionnez lobjet Nom et lvnement SelectedIndexChanged. Compltez la procdure Nom_SelectedIndexChanged() en entrant les instructions suivantes:
Private Sub Nom_SelectedIndexChanged(ByVal sender As Object, ByVal e As System. EventArgs) Handles Nom.SelectedIndexChanged Numro.Text = NumTel(Nom.SelectedIndex + 1) End Sub

Rappelez-vous que les noms lus dans le fichier C:\test\agend.txt ont t stocks dans le tableau NomTel et dans la liste modifiable. Quant aux numros de tlphone, ils ont t stocks dans le tableau NumTel. Pour obtenir le numro de tlphone correspondant au nom slectionn dans la liste modifiable, il suffit de lire la donne stocke dans llment SelectedIndex + 1 dans le tableau NumTel. Le rsultat apparat dans la zone de texte Numro:
Numro.Text = NumTel(Nom.SelectedIndex + 1)

466

Visual Basic 2010

Sauvegardez le projet, puis dfinissez le fichier texte C:\test\agend.txt, par exemple dans le Bloc-notes de Windows. Entrez les noms et les numros de tlphone de vos correspondants en respectant le format dcrit quelques pages plus haut. Sauvegardez le fichier. Vous pouvez lancer le projet NUMTEL. Vrifiez que la slection dun correspondant produit bien laffichage de son numro de tlphone dans la zone de texte.

Gestion du bouton de commande


Nous pouvons poursuivre et clturer le code de lapplication en dfinissant la procdure Button1_Click() associe au bouton Composer. Double-cliquez sur le bouton de commande et compltez la procdure Button1_Click() comme suit:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click If CommPort = 1 Then Dim COM1 As IO.Ports.SerialPort COM1 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM1.Write("ATDT" + Numro.Text + vbCrLf) End If If CommPort = 2 Then Dim COM2 As IO.Ports.SerialPort COM2 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM2.Write("ATDT" + Numro.Text + vbCrLf) End If If CommPort = 3 Then Dim COM3 As IO.Ports.SerialPort COM3 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM3.Write("ATDT" + Numro.Text + vbCrLf) End If If CommPort = 4 Then Dim COM4 As IO.Ports.SerialPort COM4 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM4.Write("ATDT" + Numro.Text + vbCrLf) End If End Sub

Cette procdure consiste en quatre blocs dinstructions. Un seul dentre eux sera excut, en fonction de la commande coche dans le menu Port. Examinons le premier bloc dinstructions.

Chapitre 20

Composeur tlphonique

467

Si la variable CommPort vaut 1 (en dautres termes, si lutilisateur a lanc la commande COM1 dans le menu Port):
If CommPort = 1 Then

lobjet IO.Ports.SerialPort COM1 est cr:


Dim COM1 As IO.Ports.SerialPort

le port COM1 est ouvert laide de la fonction OpenSerialPort():


COM1 = My.Computer.Ports.OpenSerialPort("COM1", 19200)

et une commande ATDT est envoye au modem afin de composer le numro de tlphone qui apparat dans le contrle Numro:
COM1.Write("ATDT" + Numro.Text + vbCrLf)

Les trois autres blocs dinstructions sont semblables, ceci prs quils travaillent sur un autre port de communication. Il ne vous reste plus qu placer les noms et numros de vos correspondants dans le fichier c:\test\agend.txt. Si vous avez plus de vingt correspondants, noubliez pas de modifier le nombre dlments des tableaux NumTel et NomTel. Appuyez sur F5. Si le port par dfaut ne convient pas, choisissez une des commandes du menu Port pour slectionner le port utiliser. Droulez la liste modifiable. Les noms apparaissent classs par ordre alphabtique. Slectionnez un correspondant. Son numro de tlphone apparat immdiatement dans la zone de texte. Cliquez sur le bouton Composer. Aprs un bref instant, le numro est compos. Dcrochez le combin et parlez Voici le listing complet de lapplication. Les fichiers correspondants se trouvent dans le dossier Projects\NumTel des sources de louvrage.
Public Class Form1 Dim max, CommPort As Integer Dim NomTel(0 To 20), NumTel(0 To 20) As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Dim i As Integer = 1 Try FileOpen(1, "c:\test\agend.txt ", OpenMode.Input) Do NomTel(i) = LineInput(1) NumTel(i) = LineInput(1) Nom.Items.Add(NomTel(i)) i = i + 1

468

Visual Basic 2010

Loop Until EOF(1) FileClose() Catch ex As Exception MsgBox("Le fichier c:\test\agend.txt nexiste pas") End Try Max = i - 1 If COM1.Checked Then CommPort = 1 If COM2.Checked Then CommPort = 2 If COM3.Checked Then CommPort = 3 If COM4.Checked Then CommPort = 4 End Sub Private Sub COM1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles COM1.Click CommPort = 1 COM1.Checked = True COM2.Checked = False COM3.Checked = False COM4.Checked = False End Sub Private Sub COM2_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles COM2.Click CommPort = 2 COM1.Checked = False COM2.Checked = True COM3.Checked = False COM4.Checked = False End Sub Private Sub COM3_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles COM3.Click CommPort = 3 COM1.Checked = False COM2.Checked = False COM3.Checked = True COM4.Checked = False End Sub Private Sub COM4_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles COM4.Click CommPort = 4 COM1.Checked = False

Chapitre 20


COM2.Checked = False COM3.Checked = False COM4.Checked = True End Sub

Composeur tlphonique

469

Private Sub Nom_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Nom.SelectedIndexChanged Numro.Text = NumTel(Nom.SelectedIndex + 1) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Button1.Click If CommPort = 1 Then Dim COM1 As IO.Ports.SerialPort COM1 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM1.Write("ATDT" + Numro.Text + vbCrLf) End If If CommPort = 2 Then Dim COM2 As IO.Ports.SerialPort COM2 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM2.Write("ATDT" + Numro.Text + vbCrLf) End If If CommPort = 3 Then Dim COM3 As IO.Ports.SerialPort COM3 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM3.Write("ATDT" + Numro.Text + vbCrLf) End If If CommPort = 4 Then Dim COM4 As IO.Ports.SerialPort COM4 = My.Computer.Ports.OpenSerialPort("COM1", 19200) COM4.Write("ATDT" + Numro.Text + vbCrLf) End If End Sub End Class

21
Clients HTTP et FTP
Dans ce chapitre, vous allez voir quil est simple de raliser un navigateur web et un outil de tlchargement FTP. Pour surfer sur la toile avec une application de votre cru, il vous suffira de dplacer le contrle WebBrowser sur la feuille dune application. Pour raliser une application de tlchargement FTP, vous naurez qu faire appel aux mthodes de lobjet My.Computer.Network.

Un client HTTP lmentaire


Les adeptes dInternet et du Web sont tous les jours plus nombreux. Bientt, le Net ne sera quune extension conventionnelle de tout PC qui se respecte, au mme titre que la carte son ou le lecteur de CD-ROM quelques annes auparavant. Dans cette section, vous allez voir quel point il est simple dobtenir des donnes HTTP (sur le Web) grce Visual Basic 2010. Lapplication propose dans cet ouvrage est certes basique, mais elle plante le dcor que vous pourrez utiliser pour raliser des projets plus ambitieux

472

Visual Basic 2010

Avant de commencer
Le langage du parfait internaute comprend de nombreux termes techniques plus ou moins complexes. Sans doute avez-vous dj entendu parler de client et de serveur. Toute la technologie Internet est fonde sur ce systme. Un serveur est un programme capable de fournir des donnes. Au contraire, un client est un programme demandeur de donnes. Dans cette section, nous allons raliser une mini-application qui permettra dafficher une page web quelconque aprs la saisie et la validation de son adresse URL. Pour cela, il suffira dinclure un contrle WebBrowser dans lapplication (voir Figure21.1).
Figure21.1 Bien qulmentaire, cette application est un vritable navigateur web.

Mise en place de lapplication


1. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom ClientHTTP lapplication et validez en cliquant sur OK. 2. Ajoutez un contrle ToolStrip et un contrle WebBrowser lapplication. 3. lintrieur du contrle ToolStrip, ajoutez une zone de texte (TextBox) et trois boutons (Button). Nous allons modifier lallure de ces contrles. Cliquez sur une

Chapitre 21

Clients HTTP et FTP

473

partie inoccupe du contrle ToolStrip, puis sur la proprit Items dans la fentre des proprits. Un bouton contenant trois boutons de suspension apparat droite de la proprit. Cliquez dessus pour afficher la bote de dialogue diteur de collections Items (voir Figure21.2).
Figure21.2 Cette bote de dialogue permet de modifier les contrles inclus dans le ToolStrip.

4. Cliquez sur lentre ToolStripTextBox1 dans la zone de liste Membres et affectez la valeur 400 la proprit Size/Width. 5. Cliquez sur lentre ToolStripButton1 dans la zone de liste Membres. Affectez la valeur Text la proprit DisplayStyle et la valeur OK la proprit Text. 6. Cliquez sur lentre ToolStripButton2 dans la zone de liste Membres. Affectez la valeur Text la proprit DisplayStyle et la valeur Prcdent la proprit Text. 7. Enfin, cliquez sur lentre ToolStripButton3 dans la zone de liste Membres. Affectez la valeur Text la proprit DisplayStyle et la valeur Suivant la proprit Text. 8. Le contrle ToolStrip est entirement paramtr. Cliquez sur le bouton OK pour fermer la bote de dialogue diteur de collections Items. 9. Donnez la valeur Navigateur la proprit Text du contrle Form1 et la valeur Fill la proprit Dock du contrle WebBrowser1, de faon attribuer la taille maximale au contrle WebBrowser. La fentre de lapplication doit prsent ressembler la Figure21.3.

474

Visual Basic 2010

Figure21.3 Disposition des contrles sur la feuille.

Dfinition des procdures de traitement


Les procdures de traitement mettre en uvre sont trs simples. Elles concernent les trois boutons de commande et le redimensionnement de la fentre de lapplication (vnement Form1_Resize). Double-cliquez sur le premier bouton de commande et compltez la procdure Tool StripButton1_Click() comme suit:
Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text) End Sub

Linstruction WebBrowser1.Navigate() provoque laffichage de la page dont ladresse est spcifie dans le contrle TextBox1.Text, lui-mme plac dans le contrle WebBrowser. Double-cliquez sur le deuxime bouton de commande et compltez la procdure Tool StripButton2_Click() comme suit:
Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click WebBrowser1.GoBack() End Sub

Linstruction WebBrowser1.GoBack() provoque laffichage de la page prcdente dans le contrle WebBrowser. Elle correspond au bouton Prcdente dInternet Explorer. Enfin, double-cliquez sur le troisime bouton de commande et compltez la procdure
ToolStripButton3_Click() comme suit:
Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click WebBrowser1.GoForward() End Sub

Chapitre 21

Clients HTTP et FTP

475

Linstruction WebBrowser1.GoForward() provoque laffichage de la page suivante dans le contrle WebBrowser. Elle correspond au bouton Suivante dInternet Explorer. Nous allons maintenant crire quelques lignes de code pour attribuer une largeur maximale au contrle ToolStripTextBox1 en fonction de la largeur de la fentre. Slectionnez lentre Form1 dans la fentre des Proprits. Cliquez sur le bouton vnements et double-cliquez sur lvnement Resize. Cette action provoque le passage dans la fentre de code. Le point dinsertion est positionn lintrieur de la procdure Form1_ Resize(). Compltez cette procdure comme suit:
Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Resize ToolStripTextBox1.Size = New System.Drawing.Size(Me.Width - 160, 25) End Sub

Lors dun redimensionnement de la fentre, la procdure Form1_Resize() affecte au contrle ToolStripTextBox1 la largeur de la feuille (Me.Width) diminue de 160 points. Cette valeur correspond la somme des largeurs des boutons ToolStripButton1, Tool StripButton2 et ToolStripButton3.

Excution de lapplication
Connectez-vous chez votre fournisseur daccs, puis appuyez sur la touche de fonction F5. Lapplication est immdiatement fonctionnelle. Entrez ladresse URL dun site quelconque dans la zone de texte et cliquez sur OK. La page correspondante apparat dans la partie infrieure de la fentre. Vous pouvez naviguer partir de cette page ou entrer une autre adresse URL dans la zone de texte et cliquer nouveau sur OK. Utilisez les boutons Prcdent et Suivant pour naviguer dans les sites visits. Les boutons Prcdent et Suivant ne fonctionnent que dans les pages visites: si vous remontez trop loin avec le bouton Prcdent ou que vous tentiez dafficher une page qui na pas t visite avec le bouton Suivant, aucune action nen dcoulera.

Info

Voici le listing complet de lapplication. Ce projet se trouve dans le dossier Projects\ ClientHTTP des sources de louvrage.
Public Class Form1 Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text)

476

Visual Basic 2010

End Sub Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click WebBrowser1.GoBack() End Sub Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click WebBrowser1.GoForward() End Sub Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Resize ToolStripTextBox1.Size = New System.Drawing.Size(Me.Width - 160, 25) End Sub End Class

Un client FTP lmentaire


Nous allons raliser une mini-application qui permettra de tlcharger (cest--dire de rapatrier sur votre ordinateur) un fichier quelconque situ sur un site FTP dont vous connaissez ladresse (voir Figure21.4).
Figure21.4 La connexion au serveur a t tablie.

Chapitre 21

Clients HTTP et FTP

477

Mise en place de lapplication


Lancez la commande Nouveau Projet du menu Fichier. Choisissez .NET Framework4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom ClientFTP lappli cation et validez en cliquant sur OK. Ajoutez quatre contrles Label, cinq contrles TextBox et deux contrles Button dans la nouvelle application. Modifiez les proprits de ces contrles comme suit:
Contrle
Label1 Label2 Label3 Label4 TextBox1 TextBox1 TextBox2 TextBox2 TextBox3 TextBox3 TextBox4 TextBox4 Button1 Button1 Button2 Button2 TextBox5 TextBox5 Form1

Proprit
Text Text Text Text Text (Name) Text (Name) Text (Name) (Name) Text Text (Name) Text (Name) MultiLine (Name) Text

Valeur
Site FTP User ID Password Fichier ftp.jussieu.fr Adresse anonymous UserID mail@server.com Password Fichier jussieu/README Connecter Connecter Tlcharger Telech True Message Tlchargement FTP

Disposez et redimensionnez ces contrles de sorte que la feuille ressemble la Figure21.5.

478

Visual Basic 2010

Figure21.5 Disposition des contrles sur la feuille.

ce Astu

Le serveur FTP de luniversit de Jussieu a t pris en exemple dans cette section. Cependant, rien ne vous empche de faire vos essais sur un autre serveur FTP. Pour obtenir ladresse de sites franais et trangers, rendez-vous sur le site web.cnrs-orleans.fr/SERVICES/FTP/ftp-sites.html.

Dfinition des procdures de traitement


Double-cliquez sur le bouton Connecter et compltez la procdure Connecter_Click() comme suit:
Private Sub Connecter_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Connecter.Click If My.Computer.Network.Ping(Adresse.Text) Then Message.Text = Message.Text + "Lordinateur vis est accessible" + vbCrLf Else Message.Text = Message.Text + "Lordinateur vis nest pas accessible" + vbCrLf End If End Sub

Ce code repose sur une instruction If Then Else:


If My.Computer.Network.Ping(Adresse.Text) Then Else End If

Chapitre 21

Clients HTTP et FTP

479

La fonction My.Computer.Network.Ping() renvoie la valeur True si le serveur spcifi en argument renvoie une rponse un ping. Elle renvoie la valeur False dans le cas contraire. Si le serveur rpond au ping, un message indiquant la russite de la connexion saffiche dans la zone de texte multiligne:
Message.Text = Message.Text + "Lordinateur vis est accessible" + vbCrLf

Dans le cas contraire, un message indiquant lindisponibilit du site apparat dans la zone de texte multiligne:
Else Message.Text = Message.Text + "Lordinateur vis nest pas accessible" + vbCrLf

Double-cliquez sur le bouton Tlcharger et compltez la procdure Telech_Click() comme suit:


Private Sub Telech_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Telech.Click Message.Text = Message.Text + "Dbut du tlchargement" + vbCrLf My.Computer.Network.DownloadFile("ftp://" + Adresse.Text + "/" + Fichier.Text, "c:\download\" + Fichier.Text, UserID.Text, Password.Text, True, 500, True) Message.Text = Message.Text + "Le fichier a t copi ici : c:\download\" + Fichier.Text + vbCrLf End Sub

La premire instruction affiche un message indiquant le dbut du tlchargement dans la zone de texte multiligne:
Message.Text = Message.Text + "Dbut du tlchargement" + vbCrLf

Le fichier est alors tlcharg laide de la procdure DownloadFile():


My.Computer.Network.DownloadFile("ftp://" + Adresse.Text + "/" + Fichier.Text, "c:\download\" + Fichier.Text, UserID.Text, Password.Text, True, 500, True)

Voici la signification des sept arguments de la procdure DownloadFile():

adresse URL complte du fichier tlcharger; adresse de stockage sur lordinateur (ici dans le dossier c:\download); nom dutilisateur pour la connexion FTP; mot de passe pour la connexion FTP; affichage (True) dun indicateur de progression de tlchargement;

480

Visual Basic 2010

dure maximale de rponse (en millisecondes) attribue au serveur; crasement (True) dun ventuel fichier de mme nom.

Lorsque le tlchargement est termin, un message saffiche dans la zone de texte multiligne:
Message.Text = Message.Text + "Le fichier a t copi ici : c:\download\" + Fichier.Text + vbCrLf

Excution de lapplication
Connectez-vous chez votre fournisseur daccs, puis appuyez sur la touche de fonction F5. Les quatre premires zones de texte sont compltes ds lexcution. Cliquez sur le bouton Connecter et patientez jusqu laffichage du message "Lordinateur vis est accessible". Si une bote de dialogue analogue celle montre la Figure21.6 saffiche, cliquez sur Dbloquer.
Figure21.6 Alerte de scurit gnre sous Windows7.

Cliquez maintenant sur le bouton Tlcharger et patientez jusqu laffichage du message "Le fichier a t copi ici". La Figure21.7 reprsente lapplication Tlchargement FTP en mode Excution. Remarquez les messages affichs dans le contrle Mmo.

Chapitre 21

Clients HTTP et FTP

481

Figure21.7 Tlchargement du fichier README sur le serveur ftp. jussieu.fr.

Voici le listing complet du programme ClientFTP. Ce projet se trouve dans le dossier Projects\ClientFTP des sources de louvrage.
Public Class Form1 Private Sub Connecter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connecter.Click If My.Computer.Network.Ping(Adresse.Text) Then Message.Text = Message.Text + "Lordinateur vis est accessible" + vbCrLf Else Message.Text = Message.Text + "Lordinateur vis nest pas accessible" + vbCrLf End If End Sub Private Sub Telech_Click(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles Telech.Click Message.Text = Message.Text + "Dbut du tlchargement" + vbCrLf My.Computer.Network.DownloadFile("ftp://" + Adresse.Text + "/" + Fichier.Text, "c:\download\" + Fichier.Text, UserID.Text, Password.Text, True, 500, True) Message.Text = Message.Text + "Le fichier a t copi ici : c:\download\" + Fichier.Text + vbCrLf End Sub End Class

22
Applications web
Avec Visual Studio 2010, Microsoft offre aux dveloppeurs la possibilit de porter tout ou partie de leurs applications sur le Net. Ces applications sont alors accessibles par un simple navigateur web. Dans les pages qui suivent, vous allez dcouvrir quel point il est simple de concevoir, de dvelopper, de dboguer et de dployer des applications web puissantes qui rduisent considrablement la dure du dveloppement. Les applications web ou Web Forms sont gnres partir de Visual Studio. Tout se passe comme si vous tiez en train de concevoir une application Windows Forms: 1. Dfinissez linterface visuelle de lapplication en dplaant un ou plusieurs contrles de la Bote outils vers la feuille de lapplication. 2. Modifiez autant de proprits que ncessaire en utilisant la fentre des proprits. 3. Dfinissez des proprits vnementielles pour ragir aux vnements utilisateur. 4. Gnrez lapplication en appuyant sur la touche F5 via la commande Gnrer le site web dans le menu Gnrer. Un document ASP+ est cr par Visual Studio. Ce document est directement affichable dans un navigateur Internet.

484

Visual Basic 2010

Le code gnr est compil lors du premier accs au document ASP+. Vous avez bien lu! La premire fois que le document sera lu, ASP+ compilera le code correspondant. Toutes les personnes qui visualiseront ce document par la suite utiliseront sa version compile, donc beaucoup plus rapide Les contrles disponibles pour les Web Forms sont trs nombreux. Ils vont du simple label au trs sophistiqu calendrier, en passant par un GridView, facilement connectable un RecordSet. Le simple fait de placer un contrle sur la feuille du document gnre le code ASP correspondant. Il existe un certain nombre de contrles "invisibles". Comparables au Timer de Visual Basic, ces contrles sont essentiellement ddis la validation des donnes entres par lutilisateur. Enfin, sachez galement quil est possible de dvelopper des contrles personnaliss serveur. Dune manire comparable aux OCX, ces contrles peuvent implmenter des proprits qui leur sont propres et utiliser une gestion vnementielle spcifique.

Une premire application web


Vous allez maintenant crer votre premire application web, qui va se contenter dafficher un simple texte dans la fentre du navigateur lors de son excution. Lancez la commande Nouveau/Site web dans le menu Fichier. Dans le volet gauche, choisissez Visual Basic sous Modles installs. Slectionnez le modle Site web ASP.NET vide, indiquez lemplacement et le nom de votre projet et cliquez sur OK (voir Figure22.1).
Figure22.1 Lapplication web PremiereAW est sur le point dtre gnre.

Chapitre 22

Applications web

485

Cliquez sur OK. Quelques instants plus tard, une nouvelle solution web vide est cre. Dans lExplorateur de solutions, cliquez du bouton droit sur lentre PremiereAW et slectionnez Ajouter un nouvel lment dans le menu contextuel. Choisissez Web Form et cliquez sur Ajouter. La fentre de Visual Studio se prsente comme la Figure22.2. Longlet Standard de la Bote outils donne accs un certain nombre de contrles spcifiques aux applications web. Pour les utiliser, il suffit de les dposer lemplacement souhait sur le document, comme vous le feriez pour une application Windows Forms. Dune faon similaire, la fentre des proprits donne accs aux proprits de lobjet slectionn ou du document si aucun objet nest slectionn.
Figure22.2 Votre premire application web a t gnre par Visual Studio et la page Default.aspx y a t insre.

Dplacez un contrle Label sur le document et affectez la valeur "Ceci est un contrle Label" la proprit Text de ce contrle. Cliquez maintenant sur une partie non occupe du document et affectez la valeur "Ma premire application web" la proprit title. Appuyez sur la touche F5 pour excuter lapplication web. Si une bote de dialogue vous signale que le dbogage nest pas activ dans Web.config, slectionnez loption Modifier le fichier Web.config pour activer le dbogage et cliquez sur OK. Aprs quelques instants, Internet Explorer est excut et le document qui vient dtre cr dans Visual Studio y est affich (voir Figure22.3).

486

Visual Basic 2010

Figure22.3 Le document Visual Studio affich dans Internet Explorer.

Le document reprsent dans Internet Explorer est au format ASP (WebForm1.aspx). Pour visualiser son code, lancez la commande Source dans le menu Affichage dInternet Explorer. Voici le listing obtenu:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title> Ma premire application Web </title></head> <body> <form method="post" action="Default.aspx" id="form1"> <div class="aspNetHidden"> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=" /wEPDwUJODExMDE5NzY5ZGS6m86ljr3tF9UXQ1oQSs/ONf1jCcGa179PJGuWjBvCqg==" /> </div> <div> <span id="Label1">Ceci est un contrle Label</span> </div> </form> </body> </html>

Le label a t gnr dans un marqueur <span>:


<span id="Label1">Ceci est un contrle Label</span>

Chapitre 22

Applications web

487

Les lments affichs dans une application web peuvent tre modifis, comme vous le feriez dans une application Windows Forms. Pour vous en convaincre, ajoutez deux boutons de commande au document prcdent en les faisant glisser depuis la Bote outils. Modifiez les proprits de ces boutons comme indiqu dans le tableau suivant:
Contrle
Button1 Button1 Button2 Button2

Proprit
Text (ID) Text (ID)

Valeur
Rouge Rouge Noir Noir

Double-cliquez sur le bouton Rouge et compltez la procdure Rouge_Click() comme suit:


Private Sub Rouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Rouge.Click Label1.ForeColor = Drawing.Color.Red End Sub

Lunique instruction de cette procdure modifie la couleur du label. Double-cliquez maintenant sur le bouton Noir et compltez la procdure Noir_Click() comme suit:
Private Sub Rouge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Rouge.Click Label1.ForeColor = Drawing.Color.Black End Sub

Appuyez sur la touche F5. Vous pouvez maintenant modifier la couleur du label en cliquant sur les boutons Rouge et Noir. Voici le code ASP gnr par Visual Studio (ce code se trouve dans le dossier Websites\ PremiereAW des sources aprs linstallation des sources de louvrage):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> Page sans titre </title></head> <body>

488

Visual Basic 2010

<form name="form1" method="post" action="Default.aspx" id="form1"> <div> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value= "/wEPDwULLTExNjMzNDIxNjRkZKvQa4TvwLifMtRa2g9u55BJqNsE" /> </div> <div> <span id="Label1">Ceci est un label</span> <br /> <br /> <input type="submit" name="Rouge" value="Rouge" id="Rouge" style= "width:72px;" /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <input type="submit" name="Noir" value="Noir" id="Noir" style= "width:72px;" /></div> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value ="/wEWAwL1vbSQDALI7cCGCQKvlIGNDTI/UkYpNEfSQLXgFXhbLRHQrG6d" /> </div></form> </body> </html>

Remarquez les instructions utilises pour dfinir les deux boutons de commande:
<input type="submit" name="Rouge" value="Rouge" id="Rouge" style="width:72px;" /> <input type="submit" name="Noir" value="Noir" id="Noir" style="width:72px;" />

Lorsquon clique sur un bouton, une requte submit est gnre et la portion de code dfinie dans la procdure Click() correspondante est excute, ce qui provoque le changement de couleur du label.

Une application web en un seul contrle


Mme sils restent simples dutilisation, certains contrles sont trs volus. Nous allons en faire la dmonstration en utilisant le contrle Calendrier. Dfinissez un nouveau projet de type Site web ASP.NET vide. Ajoutez un nouvel lment Web Form dans le projet. Double-cliquez sur le contrle Calendar pour linsrer dans le document, puis appuyez sur la touche F5 pour gnrer le code ASP correspondant. La Figure22.4 donne un aperu du rsultat obtenu dans Internet Explorer.

Chapitre 22

Applications web

489

Figure22.4 Il a suffi dun doubleclic pour crer cette page web.

Si la forme par dfaut du calendrier ne vous convient pas, retournez sur la page Default. aspx dans Visual Studio, cliquez du bouton droit sur le dessin du calendrier dans la page en cours ddition et slectionnez Mise en forme automatique dans le menu surgissant. Une bote de dialogue vous permet de modifier laspect du calendrier en deux clics (voir Figure22.5).
Figure22.5 Laspect du calendrier peut tre trs facilement modifi.

Le calendrier se cale automatiquement sur le mois en cours. Si vous cliquez sur les flches situes sur la premire ligne du calendrier ou sur un des jours du mois prcdent ou suivant, le mois correspondant est automatiquement affich.

490

Visual Basic 2010

Laffichage nest donc pas statique. Voici le code qui a t gnr par Visual Studio (cette application se trouve dans le dossier Websites\Calendrier des sources aprs linstallation des sources de louvrage).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> Page sans titre </title></head> <body> <form name="form1" method="post" action="default.aspx" id="form1"> <div> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=" /wEPDwULLTEzNjg5MjAxMzhkZC0mGa8VA8IcfHBLc0ugHEn+YV3h" /> </div> <script type="text/javascript"> //<![CDATA[ var theForm = document.forms[form1]; if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } //]]> </script>

<div> <table id="Calendar1" cellspacing="0" cellpadding="2" title= "Calendrier" border="0" style="border-width:1px;border-style:solid; border-collapse:collapse;"> <tr><td colspan="7" style="background-color:Silver;"><table cellspacing="0" border="0" style="width:100%;border-collapse:collapse;"> <tr><td style="width:15%;"><a href="javascript:__doPostBack(Calendar1,

Chapitre 22

Applications web

491

V2953)" style="color:Black" title="Accder au mois prcdent">&lt; </a></td><td align="center" style="width:70%;">mai 2010</td><td align="right" style="width:15%;"><a href="javascript:__doPostBack(Calendar1,V3013)" style="color:Black" title="Accder au mois suivant">&gt;</a></td></tr> </table></td></tr><tr><th align="center" abbr="lundi" scope="col">lun.</th> <th align="center" abbr="mardi" scope="col">mar.</th><th align="center" abbr="mercredi" scope="col">mer.</th><th align="center" abbr="jeudi" scope="col">jeu.</th><th align="center" abbr="vendredi" scope="col">ven.</th> <th align="center" abbr="samedi" scope="col">sam. </th><th align="center" abbr="dimanche" scope="col">dim.</th></ tr><tr><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2977)" style="color:Black" title="25 fvrier">25 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2978)" style="color:Black" title="26 fvrier">26 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2979)" style="color:Black" title="27 fvrier">27 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2980)" style="color:Black" title="28 fvrier">28 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2981)" style="color:Black" title="29 fvrier">29 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2982)" style="color:Black" title="1 mars">1 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2983)" style="color:Black" title="2 mars">2</a> </td></tr><tr><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2984)" style="color:Black" title="3 mars">3 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2985)" style="color:Black" title="4 mars">4 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2986)" style="color:Black" title="5 mars">5 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2987)" style="color:Black" title="6 mars">6 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2988)" style="color:Black" title="7 mars">7 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2989)" style="color:Black" title="8 mars">8 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2990)" style="color:Black" title="9 mars">9</a> </td></tr><tr><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2991)" style="color:Black" title="10 mars">10 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2992)" style="color:Black" title="11 mars">11 </a></td><td align="center" style="width:14%;"><a href="javascript:__

492

Visual Basic 2010

doPostBack(Calendar1,2993)" style="color:Black" title="12 mars">12 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2994)" style="color:Black" title="13 mars">13 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2995)" style="color:Black" title="14 mars">14 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2996)" style="color:Black" title="15 mars">15 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2997)" style="color:Black" title="16 mars">16</a> </td></tr><tr><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2998)" style="color:Black" title="17 mars">17 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,2999)" style="color:Black" title="18 mars">18 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3000)" style="color:Black" title="19 mars">19 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3001)" style="color:Black" title="20 mars">20 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3002)" style="color:Black" title="21 mars">21 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3003)" style="color:Black" title="22 mars">22 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3004)" style="color:Black" title="23 mars">23</a> </td></tr><tr><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3005)" style="color:Black" title="24 mars">24 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3006)" style="color:Black" title="25 mars">25 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3007)" style="color:Black" title="26 mars">26 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3008)" style="color:Black" title="27 mars">27 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3009)" style="color:Black" title="28 mars">28 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3010)" style="color:Black" title="29 mars">29 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3011)" style="color:Black" title="30 mars">30</a> </td></tr><tr><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3012)" style="color:Black" title="31 mars">31 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3013)" style="color:Black" title="1 avril">1 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3014)" style="color:Black" title="2 avril">2 </a></td><td align="center" style="width:14%;"><a href="javascript:__

Chapitre 22

Applications web

493

doPostBack(Calendar1,3015)" style="color:Black" title="3 avril">3 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3016)" style="color:Black" title="4 avril">4 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3017)" style="color:Black" title="5 avril">5 </a></td><td align="center" style="width:14%;"><a href="javascript:__ doPostBack(Calendar1,3018)" style="color:Black" title="6 avril">6</a></td> </tr> </table> </div> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value= "/wEWLQLqzaC9CQK68aLPAwL3kcHOCQLVtOeRAQLVtJP6BwLVtI+VDwLg3rPSBQLg3q+NDQLg3puoBgL g3vfDDwLg3uN+AuDe35kIAuDey7QBAuDep9AKAuDe07gPAuDez1MC2/fR/AMC2/fNlwsC2/e5swwC2/ eV7gUC2/eBiQ0C2/f9pAYC2/fp3w8C2/fFegLb9/HDBQLb9+3+DgKXlISICwKXlPCjDAKXlOzeBQKXlNj5DgKXlLSVBgKXlKCwDwKXlJxrApeUiIYIApeUpO8OApeUkIoGAvKtopMBAvKtns4KAvKtiukDAvKt5oQLAvKt0r8MAvKtztoFAvKtuvYOAvKtlpEGAvKtwvkE9f/2Cl69UNJfmHOPcZMs+bFsnLM=" /> </div></form> </body> </html>

Valider les donnes


Longlet Validations de la Bote outils inclut plusieurs contrles qui permettent de v rifier la validit des donnes saisies par lutilisateur:

RequiredFieldValidator. Affiche un message si un contrle obligatoire nest pas

rempli.
CompareValidator. Compare une valeur saisie par lutilisateur une constante ou une autre valeur saisie par lutilisateur. RangeValidator. Vrifie que le contenu dune zone de saisie se situe entre les limites

autorises.
RegularExpressionValidator. Vrifie que le contenu dune zone de saisie correspond

au modle spcifi.
CustomValidator. Ce contrle permet de dfinir une fonction de validation personnalise. ValidationSummary. Affiche les messages derreur sous la forme dune liste, dune liste puces ou dun simple texte, sur la page ou dans une bote de message.

494

Visual Basic 2010

Les contrles de validation sont "invisibles". Ils apparaissent uniquement en mode conception et en aucun cas dans le navigateur Internet. Supposons par exemple que vous souhaitiez tester la validit dun mot de passe. Vous utiliserez pour cela un contrle RegularExpressionValidator. Dfinissez un nouveau projet de type Site web ASP.NET vide. Ajoutez un nouvel lment Web Form au projet. Ajoutez un Label, un TextBox, un Button et un RegularExpression Validator la feuille (les trois premiers contrles se trouvent sous longlet Standard de la Bote outils et le quatrime sous longlet Validation). Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Label1 TextBox1 Button RegularExpressionValidator1 RegularExpressionValidator1 RegularExpressionValidator1

Proprit
Text Text Text ControlToValidate ErrorMessage ValidationExpression

Valeur
Entrez le mot de passe

Valider
TextBox1

Mot de passe incorrect Le mot de passe

La proprit ValidationExpression est initialise avec le mot de passe. Si vous cliquez sur les points de suspension, droite de cette proprit, vous voyez que lexpression de validation peut galement faire partie dun certain nombre dexpressions standard (voir Figure22.6).
Figure22.6 Ici, lexpression de validation est la constante pearson.

Gnrez lapplication en appuyant sur F5. Si une bote de dialogue vous signale que le dbogage nest pas activ dans Web.config, slectionnez loption Modifier le fichier Web. config pour activer le dbogage et cliquez sur OK.

Chapitre 22

Applications web

495

Entrez un mot de passe non conforme puis cliquez sur le bouton Valider. Un message derreur saffiche droite du bouton de commande (voir Figure22.7). Si vous entrez le bon mot de passe, le message derreur disparat lorsque vous cliquez sur le bouton Valider.
Figure22.7 La saisie dun mot de passe incorrect provoque laffichage dun message derreur.

Voici le code ASP gnr par Visual Studio (ce code se trouve dans le dossier Websites\ Validation des sources aprs linstallation des sources de louvrage).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> Page sans titre </title></head> <body> <form name="form1" method="post" action="Default.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="form1"> <div> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value= "/wEPDwUJLTU3NDgyMDMwZGSDEuEYlD+SWlbW1aiogcanhqHSgw==" /> </div> <script type="text/javascript"> <!-var theForm = document.forms[form1]; if (!theForm) {

496

Visual Basic 2010

theForm = document.form1; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } // --> </script>

<script src="/Validation/WebResource.axd?d=47DVMwHRgwJ4hLHX_KNOLA2&amp;t= 632677332350339104" type="text/javascript"></script>

<script src="/Validation/WebResource.axd?d=Wz9Zm5F54DyuwrZrXF6lVSs4U-rXbcq2FQWg8 rOU6bo1&amp;t=632677332350339104" type="text/javascript"></script> <script type="text/javascript"> <!-function WebForm_OnSubmit() { if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false; return true; } // --> </script> <div> <span id="Label1">Entrez le mot de passe</span> <input name="TextBox1" type="text" id="TextBox1" /> <input type="submit" name="Button1" value="Valider" onclick= "javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOption s(&quot;Button1&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="Button1" /> <span id="RegularExpressionValidator1" style="color:Red;visibility: hidden;">Mot de passe incorrect</span></div> <script type="text/javascript"> <!-var Page_Validators = new Array(document.getElementById("RegularExpression Validator1")); // --> </script> <script type="text/javascript">

Chapitre 22

Applications web

497

<!-var RegularExpressionValidator1 = document.all ? document.all["RegularExpression Validator1"] : document.getElementById("RegularExpressionValidator1"); RegularExpressionValidator1.controltovalidate = "TextBox1"; RegularExpressionValidator1.errormessage = "Mot de passe incorrect"; RegularExpressionValidator1.evaluationfunction = "RegularExpressionValidatorEvaluateIsValid"; RegularExpressionValidator1.validationexpression = "vs2010"; // --> </script> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value= "/wEWAwKS2N/rBALs0bLrBgKM54rGBjVPcUai1RYeEnBbtN8Dkt/ZpfJs" /> </div> <script type="text/javascript"> <!-var Page_ValidationActive = false; if (typeof(ValidatorOnLoad) == "function") { ValidatorOnLoad(); } function ValidatorOnSubmit() { if (Page_ValidationActive) { return ValidatorCommonOnSubmit(); } else { return true; } } // --> </script> </form> </body> </html>

Remarquez le marqueur <script>, qui, lui seul, permet de valider le mot de passe entr dans la zone de texte. Les proprits errormessage et validationexpression apparaissent directement dans le script:
<script type="text/javascript"> <!-var RegularExpressionValidator1 = document.all ? document.all["RegularExpression Validator1"] : document.getElementById("RegularExpressionValidator1"); RegularExpressionValidator1.controltovalidate = "TextBox1"; RegularExpressionValidator1.errormessage = "Mot de passe incorrect";

498

Visual Basic 2010

RegularExpressionValidator1.evaluationfunction = "RegularExpressionValidatorEvaluateIsValid"; RegularExpressionValidator1.validationexpression = "vs2010"; // --> </script>

Le tableau suivant indique les plus importantes proprits des diffrents contrles de validation.
Contrle
RegularExpressionValidator RegularExpressionValidator RegularExpressionValidator RequiredFieldValidator RequiredFieldValidator CompareValidator CompareValidator CompareValidator CompareValidator RangeValidator RangeValidator RangeValidator RangeValidator CustomValidator CustomValidator ValidationSummary ValidationSummary ValidationSummary

Proprit
ErrorMessage ControlToValidate ValidationExpression ErrorMessage ControlToValidate ErrorMessage ControlToCompare ControlToValidate ValueToCompare ErrorMessage ControlToValidate MaximumValue MinimumValue ErrorMessage ControlToValidate HeaderText DisplayMode ShowMessageBox

Fonction
Message derreur afficher en cas de non-conformit Nom du contrle sur lequel porte le test Expression utiliser pour dterminer la validit Message affich si le contrle test est laiss vide Nom du contrle sur lequel porte le test Message derreur afficher en cas de non-conformit Nom du contrle comparer Nom du contrle sur lequel porte le test Valeur comparer au contrle test Message derreur afficher en cas de non-conformit Nom du contrle sur lequel porte le test Valeur maximale de la plage autorise Valeur minimale de la plage autorise Message derreur afficher en cas de non-conformit Nom du contrle sur lequel porte le test En-tte du message derreur Mode daffichage des messages derreur: List, BulletList ou SingleParagraph
True pour afficher le message derreur dans une bote de message, False pour

lafficher dans la feuille

Chapitre 22

Applications web

499

Supposons que lutilisateur doive saisir deux champs dinformation obligatoires sur une feuille: son nom et son prnom. Si un des champs nest pas saisi, vous pouvez afficher un message derreur laide dun contrle RequiredFieldValidator. Vous pouvez galement indiquer les champs non saisis dans une bote de message laide dun contrle ValidationSummary. Nous allons nous intresser cette deuxime possibilit. Dfinissez un nouveau projet de type Site web ASP.NET vide. Insrez un nouvel lment de type Web Form dans le projet. Ajoutez deux Label, deux TextBox, un Button, deux RequiredFieldValidator et un ValidationSummary au Web Form (ces contrles se trouvent sous longlet Web Forms de la Bote outils). Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Label1 Label2 TextBox1 TextBox1 TextBox2 TextBox2 Button1 Button1 RequiredFieldValidator1 RequiredFieldValidator1 RequiredFieldValidator1 RequiredFieldValidator2 RequiredFieldValidator2 RequiredFieldValidator2 ValidationSummary

Proprit
Text Text Text (ID) Text (ID) Text (ID) Display ControlToValidate ErrorMessage Display ControlToValidate ErrorMessage HeaderText ShowMessageBox ShowSummary

Valeur
Entrez votre nom Entrez votre prnom

Nom

Prnom Valider Valider None Nom Le champ nom est obligatoire None Prnom Le champ prnom est obligatoire Attention: True False

ValidationSummary
ValidationSummary

En affectant la valeur None la proprit Display des deux contrles RequiredFieldValidator, aucun message napparatra lemplacement de ces contrles si lutilisateur laisse le champ correspondant vide.

500

Visual Basic 2010

Gnrez et affichez la page ASP correspondante en appuyant sur F5. La Figure22.8 donne un aperu du rsultat obtenu lorsque lutilisateur clique sur le bouton Valider alors que les deux zones de texte obligatoires sont laisses vides.
Figure22.8 Une bote de dialogue signale les champs obligatoires non remplis.

Voici le code ASP gnr par Visual Studio (le code source se trouve dans le dossier Websites\ Validation2 des sources de louvrage aprs installation des applications de louvrage).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> Page sans titre </title></head> <body> <form name="form1" method="post" action="Default.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="form1"> <div> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value= "/wEPDwULLTE4MzU3MzY5NjlkZDPHDbTA03uOOG8jDNDNtbiK6xum" /> </div> <script type="text/javascript"> <!--

Chapitre 22

Applications web

501

var theForm = document.forms[form1]; if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } // --> </script>

<script src="/Validation2/WebResource.axd?d=XNrKvmDoFLmpiG2zLlYU1Q2&amp ;t=632677332350339104" type="text/javascript"></script>

<script src="/Validation2/WebResource.axd?d=GL5x1ihVqlZQ2gwnk_76uttlZOupblijbcWV 4bo1x1I1&amp;t=632677332350339104" type="text/javascript"></script> <script type="text/javascript"> <!-function WebForm_OnSubmit() { if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false; return true; } // --> </script> <div> <span id="Label1">Entrez votre nom</span> &nbsp; &nbsp; &nbsp; &nbsp;<input name="Nom" type="text" id="Nom" /><br /> <br /> <span id="Label2">Entrez votre prnom</span> &nbsp; &nbsp;<input name="Prnom" type="text" id="Prnom" /><br /> <br /> <input type="submit" name="Valider" value="Valider" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOption s(&quot;Valider&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="Valider" /> <span id="RequiredFieldValidator1" style="color:Red;display:none;"></span>

502

Visual Basic 2010

<span id="RequiredFieldValidator2" style="color:Red;display:none;"></span> <div id="ValidationSummary1" style="color:Red;display:none;"> </div> </div> <script type="text/javascript"> <!-var Page_ValidationSummaries = new Array(document.getElementById("Validation Summary1")); var Page_Validators = new Array(document.getElementById("RequiredFieldValidator1"), document.getElementById("RequiredFieldValidator2")); // --> </script> <script type="text/javascript"> <!-var RequiredFieldValidator1 = document.all ? document.all["RequiredFieldValidator1"] : document.getElementById("RequiredFieldValidator1"); RequiredFieldValidator1.controltovalidate = "Nom"; RequiredFieldValidator1.errormessage = "Le champ Nom est obligatoire"; RequiredFieldValidator1.display = "None"; RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; RequiredFieldValidator1.initialvalue = ""; var RequiredFieldValidator2 = document.all ? document.all["RequiredFieldValidator2"] : document.getElementById("RequiredFieldValidator2"); RequiredFieldValidator2.controltovalidate = "Prnom"; RequiredFieldValidator2.errormessage = "Le champ Prnom est obligatoire"; RequiredFieldValidator2.display = "None"; RequiredFieldValidator2.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; RequiredFieldValidator2.initialvalue = ""; var ValidationSummary1 = document.all ? document.all["ValidationSummary1"] : document.getElementById("ValidationSummary1"); ValidationSummary1.headertext = "Attention :"; ValidationSummary1.showmessagebox = "True"; ValidationSummary1.showsummary = "False"; // --> </script> <div> <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value=

Chapitre 22

Applications web

503

"/wEWBALcj7ffBAKbueCABQLorN29BQKi4t3RCzVfDHdp0JB1/6P+QncAeBbQPm8p" /> </div> <script type="text/javascript"> <!-var Page_ValidationActive = false; if (typeof(ValidatorOnLoad) == "function") { ValidatorOnLoad(); } function ValidatorOnSubmit() { if (Page_ValidationActive) { return ValidatorCommonOnSubmit(); } else { return true; } } // --> </script> </form> </body> </html>

Remarquez le marqueur <script>, associ au contrle ValidationSummary et responsable de laffichage de la bote de message en cas de non-saisie des champs obligatoires:
<script type="text/javascript"> <!-var RequiredFieldValidator1 = document.all ? document.all["RequiredFieldValidator1"] : document.getElementById("RequiredFieldValidator1"); RequiredFieldValidator1.controltovalidate = "Nom"; RequiredFieldValidator1.errormessage = "Le champ Nom est obligatoire"; RequiredFieldValidator1.display = "None"; RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; RequiredFieldValidator1.initialvalue = ""; var RequiredFieldValidator2 = document.all ? document.all["RequiredFieldValidator2"] : document.getElementById("RequiredFieldValidator2"); RequiredFieldValidator2.controltovalidate = "Prnom"; RequiredFieldValidator2.errormessage = "Le champ Prnom est obligatoire"; RequiredFieldValidator2.display = "None"; RequiredFieldValidator2.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid"; RequiredFieldValidator2.initialvalue = ""; var ValidationSummary1 = document.all ? document.all["ValidationSummary1"] :

504

Visual Basic 2010

document.getElementById("ValidationSummary1"); ValidationSummary1.headertext = "Attention :"; ValidationSummary1.showmessagebox = "True"; ValidationSummary1.showsummary = "False"; // --> </script>

Envoyer des e-mails avec une application web


Lenvoi dun message e-mail depuis une application web ASP.NET est vraiment lmentaire. Il suffit pour cela dutiliser la mthode System.Web.Mail.SmtpMail.Send():
System.Web.Mail.SmtpMail.Send(expditeur, destinataire, sujet, contenu)

Le message est envoy au format Texte brut. Nous allons maintenant voir comment envoyer des messages plus sophistiqus au format HTML. Si ncessaire, vous pourrez dfinir un ou plusieurs destinataires secondaires et attacher un ou plusieurs fichiers au message. Lancez la commande Nouveau/Site web dans le menu Fichier. Dans le volet gauche, choisissez Visual Basic sous Modles installs. Slectionnez le modle Site Web ASP.NET vide, donnez le nom Messages lapplication et validez. Insrez un nouvel lment Web Form lapplication. Ajoutez neuf Label, six TextBox, cinq RadioButton et un Button ce Web Form. Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant.
Contrle
Label1 Label1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 TextBox1

Proprit
Text Font/Bold Font/Size Text Text Text Text Text Text Text Text (ID)

Valeur
Envoi dun e-mail True
Large

Expditeur Destinataire Sujet Contenu Autres destinataires Fichier attach Priorit Format Exp

Chapitre 22


Proprit
(ID) (ID) (ID) TextMode (ID) (ID) (ID) (ID) (ID) (ID) (ID) Text Text Text Text Text Checked Checked Text

Applications web

505

Contrle
TextBox2 TextBox3 TextBox4 TextBox4 TextBox5 TextBox6 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton1 RadioButton2 RadioButton5 Button1

Valeur
Dest Sujet Contenu MultiLine AutresDestin Attachement PriorFaible PriorNormale PriorEleve TexteBrut HTML Faible Normale leve Texte Brut HTML True True Envoyer

Pour amliorer lagencement de ces contrles, vous allez insrer un tableau HTML deux colonnes et huit lignes sur la feuille. Dplacez-vous dans longlet HTML de la Bote outils et double-cliquez sur Table. Une table trois lignes et trois colonnes saffiche (voir Figure22.9).
Figure22.9 Un tableau HTML de trois colonnes sur trois lignes est insr sur la feuille.

Slectionnez la troisime colonne et appuyez sur Maj+Suppr pour la supprimer. Slectionnez une ligne et dupliquez-la autant de fois que ncessaire pour obtenir un tableau

506

Visual Basic 2010

huit lignes. Il ne vous reste plus qu dplacer les labels dans les colonnes de gauche et les contrles dans les colonnes de droite. Une fois cette opration effectue, procdez comme suit: 1. Alignez droite la colonne de gauche. Pour cela, slectionnez la colonne de gauche et affectez la valeur Right sa proprit Align. 2. Alignez gauche la colonne de droite. Pour cela, slectionnez la colonne de droite et affectez la valeur Left sa proprit Align. Pour terminer, cliquez sur un endroit inoccup de la feuille et lancez la commande Justifier > Centrer du menu Format. La feuille doit prsent ressembler la Figure22.10.
Figure22.10 Agencement des contrles sur la feuille.

Double-cliquez sur le bouton Envoyer et compltez la procdure Button1_Click() comme suit:


Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Email As New System.Net.Mail.MailMessage(Exp.Text, Dest.Text) Email.Subject = Sujet.Text Email.Body = Contenu.Text Dim data = New Net.Mail.Attachment(Attachement.Text) Email.Attachments.Add(data)

Chapitre 22


If AutresDestin.Text <> "" Then Dim bccAddress = New MailAddress(AutresDestin.Text) Email.Bcc.Add(bccAddress) End If

Applications web

507

If PriorFaible.Checked Then Email.Priority = MailPriority.Low If PriorNormale.Checked Then Email.Priority = MailPriority.Normal If PriorEleve.Checked Then Email.Priority = MailPriority.High If TexteBrut.Checked Then Email.IsBodyHtml = False Else Email.IsBodyHtml = True End If Dim mailClient As New System.Net.Mail.SmtpClient() Dim basicAuthenticationInfo As New System.Net.NetworkCredential ("Nom dutilisateur", "Mot de passe") mailClient.Host = "Serveur SMTP" mailClient.UseDefaultCredentials = False mailClient.Credentials = basicAuthenticationInfo mailClient.Send(Email) End Sub

La premire instruction dfinit lobjet Email de type System.Net.Mail.MailMessage. Cet objet sera utilis pour dfinir le message, ses attributs et finalement pour envoyer le message. Les deux arguments de la fonction MailMessage sont ladresse de lexpditeur et ladresse du destinataire:
Dim Email As New System.Net.Mail.MailMessage(Exp.Text, Dest.Text)

Le bloc dinstructions suivant dfinit le sujet et le contenu du message partir des zones de texte Sujet et Contenu:
Email.Subject = Sujet.Text Email.Body = Contenu.Text

Le bloc dinstructions suivant dfinit (sil existe) le fichier attach au message:


If Attachement.Text<>"" Then Dim data = New Net.Mail.Attachment(Attachement.Text) Email.Attachments.Add(data) End If

508

Visual Basic 2010

Si un destinataire est spcifi dans la zone de texte AutresDestin, le champ bccAddress est initialis:
If AutresDestin.Text <> "" Then Dim bccAddress = New MailAddress(AutresDestin.Text) Email.Bcc.Add(bccAddress) End If

Le bloc dinstructions suivant dfinit la priorit du message en fonction des boutons radio Faible, Normale et leve:
If PriorFaible.Checked Then Email.Priority = MailPriority.Low If PriorNormale.Checked Then Email.Priority = MailPriority.Normal If PriorEleve.Checked Then Email.Priority = MailPriority.High

Enfin, les boutons radio Texte brut et HTML sont examins de faon dfinir le type du message:
If TexteBrut.Checked Then Email.IsBodyHtml = False Else Email.IsBodyHtml = True End If

Toutes les donnes sont prtes lenvoi. Nous allons maintenant dfinir le client de messagerie utiliser. Dans un premier temps, nous dfinissons un objet mailClient de type SmtpClient:
Dim mailClient As New System.Net.Mail.SmtpClient()

Puis nous entrons le nom dutilisateur et le mot de passe du compte de messagerie utiliser:
Dim basicAuthenticationInfo As New System.Net.NetworkCredential ("Nom dutilisateur", "Mot de passe")

Le bloc dinstructions suivant dfinit le client SMTP utiliser et demande une identification classique:
mailClient.Host = "Serveur SMTP" mailClient.UseDefaultCredentials = False mailClient.Credentials = basicAuthenticationInfo

Si, par exemple, vous utilisez le fournisseur daccs, remplacez "Serveur SMTP" par "smtp. free.fr". La dernire instruction envoie le message laide de la mthode Send():
mailClient.Send(Email)

Chapitre 22

Applications web

509

Voici le listing complet de lapplication. Vous trouverez les fichiers correspondants dans le dossier Websites\Messages des sources de louvrage aprs leur installation.
Imports System.Net Imports system.Net.mail Partial Class _Default Inherits System.Web.UI.Page Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System. EventArgs) Handles Button1.Click Dim Email As New System.Net.Mail.MailMessage(Exp.Text, Dest.Text) Email.Subject = Sujet.Text Email.Body = Contenu.Text If Attachement.Text <> "" Then Dim data = New Net.Mail.Attachment(Attachement.Text) Email.Attachments.Add(data) End If If AutresDestin.Text <> "" Then Dim bccAddress = New MailAddress(AutresDestin.Text) Email.Bcc.Add(bccAddress) End If If PriorFaible.Checked Then Email.Priority = MailPriority.Low If PriorNormale.Checked Then Email.Priority = MailPriority.Normal If PriorEleve.Checked Then Email.Priority = MailPriority.High If TexteBrut.Checked Then Email.IsBodyHtml = False Else Email.IsBodyHtml = True End If

Dim mailClient As New System.Net.Mail.SmtpClient() Dim basicAuthenticationInfo As New System.Net.NetworkCredential ("lem.korp", "nn9dpyhd") mailClient.Host = "smtp.sfr.fr" mailClient.UseDefaultCredentials = False mailClient.Credentials = basicAuthenticationInfo mailClient.Send(Email) End Sub End Class

510

Visual Basic 2010

Info

Dans cet exemple, le hte SMTP utilis est SFR. Bien entendu, vous devez adapter cette information votre propre hte SMTP pour que le code fonctionne.

Vous pouvez maintenant tester lapplication en cliquant sur licne Dmarrer le dbogage. Il ne vous reste plus qu remplir les champs de la feuille et cliquer sur le bouton Envoyer (voir Figure22.11).
Figure22.11 La feuille Envoi dun e-mail, en mode Excution.

23
Annuaire de sites web
Ce chapitre va vous montrer comment raliser une application ASP.NET laide de Visual Basic2010 pour raliser un annuaire de sites web. Les donnes manipules proviennent de louvrage Annuaire des 10000 sites web francophones, publi aux ditions CampusPress. Pour faciliter leur accs, les sites ont t rpartis dans douze groupes reprsents par des listes droulantes la Figure23.1. Chaque liste donne accs un certain nombre de sites. Pour accder lun dentre eux, il suffit de le slectionner dans la liste correspondante.

512

Visual Basic 2010

Figure23.1 La page principale du projet 10000sites web.

Mise en place de lapplication


Pour raliser ce projet, nous allons crer un site web ASP.NET . Lancez la commande Nouveau/Site web dans le menu Fichier. Dans le volet gauche, choisissez Visual Basic sous Modles installs. Slectionnez le modle Site web ASP.NET, donnez le nom Annuaire au projet et cliquez sur OK. Vous allez maintenant implanter diffrents contrles sur la page web. Dveloppez lentre HTML dans la Bote outils et insrez un contrle Table. Cette action insre un tableau vierge de trois lignes et trois colonnes sur la page (voir Figure23.2).
Figure23.2 Un tableau vierge 3 3 a t insr sur la page.

Slectionnez une ligne du tableau, copiez-la dans le presse-papiers de Windows et dupliquez-la pour obtenir un tableau de 8 lignes sur trois colonnes (voir Figure23.3).
Figure23.3 Cinq lignes ont t ajoutes au tableau.

Chapitre 23

Annuaire de sites web

513

Ajoutez douze contrles Label (onglet Standard) et douze contrles DropdownList (onglet Standard) dans les cellules du tableau pour obtenir la mise en forme reprsente Figure23.4.
Figure23.4 Vingt-quatre contrles viennent dtre insrs.

En utilisant les poignes de tedimensionnement, donnez une largeur de 222 pixels chacune des colonnes du tableau. Modifiez ensuite les proprits des contrles comme suit:
Contrle
Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DropDownList1 DropDownList2 DropDownList3 DropDownList4 DropDownList5 DropDownList6

Proprit
Text Text Text Text Text Text Text Text Text Text Text Text (ID) (ID) (ID) (ID) (ID) (ID)

Valeur
Culture et arts Cyberculture conomie et finance ducation Emploi, services Informatique Loisirs Mdia, info Savoirs Vie politique et sociale Vie pratique Voyage et tourisme ddl1 ddl2 ddl3 ddl4 ddl5 ddl6

514

Visual Basic 2010

Contrle
DropDownList7 DropDownList8 DropDownList9 DropDownList10 DropDownList11 DropDownList12

Proprit
(ID) (ID) (ID) (ID) (ID) (ID)

Valeur
ddl7 ddl8 ddl9 ddl10 ddl11 ddl12

Dfinition des procdures de traitement


Vous allez maintenant dfinir le contenu des douze listes droulantes. Double-cliquez sur une partie inoccupe de la page web et compltez la procdure Page_Load() comme suit:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Initialisation des DropDownLists ddl1.Items.Add("Choisissez une entre") ddl1.Items.Add("Actualit, festivals") ddl1.Items.Add("Annuaires, moteurs, portails") ddl1.Items.Add("Architecture") ddl1.Items.Add("Arts cratifs, multimdia, comm") ddl1.Items.Add("Arts de la scne") ddl1.Items.Add("Arts(plastiques)") ddl1.Items.Add("Ateliers, clubs, coles") ddl1.Items.Add("Bande(dessine) : diteurs()") ddl1.Items.Add("Bande(dessine) : e(-zines)") ddl1.Items.Add("Bande dessine en ligne") ddl1.Items.Add("Bibliothques") ddl1.Items.Add("Cinma: actualit") ddl1.Items.Add("Cinma: annuaires") ddl1.Items.Add("Cinma : pour les pros") ddl1.Items.Add("Cinma: production, distribution") ddl1.Items.Add("Cinma : sites de films, dacteurs") ddl1.Items.Add("Cinma: sites(gnralistes)") ddl1.Items.Add("Cinma: vente") ddl1.Items.Add("Cirque, magie") ddl1.Items.Add("Danse") ddl1.Items.Add("Galeries(d) exposition") ddl1.Items.Add("Index, moteurs, annuaires")

Chapitre 23

Annuaire de sites web

515

ddl1.Items.Add("Littrature: actualit") ddl1.Items.Add("Littrature: annuaires, moteurs") ddl1.Items.Add("Littrature: diteurs") ddl1.Items.Add("Littrature : magazines, sites gnr.") ddl1.Items.Add("Littrature : salons, festivals") ddl1.Items.Add("Littrature: styles(littraires)") ddl1.Items.Add("Littrature: textes") ddl1.Items.Add("Littrature: vente") ddl1.Items.Add("Mode()") ddl1.Items.Add("Moteurs, annuaires") ddl1.Items.Add("Muses, sites de peintres") ddl1.Items.Add("Musique : apprendre la musique") ddl1.Items.Add("Musique: associations, coles") ddl1.Items.Add("Musique: chanteurs, musiciens, groupes") ddl1.Items.Add("Musique: concerts, festivals, opras") ddl1.Items.Add("Musique: genres(musicaux)") ddl1.Items.Add("Musique: MIDI, MP3, RealAudio") ddl1.Items.Add("Musique: moteurs, annuaires") ddl1.Items.Add("Musique: paroles, partitions, tablatures") ddl1.Items.Add("Musique: portails, magazines, actualit") ddl1.Items.Add("Musique : pour les pros") ddl1.Items.Add("Musique: vente()") ddl1.Items.Add("Organismes, divers") ddl1.Items.Add("Patrimoine()") ddl1.Items.Add("Photographie()") ddl1.Items.Add("Photo: expositions, galeries") ddl1.Items.Add("Photo: journaux, conseils") ddl1.Items.Add("Photo: photographes, agences, stc") ddl1.Items.Add("Photo : safaris et chasses photo") ddl1.Items.Add("Photo: vente()") ddl1.Items.Add("Religion()") ddl1.Items.Add("Vente()") ddl1.Items.Add("Vente de bandes dessines") ddl2.Items.Add("Choisissez une entre") ddl2.Items.Add("Actualit art, musique et culture") ddl2.Items.Add("Annuaires") ddl2.Items.Add("Fournisseurs daccs Internet") ddl2.Items.Add("Groupes de discussion, listes de diffusion") ddl2.Items.Add("Hbergeurs") ddl2.Items.Add("Jeux en ligne") ddl2.Items.Add("Jeux en ligne : clans") ddl2.Items.Add("Sites de communauts") ddl2.Items.Add("Site de journaux")

516

Visual Basic 2010

ddl2.Items.Add("Webcams, netcams") ddl2.Items.Add("Webzines") ddl3.Items.Add("Choisissez une entre") ddl3.Items.Add("Actualits et gnralits") ddl3.Items.Add("Assurance") ddl3.Items.Add("Banque et crdit") ddl3.Items.Add("Bourse") ddl3.Items.Add("Euro") ddl3.Items.Add("Institutions et organismes") ddl3.Items.Add("Portails") ddl3.Items.Add("Webzines, sites de magazines ") ddl4.Items.Add("Choisissez une entre") ddl4.Items.Add("Documentation et orientation") ddl4.Items.Add("Juniors") ddl4.Items.Add("Organismes de formation, coles") ddl4.Items.Add("Sites pour enseignants") ddl4.Items.Add("Sites pour tudiants, lycens") ddl4.Items.Add("Soutien scolaire ") ddl5.Items.Add("Choisissez une entre") ddl5.Items.Add("Annuaires dentreprises, portails, moteurs") ddl5.Items.Add("Artisans") ddl5.Items.Add("Associations") ddl5.Items.Add("Banques de CV, aide la cration de CV") ddl5.Items.Add("Cabinets de recrutement") ddl5.Items.Add("Cration dentreprise, dassociation") ddl5.Items.Add("Emploi ltranger") ddl5.Items.Add("Entreprises") ddl5.Items.Add("Formation professionnelle") ddl5.Items.Add("Intrim") ddl5.Items.Add("Petites annonces") ddl5.Items.Add("Portails de professions") ddl5.Items.Add("Restauration") ddl5.Items.Add("Services publics") ddl5.Items.Add("Sites dannonces, banques de CV") ddl5.Items.Add("Socits de services") ddl5.Items.Add("Tltravail et travailleurs indpendants") ddl6.Items.Add("Choisissez une entre") ddl6.Items.Add("Actualit, presse, livres, manifestations") ddl6.Items.Add("Aide, astuces, didacticiels, clubs") ddl6.Items.Add("Amliorer, bricoler le PC")

Chapitre 23

Annuaire de sites web

517

ddl6.Items.Add("Divers") ddl6.Items.Add("Emulation") ddl6.Items.Add("Graphisme, 3D") ddl6.Items.Add("Gratuit") ddl6.Items.Add("Internet, cration de sites") ddl6.Items.Add("Jeux et consoles") ddl6.Items.Add("Jeux et consoles : tlchargement gratuit") ddl6.Items.Add("Jeux et consoles : vente") ddl6.Items.Add("Langages Internet") ddl6.Items.Add("Logiciels") ddl6.Items.Add("Matriel") ddl6.Items.Add("Matriel : vente") ddl6.Items.Add("Musique") ddl6.Items.Add("PDA, calculatrices, ordinateurs de poche") ddl6.Items.Add("Photos, cliparts") ddl6.Items.Add("Programmation") ddl6.Items.Add("Scurit") ddl6.Items.Add("Sharewares, freewares, logiciels gratuits") ddl6.Items.Add("Surf rmunr") ddl6.Items.Add("Systmes") ddl6.Items.Add("Wap, mobiles") ddl7.Items.Add("Choisissez une entre") ddl7.Items.Add("Auto, moto, vlo") ddl7.Items.Add("Aviation") ddl7.Items.Add("Bricolage") ddl7.Items.Add("Chasse et pche") ddl7.Items.Add("Collections, ftes et costumes") ddl7.Items.Add("Coquin, rencontre, amour, mariage") ddl7.Items.Add("Gastronomie") ddl7.Items.Add("Gastronomie : alimentation bio") ddl7.Items.Add("Gastronomie : restaurants, bars") ddl7.Items.Add("Gastronomie : vins et boissons") ddl7.Items.Add("Glisse") ddl7.Items.Add("Hobby") ddl7.Items.Add("Humour") ddl7.Items.Add("Jardinage") ddl7.Items.Add("Jeux, parcs dattractions, ftes") ddl7.Items.Add("Photo") ddl7.Items.Add("Randonne, montagne, ski") ddl7.Items.Add("Sports") ddl7.Items.Add("Technologie") ddl8.Items.Add("Choisissez une entre")

518

Visual Basic 2010

ddl8.Items.Add("Agences de presse") ddl8.Items.Add("Conseil, guides de march") ddl8.Items.Add("DVD") ddl8.Items.Add("Journaux&amp;mag en ligne : actualit") ddl8.Items.Add("Journaux&amp;mag en ligne : culturel") ddl8.Items.Add("Journaux&amp;mag en ligne : divers") ddl8.Items.Add("Journaux&amp;mag en ligne : enfants") ddl8.Items.Add("Journaux&amp;mag en ligne : informatique") ddl8.Items.Add("Journaux&amp;mag en ligne : musique") ddl8.Items.Add("Journaux&amp;mag en ligne : sport") ddl8.Items.Add("Publicit") ddl8.Items.Add("Radioamateurs") ddl8.Items.Add("Radios") ddl8.Items.Add("Sites gnraux, sites portails") ddl8.Items.Add("Tlvision, vido") ddl8.Items.Add("Veille technologique") ddl8.Items.Add("Wap") ddl8.Items.Add("WebTV") ddl9.Items.Add("Choisissez une entre") ddl9.Items.Add("Archologie, minralogie") ddl9.Items.Add("Arme, police, gendarmerie") ddl9.Items.Add("Dictionnaires, glossaires, lexiques") ddl9.Items.Add("Encyclopdies") ddl9.Items.Add("Espace, astronomie, aviation") ddl9.Items.Add("Gnalogie") ddl9.Items.Add("Gnralits et actualits scientifiques") ddl9.Items.Add("Gographie, histoire") ddl9.Items.Add("Langues") ddl9.Items.Add("Mathmatiques et sciences physiques") ddl9.Items.Add("Mers et ocans") ddl9.Items.Add("Nature, animaux, protection des animaux") ddl9.Items.Add("Recherche") ddl9.Items.Add("Sciences (vie, terre, environnement)") ddl9.Items.Add("Sciences humaines et sociales") ddl9.Items.Add("Sciences mdicales") ddl9.Items.Add("Splologie") ddl9.Items.Add("Traduction") ddl10.Items.Add("Choisissez une entre") ddl10.Items.Add("Etudes et statistiques") ddl10.Items.Add("Forums, mouvements, dbats") ddl10.Items.Add("Francophonie, Europe, culture franaise") ddl10.Items.Add("Humanitaire")

Chapitre 23

Annuaire de sites web

519

ddl10.Items.Add("Ministres, gouvernements, lois") ddl10.Items.Add("Pouvoirs publics, administrations") ddl10.Items.Add("Sites de partis") ddl11.Items.Add("Choisissez une entre") ddl11.Items.Add("Achats en ligne") ddl11.Items.Add("Acheter moins cher") ddl11.Items.Add("Ados, jeunes") ddl11.Items.Add("Alcool") ddl11.Items.Add("Animaux de compagnie") ddl11.Items.Add("Annuaires") ddl11.Items.Add("Aquariums") ddl11.Items.Add("Auto") ddl11.Items.Add("Beaut") ddl11.Items.Add("Bijoux") ddl11.Items.Add("Brocantes") ddl11.Items.Add("Chats, forums") ddl11.Items.Add("Chaussures") ddl11.Items.Add("Comparateurs de prix") ddl11.Items.Add("Cuisine, recettes") ddl11.Items.Add("Dmarches et droits") ddl11.Items.Add("Drogues") ddl11.Items.Add("E-cartes") ddl11.Items.Add("E-mails gratuits, acheminement e-mail") ddl11.Items.Add("Enchres") ddl11.Items.Add("Extra-terrestres, inexpliqu, paranormal") ddl11.Items.Add("Faire des conomies") ddl11.Items.Add("Famille") ddl11.Items.Add("Famille : guide") ddl11.Items.Add("Famille : vente") ddl11.Items.Add("Fminin : services") ddl11.Items.Add("Guides") ddl11.Items.Add("Handicaps") ddl11.Items.Add("Heroic fantasy, fes, sorcires") ddl11.Items.Add("Horoscopes, astrologie") ddl11.Items.Add("Immobilier") ddl11.Items.Add("Maison, dco") ddl11.Items.Add("Mto") ddl11.Items.Add("Moteurs de recherche") ddl11.Items.Add("Moto") ddl11.Items.Add("Nourriture bio") ddl11.Items.Add("Petites annonces") ddl11.Items.Add("Portails, guides") ddl11.Items.Add("Sant")

520

Visual Basic 2010

ddl11.Items.Add("Seniors") ddl11.Items.Add("Services : trafic, rparation de lunettes") ddl11.Items.Add("Sortir") ddl11.Items.Add("Tabac") ddl11.Items.Add("Tatouage, piercing") ddl11.Items.Add("Vtements, mode") ddl12.Items.Add("Choisissez une entre") ddl12.Items.Add("Ambassades") ddl12.Items.Add("Annuaires, moteurs de recherche") ddl12.Items.Add("Cartes") ddl12.Items.Add("Hbergement") ddl12.Items.Add("Monuments, sites") ddl12.Items.Add("Portails et sites gnraux, annuaires") ddl12.Items.Add("Ressources et documentation") ddl12.Items.Add("Sant") ddl12.Items.Add("Tour oprateurs, agences, promotions") ddl12.Items.Add("Transports") ddl12.Items.Add("Visites virtuelles : tranger") ddl12.Items.Add("Visites virtuelles : France") End Sub

Slectionnez la premire liste droulante, cliquez sur licne vnements dans la fentre des Proprits et double-cliquez sur lvnement SelectedIndexChanged. Modifiez la procdure ddl1_SelectedIndexChanged() comme suit:
Protected Sub ddl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl1.SelectedIndexChanged Dim i As Integer = ddl1.SelectedIndex Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub

La premire instruction dfinit la variable Integer I et lui affecte une valeur correspondant au numro de lentre slectionne dans la liste:
Dim i As Integer = ddl1.SelectedIndex

Linstruction suivante convertit cet index en une chane:


Dim s As String = Str(i)

Lespace automatiquement ajout gauche de la chane est ensuite enlev:


s = Right(s, Len(s) - 1)

Chapitre 23

Annuaire de sites web

521

Puis ladresse de la page accder est calcule:


s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm"

Info

Les diffrentes pages accdes se trouvent dans le rpertoire web http://lem. korp.free.fr/annuaire/data.

Il ne reste plus qu afficher la page dont ladresse se trouve dans la variable String s laide de la fonction Response.Write():
Response.Write("<body><script>window.open(" + s + ")</script></body>")

Le code correspondant un changement dans les onze autres listes droulantes est sensiblement identique:
Protected Sub ddl2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl2.SelectedIndexChanged Dim i As Integer = ddl2.SelectedIndex + 55 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl3_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl3.SelectedIndexChanged Dim i As Integer = ddl3.SelectedIndex + 66 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl4_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl4.SelectedIndexChanged Dim i As Integer = ddl4.SelectedIndex + 74 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl5_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl5.SelectedIndexChanged Dim i As Integer = ddl5.SelectedIndex + 80

522

Visual Basic 2010

Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl6_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl6.SelectedIndexChanged Dim i As Integer = ddl6.SelectedIndex + 97 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl7_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl7.SelectedIndexChanged Dim i As Integer = ddl7.SelectedIndex + 121 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl8_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl8.SelectedIndexChanged Dim i As Integer = ddl8.SelectedIndex + 140 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl9_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl9.SelectedIndexChanged Dim i As Integer = ddl9.SelectedIndex + 158 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl10_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl10.SelectedIndexChanged Dim i As Integer = ddl10.SelectedIndex + 178 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub

Chapitre 23

Annuaire de sites web

523

Protected Sub ddl11_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl11.SelectedIndexChanged Dim i As Integer = ddl11.SelectedIndex + 185 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub Protected Sub ddl12_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl12.SelectedIndexChanged Dim i As Integer = ddl12.SelectedIndex + 228 Dim s As String = Str(i) s = Right(s, Len(s) - 1) s = "http://lem.korp.free.fr/annuaire/data/" + s + ".htm" Response.Write("<body><script>window.open(" + s + ")</script></body>") End Sub

Pour complter cette page, vous allez inclure une image cliquable (image map). Pour cela, il suffit dinsrer un contrle ImageMap (onglet Standard) sur la page web. Limage utiliser se trouve ladresse http://lem.korp.free.fr/annuaire/titre.jpg. Affectez cette adresse la proprit ImageUrl du contrle ImageMap. Si vous avez suivi nos conseils, lenvironnement de dveloppement devrait maintenant ressemble la Figure23.5.
Figure23.5 Limage Map a t insre sur la page.

524

Visual Basic 2010

Vous allez maintenant affecter trois zones cliquables aux libells "En savoir plus", "Joindre le Webmaster" et "Proposer un site". Pour ce faire, cliquez sur la proprit HotSpots. Un bouton contenant trois points de suspension apparat en regard de la proprit HotSpots. Cliquez sur ce bouton. Une bote de dialogue intitule diteur de collections HotSpot saffiche (voir Figure23.6).
Figure23.6 Cet diteur permet de dfinir des zones cliquables.

Cliquez sur la flche situe dans la partie droite du bouton Ajouter et slectionnez RectangleHotSpot. Recommencez deux fois pour crer trois zones cliquables rectangulaires. Modifiez les proprits de ces zones cliquables comme suit:
Membre
RectangleHotSpot0 RectangleHotSpot0 RectangleHotSpot0 RectangleHotSpot0 RectangleHotSpot1 RectangleHotSpot1 RectangleHotSpot1 RectangleHotSpot1 RectangleHotSpot2

Proprit
Bottom Left Right Top Bottom Left Right Top Bottom

Valeur
144 25 144 124 144 171 340 119 144

Chapitre 23


Proprit
Left Right Top

Annuaire de sites web

525

Membre
RectangleHotSpot2 RectangleHotSpot2 RectangleHotSpot2

Valeur
366 500 122

Lancez lapplication en cliquant sur licne Dmarrer le dbogage de la barre doutils Standard et vrifiez que les trois zones textuelles sont cliquables (voir Figure23.7).
Figure23.7 Les trois zones textuelles sont bien cliquables.

Pour ragir aux clics des utilisateurs, vous pouvez:

afficher une page de votre choix; gnrer un vnement ImageMap.Click.

Pour afficher une page web lorsque lutilisateur clique sur une zone HotSpot, affectez la valeur Navigate la proprit HotSpotMode et lURL cible la proprit NavigateUrl du membre HotSpot correspondant (voir Figure23.8). Pour gnrer un vnement ImageMap.Click, affectez la valeur PostBack la proprit HotSpotMode et une valeur String quelconque la proprit PostBackValue du membre HotSpot correspondant (voir Figure23.9).

526

Visual Basic 2010

Figure23.8 Dfinition de lURL cible pour le membre RectangleHotspot0.

Figure23.9 Dfinition de la valeur renvoyer lorsque le membre RectangleHotspot0 est cliqu.

Affectez les valeurs du tableau suivant aux trois HotSpots:


Membre
RectangleHotSpot0 RectangleHotSpot1 RectangleHotSpot2 RectangleHotSpot0 RectangleHotSpot1 RectangleHotSpot2

Proprit
HotSpotMode HotSpotMode HotSpotMode PostBackValue PostBackValue PostBackValue

Valeur
PostBack PostBack PostBack 0 1 2

Chapitre 23

Annuaire de sites web

527

Basculez sur lditeur de code. Slectionnez ImageMap1 dans la liste droulante Nom de la classe et Click dans la liste droulante Nom de la mthode puis compltez la procdure ImageMap1_Click() comme suit:
Protected Sub ImageMap1_Click(ByVal sender As Object, ByVal e As System.Web. UI.WebControls.ImageMapEventArgs) Handles ImageMap1.Click If e.PostBackValue = "0" Then Response.Write("<body><script>window. open(http://lem.korp.free.fr/annuaire/data/plus.htm)</script></body>") If e.PostBackValue = "1" Then Response.Write("<body><script>window. open(mailto:lem.korp@free.fr)</script></body>") If e.PostBackValue = "2" Then Response.Write("<body><script>window. open(http://lem.korp.free.fr/annuaire/data/nouvsite.htm)</script></body>") End Sub

Si la valeur renvoye par le contrle HotSpot cliqu est "0", cela signifie que lutilisateur a cliqu sur "En savoir plus". Dans ce cas, la page http://lem.korp.free.fr/annuaire/data/ plus.htm saffiche dans une fentre annexe:
If e.PostBackValue = "0" Then Response.Write("<body><script>window.open (http://lem.korp.free.fr/annuaire/data/plus.htm)</script></body>")

Si la valeur renvoye par le contrle HotSpot cliqu est "1", cela signifie que lutilisateur a cliqu sur "Joindre le Webmaster". Dans ce cas, la commande mailto: provoque louverture dune fentre de composition de message:
If e.PostBackValue = "1" Then Response.Write("<body><script>window. open(mailto:lem.korp@free.fr)</script></body>")

Enfin, si la valeur renvoye par le contrle HotSpot cliqu est "0", cela signifie que lutilisateur a cliqu sur "Proposer un site". Dans ce cas, la page http://lem.korp.free.fr/annuaire/ data/nouvsite.htm saffiche dans une fentre annexe:
If e.PostBackValue = "2" Then Response.Write("<body><script>window.open(http:// lem.korp.free.fr/annuaire/data/nouvsite.htm)</script></body>")

Le programme est totalement oprationnel. Vous pouvez lexcuter en appuyant sur la touche F5. Tous les fichiers correspondants au projet Annuaire se trouvent dans le dossier Websites\Annuaire des sources de louvrage. Pour mettre le site en ligne, lancez la commande Publier le site web dans le menu Gnrer. Cette commande affiche la bote de dialogue reprsente Figure23.10.

528

Visual Basic 2010

Figure23.10 Bote de dialogue de publication du site web.

Cliquez sur le bouton contenant trois points de suspension, droite de la zone Emplacement cible. Une bote de dialogue intitule Publier le site web saffiche. Laccs votre site web se fait certainement en mode FTP. Cliquez sur licne Site FTP et remplissez les zones de texte ncessaires (voir Figure23.11).
Figure23.11 Paramtres daccs au serveur web.

Chapitre 23

Annuaire de sites web

529

Il vous suffit maintenant de cliquer sur Ouvrir pour publier votre site web.Cette application est entirement oprationnelle, mais sa maintenance laisse dsirer. En effet, tous les jours, des sites disparaissent ou changent dadresse. Il est donc ncessaire deffectuer des modifications frquentes dans les 240fichiers HTML. Ces modifications sont pnibles, car il faut chaque fois: 1. Identifier le fichier modifier. 2. Rapatrier ce fichier sur lordinateur local. 3. Effectuer la modification et ventuellement rorganiser la liste pour que les sites apparaissent dans un ordre alphabtique. 4. Renvoyer le fichier modifi sur le site web qui lhberge. Pour faciliter la maintenance du site, nous allons transformer les 240 fichiers HTML en une base de donnes Access et utiliser un service web pour retrouver les enregistrements qui correspondent la slection de lutilisateur.

Conversion des fichiers HTML en donnes


Voici laspect dun des 240 fichiers de donnes HTML. Ce fichier contient les informations qui saffichent lorsque lentre Agences de presse est slectionne dans la liste droulante Mdia, info.
<HTML> <BODY> <H2>Mdia, info / Agences de presse</H2> <B><A href="http://www.agencesdepresse.fr">FFAP</A></B> <I> www.agencesdepresse.fr</I> <BR> Site de la Fdration franaise des agences de presse: prsentation et annuaire.<P> <B><A href="http://www.map.co.ma">Maghreb, presse en ligne</A></B> <I> www.map.co.ma</I> <BR> Site de lAgence marocaine de presse: prsentation, services et publications, actualits, presse, synthses et analyses. <P> </BODY> </HTML>

530

Visual Basic 2010

Pour tous les sites rfrencs dans cette page, il est ncessaire dextraire les informations suivantes:

mdia, info et agences de presse entre les marqueurs <H2> et </H2>; signet entre les marqueurs <A> et </A>; URL entre les signets <I> et </I>; texte entre les marqueurs <BR> et <P>.

Ces informations feront lobjet de cinq champs dans la base de donnes MySQL. Pour les extraire, le plus simple consiste utiliser une petite application Visual Basic. Aprs avoir copi/coll les 240 fichiers HTML dans un seul fichier texte, un nouveau projet reposant sur le modle Application Windows Forms a t cr et la procdure Form1_Load() de ce projet a t complte comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try FileOpen(1, "c:\data.txt", OpenMode.Input) FileOpen(2, "c:\champs.txt", OpenMode.Input) While Not EOF(1) ligne = LineInput(1) p = InStr(ligne, "<H2>") If p <> 0 Then Print #2, Mid(ligne, p + 4, Len(ligne) - p - 8) p = InStr(ligne, "<A") If p <> 0 Then p2 = InStr(p, ligne, ">") Print #2, Mid(ligne, p + 9, p2 - p - 10) p3 = InStr(p2, ligne, "</A") Print #2, Mid(ligne, p2 + 1, p3 - p2 - 1) End If p = InStr(ligne, "<BR>") If p <> 0 Then ligne = LineInput(1) Print #2, Mid(ligne, 1, Len(ligne) - 3) End If End While Catch Finally FileClose(1) FileClose(2) End Try End Sub

Chapitre 23

Annuaire de sites web

531

Cette procdure est lmentaire. Elle se contente de dcrire toutes les lignes du fichier contenant lassemblage des fichiers HTML (data.txt) et dextraire les informations non HTML inclure dans la base de donnes. savoir le groupe, le sous-groupe, ladresse URL, le titre du site et le commentaire. Voici, titre dexemple, un extrait du fichier data.txt:
<HTML><BODY><H2>Vie pratique / Petites annonces</H2> <B><A href="http://annonces.gulliver.com">@nnonces gratuites</A></B><I> annonces. gulliver.com</I><BR> Site de petites annonces gratuites pour les particuliers.<P> <B><A href="http://motocasion.tm.fr">100% motos doccasion</A></B><I> motocasion. tm.fr</I><BR> Tous les mois en kiosque, Motoccasion est le numro un dans loffre de motos doccasion en France. Sur le site, retrouvez annonces et photos.<P> <B><A href="http://www.123b.com">1 2 3 business</A></B><I> www.123b.com</I><BR> Site de petites annonces classes: immobilier, vhicules, antiquits, uvres dart, dcoration, avions et bateaux.<P> <B><A href="http://www.123paf.com">1 2 3 paf</A></B><I> www.123paf.com</I><BR> Petites annonces francophones classes: affaires, animaux et plantes, arts et dco, lectronique, emplois, immobilier, informatique, tourisme, etc.<P> <B><A href="http://fr.123immo.com">1 2 3 immo</A></B><I> fr.123immo.com</I><BR> Ce portail de limmobilier vous permet de louer un appartement, une maison ou un studio, de vendre ou dacheter un logement en France.<P> <B><A href="http://www.eucalyptech.com">A comme annonces</A></B><I> www.eucalyptech. com</I><BR> Service gratuit de petites annonces francophones: animaux, automobiles, bonnes affaires, emplois, immobilier, rencontres, etc.<P> <B><A href="http://www.a2c-bateaux.com">A2C, cap dAgde</A></B><I> www.a2c-bateaux. com</I><BR> Cette socit est spcialise dans la vente de bateaux doccasion en Mditerrane, de Marseille Barcelone.<P>

Et voici le fichier champs.txt gnr par le programme:


Vie pratique Petites annonces http://annonces.gulliver.com @nnonces gratuites Site de petites annonces gratuites pour les particuliers. http://motocasion.tm.fr 100% motos doccasion Tous les mois en kiosque, Motoccasion est le numro un dans loffre de motos doccasion en France. Sur le site, retrouvez annonces et photos.

532

Visual Basic 2010

http://www.123b.com 1 2 3 business Site de petites annonces classes: immobilier, vhicules, antiquits, uvres dart, dcoration, avions et bateaux. http://www.123paf.com 1 2 3 paf Petites annonces francophones classes: affaires, animaux et plantes, arts et dco, lectronique, emplois, immobilier, informatique, tourisme, etc. http://fr.123immo.com 1 2 3 immo Ce portail de limmobilier vous permet de louer un appartement, une maison ou un studio, de vendre ou dacheter un logement en France. http://www.eucalyptech.com A comme annonces Service gratuit de petites annonces francophones: animaux, automobiles, bonnes affaires, emplois, immobilier, rencontres, etc. http://www.a2c-bateaux.com A2C, cap dAgde Cette socit est spcialise dans la vente de bateaux doccasion en Mditerrane, de Marseille Barcelone.

Aprs quelques remaniements, les donnes sont places dans une feuille Excel et stockes sur le disque dans un fichier XLS (voir Figure23.12).
Figure23.12 Un extrait du fichier de donnes au format Excel.

Ces donnes sont ensuite intgres dans une base de donnes Access (voir Figure23.13).

Chapitre 23

Annuaire de sites web

533

Figure23.13 Les donnes sont intgres dans la table data.

Dfinition du service web


Pour accder ces donnes, nous allons dfinir un service web. Lancez la commande Nouveau/Site web dans le menu Fichier. Dans la liste droulante Framework, choisissez .NET Framework 3.5. Dans le volet gauche, choisissez Visual Basic sous Modles installs. Slectionnez le modle Service web ASP.NET, donnez le nom Service3 au nouveau service Web et validez en cliquant sur OK. Ajoutez les clauses Imports suivantes en tte de listing:
Imports System.Data Imports System.Data.OleDb

La clause <webservice> (devant le mot-cl Public) indique que la classe Service1 sera utilise comme service web:
<WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService

534

Visual Basic 2010

Info

Lorsque, par la suite, le service sera implant sur un serveur web, vous devrez prciser son nom de domaine la suite du mot-cl NameSpace.

Dfinissez les variables utilises par le service web:


Dim Dim Dim Dim Connexion As String ConnexionOLE As OleDbConnection = New OleDbConnection() da As OleDbDataAdapter ds As DataSet

Supprimez la fonction HelloWorld(), gnre automatiquement par Visual Studio, et remplacez-la par la fonction AfficheSel() suivante:
<WebMethod()> Public Function AfficheSel(ByVal demande As String) As DataSet Dim st As String = "" Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\annuaire.mdb" ConnexionOLE.ConnectionString = Connexion st = "Select * from data where [SousCar]=" & demande & "" da = New OleDbDataAdapter(st, ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function

Cette fonction sera exploite sur le Web (<WebMethod()>). Elle demande un argument de type String (la valeur slectionne dans une liste droulante) et renvoie un DataSet:
<WebMethod()> Public Function AfficheSel(ByVal demande As String) As DataSet

Les deux lignes suivantes tablissent une connexion avec la base de donnes. Ici, il sagit de la base Access c:\data\annuaire.mdb:
Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test\annuaire.mdb" ConnexionOLE.ConnectionString = Connexion

Pour afficher les enregistrements de la table data dont le champ SousCat est gal au paramtre pass la WebMethod, nous allons utiliser la requte SQL suivante:
st = "Select * from data where [SousCat]=" & demande & ""

Linterfaage avec la table data se fera par lintermdiaire dun objet OleDbDataAdapter:
da = New OleDbDataAdapter(st, ConnexionOLE)

Les deux instructions suivantes initialisent le DataSet ds avec lOleDbDataAdapter da:


ds = New DataSet() da.Fill(ds, "mytable")

Chapitre 23

Annuaire de sites web

535

Enfin, lobjet DataSet ds est retourn par la fonction:


Return ds

Voici le code complet de la classe Service3:


Imports Imports Imports Imports Imports System.Web System.Web.Services System.Web.Services.Protocols System.Data System.Data.OleDb

<WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService Dim Dim Dim Dim Connexion As String ConnexionOLE As OleDbConnection = New OleDbConnection() da As OleDbDataAdapter ds As DataSet

<WebMethod()> Public Function AfficheSel(ByVal demande As String) As DataSet Dim st As String = "" Connexion = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\data\annuaire.mdb" ConnexionOLE.ConnectionString = Connexion st = "Select * from data where [SousCat]=" & demande & "" da = New OleDbDataAdapter(st, ConnexionOLE) ds = New DataSet() da.Fill(ds, "mytable") Return ds End Function End Class End Class

Appuyez sur la touche F5. La fonction AfficheSel() peut tre teste (voir Figure23.14). Cliquez sur le lien AfficheSel, entrez une valeur pour le paramtre (ici par exemple, nous allons entrer la valeur Actualit, festivals) puis cliquez sur Appeler. Le rsultat de la fonction AfficheTous() apparat sous une forme XML (voir Figure23.15).

536

Visual Basic 2010

Figure23.14 Cette page permet de tester la fonction AfficheSel().

Figure23.15 Rsultat de la fonction AfficheSel().

Dans la barre de notification, une icne intitule Serveur de dveloppement ASP.NET indique que le service web est en cours dexcution. Double-cliquez sur cette icne pour afficher une bote de dialogue analogue la Figure23.16.

Chapitre 23

Annuaire de sites web

537

Figure23.16 Dans cet exemple, le service web est accessible sur le port 51864.

Ne terminez pas lexcution du service. Nous en aurons besoin dans la section suivante.

Utilisation du service web


Vous allez maintenant dfinir un projet qui exploite le service web dfini dans la section prcdente. Dupliquez le site web WebSites\Annuaire en WebSites\AnnuaireBD. Ouvrez site web AnnuaireBD. Cliquez du bouton droit sur lentre C:\\AnnuaireBD dans lExplorateur de solutions et choisissez Ajouter une rfrence web dans le menu surgissant. Saisissez ladresse correspondant au service web en cours de dbogage dans la zone URL (voir Figure23.17).
Figure23.17 Accs au service web sur le port 51864.

538

Visual Basic 2010

Info

Pour connatre le port utilis par le service en cours de dbogage, il suffit de pointer licne Serveur de dveloppement ASP.NET dans la barre de notification.

Cliquez sur le bouton Aller . Aprs quelques instants, la bote de dialogue Ajouter une rfrence web se prsente comme la Figure23.18.
Figure23.18 Le service Service3 est sur le point dtre intgr au projet web.

Cliquez sur Ajouter une rfrence. Le service web Service3 est maintenant rfrenc dans le projet. Vous pouvez donc utiliser sa mthode AfficheSel() (voir Figure23.19).
Figure23.19 Le service web Service3 est rfrenc dans le projet.

Chapitre 23

Annuaire de sites web

539

Ajoutez un contrle GridView dans la partie infrieure de la page (ce contrle se trouve sous longlet Donnes de la Bote outils). La fentre de conception se prsente comme la Figure23.20.
Figure23.20 Le contrle GridView a t plac sur la page.

Nous allons maintenant modifier le contenu des procdures ddl1_SelectedIndexChanged() ddl12_SelectedIndexChanged() pour interroger le service web. Voici, titre dexemple le contenu de la procdure ddl1_SelectedIndexChanged():
Protected Sub ddl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl1.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub

La premire instruction place la valeur slectionne par lutilisateur dans lobjet String s:
Dim s As String = ddl1.Text

Lobjet localhost.Service objds est alors dfini pour interfacer le service web:
Dim objds As New localhost.Service

La valeur renvoye par le service web est un Dataset. Pour le mmoriser, nous dfinissons lobjet Dataset ds:
Dim ds As DataSet

540

Visual Basic 2010

La fonction AfficheSel() du service web est alors invoque. Lobjet renvoy est stock dans le Dataset ds:
ds = objds.AfficheSel(s)

Il ne reste plus qu lier le contrle GridView1 avec le Dataset ds:


GridView1.DataSource = ds

Et demander sa mise jour:


GridView1.DataBind()

Les procdures ddl2_SelectedIndexChanged() contiennent des instructions similaires.

ddl12_SelectedIndexChanged()

La Figure 23.21 reprsente le contenu du DataGrid renvoy par le service web lorsque lutilisateur slectionne la valeur "Actualit, festivals" dans la liste droulante Culture et arts.
Figure23.21 Un exemple daffichage renvoy par la mthode AfficheSel().

Voici le listing complet du site web AnnuaireBD. Les fichiers correspondants se trouvent dans le dossier WebSites\AnnuaireBD des sources de louvrage.
Imports system.data Partial Class _Default

Chapitre 23


Inherits System.Web.UI.Page

Annuaire de sites web

541

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Initialisation des DropDownLists ddl1.Items.Add("Choisissez une entre") ddl1.Items.Add("Actualit, festivals") ddl1.Items.Add("Annuaires, moteurs, portails") ddl1.Items.Add("Architecture") ddl1.Items.Add("Arts cratifs, multimdia, comm") ddl1.Items.Add("Arts de la scne") ddl1.Items.Add("Arts(plastiques)") ddl1.Items.Add("Ateliers, clubs, coles") ddl1.Items.Add("Bande(dessine) : diteurs()") ddl1.Items.Add("Bande(dessine) : e(-zines)") ddl1.Items.Add("Bande dessine en ligne") ddl1.Items.Add("Bibliothques") ddl1.Items.Add("Cinma : actualit") ddl1.Items.Add("Cinma : annuaires") ddl1.Items.Add("Cinma : pour les pros") ddl1.Items.Add("Cinma : production, distribution") ddl1.Items.Add("Cinma : sites de films, dacteurs") ddl1.Items.Add("Cinma : sites(gnralistes)") ddl1.Items.Add("Cinma : vente") ddl1.Items.Add("Cirque, magie") ddl1.Items.Add("Danse") ddl1.Items.Add("Galeries(d) exposition") ddl1.Items.Add("Index, moteurs, annuaires") ddl1.Items.Add("Littrature : actualit") ddl1.Items.Add("Littrature : annuaires, moteurs") ddl1.Items.Add("Littrature : diteurs") ddl1.Items.Add("Littrature : magazines, sites gnr.") ddl1.Items.Add("Littrature : salons, festivals") ddl1.Items.Add("Littrature : styles(littraires)") ddl1.Items.Add("Littrature : textes") ddl1.Items.Add("Littrature : vente") ddl1.Items.Add("Mode()") ddl1.Items.Add("Moteurs, annuaires") ddl1.Items.Add("Muses, sites de peintres") ddl1.Items.Add("Musique : apprendre la musique") ddl1.Items.Add("Musique : associations, coles") ddl1.Items.Add("Musique : chanteurs, musiciens, groupes") ddl1.Items.Add("Musique : concerts, festivals, opras")

542

Visual Basic 2010

ddl1.Items.Add("Musique : genres(musicaux)") ddl1.Items.Add("Musique : MIDI, MP3, RealAudio") ddl1.Items.Add("Musique : moteurs, annuaires") ddl1.Items.Add("Musique : paroles, partitions, tablatures") ddl1.Items.Add("Musique : portails, magazines, actualit") ddl1.Items.Add("Musique : pour les pros") ddl1.Items.Add("Musique : vente()") ddl1.Items.Add("Organismes, divers") ddl1.Items.Add("Patrimoine()") ddl1.Items.Add("Photographie()") ddl1.Items.Add("Photo : expositions, galeries") ddl1.Items.Add("Photo : journaux, conseils") ddl1.Items.Add("Photo : photographes, agences, stc") ddl1.Items.Add("Photo: safaris et chasses photo") ddl1.Items.Add("Photo : vente()") ddl1.Items.Add("Religion()") ddl1.Items.Add("Vente()") ddl1.Items.Add("Vente de bandes dessines") ddl2.Items.Add("Choisissez une entre") ddl2.Items.Add("Actualit art, musique et culture") ddl2.Items.Add("Annuaires") ddl2.Items.Add("Fournisseurs daccs Internet") ddl2.Items.Add("Groupes de discussion, listes de diffusion") ddl2.Items.Add("Hbergeurs") ddl2.Items.Add("Jeux en ligne") ddl2.Items.Add("Jeux en ligne : clans") ddl2.Items.Add("Sites de communauts") ddl2.Items.Add("Site de journaux") ddl2.Items.Add("Webcams, netcams") ddl2.Items.Add("Webzines") ddl3.Items.Add("Choisissez une entre") ddl3.Items.Add("Actualits et gnralits") ddl3.Items.Add("Assurance") ddl3.Items.Add("Banque et crdit") ddl3.Items.Add("Bourse") ddl3.Items.Add("Euro") ddl3.Items.Add("Institutions et organismes") ddl3.Items.Add("Portails") ddl3.Items.Add("Webzines, sites de magazines ") ddl4.Items.Add("Choisissez une entre")

Chapitre 23

Annuaire de sites web

543

ddl4.Items.Add("Documentation et orientation") ddl4.Items.Add("Juniors") ddl4.Items.Add("Organismes de formation, coles") ddl4.Items.Add("Sites pour enseignants") ddl4.Items.Add("Sites pour tudiants, lycens") ddl4.Items.Add("Soutien scolaire ") ddl5.Items.Add("Choisissez une entre") ddl5.Items.Add("Annuaires dentreprises, portails, moteurs") ddl5.Items.Add("Artisans") ddl5.Items.Add("Associations") ddl5.Items.Add("Banques de CV, aide la cration de CV") ddl5.Items.Add("Cabinets de recrutement") ddl5.Items.Add("Cration dentreprise, dassociation") ddl5.Items.Add("Emploi ltranger") ddl5.Items.Add("Entreprises") ddl5.Items.Add("Formation professionnelle") ddl5.Items.Add("Intrim") ddl5.Items.Add("Petites annonces") ddl5.Items.Add("Portails de professions") ddl5.Items.Add("Restauration") ddl5.Items.Add("Services publics") ddl5.Items.Add("Sites dannonces, banques de CV") ddl5.Items.Add("Socits de services") ddl5.Items.Add("Tltravail et travailleurs indpendants") ddl6.Items.Add("Choisissez une entre") ddl6.Items.Add("Actualit, presse, livres, manifestations") ddl6.Items.Add("Aide, astuces, didacticiels, clubs") ddl6.Items.Add("Amliorer, bricoler le PC") ddl6.Items.Add("Divers") ddl6.Items.Add("Emulation") ddl6.Items.Add("Graphisme, 3D") ddl6.Items.Add("Gratuit") ddl6.Items.Add("Internet, cration de sites") ddl6.Items.Add("Jeux et consoles") ddl6.Items.Add("Jeux et consoles : tlchargement gratuit") ddl6.Items.Add("Jeux et consoles : vente") ddl6.Items.Add("Langages Internet") ddl6.Items.Add("Logiciels") ddl6.Items.Add("Matriel") ddl6.Items.Add("Matriel : vente") ddl6.Items.Add("Musique")

544

Visual Basic 2010

ddl6.Items.Add("PDA, calculatrices, ordinateurs de poche") ddl6.Items.Add("Photos, cliparts") ddl6.Items.Add("Programmation") ddl6.Items.Add("Scurit") ddl6.Items.Add("Sharewares, freewares, logiciels gratuits") ddl6.Items.Add("Surf rmunr") ddl6.Items.Add("Systmes") ddl6.Items.Add("Wap, mobiles") ddl7.Items.Add("Choisissez une entre") ddl7.Items.Add("Auto, moto, vlo") ddl7.Items.Add("Aviation") ddl7.Items.Add("Bricolage") ddl7.Items.Add("Chasse et pche") ddl7.Items.Add("Collections, ftes et costumes") ddl7.Items.Add("Coquin, rencontre, amour, mariage") ddl7.Items.Add("Gastronomie") ddl7.Items.Add("Gastronomie : alimentation bio") ddl7.Items.Add("Gastronomie : restaurants, bars") ddl7.Items.Add("Gastronomie : vins et boissons") ddl7.Items.Add("Glisse") ddl7.Items.Add("Hobby") ddl7.Items.Add("Humour") ddl7.Items.Add("Jardinage") ddl7.Items.Add("Jeux, parcs dattractions, ftes") ddl7.Items.Add("Photo") ddl7.Items.Add("Randonne, montagne, ski") ddl7.Items.Add("Sports") ddl7.Items.Add("Technologie") ddl8.Items.Add("Choisissez une entre") ddl8.Items.Add("Agences de presse") ddl8.Items.Add("Conseil, guides de march") ddl8.Items.Add("DVD") ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Journaux&amp;mag en ligne : ddl8.Items.Add("Publicit") ddl8.Items.Add("Radioamateurs")

actualit") culturel") divers") enfants") informatique") musique") sport")

Chapitre 23

Annuaire de sites web

545

ddl8.Items.Add("Radios") ddl8.Items.Add("Sites gnraux, sites portails") ddl8.Items.Add("Tlvision, vido") ddl8.Items.Add("Veille technologique") ddl8.Items.Add("Wap") ddl8.Items.Add("WebTV") ddl9.Items.Add("Choisissez une entre") ddl9.Items.Add("Archologie, minralogie") ddl9.Items.Add("Arme, police, gendarmerie") ddl9.Items.Add("Dictionnaires, glossaires, lexiques") ddl9.Items.Add("Encyclopdies") ddl9.Items.Add("Espace, astronomie, aviation") ddl9.Items.Add("Gnalogie") ddl9.Items.Add("Gnralits et actualits scientifiques") ddl9.Items.Add("Gographie, histoire") ddl9.Items.Add("Langues") ddl9.Items.Add("Mathmatiques et sciences physiques") ddl9.Items.Add("Mers et ocans") ddl9.Items.Add("Nature, animaux, protection des animaux") ddl9.Items.Add("Recherche") ddl9.Items.Add("Sciences (vie, terre, environnement)") ddl9.Items.Add("Sciences humaines et sociales") ddl9.Items.Add("Sciences mdicales") ddl9.Items.Add("Splologie") ddl9.Items.Add("Traduction") ddl10.Items.Add("Choisissez une entre") ddl10.Items.Add("Etudes et statistiques") ddl10.Items.Add("Forums, mouvements, dbats") ddl10.Items.Add("Francophonie, Europe, culture franaise") ddl10.Items.Add("Humanitaire") ddl10.Items.Add("Ministres, gouvernements, lois") ddl10.Items.Add("Pouvoirs publics, administrations") ddl10.Items.Add("Sites de partis") ddl11.Items.Add("Choisissez une entre") ddl11.Items.Add("Achats en ligne") ddl11.Items.Add("Acheter moins cher") ddl11.Items.Add("Ados, jeunes") ddl11.Items.Add("Alcool") ddl11.Items.Add("Animaux de compagnie") ddl11.Items.Add("Annuaires")

546

Visual Basic 2010

ddl11.Items.Add("Aquariums") ddl11.Items.Add("Auto") ddl11.Items.Add("Beaut") ddl11.Items.Add("Bijoux") ddl11.Items.Add("Brocantes") ddl11.Items.Add("Chats, forums") ddl11.Items.Add("Chaussures") ddl11.Items.Add("Comparateurs de prix") ddl11.Items.Add("Cuisine, recettes") ddl11.Items.Add("Dmarches et droits") ddl11.Items.Add("Drogues") ddl11.Items.Add("E-cartes") ddl11.Items.Add("E-mails gratuits, acheminement e-mail") ddl11.Items.Add("Enchres") ddl11.Items.Add("Extra-terrestres, inexpliqu, paranormal") ddl11.Items.Add("Faire des conomies") ddl11.Items.Add("Famille") ddl11.Items.Add("Famille : guide") ddl11.Items.Add("Famille : vente") ddl11.Items.Add("Fminin : services") ddl11.Items.Add("Guides") ddl11.Items.Add("Handicaps") ddl11.Items.Add("Heroic fantasy, fes, sorcires") ddl11.Items.Add("Horoscopes, astrologie") ddl11.Items.Add("Immobilier") ddl11.Items.Add("Maison, dco") ddl11.Items.Add("Mto") ddl11.Items.Add("Moteurs de recherche") ddl11.Items.Add("Moto") ddl11.Items.Add("Nourriture bio") ddl11.Items.Add("Petites annonces") ddl11.Items.Add("Portails, guides") ddl11.Items.Add("Sant") ddl11.Items.Add("Seniors") ddl11.Items.Add("Services : trafic, rparation de lunettes") ddl11.Items.Add("Sortir") ddl11.Items.Add("Tabac") ddl11.Items.Add("Tatouage, piercing") ddl11.Items.Add("Vtements, mode") ddl12.Items.Add("Choisissez une entre") ddl12.Items.Add("Ambassades") ddl12.Items.Add("Annuaires, moteurs de recherche")

Chapitre 23

Annuaire de sites web

547

ddl12.Items.Add("Cartes") ddl12.Items.Add("Hbergement") ddl12.Items.Add("Monuments, sites") ddl12.Items.Add("Portails et sites gnraux, annuaires") ddl12.Items.Add("Ressources et documentation") ddl12.Items.Add("Sant") ddl12.Items.Add("Tour oprateurs, agences, promotions") ddl12.Items.Add("Transports") ddl12.Items.Add("Visites virtuelles : tranger") ddl12.Items.Add("Visites virtuelles : France") End Sub Protected Sub ddl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl1.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl2.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl3_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl3.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub

548

Visual Basic 2010

Protected Sub ddl4_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl4.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl5_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl5.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl6_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl6.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl7_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl7.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl8_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl8.SelectedIndexChanged Dim s As String = ddl1.Text

Chapitre 23


Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub

Annuaire de sites web

549

Protected Sub ddl9_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl9.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl10_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl10.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl11_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl11.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s) GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ddl12_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddl12.SelectedIndexChanged Dim s As String = ddl1.Text Dim objds As New localhost.Service Dim ds As DataSet ds = objds.AfficheSel(s)

550

Visual Basic 2010

GridView1.DataSource = ds GridView1.DataBind() End Sub Protected Sub ImageMap1_Click(ByVal sender As Object, ByVal e As System.Web. UI.WebControls.ImageMapEventArgs) Handles ImageMap1.Click If e.PostBackValue = "0" Then Response.Write("<body><script>window. open(http://lem.korp.free.fr/annuaire/data/plus.htm)</script></body>") If e.PostBackValue = "1" Then Response.Write("<body><script>window. open(mailto:lem.korp@free.fr)</script></body>") If e.PostBackValue = "2" Then Response.Write("<body><script>window. open(http://lem.korp.free.fr/annuaire/data/nouvsite.htm)</script></body>") End Sub End Class

24
Favoris web
Dans ce chapitre, vous allez apprendre mmoriser vos sites web prfrs. Les sites sont accessibles travers une huit listes droulantes. Un simple clic permet dafficher lun des sites mmoriss. Un outil de personnalisation permet de modifier, de complter ou de supprimer les lments mmoriss. Reportez-vous si ncessaire au Chapitre 7 pour connatre les modalits dutilisation du contrle ToolStrip et au Chapitre 21 pour avoir des informations complmentaires sur lutilisation du contrle WebBrowser.

Mise en place du projet


Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste droulante Framework. Slectionnez Visual Basic/Windows dans le volet gauche et dfinissez le nouveau projet SuperNavigateur fond sur le modle Application Windows Forms.

552

Visual Basic 2010

Ajoutez les contrles suivants au projet: un MenuStrip, un ToolStrip, un Panel contenant huit Label et huit ComboBox, un WebBrowser. Compltez le contrle ToolStrip en lui ajoutant un Label et un TextBox (voir Figure24.1).
Figure24.1 Quelques clics souris suffisent pour complter le contrle ToolStrip.

Modifiez les proprits de ces contrles comme indiqu dans le tableau suivant:
Contrle
Label dans ToolStrip ToolStrip TextBox dans ToolStrip Panel1 Label2 Label8 dans Panel1 Label2 Label8 dans Panel1 ComboBox1 ComboBox8 dans Panel1 ComboBox2 ComboBox8 dans Panel1 WebBrowser1

Proprit
Text Dock Text Dock Text Enabled Text Enabled Dock

Valeur
Adresse Top

Top Non utilis False

False Fill

Dfinissez les commandes de menu suivantes:

Outils> Cacher la barre de navigation; Outils> Cacher les sites;

Chapitre 24

Favoris web

553

Outils> Personnaliser; Aide> Aide SuperNavigateur.

Dplacez et redimensionnez les contrles pour obtenir la disposition de la Figure24.2.


Figure24.2 La fentre principale de lapplication Super Navigateur en mode dition.

Avant de poursuivre, ouvrez le Bloc-notes de Windows et saisissez le code suivant:


Encyclopdies Encarta http://encarta.msn.fr/ Encyclopdies Hachette http://www.ehmelhm.hachette-multimedia.fr/infos/accueil Encyclopdies Quid http://www.quid.fr/ Enfants Les Tibidous http://www.tibidous.com/ Enfants Toupty.com http://www.toupty.com Enfants Chez Spiderman

554

Visual Basic 2010

http://spiderman.2.free.fr Journaux Le Monde http://www.lemonde.fr/ Journaux Le Nouvel Obs http://quotidien.nouvelobs.com/ Journaux Lexpress http://www.lexpress.fr/Express/

Sauvegardez ce fichier sous le nom data.txt et placez-le dans le dossier bin\debug de lapplication SuperNavigateur. Ce fichier dcrit dix sites dintrt gnral. Chaque site ncessite quatre informations:

un nom de catgorie; le nom du site; ladresse URL du site; un ventuel commentaire qui donne des informations sur le site.

Dfinition des procdures de traitement


Lancez la commande Code dans le menu Affichage ou appuyez sur F7. Ajoutez les dclarations suivantes dans la partie suprieure du listing:
Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim i, j As Integer data(4, 100) As String Tableau de donnes NbData As Integer Nombre de rfrences dans les onglets NDparListe(8) As Integer s As String NbListes As Integer NomListes(8) As String l1 As New Collections.ArrayList(20) l2 As New Collections.ArrayList(20) l3 As New Collections.ArrayList(20) l4 As New Collections.ArrayList(20) l5 As New Collections.ArrayList(20) l6 As New Collections.ArrayList(20) l7 As New Collections.ArrayList(20) l8 As New Collections.ArrayList(20) bis As Boolean

Chapitre 24

Favoris web

555

Le tableau data sera utilis pour mmoriser les donnes du fichier data.txt. Ce tableau peut enregistrer jusqu cent sites:
Dim data(4, 100) As String Tableau de donnes

Les collections l1 l8 permettront de remplir les listes droulantes ComboBox1 ComboBox8. Chaque collection a par dfaut une capacit de vingt lments:
Dim l1 As New Collections.ArrayList(20) Dim l8 As New Collections.ArrayList(20)

Slectionnez Form1 dans le fentre Proprits, cliquez sur licne vnements, doublecliquez sur lvnement Load et compltez la procdure Form1_Load() comme suit:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MAJListes() Initialisation et affichage des listes droulantes End Sub

Cette procdure se contente dinvoquer MAJListes()pour initialiser les listes droulantes:


MAJListes()

Vous allez maintenant dfinir la procdure Form1_Activated(). Cette procdure sera excute chaque fois que la deuxime fentre de lapplication redonnera le contrle la premire. Slectionnez Form1 dans le fentre Proprits, cliquez sur licne vnements, double-cliquez sur lvnement Activated et compltez la procdure Form1_Activated() comme suit:
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated MAJListes() End Sub

Tout comme Form1_Load(), Form1_Activated() fait appel la procdure MAJListes() pour remettre jour les listes droulantes en sortie de personnalisation. Il ne reste plus qu dfinir MAJListes() pour rendre ces deux procdures oprationnelles:
Public Sub MAJListes() Lecture du fichier de donnes i = 1 Try FileOpen(1, "data.txt", OpenMode.Input) While Not EOF(1) data(1, i) = LineInput(1)

556

Visual Basic 2010

data(2, i) = LineInput(1) data(3, i) = LineInput(1) data(4, i) = LineInput(1) i = i + 1 End While Catch Finally NbData = i - 1 FileClose(1) End Try Comptage du nombre de listes droulantes s = "" NbListes = 0 j = -1 For i = 1 To NbData j = j + 1 If data(1, i) <> s Then If NbListes <> 0 Then NDparListe(NbListes) = j j = 0 End If s = data(1, i) NbListes = NbListes + 1 NomListes(NbListes) = s End If Next NDparListe(NbListes) = j + 1 Initialisation des listes droulantes l1.Clear() For i = 1 To NDparListe(1) l1.Add(data(2, i)) Next i Label2.Enabled = True Label2.Text = NomListes(1) ComboBox1.DataSource = l1 ComboBox1.Enabled = True ComboBox1.Text = "Choisissez une entre" If NbListes >= 2 Then l2.Clear() For i = 1 To NDparListe(2) l2.Add(data(2, i + NDparListe(1))) Next i Label3.Enabled = True Label3.Text = NomListes(2)

Chapitre 24


ComboBox2.DataSource = l2 ComboBox2.Enabled = True ComboBox2.Text = "Choisissez une entre" End If If NbListes >= 3 Then l3.Clear() For i = 1 To NDparListe(3) l3.Add(data(2, i + NDparListe(1) + NDparListe(2))) Next i Label4.Enabled = True Label4.Text = NomListes(3) ComboBox3.DataSource = l3 ComboBox3.Enabled = True ComboBox3.Text = "Choisissez une entre" End If

Favoris web

557

If NbListes >= 4 Then l4.Clear() For i = 1 To NDparListe(4) l4.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3))) Next i Label5.Enabled = True Label5.Text = NomListes(4) ComboBox4.DataSource = l4 ComboBox4.Enabled = True ComboBox4.Text = "Choisissez une entre" End If If NbListes >= 5 Then l5.Clear() For i = 5 To NDparListe(5) l5.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4))) Next i Label6.Enabled = True Label6.Text = NomListes(5) ComboBox5.DataSource = l5 ComboBox5.Enabled = True ComboBox5.Text = "Choisissez une entre" End If If NbListes >= 6 Then l6.Clear() For i = 1 To NDparListe(6) l6.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4) + DparListe(5)))

558

Visual Basic 2010

Next i Label7.Enabled = True Label7.Text = NomListes(6) ComboBox6.DataSource = l6 ComboBox6.Enabled = True ComboBox6.Text = "Choisissez une entre" End If If NbListes >= 7 Then l7.Clear() For i = 1 To NDparListe(7) l7.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4) + DparListe(5) + NDparListe(6))) Next i Label8.Enabled = True Label8.Text = NomListes(7) ComboBox7.DataSource = l7 ComboBox7.Enabled = True ComboBox7.Text = "Choisissez une entre" End If If NbListes >= 8 Then l8.Clear() For i = 1 To NDparListe(8) l8.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4) + DparListe(5) + NDparListe(6) + NDparListe(7))) Next i Label9.Enabled = True Label9.Text = NomListes(8) ComboBox8.DataSource = l8 ComboBox8.Enabled = True ComboBox8.Text = "Choisissez une entre" End If End Sub

Bien quassez longue, cette procdure est trs simple. Le premier bloc dinstructions lit le fichier texte data.txt et stocke son contenu dans le tableau data():
i = 1 Try FileOpen(1, "data.txt", OpenMode.Input) While Not EOF(1) data(1, i) = LineInput(1) data(2, i) = LineInput(1) data(3, i) = LineInput(1) data(4, i) = LineInput(1) i = i + 1

Chapitre 24

Favoris web

559

End While Catch Finally NbData = i - 1 FileClose(1) End Try

Aucun chemin ntant prcis dans linstruction FileOpen(), le fichier data.txt doit se trouver dans le mme dossier que lexcutable, cest--dire dans le dossier bin:
FileOpen(1, "data.txt", OpenMode.Input)

Remarquez la structure Try Catch Finally End Try. Si le fichier data.txt nexiste pas, aucune erreur ne sera gnre lexcution du programme. En revanche, les listes droulantes ne pourront pas tre initialises. Le deuxime bloc dinstructions se poursuit par le comptage du nombre de listes droulantes afficher:
s = "" NbListes = 0 j = -1 For i = 1 To NbData j = j + 1 If data(1, i) <> s Then If NbListes <> 0 Then NDparListe(NbListes) = j j = 0 End If s = data(1, i) NbListes = NbListes + 1 NomListes(NbListes) = s End If Next NDparListe(NbListes) = j + 1

La technique utilise est trs simple. Elle consiste comparer le nom de catgorie de chaque donne. Si le nom actuel est diffrent du prcdent, une nouvelle liste droulante doit tre implmente:
If data(1, i) <> s Then If NbListes <> 0 Then

Le nombre de listes implmenter est mmoris dans la variable NbListes, le nom de chaque liste droulante dans le tableau NomListes(), et le nombre dentres dans chaque liste dans le tableau NDparListe():

560

Visual Basic 2010

NDparListe(NbListes) = j NbListes = NbListes + 1 NomListes(NbListes) = s

Chacun des blocs dinstructions suivants initialise une des huit listes droulantes. Par exemple, pour la troisime liste droulante:
If NbListes >= 3 Then l3.Clear() For i = 1 To NDparListe(3) l3.Add(data(2, i + NDparListe(1) + NDparListe(2))) Next i Label4.Enabled = True Label4.Text = NomListes(3) ComboBox3.DataSource = l3 ComboBox3.Enabled = True ComboBox3.Text = "Choisissez une entre" End If

Le contenu de la liste droulante est rinitialis:


l3.Clear()

Puis une boucle For Next ajoute chacune des donnes la collection l3:
For i = 1 To NDparListe(3) l3.Add(data(2, i + NDparListe(1) + NDparListe(2))) Next i

Le label correspondant la liste est alors activ et initialis:


Label4.Enabled = True Label4.Text = NomListes(3)

De mme pour la liste droulante:


ComboBox3.DataSource = l3 ComboBox3.Enabled = True ComboBox3.Text = "Choisissez une entre"

Lorsque nous sommes arrivs ce point, les listes droulantes sactivent et se remplissent automatiquement au lancement de lapplication. Nous allons maintenant dfinir les procdures de traitement des commandes de menu. Droulez le menu Outils et double-cliquez sur la commande Cacher la barre de navigation. Compltez la procdure CacherLaBarreDeNavigationToolStripMenuItem_Click() comme suit:

Chapitre 24

Favoris web

561

Private Sub CacherLaBarreDeNavigationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CacherLaBarreDeNavigation ToolStripMenuItem.Click If CacherLaBarreDeNavigationToolStripMenuItem.Text = "Cacher la barre de navigation" Then ToolStrip1.Visible = False CacherLaBarreDeNavigationToolStripMenuItem.Text = "Afficher la barre de navigation" Else ToolStrip1.Visible = True CacherLaBarreDeNavigationToolStripMenuItem.Text = "Cacher la barre de navigation" End If End Sub

Cette procdure repose sur une instruction If Then Else. Si le texte affich dans le menu est "Cacher la barre de navigation":
If CacherLaBarreDeNavigationToolStripMenuItem.Text = "Cacher la barre de navigation" Then

la barre de navigation doit tre cache:


ToolStrip1.Visible = False

et la commande de menu, change en "Afficher la barre de navigation":


CacherLaBarreDeNavigationToolStripMenuItem.Text = "Afficher la barre de navigation"

Dans le cas contraire, la barre de navigation doit tre affiche: ToolStrip1.Visible = Trueet la commande de menu, change en "Cacher la barre de navigation":
CacherLaBarreDeNavigationToolStripMenuItem.Text = "Cacher la barre de navigation"

Droulez le menu Outils et double-cliquez sur la commande Cacher les sites. Compltez la procdure CacherLesSItesToolStripMenuItem_Click() comme suit:
Private Sub CacherLesSitesToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CacherLesSitesToolStripMenuItem.Click If CacherLesSitesToolStripMenuItem.Text = "Cacher les sites" Then Panel1.Visible = False CacherLesSitesToolStripMenuItem.Text = "Montrer les sites" Else Panel1.Visible = True

562

Visual Basic 2010

CacherLesSitesToolStripMenuItem.Text = "Cacher les sites" End If End Sub

Si le texte affich dans le menu est "Cacher les sites":


If CacherLesSitesToolStripMenuItem.Text = "Cacher les sites" Then

le contrle Panel1 doit tre cach:


Panel1.Visible = False

et la commande de menu, modifie en "Monter les sites":


CacherLesSitesToolStripMenuItem.Text = "Montrer les sites"

Dans le cas contraire, le contrle Panel1 doit tre rendu visible:


Else Panel1.Visible = True

et la commande de menu, change en "Cacher les sites":


CacherLesSitesToolStripMenuItem.Text = "Cacher les sites"

Droulez le menu Outils et double-cliquez sur la commande Personnaliser. Compltez la procdure PersonnaliserToolStripMenuItem_Click() comme suit:
Private Sub PersonnaliserToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PersonnaliserToolStripMenuItem.Click Ajout, suppression et modification de sites Form2.Show() End Sub

La seule instruction de cette procdure provoque laffichage de la feuille Form2. Pour terminer le code attach cette premire feuille, vous allez maintenant donner vie au contrle WebBrowser1. Slectionnez lobjet ToolStripTextBox1 dans la fentre des proprits, cliquez sur licne vnements et double-cliquez sur lvnement KeyDown. Compltez la procdure ToolStripTextBox1_KeyDown() comme suit:
Private Sub ToolStripTextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ToolStripTextBox1.KeyDown If (e.KeyCode = 13) Then WebBrowser1.Navigate(ToolStripTextBox1.Text) End If End Sub

Chapitre 24

Favoris web

563

Si la touche sur laquelle on a appuy est la touche Entre:


If (e.KeyCode = 13) Then

la page dont lURL est spcifie dans la zone de texte ToolStripTextBox1 apparat:
WebBrowser1.Navigate(ToolStripTextBox1.Text)

Double-cliquez sur la premire liste droulante et compltez la procdure ComboBox1_ SelectedIndexChanged() comme suit:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox1.Text)) End Sub

Lorsquune entre est slectionne dans la premire liste droulante, la page correspondante saffiche dans le contrle WebBrowser1. LURL de la page slectionne est calcule par la fonction DonneURL(), dont voici le code:
Public Function DonneURL(ByVal s As String) As String Dim ds As String FileOpen(1, "data.txt", OpenMode.Input) While Not EOF(1) ds = LineInput(1) If ds = s Then DonneURL = LineInput(1) End While FileClose(1) End Function

Lentre slectionne par lutilisateur est passe en paramtre la fonction:


Public Function DonneURL(ByVal s As String) As String

Une boucle While End While parcourt lensemble des lignes du fichier data.txt la recherche de la chane passe. Lorsque cette valeur est trouve, lURL se trouve sur la ligne suivante. Il suffit dutiliser une instruction LineInput() pour lobtenir:
While Not EOF(1) ds = LineInput(1) If ds = s Then DonneURL = LineInput(1) End While

Les procdures vnementielles ComboBox2_SelectedIndexChanged() ComboBox8_SelectedIndexChanged() sont identiques la procdure ComboBox1_SelectedIndexChanged(), ceci prs quelles communiquent la procdure DonneURL() les valeurs slectionnes dans les listes droulantes ComboBox2 ComboBox8.

564

Visual Basic 2010

Voici le listing complet de la feuille principale de lapplication SuperNavigateur. Les fichiers correspondants se trouvent dans le dossier Projects\SuperNavigateur des sources de louvrage.
Public Class Form1 Dim i, j As Integer Dim data(4, 100) As String Tableau de donnes Dim NbData As Integer Nombre de rfrences dans les onglets Dim NDparListe(8) As Integer Dim s As String Dim NbListes As Integer Dim NomListes(8) As String Dim l1 As New Collections.ArrayList(20) Dim l2 As New Collections.ArrayList(20) Dim l3 As New Collections.ArrayList(20) Dim l4 As New Collections.ArrayList(20) Dim l5 As New Collections.ArrayList(20) Dim l6 As New Collections.ArrayList(20) Dim l7 As New Collections.ArrayList(20) Dim l8 As New Collections.ArrayList(20) Dim bis As Boolean Public Sub MAJListes() Lecture du fichier de donnes i = 1 Try FileOpen(1, "data.txt", OpenMode.Input) While Not EOF(1) data(1, i) = LineInput(1) data(2, i) = LineInput(1) data(3, i) = LineInput(1) data(4, i) = LineInput(1) i = i + 1 End While Catch Finally NbData = i - 1 FileClose(1) End Try Comptage du nombre de listes droulantes s = "" NbListes = 0 j = -1

Chapitre 24


For i = 1 To NbData j = j + 1 If data(1, i) <> s Then If NbListes <> 0 Then NDparListe(NbListes) = j j = 0 End If s = data(1, i) NbListes = NbListes + 1 NomListes(NbListes) = s End If Next NDparListe(NbListes) = j + 1 Initialisation des listes droulantes l1.Clear() For i = 1 To NDparListe(1) l1.Add(data(2, i)) Next i Label1.Enabled = True Label1.Text = NomListes(1) ComboBox1.DataSource = l1 ComboBox1.Enabled = True ComboBox1.Text = "Choisissez une entre" If NbListes >= 2 Then l2.Clear() For i = 1 To NDparListe(2) l2.Add(data(2, i + NDparListe(1))) Next i Label2.Enabled = True Label2.Text = NomListes(2) ComboBox2.DataSource = l2 ComboBox2.Enabled = True ComboBox2.Text = "Choisissez une entre" End If

Favoris web

565

If NbListes >= 3 Then l3.Clear() For i = 1 To NDparListe(3) l3.Add(data(2, i + NDparListe(1) + NDparListe(2))) Next i Label3.Enabled = True Label3.Text = NomListes(3)

566

Visual Basic 2010

ComboBox3.DataSource = l3 ComboBox3.Enabled = True ComboBox3.Text = "Choisissez une entre" End If If NbListes >= 4 Then l4.Clear() For i = 1 To NDparListe(4) l4.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3))) Next i Label4.Enabled = True Label4.Text = NomListes(4) ComboBox4.DataSource = l4 ComboBox4.Enabled = True ComboBox4.Text = "Choisissez une entre" End If If NbListes >= 5 Then l5.Clear() For i = 5 To NDparListe(5) l5.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4))) Next i Label5.Enabled = True Label5.Text = NomListes(5) ComboBox5.DataSource = l5 ComboBox5.Enabled = True ComboBox5.Text = "Choisissez une entre" End If If NbListes >= 6 Then l6.Clear() For i = 1 To NDparListe(6) l6.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4) + NDparListe(5))) Next i Label6.Enabled = True Label6.Text = NomListes(6) ComboBox6.DataSource = l6 ComboBox6.Enabled = True ComboBox6.Text = "Choisissez une entre" End If If NbListes >= 7 Then

Chapitre 24

Favoris web

567

l7.Clear() For i = 1 To NDparListe(7) l7.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4) + NDparListe(5) + NDparListe(6))) Next i Label7.Enabled = True Label7.Text = NomListes(7) ComboBox7.DataSource = l7 ComboBox7.Enabled = True ComboBox7.Text = "Choisissez une entre" End If If NbListes >= 8 Then l8.Clear() For i = 1 To NDparListe(8) l8.Add(data(2, i + NDparListe(1) + NDparListe(2) + NDparListe(3) + NDparListe(4) + NDparListe(5) + NDparListe(6) + NDparListe(7))) Next i Label8.Enabled = True Label8.Text = NomListes(8) ComboBox8.DataSource = l8 ComboBox8.Enabled = True ComboBox8.Text = "Choisissez une entre" End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load frmForm1 = Me Dclaration du formulaire 1 MAJListes() Initialisation et affichage des listes droulantes End Sub Private Sub Form1_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated MAJListes() End Sub Private Sub CacherLaBarreDeNavigationToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

568

Visual Basic 2010

Handles CacherLaBarreDeNavigationToolStripMenuItem.Click If CacherLaBarreDeNavigationToolStripMenuItem.Text = "Cacher la barre de navigation" Then ToolStrip1.Visible = False CacherLaBarreDeNavigationToolStripMenuItem.Text = "Afficher la barre de navigation" Else ToolStrip1.Visible = True CacherLaBarreDeNavigationToolStripMenuItem.Text = "Cacher la barre de navigation" End If End Sub Private Sub CacherLesSitesToolStripMenuItem_Click(ByVal sender As System. Object, ByVal e As System.EventArgs) Handles CacherLesSitesToolStripMenuItem.Click If CacherLesSitesToolStripMenuItem.Text = "Cacher les sites" Then Panel1.Visible = False CacherLesSitesToolStripMenuItem.Text = "Montrer les sites" Else Panel1.Visible = True CacherLesSitesToolStripMenuItem.Text = "Cacher les sites" End If End Sub Private Sub PersonnaliserToolStripMenuItem_Click(ByVal sender As System. Object, ByVal e As System.EventArgs) Handles PersonnaliserToolStripMenuItem.Click Ajout, suppression et modification de sites Form2.Show() End Sub Private Sub ToolStripTextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ToolStripTextBox1.KeyDown If (e.KeyCode = 13) Then WebBrowser1.Navigate(ToolStripTextBox1.Text) End If End Sub

Chapitre 24


Public Function DonneURL(ByVal s As String) As String Dim ds As String Dim res As String = "" FileOpen(1, "data.txt", OpenMode.Input) While Not EOF(1) ds = LineInput(1) If ds = s Then res = LineInput(1) End While FileClose(1) Return res End Function

Favoris web

569

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox1.Text)) End Sub Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox2.Text)) End Sub Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox3.Text)) End Sub Private Sub ComboBox4_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox4.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox4.Text)) End Sub Private Sub ComboBox5_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox5.SelectedIndexChanged

570

Visual Basic 2010

WebBrowser1.Navigate(DonneURL(ComboBox5.Text)) End Sub Private Sub ComboBox6_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox6.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox6.Text)) End Sub Private Sub ComboBox7_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox7.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox7.Text)) End Sub Private Sub ComboBox8_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox8.SelectedIndexChanged WebBrowser1.Navigate(DonneURL(ComboBox8.Text)) End Sub Private Sub Form1_Resize(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Resize Dim largeur As String = Me.Width ToolStripTextBox1.Size = New System.Drawing.Size(largeur - 70, 21) Me.Width - 200 End Sub Private Sub AideSuperNavigateurToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AideSuperNavigateurToolStripMenuItem.Click Help.ShowHelpIndex(Me, " AideSN.chm") End Sub End Class

Vous allez maintenant insrer une deuxime feuille dans lapplication. Lancez la commande Ajouter un formulaire Windows dans le menu Projet. Choisissez le modle Windows Form, appelez le formulaire Form2.vb et validez.

Chapitre 24

Favoris web

571

Basculez sur la deuxime feuille de lapplication. Ajoutez un contrle ToolStrip et un contrle DataGridView la feuille. Ajoutez un ToolStripLabel, un ToolStripTextBox et un ToolStripButton au contrle ToolStrip. Modifiez les proprits de ces objets comme indiqu dans le tableau suivant:
Contrle
Form1 ToolStrip1 ToolStripLabel1 ToolStripTextBox1

Proprit
Text Dock Text Text Size.Width Text Dock

Valeur
Personnalisation du navigateur Top Cellule en cours

TextBox1
ToolStripButton1 AxMSFlexGrid1

Left, Right, Top Quitter Fill

Cliquez sur le contrle DataGridView1 puis sur les points de suspension la suite de la proprit Columns. Une bote de dialogue intitule Modifier les colonnes saffiche (voir Figure24.3).
Figure24.3 Pour linstant, lobjet DataGridView ne contient aucune colonne.

Cliquez sur Ajouter. Une nouvelle bote de dialogue intitule Ajouter une colonne apparat (voir Figure24.4).

572

Visual Basic 2010

Figure24.4 Cette bote de dialogue permet de dfinir de nouvelles colonnes dans le contrle DataGridView.

Vous allez dfinir quatre colonnes en entrant les valeurs suivantes dans les zones de texte Nom, Type et Texte de len-tte et en cliquant sur Ajouter:
Nom
Onglet NomDuSite URL Commentaire

Type
DataGridViewTextBoxColum DataGridViewTextBoxColum DataGridViewTextBoxColum DataGridViewTextBoxColum

Texte de len-tte
Onglet Nom du site URL Commentaire

Si vous avez suivi nos indications, la bote de dialogue Modifier les colonnes soit maintenant se prsenter comme la Figure24.5.
Figure24.5 Quatre colonnes ont t dfinies dans le contrle DataGridView.

Chapitre 24

Favoris web

573

Disposez et redimensionnez ces contrles pour obtenir un aspect visuel proche de la Figure24.6.
Figure24.6 La deuxime feuille de lapplication en mode dition.

Dfinissez les objets utiliss par cette deuxime feuille en tte de listing:
Dim Dim Dim Dim i As Integer data(4, 100) As String Tableau de donnes NbData As Integer Nombre de rfrences dans les onglets DimCol As Integer

Basculez sur longlet Form2.db [Design]. Slectionnez lobjet Form2 dans la fentre Proprits, cliquez sur vnements, double-cliquez sur lvnement Load et compltez la procdure Form2_Load() comme suit:
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Lecture du fichier de donnes Dim s1, s2, s3, s4 As String Try FileOpen(1, "data.txt", OpenMode.Input) Do s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) DataGridView1.Rows.Add(New String() {s1, s2, s3, s4}) Loop Until EOF(1) Catch Finally FileClose(1) End Try End Sub

574

Visual Basic 2010

La premire instruction dfinit les quatre variables String qui seront utilises pour crire une ligne dans le contrle DataGridView:
Dim s1, s2, s3, s4 As String

Le fichier de donnes est ouvert lintrieur dune structure Try End Try:
Try FileOpen(1, "data.txt", OpenMode.Input) End Try

Les donnes sont lues dans le fichier laide dune boucle Do Loop qui prend fin lorsque la marque de fin de fichier est atteinte:
Do s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) DataGridView1.Rows.Add(New String() {s1, s2, s3, s4}) Loop Until EOF(1)

Remarquez linstruction permettant de copier le contenu des quatre variables String dans une ligne du DataGridView:
DataGridView1.Rows.Add(New String() {s1, s2, s3, s4})

Une collection de String est cre (New String()), dcrite ({s1, s2, s3, s4}) et passe comme argument la procdure DataGridView1.Rows.Add. Simple et efficace ! La boucle Try se termine par la fermeture du fichier de donnes:
Catch Finally FileClose(1) End Try

Pour modifier ou ajouter des donnes dans le contrle DataGridView, lutilisateur doit cliquer sur une cellule, entrer une valeur dans la zone de texte et appuyer sur la touche Entre du clavier. Basculez sur la fentre de code Form2.vb, slectionnez DataGridView1 dans la premire liste droulante, CellClick dans la deuxime et compltez la procdure DataGridView1_CellClick() comme suit :
Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick ToolStripTextBox1.Text = DataGridView1.CurrentCell.Value ToolStripTextBox1.Focus() End Sub

Chapitre 24

Favoris web

575

La premire instruction affecte le texte contenu dans la cellule clique la zone de texte:
ToolStripTextBox1.Text = DataGridView1.CurrentCell.Value

La deuxime instruction donne le focus la zone de texte afin que lutilisateur puisse modifier la valeur inscrite:
ToolStripTextBox1.Focus()

Pour que la valeur saisie dans la zone de texte sinscrive dans la cellule prcdemment clique lorsque lutilisateur appuie sur la touche Entre, dfinissez la procdure ToolStrip TextBox1_KeyPress() suivante:
Private Sub ToolStripTextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ToolStripTextBox1.KeyPress If Asc(e.KeyChar) = 13 Then DataGridView1.CurrentCell.Value = ToolStripTextBox1.Text End If End Sub

Si la touche sur laquelle on a appuy est la touche Entre:


If Asc(e.KeyChar) = 13 Then

le contenu de la zone de texte est copi dans la cellule prcdemment clique:


DataGridView1.CurrentCell.Value = ToolStripTextBox1.Text

Pour terminer, vous allez dfinir le code qui sauvegarde le contenu du contrle DataGridView1 dans le fichier data.txt lorsque lutilisateur ferme la deuxime feuille ou clique sur le bouton Quitter. Dfinissez pour cela les procdures vnementielles Form2_FormClosing() et ToolStripButton1_Click():
Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows. Forms.FormClosingEventArgs) Handles Me.FormClosing Sauvegarde() End Sub Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Sauvegarde() Me.Close() End Sub

Form2_FormClosing() et Button1_Click() appellent la procdure Sauvegarde() pour mmoriser les informations de la grille dans le fichier data.txt. La procdure Button1_ Click() ferme galement la deuxime feuille laide de linstruction Me.Close. La premire

576

Visual Basic 2010

feuille de lapplication reprend alors le contrle et met jour les listes droulantes laide de sa procdure Form1_Activated(). Pour terminer, dfinissez la procdure Sauvegarde() comme suit:
Public Sub Sauvegarde() Sauvegarde du DataGridView dans le fichier Data.txt Try FileOpen(1, "data.txt", OpenMode.Output) For i = 0 To DataGridView1.Rows.Count - 1 Dim row As DataGridViewRow = DataGridView1.Rows(i) If row.Cells(0).Value + row.Cells(1).Value + row.Cells(2).Value + row.Cells(3).Value <> "" Then PrintLine(1, row.Cells(0).Value) PrintLine(1, row.Cells(1).Value) PrintLine(1, row.Cells(2).Value) PrintLine(1, row.Cells(3).Value) End If Next Catch Finally FileClose(1) End Try End Sub

Aprs avoir ouvert le fichier data.txt en criture:


FileOpen(1, "data.txt", OpenMode.Output)

une boucle For Next parcourt toutes les cellules du contrle DataGridView et stocke leur contenu dans le fichier:
For i = 0 To DataGridView1.Rows.Count 1

Pour faciliter lcriture du code, nous dfinissons lobjet DataGridViewRow row et nous linitialisons avec les donnes de la ligne indexe par i:
Dim row As DataGridViewRow = DataGridView1.Rows(i)

Si les cellules de la ligne i contiennent des donnes:


If row.Cells(0).Value + row.Cells(1).Value + row.Cells(2).Value + row.Cells(3). Value <> "" Then

Ces donnes sont stockes dans le fichier data.txt:


PrintLine(1, row.Cells(0).Value) PrintLine(1, row.Cells(1).Value)

Chapitre 24

Favoris web

577

PrintLine(1, row.Cells(2).Value) PrintLine(1, row.Cells(3).Value)

Voici le listing complet de la feuille secondaire de lapplication SuperNavigateur. Les fichiers complmentaires se trouvent dans le dossier Projects\SuperNavigateur des sources de louvrage.
Public Class Form2 Dim i As Integer Dim data(4, 100) As String Tableau de donnes Dim NbData As Integer Nombre de rfrences dans les onglets Dim DimCol As Integer Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System. Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Sauvegarde() End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System. EventArgs) Handles MyBase.Load Lecture du fichier de donnes Dim s1, s2, s3, s4 As String Try FileOpen(1, "data.txt", OpenMode.Input) Do s1 = LineInput(1) s2 = LineInput(1) s3 = LineInput(1) s4 = LineInput(1) DataGridView1.Rows.Add(New String() {s1, s2, s3, s4}) Loop Until EOF(1) Catch Finally FileClose(1) End Try End Sub Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick ToolStripTextBox1.Text = DataGridView1.CurrentCell.Value + Str(DataGridView1.Rows.Count) ToolStripTextBox1.Focus() End Sub

578

Visual Basic 2010

Private Sub ToolStripTextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ToolStripTextBox1.KeyPress If Asc(e.KeyChar) = 13 Then DataGridView1.CurrentCell.Value = ToolStripTextBox1.Text End If End Sub Public Sub Sauvegarde() Sauvegarde du DataGridView dans le fichier Data.txt Try FileOpen(1, "data.txt", OpenMode.Output) For i = 0 To DataGridView1.Rows.Count - 1 Dim row As DataGridViewRow = DataGridView1.Rows(i) If row.Cells(0).Value + row.Cells(1).Value + row.Cells(2).Value + row.Cells(3).Value <> "" Then PrintLine(1, row.Cells(0).Value) PrintLine(1, row.Cells(1).Value) PrintLine(1, row.Cells(2).Value) PrintLine(1, row.Cells(3).Value) End If Next Catch Finally FileClose(1) End Try End Sub Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Sauvegarde() Me.Close() End Sub End Class

Dfinition et implmentation du fichier daide


Nous allons dfinir puis intgrer un fichier daide .CHM dans le projet. Si ncessaire, vous pouvez consulter le Chapitre16 pour avoir des informations complmentaires sur la cration et lutilisation dun projet daide.

Chapitre 24

Favoris web

579

Premire tape: collecte des informations utilises par le systme daide


Les rubriques daide vont tre les suivantes:

Message de bienvenue; Utilisation du produit: Barre dadresses; Listes droulantes; Redimensionnement; Personnalisation du programme.

Deuxime tape: conception des pages HTML des rubriques


Pour chacune des rubriques numres dans la premire tape, une page HTML doit tre labore. Utilisez lditeur HTML de votre choix (Bloc-notes de Windows, Microsoft FrontPage Express ou Microsoft FrontPage, etc.) pour crer les diffrentes pages. Voici le code source des cinq fichiers intgrer dans laide.
Prsentation.htm
<html> <head> <title>Prsentation </title> </head> <body> Lapplication "Super Navigateur" est un navigateur Web qui permet de mmoriser vos sites prfrs dans une huit listes droulantes thmatiques. Il contient: <ul> <li>Une barre dadresses pour afficher les sites de votre choix; <li>Un outil de mise jour des listes droulantes. </ul> Plusieurs sites types sont proposs par dfaut. Quelques secondes suffisent pour les supprimer ou les modifier. </body> </html>

580

Visual Basic 2010

BarreAdresse.htm
<html> <head> <title>Etendre longlet Astuces </title> </head> <body> La barre dadresses permet dentrer une adresse Web quelconque. Lorsque vous appuyez sur la touche Entre du clavier, la page correspondante apparat dans la zone daffichage (partie infrieure de lapplication). <P> Remarque: <BR> Il nest pas ncessaire dentrer le prfixe http://. Celui-ci est automatiquement ajout ladresse saisie. </body> </html>

ListesDroulantes.htm
<html> <head> <title>Etendre longlet Raccourcis </title> </head> <body> Pour faciliter laccs vos pages prfres, une huit listes droulantes thmatiques peuvent tre utilises. <p> Ces listes sont automatiquement initialises ds louverture de lapplication. <p> Pour accder une des entres mmorises dans les listes droulantes, il suffit de la slectionner. <P> Consultez la rubrique "Personnalisation" pour savoir comment modifier le contenu des listes droulantes. </body> </html>

Redimensionnement.htm
<html> <head> <title>Onglet Astuces </title> </head>

Chapitre 24

Favoris web

581

<body> La fentre de lapplication peut tre redimensionne en utilisant les moyens conventionnels: <UL> <LI>Boutons Agrandir et Restaurer; <LI>Pointage dune bordure ou dun coin de lapplication et dplacement de la souris en maintenant le bouton gauche enfonc. </UL> Vous pouvez galement utiliser les commandes "Cacher la barre de navigation" et "Cacher les sites" dans le menu "Outils" pour augmenter la taille de la zone daffichage. <P> Ces commandes sont automatiquement remplaces par (respectivement) "Afficher la barre de navigation" et "Montrer les sites". </body> </html>

Personnalisation.htm
<html> <head> <title>Etendre longlet Astuces </title> </head> <body> Utilisez la commande Personnaliser dans le menu Outils pour accder loutil de personnalisation de lapplication. <P> Les entres des listes droulantes sont disposes dans trois colonnes: <ul> <li>Onglet: Nom de la liste droulante; <li>Nom du site: Nom du site en clair; <li>URL: Adresse URL complte; <li>Commentaire: Texte facultatif qui commente le site. </ul> Pour modifier une cellule, cliquez dessus, utilisez la zone ddition "Cellule en cours" puis appuyez sur la touche Entre du clavier. <P> Si ncessaire, la fentre de personnalisation ainsi que les colonnes du tableau peuvent tre redimensionnes. <p> Lorsque le paramtrage est complet, cliquez sur le bouton Quitter ou sur la case de fermeture pour retourner au Super Navigateur. </body> </html>

582

Visual Basic 2010

Troisime tape: utilisation de lapplication HTML Help Workshop


Lancez lapplication HTML Help Workshop avec la commande Tous les programmes/ HTML Help Workshop/HTML Help Workshop dans le menu Dmarrer. Lancez la commande New dans le menu File. Choisissez Project dans la bote de dialogue et validez en cliquant sur OK. Un assistant vous aide dfinir les informations qui permettront de construire le projet daide. La premire bote de dialogue demande sil sagit de la conversion dun fichier au format .HLP. Laissez la case Convert WinHelp project dcoche et cliquez sur Suivant. Dfinissez le chemin complet du projet daide (disque, dossier et nom) puis cliquez sur Suivant. La troisime bote de dialogue vous demande si vous avez dj conu un fichier sommaire, un fichier index et/ou des fichiers HTML. Cochez la case HTML files (.htm) et cliquez sur Suivant. Vous devez maintenant spcifier les fichiers HTML intgrer au projet daide. Cliquez sur Add et utilisez la bote de dialogue slection multiple Ouvrir pour dsigner en une seule opration lensemble des fichiers utiliser. Cliquez sur Suivant puis sur Terminer pour gnrer le projet daide. La fentre de lappli cation HTML Help Workshop se prsente maintenant comme la Figure24.7.
Figure24.7 La fentre de lapplication HTML Help Workshop aprs lutilisation de lAssistant.

Vous allez maintenant crer un fichier sommaire et un fichier index. Slectionnez longlet Contents. Choisissez loption Create a new contents file dans la bote de dialogue Table of Contents Not Specified. Cliquez sur OK. Donnez un nom au fichier sommaire et cliquez sur Enregistrer pour crer le fichier dextension .HHC.

Chapitre 24

Favoris web

583

Slectionnez longlet Index. Choisissez loption Create a new index file dans la bote de dialogue Index Not Specified. Cliquez sur OK. Donnez un nom au fichier index et cliquez sur Enregistrer pour crer le fichier dextension .HHK. Basculez sur longlet Project et cliquez sur licne Add/Modify window definitions pour dfinir le style de la fentre daide. Utilisez les onglets de la bote de dialogue Windows types pour choisir le titre de la fentre, les boutons afficher dans la fentre, la position de la fentre sur lcran, etc. Dfinissez un fichier texte qui rfrence les diffrentes pages de laide comme la Figure24.8. Sauvegardez ce fichier en lui donnant lextension .H.
Figure24.8 Chaque page a un numro didentification unique.

Cliquez sur le bouton HtmlHelp API Information (quatrime icne dans la fentre HTML Help Workshop). Une bote de dialogue intitule HtmlHelp API Information apparat. Cliquez sur le bouton Header file puis sur le bouton Browse et dsignez le fichier dextension .H que vous venez de crer. Validez en cliquant sur le bouton OK. Basculez sur longlet Alias de la bote de dialogue HtmlHelp API information. Cliquez autant de fois que ncessaire sur le bouton Add pour dfinir tous les alias (voir Figure24.9).
Figure24.9 Dfinition dun alias.

584

Visual Basic 2010

Lorsque tous les alias ont t dfinis, vous devez obtenir quelque chose comme la Figure24.10.
Figure24.10 Tous les alias ont t dfinis.

Fermez la bote de dialogue HtmlHelp API information.

Dfinition du sommaire
Vous allez maintenant concevoir le sommaire de laide. Cliquez sur longlet Contents. Les rubriques seront cres laide de licne Insert a page et les chapitres, laide de licne Insert a heading. titre dexemple, la Figure24.11 reprsente la rubrique Listes droulantes. Linformation qui apparat dans la zone File/URL and their information types a t dfinie en appuyant sur le bouton Add.
Figure24.11 Entre de sommaire Listes droulantes.

Lorsque toutes les entres du sommaire ont t dfinies, la fentre HTML Help Workshop doit ressembler la Figure24.12.

Chapitre 24

Favoris web

585

Figure24.12 Le sommaire est entirement dfini.

Dfinition de lindex
Vous devez tout dabord basculer sur longlet Index. Pour dfinir une entre dindex, cliquez sur licne Insert a keyword, puis entrez un mot dans la zone de texte Keyword. Cliquez autant de fois que ncessaire sur le bouton Add pour lier le mot-cl aux pages de laide. Cliquez sur le bouton Save file lorsque toutes les entres dindex ont t cres. Vous allez maintenant compiler le projet daide pour crer le fichier .CHM correspondant. Basculez sur longlet Project et cliquez sur licne Save all files and compile. Le fichier daide .CHM est cr. Vrifiez quaucune erreur na t dtecte en parcourant le fichier de log (voir Figure24.13).
Figure24.13 Aucune erreur na t dtecte dans le projet daide.

586

Visual Basic 2010

Quatrime tape: interfaage du fichier daide .CHM avec le projet


Pour intgrer le fichier daide .CHM au projet, procdez comme suit: 1. Ajoutez un contrle HelpProvider au projet et indiquez le nom du fichier daide utiliser dans sa proprit HelpNameSpace. 2. Slectionnez lobjet Form1 dans la fentre des proprits et initialisez True sa proprit ShowHelp sur HelpProvider. 3. Droulez le menu Aide de la premire feuille de lapplication et double-cliquez sur lentre Aide SuperNavigateur. Compltez la procdure Menu5Item_Click() comme suit:
Private Sub AideSuperNavigateurToolStripMenuItem_Click(ByVal sender As System. Object, ByVal e As System.EventArgs) Handles AideSuperNavigateurToolStripMenu Item.Click Help.ShowHelpIndex(Me, "c`\AideSN.chm") End Sub

La Figure 24.14 donne un exemple daffichage de laide depuis lapplication "Super Navigateur".
Figure24.14 La fentre daide a t affiche avec la touche F1.

Les fichiers relatifs au projet daide se trouvent dans le dossier Projects\SuperNavigateur\ SuperNavigateur\Aide, aprs installation des sources de louvrage.

25
Services web
Les nouvelles technologies de linformation (telles quInternet et les intranets) ont connu un essor considrable ces dernires annes. Aujourdhui, les dveloppeurs ne peuvent plus ignorer ces mdias qui, peu peu, sont devenus un moyen de communication indispensable pour tout ordinateur qui se respecte. Malheureusement, aucun vrai standard technologique noccupe les devants de la scne. Sil est vrai que le langage HTML est trs rpandu, il est galement vrai quune mme page a toutes les chances de safficher diffremment selon le navigateur ou le systme dexploitation utilis. Un grand nombre de langages sont venus largir les possibilits du HTML, mais, l aussi, la barrire du navigateur a t un vrai frein leur expansion Avec Visual Studio 2010, Microsoft propose un concept qui a toutes les chances de devenir le standard Internet de demain. Pour mieux comprendre ses immenses possibilits, nous allons raisonner sur un exemple. Supposez quun site affiche en continu la valeur du CAC 40 (cours des quarante plus importantes socits franaises cotes en Bourse) et mette cette information la libre disposition des concepteurs de sites. Pour intgrer ce flux de donnes dans une page, le moyen le plus conventionnel consiste insrer un script. Malheureusement, le format daffichage du

588

Visual Basic 2010

CAC 40 imagin par les concepteurs du script a peu de chances de correspondre laspect gnral de la page sur laquelle vous comptez linsrer Imaginez maintenant quil existe un moyen dexposer lobjet CAC 40 sans aucune interface utilisateur, cest--dire en rendant accessibles les seules mthodes et proprits de cet objet. Microsoft a imagin un tel systme. travers son IDE Visual Studio, il est dsormais trs simple de crer des objets sans interfaces. Appels "services web", ces objets peuvent tre considrs comme des botes noires. Ils possdent des proprits accessibles en lecture seule, en criture seule ou en lecture/criture et des mthodes pour effectuer les actions qui ont motiv leur conception. La mise en place de services web semble essentielle pour une socit. Elle permet en effet douvrir les dveloppements internes dautres usages, dautres besoins et dautres clients, extrieurs lentreprise. Il est difficile de prvoir lavance le comportement de la communaut de programmeurs, mais il semble vident, au vu des possibilits offertes par les services web, que ce type dobjet va devenir courant et mme universel dans les annes venir. travers un exemple simple, cette section va vous montrer comment crer, tester et utiliser un service web lmentaire. Ce service va permettre de connatre le nombre de caractres dune de ses proprits chane. Lintrt dun tel service est des plus limit, puisquil suffit dutiliser la fonction Visual Basic Len() pour obtenir le mme rsultat. Il a cependant lavantage de montrer la technique utiliser pour dfinir puis utiliser un service web.

Conception du service
Lancez la commande Nouveau/Site web dans le menu Fichier. Choisissez .NET Framework3.5 dans la liste droulante Framework, puis Services web ASP.NET dans zone de liste centrale. Donnez le nom Service2 au projet et validez. Quelques instants plus tard, le nouveau service web est prt tre dit dans Visual Studio (voir Figure25.1). Ce service lmentaire nutilise aucun composant. Nous allons donc immdiatement intervenir dans le code. En tte du listing, remarquez les trois lignes Imports:
Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols

Ces lignes donnent accs aux fonctionnalits Microsoft propres aux services web. Remarquez la dclaration de la classe Service2:
Public Class Service Inherits System.Web.Services.WebService

Chapitre 25

Services web

589

Ces deux lignes crent la classe Service. Cette classe hrite des fonctionnalits de la classe WebService de Microsoft.
Figure25.1 Visual Studio est prt pour la mise en place du nouveau service web.

Supprimez la fonction HelloWorld():


<WebMethod> Public Function HelloWorld() As String Return "Hello World" End Function

Et remplacez-la par la fonction Longueur suivante:


<WebMethod(Description:="Retourne la longueur de la chane passe", _ EnableSession:=False)> _ Public Function Longueur(ByVal l As String) As Integer Return Len(l) End Function

La premire ligne indique que cette fonction est une WebMethod laquelle on devra accder depuis le Net. La variable Description contient une brve description de la fonction. Comme nous le verrons dans les pages suivantes, cette description apparatra dans la page ASMX gnre par Visual Studio.
<WebMethod(Description:="Retourne la longueur de la chane passe")> _

La fonction Longueur() se dclare comme sil sagissait dune fonction Visual Basic classique. Elle admet un argument String et retourne une valeur Integer:
Public Function Longueur(ByVal l As String) As Integer

590

Visual Basic 2010

La valeur retourne est calcule laide de la fonction Visual Basic Len():


Return Len(l)

Voici le code complet de la classe Service2. Ce code ainsi que les fichiers qui laccompagnent sont disponibles dans le dossier Websites\Service2 aprs installation des sources de louvrage.
Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols <WebService(Namespace:="http://tempuri.org/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class Service Inherits System.Web.Services.WebService <WebMethod(Description:="Retourne la longueur de la chane passe", _ EnableSession:=False)> _ Public Function Longueur(ByVal l As String) As Integer Return Len(l) End Function End Class

Le service est prt lemploi. Appuyez sur la touche F5 ou lancez la commande Dmarrer le dbogage dans le menu Dboguer pour crer les fichiers relatifs au service web. Une bote de dialogue vous signale que le dboguer nest pas activ (voir Figure25.2). Slectionnez loption Modifier le fichier Web.config pour activer le dbogage et cliquez sur OK.
Figure25.2 Vous devez activer le dbogage.

Visual Studio cre une dfinition XML du service et une page web qui permet daccder aux mthodes du service. Au bout de quelques instants, cette page est ouverte dans le navigateur Internet par dfaut (voir Figure25.3).

Chapitre 25

Services web

591

Figure25.3 Cette page donne accs au service web.

Cliquez sur le lien Longueur pour tester la mthode Longueur(). Le navigateur affiche maintenant des informations concernant la mthode Longueur et permet de saisir une valeur chane afin de tester son fonctionnement (voir Figure25.4).
Figure25.4 Le test de la fonction Longueur().

592

Visual Basic 2010

La partie infrieure de la fentre du navigateur indique comment interroger ce service web:


POST /Service2/Service.asmx HTTP/1.1 Host: localhost Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12= "http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <Longueur xmlns="http://tempuri.org/"> <l>string</l> </Longueur> </soap12:Body> </soap12:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12= "http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <LongueurResponse xmlns="http://tempuri.org/"> <LongueurResult>int</LongueurResult> </LongueurResponse> </soap12:Body> </soap12:Envelope> HTTP POST POST /Service2/Service.asmx/Longueur HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: length l=string HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <int xmlns="http://tempuri.org/">int</int>

Chapitre 25

Services web

593

Entrez un texte dans la zone Valeur du paramtre L et cliquez sur Appeler. titre dexemple, nous avons saisi la chane "test de la fonction Longueur()" dans la zone Longueur. LaFigure25.5 donne un aperu des informations renvoyes.
Figure25.5 La longueur de la chane apparat sur la seconde ligne.

Util