http://www.free-livres.com/
Microsoft®
Visual Basic 2010
Codes sources sur
www.pearson.fr
Michel Martin
customer 27921 at Fri Mar 11 19:22:06 +0100 2011 Propriété de Albiri Sigue
LE P R O G RAM M E U R
Visual Basic 2010 Michel Martin
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Pearson Education France a apporté le plus grand soin à la réalisation de ce livre afin de vous fournir une information complète et fiable. Cependant, Pearson Education France n’assume de responsabilités, ni pour son utilisation, ni pour les contrefaçons de brevets ou atteintes aux droits de tierces personnes qui pourraient résulter de cette utilisation. Les exemples ou les programmes présents dans cet ouvrage sont fournis pour illustrer les descriptions théoriques. Ils ne sont en aucun cas destinés à une utilisation commerciale ou professionnelle. Pearson Education France ne pourra en aucun cas être tenu pour responsable des préjudices ou dommages de quelque nature que ce soit pouvant résulter de l’utilisation de ces exemples ou programmes. Tous les noms de produits ou marques cités dans ce livre sont des marques déposées par leurs propriétaires respectifs.
Publié par Pearson Education France 47 bis, rue des Vinaigriers 75010 PARIS Tél. : 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 réservés
Aucune représentation ou reproduction, même partielle, autre que celles prévues à l’article L. 122-5 2˚ et 3˚ a) du code de la propriété intellectuelle ne peut être faite sans l’autorisation expresse de Pearson Education France ou, le cas échéant, sans le respect des modalités prévues à l’article L. 122-10 dudit code.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Sommaire
Introduction........................................................ XIII
13. Traitements multitâches/multicœurs.......... 315 14. Manipulation du Registre de Windows...... 337
I – Faisons connaissance avec Visual Basic 2010
15. Fonctions API............................................... 353 1
16. Implémenter un système d’aide.................. 361
1. Avant de commencer.................................... 3
17. Personnaliser Windows 7............................ 383
2. Le langage et l’environnement.................... 23
18. Visual Basic et Microsoft Office.................. 403
3. Nouveautés et concepts utiles du langage et de l’environnement.................................. 39
19. Programmation WPF.................................. 413
II – Programmation Windows
151
4. Boîtes de dialogue communes..................... 153
III – Programmation Internet
457
20. Composeur téléphonique............................. 459 21. Clients HTTP et FTP................................... 471
5. Un peu plus loin........................................... 169
22. Applications web.......................................... 483
6. Implémenter des menus.............................. 185
23. Annuaire de sites web.................................. 511
7. Barres d’outils et barres d’état................... 201
24. Favoris web................................................... 551
8. Manipulation d’objets graphiques............. 213
25. Services web.................................................. 587
9. Fichiers et dossiers....................................... 241
26. Silverlight...................................................... 607
10. Jouer des sons WAV..................................... 259
27. LINQ............................................................. 643
11. Manipuler des données tabulaires.............. 269
Annexe. Routines utiles..................................... 705
12. Bases de données.......................................... 287
Index.................................................................... 725
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Table des matières
Introduction........................................................ XIII
Commentaires.......................................... 25 Opérateurs............................................... 26
I – Faisons connaissance avec Visual Basic 2010
1
Tests.......................................................... 26 Boucles..................................................... 28
1. Avant de commencer...................................... 3
Conversion de données............................ 28
Configuration requise pour utiliser Visual Basic 2010........................................... 4
Chaînes de caractères.............................. 29
Les différentes é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 d’un programme en Visual Basic......................................... 12 Modification des propriétés des objets.... 14 Écriture du code....................................... 14 Test et débogage....................................... 15
Dates et heures......................................... 29 Collections d’objets................................. 29 L’environnement Visual Studio 2010.............. 31 Définition d’un nouveau projet................ 32 Le système de menus................................ 33 Les barres d’outils................................... 34 Les fenêtres filles...................................... 35 3. Nouveautés et concepts utiles du langage et de l’environnement........................................ 39
2. Le langage et l’environnement...................... 23
Innovations de l’environnement de développement........................................... 41
Le langage Visual Basic.................................. 24
Intégration de WPF dans l’IDE............... 41
Variables.................................................. 24
Projets fondés sur des modèles................ 42
Tableaux................................................... 25
Gestion des projets récents...................... 43
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
VI
Visual Basic 2010
Multitargetting......................................... 44
Méthodes d’extension............................... 68
Zoom dans le code................................... 45
Génériques............................................... 69
Intellisense............................................... 45
Types Valeur Nullable.............................. 71
Naviguer vers........................................... 45
Opérateur IIf............................................ 72
Surbrillance des références...................... 46
Support étendu du code XML................... 72
Recherche des références......................... 47
Délégués non stricts................................. 73
Générer à partir de l’utilisation.............. 48
Expressions Lambda................................ 75
Gestionnaire d’extensions........................ 49
Méthodes partielles.................................. 76
Data Binding avec un glisser-déposer dans WPF................................................. 49
Le langage LINQ...................................... 76
Débogage Intellitrace.............................. 50 Publication en un clic.............................. 50 Tests unitaires.......................................... 52 Migrer un projet existant vers le Framework .NET 4.0.................... 55
Techniques évoluées de Visual Studio 2005/2008 toujours d’actualité dans Visual Studio 2010................ 77 Alignement des contrôles......................... 77 Menus....................................................... 77 Barres d’outils......................................... 80
Innovations du langage Visual Basic 2010..... 57
Info-bulles................................................ 81
Continuation de ligne implicite................ 57
Zone de texte avec marque de saisie........ 82
Implémentation automatique des propriétés........................................... 58
Fenêtre des tâches.................................... 83 Navigateur web........................................ 83
Initialiseurs de collections....................... 58
Refactoring............................................... 83
Syntaxe simplifiée pour déclarer des tableaux............................................. 60
Extraits..................................................... 84
Expressions Lambda multilignes et sous-routine.......................................... 61
L’espace de nom My................................ 89
Covariance et contravariance génériques................................................ 62
Assistant Mise à niveau............................ 149
Prise en charge d’équivalence de type.... 63 Prise en charge dynamique...................... 63
Documenter le code en XML................... 88
Assistant Publication............................... 148
II – Programmation Windows
151
Programmation parallèle......................... 64
4. Boîtes de dialogue communes....................... 153
Concepts avancés issus des versions précédentes de Visual Basic............................ 64
La boîte de dialogue Ouvrir............................ 154
Inférence de type...................................... 64
La boîte de dialogue Couleur.......................... 158
Initialiseurs d’objets................................ 66
Exemple.................................................... 158
Types anonymes....................................... 67
Réalisation............................................... 159
La boîte de dialogue Enregistrer sous............. 157
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Table des matières
VII
La boîte de dialogue Police de caractères....... 160
Définition des procédures de traitement.. 224
Exemple.................................................... 161
Exécution de l’application....................... 227
Réalisation............................................... 161
Affichage d’une horloge à aiguilles................ 228
La boîte de dialogue Imprimer........................ 163
Avant de commencer................................ 229
Exemple.................................................... 164
Mise en place visuelle de l’application.... 229
Réalisation............................................... 165
Définition des procédures de traitement.. 230
La boîte de dialogue Rechercher un dossier... 166
Exécution de l’application....................... 233
Exemple.................................................... 166
La capture d’écran programmée..................... 234
Réalisation............................................... 167 5. Un peu plus loin.............................................. 169 Une application MDI...................................... 169 Création d’un formulaire parent.............. 170 Création d’un modèle de fenêtre enfant... 171
Définition de l’application....................... 234 9. Fichiers et dossiers......................................... 241 Fichiers à accès séquentiel.............................. 242 Fichiers à accès direct..................................... 246 Manipulation de dossiers et de fichiers........... 254
Polices de caractères....................................... 173
10. Jouer des sons WAV..................................... 259
Le Presse-papiers............................................ 179
Mise en place de l’application........................ 259
Accès traditionnel au presse-papiers....... 180
Alimentation du contrôle TreeView................. 261
Accès au presse-papiers via .NET 4.0...... 182
Utilisation du contrôle TreeView..................... 266 Exécution du fichier audio.............................. 266
6. Implémenter des menus................................. 185 Système de menus traditionnel....................... 185 Menu contextuel.............................................. 194
11. Manipuler des données tabulaires.............. 269 Minitableur...................................................... 269 Minigrapheur.................................................. 277
7. Barres d’outils et barres d’état..................... 201 Le contrôle ImageList..................................... 202 Mise en place de la barre d’outils................... 203 Mise en place de la barre d‘état...................... 205 Écriture du code.............................................. 206 Plus loin avec les contrôles ToolStrip............. 211
12. Bases de données.......................................... 287 Accès à une base de données locale................ 287 Accès à une base de données distante............. 294 Définition du service web......................... 294 Utilisation du service web ...................... 298
8. Manipulation d’objets graphiques............... 213
Utilisation plus complète du service web . ....................................... 302
Le système d’affichage graphique GDI+........ 214
Accès à une base de données via LINQ.......... 312
Mise en place d’un économiseur d’écran....... 223
13. Traitements multitâches/multicœurs.......... 315
Mise en place visuelle de l’application.... 223
Exécution d’un calcul en tâche de fond.......... 316
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
VIII
Visual Basic 2010
Exécution d’une application externe............... 322 Parallélisation des boucles.............................. 324
Troisième étape : conception du fichier d’aide .CHM................................................... 371
Utilisation de plusieurs cœurs à l’aide de tâches............................................. 333
Définition du sommaire............................ 377
14. Manipulation du Registre de Windows...... 337
Quatrième étape : interfaçage du fichier d’aide avec un projet Visual Basic ................. 380
L’Éditeur du Registre...................................... 338
Définition de l’index................................. 379
Modification du Registre.......................... 339
17. Personnaliser Windows 7............................ 383
Déplacements dans le Registre................ 340
Informations de la base de données................ 384
Recherches dans le Registre..................... 341
Exécution de programmes........................ 384
Structure du Registre ..................................... 342
Amélioration du fonctionnement de Windows.............................................. 385
HKEY_CLASSES_ROOT......................... 342 HKEY_LOCAL_MACHINE..................... 342 HKEY_CURRENT_CONFIG................... 343
Paramétrage de Windows......................... 388 Réalisation...................................................... 390
HKEY_USERS......................................... 343
18. Visual Basic et Microsoft Office.................. 403
HKEY_CURRENT_USER........................ 343
Prise de contrôle de Microsoft Word.............. 403
Importations et exportations dans le Registre............................................... 343
Mise en place visuelle.............................. 404
Visualiser un fichier REG......................... 345 Exécuter un fichier REG.......................... 345 Créer un fichier REG............................... 345 Exemple de fichier REG........................... 346 Visual Basic et le Registre.............................. 346
Définition des procédures de traitement.. 405 Exécution de l’application....................... 407 Prise de contrôle de Microsoft Excel.............. 408 Mise en place visuelle.............................. 408 Définition des procédures de traitement.. 409 Exécution de l’application....................... 411
Ajout, visualisation et suppression d’une clé................................................... 348
19. Programmation WPF.................................. 413
Accès au Registre par une requête LINQ. 352
Une première application WPF....................... 413
15. Fonctions API............................................... 353 Principales API............................................... 353 Utilisation des API natives et traditionnelles.. 357 16. Implémenter un système d’aide.................. 361 Première étape : collecte des informations utilisées par le système d’aide........................ 363 Deuxième étape : conception des pages HTML des rubriques...................... 363
Les contrôles WPF par défaut......................... 419 Manipuler des éléments multimédias............. 421 Graphiques 2D................................................ 423 Géométries 2D................................................ 424 Segments de droites.................................. 424 Polygones................................................. 425 Arcs elliptiques......................................... 426 Courbes de Bézier.................................... 427
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Table des matières
IX
Ellipses..................................................... 429
Gestion du ComboBox Nom.................... 465
Rectangles................................................ 430
Gestion du bouton de commande............. 466
Géométries combinées............................. 431 Le pinceau................................................ 433 Géométries 3D................................................ 437 Étape 1 – Définition d’un objet Viewport3D............................. 437
21. Clients HTTP et FTP................................... 471 Un client HTTP élémentaire........................... 471 Avant de commencer................................ 472 Mise en place de l’application................. 472
Étape 2 – Définition d’une caméra.......... 438
Définition des procédures de traitement.. 474
Étape 3 – Définition de l’éclairage.......... 438
Exécution de l’application....................... 475
Étape 4 – Implémentation d’un objet....... 439
Un client FTP élémentaire.............................. 476
Le code XAML complet............................ 439
Mise en place de l’application................. 477
Transformations 2D........................................ 441
Définition des procédures de traitement.. 478
Rotation.................................................... 441
Exécution de l’application....................... 480
Modification de l’échelle......................... 442 Inclinaison............................................... 443 Translation............................................... 443 Transformations 3D........................................ 444 Rotation.................................................... 446 Modification d’échelle............................. 447
22. Applications web.......................................... 483 Une première application web........................ 484 Une application web en un seul contrôle........ 488 Valider les données......................................... 493 Envoyer des e-mails avec une application web........................................ 504
Translation............................................... 447 Animations...................................................... 448
23. Annuaire de sites web.................................. 511
Animation de couleurs............................. 448
Mise en place de l’application........................ 512
Animer un objet avec ses propriétés........ 451
Définition des procédures de traitement......... 514
Animer un objet avec une transformation................................... 453
Conversion des fichiers HTML en données ... 529
Pour aller plus loin.......................................... 455
Utilisation du service web ............................. 537
III – Programmation Internet
457
20. Composeur téléphonique............................. 459 Avant de commencer....................................... 460 Mise en place visuelle de l’application........... 460 Définition des procédures de traitement......... 461 Gestion du menu Port............................... 464
Définition du service web............................... 533
24. Favoris web................................................... 551 Mise en place du projet................................... 551 Définition des procédures de traitement......... 554 Définition et implémentation du fichier d’aide.............................................. 578 Première étape : collecte des informations utilisées par le système d’aide................. 579
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
X
Visual Basic 2010
Deuxième étape : conception des pages HTML des rubriques............... 579
Interaction avec le code behind............... 639
Troisième étape : utilisation de l’application HTML Help Workshop... 582
Pour aller plus loin.......................................... 642
Quatrième étape : interfaçage du fichier d’aide .CHM avec le projet...................... 586
Animer la couleur du canevas................. 641
27. LINQ............................................................. 643 LINQ to Objects.............................................. 643
25. Services web.................................................. 587
Liste des processus en cours d’exécution............................................... 643
Conception du service..................................... 588
Accès au Registre..................................... 645
Utilisation du service...................................... 593
Liste des documents récents..................... 647
Utilisation d’un service web existant.............. 598
Liste des fichiers créés ces quinze derniers jours......................... 648
Accès traditionnel au service web........... 600 Accès au service web via My.WebServices................................ 603
LINQ to XML................................................. 649 Axe XML.................................................. 650 LINQ to XML et LINQ to Objects............ 651
26. Silverlight...................................................... 607 Une première application................................ 608
Sauvegarder dans un fichier XML............ 657 Lire un fichier XML.................................. 658
Les fichiers générés par Visual Studio..... 610
Accès aux attributs des marqueurs XML. 660
Les contrôles Silverlight................................. 617
Utiliser un index pour accéder aux éléments d’une collection.................. 662
Mise en page............................................ 617 Contrôles d’affichage............................... 622 Contrôles de commande........................... 631 Transformation d’objets.................................. 632
Extraire des éléments XML d’un XElement.......................................... 663 Utiliser des espaces de nom..................... 664 Requêtes LINQ to XML types................... 666
Rotation.................................................... 632
LINQ to DataSet............................................. 680
Transformation d’échelle......................... 633
LINQ to SQL.................................................. 683
Translation............................................... 634 Inclinaison............................................... 634
Les étapes nécessaires à l’interrogation LINQ to SQL............................................ 684
Combiner des transformations................. 635
Requêtes LINQ to SQL types................... 689
Animation d’objets......................................... 636
Pour aller plus loin.................................. 704
Modification de la largeur d’un contrôle. 637
Annexe. Routines utiles..................................... 705
Modification de l’opacité d’un contrôle.. 638
Routine de tri.................................................. 705
Ne pas démarrer une animation au chargement de la page........................ 639
Une image en fond de fiche............................ 707 Exécuter un programme externe..................... 708
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Table des matières
XI
Connaître le chemin de l’application.............. 710
Jouer un son WAV........................................... 721
Chemin des dossiers spéciaux de Windows.... 710
Ouvrir et fermer une application..................... 721
Liste des unités de disque disponibles ........... 711
Relancer et arrêter Windows........................... 721
Exécuter les modules du Panneau de configuration........................... 714
Savoir si l’ordinateur est connecté à Internet......................................................... 722
Résolution de l’écran...................................... 715 Mettre l’écran en veille................................... 716 Déplacer la souris et suivre ses déplacements............................................. 718
Créer un e-mail............................................... 722 Afficher une page web.................................... 723 Index.................................................................... 725
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Introduction
Cet ouvrage est dédié au langage de programmation vedette de Microsoft : Visual Basic 20101. De nombreuses raisons font qu’aujourd’hui ce langage est un des plus utilisés au monde :
∑
Il est facile à apprendre, y compris pour des personnes n’ayant jamais "touché" à la programmation.
∑
Il offre une approche totalement orientée objet, ce qui simplifie le développement d’applications de grande envergure et/ou complexes.
∑
Il est suffisamment puissant pour fournir toutes les ressources nécessaires aux programmeurs avancés.
∑
Il est extensible. De nombreuses sociétés proposent des composants annexes qui limitent dans de grandes proportions le développement de code spécialisé.
∑
Il produit tout aussi facilement des applications destinées à être exécutées dans un environnement Windows (Windows Forms ou WPF) ou Internet (ASP.NET ou Silverlight).
∑
Il est totalement compatible avec Windows 7, le dernier système d’exploitation de Microsoft.
∑
Il sait parfaitement dialoguer avec les applications de bureautique les plus utilisées au monde (le traitement de texte Microsoft Word et le tableur Microsoft Excel) afin d’automatiser la création de fichiers dans ces applications.
∑
Il utilise un langage de requêtage universel très puissant appelé LINQ. Grâce à lui, le programmeur peut interroger toutes sortes de collections, qu’elles proviennent d’objets
1. Dans certains écrits ou sur certains sites web, Visual Basic 2010 est aussi appelé Visual Basic 10. Il s’agit en effet de la dixième version du langage.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
XIV
Visual Basic 2010
créés par les méthodes propres à Visual Basic, d’une base de données locale ou distante ou encore de documents XML. ∑ Enfin, il est armé pour la programmation parallèle, afin de tirer le meilleur parti des processeurs multicœurs qui occupent aujourd’hui la plupart de nos ordinateurs. Cet ouvrage est divisé en trois parties indépendantes : "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 pénalisé s’il n’a pas abordé les autres sujets. Ce livre se décompose de la façon suivante : ∑ Faisons connaissance avec Visual Basic 2010 (Chapitres 1 à 3). Cette partie vous aide à débuter dans l’univers de la programmation en Visual Basic. Après avoir pris connaissance de la procédure d’installation de Visual Studio 2010, vous aurez un aperçu de ses principales nouveautés (implémentation automatique des propriétés, initialiseurs de collections, continuation de ligne implicite, expressions Lambda multilignes et sousroutine, prise en charge d’équivalence de type, prise en charge dynamique, covariance et contravariance, programmation parallèle, 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, inférence de type, types anonymes, délégués non stricts, expressions Lambda, LINQ, etc.). Vous découvrirez ensuite les instructions du langage et vous verrez comment convertir les programmes écrits dans une version antérieure de Visual Basic. ∑ Programmation Windows (Chapitres 4 à 19). La deuxième partie de l’ouvrage est la plus volumineuse. À travers de nombreux exemples, elle vous montre comment aborder la plupart des domaines de programmation Windows : utilisation des boîtes de dialogue, mise en place de menus, barres d’outils et barres d’état, manipulations graphiques, accès au système de fichiers, exploitation de données tabulaires, bases de données locales et distantes, accès au Registre de Windows, interfaçage de Word et d’Excel, etc. Tous les codes présentés dans cette partie sont réutilisables : un copier-coller est généralement suffisant pour les incorporer dans vos propres développements. Cette partie s’intéresse essentiellement aux applications Winform, basées sur GDI+, mais également aux applications WPF (Windows Presentation Foundation), basées sur un mode graphique vectoriel extrêmement performant. ∑ Programmation Internet (Chapitres 20 à 27). Cette troisième partie aborde différents aspects de la programmation Télécom, Internet et Silverlight. Après avoir appris à composer des numéros de téléphone par l’intermédiaire d’un modem RTC, vous verrez à quel point il est simple de créer un client HTTP pour naviguer sur le Web et un client FTP pour télécharger des fichiers. Vous découvrirez également comment définir et exploiter vos propres services web. Enfin, vous apprendrez à réaliser des programmes ASP.NET et Silverlight destinés à être utilisés dans un navigateur web et vous verrez comment tirer parti de la technologie LINQ.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Introduction
XV
Les sources de l’ouvrage Les éditions Pearson mettent à votre disposition l’ensemble des solutions passées en revue au fil des pages, sur le site www.pearson.fr, à la page dédiée à cet ouvrage. Ces solutions sont rassemblées dans une archive au format ZIP composée de deux dossiers principaux : Projects et WebSites. Pour faciliter l’accès aux solutions contenues dans ces dossiers, il suffit de copier ces derniers dans le dossier Documents\Visual Studio 2010\ 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 l’ouvrage seront ainsi directement accessibles. Pour utiliser ce livre, vous devez posséder une édition de Visual Studio 2010/Visual Basic 2010 (y compris la version gratuite Visual Studio/Visual Basic 2010 Édition Express). Si vous disposez d’une connexion Internet haut débit, rendez-vous à l’adresse http://www. microsoft.com/express/downloads/. Vous pourrez y télécharger gratuitement Visual Basic 2010 Express (voir Figure 0.1). Figure 0.1 La page de téléchargement de Visual Basic 2010 Express.
Notez qu’il est également possible de télécharger la version Professionnelle de Visual Studio 2010, limitée à 90 jours d’utilisation, en vous rendant sur la page http://www.microsoft.com/france/visualstudio/download?CR_CC=_100352438_&wt.srch=1&CR_ SCC=100352438 (voir Figure 0.2).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
XVI
Visual Basic 2010
Figure 0.2 La page de téléchargement de Visual Studio 2010 Professional.
Rubriques spéciales de ce livre ce Astu
Les Astuces fournissent des remarques particulières ou des raccourcis inha bituels du langage.
Info
Les Infos donnent des informations complémentaires sur le sujet étudié, sans être indispensables pour la tâche en cours.
ntion Atte
Ces avertissements portent sur des actions à risque, lorsqu’une tâche n’est pas accomplie de façon correcte.
ition Défin
Les nouveaux termes sont placés en italique et explicités dans le texte.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
I Faisons connaissance avec Visual Basic 2010 Cette partie va vous aider à débuter dans l’univers de la programmation en Visual Basic 2010. Après avoir vérifié que votre ordinateur et votre système d’exploitation sont compatibles avec l’environnement de développement Visual Studio 2010, vous découvrirez les différentes éditions du langage et vous apprendrez à les installer. Ensuite, vous ferez connaissance avec les instructions du langage, puis avec l’environnement de dévelop pement. Enfin, si vous n’êtes toujours pas convaincu des immenses possibilités de Visual Basic 2010, un chapitre passant en revue les nouveautés du langage et de l’environnement vous persuadera, j’en suis sûr.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
1 Avant de commencer Au sommaire de ce chapitre
∑ Configuration requise pour utiliser Visual Basic 2010 ∑ Les différentes versions de Visual Basic 2010 ∑ Installation de Visual Studio 2010 ∑ Premier contact avec Visual Basic 2010 Les éléments qui composent votre ordinateur (processeur, mémoire, disque dur, carte graphique) sont-ils assez puissants pour vous permettre d’utiliser Visual Basic 2010 ? Qu’en est-il de votre système d’exploitation ? Devrez-vous en changer ou faire une mise à jour ? Ce premier chapitre répond à toutes ces questions. Une fois ces problèmes matériels et logiciels réglés, vous découvrirez les différentes éditions de Visual Basic/Visual Studio et vous verrez comment les installer. Enfin, vous apprendrez les différentes notions qu’il est bon d’avoir à l’esprit pour programmer en Visual Basic 2010.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
4
Visual Basic 2010
Configuration requise pour utiliser Visual Basic 2010 Pour être en mesure d’installer et d’utiliser Visual Basic 2010, vous devez disposer d’un PC équipé comme suit :
∑ ∑
Processeur Pentium à 1 600 MHz ou plus.
– Windows XP SP3 x86 (toutes les éditions sauf Starter) ; – Windows Vista 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. Mémoire : 1 Go (1,5 Go si l’exécution se fait dans une machine virtuelle). Un disque dur disposant au minimum d’un espace libre de 3 Go. Un écran capable d’afficher en 1 024 × 768 points ou plus. Un lecteur de DVD-ROM, ou un outil de virtualisation de lecteur de DVD-ROM si vous utilisez une image ISO téléchargée sur Internet.
∑ ∑ ∑ ∑
Système d’exploitation :
Les différentes éditions de Visual Basic 2010 Pour répondre au mieux aux attentes des différents développeurs Visual Basic, Microsoft propose plusieurs déclinaisons de son langage vedette :
∑
Visual Basic 2010 Express Édition. Ce produit regroupe tous les outils nécessaires pour développer des applications Windows et Internet. Il est particulièrement bien adapté aux programmeurs débutants qui veulent faire leurs premiers pas avec ce langage. Vous pourrez télécharger gratuitement Visual Basic 2010 Express Édition à l’adresse http:// www.microsoft.com/express/downloads/.
∑
Visual Studio 2010 Professional. Ce produit permet au développeur de déployer des applications sur diverses plateformes dont Windows, le Web, les services Cloud, Office et SharePoint. Il prend en charge plusieurs écrans, donne accès à des concepteurs visuels pour exploiter diverses plateformes (dont Windows 7) et propose des fonctionnalités capables d’effectuer des tests complets du code.
∑
Visual Studio 2010 Premium. Cette édition inclut une panoplie d’outils qui simplifient le développement d’applications, individuellement ou en équipe. Les tests codés
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
5
de l’interface utilisateur permettent d’automatiser les essais d’applications web et Windows. Les outils de couverture garantissent que les tests englobent tout le code. L’analyse d’impact de test génère une liste de tests recommandés après une modification de code. Les outils de cycle de vie (développement hors ligne de schémas de bases de données, participation à des méthodologies agile, etc.) peuvent s’appliquer aux tâches de développement de bases de données. Les outils d’analyse du code vous aident à vérifier les erreurs de codage les plus courantes avant l’étape de production. Enfin, l’édition Premium permet de générer des données de test pour alimenter une base de données, afin de ne pas utiliser les données réelles.
∑
Visual Studio 2010 Ultimate. Cette édition inclut une suite d’outils de gestion du cycle de vie des applications afin de permettre à des équipes de développeurs de garantir des résultats de qualité, de la conception au déploiement. Visual Studio 2010 Ultimate cible un grand nombre de plateformes et de technologies, dont les services Cloud et le calcul en parallèle. La fonctionnalité Intellitrace permet aux testeurs d’archiver les bogues et aux développeurs de les reproduire dans l’environnement exact où ils ont été rencontrés. L’explorateur d’architectures facilite la compréhension des fonctionnalités du code existant et de leurs interdépendances. Le diagramme de couches permet de définir et de communiquer une architecture d’application logique, et de valider des artefacts de code par rapport à l’architecture requise. Vous pouvez ainsi contrôler vos efforts de développement afin d’obtenir une application conforme au projet d’origine. Visual Studio Test Professional 2010 est inclus dans Visual Studio. Il permet de capturer et de mettre à jour les tests, d’automatiser la navigation dans les tests manuels et d’accélérer le cycle de correction et d’acceptation en capturant tout le contexte de test. Enfin, cette édition est optimisée pour les processus de développement interactif actuels. Elle offre des fonctionnalités qui vous aident à rester productif et à réagir aux risques potentiels avant qu’ils ne se concrétisent. L’intégrité du projet est ainsi surveillée de façon automatique à l’aide de rapports générés automatiquement.
∑
Visual Studio 2010 Test Professional. Destinée aux équipes d’assurance qualité, cette édition inclut un ensemble d’outils qui simplifient la planification et l’exécution manuelle de tests. Elle permet aux testeurs et aux développeurs de collaborer efficacement tout au long du cycle de développement d’une application. Entre autres possibilités : alignement et suivi des objectifs d’un projet, capture automatique d’informations importantes pendant un test et inclusion de ces informations dans les rapports de bogues, archivage des bogues interactifs et détaillés dans les informations système, réutilisation de tests manuels, amélioration du processus de test (plans, suites et scénarii de tests).
Vous voulez en savoir plus sur les différences entre les éditions de l’interface de développement ? Rendez-vous sur la page http://www.microsoft.com/france/visualstudio/ products/2010-editions/ qui donne accès aux caractéristiques détaillées de chaque édition (voir Figure 1.1).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
6
Visual Basic 2010
Figure 1.1 Les liens En savoir plus donnent accès aux caractéristiques détaillées des éditions de Visual Studio 2010.
Installation de Visual Studio 2010 Insérez le DVD-ROM d’installation de Visual Studio dans le lecteur1. Au bout de quelques instants, une boîte de dialogue vous propose d’installer Visual Studio 2010. Cliquez sur Installer Microsoft Visual Studio 2010 et patientez jusqu’à l’affichage de la fenêtre principale d’installation (voir Figure 1.2). Cliquez sur Suivant, parcourrez les termes du contrat de licence, sélectionnez l’option J’ai lu les termes du contrat de licence et je les accepte, entrez la clé du produit, votre nom d’utilisateur puis cliquez sur Suivant. L’Assistant d’installation vous propose d’installer plusieurs langages et environnements de développement (voir Figure 1.3). Si vous sélectionnez l’option Complète, tous les composants nécessaires à la génération de solutions pour Windows, le Web, Azure, Office System, SharePoint et SQL Server à l’aide des langages Visual Basic, Visual C#, Visual C++ et Visual F# seront installés. Ces composants seront complétés par le kit de développement Windows SDK, Sync Framework, une bibliothèque de graphiques et des outils de tests unitaires.
1. Si vous avez téléchargé l’image ISO de Visual Studio sur MSDN, Microsoft Technet, ou un autre site du même type, il est inutile de la graver sur un DVD pour installer Visual Studio : téléchargez gratuitement l’utilitaire Daemon Tools sur www.daemon-tools.cc, installez cette application et montez l’image de Visual Studio pour installer votre nouvel environnement de développement.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
7
Figure 1.2 Boîte de dialogue principale d’installation de Visual Studio 2010.
Figure 1.3 Quels langages voulez-vous installer ?
Si vous ne souhaitez n’utiliser qu’une partie de ces composants, sélectionnez l’option Personnalisée, cliquez sur Suivant, cochez les cases correspondant aux langages/environnements à installer (voir Figure 1.4), désignez le dossier d’installation puis cliquez sur Installer.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
8
Visual Basic 2010
Figure 1.4 Cette boîte de dialogue vous permet de limiter l’installation aux seuls composants qui vous seront utiles.
Armez-vous de patience, le processus d’installation est très long et demande un redémarrage de l’ordinateur… Lorsque Visual Studio est entièrement installé, une dernière boîte de dialogue affiche des normes de sécurité (voir Figure 1.5). Prenez-en connaissance et cliquez sur Terminer. Pour accéder à l’application 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 Démarrer.
Info
Si vous utilisez Windows 7 ou Vista, le lancement de Visual Studio est quelque peu simplifié : cliquez sur Démarrer, tapez visual dans zone de texte Rechercher et cliquez sur Microsoft Visual Studio 2010, dans la partie supérieure du menu Démarrer.
Au premier démarrage, vous devez indiquer le langage de programmation que vous utiliserez le plus fréquemment (voir Figure 1.6).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
9
Figure 1.5 L’installation est terminée.
Figure 1.6 Quel langage allez-vous utiliser le plus fréquemment ?
Sélectionnez Paramètres de développement Visual Basic dans la liste et cliquez sur Démarrer Visual Studio (voir Figure 1.7).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
10
Visual Basic 2010
Figure 1.7 La fenêtre de Visual Studio, juste après son ouverture.
Premier contact avec Visual Basic 2010 Les premiers langages informatiques étaient de type "procédural". Regroupé dans un unique listing, le code s’exécutait en séquences, de la première à la dernière instruction. Les instructions le plus fréquemment utilisées étaient regroupées dans des procédures qui pouvaient être appelées une ou plusieurs fois dans le code principal. Aujourd’hui, la plupart des langages sont "orientés objets". À l’image de tous ses contemporains, Visual Basic 2010 suit cette évolution et manipule différents "objets" fournis par Microsoft ou des d’autres sociétés. Un ou plusieurs blocs d’instructions sont attachés à chacun des objets utilisés dans une application. Lorsqu’un objet est sollicité par un clic de souris, une frappe au clavier ou un événement d’un autre type, Visual Basic recherche le bloc de code correspondant. S’il existe, il est exécuté ; dans le cas contraire, aucune action n’en découle. Une application écrite en Visual Basic est donc constituée d’un ensemble de petits programmes indépendants qui sont exécutés lorsque certains événements propres aux objets utilisés surviennent. C’est la raison pour laquelle Visual Basic 2010 est qualifié de "langage orienté objets". L’utilisation d’objets offre plusieurs avantages dignes d’intérêt, en particulier :
∑
La programmation devient facilement modulaire. La POO (programmation orientée objets) rattache en effet un ou plusieurs blocs de code à chaque objet. Ces blocs sont exécutés de façon événementielle.
∑
Le programmeur n’a pas à connaître de façon détaillée le fonctionnement des objets qu’il utilise. Il suffit qu’il ait une idée de leur fonction et sache comment les interfacer par
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
11
l’intermédiaire des variables et des méthodes qui leur sont propres. Dans la plupart des cas, les éléments permettant d’interfacer un objet sont largement commentés par ses auteurs. Parfois même, un ou plusieurs exemples élémentaires sont fournis avec chaque objet.
∑
Le débogage d’une application orientée objets se limite à celui du code événementiel que vous avez écrit. Les objets utilisés sont (en principe) totalement débogués et prêts à l’emploi.
Les "solutions" Visual Basic Les applications écrites en Visual Basic 2010 sont appelées "solutions". Elles peuvent consister en un ou plusieurs projets1. Chaque projet peut contenir une ou plusieurs feuilles (également appelées formulaires, ou forms en anglais). Enfin, différents fichiers identifiés par leur extension sont associés à chaque feuille. Examinons les fichiers créés pour une hypothétique solution de type "Application Windows Forms" constituée d’un projet unique et d’une feuille unique appelée Premier :
∑
Premier.sln. Ce fichier contient diverses informations relatives à la solution et au projet qui la compose. C’est 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 procédures événementielles (et éventuellement non événementielles) relatives à la feuille Form1.
∑
Form1.Designer.vb. Ce fichier décrit les caractéristiques de la feuille (dimensions, titre, apparence, bordure, couleur, etc.) et des contrôles placés sur la feuille (position, dimensions et autres propriétés).
∑
Form1.resx. Ce fichier décrit les ressources utilisées par la feuille Form1. Ces ressources sont automatiquement intégrées à l’exécutable ou à la DLL de l’application lors de la compilation. Si l’une d’elles change, il suffit donc de recompiler le programme pour que la modification soit prise en compte.
∑ ∑
Premier.vbproj. Ce fichier décrit le projet et les différents fichiers qui le composent.
∑
App.config (ou Web.config). Fichier de configuration de l’application.
Premier.vbproj.user. Ce fichier contient les options propres au projet. Grâce à lui, vous retrouverez toutes les personnalisations faites sur votre projet dès son ouverture.
Tous ces fichiers sont gérés de façon transparente par Visual Studio. En tant que programmeur Visual Basic 2010, vous n’aurez de réelle interaction qu’avec le fichier .sln, lors de son ouverture dans l’environnement de développement. 1. Toutes les solutions développées dans cet ouvrage sont constituées d’un seul et unique projet.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
12
Visual Basic 2010
Écriture d’un programme en Visual Basic Les programmes que vous écrirez peuvent être courts ou longs, simples ou complexes – tout dépend des objectifs à atteindre. Par exemple, pour calculer et afficher le sinus d’un angle, une seule instruction suffit. Par contre, pour simuler le fonctionnement d’une calculatrice de poche, une bonne centaine de lignes de code sont nécessaires. Comment devez-vous programmer pour être efficace ? La plupart des programmeurs débutants sont tentés par la saisie directe de code dans l’éditeur. Cette technique donne d’assez bons résultats tant que le programme à développer est court et/ou simple. Mais vous courez à l’échec si votre programme est constitué d’un grand nombre de lignes ou repose sur des concepts que vous ne maîtrisez pas parfaitement. Mais alors, comment programmer ? Nous allons partir d’une remarque. La plupart des programmes peuvent être modélisés sous la forme d’une boîte noire (voir Figure 1.8). Figure 1.8 Modélisation élémentaire d’un programme.
Une ou plusieurs données sont fournies au programme. Le résultat à atteindre est obtenu en appliquant un ou plusieurs traitements à ces données. Par exemple, pour calculer les solutions d’une équation du second degré, l’utilisateur doit fournir les valeurs des constantes a, b et c : ax2 + bx + x = 0
Le traitement consiste à appliquer les formules que tout bon lycéen se doit de connaître… delta = b2 – 4ac
Si le déterminant delta est négatif, il n’existe aucune solution. Si le déterminant est positif, les solutions sont (–b – racine(delta)) / 2a et (–b + racine(delta)) / 2a. Si le déterminant est nul, il existe une solution unique égale à –b / 2a. Le schéma "boîte noire" est donc conforme à la Figure 1.9.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
13
Figure 1.9 Modélisation de la résolution d’une équation du second degré.
La plupart des programmes peuvent être divisés en trois parties : ∑ acquisition des données ; ∑ calculs ; ∑ affichage des résultats. La plupart du temps, l’acquisition des données se fait par l’intermédiaire de l’interface utilisateur, c’est-à-dire via la fenêtre d’exécution du programme. Vous devez concevoir une interface aussi simple et intuitive que possible pour ne pas dérouter l’utilisateur. Parfois l’acquisition des données peut se faire à l’intérieur d’une base de données locale ou distante. Dans ce cas, assurez-vous que vous connaissez l’emplacement, le nom, la structure et éventuellement le mot de passe de la table qui contient les données. Les calculs sont généralement déclenchés par l’utilisateur : appui sur un bouton de commande, fin de la saisie des données, etc. Placez le "déclencheur" des calculs à l’endroit le mieux approprié. Lorsque les calculs à effectuer sont complexes, veillez à les décomposer en plusieurs étapes élémentaires, simples à comprendre et à mettre en œuvre. Les résultats peuvent s’afficher dans la fenêtre d’exécution, enregistrés dans un fichier local, envoyés sur un site FTP ou dans un e-mail, etc. Assurez-vous que vous disposez de tous les renseignements nécessaires à l’affichage ou à l’enregistrement des résultats avant de commencer la saisie du programme. Vous l’aurez compris, il est important de réfléchir aux objectifs du programme, à sa présentation et à la façon dont les résultats vont être calculés avant de vous installer devant votre clavier. Apportez un soin particulier à la conception de l’interface utilisateur. N’hésitez pas à en créer plusieurs versions sur papier et à en parler à votre entourage (toute personne étrangère au projet peut en effet être de bon conseil). Si la cohérence et la simplicité de l’interface sont des paramètres très importants pour l’utilisateur final, ne négligez pas pour autant le code de votre programme. Veillez en particulier à le documenter et à hiérarchiser autant que possible les tâches complexes pour les décomposer en un enchaînement de tâches élémentaires, faciles à mettre au point et à contrôler… Quelles que soient la nature et l’envergure d’un projet Visual Basic, vous respecterez les étapes chronologiques suivantes : 1. Réflexion. Cette étape se fait généralement sur papier. Identifiez les données à traiter et les données à recueillir. Déduisez ensuite les traitements à mettre en œuvre pour obtenir les secondes à partir des premières.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
14
Visual Basic 2010
2. Création de l’interface. Mettez en place les objets (ou contrôles) nécessaires pour acquérir les données à traiter en utilisant les icônes de la Boîte à outils. 3. Modification des propriétés des objets. Utilisez la fenêtre des Propriétés pour modifier l’apparence et/ou le comportement des objets dans l’interface. 4. Écriture du code. Employez l’éditeur de code pour écrire les instructions de traitement événementiel des objets dans l’interface. 5. Test et débogage. Passez en revue tous les contextes possibles pour débusquer d’éventuelles erreurs à l’exécution. Si nécessaire, implémentez un "piège à erreurs" afin d’en faciliter l’identification (voir la section "Test et débogage" 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 compressée sur Internet, disque dur partagé sur un réseau) aux personnes concernées.
Modification des propriétés des objets Jusqu’ici, nous avons parlé des instructions et des fonctions propres au langage. Un autre point a une importance fondamentale en Visual Basic : l’accès aux propriétés des objets. Tous les objets ont un nom (qui est lui-même une propriété). Pour affecter une valeur à une propriété d’un objet donné, vous utiliserez une instruction du type : Nom.Propriété = Valeur
Supposons que vous vouliez affecter le contenu de la variable chaîne R à la propriété Text du contrôle zone de texte nommé Résultat. Vous utiliserez l’instruction ci-après : Résultat.Text = R
Supposons maintenant que vous vouliez redéfinir la hauteur de la feuille nommée Form1. Vous devez modifier la propriété Height par une instruction du type : Form1.Height = 3000
Écriture du code L’écriture du code se fait dans le volt central de l’environnement de développement, sous l’onglet FormX.vb1. Cet onglet apparaît automatiquement lorsque vous double-cliquez sur un objet déposé sur la feuille de l’interface. La procédure événementielle la plus probable est alors créée (voir Figure 1.10). 1. Ici, FormX représente le nom par défaut donné à la feuille X de la solution.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
15
Figure 1.10 Création de la procédure Form1_Load() après un double-clic sur la fenêtre de l’application.
Vous pouvez également accéder à l’éditeur de code à l’aide de la commande Code du menu Affichage (raccourci clavier : touche F7). Pour créer la procédure événementielle de votre choix, il suffit de sélectionner un objet dans la liste déroulante Nom de la classe, et un événement dans la liste déroulante Nom de la méthode (voir Figure 1.11). Figure 1.11 Ces deux listes déroulantes permettent de créer la procédure événementielle de votre choix.
Test et débogage Cette section étudie les différents types d’erreurs que vous pouvez rencontrer pendant la réalisation et la mise au point d’un projet. Ces erreurs peuvent être réparties dans quatre grands groupes :
∑
Les erreurs de saisie. Comme l’indique leur nom, elles interviennent lors de la saisie du code. Généralement anodines, elles ne demandent qu’un ou deux clics pour disparaître.
∑
Les erreurs de compilation. Il s’agit essentiellement d’erreurs de saisie qui n’ont pas été corrigées, par étourderie ou par paresse ! Le "boguicide" intégré à Visual Basic 2010 localise instantanément toutes ces erreurs.
∑
Les erreurs d’exécution. Elles sont causées par une instruction dont la syntaxe est correcte, mais dont les paramètres ne sont pas autorisés. La ligne mise en cause est clairement indiquée par Visual Basic pendant l’exécution.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
16
∑
Visual Basic 2010
Les comportements anormaux à l’exécution. De toutes les erreurs, ce sont les plus difficiles à identifier, surtout si le code est long et/ou complexe. Pour les dépister, vous utiliserez le débogueur intégré de Visual Basic : points d’arrêt, exécution pas à pas, fenêtre de débogage, etc. Bref, la grosse artillerie !
Les erreurs de saisie Pendant la saisie, la touche Entrée du clavier permet de passer d’une 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 débusquer une erreur de syntaxe. Dans l’exemple ci-après, l’instruction For n’est pas complète. Visual Basic détecte l’erreur lorsqu’on appuie sur la touche Entrée. Le problème est signalé dans la fenêtre Liste d’erreurs, généralement affichée dans la partie inférieure de l’IDE (voir Figure 1.12). Figure 1.12 Une instruction For sans To génère une erreur pendant la saisie.
Vous pouvez :
∑
Double-cliquer sur l’entrée correspondante dans la fenêtre Liste d’erreurs pour accéder à la ligne de code contenant l’erreur.
∑
Appuyer sur F1 pour avoir plus d’informations sur le type de l’erreur. Une fenêtre d’aide plus complète s’affiche.
Les erreurs de compilation Lorsque vous lancez une application en appuyant sur F5, seule la partie de code nécessaire à l’affichage de la fenêtre de départ est exécutée. Il est possible qu’une ou plusieurs lignes
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
17
d’une procédure annexe contiennent des erreurs de syntaxe. Ces erreurs ne sont découvertes que lorsque la portion de code correspondante est exécutée.
Les erreurs d’exécution Les instructions sont toutes correctes, et pourtant une erreur est générée lors de l’exécution. Il peut s’agir d’une utilisation incorrecte d’une fonction mathématique ou d’un passage de paramètre incorrect à une fonction Visual Basic. Dans l’exemple ci-après, une instruction Math.Sin tente de calculer le sinus d’une valeur chaîne : 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 affectée à la variable st ne peut pas être affichée, car infinie. Le code produit une erreur d’exécution (voir Figure 1.13). Figure 1.13 La boîte de dialogue affichée suite à une erreur d’exécution.
Utilisez les informations affichées dans la boîte de dialogue pour corriger l’erreur. Si nécessaire, cliquez sur un conseil de dépannage ou sur une action pour accéder aux informations correspondantes.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 l’ouvrage. Exécutez ce projet en choisissant la commande Démarrer le débogage du menu Déboguer (raccourci clavier : touche F5). Aucune erreur de compilation n’est détectée. L’outil Crayon étant sélectionné, tracez quelques courbes harmonieuses en maintenant le bouton gauche de la souris enfoncé. Malédiction ! Le tracé ne suit pas la souris et se comporte d’une façon plutôt étrange. Figure 1.14 L’outil Crayon ne donne pas le résultat escompté.
D’où peut bien provenir le problème ? Certainement de la procédure MouseMove, puisqu’il se produit pendant le déplacement de la souris. Examinons cette procédure : 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
L’erreur est facilement identifiable. Elle se trouve dans l’instruction qui mémorise l’ordonnée de la souris dans la variable AncY. Il faut bien entendu écrire : AncY = e.Y
et non : AncY = e.X
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
19
Relancez le programme. Maintenant, l’outil Crayon fonctionne. Sélectionnez l’outil Trait et tentez de tracer quelques lignes droites. Cet outil se comporte comme l’outil Crayon. D’après vous, dans quelle procédure l’erreur se trouve-t-elle ? Réponse : dans la procédure ToolStrip1_ItemClicked(), qui sélectionne l’outil de dessin Trait lorsque l’utilisateur clique sur le deuxième bouton de la barre d’outils. Examinons cette procédure d’un peu plus près : 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
L’erreur se trouve dans la deuxième instruction Case. Il faut sélectionner non pas le premier outil : OutilEnCours = 0
mais le second : OutilEnCours = 1
Lorsque la localisation de l’erreur est moins évidente, on a recours à une "division dicho tomique" de la procédure incriminée.
Info
Dans un programme, une division dichotomique consiste à définir un point d’arrêt au milieu de la procédure qui pose problème. Si l’application s’exécute jusqu’au point d’arrêt sans erreur, la suite du code est à nouveau divisée en deux et le point d’arrêt est reporté sur la seconde moitié du code, et ainsi de suite. Deux ou trois migrations du point d’arrêt suffisent en général pour localiser la source de l’erreur.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
20
Visual Basic 2010
Pour placer un point d’arrêt, il suffit de cliquer dans la marge de la ligne concernée ; une puce rouge s’affiche (voir Figure 1.15). Figure 1.15 La ligne AncX = e.X contient un point d’arrêt.
Le programme s’arrête juste avant l’instruction marquée d’un point d’arrêt. Vous pouvez poursuivre l’exécution de quatre façons différentes. Appuyez sur :
∑
F11 pour continuer en mode "pas à pas détaillé". L’instruction suivante est exécutée et le programme s’arrête.
∑
Maj+F10 pour continuer en mode "pas à pas principal". L’instruction suivante est exécutée. S’il s’agit d’un appel de procédure, toutes les instructions qui composent la procédure sont exécutées (contrairement au pas à pas détaillé) et le programme s’arrête.
∑
F9 pour continuer à vitesse normale jusqu’à l’instruction sur laquelle est placé le point d’insertion.
∑
F5 pour poursuivre l’exécution à vitesse normale jusqu’à ce que le point d’arrêt soit à nouveau rencontré.
Pour supprimer un point d’arrêt, il suffit de cliquer sur la puce rouge correspondante, dans la marge du code. Pour aller encore plus loin, vous pouvez définir une trace (TracePoint). Cliquez du bouton droit sur la puce rouge qui matérialise le point d’arrêt et choisissez l’entrée Lorsqu’il est atteint dans le menu. Une boîte de dialogue semblable à la Figure 1.16 s’affiche. Figure 1.16 Définition d’une trace.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 1
Avant de commencer
21
Cochez la case Afficher un message et définissez l’expression à afficher. Par exemple, pour connaître la valeur de la propriété e.X, vous utiliserez le message suivant : La propriété e.X a pour valeur {e.X}
Validez en cliquant sur OK. La puce rouge se transforme en un losange afin de matérialiser la trace. Exécutez le programme en appuyant sur la touche de fonction F5. Les messages générés par la trace s’affichent dans la fenêtre de sortie, comme à la Figure 1.17. Si cette fenêtre n’est pas apparente dans l’IDE, lancez la commande Sortie dans le menu Affichage ou appuyez sur Ctrl+Alt+O. Figure 1.17 La valeur de la propriété s’affiche dans la fenêtre d’exécution.
Les pièges à erreurs Dans certaines situations, il est impossible d’éviter des erreurs pendant l’exécution ; par exemple, lorsque l’utilisateur quitte une boîte de dialogue commune (voir Chapitre 4) sans avoir effectué de sélection. Dans ce cas, vous devez mettre en place un piège à erreur (error trap).
ce Astu
Lorsque l’erreur se produit, le programme interrompt l’exécution en séquence et exécute une ou plusieurs instructions dédiées au traitement de l’erreur.
L’exemple ci-après tente de lire le contenu d’un fichier dont le nom est spécifié dans le contrôle TextBox1. Les instructions "sensibles" sont insérées après le mot-clé Try. Si une instruction provoque une erreur, le bloc situé après le mot-clé Catch est exécuté. Dans le cas contraire, ce bloc est ignoré. Dans tous les cas, l’exécution du bloc Try se termine par l’exécution du bloc situé entre les mots-clés Finally et End Try. Considérez 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
22
Visual Basic 2010
MsgBox("Le fichier spécifié n’existe pas") Finally FileClose(1) End Try
La première instruction du bloc Try tente d’ouvrir le fichier dont le nom est spécifié dans le contrôle TextBox1 : FileOpen(1, "c:\TextBox1.txt", OpenMode.Input)
Si ce fichier n’existe pas, la prochaine instruction exécutée est celle qui suit le mot-clé Catch. Dans cet exemple, cette instruction affiche un message d’erreur dans une boîte de dialogue : Catch MsgBox("Le fichier spécifié n’existe pas")
Si le fichier existe, l’exécution se poursuit en séquence. La totalité du fichier est lue et stockée dans la variable texte : While Not EOF(1) texte = texte + LineInput(1) End While
Puis le résultat s’affiche dans la zone de texte multiligne TextBox2 : TextBox2.Text = tout
Le bloc Catch est alors sauté. Qu’une erreur se soit produite ou nom, le bloc Finally est alors exécuté, ce qui provoque la fermeture du fichier : Finally FileClose(1) End Try
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
2 Le langage et l’environnement Au sommaire de ce chapitre
∑ Le langage Visual Basic ∑ L’environnement 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 découvrirez les objets (variables, tableaux, structures), les opérateurs et les instructions utilisés dans le langage. Dans un second temps, vous apprendrez à définir des solutions Visual Basic, à exploiter le système de menus, les barres d’outils et les nombreuses fenêtres filles de l’environnement de développement.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
24
Visual Basic 2010
Le langage Visual Basic Vous trouverez dans les pages suivantes quelques rappels sur le langage de programmation. N’hésitez pas à consulter l’aide en ligne pour parfaire vos connaissances.
Variables Pour définir une variable, vous utiliserez l’instruction Dim. Par exemple : Dim v1 as Integer
ou encore : Dim v2 as String
Les types autorisés dans Visual Basic sont les suivants : Type
Signification
Integer
Nombres entiers compris entre –32 768 et 32 767
Long
Nombres entiers compris entre –2 147 483 648 et 2 147 483 647
Single
Nombres réels avec sept chiffres après la virgule
Double
Nombres réels avec quinze chiffres après la virgule
Currency
Nombres réels comprenant quinze chiffres avant la virgule et quatre après
String
Chaînes de caractères dont la longueur ne peut excéder 231 caractères
Il est possible d’utiliser un symbole pour définir implicitement le type d’une variable. Dans l’exemple ci-après, les deux premières instructions sont équivalentes à la troisième : Dim v1 as Integer v1= 45 v1%=45
Pour en terminer avec les variables, voici la liste des symboles qui définissent implici tement le type des variables. Symbole
Variable
%
Integer
&
Long
!
Single
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Le langage et l’environnement
Symbole
Variable
#
Double
@
Currency
$
String
25
Notez qu’il est également possible de définir une énumération à l’aide du mot-clé Enum, comme dans l’exemple suivant : Enum NiveauSecurite Illegal = -1 Niveau1 = 0 Niveau 2 = 1 End Enum
Cette instruction ne peut être utilisée que dans un module.
Tableaux Un tableau contient des données de même type accessibles par un indice. Pour déclarer un tableau contenant vingt valeurs entières, vous utiliserez une instruction du type : Dim Tableau1(0 To 20) As Integer
Si le tableau doit comprendre plusieurs dimensions, il suffit de les déclarer dans la parenthèse. Par exemple, l’instruction suivante définit un tableau à deux dimensions contenant 20 × 1 000 données de type Long : Dim Tableau2(0 To 20, 0 To 1000) As Long
Pour accéder à un élément dans un tableau, il suffit d’indiquer son ou ses indices. Par exemple : ∑ Tableau1(5) correspond au cinquième élément du tableau Tableau1. ∑ Tableau2(2,10) correspond à l’élément d’indices 2 et 10 dans le tableau Tableau2.
Commentaires Il est souvent nécessaire d’insérer des commentaires dans un programme pour faciliter sa maintenance et son évolution. Pour cela, vous utiliserez indifféremment le signe ‘ ou le mot-clé REM. Les deux instructions ci-après sont équivalentes : ‘ Ceci est un commentaire REM Ceci est un commentaire
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
26
Visual Basic 2010
Opérateurs Tous les opérateurs mathématiques, de comparaison et logiques habituels sont disponibles. Le signe = affecte une valeur à une variable. Par exemple, l’instruction ci-après affecte la valeur 12 à l’élément d’indice 4 dans le tableau Ta : Ta(4)=12
Les opérateurs +, -, *, /, ^, \ et Mod s’utilisent comme dans les autres langages. Vous pouvez utiliser une ou plusieurs paires de parenthèses pour forcer l’ordre d’exécution des opérateurs. L’instruction suivante, par exemple, calcule le déterminant d’une équation du second degré : Delta = b^2 - 4 * a * c
Les opérateurs de comparaison =, <>, <, <=, > et >= sont essentiellement utilisés dans l’instruction If then else : If Delta < 0 then Text1.TEXT = "Pas de solution" End If
Enfin, les opérateurs logiques Not, And et Or permettent d’inverser une valeur logique ou de combiner deux valeurs logiques. L’instruction de test ci-après affecte la valeur 1 à la variable Résultat si a est plus grand que 10 ou si b est différent de 0 : If a>10 or b<>0 then Résultat = 1 End If
Tests L’instruction de test la plus utilisée 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
N
Si la condition c1 est vérifiée, le bloc d’instructions Instructions 1 est exécuté. Dans le cas contraire, si la condition c2 est vérifiée, le bloc d’instructions Instructions 2 est
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Le langage et l’environnement
27
exécuté, et ainsi de suite jusqu’au dernier ElseIf. Si aucune des instructions précédentes n’est vérifiée, le bloc d’instructions Instructions N est exécuté. Bien qu’un peu lourde, la structure If Then Else est très simple à utiliser. Lorsque l’action accomplie consiste à affecter une valeur ou une autre en fonction du résultat du test, vous gagnerez à utiliser l’instruction IIf (Immediate If) : Variable=IIf(Condition, Valeur si vrai, Valeur si faux)
Par exemple, l’instruction suivante affecte la valeur 5 à la variable Résultat si a est supérieur à 0 et la valeur 6 dans le cas contraire : Résultat = IIf(a > 0, 5, 6)
Pour terminer, sachez que, si vous devez effectuer des tests répétitifs sur la valeur d’une variable, vous avez tout intérêt à utiliser l’instruction Select Case : Select Case Variable Case liste de valeurs Bloc d’instructions Case liste de valeurs Bloc d’instructions … Case Else Bloc d’instructions End Select
1 1 2 2
N
À titre d’exemple, les instructions If et Case ci-après 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
28
Visual Basic 2010
Boucles Lorsqu’un traitement doit être répété, utilisez une boucle. La plus classique fait appel à l’instruction For Next. Par exemple, l’instruction suivante affecte les valeurs 1 à 10 aux éléments d’indice 1 à 10 du tableau T : For i = 1 To 10 T(i) = i Next i
Lorsque le nombre de passages dans la boucle n’est pas connu à l’avance, vous pouvez utiliser une instruction Do Loop ou While Wend : Les deux blocs d’instructions 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 inversées dans les deux instructions. Do Loop effectue un bouclage jusqu’à ce qu’une condition soit vraie, alors que While Wend effectue un bouclage tant qu’une condition est vraie.
Notre petit tour d’horizon des instructions est terminé ; seules les plus courantes ont été décrites. Pour avoir des informations plus complètes, consultez l’aide des manuels en ligne à la rubrique Instructions. Nous allons maintenant passer en revue quelques fonctions spécialisées particulièrement utiles.
Conversion de données La plupart du temps, vous utiliserez des variables typées (Integer, Long, String, etc.). Si vous êtes amené à affecter un type de données à une variable d’un autre type, une erreur se produira à l’exécution de l’instruction d’affectation, à moins que vous n’utilisiez une
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Le langage et l’environnement
29
f onction de conversion. Par exemple, pour affecter une valeur numérique à une variable chaîne, vous utiliserez la fonction Val. Pour connaître le nom et les modalités d’utilisation des fonctions de conversion, consultez l’aide en ligne à la rubrique Conversion.
Chaînes de caractères Le type chaîne de caractères est un des plus utilisés dans le code Visual Basic ; un ensemble de fonctions lui est dédié. Consultez l’aide en ligne à la rubrique Chaînes(fonctions), liste pour avoir de plus amples renseignements.
Dates et heures Nous allons terminer par les fonctions dédiées à la manipulation des dates et heures. Pour accéder à la liste de ces fonctions, consultez l’aide en ligne à la rubrique Dates(fonctions), liste.
Collections d’objets L’objet Collection constitue un moyen pratique de faire référence à un groupe d’éléments analogues, en les considérant comme un seul objet. Les éléments contenus dans une collection sont appelés membres. Pour créer une nouvelle collection, vous utiliserez une instruction du type suivant : Dim Objet As New Collection
où Objet est le nom de l’objet Collection à créer. Une fois l’objet Collection créé, il est possible de lui ajouter des membres avec la méthode Add : Objet.Add Nom
où Nom est le nom du membre à ajouter à l’objet Collection. Il est également possible de supprimer des objets avec la méthode Remove : objet.Remove index
où Index est une expression qui indique la position d’un membre de la collection. Des membres donnés peuvent être renvoyés à partir de l’objet Collection au moyen de la méthode Item : objet.Item(index)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
30
Visual Basic 2010
où Index est une expression qui indique la position d’un membre de la collection. Le parcours de l’ensemble de la collection est possible au moyen de l’instruction For Each … Next. À la différence des tableaux, le redimensionnement des collections est dynamique. Vous n’avez donc pas besoin d’utiliser des instructions Redim ou Redim Preserve : l’objet Collection le fait pour vous.
Info
Plusieurs collections prédéfinies sont disponibles. En voici la liste : Collection
Type
ArrayList
Collection simple d’objets. Les éléments sont obtenus par leur index.
BitArray
Collection de booléens. Les éléments sont obtenus par leur index.
CollectionBase
Classe abstraite servant de base pour vos propres collections.
DictionaryBase
Classe abstraite servant de base pour vos propres collections. Les éléments sont stockés suivant une clé.
HashTable
Collection d’objets associés à une clé. Les éléments sont obtenus par leur index ou par leur clé.
Queue
Collection de type FIFO (first in, first out, premier entré, premier sorti).
SortedList
Collection identique à HashTable, à ceci près que les éléments sont triés suivant leur clé. Les éléments sont obtenus par leur index ou leur clé.
Stack
Collection de type LIFO (last in, first out, dernier entré, premier sorti).
Voici un petit exemple qui vous donnera une idée des immenses possibilités offertes par les collections. Dim ColMois as New ArrayList ColMois.Add("Janvier") ColMois.Add("Février") ColMois.Add("Mars") ColMois.add("Mai") ColMois.Add("Juin") ColMois.Add("Juillet") ColMois.Add("Août") ColMois.Add("Septembre") ColMois.Add("Octobre") ColMois.Add("Novembre") ColMois.Add("Décembre")
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Le langage et l’environnement
31
Le mois "Avril" a été oublié en quatrième position. Pour l’ajouter, il suffit d’utiliser l’instruction suivante : ColMois.Insert(3,"Avril")
Pour supprimer ce même objet, vous utiliserez l’instruction 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 éléments de la liste par ordre alphabétique, vous utiliserez l’instruction suivante : ColMois.Sort
L’environnement Visual Studio 2010 Visual Studio uniformise le développement des applications en Visual Basic, Visual C#, Visual C++, Visual F#, ASP.NET, Silverlight et Cloud. D’autre part, en installant des modules complémentaires (appelés SDK, ou Software Development Toolkit), il est possible d’ajouter d’autres langages à l’environnement de développement. À titre d’exemple, il suffit d’installer le SDK de BlackBerry pour être en mesure de développer des applications pour terminaux BlackBerry dans Visual Studio, tout en profitant de l’intellisense et du débogueur de l’environnement de développement. Comme dans les versions précédentes de Visual Basic, les applications se composent de formulaires (Forms). La conception et la mise au point d’applications se font selon le modèle qui a fait ses preuves depuis la première version de Visual Basic :
∑
La conception de l’interface utilisateur se fait par le déplacement de contrôles, depuis la Boîte à outils vers le formulaire de l’application.
∑
Le code événementiel relatif à un objet est saisi dans un éditeur de code intelligent qui colorise différemment les mots-clés, les instructions et les commentaires.
∑
La mise au point d’une application se fait dans le débogueur intégré. Il est ainsi possible d’exécuter le code instruction par instruction, de connaître le contenu de certaines variables sensibles ou encore d’exécuter un bloc d’instructions d’une seule traite.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
32
Visual Basic 2010
Définition d’un nouveau projet Lorsque vous définissez un nouveau projet avec la commande Nouveau/Projet dans le menu Fichier, une boîte de dialogue vous demande de préciser le modèle sur lequel doit être construit le projet (voir Figure 2.1). Figure 2.1 Définition d’un nouveau projet.
Vous pouvez créer un projet pour cibler des versions antérieures du .NET Framework en utilisant la liste déroulante Framework, dans la partie supérieure de la boîte de dialogue. Choisissez une entrée dans cette liste avant de sélectionner un modèle de projet, car seuls les modèles compatibles avec cette version du .NET Framework s’affichent dans la liste. Dans le volet gauche de la boîte de dialogue, sélectionnez Modèles installés, développez l’entrée Visual Basic et cliquez sur Windows. Dans le volet central, vous choisirez essentiellement :
∑
Application console. Pour créer une application dont les sorties s’effectuent uniquement en mode texte.
∑ ∑ ∑ ∑
Application Windows Forms. Pour créer une application Windows traditionnelle. Bibliothèque de classes. Pour créer une classe ou un composant réutilisable. Bibliothèque de contrôles Windows Forms. Pour créer un contrôle personnalisé. Application WPF. Pour créer une application Windows Presentation Foundation. Consultez le Chapitre 19 pour en savoir plus sur ce type d’applications.
Une fois le type de l’application sélectionné, le bureau contient plusieurs fenêtres, volets et palettes (voir Figure 2.2).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Le langage et l’environnement
33
Figure 2.2 L’environnement de développement Visual Studio 2010 pendant la création d’une application Windows.
ce Astu
Si votre système graphique le permet, utilisez une résolution d’affichage supérieure à 1 024 × 768 points. Travaillez si possible en 1 280 × 1 024 points ou plus, sur deux ou trois écrans. Vous pourrez ainsi dispatcher les composantes de l’environnement de développement sur une plus grande surface de telle sorte qu’elles ne se chevauchent pas.
Le système de menus La partie supérieure de l’écran donne accès au système de menus et à la barre d’outils Standard du langage. Le système de menus est très classique :
∑ ∑ ∑ ∑ ∑ ∑ ∑
Le menu Fichier permet de charger et de sauvegarder des projets Visual Basic. Le menu Édition donne accès aux commandes Couper, Copier et Coller classiques. Le menu Affichage est utilisé pour afficher/masquer les onglets et barres d’outils de l’Environnement de développement. Le menu Projet permet d’ajouter des éléments au projet en cours d’édition. Le menu Générer est utilisé pour créer la version finale exécutable d’un projet. Le menu Déboguer permet de compiler, de lancer et de tester le projet. Le menu Équipe permet de se connecter à Team Foundation Server dans le cas d’un travail au sein d’une équipe.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
34
∑ ∑ ∑ ∑ ∑
Visual Basic 2010
Le menu Données donne accès aux sources de données associées au projet. Le menu Format permet de définir des options de mise en forme des éléments affichés dans la fenêtre du projet. Le menu Outils donne accès à de nombreuses options permettant de personnaliser l’IDE, d’établir une connexion avec une base de données ou encore d’accéder à l’éditeur de macros. Le menu Test permet de lancer des tests unitaires manuels ou générés sur votre code Visual Basic ou ASP.NET. Enfin, le menu Fenêtre permet d’accéder aux différentes fenêtres ouvertes et de choisir leur disposition sur les écrans.
Les barres d’outils Les barres d’outils facilitent l’accès aux commandes les plus fréquentes. Pour les faire apparaître, sélectionnez la commande Barre d’outils du menu Affichage (voir Figure 2.3) ou cliquez du bouton droit sur une barre d’outils existante. Figure 2.3 Visual Studio donne accès à de nombreuses barres d’outils thématiques.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Info
Le langage et l’environnement
35
Pour transformer une fenêtre secondaire en palette flottante (et inversement), il suffit de double-cliquer sur sa barre de titre.
Vous emploierez essentiellement les barres d’outils Standard, Disposition et Éditeur de texte. La barre d’outils Standard facilite l’accès aux commandes de menu les plus fréquemment utilisées : ouverture/sauvegarde d’un projet, exécution/arrêt de l’application, placement d’un point d’arrêt, etc. (voir Figure 2.4). Figure 2.4 Les icônes de la barre d’outils Standard.
La barre d’outils Disposition permet d’ajuster les contrôles déposés sur les feuilles des applications (voir Figure 2.5). Figure 2.5 Les icônes de la barre d’outils Disposition.
La barre d’outils Éditeur de texte propose des fonctionnalités dédiées à l’éditeur de code de Visual Studio (voir Figure 2.6). Figure 2.6 Les icônes de la barre d’outils Éditeur de texte.
Les fenêtres filles L’environnement de développement contient plusieurs fenêtres secondaires (également appelées fenêtres filles) ancrées sur la périphérie de la fenêtre ou affichées sous la forme de palettes flottantes. Vous utiliserez en particulier :
∑ ∑ ∑
l’explorateur de solutions ; la boîte à outils ; la fenêtre des propriétés.
L’Explorateur de solutions donne la liste des éléments qui constituent l’application (voir Figure 2.7).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
36
Visual Basic 2010
Figure 2.7 Dans cet exemple, le projet ne comprend qu’une feuille, nommée Form1.
La Boîte à outils regroupe sous différents onglets les contrôles qui seront utilisés pour constituer la partie visuelle de l’application. Pour placer un nouveau contrôle sur une feuille, il suffit de le sélectionner dans la Boîte à outils et de tracer une zone rectangulaire sur la feuille (voir Figure 2.8). Figure 2.8 La Boîte à outils contient plusieurs onglets thématiques.
Pour accéder à des contrôles supplémentaires, lancez la commande Choisir des éléments de boîte à outils, dans le menu Outils. Sélectionnez l’onglet 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 Figure 2.9).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 2
Le langage et l’environnement
37
Figure 2.9 Cette fenêtre liste les composants additionnels disponibles.
La fenêtre Propriétés (voir Figure 2.10) liste les propriétés associées à la feuille ou au contrôle sélectionné. Certaines propriétés ne sont accessibles qu’en mode Création. D’autres, au contraire, ne sont accessibles que pendant l’exécution, à l’aide de lignes de code. Figure 2.10 La fenêtre Propriétés donne les caractéristiques de la feuille ou de l’objet sélectionné.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
38
Visual Basic 2010
Enfin, par l’intermédiaire de plusieurs onglets, la feuille de travail donne accès à la représentation visuelle des formulaires de l’application et aux codes correspondants (voir Figure 2.11). Figure 2.11 Cette application est composée d’un formulaire contenant quatre labels, trois champs texte et deux boutons de commande.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
3 Nouveautés et concepts utiles du langage et de l’environnement Au sommaire de ce chapitre
∑ Innovations de l’environnement de développement ∑ Innovations du langage ∑ Techniques évoluées de Visual Studio 2008 toujours d’actualité dans Visual Studio 2010
Le tableau ci-après décrit les évolutions du langage Visual Basic et de l’environnement Visual Studio depuis 2002.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
40
Visual Basic 2010
2002 EnvironVS.NET 2002 nement de développement Visual Basic
2003
2005
2006
2007
2010
VS.NET 2003
VS 2005
VS 2005 + Extensions
VS 2008
VS 2010
VB.NET (v7.0) VB.NET (v7.1)
VB 2005 (v8.0) VB 2005 (v8.0) VB 9
VB 2010
Librairies du NetFx v1.0 Framework
NetFx v1.1
NetFx v2.0
NetFx v3.0
NetFx v3.5 .NET 4.0
CLR
1.1
2.0
2.0
2.0
1.0
4.0
Comme vous pouvez le voir, le CLR (Common Language Runtime) de Visual Basic 2010 est désormais en version 4.0. Le CLR fournit divers services à l’exécution : compilation JIT, gestion de la mémoire, de la sécurité, des exceptions, etc. Il met également à la disposition des langages de l’environnement de développement la librairie des classes de base. On est donc en droit de craindre le pire au niveau de l’interopérabilité1. Le CLR apporte une solution élégante à ce sujet : les différentes versions du CLR peuvent désormais cohabiter dans un seul et même process. Ainsi, si une application utilise des composants basés sur une version précédente du CLR, elle continuera à utiliser ces mêmes composants. Si de nouveaux composants relatifs du CLR 4.0 sont ajoutés à cette application, ils utiliseront tout simplement, de façon 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 même être mises à jour sans provoquer de problèmes de compatibilité. Cette évolution majeure du moteur d’exécution du Framework .NET apporte son lot de nouveautés. Citons entre autres :
∑
TLBIMP (Type LiBrary IMPorter). Cet outil permettant de convertir les définitions de types présentes dans une bibliothèque de types COM en leur équivalent dans un assembly de CLR, est désormais disponible en Shared Source sur Codeplex, à l’adresse http://clrinterop.codeplex.com/.
∑
L’interopérabilité avec de nouveaux langages. IronPython, IronRuby et F#. Cette étape a nécessité l’implémentation de nouveaux types, notamment Tuple et BigInteger.
∑
Le Framework. ParallelFX Il fournit des mécanismes puissants pour mettre en place la parallélisation des traitements tout en fournissant un haut niveau d’abstraction, et donc une facilité d’utilisation jusqu’ici inégalée. Ce Framework peut également être utilisé
1. L’interopérabilité d’un programme Visual Basic est sa capacité à fonctionner dans différents systèmes d’exploitation et/ou versions .NET.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
41
pour découper l’exécution des requêtes LINQ qui s’exécutent en mémoire en différents threads afin d’optimiser leur traitement sur les systèmes à plusieurs processeurs et/ou cœurs.
∑
Le processus de gestion de la mémoire (Garbage Collector). Il a été amélioré, tant au niveau serveur que client. Côté serveur, la collecte de génération 21 génère une notification à laquelle il suffit de s’abonner. Lorsqu’une telle collecte a lieu, il suffit alors de répercuter le traitement sur une autre machine. Côté client, les collectes de génération 0, 1 et 2 se font en arrière-plan, et donc, n’occasionnent aucun temps de latence dans l’exécution de l’application.
∑
Corrupted State Exceptions. Certaines exceptions qui ne peuvent pas être capturées par le mécanisme Try Catch (par exemple les exceptions de type Invalid Memory, Stack Overflow ou encore A/V Exception) peuvent désormais être capturées à l’aide d’un nouveau type de gestion des exceptions : Corrupted State Exceptions.
∑
Historical debogger. Lors du débogage d’une application, toute la session de débogage est enregistrée. Cette nouvelle fonctionnalité, appelée "historical debogger", permet de rejouer autant de fois que nécessaire la session afin de trouver d’où vient le problème.
∑ ∑
Le débogueur. Il supporte désormais le 64-bit en mixed-mode, pour le live et les dumps. Contraintes. Il est désormais possible de définir des contraintes avant (Requires), pendant (Invariant) et après (Ensures) l’exécution d’une méthode. Tous les tests unitaires liés aux contraintes peuvent alors être générés automatiquement.
Dans ce chapitre, nous allons passer en revue les évolutions majeures de l’environnement de développement Visual Studio 2010, ainsi que les principales nouveautés, évolutions et facilités d’écriture de la version 10 de Visual Basic. Nous rappellerons également les techniques évoluées de Visual Studio 2008/Visual Basic 2008, toujours en vigueur dans Visual Studio 2010/Visual Basic 2010.
Innovations de l’environnement de développement En quelques pages, nous allons lister les principales innovations de l’environnement de développement.
Intégration de WPF dans l’IDE L’environnement de développement de Visual Studio 2010 a été entièrement réécrit en tirant parti de la technologie WPF (Windows Presentation Foundation). De cette évolution 1. Les collectes de génération 0 et 1 concernent les petits objets. Elles sont rapides car le segment traité est de petite taille. Par contre, les collectes de génération 2 concernent les objets de grande taille et peuvent introduire des temps de latence dans l’exécution d’une application.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
42
Visual Basic 2010
ergonomique découle la possibilité d’utiliser plusieurs écrans. Le cas échéant, vous pouvez y répartir à votre gré les différentes fenêtres qui composent l’IDE (voir Figure 3.1). Figure 3.1 Les éléments de l’IDE peuvent être répartis sur plusieurs écrans.
Dans chacune des fenêtres de l’IDE, une icône en forme de flèche orientée vers le bas (dans l’angle supérieur droit de la fenêtre), vous permet d’ancrer, de laisser flotter ou de cacher la fenêtre (voir Figure 3.2). Pour déplacer une fenêtre flottante (éventuellement sur un autre écran), il suffit de pointer sa barre de titre et d’utiliser la technique de glisser-déposer de Windows. Figure 3.2 Choix de la position d’une fenêtre.
Projets fondés sur des modèles Lorsque vous définissez un nouveau projet, il est par défaut basé sur les modèles installés sur l’ordinateur. En sélectionnant l’entrée Modèles en ligne, dans la partie inférieure gauche de la fenêtre Nouveau projet, vous pouvez étendre les modèles existants avec ceux proposés en ligne par Microsoft (voir Figure 3.3).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
43
Figure 3.3 Un nouveau projet peut être basé sur un modèle en ligne. Ici, par exemple, un économiseur d’écran WPF qui affiche les posts d’un flux Twitter.
Info
Lorsque vous ajoutez un élément à votre projet, il est également possible de le piocher dans les éléments disponibles sur l’ordinateur ou dans la bibliothèque en ligne, en cliquant sur l’entrée Modèles en ligne dans la boîte de dialogue Ajouter un nouvel élément.
Gestion des projets récents Lorsque vous lancez Visual Studio, les projets récemment ouverts sont directement accessibles dans la page de démarrage (voir Figure 3.4). Un clic suffit pour retourner au projet sur lequel vous travailliez la veille. Figure 3.4 Les projets récents sont directement accessibles sur la page de démarrage.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
44
Visual Basic 2010
Si vous cliquez du bouton droit sur un projet récent, vous pouvez l’ouvrir dans Visual Studio, ouvrir le dossier dans lequel il est stocké ou le supprimer de la liste des projets récents (voir Figure 3.5). Figure 3.5 Le menu contextuel des projets récents.
Il est également possible d’ancrer un projet dans la liste en cliquant devant son icône. Une punaise s’affiche pour matérialiser sa persistance.
Multitargetting Lorsque vous lancez la commande Nouveau/Projet dans le menu Fichier pour concevoir un nouveau projet Visual Basic 2010, la boîte de dialogue Nouveau projet apparaît. Utilisez la liste déroulante affichée dans la partie supérieure droite de la boîte de dialogue pour choisir le Framework cible : 2.0, 3.0, 3.5 ou 4.0 (voir Figure 3.6). Figure 3.6 Choisissez le Framework à utiliser.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Info
Nouveautés et concepts utiles du langage et de l’environnement
45
Un projet créé avec une version précédente de Visual Basic peut être complété dans Visual Studio 2010. Les anciens composants, basés sur les versions 1.0, 1.1 et/ou 2.0 du CLR continueront à fonctionner comme auparavant. Les composants ajoutés dans le projet et basés sur la version 4.0 du CLR cohabiteront avec eux sans qu’aucun problème de compatibilité n’apparaisse : différentes versions du CLR peuvent en effet être abritées dans un seul et même process.
Zoom dans le code L’éditeur de code de Visual Studio 2010 implémente (enfin !) la fonctionnalité de zoom rapide avec la roulette de la souris. Il vous suffit désormais de maintenir la touche Ctrl enfoncée et d’utiliser la roulette pour modifier le facteur de zoom du code. Cette technique se révèle très pratique, notamment lors de présentations et de démonstrations.
Intellisense L’intellisense est une fonctionnalité très intéressante qui vous permet d’écrire du code plus rapidement et de façon plus exacte. Dès que vous commencez à taper un mot-clé reconnu par le compilateur, il affiche le modèle qui permettra de compléter l’instruction en cours (voir Figure 3.7). Figure 3.7 L’intellisense de Visual Basic 2010.
Lorsque vous poursuivez la frappe, l’intellisense s’adapte automatiquement au contenu. Cette fonctionnalité est utilisable lors de développement VB.NET et XAML. Elle a également été améliorée pour le langage JavaScript : non content de proposer les variables et fonctions écrites par l’utilisateur, Intellisense inclut désormais les objets gérés 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 accès à une boîte de dialogue de recherche évoluée qui complète à merveille l’ancienne boîte de
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
46
Visual Basic 2010
d ialogue Rechercher et remplacer. Entrez un terme dans la zone de texte Rechercher les termes, et les résultats correspondants apparaissent dans la partie centrale de la boîte de dialogue Naviguer vers (voir Figure 3.8). Figure 3.8 La boîte de dialogue Naviguer vers est bien plus pratique et directe que la boîte de dialogue Rechercher et remplacer.
Il vous suffit de sélectionner un des résultats et de cliquer sur OK pour ouvrir le code source correspondant et y surligner l’objet de la recherche. Si nécessaire, vous pouvez utiliser :
∑
les caractères de remplacement "?" et "*" pour remplacer (respectivement) un caractère quelconque et un nombre quelconque de caractères dans l’élément recherché ;
∑ ∑
plusieurs mots pour affiner votre recherche ; une ou plusieurs lettres majuscules pour rechercher les termes qui contiennent les majuscules spécifiées (par exemple, MU identifiera les objets Form1_MouseUp(), Form2_ MouseUp(), mais également, si elle existe, la fonction MindUp().
Surbrillance des références Le simple fait de cliquer sur un nom de variable, un paramètre ou un champ provoque la mise en surbrillance des mêmes éléments dans le reste du code (voir Figure 3.9). Pour vous déplacer rapidement d’une occurrence à la suivante, vous utiliserez le raccourci Ctrl+Maj+Bas. Pour atteindre l’occurrence précédente, vous utiliserez le raccourci Ctrl+ Maj+Haut.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
47
Figure 3.9 Il a suffi de cliquer sur une des occurrences de la variable OutilEnCours pour que les autres occurrences soient surlignées dans le code.
Info
Une fois arrivé à la dernière occurrence d’une référence, le raccourci Ctrl+Maj+Bas affiche la première occurrence dans le code. Inversement, une fois arrivé à la première occurrence d’une référence, le raccourci Ctrl+Maj+Haut affiche la dernière occurrence dans le code.
Recherche des références Pour avoir un aperçu des méthodes qui appellent et qui sont appelées par un élément (méthode, attribut ou variable), il suffit de cliquer du bouton droit sur cet élément et de sélectionner Rechercher toutes les références dans le menu contextuel. Vous pouvez également double-cliquer sur l’élément et appuyer sur Maj+F12 pour parvenir au même résultat (voir Figure 3.10). Figure 3.10 Il a suffi de cliquer sur une des occurrences de la variable OutilEnCours pour que les autres occurrences soient surlignées dans le code.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
48
Visual Basic 2010
Générer à partir de l’utilisation Avec Visual Studio 2010, il est désormais possible de définir une déclaration de fonction pendant l’écriture du code qui appelle cette fonction. Le code définitif de la fonction pourra alors être défini dans un deuxième temps. À la Figure 3.11 par exemple, la fonction calcul() est appelée dans la solution Premier alors qu’elle n’a pas encore été définie. Le mot calcul est automatiquement souligné d’une ligne ondulée bleue et d’un marqueur rectangulaire rouge. Figure 3.11 La fonction calcul() n’a pas encore été implémentée.
Pointez le marqueur pour faire apparaître l’icône d’options de correction d’erreur. Cliquez sur cette icône, puis sur l’entrée Générer un stub de méthode pour ‘calcul’ dans ‘Premier. Form1’ (voir Figure 3.12). Figure 3.12 Le rectangle rouge donne accès aux options de correction d’erreur.
Le squelette de la fonction calcul() est alors automatiquement créé en s’adaptant aux contraintes imposées par le code. Ici, passage d’un Double et récupération d’un String (voir Figure 3.13). Figure 3.13 La fonction calcul() a été générée à partir de son utilisation.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
49
Gestionnaire d’extensions Le Gestionnaire d’extensions de Visual Studio 2010 permet de télécharger et d’installer des "extensions" en ligne, proposées par Microsoft ou par des utilisateurs de Visual Studio. Ces extensions vont des contrôles aux modèles en passant par divers types d’outils. Pour accéder aux extensions en ligne, lancez la commande Gestionnaire d’extensions dans le menu outils, sélectionnez l’onglet Galerie en ligne, choisissez un type d’extensions dans le volet gauche, une extension dans le volet central et cliquez sur le bouton Télécharger correspondant (voir Figure 3.14). Figure 3.14 Le contrôle ComponentOne Studio for iPhone est sur le point d’être téléchargé.
Info
Il existe un grand nombre d’extensions disponibles sur le Web. Si vous connaissez le nom (complet ou partiel) de l’extension recherchée, il est pratique d’utiliser la case de recherche, dans la partie supérieure droite du Gestionnaire d’extensions, comme vous le feriez dans une fenêtre de l’Explorateur de fichiers de Windows 7 ou Vista.
Data Binding avec un glisser-déposer dans WPF Après avoir ajouté une source de données à un projet WPF, de simples glisser-déposer permettent de relier les contrôles Windows Presentation Foundation aux champs de données (voir Figure 3.15).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
50
Visual Basic 2010
Figure 3.15 Le Data Binding se fait par simples copier-coller depuis la source de données.
Débogage Intellitrace Traditionnellement, lorsqu’une exception se produit dans une application, le programmeur insère des points d’arrêt dans le code pour localiser l’instruction ou le groupe d’instructions qui pose problème. À partir de ces points d’arrêt, il teste la valeur des variables et objets qu’il soupçonne être à la source du problème. 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 nécessiter de longues minutes pour aboutir ! Le débogage Intellitrace est une nouveauté de Visual Studio 2010 édition Ultimate. Précédemment connue sous le nom d’"Historical Debugger", cette fonctionnalité permet de déboguer une application en enregistrant les événements différents événements qui s’y produisent, ou en journalisant de façon automatique les appels de méthodes (trace) et la navigation dans ces traces. Cette fonctionnalité dépasse le cadre de cet ouvrage, qui se limite à l’édition professionnelle de Visual Studio 2010. Si vous travaillez avec l’édition Ultimate, vous pouvez vous reporter à l’article MSDN "Débogage avec Intellitrace", à l’adresse http://msdn.microsoft.com/fr-fr/library/dd264915.aspx.
Publication en un clic Visual Studio 2010 est en mesure de réaliser un interfaçage direct d’IIS pour déployer un site ASP.NET en un simple clic de souris.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
51
Pour arriver à cette prouesse, une étape d’initialisation est nécessaire. Cliquez du bouton droit sur une barre d’outils de Visual Studio et sélectionnez Publication web en un clic. Dans cette nouvelle barre d’outils, déroulez la liste Publier et sélectionnez . Paramétrez la boîte de dialogue Publier le site web en accord avec la méthode de publi cation et les paramètres de votre site (voir Figure 3.16). Figure 3.16 Le site ASP.NET en cours d’édition va être publié sur un serveur FTP.
Une fois le paramétrage effectué, il vous suffira de cliquer sur l’icône Publier le site web de la barre d’outils Publication web en un clic pour que votre application soit publiée sur le serveur ciblé. Pendant la publication, la fenêtre Sortie vous tiendra au courant des actions effectuées : ------ Début de la génération : Projet : WebApplication1, Configuration : „ Debug Any CPU -----WebApplication1 -> c:\users\x4\documents\visual studio „ 2010\Projects\WebApplication1\WebApplication1\bin\WebApplication1.dll ------ Démarrage 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 à l’emplacement temporaire suivant pour le package/ „ la publication :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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... ======= Génération : 1 a réussi ou est à jour, 0 a échoué, 0 a été ignoré ====== ======= Publication : 1 a réussi, 0 a échoué, 0 a été ignoré ==========
Tests unitaires Une des grandes nouveautés de Visual Studio 2010 est la possibilité de créer des tests unitaires. Par leur intermédiaire, il est possible de tester une fonction particulière d’un programme afin de mettre en évidence un ou plusieurs problèmes dans le code ou dans les données. Considérons 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 aléatoire et la fonction événementielle Button1_ Click affiche, après conversion en un String, la valeur retournée par calcul() dans l’objet Label3. Supposons que la valeur retournée par calcul() doit être comprise entre 0 et 2. Nous allons définir un test unitaire sur la fonction Button1_Click() pour mettre en évidence un dysfonctionnement dans calcul(). Dans l’éditeur de code, cliquez du bouton droit sur la fonction Button1_Click() et sélectionnez Créer des tests unitaires dans le menu contextuel. La boîte de dialogue Créer des tests unitaires s’affiche. Sous Sélection actuelle, une arborescence affiche la hiérarchie de classes et de membres de l’assembly qui héberge la classe du projet. Dans l’exemple de la Figure 3.17, cette classe a pour nom Premier. Vous pouvez utiliser cette page pour générer des tests unitaires pour toute sélection de ces membres et pour choisir un projet de test dans lequel vous souhaitez placer les tests unitaires générés.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
53
Figure 3.17 Création d’un test unitaire sur la fonction Button1_ Click().
Cliquez sur OK pour valider la création du test unitaire. Après quelques instants, le projet de test apparaît dans l’Explorateur de solutions (voir Figure 3.18). Figure 3.18 Le projet de test TestProject1 a été ajouté à l’Explorateur de solutions.
Lancez la commande Fenêtres/Affichage des tests dans le menu Test pour afficher la fenêtre Affichage des tests. Dans cette fenêtre, cliquez sur le bouton Actualiser pour faire apparaître le test (voir Figure 3.19).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
54
Visual Basic 2010
Figure 3.19 Le test est accessible dans la fenêtre Affichage des tests.
Toujours dans la fenêtre Affichage des tests, cliquez du bouton droit sur Button1_ClickTest et sélectionnez Exécuter la sélection dans le menu contextuel. La fenêtre Résultats des tests donne son verdict (voir Figure 3.20). Figure 3.20 Le test n’est pas concluant.
Ce
résultat
provient
de
l’instruction
Assert.Inconclusive()
de
la
fonction
Button1_ClickTest() : Public Sub Button1_ClickTest() Dim target As Form1_Accessor = New Form1_Accessor() ‘ TODO: initialisez à „ une valeur appropriée Dim sender As Object = Nothing ‘ TODO: initialisez à une valeur appropriée Dim e As EventArgs = Nothing ‘ TODO: initialisez à une valeur appropriée target.Button1_Click(sender, e) Assert.Inconclusive("Une méthode qui ne retourne pas une valeur ne peut pas „ être vérifiée.") 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 résultat renvoyé par la fonction calcul() est compris entre 0 et 2 : le premier paramètre de Assert.AreEqual() représente la valeur cible, le deuxième, la valeur renvoyée par la fonction calcul() et le troisième la tolérance sur la valeur cible. Dans la fenêtre 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 sélectionnez Exécuter la sélection dans le menu contextuel.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
55
Selon la valeur tirée aléatoirement dans la fonction calcul(), vous pourrez avoir une réussite ou un échec, comme à la Figure 3.21. Figure 3.21 Le test a échoué.
Il est clair que l’erreur vient de la fonction calcul(). Pour solutionner le problème, l’instruction responsable du résultat pourrait être modifiée comme suit : calcul = Rnd(1) + 1
Cet exemple simpliste donne un aperçu des immenses possibilités des tests unitaires de Visual Studio 2010 : en quelques clics et en définissant le code de test approprié, vous pouvez trouver les causes du dysfonctionnement d’une fonction. Cette technique ne supprime en aucun cas l’intérêt de la méthode de débogage traditionnelle qui consiste à insérer des points d’arrêt dans le code et à tester les valeurs de variables ou de propriétés. Elle vient en complément et peut s’avérer 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 l’interface d’un projet basé sur une version précédente du Framework .NET en utilisant Visual Studio 2010, il vous suffit d’ouvrir ce projet dans Visual Studio 2010. Cette action provoque l’exécution de l’Assistant Conversion de Visual Studio (voir Figure 3.22). Figure 3.22 La commande Fichier > Ouvrir > Projet > Solution a provoqué l’exécution de l’Assistant Conversion.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
56
Visual Basic 2010
Cliquez sur Suivant et validez la création d’une sauvegarde avant conversion (voir Figure 3.23). Figure 3.23 Le projet original sera sauvegardé avant d’opérer la conversion.
Cliquez sur Suivant puis sur Terminer. Après quelques instants, l’Assistant vous informe du statut de la conversion. Le cas échéant, consultez le journal de conversion pour visualiser les avertissements ou erreurs rencontrés lors de la conversion (voir Figure 3.24). Après conversion, la version précédente du Framework continuera à être utilisée et vous pourrez travailler avec Visual Studio 2010 comme si de rien n’était. Si vous voulez utiliser les nouvelles possibilités offertes par le Framework 4.0, vous devrez modifier le Framework cible. Ouvrez le projet, double-cliquez sur l’icône My Project dans l’Explorateur de solutions, sélectionnez l’onglet Compiler, cliquez sur Options avancées de compilation, dans la partie inférieure de la page, sélectionnez .NET Framework 4 Client Profile dans la liste déroulante Framework cible et validez en cliquant sur OK.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
57
Figure 3.24 La conversion s’est bien déroulée.
Figure 3.25 Modification du Framework cible.
Innovations du langage Visual Basic 2010 De nombreuses améliorations ont été apportées 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 prolongées par l’intermédiaire du caractère de continuation "_".
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
58
Visual Basic 2010
Désormais, il est tout à fait possible d’écrire quelque chose comme ceci sans provoquer d’erreur de syntaxe : Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End Sub
Implémentation automatique des propriétés Pour définir une propriété à l’aide de code Visual Basic 2008 ou inférieur, vous deviez utiliser quelque chose comme ceci : Private _nombre As Integer = 0 Public Property MonNombre As Integer ‘ Récupération de "_nombre" Get Return _nombre End Get ‘ Affectation à "_nombre" Set _nombre = valeur End Set End Property
Désormais, avec Visual Basic 2010, la syntaxe est bien plus simple : Property MonNombre as Integer
Pour affecter une valeur par défaut à une propriété, 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 Basic 9, l’instruction With simplifiait l’accès aux différents membres d’un objet (collection, tableau). À titre d’exemple, le code ci-après crée un tableau de capitales et l’initialise avec quatre lignes de données : Partial Class pays Public Nom As String Public Pays As String
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
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"} _ }
Grâce à l’instruction With, l’écriture des éléments "Ville.Nom" et "Ville.Pays" est simplifiée en ".Nom" et ".Pays". L’initialisation d’objets fonctionne également pour les objets créés dans les classes du projet. À titre d’exemple, nous allons créer un nouveau projet de type Application Windows Forms. Nous ajoutons une nouvelle classe dans ce projet que nous nommons Ville. Nous ajoutons deux propriétés à 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)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
60
Visual Basic 2010
intPays = value End Set End Property End Class
Info
Pour créer une propriété dans une classe, il suffit de taper Property, d’appuyer 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 créer 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 n’est pas nécessaire d’initialiser toutes les propriétés dans les accolades : elles pourront être définies dans la suite du code.
En Visual Basic 10, l’initialisation de collections est encore plus simple, grâce 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 simplifiée pour déclarer des tableaux L’inférence de type simplifie grandement la déclaration des tableaux : Dim tab1 = {12, 25, 19} Dim tab2 = {12.2, 6.5}
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
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 l’affichage dans la fenêtre Sortie Type Type Type Type
Info
de de de de
tab1 tab2 tab3 tab4
: : : :
System.Int32[] System.Double[] System.Object[] System.String[]
Cette syntaxe s’étend également aux tableaux multidimensionnels.
Expressions Lambda multilignes et sous-routine Une expression Lambda est une fonction sans nom qui renvoie une valeur unique. À titre d’exemple, l’expression Lambda suivante consiste en une fonction qui admet un argument entier et qui renvoie un calcul réel basé sur cet argument : Dim monExpressionLambda = Function(nombre As Integer) (nombre + 7) / 3
Pour appeler l’expression Lambda, il suffit de préciser son nom et son argument. Par exemple : Console.WriteLine(monExpressionLambda(12))
Visual Basic 2010 permet désormais d’écrire une expression Lambda sur plusieurs lignes. Considérez le code suivant : Dim monExpressionLambda = Function(nombre As Integer) As String If (nombre > 10) Then Return "est supérieur à 10" Else Return "est inférieur ou égal à 10" End If End Function
Dans cet exemple, le code de la fonction lambda repose sur une structure If Then Else. Si nécessaire, il peut être bien plus complexe et compter autant de lignes que nécessaires.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
62
Visual Basic 2010
Cette possibilité n’est pas la seule nouveauté liée aux expressions Lambda : désormais, 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 définir 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, l’appel de l’expression Lambda provoquera l’affichage de l’argument dans la zone de texte TextBox1.
Covariance et contravariance génériques Dans les versions antérieures de Visual Basic, les génériques se comportaient de façon invariante en ce qui concerne le sous-typage. Les conversions entre les types génériques présentant différents arguments de types n’étaient donc pas autorisées. Considérez 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 contrôle ! De même, le code suivant n’est 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 deuxième ligne convertit un IList(Of TextBox) en un IList(Of Control). Si vous tentez d’écrire les deux codes précédents dans un programme Visual Basic 2010 qui cible le Framework .NET 4, le premier code sera autorisé mais pas le second. En effet les
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
63
IEnumerable(Of T) sont des interfaces "de sortie" alors que les IList(Of T) sont des interfaces "d’entrée-sortie". Dans les premiers, il n’est possible que de faire sortir des contrôles alors que dans les seconds, il est possible de faire sortir, mais aussi entrer des contrôles.
Dans Visual Studio 2010, l’infrastructure a été réécrite de la façon 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 méthode dans IEnumerable mentionne T, elle ne le fera qu’en sortie. Il est donc désormais possible d’effectuer un cast d’un IEnumerable(Of dérivé) en un IEnumerable(Of base) sans générer d’exception InvalidCastException. Cette nouvelle fonctionnalité porte le nom de covariance générique. Dans le même ordre d’idées, il est possible de retreindre "en entrée" un IComparer : Interface IComparer(Of In T) … End Interface
Il est donc possible de considérer 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 générique.
Prise en charge d’équivalence de type Avec Visual Basic 2010, vous pouvez désormais déployer une application dotée d’informations de type incorporé (et non de type importé) à partir d’un assembly PIA (Primary Interop Assembly). En utilisant des informations de type incorporé, l’application peut utiliser les types d’un runtime sans nécessiter de référence à l’assembly de runtime. Si différentes versions de l’assembly de runtime sont publiées, l’application peut fonctionner avec les différentes versions sans avoir à être recompilée.
Prise en charge dynamique Visual Basic crée une liaison avec les objets de langages dynamique tels que IronPython et IronRuby. Cette liaison se fait à l’aide de l’interface IDynamicMetaObjectProvider. Les classes DynamicObject et ExpandoObject constituent des exemples de classes qui implémentent l’interface IDynamicMetaObjectProvider.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
64
Visual Basic 2010
Si un appel à liaison tardive est effectué vers un objet qui implémente l’interface IDynamicMetaObjectProvider, Visual Basic utilise cette interface pour créer une liaison avec l’objet dynamique. Si un appel à liaison tardive est effectué vers un objet qui n’implémente pas l’interface IDynamicMetaObjectProvider, ou si l’appel à l’interface IDynamicMetaObjectProvider
échoue, Visual Basic crée une liaison avec l’objet à l’aide des fonctions de liaison tardive de l’exécution Visual Basic. Vous en saurez plus à ce sujet en consultant le site CodePlex, à l’adresse http://dlr.codeplex.com/.
Programmation parallèle Aujourd’hui, le microprocesseur de la plupart des ordinateurs personnels et des stations de travail est doté de 2 ou 4 cœurs qui permettent à plusieurs threads de s’exécuter simultanément. Pour tirer parti de ces processeurs, vous pouvez paralléliser le code Visual Basic. Ainsi, le travail effectué par vos applications est distribué sur plusieurs cœurs et l’exécution du code est bien plus performante. N’ayez crainte, le code reste compatible avec les microprocesseurs dotés d’un seul cœur ! Visual Studio 2010 et le .NET Framework 4 améliorent grandement la prise en charge de la programmation parallèle en fournissant de nouvelles bibliothèques de classes. Par leur intermédiaire, il est "assez simple" d’écrire un code parallèle efficace. En particulier, la classe Parallel permet de répartir l’exécution de boucles For et For Each sur les différents cœurs disponibles. Vous pouvez également utiliser des tâches pour affecter des blocs de code à des cœurs différents. Vous en saurez plus à ce sujet en consultant le Chapitre 13.
Concepts avancés issus des versions précédentes de Visual Basic Cette section regroupe quelques innovations et concepts apparus dans les versions précédentes de Visual Basic (en particulier dans Visual Basic 2008) qu’il est bon d’avoir en tête pour utiliser Visual Basic 2010 aussi efficacement que possible.
Inférence de type Lorsque l’on parle de Visual Basic, on le qualifie souvent de "langage fortement typé". Cela signifie que les types de données utilisés décrivent de façon explicite les données
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
65
manipulées. À titre d’exemple, le langage PHP n’est 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 entière 5 est affectée à cette même variable
Visual Basic n’autorise pas ce genre de largesse. Par contre, le compilateur de Visual Basic 2010 est en mesure de définir une variable typée de façon implicite, en examinant l’expression qui sert à l’initialiser. Ainsi, par exemple, ces deux instructions sont équivalentes : Dim monEntier = 3276 Dim monEntier as Integer = 3276
De même, les deux instructions suivantes sont équivalentes : Dim nom = "Michel" Dim nom As String = "Michel"
Info
L’inférence de type est initialisée par défaut. Si vous voulez la désactiver, utilisez l’instruction Option Infer Off.
Notez que l’inférence de type est également applicable aux tableaux. Par exemple, pour définir et initialiser un tableau contenant des Integer, vous écrirez quelque chose comme ceci : Dim Tableau = New Integer() {12, 25, 2}
Comme le montre la Figure 3.26, le compilateur affecte automatiquement à l’objet tableau le type tableau d’entiers. Figure 3.26 L’objet tableau a pour type tableau d’Integer.
Enfin, l’inférence de type peut être utilisée sur un retour d’appel de méthode (voir Figure 3.27). Figure 3.27 L’inférence de type va bien plus loin que la simple reconnaissance du type d’une donnée.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 d’objets L’instruction With simplifie l’accès aux différents membres d’un objet (collection, tableau). À titre d’exemple, le code ci-après crée un tableau de capitales et l’initialise avec quatre lignes de données : 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"} _ }
Grâce à l’instruction With, l’écriture des éléments "Ville.Nom" et "Ville.Pays" est simplifiée en ".Nom" et ".Pays". L’initialisation d’objets fonctionne également pour les objets créés dans les classes du projet. À titre d’exemple, nous allons créer un nouveau projet de type Application Windows Forms. Nous ajoutons une nouvelle classe dans ce projet que nous nommons Ville. Nous ajoutons deux propriétés à 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
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 créer une propriété dans une classe, il suffit de taper Property, d’appuyer 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 créer 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 n’est pas nécessaire d’initialiser toutes les propriétés dans les accolades : elles pourront être définies dans la suite du code.
Types anonymes Les déclarations d’objets contenant un ou plusieurs membres peuvent se faire sans spécifier leur type. Dans ce cas, un type anonyme, basé sur les types et noms des membres est créé.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
68
Visual Basic 2010
Considérez le code suivant : Dim Employes = New With {.Nom = "Pierre Ledoyen", .Age = 27}
Étant donné qu’aucun type n’est précisé lors de la création de l’objet Employes, ce dernier sera de type anonyme. Il héritera de la classe Object et possèdera les propriétés spécifiées dans l’accolade (ici Nom et Age). Dès qu’un nouveau type anonyme a été défini, vous pouvez utiliser l’intellisense pour accéder à ses propriétés (voir Figure 3.28). Figure 3.28 Intellisense est actif.
Info
Les types anonymes ont un défaut : il est impossible d’y faire référence en tant que types, puisqu’ils n’ont pas de nom.
Méthodes d’extension Visual Basic 2010 permet d’étendre une classe, même si vous ne possédez pas le code de cette classe. Voyons comment procéder sur un exemple concret. Nous allons ajouter une méthode à la classe Ville (voir la section intitulée "Initialiseurs d’objets") pour connaître le nombre d’habitants de la ville spécifiée. Ajoutez un module à la solution avec la commande Ajouter un module dans le menu Projet. Donnez le nom MethExtensions.vb à ce module. Définissez 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
69
Pour transformer ce code en une méthode d’extension de la classe Ville, il suffit de faire précéder l’instruction Function par . Comme vous pouvez le voir à la Figure 3.29, le terme Extension ne convient pas au compilateur. Figure 3.29 La fonction a été transformée en une extension de la classe Ville.
Pointez le terme souligné. Un point d’exclamation apparaît. Cliquez dessus et choisissez Modifiez ‘Extension’ en ‘Runtime.CompilerServices.Extension’ dans la liste (voir Figure 3.30) pour ajouter le NameSpace adéquat. Figure 3.30 Définition in extenso du terme Extension.
Cette fois-ci, la fonction est réellement devenue une extension de la classe Ville. Retournez dans le code du formulaire. La méthode Population est maintenant accessible par Intellisense (voir Figure 3.31). Figure 3.31 La méthode Population est bien accessible.
Génériques Les types génériques permettent de créer des classes, des procédures, des structures, des interfaces et des délégués qui manipulent des données dont le type n’est pas défini au départ.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
70
Visual Basic 2010
Pour comprendre le fonctionnement des génériques, examinez le code ci-après : 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("Après 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 procédure echange est définie de façon générique (Of TypeDeDonnee), et deux paramètres génériques lui sont passés : Private Sub echange(Of TypeDeDonnee)(ByRef donnee1 As TypeDeDonnee, „ ByRef donnee2 As TypeDeDonnee)
Dans cette procédure, la variable générique tampon va permettre d’échanger les deux données passées en entrée : Dim tampon As TypeDeDonnee
Une fois l’échange effectué, les deux données s’affichent dans la fenêtre de texte : Console.Write("Après echange, donnee1 = ") Console.Write(donnee1) Console.Write(" et donnee2 = ") Console.WriteLine(donnee2)
La procédure principale appelle successivement la procédure echange en lui transmettant deux valeurs entières puis deux valeurs chaînes. Remarquez comment le type des variables est spécifié lors de l’appel : echange(Of Integer)(Int1, int2) echange(Of String)(st1, st2)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
71
En utilisant une technique similaire, vous pouvez définir des classes, des structures, des interfaces et des délégués génériques. Les génériques offrent plusieurs avantages : ∑ ils sont fortement typés ; ∑ ils sont compatibles avec la fonctionnalité Intellisense de Visual Studio ; ∑ à l’exécution, ils sont plus rapides que des Objects ; ∑ les éventuelles erreurs sont détectées à la compilation et non à l’exécution.
Types Valeur Nullable Le type générique Nullable permet d’étendre les types valeur en vue d’accepter une valeur traditionnelle ou une valeur Null. Considérez 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 après initialisation: ") Console.WriteLine(monInteger.HasValue) Console.Read() End Sub End Module
La variable monInteger est déclarée de type Integer Nullable : Dim monInteger As Nullable(Of Integer)
Si la valeur Nothing est affectée à la variable monInteger, la propriété HasValue renverra la valeur False. Si, par contre, une valeur non nulle est affectée à cette variable, la propriété HasValue renverra la valeur True (voir Figure 3.32). Figure 3.32 Illustration de type Valeur Nullable.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
72
Visual Basic 2010
Dans Visual Basic 2010, trois syntaxes permettent de déclarer un type Nullable : Dim monInteger? As Integer Dim monInteger As Integer? Dim monInteger As Nullable(Of Integer)
Vous utiliserez :
∑ ∑
la propriété HasValue pour savoir si une variable de type Nullable n’est pas affectée ; la propriété Value pour récupérer la valeur de la variable Nullable.
Opérateur IIf L’opérateur IIf (Immediate If) affecte une valeur ou une autre en fonction du résultat d’un test : Dim Variable As Type = IIf(Condition, Valeur si vrai, Valeur si faux)
Par exemple, l’instruction suivante affecte la valeur 5 à la variable Resultat si a est supérieur à 0 et la valeur 6 dans le cas contraire : Dim Resultat as Integer = IIf(a > 0, 5, 6)
Dans Visual Basic 2010, vous pouvez indifféremment utiliser les opérateurs If et IIf pour parvenir au même résultat. L’instruction précédente devient donc : Dim Resultat as Integer = If(a > 0, 5, 6)
En combinant cette nouvelle écriture avec l’inférence de type, l’expression est encore simplifiée : Dim Resultat = IIf(a > 0, 5, 6)
Support étendu du code XML Visual Basic 2010 vous permet de définir des objets XML en exprimant littéralement leur contenu dans le code : Dim livres = Michel Martin CampusPress Ralph Steyer CampusPress
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
73
Comme vous pouvez le remarquer, aucun caractère terminateur de ligne n’est nécessaire lorsque vous définissez un objet contenant du code XML littéral. Quelques termes de vocabulaire qu’il est bon d’avoir à l’esprit avant de poursuivre la lecture sur le code XML :
∑ ∑
Les marqueurs XML sont appelés éléments ou nœuds. La racine d’un objet XML est l’élément le plus extérieur ( dans l’exemple précédent).
∑
Un attribut est une valeur incorporée à l’intérieur d’un élément (dans l’exemple précédent, Nom dans l’élément ).
∑
Les propriétés d’axe XML permettent d’accéder aux nœuds enfants, aux nœuds descendants et aux attributs des littéraux XML :
– l’axe enfant nomLittéral. donne accès à tous les enfants NomElément du littéral XML nomLittéral ;
– l’axe d’attribut nomLittéral.@NomAttribut donne accès aux attributs NomAttribut du littéral XML nomLittéral ;
– l’axe descendant nomLittéral… donne accès aux descendants du littéral XML nomLittéral, et ce, quel que soit leur niveau d’imbrication dans la structure XML :
– l’indexeur d’extension nomLittéral…(i) donne l’élément de rang i du descendant du littéral nomLittéral ;
– la valeur nomLittéral….Value donne la valeur String du premier élément du littéral XML nomLittéral. Info
Intellisense a été étendu pour fonctionner dans les éléments XML.
Délégués non stricts Pour ceux qui ne seraient pas encore familiers avec les délégués, nous allons commencer par introduire ces entités. Un délégué est un élément qui fait référence à une méthode (un pointeur de méthode en quelque sorte). Une fois initialisé, il suffit de l’invoquer pour appeler la méthode afférente. Voici un exemple de création et d’utilisation d’un délégué : Module Module1 Delegate Sub monDelegue()
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 première instruction crée le délégué MonDelegue : Delegate Sub monDelegue()
Le bloc d’instructions suivant définit la procédure MaProcedure() sur laquelle pointera le délégué. Cette procédure se contente d’afficher un texte en mode console et d’attendre l’appui sur la touche Entrée du clavier. Sub MaProcedure() System.Console.WriteLine("Ce texte est affiché par la Sub MaProcedure") System.Console.ReadLine() End Sub
La procédure principale initialise le délégué avec l’adresse de la procedure : Dim Mondelegue As New monDelegue(AddressOf MaProcedure)
Puis elle exécute la procédure via le délégué : Mondelegue()
De façon native, Visual Basic utilise des délégués pour lier les événements aux méthodes de traitement des objets. Ainsi par exemple, lorsque vous double-cliquez sur un bouton dans l’interface de conception de Visual Studio, un gestionnaire d’événements est automati quement créé et associé à l’événement clic par l’intermédiaire d’un délégué. Dans Visual Basic 2010, les paramètres transmis à une méthode événementielle pointée par un délégué 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é d’écriture est appelée "délégués non stricts" (relaxed delegates en anglais).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
75
Expressions Lambda Par définition, une expression Lambda est une fonction sans nom qui renvoie une valeur unique. À titre d’exemple, l’expression Lambda suivante consiste en une fonction qui admet un argument entier et qui renvoie un calcul réel basé sur cet argument : Dim monExpressionLambda = Function(nombre As Integer) (nombre + 7) / 3
Pour appeler l’expression Lambda, il suffit de préciser 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("L’expression Lambda a reçu la valeur 7") Else Console.WriteLine("L’expression Lambda n’a pas reçu la valeur 7") End If End Sub Sub Main() ExecuteExpressionLambda(7, Function(num) num = 7) Console.ReadLine() End Sub
Le premier bloc d’instructions définit la procédure ExecuteExpressionLambda() : Sub ExecuteExpressionLambda(ByVal data As Integer, ByVal maFonction As Func „ (Of Integer, Boolean))
Cette procedure admet deux arguments : la valeur entière data et la fonction maFonction (c’est l’expression Lambda), qui admet un argument entier et renvoie un argument booléen. Le code de maFonction() est élémentaire. Selon la valeur booléenne renvoyée, un message ou un autre s’affiche sur la console : If maFonction(data) Then Console.WriteLine("L’expression Lambda a reçu la valeur 7") Else Console.WriteLine("L’expression Lambda n’a pas reçu la valeur 7") End If
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
76
Visual Basic 2010
Il ne reste plus qu’à appeler la procédure 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 passée en argument est égale à 7.
Méthodes partielles Dans Visual Basic 2010, la définition d’une classe (ou d’une structure) peut être divisée en plusieurs déclarations partielles. À titre d’exemple, les deux instructions Partial Class ci-après définissent partiellement la classe maClasse. La première implémente la méthode meth1, et la deuxième la méthode meth2 Partial Public Public Sub End Sub End Class … Partial Public Public Sub End Sub End Class
Class maClasse meth1()
Class maClasse meth2()
Les différents éléments Partial peuvent se trouver dans le même fichier ou dans des fichiers différents.
Le langage LINQ LINQ est l’acronyme de Language INtegrated Query (langage d’interrogation intégré). Cette fonctionnalité est un véritable pas en avant : en utilisant une syntaxe proche de celle du langage SQL, il est désormais possible de manipuler des objets IEnumerable, du code XML, des Datasets et des bases de données SQL Server. Reportez-vous au Chapitre 27 pour savoir comment tirer parti de ces évolutions à travers les quatre principales techno logies associées :
∑ ∑ ∑ ∑
LINQ to Objects ; LINQ to XML ; LINQ to Dataset ; LINQ to SQL.
Dans ce chapitre, vous verrez que LINQ présente de nombreux avantages. Entre autres, il :
∑
simplifie l’écriture des requêtes ;
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
∑ ∑ ∑ ∑
Nouveautés et concepts utiles du langage et de l’environnement
77
utilise une syntaxe indépendante de la source de données ; facilite la vie du développeur ; gère les erreurs lors de la compilation (et non à l’exécution) ; supporte l’Intellisense et le débogage dans Visual Studio.
Techniques évoluées de Visual Studio 2005/2008 toujours d’actualité dans Visual Studio 2010 Cette section recense un certain nombre de techniques évoluées de Visual Studio 2005-2008/ Visual Basic 2005-2008, toujours utilisables dans Visual Studio 2010/Visual Basic 2010.
Alignement des contrôles Lorsque vous placez plusieurs contrôles sur une feuille, il est très simple de les aligner entre eux : cliquez sur le contrôle que vous voulez aligner, maintenez le bouton de la souris enfoncé et déplacez le contrôle horizontalement et/ou verticalement jusqu’à l’apparition des marques d’alignement (snap lines). Relâchez le bouton de la souris ; le contrôle est aligné (voir Figure 3.33). Figure 3.33 Alignement sur la partie inférieure d’un contrôle Label et d’un contrôle TextBox.
Menus Les contrôles MenuStrip et ContextMenuStrip remplacent les contrôles MainMenu et ContextMenu. Ces deux contrôles ont fait leur apparition dans la version 2 du Framework. Les menus peuvent désormais être composés de commandes traditionnelles (MenuItem), mais également de listes déroulantes (ComboBox) et de zones de texte (TextBox), et ce, à un quelconque niveau d’indentation (voir Figure 3.34).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
78
Visual Basic 2010
Figure 3.34 Les trois types d’entrées d’un menu Visual Basic.
Pour définir rapidement les menus standard d’une application, il suffit désormais de cliquer doit sur la barre d’un contrôle MenuStrip et de sélectionner Insérer des éléments standard dans le menu contextuel (voir Figure 3.35). Figure 3.35 Cette commande augmentera sensiblement votre productivité.
Les commandes de menu que l’on rencontre le plus traditionnellement sont alors automatiquement ajoutées (voir Figure 3.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 apparaître horizontalement ou verticalement en utilisant les valeurs (Horizontal, Vertical90 ou Vertical270) de la propriété Text Direction (voir Figure 3.37).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
79
Figure 3.36 Les menus traditionnels ont été mis en place d’un simple clic de souris.
Figure 3.37 Affichage vertical de la commande de menu Fichier.
Lorsque vous cliquez sur un contrôle MenuStrip dans la feuille, une petite flèche apparaît dans sa partie supérieure droite. Il suffit de cliquer dessus pour accéder aux propriétés les plus courantes (voir Figure 3.38). Figure 3.38 Cette nouveauté se révèle très pratique à l’utilisation.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
80
Visual Basic 2010
Pour terminer, signalons qu’il est très simple d’associer une icône à chaque commande de menu : 1. Sélectionnez la commande dans la feuille de conception. 2. Cliquez sur la propriété Image dans la fenêtre des propriétés pour faire apparaître un bouton contenant trois points de suspension. 3. Cliquez sur ce bouton et désignez l’image en utilisant les ressources locales ou le fichier de ressources associé au projet (voir Figure 3.39). Figure 3.39 Association d’une icône à une commande de menu.
Vous trouverez un exemple d’utilisation des contrôles MenuStrip et ContextMenuStrip au Chapitre 6.
Barres d’outils Le contrôle ToolStrip succède dignement au contrôle ToolBar. Il manipule des éléments bien plus diversifiés que son prédécesseur (voir Figure 3.40). Pour ajouter les icônes que l’on retrouve traditionnellement dans une barre d’outils, cliquez droit sur le contrôle ToolStrip puis cliquez sur la commande Insérer des éléments standard (voir Figure 3.41). Le contrôle StatusStrip est le pendant Visual Basic 2010 du contrôle StatusBar. Il peut contenir un ou plusieurs StatusLabel, ProgressBar, DropDownButton et/ou SplitButton.
Info
Les contrôles StatusLabel peuvent être transformés en des liens hypertextes grâce à la propriété IsLink. Vous les utiliserez par exemple pour mettre à jour l’application d’un simple clic de l’utilisateur.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
81
Figure 3.40 De nombreux types d’éléments peuvent être insérés dans un ToolStrip.
Figure 3.41 Cette barre d’outils a été complétée en deux clics de souris.
Vous trouverez un exemple d’utilisation des contrôles ToolStrip et StatusStrip au Chapitre 7.
Info-bulles Le contrôle NotifyIcon fait son apparition. Grâce à lui, vous pouvez afficher une info-bulle dans la barre de notification de Windows (également appelée Systray). Pour cela, vous devez, dans un premier temps, renseigner quelques propriétés :
∑
Icône dans la zone de notification : NotifyIcon1.Icon = SystemIcons.Asterisk
∑
Titre de l’info-bulle : NotifyIcon1.BalloonTipTitle = "titre du ballon"
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
82
∑
Visual Basic 2010
Texte affiché dans l’info-bulle : NotifyIcon1.BalloonTipText = "texte du ballon"
∑
Icône dans l’info-bulle : NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info
Ces propriétés étant initialisées, rendez l’info-bulle visible : NotifyIcon1.Visible = True
Puis appelez la méthode ShowBalloonTip() en précisant le nombre de secondes d’affichage de l’info-bulle : NotifyIcon1.ShowBalloonTip(20)
La Figure 3.42 présente le résultat de l’exécution de ces quelques lignes de code. Figure 3.42 Quelques instructions suffisent pour afficher cette info-bulle.
Zone de texte avec marque de saisie Le contrôle MaskedTextBox facilite la saisie de données en utilisant un masque de saisie. Il suffit pour cela de choisir un des masques prédéfinis ou de créer le vôtre en cliquant sur le bouton contenant trois points de suspension de la propriété Mask (voir Figure 3.43). Figure 3.43 Masque de saisie de date, au format court.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
83
Fenêtre des tâches Lorsque vous insérez un contrôle "complexe" dans une feuille, une petite flèche orientée vers la droite s’affiche dans sa partie supérieure droite. En cliquant dessus, vous avez directement accès aux propriétés et tâches les plus courantes associées à ce contrôle (voir Figure 3.44). Figure 3.44 Propriétés et tâches associées au contrôle DataGridView.
Navigateur web Le contrôle WebBrowser fait partie du jeu de composants par défaut (il n’est plus nécessaire d’importer le composant AxWebBrowser. Vous trouverez un exemple d’utilisation de ce contrôle au Chapitre 21.
Refactoring Le refactoring est une fonctionnalité très utile pour les programmeurs. Il permet d’extraire un code, de déclarer automatiquement des variables, de modifier le nom d’un symbole (et bien d’autres 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
84
Visual Basic 2010
Ce code est un modèle de simplicité : la procédure événementielle Button1_Click() appelle dix fois de suite une procédure de calcul. Supposons que vous vouliez modifier le nom de la procédure. Placez le pointeur au-dessus d’un des mots "calcul", cliquez droit et choisissez Renommer dans le menu contextuel (voir Figure 3.45). Il ne vous reste plus qu’à choisir le nouveau nom dans la boîte de dialogue Renommer (voir Figure 3.46). Figure 3.45 Accès à la commande Renommer.
Figure 3.46 Choix du nouveau nom de la procédure.
Extraits En quelques clics de souris, les extraits (snippets) permettent d’insérer des blocs de code prédéfinis dans l’éditeur. Fini les recherches interminables pour retrouver l’extrait de code qui vous aidera à définir l’action que vous voulez accomplir ! Pour insérer un extrait, cliquez du bouton droit dans l’éditeur de code et sélectionnez la commande Insérer un extrait (voir Figure 3.47). Figure 3.47 Insertion d’un extrait.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
85
Choisissez un dossier, un sous-dossier, puis un extrait. Le code est alors inséré dans la feuille de l’application, à l’emplacement du point d’insertion (voir Figure 3.48). Figure 3.48 Insertion du snippet Notions de base/Mathématiques/ Calculer le remboursement mensuel d’un emprunt.
ce Astu
Les amateurs de raccourcis clavier peuvent également appuyer sur Ctrl+K, puis sur Ctrl+X pour simuler la commande Insérer un extrait dans le menu contextuel de la fenêtre de code.
Pour terminer la définition de l’extrait, il vous suffit de modifier les paramètres qui apparaissent en caractères surlignés. Même s’ils représentent une base de départ intéressante, les extraits proposés dans Visual Studio sont assez restreints ; tôt ou tard, vous éprouverez le besoin de définir vos propres extraits de code. Pour cela, il vous suffit de définir un fichier XML contenant la description de l’extrait de code. Voyons comment procéder. Par défaut, Visual Basic 2010 stocke ses extraits dans le dossier Program Files\Microsoft Visual Studio 10.0\VB\Snippets\1036. Voici, à titre d’exemple, le contenu du fichier CalculateaMonthlyPaymentonaLoan.snippet, utilisé dans les lignes précédentes pour insérer l’extrait Calculer le remboursement mensuel d’un emprunt : Calculer le remboursement mensuel d’un emprunt Microsoft Corporation Calcule le montant des remboursements mensuels „ d’un emprunt. mathPayLoan System
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
86
Visual Basic 2010
Microsoft.VisualBasic annualInterestRate Double Remplacez par un Double pour le taux d’intérêt annuel „ (p. ex. 0,05 pour 5 %). .05 numberOfPayments Double Remplacez par le code qui retourne un Double pour le nombre „ total de versements mensuels. 36 loanAmount Double Remplacez par le code qui retourne un Double pour le montant „ de l’emprunt. 1000
Examinons les éléments contenus dans ce code :
∑
Le nom de l’extrait apparaît entre les balises et : Calculer le remboursement mensuel d’un emprunt
∑
La description de l’extrait apparaît entre les balises et : Calcule le montant des remboursements mensuels d’un emprunt. „
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
∑
Nouveautés et concepts utiles du langage et de l’environnement
87
Le bloc de code situé entre les balises et définit les Assembly utilisés par l’extrait. Ainsi, le cas échéant, une clause Imports sera ajoutée au début du code : System Microsoft.VisualBasic
Le bloc de code situé entre les balises et définit les variables qui doivent être ajustées par le programmeur (identificateur, type, info-bulle et valeur par défaut) : annualInterestRate Double Remplacez par un Double pour le taux d’intérêt annuel „ (p. ex. 0,05 pour 5 %). .05 …
Enfin, les dernières instructions définissent le code de l’extrait (les différentes variables sont repérées par leur champ ID et sont encadrées par des caractères "$") :
Vous avez maintenant tous les éléments nécessaires pour créer vos propres extraits. Pour les rendre accessibles, donnez-leur l’extension .snippet et stockez-les dans le dossier Program Files\Microsoft Visual Studio 10.0\VB\Snippets\1036.
Info
Dans les versions précédentes de Visual Studio, les snippets n’étaient disponibles que dans les éditeurs de code C# et Visual Basic. Désormais, cette fonctionnalité est étendue au code HTML/ASP.NET et au JavaScript.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 développiez un projet de grande envergure dont le temps d’écriture dépasse les six mois. Visual Basic automatise la création de documentation au format XML. Voyons comment mettre en œuvre cette fonctionnalité. Sur la ligne qui précède une déclaration Sub ou Function, insérez trois apostrophes consécutives. Un bloc XML est automatiquement créé (voir Figure 3.49). Il ne reste plus qu’à remplir les différents champs pour obtenir une documentation XML digne de programmeurs professionnels. Figure 3.49 Ces commentaires XML ont été créés par Visual Studio.
Un fichier XML est automatiquement généré lors de la compilation du programme. Par exemple, pour le gabarit de commentaires créé à la Figure 3.49, le fichier XML généré est le suivant : WindowsApplication1
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
89
Ces types de données sont facilement récupérables dans de nombreux programmes. En prenant quelques instants pour documenter tous les passages complexes de vos programmes, vous en assurerez la pérennité à moindres frais.
L’espace de nom My L’espace de nom (NameSpace) My est apparu dans Visual Basic 2005. Il est entièrement compatible Visual Basic 2010. Son approche résolument pratique facilite la vie du programmeur. Les éléments contenus dans ce nouvel espace de nom peuvent être répartis dans deux catégories :
∑
Raccourcis vers les classes du Framework : accès rapide et intuitif aux classes de base de la BCL (Base Class Library) du .NET Framework.
∑
Éléments dynamiques créés lors de la définition de l’interface et/ou de l’exécution du code : accès aux formulaires, contrôles, paramètres, ressources et services web créés lors de la conception ou de l’exécution de l’application.
Comme le montre la Figure 3.50, l’espace de nom My se décompose en plusieurs branches indépendantes. Figure 3.50 Structure de l’espace de nom My.
Dans cette section, nous allons vous montrer comment tirer parti de ce nouvel espace de nom en développant plusieurs petites applications qui exploitent les propriétés, procédures et fonctions afférentes au principaux objets qui le composent.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
90
Visual Basic 2010
My.Application L’objet My.Application donne accès à des méthodes, propriétés et événements en rapport avec l’application en cours d’exécution et son environnement. Test des possibilités de l’objet My.Application Pour vous faire une idée des possibilités de l’objet My.Application, définissez une nouvelle application Windows Forms et donnez-lui le nom TestMyApplication. Affectez la valeur Test de l’objet My.Application à la propriété Text de l’objet Form1. Ajoutez un objet Label. Double-cliquez sur une partie inoccupée de la feuille et testez les fonctions et propriétés de l’objet My.Application dans la procédure Form1_Load() (voir Figure 3.51). Figure 3.51 Intellisense facilite la saisie du code.
La Figure 3.52 donne un exemple d’exécution de l’application. La propriété testée est My.Application.Info.DirectoryPath. Figure 3.52 My.Application.Info. DirectoryPath renvoie
le chemin complet de l’application.
Paramètres de la ligne de commande Les éventuels paramètres passés au programmes lors de son exécution (nom d’un fichier, valeur numérique, etc.) sont récupérés dans l’objet My.Application.CommandLineArgs. Pour vous montrer comment utiliser cet objet, vous allez définir une mini-application. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. Sélectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom RecupParam à l’application et validez. Affectez la valeur Paramètres de la ligne de commande à la propriété
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
91
Text de la feuille. Ajoutez un contrôle Label, affectez la valeur False à sa propriété AutoSize et redimensionnez le contrôle de sorte qu’il occupe la plus grande partie de la feuille
(voir Figure 3.53). Figure 3.53 La feuille de l’application en mode Édition.
Double-cliquez sur une partie inoccupée de la feuille et complétez la procédure 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
L’unique instruction de cette procédure affecte la valeur renvoyée par la fonction LigneCom() à la propriété Text du contrôle Label1. Définissez 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 paramètre n’a été passé à l’application." Return st End Function
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
92
Visual Basic 2010
Après avoir déclaré les deux variables utilisées dans la fonction : Dim i As Integer = 0 Dim st As String = ""
une boucle For Each Next parcourt les éventuels paramètres passés à l’application : For Each s As String In My.Application.CommandLineArgs … Next
À l’intérieur de la boucle, l’index de parcours est incrémenté : i = i + 1
Et la chaîne résultat est mise à jour avec le paramètre en cours : st = st + "argument " + Str(i) + " : " + s.ToString + Chr(13)
Si la chaîne est vide, cela signifie qu’aucun paramètre n’a été passé à l’application. La chaîne résultat est alors initialisée avec un texte indiquant l’absence de paramètre : If st = "" Then st = "Aucun paramètre n’a été passé à l’application."
La chaîne résultat est alors retournée par la fonction LigneCom() : Return st
Lancez le programme en appuyant sur la touche F5. Un message indique qu’aucun paramètre n’a été passé à l’application (voir Figure 3.54). Figure 3.54 Un message indique l’absence de paramètre.
Copiez le fichier Projects\RecupParam\bin\Debug\RecupParam.exe dans un dossier plus facile à atteindre (par exemple dans le dossier C:\test). Déroulez le menu Démarrer et entrez la commande représentée Figure 3.55.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
93
Figure 3.55 Exécution du programme avec trois paramètres.
Info
Si vous travaillez sous Windows XP, lancez la commande Exécuter dans le menu Démarrer et tapez la commande de la Figure 3.55 dans la boîte de dialogue Exécuter.
La Figure 3.56 montre que les trois paramètres ont bien été récupérés par l’application. Figure 3.56 Les trois paramètres sont listés dans le contrôle Label.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
94
Visual Basic 2010
My.Application.Info L’objet My.Application.Info est très intéressant. Comme le montre le tableau ci-après, il donne accès à des propriétés qui décrivent l’application en cours d’exécution. Propriété
Description
AssemblyName
Nom, sans extension, de l’assembly de l’application
CompanyName
Nom de société associé à l’application
Copyright
Note de copyright associée à l’application
Description
Description associée à l’application
DirectoryPath
Dossier à partir duquel l’application s’exécute
LoadedAssemblies
Collection de tous les assemblies chargés par l’application
ProductName
Nom de l’application
StackTrace
Trace de la pile de l’application
Title
Titre de l’application
Trademark
Marque déposée de l’application
Version
Numéro de version de l’application
WorkingSet
Quantité de mémoire physique associée au processus en cours d’exécution
Pour définir ces informations, vous pouvez initialiser les propriétés correspondantes dans le code de l’application : My.Application.Info.ProductName = "Nom de l’application" My. Application.Info.Version = "Numéro de version" My.Application.Info.Copyright = "Informations de copyright" My.Application.Info.CompanyName = "Nom de la société à l’origine de l’application" My.Application.Info.Description = "Description de l’application"
Mais il est bien plus pratique d’utiliser la méthode suivante : 1. Lancez la commande Propriétés de Projet1 du menu Projet. Cette commande affiche un nouvel onglet dans l’interface (voir Figure 3.57). 2. Cliquez sur le bouton Informations de l’Assembly et remplissez la boîte de dialogue représentée à la Figure 3.58.
1. Dans la commande de menu Propriétés de Projet, «Projet» représente le nom de votre projet (par exemple, Windows Application1 par défaut pour une application Windows).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
95
Figure 3.57 Cet onglet donne accès aux informations relatives à l’application.
Figure 3.58 Personnalisez l’Assembly de l’application dans cette boîte de dialogue.
Boîte de dialogue "A propos" Définissez une nouvelle application Windows Forms et nommez-la AutoApropos. Lancez la commande Propriétés de projet du menu Projet, cliquez sur Informations de l’assembly et paramétrez la boîte de dialogue Informations de l’assembly comme montré à la Figure 3.59.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
96
Visual Basic 2010
Figure 3.59 Un exemple de paramétrage.
Ajoutez une boîte de dialogue "A propos" au projet. Pour cela, lancez la commande Ajouter un formulaire Windows, du menu Projet, sélectionnez Boîte de dialogue A propos de, dans la boîte de dialogue Ajouter un nouvel élément (voir Figure 3.60), et validez en cliquant sur Ajouter. Figure 3.60 Ajout d’une boîte de dialogue "A propos" au projet.
Ajoutez un bouton de commande dans la feuille principale de l’application. Affectez la valeur Apropos à sa propriété Name et la valeur A propos à sa propriété Text. Doublecliquez sur ce bouton et complétez la procédure Apropos_Click() comme suit :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
97
Private Sub APropos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles APropos.Click AboutBox1.Show() End Sub
Exécutez le projet en appuyant sur la touche F5 et cliquez sur le bouton A propos. Comme le montre la Figure 3.61, les champs de la boîte de dialogue A propos ont été automati quement renseignés. Figure 3.61 Tous les renseignements sont issus de la boîte de dialogue Informations de l’assembly.
Cette application se trouve dans le dossier Projects\AutoApropos des sources de l’ouvrage.
My.Computer L’objet My.Computer fournit des méthodes, propriétés et événements permettant de manipuler des composants en rapport avec l’ordinateur et ses périphériques : horloge système, clavier, système audio, système graphique, etc. L’objet My.Computer compte douze membres :
∑ ∑ ∑ ∑ ∑
Audio ; Clipboard ; Clock ; FileSystem ; Info ;
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
98
Visual Basic 2010
∑ ∑ ∑ ∑ ∑ ∑ ∑
Keyboard ; Mouse ; Name ; Network ; Ports ; Registry ; Screen. Nous allons passer en revue leurs possibilités dans les pages suivantes. Lecture de sons WAV
La procédure My.Computer.Audio.Play permet de lire un son en tâche de fond. Supposons que le son "ExtraitSonore.wav" se trouve à la racine du disque C:. 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 première instruction joue le son en tâche de fond, sans bloquer l’exécution du programme. Ce son peut être arrêté à tout moment en invoquant la procédure Stop() : My.Computer.Audio.Stop
La deuxième instruction est semblable à la première, à ceci près que le son se joue en boucle jusqu’à ce qu’il soit arrêté par la procédure Stop(). La troisième instruction bloque l’exécution du programme jusqu’à ce que le son soit entièrement joué.
Info
Si le deuxième paramètre n’est pas spécifié, le son est joué en tâche de fond.
Windows utilise une pléiade de "sons système" afin de faciliter l’identification d’événements tels que la réception d’e-mails, la fin d’une opération qui s’exécute en tâche de fond, la connexion et la déconnexion de périphériques, etc. Pour avoir une idée plus précise des sons disponibles, lancez la commande Panneau de configuration du menu Démarrer. Tapez sons dans la case de recherche (dans la partie supérieure droite de la boîte de dialogue) puis cliquez sur Modifier les sons système. Les sons associés aux événements système sont regroupés sous l’onglet Sons (voir Figure 3.62).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
99
Figure 3.62 Association événements/sons système.
Info
Si vous utilisez Windows XP, vous devrez cliquer sur Sons, voix et périphériques audio, puis sur Sons et périphériques audio dans le Panneau de configuration pour parvenir au même résultat.
Pour modifier une association, sélectionnez un événement, cliquez sur Parcourir et choisissez un son système dans la boîte de dialogue Parcourir (voir Figure 3.63). Figure 3.63 Affectation d’un nouveau son système à l’événement Déconnecter le périphérique.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
100
Visual Basic 2010
Pour jouer un son système, vous utiliserez la procédure PlaySystemSound() en précisant le nom du son à jouer : My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Asterisk)
Les sons système accessibles par le biais de l’objet System.Media.SystemSounds sont les suivants :
∑ ∑ ∑ ∑ ∑
Asterisk ; Beep ; Exclamation ; Hand ; Question. Cependant, rien ne vous empêche d’accéder aux autres sons système en piochant dans le dossier Windows\Média. Presse-papiers
L’objet My.Computer.Clipboard permet de lire et d’écrire dans le presse-papiers de Windows. Vous utiliserez essentiellement les procédures et fonctions suivantes : Procédure
Action
SetText()
Place le texte spécifié dans le presse-papiers.
SetImage()
Place l’image spécifiée dans le presse-papiers.
SetAudio()
Place le son spécifié dans le presse-papiers.
ContainsText
Teste si le presse-papiers contient du texte.
ContainsImage
Teste si le presse-papiers contient une image.
ContainsAudio
Teste si le presse-papiers contient un son audio.
GetText
Renvoie le contenu texte du presse-papiers.
GetImage
Renvoie l’image contenue dans le presse-papiers.
GetAudio
Renvoie le son placé dans le presse-papiers.
Reportez-vous au Chapitre 5 pour examiner un exemple pratique d’utilisation de l’objet My.Computer.Clipboard. Accès à l’horloge système L’objet My.Computer.Clock donne accès à l’horloge système. Vous utiliserez les trois f onctions suivantes :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
Fonction
Action
GmtTime
Renvoie la date et l’heure GMT. Équivalente à la propriété System.DateTime. UtcNow.
LocalTime
Date et heure locales système. Équivalente à la propriété DateTime.Now.
TickCount
Compteur de temps système, incrémenté toutes les millisecondes depuis le démarrage de l’ordinateur.
101
Définissez une nouvelle application Windows Forms que vous nommerez My Computer Clock. Ajoutez trois contrôles Label et trois contrôles Button à cette application. Modifiez les propriétés de ces contrôles comme suit : Contrôle
Propriété
Valeur
Form1
Text
Test de l’objet My.Computer.Clock
Label1
Text
Label2
Text
Label3
Text
Button1
Text
Date et heure GMT
Button2
Text
Date et heure locales
Button3
Text
Timer système
Double-cliquez sur le premier bouton de commande et complétez la procédure 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
L’unique instruction de cette procédure convertit en une chaîne la valeur renvoyée par la fonction GmtTime() et l’affecte à la propriété Text du contrôle Label1. Double-cliquez sur le deuxième bouton de commande et complétez la procédure 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
102
Visual Basic 2010
Cette procédure est très proche de la précédente, mais ici, la fonction invoquée est LocalTime(). Double-cliquez enfin sur le troisième bouton de commande et complétez la procédure Button3_Click() comme suit : Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles Button3.Click Label3.Text = "Timer système : " + My.Computer.Clock.TickCount.ToString End Sub
Ici, la fonction invoquée est TickCount(). La valeur renvoyée est un Integer. Elle est donc convertie en un String avant d’être affectée à la propriété Text du contrôle Label3. Vous trouverez un autre exemple d’utilisation de l’objet My.Computer.Clock au Chapitre 8 dédié à l’affichage d’une horloge graphique et à la mise en place d’un économiseur d’écran personnalisé. Lecture/écriture dans des fichiers L’objet My.Computer.FileSystem propose plusieurs procédures et fonctions pour lire ou écrire dans un fichier. Fonction
Action
My.Computer.FileSystem.ReadAllText(Nom du fichier)
Lit un fichier texte.
My.Computer.FileSystem.ReadAllText(Nom du fichier, Type d’encodage)
Lit un fichier texte encodé.
My.Computer.FileSystem.ReadAllBytes(Nom du fichier)
Lit un fichier binaire.
My.Computer.FileSystem.WriteAllText (Nom du fichier, Chaîne, False)
Écrit dans un fichier texte.
My.Computer.FileSystem.WriteAllText (Nom du fichier, Chaîne, True)
Écrit à la fin d’un fichier texte.
My.Computer.FileSystem.WriteAllBytes(Nom du fichier, Données, Écrit dans un fichier binaire. True)
Voyons comment utiliser ces nouvelles procédures et fonctions du Framework .NET 4 au travers d’un exemple concret. Un bloc-notes en quatre lignes de code Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. Sélectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom Mémo2 à la nouvelle
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
103
application. Ajoutez un contrôle TextBox et deux contrôles Button à la feuille de l’application. Modifiez les propriétés de ces contrôles comme suit : Contrôle
Propriété
Valeur
Form1
Text
Accès à un fichier texte
TextBox1
Multiline
True
TextBox1
(Name)
Mémo
TextBox1
ScrollBars
Vertical
Button1
Text
Effacer
Button2
Text
Quitter
Double-cliquez sur un endroit inoccupé de la feuille et complétez la procédure Form1_ Load() comme suit : Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles MyBase.Load Mémo.Text = My.Computer.FileSystem.ReadAllText("c:\memo.txt") End Sub
L’unique instruction de cette procédure effectue les actions suivantes :
∑ ∑ ∑ ∑
ouverture du fichier texte c:\memo.txt en lecture ; lecture de toutes les lignes qui le composent ; affectation des données lues à la propriété Text du contrôle Mémo ; fermeture du fichier c:\memo.txt.
À titre d’information, voici les instructions équivalentes, sans recourir à l’objet 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 Mémo.Text = tout Catch Finally FileClose(1) End Try
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
104
Visual Basic 2010
Avouez qu’il est bien plus agréable de mettre en œuvre un objet My.Computer.FileSystem ! Double-cliquez sur le premier bouton de commande et complétez la procédure Button1_ Click() comme suit : Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles Button1.Click Mémo.Text = "" End Sub
L’action effectuée par cette procédure est très simple à comprendre : elle efface le contenu du contrôle Mémo. Enfin, double-cliquez sur le deuxième bouton de commande et complétez la procédure 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", Mémo.Text, False) End End Sub
La première instruction effectue trois actions :
∑ ∑ ∑
ouverture du fichier texte c:\memo.txt en écriture ; copie du contenu du contrôle Mémo dans le fichier texte ; fermeture du fichier c:\memo.txt.
Voici, à titre de comparaison, les instructions équivalentes, sans recourir à l’objet My.Computer.FileSystem : Try FileOpen(1, "c:\memo.txt", OpenMode.Output) Print(1, Mémo.Text) Catch Finally FileClose(1) End Try End
Après 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 l’ouvrage. Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. „ EventArgs)Handles MyBase.Load
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
105
Mémo.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 Mémo.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", Mémo.Text, False) End End Sub End Class
Lecture dans un fichier texte délimité La plupart des applications qui manipulent des données tabulaires (Microsoft Excel par exemple) sont en mesure de stocker ces données dans des fichiers texte délimités. Visual Basic utilise une technique particulière pour accéder à 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 Pékin,700000,1000000,1556000,9230687
Info
Dans la suite, nous supposerons que ce fichier a pour nom "data.txt" et qu’il se trouve dans le dossier C:\test.
Définissez un nouveau projet de type Application Windows Forms et donnez-lui le nom LectDélim. Ajoutez un contrôle DataGridView dans la feuille de l’application. Affectez la valeur Lecture d’un fichier texte délimité à la propriété Text du contrôle Form1, et la valeur Dock à la propriété Dock du contrôle DataGridView1. Double-cliquez sur un emplacement inoccupé de la feuille et complétez la procédure Form1_Load() comme suit : Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles MyBase.Load ‘ Définition du TextFieldParser
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
106
Visual Basic 2010
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser „ ("c:\test\data.txt") ‘ Définition du type de champs et du délimiteur MyReader.TextFieldType = FileIO.FieldType.Delimited MyReader.SetDelimiters(",") ‘ Lecture des données 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("L’enregistrement " & ex.Message & _ "n’est pas valide. Il a été ignoré.") End Try End While End Using End Sub
Examinons les instructions contenues dans cette procédure. 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 délimité c:\test\data.txt.
Info
Le mot-clé Using a fait son apparition dans le Framework .NET 2.0. Il permet de créer un bloc de code qui sera disposé (enlevé de la mémoire) lorsque son exécution sera terminée. Les programmeurs C# connaissent ce principe depuis belle lurette…
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
107
Le bloc d’instructions suivant spécifie le type du fichier et décrit le délimiteur utilisé entre les divers champs d’un enregistrement : MyReader.TextFieldType = FileIO.FieldType.Delimited MyReader.SetDelimiters(",")
La procédure se poursuit par la déclaration de quelques variables : Dim ligne As String() Dim i As Integer Dim s(0 To 5) As String
Le nombre de colonnes du contrôle DataGridView est alors fixé à 5 : DataGridView1.ColumnCount = 5
La lecture des enregistrements se fait à l’intérieur d’une boucle While End While qui prend fin lorsque toutes les données du fichier ont été lues : While Not MyReader.EndOfData ... End While
Pour lire un enregistrement, il suffit d’invoquer la fonction ReadFields() : Try ligne = MyReader.ReadFields()
L’extraction des champs se fait à l’aide d’une instruction For Each Next : For Each champ In ligne
Les champs lus sont stockés dans le tableau de String s : i = i + 1 s(i) = champ
Les données d’un enregistrement sont ensuite placées dans le contrôle DataGridView à l’aide de la procédure 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 capturée par l’instruction Catch et provoque l’affichage d’un message d’erreur : Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException MsgBox("L’enregistrement " & ex.Message & _ "n’est pas valide. Il a été ignoré.") End Try
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
108
Visual Basic 2010
La Figure 3.64 représente l’exécution du programme LectDélim. Les virgules ont bien été interprétées comme délimiteurs de champs. Figure 3.64 Les données sont bien représentées sous une forme tabulaire.
Lecture de champs de longueur fixe Certains fichiers de données contiennent des champs de longueur fixe. Pour accéder à ce type de fichiers, vous utiliserez une instruction Using, comme dans la section précédente : 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 définirez la longueur de chaque champ. Par exemple, si un enregistrement est constitué de trois champs de longueurs respectives 5, 12 et 6 caractères, vous écrirez : Reader.SetFieldWidths(5, 12, 6)
Info
Si un champ a une longueur variable, vous utiliserez la valeur "–1" dans la procédure 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 déroulante Framework. Sélectionnez 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 l’application. Modifiez les propriétés de ces contrôles comme suit :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
109
Contrôle
Propriété Valeur
Form1
Text
Comparaison de fichiers binaires
Label1
Text
Nom complet du premier fichier
Label2
Text
Nom complet du second fichier
Button
Text
Comparer
Label3
Text
Entrez le nom des deux fichiers binaires à comparer, puis cliquez sur Comparer.
Repositionnez ces contrôles pour obtenir un aspect visuel proche de la Figure 3.65. Figure 3.65 La feuille de l’application en mode Conception.
Double-cliquez sur le bouton Comparer et complétez la procédure 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 n’existe pas" If My.Computer.FileSystem.FileExists(TextBox2.Text) = False Then Label3.Text „ = "Le second fichier n’existe 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 différents" End If End If End Sub
Le premier bloc d’instructions teste si l’utilisateur a bien entré deux noms de fichiers et, le cas échéant, si ces fichiers existent. Si une de ces conditions est mise en défaut, un message d’erreur apparaît dans le contrôle 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 n’existe pas" If My.Computer.FileSystem.FileExists(TextBox2.Text) = False Then Label3.Text „ = "Le second fichier n’existe 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 stockés 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 déclarées : resultat pour mémoriser le résultat de la comparaison, et i pour parcourir le contenu des fichiers binaires : Dim resultat As Boolean Dim i As Integer
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
111
Si les deux fichiers ont des tailles différentes, ils sont forcément différents : If val1.Length <> val2.Length Then resultat = False
Dans le cas contraire, tous les octets des deux fichiers sont comparés un à un. Dès qu’une différence est trouvée, la variable resultat est initialisée à 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 s’affiche dans le contrôle Label3 pour indiquer si les deux fichiers sont identiques ou différents. If resultat = True Then Label3.Text = "Les deux fichiers sont identiques" Else Label3.Text = "Les deux fichiers sont différents" End If
Accès aux dossiers particuliers de Windows L’objet My.Computer.FileSystem.SpecialDirectories donne accès aux dossiers particuliers de Windows : AllUsersApplicationData, CurrentUserApplicationData, Desktop, MyDocuments, MyMusic, MyPictures, ProgramFiles, Programs et Temp. Il est très simple de mettre en œuvre cet objet pour lire ou écrire des fichiers à l’emplacement souhaité. Par exemple, pour lire un hypothétique fichier texte data.txt situé dans le dossier Mes documents, vous utiliserez l’instruction 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 .NET 4. Liste des fichiers d’un dossier Pour obtenir la liste des fichiers contenus dans un dossier, il suffit de faire appel à la fonction My.Computer.FileSystem.GetFiles(). Le résultat est renvoyé sous la forme d’une collection de chaînes.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 possibilités de cette fonction, vous pouvez utiliser une seconde syntaxe mettant en jeu trois arguments : My.Computer.FileSystem.GetFiles(dossier, type_recherche, modèle)
où :
∑ ∑ ∑
dossier est le dossier dans lequel est effectuée la recherche. type_recherche peut limiter la recherche au dossier spécifié (valeur FileIO.Search Option.SearchTopLevelOnly) ou l’étendre aux éventuels sous-dossiers du dossier spécifié (valeur FileIO.SearchOption.SearchAllSubDirectories). modèle est un modèle de recherche pouvant contenir un ou plusieurs caractères de remplacement (? remplace un caractère, * remplace un nombre quelconque de caractères).
Pour illustrer la fonction GetFiles(), nous allons réaliser une petite application dans laquelle l’utilisateur visualisera le contenu d’un dossier de son choix. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. Sélectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom ListeFichiers à l’application et validez en cliquant sur OK. Ajoutez les contrôles suivants dans la feuille de l’application :
∑ ∑ ∑
trois Button ; un FolderBrowserDialog (dossier Boîtes de dialogue, situé dans la Boîte à outils) ; un ListView.
Modifiez les propriétés de ces contrôles comme indiqué dans le tableau ci-après. Contrôle
Propriété
Valeur
Form1
Text
Liste des fichiers d’un dossier
Button1
Text
Dossier
Button2
Text
Enregistrer
Button3
Text
Quitter
ListView1
Dock
Top
Modifiez la disposition de ces contrôles pour obtenir une feuille semblable à la Figure 3.66.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
113
Figure 3.66 La feuille de l’application en mode Conception.
Nous allons maintenant définir les procédures événementielles de l’application. Double-cliquez sur un emplacement inoccupé de la feuille et complétez la procédure Form1_Load() comme suit : Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles MyBase.Load FolderBrowserDialog1.Description = "Sélectionnez un dossier" FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer FolderBrowserDialog1.ShowNewFolderButton = False ListView1.View = View.List ListView1.Sorting = SortOrder.Ascending End Sub
Cette procédure initialise les contrôles FolderBrowserDialog et ListView. La première instruction définit le texte affiché dans la boîte de dialogue : FolderBrowserDialog1.Description = "Sélectionnez un dossier"
La deuxième instruction définit le point de départ de l’arborescence, ici le dossier Poste de travail (My Computer) : FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer
La troisième instruction cache le bouton Nouveau dossier. Ainsi, l’utilisateur ne pourra pas créer un nouveau dossier dans l’arborescence des mémoires de masse : FolderBrowserDialog1.ShowNewFolderButton = False
La quatrième instruction définit le type d’affichage dans le contrôle ListView (vous avez le choix entre cinq représentations : Details, LargeIcon, List, SmallIcon et Title) : ListView1.View = View.List
Enfin, la dernière instruction demande que les fichiers listés soient classés par ordre croissant : ListView1.Sorting = SortOrder.Ascending
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
114
Visual Basic 2010
Vous allez maintenant écrire le code responsable de l’affichage de la boîte de dialogue commune Rechercher un dossier. Double-cliquez sur le bouton Dossier et complétez la procédure 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 l’utilisateur sélectionne un dossier : If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
le contenu du contrôle ListView est effacé : ListView1.Clear()
Une instruction For Each parcourt la liste des fichiers du dossier sélectionné : For Each fichier As String In My.Computer.FileSystem. GetFiles(FolderBrowserDialog1.SelectedPath)
et les fichiers trouvés sont ajoutés au contrôle ListView : ListView1.Items.Add(fichier)
Nous allons permettre à l’utilisateur de sauvegarder la liste des fichiers qui apparaissent dans le contrôle ListView. Double-cliquez sur le bouton Enregistrer et complétez la procédure 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)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
115
fichier = fichier + vbCrLf My.Computer.FileSystem.WriteAllText ("C:\test\resultat.txt", fichier, True) Next End Sub
Le premier bloc d’instructions tente de supprimer le fichier c:\test\resultat.txt. Lors de la première exécution du programme, ce fichier n’existait pas. C’est la raison pour laquelle nous avons placé l’instruction qui efface le fichier dans une structure Try afin de capturer et d’annuler le message d’erreur : Try My.Computer.FileSystem.DeleteFile("C:\test\resultat.txt") Catch End Try
Le bloc d’instructions suivant parcourt le dossier sélectionné par l’utilisateur à l’aide d’une instruction For Each : For Each fichier As String In My.Computer.FileSystem. GetFiles(FolderBrowserDialog1.SelectedPath)
Chaque nom de fichier est suivi d’un retour à la ligne : fichier = fichier + vbCrLf
Puis la chaîne ainsi obtenue est copiée à la fin (troisième paramètre à 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 procédure 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 l’application en appuyant sur la touche F5 du clavier. Une fois la feuille de l’application ouverte, cliquez sur Dossier et choisissez un dossier quelconque. Validez en cliquant sur OK. Les fichiers contenus dans le dossier apparaissent dans le contrôle ListView (voir Figure 3.67). Cliquez sur Enregistrer. Le fichier Résultat.txt contenant la liste des fichiers de la racine du disque C:\ est immédiatement créé (voir Figure 3.68).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
116
Visual Basic 2010
Figure 3.67 Liste des fichiers contenus dans la racine du disque C:\.
Figure 3.68 Le fichier c:\test\resultat.txt contient la liste des fichiers de la racine du disque C:\.
Voici le listing complet de l’application. Les fichiers correspondants se trouvent dans le dossier Projects\ListeFichiers des sources de l’ouvrage. Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System. „ EventArgs)Handles MyBase.Load FolderBrowserDialog1.Description = "Sélectionnez un dossier" FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer FolderBrowserDialog1.ShowNewFolderButton = False ListView1.View = View.List
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
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 d’un fichier La méthode 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 l’instruction suivante : My.Computer.FileSystem.CopyFile("c:\test\data.txt", "c:\destination")
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 l’instruction 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 même nom, optez pour l’instruction suivante : My.Computer.FileSystem.CopyFile("c:\test\data.txt", "c:\destination", "data_sav. „ txt", FileIO.UICancelOption.DoNothing)
Pour faire une copie d’un fichier dans le même dossier (par exemple pour dupliquer c:\test\ data.txt en le renommant c:\test\data2.txt), vous utiliserez l’une 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 première instruction produit une exception à l’exécution si le fichier cible existe déjà (voir Figure 3.69). Dans ce cas, la seconde exception l’écrase sans provoquer d’exception. Figure 3.69 La première instruction n’est pas en mesure d’écraser un fichier existant.
Copie de tous les fichiers correspondant à un modèle Pour copier tous les fichiers d’un dossier correspondant à un modèle, servez-vous de la fonction GetFiles() combinée à la fonction CopyFile(). Par exemple, pour copier tous les fichiers d’extension .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,
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
119
„ "*.jpg") My.Computer.FileSystem.CopyFile(fichier, "C:\data\") Next
Décomposons la première instruction. La fonction GetFiles() obtient la liste des fichiers d’extension .jpg du dossier Mes documents : My.Computer.FileSystem.GetFiles(My.Computer.FileSystem.SpecialDirectories. „ MyDocuments, FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
Cette liste est renvoyée par GetFiles() sous la forme d’une collection. Cette dernière est parcourue par l’intermédiaire d’une structure For Each In : For Each fichier As String In
La seconde instruction utilise la procédure CopyFile() pour copier chacun des éléments de la collection, c’est-à-dire chacun des fichiers dans le dossier c:\data : My.Computer.FileSystem.CopyFile(fichier, "C:\data\")
Test de l’existence d’un fichier Pour savoir si un fichier existe, il suffit d’invoquer la fonction My.Computer.FileSystem. FileExists(). La valeur renvoyée en retour est True si le fichier existe, et False dans le cas contraire. Test de l’existence d’un dossier Pour savoir si un dossier existe, il suffit d’invoquer la fonction My.Computer.FileSystem. DirectoryExists(). La valeur renvoyée en retour est True si le dossier existe, et False dans le cas contraire. Copie d’un dossier Pour copier le contenu d’un dossier, vous utiliserez la procédure My.Computer.FileSystem.CopyDirectory(). Par exemple, pour copier le contenu du dossier c:\data dans le dossier c:\data2, employez l’instruction suivante : My.Computer.FileSystem.CopyDirectory("C:\data", "data2", True)
Le troisième paramètre indique si les éventuels fichiers de même nom contenus dans le dossier de destination doivent (True) ou ne doivent pas (False) être écrasés par les fichiers provenant du dossier source.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
120
Visual Basic 2010
Création d’un dossier Pour créer un nouveau dossier, vous utiliserez la procédure My.Computer.FileSystem. CreateDirectory(). Par exemple, pour créer le dossier c:\data\NouveauDossier, employez l’instruction suivante : My.Computer.FileSystem.CreateDirectory("C:\data\NouveauDossier")
Suppression d’un dossier Plusieurs syntaxes peuvent être utilisées pour supprimer un dossier :
∑
Suppression d’un dossier uniquement s’il est vide : My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.DeleteDirectory „ Option.ThrowIfDirectoryNonEmpty)
∑
Envoi d’un 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 définitive d’un dossier : My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.DeleteDirectory „ Option.DeleteAllContents)
Suppression définitive d’un dossier avec demande de confirmation : My.Computer.FileSystem.DeleteDirectory("Nom du dossier", FileIO.UIOption.AllDialogs, „ FileIO.DeleteDirectoryOption.DeletePermanently, FileIO.UICancelOption.ThrowException)
Modification du nom d’un fichier Pour modifier le nom d’un fichier, vous utiliserez la procédure My.Computer.FileSystem. RenameFile().
Par exemple, pour renommer le fichier c:\data.txt en data2.txt, employez l’instruction suivante : My.Computer.FileSystem.RenameFile("C:\data.txt", "data2.txt")
Modification du nom d’un dossier Pour modifier le nom d’un fichier, vous utiliserez la procédure My.Computer.FileSystem. RenameDirectory().
Par exemple, pour renommer le dossier c:\data en c:\data2, employez l’instruction suivante : My.Computer.FileSystem.RenameFile ("C:\data", "data2")
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
121
Suppression d’un fichier Pour supprimer un fichier, vous utiliserez la procédure My.Computer.FileSystem.DeleteFile(). Vous pouvez :
∑
Ne pas demander la confirmation à l’utilisateur : My.Computer.FileSystem.DeleteFile("Nom_du_fichier")
∑
Demander la confirmation à l’utilisateur : 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)
Déplacement d’un dossier Pour déplacer un dossier ainsi que les fichiers et sous-dossiers qui le composent, vous utiliserez la procédure MoveDirectory() : My.Computer.FileSystem.MoveDirectory(DossierSource, DossierDestination) My.Computer.FileSystem.MoveDirectory(DossierSource, DossierDestination, True)
La première syntaxe copie le dossier source dans le dossier de destination sans écraser les éventuels fichiers/dossiers de même nom dans le fichier de destination. La seconde syntaxe écrase les éventuels fichiers/dossiers de même nom dans le dossier de destination. Chemin et nom d’un fichier Pour obtenir facilement le dossier et le nom d’un fichier à partir d’un chemin complet, tel que "c:\data\projets\Visual Basic 2010\livre.doc", employez les propriétés DirectoryName et Name d’un 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 première instruction définit l’objet System.IO.FileInfo fichier : Dim fichier As System.IO.FileInfo
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
122
Visual Basic 2010
La fonction GetFileInfo() est alors invoquée pour obtenir des informations sur le fichier spécifié en argument : fichier = My.Computer.FileSystem.GetFileInfo("c:\data\projets\Visual Basic 2010\ „ livre.doc")
Les variables String dossier et nom sont alors définies et initialisées avec les propriétés DirectoryName et Name de l’objet 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 l’intermédiaire de deux contrôles Label : Label1.Text = "Le chemin du fichier est " + dossier Label2.Text = "Le nom du fichier est " + nom
Suppression de tous les fichiers d’un dossier Pour supprimer tous les fichiers d’un dossier, vous utiliserez la fonction GetFiles() combinée à la fonction DeleteFile(). À titre d’exemple, voici le code permettant de supprimer de façon 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 première instruction parcourt tous les éléments de la collection renvoyée par la fonction GetFiles(), en étendant la recherche à tous les éventuels sous-dossiers du dossier Ma Musique (FileIO.SearchOption.SearchAllSubDirectories) et en sélectionnant tous les fichiers (*.*). La seconde instruction supprime de façon permanente chacun des fichiers sélectionnés dans la structure For Each In. Info
L’objet SpecialDirectories donne accès à plusieurs dossiers propres à indows : AllUsersApplicationData, CurrentUserApplicationData, Desktop, W MyDocuments, MyMusic, MyPictures, ProgramFiles, Programs et Temp. Pour permettre à l’utilisateur de sélectionner le dossier qu’il souhaite supprimer, il suffit d’insérer un contrôle FolderBrowserDialog dans l’application et d’utiliser sa propriété SelectedPath comme premier argument de la fonction GetFiles().
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
123
Déplacement d’un fichier Pour déplacer 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 dédiée : My.Computer.FileSystem.MoveFile(). Cette dernière 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 à déplacer.
∑
exception indique si une éventuelle exception générée par la fonction MoveFile doit (FileIO.UICancelOption.THrowException) ou ne doit pas (FileIO.UICancelOption. DoNothing) être prise en compte.
destination est le chemin complet du fichier de destination. écrasement est une variable booléenne qui indique si un éventuel fichier ayant le même chemin que la destination doit (True) ou ne doit pas (False) être écrasé.
Par exemple, pour déplacer le fichier data.txt du dossier c:\ vers le dossier d:\data, employez l’instruction suivante : My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data\data.txt")
Info
Bien entendu, pour fonctionner, cette instruction nécessite la présence du fichier data.txt dans le dossier c:\ et l’absence du fichier data.txt dans le dossier d:\ data.
Pour déplacer le fichier data.txt du dossier c:\ vers le dossier d:\data et lui donner le nom data2.txt, vous utiliserez l’instruction suivante : My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data\data2.txt")
Info
Comme précédemment, pour fonctionner, cette instruction nécessite la présence du fichier data.txt dans le dossier c:\ et l’absence du fichier data2.txt dans le dossier d:\data.
Pour déplacer le fichier data.txt du dossier c:\ vers le dossier d:\data en écrasant l’éventuel fichier data.txt déjà présent, vous utiliserez l’instruction suivante : My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data\data2.txt", True)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
124
Visual Basic 2010
Enfin, pour déplacer le fichier data.txt du dossier c:\ vers le dossier d:\data en ignorant tous les éventuels événements générés, employez l’instruction suivante : My.Computer.FileSystem.MoveFile("c:\data.txt", "d:\data", FileIO.UIOption.AllDialog, FileIO.UICancelOption.DoNothing)
Déplacement de tous les fichiers correspondant à un modèle Pour déplacer tous les fichiers d’un dossier correspondant à un modèle, vous utiliserez la fonction GetFiles() combinée à la fonction MoveFile(). Par exemple, pour déplacer tous les fichiers d’extension .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 d’exemple, 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 première ligne, la fonction GetDirectories() renvoie une collection contenant le nom des sous-dossiers : My.Computer.FileSystem.GetDirectories("c:\")
Cette collection est décrite à l’aide d’une 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 l’utilisation du code &vbCrLf pour ajouter un passage à la ligne : TextBox1.Text = TextBox1.Text & dossier & vbCrLf
Deux paramètres complémentaires peuvent être utilisés avec la fonction GetDirectories() : My.Computer.FileSystem.GetDIrectories(NomDossier,InclureSousDossiers,Modèle)
où :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
∑ ∑ ∑
Nouveautés et concepts utiles du langage et de l’environnement
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. Modèle est le modèle de la recherche (ce modèle peut contenir un ou plusieurs caractères de remplacement : ? pour remplacer un caractère unique ; * pour en remplacer un nombre quelconque).
Nombre de fichiers dans un dossier Pour connaître le nombre de fichiers contenus dans un dossier, vous utiliserez la propriété Count de la fonction My.Computer.FileSystem.GetFiles(). À titre d’exemple, les lignes de code suivantes affichent dans un contrôle 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 première instruction définit la variable String Dossier et y stocke le chemin de recherche : Dim Dossier as String = "c:\"
La deuxième instruction définit l’objet fichiers de type ReadOnlyCollection(Of String) : Dim fichiers As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
La troisième instruction interroge la fonction GetFiles() pour connaître les fichiers contenus dans le dossier "c:\" : fichiers = My.Computer.FileSystem.GetFiles(Dossier)
Enfin, la quatrième instruction affiche le nombre de fichiers renvoyés par GetFiles() à l’aide de la propriété 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 spécifié dans le dossier de recherche. Il suffit pour cela d’ajouter la valeur True en deuxième argument de la fonction GetFiles(). En ajoutant un troisième argument chaîne contenant un modèle de sélection, vous pouvez limiter le comptage aux fichiers qui respectent ce modèle1.
1. Le modèle peut inclure un ou plusieurs caractères de remplacement : ? pour remplacer un caractère unique ; * pour en remplacer un nombre quelconque.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
126
Visual Basic 2010
Informations sur un fichier La fonction My.Computer.FileSystem.GetFileInfo() renvoie un objet FileInfo permettant de connaître différentes informations au sujet du fichier spécifié en argument. À titre d’exemple, les lignes de code ci-après affichent quelques informations sur le fichier c:\test\data.txt dans un contrôle 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 création : " + info.CreationTime + vbCrLf st + "Dernier accès : " + info.LastAccessTime + vbCrLf st + "Dernière sauvegarde : " + info.LastWriteTime + vbCrLf
TextBox1.Text = st
La première ligne définit l’objet String st dans lequel seront stockées les informations concernant l’objet info : Dim st As String
La deuxième ligne affecte la valeur retournée par la fonction GetFileInfo() à l’objet System.IO.FileInfo information : Dim information As System.IO.FileInfo information = My.Computer.FileSystem. „ GetFileInfo("c:\test\data.txt")
Le bloc d’instructions suivant extrait les informations de l’objet info en interrogeant ses propriétés. Par exemple, pour connaître la taille du fichier c:\test\data.txt, il suffit de lire la propriété Length : st = st + "Taille du fichier : " + info.Length.ToString + " octets" + vbCrLf
Une fois que toutes les données souhaitées ont été extraites (et éventuellement converties au format chaîne à l’aide de l’opérateur ToString), elles s’affichent dans le contrôle TextBox : TextBox1.Text = st
Voici un exemple d’informations obtenues par l’intermédiaire de l’objet System. IO.FileInfo et de la fonction GetFileInfo() :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
127
Dossier : c:\ Nom complet : c:\test\data.txt Nom du fichier : data.txt Taille du fichier : 294 octets Attributs : Archive Date de création : 21/03/2010 09:07:10 Dernier accès : 21/03/2010 09:07:10 Dernière sauvegarde : 21/03/2010 09:07:14
Les objets System.IO.FileInfo possèdent de nombreuses propriétés. Pour faciliter leur utilisation, n’hésitez pas à employer la fonctionnalité AutoComplete et les bulles d’aide associées (voir Figure 3.70).
Info
Figure 3.70 AutoComplete et les bulles d’aide vous assisteront pour écrire votre code de façon intuitive.
Informations sur un dossier Pour obtenir des informations sur un dossier, il suffit d’invoquer la fonction My.Computer. FileSystem.GetDirectoryInfo() en spécifiant son chemin complet dans l’argument. GetDirectoryInfo() renvoie un objet DirectoryInfo dont il suffit alors de parcourir les propriétés. 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 création : " + info.CreationTime + vbCrLf "Dernier accès : " + info.LastAccessTime + vbCrLf "Dernière sauvegarde : " + Info.LastWriteTime + vbCrLf
TextBox1.Text = st
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
128
Visual Basic 2010
Après avoir déclaré un objet String st : Dim st As String
l’objet System.IO.DirectoryInfo Info est défini par l’intermédiaire de la fonction GetDirectoryInfo() : Dim Info As System.IO.DirectoryInfo = My.Computer.FileSystem. GetDirectoryInfo("C:\Program Files")
Le bloc d’instructions suivant interroge les propriétés de l’objet Info pour obtenir les informations souhaitées, par exemple le type du dossier : st = st + "Attributs : " + Info.Attributes.ToString + vbCrLf
Une fois que toutes les informations ont été récupérées et stockées dans la chaîne st, elles apparaissent dans une zone de texte multiligne : TextBox1.Text = st
Voici un exemple d’informations obtenues par l’intermédiaire de l’objet System. IO.DirectoryInfo et de la fonction GetDirectoryInfo() : Nom du dossier : Program Files Ce dossier existe : TrueAttributs : ReadOnly, Directory Date de création : 15/11/2010 07:12:31 Dernier accès : 25/12/2010 19:44:47 Dernière sauvegarde : 19/12/2010 10:59:50
Documents et fichiers récents Windows mémorise la liste des documents utilisés récemment. Cette liste apparaît partiellement dans le menu Démarrer. Si vous le souhaitez, vous pouvez consulter une liste bien plus complète en faisant appel à la fonction DirectoryInfo().GetFiles et en la filtrant par une requête LINQ. Consultez la section intitulée "Liste des documents récents" au Chapitre 27 pour avoir plus d’informations sur le code à utiliser. Une technique similaire permet de lister les fichiers créés depuis un jour, une semaine, un mois ou une tout autre période. Consultez la section intitulé "Liste des fichiers créés ces quinze derniers jours" au Chapitre 27 pour en savoir plus. Nom d’une 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 spécifiant la lettre d’unité dans l’argument. GetDriveInfo() renvoie un objet DriveInfo dont il suffit alors de parcourir les propriétés.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
129
Ces quelques lignes de code affichent des informations sur l’unité "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 + "Système 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
Après avoir déclaré l’objet String st : Dim st As String
la fonction My.Computer.FileSystem.GetDriveInfo() est invoquée pour obtenir des informations sur le disque c:\. Le résultat de la fonction est stocké dans l’objet System. IO.DriveInfo disque : Dim disque As System.IO.DriveInfo = My.Computer.FileSystem.GetDriveInfo("c:\")
Le bloc d’instructions suivant interroge les propriétés de l’objet DriveInfo disque et stocke les valeurs renvoyées dans la chaîne st. Par exemple, pour connaître l’espace disponible sur l’unité, il suffit de consulter la propriété AvailableFreeSpace : st = st + "Espace disponible : " + disque.AvailableFreeSpace.ToString + " octets" „ + vbCrLf
La dernière instruction affiche le résultat dans la zone de texte multiligne TextBox1 : TextBox1.Text = st
Voici un exemple d’informations retournées lorsque l’unité interrogée est un disque dur : Nom du volume : Disque principal Dossier racine : C:\ Système de fichiers : NTFS Type du disque : Fixed Espace disponible : 30 703 894 528 octets
Les informations renvoyées sont très différentes lorsque l’unité interrogée est un lecteur de CD-ROM contenant un CD audio : Nom du volume : Audio CD Dossier racine : D:\ Système de fichiers : CDFS Type du disque : CDRom Espace disponible : 0 octet
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
130
Visual Basic 2010
Accès aux feuilles du projet L’objet My.Forms donne accès aux feuilles définies dans un projet :
∑ ∑ ∑
My.Forms.Form1 représente la première feuille de l’application. My.Forms.Form2 représente la deuxième feuille de l’application. My.Forms.MaFeuille représente une des feuilles de l’application renommée en MaFeuille – propriété (Name). Utilisez la fonctionnalité Intellisense et les bulles d’aide de Visual Studio pour accéder aux propriétés, procédures et fonctions d’un objet My.Forms (voir Figure 3.71). Figure 3.71 Intellisense et les bulles d’aide sont très appréciables pendant l’écriture du code.
Accès au clavier L’objet My.Computer.Keyboard donne accès au clavier. Vous l’utiliserez pour tester les touches pressées et/ou actives et pour simuler l’appui sur les touches de votre choix. Pour tester les touches spéciales du clavier, employez les propriétés de l’objet My.Computer. Keyboard, comme indiqué dans le tableau ci-après. Propriété de My.Computer.Keyboard
True si…
AltKeyDown
Touche Alt enfoncée
CapsLock
Touche Verr Maj active
CtrlKeyDown
Touche Ctrl enfoncée
NumLock
Touche Verr Num active
ScrollLock
Touche Arrêt défil active
ShiftKeyDown
Touche Maj enfoncée
À titre d’exemple, cette ligne de code affiche une boîte de dialogue si la touche Maj est enfoncée au moment du test : If My.Computer.Keyboard.ShiftKeyDown Then MsgBox("La touche Maj est enfoncée")
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
131
Pour simuler l’appui 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 l’une des valeurs True (attente de la prise en compte des touches frappées avant de poursuivre) ou False (poursuite du programme sans attendre). À titre d’exemple, 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 première instruction définit la variable Integer Processus : Dim Processus As Integer
Cette variable est utilisée pour obtenir l’identifiant d’un processus créé avec la fonction Shell() : Processus = Shell("notepad.exe", AppWinStyle.NormalFocus)
Pour lancer l’application correspondante, il suffit d’invoquer AppActivate() : AppActivate(Processus)
Plusieurs éléments textuels sont alors envoyés 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 représente la fenêtre du Bloc-Notes après l’exécution de ces quelques instructions. Figure 3.72 Le texte spécifié dans les procédures SendKeys() a bien été envoyé au Bloc-Notes.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
132
Visual Basic 2010
Accès à la souris L’objet My.Computer.Mouse donne accès à trois propriétés concernant la souris : Propriété
Effet
ButtonSwapped
True si les boutons gauche et droit de la souris sont inversés, sinon False.
WheelsExists
True si la souris est dotée d’une roulette, sinon False.
WheelScrollLines
Amplitude de la rotation de la roulette.
Accès au réseau L’objet My.Computer.Network donne accès à de nombreuses fonctionnalités concernant le réseau local et la liaison Internet. Vérifier l’état du réseau Pour savoir si l’ordinateur est relié à un réseau local ou à Internet, vous testerez la propriété IsAvailable de l’objet My.Computer.NetWork : If My.Computer.Network.IsAvailable then Label1.Text = "L’ordinateur est relié à un réseau local et/ou à Internet" Else Label1.Text = "L’ordinateur n’est relié ni à un réseau local ni à Internet" End If
Vérifier la disponibilité d’un ordinateur Pour vérifier la disponibilité d’un ordinateur1 dont vous connaissez l’adresse IP ou URL, il suffit d’appeler la fonction Ping(). La valeur retournée est True si l’ordinateur répond au ping, et False dans le cas contraire. If My.Computer.Network.Ping("192.168.0.125") then Label1.Text = "L’ordinateur 192.168.0.125 a répondu au ping" Else Label1.Text = "L’ordinateur 192.168.0.125 n’a pas répondu au ping" End If
1. Cet ordinateur peut faire partie du réseau local ou être connecté à Internet.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Info
Nouveautés et concepts utiles du langage et de l’environnement
133
Si vous ne connaissez pas l’adresse IP de l’ordinateur que vous voulez tester, ouvrez une fenêtre Invite de commandes. Sous Windows 7 ou Vista, cliquez sur Démarrer, tapez invite puis cliquez sur Invite de commandes. Sous Windows XP, cliquez sur Démarrer, sélectionnez Tous les programmes, Accessoires, puis Ligne de commande dans le menu Démarrer. Tapez ipconfig et appuyez sur la touche Entrée du clavier. L’adresse IP de l’ordinateur apparaît clairement (voir Figure 3.73).
Figure 3.73 L’adresse IP de cet ordinateur est 192.168.1.64.
Si l’ordinateur destinataire du ping se trouve sur Internet, vous pouvez spécifier un délai de retour maximal en millisecondes. Par exemple, pour savoir si le site www.monsite.com répond en moins de 500 millisecondes, utilisez l’instruction If de la façon suivante : If My.Computer.Network.Ping("www.monsite.com", 500) then Label1.Text = "La page www.monsite.com a répondu dans le délai imparti" Else Label1.Text = "La page www.monsite.com n’a pas répondu 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 procédure UploadFile() : My.Computer.Network.UploadFile("NomFichier", "AdresseServeur", "NomUtilisateur", „ "MotPasse", Interface, TimeOut)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
134
Visual Basic 2010
où :
∑ ∑
NomFichier est le nom complet du fichier à envoyer. AdresseServeur est l’adresse FTP ou HTTP du serveur sur lequel le fichier doit être
copié.
∑ ∑ ∑
NomUtilisateur est le nom à fournir au serveur pour accéder au compte (si nécessaire).
∑
TimeOut définit le délai de réponse maximal du serveur, en millisecondes.
MotPasse est le mot de passe à fournir au serveur pour accéder au compte (si nécessaire). Interface est une valeur booléenne qui indique si l’indicateur de progression du trans-
fert doit (True) ou ne doit pas (False) être affiché.
Supposons que le fichier c:\test\vide.bmp doive être transféré sur les pages perso FTP Free de l’utilisateur bertrand.lebolduc en utilisant le mot de passe "cadeau". L’instruction à 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 exécutée, un indicateur indique la progression du transfert (voir Figure 3.74). Figure 3.74 Indicateur de progression du transfert.
Télécharger un fichier depuis un serveur Pour télécharger un fichier sur votre ordinateur depuis un serveur FTP ou HTTP, vous utiliserez la procédure DownloadFile() : My.Computer.Network.DownloadFile("AdresseServeur", "NomFichier", "NomUtilisateur", „ "MotPasse", Interface, TimeOut, Ecrasement)
où :
∑ ∑
AdresseServeur est l’adresse FTP ou HTTP du fichier sur le serveur. NomFichier contient le chemin de stockage sur votre ordinateur et le nom à donner au
fichier téléchargé.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
135
∑ ∑ ∑
NomUtilisateur est le nom à fournir au serveur pour accéder au compte (si nécessaire).
∑ ∑
TimeOut définit le délai de réponse maximal du serveur, en millisecondes.
MotPasse est le mot de passe à fournir au serveur pour accéder au compte (si nécessaire). Interface est une valeur booléenne qui indique si l’indicateur de progression du transfert doit (True) ou ne doit pas (False) être affiché.
Ecrasement est une variable booléenne qui indique si un fichier de même nom doit (True) ou ne doit pas (False) être écrasé sur votre ordinateur.
Supposons que vous vouliez télécharger le fichier Total Commander depuis le site Infosdu-net.com. L’adresse de téléchargement est http://download.infos-du-net.com/52282/ tcmdr700.exe. Ce fichier est librement téléchargeable, sans qu’il soit nécessaire de fournir un nom d’utilisateur et un mot de passe. Pour copier le fichier dans le dossier c:\test, sous le nom tcmdr700.exe, vous utiliserez l’instruction 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 exécutée, un indicateur indique la progression du transfert (voir Figure 3.75). Figure 3.75 Indicateur de progression du transfert.
Manipulation du Registre L’objet My.Computer.Registry donne accès à de nouvelles procédures en rapport avec le Registre de Windows : Procédure
Utilité
My.Computer.Registry.CurrentUser.CreateSubKey()
Création d’une clé
My.Computer.Registry.SetValue()
Définition de la valeur d’une clé
My.Computer.Registry.GetValue()
Lecture d’une clé
My.Computer.Registry.CurrentUser.DeleteSubKey()
Suppression d’un clé
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
136
Visual Basic 2010
Lecture d’une valeur Vous utiliserez la fonction GetValue() pour lire une valeur dans le Registre : resultat = My.Computer.Registry.GetValue(Nom, Valeur, RetourParDefaut)
où :
∑ ∑ ∑
Nom est un String contenant le nom de la clé à laquelle accéder. Valeur est un String contenant le nom de la valeur à laquelle accéder dans la clé.
RetourParDefaut est un Object contenant le résultat retourné par la fonction si la valeur spécifiée dans le deuxième argument n’existe pas. La valeur HKEY_USERS\.DEFAULT\Control Panel\Keyboard\InitialKeyboardIndicators indique si la touche Verr Num est activée (2) ou désactivée (0) au démarrage de l’ordinateur. 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 désactivée au démarrage de l’ordinateur") Else MsgBox("La touche Verr Num est activée au démarrage de l’ordinateur") End If
Test de l’existence d’une valeur Pour tester l’existence d’une valeur dans le Registre, il suffit d’utiliser la fonction GetValue() et de déterminer si la valeur renvoyée est égale au troisième argument de la fonction : If My.Computer.Registry.GetValue(Nom, Valeur, RetourParDefaut) Is RetourParDefaut Then MsgBox("La valeur " + Valeur + " n’existe pas.) End If
Écriture d’une valeur Vous utiliserez la fonction SetValue() pour lire une valeur dans le Registre : My.Computer.Registry.SetValue(Nom, Valeur, Donnée, type)
où :
∑ ∑ ∑
Nom est un String contenant le nom de la clé à laquelle accéder. Valeur est un String contenant le nom de la valeur à laquelle accéder dans la clé. Donnée est la donnée à écrire dans la valeur.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
∑ ∑ ∑ ∑ ∑ ∑ ∑
Nouveautés et concepts utiles du langage et de l’environnement
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
L’instruction ci-après active la touche Verr Num au démarrage de l’ordinateur en stockant la chaîne 2 dans la valeur HKEY_USERS\.DEFAULT\Control Panel\Keyboard\ InitialKeyboardIndicators : My.Computer.Registry.SetValue("HKEY_USERS\.DEFAULT\Control Panel\Keyboard", „ "InitialKeyboardIndicators", "2")
Création d’une clé La procédure CreateSubKey() permet de créer une nouvelle clé : CreateSubKey("Nom")
où Nom est le nom de la clé que vous souhaitez créer. Cette fonction est accessible à partir des objets listés dans le tableau ci-après. Objet
Accès à…
ClassesRoot
HKEY_CLASSES_ROOT
CurrentConfig
HKEY_CURRENT_CONFIG
CurrentUser
HKEY_CURRENT_USER
LocalMachine
HKEY_LOCAL_MACHINE
Users
HKEY_USERS
Par exemple, pour créer la clé CleTest dans la branche HKEY_CURRENT_CONFIG, vous utiliserez l’instruction suivante : My.Computer.Registry.CurrentConfig.CreateSubKey("CleTest")
Une fois la clé CleTest créée, vous pouvez définir la valeur ValeurTest et y stocker une valeur quelconque à l’aide de la procédure SetValue() : My.Computer.Registry.SetValue("HKEY_CURRENT_CONFIG\CleTest", "ValeurTest", „ "Donnée test", Microsoft.Win32.RegistryValueKind.String)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
138
Visual Basic 2010
Comme le montre la Figure 3.76, après l’exécution de ces deux instructions, la clé et la valeur ont bien été créées. Figure 3.76 CleTest et ValeurTest ont bien été créées.
ntion Atte
Si vous travaillez sous Windows 7 ou Vista, vous devez disposer des privilèges de l’administrateur pour modifier le Registre. Pour les acquérir, affichez le dossier contenant l’exécutable du projet, cliquez du bouton droit sur son icône et sélectionnez Exécuter en tant qu’administrateur dans le menu (voir Figure 3.77). Si cela vous est demandé, entrez le nom de l’utilisateur et le mot de passe associé puis validez.
Figure 3.77 Demande d’exécution du programme en tant qu’administrateur.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
139
Suppression d’une clé Pour supprimer une clé et les éventuelles valeurs qu’elle héberge, vous utiliserez la fonction DeleteSubKey() : CreateSubKey("Nom")
où Nom est le nom de la clé que vous souhaitez supprimer. À l’instar de la fonction CreateSubKey(), DeleteSubKey() est accessible à partir des objets ClassesRoot, CurrentConfig, CurrentUser, LocalMachine et Users. À titre d’exemple, pour supprimer la clé HKEY_CURRENT_CONFIG\CleTest, employez l’instruction ci-après : My.Computer.Registry.CurrentConfig.DeleteSubKey("CleTest")
Comme le montre la Figure 3.78, la clé CleTest a bien été supprimée. Figure 3.78 CleTest a disparu de la branche HKEY_CURRENT_CONFIG.
Ports série Les ports série de l’ordinateur sont accessibles via l’objet My.Computer.Ports. Vous utiliserez essentiellement les fonctions, procédures et propriétés de cet objet pour dialoguer avec un modem RTC et pour échanger des données entre deux ordinateurs reliés par un câble série. Liste des ports série La propriété SerialPortNames donne accès à une collection de String contenant le nom des ports série de l’ordinateur. Pour connaître le nom des différents ports série, il suffit de décrire la collection avec une instruction For Each :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
140
Visual Basic 2010
Dim st As String = "Les ports série 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 numéro de téléphone 01 45 89 44 65 :
∑
Interruption de la liaison :
∑
ATDT0145894465;
ATH
Réglage du volume du haut-parleur sur Faible : ATL0
L’objet My.Computer.Ports simplifie à l’extrême la communication avec un modem : 1. Identifiez le port série 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 série COM2. Pour lui demander de composer le numéro 01 45 89 44 65, 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 données sur un port série Pour envoyer des données sur un port série, procédez comme suit : 1. Définissez un objet IO.Ports.SerialPorts. 2. Instanciez-le avec la valeur retournée par la fonction OpenSerialPort(). 3. Utilisez la procédure Write() pour envoyer les données chaînes souhaitées : Dim com1 As IO.Ports.SerialPort com1 = My.Computer.Ports.OpenSerialPort("COM1", 19200) com1.Write("chaîne 1" & vbCrLf) … com1.Write("chaîne n" & vbCrLf)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
141
Pour recevoir des données sur un port série, procédez comme suit : 1. Définissez un objet IO.Ports.SerialPorts. 2. Instanciez-le avec la valeur retournée par la fonction OpenSerialPort(). 3. Utilisez la fonction ReadLine() en boucle pour acquérir les chaînes qui parviennent sur le port série : 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
Système d’affichage L’objet My.Computer.Screen donne accès à des fonctions, procédures et propriétés en rapport avec le système d’affichage. Le tableau ci-après dresse la liste des principales propriétés de cet objet. Propriété
Signification
My.Computer.Screen.WorkingArea.Size
Taille de l’écran
My.Computer.Screen.WorkingArea.Height ou My.Computer.Screen.WorkingArea.Bounds.Height
Hauteur de l’écran
My.Computer.Screen.WorkingArea.Width ou My.Computer.Screen.WorkingArea.Bounds.Width
Largeur de l’écran
My.Computer.Screen.WorkingArea.X
Abscisse du coin supérieur gauche de la zone de tracé (System.Drawing.Rectangle)
My.Computer.Screen.WorkingArea.Y
Ordonnée du coin supérieur gauche de la zone de tracé (System.Drawing.Rectangle)
My.Computer.Info L’objet My.Computer.Info donne accès aux informations concernant l’ordinateur sur lequel le code est exécuté : mémoire, assemblies, nom de l’application, nom du système d’exploitation, etc.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
142
Visual Basic 2010
Propriété
Signification
AvailablePhysicalMemory
Mémoire physique disponible
AvailableVirtualMemory
Mémoire virtuelle disponible
OSFullName
Nom du système d’exploitation
OSPlatform
Nom de la plateforme
OSversion
Version du système d’exploitation
InstalledUICulture
Langue du système
TotalPhysicalMemory
Mémoire physique totale
TotalVirtualMemory
Mémoire virtuelle totale
À titre d’exemple, nous allons définir une petite application qui affiche les propriétés décrites dans le tableau précédent. Après avoir créé un nouveau projet de type Application Windows Forms, nous ajoutons huit contrôles Label et huit contrôles TextBox à la feuille de l’application. Les propriétés des contrôles sont modifiées comme suit : Contrôle
Propriété
Valeur
Label1
Text
Mémoire RAM totale
Label2
Text
Mémoire RAM disponible
Label3
Text
Mémoire virtuelle totale
Label4
Text
Mémoire virtuelle disponible
Label5
Text
Nom complet du système
Label6
Text
Plateforme
Label7
Text
Version
Label8
Text
Culture
Form1
Text
Informations sur le système
Double-cliquez sur un emplacement inoccupé de la feuille et complétez la procédure 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
TextBox5.Text TextBox6.Text TextBox7.Text TextBox8.Text End Sub
Nouveautés et concepts utiles du langage et de l’environnement
= = = =
143
My.Computer.Info.OSFullName My.Computer.Info.OSPlatform My.Computer.Info.OSVersion My.Computer.Info.InstalledUICulture.ToString
Cette procédure se contente de lire les propriétés de l’objet My.Computer.Info et de les afficher dans les contrôles TextBox (voir Figure 3.79). Figure 3.79 Informations système provenant de l’objet My.Computer.Info.
Tous les fichiers relatifs à cette application se trouvent dans le dossier Projects\Infos Systeme des sources de l’ouvrage.
My.User Vous utiliserez l’objet My.User pour obtenir des informations sur la personne qui exécute le programme. Vous pourrez en particulier connaître :
∑ ∑ ∑
son nom de domaine : première partie de la propriété Name ; son nom d’utilisateur : seconde partie de la propriété Name ; son type (simple utilisateur, administrateur) : propriété BuiltInRole.
Les lignes de code suivantes lisent les propriétés de l’objet My.User et les affichent dans un contrôle TextBox multiligne : Dim st As String Dim nom() As String = Split(My.User.Name, "\") st = "Nom de domaine : " + nom(0) + vbCrLf
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
144
Visual Basic 2010
st = st + "Nom d’utilisateur : " + nom(1) + vbCrLf If My.User.IsInRole(ApplicationServices.BuiltInRole.Guest) Then st = st „ + "L’utilisateur n’est pas un administrateur" If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then st = st „ + "L’utilisateur est un administrateur" TextBox1.Text = st
Après avoir défini la variable String st : Dim st As String
la propriété Name de l’objet My.User est lue et ses deux composantes sont stockées dans le tableau de String nom() : Dim nom() As String = Split(My.User.Name, "\")
Le nom de domaine et le nom d’utilisateur sont alors extraits du tableau et stockés dans la variable st : st = "Nom de domaine : " + nom(0) + vbCrLf st = st + "Nom d’utilisateur : " + nom(1) + vbCrLf
Les deux instructions suivantes testent le type de l’utilisateur et ajoutent l’information correspondante dans la variable st : If My.User.IsInRole(ApplicationServices.BuiltInRole.Guest) Then st = st + „ "L’utilisateur n’est pas un administrateur" If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then st = st „ + "L’utilisateur est un administrateur"
Enfin, le contenu de la variable st s’affiche dans le contrôle TextBox multiligne : TextBox1.Text = st
My.Resources Lorsque vous prévoyez d’utiliser des icônes, 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 l’exécutable) ou bien les inclure dans les "ressources" de l’application. Dans le second cas, ils feront partie intégrante de l’exécutable et ne pourront pas en être discernés par les utilisateurs. Pour inclure une nouvelle ressource dans l’application en cours d’édition, procédez comme suit : 1. Lancez la commande Propriétés de Nom (où Nom est le nom de l’application) du menu Projet.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
145
2. Sélectionnez l’onglet Ressources (voir Figure 3.80). Figure 3.80 L’onglet Ressources des propriétés de l’application.
3. Choisissez le type de ressource à ajouter à l’application dans la première liste déroulante : Chaînes, Images, Icônes, Audio, Fichiers ou Autre (vous pouvez également utiliser les raccourcis Ctrl+1 à Ctrl+6). 4. Déroulez la liste Ajouter une ressource et sélectionnez Ajouter un fichier existant. 5. Choisissez le fichier que vous souhaitez ajouter dans les ressources de l’application (voir Figure 3.81). Figure 3.81 Le fichier WAV ding a été ajouté à l’application.
Pour accéder aux ressources de l’application dans le code, il suffit d’utiliser l’objet My.Resources. Par exemple, pour jouer le son WAV ding, employez l’instruction suivante : My.Computer.Audio.Play(My.Resources.ding, AudioPlayMode.Background)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
146
Visual Basic 2010
La fonctionnalité AutoComplete de Visual Basic 2010 facilite l’accès aux ressources incluses dans l’application : entrez My.Computer dans l’éditeur de code et faites votre choix dans la liste déroulante (voir Figure 3.82). Figure 3.82 AutoComplete donne accès aux différentes ressources incluses dans l’application.
My.Settings L’objet My.Settings donne accès à un ensemble de procédures, fonctions et propriétés liées au paramétrage de l’application. Par son intermédiaire, vous pouvez stocker de façon dynamique toute information jugée nécessaire et retrouver celle-ci lors des prochaines exécutions de l’application. Cela permet de mémoriser les préférences de l’utilisateur (couleurs, polices, particularités d’affichage, etc.) ou encore de savoir combien de fois l’application a été lancée. À titre d’exemple, nous allons ajouter la variable Integer NombreExecution dans les paramètres de l’application et lui affecter la valeur 0 : 1. Lancez la commande Propriétés de Nom (où Nom est le nom de l’application) du menu Projet. 2. Sélectionnez l’onglet Propriétés et remplissez les champs Nom, Type, Portée et Valeur (voir Figure 3.83).
Info
Pour être en mesure de modifier un élément défini sous l’onglet Paramètres, vous devez lui affecter une portée Utilisateur (et non Application).
3. Retournez dans le code. La propriété NombreExecution est directement accessible dans l’objet My.Settings (voir Figure 3.84).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
147
Figure 3.83 L’onglet Paramètres permet de créer des paramètres propres à l’application.
Figure 3.84 Le paramètre NombreExecution est directement accessible dans le code.
Si vous développez des programmes en shareware, vous souhaiterez peut-être limiter le nombre d’exécutions de la version non enregistrée de vos créations. Il suffit pour cela d’incrémenter le paramètre NombreExecution à chaque exécution 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 exécuté l’application 30 fois." + vbCrLf + "Pour „ continuer à l’utiliser, vous devez vous enregistrer." + vbCrLf + "Pour „ cela, rendez-vous sur le site www.MonSite.com") End End If End Sub
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
148
Visual Basic 2010
My.WebServices L’objet My.WebServices facilite grandement l’interfaçage avec un service web. Après avoir référencé le service web dans le projet à l’aide de la commande Ajouter une référence web du menu Projet, les fonctions et procédures du service sont directement accessibles par l’intermédiaire de l’objet My.WebServices. Par exemple, pour accéder à 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 résultat de la fonction NomFonction est stocké.
∑
NomService est le nom du service web interrogé.
∑
NomFonction est le nom de la fonction du service web interrogée.
∑
param1 à paramN sont les paramètres transmis à la fonction NomFonction.
Vous trouverez un exemple concret d’utilisation de l’objet My.WebServices au Chapitre 25 dédié aux services web.
Assistant Publication Lorsqu’une application aura donné les résultats escomptés, vous souhaiterez certainement la diffuser. Pour cela, Visual Studio vous propose son Assistant Déploiement. Lancez la commande Publier Nom dans le menu Générer (où Nom est le nom de la solution en cours d’édition). Cette commande lance l’Assistant Publication. Spécifiez l’emplacement de publication de votre solution. Comme le montre la Figure 3.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 décidez de publier la solution sur votre disque dur ou sur un disque dur partagé du réseau, un fichier Setup.exe est automatiquement généré (voir Figure 3.86). Pour installer votre solution, il suffit de copier le contenu du dossier de publication sur le CD-ROM/DVD-ROM et d’exécuter le fichier Setup.exe.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 3
Nouveautés et concepts utiles du langage et de l’environnement
149
Figure 3.85 L’assistant Publication est la dernière étape dans le développement d’une solution.
Figure 3.86 Ces fichiers ont été générés par l’Assistant Publication.
Assistant Mise à niveau Pour convertir un projet écrit dans une version antérieure de Visual Basic en Visual Basic 2010, ouvrez-le dans Visual Studio à l’aide de la commande Ouvrir un projet du menu Fichier. Cette action provoque l’exécution de l’Assistant Mise à niveau (voir Figure 3.87).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
150
Visual Basic 2010
Figure 3.87 La première boîte de dialogue de l’Assistant Mise à niveau de Visual Basic.
L’Assistant Mise à niveau vous guide tout au long du processus et crée 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 l’environnement de développement précédent. Après 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 fonctionnalités du langage n’ont pas d’équivalent dans Visual Basic 2010 (ou celui proposé est trop différent pour une mise à niveau automatique). Après la mise à niveau, vous pourrez également modifier votre application afin de tirer parti des nouvelles fonctionnalités de Visual Basic 2010.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
II Programmation Windows Au travers de nombreux exemples, cette partie vous montre comment aborder la plupart des domaines de programmation Windows : utilisation de boîtes de dialogue communes, mise en place de menus, barres d’outils et barres d’état, manipulations graphiques, accès au système de fichiers, exploitation de données tabulaires, bases de données locales et distantes, accès au Registre de Windows, interfaçage de Word et d’Excel, accès aux fonctions API, traitement multitâche/multicœur, etc. Tous les codes présentés dans cette partie sont réutilisables : un copier-coller est généralement suffisant pour les incorporer dans vos propres développements.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
4 Boîtes de dialogue communes Windows met à la disposition des programmeurs un ensemble de boîtes de dialogue "communes". En les utilisant, les applications ont un look and feel constant, ce qui facilite l’apprentissage de leurs utilisateurs. La mise en œuvre des boîtes de dialogue communes est des plus simple. Il suffit d’initialiser des propriétés et d’appeler la méthode adéquate. Les boîtes de dialogue accessibles par ce procédé concernent l’ouverture, l’enregistrement et l’impression de fichiers, la sélection de dossiers, de couleurs et de polices. Chacune de ces boîtes de dialogue est attachée à un contrôle spécifique dans la Boîte à outils :
∑ ∑ ∑ ∑ ∑
OpenFileDialog pour la boîte de dialogue Ouvrir ; SaveFileDialog pour la boîte de dialogue Enregistrer sous ; ColorDialog pour la boîte de dialogue Couleur ; FontDialog pour la boîte de dialogue Polices de caractères ; PrintDialog pour la boîte de dialogue Imprimer ;
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
154
∑ ∑
Visual Basic 2010
PrintPreviewDialog pour la boîte de dialogue Aperçu avant impression ; FolderBrowserDialog pour la boîte de dialogue Rechercher un dossier.
La boîte de dialogue Ouvrir La boîte de dialogue Ouvrir permet de sélectionner un fichier dans les mémoires de masse de l’ordinateur : disquettes, disques durs, CD-ROM, etc. Elle est attachée à la méthode ShowDialog. Pour pouvoir afficher une boîte de dialogue Ouvrir, une ou plusieurs propriétés doivent être renseignées. Le tableau suivant dresse la liste des principales propriétés utilisables. Propriété
Effet
DefaultExt
Définit l’extension par défaut du nom du fichier à ouvrir.
Title
Définit la chaîne affichée dans la barre de titre de la boîte de dialogue.
FileName
Définit le chemin d’accès et le nom du fichier sélectionné par défaut.
Filter
Définit les filtres à utiliser. Ces filtres apparaissent dans la liste modifiable Type de la boîte de dialogue. La syntaxe est objet.Filter [= description1 |filtre1 |description2 |filtre2…].
FilterIndex
Spécifie le filtre à utiliser par défaut dans la boîte de dialogue Ouvrir. La syntaxe est objet.FilterIndex [= 1 | 2 | 3 | 4…].
InitialDirectory
Définit le répertoire des fichiers affichés à l’ouverture de la boîte de dialogue.
Une fois que les propriétés de votre choix ont été renseignées, un simple appel à la méthode ShowDialog() affiche la boîte de dialogue Ouvrir. Vous pouvez ensuite utiliser la propriété FileName pour connaître le nom du fichier sélectionné. Lancez la commande Nouveau/Projet du menu Fichier pour définir un nouveau projet. Choisissez .NET Framework 4 dans la liste déroulante Framework. Sélectionnez 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 boîte de dialogue Ouvrir (OpenFileDialog) dans la feuille. Modifiez les propriétés des différents contrôles comme suit : Contrôle
Propriété
Valeur
Form1
Text
La boîte de dialogue Ouvrir
Button1
Text
Ouvrir
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes de dialogue communes
Contrôle
Propriété
Valeur
Button2
Text
Quitter
TextBox1
Multiline
True
OpenFileDialog
(Name)
CMD
155
Si vous avez suivi nos indications, la feuille du projet doit maintenant ressembler à la Figure 4.1. Figure 4.1 La boîte de dialogue du projet, en mode Création.
Vous allez maintenant définir le code des deux boutons de commande. Double-cliquez sur le bouton Ouvrir et complétez la procédure 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|Exécutables (*.EXE)|*. EXE|Fichiers d’aide (*.HLP)|*.HLP" CMD.FilterIndex = 1 CMD.InitialDirectory = "C:\WINDOWS" CMD.ShowDialog() ‘ ‘ Message affiché selon la sélection de l’utilisateur ‘ If (CMD.FileName <> "") Then TextBox1.Text = "Le fichier " + CMD.FileName + " a „ été sélectionné." Else TextBox1.Text = "Vous n’avez sélectionné aucun fichier." End Sub
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
156
Visual Basic 2010
Les quatre premières lignes paramètrent la boîte de dialogue Ouvrir :
∑ ∑ ∑
Title définit le texte qui apparaît dans la barre de titre.
∑
InitialDirectory définit le dossier par défaut.
Filter définit le filtre de sélection des fichiers de la liste déroulante Fichiers de type. FilterIndex désigne l’entrée sélectionnée par défaut dans la liste déroulante Fichiers
de type. CMD.Title = "Choisissez un fichier" CMD.Filter = "Bitmap (*.BMP)|*.BMP|DLL (*.DLL)|*.DLL|Exécutables (*.EXE)|*. „ EXE|Fichiers d’aide (*.HLP)|*.HLP" CMD.FilterIndex = 1 CMD.InitialDirectory = "C:\WINDOWS"
Lorsque la boîte de dialogue a été paramétrée, elle s’affiche : CMD.ShowDialog()
Lors de sa fermeture, la propriété FileName du contrôle CMD contient l’entrée sélectionnée par l’utilisateur. En fonction de cette entrée, un message apparaît dans la zone de texte : If (CMD.FileName <> "") Then TextBox1.Text = "Le fichier " + CMD.FileName + " a été „ sélectionné." Else TextBox1.Text = "Vous n’avez sélectionné aucun fichier."
Double-cliquez sur le bouton de commande Quitter et complétez la procédure 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 lorsqu’on clique sur le bouton Quitter. Exécutez la solution en cliquant sur le bouton Démarrer le débogage de la barre d’outils Standard. Les boutons Ouvrir et Quitter sont totalement opérationnels (voir Figure 4.2). Figure 4.2 Un fichier a été sélectionné dans le dossier c:\Windows.
Cette application se trouve dans le dossier Ouvrir après installation des sources de l’ouvrage.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes de dialogue communes
157
La boîte de dialogue Enregistrer sous Les boîtes de dialogue Enregistrer sous et Ouvrir sont assez semblables. Seule la méthode à utiliser est différente. Vous trouverez dans le dossier Projects\Enreg des sources de l’ouvrage une application permettant de définir le nom d’un fichier de sauvegarde dans une boîte de dialogue Enregistrer sous (voir Figure 4.3). Figure 4.3 Les deux boîtes de dialogue affichées par le projet ENREG.
Voici le listing de la procédure associée au clic sur le premier bouton de commande : Private Sub Command1_Click() ‘ - - - - - - - - - - - - - - - - - - - - - - - - - ‘ Définition des propriétés de la boîte 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 réalisée dans le „ fichier " + CMD.filename + "." Else Text1.Text = "Vous n’avez sélectionné aucun „ fichier." End Sub
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
158
Visual Basic 2010
Remarquez en particulier la définition restreinte des filtres de sauvegarde : CMD.Filter = "Perso (*.PER)|(*.PER)|Tous les fichiers (*.*)|*.*"
et la sélection du nom de la sauvegarde par défaut : CMD.filename = "Agenda.per"
Ce projet se trouve dans le dossier Enreg après installation des sources de l’ouvrage.
La boîte de dialogue Couleur La boîte de dialogue Couleur permet de sélectionner une couleur dans un ensemble de couleurs de base. En agrandissant cette boîte, vous pouvez également définir une couleur par ses composantes : teinte, saturation, luminance, rouge, vert, bleu. Pour faire apparaître la boîte de dialogue Couleur, il suffit d’appeler la fonction ShowDialog(). Cette fonction renvoie une valeur qui indique sur quel bouton l’utilisateur a cliqué pour la fermer : Windows.Forms.DialogResult.OK (bouton OK) ou Windows.Forms.Dialog Result.Cancel (bouton Annuler). Le cas échéant, l’objet Color donne tous les rensei gnements nécessaires sur la couleur sélectionnée.
Exemple Nous allons définir un projet qui permettra à l’utilisateur de sélectionner une couleur dans une boîte de dialogue Couleur. Le résultat à atteindre est représenté à la Figure 4.4. Figure 4.4 Utilisation d’une boîte de dialogue Couleurs pour sélectionner une couleur prédéfinie ou personnalisée.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes de dialogue communes
159
Réalisation Définissez un nouveau projet. Ajoutez le contrôle ColorDialog1 dans la feuille de l’application. Cliquez dessus et donnez-lui le nom CMD (propriété Name). Définissez deux boutons de commande et une zone de texte. Nommez les deux boutons Couleur et Quitter (propriété Caption). Définissez enfin le titre de la boîte de dialogue : Choix d’une couleur (propriété Caption de la boîte de dialogue). La feuille du projet doit maintenant ressembler à la Figure 4.5. Figure 4.5 La boîte de dialogue du projet, en mode Création.
Affectez à présent des lignes de code aux deux boutons de commande. La procédure associée au bouton Quitter comprend une seule instruction qui met fin au programme : Private Sub Command2_Click() End End Sub
La procédure associée au bouton Couleur est plus complexe. Double-cliquez sur le bouton Couleur et définissez 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 n’a été sélectionnée" EndIf End Sub
La procédure consiste en une seule instruction If Then Else : If CMD.ShowDialog() = Windows.Forms.DialogResult.OK
1. Ce contrôle se trouve sous l’onglet Boîtes de dialogue de la Boîte à outils.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
160
Visual Basic 2010
Si l’utilisateur clique sur le bouton OK pour quitter la boîte de dialogue Couleurs, la procédure CMD.ShowDialog() renvoie la valeur Windows.Forms.DialogResult.OK. Le code qui suit l’instruction Then est donc exécuté : 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 sélectionnée par l’utilisateur. Notez la simplicité avec laquelle les trois composantes sont extraites de l’objet Color. Si l’utilisateur clique sur le bouton Annuler pour quitter la boîte de dialogue Couleurs, la condition suivant l’instruction If n’est pas vérifiée. Le code suivant l’instruction Else est donc exécuté : TextBox1.Text = "Aucune couleur n’a été sélectionnée"
Ce code affiche un message indiquant qu’aucune couleur n’a été sélectionnée dans la boîte de dialogue Couleurs.
Info
Pour initialiser la couleur d’un objet, il suffit de transmettre ses composantes Rouge, Vert et Bleu à la fonction RGB : Objet.Color = RGB(Composante Rouge, Composante Vert, Composante Bleu)
Ce projet se trouve dans le dossier Couleur après installation des sources de l’ouvrage.
La boîte de dialogue Police de caractères La boîte de dialogue Police de caractères permet de sélectionner une police et ses attributs. Elle est attachée à la méthode ShowDialog. Tout comme pour les autres boîtes de dialogue communes, il est possible de connaître le bouton sur lequel l’utilisateur a cliqué lors de la fermeture de la boîte de dialogue, en contrôlant la valeur renvoyée par la fonction ShowDialog(). Les objets manipulés par la boîte de dialogue Police de caractères sont de type Font. Voici leurs principales propriétés : Propriété
Effet
Font.Bold
Définit le style Gras
Font.Italic
Définit le style Italique
Font.Name
Définit la police
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes de dialogue communes
Propriété
Effet
Font.Size
Définit la taille
Font.Strikeout
Définit le style Barré
Font.Underline
Définit le style Souligné
161
Exemple Nous allons définir un projet qui permettra à l’utilisateur de sélectionner une police, un style, une taille et des effets. Le résultat à atteindre est montré à la Figure 4.6. Figure 4.6 Utilisation de la boîte de dialogue Police de caractères pour sélectionner une police et ses attributs.
Réalisation Définissez un nouveau projet. Ajoutez le contrôle FontDialog1 dans la feuille de l’appli cation. Cliquez dessus et donnez-lui le nom CMD (propriété Name). Définissez deux boutons de commande et une zone de texte. Nommez les deux boutons Police et Quitter (propriété Caption). Définissez enfin le titre de la boîte de dialogue : Choix d’une police (propriété Caption de la boîte de dialogue). 1. Ce contrôle se trouve sous l’onglet Boîtes de dialogue de la Boîte à outils.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
162
Visual Basic 2010
La feuille du projet doit maintenant ressembler à la Figure 4.7. Figure 4.7 La boîte de dialogue du projet, en mode Création.
Vous allez à présent affecter des lignes de code aux deux boutons de commande. La procédure associée au clic sur le bouton Quitter se contente d’exécuter l’instruction End pour mettre fin au programme. La procédure associée au bouton Police est plus complexe. Double-cliquez sur le bouton Police et définissez 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 n’avez sélectionné aucune police." End If End Sub
Après avoir défini la variable String Tampon : Dim tampon As String
la boîte de dialogue FontDialog s’affiche. Une instruction If permet de connaître le bouton cliqué par l’utilisateur lors de la fermeture de la boîte de dialogue : If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then
Si le bouton OK est cliqué, un texte indiquant les caractéristiques de la police sélectionnée est calculé dans la variable Tampon :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes 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 éléments suivants sont extraits de l’objet CMD.Font :
∑ ∑ ∑
Nom de la police. Name. Taille des caractères, en points. Size. Attributs des caractères. Bold, Italic, Underline et Strikeout.
Le contenu de la variable Tampon apparaît dans le contrôle TextBox : TextBox1.Text = Tampon
Si l’utilisateur clique sur le bouton Annuler, un message indiquant qu’aucune police n’a été sélectionnée s’affiche dans le contrôle TextBox : Else TextBox1.Text = "Vous n’avez sélectionné aucune police."
Ce projet se trouve dans le dossier Police après installation des sources de l’ouvrage.
La boîte de dialogue Imprimer La boîte de dialogue Imprimer est utilisée pour définir les paramètres de l’impression : nom de l’imprimante, nombre de copies, numéros des pages à imprimer, etc. Si nécessaire, ces paramètres peuvent devenir les paramètres d’impression par défaut. Cette boîte est attachée à la méthode ShowDialog. Tout comme pour les autres boîtes de dialogue communes, il est possible de connaître le bouton cliqué par l’utilisateur à la fermeture de la boîte de dialogue, en contrôlant la valeur renvoyée par la fonction ShowDialog(). Plusieurs propriétés peuvent être initialisées avant d’appeler la méthode ShowDialog pour modifier l’apparence de la boîte de dialogue Imprimer : Propriété
Effet
PrinterSettings.Copies
Nombre d’exemplaires à imprimer.
PrinterSettings.PrintToFile
État de la case à cocher Imprimer dans un fichier.
AllowCurrentPage
Affichage du contrôle Page en cours.
AllowPrintToFile
Affichage du contrôle Imprimer dans un fichier.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
164
Visual Basic 2010
Propriété
Effet
AllowSelection
Affichage du contrôle Sélection.
AllowSomePages
Affichage du contrôle Pages.
PrinterSettings.MaximumPage
Le plus grand numéro de page que l’utilisateur peut entrer dans la zone de texte A.
PrinterSettings.MinimumPage
Le plus petit numéro de page que l’utilisateur peut entrer dans la zone de texte De.
PrinterSettings.FromPage
Numéro de la première page à imprimer.
PrinterSettings.ToPage
Numéro de la dernière page à imprimer.
Une fois que les propriétés de votre choix ont été renseignées, un appel à la méthode ShowDialog() affiche la boîte de dialogue Imprimer. Après la fermeture de cette boîte, vous pouvez utiliser les propriétés PrinterSettings.Copies, PrinterSettings.FromPage, PrinterSettings.ToPage, PrinterSettings.MaximumPage et PrinterSettings.MinimumPage pour connaître les paramètres sélectionnés par l’utilisateur.
Exemple Nous allons définir un projet qui permettra à l’utilisateur de modifier le paramétrage par défaut de l’impression et, éventuellement, de choisir une autre imprimante. L’objectif à atteindre est représenté à la Figure 4.8. Figure 4.8 Utilisation des boîtes de dialogue Impression et Configuration de l’impression pour modifier le paramétrage par défaut de l’imprimante.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes de dialogue communes
165
Réalisation Définissez un nouveau projet. Ajoutez le contrôle PrintDialog dans la feuille de l’appli cation. Cliquez dessus et donnez-lui le nom CMD (propriété Name). Définissez deux boutons de commande et une zone de texte. Nommez les deux boutons Paramètres d’impression et Quitter (propriété Caption). Définissez enfin le titre de la boîte de dialogue : Paramètres d’impression (propriété Caption de la boîte de dialogue). La feuille du projet doit maintenant ressembler à la Figure 4.9. Figure 4.9 La boîte de dialogue du projet, en mode Création.
Ensuite, affectez des lignes de code aux deux boutons de commande. Comme dans les miniapplications précédentes, la procédure associée au clic sur le bouton Quitter se contente d’exécuter l’instruction End pour mettre fin au programme. La procédure associée au bouton Paramètres d’impression 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 défaut CMD.AllowCurrentPage = True ‘Bouton Tout affiché CMD.AllowPrintToFile = True ‘Option Impression dans un fichier affichée CMD.PrinterSettings.PrintToFile = False ‘Option Impression dans un fichier „ décochée par défaut CMD.AllowSelection = True ‘Bouton Sélection affiché CMD.AllowSomePages = True ‘Bouton Pages affiché If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then TextBox1.Text = "Paramètres enregistrés." Else TextBox1.Text = "Les paramètres n’ont pas été pris en compte." End If End Sub
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
166
Visual Basic 2010
Le premier bloc d’instructions définit les options de la boîte de dialogue Imprimer : CMD.PrinterSettings.Copies = 3 ‘Trois copies par défaut CMD.AllowCurrentPage = True ‘Bouton Tout affiché CMD.AllowPrintToFile = True ‘Option Impression dans un fichier affichée CMD.PrinterSettings.PrintToFile = False ‘Option Impression dans un fichier décochée „ par défaut CMD.AllowSelection = True ‘Bouton Sélection affiché CMD.AllowSomePages = True ‘Bouton Pages affiché
La boîte de dialogue Imprimer apparaît en appelant la méthode ShowDialog(). Si l’utilisateur 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 paramétrage a été pris en compte s’affiche dans la zone de texte : TextBox1.Text = "Paramètres enregistrés."
Si le bouton Annuler est choisi par l’utilisateur, un message indiquant que le paramétrage n’a pas été pris en compte s’affiche dans la zone de texte : Else TextBox1.Text = "Les paramètres n’ont pas été pris en compte."
Cette application se trouve dans le dossier Imprimer après installation des sources de l’ouvrage.
La boîte de dialogue Rechercher un dossier La boîte de dialogue Rechercher un dossier est utilisée pour sélectionner un dossier sur les disques de l’ordinateur local ou sur le réseau. S’il le souhaite, l’utilisateur peut également créer un nouveau dossier et lui donner le nom de son choix. Tout comme pour les autres boîtes de dialogue communes, il est possible de connaître le bouton cliqué par l’utilisateur à la fermeture de la boîte de dialogue, en contrôlant la valeur renvoyée par la fonction ShowDialog().
Exemple Nous allons définir un projet qui permettra à l’utilisateur de désigner un dossier de son choix et, éventuellement, de créer un nouveau dossier. L’objectif à atteindre est représenté à la Figure 4.10.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 4
Boîtes de dialogue communes
167
Figure 4.10 Utilisation de la boîte de dialogue commune Rechercher un dossier.
Réalisation Définissez un nouveau projet. Ajoutez le contrôle FolderBrowserDialog dans la feuille de l’application. Cliquez dessus et donnez-lui le nom CMD (propriété Name). Définissez deux boutons de commande et une zone de texte. Nommez les deux boutons Rechercher et Quitter (propriété Caption). Définissez enfin le titre de la boîte de dialogue : Rechercher un dossier (propriété Caption de la boîte de dialogue). La feuille du projet doit maintenant ressembler à la Figure 4.11. Figure 4.11 La boîte de dialogue du projet, en mode Création.
Vous allez donner vie aux deux boutons de commande en leur affectant des lignes de code. Comme dans les mini-applications précédentes, la procédure associée au clic sur le bouton Quitter se contente d’exécuter l’instruction End pour mettre fin au programme.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
168
Visual Basic 2010
La procédure associée 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 n’a été sélectionné" End If End Sub
Les trois premières instructions initialisent la boîte de dialogue Rechercher un dossier : CMD.Description = "Choisissez un dossier" CMD.ShowNewFolderButton = True CMD.RootFolder = Environment.SpecialFolder.MyDocuments
La propriété Description définit le texte affiché dans la partie supérieure de la boîte de dialogue. La propriété ShowNewFolderButton indique si le bouton Créer un nouveau dossier doit être affiché (True) ou masqué (False). Enfin, la propriété RootFolder détermine le dossier affiché à la racine de l’arborescence. SpecialFolder donne accès à de nombreux dossiers spéciaux, tels que Application Data, Desktop, Favorites, History, My Documents, My Pictures, Program Files, StartMenu, etc. L’instruction suivante teste la valeur renvoyée par la fonction ShowDialog() pour connaître le bouton cliqué par l’utilisateur pour fermer la boîte de dialogue Rechercher un dossier : If CMD.ShowDialog() = Windows.Forms.DialogResult.OK Then
Si le bouton OK a été cliqué, le dossier sélectionné s’affiche dans la zone de texte TextBox1 : TextBox1.Text = CMD.SelectedPath
Dans le cas contraire, un message indiquant qu’aucun dossier n’a été sélectionné apparaît dans la zone de texte TextBox1 : Else TextBox1.Text = "Aucun dossier n’a été sélectionné"
Cette application se trouve dans le dossier Project\OuvrirDossier des sources de l’ouvrage.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
5 Un peu plus loin Par l’intermédiaire de trois exemples, ce chapitre vous montre à quel point Visual Basic 2010 facilite l’accès aux fonctionnalités avancées de Windows. Dans un premier temps, vous apprendrez à réaliser une application MDI qui manipule plusieurs fenêtres 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 d’images, un navigateur web, ou tout autre application dans laquelle plusieurs fenêtres de document peuvent être ouvertes. Dans un deuxième temps, vous ferez connaissance avec le système d’affichage GDI+ et vous verrez comment utiliser certaines de ses fonctions pour afficher du texte sous une forme graphique dans la feuille d’une application Visual Basic 2010. Enfin, vous apprendrez à manipuler le presse-papiers de Windows, en utilisant les procédures et fonctions traditionnelles de l’environnement .NET, ou par l’intermédiaire de l’espace de nom My, apparu avec la version 2.0 de .NET.
Une application MDI Certaines applications Windows ne peuvent manipuler qu’une seule fenêtre à la fois. C’est le cas de l’application graphique Microsoft Paint, livrée en standard depuis la version 95 de Windows. D’autres applications, comme le célèbre Word pour Windows, autorisent
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
170
Visual Basic 2010
l’ouverture simultanée de plusieurs documents. Cette possibilité est intéressante à plus d’un titre, en particulier :
∑ ∑ ∑
Elle facilite les copier-coller entre documents. Elle permet de voir plusieurs parties d’un même document. Elle permet de construire un document en ayant un ou plusieurs autres documents sous les yeux. En utilisant Visual Basic 2010, il est très simple de définir des applications comprenant plusieurs documents. Ces applications sont dites MDI (Multiple Document Interface). Elles partagent en général un système de menus, une barre d’outils et/ou une barre d’état. Les fenêtres d’un document sont également appelées fenêtres enfants (child). La fenêtre de base, qui contient le système de menus, la barre d’outils et la barre d’état, est la fenêtre parent. Pour concevoir une application MDI, vous devez au minimum définir une feuille parent et une feuille enfant. Chaque document ouvert ou créé dans l’application utilisera la même feuille parent en arrière-plan et une feuille enfant personnelle à l’intérieur de la feuille parent. La fenêtre parent est une feuille Visual Basic traditionnelle pour laquelle la propriété IsMDIContainer a été initialisée à True. La fenêtre enfant est matérialisée par une feuille Windows Form traditionnelle.
Création d’un formulaire parent Le formulaire MDI parent est le fondement d’une application MDI. Il donne accès et contient toutes les fenêtres MDI enfants. Pour définir un formulaire MDI parent, commencez par créer une nouvelle application avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. L’entrée Visual Basic/Windows étant sélectionnée sous Modèles installés, choisissez le modèle Application Windows Forms, nommez le projet Bloc Notes et validez en cliquant sur OK. Dans la fenêtre des propriétés, attribuez la valeur True à la propriété IsMDIContainer. Cette simple action désigne le formulaire en cours d’édition comme un conteneur MDI de fenêtres enfants. Ajoutez un contrôle MenuStrip au formulaire et définissez le menu suivant : Élément de menu principal
Élément de menu secondaire
Fichier
Nouveau
Fichier
Quitter
Fenêtre
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 5
Un peu plus loin
171
La commande de menu Fichier/Nouveau sera utilisée pour créer des fenêtres enfants, et le menu Fenêtre, pour basculer entre les diverses fenêtres enfants ouvertes. Cliquez sur le contrôle MenuStrip dans la feuille de l’application et affectez la valeur FenêtreToolStripMenuItem à sa propriété MdiWindowListItem. Cette simple action affecte au menu Fenêtre la liste des fenêtres MDI enfants ouvertes et indique par une coche la fenêtre enfant active.
Création d’un modèle de fenêtre enfant Lancez la commande Ajouter un formulaire Windows dans le menu Projet pour ajouter un nouveau formulaire au projet. Choisissez Windows Form dans la boîte de dialogue Ajouter un nouvel élément, donnez le nom Modèle Enfant au nouveau formulaire et cliquez sur Ajouter. Faites glisser un contrôle RichTextBoxControl de la Boîte à outils jusqu’au nouveau formulaire. Dans la fenêtre des propriétés, déroulez la liste Dock et cliquez sur le rectangle central (voir Figure 5.1). Cette action affecte la valeur Fill à la propriété Dock et la valeur Top, Left à la propriété Anchor. Le contrôle RichTextBox remplira totalement la zone du formulaire MDI enfant, même si ce dernier est redimensionné. Figure 5.1 Cliquez ici pour maximiser le contrôle RichTextBox.
Déroulez le menu Fichier dans la feuille de l’application et double-cliquez sur la commande Nouveau. Cette action affiche le squelette de la procédure NouveauToolStripMenuItem_ Click(). Complétez cette procédure comme suit : Private Sub NouveauToolStripMenuItem_Click(ByVal sender As System.Object,
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
172
Visual Basic 2010
„ ByVal e As System.EventArgs) Handles NouveauToolStripMenuItem.Click Dim NewMDIChild As New Modèle_Enfant NewMDIChild.MdiParent = Me NewMDIChild.Show() End Sub
La première ligne définit l’objet fenêtre fille MDI NewMDIChild : Dim NewMDIChild As New Form2()
La deuxième instruction associe la fenêtre fille avec le conteneur mère : NewMDIChild.MDIParent = Me
Enfin, la troisième instruction affiche la fenêtre fille à l’intérieur de la fenêtre mère : NewMDIChild.Show()
Pour compléter le programme, déroulez le menu Fichier dans la feuille de l’application et double-cliquez sur la commande Quitter. Complétez la procédure 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 l’application en appuyant sur la touche F5. La commande Fichier/Nouveau affiche une fenêtre fille dans la fenêtre principale de l’application. Si vous ouvrez plusieurs fenêtres avec cette commande, vous pouvez utiliser le menu Fenêtres pour basculer de l’une à l’autre (voir Figure 5.2). Figure 5.2 Deux fenêtres filles ont été ouvertes dans cette application MDI.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 5
Un peu plus loin
173
Le code de l’application se réduit aux deux procédures événementielles NouveauTool StripMenuItem_Click () et QuitterToolStripMenuItem_Click (). L’application se trouve dans le dossier Bloc Notes après installation des sources de l’ouvrage : Public Class Form1 Private Sub NouveauToolStripMenuItem_Click(ByVal sender As System.Object, „ ByVal e As System.EventArgs) Handles NouveauToolStripMenuItem.Click Dim NewMDIChild As New Modèle_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 caractères Les polices installées relèvent de la classe FontFamily et l’affichage de texte utilise le système d’affichage GDI+. Pour mieux comprendre comment utiliser ces deux éléments, nous allons définir un petit projet dans lequel les polices installées seront accessibles à travers une liste déroulante. Lorsque l’utilisateur sélectionnera une entrée dans cette liste, un texte de corps 20 s’affichera dans la police choisie (voir Figure 5.3). Figure 5.3 Le programme Polices de caractères en mode Exécution.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
174
Visual Basic 2010
Définissez un nouveau projet avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. Sélectionnez Visual Basic/Windows. Choisissez le modèle Application Windows Forms et validez. Ajoutez un Label, un ComboBox et un contrôle Button à la feuille du projet. Modifiez les propriétés de ces contrôles comme suit : Contrôle
Propriété
Valeur
Form1
Text
Polices de caractères
Label1
Text
Choisissez une police
Button1
Text
Quitter
Double-cliquez sur un emplacement inoccupé de la feuille et complétez la procédure 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 première instruction définit l’objet collection strFonts, dans lequel seront stockés les noms des polices installées : Dim strFonts As New Collections.ArrayList(10)
La deuxième instruction définit l’objet FontFamily Font, qui sera utilisé pour accéder à chacune des polices installées : Dim Font As FontFamily
Pour parcourir toutes les polices installées, 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)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 5
Un peu plus loin
175
Lorsque toutes les polices ont été parcourues, la liste déroulante est remplie en initialisant sa propriété DataSource avec la collection strFonts : Next ComboBox1.DataSource = strFonts
Pour être en mesure de faire référence aux fonctions de manipulation de texte de GDI+, vous devez inclure une instruction Imports en tête de code : Imports System.Drawing
Définissez également l’objet Graphics g, juste après la déclaration de classe Public Class Form1. Cet objet sera utilisé pour réaliser l’affichage du texte : Dim g As Graphics
Pour être en mesure d’afficher un texte dès le lancement du programme, vous allez définir la procédure Form1_Paint(). Sélectionnez l’entrée (Form1 Evénements) dans la première ������������������� la procéliste déroulante de la fenêtre de code et l’entrée Paint dans la seconde. Complétez 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 première instruction donne accès au système graphique g : g = Me.CreateGraphics
La seconde instruction utilise la procédure DrawString() pour afficher du texte dans la fenêtre : g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), „ Brushes.Black, New PointF(30, 100))
La procédure DrawString() existe en plusieurs déclinaisons : 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 procédure :
∑
str est la chaîne à afficher.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
176
∑ ∑ ∑
Visual Basic 2010
police est le nom de la police à utiliser. pinceau est le pinceau avec lequel les caractères doivent être peints. PF est une référence à un objet PointF qui identifie le coin supérieur gauche de la zone de tracé.
∑
RF est une référence à un objet RectangleF qui identifie la zone de tracé (coordonnées du point supérieur gauche, longueur et hauteur).
∑ ∑
Sx et Sy sont les coordonnées Single du coin supérieur gauche de la zone de tracé. Format est une référence à un objet StringFormat qui spécifie le format d’affichage
(espacement, alignement, etc.).
Dans cet exemple, la procédure DrawString() est utilisée dans sa plus simple expression. Remarquez la définition de la police et de l’objet PointF, directement dans l’appel à la procédure : g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), „ Brushes.Black, New PointF(30, 100))
Pour modifier l’affichage lorsque l’utilisateur sélectionne une police dans la liste déroulante, nous allons utiliser des instructions du même type. Double-cliquez sur le contrôle ComboBox1 et complétez la procédure 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 première instruction donne accès à l’objet graphique g : g = Me.CreateGraphics
Pour ne pas interférer avec l’affichage précédent, la zone graphique de la fenêtre est effacée à l’aide de la procédure Clear(). La couleur utilisée est la couleur de fond actuelle (Me. BackColor) : g.Clear(Me.BackColor)
Enfin, un appel à la procédure DrawString() affiche le nouveau texte en utilisant la police sélectionnée : g.DrawString("Police " + ComboBox1.Text + ", 20 points", New Font(ComboBox1.Text, 20), „ Brushes.Black, New PointF(30, 100))
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 procédure 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 l’application. Vous trouverez les fichiers correspondants dans le dossier Polices après installation des sources de l’ouvrage. 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
178
Visual Basic 2010
Les possibilités offertes par GDI+ au niveau des polices de caractères sont très étendues. Il est par exemple possible d’effectuer des rotations ou des inclinaisons sur le texte ou encore d’utiliser un pinceau non uniforme pour dessiner les caractères. Les rotations et inclinaisons se font à l’aide de la procédure RotateTransform(). Par exemple, l’instruction suivante provoque une inclinaison de 45 degrés du texte : G.RotateTransform(45)
Pour utiliser un pinceau non uniforme, il suffit de le définir comme tel. À titre d’exemple, l’instruction suivante définit un objet Bitmap à partir du fichier c:\test\colorwir.bmp : Dim Bmap = New Bitmap("C:\\test\\colorwir.bmp")
Cet objet Bitmap est utilisé pour définir un pinceau TextureBrush B : Dim B = New TextureBrush(Bmap)
Il suffit maintenant d’utiliser ce pinceau dans la procédure 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 représente l’effet obtenu dans le programme précédent lorsque la police Agency FB est sélectionnée. Figure 5.4 Un exemple de texturage à l’aide d’un fichier bitmap.
Voici le code de l’application. Les fichiers correspondants se trouvent dans le dossier Polices2 après installation des sources de l’ouvrage : Imports System.Drawing.Text
Public Class Form1 Dim g As Graphics
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 5
Un peu plus loin
179
Dim Bmap = New Bitmap("C:\\test\\colorwir.bmp") Dim B = New TextureBrush(Bmap) 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 accéder au presse-papiers de Windows, vous pouvez utiliser :
∑
les procédures et fonctions traditionnelles de .NET, telles que SetDataObject() et GetDataObject() ;
∑
les procédures et fonctions apparues dans la version 2.0 de .NET, relatives à l’objet My.Computer.Clipboard.
Nous allons examiner ces deux approches dans les pages suivantes.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
180
Visual Basic 2010
Accès traditionnel au presse-papiers Visual Basic 2010 possède un certain nombre de fonctions qui lui permettent de manipuler le presse-papiers de Windows :
∑ ∑
SetDataObject() place un objet dans le presse-papiers.
∑
GetDataObject().GetData("typeObjet") permet de récupérer le contenu du pressepapiers sous la forme d’un objet dont le type est spécifié dans la fonction GetData().
GetDataObject().GetDataPresent("typeObjet") permet de tester le type de l’objet
présent dans le presse-papiers.
L’application développée dans ce chapitre montre comment copier un objet bitmap dans le presse-papiers, le récupérer et l’affecter à un contrôle PictureBox. Définissez un nouveau projet de type Application Windows Forms avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. L’entrée Visual Basic/Windows étant sélectionnée dans le volet gauche, choisissez le modèle Application Windows Forms, nommez le projet OutilsEtat et validez en cliquant sur OK. Ajoutez un contrôle PictureBox sur la feuille du projet. Maximisez la taille de ce contrôle en donnant la valeur Fill à sa propriété Dock (pour cela, développez la liste déroulante de la propriété Dock et cliquez sur le rectangle central). Affectez une image quelconque au contrôle PictureBox par l’intermédiaire de sa propriété Image (dans cet exemple, le programme utilise les images Colorwir.bmp et Vide.bmp, qui se trouvent dans le dossier Presse papiers après installation des sources de l’ouvrage). Ajoutez un contrôle ContextMenuStrip au projet et définissez les entrées de menu suivantes : Couper, Copier, Coller, Effacer et Quitter. Renommez ces commandes à l’image de leurs noms respectifs (la propriété Name de la commande Couper est initialisée à "Couper", la propriété Nom de la commande Coller est initialisée à "Coller", etc.). Pour rendre le menu opérationnel, vous devez modifier la propriété ContextMenuStrip des objets sur lesquels vous voulez l’utiliser. Sélectionnez Form1 dans la fenêtre des propriétés et affectez la valeur ContextMenuStrip1 à la propriété ContextMenuStrip. Double-cliquez sur la commande Couper et complétez la procédure 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 première instruction place le contenu de l’image (Picture1.Image) dans le pressepapiers (Clipboard.SetDataObject()). La deuxième instruction affecte l’image blanche c:\vide.bmp au contrôle PictureBox1.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 5
Un peu plus loin
181
Double-cliquez sur la commande Copier et complétez la procédure 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 procédure ressemble à Couper_Click(). Mais ici, après la copie de l’image dans le presse-papiers, le contrôle PictureBox n’est pas effacé. Double-cliquez sur la commande Coller. La procédure Coller_Click() est légèrement plus complexe que les précédentes : 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
L’instruction if teste le contenu du presse-papiers à l’aide de la fonction GetDataObject(). GetDataPresent("Bitmap"). If (Clipboard.GetDataObject().GetDataPresent("Bitmap")) Then
Si la valeur True est renvoyée par cette fonction, cela signifie que le contenu du presse-papiers est bien de type bitmap. Dans ce cas, la fonction GetDataObject().GetData("Bitmap") récupère le contenu du presse-papiers et l’affecte au contrôle PictureBox : PictureBox1.Image = (Clipboard.GetDataObject().GetData("Bitmap"))
Double-cliquez sur la commande Effacer et complétez la procédure 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 procédure se contente de copier l’image blanche c:\vide.bmp dans le contrôle PictureBox afin de l’effacer. Double-cliquez enfin sur la commande Quitter et ajoutez le mot End à la procédure Quitter_Click() : Private Sub Quitter_Click(ByVal sender As System.Object, ByVal e As System „ .EventArgs) Handles Quitter.Click End End Sub
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
182
Visual Basic 2010
Voici le listing complet du programme. Vous trouverez les fichiers correspondants dans le dossier Presse papiers après installation des sources de l’ouvrage. 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
Accès au presse-papiers via .NET 4.0 Dupliquez le contenu du dossier Presse papiers dans le dossier Presse papiers 2. Ouvrez la solution Presse papiers.sln du dossier Presse papiers 2. Pour utiliser les procédures et fonction de .NET 4.0, vous allez modifier les procédures événementielles de l’application. Lancez la commande Code dans le menu Affichage (ou appuyez sur la touche F7). Modifiez la procédure Couper_Click() comme suit : Private Sub Couper_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) „ Handles Couper.Click
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 5
Un peu plus loin
183
My.Computer.Clipboard.SetImage(PictureBox1.Image) PictureBox1.Image = Image.FromFile("c:\vide.bmp") End Sub
La première instruction place le contenu du contrôle PictureBox dans le presse-papiers à l’aide de la procédure SetImage(). La seconde instruction copie le contenu du fichier c:\vide.bmp dans le contrôle PictureBox. Vous allez maintenant modifier la procédure 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
L’unique instruction de cette procédure copie le contenu du contrôle PictureBox dans le presse-papiers à l’aide de la procédure SetImage(). La dernière action va consister à modifier la procédure 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
L’instruction If teste si le presse-papiers contient un objet graphique : If (My.Computer.Clipboard.ContainsImage) Then
Dans l’affirmative, cet objet est affecté au presse-papiers : PictureBox1.Image = My.Computer.Clipboard.GetImage()
Les procédures Effacer_Click() et Quitter_Click() ne changent pas, car elles utilisent des instructions Visual Basic traditionnelles. Voici le listing complet de l’application. Les fichiers correspondants se trouvent dans le dossier Projects\Presse papiers 2 des sources de l’ouvrage. 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
6 Implémenter des menus Les menus traditionnels et contextuels sont banalisés sous la forme de simples contrôles dans la Boîte à outils. Dans les pages qui suivent, nous allons créer deux applications. La première permettra de tracer des ronds et des carrés par l’intermédiaire d’un système de menus et la seconde, par l’intermédiaire d’un menu contextuel.
Système de menus traditionnel Lancez la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. L’entrée Visual Basic/Windows étant sélectionnée dans le volet gauche, choisissez le modèle Application Windows Forms, nommez le projet Menu et validez en cliquant sur OK. Insérez un contrôle MenuStrip sur la feuille de l’application. Ce contrôle est automatiquement reporté dans la partie inférieure de la fenêtre, sous la forme d’une icône intitulée MenuStrip1. Cliquez sur cette icône et définissez les entrées principales et secondaires du menu, directement sur la feuille de l’application :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
186
Visual Basic 2010
Commandes principales
Commandes secondaires
Tracer
Rond et Carré
Rond
Rouge et Bleu
Carré
Rouge et Bleu
Quitter
Application
Nous allons associer les raccourcis clavier Ctrl+R et Ctrl+C aux commandes Tracer/Rond et Tracer/Carré. Pour cela :
∑
Cliquez sur l’entrée secondaire Rond sous Tracer et affectez la valeur Ctrl+R à la propriété ShortcutKeys.
∑
Cliquez sur l’entrée secondaire Carré sous Tracer et affectez la valeur Ctrl+C à la propriété ShortcutKeys.
Pour vous aider dans la saisie des raccourcis clavier, le plus simple consiste à cliquer sur la flèche située à droite de la valeur de la propriété ShortcutKey et à utiliser la boîte de saisie affichée (voir Figure 6.1). Figure 6.1 Saisie d’un raccourci-clavier.
Le raccourci-clavier s’affiche à droite de la commande de menu, juste après sa saisie (voir Figure 6.2).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter des menus
187
Figure 6.2 Les deux raccourcis clavier apparaissent en clair.
Par défaut, la commande secondaire Rond doit être validée. Cette affectation par défaut sera signalée par une coche devant la commande secondaire Rond. Cliquez sur cette commande et affectez la valeur True à la propriété Checked. Cliquez sur la commande principale Carré et affectez la valeur False à la propriété Visible pour cacher le menu Carré par défaut. Pour faciliter la compréhension du listing, vous allez redéfinir le nom des commandes de menu comme suit : Commande
Propriété Name
Tracer/Rond
TracerRond
Tracer/Carré
TracerCarré
Rond
Rond
Carré
Carré
Rond/Rouge
RondRouge
Rond/Bleu
RondBleu
Quitter/Application
QuitterApplication
Nous allons maintenant affecter du code aux commandes de menu. Double-cliquez sur la commande secondaire Tracer/Rond et complétez la procédure 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
188
Visual Basic 2010
Cette procédure affiche une coche devant la commande secondaire Tracer/Rond, supprime l’éventuelle 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 complétez la procédure 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 procédure effectue des actions analogues à la précédente : suppression de la coche devant la commande secondaire Tracer/Rond, affichage d’une coche devant la commande secondaire Tracer/Carré, dissimulation de la commande principale Rond et affichage de la commande principale Carré. Construit sur GDI+, le système Windows Forms donne accès à une bibliothèque d’imagerie graphique et de texte 2-D et 3-D très fournie. Pour être en mesure d’afficher des éléments graphiques dans une feuille, vous devez définir un objet Graphics avec la fonction CreateGraphics(). Double-cliquez sur un emplacement libre de la feuille et complétez la procédure 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
L’unique instruction de cette procédure définit l‘objet graphique G. Remarquez l’utilisation du mot-clé Me pour référencer l’instance de la classe en cours d’exécution. Pour compléter cette procédure, définissez l’objet G, dans les premières lignes du code : Dim G As Graphics
L’objet graphique G ayant été défini et implémenté, double-cliquez sur la commande secondaire Rond/Rouge et complétez la procédure RondRouge_Click() comme suit : Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs)Handles RondRouge.Click ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter des menus
189
‘ Effacement de la fenêtre 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 première ligne définit le rectangle dans lequel s’inscrit le cercle à tracer : Dim rect As New Rectangle(50, 50, 100, 100)
La deuxième instruction efface le contenu de la fenêtre afin de ne pas gêner le tracé en cours. Remarquez l’utilisation du mot-clé Me pour référencer la fenêtre en cours d’exécution : G.Clear(Me.BackColor)
Le bloc d’instructions suivant définit la couleur du crayon et trace un cercle à l’aide de la fonction DrawEllipse() : Dim Pen As New Pen(Color.Black, 3) G.DrawEllipse(Pen, rect)
Le dernier bloc d’instructions définit 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 complétez la procédure RondBleu_Click() comme suit : Private Sub RondBleu_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs) Handles RondBleu.Click ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) ‘ Effacement de la fenêtre G.Clear(Me.BackColor) ‘ Affichage du cercle Dim Pen As New Pen(Color.White, 3) G.DrawEllipse(Pen, rect)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 procédure est très proche de celui de RondRouge_Click(). Seules les couleurs du crayon et du remplissage changent. Nous n’y reviendrons pas. Double-cliquez sur la commande secondaire Carré/Rouge et complétez la procédure CarréRouge_Click() comme suit : Private Sub CarréRouge_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs) Handles CarréRouge.Click ‘ Effacement de la fenêtre 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
Après avoir effacé le contenu de la fenêtre : G.Clear(Me.BackColor)
La couleur noire est affectée au crayon : Dim Pen As New Pen(Color.Black, 3)
Un objet rect de type Rectangle est alors défini 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 d’instructions définit la couleur de remplissage dans l’objet brBrush et utilise cet objet pour remplir le carré à l‘aide de la fonction FillRectangle() : Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter des menus
191
Double-cliquez sur la commande secondaire Carré/Bleu et complétez la procédure CarréBleu_Click() comme suit : Private Sub CarréBleu_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs) Handles CarréBleu.Click ‘ Effacement de la fenêtre 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 procédure est très proche de celui de CarréRouge_Click(). Seules les couleurs du crayon et du remplissage changent. Nous n’y reviendrons pas. Enfin, double-cliquez sur la commande secondaire Quitter/Application et ajoutez une instruction End à la procédure 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 l’application. Le code généré par Form Designer a été masqué. Seul son en-tête apparaît en caractères italiques. Cette application se trouve dans le dossier Menu après installation des sources de l’ouvrage. 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 ‘Définition de l’objet graphique G = Me.CreateGraphics() End Sub Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As „ System.EventArgs) Handles RondRouge.Click ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) ‘ Effacement de la fenêtre 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 ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) ‘ Effacement de la fenêtre G.Clear(Me.BackColor) ‘ Affichage du cercle
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter des menus
193
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 CarréRouge_Click(ByVal sender As System.Object, ByVal e As „ System.EventArgs) Handles CarréRouge.Click ‘ Effacement de la fenêtre 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 CarréBleu_Click(ByVal sender As System.Object, ByVal e As „ System.EventArgs) Handles CarréBleu.Click ‘ Effacement de la fenêtre 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 après installation des sources de l’ouvrage.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
194
Visual Basic 2010
Menu contextuel Nous allons étendre les fonctionnalités de l’application précédente en lui ajoutant un menu contextuel. Ce menu contiendra deux entrées : Rouge et Bleu. En fonction de l’entrée sélectionnée sous le menu Tracer, un rond ou un carré bleu ou rouge apparaît dans la feuille. Pour mettre en place le menu contextuel, insérez un contrôle ContextMenuStrip sur la feuille de l’application. Ce contrôle est automatiquement reporté dans la partie inférieure de la fenêtre sous la forme d’une icône intitulée ContextMenuStrip1. Cliquez sur cette icône et définissez les deux entrées du menu : Rouge et Bleu. Pour faciliter la compréhension du code, renommez ces deux entrées (propriété Name) en Context Rouge et ContextBleu. Si vous exécutez l’application, vous verrez que le menu contextuel n’est pas actif lorsque vous cliquez du bouton droit de la souris. Pour le rendre opérationnel, vous devez modifier la propriété ContextMenuStrip du ou des objets sur lesquels vous voulez l’utiliser. Cliquez sur un endroit inoccupé de la feuille et affectez la valeur ContextMenuStrip1 à la propriété ContextMenuStrip. Pour compléter l’application, il ne reste plus qu’à définir les procédures événementielles associées aux deux entrées du menu contextuel. Ces procédures utilisent le même code que les procédures événementielles du système de menus. Pour éviter une redondance dans le code, vous allez définir les quatre procédures suivantes : Private Sub TracerRondRouge() ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) ‘ Effacement de la fenêtre 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() ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100)
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter des menus
195
‘ Effacement de la fenêtre 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 TracerCarréRouge() ‘ Effacement de la fenêtre 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 TracerCarréBleu() ‘ Effacement de la fenêtre 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 procédures RondRouge_Click(), RondBleu_Click(), CarréRouge_Click() et CarréBleu_Click() par des appels aux procédures qui viennent d’être définies : Private Sub RondRouge_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs) Handles RondRouge.Click
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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 CarréRouge_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs) Handles CarréRouge.Click TracerCarréRouge() End Sub Private Sub CarréBleu_Click(ByVal sender As System.Object, ByVal e As System. „ EventArgs) Handles CarréBleu.Click TracerCarréBleu() End Sub
Vous allez maintenant définir le code associé aux entrées du menu contextuel. Cliquez si nécessaire sur l’icône ContextMenu1 pour afficher le menu contextuel puis double-cliquez sur l’entrée Rouge. Complétez la procédure 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 TracerCarréRouge() End Sub
L’unique instruction de cette procédure affiche un rond rouge ou un carré rouge en fonction de l’état de la commande Tracer/Rond. Double-cliquez sur l’entrée Bleu du menu contextuel. Complétez la procédure 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 TracerCarréBleu() End Sub
Cette procédure est comparable à la précédente à ceci près qu’elle appelle TracerRondBleu() ou TracerCarréBleu() en fonction de l’entrée sélectionnée dans le menu Tracer. L’application est entièrement opérationnelle. Elle se trouve dans le dossier Menu2 après installation des sources de l’ouvrage : Public Class Form1 Dim G As Graphics
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter des menus
197
Private Sub TracerRondRouge() ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) ‘ Effacement de la fenêtre 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() ‘ Création du rectangle dans lequel est inscrit le cercle Dim rect As New Rectangle(50, 50, 100, 100) ‘ Effacement de la fenêtre 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 TracerCarréRouge() ‘ Effacement de la fenêtre 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é
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
198
Visual Basic 2010
Dim brBrush = New SolidBrush(Color.Red) G.FillRectangle(brBrush, rect) End Sub Private Sub TracerCarréBleu() ‘ Effacement de la fenêtre 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 ‘Définition de l’objet 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 6
Implémenter 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 CarréRouge_Click(ByVal sender As System.Object, ByVal e As „ System.EventArgs) Handles CarréRouge.Click TracerCarréRouge() End Sub Private Sub CarréBleu_Click(ByVal sender As System.Object, ByVal e As „ System.EventArgs) Handles CarréBleu.Click TracerCarréBleu() 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 TracerCarréRouge() 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 TracerCarréBleu() End Sub End Class
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
7 Barres d’outils et barres d’état Ce chapitre présente une application de dessin bitmap qui implémente une barre d’outils et une barre d’état. La barre d’outils donne accès à quatre fonctions qui permettent de dessiner à main levée, de tracer des segments de droites, des rectangles et des ellipses. La barre d’état indique en permanence l’outil actif (voir Figure 7.1). Figure 7.1 L’application de dessin, en mode Exécution.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
202
Visual Basic 2010
Cette application utilise : ∑ un contrôle ToolStrip pour implémenter la barre d’outils ; ∑ un contrôle StatusStrip pour implémenter la barre d’état ; ∑ un contrôle ImageList pour stocker les images qui doivent s’afficher dans la barre d’outils.
Le contrôle ImageList Avant d’implanter la barre d’outils dans l’application, vous devez créer les icônes qui doivent y être affichées et les stocker dans un contrôle ImageList. Utilisez une application graphique quelconque (Paint, Paint Shop Pro, PhotoShop, etc.) pour créer les icônes ou pour les capturer dans une autre application. Sauvegardez ces icônes au format BMP, GIF, JPG, PNG, ICO, EMF ou WMF. Créez un nouveau projet avec la commande Nouveau/Projet dans le menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. L’entrée Visual Basic/Windows étant sélectionnée dans le volet gauche, choisissez le modèle Application Windows Forms, nommez le projet OutilsEtat et validez en cliquant sur OK. Insérez un contrôle ImageList sur la feuille du projet. Ce contrôle apparaît en dessous de la feuille. Cliquez dessus puis cliquez sur la propriété Images pour faire apparaître un bouton contenant trois points de suspension. Cliquez sur ce bouton. Ajoutez les quatre images du dossier OutilsEtat à l’aide du bouton Ajouter. La boîte de dialogue Éditeur de collections Images doit maintenant se présenter comme montré à la Figure 7.2. Figure 7.2 Les quatre images ont été insérées dans la collection.
Fermez la boîte de dialogue Éditeur de collections Images en cliquant sur OK. Les icônes sont maintenant prêtes à être insérées dans la barre d’outils.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 7
Barres d’outils et barres d’état
203
Mise en place de la barre d’outils Insérez un contrôle ToolStrip dans la feuille de l’application. Ce contrôle apparaît automatiquement sous la forme d’une bande horizontale dans la partie supérieure de la feuille. Cliquez sur l’icône affichée dans la partie gauche de la barre d’outils et sélectionnez Button (voir Figure 7.3). Figure 7.3 Création d’une nouvelle icône dans la barre d’outils.
Procédez de même pour ajouter trois nouvelles icônes dans la barre d’outils. La feuille de l’application doit maintenant ressembler à la Figure 7.4. Figure 7.4 Quatre icônes ont été insérées dans la barre d’outils.
Vous allez affecter les images i1.gif à i4.gif du dossier OutilsEtat à ces quatre icônes. Cliquez sur la première icône, puis sur la propriété Image dans la fenêtre des propriétés. Un bouton contenant trois points de suspension s’affiche en face de la propriété Image. Cliquez sur ce bouton. Une boîte de dialogue intitulée Sélectionner une ressource apparaît (voir Figure 7.5).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
204
Visual Basic 2010
Figure 7.5 Cette boîte de dialogue permet d’affecter une image aux icônes de la barre d’outils.
Cliquez sur le bouton Importer dans le groupe d’options Contexte de la ressource et désignez le fichier i1.gif du dossier OutilsEtat. Validez en cliquant sur le bouton OK, puis à nouveau sur le bouton OK pour fermer la boîte de dialogue Sélectionner une ressource.
Info
Les icônes peuvent également être incluses dans un fichier de ressources attaché à l’application. Pour cela, il suffit de sélectionner l’option Fichier de ressources du projet et de désigner l’icône en cliquant sur le bouton Importer.
Recommencez la manipulation qui vient d’être décrite pour affecter les images i2.gif, i3.gif et i4.gif aux trois autres icônes de la barre d’outils. Une fois fait, la feuille de l’application doit ressembler à la Figure 7.6. Figure 7.6 Les quatre icônes de la barre d’outils ont l’apparence souhaitée.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 7
Info
Barres d’outils et barres d’état
205
L’arrière-plan des images i1.gif à i4.gif a été défini comme couleur de transparence. C’est la raison pour laquelle ces images s’intègrent parfaitement dans la couleur d’arrière-plan de la barre d’outils.
Pour terminer la définition de la barre d’outils, modifiez la propriété Text des quatre icônes : Icône
Propriété Text
1
Crayon
2
Trait
3
Rectangle
4
Ellipse
Mise en place de la barre d‘état Insérez un contrôle StatusStrip dans la feuille de l’application. Ce contrôle s’affiche automatiquement sous la forme d’une bande horizontale dans la partie inférieure de la feuille. Cliquez sur le contrôle StatusStrip dans la feuille de l’application. Une icône apparaît dans la partie gauche du contrôle. Cliquez dessus et sélectionnez StatusLabel dans le menu (voir Figure 7.7). Figure 7.7 Insertion d’un contrôle texte dans la barre d’état.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
206
Visual Basic 2010
Insérez le texte Sélectionnez un outil dans la propriété Text du contrôle ToolStrip StatusLabel1 qui vient d’être créé. Tous les contrôles ont été placés dans la feuille de l’application. Vous allez maintenant mettre en place les procédures événementielles qui donneront vie à l’application.
Écriture du code Définissez les variables qui seront utilisées dans le programme en tête 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 complétez la procédure 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 première instruction instancie l’objet Graphics G. La deuxième instruction initialise à False la variable Tracé, qui sera utilisée par la suite pour activer (True) ou désactiver (False) le tracé. Double-cliquez sur la barre d’outils et complétez la procédure 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"
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 7
Barres d’outils et barres d’état
207
ToolStripStatusLabel1.Text = "Outil Rectangle actif" OutilEnCours = 2 Case "Ellipse" ToolStripStatusLabel1.Text = "Outil Ellipse actif" OutilEnCours = 3 End Select End Sub
La propriété e.ClickedItem.Text de l’objet e renvoie la valeur Text de l’icône cliquée. En utilisant une structure Select Case portant sur cette propriété, il est donc très simple d’effectuer les tâches correspondant à l’activation de chaque outil. Ces tâches consistent en l’affichage d’un message dans la barre d’état et en la mémorisation du bouton sur lequel on a appuyé dans la variable OutilEnCours. Pour compléter le programme, vous allez maintenant définir le code correspondant aux événements souris MouseDown, MouseMove et MouseUp. Définissez la procédure 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 procédure est activée chaque fois qu’un bouton de la souris est enfoncé. Elle initialise la variable Tracé à True pour valider l’utilisation de l’outil Crayon : Tracé = True
Elle initialise également les variables AncX et AncY avec la position actuelle de la souris : AncX = e.X AncY = e.Y
Définissez la procédure 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
208
Visual Basic 2010
Cette procédure est active à chaque déplacement de la souris. Elle n’est utilisée que lorsque l’outil Crayon est actif, et uniquement si le tracé est autorisé : If (OutilEnCours = 0) And (Tracé = True) Then
Dans ce cas, une ligne droite est tracée entre le point dont les coordonnées sont mémorisées dans les variables AncX et AncY et la position courante de la souris : G.DrawLine(pen, AncX, AncY, e.X, e.Y)
Les coordonnées courantes de la souris sont alors mémorisées dans les variables AncX et AncY : AncX = e.X AncY = e.Y
Définissez enfin la procédure 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 relâchement de la souris, la variable Tracé est initialisée à False pour interdire tout tracé avec le crayon. Les opérations à effectuer si un autre outil est sélectionné sont définies à l’aide d’une instruction Select Case :
∑
Si l’outil Trait est sélectionné, un trait de couleur noire (Dim pen As New pen(Color. Black)) est tracé entre les anciennes coordonnées et les coordonnées actuelles : Case 1 G.DrawLine(pen, AncX, AncY, e.X, e.Y)
∑
Si l’outil Rectangle est sélectionné, un rectangle noir est tracé (DrawRectangle) et rempli (FillRectangle) :
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 7
Barres d’outils et barres d’état
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 l’outil Ellipse est sélectionné, une ellipse noire est tracée (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)
L’application se trouve dans le dossier OutilsEtat après installation des sources de l’ouvrage. 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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
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
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 7
Barres d’outils et barres d’état
211
Plus loin avec les contrôles ToolStrip Le contrôle ToolStrip a été introduit dans le .NET Framework 2.0. Dans la section précédente, nous l’avons utilisé pour mettre en place une barre d’outils conventionnelle. Lorsque vous avez défini les quatre icônes de la barre d’outils, vous vous êtes peut-être demandé à quoi pouvaient bien servir les différents éléments proposés dans le menu déroulant (voir Figure 7.8). Figure 7.8 Les boutons ne sont pas les seuls éléments pouvant être insérés dans un menu ToolStrip.
Vous le voyez à la Figure 7.8, les éléments de base pouvant être insérés dans un menu sont les suivants :
∑ ∑ ∑ ∑ ∑ ∑ ∑
Icône. ToolStripButton ; Texte. ToolStripLabel ; Liste déroulante. ToolStripSplitButton et ToolStripDropDownButton ; Séparateur. ToolStripSeparator ; Liste modifiable. ToolStripComboBox ; Zone de texte. ToolStripTextBox ; Barre de progression. ToolStripProgressBar.
L’implémentation de ces contrôles ne représente aucune difficulté majeure :
∑
Le texte affiché dans le contrôle Label doit être placé dans la propriété Text du contrôle ToolStripLabel.
∑
Les éléments contenus dans les contrôles ToolStripSplitButton et ToolStrip DropDownButton peuvent être insérés dans la feuille de l’application, après avoir cliqué sur le contrôle correspondant et développé sa propriété DropDownItems (voir Figure 7.9).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
212
Visual Basic 2010
Figure 7.9 Les ToolStrip(Split/ DropDown)Button peuvent contenir un ou plusieurs MenuItem, ComboBox, Separator et TextBox.
∑
Les éléments des contrôles ComboBox sont définis lors de l’édition (propriété Items) ou dans le code [procédure ToolStripCombobox1.Items.Add()].
∑
Le texte affiché dans un contrôle TextBox peut être défini lors de la conception en utilisant la propriété Text. Il peut également être saisi par l’utilisateur. La valeur entrée au clavier se trouve dans cette même propriété Text.
∑
La propriété Value d’un contrôle ProgressBar définit (et permet de connaître) la taille de la barre de progression.
∑
Pour accéder à la procédure événementielle associée à un contrôle inséré dans un Tool Strip, il suffit de double-cliquer sur ce contrôle.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
8 Manipulation d’objets graphiques Ce chapitre est dédié à la manipulation d’objets graphiques par l’intermédiaire des méthodes de l’API GDI+ (Graphical Device Interface). La première section présente les principales méthodes 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 deuxième section montre comment réaliser un économiseur d’écran. Celui-ci entrera automatiquement en action au bout d’un délai paramétrable de non-activité du clavier et de la souris. La troisième section explique comment afficher une horloge du plus bel effet. Vous apprendrez à faire bouger ses aiguilles en transformant l’heure système en coordonnées dans le plan. Enfin, la quatrième section montre comment effectuer une copie d’écran partielle ou totale. L’image récupérée apparaîtra dans un contrôle PictureBox et pourra être stockée sur le disque dur dans un fichier BMP.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
214
Visual Basic 2010
Le système d’affichage graphique GDI+ L’affichage graphique dans une feuille Visual Basic 2010 repose sur la bibliothèque de fonctions GDI+ (Graphical Device Interface +). Grâce à cette bibliothèque, la programmation graphique est indépendante de la configuration matérielle de l’ordinateur. L’élément principal de GDI+ est la classe Graphics qui fournit des méthodes permettant de tracer très simplement des primitives graphiques (points, droites, polygones, ellipses, etc.). Un objet Graphics peut représenter une image ou la surface d’un contrôle. Avant de pouvoir dessiner, vous devez définir un tel objet et l’instancier. 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 contrôle Panel : Dim g as Graphics = panel1.CreateGraphics
Cette première étape franchie, vous pouvez dessiner sur l’objet g en utilisant les méthodes du tableau ci-après. Méthode
Effet
DrawArc
Trace un arc d’ellipse.
DrawCurve
Trace une courbe qui passe par les points spécifiés en argument.
DrawEllipse
Trace une ellipse.
DrawIcon
Affiche une icône.
DrawImage
Affiche une image.
DrawLine
Trace un trait.
DrawPie
Trace un camembert.
DrawPolygon
Trace un polygone.
DrawRectangle
Trace un rectangle.
DrawString
Affiche un texte.
Certaines de ces méthodes nécessitent la création d’objets annexes, tels que le point, le rectangle, la couleur, le stylet, la brosse, la couleur et/ou la police. Voyons comment définir et instancier ces objets.
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 8
Manipulation d’objets graphiques
215
Point Pour définir un point, il suffit d’invoquer l’une des procédures Point() ou PointF() en spécifiant ses coordonnées : Dim p As New Point(X, Y)
où X et Y sont des valeurs entières qui représentent l’abscisse et l’ordonnée du point ; Dim p As New PointF(X, Y)
où X et Y sont des valeurs Single qui représentent l’abscisse et l’ordonnée du point.
Rectangle Pour définir un rectangle, il suffit d’invoquer l’une des procédures Rectangle() ou RectangleF() en indiquant les coordonnées de deux de ses côtés opposés : Dim r as New Rectangle(X1, Y1, X2, Y2)
où X1 et Y1 sont des valeurs entières qui représentent l’abscisse et l’ordonnée d’un des angles du rectangle, et X2 et Y2 des valeurs entières qui représentent l’abscisse et l’ordonnée de l’angle opposé ; Dim r as New RectangleF(X1, Y1, X2, Y2)
où X1 et Y1 sont des valeurs Single qui représentent l’abscisse et l’ordonnée d’un des angles du rectangle, et X2 et Y2 des valeurs Single qui représentent l’abscisse et l’ordonnée de l’angle opposé.
Couleur La couleur d’un objet peut être choisie parmi un grand nombre de couleurs prédéfinies : 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 accéder à l’une de ces couleurs, il suffit d’utiliser la fonction Intellisense de Visual Studio (voir Figure 8.1).
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
216
Visual Basic 2010
Figure 8.1 Il est très simple d’accéder aux couleurs prédéfinies.
Stylet Le stylet est utilisé pour dessiner des lignes, des arcs, des rectangles et des secteurs. Vous le définirez 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 l’épaisseur du trait, en pixels ; brosse est la brosse à utiliser.
Pour visualiser toutes les couleurs prédéfinies, nous allons créer une petite application. Lancez la commande Nouveau/Projet du menu Fichier. Choisissez .NET Framework 4 dans la liste déroulante Framework. Sélectionnez Visual Basic/Windows dans le volet gauche et Application Windows Forms dans le volet central. Donnez le nom CouleursPredefinies à l’application et validez en cliquant sur OK. Modifiez les propriétés de l’objet Form1 comme indiqué dans le tableau ci-après. Propriété
Valeur
FormBorderStyle
FixedDialog
Text
Liste alphabétique des couleurs prédéfinies de l’objet Color
BackColor
Window
Size.Width
640
Size.Height
480
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue
Chapitre 8
Manipulation d’objets graphiques
217
Lancez la commande Concepteur du menu Affichage. Cliquez sur l’icône Événements dans la fenêtre des Propriétés et double-cliquez sur l’événement Paint. Complétez la procédure Form1_Paint() comme suit : Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows. „ Forms.PaintEventArgs) Handles MyBase.Paint ‘Définition du Type Color Dim colorType As Type = System.Drawing.Color.AliceBlue.GetType ‘Obtention des propriétés 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 d’un 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) ‘Incrémentation 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 définir un objet représentant le type Color, il suffit d’interroger la fonction GetType sur un membre quelconque du type Color, par exemple AliceBlue : Dim colorType As Type = System.Drawing.Color.AliceBlue.GetType
L’objet colorType va nous permettre d’obtenir la liste des membres du type Color en interrogeant la fonction GetProperties : Dim Couleurs() As System.Reflection.PropertyInfo = colorType.GetProperties
customer 27921 at Fri Mar 11 19:22:06 +0100 2011
Propriété de Albiri Sigue