Developpez.com - Microsoft DotNET
X

Choisissez d'abord la catégorieensuite la rubrique :


Cours VB.NET

Par Philippe Lasserre
 


            

I. Démarrer le cours
I-A. Introduction , page de présentation , principe du site.
II. Introduction: débutez ici
II-A. Qu'allons nous étudier?
II-B. Quel plan de cours suivrons nous?
II-C. Quels logiciels utiliser?
II-D. Quelle configuration est nécessaire?
III. Principe et structure des programmes.
III-A. Les 'Objets
III-A-1. A - Dans la vie courante:
III-A-1-a. Propriétés (Attributs):
III-A-1-b. Méthodes :
III-A-1-c. Evènement:
III-A-1-d. Interface et implémentation:
III-A-1-e. Relation entre Objet:
III-A-2. B- Et dans Visual Basic.net:
III-A-2-a. Tout objet a des propriétés.
III-A-2-b. Les objets ont des méthodes parfois.
III-A-2-c. Interface et implémentation:
III-A-2-d. Relation :
III-A-3. En résumé :
III-A-4. Lexique anglais=>Français:
III-B. Programmation évènementielle: le premier programme.
III-B-1. Principes de la programmation VB
III-B-2. Exemple :le premier programme:
III-B-3. En pratique, que fait le programmeur:
III-B-3-a. A- Il dessine l'interface utilisateur
III-B-3-b. B- Il va écrire le code correspondant aux événements :
III-B-4. En résumé :
III-B-5. Lexique anglais=>Français:
III-C. Les instructions, les procédures . Les 'Sub' , les 'Function'
III-C-1. Les instructions:
III-C-2. Les procédures:
III-C-3. Procédures liées aux événements.
III-C-4. Procédures non liées:
III-C-5. Procédures Sub :
III-C-6. Procédures 'Function' :
III-C-7. Module standard :
III-C-8. Private Public :
III-C-9. Remarques :
III-C-10. Lexique anglais=>Français:
III-D. Les modules
III-D-1. Qu'est ce qu'un module?
III-D-2. Comment créer un module standard:
III-D-3. Lexique anglais=>Français:
III-E. Notion de programmation 'fonctionnelle' et de programmation 'objet'
IV. Environnement de développement: les IDE.
IV-A. IDE Visual Studio 2003 ( Microsoft )
IV-A-1. Fenêtre Projet.
IV-A-2. Dans un nouveau projet, créer une fenêtre :
IV-A-3. Voir les procédures:
IV-A-4. Ajouter des contrôles à la feuille
IV-A-5. Modifier les propriétés d'un contrôle ou du formulaire.
IV-A-6. Voir tous les composants d'un projet:
IV-A-7. Tester son logiciel:
IV-A-8. Projet et solutions.
IV-A-9. Fichiers, Chemins des sources.
IV-A-10. VB propose des AIDES.
IV-A-11. Il existe une abondante documentation:
IV-A-12. Erreur.
IV-A-13. Mode déboguage (mode BREAK):
IV-B. IDE Visual Studio 2005 ( Microsoft )
IV-B-1. Fenêtre Projet.
IV-B-2. Dans un nouveau projet, créer ou ajouter une fenêtre :
IV-B-3. Voir les procédures:
IV-B-4. Ajouter des contrôles à la feuille
IV-B-5. Modifier les propriétés d'un contrôle ou du formulaire.
IV-B-6. Voir tous les composants d'un projet:
IV-B-7. Tester son logiciel:
IV-B-8. Projet et solutions.
IV-B-9. Fichiers, Chemins des sources.
IV-B-10. VB propose des AIDES.
IV-B-11. Il existe une abondante documentation:
IV-B-12. Erreur.
IV-B-13. Mode débogage (mode BREAK):
IV-B-14. Projet Designer:
IV-B-15. Conclusion:
IV-C. VB.NET 2005 Nouveautés 2005
IV-C-1. Le matériel:
IV-C-2. L'IDE
IV-C-2-a. On peut créer des fenêtres toutes faites, avec les contrôles..:
IV-C-2-b. Edit and Continue:
IV-C-2-c. Il y a des exemples de code.
IV-C-2-d. Il est proposé des solutions pour corriger les erreurs de code:
IV-C-2-e. Le Projet Designer:
IV-C-2-e-i. a- Exemple de ressource.
IV-C-2-e-ii. b- Exemple de paramètre.
IV-C-2-f. Pour l'utiliser dans le programme, on fera:
IV-C-2-g. Le déplacement des contrôles ou l'accès aux principales tâches est amélioré:
IV-C-2-h. Renommer un nom: modification automatique.
IV-C-2-i. Commentaire en Xml
IV-C-3. Les nouveaux Objets
IV-C-4. Les instances de Forms:
IV-C-5. Les nouveaux Contrôles
IV-C-5-a. DataGridView
IV-C-5-b. MaskedTextBox
IV-C-5-c. SoundPlayer
IV-C-5-d. SplitContainer:
IV-C-5-e. ListView
IV-C-5-f. WebBrowser:
IV-C-5-g. LayoutPanel:
IV-C-5-h. MenuStrip :
IV-C-5-i. ToolStrip:
IV-C-5-j. StatuStrip:
IV-C-5-k. ProgesBarr:
IV-C-6. Les nouvelles 'Variables'.
IV-C-7. Les nouvelles 'Collections'.
IV-C-8. Dans le Code: les nouvelles instructions
IV-C-9. Les nouveautés dans les Classes:
IV-D. IDE SharpDevelop (alternative gratuite) MAJ version 2.1)
IV-D-1. Où le trouver? Comment l'installer?.
IV-D-1-a. Quelques liens
IV-D-2. Fenêtre Projet.
IV-D-3. Dans un nouveau projet, créer une fenêtre :
IV-D-4. Ajouter des contrôles au formulaire.
IV-D-5. Modifier les propriétés d'un contrôle ou du formulaire.
IV-D-6. Voir les procédures:
IV-D-7. Voir tous les composants d'un projet:
IV-D-8. Remarque relative aux fenêtres de l'IDE:
IV-D-9. Tester son logiciel:
IV-D-10. Fichiers, Chemins des sources.
IV-D-11. Propriétés du projet.
IV-D-12. #Develop propose des AIDES.
IV-D-13. Erreur de compilation :
IV-D-14. Erreur d'exécution: Exceptions
IV-D-15. Débogage :
IV-D-16. Conclusion:
IV-D-17. J'ai besoin d'aide:
V. Langage Visual Basic
V-A. Introduction
V-A-1. Les Classes du FrameWork
V-A-2. Les instructions de Microsoft.VisualBasic
V-A-2-a. Saisir, Afficher.
V-B. Les 'Algorithmes'.
V-B-1. A- Pour écrire un programme.
V-B-2. B- Définition de l'algorithme.
V-B-3. C- Principe généraux
V-B-3-a. Séquences
V-B-3-b. Les variables, leur 'Type':
V-B-3-c. Affectation ( ou Assignation):
V-B-3-d. Booléens
V-B-3-e. Les choix: Si..Alors
V-B-3-f. Les choix: Décider entre :
V-B-3-g. Les répétitions: Pour...Répéter
V-B-3-h. Les répétitions: Tant que :
V-B-3-i. Structuration: 'Sous-programme' ou 'procédure':
V-B-3-j. Tableaux
V-B-3-k. Notion de 'Collection':
V-B-3-l. Erreur d'exécution: Notion de 'Sécurisation' du code:
V-B-3-m. Flag et variables d'état.
V-B-4. D -Quelques algorithmes.
V-B-4-a. Recherche dans un tableau
V-B-4-b. Tri de tableau
V-B-5. Lexique anglais=>Français:
V-C. L'affectation.
V-C-1. Permutation de variables:
V-D. Les variables.
V-D-1. Les variables.
V-D-1-a. Nom des variables :
V-D-1-b. Déclaration, initialisation:
V-D-1-c. En pratique: Exemple.
V-D-1-d. Les différents types de variable:
V-D-1-e. Détaillons :
V-D-1-f. Variable entière:
V-D-1-g. Variable avec virgule:
V-D-1-h. String, Char:
V-D-1-i. Annexe 1:Place occupée en mémoire:
V-D-1-j. Annexe 2: Type primitif
V-D-1-k. Annexe 3: Choix des noms de variable
V-D-2. Variables 'String' et 'Char'
V-D-2-a. A- STRING
V-D-2-a-i. 1- System.String est une Classe du Framework:
V-D-2-a-ii. 2- On peut aussi utiliser les instructions 'Visual Basic':
V-D-2-a-iii. 3- Un exemple:
V-D-2-a-iv. 4- Comparaison de caractères et 'Option Compare'
V-D-2-a-v. 5- Unicode:
V-D-2-b. B- CHAR.
V-D-2-b-i. Et les Chaînes de longueur fixe:
V-D-3. Variables Numériques
V-D-3-a. La Classe MATH du Framework est disponible:
V-D-3-b. Il existe aussi les instructions du langage VisualBasic comme:
V-D-3-c. Dépassement de capacité, 'Non Nombre'.
V-D-4. Conversion, séparateur décimal
V-D-4-a. Conversion numérique=>String
V-D-4-b. Conversion String=>numérique
V-D-4-c. CType pour toutes les conversions
V-D-4-d. Fonctions spécifiques
V-D-4-e. Val et Str (de MicroSoft.VisualBasic) existe aussi:
V-D-4-f. La Classe System.Convert:
V-D-4-g. Pour résumer et faire très simple, retenir ++++:
V-D-4-h. Conversion Explicite et Implicite.
V-D-4-i. Conversion restrictive.
V-D-4-j. Séparateur décimal: le point ou la virgule?
V-D-4-k. IsNumeric
V-D-4-l. Lexique anglais=>Français:
V-D-5. Les 'Tableaux'
V-D-5-a. Un tableau est un objet !!
V-D-5-b. La Classe Array.
V-D-5-c. Exemple:
V-D-6. Les 'Collections'
V-D-6-a. Exemple simpliste permettant de comprendre la notion de collection:
V-D-6-b. L'objet 'Collection' c'est du VisualBasic:
V-D-6-c. Liste d'objets: ArrayList : c'est une Classe .Net.
V-D-6-d. StringCollection: c'est une Classe .Net
V-D-6-e. HashTable c'est une Classe .Net
V-D-6-f. SortedList: c'est une Classe .Net
V-D-6-g. Queue: c'est une Classe .Net
V-D-6-h. Stack: c'est une Classe .Net
V-D-6-i. BitArray: c'est une Classe .Net
V-D-6-j. En VB 2005 :il y a les Collections 'generic' ou 'Specialized'
V-D-6-k. Généralisation de la notion de collection.
V-D-6-l. Pourquoi le premier élément est 0 ou 1?
V-D-6-m. Exemples sur les collections:
V-D-6-n. Lexique anglais=>Français:
V-D-7. Les 'Structures'
V-D-7-a. Attention quand dans une structure il y a un tableau, il faut l'initialiser:
V-D-7-b. Allons plus loin:
V-D-7-b-i. Les structures sont des types 'valeur'.
V-D-7-b-ii. Les structures peuvent contenir plein de choses:
V-D-7-b-iii. Portée:
V-D-8. Attention type valeur ou référence
V-D-8-a. La variable 'par Valeur':
V-D-8-b. La variable 'par Référence':
V-D-8-c. Influence sur l''Affectation':
V-D-8-d. On se méfiera donc du type 'référence ' ou 'Valeur' des données que l'on utilise: exemple des Tableaux
V-D-8-e. Le cas particulier des 'String' qui sont 'Par référence':
V-D-8-f. Déclaration avec New ?
V-D-8-g. Valeur après déclaration:
V-D-8-h. Comparaison:
V-D-8-i. Il existe une instruction permettant de voir si une variable est de type 'Par référence'
V-D-9. Variable 'Object' et autre
V-D-9-a. Le Type 'Object':
V-D-9-a-i. Comparaison d'objet.
V-D-9-a-ii. Nothing.
V-D-9-b. Les variables d'autres types:
V-D-9-c. Utilisez donc des variables le plus typées possible.
V-D-9-d. Attention quand on met un objet dans un autre objet:
V-D-10. Variable Booléenne
V-D-10-a. Introduction:
V-D-10-b. Les booléens:
V-D-10-c. Les conditions:
V-D-10-d. Les opérateurs logiques:
V-E. Soyons strict et explicite.
V-E-1. Notion de conversion Explicite et Implicite:
V-E-2. Option Strict
V-E-2-a. 1-Avec Option Strict=On VB refuse les conversions implicites qui pourraient entraîner des pertes de données.
V-E-2-b. 2-Avec Option Strict=On VB refuse les conversions String<->numériques implicites.
V-E-2-c. 3-Avec Option Strict=On VB refuse les 'Liaisons tardives':
V-E-2-d. 4-Avec Option Strict=On VB est plus rapide
V-E-3. Option explicit
V-E-4. Option strict et Explicit dans un module:
V-F. Les constantes, les énumérations.
V-F-1. Constantes:
V-F-1-a. Intérêt des constantes ?
V-F-1-b. Constantes prédéfinies dans le langage:
V-F-1-c. True False:
V-F-2. Enumération:
V-F-3. Généralisation de la notion d'énumération:
V-F-3-a. ControlChars:
V-F-3-b. Couleurs:
V-F-3-c. Math:
V-F-3-d. Touche du clavier dans le Framework:
V-F-3-e. Autre Enumération, un exemple:
V-G. Les opérateurs.
V-G-1. Addition :+
V-G-2. Soustraction : -
V-G-3. Multiplication :*
V-G-4. Division : /
V-G-5. Division entière:\
V-G-6. Puissance : ^
V-G-7. Modulo :
V-G-8. Concaténation : &
V-G-9. Priorités :
V-G-10. Comparaison :
V-G-11. Logique : Not And Or ElseOr Xor
V-G-12. Déplacement de bits: << et >>
V-G-13. Remarque 1: Allons plus loin avec / \ :
V-G-14. Remarque 2: Division par zéro:
V-H. Les structures de contrôle: Choix et boucles
V-H-1. If Then
V-H-2. Select Case
V-H-3. For Next
V-H-4. Do Loop
V-H-5. While End While
V-H-6. For Each
V-H-7. Switch
V-H-8. IIF
V-I. Les procédures et leurs paramètres.
V-I-1. Les parenthèses.
V-I-2. Par Valeur, Par Référence.
V-I-3. Par Défaut que se passe t-il?.
V-I-4. Optional
V-I-5. Tableau de paramètres.
V-I-6. ParamArray
V-J. Portée des variables.
V-J-1. Dans les procédures.
V-J-2. Dans un bloc d'instruction.
V-J-3. Dans la section déclaration d'un Module.
V-J-4. Dans la section déclaration d'une fenêtre, d'un formulaire.
V-J-5. En pratique:
V-K. Les nombres aléatoires
V-K-1. A- Avec les instructions Rnd() et Randomize() de Visual Basic.Net
V-K-1-a. Simuler un jeu de lancé de dé.
V-K-2. B- Avec la classe Random du Framework
V-K-3. C- En cryptographie avec le Framework
V-K-4. D - Un peu de théorie (creusons).
V-L. La 'Récursivité'
V-L-1. Exemple 1: calcul de 'Factorielle'.
V-L-2. Exemple 2: calcul d'une expression avec parenthèses multiples:
V-L-3. Exemple 3: PGCD
V-L-4. Exemple 4: Tri récursif:
V-L-5. Exemple 5: Parcours de répertoires et sous répertoires:
V-L-6. Exemple 6: Evaluation d'un nombre écrit en chiffre romain:
V-L-7. Exemple 7: Suite de Fibonacci
V-L-8. Autres exemples:
V-L-9. On en déduit les règles fondamentales d'une fonction récursive:
V-M. Faut-il oublier le GoTo
V-M-1. Goto.
V-M-2. Pourquoi éviter le 'GoTo'.
V-M-3. Quant utiliser le 'GoTo'.
V-N. Annexes:
V-N-1. Le codage de caractère ASCII ANSI UNICODE et UTF
V-N-1-1. Codage sur 7 bits: Ascii:
V-N-1-2. Codage sur 8 bits:
V-N-1-3. Codage sur 16 bits: Unicode:
V-N-1-4. Représentation graphique des caractères: Glyphe, Font, Police:
V-N-1-5. Sur le Web:
V-N-1-6. En VB:
V-N-2. Nom des objets visuels (recommandation microsoft)
V-N-3. Couleur disponible dans VB
V-N-4. Format de fichier texte: le Rtf
VI. Classes
VI-A. Espace de noms, Classes, Objet
VI-A-1. Classes.
VI-A-1-a. Essayons de comprendre:
VI-A-1-b. A - Détails en VB 2003:
VI-A-1-b-i. - Les Références:
VI-A-1-b-ii. - Importation d'espace de noms:
VI-A-1-c. B - Détails en VB 2005:
VI-A-1-c-i. - Les Références:
VI-A-1-c-ii. - Importation d'espace de noms:
VI-A-1-d. Portée de l'espace de noms:
VI-A-1-e. Propriété ambiguë:
VI-A-1-f. Alias:
VI-A-1-g. Héritage:
VI-A-1-h. Membres d'instance et membres partagés.
VI-A-1-i. Classes statiques ou non
VI-A-2. Les différentes Classes, le Framework. MAJ
VI-A-2-a. Les différentes 'Classes'.
VI-A-2-a-i. 1- Les Classes spécifiques.
VI-A-2-a-ii. 2- Les classes prédéfinies du Framework fournies par Microsoft.
VI-A-2-a-iii. 2-Les classes fournies par des tiers.
VI-A-2-b. Dans Visual Basic.Net.
VI-A-2-c. Lors de la création d'un nouveau projet:
VI-A-2-d. Framework 1, 2, 3.
VI-A-2-e. ANNEXE 1: Les principales Classes du Framework 1.
VI-A-2-f. ANNEXE 2: Visual Basic .NET.
VI-A-2-g. ANNEXE 3: Fonctions VB6 de VisualBasic.Compatibility
VI-A-3. Procédures évènement, surcharge de méthode.
VI-A-3-a. Évènement et procédure évènement:
VI-A-3-b. Surcharge de Méthode:
VI-A-4. L'écriture 'Compact'
VI-A-4-a. Comment 'compacter'?
VI-A-5. Notion de flux ou 'Stream'
VI-A-5-a. Utiliser les "Stream".
VI-A-6. Exemple de petites routines de code.
VI-A-6-a. Petites routines sur les chaînes de caractères
VI-A-6-a-i. Une string 'Nom' contient un nom , mettre si nécessaire la première lettre en majuscule.
VI-A-6-a-ii. Comment voir si un caractère est une voyelle:
VI-A-6-a-iii. Comment éliminer une combinaison bien précise de caractères en début de chaîne:
VI-A-6-a-iv. Vous avez une chaîne de caractères, comment afficher, le premier caractère puis les 2 premiers, puis 3..?
VI-A-6-a-v. Vous avez deux chaînes de caractères, comment savoir si la second est un anagramme de la première?
VI-A-6-a-vi. Compter combien de fois un mot apparaît dans un texte?
VI-A-6-b. Petits programmes mathématiques
VI-A-6-b-i. Calcul de l'hypoténuse d'un triangle rectangle.
VI-A-6-b-ii. Somme de N entiers.
VI-A-6-b-iii. Afficher les tables de multiplication.
VI-A-6-b-iv. Trouver la valeur la plus élevée d'un tableau d'entier:
VI-A-6-b-v. Factorielle.
VI-A-6-b-vi. Factorielle avec 'Récursivité':
VI-A-6-b-vii. Un nombre est-il premier?
VI-A-6-b-viii. Decomposition en nombre premier?
VI-A-6-b-ix. Diviseurs d'un nombre?
VI-A-6-c. Travail sur les tableaux et collections - (Tri, recherche, insertion effacement d'éléments)
VI-A-6-c-i. Utiliser les TABLEAUX
VI-A-6-c-i-a-. A- Trier un tableau.
VI-A-6-c-i-b-. B- Rechercher un élément dans un tableau.
VI-A-6-c-i-c-. C- Effacer, insérer un élément dans un tableau.
VI-A-6-c-ii. Utiliser les COLLECTIONS
VI-A-6-c-ii--. A- Trier une collection.
VI-A-6-c-ii-b-. B- Rechercher un élément dans une collection.
VI-A-6-c-ii-c-. C- Effacer, insérer un élément dans une collection.
VI-A-6-c-iii. Différences tableau collection.
VI-A-6-c-iv. Utilisation particulière des tableaux.
VI-A-6-d. Calculs financiers simples
VI-A-6-d-i. Conversion Francs=>Euros.
VI-A-6-d-ii. Coût d'augmentation de la vie.
VI-A-6-d-iii. Remboursement d'un prêt.
VII. Interface utilisateur.
VII-A. La console
VII-A-1. A- Faire une application purement 'Console':
VII-A-2. B- Faire une application 'WinForm': Créer des fenêtres
VII-A-3. Entrée au clavier:
VII-A-4. Affichage sur la console:
VII-A-5. Exemple en 'Sortie console':
VII-A-6. En résumé:
VII-B. Interface utilisateur et 'control'.
VII-B-1. En pratique comment créer l'interface utilisateur ?
VII-B-2. La Classe 'Control':
VII-B-3. Évènements liés aux objets avec représentation visuelle
VII-B-4. En résumé:
VII-C. Les fenêtres ou 'Formulaires'.
VII-C-1. Créer une fenêtre en mode conception:
VII-C-2. Propriétés:
VII-C-3. Ouvrir un formulaire
VII-C-4. Fermer un formulaire
VII-C-5. Propriétés:
VII-C-6. Evènements:
VII-C-7. Méthodes:
VII-C-8. System.Windows.Forms.Form
VII-C-9. Formulaire d'avant plan:
VII-D. Les 'Boutons'.
VII-D-1. Créer un bouton :
VII-D-2. Modifier ses propriétés:
VII-D-3. Utiliser les évènements:
VII-D-4. Créer un bouton Ok ou Cancel:
VII-D-5. Couleur transparent dans les images des boutons:
VII-D-6. Utilisation avancée: Créer de magnifique bouton en VB2005:
VII-D-7. Utilisation avancée: Création d'un bouton par code:
VII-E. Les 'TextBox'
VII-E-1. Les contrôles TextBox.
VII-E-2. Le contrôle RichTextBox :
VII-E-3. Le contrôle MaskedTextBox (VB Framework 2):
VII-F. Les 'Labels'
VII-F-1. Les labels.
VII-F-2. Les LinkLabel
VII-G. Les cases à cocher.
VII-H. Les 'Listes'.
VII-H-1. Les 'ListBox'
VII-H-1-a. Pour ajouter ou supprimer des éléments dans un contrôle ListBox:
VII-H-1-b. Vider la ListBox:
VII-H-1-c. Ajouter l'élément "poisson"
VII-H-1-d. Charger dans une ListBox1 les nombres de 1 à 100 :
VII-H-1-e. Comment enlever des éléments?
VII-H-1-f. Comment lire l'élément 3?
VII-H-1-g. Comment rechercher l'élément qui contient une chaîne de caractères?
VII-H-1-h. Comment sélectionner un élément par code?
VII-H-1-i. L'utilisateur double-clique sur un des éléments, comment récupérer son numéro ?
VII-H-1-j. Et la multi sélection, quels éléments ont été sélectionnés?
VII-H-1-k. On peut 'charger' une ListBox automatiquement avec un tableau en utilisant Datasource:
VII-H-1-l. Comment 'charger' une ListBox automatiquement à partir d'un fichier texte.
VII-H-1-m. Comment connaître l'index de l'élément que l'on vient d'ajouter? (et le sélectionner)
VII-H-1-n. Comment affecter à chaque élément de la liste un numéro, une clé?
VII-H-1-o. Comment à partir des coordonnées de la souris connaître l'élément de la liste qui est survolé?
VII-H-2. Les CheckedListBox
VII-H-3. Les ComboBox
VII-H-4. Le Contrôle ListView :
VII-H-4-a. A- Liste avec sous éléments.
VII-H-4-b. B- Liste d'icônes.
VII-H-5. Le Contrôle DomainUpDown :
VII-H-6. Le Contrôle TreeView :
VII-H-7. Annexe: Afficher des images dans un ListView
VII-I. Boites toutes faites (MessageBox..).
VII-I-1. MessageBox du Framework 2 (VB 2005):
VII-I-2. MsgBox du Visual Basic
VII-I-3. InputBox
VII-I-4. OpenFileDialog
VII-I-5. SaveFileDialog
VII-J. Regroupement de contrôles 'Groupe de contrôles'.
VII-J-1. GroupBox et Panel
VII-J-2. PictureBox
VII-J-3. TabControl
VII-J-4. SplitContainer:
VII-J-5. LayoutPanel
VII-J-6. Comment se passer des groupes de contrôles de VB6 qui n'existent plus en VB.Net?
VII-J-7. 1 - Evènement commun.(Comment pallier à la disparition des groupes de contrôles?)
VII-J-8. 2 - Comment travaillez sur plusieurs contrôles.(Comment pallier à la disparition des groupes de contrôles?)
VII-K. Dimensions, position des contrôles.
VII-K-1. Unité de mesure :
VII-K-2. Position initiale dans l'écran d'un formulaire:
VII-K-3. Taille et position d'un formulaire ou d'un contrôle:
VII-K-4. Pour le re-dimensionnement de fenêtre par l'utilisateur:
VII-K-5. Déplacement.
VII-K-6. Coordonnées souris:
VII-K-7. Anchor :
VII-K-8. Dock
VII-K-9. Spliter
VII-L. Main Menu, ContextMenu
VII-L-1. MainMenu en Vb 2003
VII-L-2. Menu Contextuel Vb 2003
VII-L-3. MenuStrip de Vb 2005:
VII-L-4. ContextMenuStrip de Vb 2005:
VII-M. Avoir le Focus
VII-M-1. Comment donner le focus à une fenêtre ?
VII-M-2. Comment donner le focus à un contrôle ?
VII-M-3. Cascade d'évènement quand on prend ou on perd le focus:
VII-M-4. Usage du clavier pour passer d'un contrôle à l'autre. la touche 'TAB'
VII-M-5. Raccourcis clavier.
VII-N. Barre de bouton , barre de status. MAJ 2005
VII-N-1. La barre de bouton: ToolBar en VB 2003
VII-N-2. Contrôle StatusBar en VB 2003.
VII-N-3. ToolStrip en VB 2005:
VII-N-4. StatuStrip en VB 2005:
VII-O. Les images
VII-O-1. Le contrôle 'PictureBox':
VII-O-2. La propriété 'Image' des contrôles:
VII-O-3. Le contrôle ImageList:
VII-P. Couleurs et Font
VII-P-1. Les couleurs:
VII-P-1-a. A- Généralités:
VII-P-1-b. B- Constantes:
VII-P-1-c. C- Rouge,vert, bleu
VII-P-1-d. D-Couleurs 'system'
VII-P-1-e. E- Couleur dans les objets:
VII-P-1-f. F- Choix d'une couleur par l'utilisateur.
VII-P-2. Police de caractères (ou Font)
VII-Q. Grille ou Grid
VII-Q-1. A - Contrôle 'MsFlexGrid' de VB6
VII-Q-2. B - Contrôles Freeware à télécharger, c'est du '.Net':
VII-Q-2-a. 'lameGrid'en français +++++
VII-Q-2-b. Autre:
VII-Q-3. C - Contrôle 'DataGrid ' de VB 2003
VII-Q-3-a. Aspect du contrôle 'DataGrid'
VII-Q-3-b. Comment améliorer la rapidité de l'affichage:
VII-Q-4. D - Contrôle 'DataGridView ' de VB 2005
VII-Q-5. Annexe: code permettant de simuler la saisie dans un MsFlexGrid:
VII-R. ProgressBar
VII-R-1. ProgressBar de VB 2003
VII-R-2. ProgressBar de VB 2005
VIII. Programmation fonctionnelle (procédurale).
VIII-A. La programmation fonctionnelle.
VIII-A-1. Comment créer un module standard? une Sub?
VIII-A-2. Exemple d'utilisation de procédures et de modules:
VIII-B. Programmation fonctionnelle: l'IMC.
VIII-B-1. Qu'est ce que l'IMC?
VIII-B-2. Quel est le cahier des charges du programme?
VIII-B-3. Création de l'interface
VIII-B-4. Structuration:
VIII-C. Ordre des instructions dans un module: résumé.
VIII-C-1. Contenu des modules.
VIII-C-2. Composant visuel et Classe.
VIIII-E. Exemple de petits programmes.
VIII-F-1. Conversion F/€ (Une fenêtre)
VIII-F-2. Calcul mensualités d'un prêt.(les fonctions financières de VB)
IX. Faire un vrai programme: il faut savoir:
IX-A. Démarrer, arrêter un programme. - Sub Main(), fenêtre Splash.
IX-A-1. Démarrer par un formulaire.
IX-A-2. Démarrer par Sub Main()
IX-A-3. Autre méthode de récupération de la ligne de commande en VB 2005:
IX-A-4. Fenêtre Splash
IX-A-5. Comment arrêter le programme?
IX-A-6. Fin de programme :Attention!
IX-B. Ouvrir plusieurs formulaires
IX-B-1. Créer un formulaire en VB 2003:
IX-B-2. Créer un formulaire en VB 2005:
IX-B-3. Formulaire modale ou non modale:
IX-B-4. Dénomination des formulaires après leur création:
IX-B-5. Autres remarques sur les formulaires:
IX-B-5-a. Un formulaire est un objet:On peut ajouter à un formulaire des méthodes et des membres:
IX-B-5-b. Exemple plus complet: Afficher un formulaire.
IX-B-5-c. Récupération d'information par DialogResult.
IX-B-5-d. Bouton par défaut.
IX-C. bis Faire communiquer les formulaires.
IX-C-1. A- Comment à partir du premier formulaire consulter un objet du second formulaire?
IX-C-1-a. 1-En VB 2003 (en VB 2005) si on instancie le formulaire
IX-C-1-b. 1-Première solution:
IX-C-1-c. 2 - Seconde solution.
IX-C-1-d. 3 -Troisième solution:
IX-C-1-e. 4 -Quatrième solution:
IX-C-1-e-i. 2-En VB 2005, sans instanciation de formulaire:
IX-C-2. B- Comment à partir du formulaire 'secondaire' connaître le formulaire 'propriétaire'?
IX-C-3. C- Les formulaires ouverts en VB 2005
IX-D. Traiter les erreurs.
IX-D-1. Les erreurs de syntaxe:
IX-D-2. Les erreurs d'exécution:
IX-D-3. Les erreurs de logique:
IX-D-4. Les Tests:
IX-E. Créer une fenêtre 'multi document'.
IX-E-1. Comprendre les programmes MDI :
IX-E-2. A - En VB 2003
IX-E-2-a. Création de la fenêtre conteneur parent :
IX-E-2-b. Création des fenêtres filles :
IX-E-2-c. Comment connaître la fenêtre fille active?
IX-E-2-d. Comment avoir accès aux objets de la fenêtre fille à partir du conteneur?
IX-E-2-e. Comment parcourir toutes les fenêtres filles?
IX-E-2-f. Comment fermer toutes le fenêtres filles?
IX-E-2-g. Comment avoir accès aux objets du conteneur à partir de la fenêtre fille?
IX-E-2-h. Comment une routine du module conteneur appelle une routine dans la fenêtre fille active?
IX-E-2-i. Agencement des fenêtres filles :
IX-E-3. A - En VB 2005
IX-F. Travailler sur les dates, les heures, sur le temps.
IX-F-1. Définir une date, une heure
IX-F-2. Afficher une date, une heure.
IX-F-3. Variable "temps"
IX-F-4. Add, Substrat
IX-F-5. AddDay, AddMouths, AddHours, AddSeconds, AddMiliseconds
IX-F-6. Year, Mouth, Day, Hour, Minute, Seconde, Millisecond
IX-F-7. DayOfWeek
IX-F-8. Now, ToDay, TimeOfDay
IX-F-9. Ticks
IX-F-10. Année bissextile?
IX-F-11. Comparaison de DateTime
IX-F-12. Calcul de la différence entre 2 dates
IX-F-13. Comment saisir rapidement une date dans un programme?
IX-F-14. Les Timers.
IX-F-15. Perdre du temps:
IX-F-16. Chronométrer:
IX-G. Lire et écrire dans les fichiers (séquentiels ou aléatoires)
IX-G-1. Généralités et rappels:
IX-G-2. A- Classe FileInfo et File, Stream.
IX-G-3. Classe My.Computer.FileSystem en VS 2005.
IX-G-3-a. Utiliser les "Stream".
IX-G-4. B- Utiliser "FileOpen".
IX-G-4-a. Fichier à accès aléatoire:
IX-G-4-b. Fichier binaire:
IX-G-5. C-Utilisation du Contrôle RichTextBox.
IX-G-6. Lire ou écrire des octets ou du XML:
IX-H. Travailler sur les répertoires
IX-H-1. Classe DirectoryInfo et la Classe Directory du Framework:
IX-H-2. Classe Path
IX-H-3. Classe DriveInfo
IX-H-4. Classe Environment
IX-H-5. Classe My.Computer.FileSystem en VS 2005.
IX-H-6. On peut aussi utiliser les anciennes méthodes de l'espace Visual Basic:
IX-H-7. Comment créer une boite de dialogue 'Choix de répertoire' en VB2005?
IX-I. Afficher correctement du texte
IX-I-1. A - Remarque sur la mise à jour de l'affichage:
IX-I-2. B - Afficher du text:
IX-I-2-a. ToString
IX-I-2-b. Str() de Microsoft.VisualBasic est toujours accepté
IX-I-2-c. String.Format du Framework
IX-I-3. C - CultureInfo
IX-J. Modifier le curseur, gérer la souris
IX-J-1. Apparence du curseur
IX-J-2. Curseur sur un contrôle:
IX-J-3. La souris:
IX-J-4. Exemples:
IX-K. Lancer une autre application, afficher une page Web
IX-K-1. L'ancienne méthode VisualBasic toujours valable: Shell
IX-K-2. On peut utiliser la Classe 'Process' du Framework.
IX-L. Imprimer
IX-L-1. A- Avec PrintDocument
IX-L-1-a. 1 Imprimer 'Hello' avec le composant 'PrintDocument'
IX-L-1-a-i. Imprimer un dessin:
IX-L-1-a-ii. Afficher un Message Box indiquant 'Fin d'impression'
IX-L-1-b. 2-Même programme: Imprimer 'Hello' mais avec la Classe PrintDocument
IX-L-1-b-i. Comment choisir l'imprimante?
IX-L-1-b-ii. Comment modifier la page à imprimer?
IX-L-1-c. Prévisualisation de la page à imprimer?
IX-L-1-d. Construction d'une application d'impression complexe:
IX-L-1-e. Propriétés du 'PrintDocumet':
IX-L-1-f. Imprime le formulaire en cours.
IX-L-1-g. Imprime un contrôle DataGrid.
IX-L-2. B- Imprimer comme en VB6 avec un objet 'Printer'
IX-M. Dessiner
IX-M-1. A- Sur quoi dessiner?
IX-M-2. B-Comment dessiner?
IX-M-3. C- Travailler sur un Objet Image
IX-M-4. D- Comment voir un Graphics?
IX-M-4-a. Paint déclenché par Resize.
IX-M-5. E- Un exemple: Afficher un texte en 3D
IX-M-6. Espace de nom
IX-N. Faire une aide pour l'utilisateur
IX-N-1. Généralisées sur les 4 sortes d'aide.
IX-N-2. Les fichiers d'aide:
IX-N-3. Utilisation des fichiers d'aide:
IX-N-3-a. Appel direct:
IX-N-3-b. Appel par F1:
IX-N-3-c. Utilisation du bouton d'aide
IX-N-3-d. Utilisation des info bulles.
IX-N-3-e. Utilisation de ErrorProvider.
IX-O. Appeler un API
IX-O-1. Appel d'une fonction dans une Api
IX-O-2. Les Api Windows
IX-O-3. Autre exemple classique.
IX-P. Faire du glisser déplacer (Drag&Drop)
IX-P-1. Exemple No 1 (simple)
IX-P-2. Exemple No 2 plus complexe:
IX-Q. Utiliser le 'Registre'
IX-R. Utiliser le 'Presse papier'
IX-R-1. En VB 2003 (Framework 1)
IX-R-1-a. Mettre dans le presse papier:
IX-R-1-b. Récupérer du presse papier:
IX-R-1-c. Exemple:
IX-R-1-d. Alternative:
IX-R-2. My.Computer.Clipboard en VB
IX-S. Paramètres de configuration(App.ini, registre, App.config)
IX-S-1. Les Fichiers:
IX-S-2. Fichiers .INI.
IX-S-3. Registre.
IX-S-4. Fichier de configuration. App.Config File de VB2003 (Framework 1)
IX-S-5. Configuration par paramètres Settings de VB2005 (Framework 2)
IX-S-6. Liaison propriétés <=> Settings de VB2005 (PropertyBinding)
IX-T. Utiliser les 'Ressources'
IX-T-1. Intérêt des ressources?
IX-T-2. Les types de ressource?
IX-T-3. Voir les ressources:
IX-T-4. Ajouter des ressources:
IX-T-5. Ou se trouvent les ressources:
IX-T-6. Modifier une ressource
IX-T-7. Utiliser une ressource dans le programme:
IX-T-8. Ressources localisées:
IX-T-9. Ressources liées ou incorporées
IX-T-10. Comment cela marche?
IX-U. Ou mettre les programmes et les données
IX-U-1. Il faut séparer les données des programmes !!!
IX-U-2. Sécurité:
IX-U-3. Quels répertoires utiliser ?
IX-U-4. Obtenir le répertoire de l'exécutable et des données:
IX-U-5. Droits d'accès des utilisateurs dans Vista : l'UAC.
IX-V. Choisir une icône, utiliser la barre de taches - Créer un raccourci, lancer au démarrage
IX-V-1. Icône de l'application
IX-V-2. Bouton dans la barre de tache:
IX-V-3. Icone dans la barre de processus: NotifyIcon
IX-V-4. Créer un raccourci sur le bureau:
IX-V-5. Lancer le programme au démarrage de Windows:
IX-W. Petits problèmes pratiques:
X. Déboguage:
X-A. Débogage ( ou comment rechercher les 'Bugs')
X-A-1. A - Suspendre l'exécution.
X-A-2. B - Débogage pas à pas.
X-A-2-a. Comment voir rapidement la valeur des propriétés ou de variables.
X-A-2-b. Modification du code source.
X-A-2-c. C - Sortie des informations de débogage.
X-A-2-c-i. Objet Console.
X-A-2-c-ii. Objet Debug
X-A-2-c-iii. Trace:
X-A-2-c-iv. Mode 'Trace', 'Release', Mode 'Debug'
X-B. Comprendre les 'Messages d'erreur'
X-B-1. Instance d'objet
X-B-2. Membre absent
X-B-3. Type Attendu.
XI. Comprendre le fonctionnement de VB:
XI-A. Comprendre le FrameWork, la compilation, le garbage collector, le code managé, le code IL et binaire.
XI-A-1. Le Framework.NET
XI-A-2. Inconvénients?
XI-A-3. Intérêts?
XI-A-4. Revoyons en détails le contenu du Framework:
XI-A-5. Framework 1, 2, 3.
XI-A-6. Code managé:
XI-A-7. Garbage Collector:
XI-A-8. Compilation:
XI-A-9. Comment voir le code source ,le code IL, le code exécutable?
XI-A-10. Installation du Framework:
XI-A-10-a. Nouvelle version 2:
XII. Diffuser le programme:
XII-A. Assembly
XII-A-1. Assembly: définition, composition.
XII-A-2. Les propriétés de l'assembly:
XII-A-3. Le manifeste:
XII-B. Distribuer l' application
XII-B-1. Introduction:
XII-B-2. A - Avant de 'Publier':
XII-B-3. B - Comment installer simplement un programme chez l'utilisateur?
XII-B-4. C - Créer un programme d'installation classique en VB 2003 ( de type Windows Installer):
XII-B-5. D - Créer un programme d'installation 'ClickOnce' en en VB 2005:
XII-C. Exemples de programme:
XII-C-1. Horloge numérique
XII-C-2. 'Scribble' l'exemple de Microsoft
XII-C-3. Programme simple de dessin
XII-C-4. Exemples de petits applications par Microsoft:
XIII. Programmation Objet: création de Classes et composant,
XIII-A. Programmation orientée objet, Propriétés des objets (Rappel)
XIII-A-1. Interface et Implémentation:
XIII-A-2. Encapsulation:
XIII-A-3. Héritage:
XIII-A-4. Polymorphisme:
XIII-A-5. Constructeur, destructeur:
XIII-A-6. Accesseur, mutateur:
XIII-A-7. Déclaration, instanciation:
XIII-A-8. Propriétés, Méthodes:
XIII-A-9. Les Objets: ils sont 'By Ref':
XIII-A-9-a. Création de variable objet
XIII-A-9-b. Affectation:
XIII-A-9-c. Comparaison:
XIII-B. Créer une Classe
XIII-B-1. Création de Classe.
XIII-B-1-a. Revenons une nouvelle fois sur la notion de Classe et d'Objet.
XIII-B-1-b. Créer une Classe
XIII-B-1-c. Ajouter des variables dans une classe
XIII-B-1-d. Ajouter des propriétés grâce à 'Property'
XIII-B-1-e. Méthode
XIII-B-1-f. Récapitulatif Property, méthodes.
XIII-B-1-g. Constructeur
XIII-B-1-h. Destructeur
XIII-B-1-i. Surcharge
XIII-B-1-j. Evènement
XIII-B-1-k. Exception
XIII-B-1-l. Les Classes partielles
XIII-B-2. Classe suite et astuces
XIII-B-2-a. Me , My, MyClass, MyBase.
XIII-B-2-b. Propriété par défaut
XIII-B-2-c. Méthode de Classe avec Shared:
XIII-B-2-d. Création d'un compteur d'instance.
XIII-B-2-e. Création d'un identifiant unique d'instance.
XIII-B-2-f. Singleton
XIII-C. Créer un composant (Bibliothèque de Classe et de Contrôles)
XIII-C-1. Créer une Bibliothèque de Classe
XIII-C-1-a. NameSpace:
XIII-C-1-b. Utilisation du composant:
XIII-C-2. Créer un 'contrôle utilisateur' à partir d'un contrôle existant en le modifiant:
XIII-C-3. Créer un 'contrôle utilisateur' contenant un ou plusieurs contrôles pilotés:
XIII-D. Les interfaces
XIII-D-1. Définition: Interface et implémentation:
XIII-D-2. Les interfaces présentes dans les classes du Framework.
XIII-D-3. Les interfaces crées par le programmeur:
XIII-E. L'héritage
XIII-E-1. Définition de l'héritage:
XIII-E-2. Membres de la classe dérivée:
XIII-E-2-a. Redéfinition de membres (Overrides)
XIII-E-2-b. Surcharge de membres (Overloads)
XIII-E-2-c. Cacher un membre de la classe de base(Shadows)
XIII-E-3. MyBase:
XIII-E-4. Constructeur dans une classe fille:
XIII-E-5. Héritage successif:exemple:
XIII-E-6. Création de Classe à partir de Classe du Framework:
XIII-E-7. Création de composant et héritage:
XIII-F. Les espaces de nom , portées des classes et membres (friend protected public private)
XIII-F-1. Intérêts des espaces de noms (NameSpace):
XIII-F-2. Pour créer une classe dans un espace de noms:
XIII-F-3. Portée des Classes, procédures, membres.
XIII-G. Composition et groupe d'objets :Tableau, collection d'objets, Classe contenant un groupe d'objets
XIII-G-1. Un Objet dans un autre: Composition d'objets:
XIII-G-2. Groupe d'objets:
XIII-G-2-a. Comment utiliser un tableau ou une collection d'objets 'Salarié':
XIII-G-2-b. Utiliser Une Classe contenant des Salariés:
XIII-G-2-b-i. Créer une Classe contenant une ArrayList
XIII-G-2-b-ii. Créer une Classe héritant de la Classe ArrayList
XIII-G-2-b-iii. Créer une Classe héritant de la Classe CollectionBase
XIII-G-2-b-iv. Créer une Classe contenant une Classe générique
XIII-G-2-b-v. Conclusion:
XIII-H. Conservation (sauvegarde) d'objet, sérialisation
XIII-H-1. La Sérialisation
XIII-H-2. Exemple 1: Sérialisation binaire.
XIII-H-3. Sérialisation:
XIII-H-4. Déserialisation:
XIII-H-5. Exemple 2: Sérialisation Xml.
XIII-H-6. Exemple 3: Sérialisation d'une collection
XIII-H-7. Exemple 4: Sérialisation d'un tableau
XIII-H-8. Exemple 5: Sérialisation d'une collection généric
XIII-I. Surcharge
XIII-I-1. Surcharge en VB 2003
XIII-I-2. Surcharge en VB 2005: nouveautés
XIII-J. Structure de programme: programmation à 3 couches
XIII-J-1. Introduction:
XIII-J-2. Architecture n-tiers
XIII-J-3. Architecture 3 tiers
XIII-J-4. Exemple 1:Ma bibliothèque (En écrivant du code)
XIII-J-4-a. Couche métier
XIII-J-4-b. Couche d'accès aux données:
XIII-J-4-c. Couche de présentation: interface graphique ]
XIII-J-5. Exemple 2: Ma bibliothèque (Avec un BindingSource et génération automatique de l'IU)(VB 2005)
XIII-J-5-a. Couche métier:
XIII-J-5-b. Création de la source de données:
XIII-J-5-c. Génération automatique de l'interface utilisateur:
XIII-J-5-d. Création du Binding:
XIII-K. Utilisation de Patron (Design Pattern)
XIII-K-1. Singleton
XIII-K-2. Itérateur
XIV. Un peu de théorie pour en déduire de bonnes règles :
XIV-A. Diverses sortes de programmation .
XIV-A-1. Programmation impérative
XIV-A-2. Programmation structurée
XIV-A-3. Programmation fonctionnelle
XIV-A-4. Programmation procédurale
XIV-A-5. Programmation défensive
XIV-A-6. Programmation sécurisée:
XIV-A-6-a. Conception
XIV-A-6-b. Réalisation
XIV-A-6-c. Exécution
XIV-A-7. Programmation évènementielle
XIV-A-8. Programmation Objet
XIV-B. Programmation 'fonctionnelle' ou 'objet'?
XIV-B-1. L'approche fonctionnelle
XIV-B-2. Approche Objet
XIV-B-3. Conclusion
XIV-C. Programmation 'fonctionnelle': faire de bonnes procédures.
XIV-C-1. Approche fonctionnelle, analyse 'descendante' ou 'ascendante'
XIV-C-2. Pourquoi utiliser des procédures?
XIV-C-3. La 'cohésion' de la procédure doit être importante
XIV-C-4. Le 'couplage' entre procédures doit être modéré
XIV-C-5. Squelette d'un programme
XIV-C-6. Les paramètres
XIV-C-7. Utiliser une 'Sub' ou une 'Function'?
XIV-C-8. Programmation défensive
XIV-D. Programmation 'objet': faire de bonnes Classes
XIV-D-1. Rappel:
XIV-D-2. Pourquoi utiliser 'Classe' et 'Objet'?
XIV-D-3. Identifier les objets
XIV-D-4. Faire un 'couplage' modéré
XIV-D-5. Conserver une bonne abstraction et une bonne cohérence
XIV-D-6. Créer des méthodes par paires
XIV-D-7. L'encapsulation doit être bonne
XIV-D-8. Initialisez les données dans le constructeur d'une Classe.
XIV-D-9. Problèmes liés à l'héritage.
XIV-E. Faire du bon 'code ' bonnes variables.
XIV-E-1. Usage des variables
XIV-E-1-a. Utilisez OptionStrict=On et Option Explicit= On
XIV-E-1-b. Donner à chaque variable un seul rôle
XIV-E-1-c. Eviter les variables avec des significations non évidentes
XIV-E-1-d. Initialisez les variables dés leur déclaration.
XIV-E-1-e. Utilisez le principe de proximité
XIV-E-1-f. Travaillez sur des variables qui restent actives le moins de temps possible.
XIV-E-1-g. Si vous codez la valeur d'une variable en 'dur' utiliser plutôt des constantes
XIV-E-1-h. Groupez les instructions liées
XIV-E-1-i. Réduisez la portée des variables (problème des variables globales)
XIV-F. Règles de bonne programmation.
XIV-F-1. Séparer l'interface utilisateur et l'applicatif.
XIV-F-2. Utiliser le typage fort.
XIV-F-3. Forcer la déclaration des variables et les conversions explicites
XIV-F-4. Utiliser des constantes ou des énumérations
XIV-F-5. Vérifier la validité des données que reçoit une Sub une Function ou une Classe
XIV-F-6. Se méfier du passage de paramètres 'par valeur' ou par 'référence'
XIV-F-7. Les Booléens sont des Booléens
XIV-F-8. Utiliser les variables Date pour stocker les dates
XIV-F-9. Ne faire aucune confiance à l'utilisateur du logiciel
XIV-G. Rendre le code lisible: commentaires, noms de variable .
XIV-G-1. Ajoutez des commentaires.
XIV-G-2. Choisissez les noms de procédures et de variables avec soins
XIV-G-3. Eclaircir, aérer le code
XV. Les bases de données
XV-A. Notion sur les bases de données
XV-A-1. Généralités:
XV-A-2. Tables
XV-A-2-1. Exemple
XV-A-3. Type de colonne
XV-A-4. Clé primaire
XV-A-5. Index
XV-A-6. Relations entre les tables: différents types de relations.
XV-A-6-a. 1 à N (relation un à plusieurs)
XV-A-6-b. 1 à 1
XV-A-6-c. N à M
XV-A-6-d. Relation N à M avec N fixe et petit
XV-A-7. Contraintes
XV-A-8. Serveur de fichier, Client serveur.
XV-A-9. Opérations sur les enregistrements
XV-B. Généralités sur ADO.NET
XV-B-A. Généralités:
XV-B-B. Les Managed Providers
XV-B-C. Les Objets ADO.NET
XV-B-D. Le DataReader
XV-B-E. Le DataSet
XV-C. Syntaxe SQL
XV-C-A. Généralités:
XV-C-B. Les commandes SQL
XV-C-C. A - SELECT: interrogation.
XV-C-D. TRI des enregistrements:
XV-C-E. Statistiques:
XV-C-F. Extraction de données sur plusieurs tables:
XV-C-G. B - Ajout, suppression, modification d'enregistrement:
XV-C-H. C - Ajout de table:
XV-D. Lire rapidement en lecture seule: le DataReader
XV-D-A. Généralités:
XV-D-B. Exemple de DataReader avec une base access.
XV-D-C. Comment compter?
XV-D-C-1. L'objet Connection:
XV-D-C-2. L'objet Command:
XV-D-C-3. L'objet DataReader
XV-D-C-4. Exceptions:
XV-E. Travailler sur un groupe de données: le DataSet
XV-E-A. Généralités:
XV-E-B. A - Utilisation du DataSet, du DataView :En pratique:
XV-E-C. B - Remplir un DataGrid ou une ListBox avec un DataSet:
XV-E-D. Etudions en détails un DataSet:
XV-F. Liaison DataGrid, ListBox et base de données: le "DataBinding"
XV-F-A. A - Remplir une ListBox avec une colonne d'une table d'une BD:
XV-F-B. B - Remplir un DataGrid avec une base de données via un DataSet
XV-F-B-1. Comment ne pas écrire de code.
XV-F-B-2. Mise à jour:
XV-F-C. C - Remplir un DataGrid avec une base de données sans une ligne de code (VB 2005):
XV-F-C-1. A - Création de la source de données:
XV-F-C-1-B. B - Génération automatique de l'interface utilisateur:
XV-G. Créer une BD, ajouter une table à une base de données.
XV-G-A. Créer une base de données:
XV-G-B. Ajouter une table à une BD existante:
XVI. Migration VB6=>VB.NET 2003=>VB.NET 2005
XVI-A. Les objets
XVI-B. Les Classe du Framework
XVI-C. Les formulaires ou fenêtres:
XVI-D. Les Controles
XVI-E. Les Variables
XVI-F. Les Tableaux
XVI-G. Les Collections
XVI-H. Les Structures
XVI-I. Les Fonctions et Sub
XVI-I-1. Dans le code
XVI-J. Gestion des erreurs
XVI-K. Les graphiques
XVI-L. Les bases de données
XVI-M. Les Classes
XVI-N. GOSUB et ON GOSUB n'existent plus
XVI-O. Les Timers
XVI-P. Conversion VB6 vers VB.NET
XVII. Nouveautés dans VB.NET 2005 (Framework 2)
XVII-A. Le matériel
XVII-B. L'IDE
XVII-B-a.
XVII-B-b. Edit and Continue:
XVII-B-c. Le Projet Designer:
XVII-B-d. L'alignement automatique des contrôles:
XVII-B-e. Le déplacement des contrôles ou l'accès aux principales tâches est amélioré:
XVII-B-f. Renommer un nom: modification automatique.
XVII-B-g. Commentaire en Xml
XVII-C. Les nouveaux Objets
XVII-C-i. My: le SUPER RACCOURCI.
XVII-D. Les instances de Forms:
XVII-E. Les nouveaux Contrôles
XVII-E-i. DataGridView
XVII-E-ii. MaskedTextBox
XVII-E-iii. SoundPlayer
XVII-E-iv. SplitContainer:
XVII-E-v. ListView
XVII-E-v-1. WebBrowser:
XVII-E-vi. LayoutPanel:
XVII-E-vii. MenuStrip :
XVII-E-viii. ToolStrip:
XVII-E-ix. StatuStrip:
XVII-E-x. ProgesBarr:
XVII-F. Les nouvelles 'Variables'
XVII-G. Les nouvelles 'Collections'
XVII-H. Dans le Code: les nouvelles instructions
XVII-I. Les nouveautés dans les Classes:
XVIII. Optimisation en vitesse
XVIII-A. Comparaison VB6 VB.Net
XVIII-A-a. Comment VB.NET 2003 est situé en comparaison avec les autres langages de programmation?
XVIII-A-b. VB.NET(2003 ou 2005) est-il plus rapide que VB6?
XVIII-B. Chronométrer le code.
XVIII-B-a. Pour chronométrer une évènement long.
XVIII-B-b. Créer un compteur pour les temps très court (Framework 1 , VB2003)
XVIII-B-c. Créer un compteur pour les temps très court (Framework 2 , VB2005)
XVIII-C. Optimiser en vitesse.
XVIII-C-a. Comment accélérer une application VB.net?
XVIII-C-a-i. Utilisation des nouvelles fonctionnalités:
XVIII-C-b. Choix des variables:
XVIII-C-c. Tableau:
XVIII-C-d. Collections:
XVIII-C-e. Eviter la déclaration de variables 'Objet' et les liaisons tardives, les variables non typées:
XVIII-C-f. Utiliser les bonnes 'Options':
XVIII-C-g. Pour les fichiers utiliser System.IO:
XVIII-C-h. If..Then ou Select Case?
XVIII-C-h-1. If..Then
XVIII-C-i. Utiliser les bonnes 'Opérations':
XVIII-C-j. Utiliser :With End With
XVIII-C-k. Optimiser les boucles:
XVIII-C-l. Appel de procédure:
XVIII-C-m. Usage de thread:
XVIII-C-n. Comment accélérer quand on utilise des 'String':
XVIII-C-o. Comment accélérer l'affichage?:
XVIII-C-p. Utiliser les tableaux en mémoire plutôt que la lecture de fichier sur disque:
XVIII-C-q. Ce qui n'influence pas la rapidité du code:
XVIII-C-r. Compilation Dll:
XVIII-C-s. En conclusion:
XIX. Allons plus loin
XIX-A. Les bases binaires, hexadécimales, algèbre de Boole.
XIX-A-1. Introduction.
XIX-A-2. Notions théoriques:
XIX-A-3. Pratique en Visual Basic.
XIX-A-4. Viewer Hexadecimal
XIX-A-5. Editeur hexadecimal:
XIX-B. Comprendre le code crée par VB
XIX-B-1. Code généré automatiquement lors de la création d'un formulaire ou d'un contrôle.
XIX-B-2. Substitution de procédures évènement:
XIX-C. Créer des contrôles par code
XIX-C-1. Créer par code des contrôles.
XIX-C-2. Ajouter des évènements.
XIX-C-3. Les délégués:
XIX-C-4. Création de menu contextuel par code:
XIX-D. Les 'régions',la compilation conditionnelle, les 'Attributs'.
XIX-D-1. Les Régions.
XIX-D-2. La Compilation conditionnelle.
XIX-D-3. Les Attributs.
XIX-E. Multithread.
XIX-E-1. Un Thread c'est quoi?
XIX-E-2. Comment ajouter un Thread d'arrière plan?
XIX-E-3. État d'avancement:
XIX-E-4. Arrêter le thread en cours:
XIX-E-5. Résultat retourné par le thread d'arrière plan:
XIX-F. Les délégués, les évènements.
XIX-F-1. Définition.
XIX-F-2. A- Création d'un délégué avec 'Delegate'
XIX-F-3. B-Délégué et appel asynchrone
XIX-F-4. C-Délégué et évènement:
XIX-G. Les génériques VB 2005
XIX-G-1. Définition.
XIX-G-2. Exemple de Fonction utilisant un 'generic'
XIX-G-3. Exemple de Classe utilisant un 'generic'
XIX-G-4. Exemple de Collection utilisant un 'generic'
XIX-G-5. Intérêts des génériques ?
XIX-G-6. En VB 2005: il y a des classes permettant l'usage de génériques:
XIX-G-7. En VB 2005:il y a les Collections 'generic' ou 'Specialized'
XX. Bonnes adresses, bibliographie du site.
XX-A. Sur le Net : trouver des informations.
XX-A-1. Vb 2003:
XX-A-1-a. Chez Microsoft
XX-A-1-b. VB 2005:
XX-A-2. Sites dédiés au Visual Basic
XX-A-3. Convertisseur C# -> VB
XX-A-4. SQL
XX-A-5. Glossaire


I. Démarrer le cours


I-A. Introduction , page de présentation , principe du site.


II. Introduction: débutez ici


II-A. Qu'allons nous étudier?

Ce cours est un cours de Visual Basic.Net

Nous étudierons principalement: LES APPLICATIONS WINDOWS. (les WindowsForms).

Les applications Windows sont des programmes directement exécutables qui utilisent des fenêtres Windows: des programmes de traitement de texte, d'image, de musique, des jeux, de petits utilitaires, des logiciels métiers (médicaux)...

Nous laisserons de côté les applications 'Web' (en ASP qui utilisent les WebForms) et qui permettent de créer des sites Internet, les applications 'console'..

Les versions étudiées sont VB 2003 (Framework 1.1) , et VB 2005 (Framework 2)


II-B. Quel plan de cours suivrons nous?

Nous étudierons donc comment créer une application Windows:

Nous étudierons la notion d'objet, d'évènement.(Section 0.)

Nous étudierons le langage Visual Basic. (Section 1.)

Nous utiliserons les objets 'formulaire' et les 'divers contrôles' pour créer l'interface utilisateur (Section 3.).

Nous découvrirons la manière de créer une application.(Section 4.)

Nous apprendrons à créer une classe (Section 5.)

Nous verrons la différence entre programmation objet et programmation fonctionnelle. (5-10)

Nous verrons comment utiliser les bases de données. (Section 6.)

Quelle différence entre VB6 VB.Net 2003 et 2005, problèmes de vitesse (Section 7.)

Nous terminerons dans des choses plus subtiles (Délégué, génériques..)(Section 8.)

voir le Sommaire du cours. On peut s'aider de l'Index pour rechercher un mot clé.

Conseil de lecture :Lire la succession de pages en cliquant sur le bouton Suivant en bas de page. Ne pas hésiter à relire plusieurs fois les chapitres.


II-C. Quels logiciels utiliser?

Il y a plusieurs manières de faire du VB.NET:

II-D. Quelle configuration est nécessaire?

Pour développer avec Visual Studio 2003 ou VB 2005:

il faut Windows XP ou 2000 ou Vista avec au minimum 256 Mo de mémoire vive. Un grand écran (vu le nombre de fenêtres) est conseillé.

Les exécutables fonctionnent sous Windows 98, XP, 2000 Vista.


III. Principe et structure des programmes.


III-A. Les 'Objets

VB utilise la notion d''OBJET'.

Pour bien comprendre ce qu'est un objet, nous allons prendre des exemples dans la vie courante puis nous passerons à des exemples dans Visual Basic.

Voir la vidéo au format 'Flash': ou au format AVI en Visual Basic 2005.

La vidéo (identique à celle du chapitre 1-20)contient:
  1. Objets, Classes.
  2. Références, espaces de noms(a visionner plus tard).

III-A-1. A - Dans la vie courante:

Mon gâteau est un objet, cet objet existe.

Pour créer un gâteau, j'utilise un 'moule à gâteau', ce moule à les caractéristiques du gâteau (forme, hauteur..), mais je ne peux pas manger le moule!! Le moule se nomme la Classe.

Avec le moule, je crée un ou plusieurs gâteaux.

Autre exemple:

Ma voiture est un objet, cet objet existe, on peut l'utiliser.

Ma voiture fait partie de "Les voitures", du type, du genre "Les voitures". "Les voitures" c'est une classe (Class) qui a ses caractéristiques : "Les voitures" ont une couleur, un moteur.., elles roulent en transportant des passagers…

mais je ne peux pas utiliser "Les voitures", la Classe; pour me déplacer, il faut avoir un objet "voiture".

Avec la Classe je vais créer des Objet.

De manière générale, une classe est une représentation abstraite de quelque chose, tandis qu'un objet est un exemple utilisable de ce que représente la classe.

Pour fabriquer ma voiture, je prends les caractéristiques de la class "Les voitures" (c'est comme un moule) et je fabrique une voiture, je la nomme 'MaVoiture'.

Dim MaVoiture As New Lesvoitures
MaVoiture est maintenant un nouvel objet de type 'Les voitures'.

Class --> Objet

Type 'Les voitures'--> Objet 'Mavoiture'

Un Objet est créé selon un 'modèle' qu'on appelle une Classe.

On dit aussi qu'il faut instancier un objet à partir de la Classe.

'Mavoiture' est une instance de la classe 'Les voitures'.

(On dit aussi une 'occurence' de la classe)

Remarque:

Avec la même classe ont peu instancier plusieurs Objets.


III-A-1-a. Propriétés (Attributs):

Prenons MaVoiture.

Elle a des propriétés : une marque, une couleur, une puissance…

Pour indiquer la couleur de ma voiture on utilise la notation :

MaVoiture.couleur
Syntaxe : Objet.Propriété (Il y a un point entre les 2 mots)

Pour modifier la couleur et avoir une voiture verte on écrit :

MaVoiture.couleur= "Vert"
Et la voiture devient verte !!

MaVoiture.Phares.Avant indique les phares avant de la voiture.

MaVoiture.Phares.Avant.Allumé indique l'état des phares (Allumé ou non)

Si je fais :

MaVoiture.Phares.Avant.Allumé=True (Vrai) cela allume les phares.


III-A-1-b. Méthodes :

MaVoiture fait des choses : elle roule par exemple.

Pour faire rouler la voiture j'appelle la méthode 'Roule'

MaVoiture.Roule

Syntaxe : Objet.Méthode (Il y a un point entre les 2 mots)

Si c'est possible pour cette méthode je peux indiquer à quelle vitesse la voiture doit rouler :

MaVoiture.Roule(100) 'j'ai ajouté un paramètre.

Le paramètre est un renseignement envoyé avec la méthode.

Il est possible parfois d'indiquer en plus si la voiture doit rouler en marche avant ou en marche arrière.

MaVoiture.Roule(10, Arriere)

Il y a donc 2 manières d'appeler la méthode Roule : avec 1 ou 2 paramètres, on dit que la méthode est surchargée; chaque manière d'appeler la méthode s'appelle 'signature'.

Première signature: MaVoiture.Roule(100)

Seconde signature: MaVoiture.Roule(10, Arriere)


III-A-1-c. Evènement:

Des évènements peuvent survenir sur un objet.

MaVoiture_démarre est un évènement, quand la voiture se met en route (si par exemple j'ai fait MaVoiture.Roule(10, Arriere)), cet évènement démarre se déclenche automatiquement.


III-A-1-d. Interface et implémentation:

Ce que je vois de l'objet, c'est son interface exemple: la méthode Roule fait partie de l'interface d'une voiture. Par contre ce qui fait rouler physiquement la voiture se nomme implémentation, c'est le moteur, ce n'est ni visible ni accessible.

Si je crée une voiture je vais faire l'implémentation, je vais fabriquer le moteur, mais si je suis simplement utilisateur de l'objet voiture, je vais me contenter d'utiliser l'interface.

Visibilité:

Quand un objet est créé, il est visible et utilisable, uniquement dans la zone où il a été défini.


III-A-1-e. Relation entre Objet:

Héritage:

Une Classe (un moule) peut hériter d'une autre classe (d'un autre moule).

La classe Voiture hérite de la classe Véhicule, cela veut dire qu'une voiture est un véhicule; la classe voiture aurait les propriétés de la classe Véhicule.

Contenant-contenu:

On peut créer une Classe qui contient des Objets, une classe qui se compose d'objets. on parle de composition.

L'objet Voiture contient 4 objets Roue.

On dit que l'objet encapsule le contenu.

Collections:

Les collections sont des groupes d'objets semblables qui peuvent être énumérés.

Un parc automobile contient X Voitures; chaque voiture a un numéro d'item:

ParcVoiture.item(1) pour la première Voiture

ParcVoiture.item(2) pour la seconde Voiture


Tous cela ce sont des images, mais voila, vous avez compris ce qu'est un objet !


III-A-2. B- Et dans Visual Basic.net:

Une application Windows se compose de fenêtres (nommées aussi formulaires) dans lesquelles se trouvent des contrôles (bouton, liste, texte…)

Exemple de fenêtre avec 2 boutons, une zone de texte (un label) et une icône:

Dans une application Windows, il y a aussi des lignes de code utilisant des variables pour faire des calculs.

En Visual Basic.Net tout est objet :

les fenêtres (on dit les formulaires),

les variables,

les contrôles (les boutons, liste, image, case à cocher..)

...

Il faut un moule pour faire un objet. Le moule c'est une classe.

Le moule va servir à créer un objet,on dit une instance.

On peut créer, instancier une multitude d'objets avec le même moule.

Pour créer, démouler un objet, on utilise les mots clé Dim et As New.

Dim objet As New Classe
New est un constructeur.

Exemple : créer une fenêtre (un formulaire) :

Je dessine une fenêtre FormDémarrage (c'est la Classe, le moule)

puis

	Dim F As New FormDémarrage 
Crée une fenêtre qui se nomme 'F' à partir du moule, du modèle (FormDémarrage) que j'ai dessiné.

Autre exemple :

Dim B as New Button
Créer un bouton nommé 'B' avec les attributs habituels des boutons (Class Button)

Troisième exemple:

Comment créer une variable nommée Mavariable pouvant contenir un entier (Integer)

		Dim MaVariable As New Integer
Dim MaVariable As Integer 'est correct aussi

Ici, pour une variable, on remarque que New peut être omis


III-A-2-a. Tout objet a des propriétés.

On utilise la syntaxe : Objet.Propriété (Il y a un point entre les 2 mots)

Si F est une fenêtre, F.BackColor indique la couleur de fond de la fenêtre.

S'il y a un bouton, la couleur de fond du bouton sera :

Bouton.BackColor

Ou

F.Bouton.BackColor

Noter la syntaxe : La couleur du bouton qui est dans la fenêtre F

En fait une propriété c'est une sorte de variable.

Comment modifier cette propriété?

Bouton.BackColor=Color.Red 'modifie la couleur de fond du bouton

Autre exemple:

La propriété Visible: si elle a la valeur True (Vraie) l'objet est visible; si elle est à False l'objet n'est pas visible.

Bouton.Visible=False 'fait disparaître le bouton

<==Ici il y a un bouton invisible!! oui, oui!!


III-A-2-b. Les objets ont des méthodes parfois.

Une méthode agit sur l'objet ou fait agir l'objet.

Prenons un exemple simplifié.

Les Listes ( liste déroulante) ont des lignes (Items) et une méthode Clear qui permet de les vider.

Si je veux vider toutes les lignes d'une liste nommé Liste1, je fais:

Liste1.Items.Clear() '

Les propriétés et méthodes se nomment les membres d'un objet.

Certains objets ont des évènements:

Reprenons notre bouton. Quand l'utilisateur click dessus, l'évènement Bouton_Click survient.

Ce sont les objets contrôles (bouton, case à cocher..)et les formulaires qui ont des évènements.


III-A-2-c. Interface et implémentation:

Ce que je vois de l'objet, c'est son interface (le nom des propriétés, méthodes..) exemple: la méthode Clear fait partie de l'interface d'une ListBox. Par contre le code qui effectue la méthode (celui qui efface physiquement toutes les lignes de la listeBox),ce code se nomme implémentation, lui n'est ni visible ni accessible.

Visibilité:

Quand un objet est créé, il est visible et utilisable, uniquement dans la partie du programme où il a été défini.

Par exemple habituellement, je peux voir et modifier la couleur d'un bouton uniquement dans le code de la fenêtre ou il est situé.

Pour les variables on parle de portée: la variable peut être locale (Private) ou de portée générale ('Public') visible partout.


III-A-2-d. Relation :

Héritage:

Une Classe (un moule) peut hériter d'une autre classe (d'un autre moule).

La classe Button hérite de la classe Control, cela veut dire qu'un bouton est un contrôle.

Si je crée un bouton, il aura les caractéristiques de la classe Button mais aussi de la classe Control.

Contenant-contenu:

Une Classe peut contenir d'autres classes.

Je peux décider d'un Objet Rectangle va contenir 4 Objets Point

Collections:

Les collections sont des groupes d'objets semblables qui peuvent être énumérés.

Une fenêtre Windows (on dit un 'formulaire' contient une collection nommée 'Controls' composées de tous les objets (boutons, List, texte) contenus dans la fenêtre:

maFenetre.Controls.item(1) contient par exemple le premier bouton

maFenetre.Controls.item(2) contient par exemple une list.


III-A-3. En résumé :

En Visual Basic.net tout est objet.

Les Classes sont des types d'objet.

Pour créer (instancier) un objet à partir d'une Classe, il faut utiliser les mots clé Dim ..As New:

Dim Objet As New Class
Un objet a :
  • Des propriétés.
  • Des méthodes.
  • Des évènements.
warning Attention, par abus de langage, on emploie parfois indifféremment les mots 'Classe' et 'Objet', mais il est préférable de ne pas confondre le modèle et l'objet lui même.

III-A-4. Lexique anglais=>Français:

New = Nouveau.


III-B. Programmation évènementielle: le premier programme.

Nous allons comprendre la programmation évènementielle: Comment fonctionne Visual Basic:
  • Ce que voit l'utilisateur.
  • Ce qu'a fait le développeur pour arriver à ce résultat.
Voir la vidéo au format 'Flash': ou au format AVI en Visual Basic 2005


III-B-1. Principes de la programmation VB

Le programmeur va dessiner l'interface utilisateur (fenêtre, bouton, liste..), il va ensuite uniquement écrire les actions à effectuer quand certains événements se produisent sur cette interface.

C'est Visual Basic qui va entièrement s'occuper de la gestion des événements.


III-B-2. Exemple :le premier programme:

Il affiche 'Bonjour' quand on clique sur un bouton.

C'est pas original: le premier programme, dans tous les cours d'informatique, permet d'afficher 'Bonjour' (ou 'Hello Word').

  • Que voit l'utilisateur du programme?
    L'utilisateur final, celui qui utilise le logiciel, voit une fenêtre avec un bouton, Si il appuie sur ce bouton il voit s'afficher « Bonjour ».

  • Que se passe t-il dans le programme?
    Quand l'utilisateur clique sur le bouton cela déclenche automatiquement un événement. (Button1_Click), cet évènement contient du code qui affiche « Bonjour ».

  • Que doit faire le programmeur pour arriver à ce résultat?
    Pour atteindre ce résultat, le programmeur va dessiner la fenêtre, le bouton, la zone d'affichage du texte (un label) puis il va simplement indiquer dans l'évènement Button_Click d' afficher « Bonjour ».

    info Le fait de déterminer la procédure à appeler ou de réaliser l'appel est entièrement pris en charge par VB.

III-B-3. En pratique, que fait le programmeur:

Voir la vidéo au format 'Flash': ou au format AVI en Visual Basic 2005

Le programmeur est en mode 'conception' (ou mode Design):Il écrit le programme :


III-B-3-a. A- Il dessine l'interface utilisateur

(Ce que verra l'utilisateur final, c'est l'interface utilisateur : une fenêtre avec des boutons, des listes, du texte..) :

Il ouvre un projet : une fenêtre 'Form1' apparaît.

Il ajoute un bouton :

Pour cela il utilise la Boite à outils:

Il clique sur 'Boite à Outils' à gauche , bouton Windows Forms, puis bouton 'Button', il clique dans Form1, déplace le curseur sans lâcher le bouton, puis lâche le bouton de la souris : le dessin d'un bouton apparaît.

Pour l'exemple,Il ajoute un label.

Un label est un contrôle qui permet d'afficher un texte.

Comme pour le bouton il clique sur 'Boite à Outils' à gauche, bouton Windows Forms, bouton 'Label' et met un contrôle label sur la fenêtre.


III-B-3-b. B- Il va écrire le code correspondant aux événements :

Il double-clique sur le bouton qu'il a dessiné :

Une fenêtre de conception de code s'ouvre et il apparaît :

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

End Sub
Cela correspond à la procédure évènement en rapport avec l'évènement 'On a cliqué sur le bouton1'.

Quand le programme fonctionne, quand l'utilisateur du logiciel clique sur le bouton1, le code situé entre Private Sub Button1Click et End Sub est effectué.

Une procédure est un ensemble de lignes de code qui commence par Sub et se termine par End Sub (ou Function..End Function).

Comment indiquer dans cette procédure d'afficher "Bonjour"?

Le label possède une propriété nommé '.text' qui contient le texte à afficher.

Il faut taper le code qui modifie cette propriété '.text' , qui y met la chaîne de caractère "Bonjour":

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

        Label1.Text = "Bonjour"

End Sub
Cela donne:

Voila votre premier programme est écrit.

Comment exécuter ce programme?

Il est possible de tester immédiatement le programme en mode déboguage, sans quitter l'environnement de développement:

Utiliser le menu 'Déboguer' puis 'Démarrer' qui lance l'exécution du programme.

On peut aussi taper sur F5 pour lancer le programme.

Ou plus simplement cliquer sur la flèche:

C'est plus rapide, lancer l'exécution avec le premier bouton, le second servant à arrêter temporairement l'exécution, le troisième à terminer l'exécution.

En mode exécution :

L'utilisateur voit bien une fenêtre avec un bouton, s'il clique dessus, « Bonjour » s'affiche.

Quand le programme est totalement écrit, terminé, testé, il est possible de le compiler et ainsi de créer un fichier exécutable (possédant une extension '.exe') qui fonctionne de manière autonome en dehors de l'environnement de développement.

C'est ce fichier exécutable qui est fourni à l'utilisateur.

Par opposition le code écrit par le programmeur, composé d'instructions Visual Basic, se nomme le code source.


III-B-4. En résumé :

Le programmeur utilise des outils de dessin pour construire une interface utilisateur : des fenêtres avec des contrôles dessus: menus, boutons, case à cocher..

VB, pour chaque fenêtre ou pour chaque contrôle, génère une liste d'événements, (Evènement lié au chargement d'une fenêtre, évènement lié au fait de cliquer sur un bouton, évènement survenant quand on modifie un texte...)

Il suffit, dans la procédure événement qui nous intéresse, d'écrire le code qui doit être effectué lorsque cet événement survient.

Comme nous l'avons vu le code sert à agir sur l'interface (Afficher un texte, ouvrir une fenêtre, remplir une liste, un tableau), mais il peut aussi effectuer des calculs, évaluer des conditions et prendre des décisions, travailler en boucle de manière répétitive et ainsi effectuer les taches nécessaires .


III-B-5. Lexique anglais=>Français:

Button = Bouton.

End =Fin.

Form= formulaire


III-C. Les instructions, les procédures . Les 'Sub' , les 'Function'

Qu'est ce qu'une instruction , une procédure?

Quelle différence entre les procédures:

liées aux évènement?

les procédures non liées?

Les 'Sub', les 'Functions'.


III-C-1. Les instructions:

Une instruction est le texte permettant d'effectuer une opération, une déclaration, une définition.

Dim A As Integer est une instruction (de déclaration)

A=1 est aussi une instruction qui effectue une opération.

C'est habituellement une 'ligne de code exécutable'.

Une instruction est exécutée lorsque le programme marche.

Plusieurs instructions peuvent se suivre sur une même ligne, séparées par ':'

Dim B As String : B="Bonjour"
Si une ligne est très longue, on peut passer à la ligne grâce à ' _'

(caractère 'Espace' puis caractère"_" puis immédiatement après, passage à la ligne) :

Dim B As String = "Bonjour monsieur ": C= _

"le professeur"
est équivalent à:

Dim B As String = "Bonjour monsieur ": C= "le professeur"
Quand un programme tourne, les instructions sont effectuées ligne après ligne.

1  Dim B As String 

2  B="Bonjour"

3  Dim A As Integer 

4  A= 3

5  A= A + 1
La ligne 1 est exécutée puis la ligne 2 puis la 3, la 4...

Bien que l'on puisse avoir des numéro de ligne, ils ne sont plus utilisé actuellement et non visible:

Dim B As String 

B="Bonjour"

Dim A As Integer 

A= 3

A= A + 1
Pour mettre des commentaires dans un programme, on le fait précéder de "'" .

'Ceci est un commentaire, ce n'est pas une instruction.

Le commentaire ne sera pas exécuté.


III-C-2. Les procédures:

Une procédure est un ensemble d'instructions, de lignes de code, un groupement d'instructions bien définies effectuant une tache précise.

Les procédures sont bien délimitées:

Il y en a de 2 sortes:

Les procédures Sub:

Elles débutent par le mot Sub et se terminent par End Sub.

Les procédures Function:

Elles débutent par Function et se terminent par End Function.

Exemple:

Sub Maprocédure

   A=1

End Sub
Exemple concret d'une procédure: la procédure Button_Click du premier programme.(Celui qui affiche 'Bonjour'; elle ne contient qu'une ligne de code. Le mot Sub est précédé de Private, on verra plus loin ce que cela signifie.

Vous avez vu que l'on peut dessiner l'interface, une fenêtre Form1 par exemple. En mode conception, après avoir dessiné l'interface, on doit avoir accès aux procédures.

info Si on double-clique sur la fenêtre, on a accès aux procédures évènement liées à cette fenêtre, si on double-clique sur un objet (bouton, case à cocher… on voit apparaître les procédures évènement de ce contrôle.
Quand on voit ces procédures, on peut y inclure du code.

Nous allons voir qu'il y a 2 types de procédures: les procédures liées aux évènements et celles qui ne sont pas liées.


III-C-3. Procédures liées aux événements.

Si on double clique sur le fond d'une fenêtre,(Celle du programme 'Bonjour') on voit apparaître les procédures liées à cette fenêtre et aux contrôles contenus dans cette fenêtre :

Public Class Form1

    Inherits System.Windows.Forms.Form

    Dim a As String

#Region " Code généré par le Concepteur Windows Form "  '<===En VB 2003 uniquement

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Label1.Text = ""   

End Sub

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

        Label1.Text = "Bonjour"

End Sub

End Class
Détaillons:

On voit 3 parties:
  • Form1
    Ce n'est pas une procédure mais la définition de la fenêtre.

    La fenêtre fait partie des Windows.Forms.Form..

    Ces lignes sont générées automatiquement par VB.

    En VB 2003,si vous déroulez cette partie, en cliquant sur le petit +, vous pouvez lire le code permettant de créer la fenêtre, les contrôles.. C'est généré automatiquement par VB. (le chapitre 8-2 explique en détails le code généré par VB, mais c'est un peu complexe pour les débutants pour le moment!!)

    En VB 2005 cette partie générée par VB n'est pas visible directement.

  • Form1_Load
    Chaque fenêtre a une procédure Form_Load qui est exécutée lorsque la fenêtre est chargée, on y met généralement le code initialisant la feuille.

    Il y a bien d'autres procédures liées à la fenêtre :

    Dérouler la liste box en haut à gauche de la fenêtre de code, cliquer sur (Form1 events), si vous déroulez maintenant la liste à droite vous aurez tous les événements qui génèrent une procédure :

    Load Lors du chargement de la fenêtre

    Unload Lors du déchargement de la fenêtre

    Activated Lorsque la fenêtre devient active

    GotFocus Lorsque la fenêtre prend le focus

    Resize Lorsque la fenêtre est redimensionnée

    _

  • Button1_Click
    C'est la procédure liée au bouton et qui contient le code à effectuer quand l'utilisateur clique sur le bouton.

    C'est là que l'on écrit le code qui doit s'effectuer lorsque l'utilisateur clique sur le bouton.

    De la même manière que pour la fenêtre, vous pouvez voir dans la liste en haut, tous les événements liés aux boutons qui génèrent une procédure :

    Click Lorsque l'utilisateur clique sur le bouton.

    DoubleClick Lorsque l'utilisateur double-clique sur le bouton.

    MouseDown 'se déclenche si appui du bouton de la souris

    MouseUp 'se déclenche si relâchement du bouton de la souris

    _

info On voit donc que le formulaire (la fenêtre) et tous les contrôles d'une application ont chacun des procédures pour chaque évènement qui peut survenir.

III-C-4. Procédures non liées:

Parfois on a besoin de code qui fait une tâche particulière, qui est utilisé à plusieurs endroits et qui n'est pas liée à un événement.

On crée dans ce cas une procédure indépendante des évènements.

Le système des procédures permet aussi de découper un problème complexe en quelques fonctions moins complexes et indépendantes les unes des autres.

Ces procédures sont en fait des sous-programmes : si une ligne appelle une procédure, le programme 'saute' au début de la procédure, il effectue le code de la procédure puis revient juste après la ligne qui avait appelé la procédure et continue les lignes suivantes.

Exemple : plusieurs fois dans le programme j'ai besoin de calculer la surface d'un cercle à partir de son rayon et de l'afficher sur un label.

Plutôt que de retaper dans chaque procédure le code, je peux créer une procédure 'Sub' nommée AfficheSurfaceCercle.

Il suffit ensuite si nécessaire d'appeler la procédure qui effectue le calcul et affiche le résultat puis revient effectuer le code situé après l'appel.

Comment appeler une procédure?

Par Call NomdeProcedure() ou par

NomdeProcedure()

Call est facultatif.

Noter les parenthèses après le nom de la procédure.


III-C-5. Procédures Sub :

Comment créer cette procédure Sub?

Dans la fenêtre de code, tapez :

Sub AfficheSurfaceCercle  puis validez. Vous obtenez :

Sub AfficheSurfaceCercle()

End sub
Le code de la procédure est compris entre le Sub et le End Sub.

Pour que le calcul se fasse, il faut fournir, (transmettre de la procédure qui appelle à la procédure Sub) la valeur du rayon.

Pour indiquer que la Sub doit recevoir un paramètre (un argument en VB) ajouter entre les parenthèses :

 Sub AfficheSurfaceCercle( Rayon as Single)
Cela signifie qu'il existe une procédure qui reçoit comme paramètre une variable de type Single (Réel simple précision) contenant le Rayon.

Ajouter le code :

Label.text =(3.14*Rayon*Rayon).ToString
Que fait cette ligne ?

Elle fait le calcul: '3.14*Rayon*Rayon' ('*' signifie multiplier), on transforme le résultat en chaîne de caractères (grâce à '.ToString') que l'on met dans la propriété .text du label : Cela affiche le résultat. (On verra toute cette syntaxe en détail ultérieurement)

On obtient:

Sub AfficheSurfaceCercle( Rayon as Single)

    Label.text =(3.14*Rayon*Rayon).ToString

End sub
Comment appeler cette Sub?

N'importe quelle procédure pourra appeler la Sub AfficheSurfaceCercle en envoyant la valeur du rayon afin d'afficher la surface du cercle dans un label.

Exemple d'appel pour un rayon de 12 :

AfficheSurfaceCercle(12)
Affiche dans le label: 452.16


III-C-6. Procédures 'Function' :

Parfois on a besoin que la procédure retourne un résultat, qu'elle donne en retour un résultat à la procédure appelante. . Dans ce cas on utilise une Fonction.

Exemple: je veux créer une fonction à qui je fournis un rayon et avoir en retour la surface d'un cercle.

Comment créer cette Function?

Tapez Function SurfaceCercle puis validez, ajouter (Rayon As Single)

Tapez Return 3.14*Rayon*Rayon

Ce que la fonction doit retourner est après Return (ce que la procédure doit renvoyer à la procédure appelante.)

On obtient la fonction complète:

Function SurfaceCercle( Rayon as Single)

    Return 3.14*Rayon*Rayon

End Function
Comment appeler cette Function?

Dans la procédure qui appelle, il faut une variable pour récupérer la valeur retourner par la Fonction:

S= NomdelaFonction()
N'importe quelle procédure pourra appeler la fonction et obtenir le résultat dans la variable S par exemple pour un rayon de 12 :

Dim S As Single

S=SurfaceCercle(12)
On appelle la fonction SurfaceCercle en envoyant le paramètre '12', ce qui fait que à l'entrée de la fonction, Rayon=12, le calcul est effectué et le résultat du calcul (452.16) est retourné grâce à Return. S récupère ce résultat.

Après l'appel de cette fonction, S est égal à 452.16

Il est possible de spécifier le type retourné par la fonction:

Function SurfaceCercle( Rayon as Single) As Single
As Single en fin de ligne après () indique que la fonction retourne un Single. Il faut donc que la variable qui reçoit la valeur retournée (S dans notre exemple) soit aussi un Single.

Il existe une autre manière de retourner le résultat d'une fonction, reprenons l'exemple précédent, on peut écrire:

Function SurfaceCercle( Rayon as Single)

     SurfaceCercle= 3.14*Rayon*Rayon

     Exit Function

End Function
Ici on utilise le nom de la fonction pour retourner le résultat , avec un signe '='.

Utilisez plutôt la méthode Return.

Exit Function permet aussi de sortir de la fonction, cela a le même effet que Return sauf que Return peut être suivi d'un argument de retour (et pas Exit Function).


III-C-7. Module standard :

La sub AfficheSurfaceCercle affiche le résultat dans le formulaire où elle est située.

Par contre la fonction SurfaceCercle est d'intérêt général, n'importe quelle procédure doit pouvoir l'appeler, de plus elle n'intervient pas sur les contrôles des formulaires et n'est donc pas liée aux formulaires.

On la placera donc dans un module standard qui est un module du programme qui ne contient que du code. (Pas d'interface utilisateur)

Pour créer un module standard Menu Projet>Ajouter un module.

Y mettre les procédures.


III-C-8. Private Public :

Avant le mot Sub ou Function on peut ajouter :

Private indiquant que la procédure est accessible uniquement dans le module.

C'est donc une procédure privée.

Les procédures liées aux évènements d'une feuille sont privées par défaut.

Public indiquant que la procédure est accessible à partir de toute l'application.

S'il n'y a rien devant Sub la procédure est publique


III-C-9. Remarques :

  1. Pour sortir d'une procédure Sub avant la fin, utiliser Exit Sub (Exit Function pour une fonction).
  2. Quand vous appelez une procédure, il faut toujours mettre des parenthèses même s'il n'y a pas de paramètres.
    
    FrmSplash.ShowDialog ()
    
    Eventuellement on peut faire précéder l'appel du mot clé Call, mais ce n'est pas obligatoire.
    
    Call FrmSplash.ShowDialog ()
    
  3. Quand vous créez une procédure utilisez "la casse Pascal" pour créer les noms de routine:
    la première lettre de chaque mot est une majuscule (C'est donc une convention).
    
    Sub CalculTotal()
    

III-C-10. Lexique anglais=>Français:

Call = Appel.

Return= Retour.

Private= Privé.

Show= spectacle, exposition.

To show= montrer.


III-D. Les modules


III-D-1. Qu'est ce qu'un module?

On a vu qu'un programme est décomposé en modules, chaque module contenant des procédures.

Chaque module correspond physiquement à un fichier '.vb'.

Il existe
  • les modules de formulaire.
  • les modules standards.
  • les modules de 'Classe'.
Comment se présentent-ils?

Un programme Visual Basic comporte donc :
  • Les 'Modules de Formulaires':
    contenant:

    Le dessin des fenêtres de l'interface utilisateur (ou formulaire)contenant les contrôles (boutons, listes, zones de texte, cases à cocher…)

    Le code qui comprend :

    Les procédures liées aux événements de la feuille (Button_Click..)

    Les procédures indépendantes des événements. Ce sont des Sub() ou des Function().

    
    Class Form1            'Nom du Formulaire
    
       Inherits System.Windows.Forms
    
        Public A as String
    
        ....
    
     Private Button1_Click 'Procédure liée à un évènement
    
     ..
    
     End Sub
    
     
    
     Sub MaRoutine         'Procédure indépendante
    
     ...
    
     End Sub
    
    End Class
    
  • Les modules standards.
    Ils servent de stockage de procédures. Procédures "d'intérêt général".

    Ces procédures sont des Sub() ou des Function() qui peuvent être appelées à partir de n'importe quel endroit (pourvu qu'elles soient 'Public').

    Ils peuvent aussi servir à déclarer les objets ou déclarer les variables 'Public' qui seront utilisées donc accessibles par la totalité du programme.

    Exemple:
    
    Module Module1        'Nom du Module
    
        Public A as String
    
        ....
    
     Sub MaRoutine        'Procédure indépendante
    
     ....
    
     End Sub
    
    End Module
    
  • les modules de Classe
    Ils ont vocation à fabriquer des objets, on verra cela plus loin (chapitre 5).

    Exemple:
    
    Class MaClasse            'Nom de la Classe
    
        Public A as String
    
        ....
    
    End Class
    
warning On remarque que les Class, formulaires, Modules, Sub, Functions sont délimités par:
Une ligne de début comportant le type et le nom du module.
Une ligne de fin contenant End et le Type.
Exemple:

Module Module1        'Nom du Module

...

End Module

 

Sub MaRoutine        'Procédure

 ....

End Sub

III-D-2. Comment créer un module standard:

Faire Menu Projet>Ajouter un module. Donner un nom au module. C'est Module1.vb par défaut.

Module Module1        'Nom du Module

...

End Module
On remarque que le module est bien enregistré dans un fichier .vb

Un module standard ne contient que du code.

Comment ajouter une Sub dans un module Standard?

Taper Sub Calcul puis valider, cela donne:

Sub Calcul()

End Sub
Voir exemple d'utilisation de procédures et de modules:3-29


III-D-3. Lexique anglais=>Français:

Return = Retour.


III-E. Notion de programmation 'fonctionnelle' et de programmation 'objet'

Il y a deux manières de travailler en VB.NET:
  • En programmation 'Fonctionnelle':
    Chaque problème est décomposé en 'Fonctions'(Les Subs et Fonctions).

    la programmation structurée découpe les problèmes en fonctions ( Sub et Function)., ce découpage s'il est systématiquement employé aboutit à la programmation fonctionnelle qui consiste en un emboîtement de fonctions que l'on peut voir comme des « boîtes noires » que l'on peut imbriquer les unes dans les autres. Chaque fonction contient du code VB qui permet d'effectuer le travail dévolu à la fonction.

    Ces fonctions sont stockées dans des modules standards (ou dans les modules de formulaire).

    C'est cette approche qui est privilégiée jusqu'aux chapitres 4-..

    Dans une application en programmation 'fonctionnelle' il y a habituellement:

    Des modules de formulaires.

    Des modules standard contenant des Sub et Function.

  • En programmation 'Objet':
    On le verra dans les chapitres 5-..: on crée ses propres objets dans des modules de Classe, on utilise les membres (propriétés et méthodes) de ces objets pour programmer.

    Dans une application en programmation 'Objet' il y a habituellement:

    Des modules de formulaires.

    Des modules de classe permettent de créer des Objets.

    Grâce aux Classes (qui contiennent le code, on crée des objets.

    Ensuite on utilise les propriétés et méthodes des objets.

info De toutes façon, dans les 2 cas, que se soit dans des Sub ou des Classes, on utilise du code Visual Basic.
La mode est à la programmation Objet!!

Voir le chapitre 5-10 pour approfondir ces notions.

En fait, on peut mélanger les 2.


IV. Environnement de développement: les IDE.


IV-A. IDE Visual Studio 2003 ( Microsoft )

C'est l'IDE (Integrated Development Environment): Environnement de développement intégré de Visual Studio de Microsoft 2003 en français.


IV-A-1. Fenêtre Projet.

Quand on lance VB.net, le logiciel présente une fenêtre Projets qui permet:

d'ouvrir un projet existant

ou

de créer un nouveau projet:

Pour un projet Visual Basic normal, il faudra choisir dans les projets Visual Basic 'Application Windows'.

Puis il faut donner un nom au projet, modifier si nécessaire le chemin de l'emplacement du projet qui est par défaut ' C:\Documents and Settings\Nom Utilisateur\Mes documents\Visual Studio Projects' enfin valider sur 'Ok'.


IV-A-2. Dans un nouveau projet, créer une fenêtre :

Pour ajouter un fenêtre (un formulaire) Menu Projet, Ajouter un formulaire Windows,

cliquer sur Windows Form, une fenêtre 'Form1' apparaît ('Form2' pour la seconde feuille).

La zone de travail se trouve au centre de l'écran: C'est l'onglet Form1.vb[Design] ci-dessous qui donne donc accès au dessin de la feuille (du formulaire); on peut ajouter des contrôles, modifier la taille de ces contrôles..


IV-A-3. Voir les procédures:

L'onglet Form1.vb donne accès aux procédures liées à Form1.

La liste déroulante de gauche donne la liste des objets, celle de droite, les évènements correspondants.

info Il est possible en double-cliquant dans le formulaire ou un contrôle de se retrouver directement dans le code de la procédure correspondant à cet objet.

IV-A-4. Ajouter des contrôles à la feuille

Ajouter un bouton par exemple:

Cliquer sur 'Boite à Outils' à gauche , bouton Windows Forms, puis sur 'Button',cliquer dans la Form, déplacer le curseur sans lâcher le bouton, puis lâcher le bouton :

Un bouton apparaît.


IV-A-5. Modifier les propriétés d'un contrôle ou du formulaire.

Quand un formulaire ou un contrôle est sélectionné dans la fenêtre Design, ses propriétés sont accessibles dans la fenêtre de propriétés à droite en bas:

Ici ce sont les propriétés du contrôle 'Button1' (BackColor, Image, Texte..)

(on peut les modifier directement.)


IV-A-6. Voir tous les composants d'un projet:

Pour cela il faut utiliser L'explorateur de solution en haut à droite, il permet de voir et d'avoir accès au contenu du projet:

Form2.vb qui est un formulaire (une fenêtre).

Module1.vb qui est un module standard.

Références qui contient les espaces de nom.

AssemblyInfo: info nécessaire pour créer un installateur.

Il suffit de cliquer sur la ligne module1.vb dans l'explorateur de solution pour voir apparaître le module et son code dans la fenêtre principale.

Si on clique sur un espace de noms dans la liste Références, cela ouvre la fenêtre Explorateur d'objet qui montre l'arborescence des Classes et une description sommaire en bas de la fenêtre.


IV-A-7. Tester son logiciel:

On peut tester le projet grâce à : lancer l'exécution avec le premier bouton (mode 'Run', le second servant à arrêter temporairement l'exécution (mode 'Debug'), le troisième à terminer l'exécution (Retour au mode 'Design' ou 'Conception').

Quand on est en arrêt temporaire en mode 'Debug', la ligne courante, celle qui va être effectuée, est en jaune:

For i=0 To 100

 Label1.Text=i.ToString

Next i
Si on tape la touche F10 (exécution pas à pas), la ligne 'Label1.Text=i.ToString' est traitée et la position courante passe à la ligne en dessous.

For i=0 To 100

 Label1.Text=i.ToString

Next i
La sauvegarde du projet se fait comme dans tous les logiciels en cliquant sur l'icône du paquet de disquettes.


IV-A-8. Projet et solutions.

Dans la terminologie VB, un projet est une application en cours de développement.

Une solution regroupe un ou plusieurs projets (C'est un groupe de projets).


IV-A-9. Fichiers, Chemins des sources.

Si vous regardez les fichiers correspondant à un projet VB, les extensions sont:

.vbproj est le fichier de projet.

.sln est le fichier solution.

.vb sont tous les fichiers Visual Basic (Feuille module...)

Les sources sont par défaut dans ' C:\Documents and Settings\NomUtilisateur\Mes documents\Visual Studio Projects\nom projet'

Si on compile le projet l'exécutable est dans un sous répertoire \Bin


IV-A-10. VB propose des AIDES.

Quand on tape du code, VB affiche, quand il le peut, des aides:
  • VB permet de choisir dans une liste une des propriétés d'un objet.
    Exemple: Si je crée une variable chaîne de caractères (Dim Chaine As String , on verra cela plus loin), et que je tape le nom de la variable suivi d'un point: 'Chaîne.' la liste des méthodes possibles s'affiche.

    Chaine.

    Quand je pointe dans la liste un des membres (propriété ou méthode) un carré jaune affiche la définition de la fonction avec ses paramètres et une explication.

  • VB aide à retrouver les paramètres d'une fonction:
    Si on tape le nom d'une fonction et ( , VB affiche les paramètres possibles dans un cadre.

    En plus il affiche les différentes manières d'utiliser les paramètres (les différentes signatures), on peut les faire défiler avec les petites flèches du cadre jaune.

  • VB aide à compléter des mots.
    Si je tape App puis sur le bouton 'A->', Vb affiche la liste des mots commençant pas App
    
    AppActivate
    AppDomain
    

IV-A-11. Il existe une abondante documentation:

  • VB donne accès à l'aide sur un mot Clé. Si le curseur passe sur un mot clé, un carré affiche la définition de la fonction. Si je clique sur un mot et que je tape F1 l'aide s'ouvre et un long texte donne toutes les explications.
  • VB donne accès à l'aide sur les contrôles. Si le curseur est sur un contrôle et que je tape F1 l'aide s'ouvre pour donner accès à la description des différents membres de cet objet.
  • L'aide dynamique est constamment mise à jour. Pour la voir, il faut cliquer sur l'onglet 'Aide Dynamique' en bas à droite (même fenêtre que la fenêtre propriété). Elle donne une liste de liens en rapport avec le contexte en cours.
  • Enfin il est toujours possible de rechercher des informations en passant par les 3 onglets de la fenêtre en haut à droite.
    • Sommaire (plan , arbre de l'aide)
    • Index (liste des mots)
    • Recherche (rechercher un mot)
(Ici on vient de décrire l'aide interne; on peut paramétrer le logiciel pour avoir l'aide externe c'est à dire que l'aide s'affiche dans une fenêtre externe à l'ide, cela allége les fenêtres et onglets de l'IDE.)


IV-A-12. Erreur.

S'il existe une erreur dans le code au cours de la conception, celle-ci est soulignée en bleu ondulé. Un carré donne la cause de l'erreur si le curseur passe sur la zone ou se trouve l'erreur.

Ici la propriété 'Text' a été mal orthographiée.

Si je lance le programme en mode 'Run' et qu'il y a des erreurs, Vb me le signale et répertorie les erreurs dans la liste des taches en bas.


IV-A-13. Mode déboguage (mode BREAK):

Une fois lancée l'exécution (F5), puis stoppée (Ctrl +Alt +Pause), on peut:

Voir la valeur d'une propriété d'un objet en la sélectionnant avec la souris:

Il s'affiche un petit cadre donnant la valeur de la propriété d'un objet.

Voir la valeur d'une variable, simplement en positionnant le curseur sur cette variable.

Par défaut on ne peut pas modifier le code en mode Break.

On peut l'autoriser en passant par les menus Outils/Options/Déboguage/Modifier&continuer, activer 'M'autoriser à modifier des fichiers vb durant le déboguage' mais la modification n'est pas prise en compte sauf si on relance le programme!!!

F11 permet l'exécution pas à pas (y compris des procédures appelées)

F10 permet le pas à pas (sans détailler les procédures appelées)

Maj+F11 exécute jusqu'à la fin de la procédure en cours.

En cliquant sur le bouton droit de la souris, on peut afficher ou définir l'instruction suivante, exécuter jusqu'au curseur, voir la définition de ce qui est sous le curseur (La définition, c'est l'instruction ou une variable à été déclarée par exemple).

On peut grâce au menu déboguage puis Fenêtre ouvrir les fenêtres:

Automatique, qui affiche les valeurs des variables de l'instruction en cours et des instructions voisines.

Immédiat où il est possible de taper des instructions ou expressions pour les exécuter ou voir des valeurs.

Espions permettant d'afficher le contenu de variables ou d'expressions.

Espions Express permet d'afficher la valeur de l'expression sélectionnée.

Points d'arrêts permet de modifier les propriétés des points d'arrêts. on peut mettre un point d'arrêt en cliquant dans la marge grise à gauche: l'instruction correspondante s'affiche en marron et l'exécution s'arrêtera sur cette ligne.

Me affiche les données du module en cours.

Variables locales affiche les variables locales.

Modules affiche les dll ou .exe utilisés.

Mémoire, Pile d'appels, Thread, Registres, Code Machine permettent d'étudier le fonctionnement du programme à un niveau plus spécialisé et technique.

Il est possible de mettre des points d'arrêt, des espions pour arrêter l'exécution et suivre la valeur de certaines expressions. (voir traiter les erreurs)

voir déboguage pour plus d'information.


IV-B. IDE Visual Studio 2005 ( Microsoft )

C'est l'Integrated Development Environment (IDE): Environnement de développement intégré de Visual Studio de Microsoft 2005

Il y a Visual Studio 2005 et pour les débutants :'Edition Express' (version légère GRATUITE):

Différences entre les versions. Que permet la version Express GRATUITE?

Télécharger VB Express 2005 GRATUIT à vie. Télécharger le Service Pack 1 (SP1) New



voir aussi Nouveautés de VS 2005

Voir la vidéo sur l'IDE 2005 au format 'Flash': ou au format AVI

(En flash, il y a un arrêt au milieu: patientez. En Avi ne pas tenir compte des avertissements qui déclarent que le fichier n'est pas valide)


IV-B-1. Fenêtre Projet.

Quand on lance VB.net 2005 , le logiciel présente une Page de démarrage "Start Page" qui permet:

d'ouvrir un projet existant Ouvrir (Recent Projects ou Open)

ou

de créer un nouveau projet:Créer (Create)

Pour créer un projet Visual Basic normal (WinForms), il faudra choisir 'Creer'. La fenêtre suivante s'ouvre:

Choisir l'icône 'Application Windows', puis donner un nom au projet, enfin valider sur 'Ok'.

(Le chemin de l'emplacement du projet n'est pas modifiable ici, il est par défaut ' C:\Documents and Settings\Nom Utilisateur\Mes documents\Visual Studio 2005\ Projects\MonProjet')


IV-B-2. Dans un nouveau projet, créer ou ajouter une fenêtre :

Pour ajouter un fenêtre (un formulaire) Menu Project,Ajouter un formulaire Windows ( Add a WindowsForms ):

cliquer sur Windows Form, une fenêtre (un formulaire) ‘Form2' vide apparaît ('Form1' était le nom du premier formulaire).

Il y a des fenêtres toutes faites pour accélérer le travail (les templates) comme les 'Ecran de démarrage' les 'Formulaire Explorateur'...

La zone de travail se trouve au centre de l'écran: C'est l'onglet Form1.vb[Design] ci-dessous qui donne donc accès au dessin de la feuille (du formulaire); on peut ajouter des contrôles, modifier la taille de ces contrôles..

On peut passer en mode 'Multidocument Mdi' (comme en VB6) au lieu du mode 'Onglet':

(Passer par le menu 'Outils' puis 'Options..' puis bouton 'Multidocument (Mdi)')

Exemple en mode Mdi montrant les 3 types de module.

A noter que si on utilise le menu 'Projet' puis 'Ajouter..' la box de droite ci-dessus permet d'ajouter un formulaire, un module standard, un module de Classe.


IV-B-3. Voir les procédures:

L'onglet Form1.vb donne accès aux procédures liées à Form1.

La liste déroulante de gauche donne la liste des objets, celle de droite, les évènements correspondants.

info Il est possible en double-cliquant dans le formulaire ou un contrôle de se retrouver directement dans le code de la procédure correspondant à cet objet.
Ici on voit la procédure Button1_Click liée au Button1 de la fenêtre de Design.


IV-B-4. Ajouter des contrôles à la feuille

Ajouter un bouton par exemple:

Cliquer sur ‘Toolbox'(Boite à outils) à gauche , les contrôles apparaissent tous ou classés par catégories grâce au bouton 'All Windows Forms'(Tous les Windows Forms),

Cliquer sur ‘Button',cliquer dans la Form, déplacer le curseur sans lâcher le bouton, puis lâcher le bouton :

Un bouton apparaît.


IV-B-5. Modifier les propriétés d'un contrôle ou du formulaire.

Quand un formulaire ou un contrôle est sélectionné dans la fenêtre Design, ses propriétés sont accessibles dans la fenêtre de 'Propriétés' (Properties) à droite en bas:

Ici ce sont les propriétés du contrôle 'Button1' (Text, Location..)

(on peut modifier directement les valeurs.)

Dessous, il y a une explication succincte de la propriété sélectionnée (Si elle n'apparaît pas , faire sur la propriété: click droit puis dans le menu 'Description').

Le déplacement des contrôles ou l'accès aux principales tâches est facile:

La croix à gauche permet de déplacer le contrôle, la petite flèche à droite permet d'ouvrir un menu qui donne accès aux tâches les plus fréquentes.

L'alignement automatique des contrôles:

Si on modifie la taille ou l'emplacement d'un contrôle, VB signale par un trait bleu que le contrôle modifié et le contrôle voisin sont alignés:

Renommer un nom: modification automatique.

On nomme cela 'Refactoring': Cliquer sur une variable, puis bouton droit, dans le menu cliquer sur 'Renommer'. Modifier le nom de la variable, valider. Dans toute la Classe la variable est renommée.


IV-B-6. Voir tous les composants d'un projet:

Pour cela il faut utiliser la fenêtre Explorateur de solutions en haut à droite, elle permet de voir et d'avoir accès au contenu du projet (Pour voir tous les fichiers, il faut cliquer sur le deuxième bouton en haut) :

gridview est le nom du programme.

MyProjet: double-cliquer dessus, vous ouvrirez la fenêtre 'propriétés du projet'.

Références qui contient les dll chargées. Pour atteindre les références, on peut aussi passer par le menu 'Projet' puis 'Propriétés' ou double cliquer sur 'MyProjet' puis choisir l'onglet 'Références.

Form1.vb est un formulaire (une fenêtre).Les formulaires, modules de classe ou standard sont tous des '.vb' Il suffit de double-cliquer dessus pour les ouvrir.

Si on ouvre la sous-liste de Form1.vb (en cliquant su le '+'), on voit:

Form1.Designer.vb (qui montre le code qui crée le formulaire, on n'a pas à y toucher)

Form1.resx (le fichier de ressources)

Il suffit de cliquer sur la ligne Form1 dans l'explorateur de solution pour voir apparaître la Form1 dans la fenêtre principale.

Si on clique sur un espace de noms dans la liste Références, cela montre l'arborescence des Classes .


IV-B-7. Tester son logiciel:

On peut tester le projet grâce à : lancer l'exécution avec le premier bouton (mode 'Run', le second servant à arrêter temporairement l'exécution (mode 'Debug'), le troisième à terminer l'exécution (Retour au mode 'Design' ou 'Conception').

Quand on est en arrêt temporaire en mode 'Debug', la ligne courante, celle qui va être effectuée, est en jaune:

For i=0 To 100

 Label1.Text=i.ToString

Next i
Si on tape la touche F10 (exécution pas à pas), la ligne 'Label1.Text=i.ToString' est traitée et la position courante passe à la ligne en dessous.

For i=0 To 100

 Label1.Text=i.ToString

Next i
Il y a maintenant le 'Edit and continue': en mode Debug, on peut modifier une ligne et poursuivre le programme qui tiendra compte de la modification (Sauf pour les déclarations).

La sauvegarde du projet se fait comme dans tous les logiciels en cliquant sur l'icône du paquet de disquettes.

On peut compiler le programme pour créer un exécutable par le menu Générer ('Build')


IV-B-8. Projet et solutions.

Dans la terminologie VB, un projet est une application en cours de développement.

Un Team Project regroupe un ou plusieurs projets (C'est un groupe de projets). Il n'y en a pas dans la version express.


IV-B-9. Fichiers, Chemins des sources.

Si vous regardez dans ' C:\Documents and Settings\Nom Utilisateur\Mes documents\Visual Studio 2005\ Projects\MonProjet')les fichiers correspondant à un projet VB:

MonProjet.sln est le fichier solution.

MonProjet.psess est le fichier de performance.

MonProjet.suo est le fichier de User solution.

Dessous existe un répertoire nommé aussi MonProjet qui contient:

	MonProjet.vbProj
Form1.vb contient les procédures.

Form1.Designer.vb contient le code qui créer la fenêtre et les contrôles.

Si on compile le projet l'exécutable est dans un sous répertoire \Bin, il y a aussi un répertoire Obj


IV-B-10. VB propose des AIDES.

Quand on tape du code, VB affiche, des aides:
  • VB permet de choisir dans une liste une des propriétés d'un objet.
Exemple: Je tape le nom d'un label nommé label1 puis je tape un point, cela me donne la liste des propriétés du label.

Quand je pointe dans la liste un des membres (propriété ou méthode) un carré jaune affiche la définition de la fonction avec ses paramètres et une explication.

  • VB aide à retrouver les paramètres d'une fonction:
Si on tape le nom d'une fonction et ( , VB affiche les paramètres possibles dans un cadre.

En plus il affiche les différentes manières d'utiliser les paramètres (les différentes signatures), on peut les faire défiler avec les petites flèches du cadre jaune.

  • VB aide à compléter des mots.
    Si je tape App puis sur le bouton 'A->', Vb affiche la liste des mots commençant pas App


AppActivate

AppDomain
  • VB fournit des exemples de code.
    Les Snippets (bride, morceau de code) permettent d'insérer du code tout fait.

Exemple comment récupérer le dessin de l'écran? en français puis en anglais l'exemple!!

Dans le code d'une procédure, le click droit de la souris ouvre un menu.

Cliquer sur Insérer un extrait (Insert Snipper).

Cela affiche:

Choisir Windows Operating System :

Puis 'Copy the Active Windows or the Screen to the Clipboard'

On obtient le code suivant:

' Copy the active window.

SendKeys.SendWait("{PRTSC}")

System.Threading.Thread.Sleep(1000)

Dim window As Bitmap

window = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap)

' Copy the entire screen.

SendKeys.SendWait("+{PRTSC}")

System.Threading.Thread.Sleep(1000)

Dim screen As Bitmap

screen = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap)
Génial!!

  • Vb propose des solutions pour corriger les erreurs de code:
Si je veux afficher une valeur numérique (avec option Strict=On),il y a erreur, VB me propose la correction:


IV-B-11. Il existe une abondante documentation:

  • VB donne accès à l'aide sur un mot Clé. Si le curseur passe sur un mot clé, un carré affiche la définition de la fonction. Si je clique sur un mot et que je tape F1 l'aide s'ouvre et un long texte donne toutes les explications.
  • VB donne accès à l'aide sur les contrôles. Si le curseur est sur un contrôle et que je tape F1 l'aide s'ouvre pour donner accès à la description des différents membres de cet objet.
  • Enfin il est toujours possible de rechercher des informations
    1. Sommaire (plan , arbre de l'aide)
    2. Index (liste des mots)
    3. Recherche (rechercher un mot)

IV-B-12. Erreur.

S'il existe une erreur dans le code au cours de la conception, celle-ci est soulignée en bleu ondulé. Un carré donne la cause de l'erreur si le curseur passe sur la zone ou se trouve l'erreur.

Ici la propriété 'Text' a été mal orthographiée.

Si je lance le programme en mode 'Run' et qu'il y a des erreurs, Vb me le signale et répertorie les erreurs dans la liste des taches en bas. Vb propose des solutions pour corriger les erreurs de code. (Voir plus haut)


IV-B-13. Mode débogage (mode BREAK):

Une fois lancée l'exécution (F5), puis stoppée (Ctrl +Alt +Pause), on peut:

Voir la valeur d'une propriété d'un objet en le pointant avec la souris:

Il s'affiche un petit cadre donnant la valeur de la propriété d'un objet.

Voir la valeur d'une variable, simplement en positionnant le curseur sur cette variable.

F11 permet l'exécution pas à pas (y compris des procédures appelées)

F10 permet le pas à pas (sans détailler les procédures appelées)

Maj+F11 exécute jusqu'à la fin de la procédure en cours.

En cliquant sur le bouton droit de la souris, on peut exécuter jusqu'au curseur (Run To Cursor), voir la définition, la déclaration de ce qui est sous le curseur (Atteinte la définition:Go To Definition)...

On peut grâce au menu 'Affichage' on peut avoir accès à plein de choses :


IV-B-14. Projet Designer:

Toutes les propriétés de l'application peuvent être modifiées dans le 'Projet Designer' (Propriétés du projet), pour l'atteindre, il faut double-cliquer sur 'My Project' dans l'explorateur de solution:

Une autre manière d'ouvrir le 'Projet Designer' est de passer par les menus 'Projet' puis 'Propriétés de..'

On retrouve dans le projet designer:
  • Le nom de l'application, son icône, la fenêtre de démarrage, celle de fin. (Application)
  • Les Option Strict, Explicit.(Compiler)
  • Les références (dll liées au projet)
  • Les paramètres (valeurs liées à l'application)
  • Les ressources (texte, images, sons utilisées dans le programme)
  • La signature et la sécurité.
  • Les paramètres relatifs à la publication (distribution et installation)

IV-B-15. Conclusion:

IDE totalement fantastique, mais code beaucoup plus lent: voir les comparatifs dans le chapitre sur la vitesse. C'est comme d'habitude: le passage d'une version VB à la suivante sur une même machine entraîne un ralentissement notable du code compensé par l'accélération des machines.


IV-C. VB.NET 2005 Nouveautés 2005

Différences entre les versions. Que permet la version Express GRATUITE par rapport aux autres?

Télécharger VB Express 2005 GRATUIT à vie.

Télécharger sql Server 2005 Express

Télécharger le Service Pack 1 (SP1) New

Développer en VB 2005 pour Vista (Framework 3) New


IV-C-1. Le matériel:

Support des plateformes 64 bits.(Pas dans la version Express)

Support du 'multi monitor'


IV-C-2. L'IDE


IV-C-2-a. On peut créer des fenêtres toutes faites, avec les contrôles..:

Il y a des fenêtres toutes faites pour accélérer le travail (les templates) comme les 'AboutBox' les 'Explorer Form'...


IV-C-2-b. Edit and Continue:

Il y a maintenant le 'Edit and continue': en mode Debug, on peut modifier une ligne et poursuivre le programme qui tiendra compte de la modification (Sauf pour les déclarations).


IV-C-2-c. Il y a des exemples de code.

Les Snippets (bride, morceau de code) permettent d'insérer du code tout fait.

Dans le code d'une procédure, le click droit de la souris ouvre un menu. Cliquer sur Insérer un extrait (Insert Snipper) puis double-cliquer sur la rubrique que vous cherchez.

On obtient le code suivant:

' Copy the active window.

SendKeys.SendWait("{PRTSC}")

System.Threading.Thread.Sleep(1000)

Dim window As Bitmap

window = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap)

' Copy the entire screen.

SendKeys.SendWait("+{PRTSC}")

System.Threading.Thread.Sleep(1000)

Dim screen As Bitmap

screen = CType(Clipboard.GetDataObject().GetData("Bitmap"), Bitmap)
Génial!!


IV-C-2-d. Il est proposé des solutions pour corriger les erreurs de code:

Une fenêtre vous indique les corrections à faire.

Si je veux afficher une valeur numérique (avec option Strict=On),il y a erreur, VB me propose la correction:


IV-C-2-e. Le Projet Designer:

Toutes les propriétés de l'application peuvent être modifiées dans le 'Projet Designer', il est directement accessible dans l'explorateur de solution (My Projet)ou par le menu Affichage-> Page de propriétés:

Le nom de l'application , son icône,

Le formulaire de démarrage (startUp Form),

L'écran de démarrage (Splash Screen), il suffit d'indiquer son nom (VB l'affiche et le fait disparaître quand le formulaire de démarrage s'ouvre).

Le mode d'arrêt de l'application: A la fermeture du formulaire de démarrage ou lorsque tous les formulaires sont fermés.

Les Option Strict, Explicit.(Onglet Compiler)

On peut utiliser aussi les paramètres (Settings), et les ressources....


IV-C-2-e-i. a- Exemple de ressource.
Onglet 'Ressources' , créons une ressource nommée 'toto' et contenant '2' (c'est une string)

Pour l'utiliser dans le programme, on fera:

My.Resources.toto

Les ressources sont en Read-Only.

On vient de créer une ressource 'chaines' mais en déroulant la liste en haut à gauche , on voit qu'il y a des ressources Image, Icône, Audi, Fichier, Autre.


IV-C-2-e-ii. b- Exemple de paramètre.
Onglet 'Paramètres' , créons un paramètre nommé 'Para1' et contenant '1' (c'est une string)

Pour l'utiliser dans le programme, on fera:

My.Parametre.Para1

Les Paramètres sont en Read-Only si la portée est 'Application', et en Read-Write si la portée est 'Utilisateur'.

Ces 'variables paramètres utilisateur' ont des valeurs qui seront conservées et enregistrées automatiquement dans l' 'environnement' d'un utilisateur. Si on en modifie la valeur, on retrouve la valeur modifiée lors d'une utilisation ultérieure ce qui permet de conserver les habitudes des utilisateurs.


IV-C-2-f. Pour l'utiliser dans le programme, on fera:

Si on modifie la taille ou l'emplacement d'un contrôle, VB signale par un trait bleu que le contrôle modifié et le contrôle voisin sont alignés:

Voir les exemples???????????????????????????????????????????????????


IV-C-2-g. Le déplacement des contrôles ou l'accès aux principales tâches est amélioré:

La croix à gauche permet de déplacer le contrôle, la petite flèche à droite permet d'ouvrir un menu qui donne accès aux tâches les plus fréquentes.


IV-C-2-h. Renommer un nom: modification automatique.

On nomme cela 'Refactoring': Cliquer sur une variable, puis bouton droit, dans le menu cliquer sur 'Renommer'. Modifier le nom de la variable, valider. Dans toute la Classe la variable est renommée.


IV-C-2-i. Commentaire en Xml

On peut ajouter des commentaires en xml

Exemple:

Pour une Sub: sur une ligne blanche au dessus de 'Sub', tapez "'''" (3 "'").

ou

Pour une variable: curseur sur la variable , bouton droit puis 'Insérer un commentaire' dans le menu.

Un bloc Xml <Summary> se crée automatiquement; Ajouter 'Fonction Calculant le total' entre les basiles <summary>

Quand ensuite on tape le nom de la Sub , le commentaire s'affiche. Pratique quand on travaille en equipe.

De plus Visual Basic génère automatiquement un fichier de documentation XML lorsque vous créez le projet. Ce fichier apparaît dans le répertoire de sortie de l'application sous le nom AssemblyName.xml.


IV-C-3. Les nouveaux Objets

My: le SUPER RACCOURCI.

My permet d'avoir accès rapidement à certaines fonctionnalités:

My.Application

Permet d'accéder rapidement aux propriétés de l'application en cours.

Vous pouvez ainsi récupérer des informations sur l'assembly, la culture (langue) de l'application.

MsgBox(My.Application.Culture.ToString) 'affiche 'fr-FR'

(My.Application.ChangeCulture 'permettra de changer la culture )

MsgBox(My.Application.Info.DirectoryPath) 'affiche le nom du répertoire ou est l'exécutable.

My.Application.SetCurrentUser() retourne l'utilisateur
My.Application.SetCurrentUser()
My.Application.OpenForms qui retourne les formulaires ouverts.
Exemple: rajouter le texte 'ouvert' à la barre de tache des formulaires ouverts:
For Each F As System.Windows.Forms.Form In My.Application.OpenForms
F.Text += "[ouvert]"
Next
My.Computer
Permet d'accéder aux propriétés de l'ordinateur, du hardware.
Aux ressources logicielles et/ou matérielles de l'ordinateur.
Audio : permet de jouer des fichiers wav, ainsi que les sons systèmes de windows.

My.Computer.Audio.Play("c:\mysound.wav")

Clipboard : permet de récupérer des informations sur le contenu du presse-papier, de récupérer et de définir son contenu.

If My.Computer.Clipboard.ContainsImage Then
    PictureBox1.Image = My.Computer.Clipboard.GetImage
ElseIf My.Computer.Clipboard.ContainsText Then
    TextBox1.Text = My.Computer.Clipboard.GetText
End If
Clock : permet de récupérer l'heure courante ainsi que le nombre de millisecondes écoulées depuis le démarrage.

MsgBox(My.Computer.Clock.LocalTime.ToString) 'Affiche date et heure

FileSystem : permet d'effectuer les opérations d'entrées/sorties standards.

Récupérer le nom des disques:

MsgBox(My.Computer.FileSystem.Drives.Item(0).ToString)'affiche 'A:'

(la collection Drives contient des items indiquant les disques)

Un répertoire existe t-il?

MsgBox(My.Computer.FileSystem.DirectoryExists("c:\").ToString) 'affiche True si c:\ existe.

Possibilité de copier, créer, effacer répertoires ou fichiers:

Exemple: copie d'un répertoire:

My.Computer.FileSystem.CopyDirectory(sourcedirectory, destinationdirectory)

Voir les sous répertoires:

FileSystem.GetDirectories("c:\").item(0) permet de voir le premier sous répertoire.

GetFiles fait de même avec les fichiers.

Mettre le contenu d'un fichier texte dans une variable:

Dim LeTexte As String = My.Computer.FileSystem.ReadAllText("c:\devicetable.log")
(Il existe aussi WriteAllText)

Info : Obtient des informations concernant l'ordinateur et le système d'exploitation (mémoire vive libre, nom de l'os, version de l'os, etc).

MsgBox(My.Computer.Info.TotalPhysicalMemory.ToString) 'affiche la mémoire physique

Il y a aussi AvailablePhysicalMemory, OSVersion, OSFullName..

Keyboard : permet de tester l'état des touches CTRL, ALT, etc… et de simuler l'appuie de touche grâce à la méthode Sendkeys.

MsgBox(My.Computer.Keyboard.AltKeyDown.ToString)' teste si la touche Alt est enfoncée.

My.Computer.Keyboard.SendKeys("a")' simule l'appuie d'une touche.

Mouse : permet de récupérer des informations sur la souris (présence de la souris, présence de molette, boutons inversés, etc.)

MsgBox(My.Computer.Mouse.WheelExists.ToString) 'affiche True s'il y a une molette.

Name : récupère le nom de l'ordinateur

MsgBox(My.Computer.Name.ToString)
Network : permet de télécharger et d'uploader des fichiers, de vérifier si l'ordinateur est connecté à Internet, d'effectuer des pings, et de récupérer les évènements lors des connexions et déconnexions.

Charger un fichier à partir du réseau:

My.Computer.Network.DownloadFile(AdresseCompleteFichierACharger, DestinationFileNane)

With My.Computer.Network
    If .IsAvailable And .Ping(txtIpAdress.text) Then
        .UploadFile("c:\filetupload.ext", txtIpAdress.Text)
    End If
End With
Ports : permet de récupérer la liste des ports séries, et de les ouvrir.

Printers : permet de récupérer la liste des imprimantes installées et de définir l'imprimante par défaut. (absent dans la version bêta)

Registry : permet de manipuler la base de registre facilement.

Screen : permet de récupérer les informations concernant les écrans installés.

My.User

Permet de récupérer les informations sur l'utilisateur courant.

My.User.Identity.Name

My.User.IsInRole("Administrators") 'contient l'administrateur

My.Ressources

Permet de manipuler et récupérer très facilement les ressources incorporées à l'assembly.

My.Setting
Fichiers de configuration.
My.Forms

Donne accès à tous les formulaires.

	My.Forms.HelpForm.Show()
My.WebService
Permet de manipuler directement les services web référencés dans le projet.

GZIPStreamClass

Permet d'enregistrer ou de lire des fichiers compressés au format zip .

Support du SMTP et du FTP


IV-C-4. Les instances de Forms:

En VB2003 il fallait instancier une Form avant de l'utiliser.

    Dim newForm1 As NewForm1
    newForm1.BackColor = System.Drawing.Color.Green
    newForm1.Show()
On peut toujours le faire en 2005 mais on peut aussi utiliser la Class Form1 sans instancier:

    Form1.ForeColor = System.Drawing.Color.Coral
    Form1.BackColor = System.Drawing.Color.Cyan
    Form1.Show()
Comme il n'y a pas d'instance de Form1, VB en crée une.


IV-C-5. Les nouveaux Contrôles


IV-C-5-a. DataGridView

Il remplace le DataGrid dans VB.Net 2005 Il est bien plus simple à utiliser surtout pour modifier directement la grille sans passer par un DataSet.

MyDataGridView.ColumnCount = 5 indique le nombre de colonne.

MyDataGridView.Columns(0).Name = "Date" met un texte dans le haut de la colonne.

MyDataGridView.Rows.Add(t) 'Ajout de ligne; t est un tableau de 5 strings.

MyDataGridView.CurrentCell est la cellule courante (CurrentCellAdress contient les numéro de ligne et colonne)

MyDataGridView.EditMode = DataGridViewEditMode.EditOnEnter autorise de modifier les cellules.


IV-C-5-b. MaskedTextBox

Permettant d'utiliser un masque pour la saisie de caractères. Le masque indique quels caractères interdire ou permettre.

La propriété Mask permet d'indiquer le masque de saisie.

On peut la modifier en mode 'Design' :

On voit bien dans la fenêtre ci dessus: le masque '00:00' permet de saisir 2 groupes de 2 chiffres. L'utilisateur voit que qu'il y a dans l'aperçu '__:__' et est obligé de taper 2 chiffres puis 2 chiffres.

On peut utiliser des masques tout faits (Heure, date..) ou créer un masque personnalisé.

On peut aussi modifier le masque par code:

maskedTextBox1.Mask = "LL"
 
Pour le masque personnalisé on utilise:

0 Chiffre requis (lettres refusés) 
9 Chiffre ou espace optionnel. (lettres refusés) 
# Chiffre ou espace optionnel. (+) (-) sont permis. 
L Lettre requise. (chiffres refusés) 
? Lettre requise optionnelle. (chiffres refusés) 
& Caractère requis.(Chiffres et lettres permises)   
C Caractère, requis optionnel.(Chiffres et lettres permises %*& permis)  
A Alphanumérique requis opt.(Chiffres et lettres permises %*& refusés)  
. Point Decimal; celui de la culture. 
, Séparateur de millier; celui de la culture. 
: Séparateur de temps; celui de la culture. 
/ Séparateur de date; celui de la culture. 
$ Symbole monétaire; celui de la culture. 
< Convertir les caractères qui suivent en minuscule.  
>  Convertir les caractères qui suivent en majuscule. 
| Stop la conversion minuscule ou majuscule. 
\ Escape. Le caractère qui suit devient un littéral.\\” affichera '\'. 
Autres caractères Littéraux. Affichés tels quels

Exemple:

"00/00/0000" permet de saisir une date.

"LLL" permet de saisir trois lettres (pas des chiffres)

/ $ , : sont dépendant de la culture en cours:

Si le Mask="0$" il apparaîtra "_€ en culture française.

On peut modifier cela par FormatProvider property.

MaskCompleted indique si la saisie est conforme.

Dim returnValue As Boolean
returnValue = maskedTextBox1.MaskCompleted
MaskedTextBox1.text permet de lire le contenu du texte.

L'évènement le plus souvent utilisé est TextChanged

Private Sub MaTextBox_TextChanged(sender As Object, _ 
  e As EventArgs) Handles MaTextBox.TextChanged
End Sub 

IV-C-5-c. SoundPlayer

Pour écouter des sons .Wav


IV-C-5-d. SplitContainer:

Permettant de créer facilement une séparation déplaçable entre 2 zones.

On met le SplitContainer, dans les 2 zones on met par exemple 2 textbox. Il faut mettre la propriété Dock de ces 2 textbox à Fill.

En mode Run, cela marche : si je déplace la zone de séparation centrale, cela agrandit un textbox et diminue le second.

Margin indique la largeur de la séparation.

Orientation permet une séparation horizontale ou verticale.


IV-C-5-e. ListView


IV-C-5-f. WebBrowser:

Pour ouvrir une zone internet.


IV-C-5-g. LayoutPanel:

Permettent de positionner les contrôles dans une Form en conception.

FlowLayoutPanel: Place les contrôles à droite du précédent, passe 'à la ligne' si nécessaire, c'est génial pour créer plusieurs lignes de label, TextBox, Bouton:

TableLayoutPanel:On crée un tableau de panel, puis on met les contrôles dans les cellules:


IV-C-5-h. MenuStrip :

Remplace les MainMenu

On peut même mettre des images dans les menus. Il peut y avoir des combobox et des zones de texte.

Il y a aussi les ContextMenuStrip qui remplace les ContextMenu.


IV-C-5-i. ToolStrip:

Création de barre n'importe ou dans le formulaire.

Exemple de barre de menu comprenant:

Un bouton.

Un label

Un bouton déroulant un menu.

Un comboBox

Une zone texte

Une barre de progression.

Images possible dans les menus, il peut y avoir des séparateurs.


IV-C-5-j. StatuStrip:

Pour créer une barre d'état en bas d'un formulaire; remplace les StatusBar.

Peut contenir des LabelStrip (Label ou LinkLabel), des ProgressBar, DropDownButton et ToolsStripButton.


IV-C-5-k. ProgesBarr:

Idem le contrôle de 2003 avec des fonctionnalités en plus:

La propriété Style permet la progression par blocks, en continue, ou en oscillation droite gauche ( comme lors de l'ouverture de Windows XP.

Il y a aussi le toolstripcontainer et un contrôle permettant l'usage port série.


IV-C-6. Les nouvelles 'Variables'.

VB 2005 prend en charge les types non signés:

UInteger Entier codé sur 32 bits pouvant prendre les valeurs 0 à 4 294 967 295.

ULong Entier codé sur 64 bits :0 à 18 446 744 073 709 551 615

UShort Entier sur 16 bits 0 à 65 535.

et

SByte Codé sur 1 octet, valeur de -128 à 127


IV-C-7. Les nouvelles 'Collections'.

On peut utiliser des collections 'génériques'

System.Collections.Generic.List(Of String)
On peut ainsi créer des collections fortement typées.

Il y a en plus les Collections spécialisées (nouveau type de collection):

L'espace System.Collections.Specialized fournit ce nouveau type de collection:

Exemple: ListDictionary avec Clé et Valeur:

Dim l As New System.Collections.Specialized.ListDictionary

IV-C-8. Dans le Code: les nouvelles instructions

  • Continue dans une boucle Do While ou For permet de passer à l'itération suivante sans effectuer le code.
    While condition

    ..Continue While

    End While

    Continue For existe aussi.

  • IsNot simplifie l'écriture:
    If Not (Objet1 Is Nothing ) Then..

    devient

    If Objet1 IsNot Nothing Then

  • Using
    Permet de créer un bloc qui libère les ressources en fin de bloc:
    
        Using sqc As New System.Data.SqlClient.SqlConnection(s)
            MsgBox("Connected with string """ & sqc.ConnectionString & """")
        End Using
    
  • TryCast
    En plus de CType et de Cast, il y a maintenant TryCast qui retourne Nothing si la conversion est impossible.

  • Procédures avec paramètres différents.
    On peut 'overloader' une procédure afin de pouvoir l'appeler avec des paramètres différents.
    
    Overloads Sub LireEnregistrement(ByVal Name As String, ByVal amount As Single)
    
    ' Code permettant de rechercher l'enregistrement à partir du nom.
    
    End Sub
    
    Overloads Sub LireEnregistrement(ByVal Numero As Integer, ByVal amount As Single)
    
    ' Code permettant de rechercher l'enregistrement à partir du numéro
    
    End Sub
    

IV-C-9. Les nouveautés dans les Classes:

Les classes 'Partielles' sont possible.

Partial Class MaClasse

End Class
Ainsi une Classe peut être scindée en plusieurs parties situées dans des endroits différents du code.

On peut surcharger les opérateurs + - * / mais aussi _ ^ & Like And Or Xor Not < > = << >> Ctype IsTrue, IsFalse

Exemple: surchargeons l'opérateur +

Public Structure height
    ...
    Public Shared Operator +(ByVal h1 As height, ByVal h2 As height)As height
        Return New height(h1.feet + h2.feet, h1.inches + h2.inches)
    End Operator
End Structure
La routine doit être Shared, de plus si on surcharge certains opérateurs, il faut aussi surcharger leur inverse: si on surcharge '>' , il faut surcharger '<'.

Surcharge de IsTrue, IsFalse Ctype

Si on teste un boolean, il a la valeur True ou False.

Si par contre je crée une classe nommée 'Personne', je peux définir comment une instance sera considérée comme égale à True. Il faut surcharger l'opérateur IsTrue en lui indiquant dans quelle condition l'instance sera considérée comme =True:

Exemple:

J'ai une instance e de type Personne, si e.Present =True, dans ce cas je veux que e soit considéré comme True; il faut écrire dans la Classe 'personne':

Public Shared Operator IsTrue(ByVal e As Personne) As Boolean

If e Is Nothing Then

    Return False

Else

    Return e.Present

End If

End Operator
Pour définir l'opérateur IsFalse, c'est simple: c'est Not e

Public Shared Operator IsFalse(ByVal e As Personne) As Boolean

    Return Not e

End Operator
Ensuite je pourrais utiliser des instructions de la forme:

If e then.. 
Surcharge de Ctype:

Je peux définir dans une classe comment CType va fonctionner:

Pour cela dans la classe Personne, je vais définir les 3 possibilités:

Public Shared Widening Operator CType(ByVal e As Personne) As String

Return e.Nom + " " + e.Prenom

End Operator

 

Public Shared Widening Operator CType(ByVal  e As Personne) As Date

If e Is Nothing Then

    Return Nothing

Else

    Return e.DateDeNaissance

End If

End Operator

 

Public Shared Widening Operator CType(ByVal  e As Personne) As Boolean

    If e Is Nothing Then Return False Else Return e.Present

End Operator
Ainsi

Ctype(UnePersonne,String) retourne Nom Prenon

Ctype(UnePersonne,Date) retourne la date de naissance

Ctype(UnePersonne,Boolean) retourne True ou False.

On peut créer des Property avec une portée différente pour le Set et le Get:

Public Class employee
    Private salaryValue As Double
    Protected Property salary() As Double
        Get
            Return salaryValue
        End Get
        Private Set(ByVal value As Double)
            salaryValue = value
        End Set
    End Property
End Class
Utilisation des 'générics'

Un type 'generic' permet de créer une Classe ayant des Data Types non définis au départ.

Créons une classe MyClasse; Of permet d'indiquer le genéric:

Public Class MyClasse(Of t)
    Public Sub NewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class
On peut ensuite utiliser cette classe avec des Integer ou des String:

Public UneClass As New MyClasse(Of Integer)
Friend stringClass As New MyClasse(Of String)
voir la rubrique 'générique' pour le détails.


IV-D. IDE SharpDevelop (alternative gratuite) MAJ version 2.1)

C'est l'IDE (Integrated Development Environment): Environnement de développement intégré GRATUIT, alternative à VisualStudio.

Oui, vous pouvez faire du Visual Basic.Net gratuitement et légalement.

Depuis sa version 2 #develop est un très bon produit et n'a rien à envier à Visual Studio.

VB 2005 Express de Microsoft est gratuit; la prochaine version sera t-elle aussi gratuite?

#Develop sera toujours gratuit.

C'est un logiciel libre en Open Source (GPL), fonctionne officiellement sous Windows XP et 2000 (Pas officiellement sous ME et 98)

Il parait que SharpDevelop fonctionne sous Windows 98 (non testé, si vous avez essayé, m'en faire part), Millenium (testé), NT 4, Windows 2000 (testé) , XP (testé). Alors que Visual Studio ne fonctionne pas sur un PC non NT (exit Windows 98 et Millenium).


IV-D-1. Où le trouver? Comment l'installer?.

SharpDevelop 2.. et le FrameWork 2

Respecter l'ordre d'installation.
  1. Télécharger et installer le FrameWork. (impérativement en premier)
    Installer Microsoft .NET version 2 Redistibutable package.

    C'est le Framework (la couche logiciel entre l'application et le système), il est téléchargeable sur le Net sur le site Microsoft.

    Télécharger le FrameWork puis l'installer. (Gratuit)

    warning Attention, changer la langue (French) avant le téléchargement.
  2. Télécharger et installer le SDK 2.
    C'est le Kit de Développement Microsoft .NET Framework: SDK du Framework 2.

    En bas de la page précédente ou par le lien suivant:

    Télécharger le SDK (Gratuit) Attention, changer la langue (French).

  3. Télécharger et installez SharpDevelop 2.1 (beta3 le 2/2/2007)
    Télécharger SharpDevelop 2.1 (Gratuit)

    L'installer en exécutant le fichier 'SharpDevelop_2.1.0.2201_Setup.exe'.

  4. Configurer SharpDevelop
    Lancer Sharpdevelop 2.1

    Aller dans le menu 'Outils' - 'Options'

    La langue de l'utilisateur est 'French', si cela n'est pas le cas, modifier la langue.

    Dans 'Style visuel' : Choisir VBNET dans la liste.

    'Codage' : Éditer les en-têtes standard: VB.Net

    'Codage' : Modèle de code: extension '.vb

    'Editeur de texte' : Surlignement, VB.net dans la liste de gauche.

    Le Framework, le SDK et #develop suffisent pour faire des programmes.


IV-D-1-a. Quelques liens

Site SharpDevelop

Didacticiel sur #develop utilisant C# en anglais

WikiSharpDevelop (en anglais)

WikiDeboguage (en anglais)


IV-D-2. Fenêtre Projet.

Lancer SharpDevelop:

Au lancement de l'application, on peut :
  • ouvrir une solution existante: Bouton 'Ouvrir une solution' (ou cliquer sur le nom d'un projet récent en haut)
  • créer un nouveau projet (une nouvelle solution) .
Si l'on veut rajouter des fichiers à notre projet faire :
'Fichier'-'Ouvrir'-'Fichier' et catégorie VB

Détaillons la création d'un nouveau projet.

Bouton 'Nouvelle solution' ou

Menu 'fichier'-'Nouveau'-'Solution'

Sélectionner la catégorie 'VBNET' et choisir le type d'application à créer.(Dans le cas d'une création d'un projet Visual Basic, il faudra choisir dans les 'Modèles': Application Windows.) On remarque que #Develop permet aussi d'écrire du C#, du C++ du ILAsm un setup.

Puis il faut donner un nom au projet (il n'y a pas de nom par défaut), modifier si nécessaire le chemin de l'emplacement du projet qui est par défaut ' C:\Documents and Settings\NomUtilisateur\Mes documents\SharpDevelop Projects' ( cocher si nécessaire 'Créer le répertoire source') enfin valider sur le bouton 'Créer'. Une fenêtre 'MainForm' apparaît.

Si, comme dans notre exemple, on a tapé 'Prog2', #develop crée une 'solution' nommée 'SolutionProg2'(ensemble, groupe de projets) contenant un projet (Prog2) contenant un formulaire nommé 'MainForm'

L'écran principal se présente ainsi:

Au centre, sont visible les écrans du code et des formulaires ; on peut changer d'écran grâce aux onglets du haut. Ici on voit 'MainForm'.

A gauche, les onglets du bas donnent accès au projet en cours (les solutions, projets, formulaires, autres fichiers: ressources, assembly..) ou aux outils : Table ascii, Presse papier et surtout (si on a un formulaire au centre et non du code) aux objets (bouton, texteBox, ListBox...)

A droite, en bas , les classes et surtout la fenêtre de Propriétés (Name, Text..) de l'objet sélectionné au centre.

En bas les fenêtres de 'sortie' (affichage de la console) liste des 'erreurs' des 'taches', définitions', 'Résultat des recherches'..


IV-D-3. Dans un nouveau projet, créer une fenêtre :

Pour ajouter un fenêtre (un formulaire) ouvrir le gestionnaire de projet et solution (Onglets en bas à gauche), il donne le nom de la solution (solutionprog2) et du projet (prog2 ici) Cliquer avec le bouton droit sur prog2 puis dans les menus sur 'Ajouter', 'Nouveau fichier'. Cela ouvre la fenêtre 'Nouveau fichier'.

Dans la fenêtre qui s'ouvre , à gauche, choisir 'VB' puis 'Application Windows' , à droite 'Formulaire' , taper un nom de formulaire (Form1 par exemple)puis 'Créer' , une fenêtre ‘Form1' apparaît. La première fenêtre qui s'ouvre automatiquement quand on crée un projet se nomme 'MainForm'.

La zone de travail se trouve au centre de l'écran: On voit les onglets MainForm, Form1.vb pour chaque formulaire (fenêtre)

En bas les onglets 'Source' et 'Design' permettent de passer de l'affichage du code('Source') à la conception de l'interface utilisateur ('Design'): affichage de la fenêtre et de ses contrôles permettant de dessiner l'interface.


IV-D-4. Ajouter des contrôles au formulaire.

Ajoutons un bouton par exemple:

Cliquer sur l'onglet ‘Outils' à gauche en bas , bouton 'Windows Forms', puis sur ‘Button',cliquer dans la MainForm, déplacer le curseur sans lâcher le bouton, puis lâcher le bouton :


IV-D-5. Modifier les propriétés d'un contrôle ou du formulaire.

Quand une feuille ou un contrôle est sélectionné dans la fenêtre Design, ses propriétés sont accessibles dans la fenêtre de propriétés à droite en bas:(Si elles ne sont pas visible, cliquer sur l'onglet 'Propriètés' en bas ).

Ici ce sont les propriétés du contrôle 'Button1' (BackColor, Image, Texte..)

Un petit texte d'aide concernant la propriété en cours apparaît en bas.

(on peut modifier les propriétés directement.)


IV-D-6. Voir les procédures:

L'onglet 'Source' en bas donne accès aux procédures (au code) liées à Form1.

La combo déroutante de droite donne la liste des objets. Si on en choisit un, le pointeur va sur les procédures liées à cet objet.

Malheureusement, contrairement à Visual Studio, la combo de gauche ne contient que les formulaires et pas les objets. Par exemple, on aura MainForm, mais pas Label1... Du coup la recherche se fait directement dans la combo de droite et c'est forcément beaucoup moins clair dès qu'il y a beaucoup de contrôles sur un formulaire...

Il est possible en double-cliquant dans le formulaire ou sur un contrôle de se retrouver directement dans le code de la procédure correspondant à cet objet.

Si la procédure n'existe pas (ButtonClick par exemple),le fait de double-cliquer sur le bouton la crée.

Pour créer les autres procédures évènements, utiliser le bouton qui est sur la fenêtre des propriétés à droite, il fait apparaître la liste des évènements, double-cliquant sur un évènement cela permet d'ouvrir la fenêtre de code et de créer les procédures.


IV-D-7. Voir tous les composants d'un projet:

Pour cela il faut utiliser La fenêtre Projet à gauche (Si elles ne sont pas visible, cliquer sur l'onglet 'Propriètés' en bas), elles permettent de voir et d'avoir accès au contenu du projet:

le gestionnaire de projet et solution donne le nom de la solution (solutionprog2) et du projet (prog2 ici) Cliquer sur les '+' pour développer: vous verrez apparaître les formulaires, les modules.. et:

Références qui contient les espaces de nom.

Assembly: info nécessaire pour générer le projet..


IV-D-8. Remarque relative aux fenêtres de l'IDE:

Pour faire apparaître une fenêtre qui a disparu (fenêtre projet par exemple) utiliser le menu 'Affichage' puis 'projet'.

Quand le fenêtre est ancrée (accrochée aux bords), le fait de la déplacer avec sa barre de titre la 'dé ancre', et elle devient autonome.

Pour la 'ré ancrer', il faut double-cliquer dans sa barre de titre.


IV-D-9. Tester son logiciel:

On peut compiler le projet avec le premier bouton ci-dessous. Créer le projet avec le second. Lancer l'exécution avec le bouton flèche verte (débogueur actif), le point d'exclamation lance l'exécution sans débogage, le rond à droite (qui devient rouge pendant l'exécution) sert à terminer l'exécution.

La liste déroutante permet de choisir la configuration des fenêtres de l'IDE:

Défaut: c'est les fenêtres habituelles précédemment décrites.

Débogage: ouvre les fenêtres: variables locales, points d'arrêt, modules chargés..

Texte simple: uniquement les fenêtres centrales.

Editer: ouvre la fenêtre Edit Layout?

La sauvegarde du projet se fait comme dans tous les logiciels en cliquant sur l'icône du paquet de disquettes.


IV-D-10. Fichiers, Chemins des sources.

Avant, en #develop 1:

.prjx est le fichier de projet.

.cmbw est le fichier solution.

Avec Sharpdevelop 2 c'est comme en VB: les solutions sont maintenant des fichiers .sln

.vb sont tous les fichiers Visual Basic (Feuille module...)

Les sources sont par défaut dans ' C:\Documents and Settings\NomUtilisateur\Mes documents\SharpDevelop Projects'

Si on compile le projet l'exécutable est dans un sous répertoire \Bin\Debug ou \Bin\Realese

Si vous avez plusieurs versions du framework sur votre machine (version 1.0, version 1.1 voire version 2.0 Bêta), il vous est possible de choisir le compilateur dans les options du projet.

Visual Studio 2003 à version 1.1 du framework.

Visual Studio 2005 à version 2.0 du framework.


IV-D-11. Propriétés du projet.

Menu 'Projet', 'Option du projet' permet l'accès aux propriétés du projet en cours.

Le quatrième onglet (Compiler) est le plus intéressant:

On peut:

Compiler le programme en mode 'Debug' ou 'Release'.

Forcer le programmeur a travailler en Option Strict= On ( empêcher les conversions automatiques)

Option Explicit=On (Forcer la déclaration des variables)

Choisir le Framework avec lequel on travaille (1 ou 2, pas le trois encore)

...

Dans l'onglet Import, on peut importer des espaces de noms.


IV-D-12. #Develop propose des AIDES.

La fenêtre d'aide à droite donne accès à des aides:

De #develop en anglais, non à jour!!

Du Framework

De zipLib

Si vous avez installé le SDK (SDK Framework .Net et/ou SDK Direct X) , vous avez accès à l'aide (partie en haut à droite de l'écran) , et donc également à l'intellisense, qui affiche les propriétés, les méthodes des objets, les paramètres des fonctions, des types, … , des différents objets.

Ici par exemple on a tapé MessageBox. , la liste des membres (Equals, Show...) est affichée.


IV-D-13. Erreur de compilation :

Si on fait une faute dans le code, elle est détectée lorsque l'on lance l'exécution.

Ici on a tapé 'Texte' à la place de 'Text'.

La ligne en cause est soulignée en rouge et la fenêtre des erreurs située en bas s'ouvre, elle indique et décrit l'erreur:.

L'aide dynamique à droite propose des liens en rapport avec le contexte.


IV-D-14. Erreur d'exécution: Exceptions

Si il y a une erreur d'exécution (division par zéro par exemple), l'exécution s'arrête et la fenêtre d'exception s'ouvre:

On peut choisir d'arrêter le programme, de continuer, d'ignorer.


IV-D-15. Débogage :

Le deboguer est maintenant intégré dans la version 2.

Une fois l'exécution lancée, on peut:

Suspendre l'exécution par ALT+CTRL+B , reprendre par F6

Ajouter des points d'arrêt.

grâce à des points d'arrêt (pour définir un point d'arrêt en mode de conception, cliquez en face d'une ligne dans la marge grise, cela fait apparaître un rond et une ligne rouge. Quand le code est exécuté, il s'arrête sur cette ligne).

(Recliquer sur le rond pour l'enlever).

Ajouter des marques pages.

On peut ajouter des marques pages, en cliquant (quand on est sur la ligne à marquer) sur le petit carré bleu de la barre d'outils:

Ensuite, on peut se déplacer de marque en marque avec les 2 boutons qui suivent.

En mode 'Run', si on clique sur l'onglet 'Points d'arrêt' à droite, on voit la liste des points d'arrêt et des marques; on peut rendre inactif tous les points d'arrêt (3eme bouton) ou un seul en le décochant dans la liste.

Voir la valeur d'une variable, simplement en positionnant le curseur sur cette variable.

En plus en mode Run , la fenêtre 'Variables locales' située en bas affiche la valeur de toutes les variables de la procédure. (Y compris 'e' et 'sender' qui sont les paramètres de la Sub)

Enfin à droite on peut voir les modules chargés et les threads.

Exécution pas à pas:

F11 permet l'exécution pas à pas (y compris des procédures appelées)

F10 permet le pas à pas (sans détailler les procédures appelées)

Maj+F11 exécute jusqu'à la fin de la procédure en cours.

On peut aussi utiliser les boutons :

warning Attention, comme dans Visual Studio, il n'est pas possible de modifier les fichiers sources à partir du moment où vous avez démarré le débogage.
Fonctions présentes dans #develop 1 mais pour l'instant absente dans #develop 2: C++ NProf Wix NAnt, générateur de MessageBox

Créer un installateur.(en anglais)


IV-D-16. Conclusion:

Programme permettant de faire du VB.net gratuitement (rapport qualité/prix infiniment élevé).

CONCLUSION D'UN UTILISATEUR:

SharpDevelop est un IDE agréable à utiliser, pour le développement des programmes .NET, en mode WYSIWYG.

Il est possible d'atteindre un niveau de qualité équivalent à Visual Studio ou à Borland C# Builder en faisant une installation complète. Très ouvert, on peut lui rajouter des plugins. Certains programmes externes peuvent être utilisés également avec Visual Studio ou Borland C# Builder.

SharpDevelop est en perpétuelle évolution.

Un forum permet de déposer le descriptif des erreurs rencontrées mais également de vos demandes de modifications, si vous pensez à une évolution qu'il serait bien que SharpDevelop possède. En plus vous pouvez récupérer le code source et pouvez donc modifier à loisir l'IDE.

Bien sur, pour les débutants, il manque les assistants de Visual Studio (Crystal report, ADO .NET, …). Le problème avec les assistants est qu'une fois qu'on pratique un peu, ils deviennent vite un gêne, et souvent, il faut repasser derrière eux, pour enlever le superflu de code qu'ils ont écrit (souvent ils n'optimisent pas le code).

Il manque également la partie UML de Visual Studio Architecte, mais là on attaque le haut du panier des développeurs.

Par contre SharpDevelop apporte en plus:

Aide à la génération automatique des MessageBox
Aide à la conversion C# vers VB.NET et de VB.NET vers C#
Aide à la génération d'expression régulière.
Il fournit les logiciels:

NDoc : permet de faire des fichiers d'aide compilée au format MSDN, à partir de lignes commentées dans le code.
NUnits : permet de faire des tests unitaires (!).
SharpQuery : Permet de se connecter aux bases de données .

IV-D-17. J'ai besoin d'aide:

Comment créer facilement un installateur (SetUp) avec #develop?

Comment utiliser NDoc NUnits?

Comment utiliser simplement des ressources?

Comment utiliser des bases de données?

Qui utilise le menu 'Outils' et ses différentes options?

Merci à Fabrice SAGE pour son aide.

Merci à Hubert WENNEKES, CNRS Institut de Biologie de Lille pour son aide.

Remarque pour les forts:

On peut s'étonner qu'il n'y aie pas Handles Button1.Click à la fin de la ligne suivante (comme dans VB 2005)

Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)

End Sub
En fait si on va voir dans InitializeComponent, il y a un AddHandler après la description du bouton.

Private Sub InitializeComponent()

...

AddHandler Me.button1.Click, AddressOf Me.Button1Click

V. Langage Visual Basic


V-A. Introduction

Nous allons étudier:

Le langage Visual Basic.Net qui est utilisé dans les procédures.

Comme nous l'avons vu, le langage Visual Basic sert à
  • agir sur l'interface (Afficher un texte, ouvrir une fenêtre, remplir une liste, un tableau, poser une question).
    Exemple afficher 'Bonjour" dans un label:
    
    Label1.Text="Bonjour"
    
  • effectuer des calculs, des affectations en utilisant des variables.
    Exemple: Mettre da la variable B la valeur de A+1

    B=A+1

  • Faire des tests avec des structures de décision: évaluer des conditions des comparaisons et prendre des décisions.
    Exemple: SI A=1 ..
    
    If A=1 Then...End If
    
  • travailler en boucle pour effectuer une tache répétitive.
    Exemple faire 100 fois..
    
    For I=0 To 100... Next I
    
Tout le travail du programmeur est là.

Dans VB.Net nous avons à notre disposition 2 sortes de choses:


V-A-1. Les Classes du FrameWork

On travaille sur des objets en utilisant leurs propriétés, leurs méthodes.

Il existe des milliers de 'Classes': les plus utilisées sont les classes String (permettant de travailler sur des chaînes de caractères), Math (permettant d'utiliser des fonctions mathématiques), Forms (permettant l'usage de formulaire, de fenêtre et donnant accès aux contrôles: bouton, case à cocher, liste..)

Elles sont communes à tous les langages utilisant le FrameWork.

Ces Classes ont de multiples méthodes (rappel de la syntaxe: Classe.Methode)

Exemple d'utilisation de la Class TextBox (contrôle contenant du texte) et de sa méthode Text:

TextBox1.Text="Hello" ‘Affiche "Hello" dans le textbox.


V-A-2. Les instructions de Microsoft.VisualBasic

(Un autre constituant de Visual Basic, et de lui seul).

Il s'agit d'instructions, de mots clé qui ont la même syntaxe qu'en VB6 mais qui sont du VB.Net.

Exemple:

A = Mid(MaString, 1, 3) 'Mid retourne une partie de la chaîne de caractères.

Il y a aussi les Classes de compatibilité VB6. Elles ne dépayseront pas ceux qui viennent des versions antérieures de VB car elles reprennent la syntaxe utilisée dans VB6 et émulent les fonctions VB6 qui ont disparues de VB.Net.

Ajoute à VB.Net des fonctions VB6. L'outils d'import automatique de VB6 vers VB.Net en met beaucoup dans le code. Il faut à mon avis éviter de les utiliser car ce n'est pas vraiment du VB. Ce cours 'pur' VB.Net n'en contient pas.

Pour le moment cela peut paraître un peu compliqué, mais ne vous inquiétez pas, cela va devenir clair.


V-A-2-a. Saisir, Afficher.

Dans l'étude du langage VB, on s'occupe du code, on ne s'occupe pas de l'interface (les fenêtres, les boutons, l'affichage du texte...), mais parfois, on a besoin

  • de saisir une valeur, pour cela on utilise une InputBox, c'est une boite qui s'ouvre,l'utilisateur y tape un texte puis il clique sur 'ok'; on retrouve ce qu'il a tapé dans la variable Réponse.
Réponse= InputBox()

  • d'afficher des résultats, pour le moment on affichera du texte de la manière suivante:
dans une fenêtre, dans des TextBox: TextBox1.Text="TextBox1"


ou un label: Label1.Text="Résultat"

ou

sur la console: Consol.Out.WriteLine ("Résultat")

ou

dans une Boite de message: MsgBox("Voulez vous continuer?")



V-B. Les 'Algorithmes'.


V-B-1. A- Pour écrire un programme.

Pour écrire un programme, aller du problème à résoudre à un programme exécutable, il faut passer par les phases suivantes:
  • Analyse du cahier des charges.
    Il doit être clair, exhaustif, structuré.

  • Analyse générale du problème.
    Il existe des méthodes pour professionnels (MERISE, JACKSON..), nous utiliserons plutôt l'analyse fonctionnelle: Le problème global est découpé en sous problèmes nommés fonctions. Chaque fonction ne contient plus qu'une partie du problème. Si une fonction est encore trop complexe, on itère le processus par de nouvelles fonctions à un niveau plus bas.

    Cela se nomme la 'Conception structurée descendante'. La 'Conception ascendante' existe aussi: en assemblant des fonctions préexistantes, on résout le problème: attention, il faut que les fonctions préexistantes soient cohérentes. (Pour le moment on ne fait pas de programmation objet)

  • Analyse détaillée.
    Chaque fonction est mise en forme, la logique de la fonction est écrite dans un pseudo langage (ou pseudo code) détaillant le fonctionnement de la fonction. Ce pseudo code est universel , il comporte des mots du langage courant ainsi que des mots relatifs aux structures de contrôle retrouvées dans tous les langages de programmation.

  • Codage.
    Traduction du pseudo code dans le langage que vous utilisez.

  • Test
    Car il faut que le programme soit valide.


Exemple simpliste:
  • Analyse du cahier des charges.
    Création d'un programme affichant les tables de multiplication, d'addition, de soustraction.

  • Analyse générale du problème.
    Découpons le programme en diverses fonctions:

    Il faut créer une fonction 'Choix de l'opération', une fonction 'Choix de la table', une fonction 'TabledeMultiplication', une fonction 'TabledAddition', une fonction 'Affiche'...

  • Analyse détaillée.
    Détaillons la fonction 'TabledeMultiplication'

    Elle devra traiter successivement (pour la table des 7 par exemple)

    1X7
    2X7
    3X7..

    Voici l'algorithme en pseudo code.
    
    Début
    
        Pour i allant de 1 à 10
    
            Ecrire (i*7)
    
        Fin Pour
    
    Fin 
    
  • Codage.
    Traduction du pseudo code en Visual Basic, en respectant la syntaxe du VB.
    
    Sub MultiplicationPar7
    
    Dim i As Integer
    
    For i=1 to 10
    
        Call Affiche(i*7)
    
    next i.
    
    End Sub
    
  • Test
    Ici il suffit de lancer le programme pour voir si il marche bien..

Pour des programmes complexes, il existe d'autres méthodes.


V-B-2. B- Définition de l'algorithme.

Un problème est traitable par informatique si :
  • on peut parfaitement définir les données (entrées) et les résultats (sorties),
  • on peut décomposer le passage de ces données vers ces résultats en une suite d'opérations élémentaires exécutables.
idea L'algorithme détaille, en pseudo code, le fonctionnement de ce passage et en décrit la logique.
L'algorithme est une succession de tests, décisions et actions dans le but de décrire le comportement d'une entité (objet, programme, personne). Définition du Dicodunet.

Etudions cette logique valable pour tous les langages de programmation (ceux qui sont des langages impératifs):

Pour représenter n'importe quel algorithme, il faut disposer des trois possibilités suivantes:
  • la séquence qui indique que les opérations doivent être exécutées les unes après les autres.
  • le choix qui indique quelles instructions doivent être exécutées en fonction de circonstances.
  • la répétition qui indique que des instructions doivent être exécutées plusieurs fois.
Exemple d'algorithme principalement composé d'une répétition:

Pour i allant de 1 à 10
        Ecrire (i*7)
Fin Pour
Voyons cela en détails:


V-B-3. C- Principe généraux

Le langage algorithmique et son pseudo-code n'est pas vraiment standardisé, chacun l'écrit à sa manière, aussi vous verrez des notations différentes dans les divers cours d'algorithme. Cela n'a pas d'importance car un programme en pseudo-code ne sera jamais exécuté sur une machine.

L'intérêt de d'étude des algorithmes est didactique: elle permet de comprendre la logique d'un programme totalement indépendamment du langage: ce qui suit est valable en C++, Delphi, Java, Visual Basic, Assembleur...


V-B-3-a. Séquences

Au sein d'un programme, la structure est généralement séquentielle.

Le code est fait d'une succession de lignes (ou instructions) qui seront lues et traitées les unes après les autres.

Instruction 1

Instruction 2

Instruction 3

..

En VB on peut mettre plusieurs instructions sur la même ligne séparées par ":"

Instruction1 : Instruction2


V-B-3-b. Les variables, leur 'Type':

Elles contiennent les informations les données nécessaires au déroulement du programme (C'est le même sens qu'en mathématique, a la différence qu'en informatique une variable ne contient qu'une valeur).

Chaque variable a un Nom (identifiant) et un Type. Ce dernier indique la nature de l'information que l'on souhaite mettre dans la variable:

Un type indique:

Les valeurs que peut prendre la variable.

Les opérations possibles.

Exemple: un Type 'Entier' (Integer en VB) correspond au valeur entière, positive ou négative, les opérations possibles sont l'addition, la soustraction, la multiplication...

La nature, le type peut être:

Type numérique:

'Entier', 'réel'.. (Integer, Single en VB) Exemple d'un entier: 123

Type alphanumérique:

'Caractère' (Char en VB) contient 1 caractère Exemple d'un caractère: 'a' (avec des guillemets)

'Chaîne de caractères',(String en VB), contient plusieurs caractères. Exemple: 'toto' (avec des guillemets)

Autres Type:

Booléen (Boolean en VB) ne peut contenir que 'Vrai' ou 'Faux'

Objet. (Object en VB)

Monétaire (Décimal en VB)

Date (Date en VB)

A partir des types précédents on peut créer des types complexes (ou structurés):

Les tableaux (Array)

Les Collections.

Exemple: la variable nommée 'Total' contient un réel dans un programme de comptabilité.

on remarque qu'il ne faut pas confondre 1 qui est une valeur numérique( sans guillemets) et "1" qui est le caractère '1' (avec des guillemets).

Utilisation des variables:

Les variables numériques serviront à faire des calculs:

Les variables alphanumériques serviront entre autres à afficher du texte:

Comment afficher les résultats de calcul?

On apprendra à transformer des variables numériques en variables alphanumériques.

Pour utiliser une variable, il faut qu'elle existe, il faut donc la créer, on dit il faut la déclarer:

Dans un algorithme: Variable A en Numérique 'crée une variable nommée A et de Type Numérique.

En VB: Dim A As Integer 'crée une variable nommée A et de Type Integer.

On peut aussi initialiser une variable c'est à dire définir sa valeur initiale.

On peut utiliser un littéral: c'est une donnée utilisée directement.

X <- 2 veut dire: donner à la valeur X la valeur 2 ( 2 est une littéral)


V-B-3-c. Affectation ( ou Assignation):

C'est une instruction consistant à donner une valeur à une variable.

En langage algorithmique on l'indique par '<-'

X <- 2 veut dire: donner à la valeur X la valeur 2 ( 2 est une littéral)

Z <- X veut dire: donner à la variable Z la valeur de la variable X .

Z <- X+1 veut dire: donner à la variable Z la valeur de la variable X à laquelle on ajoute 1 (Z prendra la valeur 2+1 =3).

Cela revient à évaluer l'expression de droite et à en mettre la valeur dans la variable de gauche.

En VB le signe d'affectation est '=' on écrit donc:

Z=X+1

warning Attention ce n'est pas le même sens qu'en mathématique.
Exemple Visual Basic: A=B


warning Attention ce n'est pas une égalité mais une affectation.
L'affectation ne marche que si le type de variable est le même:

Variable A en Numérique

Variable B en Numérique

B<-12

A<-B 'fonction B contient 12, on met 12 dans A

Variable A en Numérique

Variable B en Alphanumérique

B<-'toto'

A<-B 'ne fonctionne pas car on tente de mettre le contenue de B qui est alphanumérique dans une variable numérique.

L'affectation sert à effectuer des calculs:

Variable A en Numérique

A<-3+4-2 'L'expression à droite est évaluée et son résultat est affecté à la variable A.

Ici les + - sont des opérateurs; il y en a d'autres: * (multiplier) / (diviser)....


V-B-3-d. Booléens

On a parfois besoin de savoir si une assertion est vraie ou Fausse.(True ou False)

Pour stocker une information de ce type, on utilise une variable de type booléen. Une variable de ce type ne peut contenir que True ou False.

Le terme booléen vient de "l'algèbre de Boole", cette algèbre ne travaille que sur les valeurs 1 ou 0 (True ou False)

Soit B une variable booléenne:

On peut écrire B<-True (B=True en VB)

On peut aussi tester cette variable:

Si B=False alors (If B=False Then.. en VB)

L'expression après Si est évaluée, si elle est vraie 'alors' se produit.

Autre exemple:

Si C=2 alors.. (If C=2 Then ..en VB)

L'expression C=2 est évaluée, si C est effectivement égal à 2, C=2 est évalué et prend la valeur True; dans ce cas le programme se poursuit après Then.

si C est différent de 2, C=2 est évalué et prend la valeur False; dans ce cas le programme ne se poursuit pas après Then.


V-B-3-e. Les choix: Si..Alors

Le programme doit pouvoir choisir parmi deux ou plusieurs possibilités en fonction d'une condition :


Si Condition Alors

      Action 1

Sinon

      Action 2

Fin Si
Si Condition est vraie Action 1 est effectuée, sinon Action 2 est effectué.

Parfois il n'y a pas de seconde branche :

Si Condition Alors

      Action 1

Fin Si
ou sur une seule ligne:

Si Condition Alors Action 1

Il peut y avoir plusieurs conditions imbriquées :

Si Condition 1 Alors

      Si Condition 2 Alors

            Action 1

Sinon

            Action 2

Fin Si

Sinon

      Action 3

Fin Si
Noter bien le retrait des lignes de la seconde condition afin de bien visualiser la logique du programme :

Action 2 est effectuée si la Condition 1 est remplie et la Condition 2 n'est pas remplie.

En VB cela correspond à l'instruction IF THEN

If Condition 1 Then

      Action 1

Else

      Action 2

End If
Remarque sur les conditions

Une condition contient 2 valeurs et un opérateur:

Si C>2 Alors est correcte.

Si B=3 Alors est correcte.

Si 2<B<7 Alors est incorrecte car il y a 2 opérateurs, il faut dans ce cas utiliser plusieurs conditions et des opérateurs logiques:

Si B>2 Et B<7 Alors est correct (If B>2 And B<7 Then en Visual Basic)

La condition est évaluée:

Exemple : Soit l'expression Si C>2 Alors , elle sera évaluée; si C contient 3, C>2 est vérifié donc Vrai.

Exemple: Trouver le plus grand nombre entre x et y et le mettre dans max

Variable x en Numerique

Variable y en Numerique

Variable max en Numerique

Si x>y Alors

    max<-x

Sinon

    Max<-y

Fin Si
En VB

Dim x As Integer

Dim y As Integer

DIm max As Integer

if x>y Then

    max=x

else

    max=y

End if

V-B-3-f. Les choix: Décider entre :

Il est parfois nécessaire d'effectuer un choix parmi plusieurs solutions :


Décider Entre

      Quand Condition 1 Alors

            Action 1

      FinQuand

 

      Quand Condition 2 Alors

            Action 2

      FinQuand

      ..

      ..

      Autrement

            Action 4

      FinAutrement

FinDécider
Si la condition 1 est remplie Action 1 est effectuée puis le programme saute après FinDécider.

Si la condition 1 n'est pas remplie, on teste la condition 2..

Si aucune condition n'est remplie on saute à Autrement, on effectue Action 4.

On pourrait aussi parler de sélection :

Sélectionner.

      Le cas : condition 1

            Action 1

      Le cas : condition 2

            Action 2

      ..

      Les autres cas

FinSélectionner
En VB cela correspond à

Select Case Valeur

      Case condition 1

            Action 1

      Case condition 2

            Action 2

      ..

      Case Else

            Action 4

End Select
Si Valeur=Condition 1 Action 1 est effectuée,si Valeur=Condition 2 Action 2 est effectuée...


V-B-3-g. Les répétitions: Pour...Répéter

Permet de répéter une séquence un nombre de fois déterminé :

Le cas le plus classique est :

Pour I variant de 0 à N Répéter

      Action

FinRépéter
I prend la valeur 0, 'Action' est effectuée,

puis I prend la valeur 1, Action est effectuée,

puis I prend la valeur 2..

cela jusqu'à N

La boucle tourne N+1 fois (car ici on commence à 0 )

Cela se nomme une itération.

Intérêts?

Au lieu de faire

Afficher (1*7)

Afficher (2*7)

Afficher (3*7)

Afficher (4*7)

...

on remarque qu'un élément prend successivement la valeur 1, 2, 3, ..

Une boucle peut faire l'itération:

Pour i allant de 1 à 10 Répéter

    Affiche (i*7)

Fin répéter
La variable dite 'de boucle' prend bien les valeurs 1 puis 2 puis 3.. ; elle est utilisée dans le corps de la boucle.

Une instruction Sortir permet de sortir prématurément de la boucle.

En VB

For i=0 To N

      ..

Next i
L'instruction Exit For permet de sortir prématurément de la boucle.

On peut aussi boucler en parcourant tous les éléments d'une collection.

(Une collection est une liste d'objets, liste de taille variable en fonction de ce qu'on ajoute ou enlève.)

Pour Chaque élément de la liste

      Action

Fin Pour
En VB :

For eachIn

 

Next

V-B-3-h. Les répétitions: Tant que :

Permet de faire une boucle sans connaître le nombre d'itérations à l'avance.


Tant Que Condition

      Action

Fin Tant Que
L'action qui est dans la boucle doit modifier la condition afin qu'à un moment ‘Tant que' ne soit pas vérifié et que l'on sorte de la boucle. Sinon la boucle tourne sans fin.

Pour plus cadrer avec la réalité :

Faire tant que condition

      Action

Boucler
En VB :

Do while Condition

      Action

Loop
Il existe une boucle équivalente :

Répéter

      Action

Jusqu'à Condition

 

En VB :

Do

      Action

Loop Until Condition
Une instruction Exit Do permet de sortir prématurément de la boucle.


V-B-3-i. Structuration: 'Sous-programme' ou 'procédure':

On a déjà vu cette notion.

Quand on appelle une procédure, le logiciel ‘saute' à la procédure, il effectue celle-ci puis revient effectuer ce qui suit l'appel.

Et VB les sous-programmes (ou procédures) sont des Sub ou des Function. Pour appeler une procédure on utilise Call NomProcedure() ou NomProcedure()

Le programme effectuera les instructions 1, 2, 3, 10, 11, 4, 5.

Une opération complexe peut être découpée en plusieurs procédures ou sous-programmes plus petits et plus simples qui seront appelés.

Chaque procédure résout un problème .

On peut fournir aux procédures des paramètres, ce sont des variables qui seront transmises à la procédure.

Exemple:

Création d'une Procédure 'MaProcédure' recevant 2 paramètres:

Sub MaProcédure(paramètre1, paramètre2)

..

End Sub
Exemple d'appel de la procédure 'Maprocédure' en envoyant 2 paramètres:

Call MaProcédure(premierparamètre, secondparamètre)

Exemple : si j'écris Call MaProcédure(2,3)

dans la procédure MaProcédure paramètre1=2 et paramètre2=3.

Il est nécessaire de définir le type des paramètres:

Sub MaProcédure(paramètre1 As Integer, paramètre2 As Integer) indique que la procédure attend 2 entiers.

Il y a 2 manières d'envoyer des paramètres :

Par valeur : (By Val)c'est la valeur, le contenu de la variable qui est envoyé.

Par référence :(By Ref) c'est l'adresse (le lieu physique où se trouve la variable) qui est envoyée. Si la Sub modifie la variable, cette modification sera visible dans la procédure appelante après le retour.

Parfois on a besoin que la procédure appelée retourne une valeur dans ce cas il faut créer une fonction:

Function MaFonction()  As Integer    'MaFonction qui retourne un entier

..

    Return Valeur

End Function
Pour appeler la fonction:

ValeurRetournée=MaFonction()

Donc ValeurRetournée est aussi un entier

Exemple de fonction: créer une fonction qui retourne le plus petit nombre:

Fonction Minimum (x en Numerique, y en Numérique) en numérique

Si x<y Alors

    Retourner x

Sinon

    Retourner y

Fin Si

Fin Fonction
Pour l'utiliser:

Variable Min en Numerique

Min<-Minimum (5,7) 'Appelle la fonction en donnant les 2 paramètres 5 et 7.

Min contient maintenant 5
En Vb

Function Minimum(x As Integer, y As Integer) As Integer

    If x<y Then

        Return x

    Else

        Return y

    End If

End Function
Pour l'utiliser:

Dim min As Integer

Min= Minimum (5,7)
La fonction résout un problème et plus précisément à partir de données, calcule et fournit un résultat.


V-B-3-j. Tableaux

Un tableau de variables permet de stocker plusieurs variables de même type sous un même nom de variable, chaque élément étant repéré par un index ou indice.

C'est une suite finie d'éléments.

Soit un tableau A de 4 éléments

3
12
4
0
Pour accéder à un élément il faut utiliser l'indice de cet élément.

L'élément d'index 0 se nomme A[0] et contient la valeur 3.

On remarque que le premier élément est l'élément d'index 0 (ZERO).

L'élément d'index 1 se nomme A[1] et contient la valeur 12.

Quand on crée un tableau, il a un nombre d'éléments bien défini: 4 dans notre exemple d'index 0 à 3.

Pour donner une valeur à un des éléments , on affecte la valeur à l'élément.

A[2] <- 4
Pour lire une valeur dans un tableau et l'affecter à une variable x:

x <- A[2]
Traduction en VB

A(2)=4

x = A(2)
Pour parcourir tous les éléments d'un tableau on utilise une boucle:

Exemple: afficher tous les éléments du tableau tab qui contient n éléments.

début
          Pour i allant de 0 à n-1 Répéter
              écrire(tab[i])
          Fin Répéter
fin
En VB:

       For i=0 to n-1

            Affiche ( tab(i))    'routine d'affichage

       Next i 
Il existe des tableaux multidimensionnels avec plusieurs index:

Voyons les index de chaque élément:

B(0,0) B(0,1) B(0,2)
B(1,0) B(1,1) B(1,2)
B(1,2) B(2,1) B(2,2)
B[1,0] désigne l'élément rouge (ligne 2, colonne 1).

Voyons par exemple,le contenu de chaque élément:

3 12 0
18 4 5
12 2 8
Ici B[1,0] =18


V-B-3-k. Notion de 'Collection':

Une collection permet de stocker plusieurs variables ou objets, chaque élément étant repéré par un index ou indice.

Soit la collection Col, au départ elle est vide.

J'ajoute des éléments (ou items) à cette collection.

Col.Ajouter ("Toto")

Voici la collection:

Toto
La collection a maintenant 1 élément.

Col.Ajouter("Lulu")

Col.Ajouter("Titi")
Toto
Lulu
Titi
La collection a 3 éléments maintenant.

Col.Retirer(2) enlève l'élément numéro 2

Toto
Titi
La collection n'a plus que 2 éléments maintenant.

On voit que le nombre d'éléments n'est pas connu à l'avance, il varie en fonction des éléments ajoutés (ou retirés)

Un élément est repéré par un indice.

En VB

Col.Add    'Ajoute un élément

Col.Remove 'Enlève une élément
Il existe des collections avec des clés permettant de retrouver la valeur d'un élément rapidement.


V-B-3-l. Erreur d'exécution: Notion de 'Sécurisation' du code:

Des instructions doivent protéger certaines parties du code afin d'éviter d'effectuer des opérations incohérentes.

Si l'utilisateur entre 2 nombres X et Y et qu'une instruction exécute Z<=X/Y , alors que Y=0 ,la division par 0 n'existant, le logiciel 'plante': Il s'arrête et donne un code d'erreur( du genre 'Erreur division par 0 interdite')

Il s'agit d'une 'Erreur d'exécution'.

En VB on dit 'lever une exception'.

Il appartient au programmeur, une fois l'algorithme écrit, de le sécuriser: Des instructions doivent protéger certaines parties du code afin d'éviter d'effectuer des opérations incohérentes.

On ajoute donc un choix: si Y est différent de 0 alors on effectue la division.

Si Y<>0 Alors

    Z<=X/Y

Sinon

...

Fin Si

V-B-3-m. Flag et variables d'état.

Un Flag (ou drapeau) est une variable utilisée pour enregistrer un état, la valeur de cet état servant à déclencher ou non des actions. C'est une manière de retenir qu'un évènement s'est produit.

Si le drapeau est abaissé, les voitures roulent..

Exemple: Utiliser un Flag pour sortir d'une boucle:

On utilise flagSortir.

flagSortir=Faux 

Tant que  flagSortir =Faux

      Si on doit sortir de la boucle, on met la valeur de flagSortir à Vrai

Boucler
En VB:

flagSortir=Faux 

Do while flagSortir =Vrai

     ' Si on doit sortir de la boucle, on met la valeur de flagSortir à Vrai

Loop
Tant que flagSortir =Faux la boucle tourne.

On peut généraliser cette notion en parlant de variable d'état.

Un variable d'état sert à décrire l'état du programme.

Exemple:

fileIsOpen est une variable indiquant si un fichier est ouvert ou fermé.


V-B-4. D -Quelques algorithmes.


V-B-4-a. Recherche dans un tableau

Soit un tableau A() de 4 éléments

3
12
4
0
Je veux parcourir le tableau pour savoir s'il contient le chiffre '4'.

Il faut faire une itération afin de balayer le tableau: la variable dite de boucle ( I ) va prendre successivement les valeurs: 0 ,1 ,2 ,3. (Attention: dans un tableau de 4 éléments, l'index des éléments est 0,1,2,3)

Pour I variant de 0 à 3 Répéter

      ..

FinRépéter
Dans la boucle il faut tester si la valeur de l'élément du tableau est bien la valeur cherchée.

Pour I variant de 0 à 3 Répéter

      Si A(I)= 4 Alors..

FinRépéter
Si on a trouvé la bonne valeur, on met un flag (drapeau) à Vrai.

flagTrouvé<-Faux

Pour I variant de 0 à 3 Répéter

      Si A(I)= 4 Alors flagTrouvé<-Vrai

FinRépéter
Ainsi si après la boucle flagTrouvé= Vrai, cela veut dire que le chiffre 4 est dans le tableau.

En VB

flagTrouve=False

For I=0 To 4

    If A(I)=4 Then flagTrouve=True

Next I

V-B-4-b. Tri de tableau

Pour trier un tableau de chaînes de caractères (des prénoms par exemple), il faut comparer 2 chaînes contiguës, si la première est supérieure (c'est à dire après l'autre sur le plan alphabétique: "Bruno" est supérieur à "Alice"))on inverse les 2 chaînes, sinon on n'inverse pas. Puis on recommence sur 2 autres chaînes en balayant le tableau jusqu'à ce qu'il soit trié.

Tableau non trié:

Bruno
Alice
Agathe
On compare les lignes 1 et 2, on inverse

Alice
Bruno
Agathe
On compare les lignes 2 et 3, on inverse

Alice
Agathe
Bruno
Le tableau n'étant pas encore trié, on recommence:

On compare les lignes 1 et 2, on inverse

Alice
Agathe
Bruno
On compare les lignes 2 et 3, on n'inverse pas.

Le tableau est trié.

Tout l'art des routines de tri est de faire le moins de comparaisons possible pour trier le plus vite possible.

On a utilisé ici le Bubble Sort (ou tri à bulle); on le nomme ainsi car l'élément plus grand remonte progressivement au fur et à mesure jusqu'au début du tableau comme une bulle. ("Agathe" est passé de la troisième à la seconde puis à la première position).

Une boucle externe allant de 1 à la fin du tableau balaye le tableau N fois ( La boucle varie de 0 à N-1), une seconde boucle interne balaye aussi le tableau et compare 2 élément contigus (les éléments d'index j et j+1)et les inverse si nécessaire. La boucle interne fait remonter 1 élément vers le début du tableau, la boucle externe le fait N fois pour remonter tous les éléments.

Pour i allant de 0 à N-1

    Pour j allant de 0 à N-1

        Si T(j)>T(j+1) Alors 

            Temp<-T(j) 

            T(j)<-T(j+1)

            T(j+1)<-Temp

        Fin Si

    Fin Pour

 Fin Pour
En Visual Basic:

Dim i, j , N  As Integer    'Variable de boucle i, j ; N= nombre d'éléments-1

Dim Temp  As String

N=4  'tableau de 5 éléments.

Dim T(N) As String  'élément de 0 à 4

For i=0 To N-1

    For j=0 To N-1

        If T(j)>T(j+1) then 

            Temp=T(j): T(j)=T(j+1):T(j+1)=Temp

        End if

    Next j

 Next i
info Remarque: pour inverser le contenue de 2 variables, on doit écrire
Temp=T(j): T(j)=T(j+1):T(j+1)=Temp (L'instruction qui faisait cela en VB6 et qui se nommait Swap n'existe plus)

Cet algorithme de tri peut être optimisé, on verra cela plus loin.

Les algorithmes s'occupent aussi de décrire la manière de rechercher des données dans des tableaux, de compresser des données... Nous verrons cela au fur et à mesure.


V-B-5. Lexique anglais=>Français:

If = Si.

Then= Alors

Step=Pas

Do (To)= faire

While= tant que

Until= Jusqu'à ce que.

Loop= boucle


V-C. L'affectation.

C'est l'instruction la plus utilisée en programmation.

On peut aussi utiliser le terme 'Assignation' à la place de l'affectation.

Variable=Expression est une affectation.

Elle transfère le résultat de l'expression située à droite du signe 'égal' dans la variable (ou la propriété) à gauche du signe égal.

Exemple:

A=B est une affectation (ou assignation.)

A=B affecte la valeur de la variable B à la variable A, la valeur de B est mise dans A.


Si

A=0

B=12

A=B entraîne que A=12 (B n'est pas modifié)

Si nécessaire l'expression à droite du signe = est évaluée, calculée avant d'être affectée à la variable de gauche.

Si

A=0

B=12

A=B+2 entraîne que A=14

L'affectation permet donc de faire des calculs :

Si nombrdHeure=100 et tauxHoraire=8

paye= nombredHeure * tauxhoraire

paye prend la valeur 800 (notez que '*' , l'étoile veut dire : multiplication.)

warning Attention dans le cas de l'affectation "=" ne veut donc pas dire 'égal'.
A=A+1 est possible

Si A=1

A=A+1 entraîne que A=2

On verra qu'il existe des variables numériques ('Integer' 'Single') et alphanumériques (chaîne de caractères ou 'String'), l'affectation peut être utilisée sur tous les types de variables.

Le second membre de l'affectation peut contenir des constantes, des variables, des calculs dans le cas de variables numériques.

A=B+2+C+D

On ne peut pas affecter une variable d'un type à une variable d'un autre type:

si A est numérique et B est alphanumérique (chaîne de caractères) A=B n'est pas accepté.

Ecriture compacte:

A=A+1 peut s'écrire de manière plus compacte : A += 1

A=A*2 peut s'écrire de manière plus compacte : A *= 2

A=A&"Lulu" pour une variable chaîne de caractère peut s'écrire de manière plus compacte : A &= "Lulu"

L'affection marche pour les objets, leurs propriétés..

Bouton1.BackColor= Bouton2.BackColor

Signifie que l'on donne au Bouton1 la même couleur de fond que celle du bouton2: on affecte la valeur BackColor du Bouton2 au Bouton1.

warning Attention le signe '=' signifie par contre 'égal' quand il s'agit d'évaluer une condition, par exemple dans une instruction If Then (Si Alors):
If A=B then 'signifie: Si A égal B alors...


V-C-1. Permutation de variables:

C'est un petit exercice:

J'ai 2 variables A et B contenant chacune une valeur.

Je voudrais mettre dans A ce qui est dans B et dans B ce qui est dans A.

Si je fais

A=B

B=A

Les 2 variables prennent la valeur de B!!

Comment faire pour permuter?

Et bien il faut utiliser une variable intermédiaire C qui servira temporairement à conserver le contenu de la variable A:

C=A

A=B

B=C

  A B C
Départ 1 2 0
C=A 1 2 1
A=B 2 2 1
B=C 2 1 1
Voila, on a bien permuté.


V-D. Les variables.


V-D-1. Les variables.

C'est le même sens qu'en mathématique.

Une variable sert à stocker un nombre, du texte (chaîne de caractères), une date, un objet..

Une variable a un nom et un type qui indique ce que l'on peut y mettre.

Si myString est une variable de type chaîne de caractère (ou String) : je peux y mettre une chaîne de caractère (« TOTO » par exemple)

myString="TOTO"

Si age est une autre variable de type numérique, je peux y stocker un nombre (45,2 par exemple).

age=45,2


V-D-1-a. Nom des variables :

On peut utiliser dans les noms de variable des majuscules ou des minuscules mais pour VB il n'y a pas de différence.

Exemple :

On ne peut pas déclarer une variable VB et une variable vb.

Si on déclare une variable nommée 'VB' et si ultérieurement on tape 'vb', le logiciel le transforme automatiquement en 'VB'.

  • On peut mettre des chiffres et des lettres dans les noms de variable mais pas de chiffres en premier caractère.
    2A n'est pas un nom valide
    Nom2 l'est.

  • Certains caractères de ponctuation (‘ »..) ne peuvent pas être utilisés, d'autres "_" et "–" sont permis :
    nom_Utilisateur est valide.
    L'espace n'est pas permis.

  • Bien sur, les mots clé de VB ne peuvent pas être utilisés : On ne peut pas nommer une variable Form ou BackColor
Il est conseillé de donner des noms explicites qui rappelle ce que contient la variable:

nom_Utilisateur est explicite, pas NU.

Parfois on indique en début de nom, par une lettre, le type de variable ou sa portée (la zone de code où la variable existe).

s_Nom 'Le s indique qu'il s'agit d'une variable String (Chaîne de caractères)

iIndex 'Le i indique qu'il s'agit d'une variable Integer (Entier)

gNomUtilisateur 'g indique que la variable est globale

Il est possible de 'forcer' le type de la variable en ajoutant un caractère spécial à la fin du nom de la variable.

Dim c$ = "aa" ' $ force c a être une variable String.

De même % force les Integer, & les long..

Cette notation est moins utilisée.

Voir en annexe, en bas de page des recommandations supplémentaires.

Majuscules ++++:

info On conseille, quand le nom d'une variable est composé de plusieurs mots, de mettre la première lettre de chaque mot en majuscule, sauf pour le premier mot.
Exemple:

nom_Utilisateur


V-D-1-b. Déclaration, initialisation:

Avant d'utiliser une variable, il faut la déclarer, la créer, pour cela on utilise l'instruction Dim:

Dim a As Integer    'Déclare une variable nommée 'a' de type Entier
Avant la ligne, a n'existait pas, après le DIM, a existe et contient 0.

L'instruction Dim crée la variable et lui alloue un espace de stockage.

Il faut aussi parfois l'initialiser, c'est à dire lui donner une valeur de départ : a=3

On peut déclarer et initialiser en même temps:

Dim a As Integer =3
Rien n'empêche d'utiliser une expression , une fonction pour initialiser.

Dim a As Integer = CalculMaVariable(4,3)
Ici pour initialiser la variable, on appelle une fonction CalculMaVariable qui retourne une valeur pour a.

info Il est toujours préférable d'initialiser rapidement une variable.
On peut déclarer plusieurs variables en même temps; il faut les séparer par des virgules:

Dim a, b, c As Integer        'a, b et c sont maintenant des variables de type integer.

V-D-1-c. En pratique: Exemple.

Les variables après avoir été déclarées, vont servir à stocker des données, à effectuer des calculs, on peut afficher ensuite leur valeur.

Exemple simpliste d'utilisation de variables:

Dim varA As Integer 'Création d'une variable varA

Dim varB As Integer 'Création d'une variable varB

Dim total As Integer 'Création d'une variable total

varA=3 'Mettre '3' dans a

varB=2 'Mettre '2' dans b

total=varA + varB 'Mettre dans la variable 'total' la valeur de varA et de varB

LabelTotal.Text= total.ToString 'Afficher le total dans un label (un label est une zone permettant d'afficher du texte), pour cela transformer la variable total qui est un entier en chaîne de caractères (à l'aide de ToString) puis mettre la string dans le texte du label.

Noter bien la différence entre :

Dim total As Integer
total= 123 'Total est une variable numérique (Integer ou Entier) contenant le nombre 123

et

Dim total2 As String
total2= "123" 'Total2 est une variable string contenant la chaîne de caractère "123" c'est à dire les caractères "1" , "2" et "3"

idea On peut afficher les chaînes de caractères (ou String), pas les variables numériques.
On fait des calculs avec les variables numériques.
Il faudra donc parfois convertir le contenu d'une variable d'un type dans un autre type.( convertir une variable numérique en String pour l'afficher par exemple ou convertir une variable String en numérique pour faire un calcul) on apprendra cela plus loin.

L'exemple simpliste juste au dessus en montre un exemple: il faut convertir total qui est un entier en string pour l'afficher.

Concernant les variables numériques:

Les variables numériques peuvent être signées (accepter les valeurs négatives ou positives) ou non signées ( Comme le Type 'Byte' qui ne contient que des valeurs positives)


V-D-1-d. Les différents types de variable:

En Visual Basic:

Nom : Contient :
Boolean Contient une valeur Booléenne (logique): True ou False.
Byte Contient les nombres entiers de 0 à 255 (sans signe)
Short Entier sur 16 bits (-32768 à 32768)
Integer Entier sur 32 bits (-2147483648 à 2147483647)
Long Entier sur 64 bits (-9223372036854775808 à 9223372036854775807)
Single Nombre réel en virgule flottante (-1,401298 *10^-45 à 1,401298 10^45)
Double Nombre réel en virgule flottante double précision. (..puissance 324)
Decimal Nombre réel en virgule fixe grande précision sur 16 octets.
Char 1 caractère alphanumérique
String Chaîne de caractère de longueur variable (jusqu'a 2 milliard de caractères)
DateTime Date plus heure
Object Peut contenir tous les types de variables mais aussi des contrôles, des fenêtres..
Structure Ensemble de différentes variables définies par l'utilisateur.
Dans la version 2005 il y a aussi les Unsigned ( non signé: pas de valeur négative):
UInteger Entier codé sur 32 bits pouvant prendre les valeurs 0 à 4 294 967 295.
ULong Entier codé sur 64 bits :0 à 18 446 744 073 709 551 615
UShort Entier sur 16 bits 0 à 65 535.
et  
SByte Byte mais signé. Codé sur 1 octet, valeur de -128 à 127

V-D-1-e. Détaillons :

Contient une valeur Booléenne : True ou False (Vrai ou Faux pour les sous doués en anglais!)

Exemple:

Dim myBoolean As Boolean

myBoolean = True

V-D-1-f. Variable entière:

Byte Contient les nombres entiers de 0 à 255 (sans signe)
Short Entier sur 16 bits (-32768 à 32768)
Integer Entier sur 32 bits (-2147483648 à 2147483647)
Long Entier sur 64 bits (-9223372036854775808 à 9223372036854775807)
Pour une variable entière il n'y a pas de possibilité de virgule!! attention, une division de 2 entiers donne un entier.

Pour le mathématicien, les Integer correspondent au nombres entiers naturels: Entiers positif ou négatif et 0 (..-3 -2 -1 0 1 2 3...), mais avec une limite.

warning Attention ,les variables numériques en informatique ne peuvent pas contenir de nombre infiniment grand: Il y a une limite maximum : un Integer est par exemple codé sur 32 bits ce qui fait qu'il peut varier de -2147483648 à 2147483647. Si on utilise une valeur trop grande, une erreur se produit. Les entiers peuvent être positifs ou négatifs (Sauf les Bytes et les 'Unsigned': UInteger, ULong, UShort).
Plus on augmente le type (Long au lieu de Integer) plus on peut y mettre des grands nombres. Mais cela prend aussi plus de place et le traitement des opérations est plus long.

Les processeurs travaillant sur '32 bits', utilisez plutôt les Integer (qui sont codés sur 32 bits aussi), c'est plus rapide, que les short.

On utilise largement les 'Integer' comme variable de boucle, Flag, là ou il y a besoin d'entier...(Les calculs sur les réels en virgule flottante sont beaucoup plus lent.)

Exemple:

Dim i As Integer

i=12
Le type de données Byte est utilisé pour contenir des données binaires (octet codant de 0 à 255) non signé.


V-D-1-g. Variable avec virgule:

Un réel peut avoir une partie fractionnaire: 1,454 est un réel.

Pour le mathématicien, les Single, Double.. correspondent au nombres réels ou fractionnaires: mais avec des limites ( sur le précision et le fait qu'il ne sont pas infinis.

Single, Double, Decimal.

Single Nombre réel en virgule flottante (-1,401298 *10^-45 à 1,401298 10^45)

Double Nombre réel en virgule flottante double précision. (-1,79769313486231570E+308 et -4,94065645841246544E-324 pour les valeurs négatives et entre 4,94065645841246544E-324 et 1,79769313486231570E+308 pour les valeurs positives)

Decimal Nombre réel en virgule fixe grande précision sur 16 octets: Avec une échelle 0 (aucune décimale), la plus grande valeur possible correspond à +/-79 228 162 514 264 337 593 543 950 335. Avec 28 décimales, la plus grande valeur correspond à +/-7,9228162514264337593543950335

Les variables en virgule flottante ou notation scientifique:

(Single, Double)

La variable peut être positive ou négative.

Le 'Double' est, bien sur, plus précis et peut atteindre des nombres plus grand que le 'Single'.

Le 'Single' comporte 7 chiffres significatifs maximum.

Le 'Double' comporte 18 chiffres significatifs maximum.

Le nombre est codé en interne sous forme scientifique, exemple:1,234568E+008.

Mais en pratique, on travaille et on les affiche de manière habituelle, en notation normale avec un point comme séparateur décimal:

Dim poids As Single

poids=45.45

Format Scientifique, Mantisse et exposant:

Voici 3 nombres:

14500000
0,145
0,0000145

Ils comportent tous les 3, deux informations:
  • le nombre entier 145
  • la localisation du premier chiffre par rapport à la virgule
8
-1
-5 dans nos exemples.

Donc un réel peut être stocké sous la forme d'un couple:
  • Partie entière
  • Localisation de la virgule
Il est codé en interne avec une mantisse (la partie entière) et un exposant (position de la virgule), sous la forme mmmEeee, dans laquelle mmm correspond à la mantisse (chiffres significatifs: partie entière) et eee à l'exposant (puissance de 10).

En fait, en notation scientifique (en codage interne) un chiffre précède toujours la virgule: 1,234568E+008.

warning Attention ,les variables numériques réelles ne peuvent pas contenir de nombre infiniment grand: Il y a une limite maximum comme pour les entiers. La valeur positive la plus élevée d'un type de données Single est 3,4028235E+38 et celle d'un type de données Double est 1,79769313486231570E+308. Si on dépasse cette valeur VB le signale en déclenchant une erreur.
Quand on travaille avec des nombres ayant beaucoup de chiffres significatifs, il peut y avoir des erreurs d'arrondi. Le type 'Single' comporte par exemple une mantisse de 7 chiffres significatifs seulement. Si on utilise des nombres (même petit: avec un exposant négatif par exemple)avec 8 chiffres significatifs il peut y avoir des erreurs d'arrondi.

Le type de données en Virgule fixe (Decimal) prend en charge jusqu'à 29 chiffres significatifs et peut représenter des valeurs jusqu'à 7,9228 x 10^28. Ce type de données est particulièrement adapté aux calculs (par exemple, financiers) qui exigent un grand nombre de chiffres, mais qui ne peuvent pas tolérer les erreurs d'arrondi.

info Pour les calculs financiers ont utilisera les 'Decimal' ou les 'Double'
Pour les petits calculs du genre résultats d'examen biologique ont utilisera les 'Single' ou les 'Double' qui sont les plus rapides.
Pour les variables de boucle, les index, on utilise habituellement des Integers.


V-D-1-h. String, Char:

Le type 'String' peut contenir une 'chaîne de caractères' (alphanumérique) comme du texte. La longueur de la chaîne n'est pas fixe et une String peut avoir un nombre de caractère allant de 0 jusqu'à environ 2 milliards de caractères.

Les chaînes de longueur fixe n'existent pas (plus).

Le Type 'Char' contient un seul caractère. On utilise souvent des tableaux de 'Char'.

Pour information Char et String contiennent des caractères au format Unicode (dans la variable,chaque caractère est codé sur 2 octets) et pas de l'ASCII ou de l'ANSI..(ancien codage ou chaque caractère était codé sur un octet).

Les premiers caractères ont le même code Unicode et Ascii.

Exemple:

Caractère Code
"a" 65
"b" 66
" " 32
Il y a aussi des caractères non affichable:

RC 13 retour chariot
LF 10 Line Feed
  9 Tabulation
Pour passer à la ligne , on utilise les codes 13 puis 10. Il y a une constante toute faites pour cela: ControlChars.CrLf Chr$(13)+Chr$(10)


V-D-1-i. Annexe 1:Place occupée en mémoire:

Les types de variable ont un nom en VisualBasic et un nom dans le Framework.

Exemple:

Integer et System.Int32 sont équivalents pour designer le type 'entier', Integer est le type VB, System.Int32 est le type 'NET'

Exemple de place occupée par une variable (et le nom de sa Classe dans NET).

Type VB Place occupée Type NET correspondant
Boolean 2 octets System.Boolean
Byte 1 octet System.Byte
Short 2 octets System.Int16
Integer 4 octets System.Int32
Long 8 octets System.Int64
Single 4 octets System.Single
Double 8 octets System.Double
Decimal 16 octets System.Decimal
Date 8 octets System.DateTime
Char 2 octets System.Char
Objet 4 octets System.Objet
String dépend de la chaîne System.String
La méthode GetType permet de savoir de quel type, de quelle Classe est une variable.

Dim x As String 

MessageBox.Show(x.GetType.ToString)    'Affiche: Systeme.String
Prend le type de x, le transforme en String, l'affiche dans une MessageBox.


V-D-1-j. Annexe 2: Type primitif

Mise à part Objet, Structure, Class tous les autres types sont dit 'Primitif'( Byte, Boolean, Short, Integer, Long, Single, Double, Decimal, Date, Char, String)

  • Tous les types primitifs permettent la création de valeurs par l'écriture de littéraux. Par exemple, i=123 ou i=123I (le I force 123 a être entier) est un littéral de type Integer.
  • Il est possible de déclarer des constantes des types primitifs.
  • Lorsque qu'une expression est constituée de constantes de type primitif, le compilateur évalue l'expression au moment de la compilation. C'est plus rapide.

V-D-1-k. Annexe 3: Choix des noms de variable

  • La plupart des noms sont une concaténation de plusieurs mots, utilisez des minuscules et des majuscules pour en faciliter la lecture.
  • Pour distinguer les variables et les routines (procédures), utilisez la casse Pascal (CalculTotal) pour les noms de routine (la première lettre de chaque mot est une majuscule).
  • Pour les variables,la première lettre des mots est une majuscule, sauf pour le premier mot (documentFormatType).
  • Les noms de variables booléenne doivent contenir Is qui implique les valeurs Yes/No ou True/False, Exemple fileIsFound.
  • Même pour une variable à courte durée de vie qui peut apparaître uniquement dans quelques lignes de code, utilisez un nom significatif. Utilisez des noms courts d'une seule lettre, par exemple i ou j, pour les index de petite boucle uniquement.
  • N'utilisez pas des nombres ou des chaînes littérales telles que For i = 1 To 7. Utilisez plutôt des constantes nommées, par exemple For i = 1 To Nombre_jour_dans _semaine, pour simplifier la maintenance et la compréhension.
  • Utilisez des paires complémentaires dans les noms de variables telles que min/max, begin/end et open/close ou des expressions min max si nécessaire en fin de nom.

V-D-2. Variables 'String' et 'Char'


V-D-2-a. A- STRING

Il faut déclarer une variable avant de l'utiliser, pour cela on utilise l'instruction DIM

DIM STR As String 
‘Déclare une variable nommée Str et qui peut contenir une chaîne de caractère.

Cette variable peut être utilisée pour conserver une chaîne de caractère.

STR= "TOTO"

'On met la chaîne de caractères "TOTO" dans la variable STR

On peut afficher le contenu de la chaîne dans un label (zone présente dans une fenêtre et ou on peut afficher du texte) par exemple :

      Label.text = STR
Cela affiche 'TOTO' dans le label.

Remarquons que pour définir une chaîne de caractères il faut utiliser des " " : Ce qui est entre " et " est la chaîne de caractères. On parle de chaîne littérale: (une représentation textuelle d'une valeur particulière)

warning Après avoir été créée, une String contient 'Nothing' c'est à dire rien (même pas une chaîne vide: ""); il faudra l'initialiser pour qu'elle contienne quelque chose.

DIM str As String    'str contient Nothing 
(pas le texte "Nothing"!! cela signifie qu'elle ne pointe sur 'rien'

str= ""              'str contient "" : chaîne vide de longueur 0

str= "TOTO"          'str contient "TOTO"
Notez bien l'importance des guillemets:

A est la variable A

"A" est une chaîne de caractères contenant le caractère "A"

Exemple:

Dim A As String= "Visual"

Dim B As String= "Basic"

Label.text = "A+B"  affiche bêtement la chaîne  « A+B »

Label.text =  A+B    affiche "VisualBasic"on affiche les variables.    
Notez enfin que " ", l‘espace est un caractère à part entière.

Si je veux inclure un caractère " dans la chaîne il faut le doubler pour qu'il ne soit pas considérer comme caractère de fin de chaîne:

A=" Bonjour ""Monsieur"" "    'Afficher cela donne :  Bonjour "Monsieur"
On peut initialiser la variable en même temps qu'on la déclare.

Dim Chaine as string = "Toto"
On peut déclarer plusieurs variables d'un même type sur une même ligne.

Dim x, y, z As String    'Déclare 3 variables 'String'
On utilise GetType pour connaître le type d'une variable.

x.GetType.ToString

y.GetType.ToString

z.GetType.ToString
donne

System.String

System.String

System.String
Ce qui prouve que les 3 variables sont bien des Strings. (ce qui n'était pas le cas en VB6)


V-D-2-a-i. 1- System.String est une Classe du Framework:
Le type System.String ou String (Chaîne de caractères) est une Classe qui a des méthodes.

info Pas besoin de connaître toutes les méthodes, il suffit (Après déclaration de la String par DIM réponse AS String) de taper "." .Et vous voyez apparaître toutes les propriétés et méthodes :
Par exemple la méthode .ToUpper

Mettre en majuscules une chaîne de caractère

      str=str.ToUpper()

                Si str contenait "abc"   il contiendra "ABC"
.ToLower transforme par contre la chaîne en minuscule.

Quel intérêt ? Exemple

Je dois comparer 2 string pour savoir si elle sont égales, la première a été saisie par l'utilisateur et je ne sais pas si l'utilisateur a tapé en majuscule ou en minuscules.

Si je compare A = "Vb" et B= "vb" elles sont différentes.

Si je compare A.ToLower et B.ToLower elles sont égales.

.Trim

Permet de supprimer des caractères en début et fin de chaîne.

Dim a As String = "#@Informatique@#"

Dim b As Char() = {"#", "@"}    'b est un tableau de Char contenant les caractères à supprimer.

a=a.Trim(b)  Donne a= "Informatique" 
warning Attention : Bien utiliser Char() qui est un tableau de caractères pour définir les caractères à supprimer.
(Dim b As String= "#@" est déconseillé car produisant des résultats curieux.)

Pour enlever les espaces avant et après la chaîne (Cas le plus fréquent) :

a=" Bonjour "

a=a.Trim(" ")    'donne a="Bonjour"
Il existe aussi TrimStart et TrimEnd pour agir seulement sur le début ou la fin de la chaîne.

Length : Taille d'une chaîne en nombre de caractère.

Afficher la taille de la chaîne « VB »

Dim s As String= "VB"

MsgBox(s.Length.ToString) ‘Affiche 2 
Concat :

Concaténation de plusieurs chaînes : mise bout à bout :

s=String.Concat(a,b)
Il est plus rapide de faire : s= a & b

(s=a+b marche mais est déconseillé)

Insert :

Insère une chaîne dans une autre.

Dim s As String= "VisualBasic"

s= s.Insert(6,"  " ) ‘Donne s= "Visual  Basic" 
Noter: le premier caractère a la position 0.

Remove :

Enlève des caractères à une certaine position dans une chaîne.

Dim s As String= "VisualBasic"

s= s.Remove(2,7 ) ‘Donne s= "Viic" 
Replace :

Remplace dans une chaîne de départ, toutes les occurrences d'une chaîne par une autre.

Resultat=ChaineDépart.Replace(ChaîneARemplacer,ChaîneQuiRemplace)

Dim s As String= "Visual_Basic"

s= s.Replace("_"," " ) ‘Donne s= "Visual  Basic"
Autre exemple:

L'utilisateur a tapé une date, mais avec comme séparateur des ".", comme on le verra plus loin, il est nécessaire d'utiliser plutôt les "/", pour cela on utilise Replace

Dim ladate as string= "12.02.1990"

ladate= ladate.Replace(".","/" ) ‘Donne ladate= "12/02/1990"
Split :

Découpe en plusieurs sous chaînes une chaîne de départ, cela par rapport à un séparateur.

Exemple :

Je récupère dans un fichier une chaîne de mots ayant pour séparateur « ; », je veux mettre chaque mot dans un tableau.

‘Chaîne contenant les mots séparés par « ; »

Dim s As String= "Philippe;Jean ;Toto"  

Dim separateur As Char = ";"

Dim nom() As String

nom=s.Split(separateur)
Donne :

      nom(0)= "Philippe"

      nom(1)= "Jean"

      nom(2)= "Toto"
info Remarque: Quand on déclare le tableau nom(), on ne donne pas le nombre d'élément, c'est Split qui crée autant d'élément qu'il faut.
En Framework 2, on peut utiliser plusieurs séparateurs différend:

nom=s.Split( New Char() {" "c, ","c, "."c }) ici on a 3 séparateurs: l'espace, la virgule et le point.
le c après chaque séparateur veut dire Char, car les séparateurs sont des caractères.

On peut ajouter 2 paramètres permettant d'indiquer le nombre de ligne maximum et forcer l'élimination des lignes vides.

Dim sep() As Char={" "c, ","c, "."c}

Dim nom() As String = S.Split ( sep, 100, StringSplitOptions.RemoveEmptyEntries ) 

Allons encore plus loin: avant et après le séparateur il peut y avoir des espaces:

Il faut dans ce cas utiliser la méthode Split de la classe Regex:

Imports System.Text.RegularExpressions

Dim S As String = "abc ; def ; ghi"

' On crée un Regex

Dim R As New Regex("\s*;\s*")

' décomposition de ligne en champs

Dim Nom As String() = R.Split(S)
.Join

Concatène tous les éléments d'un tableau et peut ajouter des séparateurs.

Si myLines() est un tableau de String , je veux ajouter ces lignes bout à bout en les séparant d'un retour à la ligne.

Dim myText As String = String.Join ( ControlChars.CrLf, myLines)
.IndexOf .LastIndexOf

Indique le numéro du caractère, la position (la première occurrence) ou une chaîne à chercher est trouvée dans une autre. Recherche en commençant par la fin avec LastIndexOf

Dim a As String= "LDF.EXE"

Dim r As Char()={"."}

a.IndexOf(r)  retourne 3
warning Se souvenir : le premier caractère est en position 0 en .Net.
.LastIndexOf retourne la dernière occurrence.

.IndexOfAny .LastIndexOfAny (Framework 2)

Indique le numéro du caractère, la position (la première occurrence) ou une chaîne à chercher est trouvée dans une autre avec en plus possibilité d'indiqué la position de départ.

Dim a As String= "LDF.EXE"

Dim r As Char()={"."}

a.IndexOfAny(r)  recherche à partir du début de chaîne.

a.IndexOfAny(r,2)  recherche à partir du deuxième caractère.
Autre exemple: On recherche ici plusieurs caractères (en fait un tableau de Char)

Dim str As String ="gfdjzak;,vdqsygeak"

Dim start As Integer =2

Dim at As Integer 

Dim count As Integer =5

Dim target As String = "ou" 'chaîne à chercher 

Dim anyOf As Char() = target.ToCharArray() 'on transforme la chaîne en tableau de char 

at = str.IndexOfAny(anyOf, start, count) 'on cherche le tableau de Char anyOf dans str à partir de la position start et sur count caractères.
.Compare

Compare 2 chaînes :

Dim rep As Integer

rep=String.Compare(a,b)
Retourne un entier

      Négatif si a<b

      0 si a=b

      Positif si a>b
On peut comparer des sous chaînes et indiquer la sensibilité à la casse (Framework 2):

rep= String.Compare(a, 2, b, 2, 10, True)
Ici on compare 10 caractères en commençant par le deuxième caractère de chaque chaîne en mode sensible à la casse (majuscules<>minuscule).

.Contains

Permet de savoir si une chaîne apparaît dans une autre: (Framework 2)

Dim trouve As Boolean

trouve = a.Contains( "123")
Retourne True ou False

.Substring

Extrait une partie d'une chaîne.

Le premier paramètre indique la position de départ; le second, le nombre de caractères à extraire.

Dim a As String= "Informatique"

MessageBox.show(a.Substring(2,3)) ‘Affiche  for
Le premier paramètre indique la position du caractère où doit commencer la sous-chaîne, en commençant à la position 0. (les caractères sont comptés 0, 1, 2, 3....

Le second paramètre la longueur de la sous-chaîne.

Exercice 1: comment obtenir les 4 caractères de droite:

Dim a As String= "Informatique"

MessageBox.show(a.Substring(A.Length-4)) ‘Affiche  ique
Ici on omet le second paramètre,la longueur de la sous-chaîne, va jusqu'a la fin de la chaîne.

Exercice 2: comment obtenir les 3 caractères de gauche:

Dim a As String= "Informatique"

MessageBox.show(a.Substring(0, 3)) ‘Affiche  inf
.Chars

Une chaîne peut être perçue comme un tableau de caractères (instances Char) ; vous pouvez extraire un caractère particulier en faisant référence à l'index de ce caractère par l'intermédiaire de la propriété Chars. Par exemple :

Dim maString As String = "ABCDE"
Dim monChar As Char
monChar = maString.Chars(3) ' monChar = "D"
On peut créer des chaînes avec la Classe String:

myString = New String(" ", 15)    'Créer une chaîne de 15 espaces
.PadRight

Aligne les caractères de cette chaîne à gauche et remplit à droite en ajoutant un caractère Unicode spécifié pour une longueur totale spécifiée.

Dim str As String
Dim pad As Char
str = "Nom"
pad = Convert.ToChar(".") 
Console.WriteLine(str.PadRight(15, pad)) ' Affiche Nom............
PadLeft fait l'inverse.

.StartsWith() et EndsWith()

Permettent de tester si une string commence ou se termine par une string, retourne True ou False.

Tester si la String s commence par "abc" et se termine par "xyz":

If s.StartWith ("abc") And s.EndWith ("xyz") then
En VB 2005, on peut ajouter un argument gérant la culture ou la casse.

.IsNull , IsNullOrEmpty() Framework 2

Il est parfois nécessaire de vérifier si une chaîne est égale à Nothing ou de longueur égale à 0 (vide).

If S Is Nothing AndOr S.length=0 then
Ou

If String.IsNullOrEmpty( S) then

V-D-2-a-ii. 2- On peut aussi utiliser les instructions 'Visual Basic':
Si vous débuter, laisser de coté ces instructions Visual Basic: elle font double emploi avec la classe String, elle ne sont pas toujours cohérentes avec le reste et cela embrouille.

Utiliser uniquement la classe String.

Elles sont bien connues des 'anciens' et font partie intégrante de VisualBasic) et sont parfois plus simples. Mais elles ne fonctionnent pas comme des Objets mais comme des instructions.

Elle font partie de l'espace de nom Microsoft.VisualBasic, il est 'chargé' par défaut et il n'y a pas lieu de l'importer. Par contre quand certains 'mots' sont communs à plusieurs classes ou instructions, il peut y a avoir ambiguïté et il faut utiliser dans ce cas la syntaxe complète. Cela semble le cas pour left qui est un mot clé Vb mais aussi une propriété des contrôles. Pour lever l'ambiguïté il faut écrire Microsoft.VisualBasic.left(C,i) par exemple.

Ces méthodes font souvent double emploi avec les méthodes de la classe String:

warning Attention : le premier caractère est en position 1 dans les instructions VB.
Mid:

Permet de récupérer une sous-chaîne.

MaString = "Mid Demonstration" 
a = Mid(MaString, 1, 3) ' Retourne "Mid".
Retourne 3 caractères à partir du premier

Le premier paramètre indique la position du caractère où doit commencer la sous-chaîne, en commençant à la position 1. (les caractères sont comptés 1, 2, 3...; on rappelle qu'avec SubString la sous-chaîne, commence à la position 0.

a = Mid(MaString, 14) ' Retourne "tion": du 14ème à la fin (pas de 3ème argument)

Mid permet aussi de remplacer une string dans une string

Mid(MaString, 1, 3) = "Fin" => MaString="Fin Demonstration"

Left, Right (Pas d'équivalent dans le Framework)

Retourne x caractères de gauche ou de droite:

a=Right(MaString,2) 'a="on"

a=Microsoft.VisualBasic.Left(MaString,2) 'a="Mi"

Notez bien que, pour lever toute ambiguïté avec les méthodes left d'autres classes, il faut indiquer Microsoft.VisualBasic.Left.

Len.

Retourne la longueur de la chaîne:

MyLen = Len(MaString) ' Retourne 17.

LTrim, RTrim

Enlève les espaces à gauche ou à droite d'une chaîne.

a=LTrim(" RRRR") ' a="RRR"

InStr

Retourne un entier spécifiant la position de début de la première chaîne à l'intérieur d'une autre.

n=InStr(1,"aaaaRaa","R")        'retourne 5
Recherche à partir du premier caractère, à quelle position se trouve 'R' dans la chaîne "aaaaRaa"

Si la chaîne n'est pas trouvée , retourne 0

InStrRev

Recherche aussi une chaîne mais de droite à gauche. la position de départ est le 3ème argument.

InStrRev (Ch1, Ch2 , PosDépart)

StrComp Compare 2 chaînes.

Space

Retourne une chaîne d'espace: Space(10) retourne " "

StrDup

Retourne une chaîne de caractères par duplication d'un caractère dont on a spécifié le nombre.

maString = StrDup(5, "P") ' Retourne "PPPPP"
Asc

Retourne le code de caractère du caractère entré. Il peut être compris entre 0 et 255 pour les valeurs du jeu de caractères codé sur un octet (SBCS) et entre -32 768 et 32 767 pour les valeurs du jeu de caractères codé sur deux octets (DBCS). La valeur retournée dépend de la page de codes

AscW retourne le code Unicode du caractère entré. Il peut être compris entre 0 et 65 535.

x=Asc("A") 'retourne 65

x=Asc("ABCD") 'retourne 65 : Seul le premier caractère est pris en compte

Chr et ChrW

Retourne le caractère associé au code de caractère.

Chr(65) retourne "A" 'cela dépend de la page de code.

On peut donner le numéro du caractère en hexadécimal, dans ce cas on le fait précéder de &H

Chr(&H20) est équivalent de Chr(32) et retourne un caractère " ".

ChrW retourne le caractère correspondant à l'Unicode

GetChar

Retourne le caractère d'une chaîne à une position donnée.

Dim maString As String = "AIDE"
Dim monChar As Char
monChar = GetChar(maString, 3) ' monChar = "D"
 
LCase Ucase

Retourne la chaîne en minuscule ou majuscule:

Lowercase = LCase(UpperCase)
Lset Rset

Retourne une chaîne alignée à gauche avec un nombre de caractère.

Dim maString As String = "gauche"
Dim r As String
r = LSet(maString, 2) ' Retourne "ga" 

Si la chaîne de départ est plus courte que la longueur spécifiée, des espaces sont ajoutés.
r = LSet(maString, 8) ' Retourne "gauche  "
StrRevers

Retourne une chaîne ou les caractères ont été inversés:

Dim maString As String = "STRESSED"

Dim revString As String

revString = StrReverse(myString)    ' Retourne "DESSERTS"
Marrant l'exemple!!

Filter (VB2005)

Passe les Strings d'un tableau dans un autre tableau, si elles contiennent ou non une chaîne.

TableauResultat= Filter( TableauChaine, Match, Include, Compare) 
Match: chaîne à chercher.

Include: Filtre sur la présence ou non de la chaîne a chercher.

Compare: en binaire ou en texte (majuscules = minuscules dans ce cas)

Dim TestStrings(2) As String
TestStrings(0) = "Ici"
TestStrings(1) = "Si"
TestStrings(2) = "si"
Dim subStrings() As String	'Chaîne des résultats

subStrings = Filter(TestStrings, "i", True, CompareMethod.Text)
'Retourne "Ici","Si","si"

subStrings = Filter(TestStrings, "si", True, CompareMethod.Binary)
' Retourne "si".

subStrings = Filter(TestStrings, "si", False, CompareMethod.Binary)
'Retourne "Ici","Si"
Like:

Instruction hyper puissante: Like, elle compare une chaîne String avec un modèle (Pattern), elle permet de voir si la chaîne contient ou ne contient pas un ou des caractères, ou une plage de caractères. (c'est l'équivalent des expressions régulières du Framework)

result = String Like Pattern

Si string correspond à pattern, la valeur de result est True ; s'il n'y a aucune correspondance, la valeur de result est False. Si string et pattern sont une chaîne vide, le résultat est True. Sinon, si string ou pattern est une chaîne vide, le résultat est False.

L'intérêt de Like est que l'on peut y mettre des caractères génériques:

? veut dire tout caractère unique

* veut dire * ou plusieurs caractères.

# veut dire tout chiffre.

[caractères] veut dire tout caractères présent dans la liste.

[!caractères] veut dire tout caractères NON présent dans la liste.

- trait d'union permet de spécifier un début et une fin de plage.

Exemple:

Dim R As Boolean
R = "D" Like "D" ' Est ce que "D" est égal à "D"? => True.


R = "F" Like "f" ' Est ce que "F" est égal à "f"? => False.


R = "F" Like "FFF" ' Est ce que "F" est égal à "FFF"? => False.


R = "cBBBc" Like "c*c" ' Est ce que "cBBBc" répond au pattern (avoir un "c" au 
'début, un  "c" à la fin, et des caractères au milieu? Retourne True.


R = "J" Like "[A-Z]" ' Est ce que "J" est contenu dans les caractères allant de
'  A à Z? Retourne True.


R = "I" Like "[!A-Z]" ' Est ce que "I" n'est PAS dans les caractères allant de
'  A à Z? Retourne  False.


R = "a4a" Like "a#a" ' Est ce que "a4a" commence et finie par un
' "a" et à un nombre entre les 2? Retourne True.


R = "bM6f" Like "b[L-P]#[!c-e]" ' Est ce que "bM6f" 

'commence par  "b",

'a des caractères entre L et P

'un nombre

'se termine par un caractère non compris entre c et e

'retourne True

V-D-2-a-iii. 3- Un exemple:
Combinaison de chaînes de caractères, de variables..

Souvent, on a besoin d'afficher une combinaison de chaînes littérales, le contenu de variables, des résultats de calcul; c'est possible.

Exemple :

Pour afficher dans un label le carré de X est X2, avec une valeur dans la variable x :

Dim X As Integer = 2

Label1.text= "Le carré de " & X & "  est " & X * X
Ce qui est entre guillemets est affiché tel quel. C'est le cas de "Le carré de " et de " est "

Ce qui n'est pas entre guillemets est évalué, le résultat est affiché. C'est le cas de X et X*X

Pour ne faire qu'une chaîne on ajoute les bouts de chaînes avec l'opérateur '&'.

Notez l'usage d'espace en fin de chaîne pour que les mots et les chiffres ne se touchent pas.

Dim X As Integer

X=2
Label1.text= "Le carré de " & X & " est " & X * X

Affiche dans le label : « Le carré de 2 est 4 »

Voir des exemples de code dans ve1-1


V-D-2-a-iv. 4- Comparaison de caractères et 'Option Compare'
On peut comparer 2 String

Dim s1 As String ="ABCD"

Dim s2 As String ="XYZ"
Dans ce cas s1<s2 est vraie.

Par défaut (Option Compare Binary)

Les caractères sont classés dans un ordre croissant (l'ordre de leur code unicode)

Voyons l'ordre des certains caractères particuliers:

" " +,-./ 0123456789 :;ABCDEF abcdef èéê

On constate que l'ordre est espace puis quelques caractères spéciaux, les chiffres, les majuscules puis les minuscules, les accentués.(voir le tableau d'unicode)

Ainsi B<a

En utilisant Option Compare Binary, la plage [A–E] correspond à A, B, C, D et E.

Avec Option Compare Text

Les caractères sont classées dans un ordre qui reflète plus la réalité d'un texte:

Toutes les types de a: A, a, À, à, puis tous les types de b: B, b...

Avec Option Compare Text, [A–E] correspond à A, a, À, à, B, b, C, c, D, d, E et e. La plage ne correspond pas à Ê ou ê parce que les caractères accentués viennent après les caractères non accentués dans l'ordre de tri.

Ainsi B>a

L'ordre des caractères est donc défini par Option Compare et aussi les paramètres régionaux du système sur lequel s'exécute le code.

Grande règles de comparaison:

La comparaison s'effectue de gauche à droite.

La comparaison s'effectue sur le premier caractère de chaque chaîne.

Si le premier caractère est identique, la comparaison se fait sur le deuxième caractère...

"zz" > "za" est vrai

En cas de chaîne du type "zz" et "zzz" , la seconde est supérieure

"zz" < "zzz" est vrai

Il y a quelques pièges:

Si je veux créer des chaînes du genre 'un nombre puis le mot string' et qu'elles soient classées dans un ordre logique pour l'humain.

Je vais taper: "1string", "2string", "10string", "11string", "100string"

Le classement par Vb sera 'surprenant' car les chaînes seront classées dans cet ordre:

"100string", "10string", "11string", "1string","2string"

Pourquoi? c'est l'application stricte des règles de comparaison: regardons le troisième caractère des 2 premières chaînes (les 2 premiers caractères étant égaux), "0" est bien inférieur à "s" donc "100string" < "10string" est vrai!!

Pour résoudre le problème et obtenir un classement correct, il faut écrire des blocs numériques de même longueur et alignés à droite:

Écrire 010string et non 10string.

"001string", "002string", "010string", "011string", "100string" ' ici le trie est dans le bon ordre.


V-D-2-a-v. 5- Unicode:
Les variables string sont stockées sous la forme de séquences de 16 bits (2 octets) non signés dont les valeurs sont comprises entre 0 et 65 535. Chaque nombre représente un caractère Unicode. Une chaîne peut contenir jusqu'à 2 milliards de caractères.

L'unicode est donc un codage de caractères sur 16 bits qui contient tous les caractères d'usage courant dans les langues principales du monde.

Les premiers 128 codes (0–127) Unicode correspondent aux lettres et aux symboles du clavier américain standard. Ce sont les mêmes que ceux définis par le jeu de caractères ASCII (ancien codage sur un octet). Les 128 codes suivants (128–255) représentent les caractères spéciaux, tels que les lettres de l'alphabet latin, les accents, les symboles monétaires et les fractions. Les codes restants sont utilisés pour des symboles, y compris les caractères textuels mondiaux, les signes diacritiques, ainsi que les symboles mathématiques et techniques.

Voici les 255 premiers

Le petit carré indique un caractère non imprimable (non affichable), certains caractères sont des caractères de contrôle comme le numéro 9 qui correspondant à tabulation, le numéro 13 qui correspond au retour à la ligne..


V-D-2-b. B- CHAR.

Les variables Char sont stockées sous la forme de nombres 16 bits (2 octets) non signés dont les valeurs sont comprises entre 0 et 65 535. Chaque nombre représente un seul caractère Unicode. Pour les conversions entre le type Char et les types numériques il y a les fonctions AscW et ChrW qui peuvent être utilisées..

L'ajout du caractère de type littéral C à un littéral de chaîne force ce dernier a être un type Char. A utiliser surtout si Option Strict (qui force à être strict..) est activé.

Exemple:

Option Strict On
' ...
Dim C As Char
C = "A"c
String.ToCharArray:
Permet de passer une string dans un tableau de Char:

Dim maString As String = "abcdefghijklmnop"
Dim maArray As Char() = maString.ToCharArray
La variable maArray contient à présent un tableau composé de Char, chacun représentant un caractère de maString.

Pour mettre le tableau de Char dans une String:

Dim maNewString As String (maArray)
 
String.Chars():
vous pouvez extraire un caractère particulier en faisant référence à l'index de ce caractère par l'intermédiaire de la propriété Chars. Par exemple :

Dim maString As String = "ABCDE"

Dim monChar As Char

monChar = maString.Chars(3) ' monChar = "D"
Un caractère est-il numérique? un chiffre? une lettre? un séparateur? un espace?....

	Dim chA As Char
        chA = "A"c
        Dim ch1 As Char
        ch1 = "1"c
        Dim str As String
        str = "test string"

        Console.WriteLine(chA.CompareTo("B"c))          ' Output: "-1" '  A est plus petit que B
        Console.WriteLine(chA.Equals("A"c))             ' Output: "True" ' Egal?
        Console.WriteLine(Char.GetNumericValue(ch1))    ' Output: 1	 'Convertir en valeur numérique (double)
        Console.WriteLine(Char.IsControl(Chr(9)))       ' Output: "True"'  Est une caractère de contrôle?
        Console.WriteLine(Char.IsDigit(ch1))            ' Output: "True"'  Est un chiffre
        Console.WriteLine(Char.IsLetter(","c))          ' Output: "False"' Est une lettre
        Console.WriteLine(Char.IsLower("u"c))           ' Output: "True" ' Est en minuscule
        Console.WriteLine(Char.IsNumber(ch1))           ' Output: "True" ' Est un nombre
        Console.WriteLine(Char.IsPunctuation("."c))     ' Output: "True" ' Est un caractère de ponctuation
        Console.WriteLine(Char.IsSeparator(str, 4))     ' Output: "True" ' Est un séparateur
        Console.WriteLine(Char.IsSymbol("+"c))          ' Output: "True" ' Est un symbole
        Console.WriteLine(Char.IsWhiteSpace(str, 4))    ' Output: "True" ' Est un espace
        Console.WriteLine(Char.ToLower("M"c))           ' Output: "m"	 ' Passe en minuscule
   
Existe aussi IsLetterOrDigit, IsUpper.

Bien sur si on est en 'Option Strict' il faut ajouter .ToString à chaque ligne:

Console.WriteLine(Char.ToLower("M"c).ToString) 
On note que l'on peut tester un caractère dans une chaîne: Char.IsWhiteSpace(str, 4)

Autre manière de tester chaque caractères d'une String:

Dim V as string

For Each C As Char in V    'Pour chaque caractère de V..

      C...

Next
Ici la String est considérée comme une collection de Char. (C'est aussi une collection de String)

Mais on verra plus loin les collections et les boucles For Each.

Conversions Char <->Unicode

On rappelle que l'unicode est le mode de codage interne des caractères.

Dim monUnicode As Short = Convert.ToInt16 ("B"c) ' le code Unicode  de B est 66.
Dim monChar As Char = Convert.ToChar (66) '   monChar="B"
Si vous souhaiter utiliser Asc et Chr de VisualBasic:

Dim monAscii As Short = Asc("B") 'donne le code Ascii ou l'Unicode (Ascw fait de même?)
Dim monChar As Char= Chr(66) 
Voir des exemples de code dans ve1-1


V-D-2-b-i. Et les Chaînes de longueur fixe:
On a vu que les chaînes de longueur fixe n'existent pas en VB.NET (compatibilité avec les autres langages oblige), mais il y a moyen de contourner le problème:

On peut utiliser la Classe de compatibilité VB6: à éviter

(Il faut charger dans les références du projet Microsoft.VisualBasic.Compatibility et Compatibility Data)

Dim MaChaineFixe As New VB6.FixedLengthString(100)
Pour afficher la chaîne fixe utilisez MaChaineFixe.Tostring

Mais pour mettre une chaîne dans cette chaîne de longueur fixe!! galère!!!

MaChaineFixe="ghg" n'est pas accepté: on ne peut pas mettre une String dans une chaîne fixe

MaChaineFixe = CType("hg", Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString) 'pas accepté non plus!!

Enfin ce type de chaîne fixe ne peut pas être utilisée dans les structures, mais il y a un autre moyen pour les structures. On verra cela plus loin.

Donc les chaînes fixes sont à éviter.


V-D-3. Variables Numériques

4815162342

Une variable numérique peut contenir des données numériques.

On a vu qu'une variable numérique peut être entière:
  • Integer (entier signé)
  • Short (entier court signé)
  • Long (Entier long signé)
  • Byte (entier non signé de valeur 0 à 255)

Mais aussi en VB2005
  • UInteger (entier non signé)
  • UShort (entier court non signé)
  • ULong (Entier long non signé)
  • SByte (entier signé)
mais aussi
  • Single (virgule flottante simple précision)
  • Double (virgule flottante double précision)
  • Decimal (virgule fixe haute précision)
On déclare une variable numérique avec Dim, on peut l'initialiser en même temps :

Dim i As Integer= 3
Si la variable est numérique, il faut la transformer en String avant de l'afficher :

Dim I As Integer=12

Label.text = I.ToString
.ToString fait partie des méthodes. Il y en a d'autres:

.GetType retourne le type de la variable

Dim i As Integer

Label1.Text = i.GetType.ToString  'Affiche: System.Int32
.MaxValue .MinValue donne le plus grand et le plus petit nombre possible dans le type de la variable.

On verra qu'on peut utiliser des opérateurs + - * / .

Dim I As Integer=2

Dim J As Integer

J=I+3 ‘ J est égal à 5 car on affecte à J la valeur I+3
On rappelle que le séparateur est le point :

J=1.2 veut dire J=1,2 en bon français !!


V-D-3-a. La Classe MATH du Framework est disponible:

Pour qu'elle soit disponible il faut d'abord importer l'espace de nom 'Math'du FrameWork :

Pour cela il faut taper en haut de la fenêtre (au dessus de public Class)

Imports System.Math
Si on n'a pas importé il faut ajouter Math. avant le nom de a fonction. Exemple: R=Math.Abs(N)

On verra plus loin ce que cela signifie.

Dim N As Single

Dim R As Single

 

R=Abs(N)    ‘retourne la valeur absolu

            ‘Si N=-1.2  R=1.2

R=Sign(N)   ‘retourne le signe

            ‘Si N=-1.2  R=-1 (négatif) ; retourne 1 si nombre positif

 

R=Round(N)  ‘retourne le nombre entier le plus proche

            ‘ N=1.7     R=2

            ‘ N=1.2     R=1

            ‘ N=1.5     R=2
Si nombre <0.5 retourne 0 si > ou = à 0.5 retourne 1; c'est la manière d'arrondir les nombres en Euros, comme sur la feuille d'impots.

On peut donner en second paramètre le nombre de digit: Math.Round(Valeur, 2)donne 2 décimales après la virgule.


R=Truncate(N)  ‘retourne la partie entière entier (enlève les chiffres après la virgule, arrondi à l'entier le plus proche en allant vers zéro))

            ‘ N=1.7     R=1

 

R=Floor(N)  ‘retourne le plus grand entier égal ou inférieur. ( arrondi à l'entier inférieur le plus proche en allant vers l'infini négatif)

            ‘ N=1.7     R=1

 

R=Ceiling(N)  ‘retourne le plus petit entier égal ou supérieur. ( arrondi à l'entier  supérieur le plus propre en allant vers l'infini positf)

            ‘ N=1.2     R=2

R=Max(2,3)  ‘retourne le plus grand des 2 nombres.

            ‘retourne 3

R=Min(2,3)  ‘retourne le plus petit des 2 nombres.

            ‘retourne 2

R=Pow(2,3)  ‘retourne  2 puissance 3.

            ‘retourne 8

R=Sqrt(9)   ‘retourne la racine carré.

            ‘retourne 3

longResult = Math.BigMul(int1, int2) 'BigMul donne le résultat de la multiplication de 2 entiers sous forme d'un long.
 
Il existe aussi Log, Log10, Exp.

Bien sur il y a aussi Sin Cos Tan, Sinh Cosh Tanh (pour hyperbolique) Asin Acos Atan Atan2.

Prenons un exemple:

Imports System.Math
Dim MonAngle, MaSecant As Double
MonAngle = 1.3 '  angle en  radians.
MaSecant = 1 / Cos(MonAngle) ' Calcul la sécante.
 
On remarque que les angles sont en radians.

Rappel:2p=360° ; Angle en radians= (2p/360)*Angle en degrés


V-D-3-b. Il existe aussi les instructions du langage VisualBasic comme:

Int et Fix qui suppriment toutes deux la partie fractionnelle et retournent l'entier .

Dim R As Single= 1.7

Int(R)    ‘retourne 1
Si le nombre est négatif, Int retourne le premier entier négatif inférieur ou égal au nombre, alors que Fix retourne le premier entier négatif supérieur ou égal au nombre. Par exemple, Int convertit -8,4 en -9 et Fix convertit -8,4 en -8.


V-D-3-c. Dépassement de capacité, 'Non Nombre'.

Testé en VB2005

On a vu que , codées sur un nombre de bits défini, les variables numériques ne peuvent pas avoir des valeurs très très grandes. .MaxValue donne le plus grand nombre possible dans le type de la variable. (MinValue le plus petit nombre) Que se passe t-il , si on dépasse la valeur maximum?

  • Si on affecte à une variable entière une valeur supérieure à .MaxValue cela déclenche une erreur (on dit une exception de type OverFlow) et cela plante.
  • Si on affecte à une valeur à virgule flottante(un Single par exemple), une valeur supérieure à .MaxValue, la variable prend la valeur 'infinie' ( +ou - infinie: Single.NegativeInfinity ou Single.PositiveInfinity))
Exemple:

IsInfinity, IsNegativeInfinity, IsPositiveInfinity permettent de tester si le résultat d'un calcul dépasse les valeurs autorisées pour le Type virgule flottante.

Dim s As Single = 2147483647 ^ 33

If Single.IsInfinity(s) Then MsgBox("infinie")
s prend la valeur Single.PositiveInfinity

Les opérations en virgule flottante retournent NaN pour signaler que le résultat de l'opération est non défini. Par exemple, le résultat de la division de 0,0 par 0,0 est NaN.

On peut tester une expression par IsNan

Exemple:

If Single.IsNaN(0 / 0) Then

V-D-4. Conversion, séparateur décimal

4815162342

On a vu qu'on peut afficher les chaînes de caractères (des 'String'), par ailleurs, on fait des calculs avec les variables numériques (Integer, Single..).

On a donc besoin sans arrêt de faire des calculs avec des variables numériques et de transformer le résultat en String pour l'afficher et vice versa.

Est-il possible de convertir une variable d'un type à un autre? OUI!!

On aura donc besoin de savoir transformer des variables de tous types en d'autres types.


V-D-4-a. Conversion numérique=>String

Quel intérêt de convertir?

On veut afficher un résultat numérique.

On ne peut afficher que des String (chaîne de caractères) dans un label ou un TextBox par exemple.

Aussi, il faut transformer cette valeur numérique en chaîne avant de l'afficher, on le fait avec la méthode ".ToString":

     Dim i As Integer=12        'On déclare une variable I qu'on initialise à 12

     Label.text = i.ToString 
La valeur de i est transformée en String puis affectée à la propriété Text du label, ce qui affiche '12'

On verra plus loin qu'on peut ajouter des paramètres.


V-D-4-b. Conversion String=>numérique

A l'inverse une chaîne de caractères peut être transformée en numérique :

Par exemple, l'utilisateur doit saisir un nombre, il saisit un nombre dans une boite de saisie (InputBox), mais il tape des caractères au clavier et c'est cette chaîne de caractères qui est retournée, il faut la transformer en numérique.

Dim s as String

Dim i as Integer

s= InputBox ("Test", "Taper un nombre") 'Saisie dans une InputBox  d'un nombre par l'utilisateur.

's contient maintenant une chaîne de caractères, "45" par exemple

i=Integer.Parse(S)     'on transforme la chaîne s en Integer                   
Bizarre cette syntaxe!! en fait c'est le type Integer qui a une méthode (Parse) qui transforme une chaîne en entier.

Il y a aussi:

Transformation d'une chaîne en Long Long.Parse(chaine) ou Int64.Parse(chaine)

Transformation d'une chaîne en Double Double.Parse(chaîne)

Transformation d'une chaîne en Single Single.Parse(chaîne)

On peut aussi utiliser, et c'est plus simple, CType pour convertir n'importe quel type en n'importe quel type :

Il suffit de donner à cette fonction la variable à modifier et le type à obtenir.

Dim i As Integer

Dim s As String= "12"

 i=CType(s,Integer)  ' s est la variable à modifier, Integer est le type à obtenir.
i contient maintenant l'entier 12.


V-D-4-c. CType pour toutes les conversions

Ctype peut aussi servir à convertir de la même manière un single en double, un Short en Integer....

Il est donc possible de convertir un type de variable en un autre.

Il suffit de donner à cette fonction la variable à modifier et le type à obtenir.

 Dim d As Double = 2.65

 Dim i As Integer

 i=CType(d,Integer)    'conversion en entier 
Pour les forts:

DirectCast fait de même mais on doit utiliser une variable ByRef.

i=DirectCast(s,Integer) 'S doit être ByRef

Par contre DirectCast nécessite que le type d'exécution d'une variable objet soit identique au type spécifié.

' nécessite Option Strict Off.
Dim Q As Object = 2.37   ' crée un objet contenant un double.
Dim K As Integer =CType(Q, Integer)       'Marche

Dim J As Integer = DirectCast(Q, Integer)   ' échoue 
DirectCast échoue car le type d'exécution de Q est Double. CType réussit car Double peut être converti en Integer, mais DirectCast échoue car le type d'exécution de Q n'est pas encore Integer.

TryCast de VB 2005 (Framework 2)

TryCast fonctionne comme DirectCast mais retourne Nothing si la conversion est impossible (et ne plante pas!).


V-D-4-d. Fonctions spécifiques

CType fait toutes les conversions, mais on peut aussi utiliser des fonctions qui sont spécifiques au type de la variable de retour: Le nom de ces fonctions contient le nom du type de la variable de retour.

CBool()  Pour convertir en Booléen
CByte()  Pour convertir en octet
CChar()  Pour convertir en Char
CDate()  Pour convertir en Date
CDbl()   Pour convertir en Double
CDec()   Pour convertir en Decimal
CInt()   Pour convertir en Integer
CLng()   Pour convertir en Long
CObj()   Pour convertir en Objet
CShort() Pour convertir en  Short
CSng()   Pour convertir en Single
CStr()   Pour convertir en String
Et en VB 2005
CSByte()   Pour convertir en SByte
CUShort() Pour convertir en  UShort
CUInt()   Pour convertir en UInteger
CULng()   Pour convertir en ULong
Exemple CDbl  retourne un 'Double'.

Dim I As Integer=123

Dim D As Double

D=CDbl(I)    'donnera D=123  D est un Double (réel double précision)
Ces fonctions sont plus rapides car elles sont spécifiques.

Remarque:

Les fonctions CInt et CLng arrondissent les parties décimales égales à 0,5 au nombre pair le plus proche. Par exemple, 0,5 s'arrondit à 0 et 1,5 s'arrondit à 2. Bizarre!!


V-D-4-e. Val et Str (de MicroSoft.VisualBasic) existe aussi:

Ouf pour les anciens!!

Ces fonctions permettent aussi la conversion String=>Numérique et Numérique=>String

Val donne la valeur numérique d'une expression String.

Dim i As Integer

i=Val("5")    ' i=5
Val s'arrête au premier caractère non numérique.

Val("12er") retourne 12

Val reconnaît le point (et pas la virgule)


Dim i As Double

i=Val("5.45")    ' donnera i=5,45

i=Val("5,45")    ' donnera i=5
Str transforme une valeur numérique en String:

Dim s As String

s=Str(1999)    ' s=" 1999"
Noter bien: Str ajoute un espace à gauche ou le signe'-' si le nombre est négatif.

Str ne reconnaît que le point comme séparateur décimal. (Pour utiliser les autres séparateurs internationaux, il faut utiliser la fonction CStr() ).


V-D-4-f. La Classe System.Convert:

La Classe System.Convert permet la conversion d'un type de base vers un autre:

.ToString en fait partie

Exemple

Pour convertir un Single en Byte (entier 8 bits non signé)

.ToByte

Pour convertir un Byte en Single:

.ToSingle

singleVal = System.Convert.ToSingle(byteVal)
en Decimal

.ToDecimal

On a des méthodes pour pratiquement convertir tous les types en tous les types. Cherchez!!

On verra plus loin, la fonction Format utilisée pour convertir les valeurs numériques que vous voulez mettre aux formats dates, heures ou monnaie ou dans d'autres formats définis par l'utilisateur.


V-D-4-g. Pour résumer et faire très simple, retenir ++++:

ToString pour les conversions en String des variables numériques(pour afficher).

Ctype pour convertir tout en tout.

Le fait de convertir d'un type dans un autre s'appelle ' effectuer un cast'


V-D-4-h. Conversion Explicite et Implicite.

A noter que dans cette page , on a étudié la conversion Explicite: est permet de forcer la conversion vers un type à l'aide de mots clés.

Exemple

Dim d As Double = 2.65

Dim i As Integer

 i=CType(d,Integer)
Il existe aussi la conversion implicite effectuée automatiquement sans syntaxe particulière et de manière transparente.

VB peut le permettre ( Si Option Explicit Off dans la configuration )

Exemple

Dim d As Double = 2.65

Dim i As Integer

 i=d  'Pour affecter à i le Double d, Vb a transformé le double d en Integer.
On verra que ce mode de travail n'est pas recommandé.


V-D-4-i. Conversion restrictive.

warning Attention, la conversion est dite restrictive si le type final ne peut pas convertir toutes les valeurs du départ:
Si je convertis un Single en Integer, la partie décimale peut être tronquée, c'est une conversion restrictive.

L'inverse (conversion Short en Single par exemple) est dite étendue.


V-D-4-j. Séparateur décimal: le point ou la virgule?

Les fonctions Val () et Str () ne reconnaissent que le point (.) comme séparateur décimal.

Dim s As Single

s=Val ("123.4")    'est accepté, c'est 123,4 en français.
On rappelle aussi que le séparateur d'un littéral est le point (un littéral sert à donner une valeur à une variable):

Dim s As Single

s= 456.67
Les fonctions CDbl, CType, CSng ou Parse ainsi que ToString utilisent le séparateur des paramètres locaux de la machine . Ils reconnaissent la culture.

Le symbole de séparateur décimal (ainsi que celui des milliers ) est donc spécifique à la culture.
  • En France, sur votre ordinateur,le séparateur décimal est la virgule.
    
    Dim s As Single
    
    s = CType("123,4", Single)
    
    Console.Out.WriteLine(s.ToString)
    
    Affiche: '123,4'

    Par contre s = CType("123.4", Single) est refusé.

  • Au Usa le séparateur décimal est le point.
    
    s = CType("123.4", Single) est accepté
    
    Console.Out.WriteLine(s.ToString)
    
    'Affiche '123.4'
    
On remarque donc que ToString utilise aussi le séparateur spécifique à la culture.

Console.Out.WriteLine(s.ToString)
Affiche: '123,4' en France

Lors de l'utilisation d'autres séparateurs décimaux (applications internationales, par exemple), convertissez la chaîne en nombre à l'aide de la fonction CDbl ou CType CSng ou Parse.

Pour voir quel est le séparateur en cours:

Menu Démarrer->Paramètres->Panneau de configuration>Options régionales et linguistiques.

Obtient le séparateur décimal en fonction des paramètres locaux de la machine par du code.

SeparateurDécimal = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator
On peut modifier le CultureInfo:

On peut, si on est en CultureInfo Français, afficher en mode Us

Dim i As Single = 45.78

' Afficher dans la CultureInfo courante: Français 

Console.WriteLine(i.ToString)    'Affiche 45,78

' Créer un CultureInfo en anglais  U.S.
Dim us As New CultureInfo("en-US")


' Afficher sur la console  en CultureInfo Us.
Console.WriteLine(i.ToString("c", us))    'Affiche 45.78
Il s'agit ici d'une surcharge de ToString , "c" signifie NumberFormatInfo


V-D-4-k. IsNumeric

On utilise la fonction IsNumeric pour déterminer si le contenu d'une variable peut être évalué comme un nombre.

Exemples:

Dim MyVar As Object
Dim R As Boolean

MyVar = "45" 
R = IsNumeric(MyVar) ' R= True.
' ...
MyVar = "678.92" 
R = IsNumeric(MyVar) ' R= True.
' ...
MyVar = "45 Kg"
R = IsNumeric(MyVar) ' R= False.
warning 'Attention le dernier exemple indique que "45 Kg" n'est pas purement numérique, mais Val("45 Kg") retourne 45 sans déclencher d'erreur car Val transforme les caractères numériques à partir de la gauche, en s'arrêtant dès qu'il y a un caractère non numérique.

V-D-4-l. Lexique anglais=>Français:

To Cast = Mouler, couler.

Type = Type, genre.

To parse = analyser.


V-D-5. Les 'Tableaux'

C'est un beau tableau, mais en VB, c'est pas ça un tableau!!

Les tableaux permettent de regrouper des données de même type.

Les tableaux vous permettent de faire référence à un ensemble de variables par le même nom et d'utiliser un numéro, appelé index ou indice, pour les distinguer.

Comment déclarer un tableau :

Dim Tableau(3) As Integer 'déclare un tableau de 4 entiers

On remarque que, dés la déclaration du tableau, le nombre d'éléments est bien défini et restera toujours le même.

Dim Tableau(3) As Integer entraîne la création des variables 'Integer' suivante:

Tableau (0)

Tableau (1)

Tableau (2)

Tableau (3)

Contenu du tableau:

0
0
0
0
soit 4 éléments

Noter que comme c'est un tableau d'entier, juste après la création du tableau les éléments sont initialisés à 0.

warning Le tableau commence toujours par l'indice 0
Le nombre d'éléments dans le tableau est toujours égale à l'indice de dimension + 1 (ou l'indice du dernier élément+1)
Dim Tableau(3) comporte 4 éléments (éléments d'index 0 à 3).

Tableau(1)= 12 permet d'affecter le nombre 12 au 2eme élément du tableau.

0
12
0
0
S=Tableau(1) permet d'affecter à la variable S le 2eme élément du tableau.

Un tableau peut avoir plusieurs dimensions :

Dim T(2,2)      3 X 3 éléments
Pour un tableau à 2 dimensions le premier argument représente les lignes, le second les colonnes.

Voyons pour chaque élément du tableau le numéro de ligne et celui de la colonne: (pas le contenu des éléments ici mais leur index)

élément:0,0 élément:0,1 élément:0,2
élément:1,0 élément:1,1 élément:1,2
élément:2,0 élément:2,1 élément:2,2
Exemple:

La première ligne comporte les 3 éléments: T(0,0) T(0,1) et T(0,2)

Pour mettre 33 dans l'élément central:

Dim T(2,2) As Integer

T(1,1)=33
voyons le contenu du tableau:

0 0 0
0 33 0
0 0 0
Il est possible de créer des tableaux à 3, 4 ..dimensions:

Exemple:

Dim T(4,2,3) crée un tableau de 4X2X3 éléments.

On peut créer des tableaux de tableaux:

Dim T(2),(2) Il a autant d'élément que le tableau T (2,2) (mais pour l'accès à un élément, ils fonctionnent plus vite)

Il est possible de créer des tableaux avec tous les types de variable (y compris les structures)

Dim Mois(11) As String    'tableau de String de 12 éléments
Notez que dans ce cas les éléments contiennent Nothing car le tableau contient des String et quand on déclare une String, elle contient Nothing au départ.

On peut initialiser un tableau (Donner une valeur aux éléments):

En effet après dimensionnement d'un tableau, il contient:

la valeur 0 si c'est un tableau de numérique.

Nothing si c'est un tableau de String ou d'Objet.

Dim mois(11) As String 

'mois (1) contient Nothing

mois(0)="Janvier"

mois(1)="Février"

mois(2)="Mars"
ou lors de sa déclaration :

Dim Mois() As String ={Janvier,Février,Mars}
On remarque ici, que le nom d'élément n'est pas indiqué; comme on initialise 3 éléments, le tableau en aura 3.

On verra dans un des exemples que l'on peut créer un tableau avec la méthode CreateInstance.

Autre syntaxe:

Dim t As String()    'déclaration

t = New String(1) {"One", "Two"} ' on affecte au tableau un nouveau tableau de String contenant "One" et "Two"

 

Dim R(,) as Integer ={{0, 1}, {1, 2}, {0, 0}, {2, 3}}
On déclare et on initialise en même temps un tableau à 2 dimensions, remarquez qu'on rentre les éléments 2 à 2.(Equivalent à R(0,0)=0 R(0,1)=1 R(1,0)=1 R(1,1)=2 ..)

Redim permet de redimensionner un tableau (modifier le nombre d'éléments d'un tableau existant), si on ajoute Preserve les anciennes valeurs seront conservées.

warning Attention , on ne peut pas modifier le nombre de dimension, ni le type des données. Un tableau à 2 dimensions de 20 fois 20 string pourra être redimensionné en tableau de 30 fois 30 String, mais pas en tableau d'entiers ou à 3 dimensions.

Dim T(20,20) As String

...

Redim Preserve T(30,30)
Il est possible d'écrire Dim T( , ) As String

Dim T( , ) As String 'Sans donner les dimensions du tableau: il est déclaré mais n'existe pas car T(1,1)="toto" déclenche une erreur. Il faut avant de l'utiliser écrire Redim T(30,30), (sans remettre As String).

Certaines instructions comme Split redimensionne elle-même le tableau au nombre d'élément nécessaire.

Dim Nom() as String

Nom=S.Split(Separateur)
Erase efface le tableau et récupère l'espace.

Erase Tableau (équivalent à tableau= Nothing )

Clear réinitialise le tableau. (remise à 0 d'un tableau de numérique par exemple)

Array.Clear(t, 2, 3) réinitialisation tableau t à partir de l'élément 1 et pour 3 éléments.

Comment parcourir un tableau?

Pour parcourir un à un tous les éléments d'un tableau, on utilise une boucle:

Exemple: créer un tableau de 11 éléments et mettre 0 dans le premier élément, 1 dans le second, 2 dans le troisième...

Dim T(10) As Integer

Dim i As Integer

 

For i = 0 To 10    'Pour i allant de 0 à 10

         T(i)=i

Next i
La variable de boucle i est utilisée pour parcourir le tableau: on utilise l'élément T( i ) donc successivement T(1) puis T(2)...et on affecte i donc 1 puis 2 puis 3..

On peut aussi utiliser For Each:( un tableau hérite de la classe System.Array)

Dim amis() As String = {"pierre", "jean", "jacques", "toto"}

For Each nom As String In amis

    Console.Out.WriteLine(nom)

Next
L'exemple affiche sur la console (menu Affichage->Fenêtre->Sortie) les noms qui sont dans le tableau.

VB alloue de l'espace mémoire pour chaque élément crée. Ne dimensionnez pas un immense tableau si vous avez besoin d'un tableau de 4*4 car cela utilise de la mémoire inutilement.


V-D-5-a. Un tableau est un objet !!

Créons 2 tableaux et examinons les principales méthodes.

Dim a(3) As String

Dim b(3) As String

b=a         ‘Copie le tableau a dans b

b=a.copy    ‘Est équivalent
warning Attention: il copie les références (l'adresse, l'endroit ou se trouve la variable) et non pas la valeur de cette variable, ce qui fait que si vous modifiez b(3), a(3) sera aussi modifié.
Car lorsque vous assignez une variable tableau à une autre, seul le pointeur (l'adresse en mémoire) est copié.

Pour obtenir une copie ‘indépendante' faire :

b=a.clone

Dans ce cas si vous modifié a(2), b(2) ne sera pas modifié.

Par contre a(1)=b(1) n'affecte que l'élément a(1)


V-D-5-b. La Classe Array.

Tous les tableaux viennent de la classe Array; vous pouvez accéder aux méthodes et propriétés de System.Array de chaque tableau Par exemple, la propriété Rank retourne le nombre de dimension du tableau et la méthode Sort trie ses éléments.

Exemple :

Soit un tableau Mois()

Clear

Array.Clear(Mois,0,2) ‘Efface 2 éléments du tableau Mois à partir de l'élément 0

Reverse

Array.Reverse(Mois, 1, 3) inverse les 3 éléments à partir de l'élément 1

Copy

Array.Copy(Mois,1,Mois2,1,20) copie 20 éléments de Mois vers Mois2 à partir du 2eme élément.

Sort

Array.sort(Mois) Trie le tableau Mois

Malheureusement cette méthode marche sur des tableaux unidimensionnels uniquement.

Au lieu d'utiliser un tableau à 2 dimensions (sur lequel la méthode 'Sort' ne marche pas, on peut ruser et créer 2 tableaux et surcharger la méthode sort pour trier les 2 tableaux (un servant de clé, le second d'items):

Array.Sort(myKeys, myValues) (Voir un exemple plus bas)

Equals compare 2 tableaux.

Binarysearch recherche un élément dans un tableau trié unidimensionnel.(algorithme de comparaison binaire performant sur tableau trié)

Exemple :

I=Array.BinarySearch(Mois, "Février") ‘retourne I=1  se souvenir le premier élément est Mois(0)
BinarySearch effectue une recherche dichotomique: il regarde l'élément du milieu, si l'élément cherché est plus petit, il regarde l'élément du milieu du haut du tableau.....

C'est rapide mais le tableau doit être trié.

S'il trouve un élément il retourne sous index.

Si la recherche échoue, il retourne un nombre négatif, si on effectue un Not sur ce nombre retourné, on a l'index où on doit insérer l'élément

IndexOf

Recherche un objet spécifié dans un tableau unidimensionnel (trié ou non), retourne l'index de la première occurrence.

Dim myIndex As Integer = Array.IndexOf(myArray, myString)
 
Retourne -1 si l'élément n'est pas trouvé.

LastIndexOf fait une recherche à partir de la fin.

Ici la recherche est linéaire: on compare l'élément recheché avec le premier puis le deuxième, puis le troisième élément...C'est long , mais le tableau n'a pas besoin d'être trié.

On a probablement intérêt à trier le tableau et à faire un Binarrysearch. (Cela se dit mais je ne l'ai pas vérifié)

Ubound

Retourne le plus grand indice disponible pour la dimension indiquée d'un tableau

Dim Indice, MonTableau(10, 15, 20)
Indice = UBound(MonTableau, 1) ' Retourne 10. (1 indique la première dimension du tableau)
 
GetUpperBound même fonction

Indice = MonTableau.GetUpperBound(0) '( 0 pour première dimension!!) Retourne 10.
Lbound existe (plus petit indice) mais est inutile car toujours égal à 0.

Length retourne un entier qui représente le nombre d'éléments total dans le tableau.

Pour un tableau à une dimension Lenght-1 retourne l'indice du dernier élément.

Cela est souvent utilisé pour parcourir tous les éléments du tableau:

 Dim t(10) As String

 Dim i As Integer

 For i = 0 To t.Lenght-1

   t(i)=..

 Next t
On remarque que dans un tableau multi dimension Lenght n'est pas égal à Ubound

GetLength(x) retourne un entier qui représente le nombre d'éléments dans la dimension x.

GetValue et SetValue permettent de connaître ou de modifier la valeur d'un élément du tableau:

Mois.GetValue(0) est équivalent à Mois(0)

Dans un tableau à 2 dimensions comment modifier l'élément (0,3):

myArray.SetValue("fox", 0, 3)
C'est équivalent à myArray(0,3)="fox"

ArraySegment permet de définir un segment, une plage dans une Array.(framework 2)

Dim myArrSegMid As New ArraySegment(Of String)(myArray, 2, 5) 'ici le segment débute au second élément et contient 5 éléments.
(Si on modifie un élément de myArrSegMid cela modifie myArray car le segment définie une plage du tableau et non un nouveau tableau)

Sur des tableaux, les actions à effectuer sont principalement:

Rechercher un élément.

Trier le tableau.

Insérer un élément.

Enlever un élément.

On a déjà évoqué cela , mais pour étudier le détail voir les tableaux et collections

Pour les super pro (débutant passe ton chemin), on peut utiliser des méthodes génériques.

Exemple recherche dans un tableau de short nommé monTab l'élément 2

index= Array.indexOf (Of Short)(monTab, 2) est hyper plus rapide que

index= Array.indexOf (monTab, 2) car la première version avec généric est directement optimisée pour les Short.

Il est est de même pour Binarysearch et Sort.

Cela est valable pour les types 'valeur' (peu d'intérêts pour les strings par exemple).


V-D-5-c. Exemple:

Exemple détaillé:

Créer un tableau de 6 éléments, mettre dans chaque élément du tableau le carré de son indice, afficher le contenu du tableau.

Cela montre l'intérêt d'utiliser une boucle pour balayer tous les éléments d'un tableau. Première boucle pour remplir le tableau, seconde boucle pour afficher.(Une boucle For ..Next est ici utilisée, on verra cela plus loin.)


      Dim arr(5) As Integer

      Dim i As Integer

      For i = 0 To arr.GetUpperBound(0)' GetUpperBound(0) retourne 5

         arr(i) = i * i

      Next i

 

     For i = 0 To arr.GetUpperBound(0)

         Console.WriteLine("arr(" & i & ") = " & arr(i))

      Next i
Faire une boucle allant de 0 au dernier élément du tableau (For i=0 to ..)

Dans chaque élément du tableau mettre le carré de son indice (arr(i)=i*i )

Nouvelle boucle pour afficher les noms des différents éléments et leur contenu. (Console.WriteLine() affiche sur la console le nom de l'élément et son contenu)

Le programme génère la sortie suivante :

arr(0) = 0

arr(1) = 1

arr(2) = 4

arr(3) = 9

arr(4) = 16

arr(5) = 25
Exemple de recherche dans un tableau:

Dans un tableau de String rechercher dans quel élément et à quelle position se trouve la string "MN".

Dim Tableau() As String = {"ABCDEFG", "HIJKLMNOP"}
Dim AChercher As String = "MN"
Dim i As Integer
Dim position As Integer
For i = 0 To Tableau.Length - 1 'on parcourt chaque élément du tableau
    position = Tableau(i).IndexOf(AChercher) 'dans l'élément  du tableau on cherche la sous-chaîne
    If position >= 0 Then Exit For
Next i
Exemple de tri de 2 tableaux:

On crée un tableau de clés et un tableau des valeurs, à chaque clé est liée une valeur.

On trie à partir du tableau des clés myKeys , le tableau myValues est modifié pour 'suivre' le tri des clés. La Sub PrintKeysAndValues affiche les résultats.

Public Shared Sub Main()

' ****************Création des tableaux.

Dim myKeys() As String = {"red", "GREEN", "YELLOW", "BLUE", "purple", "black", "orange"} 'Tableau des clé

Dim myValues() As String = {"strawberries", "PEARS", "LIMES", "BERRIES", "grapes", "olives", "cantaloup"} 'tableau des éléments

 

'Affichage du tableau non trié

Console.WriteLine("Tableau non trié:")

PrintKeysAndValues(myKeys, myValues)


' Tri les éléments 1 à 3 puis affichage.

Array.Sort(myKeys, myValues, 1, 3)

Console.WriteLine("Après tri d'une partie du tableau:")

PrintKeysAndValues(myKeys, myValues)


    ' Tri la totalité du tableau.

Array.Sort(myKeys, myValues)

Console.WriteLine("Après tri de la totalité du tableau:")

PrintKeysAndValues(myKeys, myValues)

End Sub 'Fin de Main

 

    ' Routine affichant dans la console les clés et valeurs

Public Shared Sub PrintKeysAndValues(ByVal myKeys() As [String], ByVal myValues() As [String])

Dim i As Integer

For i = 0 To myKeys.Length - 1

    Console.WriteLine(" {0,-10}: {1}", myKeys(i), myValues(i))

Next i

Console.WriteLine()

End Sub 'PrintKeysAndValues
Création de tableau avec CreatInstance

' Créons un tableau d'entier (Int32) comprenant 5 éléments.
Dim myArray As Array = Array.CreateInstance(GetType(Int32), 5)
Dim i As Integer
For i = myArray.GetLowerBound(0) To myArray.GetUpperBound(0)
    myArray.SetValue(i + 1, i)
Next i 
Merci Microsoft pour les exemples.


V-D-6. Les 'Collections'

Une alternative aux tableaux est l'usage de Collection.

Il y a:
  • les collections VisualBasic (Collection)
  • les classes du Framework (ArrayList, Stack, Queue, BitArray, HashTable, SortedList, StringCollection)
  • les classes de collections génériques de VB 2005
Une collection fonctionne plutôt comme un groupe d'éléments dans laquelle il est possible d'ajouter ou d'enlever un élément à n'importe quel endroit sans avoir à se préoccuper de la taille de la collection, ni ou se trouve l'élément.

Le nombre d'élément n'est pas défini au départ comme dans un tableau. Dans une collection il n'y a que les éléments que l'on a ajouté.

Les éléments sont repérés grâce à un index ou avec une Clé unique

Les items affichées dans une ListBox donnent une idée concrète de ce qu'est une collection.


V-D-6-a. Exemple simpliste permettant de comprendre la notion de collection:

Soit la collection Col, au départ elle est vide.

J'ajoute des éléments (ou items) à cette collection.

Col.Add ("Toto")

Voici la collection:

Toto
La collection a maintenant 1 élément.

Col.Add("Lulu")

Col.Add("Titi")

Toto
Lulu
Titi
La collection a 3 éléments maintenant.

Col.Remove(2) enlève l'élément numéro 2

Toto
Titi
La collection n'a plus que 2 éléments maintenant.

On voit que le nombre d'éléments n'est pas connu à l'avance, il varie en fonction des éléments ajoutés (ou retirés)

Un élément est repéré par son indice.

Col.Item(2) contient "Titi" (le second Item de la collection)

Remarque:

J'ai pris une collection de 'Base 1': le premier élément à l'indice 1, il existe aussi des collections (celles venant des classes .Net) de Base 0.


V-D-6-b. L'objet 'Collection' c'est du VisualBasic:

'Collection' existait déjà en VB6!!

L'objet collection utilise un couple Clé-Valeur, pour chaque élément.

Ici le premier élément a pour clé: 69, pour valeur:'Rhône'

C'est pratique car cela permet de retrouver une valeur à partir de la clé.

Pour utiliser une collection d'objets, vous devez premièrement créer l'objet maCollection.

Dim maCollection As New Collection
Dès que cet objet est créé, vous pouvez ajouter (avec Add), enlever ou manipuler des éléments.

On utilise la syntaxe: NomCollection.Add( élément, Clé)

maCollection.Add("Bonjour", "30")

maCollection.Add("Monsieur", "31")

maCollection.Add("Et", "32")

maCollection.Add("Madame", "33")

Il peut y avoir 2 autres paramètres:

maCollection.Add(Element, Clé, Before, After)

Before ou After peuvent être utilisés pour placer l'élément à insérer avant ou après un élément de la collection. Si Before ou After est un nombre c'est l'index des éléments qui est utilisé, si c'est une string c'est la clé.

Pour récupérer un objet de la collection, on peut utiliser
  • l'index:
    
    Label1.Text = maCollection.Item(2) 'Affiche le second élément: Monsieur
    
    warning Attention le premier élément est ici l'élément 1 (l'index va de 1 à Count); c'est hérité du VB!!
  • La clé
    
    Label1.Text = maCollection.Item("33") 'Affiche Madame
    
    Pour effacer un objet de la collection, on peut utiliser

  • l'index:
    
    maCollection.Remove(2) 'Efface le second élément: Monsieur
    
  • La clé
    
    maCollection.Remove("33") 'Efface Madame
    
    On peut utiliser For each pour parcourir la Collection:
    
    For Each S As string In maCollection
    
        MsgBox(i)
    
    Next S
    
Remarque pour les 'bons':

Noter que Collection peut contenir des Objets donc n'importe quoi.

Label1.Text = maCollection.Item(2)
Est accepté si Option Strict=Off car il y a y a conversion implicite.

Si Option Strict=On, il faut écrire:

Label1.Text = CType(maCollection.Item(2), String) pour convertir explicitement l'objet en String

V-D-6-c. Liste d'objets: ArrayList : c'est une Classe .Net.

Fait partie de System.Collections

La ArrayList est une collection particulière: On peut y mettre des objets : chaînes, nombres… rien n'empêche que le premier élément soit un entier, le second une chaîne…Il n'y a pas de clé.

warning Attention le premier élément est ici l'élément 0 (l'index va de 0 à count-1) ; c'est du .NET!!

Dim L As New ArrayList()     'On crée une collection ArrayList

Dim L As ArrayList = ArrayList.Repeat("A", 5) 

'On crée une ArrayList de 5 éléments contenant chacun  "A" (on répète "A")
 

L.Add("Bonjour")             'On ajoute un élément à la collection

MsgBox(L(0))                 'On affiche le premier élément
On affiche le premier élément L(0)

On pourra aussi écrire L.Item(0) pour pointer le premier élément.

      MsgBox(L.Count.ToString)     'On affiche le nombre d'élément.
warning Attention c'est le nombre d'éléments. S'il y a 3 éléments dans la ArrayList ce sont les éléments d'index 0,1,2.

      L.Remove("Bonjour")          'On enlève un élément de la liste

      L.RemoveAt(0)                'On enlève l'élément 0 de la liste

      L.Sort()                     'Trie la collection

L.Clear()                    'Efface tous les éléments

      L.Containts (élément)        ' Retourne True si la liste contient élément.   

Insert permet d'insérer à un index spécifié.

     L.Insert( position, Ainserrer)

      InsertRange insère une ArrayList dans une Autre ArrayList.

      L.Containts (élément)  ' Retourne True si la liste contient 'élément'.

 
Recherche d'un élément dans une collection NON TRIEE avec IndexOf:

Dim l As New ArrayList

Dim i As Integer

l.Add("toto")

l.Add("lulu")

i = l.IndexOf("lulu")

MsgBox(i.ToString)    'Affiche 1
On rappelle qu'il existe aussi LastIndexOf qui démarre par la fin et une surcharge permettant de débuter la recherche à partir d'un indice donné (i = l.IndexOf(3,"lulu") recherche à partir du 3ème élément).

Recherche d'un élément dans une collection TRIEE avec BinarySearch:

Dim l As New ArrayList

Dim i As Integer

l.Add("toto")

l.Add("lulu")

l.Sort()'Il est nécessaire que le tableau soit trié 

i = l.BinarySearch("lulu")

MsgBox(i.ToString)
Pour parcourir une collection, 3 méthodes :

-Avec l'index de l'item

For i=0 to L.Count-1

      A=L.Item(i)

Next i
NB: Comme vu plus haut, on utilise Count pour trouver le nombre d'élément, aussi la boucle doit balayer de 0 à count-1.

-Avec For Each

Dim o As Objet

For Each o in L

      A=o

Next
-Avec l'objet IEnumerator (débutant passe ton chemin)

On crée un objet C de type IEnumerator pour parcourir la collection, cet objet a 3 propriétés:

MoveNext qui avance d'un élément dans la collection. S'il ne peut plus avancer (s'il est déjà après le dernier) il retourne False

Reset qui place l'élément courant au début, avant le premier élément (Comme au départ)

Current désigne l'élément courant.

Exemple montrant la seule manière de faire pour parcourir la collection:

Dim L As New ListArray

Dim C As IEnumerator= L.GetEnumerator()

While C.MoveNext())

     A=C.Current

End While
warning -Attention, si Option Explicit=On
Les éléments de la ListArray étant des objets, on ne peut pas les affecter à une variable String par exemple, il faut écrire:

Str = CType(L(0), String)    'on convertit (on cast) l'objet en String.
Remarque:

L.Add(Nothing)    'est accepté: on ajoute un élément vide

V-D-6-d. StringCollection: c'est une Classe .Net

Ne peut contenir que des chaînes (cela devrait aller plus vite)

' Créer une StringCollection.
Dim myCol As New StringCollection()

'Créer un tableau de String, l'ajouter( en fin) à la collection.
Dim myArr() As [String] = {"rouge", "vert", "orange", "vert",)
myCol.AddRange(myArr)

'Ajouter un élément à la fin de la collection
myCol.Add("marron")

'Insérer un élément à l'index 3
myCol.Insert(3, "bleue")

'Enlever une élément
myCol.Remove("orange")


' chercher et enlever tous les éléments "vert" 
Dim i As Integer = myCol.IndexOf("vert")
While i > - 1
myCol.RemoveAt(i)
i = myCol.IndexOf("vert")
End While

' La collection contient t'elle "jaune"?
If myCol.Contains("jaune") Then..

' Copie la collection dans un tableau.
Dim myArr2(myCol.Count) As [String]
myCol.CopyTo(myArr2, 0)

' Efface toutes les strings de la Collection.
myCol.Clear()
 

'Afficher la liste des Strings

Dim myEnumerator As System.Collections.IEnumerator = myCol.GetEnumerator()

While myEnumerator.MoveNext()
Console.WriteLine(" {0}", myEnumerator.Current)
End While
'C'est un peu complexe!! on y reviendra.
warning Attention le premier élément est ici l'élément 0 (l'index va de 0 à count-1) ; c'est du .NET!!

V-D-6-e. HashTable c'est une Classe .Net

C'est un 'Dictionnaire' qui comporte des couples clé-élément, des paires clé-valeur.

La clé toujours unique permet de retrouver la valeur, La clé ne doit pas être vide non plus.

H.Add(Clé,Valeur) Ajoute un élément

H.Item(Clé) Retourne l'élément correspondant à une clé.

H.ContainsKey(Clé) Retourne True si la Clé est dans la table.

H.ContainsValues(Valeur)Retourne True si la valeur est dans la table.

H.Clear Efface tous les éléments

H.Remove(Clé) Supprime l'élément ayant une clé spécifiée.

Les collections H.Values et H.Keys contiennent les valeurs et les clés.

warning Attention le premier élément est ici l'élément 1 (index allant de 1 à count)
Exemple:

'  Creation d'une Hashtable.
Dim myHT As New Hashtable()

' Mettre des éléments dans la HashTable
myHT.Add("un", "premier")
myHT.Add("deux", "second")
myHT.Add("trois", "troisième")
myHT.Add("quatre", "quatrième")
 

'Recherche la valeur correspondant à la clé "trois"

myReponse=myHT.Item("trois")     'Retourne "troisième"
 

'Parcourir la HashTable

'Création d'un IDictionaryEnumerator
Dim myEnumerator As IDictionaryEnumerator = myHT.GetEnumerator()

While myEnumerator.MoveNext()

'Afficher clé et valeur
    MsgBox( myEnumerator.Key+ myEnumerator.Value)
End While

V-D-6-f. SortedList: c'est une Classe .Net

Il permet l'accès aux valeurs par l'intermédiaire des clés associées ou des index.

C'est un hybride de HashTable et de Array.

On ajoute un élément par mySL.Add(Clé,Valeur)

La séquence d'index est basée sur la séquence de tri. Quand un élément est ajouté, il est inséré dans l'ordre de tri adéquat, et l'indexation s'ajuste en conséquence. Le tri est donc automatique.

On peut donc lire une valeur par sa Clé ou son Index:
  • Quand la clé d'un élément permet d'accéder à celui-ci à l'aide de la propriété d'indexeur Item, l'élément se comporte comme Hashtable.
    
    mySL.Item(CLE) 'retourne la valeur correspondant à la clé CLE
    
  • Quand l'index d'un élément permet d'accéder à celui-ci à l'aide de GetByIndex ou de SetByIndex, l'élément se comporte comme Array (tableau avec un Index).
    
    mySL.GetKey(3) 'retourne la Clé qui est dans l'élément d'index 3
    
    mySL.GetByIndex(3) 'retourne la valeur qui est dans l'élément d'index 3
    
SortedList maintient en interne deux tableaux , un tableau pour les clés et un autre pour les valeurs associées.

Index de base 0: Le premier élément est 0.

Exemple:

Dim mySL As New SortedList()
mySL.Add("1", "Hello")
mySL.Add("2", "World")
mySL.Add("3", "!")


Console.WriteLine(" Count: {0}", mySL.Count)    'Nombre d'éléments
Console.WriteLine(" Capacity: {0}", mySL.Capacity) 'nombre d'éléments possible mais il augmente automatiquement, on n'a pas à s'en occuper.
 

Dim i As Integer
For i = 0 To mySl.Count - 1
    Console.WriteLine( myList.GetKey(i)& myList.GetByIndex(i))  'affiche les éléments de la collection

                                                                ' par index croissant.
Next i

V-D-6-g. Queue: c'est une Classe .Net

Collection d'objets de type FIFO (First In, First Out)

Premier arrivé premier servi.

C'est la queue devant un cinéma, le premier arrivé, prend son billet le premier.

Les objets (String, Integer,....) stockés dans Queue sont insérés à une extrémité et supprimés à l'autre.

Le nombre d'élément de la queue est géré automatiquement.

DeQueue supprime et retourne l'objet de début de liste

EnQueue ajoute un objet en fin de liste

Peek retourne l'objet de début sans le supprimer


Dim myQ As New Queue()
myQ.Enqueue("One")
myQ.Enqueue("Two")
myQ.Enqueue("Tree")


Console.WriteLine ( myQ.Count) 'Affiche le nombre d'éléments.
 

Console.WriteLine (myQ.Dequeue()) 'Affiche le premier sorti en le sortant. "one" dans notre exemple.
'S'il n'y a plus d'élément cela lève une exception (une erreur), il faut donc gérer l'exception ou contrôler le nombre d'élément avec la propriété Count.

If MyQ.Count>0 then

    myQ.Dequeue..

End If

Console.WriteLine (myQ.Peek()) 'Affiche le premier élément sans l'enlever de la Queue
 

myQ.Clear() 'Efface tous les éléments de la queue

V-D-6-h. Stack: c'est une Classe .Net

Collection d'objets de type pile ( ou stack) LIFO (Last In, First Out)

Dernier entré, premier sortie.

Ce type de stack (pile) est très utilisé en interne par les programmes informatiques: on stocke dans une stack les adresses de retour des procédures appelées, au retour on récupère l'adresse du dessus.

Push insère un objet en haut de la pile

Pop enlève et retourne un objet en haut de la pile

On peut utiliser une pile dans un programme pour gérer le déplacement de l'utilisateur dans un arbre, les éléments en cours sont stockés par Push, pour remonter en chemin inverse, on Pop.

warning Attention le premier élément est ici l'élément 1 (élément d'index 1 à count)
Exemple:

Dim MaPile As New Stack()

Dim Str As String

'Ajouter des éléments à la pile

MaPile.Push ("A")

MaPile.Push ("B")

MaPile.Push ("C")

'Récupérer un objet de la pile:

 Srt =MaPile.Pop()
Str est maintenant égal à "C"

warning Attention, si Option Explicit=On, les éléments de la pile étant des objets, on ne peut pas les affecter à une variable String, il faut écrire:

Str = CType(MaPile.Pop(), String)    'on convertit (cast) l'objet en String
Si la pile est vide et que l'on 'Pop', une exception non gérée du type 'System.InvalidOperationException' se produit.(une erreur se produit et cela plante!!), là aussi vérifier que MaPile.Count (qui indique le nombre d'éléments dans la pile) n'est pas égale à 0 avant de 'Poper'.

Mapile.Clear()     'Supprime tous les objets.

V-D-6-i. BitArray: c'est une Classe .Net

Crée une collection de booléens (codés sur un bit). La valeur de chaque élément est True ou False.

 Creation de BitArray.
Dim myBA As New BitArray(5)    'BitArray de 5 bits

Dim myBA As New BitArray(5, False) 'BitArray de 5 bits à False

Dim myBA() As Boolean = {True, True, False, False, False}
Dim myBA As New BitArray(myBytes) 'on crée un  tableau de Booleans que l'on met dans le BitArray
Le premier élément est l'élément 0.

On peut mettre tous les bits à True avec SetAll:

myBA.SetAll(True)

' Mettre le dernier Bit à False avec Set.
myBA.Set(myBA.Count - 1, False)
 

'Obtenir la valeur du second Bit

myBA.Get(1)
 
myBA(1) ou myBA.Item(1) donnent aussi la valeur du second Bit.

On peut effectuer des opérations logiques entre 2 BitArray (Or, Xor, And Not):

Exemple pour Or:

myBA1.Or(myBA2)
Count et length donnent le nombre d'éléments, mais count est en lecture seule, Length permet, lui, de modifier le nombre d'éléments.


V-D-6-j. En VB 2005 :il y a les Collections 'generic' ou 'Specialized'

Collections génériques:

On peut créer une collection générique (System.Collections.Generic) et lui imposer un type.

Exemple: créons une collection de String (List(Of String)): Elle est typée car elle ne peut contenir que des 'String'.

Dim l As New System.Collections.Generic.List(Of String)
Il s'agit d'une List avec Index.

l.Add("toto")    'On ajoute une string

Dim S As String = l.Item(0) ' l'item est bien typé : même avec 'Option Strict=on' pas besoin de CType. 
Il y a aussi de nouveaux types de collections génériques

Les Dictionnary(Of..) avec Clé et valeur

Les SortedDictionnary(Of..) avec Clé et valeur trié.

Les LinkedList(Of..) Liste Chaînée, chaque élément comportant une propriété Value, Next et Previous.

Les SortedList(Of..)..

Les Stack(Of..)

Les Queue(Of..)

Collections spécialisées:

L'espace System.Collections.Specialized fournit de nouveau type de collection très spécifiques:

Exemple: ListDictionary avec Clé et Valeur:

Dim l As New System.Collections.Specialized.ListDictionary

l.Add(2, "toto")
On peut aussi créer des collections 'composées'

Dim genericColl As New System.Collections.Generic.Dictionary(Of String, String)
genericColl.Add("PremiereClé", item1)
BitVector32 est un type de collection qui contient des Booléens ou des entiers.
StringCollection est un type de collection String.

Intérêts de ses collections est qu'elle sont fortement typées: Elle n'acceptent que des éléments d'un type: des String dans le dernier exemple.


V-D-6-k. Généralisation de la notion de collection.

Certains objets ont une liste de données, d'items, Vb les organise en Collections.

Une collection peut donc faire partie des propriétés d'un objet.

Exemple:

On verra plus loin qu'un contrôle nommé TextBox peut contenir du texte, ce contrôle à une collection nommée .lines qui contient chaque ligne du texte (s'il y en a plusieurs)

Si le texte contient 3 lignes, elles seront dans la collection .lines

Texbox1.lines(0)    'remarquer, ici le premier élément est 0!!

Textbox1.lines(1)

Textbox1.lines(2) 
L'indice des éléments va de 0 à count-1

Autres exemple:

Les contrôles ListBox possèdent une collection Items dans laquelle est placé tous les éléments contenus dans la liste. Pour ajouter un élément on utilise la méthode Add de la collection Items: ListBox.Items.Add( )

Un tas d'objets possèdent des collections.

Encore plus: chaque formulaire possède une Collections Controls. Il s'agit d'une collection qui contient tous les contrôles de ce formulaire.


V-D-6-l. Pourquoi le premier élément est 0 ou 1?

warning Le .NET Framework normalise les collections comme étant des collections de base zéro (ArrayList par exemple). Les Collections de Visual Basic fourni des collections de base 1.

V-D-6-m. Exemples sur les collections:

Créer une ArrayList, une queue, ajouter la queue à la ArrayList, chercher un élément, insérer un élément.

Les collections font partie de l'espace de nom Systeme.Collections

Imports System.Collections


' Créer une ArrayList.
Dim myAL As New ArrayList()
myAL.Insert(0, "un")
myAL.Insert(1, "deux")

' Créer une Queue.
Dim myQueue As New Queue()
myQueue.Enqueue("trois")
myQueue.Enqueue("quatre")


' Copies la Queue dans ArrayList à l'index 1.
myAL.InsertRange(1, myQueue)


' Chercher "deux" et ajouter "moins de deux" avant .
myAL.Insert(myAL.IndexOf("deux"), "moins de deux")


' Ajouter "!!!" à la fin.
myAL.Insert(myAL.Count, "!!!")

V-D-6-n. Lexique anglais=>Français:

Array = tableau, table.

lenght= longeur

Key= clé

Remove (to)= enlever

Stack= tas


V-D-7. Les 'Structures'

Permet de regrouper des données de type différent:

(En Vb6 il y avait les types définis par l'utilisateur, ils sont remplacés par les structures.)

info Les structures sont intéressantes quand vous voulez utiliser des variables contenant plusieurs informations de différent type.
Exemple :

Vous voulez définir une variable contenant une adresse composée d'un numéro, de la rue,de la ville.

Il faut d'abord définir la structure (au niveau Module ou Class, pas dans une procédure)

Public Structure Adresse

   Dim Numero     As Integer

   Dim Rue        As String

   Dim Ville      As String

End Structure
Puis dans une procédure il faut déclarer la variable :

Dim MonAdresse As Adresse
La variable MonAdresse est déclaré comme une adresse, elle contient donc:

un numéro 'stocké' dans MonAdresse.Numero

une nom de rue 'stocké' dans MonAdresse.Rue

un nom de ville 'stocké' dans MonAdresse.Ville

On pourra enfin l'utiliser :

MonAdresse.Numero=2

MonAdresse.Rue= "Grande rue"

MonAdresse.Ville= "Lyon"
On peut aussi utiliser le mot clé With pour ne pas avoir à répéter le nom de la variable (et cela va plus vite).

With MonAdresse

    .Rue= "Grande rue"

    .Ville= "Lyon"

End With
With est utilisable sur tous les objets.

Il est possible de travailler sur un tableau de structures:

Dim Adresses(99) as Adresse    'Permet de travailler sur un tableau de 100 adresses

Adresses(33).Rue="Place de la mairie"
On peut utiliser une variable déclarée par une structure comme paramètre d'une fonction:

Sub AfficheAdresse( ByVal  Une Adresse As Adresse)

...Imprimer l'adresse

End sub
Pour imprimer l'adresse 33 on écrira AfficheAdresse ( Adresse(33))


V-D-7-a. Attention quand dans une structure il y a un tableau, il faut l'initialiser:

on veut définir une structure dans laquelle il y a 25 données DriveNumber.

On aurait tendance à écrire:

Public Type DriveInfo

   DriveNumber(25) As Integer FAUX

   DriveType As String

End Type
' En Visual Basic .NET il y a 2 méthodes:

1-Méthode par initialize

Une structure peut comporter une méthode.

Ici, on a crée une méthode Initialize qui redimensionne le tableau interne à la structure.

Public Structure DriveInfo

   Dim DriveNumber() As Short

   ' Noter que le nombre d'élément a disparu.

   Dim DriveType As String

   ‘maintenant on instance les 25 éléments.

   Public Sub Initialize()

      ReDim DriveNumber(25)

   End Sub

End Structure
Exemple de routine utilisant la structure.

Function AddDrive(ByRef Number As Short, ByRef DriveLabel As String) As Object

   Dim Drives As DriveInfo

   Drives.Initialize()

   Drives.DriveNumber(0) = 123

   Drives.DriveType = "Fixed"

End Function
2-Autre manière de faire:

Public Structure DriveInfo

   Dim DriveNumber() As Short

   Dim DriveType As String

End Structure

 

Function AddDrive(ByRef Number As Short, ByRef DriveLabel As String) As Object

   Dim Drives As DriveInfo

   Redim Drives.DriveNumber(25)

   Drives.DriveNumber(3)=12

   Drives.DriveType = "Fixed"

End Function
Si on utilise 100 variables Drives, il faudrait 'Redim' le tableau pour chaque variable!!

Dim Drives (100) As DriveInfo

 

For i as Integer =0 to 100

Drives (i).Initialize                    'Dur dur!!

Next i
En plus si Dim Drives (100) est en tête d'un module, il faut mettre la boucle dans une procédure.


V-D-7-b. Allons plus loin:

Une structure hérite de System.ValueType


V-D-7-b-i. Les structures sont des types 'valeur'.
Une variable d'un type structure contient directement les données de la structure, alors qu'une variable d'un type classe contient une référence aux données, ces dernières étant connues sous le nom d'objet.

Cela a de l'importance: si je crée une variable avec une structure, que je copie cette variable dans une seconde, le fait de modifier la première variable ne modifie pas la seconde.

Prenons l'exemple donné par Microsoft:

Structure Point
   Public x, y As Integer
   Public Sub New(x As Integer, y As Integer)
      Me.x = x
      Me.y = y
   End Sub
End Structure 
On définie une structure Point et on définie une méthode New permettant de saisir les valeurs:

Public Sub New est un constructeur.

Pour saisir les valeurs de x et y ont peut utiliser:

Dim a As Point
a.x=10
a.y=10
ou utiliser le constructeur:

Dim a As New Point(10,10)  
En partant de la déclaration ci-dessus, le fragment de code suivant affiche la valeur 10 :

Dim a = new Point(10, 10)
Dim b = a
a.x = 100
Console.WriteLine(b.x)	'b est donc bien différent de a
L'assignation de a à b crée une copie de la valeur, et b n'est donc pas affecté par l'assignation à a.x. Si, en revanche, Point avait été déclaré comme une classe, la sortie aurait été 100 puisque a et b auraient référencé le même objet.

Enfin, les structures n'étant pas des types 'référence', il est impossible que les valeurs d'un type structure soient nulles ( elles sont égales à 0 après la création).


V-D-7-b-ii. Les structures peuvent contenir plein de choses:
On a vu qu'elle peuvent contenir:

Des variables de différent type.

Des tableaux.

Des méthodes : on a vu l'exemple de Initialize et de New.

Mais aussi

Des objets.

D'autres Structures.

Des procédures.

Des propriétés.

Exemple donné dans l'aide (et modifié par moi) :

Débutant: A relire peut-être ultérieurement quand vous saurez utiliser les Classes.

Cet exemple définit une structure Employee contenant une procédure CalculBonus et une propriété Eligible.

Public Structure Employee
Public FirstName As String
Public LastName As String
' Friend members, accessible partout dans le programme.
Friend EmployeeNumber As Integer
Friend WorkPhone As Long
' Private members, accessible seulement dans la structure.
Private HomePhone As Long
Private Level As Integer
Public Salary As Double
Public Bonus As Double
  ' Procedure .
  Friend Sub CalculateBonus(ByVal Rate As Single)
   Bonus = Salary * CDbl(Rate)
  End Sub
' Property pour retourner l'éligibilité d'un employé.
  Friend ReadOnly Property Eligible() As Boolean
    Get
      Return Level >= 25
    End Get
  End Property
End Structure
Utilisons cette structure:

Dim ep As Employee    'Déclaration d'une variable Employee

ep.Salary = 100       'On saisit le salaire 

ep.CalculateBonus(20) 'On calcul le bonus

TextBox1.Text = ep.Bonus.ToString    'On affiche le bonus
Cela ressemble aux Classes !! Non?


V-D-7-b-iii. Portée:
Vous pouvez spécifier l'accessibilité de la structure à l'aide des mots clé: Public, Protected, Friend ou Private ou garder la valeur par défaut, Public. Vous pouvez déclarer chaque membre en spécifiant une accessibilité. Si vous utilisez l'instruction Dim sans mot clé, l'accessibilité prend la valeur par défaut, Public.

Private Mastructure

    Public i As Integer

    ...

End Structute
En conclusion les structures sont maintenant très puissantes et peuvent contenir autant de choses que les modules de Classes , on verra cela plus loin. Mais les structures sont référencées par valeur alors que les Classes le sont par référence


V-D-8. Attention type valeur ou référence

Résumons la notion très importante de variable par valeur ou par référence.


V-D-8-a. La variable 'par Valeur':

Contient réellement une valeur.

Prenons pour exemple une variable de type 'Long'

Dim L As Long

L= 1456 
L occupe 8 octets nécessaire pour coder un long, ici L a une valeur de 1456, donc dans ces 8 octets il est codé 1456.

Sont des variables par 'Valeur':

Les Integer, les Long les Short

Les Single, Double, Decimal

Les Booleans, Char, Date

Les Structures

Les énumérations


V-D-8-b. La variable 'par Référence':

Elles ne contiennent pas la valeur de l'objet mais son adresse en mémoire, sa référence.

Dim O As Object
O contient l'adresse de l'objet codée sur 4 octets.

Sont des variables par référence:

Les Objets

Les Strings

Les tableaux

Les Classes


V-D-8-c. Influence sur l''Affectation':

Posons le problème:

Travaillons sur A et B, 2 variables ayant la même 'nature'.

A existant déjà, faisons:

Dim B=A
Puis modifions la valeur de A, cela modifie t-il B?

Les variables par Valeur ou par Référence ne réagissent pas de la même manière:

Si le type de variable est par valeur (valable pour les entiers, les Long.. les structures..), chaque variable ayant sa valeur, B n'est pas modifié.

Si le type de variable est par référence (valable pour les tableaux, les objets, les string..), chaque variable est définie par sa référence (son lieu physique); faire A=B entraîne que A et B ont même référence. Si on modifie A, B est modifié car il pointe au même endroit.

Voyons des exemples:

Même si on affecte une variable par valeur à une autre, les deux variables restent différentes: elles conservent leur propre espace de stockage:

Dim L As Long

Dim P As Long

L=0

L=P     'on affecte P à L

P=4     'on modifie P

=> L=0 P=4    Modifier P n'a pas modifié L
Par contre si on affecte une variable par référence à une autre, elle pointe toutes les 2 sur le même endroit mémoire: si j'en modifie une, cela modifie l'autre.

'Créons une Classe contenant un entier (Exemple à relire quand vous aurez étudié les Classes)

Class Class1
   Public Value As Integer = 0
End Class

Dim C1 As New Class1()
Dim C2 As Class1 =C1    'on crée C2, on affecte C1 à C2
C2.Value = 123          'on modifie C2
=> C1.Value=123 C2.Value=123 Modifier C2 a modifié C1 car elles pointent sur le même endroit mémoire.


V-D-8-d. On se méfiera donc du type 'référence ' ou 'Valeur' des données que l'on utilise: exemple des Tableaux

Exemple sur les tableaux qui sont 'Par référence':

Dim A(3) As String

A(1) = "a"

Dim B(3) As String

B(1) = "b"

B = A

A(1) = "c"

Label1.Text() = B(1)    'Affiche 'c'
En effet un tableau est 'par référence' et le fait de faire A=B donne la même adresse mémoire aux 2 tableaux, aussi , modifier l'un modifie l'autre.

B= A.Clone aurait copié le tableau A dans B en conservant 2 tableaux distinct et la dernière instruction aurait affiché 'a'.

Remarque: A(2)=B(2) affecte un élément d'un tableau à un élément d'un autre tableau, cela ne modifie que la valeur d'un élément et n'affecte pas le tableau.


V-D-8-e. Le cas particulier des 'String' qui sont 'Par référence':

warning Attention: par contre :

Dim A As String

A = "a"

Dim B As String

B = "b"

B = A

A = "c"

Label1.Text() = B    'Affiche 'a'
Bien que cela soit par référence, B=A affecte simplement la valeur de A à B, si on modifie ultérieurement A, B n'est pas modifié. (idem pour clone et copy!!) Pour une string qui est 'par référence', il parait donc impossible de la dupliquer, elle se comporte comme une variable par valeur!! Avez -vous des idées pour expliquer cela?

L'opérateur d'affectation "=" de deux strings "A=B" a simplement été défini de manière restrictive pour les strings. Les créateurs de vb .net lui ont permis uniquement une copie de la valeur de la string et non de la référence.
Il vaut mieux ne pas permettre l' affectation de la même référence pointant sur le même objet c'est dangereux pour les débutants et cela serait totalement incompatible avec les versions précédentes.. Ensuite, parce que la copie de la valeur d'une string dans une autre est une opération extrêmement courante chez les programmeurs. Ce qui n'est pas le cas de l'affectation de la même référence pointant sur le même objet.

En conclusion, rien de choquant dans le fait qu'un type string se comporte comme un type par valeur: car c'est juste la définition de l'opérateur d'affectation "=" qui a été redéfinie, et c'est tout. Tout ce qui concerne l'implémentation du type string est strictement comme tous les types par référence. (Merci Sabri)


V-D-8-f. Déclaration avec New ?

En théorie, il faut utiliser New quand on déclare une variable 'par référence':

Il faut écrire:

Dim L As Long    'un long est 'par valeur'

Dim F As New Button    'un bouton est un objet 'par référence'
En fait

Dim L As New Long  'est accepté

Dim O As Object    'est accepté.

Dim S As String    'est accepté.
Pour les Classes ou les objets graphiques , il faut par contre bien taper New pour créer l'objet:

Dim F As New Button
Si on tape Dim F As Button on crée une référence vide, mais pas d'objet Button.


V-D-8-g. Valeur après déclaration:

Apres création (avant initialisation) une variable numérique 'par Valeur' contient 0,

Dim L As Long    'L contient 0
Par contre une String (par référence) qui a été créée par Dim et non initialisée contient Nothing.

Dim O As Object    'O contient Nothing: il ne pointe sur aucun objet.
On peut le tester par If IsNothing( O ) then.. ou If O Is Nothing..

Pour les tableaux, bien que le tableau soit 'par Référence', c'est le type de variable utilisé dans le tableau qui décide de la valeur des éléments après déclaration.

Dim T(3) As Long    '=>T(0)=0 

V-D-8-h. Comparaison:

1-Une variable par Valeur peut être comparée à une autre par "=",

Dim L As Long=12

Dim P As Long=24

If L=P Then..
2-Par contre une variable par référence peut être comparée à une autre par "Is".

Dim O As Object

Dim Q As Object   

If O Is Q then..
NB: pour les String '=' et 'Is' peuvent être utilisés.

3-Equals peut être utilisé pour comparer les 2 types de données:

Obj1.Equals(Obj2))  'Retourne True si Obj1 et Obj2 ont le même pointeur.
ou

N1.Equals(N2)    'Retourne True si la valeur de N1= la valeur de N2
 
Pour les types référence, l'égalité est définie comme une égalité d'objets, c'est-à-dire si les références renvoient ou non au même objet. Pour les types valeur, l'égalité est définie comme une égalité au niveau du bit.


V-D-8-i. Il existe une instruction permettant de voir si une variable est de type 'Par référence'

Cet exemple utilise la fonction IsReference pour vérifier si plusieurs variables font référence à des types référence.

Dim R as Boolean

Dim MyArray(3) As Boolean

Dim MyString As String
Dim MyObject As Object
Dim MyNumber As Integer
R = IsReference(MyArray) '  R= True. Tableau
R = IsReference(MyString) ' R= True. String
R = IsReference(MyObject) ' R= True. Objet
R = IsReference(MyNumber) ' R= False. Entier

V-D-9. Variable 'Object' et autre

Il existe un autre type de variable: le type 'Object'.


V-D-9-a. Le Type 'Object':

Parfois on ne sait pas ce que va contenir une variable: un Integer? une String? un Single?

Pour résoudre ce problème on utilise une variable de type 'Object'

Cela remplace le type 'Variant' de VB6

Dim myObjet As Object
Ensuite:

myObjet=12
est accepté, et myObjet sera considéré comme un type Integer

myObjet=12.6
est accepté, et myObjet sera considéré comme un type Single

myObjet="Visual Basic"
est accepté aussi, et myObjet sera considéré comme un type String

Les 3 affectations myObjet= peuvent se suivre sans planter, l'objet contenant successivement un type Integer, Single et String.

On rappelle qu'une variable objet est une variable 'Par référence'.

On peut, suite au dernier exemple, récupérer l'objet et le transformer en String.

Dim maString As String

maString= CType(myObjet, String)
Comment savoir quel type de variable contient la variable 'Objet'?

Si on fait myObjet.GetType.ToString cela retourne 'System.string' indiquant que myObjet contient bien une String.

myObjet.GetType.Name retourne 'String'

Pour tester si myObjet est une String, il y a une autre manière avec TypeOf Is:

If TypeOf myObjet Is String Then

 

End if
warning Attention, TypeOf Is retourne True aussi pour les Classes d'objet parent.

Dim monlabel As New Label

If TypeOf monlabel Is Control Then ' est vérifié car label dérive de control
monlabel est bien un label mais c'est aussi un control.(On verra que tous les objet visuel comme Label dérive de la classe Control).

Comment utiliser les membres d'une variable objet?

Exemple: mettre une string dans une variable Objet, connaître la longueur de la String.

  • Si Option strict=Off (On force VB à ne pas être trop Strict!!! On verra cela plus loin)

Dim myObjet As New Object

myObjet="VB"

MessageBox.Show(myObjet.length)  'affiche 2 
  • Si Option strict=On (On force VB à ne rien tolérer)
MessageBox.Show(myObjet.length) déclenche une erreur: les liaisons tardives ne sont pas acceptées.

MessageBox.Show(V.GetType().GetField(n).GetValue(V).ToString) déclenche une exception.

Il faut écrire simplement:(Merci le forum de developpez.com)

Dim myObjet As New Object

myObjet="VB"

MessageBox.Show(DirectCast(myObjet, String).Length.ToString)
ou

MessageBox.Show(CType(myObjet, String).Length.ToString)
DirectCase et CType transforme un type de variable en un autre, DirectCase est moins 'tolérant' car la variable qui reçoit doit être du bon type.

Une autre méthode consiste à transformer par Ctype le contenu de l'objet vers une variable String, puis à afficher la longueur de cette variable String.

Dim myObjet As New Object

myObjet="VB"

Dim  myString  As String

myString = CType(myObjet, String)

MessageBox.Show(myString.Length.ToString)
info Du fait que les membres utilisés avec une variable Objet ne sont pas définis à l'écriture du programme (on ne sait même pas quel type de variable sera dans l'objet, on n'en connaît donc pas les membres), la recherche du membre se fait à l'exécution, c'est plus long, de plus les contrôles et vérifications se font à l'exécution.
Cela se nomme une liaison tardive, à éviter donc. On évitera donc d'utiliser si possible des variables 'Objet'.
Utilisez plutôt des variables typées (des variables String , Integer..) au départ, quand on les utilise, les contrôles et appels sont vérifiés dés le départ, on appelle cela une liaison anticipée ou précoce.

V-D-9-a-i. Comparaison d'objet.
Is permet de savoir si 2 variables objet se rapportent à la même instance.

Dim o1 As New Objet = monObjet

Dim o2 As Objet

o2= o1

If o1 Is o2 Then..

V-D-9-a-ii. Nothing.
Après:

Dim myObjet As Object
myObjet contient Nothing, c'est à dire 'Rien': pas de référence à une instance.

Après avoir utiliser myObjet=12

On peut faire myObjet=Nothing.

Lorsque vous assignez Nothing à une variable objet, cette dernière ne fait plus référence à une instance d'objet, elle ne pointe sur rien.

Si la variable avait fait référence à une instance au préalable, l'assignation de Nothing à la variable ne met pas fin à l'instance. L'instance se termine, et les ressources mémoire et système qui lui sont associées sont libérées uniquement lorsque le garbage collector (qui fait le ménage) détecte l'absence de toute référence active restante.

On peut tester si un Objet contient Nothing avec .IsNothing


V-D-9-b. Les variables d'autres types:

On verra que l'interface utilisateur est composée de contrôles, ces contrôles étant des objets, et bien, on peut déclarer une variable de type 'contrôles': bouton, ou textbox ou formulaire.

Dim myButton As New Button    'crée une variable myButton de type Button

 
Ensuite on peut utiliser les membres de la classe Button

myButton.BackColor


 

Dim myTextBox As New TextBox    'crée une variable myTextBox de type TextBox

V-D-9-c. Utilisez donc des variables le plus typées possible.

Eviter les Object.

Si une variable doit contenir des boutons, créer une variable Button.

Si une variable doit être utilisée pour contenir divers choses: Button, ListBox... plutôt que la déclarer en Objet, il est préférable de la déclarer en System.Windows.Forms.Control

Dim fistControl As New System.Windows.Forms.Control

fistControl= New Button

V-D-9-d. Attention quand on met un objet dans un autre objet:

Si je met un Button dans une variable Object.

Dim MyObjet As Object

MyObjet = Button1
MyObjet donne accès aux propriétés des Object (Equals, GetType, ToString...); pour utiliser les propriétés de Button (comme Text par exemple, il faut d'abord transformer l'objet en Button en écrivant : CType(MyObjet, Button).

Par exemple, pour mettre le texte du button contenu dans MyObjet dans la variable MyTexte, il faut écrire:

Dim MyTexte As String = CType(MyObjet, Button).Text

V-D-10. Variable Booléenne

Mr Georges Boole 1805-1864
Mr Georges Boole 1805-1864
Il existe un autre type de variable: le type 'Booliens 'ou 'Booléens'. (Boolean)


V-D-10-a. Introduction:

L'algèbre de Boole est la partie des mathématiques, de la logique de l' électronique et de l'informatique qui s'intéresse aux opérations et aux fonctions sur les variables logiques. En logique propositionnelle, une expression est soit vraie soit fausse. (le vrai (1) et le faux (0)).

Georges Boole (1815-1864), physicien Anglais définit en 1847 un algèbre qui est applicable au raisonnement logique, qui traite des fonctions à variables binaires (deux valeurs). Mais il ne s'applique pas aux systèmes à plus de deux états d'équilibre.

Une variable booléenne, ou logique, ou binaire ne prend que deux valeurs (elle est généralement stockée sous la forme d'un bit).

Vers la fin des années 30, Claude Shannon démontra qu'à l'aide d'interrupteurs fermés pour « vrai » et ouverts pour « faux » il était possible d'effectuer des opérations logiques en associant le nombre 1 pour « vrai » et 0 pour « faux ».

Ce codage de l'information est nommé base binaire. C'est avec ce codage que fonctionnent les ordinateurs. Il consiste à utiliser deux états (représentés par les chiffres 0 et 1) pour coder les informations.

Il permet d'étudier les circuits logiques.


V-D-10-b. Les booléens:

On a parfois besoin de savoir si une assertion est vraie ou Fausse.(True ou False)

Pour stocker une information de ce type, on utilise une variable de type booléen. Une variable de ce type ne peut contenir que True ou False.

Le terme booléen vient de "l'algèbre de Boole", cette algèbre ne travaille que sur les valeurs 1 ou 0 (True ou False)

Soit myBoolean une variable booléenne:

Dim myBoolean As Boolean
On peut écrire myBoolean = True

On peut aussi tester cette variable:

If myBoolean = False Then..
L'expression après If est évaluée, si elle est vraie 'Then' se produit.

Autre exemple:

If maValeur=2 Then ..

End If
L'expression 'maValeur=2' est évaluée, si maValeur est effectivement égal à 2, l'expression prend la valeur True; dans ce cas le programme se poursuit après Then.

si maValeur est différent de 2, maValeur=2 est évaluée et prend la valeur False; dans ce cas le programme se poursuit après End If.

Un booléen peut donc prendre deux états (vrai/faux, oui/non, 1/0, etc.). Il s'agit donc d'une "valeur binaire". Techniquement, un booléen peut être représenté par un seul bit (binary digit = chiffre binaire).

Dans les langages n'ayant pas de variables booliennes, on se servait souvent d'un entier, avec pour convention que la valeur 0 représente "faux", tandis que toute valeur non nulle représente "vrai". En VB6 vrai était égale à -1. En VB.Net vrai = 1. Mais on s'en fiche car:

info un Booléen est un Booléen, en VB.Net on utilise donc True ou False comme seules valeurs pour un Booléen.
Il n'empêche que si on utilise une expression, un nombre et qu'on l'évalue comme si c'était un booléen (C'est pas bien!!), la valeur 0 représente "False", tandis que toute valeur non nulle représente "True".


V-D-10-c. Les conditions:

Après If, While, Do Loop il faut une condition qui est une expression booléenne.

Exemple:

If Condition Then    'Si 'condition'..

  ...

End if

 

 

Do Until condition    'Boucler jusqu'à ce que 'condition'

      ...

Loop

 

While Condition        'Tant que 'condition' boucler

...

End While
Pour écrire une condition, on utilise les opérateurs:

= égal

> supérieur à

 < inférieur à

>= supérieur ou égal

<= inférieur ou égal

<> Différent de
L'évaluation d'une condition donne True (Vrai) ou False (Faux) car on l'a dit c'est une expression booléenne.

Exemple :

      Dim valeur1 As Integer=2

      Dim valeur2 As Integer=3  

      If valeur1=valeur2 Then

        ...

      End if  
valeur1 étant différent de valeur2, la condition 'valeur1=valeur2' prend la valeur False et le programme passe à la ligne après End If).

Ici le signe = n'indique pas une affectation mais 'égale' dans une expression à évaluer.

On peut combiner les opérateurs et mettre des parenthèses:

 If (valeurC <> valeurD )AND (valeurD =2)

V-D-10-d. Les opérateurs logiques:

Si on a plusieurs expressions logiques, on peut les combiner avec des opérateurs logiques.

Si A et B sont des expressions Booléens:

A And B     retourne True si A et B sont vrais

A Or B      retourne True si une des 2 est vrai

A Xor B     retourne True si une et une seule est vrai

Not A       retourne True si A est faux et vice versa
On entend par expression Booléen le résultat de l'évaluation d'une condition:

c=d retourne True si c égal d et False si c différent de d.

Exemple

Si A différent de B.. peut s'écrire If Not(A=B) Then..

Si A compris entre 2 et 5 peut s'écrire If A>=2 And A<=5 Then..

Comment faire une bascule:

Il faut écrire A= Not A

A chaque fois que l'on effectue cette instruction A bascule à True s'il était à False et vice versa.

Les opérateurs AndAlso et OrElse sont plus rapide car ils n'évaluent pas la seconde expression si ce n'est pas nécessaire.

Parfois les expressions sont complexes et on peut les simplifier en utilisant des transformations:

Originale Transformation
Not A And Not B Not (A Or B)
Not A And B Not (A Or Not B)
A And Not B Not (Not A Or B)
A And B Not (Not A Or Not B)
Not A Or Not B Not (A And B)
Not A Or B Not (A And Not B)
A Or Not B Not (Not A And B)
A Or B Not (Not A And Not B)
Exemple pratique:

Si A compris entre 2 et 5 peut s'écrire If A>=2 And A<=5 Then..

ou If Not (A<2 Or A>5) Then...

Une remarque:

Avec une expression Booléenne, on peut écrire:

Dim a As Boolean= True

If a = True Then..
ou

If a Then..
Exemple:

If (x=15)=True  Then..

ou If x=15 Then...
Donc, avec une expression booléenne, et uniquement avec une expression booléenne, il est possible de se passer du = True après un If car de toutes façons , l'expression est évaluée.

Voir aussi le chapitre sur l'algèbre de Boole.


V-E. Soyons strict et explicite.

VB peut être tolérant ou pas

Option Strict=On et Option Explicit=On le rendent totalement intolérant, et c'est tant mieux!! Voyons cela.


V-E-1. Notion de conversion Explicite et Implicite:

La conversion Explicite: est permet de forcer la conversion d'un type de données vers un autre type à l'aide de mots clés.

Exemple

Dim d As Double = 2.65

Dim i As Integer

 i=CType(d,Integer)  'conversion d'une valeur double en Integer
Il existe aussi la conversion implicite effectuée automatiquement sans syntaxe particulière et de manière transparente.

VB peut le permettre ( Si Option Explicit Off dans la configuration )

Exemple

Dim d As Double = 2.65

Dim i As Integer

 i=d  'Pour affecter à i le Double d, Vb a transformé le double d en Integer.

V-E-2. Option Strict


V-E-2-a. 1-Avec Option Strict=On VB refuse les conversions implicites qui pourraient entraîner des pertes de données.

VB est naturellement très arrangeant (trop sympa !!) quand il est configuré avec Option Strict Off :

Par défaut il transforme, quand c'est possible, et si nécessaire un type de variable en un autre type.

Si je passe un nombre qui est en double précision (Double) dans une variable en simple précision (Single), VB accepte, au risque de perdre de la précision (s'il y a un très grand nombre de chiffre significatif).

Ainsi :

Dim D As Double

Dim S As Single

D=0.123456789

S=D

MessageBox.Show(s) ' affiche 0,1234568   le 9 est perdu car un single à 7 chiffres significatifs.
Cela peut être ennuyeux si c'est des calculs d'astronomie !! et le programmeur ne s'en rend pas forcément compte !!

Pour éviter cela il faut activer l'OPTION STRICT à ON (Elle est par défaut à Off)

Menu Projet > Propriétés de Nom de projet.

Page de propriétés de Langage VB.

Propriétés communes, génération.

En face de Option Strict, mettre On

Maintenant seules les conversions effectuées explicitement seront autorisées.

S=D est souligné dans le code pour signaler une conversion interdite.

(Par contre D=S est accepté car on passe d'une variable à une variable plus précise)

Il faudra maintenant, pour notre exemple, écrire :

S= CType(D,Single)
Cela entraîne une conversion de la valeur Double en Single ; s'il y a perte de précision, elle se produit quand même, MAIS le programmeur SAIT qu'il y a conversion, il prendra ou pas EN CONNAISSANCE DE CAUSE le risque.

Avec Option Strict le langage VB.Net devient bien moins tolérant:

Ecrire un programme avec Option Strict à Off, ça passe; mettre Option Strict à On un tas d'instruction coince!! même certains exemples Microsoft!! Car sans s'en rendre compte on passe d'un type de variable à l'autre sans arrêt!!


V-E-2-b. 2-Avec Option Strict=On VB refuse les conversions String<->numériques implicites.

Avec Option Strict=Off

Dim n As Integer=12

MessageBox(n)
Affiche 12 : le contenu de l'entier 'n' a été transformé automatiquement en String pour être affiché.

Avec Option Strict=On

Dim n As Integer=12

MessageBox(n)
Plante

Il faut transformer explicitement n en String et écrire:

MessageBox(n.ToString)

V-E-2-c. 3-Avec Option Strict=On VB refuse les 'Liaisons tardives':

Avec Option Strict=On VB refuse les liaisons tardives:

Dim V As Object

V="VB"
MessageBox.Show(V.Length) est refusé

Il faut écrire

MessageBox.Show(CType(V, String).Length.ToString)

'Option Strict Off' permet n'importe quoi. C'est du Basic