I. Introduction▲
Il s'agit d'un cours de Visual Basic.Net © de Microsoft, pour débutants (pas de pré requis) ou de programmeur voulant passer à la version .net.
Le cours est basé sur VB 2005 (Framework 2), VB 2008 (Framework 3.5), VB 2010 (Framework 4).
VB 2003 (Framework 1) est progressivement abandonné, car il contenait des fautes de jeunesse.
Les versions Express (Gratuites) sont privilégiées.
Visual Basic.Net apporte une puissance inégalée et nécessite une rigueur importante, mais il devient vite complexe et technique. La documentation et les livres sont totalement hermétiques pour les novices et rebutent totalement les débutants. Les articles sur le Web sont très techniques et traitent d'emblée de problèmes complexes, ils sont nécessaires, mais pas pour le débutant. J'explique donc dans ce cours, à ma manière, très simplement, comment créer un programme afin de permettre un bon démarrage même à celui qui n'a jamais fait d'informatique.(Je traite des programmes Windows: Windows Forms et WPF mais pas ASP Web).J'encourage par ce cours sans prétention, à développer ses propres programmes.
Soyez un utilisateur actif
- Retournez les bugs et erreurs et même les fautes d'orthographe. Mon site serait-il parfait ? J'en doute !! Merci de vos critiques.
- Adressez-moi vos idées, du code original, des infos à mettre sur le site.
- Ou simplement indiquez-moi que vous avez lu mon cours, cela fait toujours plaisir et m'incite à poursuivre.
Merci à developpez.com, à ses membres qui m'ont aidé (à Guillaume en particulier) à ceux qui m'envoient un petit mot, et à ceux qui me donnent un coup de main.
Cours constamment remis à jour : voir la date de la version en début d'article.
Questions à l'auteur : je ne peux pas répondre à toutes les questions particulières et spécifiques, car je n'ai pas d'expérience poussée dans tous les aspects de VB, et les questions sont très nombreuses, aussi je vous conseille d'utiliser les forums developpez.com
II-A. Qu'allons-nous étudier ?▲
Ce cours est un cours de Visual Basic.Net développé par Microsoft.
Nous étudierons principalement : LES APPLICATIONS WINDOWS. (les WindowsForms) et les WPF.
Les applications WindowsForms et WPF sont des programmes directement exécutables qui utilisent des fenêtres: 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 2005 (Framework 2), VB 2008 (Framework 3.5), VB 2010 (Framework 4).
VB 2003 (Framework 1) est progressivement abandonné, car il contenait des fautes de jeunesse.
Les versions Express (Gratuites) sont privilégiées.
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, d'instruction, procédure et module.(Section III).
Nous étudierons l'IDE ou interface de développement (Section IV).
Nous étudierons le langage Visual Basic (Section V).
Nous verrons les Classes VB (Section VI).
Nous utiliserons 'contrôles' WindowsForms pour créer l'interface utilisateur (Section VII).
Nous découvrirons la manière de créer une application Windows Forms.(Section IX).
Nous utiliserons les WPF pour créer l'interface utilisateur (Section XI).
Nous apprendrons à faire de la programmation objet et à créer une classe (Section XIII.)
Nous verrons comment utiliser les bases de données. (Section XV.)
II-C. Quels logiciels utiliser ?▲
Historique : il y avait Visual Basic.Net 2003 de Microsoft en 2003 !!
Il fonctionnait avec le Framework 1.1.
En 2005 il y a eu Visual Basic 2005 de Microsoft et le Framework 2.0.
Ce produit .Net était maintenant mature, l'environnement de développement magique, les quelques points noirs de la version 2003 ont été corrigés.
En 2008 il y a eu Visual Basic 2008 de Microsoft et le Framework 3.5 qui permettait d'utiliser les WPF.
En avril 2010 il y a Visual Basic 2010 de Microsoft et le Framework 4.
VisualStudio (payant) contient Visual Basix C#. Mais il existe aussi la version Visual Basic Express version allégée, mais très bien et GRATUITE, en français.
Est-il possible d'utiliser les éditions Express à des fins commerciales ?
Oui. Il n'y a aucune restriction liée aux licences pour les applications créées à l'aide des éditions Express.
Cette réponse (pour VB express 2008) est indiquée sur le site de Microsoft : http://msdn.microsoft.com/fr-fr/express/default.aspx
Ce cours utilise donc Visual Basic 2005 2008 et 2010 Express.
Si vous débutez, installez et utilisez sans hésitation Visual Basic Express 2010 GRATUIT
Nous abandonnons VB 2003, la première version en Net, qui avait quelques gros défauts.
Où trouver Visual Basic 2010 Express ?
Cliquer sur le lien:
http://www.microsoft.com/express/downloads/ Dans la liste de lien, cliquer sur 'Visual Basic Express 2010'.
Puis dans la liste 'Select language", choisissez"French", une fenêtre pop-up démarre.
Autre gratuit: SharpEditor venant du monde du libre.
Voici le site,SharpDevelop le configurer pour qu'il marche en VB (il supporte VB et C#).
II-D. Quelle configuration est nécessaire ?▲
Pour développer avec Visual Studio 2005 VB 2005 VB 2010.
il faut Windows XP ou 2000 (non vérifié pour VB 2010) ou Vista ou Windows 7 avec au minimum 1 Go de mémoire vive. Un grand écran (vu le nombre de fenêtres) est conseillé.
Les exécutables fonctionnent sous Windows 98 (pour VB 2003), XP (à vérifier pour VB 2008 et 2010), Vista, Windows 7.
II-E. À propos de l'auteur▲
LASSERRE Philippe est médecin généraliste exerçant en groupe dans le Rhône (à Toussieu), il développe des logiciels depuis des années.
Il n'est pas informaticien.
Il a travaillé avec des ordinateurs :
ZX81, New-Brain, Ti-99, TO7, Vic20, Oric, Apple II, puis PC avec l'aide de Bill.
Il a utilisé le Basic Microsoft, le QuickBasic le Visual Basic de Microsoft ® de la version 1 à la version VB6 et VB.Net, a fait un peu d'assembleur Z80 il y a longtemps.
Il a fait partie de MEDITRA, association de médecins informatisés du Rhône pionnière en la matière à l'époque, il a été cofondateur d'un club d'informatique local (Microzon) où on programmait dur !!
Ensuite il a écrit des logiciels, pour cela outre le côté technique informatique, il a beaucoup travaillé sur le dossier médical informatisé, les plans de soins.
Plein d'idées et de projets, un seul problème : il n'y a que 24 heures dans une journée.
Il est l'Auteur de :
CREEMED, il y a quelques années. C'était un utilitaire pour Medigest ® Dos.
MEDIWIN® distribué par Polytel , écrit en VB6, logiciel de gestion complète de cabinet médical dont il est le coauteur.
Logiciel agréé Sesam-Vitale, très complet, innovant, incluant les notions de "dossier vivant", "procédures de soins" (contenu médical validé par des thèses), travaillant avec la base de médicament BCB de Résip©, contenant le dictionnaire de la SFMG.
Ce logiciel n'est plus développé.
LDF logiciel de comptabilité en Shareware.Télécharger Ici.
Il distribue gratuitement un dictionnaire de termes médicaux pour Word.
Il a créé un site pour son association de plongée sous-marine (EmbellieBulle.fr) sous SPIP.
Il est fana de musique de cinéma de photographie et de voyages.
Vous pouvez envoyer un mail à Mr LASSERRE à l'adresse : lasserre.philippe@wanadoo.fr
III. Principe et structure des programmes▲
III-A. Les 'Objets'▲
VB utilise la notion d'OBJETS'.
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 sur les Classes) contient :
1) Objets, Classes ;
2) Références, espaces de noms (à visionner plus tard).
III-A-1. Dans la vie courante▲
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 Objets.
Pour fabriquer ma voiture, je prends les caractéristiques de la class "Les voitures" (c'est comme un moule, une usine) 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 'occurrence' de la classe).
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.
Remarque
Avec la même classe on peut instancier plusieurs Objets.
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.
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)
évé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.
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.
Relation entre Objets
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.
Espace de noms
Un espace de noms regroupe des objets qui appartiennent au même 'domaine'. Cela sert a différencier des objets qui ont même nom, mais ne font pas partie du même domaine. Si je parle de 'Porte' ce terme n'a pas la même signification si je suis dans l'espace de noms 'Composant électronique' (on y trouve des portes logiques) ou l'espace de noms 'Maison'.
Tout cela c'est simpliste, mais voilà, vous avez compris ce qu'est un objet !
III-A-2. 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 (bouton, 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és 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
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 disparaitre le bouton.
=Ici il y a un bouton invisible !! oui, oui !!
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ée 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 clique dessus, l'événement Bouton_Click survient.
Ce sont les objets contrôles (bouton, case à cocher…)et les formulaires qui ont des événements.
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 listBox), 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.
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 qu'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ée 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 liste.
En résumé
Une classe est un élément logiciel qui décrit un type de données abstrait. Un type de données abstrait est un ensemble d'objets définis par une liste d'opérations et les propriétés de ces opérations Une classe est un élément logiciel qui décrit les caractéristiques d'un ensemble d'objets. En programmation orientée une classe déclare des propriétés communes à un ensemble d'objets. La classe déclare des attributs représentant l'état des objets et des méthodes représentant leur comportement. Une classe représente donc une catégorie d'objets. Il apparait aussi comme un moule ou une usine à partir de laquelle il est possible de créer des objets. On parle alors d'un objet en tant qu'instance d'une classe (création d'un objet ayant les propriétés de la classe). (www.techno-science.net)
En Visual Basic.net tout est objet.
Les Classes sont des types d'objets.
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.
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.
Espace de noms
Les objets sont regroupés dans des bibliothèques d'objets, dans des 'espaces de noms'.
Il faut parfois importer la bibliothèque avant d'utiliser l'objet :
'Importe l'espace de noms Systel.IO
Imports
System.IO
'On peut maintenant utiliser l'objet 'File':
Fl =
File.Exists
(
"vessaggi.gif"
)
Si l'import n'a pas été fait, System.IO.File.Exists() est accepté aussi.
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.
Ce n'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, S'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".
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. 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' apparait.
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 apparait.
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. Il écrit 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 apparait :
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ée '.text' qui contient le texte à afficher.
Il faut taper le code qui modifie cette propriété '.text' , qui y met la chaine de caractères "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 :
Voilà votre premier programme est écrit.
Comment exécuter ce programme ?
Il est possible de tester immédiatement le programme en mode débogage, 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.
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, (évé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 tâches nécessaires.
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énements ? Non liées ? :
Les 'Sub', les 'Functions'.
III-C-1. Les instructions▲
Une instruction est le texte tapé au clavier dans le 'code source' et permettant d'effectuer une opération, une déclaration, une définition.
Elle contient des mots-clés, des opérateurs, des variables, des constantes et des expressions des appels à des fonctions ou des méthodes. On verra cela en détail.
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, C As
String
B =
"Bonjour monsieur "
: C=
_
"le professeur"
est équivalent à :
Dim
B, C As
String
B =
"Bonjour monsieur "
: C=
"le professeur"
En VB 2010, après certains mots, il peut y avoir continuation de ligne implicite (plus besoin de _ après la virgule, une parenthèse ouvrante, après & ou { ou = ou +…).
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éros de ligne, ils ne sont plus utilisés actuellement et non visibles :
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 ' (on peut aussi utiliser le mot REM en début de ligne).
'Ceci est un commentaire,
'Cela n'est pas une instruction.
REM Ceci est aussi un commentaire.
Le commentaire ne sera pas exécuté.
Il peut aussi, à partir de VB 2005 , y avoir des commentaires en XML, ils sont dans ce cas précédés de ''' (3').
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 tâche 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.
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 apparaitre 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 (en vb 2010),(celle du programme 'Bonjour') on voit apparaitre les procédures liées à cette fenêtre et aux contrôles contenus dans cette fenêtre :
Public
Class
Form1
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 :
Public
Class
Form1
End
Class
Ce n'est pas une procédure, mais la 'Classe' définissant la fenêtre.
En VB 2003, il y a une 'région' que vous déroulez, en cliquant sur le petit +, vous pouvez y lire le code permettant de créer la fenêtre, les contrôles… C'est généré automatiquement par VB. (Le chapitre VII-C sur les formulaires explique en détail le code généré par VB, mais c'est un peu complexe pour les débutants pour le moment !!).
En VB 2005 2008 et 2010, cette partie générée par VB n'est pas visible directement.
Il faut comprendre qu'à un formulaire (fenêtre) et aux contrôles qui sont dans ce formulaire correspond du code généré par VB. Ce code (sur lequel vous n'intervenez habituellement pas) permet de créer le formulaire et les contrôles.
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.
Private
Sub
Form1_Load
End
Sub
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.
Private
Sub
Button1_Click
End
Sub
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 gauche de la souris ;
MouseUp 'se déclenche si relâchement du bouton gauche de la souris.
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.
Un programme vb est donc composé de procédures dont l'exécution est déclenchée par des événements (ouverture d'une fenêtre, clic sur un bouton…), ces procédures en appellent d'autres qui en appellent d'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 ?
Avec :
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 chaine 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, un seul, 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 retournée 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 qu'à 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 (un nombre en simple précision). 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
Exemple :
Private
Function
SurfaceCercle
(
Rayon as
Single
)
Return
3.14
*
Rayon*
Rayon
End
Function
III-C-9. Remarques▲
Pour sortir d'une procédure Sub avant la fin, utiliser Exit Sub (Exit Function pour une fonction).
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
(
)
Éventuellement on peut faire précéder l'appel du mot-clé Call, mais ce n'est pas obligatoire.
Call
FrmSplash.ShowDialog
(
)
Nommage
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().
Exemple :SélectionnezClass
Form1'Nom du Formulaire
Inherits
System.Windows.Forms
Public
Aas
String
……Private
Button1_Click'Procédure liée à un événement
…End
Sub
Sub
MaRoutine'Procédure indépendante
….
End
Sub
End
Class
Un programme Visual Basic comporte donc :
-
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 :SélectionnezModule
Module1'Nom du Module
Public
Aas
String
……Sub
MaRoutine'Procédure indépendante
……End
Sub
End
Module
Un programme Visual Basic comporte donc :
- les modules de Classe.
Ils ont vocation à fabriquer des objets, on verra cela plus loin (Chapitre sur la programmation objet).
Exemple :
Class
MaClasse 'Nom de la Classe
Public
A as
String
……
End
Class
Un programme Visual Basic comporte donc :
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 puis 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
Remarque Les Sub, Functions et Modules sont utilisés dans un type de programmation dite 'procédurale' où on découpe le code. Il existe un autre type de programmation dit 'Objet' ou on crée et on utilise des Objets, on verra cela plus tard.
III-D-3. Lexique anglais=>français▲
Return = Retour.
III-E. Notion de programmation 'procédurale' et de programmation 'objet'▲
Il y a deux manières de travailler en VB.NET.
- En programmation 'Procédurale'
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 "boites 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).
Dans une application en programmation 'procédurale' il y a habituellement :
des modules de formulaires ;
des modules standard contenant des Sub et Function.
N. B. j'utilisais, dans la précédente version du cours, le terme de programmation 'fonctionnelle' pour une programmation utilisant des Sub et Fonction. Dans Wikipedia la programmation fonctionnelle c'est autre chose aussi je parle maintenant de programmation 'procédurale'… - En programmation 'Objet'
On verra cela plus tard : 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 permettant 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.
De toute 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 !!
IV. Environnement de développement : les EDI/IDE▲
IV-A. IDE Visual Studio 2008 (Microsoft)▲
C'est l'Integrated Development Environment (IDE): Environnement de développement intégré de Visual Basic Express 2008 de Microsoft. Il permet de dessiner l'interface (les fenêtres, les boutons, List, Image…) et d'écrire le code VB. Chez nous, on peut aussi dire EDI (Environnement de Développement Intégré).
L'IDE de Visual Basic 2008 est identique à celle de VB 2005, bien meilleur que celle de VB 2003 et l'Édition Express' (version légère par rapport à Visual Studio) est GRATUITE. Donc pas d'hésitation, chargez et utilisez VB Express 2008.
Charger sur ce lien VB Express 2008
Pour la version française, dans le cadre bleu 'Visual Basic Edition Express' dérouler la liste et choisir 'French' puis 'Download'.
Vous pouvez voir une vidéo sur l'IDE 2005 (c'est la même que pour la version 2008).
Voir la vidéo : au format 'Flash'> ou au format 'Avi' en Visual Basic 2005.
(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).
Fenêtre Projet
Quand on lance VB.net 2008, on ouvre l'IDE dans laquelle la fenêtre centrale charge la page du centre de développement Visual Basic de MSDN (site Microsoft), il faut être connecté à Internet.
En cliquant sur le bouton 'flèche verte' en haut à droite, on affiche la Page de démarrage "Start Page" qui permet d'ouvrir un projet existant Ouvrir (Recent Projects ou Open dans la version anglaise) ou de créer un nouveau projet :Créer (Create dans la version anglaise).
On constate que les diverses fenêtres sont accessibles par des onglets. L'IDE de VB 2008 diffère peu de celui de VB 2005.
Pour créer un nouveau projet Visual Basic, il faut choisir 'Créer' à gauche ou passer par le menu 'Fichier' puis 'Nouveau' puis 'Projet' . La fenêtre suivante s'ouvre :
On a le choix à partir de VB 2008 de créer l'interface utilisateur : en Windowsforms (basé sur GDI+), interface habituelle, bien connue ou en WPF interface vectorielle élaborée n'existant pas avant VB 2008.
IV-A-1. Interface 'Windows Forms'▲
Choisir l'icône 'Application Windows forms', 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 2008\ Projects\MonProjet'.)
On remarque qu'on aurait pu choisir 'Application WPF', on y reviendra.
Dans un nouveau projet, créer ou ajouter une fenêtre 'WinForm'.
Pour ajouter une fenêtre (un formulaire) Menu Project, Ajouter un formulaire Windows ( 'Add a WindowsForms' en version anglaise ) :
Cliquer sur Windows Form, une fenêtre (un formulaire) Form2 vide apparait (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 'Écrans de démarrage' les 'Formulaire Explorateur'…
Designer
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)'.)
On obtient un mode multidocument avec plusieurs fenêtres.
Exemple en mode Mdi montrant les 3 types de modules.
À noter que si on utilise le menu 'Projet' puis 'Ajouter…' cela permet d'ajouter un formulaire, un module standard, un module de Classe.
Voir les procédures.
L'onglet Form1.vb donne accès aux procédures liées à Form1.
On peut 'taper' du code dans les procédures.
La liste déroulante de gauche donne la liste des objets, celle de droite, les événements correspondants à cet objet.
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.
Ajouter des contrôles au formulaire 'Winform'
Ajouter un bouton par exemple :
Cliquer sur Boite à outils (Toolbox) à gauche, les contrôles apparaissent tous ou classés par ordre alphabétique.
Cliquer sur 'Button' dans la boite à outils, cliquer dans la Form, déplacer le curseur sans lâcher le bouton, puis lâcher : un bouton apparait.
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' qui sont visibles (Text, Location…) on peut modifier directement les valeurs.
En bas de la fenêtre propriétés, il y a une explication succincte de la propriété sélectionnée (si elle n'apparait pas, clic droit sur la propriété puis dans le menu 'Description').
Exemple
Si au niveau de la ligne 'Text' des propriétés du bouton, j'efface 'Button1' et que je tape 'OK', dans le designer, le texte écrit sur le bouton deviendra 'OK'.
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.
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 sur 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 apparaitre 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.
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 :
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.
En mode Debug, on peut modifier une ligne et poursuivre le programme qui tiendra compte de la modification (sauf pour les déclarations). On parle d''Edit and continue'.
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'). Le code présent dans l'IDE est le code source, après compilation le fichier exécutable contient du code exécutable.
Projet
Dans la terminologie VB, un projet est une application en cours de développement.
Une 'solution' (Team Project) regroupe un ou plusieurs projets (c'est un groupe de projets). Il n'y en a pas dans la version express.
En VB express on parle donc uniquement de projet, en fait ,VB crée aussi une solution de même nom.
Fichiers, Chemins des sources
Si vous regardez dans ' C:\Documents and Settings\Nom Utilisateur\Mes documents\Visual Studio 2008\ Projects\MonProjet')les fichiers correspondant à un projet VB :
sous Windows 7) le programme est accessible dans 'Document/Visual Studio/Projects/Database/Database (Database étant le nom du programme). (En effet sous Windows 7 'Documents ans Settings' n'est pas accessible !! il faut passer par le répertoire 'Document' de l'utilisateur en cours.
MonProjet.sln est le fichier solution.(Pas de solution en VB express, que des projets.)
MonProjet.psess est le fichier de performance (pas toujours présent).
MonProjet.suo est le fichier de User solution.
Dessous existe un répertoire nommé aussi MonProjet qui contient:
MonProjet.vbProj le fichier de projet.
Form1.vb contient un formulaire et ses procédures.
MyClasse.vb contient par exemple des classes.
Form1.Designer.vb contient le code qui crée la fenêtre et les contrôles.
Il a encore les sous-répertoires \Bin, il y a aussi un répertoire \Obj et un répertoire \MyProjet
Si on compile le projet l'exécutable est dans un sous répertoire \Bin,
Propriétés du projet
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 solutions :
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 compare et la nouvelle Option Infer. (Compiler).
Les références (dll liées au projet).
Les paramètres (valeurs liées à l'application).
Les ressources (texte, image, son) utilisées dans le programme.
La signature et la sécurité.
Les Extension My (nouveauté 2008).
Les paramètres relatifs à la publication (distribution et installation).
IV-A-2. Interface WPF▲
Plutôt que de travailler avec les Windows Forms (formulaire habituel utilisant GDI+), en VB 2008 on peut utiliser un mode graphique vectoriel extrêmement performant pour dessiner les formulaires et contrôles : pour cela on utilise les WFP (Windows Presentation Foundation).
Pour cela : menu 'Fichier', 'Nouveau', 'Projet'.
On choisit 'Application WPF', on se retrouve dans un nouvel environnement :
Les formulaires et contrôles sont différents de ceux des Windows Forms, ainsi que les propriétés des objets graphiques.
Il y a le 'designer' en haut qui permet de dessiner l'interface que verra l'utilisateur. Le designer génère un fichier XAML en bas qui décrit en XML l'interface.
Dans la version Express, on peut dessiner des interfaces simples, les interfaces extrêmement élaborées (dégradé de couleur, animation…) peuvent être écrites en code XAML ou en utilisant un programme extérieur payant (Expression Blend). Voir le chapitre sir les WPF.
Si on double-clique sur un bouton, par exemple, on se retrouve dans la procédure événement correspondante :
On se rend compte que les événements là aussi ne sont pas les mêmes que pour les WindowsForm.
Il y a aussi d'autres modifications comme dans les propriétés du projet :
Voir le chapitre sur les WPF.
IV-A-3. Vb propose des aides▲
Quand on tape du code, VB affiche, des aides.
Dès que je tape une lettre VB propose dans une liste des mots.
Exemple, je tape 'd', il affiche 'Dim', 'Dir'… de plus si je me mets sur un des mots, il ouvre une petite fenêtre d'explication sur le mot avec sa syntaxe.
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 par App
AppActivate
AppDomain
VB fournit des exemples de code.
Les Extraits (Snippets, bride, morceau de code) permettent d'insérer du code tout fait.
Dans le code d'une procédure, le clic droit de la souris ouvre un menu.
Cliquer sur 'Insérer un extrait' (Insert Snipper). Puis par menu successif vous obtiendrez le code que vous cherchez.
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 :
Il existe une abondante documentation.
Sur le Net: Msdn Framework 3.5
(http://msdn.microsoft.com/fr-fr/library/aa139616.aspx)
Dans l'IDE, 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 par le menu '?'
Erreur dans l'écriture du code.
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 où 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 tâches en bas. Vb propose des solutions pour corriger les erreurs de code. (Voir plus haut.)
Mode débogage (mode BREAK)
Une fois lancée l'exécution (F5), puis stoppée (par Ctrl +Alt +Pause ou sur un point d'arrêt), 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.
F8 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 (Atteindree la définition : Go To Definition)…
Il y a un chapitre sur le débogage pour apprendre à trouver les erreurs de code.
On peut grâce au menu 'Affichage' avoir accès à plein de choses :
IV-B. Visual Basic 2010 Express▲
C'est l'Integrated Development Environment (IDE) : Environnement de développement intégré de Visual Basic Express 2010 de Microsoft. Il permet de dessiner l'interface (les fenêtres, les boutons, List, Image…) et d'écrire le code VB. Chez nous, on peut aussi dire EDI (Environnement de Développement Intégré).
L'IDE de Visual Basic 2010 est similaire à celle de VB 2005 et VB 2008.VB 2010 Express et est GRATUIT. Donc pas d'hésitation, chargez et utilisez VB Express 2010.
Où trouver Visual Basic 2010 Express ?
Cliquer sur le lien :
http://www.microsoft.com/express/downloads/ Dans la liste de liens, cliquer sur 'Visual Basic Express 2010'
Puis dans la liste 'Select language', choisissez "French", une fenêtre pop-up démarre.
Est-il possible d'utiliser les éditions Express à des fins commerciales ?
Oui. Il n'y a aucune restriction liée aux licences pour les applications créées à l'aide des éditions Express.
Cette réponse (pour VB express 2008) est indiquée sur le site de Microsoft : http://msdn.microsoft.com/fr-fr/express/default.aspx
Vb 2010 utilise le Framework 4 : Voir la documentation Msdn du Framework 4
Mais on peut choisir d'utiliser le Framework 2, 3, 3.5, 4 : menu 'Projet', 'Propriété de…', onglet 'Compiler', en bas liste:'Framework cible'.
Page de démarrage
Quand on lance VB.net 2010, on affiche la Page de démarrage.
On a le choix entre :
- Nouveau projet… ;
- Ouvrir un projet… ;
- Projets récents.
Quand le pointeur est sur un élément de la liste Projets récents, ce dernier est mis en surbrillance et une icône de punaise s'affiche. Cliquer sur la punaise "épingle" le projet à la liste, afin qu'il reste dans sa position actuelle ultérieurement.
Si vous ouvrez plein de projets, votre projet punaisé restera visible dans la liste.
En bas de la page de démarrage, il y a 2 options pour cette page :
"Fermer la page après le chargement du projet" ;
"Afficher la page au démarrage".
Créer un nouveau projet
Pour créer un nouveau projet Visual Basic, il faut choisir 'Nouveau projet' dans le menu démarrage ou passer par le menu 'Fichier' puis 'Nouveau Projet'. La fenêtre suivante s'ouvre :
Il faut choisir 'Application Windows Forms' ou 'Application WPF'.
On peut aussi choisir 'Modèle en ligne' à gauche pour avoir une liste (courte) de modèle de programme.
On a donc le choix (à partir de VB 2008) de créer l'interface utilisateur : en Windowsforms (basé sur GDI+), interface habituelle, bien connue ou en WPF interface vectorielle élaborée n'existant pas avant VB 2008.
IV-B-1. Interface 'Windows Forms'▲
Choisir l'icône 'Application Windows forms', 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 2010\ Projects\MonProjet')
C:/Utilisateurs/Philippe/Mes document/ Visual Studio 2010/Projet sous Windows 7
Avec l'explorateur : Documents=> Visual Studio 2010=>Projet.
On remarque qu'on aurait pu choisir 'Application WPF', on y reviendra.
IV-B-1-a. Fenêtre Projet▲
On constate que les diverses fenêtres (pour chaque Form du projet ou chaque module de code) sont accessibles par des onglets.
À droite en haut il y a la fenêtre 'Explorateur de solution' ou se trouve les divers éléments du projet.
À droite en bas il y a la fenêtre 'Propriétés' contenant les propriétés de l'objet pointé à droite.
(Si on est sur un bouton à droite, ce sont les propriétés du bouton qui sont à gauche).
Vous pouvez ancrer les fenêtres correspondant aux onglets aux extrémités de la fenêtre de l'IDE ou les déplacer n'importe où sur le Bureau (sur un second moniteur aussi).
Ci-dessus la fenêtre de Form2 est détachée de l'IDE (il suffit de cliquer déplacer l'onglet).
Quand on déplace une fenêtre de l'IDE, une 'croix' s'affiche, il suffit de déplacer le curseur dans un élément de la croix qui symbolise une position dans l'IDE (en haut en bas, à droite…) et de lâcher le bouton de la souris pour que la fenêtre se positionne en haut, en bas, à droite… dans l'IDE.
IV-B-1-b. Créer ou ajouter une fenêtre 'WinForm'▲
Dans un nouveau projet, créer ou ajouter une fenêtre 'WinForm'.
Pour ajouter une fenêtre (un formulaire) Menu 'Project', 'Ajouter un formulaire Windows' ( 'Add a WindowsForms' en version anglaise) :
Cela permet d'ajouter un formulaire, mais aussi un module standard, un module de Classe.
Cliquer sur Windows Form, une fenêtre (un formulaire) Form2 vide apparait (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'…
IV-B-1-c. Le concepteur (Designer)▲
C'est la zone permettant de dessiner l'interface utilisateur : les fenêtres, controles…
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-B-1-d. Les procédures▲
Elles contiennent le code en visual basic. On se souvient que pour chaque événement de chaque objet visuel il existe une procédure.
Dans l'explorateur de solution à droite, cliquer sur Form1.vb puis sur l'icône 'Afficher le code' (survoler les petites icônes, c'est la 4e), cela donne accès aux procédures liées à Form1.
Il est aussi 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.
Dans toute fenêtre de code ou de texte, vous pouvez effectuer rapidement un zoom avant ou arrière (agrandir ou réduire la taille des caractères) en appuyant sur la touche CTRL tout en déplaçant la roulette de défilement de la souris.
On peut 'taper' du code dans les procédures. Dès que vous tapez quelques caractères Vb ouvre des listes vous proposant la suite (voir aide).
La liste déroulante de gauche au-dessus de la procédure donne la liste des objets, celle de droite, les événements correspondants à cet objet.
Ici on voit la procédure Button1_Click liée au Button1 de la fenêtre de Design :
Il est possible de faire de la saisie ou de l'insertion multiple.
Pour cela il faut appuyer sur ALT puis sélectionner à la souris une colonne sur plusieurs lignes:
Si ensuite on tape du code , il apparait sur toutes les lignes :
Insertion de texte : sélectionnez plusieurs lignes puis tapez dans la sélection de zone pour insérer le nouveau texte dans chaque ligne sélectionnée.
Collage : collez le contenu d'une sélection de zone dans une autre.
Zones de longueur nulle : effectuez une sélection verticale de zéro caractère de largeur pour créer un point d'insertion multiligne où insérer du texte sur toutes les lignes en même temps.
Quand on clique sur une variable, cette variable est surlignée dans l'ensemble du code :
CTL+MAJ+Flèche haut ou Flèche bas permet de passer à la variable surlignée suivante ou précédente.
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.
Si une ligne de code est trop longue, on peut ajouter un caractère de continuation de ligne "_" et passer à la ligne. En VB 2010, après certains mots il peut y avoir continuation de ligne implicite (plus besoin de _ après la virgule, après &, après une parenthèse ouvrante, après { ou = ou + ou Is…).
Public
Function
GetUsername
(
ByVal
username As
String
,
ByVal
delimiter As
Char
,
ByVal
position As
Integer
) As
String
Return
username.Split
(
delimiter)(
position)
End
Function
En vb 2010, si dans le code, on utilise une classe qui n'existe pas, vb souligne le nom de la classe et vous propose (en cliquant sur le bouton dessous) de créer une classe, une structure ou un Enum vide :
. Cliquez sur 'générer un nouveau type".
Il existe une 'Recherche rapide' très puissante accessible par le menu 'Édition'.
Il y a bien sur les habituels boutons 'Couper', 'Copier', 'Coller', mais aussi le bouton qui transforme les lignes sélectionnées en commentaire (ou l'inverse).
Le menu 'Édition' puis 'IntelliSense' donne accès aux aides à l'écriture
IV-B-1-e. Ajouter des contrôles au formulaire▲
Ajouter un bouton par exemple.
Passer sur Boite à outils (Toolbox) à gauche, les contrôles apparaissent tous ou classés par ordre alphabétique.
Cliquer sur 'Button' dans la boite à outils, cliquer dans la Form, déplacer le curseur sans lâcher le bouton, puis lâcher : un bouton apparait.
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' qui sont visibles (Text, Location…) on peut modifier directement les valeurs.
En bas de la fenêtre propriétés, il y a une explication succincte de la propriété sélectionnée (si elle n'apparait pas, clic droit sur la propriété puis dans le menu 'Description').
Exemple
Si au niveau de la ligne 'Text' des propriétés du bouton, j'efface 'Button1' et que je tape 'OK', dans le designer, le texte écrit sur le bouton deviendra 'OK'.
En haut de cette fenêtre de propriété, il y a un bouton avec un éclair donnant accès aux événements de l'objet.
Le déplacement des contrôles
Plus de croix ni de petite flèche pour déplacer le contrôle ou ouvrir un menu. Pour déplacer le contrôle, appuyer bouton gauche dedans puis déplacer.
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 :
Disposition des contrôles
Le menu 'Outils', 'Personnaliser' permet d'ajouter une barre de disposition :
Cela permet (comme avec le menu Format) d'aligner les contrôles sur la grille, d'aligner les côtés, la taille, les espacements, d'uniformiser les tailles, de centrer dans la fenêtre…
IV-B-1-f. 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) :
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 sur le petit triangle), 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 apparaitre 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-1-g. Tester son logiciel▲
La Liste d' erreurs, en bas indique les erreurs de syntaxe (erreurs et avertissements).
On peut tester le projet grâce à : lancer l'exécution avec le premier bouton (mode 'Run'), le second servant à arrêter totalement l'exécution: Retour au mode 'Design' (ou 'Conception').
Pour arrêter le programme temporairement en mode 'Debug' il faut un point d'arrêt ou faire Ctrl+Pause (ce qui ouvre une autre fenêtre !!).
En cliquant sur (visible lors de l'exécution) on peut aussi suspendre l'exécution.
Par contre on peut mettre un point d'arrêt quand le programme tourne en cliquant dans la marge grise avant le code.
Quand on est en arrêt temporaire en mode 'Debug', la ligne courante, celle qui va être effectuée, est en jaune :
Si on tape la touche F8 (exécution pas à pas), la ligne est traitée et la position courante passe à la ligne en dessous.
F5 relance l'exécution.
En mode Debug, on peut modifier une ligne et poursuivre le programme qui tiendra compte de la modification (sauf pour les déclarations). On parle d''Edit and continue'.
IV-B-1-h. Sauvegarde, Projet, chemin▲
La sauvegarde du projet se fait comme dans tous les logiciels en cliquant sur l'icône du paquet de disquettes.
On peut compiler (on dit 'générer') le programme pour créer un exécutable par le menu 'Générer' ('Build'). Le code présent dans l'IDE est le code source, après compilation le fichier exécutable contient du code exécutable.
Projet
Dans la terminologie VB, un projet est une application en cours de développement.
Une 'solution' (Team Project) regroupe un ou plusieurs projets (c’est un groupe de projets). Il n'y en a pas dans la version express.
En VB express on parle donc uniquement de projet, en fait ,VB crée aussi une solution de même nom.
Fichiers, Chemins des sources
Sous Windows XP regardez dans ' C:\Documents and Settings\Nom Utilisateur\Mes documents\Visual Studio 2010\ Projects\MonProjet'
Sous Windows 7 le programme est accessible dans 'Document/Visual Studio 2010/Projects/MonProgramme'.
MonProjet.sln est le fichier solution. (Pas de solution en VB express, que des projets.)
MonProjet.psess est le fichier de performance (pas toujours présent).
MonProjet.suo est le fichier de User Option.
Dessous existe un répertoire nommé aussi MonProjet qui contient :
MonProjet.vbProj le fichier de projet ;
Form1.vb contient un formulaire et ses procédures ;
MyClasse.vb contient par exemple des classes ;
Form1.Designer.vb contient le code qui créer la fenêtre et les contrôles.
Il a encore les sous répertoires \Bin, il y a aussi un répertoire \Obj et un répertoire \MyProjet.
Si on compile (génère) le projet l'exécutable est dans un sous répertoire \Bin, Vb 2010 choisit automatiquement la configuration Debug (compilée avec des informations de débogage symboliques et aucune optimisation) lorsque vous cliquez sur Démarrer dans le menu Déboguer et la configuration Release (ne contient pas d'informations de débogage relatives aux symboles et est entièrement optimisée) lorsque vous utilisez le menu Générer.
Les exécutables générés (fichier .exe) sont respectivement dans /bin/Debug et /bin/Release.
IV-B-1-i. Propriétés du projet▲
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 compare et Option Infer.(Onglet Compiler).
Les références (dll liées au projet).
Les paramètres (valeurs liées à l'application).
Les ressources (texte, image, son) utilisées dans le programme.
La signature et la sécurité.
Les Extension My (nouveauté 2008).
Les paramètres relatifs à la publication (distribution et installation).
IV-B-1-j. Autre▲
On peut mettre des commentaires précédés de '.
' Commentaire non exécutable
'TODO ne pas oublier de modifier …
Si le premier mot du commentaire est TODO, comme ci-dessus, ce commentaire sera affiché dans la liste des tâches :
(Menu Affichage, Autres fenêtres, Liste des tâches).
C'est bien pratique pour ne pas oublier des modifications à faire.
IV-B-2. Interface WPF▲
Plutôt que de travailler avec les Windows Forms (formulaire habituel utilisant GDI+), en VB 2008 on peut utiliser un mode graphique vectoriel extrêmement performant pour dessiner les formulaires et contrôles : pour cela on utilise les WFP (Windows Presentation Foundation).
Pour cela : menu 'Fichier', 'Nouveau', 'Projet'.
On choisit 'Application WPF', on se retrouve dans un nouvel environnement :
Les formulaires et contrôles sont différents de ceux des Windows Forms, ainsi que les propriétés des objets graphiques.
Il y a le 'designer' en haut qui permet de dessiner l'interface que verra l'utilisateur. Le designer génère un fichier XAML en bas qui décrit en XML l'interface.
Dans la version Express, on peut dessiner des interfaces simples, les interfaces extrêmement élaborée (dégradé de couleur, animation…) peuvent être écrites en code XAML ou en utilisant un programme extérieur payant (Expression Blend). Voir le chapitre sur les WPF.
Si on double-clique sur un bouton, par exemple, on se retrouve dans la procédure événement correspondante.
On se rend compte que les événements là aussi ne sont pas les mêmes que pour les WindowsForm.
Il y a aussi d'autres modifications comme dans les propriétés du projet : voir le chapitre sur les WPF.
IV-B-3. Vb propose des aides▲
Quand on tape du code dans une procédure, VB affiche, des aides : dès que je tape une lettre VB propose dans une liste des mots.
Exemple, je tape 'di', il affiche 'Dim', 'Dir'…, de plus si je me mets sur un des mots, il ouvre une petite fenêtre d'explication sur le mot avec sa syntaxe.
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 on pointe une propriété, un rectangle donne une explication sur cette propriété.
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 blanc.
VB aide à compléter des mots.
Si je tape 'App' Vb affiche la liste des mots commençant par App: Objet, variables…
Dans le code, cliquez avec le bouton droit ouvre un menu et donne accès à :
VB fournit des exemples de code.
Les Extraits (Snippets, bride, morceau de code) permettent d'insérer du code tout fait.
Dans le code d'une procédure, le clic droit de la souris ouvre un menu.
Cliquer sur 'Insérer un extrait' (Insert Snipper). Puis par menu successif vous obtiendrez le code que vous cherchez.
Il existe une abondante documentation:
http://msdn.microsoft.com/fr-fr/library/dd831853%28v=VS.100%29.aspx
Dans l'IDE, VB donne accès à l'aide sur un mot-clé. 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 par le menu '?'.
Si le curseur passe sur un mot-clé, un carré affiche la définition de la fonction, le type de la variable, sa déclaration.
Erreur dans l'écriture du code
Vb propose des solutions pour corriger les erreurs de code :
Si je fais une erreur Vb la souligne en ondulé bleu, si je mets le curseur dessus il m'explique l'erreur :
S'il y a un soulignement rouge, mettre le curseur dessus affiche un bouton avec un point d'exclamation qui ouvre une fenêtre donnant la correction de l'erreur :
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 tâches en bas.
Mode débogage (mode BREAK)
Une fois lancée l'exécution (F5), puis stoppée (par Ctrl +Pause ou sur un point d'arrêt), ou en cliquant sur on peut :
voir la valeur d'une propriété d'un objet, d'une variable en le pointant avec la souris :
Il s'affiche un petit cadre donnant la valeur de la propriété d'un objet.
Si on clique sur la punaise, l'affichage de la variable et de sa valeur devient permanent et la valeur est mise à jour.
Quand on clique sur une variable, cette variable est surlignée dans l'ensemble du code :
F8 permet l'exécution pas à pas (y compris des procédures appelées).
MAJ F8 permet le pas à pas (sans détailler les procédures appelées).
CTRL+F8 exécute jusqu'au curseur.
Il y a un chapitre sur le débogage pour apprendre à trouver les erreurs de code.
IV-C. IDE SharpDevelop (logiciel libre en open spource)▲
C'est l'IDE (Integrated Development Environment) : Environnement de développement intégré GRATUIT, en open source, alternative à VisualStudio.
Depuis sa version 2 #develop est un très bon produit.
Il manque certaines choses.
Pas de "Edit and continue" : si on suspend l'exécution et qu'on modifie le code, la modification n'est pas prise en compte si on continue l'exécution, débogueur moins performant). On en est à la version 3.2 (version 4 en bêta).
Sharpevelopp (#Develop) sera toujours gratuit.
C'est un logiciel libre en open source (GPL).
IV-C-1. Où le trouver ? Comment l'installer ?▲
SharpDevelop 3.2 (version stable)
Si ce n'est pas fait, télécharger et installer le FrameWork 3.5. (Impérativement en premier).
Télécharger et installer le SDK.
C'est le Kit de Développement Microsoft .NET Framework : SDK du Framework 3.5.
Télécharger et installez SharpDevelop 3.2 (le 14/4/2010).
Télécharger SharpDevelop 3.2 (gratuit)
L'installer en exécutant le fichier d'installation.
Le Framework, le SDK et #develop suffisent pour faire des programmes.
La version 3.2 permet de travailler en VB avec les winforms.
SharpDevelop 4 (version beta)
Si ce n'est pas fait, télécharger et installer le FrameWork 4. (Impérativement en premier.)
Télécharger et installer le SDK.
C'est le Kit de Développement Microsoft .NET Framework : SDK du Framework 4.
Télécharger et installez SharpDevelop 4 bêta (le 14/12/2010).
Télécharger SharpDevelop 4 (gratuit)
L'installer en exécutant le fichier d'installation.
Le Framework, le SDK et #develop suffisent pour faire des programmes.
La version 4 bêta permet aussi de travailler avec WPF. Au 27/12/2010 elle n'est pas finalisée : impossible de créer facilement une Sub événement.
Lien
IV-C-2. Fenêtre Projet Windows Forms▲
Didacticiel en anglais pour les Windows Forms : http://community.sharpdevelop.net/blogs/mattward/articles/FeatureTour.aspx.
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 du Python, Ruby….
On peut utiliser les Windows Forms (version 3.2) ou WPF (version 4).
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' apparait.
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 visibles les écrans du code et des formulaires ; on peut changer d'écran grâce aux onglets du haut. Ici on voit 'MainForm'.
À 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…).
À 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 'tâches', définitions', 'Résultat des recherches'…
IV-C-2-a. Dans un nouveau projet, créer une fenêtre▲
Pour ajouter une 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' apparait. 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-C-2-b. 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-C-2-c. 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 visibles, 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 apparait en bas.
(On peut modifier les propriétés directement.)
IV-C-2-d. Voir les procédures▲
L'onglet 'Source' en bas donne accès aux procédures (au code) liées à Form1.
La combo déroulante 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),double-cliquez sur le bouton pour la créer.
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 apparaitre 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-C-2-e. Voir tous les composants d'un projet, les classes▲
Pour cela il faut utiliser La fenêtre Projet à gauche (Si elles ne sont pas visibles, 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 apparaitre les formulaires, les modules… et :
Références qui contient les espaces de nom ;
Assembly : info nécessaire pour générer le projet…
Le menu 'Fichier', 'Afficher les diagrammes de Classe' permet de voir les Classes du projet sous forme de diagramme :
IV-C-2-f. Remarque relative aux fenêtres de l'IDE▲
Pour faire apparaitre une fenêtre qui a disparu (fenêtre projet par exemple) utiliser le menu 'Affichage' puis 'projet'.
Quand la 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-C-3. Interface WPF▲
Interface WPF est présente à partir de la version 4.
Faire 'Fichier', 'Nouveau projet' :
Choisir 'VB', 'WPF' à gauche puis 'Application WPF' à droite, donner un nom en bas.
On se trouve dans l'environnement wpf :
L'onglet 'Window1.xaml' permet de voir le 'Designer'.
Le menu 'Affichage', 'Outils' permet d'avoir la liste des contrôles à gauche: On peut prendre un contrôle, un bouton par exemple, et le déposer dans la fenêtre centrale.
Si on clique sur un contrôle, on voit à droite ses propriétés.
En bas du designer l'onglet 'Source' permet d'avoir accès au code Xaml décrivant l'interface. Ici on voit le code xaml correspondant au bouton :
En bas à gauche, on peut cliquer sur l'onglet 'Projet'.
S'affiche les composants du projet, donnant accès à 'Windows.xaml.vb' contenant le code 'behind' visual basic.
Raccourcis clavier :
Ctrl+Entrée : Aller à la définition;
Ctrl + H: Rechercher;
Ctrl + G: Aller à.
Voir http://wiki.sharpdevelop.net/KeyboardShortcuts.ashx.
IV-C-4. 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 ;
Éditer : 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-C-5. 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-C-6. 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 à 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-C-7. #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-C-8. 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-C-9. Erreur d'exécution : Exceptions▲
S'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-C-10. Débogage▲
Le débogueur 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 apparaitre 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 (3e 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 :
Attention, 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-C-11. 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 sûr, 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 une 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-C-12. J'ai besoin d'aide▲
Comment créer facilement un installateur (SetUp) avec #develop ? Certains utilisateurs utilisent Inno Setup, d'autres Excelcior delivery.
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 ait 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 :SélectionnezLabel1
.Text
=
"Bonjour"
-
effectuer des calculs, des affectations en utilisant des variables.
Exemple: Mettre dans la variable B la valeur de A+1SélectionnezB
=
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 …SélectionnezIf
A=
1
Then
…End
If
- travailler en boucle pour effectuer une tâche répétitive.
Exemple faire 100 fois…
For
I=
0
To
100
….
Next
I
Comme nous l'avons vu, le langage Visual Basic sert à
Tout le travail du programmeur est là.
Dans VB.Net nous avons à notre disposition deux sortes de choses:
V-A-1. Les Classes du framework▲
Le Framework (un framework est un ensemble de classes) en est à sa version 4 en VB 2010.
Les classes du Framework permettront de créer des objets de toutes sortes: objet 'chaine de caractères', objet 'image', objet 'fichier'… On travaille sur ses 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 chaines de caractères), Math (permettant d'utiliser des fonctions mathématiques), Forms (permettant l'usage de formulaires, de fenêtres et donnant accès aux contrôles: boutons, cases à cocher, listes…).
Elles sont communes à tous les langages utilisant le FrameWork (VB, C#, C… ).
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.
Parfois la Classe n'est pas chargée par défaut au démarrage de VB, il faut dans ce cas 'l'importer' en haut du module (au-dessus de Public Class…). Si par exemple, je veux utiliser Sin() de la classe Math, il faut écrire en haut du module :
Imports
System.Math
Public
Class
Form1
Private
Sub
Form1_Load
(
ByVal
sender As
System.Object
, ByVal
e As
System.EventArgs
) Handles
MyBase
.Load
'Je peux utiliser Sin
Console.WriteLine
(
Sin
(
1
).ToString
)
End
Sub
End
Class
Si on n'a pas importé Math, on peut quand même utiliser Sin en tapant Math.Sin().
V-A-2. Les instructions de Microsoft.VisualBasic▲
Vb permet d'utiliser des instructions Visual Basic; seul VB peut les utiliser et de lui seul (pas C#).
Il s'agit d'instructions, de mots-clés qui ont une syntaxe similaire au basic, mais qui sont du VB.Net.
Exemple :
A =
Mid
(
MaString, 1
, 3
)
'Mid retourne une partie de la chaine 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 disparu de VB.Net. Ce sont des fonctions VB6 qu'on ajoute à VB.net par souci de compatibilité, mais ce n'est pas du VB.Net. Il faut les oublier !
L'outil 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 paraitre un peu compliqué, mais ne vous inquiétez pas, cela va devenir clair.
V-A-3. 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, pour faire fonctionner des exemples de code, de saisir des valeurs, de les afficher :
- 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
(
)
- 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"
sur la console :
Console.WriteLine
(
"Résultat"
)
ou
dans une Boite de message :
MsgBox
(
"Bonjour"
)
'ou
MessageBox.Show
(
"Bonjour"
)
V-B. Les 'Algorithmes'▲
Ici nous allons étudier les principes généraux de la programmation, ils sont valables pour tous les langages de programmation. Ici il faut simplement comprendre le principe de ce qui est expliqué.
V-B-1. 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 procédurale: 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 s'appelle 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 pseudocode) détaillant le fonctionnement de la fonction. Ce pseudocode 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 pseudocode 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 pseudocode.SélectionnezDébut Pour i allant de
1
à10
Ecrire(
i*
7
) Fin Pour FinExemple simpliste
-
Codage.
Traduction du pseudocode en Visual Basic, en respectant la syntaxe du VB.SélectionnezSub
MultiplicationPar7Dim
iAs
Integer
For
i=
1
to
10
Call
Affiche
(
i*
7
)next
i.
End
Sub
Exemple simpliste
- Test
Ici il suffit de lancer le programme pour voir s'il marche bien…
Pour des programmes complexes, il existe d'autres méthodes.
V-B-2. 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.
L'algorithme décrit le processus de résolution d'un problème permettant de décrire les étapes vers le résultat.
L'algorithme détaille, 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.
On écrit bien 'algorithme' et non 'algorythme'.Le mot "algorithme" vient du nom du mathématicien arabe Al Khuwarizmi (latinisé au Moyen Âge en Algoritmi).
Pour représenter l'algorithme et ses opérations, on utilisait les organigrammes (dessins avec des cases et des flèches qui ne permettaient de visualiser que des problèmes très simples); maintenant on utilise du pseudocode (composé d'instructions généralistes).
La mise en œuvre de l'algorithme consiste en l'écriture de ces opérations dans un langage de programmation (le Visual Basic pour nous).
On utilise l'anglicisme implémentation pour désigner cette mise en œuvre.
Étudions 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.
Pour représenter n'importe quel algorithme, il faut disposer des trois possibilités suivantes :
-
le choix qui indique quelles instructions doivent être exécutées en fonction de circonstances.
Pour représenter n'importe quel algorithme, il faut disposer des trois possibilités suivantes :
- la répétition qui indique que des instructions doivent être exécutées plusieurs fois.
Pour représenter n'importe quel algorithme, il faut disposer des trois possibilités suivantes :
Pour i allant de 1
à 10
Ecrire (
i*
7
)
Fin Pour
Voyons cela en détail.
Le langage algorithmique et son pseudocode ne sont pas vraiment standardisés, chacun écrit le pseudocode à 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 pseudocode ne sera jamais exécuté sur une machine.
L'intérêt 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… Comme on est dans un cours de VisualBasic, je donnerais pour chaque notion le pseudocode, mais aussi l'équivalent en Visual Basic.
V-B-3. Structures élémentaires▲
Il y a les structures de données (dans quoi sont stockées les données?) dans des :
-Constantes ;
-Variables ;
-Tableaux ;
-Collections ;
-Listes, Graphe, Arbre…
Il y a les structures de contrôles (Comment fonctionne le code ?) :
-Séquence ;
-Condition ;
-Boucle.
V-B-3-a. Séquences▲
Au sein d'un programme, la structure est généralement séquentielle.
On fait de la programmation impérative, on travaille sur le modèle de la machine de Turing, avec une mémoire centrale et des instructions qui modifient son état grâce à des assignations successives.
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
…
Quand le programme s'exécute, il le fait de haut en bas, Instruction 1 sera exécuté puis instruction 2 puis instruction 3…
En VB on peut mettre plusieurs instructions sur la même ligne, séparées par ":"
Instruction1 : Instruction2
V-B-3-b. Variables, 'Type' de variable▲
Les 'Variables' contiennent les informations les données nécessaires au déroulement du programme (c’est le même sens qu'en mathématiques, à 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 :
- la nature de l'information (un chiffre ? du texte ?) ;
- les valeurs que peut prendre la variable (un entier, un réel…) ;
-les opérations possibles (addition, concaténation…).
Exemple : le Type 'Entier' (Integer en VB) peut contenir une valeur entière, positive ou négative, les opérations possibles sont l'addition, la soustraction, la multiplication…Ainsi si je crée une variable de type Entier, je sais que je ne pourrai y mettre qu'un entier et que je pourrai faire une addition avec, je ne pourrai pas y mettre de caractères.
Les types disponibles sont :
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)
'chaine de caractères',(String en VB), contient plusieurs caractères. Exemple: 'toto' (avec des guillemets) ;
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) ;
Matrice, nombre imaginaire (depuis VB 2010).
À partir des types précédents, on peut créer des types complexes (ou structurés) :
- les Tableaux (Array) qui contiennent plusieurs éléments ;
- les Collections qui contiennent plusieurs éléments aussi.
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 (String et Char du VB) serviront entre autres à manipuler et 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.
Pour cela on peut utiliser un littéral : c'est une donnée utilisée directement.
X <- 2 veut dire : donner à la variable X la valeur 2 (2 est une littéral).
V-B-3-c. Constantes▲
Comme une variable, une 'Constante' a un Nom (identifiant) et un Type. Elle contient une valeur: un nombre, une chaine de caractères…
Son contenu ne peut pas être modifié.
Exemple :'Constante A en Numérique =12'.
En VB : 'Const A As Integer =12'.
On la déclare et on l'initialise en même temps.
Ensuite on ne peut pas modifier sa valeur, on ne peut que la lire. Les constantes sont utilisées dans les programmes pour conserver des valeurs fixes qui n'ont pas à changer. Si j'ai un programme d'astronomie, je créerai une constante contenant la vitesse de la lumière pour faire mes calculs (elle a peu de chances de changer !).
V-B-3-d. 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
Attention le signe '=' utilisé en VB est ambiguë et n'a donc pas le même sens qu'en mathématiques.
Exemple Visual Basic: A=B
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 'fonctionne, car 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 contenu 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-e. 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-f. 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ée.
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 deux 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 deux opérateurs, il faut dans ce cas utiliser plusieurs conditions et des opérateurs logiques.
Si B>2 Et B<7 Alors est correcte (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-g. 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-h. 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
Each
élément In
list
Next
V-B-3-i. Répétitions : Tant que▲
Permet de faire une boucle sans connaitre 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-j. Logique : Et, Ou, Non▲
Une condition contient deux 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 deux opérateurs, il faut dans ce cas utiliser plusieurs conditions et des opérateurs logiques :
Si B>2 Et B<7 Alors est correcte (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ée donc Vrai.
ET
On a vu Si B>2 Et B<7 Alors
Il existe aussi :
OU
Si B>2 Ou B<7 Alors
et
NON
Si NON(B>2) Alors est équivalent à Si B<=2 Alors
En VB on utilise les termes AND OR NOT.
V-B-3-k. Les Sauts▲
Un saut dans le code correspond à 'Aller à'.
Cela permet de 'sauter' vers un label (une étiquette= un endroit du code).
Exemple :
Variable A en Numérique
Variable B en Numérique
Variable C en Numérique
B<-12
A<-B
Aller à Poursuivre
C=11
Étiquette Poursuivre
A<-A+1
Le programme saute de 'Aller à Poursuivre' à 'Étiquette Poursuivre', il n'exécute pas C=11.
En VB on utilise GoTo pour faire le saut, pour créer une étiquette, on lui donne un nom et on ajoute ':'…
MonEtiquette:
GoTo monetiquette
On verra que les sauts ne sont pratiquement plus utilisés.
V-B-3-l. Programmation structurée▲
Avant on écrivait :
Variable A en Numérique
Variable B en Numérique
Variable C en Numérique
B<
-12
A<-
B
Si A=
B Aller à Poursuivre1
C<
-1
Étiquette Poursuivre1
Si A<>
B Aller à Poursuivre2
C<
-2
Étiquette Poursuivre2
On faisait des sauts dans tous les sens!! Code illisible, non structuré.
Maintenant, on structure et on n'utilise pas de 'Aller à'.
Variable A en Numérique
Variable B en Numérique
Variable C en Numérique
B<-12
A<-B
Si A=B Alors
C<-1
Sinon
C<-2
Fin Si
V-B-3-m. '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.
Dans un algorithme, une procédure commence par le mot Proc et se termine par End Proc.
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.
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()
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 deux paramètres :
Sub
MaProcédure
(
paramètre1, paramètre2)
…
End
Sub
Exemple d'appel de la procédure 'Maprocédure' en envoyant deux 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 deux entiers.
Il y a deux 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-n. 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 quatre é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 (ZÉRO).
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
Dim
A
(
4
) As
Integer
'on déclare le tableau
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(2,0) |
B(2,1) |
B(2,2) |
B[1,0] désigne l'élément de la seconde ligne, première colonne.
Voyons par exemple, le contenu de chaque élément :
3 |
12 |
0 |
18 |
4 |
5 |
12 |
2 |
8 |
Ici B[1,0] =18
En VB on utilise des parenthèses : B(1,0) =18
V-B-3-o. Collection▲
Une collection permet de stocker plusieurs variables ou objets, chaque élément étant repéré par un index ou indice. Mais la collection n'a pas de nombre d'éléments précis au départ, elle ne contient que les éléments qu'on y ajoute.
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 un élément
Il existe des collections avec des clés permettant de retrouver la valeur d'un élément rapidement.
V-B-3-p. Pile et Queue▲
Une Pile (ou stack) est une collection de type LIFO (Last In, First Out). Dernier entré, premier sorti.
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.
Une 'Queue' est une collection 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 éléments stockés dans Queue sont insérés à une extrémité; les éléments extraits le sont à l'autre extrémité.
Le nombre d'éléments de la queue est géré automatiquement.
Généralement on a les possibilités suivantes :
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
V-B-3-q. Liste chainée▲
Une liste chainée est une liste d'éléments non classée. Dans chaque enregistrement il y a, outre le contenu de l'enregistrement, la localisation, l'adresse, l'index de l'enregistrement précédent et de l'enregistrement suivant.
Ainsi on peut parcourir la liste en allant d'enregistrement en enregistrement. Il existe des algorithmes pour ajouter ou supprimer un enregistrement. La liste peut être ouverte ou fermée (le dernier enregistrement bouclant sur le premier).
V-B-3-r. Notion de Clé▲
Quand on classe une série importante de données, on peut utiliser la notion de clé/Valeur (Key/Value).
Ici on utilise comme clé le numéro du département et comme valeur, le nom du département.
Si on a la clé, on peut retrouver la valeur correspondante.
Autre exemple: La clé peut être le nom, prénom.
V-B-3-s. Notion de Hachage▲
Une fonction de hachage est une fonction qui fait subir une succession de traitements à une donnée fournie en entrée pour en produire une empreinte servant à identifier la donnée initiale.
Donnée d'entrée=> Fonction de hachage => Empreinte.
Le résultat d'une fonction de hachage peut être appelé selon le contexte empreinte, somme de contrôle (dans le cas de la CRC), résumé, condensé, condensat ou encore empreinte cryptographique (dans le cadre de la cryptographique). On l'appelait aussi autrefois aussi signature.
Les fonctions de hachage sont utiles en cryptographie où elles sont utilisées pour chiffrer une donnée initiale.
Mot de passe: "GftUi6h77"=> Fonction de hachage => Empreinte : "4587213399545684246847"
C'est l'empreinte qui va être enregistrée. Quand l'utilisateur rentre le mot de passe, on le 'hache" et on compare l'empreinte du mot de passe tapé par l'utilisateur avec l'empreinte enregistrée pour voir si le mot tapé est bon. Ainsi à aucun moment le mot de passe est en clair.
Ces fonctions de hachage sont aussi très utilisées pour accéder rapidement à une donnée contenue dans un grand nombre de données.
Ceci grâce aux tables de hachage (ou hash tables en anglais).
Un exemple classique et simpliste de fonction de hachage est la fonction modulo n : Si on dispose d'un grand nombre de données, à mettre dans un tableau de n cases, on pourra ranger l'élément numéro i dans la case i modulo n. Ainsi, pour aller chercher notre donnée, nous n'avons plus besoin de parcourir tous les éléments jusqu'à trouver l'élément i : Il suffit de parcourir les éléments contenus dans la case i modulo n. Si les données initiales étaient réparties uniformément, le temps de recherche en moyenne est divisé par n. En pratique, on utilise des fonctions de hachage bien plus complexes.
Le hachage est un nombre qui permet la localisation des éléments dans une table.
Exemple
Nous avons une série de noms et adresses, nous voulons rapidement trouver l'adresse correspondant à un nom sans avoir à faire une boucle qui compare le nom cherché avec chaque élément du tableau pour le trouver.
Pour chaque nom la fonction de hachage, va créer un numéro (empreinte).
On crée des enregistrements indexés par ledit numéro (empreinte), chaque enregistrement contenant l'adresse.
Si maintenant on cherche un nom, on calcule son empreinte, ce qui nous donne l'index de l'enregistrement que l'on trouve rapidement.
Si la fonction de hachage est uniforme, cela veut dire que pour des entrées différentes, il n'y a jamais la même empreinte. Ce qui est la plupart du temps impossible.
Deux noms peuvent donc donner la même empreinte parfois (on parle de collision). Dans ce cas, on range les enregistrements ayant la même empreinte les uns à la suite des autres (sous forme de liste chainée). Si le premier enregistrement n'est pas le bon, on regarde le suivant.
V-B-3-t. Arbre▲
Structure de données. Désigne une forme de diagramme qui modélise une hiérarchie.
Un arbre est constitué d'un ensemble de nœuds et de branches reliant les nœuds. On peut parler de feuilles pour les éléments, les objets qui sont en bout de branches.
Le premier nœud d'un arbre (celui sans branche entrante) se nomme la racine.
Un arbre est unidirectionnel et sans boucle.
Un exemple de données en 'arbre' : sur un disque dur, les répertoires, sous-répertoires et fichiers ont une structure en arbre.
V-B-3-u. Erreur d'exécution : Notion de 'Sécurisation' du code▲
Erreur d'exécution
Si le code exécute Z=X/Y avec Y=0 (pour des entiers) , comme la division par zéro est impossible, le logiciel s'arrête.
Il s'agit d'une 'Erreur d'exécution' (dépassement de capacité).
En VB on dit qu'une exception est levée.
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.
Si Y <>
0
Alors
Z=
X/
Y
Fin Si
Si vous testez cela en VB, bien utiliser des Integers, avec des Single le comportement est différent.
V-B-3-v. Récursivité▲
Une procédure est récursive si elle peut s'appeler elle-même.
Sub
Calcul
(
)
'…
Calcul
(
)
'…
End
Sub
Pourquoi utiliser la récursivité ?
Une procédure récursive découpe le problème en morceaux plus petits et s'appelle elle-même pour résoudre chacun des plus petits morceaux, elle résout une petite partie du problème elle-même.
V-B-3-w. 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.
Une 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-3-x. Compilation, interprétation▲
Ici on n'est pas à proprement parler dans l'algorithmie.
Le texte que vous écrivez pour construire un programme est le code source.
Tout langage doit obligatoirement être traduit en langage machine (le langage du processeur) pour que ce programme soit exécutable.
Il existe deux stratégies de traduction :
- le programme traduit les instructions au fur et à mesure qu'elles se présentent (à la volée) au cours de l'exécution. Cela s'appelle l'interprétation ;
- le programme commence par traduire l'ensemble du programme (programme source) en langage machine, constituant ainsi un deuxième programme (un deuxième fichier) distinct physiquement et logiquement du premier, c'est le fichier exécutable. Cela s'appelle la compilation. Ensuite, pour exécuter le programme, on exécute l'exécutable, ce second programme.
Les premiers langages Basic étaient interprétés. Un langage interprété était plus maniable : on exécutait directement son code au fur et à mesure qu'on le tapait, sans passer à chaque fois par l'étape supplémentaire de la compilation. Un programme compilé s'exécute beaucoup plus rapidement qu'un programme interprété : le gain est couramment d'un facteur 10, voire 20 ou plus.
Le VB.Net est un langage compilé.
Le code source est dans des fichiers '.vb' et l'exécutable est un '.exe'. On verra que dans l'environnement de développement vb présente les avantages d'un langage interprété (exécution pas à pas, modification du source en cours de débogage…) On peut aussi créer un exécutable autonome.
Les choses sont plus complexes, car en vb, entre le source et l'exécutable il y a un code 'intermédiaire'.
V-B-4. Grandes stratégies▲
Pour trouver des réponses à un problème, on va choisir une grande stratégie et utiliser des structures élémentaires pour l'exécuter.
Algorithme direct ou explicite
Ici l'algorithme utilise la seule voie possible, évidente mathématiquement.
Exemple : pour calculer les racines d'une équation du second degré, l'algorithme calcule le déterminant puis en fonction de sa valeur (plusieurs cas), il calcule les racines.
Il est possible de découper un problème complexe en plusieurs problèmes plus simples.
Algorithme glouton
Un algorithme glouton suit le principe de faire, étape par étape, un choix optimum local, dans l'espoir d'obtenir un résultat optimum global.
Par exemple, dans le problème du rendu de monnaie (rendre une somme avec le moins possible de pièces), l'algorithme consiste à répéter le choix de la pièce de plus grande valeur qui ne dépasse pas la somme restante; c'est un algorithme glouton.
Nous faisons beaucoup d'algorithmes gloutons !
Diviser pour régner
Diviser pour régner est une technique algorithmique consistant à diviser un problème de grande taille en plusieurs sous-problèmes analogues.
Les algorithmes Diviser pour régner appliquent deux stratégies principales. La première est la récursivité sur les données: on sépare les données en deux parties, puis on résout les sous-problèmes (par la même fonction), pour enfin combiner les résultats. La seconde stratégie, la récursivité sur le résultat, consiste elle à effectuer un prétraitement pour bien découper les données, puis à résoudre les sous-problèmes, pour que les sous-résultats se combinent d'eux-mêmes à la fin.
Exemple : les algorithmes de tri (trier un tableau par exemple).
Recherche exhaustive
Cette méthode utilisant l'énorme puissance de calcul des ordinateurs consiste à regarder tous les cas possibles.
Exemple : rechercher une clé pour pénétrer dans un site (c'est mal !!): on teste à l'aide d'une boucle toutes les clés possibles, on parle de 'force brute'.
Algorithme aléatoire, approches successives
Certains algorithmes utilisent des recherches aléatoires, ou par approches successives donnant de meilleurs résultats que des recherches directes ou explicites. Exemple : ceux dits de Monte-Carlo et de Las Vegas.
Les heuristiques
Pour certains problèmes, les algorithmes ont une complexité beaucoup trop grande pour obtenir un résultat en temps raisonnable. On recherche donc une solution la plus proche possible d'une solution optimale en procédant par essais successifs. Certains choix stratégiques doivent être faits. Ces choix, généralement très dépendants du problème traité, constituent ce qu'on appelle une heuristique. Les programmes de jeu d'échecs, de jeu de go fonctionnent ainsi.
V-B-5. Quelques algorithmes▲
Les algorithmes les plus étudiés sont :
- Algorithmes simples :
…Inversion de variables,
…Recherche d'une valeur dans un tableau,
…Tri,
…Problème du voyageur de commerce ;
- Algorithmes utilisant la récursivité ;
- Algorithmes mathématiques ;
- Algorithmes informatiques complexes :
…Compression,
…Cryptage,
…Graphisme,
….
V-B-5-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-5-b. Tri de tableau▲
Pour trier un tableau de chaines de caractères (des prénoms par exemple), il faut comparer 2 chaines 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 chaines, sinon on n'inverse pas. Puis on recommence sur 2 autres chaines 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éments 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
Remarque : pour inverser le contenu 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-6. 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, c'est le signe '=' qui indique l'affectation.
L'affectation 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 entraine 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 entraine 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.)
Attention dans le cas de l'affectation "=" ne veut donc pas dire 'égal'.
A=A+1 est possible
Si A=1
A=A+1 entraine que A=2
On verra qu'il existe des variables numériques ('Integer' 'Single') et alphanumériques (chaine 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 (chaine de caractères) A=B n'est pas accepté.
Écriture 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 chaine de caractères 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.
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…
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 |
Voilà, on a bien permuté.
V-D. Les variables : généralités▲
C'est le même sens qu'en mathématiques.
Une variable sert à stocker un nombre, du texte (chaine de caractères), une date, un objet…
Une variable a un nom et un type qui indiquent ce que l'on peut y mettre (Elle a aussi une 'portée' : où et quand sera-t-elle visible et utilisable ?).
Si myString est une variable de type chaine de caractères (ou String): je peux y mettre une chaine de caractères ("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. 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 rappellent 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 (chaine 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 à être une variable String.
De même % force les Integer, & les long…
Cette notation est moins utilisée et non recommandée.
Voir en annexe, en bas de page des recommandations supplémentaires.
Nommage
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-2. 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.
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.
Bien sûr, on ne peut pas déclarer plusieurs fois un même nom de variable :
Dim
a As
Integer
Dim
a As
String
' <= non accepté
On peut affecter à une variable une valeur de même type que le type de la variable :
Dim
a As
Integer
a=
2
'OK
a=
"Philippe"
'Non, car on ne peut pas mettre une chaine de caractères dans une variable de type Integer
V-D-3. 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 afficher dans un label il faut transformer la variable total qui est un entier en chaine 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 chaine de caractères "123" c'est-à-dire les caractères "1" , "2" et "3"
On peut afficher les chaines 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 le montre: 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). Les variables numériques peuvent contenir des entiers(comme les Integer) ou des réels (comme les Single). Pour les réels dans le code, le séparateur est le point:
V-D-4. Les différents types de variables▲
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 signé sur 16 bits (-32768 à 32768) |
Integer |
Entier signé sur 32 bits (-2147483648 à 2147483647) |
Long |
Entier signé sur 64 bits (-9223372036854775808 à 9223372036854775807) |
BigInteger |
Entier signé très grand (sans limite supérieure ou inférieure) (VB2010) |
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 |
chaine de caractères de longueur variable (jusqu'a 2 milliards 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. |
Depuis 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 |
Complex |
Nombre complexe (en VB2010) |
V-D-5. Les Boolean▲
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
Après déclaration un Boolean a la valeur False.
V-D-6. 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) |
BigInteger |
Entier signé très grand (sans limite supérieure ou inférieure) (VB2010) |
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 aux nombres entiers naturels : Entiers positif ou négatif et 0 (…-3 -2 -1 0 1 2 3…), mais avec une limite.
Attention, les variables numériques en informatique ne peuvent pas contenir de nombre infiniment grand ( sauf les BigInteger): 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
Après déclaration une variable numérique contient 0.
Le type de données Byte est utilisé pour contenir des données binaires (octet codant de 0 à 255) non signé.
V-D-7. Variable réelle▲
Un réel peut avoir une partie fractionnaire: 1,454 est un réel.
Pour le mathématicien, les Single, Double… correspondent aux nombres réels ou fractionnaires: mais avec des limites ( sur la précision et le fait qu'ils 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 sûr, plus précis et peut atteindre des nombres plus grands 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.
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 en Virgule fixe.
Le type 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.
Il est codé sur 128 bits sous forme d'un entier et une puissance de 10.
Les Calculs en Decimal sont 10 fois plus lents que les calculs en Single, mais il n'y a pas d'erreur d'arrondi avec les décimals.
Pour les calculs financiers ont utilisera les 'Decimal'.
Pour les petits calculs du genre résultats d'examen biologique, on 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-8. String, Char▲
Le type 'String' peut contenir une 'chaine de caractères' (alphanumérique) comme du texte. La longueur de la chaine n'est pas fixe et une String peut avoir un nombre de caractères allant de 0 jusqu'à environ 2 milliards de caractères.
Les chaines 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 en interne le code 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 où 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 affichables :
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 faite pour cela: ControlChars.CrLf.
V-D-9. Place occupée en mémoire▲
Les types de variables 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' correspondant. On peut utiliser l'un ou l'autre.
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 chaine |
System.String |
La méthode GetType permet de savoir de quel type, de quelle Classe est une variable.
Dim
x As
String
=
"a"
MessageBox.Show
(
x.GetType.ToString
) 'Affiche: Systeme.String
Prend le type de x, le transforme en String, l'affiche dans une MessageBox (Noter qu'il faut initialiser x avec une valeur avant de faire GetType).
V-D-10. Type primitif, littéral▲
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.
- Lorsqu'une expression est constituée de constantes de type primitif, le compilateur évalue l'expression au moment de la compilation. C'est plus rapide.
Un littéral: c'est une donnée utilisée directement; une valeur numérique ou en toutes lettres par opposition à une variable.
Dim
i As
Integer
i=
4
'4 est un littéral, c'est ici un integer
On voit que le littéral est un Integer en passant la souris dessus.
Dim
i As
Integer
i=
100000000
'valeur non acceptée, car trop grande pour un littéral integer
Dim
j As
Long
j=
100000000
'accepté, car le littéral est un Long
Attention, si je tape :
i=
1.4
1.4 est un Double, il sera converti en Integer pour être affecté à i est on aura dans i la valeur 1.
Le signe entre la partie entière et fractionnaire est le '.' dans un littéral et cela force le littéral à être un Double.
On peut forcer le type d'un littéral en ajoutant une lettre :
i=
42
L 'le 'L' indique que 42 est un Long
i=
42
I 'le 'I' indique que 42 est un Integer
i=
42
D 'le 'D' indique que 42 est un Decimal
i=
42
S 'le 'S' indique que 42 est un Single
C =
"A"
c 'le 'c' force "A" à être une Char et non une String
V-D-11. Nullable▲
Type Nullable
Les types Par Valeur peuvent être étendus afin d'accepter une valeur normale habituelle ou une valeur Null (Nothing en VB). On peut déclarer un type Nullable de 3 manières :
Dim
MyInteger As
Nullable (
Of
Integer
)
Mais aussi :
Dim
MyInteger? As
Integer
Dim
MyInteger As
Integer
?
C'est le '?' qui force la variable Nullable.
Sur la seconde déclaration, la variable est MyInteger
Autre exemple :
Dim
MyBol As
Boolean
?
MyBol pourra prendre la valeur True, False et Nothing.
Cela a de l'intérêt quand on travaille avec les bases de données qui ont des champs qui contiennent un Null et avec Linq.
La propriété HasValue permet de voir si la variable a une valeur autre que Nothing (Valeur retrouvée dans Value).
Dim
a? As
Integer
If
a.HasValue
=
True
Then
MsgBox
(
a.Value.ToString
)
End
If
V-D-12. Choix des noms de variables▲
- 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).
- Le nom des variables booléennes doit 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 apparaitre 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 chaines 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-E. Variables 'String' et 'Char'▲
V-E-1. Variables 'String'▲
Il faut déclarer une variable avant de l'utiliser, pour cela on utilise l'instruction Dim.
Dim
MyString As
String
Déclare une variable nommée MyString et qui peut contenir une chaine de caractères.
Cette variable peut être utilisée pour contenir une chaine de caractères.
MyString=
"TOTO"
'On met la chaine de caractères "TOTO" dans la variable MyString.
On peut afficher le contenu de la chaine dans un label (zone présente dans une fenêtre et où on peut afficher du texte) par exemple :
Label.text
=
MyString
Cela affiche 'TOTO' dans le label.
Remarquons que pour définir une chaine de caractères il faut utiliser des "" : Ce qui est entre" et " est la chaine de caractères. On parle ici de chaine littérale: une représentation textuelle d'une valeur particulière.
Après avoir été créée, une String contient 'Nothing' c'est-à-dire rien (même pas une chaine vide: ""); il faudra l'initialiser pour qu'elle contienne quelque chose.
Dim
str As
String
'str contient Nothing
'Testons si str contient Nothing
If
IsNothing
(
str) then
Console.Write
(
"contient Nothing"
)
(pas le texte "Nothing"!! mais la valeur Nothing qui signifie qu'elle ne pointe sur rien.
str=
""
'str contient "" : chaine vide de longueur 0
str=
"TOTO"
'str contient "TOTO"
Notez bien l'importance des guillemets :
A est la variable A
"A" est une chaine 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 chaine "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 chaine, il faut le doubler pour qu'il ne soit pas considéré comme caractère de fin de chaine :
A=
" Bonjour ""Monsieur"" "
'Cela affiche : 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 connaitre 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.
V-E-1-a. La Classe System.String▲
Le type System.String ou String (chaine de caractères) est une Classe du Framework, qui a des méthodes.
Pas besoin de connaitre toutes les méthodes, il suffit de déclarer la String par 'Dim réponse As String') de taper réponse puis "." et vous voyez apparaitre toutes les propriétés et méthodes :
Voyons par exemple la méthode .ToUpper
Elle retourne la chaine de caractères en majuscules.
str=
str.ToUpper
(
)
Si str contenait "abc" il contiendra "ABC"
.ToLower transforme par contre la chaine en minuscules.
Quel intérêt ?
Exemple
Je dois comparer 2 String pour savoir si elles sont égales, la première a été saisie par l'utilisateur et je ne sais pas si l'utilisateur a tapé en majuscules 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 chaine.
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"
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 chaine (cas le plus fréquent) :
s=
" Bonjour "
s=
s.Trim
(
" "
) 'donne s="Bonjour"
Attention avec Option Strict= On, s=s.Trim("") n'est pas accepté, car le paramètre de Trim doit être une Char, la String" "n'est pas transformée (castée) en char. Il faut écrire s=s.Trim(" "c) ou s=s.Trim(CChar("")).
Il existe aussi TrimStart et TrimEnd pour agir seulement sur le début ou la fin de la chaine.
Length
Length : Taille d'une chaine en nombre de caractères.
Afficher la taille de la chaine "VB"
Dim
s As
String
=
"VB"
MsgBox
(
s.Length.ToString
) 'Affiche 2
Concat
Concaténation de plusieurs chaines : mise bout à bout :
s=
String
.Concat
(
a,b)
Il est plus rapide de faire : s= a & b
(s= a+b fait la même chose, mais est déconseillé, on réserve '+' pour l'addition de numériques).
Concat est très pratique quand on veut mettre bout à bout tous les éléments d'un tableau :
Dim
s
(
) As
String
=
{"hello "
, "my "
, "friend "
, "to "
}
Dim
c As
String
=
String
.Concat
(
s
(
))
Insert
Insère une chaine 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 chaine.
Dim
s As
String
=
"VisualBasic"
s =
s.Remove
(
2
, 7
) 'Donne s= "Viic"
Replace
Remplace dans une chaine de départ, toutes les occurrences d'une chaine par une autre.
Resultat=ChaineDépart.Replace(chaineARemplacer,chaineQuiRemplace)
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 chaines une chaine de départ, cela par rapport à un séparateur.
Exemple
Je récupère dans un fichier une chaine de mots ayant pour séparateur ";", je veux mettre chaque mot dans un tableau.
chaine 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"
Remarque : quand on déclare le tableau nom(), on ne donne pas le nombre d'éléments, c'est Split qui crée autant d'éléments qu'il faut.
En Framework 2, on peut utiliser plusieurs séparateurs différents :
nom=
s.Split
(
New
Char
(
) {" "
c, ","
c, "."
c }) 'ici on a 3 séparateurs: l'espace, la virgule et le point.
le ci-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 lignes 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 chaine à 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
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 chaine à chercher est trouvée dans une autre avec en plus possibilité d'indiquer la position de départ.
Dim
a As
String
=
"LDF.EXE"
Dim
r As
Char
(
)=
{"."
}
a.IndexOfAny
(
r) recherche à partir du début de chaine.
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"
'chaine à chercher
Dim
anyOf As
Char
(
) =
target.ToCharArray
(
) 'on transforme la chaine 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 chaines :
Dim
rep As
Integer
rep=
String
.Compare
(
a,b)
Retourne un entier.
-1 si a<b
0 si a=b
1 si a>b
On peut comparer des sous-chaines et indiquer la sensibilité à la casse (Framework 2) :
Dim
myStr1 As
[String
] =
"My Uncle Bill"
Dim
myStr2 As
[String
] =
"My uncle bill"
Dim
r As
Integer
=
String
.Compare
(
myStr1, 2
, myStr2, 2
, 10
, StringComparison.CurrentCultureIgnoreCase
)
Ici on compare 10 caractères en commençant par le deuxième caractère de chaque chaine en mode insensible à la casse (majuscules=minuscules).
Voir ci-dessous, le chapitre comparaison.
.Equals
Permet de comparer 2 chaines. Retourne True si elles sont égales.
Dim
b As
Booleen=
String
.Equals
(
"aaa"
, "AAA"
)
'b=False
On peut ajouter un paramètre pour signifier la culture ou indiquer de ne pas tenir compte de la case comme ici :
Dim
b As
Booleen=
String
.Equals
(
"aaa"
, "AAA"
, StringComparison.CurrentCultureIgnoreCase
)
'b=True
.Contains
Permet de savoir si une chaine apparait dans une autre: (Framework 2)
Dim
trouve As
Boolean
trouve =
a.Contains
(
"123"
)
Retourne True ou False
.Substring
Extrait une partie d'une chaine.
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-chaine, 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-chaine.
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-chaine, va jusqu'a la fin de la chaine.
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 chaine 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 chaines avec la Classe String :
myString =
New
String
(
" "
, 15
) 'Créer une chaine de 15 espaces
.PadRight
Aligne les caractères de cette chaine à 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.
Voir aussi String.Format dans le chapitre : Afficher correctement du texte.
.IsNull , IsNullOrEmpty() Framework 2
Il est parfois nécessaire de vérifier si une chaine est égale à Nothing ou de longueur égale à 0 (vide).
If
S Is
Nothing
AndOr S.length
=
0
Then
Ou
If
String
.IsNullOrEmpty
(
S) Then
À partir de vb 2010 existe aussi String.IsNullOrWhiteSpace qui est égal à True si la chaine est Null Empty ou ne contient que des espaces :
If
String
.IsNullOrWhiteSpace
(
value) Then
…
'Est équivalent à (mais plus rapide):
If
String
.IsNullOrEmpty
(
value) OrElse
value.Trim
(
).Length
=
0
Then
….
V-E-1-b. Les instructions 'Visual Basic'▲
CONSEIL: Si vous débutez, laissez de coté ces instructions Visual Basic: elles font double emploi avec la classe String, elles ne sont pas toujours cohérentes avec le reste et cela embrouille.
Utilisez donc uniquement la classe String.
Les instructions VB, elles, sont bien connues des 'anciens' et font partie intégrante de VisualBasic; elles sont parfois plus simples. Mais elles ne fonctionnent pas comme des Objets, mais comme des instructions.
Elles font partie de l'espace de noms '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 avoir ambiguïté et il faut utiliser dans ce cas la syntaxe complète (avec l'espace de nom). 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.
Attention : le premier caractère est en position 1 dans les instructions VB.
Mid
Permet de récupérer une sous-chaine.
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-chaine, en commençant à la position 1. (les caractères sont comptés 1, 2, 3…; on rappelle qu'avec SubString la sous-chaine, commence à la position 0.
a =
Mid
(
MaString, 14
)
Retourne "tion": du 14e à la fin (pas de 3e 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 chaine:
MyLen =
Len
(
MaString)
Retourne 17.
LTrim, RTrim
Enlève les espaces à gauche ou à droite d'une chaine.
a=
LTrim
(
" RRRR"
)
a="RRR"
InStr
Retourne un entier spécifiant la position de début de la première chaine à 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 chaine "aaaaRaa"
Si la chaine n'est pas trouvée, retourne 0.
InStrRev
Recherche aussi une chaine, mais de droite à gauche. La position de départ est le 3e argument.
InStrRev (Ch1, Ch2 , PosDépart)
StrComp Compare 2 chaines.
Space
Retourne une chaine d'espace: Space(10) retourne " "
StrDup
Retourne une chaine 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. Il peut être compris entre 0 et 255 pour les valeurs du jeu de caractères codés sur un octet (SBCS) et entre -32 768 et 32 767 pour les valeurs du jeu de caractères codés 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 chaine à une position donnée.
Dim
maString As
String
=
"AIDE"
Dim
monChar As
Char
monChar =
GetChar
(
maString, 3
) ' monChar = "D"
LCase Ucase
Retourne la chaine en minuscules ou majuscules :
Lowercase =
LCase
(
UpperCase)
Lset Rset
Retourne une chaine alignée à gauche avec un nombre de caractères.
Dim
maString As
String
=
"gauche"
Dim
r As
String
r =
LSet
(
maString, 2
) ' Retourne "ga"
Si la chaine 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 chaine ou les caractères ont été inversés :
Dim
maString As
String
=
"STRESSED"
Dim
revString As
String
revString =
StrReverse
(
maString) ' Retourne "DESSERTS"
Marrant l'exemple !
Filter (VB2005)
Passe les Strings d'un tableau dans un autre tableau, si elles contiennent ou non une chaine.
TableauResultat=
Filter
(
TableauChaine, Match, Include, Compare
)
Match: chaine à chercher.
Include: Filtre sur la présence ou non de la chaine à 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
'chaine 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 chaine String avec un modèle (Pattern), elle permet de voir si la chaine 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)
UTILISER PLUTÔT le REGEX.
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 chaine vide, le résultat est True. Sinon, si string ou pattern est une chaine 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ère présent dans la liste.
[!caractères] veut dire tout caractère 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 finit 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-E-1-c. Un exemple▲
Combinaison de chaines de caractères, de variables.
Souvent, on a besoin d'afficher une combinaison de chaines 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 chaine on ajoute les bouts de chaines avec l'opérateur '&'.
Notez l'usage d'espace en fin de chaine 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".
V-E-1-d. Comparaison de caractères (Option Compare)▲
On peut comparer 2 String avec :
les instructions '=', '>', '<':
Dim
s1 As
String
=
"ABCD"
Dim
s2 As
String
=
"XYZ"
Dans ce cas s1<s2 est vraie.
Car 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és dans un ordre qui reflète plus la réalité d'un texte :
Tous 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.
On peut modifier Option Compare soit dans les propriétés de l'application (Menu 'Projet' puis 'Propriétés de ' puis onglet 'Compiler') ou dans un module en ajoutant en haut 'option Compare Text'.
Grandes règles de comparaison
La comparaison s'effectue de gauche à droite.
La comparaison s'effectue sur le premier caractère de chaque chaine.
Si le premier caractère est identique, la comparaison se fait sur le deuxième caractère…
"zz" > "za" est vrai
En cas de chaine 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 chaines 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 chaines 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 chaines (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 tri est dans le bon ordre.
V-E-1-e. Comparaison avec Equals et String.Compare▲
Equals retourne un Boolean égal à True si les 2 chaines sont égales.
Cette méthode effectue une comparaison ordinale respectant la casse (majuscules et minuscules ne sont pas égales) et non spécifique à la culture.
Dim
myStr1 As
[String
] =
"My Uncle Bill"
Dim
myStr2 As
[String
] =
"My uncle bill"
Dim
r A Boolean
=
myStr1.Equals
(
MyStr2)
'Autre syntaxe:
Dim
r A Boolean
=
String
.Equals
(
MyStr1, MyStr2)
'Avec la première syntaxe, on peut ajouter des options de comparaison :
Dim
r A Boolean
=
myStr1.Equals
(
MyStr2, CurrentCultureIgnoreCase)
String.Compare compare 2 chaines et retourne un Integer qui prend la valeur :
0 si les 2 chaines sont égales.
inférieur à 0 si string1 est inférieur à string2.
supérieur à 0 si string1 est supérieur à string2.
Dim
myStr1 As
[String
] =
"My Uncle Bill"
Dim
myStr2 As
[String
] =
"My uncle bill"
Dim
r As
Integer
=
String
.Compare
(
myStr1, myStr2)
MessageBox.Show
(
r.ToString
)
Par défaut la culture en cours est utilisée et la comparaison est comme avec Option Compare=Binary: le code Unicode est utilisé.
'Affiche 1, car "A"<"a"
MessageBox.Show
(
String
.Compare
(
"A"
, "a"
).ToString
)
On peut ajouter des options de comparaison : IgnoreCase, IgnoreSymbol, IgnoreNonSpace, IgnoreWidth, IgnoreKanaType et StringSort.
Dim
myStr1 As
[String
] =
"My Uncle Bill"
Dim
myStr2 As
[String
] =
"My uncle bill"
Dim
r As
Integer
=
String
.Compare
(
myStr1, myStr2, ignoreCase:=
True
)
MessageBox.Show
(
r.ToString
)
'Autre syntaxe: on a 2 options
Dim
r As
Integer
=
String
.Compare
(
myStr1, myStr2, CompareOptions.IgnoreCase
And
CompareOptions.IgnoreSymbol
)
On peut même comparer dans une autre culture :
Dim
myComp As
CompareInfo =
CultureInfo.InvariantCulture.CompareInfo
Dim
r As
Integer
=
myComp.Compare
(
myStr1, myStr2))
Ici on compare 10 caractères en commençant par le deuxième caractère de chaque chaine en mode insensible à la casse (majuscules=minuscules).
Les options font partie de l'énumération StringComparison et pas de CompareOptions comme plus haut.
Dim
myStr1 As
[String
] =
"My Uncle Bill"
Dim
myStr2 As
[String
] =
"My uncle bill"
Dim
r As
Integer
=
String
.Compare
(
myStr1, 2
, myStr2, 2
, 10
, StringComparison.CurrentCultureIgnoreCase
)
V-E-1-f. 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 chaine 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-E-2. Variables 'Char'▲
Les variables Char contiennent un caractère et un seul, un caractère est stocké sous la forme d'un nombre de 16 bits (2 octets) non signé 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 'c' à un littéral de chaine force ce dernier à être un type Char. À utiliser surtout si Option Strict (qui force à être strict…) est activé.
Exemple:
Option
Strict
On
'…
Dim
C As
Char
C =
"A"
c
'Autre manière de faire:
C=
CChar
(
"A"
)
'On convertit la String "A" en Char
Après déclaration une variable Char contient '' c'est-à-dire un caractère vide.
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 minuscules
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 minuscules
Existe aussi IsLetterOrDigit, IsUpper.
Bien sûr, si 'Option Strict= On', 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 chaine : Char.IsWhiteSpace(str, 4)
Autre manière de tester chaque caractère 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"
Pour savoir si un caractère a un code Unicode précis il y a 2 méthodes :
if MyChar=Convert.ToChar(27) then…
ou
if AscW(MyChar)=27 then…
Si vous souhaitez utiliser Asc et Chr de VisualBasic :
Dim
monAscii As
Short
=
Asc
(
"B"
) 'Asc donne le code ASCII ou l'Unicode (Ascw fait de même ?)
Dim
monChar As
Char
=
Chr
(
66
) 'Char retourne le caractère qui a le code ASCII donné.
V-E-3. Et les chaines de longueur fixe▲
Débutant s'abstenir.
On a vu que les chaines de longueur fixe n'existent pas en VB.NET (compatibilité avec les autres langages oblige), ET ON S'EN PASSE TRÈS BIEN, mais il y a moyen de contourner le problème si nécessaire.
On peut créer une chaine d'une longueur déterminée (comme paramètres pour appeler une API par exemple) par :
Dim
Buffer As
String
Buffer =
New
String
(
CChar
(
" "
), 25
)
'appel
UserName =
Left
(
Buffer, InStr
(
Buffer, Chr
(
0
)) -
1
) 'on lit jusqu'au caractère
'chr(0) qui est en interne le dernier caractère de la chaine
On peut aussi 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 l'initialiser en même temps:
Dim
MaChaineFixe As
New
VB6.FixedLengthString
(
100
, "hello"
)
Pour afficher la chaine fixe, utilisez MaChaineFixe.ToString.
Mais pour mettre une chaine dans cette chaine de longueur fixe!! galère pour trouver!!!
MaChaineFixe.Value="ghg"
Enfin ce type de chaine fixe ne peut pas être utilisé dans les structures, mais il y a un autre moyen pour les structures. On verra cela plus loin.
Donc les chaines fixes sont à éviter.
V-E-4. Regex, expressions régulières▲
Débutant s'abstenir.
Les expressions régulières sont une manière de rechercher (de remplacer, d'extraire) une sous-chaine ou un modèle d'une chaine de caractères.
On a un modèle, on veut voir si une chaine contient des parties répondant à ce modèle. Simplement pour voir ou pour séparer des sous-chaines, remplacer…
Exemple: une chaine ne contient-elle que les lettres 'abc', commence-t-elle par 'hello' ou 'HELLO', est-elle une adresse mail valide, un code postal valide? Comment découper une chaine ayant comme séparateur des chiffres? Comment remplacer tous les caractères 'wxyz' par des '-'?….
V-E-4-a. Principe du regex▲
Les Regex servent à :
- vérifier la syntaxe d'une chaine de caractères ;
- remplacer une partie de la chaine par une autre chaine ;
- découper une chaine de caractères ;
-extraire certaines sous-chaines.
Pour expliquer le principe, on va comparer une chaine String avec un modèle, un 'Pattern', nommé 'REGEX'.
Cela permet de vérifier la syntaxe d'une chaine de caractères. La chaine de caractères à examiner respecte-t-elle un motif (le Regex) décrivant la syntaxe attendue ?
Nécessite l'import d'un espace de noms en haut du module :
Imports
System.Text.RegularExpressions
Premier exemple très simple: Voir si une String ne contient que des chiffres.
Il faut dans un premier temps instancier un Regex contenant le motif. Comme exemple nous allons utiliser un motif permettant de voir si la String contient uniquement des chiffres :
Dim
rg As
New
Regex
(
"[0-9]"
)
Notez que le motif est entre guillemets. Le motif [0-9] signifie: tous les caractères entre 0 et 9.
Ensuite on va utiliser la propriété IsMatch du Regex rg pour voir si la String à vérifier ("4545896245" ici comme exemple) répond au motif. Elle retourne True si la String répond au motif.
rg.IsMatch
(
"4545896245"
) 'retourne True, car il n'y a que des chiffres.
Pour afficher :
MsgBox
(
rg.IsMatch
(
"45gdGRj1"
)) 'Affiche False dans une Box
Second exemple pas simple: Voir si une String contient une adresse mail valide.
Il faut dans un premier temps instancier un Regex contenant le motif. Comme exemple nous allons utiliser un motif permettant de voir si une adresse mail est valide :
Dim
rg As
New
Regex
(
"^([\w]+)@([\w]+)\.([\w]+)$"
)
Bonjour le motif !!!!
Ensuite on va utiliser la propriété IsMatch du Regex pour voir si la String à vérifier répond au motif. Elle retourne True si la String a bien la syntaxe d'une adresse mail.
MsgBox
(
rg.IsMatch
(
"philippe@lasserrelyon.fr"
)) 'affiche True
C'est donc extrêmement puissant !! mais on l'a compris tout l'art est d'écrire le motif !!
V-E-4-b. Caractères pour modèle regex▲
Principaux caractères composant les motifs :
hello veut dire le texte 'hello'
\ Caractère d'échappement: \. veut dire un point
^ Début de ligne
$ Fin de ligne
. N'importe quel caractère
| Alternative: toto|lulu veut dire toto ou lulu
( ) Groupement
-Intervalle de caractères: a-c veut dire a b ou c
[ ] Ensemble de caractères
[^] Tout sauf un ensemble de caractères
Après le caractère ou un groupe de caractères, on peut indiquer le nombre de caractères :
+ 1 fois ou plus
? 0 ou 1 fois
* 0 fois ou plus
{x} x fois exactement
{x,} x fois au moins
{x, y} x fois minimum, y maximum
Il y a aussi des métacaractères :
\s Caractère d'espacement (espace, tabulation, saut de page, etc)
\S Tout ce qui n'est pas un espacement
\d Un chiffre
\D Tout sauf un chiffre
\w Un caractère alphanumérique
\W Tout sauf un caractère alphanumérique
\r retour chariot
Il y a plein d'autres caractères et métacaractères…
V-E-4-c. Exemples▲
Petits exemples
[\.] contient un point car "." ne signifie pas 'n'importe quel caractère
il y a un caractère d'échappement avant.
^z$ contient uniquement z (entre début et fin).
es$ finit par "es"
^.$ contient un seul caractère (entre début et fin)
^(i|A) commence par i ou A
^((b)|(er)) commence par b ou er
^[a-c] commence par a,b ou c
[a-zA-Z] caractères en majuscules ou minuscules
[A-Z]+ un mot en majuscules
[A-Z]{1,7} un mot en majuscules de 1 à 7 caractères
[0-9] contient un chiffre
[^0-9] tous sauf un chiffre
\d+ entier positif
[+-]?d+ entier positif ou négatif , le signe + ou - est facultatif
^[^y] ne commence pas par y
^(o)+ commence par un ou plusieurs o
^(a)* peut ou non commencer par a
a{2,4} deux, trois ou quatre fois "a"
[12\^] chaine contenant les chiffres 1 ou 2 ou le symbole ^
^[0-9]+-[0-9]+$ 2 nombres séparés par un tiret: 55-4589 4586-85
[aeiou]\d Une voyelle et un chiffre: a2 i5
\d+ des chiffres (un ou plusieurs)
Validité de différent nom:
^[pP]hilip(pe)?$ True si philip Philip philippe Philippe
Validité d'une adresse ip :
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
V-E-4-d. Divers utilisations de Regex▲
Validation d'une chaine de caractères : IsMatch
Funtion SiValideMail (
Adresse As
String
) As
Boolean
Dim
rg As
New
Regex
(
"^([\w]+)@([\w]+)\.([\w]+)$"
)
Return
rg.IsMatch
(
Adresse)
End
Function
Retourne True si la chaine envoyée à la fonction est une adresse mail valide.
Remplacement dans une chaine de caractères : Replace
Funtion Remplace (
Chaine As
String
) As
String
Dim
rg As
New
Regex
(
"hello|salut|buenas dias"
)
Return
rg.Replace
(
Chaine, "bonjour"
)
End
Function
Retourne une chaine où hello, salut, buenas dias ont été remplacés par bonjour…
Découpage d'une chaine de caractères : Split.
Split permet de découper une chaine de caractères et de la mettre dans un tableau en utilisant l'expression régulière comme séparateur.
Dim
ch As
String
=
"az45er78ty"
Dim
rg As
New
Regex
(
"\d+"
)
Dim
t
(
) As
String
=
rg.Split
(
ch)
ch ="az45er78ty"', retourne t(1)="az" t(2)="er" t(3)="ty"
Retourne un tableau de chaines découpées à partir de ch avec comme séparateur les chiffres (séparateur : 1 ou plusieurs chiffres).
Extraire des chaines de caractères : Matches.
Matches permet d'extraire les séquences de caractères correspondant à un motif. Retourne une MatchCollection qui a une propriété Count indiquant le nombre d'éléments retournés. Cette MatchCollection en lecture seule est composée de 'Match' qui ont les propriétés 'Value' (chaine retournée) 'Index' (position: numéro caractère) et 'Length'.
On va extraire les chaines de 2 caractères (caractères de a à z, pas les ',').
Dim
ch As
String
=
"az,er,ty"
Dim
rg As
New
Regex
(
"[a-z]{2}"
)
Dim
mac As
MatchCollection =
rg.Matches
(
ch)
For
Each
m As
Match In
mac
MsgBox
(
m.Value
&
" en position "
&
m.Index
)
Next
Extraire des mots d'une chaine: Matches.
Matches permet d'extraire les séquences de lettres donc des mots. Retourne une MatchCollection qui a une propriété Count indiquant le nombre d'éléments retournés.
Le motif pourrait être [A-Za-z]+, mais il y a des problèmes avec les accentués qui ne font pas partie de a-z!! il faut utiliser le motif: (\p{Lu}|\p{Ll})+ (Explication: \p{LU}: caractères Unicode majuscules, \p{Ll}: caractères Unicode minuscules).
Dim
ch As
String
=
"Ceci est un cours vb"
Dim
rg As
New
Regex
(
"(\p{Lu}|\p{Ll})+"
)
Dim
mac As
MatchCollection =
rg.Matches
(
ch)
For
Each
m As
Match In
mac
MsgBox
(
m.Value
&
" en position "
&
m.Index
)
Next
Le motif "\b(?!(le|un|une|et|de|la)\b)(\p{Lu}|\p{Ll})+" permet en plus d'éliminer les un, une, le, la…
Méthodes statiques
On peut utiliser une autre syntaxe (pour Replace, Match, Matches) avec une méthode statique (sans instanciation du regex):
Funtion Remplace (
Chaine As
String
) As
String
Return
Regex.Replace
(
"salut"
, "bonjour"
)
End
Function
Options
Les méthodes statiques ou non peuvent avoir un ou plusieurs arguments optionnels (les séparer par 'Or') :
RegexOptions.IgnoreCase : ignore la case oui, oui…
RegexOptions.IgnorePatternWhitespace : ignore l'espace la tabulation, nouvelle ligne
RegexOptions.Compiled : accélère, car compile le regex.
RegexOptions.MultiLine : applique les caractères de début et fin à chaque ligne.
Funtion Remplace (
Chaine As
String
) As
String
Return
Regex.Replace
(
"salut"
, "bonjour"
, RegexOptions.IgnoreCase
Or
RegexOptions.Compiled
)
End
Function
ou en instanciant le regex :
Dim
rg As
New
Regex
(
"salut"
, RegexOptions.IgnoreCase
Or
RegexOptions.Compiled
)
On pourrait écrire des livres sur les expressions régulières !!! Pour trouver des motifs, voir : des centaines de chaines de motif toutes faites.
V-E-5. StringBuilder▲
Débutant s'abstenir.
Les opérations sur les Strings peuvent être accélérées, il faut pour cela utiliser les StringBuilder.
Exemple d'une opération coûteuse en temps :
Dim
s As
String
=
"bonjour"
s +=
"mon"
+
"ami"
Le Framework va créer 3 chaines en mémoire avec toutes les pertes en mémoire et en temps que cela implique. (il crée une chaine "bonjour" puis il crée une chaine "bonjour mon" puis…
On dit que le type String est immutable.
Pour l'exemple précédent, cela ralentit peu, mais dans une boucle qui concatène 10 000 chaines !!
Pour effectuer des opérations répétées sur les string, le framework dispose donc d'une classe spécialement conçue et optimisée pour ça : System.Text.StringBuilder.
Pour l'utiliser, rien de plus simple :
Dim
sb As
new
System.Text.StringBuilder
(
)
sb.Append
(
"bonjour"
)
sb.Append
(
"mon ami"
)
Dim
s As
String
s =
sb.ToString
(
)
Il y a création et utilisation d'une seule chaine : sb La méthode ToString de la classe StringBuilder renvoie la chaine qu'utilise en interne l'instance de StringBuilder.
Pour comparer 2 StringBuilder utiliser la méthode Equals plutôt que =.
À partir de vb 2010 il existe StringBuilder.Clear.
V-F. 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).
À partir de VB2005 il y a aussi :
- UInteger (entier non signé) ;
- UShort (entier court non signé) ;
- ULong (Entier long non signé) ;
- SByte (entier signé).
Une variable numérique peut aussi être un fractionnaire :
- Single (virgule flottante simple précision) ;
- Double (virgule flottante double précision) ;
- Decimal (virgule fixe haute précision).
À partir de vb 2010 il y a en plus :
- BigInteger ( Entier signé très grand (sans limite supérieure ou inférieure) (VB2010) ) ;
- Complex (Nombre complexe).
On déclare une variable numérique avec Dim.
Dim
i As
Integer
Après déclaration une variable numérique contient 0.
on peut initialiser en même temps qu'on déclare :
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 de la classe String. Il y en a d'autres :
.GetType retourne le type de la variable
Dim
i As
Integer
i=
3
' Il faut initialiser i avant d'utiliser GetType
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 !!
de même pour Str et Val du VisualBasic.
Par contre pour les instructions du Framework (CType, TryCaste, Cint…), le séparateur est celui de la culture (',' en culture française, '.' en culture us).
V-F-1. La Classe Math du Framework▲
Pour qu'elle soit disponible, il faut d'abord importer l'espace de noms '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é l'espace de nom, il faut ajouter Math. avant le nom de la 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 absolue
'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
Pour Round, 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'impôts.
On peut donner en second paramètre le nombre de digits : Math.Round(Valeur, 2)donne 2 décimales après la virgule.
R=
Truncate
(
N)
Retourne la partie entière (enlève les chiffres après la virgule, arrondie à 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 proche en allant vers l'infini positif).
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ée.
Retourne 3
longResult = Math.BigMul(int1, int2) 'BigMul donne le résultat de la multiplication de 2 entiers sous forme d'un long.
intResult = Math.DivRem(int1, int2, Reste) DivRem donne le résultat (intResult) de la division de int1 par int2 et retourne le reste (Reste), cela pour des entiers.
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:2pi=360° ; Angle en radians= (2pi/360)*Angle en degrés.
V-F-2. Les instructions du langage VisualBasic▲
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-F-3. 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-F-4. Problème de précision▲
Integer Single ou Decimal ? Précision ou rapidité ?
Vu le système de codage en interne, on a vu qu'avec les variables en virgule flottante, comme les Single par exemple, certaines valeurs ou calculs sont représentés avec une certaine approximation, infime, mais réelle.
Souvent le calcul est exact, mais parfois (rarement en pratique courante) on peut avoir un infime manque de précision. Voici un exemple: on a 0,0001, avec une boucle on l'additionne dix mille fois :
Dim
i As
Integer
Dim
k As
Single
Dim
j As
Single
=
0.0001
For
i =
1
To
10000
k =
k +
j
Next
MsgBox
(
k.ToString
)' Affiche 1.000054
Dim
k1 As
Decimal
Dim
j1 As
Decimal
=
0.0001
For
i =
1
To
10000
k1 =
k1 +
j1
Next
MsgBox
(
k1.ToString
)' Affiche 1
Avec des Decimal on obtient bien 1, mais avec des Single on obtient 1,000054 !!
Cela peut poser des problèmes si on compare le résultat du calcul avec 1.
Avec les entiers la précision est parfaite.
Dans notre exemple le calcul est DIX fois plus long avec les Decimal qu'avec les Single.
V-F-5. BigInteger▲
Un BigInteger est un Entier signé très grand (sans limite supérieure ou inférieure).
Il apparait dans vb 2010.
La valeur, en théorie, n'a pas de limites supérieure ou inférieure.
Il faut charger dans les références (passer par propriétés du projet) pour charger System.Numerics puis Importer cet espace.
Instanciation :
Imports
System.Numerics
'Instanciation directe avec new
Dim
MyBitInteger As
New
BigInteger
(
17903
)
'Si variable avec virgule, la partie après la virgule sera tronquée.
'À partir d'un long
Dim
MylongValue As
Long
=
631548935
Dim
MyBigInteger2 As
BigInteger =
Mylong
Dim
MyBigInteger As
BigInteger =
CType
(
64312.65
d, BigInteger)
On peut utiliser les opérations mathématiques de base telles que l'addition, la soustraction, la division, la multiplication (+ -* /), la négation et la négation unaire.
Vous pouvez également comparer deux valeurs .Comme les autres types intégraux, BigInteger prend en charge également les opérateurs de bit, de décalage vers la droite et de décalage vers la gauche And, Or et XOr Il existe aussi Add, Divide, Multiply, Negate et Subtract.
Sign, retourne une valeur qui indique le signe d'une valeur BigInteger.
Abs retourne la valeur absolue d'une valeur BigInteger.
DivRem retourne à la fois le quotient et reste d'une opération de division.
GreatestCommonDivisor retourne le plus grand diviseur commun de deux valeurs BigInteger.
Exemple: Creation de 2 BitInteger (2190 Puissance 2 et 42656*35); affichage du plus grand commun diviseur.
Dim
n1 As
BigInteger =
BigInteger.Pow
(
2190
, 2
)
Dim
n2 As
BigInteger =
BigInteger.Multiply
(
42656
, 35
)
Console.WriteLine
(
"Le plus grand commun diviseur de {0} et de {1} est {2}."
, _
n1, n2, BigInteger.GreatestCommonDivisor
(
n1, n2))
Les calculs avec les BigInteger sont lents (20 fois plus lent qu'avec les Single pour 10 000 additions par exemple).
Comme ce sont des entiers, il ne devrait pas y avoir d'erreur d'arrondi.
V-F-6. Nombre complexe▲
Les nombres complexes sont une notion mathématique (je les avais étudiés en terminal S il y a quelques années). Ils sont utilisés dans certains calculs en génie électrique.
Un nombre complexe comprend une partie réelle et une partie imaginaire.
Un nombre complexe z s'écrit sous la forme suivante : z = x + yi, où x et y sont des nombres réels, et i est l'unité imaginaire qui a la propriété i2 = -1.
La partie réelle du nombre complexe est représentée par x, et la partie imaginaire du nombre complexe est représentée par y. Un nombre complexe peut être représenté comme un point dans un système de coordonnées à deux dimensions, appelé plan complexe.La partie réelle est positionnée sur l'axe des abscisses (axe horizontal), et la partie imaginaire est positionnée sur l'axe des ordonnées (axe vertical).
Tout point peut également être exprimé, en utilisant le système de coordonnées polaires.
Un point est caractérisé par deux nombres :
- sa grandeur, qui est la distance entre le point et l'origine (autrement dit, 0,0) ; -sa phase, qui est l'angle entre le véritable axe et la ligne tirée entre l'origine et le point.
En vb x et y (coordonnées cartésiennes) sont des 'Double'.
Les propriétés Real et Imaginary retournent la part réelle et imaginaire du nombre complexe.
La magnitude (d) et la phase (alpha exprimé en radians) sont des 'Double'.
(Pour convertir des degrés en radians, multiplier par Math.Pi/180). Les propriétés Magnitude et Phase retournent d et alpha.
Il faut charger dans les références (passer par propriétés du projet) pour charger System.Numerics puis Importer cet espace.
Imports
System.Numerics
Module
Example
Public
Sub
Main
(
)
' Creationn d'un complexe 11+ 6i .
Dim
c1 As
New
Complex
(
11
, 6
)
Console.WriteLine
(
c1) 'Affiche (11, 6)
' Assigne un Double à un complex .
Dim
c2 As
Complex =
3.1416
Console.WriteLine
(
c2) 'Affiche (3.1416, 0)
' Assign la valeur retournée .
Dim
c3 As
Complex =
Complex.One
+
Complex.One
Console.WriteLine
(
c3) 'Affiche (2, 0)
' Instancie un complex à partir des coordonnées polaires.
Dim
c4 As
Complex =
Complex.FromPolarCoordinates
(
10
, .524
)
Console.WriteLine
(
c4) 'Affiche (8.65824721882145, 5.00347430269914)
'Affichage coordonnées cartésiennes
Console.Write
(
c4.Real
)
Console.Write
(
c4.Imaginary
)
'Affichage coordonnées polaires
Console.WriteLine
(
" Magnitude: {0}"
, c4.Magnitude
)
Console.WriteLine
(
" Phase: {0} radians"
, c4.Phase
)
End
Sub
End
Module
Opérateurs
Les opérations sur les nombres complexes obéissent à des règles mathématiques particulières (voir un cours de maths). Vb connait ces règles.
En plus de quatre opérations arithmétiques fondamentales (+ - / * ou Add, Substrat, Divise, Multiply), vous pouvez élever un nombre complexe à une puissance spécifiée (Pow), rechercher la racine carrée d'un nombre complexe (Sqrt) et obtenir la valeur absolue d'un nombre complexe (Abs).
Vous pouvez obtenir l'inverse (Negate) le Log et les valeurs trigonométriques (Cos, Sin…). Enfin on peut comparer avec Equals et =.
Dim
c4 As
New
Complex
(
1
, 1
)
Dim
c2 As
New
Complex
(
2
, 2
)
Dim
c1 As
New
Complex
' c1 = c4 - c2
c1 =
Complex.Subtract
(
c4, c2)
' ou c1=c4-c2
Console.Write
(
c1)
Attention, les valeurs étant des doubles il peut y avoir des problèmes d'arrondis: perte de précision lors de certaines opérations ce qui peut poser des problèmes au cours de comparaisons.
Pour formater une impression de nombre complexe, on peut utiliser ToString ou le ComplexFormatter :
Dim
c1 As
Complex =
New
Complex
(
12.1
, 15.4
)
Console.WriteLine
(
"Formatting with ToString(): "
+
c1.ToString
(
))
Console.WriteLine
(
"Formatting with ToString(format): "
+
c1.ToString
(
"N2"
))
Console.WriteLine
(
"Custom formatting with I0: "
+
String
.Format
(
New
ComplexFormatter
(
), "{0:I0}"
, c1))
Console.WriteLine
(
"Custom formatting with J3: "
+
String
.Format
(
New
ComplexFormatter
(
), "{0:J3}"
, c1))
' The example displays the following output:
' Formatting with ToString(): (12.1, 15.4)
' Formatting with ToString(format): (12.10, 15.40)
' Custom formatting with I0: 12 + 15i
' Custom formatting with J3: 12.100 + 15.400j
'Merci Microsoft pour cet exemple
V-G. Conversion, séparateur décimal▲
On a vu qu'on peut afficher les chaines 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-G-1. Conversion numérique vers String▲
Quel intérêt de convertir ?
Après avoir effectué un calcul, on veut afficher un résultat numérique.
On ne peut afficher que des Strings (chaine de caractères) dans un label ou un TextBox par exemple.
Aussi, il faut transformer cette valeur numérique en chaine 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.
Il existe aussi Cstr :
Dim
i As
Integer
=
12
'On déclare une variable I qu'on initialise à 12
Label.text
=
CStr
(
i)
V-G-2. Conversion String vers numérique▲
À l'inverse une chaine 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 chaine de caractères qui est retournée, il faut la transformer en numérique Integer grâce à CInt.
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 chaine de caractères, "45" par exemple
i=
CInt
(
S) 'on transforme la chaine s en Integer
On peut aussi utiliser Parse :
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 chaine de caractères, "45" par exemple
i=
Integer
.Parse
(
s) 'on transforme la chaine s en Integer
Bizarre cette syntaxe!! en fait c'est le type Integer qui a une méthode (Parse) qui transforme une chaine en entier.
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.
Voilà ces quelques instructions devraient suffire pour un usage courant !! Mais il en existe d'autres.
V-G-3. Tous les modes de conversion▲
CType pour tout.
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 d'un Double en entier
Dim
d As
Double
=
2.65
Dim
s As
String
s=
CType
(
d,String
) 'conversion d'un Double en String
Dim
d As
Integer
=
2
Dim
S As
Single
S=
CType
(
d, Single
) 'conversion d'un Integer en Single
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 à partir de VB 2005 (Framework 2)
TryCast fonctionne comme DirectCast, mais retourne Nothing si la conversion est impossible (et ne plante pas! autrement dit, il ne lève pas d'exceptions).
Dim
chaine As
String
=
TryCast
(
b, String
)
If
IsNothing
(
chaine) Then
…
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 !!
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().
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 une valeur numérique en une chaine de caractères généralement destinée à l'affichage en imposant un formatage: vous pouvez mettre un format pour l'affichage des dates, des heures, un format pour les monnaies ou les nombres (nombre de chiffres affichés, séparateur…) Ce n'est pas à proprement parler une conversion, mais plutôt une mise en forme.
Dim
nb As
Single
=
12.23
MsgBox
(
Format (
nb, "000,000.000"
) 'Affiche 000 012.230
V-G-4. 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-G-5. Conversion Explicite et Implicite▲
À noter que dans cette page, on a étudié la conversion Explicite : elle permet de forcer la conversion vers un type à l'aide de mots-clés. C'est l'option par défaut de VB (pour le voir : menu 'Projet', 'Propriétés de …', Onglet 'Compiler').
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 :
Option
Explicit
Off
Dim
d As
Double
=
2.65
Dim
i As
Integer
i=
d 'Pour affecter à i, un Integer, le Double d, Vb a transformé le double d en Integer.
' Transformation effectuée automatiquement et sans qu'on le voie.
On verra que ce mode de travail Implicite n'est pas recommandé.
V-G-6. Conversion restrictive, erreur▲
Attention, la conversion est dite restrictive si le type final ne peut pas convertir toutes les valeurs possibles du type de 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-G-7. Erreur de dépassement de capacité dans les calculs▲
Voyons le code suivant qui semble correct :
Dim
i As
Integer
=
1000000000
Dim
j As
Long
j =
i *
10
MsgBox
(
j)
J'ai un grand nombre dans un integer, comme je le multiplie par 10 et que cela risque de dépasser le MaxValue dans Integer, je mets le résultat dans un Long. Pourtant il y a une erreur à l'exécution !!
Explication: quand l'expression j=i*10 est exécutée, l'expression de droite (i*10) est exécutée en premier, comme i est un Integer et '10' aussi, le résultat est mis dans un Integer (c'est là qu'il y a dépassement de capacité) puis casté en Long pour être affecté à J.
Pour éviter cela, il faut travailler directement en Long ou bien écrire 'j=i*10L': le L force 10 a être un Long et le calcul est effectué en Long.
V-G-8. Séparateur décimal : le point, la virgule, Culture▲
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 Val (conversion d'une String en numérique) et Str (conversion d'un numérique en String), de Visual Basic, 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.
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.
SélectionnezDim
sAs
Single
s=
CType
(
"123,4"
,Single
) Console.Out.WriteLine
(
s.ToString
)'affiche sur la console s transformé en String
Le symbole de séparateur décimal (ainsi que celui des milliers ) est donc spécifique à la culture.
Affiche: '123,4'
Le symbole de séparateur décimal (ainsi que celui des milliers ) est donc spécifique à la culture.
Par contre s = CType("123.4", Single) est refusé.
Le symbole de séparateur décimal (ainsi que celui des milliers ) est donc spécifique à la culture.
- 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'
Le symbole de séparateur décimal (ainsi que celui des milliers ) est donc spécifique à la culture.
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 chaine 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.NumberDecimaleparator
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-G-9. 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.
'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-G-10. Lexique anglais=>français▲
To Cast = Mouler, couler.
Type = Type, genre.
To parse = analyser.
V-H. Les 'Tableaux'▲
C'est un beau tableau, mais en VB, ce n'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. Après As on indique le type utilisé dans le tableau.
Dim Tableau(3) As Integer entraine 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.
Le tableau commence toujours par l'indice 0.
Le nombre d'éléments dans le tableau est toujours égal à 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).
Si j'exécute Tableau(4)=5, cela plante et me donne le message d'erreur suivant:
L'exception System.IndexOutOfRangeException n'a pas été gérée
"L'index se trouve en dehors des limites du tableau."
En effet l'élément Tableau (4) n'existe pas (Le tableau comporte 4 éléments, éléments d'index 0 à 3); l'index 4 est trop grand.
On fait parfois cette erreur quand on utilise une variable comme index dans une boucle par exemple et qu'on a mal calculé la valeur maximum de l'index de boucle.
Tableau
(
1
)=
12
permet d'affecter le nombre 12 au 2e élément du tableau.
0 |
12 |
0 |
0 |
Dim
S As
Integer
S=
Tableau
(
1
)
permet d'affecter à la variable S le 2e é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 leurs 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
(
3
,1
,2
)
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éments 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 variables (y compris les structures).
Dim
Mois
(
11
) As
String
'tableau de String de 12 éléments
Notez que dans ce cas (après la ligne Dim )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 déclaration 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"
On peut aussi l'initialiser lors de sa déclaration :
Dim
Mois
(
) As
String
=
{Janvier,Février,Mars}
' Crée un tableau de type String().
Dim
winterMonths =
{"December"
, "January"
, "February"
}
' Crée un tableau de type Integer()
Dim
numbers =
{1
, 2
, 3
, 4
, 5
}
'Crée un tableau de Double
Dim
b =
{1
, 2
, 3.5
}
'Attention création d'un tableau d'OBJECT
Dim
d =
{1
, "123"
}
'Création de tableau à plusieurs dimensions et de tableau de tableau
Dim
e =
{{1
, 2
, 3
}, {4
, 5
, 6
}} 'Integer(,)
Dim
f =
{(
{1
, 2
, 3
}), (
{4
, 5
, 6
})} 'Integer()() (jagged array)
On remarque ici que le nombre d'éléments n'est pas indiqué, comme on initialise 3 éléments, le tableau en aura 3.
On peut même se passer d'indiquer le type (à partir du deuxième exemple), le compilateur déduit le type à partir des littéraux. On nomme cela l'inférence de type.
À part quand on utilise Linq, je pense qu'il faut mieux indiquer explicitement le type de variable.
Autre syntaxe :
'Déclaration
Dim
t As
String
(
)
'On instancie et on initialise
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
}}
Dans le premier exemple, on fait les choses en deux étapes, on déclare puis on dimensionne (instanciation) et on initialise un tableau 't'. Dans le second exemple, n 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 (Array.Resize fait de même, voir plus bas).
Attention, on ne peut pas modifier le nombre de dimensions 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 (qui découpe une String pour la mettre dans un tableau), redimensionnent elles-mêmes le tableau au nombre d'éléments nécessaires.
Dim
Nom
(
) as
String
Nom=
S.Split
(
Separateur)
Erase efface le tableau et récupère l'espace.
Erase
Tableau
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éé. 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-H-1. Un tableau est un objet de type Array▲
La Classe Array (tableau) a des propriétés et des méthodes que l'on peut utiliser.
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
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é. Donc en fait a et b sont le même tableau.
Pour obtenir une copie 'indépendante' dans un nouveau tableau 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).
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 2e élément.
Array.ConstrainedCopy fait la même chose, mais annule tout si la copie n'est pas effectuée intégralement.
De même: mySourceArray.CopyTo(myTargetArray, 6) copie TOUS les éléments de la source dans la destination à partir d'un index dans la destination.
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 son 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 recherché 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 Length-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.Length
-
1
t
(
i)=
…
Next
t
On remarque que dans un tableau multidimension Length n'est pas égale à Ubound.
GetLength(x) retourne un entier qui représente le nombre d'éléments dans la dimension x.
GetValue et SetValue permettent de connaitre 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)="ox"
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éfinit 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 de ces algorithmes voir le chapitre 'Travail sur 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-H-2. Fonctions avancées sur les tableaux▲
Débutant s'abstenir
La méthode Resize permet de modifier le nombre d'éléments du tableau sans perdre le contenu :
Dim
array
As
T
(
10
)
Dim
newSize As
Integer
=
2
Array
.Resize
(
array
, newSize)
La méthode Reverse permet d'inverser les éléments d'un tableau.
Dim
t
(
10
) As
Integer
t
(
1
) =
2
Array
.Reverse
(
t)
On peut aussi spécifier l'indice de début et le nombre d'éléments à inverser.
Dim
t
(
10
) As
Integer
t
(
1
) =
2
Array
.Reverse
(
t, 2
, 2
)
À partir du Framework 2 les Arrays ont donc de nouvelles méthodes.
- Exists
- Le tableau contient-il des éléments qui correspondent aux conditions définies par un prédicat ?
- TrueForAll
- Chaque élément dans le tableau correspond-il aux conditions définies par un prédicat ?
- Find
- Recherche un élément qui correspond aux conditions définies par le prédicat et retourne la première occurrence.
- FindLast
- Idem pour la dernière occurrence.
- FindAll
- Récupère tous les éléments qui correspondent aux conditions définies par le prédicat.
- ConvertAll
- Chaque élément est passé individuellement à un Converter, et les éléments convertis sont enregistrés dans le nouveau tableau.
La syntaxe est de la forme Array.Find(Tableau, AdresseOf Predicat)
Un Predicat est une Sub qui retourne True si une condition est remplie.
Exemple fourni par Microsoft : on a un tableau contenant le nom d'animaux préhistoriques, le prédicat retourne True si le nom de l'animal se termine par 'saurus'. On veut savoir si la condition est remplie sur la liste au moins une fois (Exists), si tous les éléments remplissent la condition (TrueForAll), quel élément remplit la condition(Find), le premier, le dernier (FindLast), on veut récupérer dans un nouveau tableau tous les éléments qui remplissent la condition.
Dim
dinosaurs
(
) As
String
=
{ "Compsognathus"
, _
"Amargasaurus"
, "Oviraptor"
, "Velociraptor"
, _
"Deinonychus"
, "Dilophosaurus"
, "Gallimimus"
, _
"Triceratops"
}
Console.WriteLine
(
)
For
Each
dinosaur As
String
In
dinosaurs
Console.WriteLine
(
dinosaur)
Next
Console.WriteLine
(
vbLf
&
_
"Array.Exists(dinosaurs, AddressOf EndsWithSaurus): {0}"
, _
Array
.Exists
(
dinosaurs, AddressOf
EndsWithSaurus))
Console.WriteLine
(
vbLf
&
_
"Array.TrueForAll(dinosaurs, AddressOf EndsWithSaurus: {0}"
, _
Array
.TrueForAll
(
dinosaurs, AddressOf
EndsWithSaurus))
Console.WriteLine
(
vbLf
&
_
"Array.Find(dinosaurs, AddressOf EndsWithSaurus): {0}"
, _
Array
.Find
(
dinosaurs, AddressOf
EndsWithSaurus))
Console.WriteLine
(
vbLf
&
_
"Array.FindLast(dinosaurs, AddressOf EndsWithSaurus): {0}"
, _
Array
.FindLast
(
dinosaurs, AddressOf
EndsWithSaurus))
Console.WriteLine
(
vbLf
&
_
"Array.FindAll(dinosaurs, AddressOf EndsWithSaurus):"
)
Dim
subArray
(
) As
String
=
_
Array
.FindAll
(
dinosaurs, AddressOf
EndsWithSaurus)
For
Each
dinosaur As
String
In
subArray
Console.WriteLine
(
dinosaur)
Next
End
Sub
Private
Shared
Function
EndsWithSaurus
(
ByVal
s As
String
) _
As
Boolean
'Retourne True si la fin du mot se termine par "saurus"
If
(
s.Length
>
5
) AndAlso
_
(
s.Substring
(
s.Length
-
6
).ToLower
(
) =
"saurus"
) Then
Return
True
Else
Return
False
End
If
End
Function
Résultat affiché :
'Compsognathus
'Amargasaurus
'Oviraptor
'Velociraptor
'Deinonychus
'Dilophosaurus
'Gallimimus
'Triceratops
'
'Array.Exists(dinosaurs, AddressOf EndsWithSaurus): True
'
'Array.TrueForAll(dinosaurs, AddressOf EndsWithSaurus: False
'
'Array.Find(dinosaurs, AddressOf EndsWithSaurus): Amargasaurus
'
'Array.FindLast(dinosaurs, AddressOf EndsWithSaurus): Dilophosaurus
'
'Array.FindAll(dinosaurs, AddressOf EndsWithSaurus):
'Amargasaurus
'Dilophosaurus
Pour Array.ConvertAll, elle retourne un tableau dont chaque élément qui vient d'un premier tableau a été modifié par une fonction.
Ici on va créer une fonction qui mettre en majuscules.
Private
Sub
Button1_Click
(
) Handles
Button1.Click
Dim
dinosaurs
(
) As
String
=
{"Compsognathus"
, _
"Amargasaurus"
, "Oviraptor"
, "Velociraptor"
, _
"Deinonychus"
, "Dilophosaurus"
, "Gallimimus"
, _
"Triceratops"
}
Dim
dinosaurs2
(
) As
String
dinosaurs2 =
Array
.ConvertAll
(
dinosaurs, New
Converter
(
Of
String
, String
)(
AddressOf
MettreEnMajuscules))
End
Sub
Private
Shared
Function
MettreEnMajuscules
(
ByVal
e As
String
) _
As
String
Return
e.ToUpper
End
Function
On peut aussi utiliser les expressions lambda multilignes :
Dim
nums
(
) As
Integer
=
{1
, 2
, 3
, 4
, 5
}
nums =
Array
.FindAll
(
nums, Function
(
n)
Console.WriteLine
(
"testing "
&
n)
Return
n >
2
End
Function
)
ForEach
Exécute une action spécifiée sur chaque élément du tableau spécifié.
Syntaxe de la forme :
Array.ForEach(MyArray, Action)
Exemple : on a un tableau d'Integer, on veut afficher ces nombres et leurs carrés.
On va créer une sub ShowCarré qui reçoit un Integer et affiche le carré.
Il faut ensuite créer une 'Action', un delegate qui pointe sur la Sub.
Enfin, utiliser Array.ForEach.
Sub
Demo
Dim
nums
(
) =
{2
, 3
, 5
, 4
}
'Créer un delegate pour la méthode ShowCarré
Dim
action As
New
Action
(
Of
Integer
)(
AddressOf
ShowCarré)
Array
.ForEach
(
nums, action)
End
Sub
Private
Shared
Sub
ShowCarré
(
ByVal
val As
Integer
)
Console.WriteLine
(
"{0:d} Carré = {1:d}"
, val, val *
val)
End
Sub
On peut utiliser une expression lambda, voir le chapitre plus loin.
'Tableau
Dim
nums
(
) =
{2
, 3
, 5
, 4
}
'Expression lamda multiligne
'Pour chaque élément du tableau afficher 'nombre: x'
Array
.ForEach
(
nums, Sub
(
n)
Console.Write
(
"Nombre: "
)
Console.WriteLine
(
n)
End
Sub
)
'ou
'Expression lambda simple: affiche la série de nombres
Array
.ForEach
(
nums, Sub
(
n) Console.WriteLine
(
n))
V-H-3. Exemple courant d'utilisation des tableaux▲
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-chaine
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.
'Tableau des clé
Dim
myKeys
(
) As
String
=
{"red"
, "GREEN"
, "YELLOW"
, "BLUE"
, "purple"
, "black"
, "orange"
}
'tableau des éléments
Dim
myValues
(
) As
String
=
{"strawberries"
, "PEARS"
, "LIMES"
, "BERRIES"
, "grapes"
, "olives"
, "cantaloup"
}
'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-I. Les 'Collections'▲
Une alternative aux tableaux est l'usage de Collection.
Les Collections permettent de regrouper des données. Les collections sont très utilisées dans la programmation 'Objet'.
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 où se trouve l'élément.
Le nombre d'éléments n'est pas défini au départ comme dans un tableau. Dans une collection, il n'y a aucun élément au départ, puis il n'y a que les éléments que l'on a ajoutés.
Les éléments sont repérés grâce à un index ou avec une Clé unique.
Les items affichés dans une ListBox donnent une idée concrète de ce qu'est une collection.
V-I-1. Exemple simpliste▲
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 (on dit un Item).
Je fais maintenant :
Col.Add("Lulu")
Col.Add("Titi")
Toto |
Lulu |
Titi |
La collection a 3 éléments maintenant, l'élément (on dit Item) 0, 1, 2.
Je fais :
Col.Remove(1) enlève le deuxième élément. (Attention on compte les éléments à partir de l'élément 0).
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(1) contient "Titi" (le second Item de la collection)
Remarque:
J'ai pris une collection de 'Base 0': le premier élément à l'indice 0, c'est habituel dans les classes du Framework; il existe aussi des collections (celles venant de Visual Basic) de Base 1.
V-I-2. Classification des collections▲
Il est intéressant de classer les collections par fonction.
Il y a les List, comme dans l'exemple simpliste. On a un Index pour repérer les éléments. (Pas de clé).
Toto |
Lulu |
Titi |
Il y a les Dictionnaires, chaque élément à une clé, on parle de Collection Clé-Valeur. On utilise la clé pour retrouver une valeur.
Certaines collections combinent List et Dictionnaire, d'autres sont triées automatiquement.
Enfin il y a des collections particulières: les Piles, Queue, HashSet, SortedSet…
Certaines collections peuvent contenir des objets, d'autres des Strings ou des Bytes…
Certaines collections utilisent, elles, les génériques : elles sont faites pour contenir des génériques c'est-à-dire ce que l'on veut. Quand on utilise la Collection, on indique le type.
Du coup la collection est fortement typée : elle ne peut contenir qu'un type de donnée.
Exemple : List(Of String) est une List ne pouvant contenir que des Strings.
Voici les principales collections :
- Les Listes :ArrayList, List(Of…) VB 2005
- Les Dictionnaires :HashTable, Dictionnary
- Les Listes-Dictionnaires :SortedList,DictionnaryList
- Les Queue et les Queue (Of…)
- Les Piles: Les Stack et les Stack (Of…)
- Les Listes chaînées Les LinkedList(Of….) VB 2005
- Gestion des ensembles: Les HashSet VB 2008
- Collections travaillant sur les Bits :BitArray, BitVector32
- Collections triées : SortedList, SortedDictionnary SortedSet du framework 4
- Autres : ObservableCollection
V-I-3. ArrayList▲
Fait partie de System.Collections. C’est une Classe .Net. Il faut donc ajouter en haut du module :
Imports
System.Collections
C'est une 'Liste' d'objets, d'Item. La ArrayList est une collection particulière. On peut y mettre des objets : chaines, nombres… rien n'empêche que le premier élément soit un entier, le second une chaine… . Il n'y a pas de clé.
Attention le premier élément, le premier Item, est ici l'élément 0 (l'index va de 0 à count-1) ; c'est du .NET!!
Exemple :
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
L.Add() permet d'ajouter un élément, on affiche le premier élément L(0).
On pourra aussi écrire L.Item(0) pour pointer le premier élément, en effet les éléments sont L.Item(0), L.Item(1), L.Item(2)…
MsgBox
(
L.Count.ToString
) 'On affiche le nombre d'éléments.
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 l'élément de la liste qui contient "Bonjour"
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.Contains
(
é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 TRIÉE 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 qui est l'index de "lulu"
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é. Comment rechercher "lulu" à partir du 3e élément).
i =
l.IndexOf
(
3
,"lulu"
)
Recherche d'un élément dans une collection TRIÉE 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
) 'affiche 1
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
N.B. Comme vu plus haut, on utilise Count pour trouver le nombre d'éléments, aussi la boucle doit balayer de 0 à count-1. Enfin bien se souvenir que A est un Objet, il faudra le convertir pour l'utiliser :
Dim
s As
String
=
CType
(
A,String
)
-Avec For Each
Dim
o As
Objet
For
Each
o in
L
À=
o
Next
Attention, A est un objet. De plus on verra que dans une boucle For Each, on ne peut pas modifier la collection.
-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
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-I-4. List (Of)▲
À partir de 2005 on a des collections que l'on peut typer, c'est-à-dire qu'elles ne pourront contenir qu'un type de donnée, que des String, des entiers, des instances de telle classe… On parle de collections génériques. Le terme Of permet de définir le type de la collection.
Nécessite :
Imports
System.Collections.Generic
Créons une liste ne contenant que des 'Decimal'.
Dim
lst As
New
List (
Of
Decimal
)
Exemple: créons une collection de String List(Of String): Elle est typée, car elle ne peut contenir que des 'String'.
Dim
lst As
New
List
(
Of
String
)
Il s'agit d'une List avec Index.
lst(0) est le premier élément.
ou lst.item(0)
On ajoute une String :
lst.Add
(
"toto"
)
Elle devient le dernier élément de la liste.
Comment affecter cet élément à une String ?
Dim
S As
String
=
lst.Item
(
0
)
L'item est bien typé : même avec 'Option Strict=on' pas besoin de CType.
Nombre d'éléments de la list :
lst.Count
On peut à partir de vb 2010 'remplir' simplement une collection grâce à 'From' :
Dim
names As
New
List
(
Of
String
) From
{"Christa"
, "Brian"
, "Tim"
}
Noter bien le New.
On peut aussi remplir avec un tableau ou ajouter une List par un AddRange :
Dim
input
(
) As
String
=
{ "Brachiosaurus"
, _
"Amargasaurus"
, _
"Mamenchisaurus"
}
Dim
Animals As
New
List
(
Of
String
)(
input)
'Ajouter une list à une autre liste avec AddRange
Animals.AddRange
(
2
, Animals)
La liste contient-elle "toto"?
Dim
present As
Boolean
=
lst.Contains
(
"toto"
)
Present = True si la liste contient "toto".
Insérer un élément à une position donnée :
lst.Insert
(
2
, "lulu"
)
Supprimer un élément à une position donnée :
lst.Remove
(
"lulu"
) 'supprime le premier élément contenant "lulu"
lst.RemoveAt
(
3
) 'supprime le 4e élément
lst.RemoveRange
(
3
,2
) 'supprime du 4e élément au 5e élément
Parcourir tous les éléments et les afficher :
For
Each
element As
String
In
lst
Console.WriteLine
(
element)
Next
Rechercher un élément dans la liste :
lst.IndexOf
(
"lulu"
) 'retourne l'index de l'élément qui contient "lulu"
lst.IndexOf
(
"lulu"
, 2
,7
) recherche à partir de l'élément 2 et sur 7 éléments.
Il existe aussi LastIndexOf.
Sur une list triée on utilise BinaryScearch, voir ArrayList, c'est pareil.
On peut copier une List ou partie de List dans un tableau :
'Avec CopyTo
Dim
array
(
14
) As
String
'tableau
lst.CopyTo
(
array
) 'copier la list dans le tableau
lst.CopyTo
(
array
, 6
) 'copier 6 éléments de la list dans le tableau
lst.CopyTo
(
2
, array
, 12
, 3
) 'index de départ dans list, tableau, index de départ dans array, nombre
'Avec GetRange
Dim
output
(
) As
String
=
lst.GetRange
(
2
, 3
).ToArray
(
)
On voit que List (Of) possède toutes les méthodes des ArrayList, mais en plus il existe des méthodes propres aux collections génériques (à partir du Framework 2) :
- Exists
- List contient-il des éléments qui correspondent aux conditions définies par un prédicat ?
- TrueForAll
- Chaque élément dans List correspond-il aux conditions définies par un prédicat ?
- Find
- Recherche un élément qui correspond aux conditions définies par le prédicat et retourne la première occurrence.
- FindLast
- Idem pour la dernière occurrence.
- FindAll
- Récupère tous les éléments qui correspondent aux conditions définies par le prédicat.
- ConvertAll
- Chaque élément est passé individuellement à un Converter, et les éléments convertis sont enregistrés dans la nouvelle collection.
- RemoveAll
- Efface les éléments qui correspondent au Predicat
La syntaxe est de la forme ListeResultat= List.Find(Liste, AdresseOf Predicat)
Un Predicat est une Fonction qui retourne True si une condition est remplie.
Exemples
Exemple 1
Avec FindAll
J'ai une list 'Animals', je veux mettre dans 'listResult' tous les éléments de Animals qui se terminent par 'us'.
On crée une liste (listResult) qui grâce à FindAll se chargera des éléments de Animals qui répondent à une condition :
'List de String contenant des noms d'animaux
Dim
Animals As
New
List
(
Of
String
) From
{"Compsognathus"
, _
"Amargasaurus"
, "Oviraptor"
, "Velociraptor"
, _
"Deinonychus"
, "Dilophosaurus"
, "Gallimimus"
, _
"Triceratops"
}
Dim
listResult As
List
(
Of
String
) =
Animals.FindAll
(
AddressOf
SeTermineParUS)
En argument de FindAll on a l'adresse d'une fonction: ici la fonction 'SeTermineParUS'. Pour chaque élément de Animals si SeTermineParUS retourne True, l'élément correspondant est passé dans listResult.
Voici la fonction de test, le Predicat.
Private
Shared
Function
SeTermineParUS (
ByVal
s As
String
) As
Boolean
If
(
s.Length
>
2
) AndAlso
(
s.Substring
(
s.Length
-
2
).ToLower
(
) =
"lu"
) Then
Return
True
Else
Return
False
End
If
End
Function
Exemple 2
Avec ConvertAll on obtient à partir d'une première liste, une seconde liste ou chaque élément à été convertit par une fonction.
Ici on a une liste d'animaux , on va obtenir une seconde liste avec des noms courts (4 caractères).
'List de String contenant des noms d'animaux
Dim
Animals As
New
List
(
Of
String
) From
{"Compsognathus"
, _
"Amargasaurus"
, "Oviraptor"
, "Velociraptor"
, _
"Deinonychus"
, "Dilophosaurus"
, "Gallimimus"
, _
"Triceratops"
}
'Seconde list de String
Dim
Animals2 As
New
List
(
Of
String
)
'Remplir Animals2 avec tous les éléments de Animals après passage par le converteur RaccourcirNom
Animals2 =
Animals.ConvertAll
(
New
Converter
(
Of
String
, String
)(
AddressOf
RaccourcirNom))
'Afficher la seconde list
For
Each
dinosaur As
String
In
Animals2
Console.WriteLine
(
dinosaur)
Next
'Fonction RaccourcirNom
Private
Shared
Function
RaccourcirNom
(
ByVal
x As
String
) As
String
Return
x.Substring
(
0
, 4
)
End
Function
Trier une List
Soit une liste (Of String) de noms d'animaux, on veut trier par ordre alphabétique:
On utilise Sort.
Dim
Animals As
New
List
(
Of
String
) From
{"Compsognathus"
, _
"Amargasaurus"
, "Oviraptor"
, "Velociraptor"
, _
"Deinonychus"
, "Dilophosaurus"
, "Gallimimus"
, _
"Triceratops"
}
Animals.Sort
(
)
Mais on peut indiquer une Fonction qui va définir la manière de trier : ici je veux trier en fonction de la longueur des String.
Je vais indiquer l'adresse de ma fonction de comparaison comme argument de Sort:
Dim
Animals As
New
List
(
Of
String
) From
{"Compsognathus"
, _
"Amargasaurus"
, "Oviraptor"
, "Velociraptor"
, _
"Deinonychus"
, "Dilophosaurus"
, "Gallimimus"
, _
"Triceratops"
}
Animals.Sort
(
AddressOf
CompareByLength)
'Avec la fonction:
Private
Shared
Function
CompareByLength
(
_
ByVal
x As
String
, ByVal
y As
String
) As
Integer
Return
x.Length.CompareTo
(
y.Length
)
End
Function
V-I-5. HashTable▲
C'est un 'Dictionnaire' qui comporte des couples clé-élément, des paires clé-valeur.
Ces couples sont de type Objet-Objet.
La clé toujours unique permet de retrouver la valeur, La clé ne doit pas être vide non plus.
Créons une Hashtable :
Dim
H As
New
Hashtable
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.
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
Attention on n'utilise pas de numéro d'index, mais uniquement la clé.
En interne, pour chaque élément, la clé est 'hachée' pour créer un code de hashage qui sert à pointer l'élément et sa valeur (voir le chapitre sur l'algorithme), ce procédé accélère la recherche de la valeur à partir de la clé.
V-I-6. Dictionnary (Of)▲
À partir de VB 2005, il y a cette collection de type Dictionnaire (Clé-Valeur), mais elle utilise les génériques.
La clé doit être unique (pas de doublon de clé).
La récupération d'une valeur à partir de sa clé est très rapide.(Utilisation d'un hachage.)
Of permet de choisir le type de la clé et celui des valeurs.
Créons un Dictionnary avec des clés de type String et des valeurs de type String.
Dim
Dic As
New
Dictionary
(
Of
String
, String
)
' Ajout d'élément
Dic.Add
(
"txt"
, "notepad.exe"
)
Dic.Add
(
"bmp"
, "paint.exe"
)
Depuis vb 2010 on peut ajouter rapidement des éléments :
Dim
days =
New
Dictionary
(
Of
Integer
, String
) From
{{0
, "Sunday"
}, {1
, "Monday"
}}
' Ajout d'élément en vérifiant avant si la clé n'existe pas
If
Not
Dic.ContainsKey
(
"ht"
) Then
Dic.Add
(
"ht"
, "hypertrm.exe"
)
End
If
' Modifier la valeur correspondant à la clé 'doc'
Dic
(
"doc"
) =
"winword.exe"
'Parcours du Dictionary (le type de clé/Value est KeyValuePair).
For
Each
kvp As
KeyValuePair
(
Of
String
, String
) In
Dic
Console.WriteLine
(
"Key = {0}, Value = {1}"
, kvp.Key
, kvp.Value
)
Next
kvp
' Récupérer une valeur correspondant à une clé
Dim
tt As
String
=
Dic
(
"rtf"
)
'TryGetValue permet de rechercher une valeur correspondant à une clé, retourne False si la clé n'existe pas (sans déclencher d'erreur).
Dim
value As
String
=
""
If
Dic.TryGetValue
(
"tif"
, value) Then
Console.WriteLine
(
"For key = ""tif"", value = {0}."
, value)
Else
Console.WriteLine
(
"Key = ""tif"" non trouvée."
)
End
If
Dic…ContainsKey
(
"ht"
) permet aussi de tester si une clé existe.
'Enlever un élément
Dic.Remove
(
"doc"
)
V-I-7. SortedList SortedList (Of)et SortedSet▲
SortedList
Combine List et Dictionnaire avec un tri automatique.
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.
SélectionnezmySL
.Item
(
CLE)'retourne la valeur correspondant à la clé CLE
On peut donc lire une valeur par sa Clé ou son Index:
- 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
On peut donc lire une valeur par sa Clé ou son Index :
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,automatique, 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
Les SortedList(Of…) sont des SortedList génériques avec Clé et valeur ,triées sur la clé. Ressemble à SortedDictionary, mais occupe moins de mémoire et est moins rapide pour les insertions/suppressions.
Les SortedDictionnary(Of…) sont des collections génériques avec Clé et valeur ,trié sur la clé.
Les SortedSet (Framework 4)
Collections génériques. Un SortedSet maintient un ordre trié à mesure que les éléments sont insérés et supprimés sans que les performances en soient affectées.Les éléments dupliqués ne sont pas autorisés.
Il est possible de créer un comparer qui sera utilisé par le tri.
Dim
mediaFiles1 As
SortedSet
(
Of
String
) =
New
SortedSet
(
Of
String
)(
New
ByFileExtension)
'on crée un comparer:
Public
Class
ByFileExtension
Implements
IComparer
(
Of
String
)
……
End
Class
V-I-8. Queue▲
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éments 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éments 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.
Les Queue(Of…) sont des Queue mais avec un généric.
V-I-9. Stack▲
Collection d'objets de type pile ( ou stack) LIFO (Last In, First Out)
Dernier entré, premier sorti.
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.
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"
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.
Les Stack(Of…) sont des track mais avec un généric.
V-I-10. Les LinkedList (Of)▲
Ce sont des Listes chainées de générique, chaque élément comportant une propriété Value(qui contient la valeur de l'élément), Next et Previous. À partir d'un élément, on peut connaitre le suivant ou le précédent.
Voir le chapitre sur les algorithmes qui explique la notion de liste chainée.
Schémas d'une liste chainée :
Imports
System.Collections.Generic
' Création d'une list.
Dim
words
(
) As
String
=
{"the"
, "fox"
, "jumped"
, "over"
, "the"
, "dog"
}
' Création d'une Linkedlist.
Dim
lk As
New
LinkedList
(
Of
String
)(
words)
Ajouter le mot 'today' au début.
lk.AddFirst
(
"today"
)
'Effacer le dernier élément.
lk.RemoveLast
(
)
'Les éléments sont des LinkedListNode, on peut en chercher un avec Find FindFirst, FindLast.
Dim
current As
LinkedListNode
(
Of
String
) =
lk.FindLast
(
"the"
)
'À partir de l'élément courant, on peut ajouter avant ou après.
lk.AddAfter
(
current, "old"
) 'il y a aussi AddBefore
'À partir de l'élément courant, on peut parcourir la linkedList
Dim
element As
LinkedListNode
(
Of
String
) =
current.Previous
'il y a aussi Next
'On peut déplacer un élément
lk.AddBefore
(
current, element)
'On peut voir le contenu d'un LinkedListNode
current.Value
current.Previous.Value
'on peut voir la valeur du premier ou du dernier élément:
lk.First.Value
lk.Last.Value
'Il existe aussi
Containst, Count
V-I-11. HashSet (Of)▲
Travailler sur les ensembles.
Il s'agit d'une collection de génériques sans ordre qui contient des éléments uniques. HashSet possède comme toutes les collections Add, Remove et Contains… et fournit plusieurs opérations d'ensembles (notamment l'union, l'intersection et la différence symétrique) ce qui permet de prendre en charge la plupart des opérations mathématiques qui sont généralement réalisées sur des ensembles (sens mathématique du terme).
Dim
hs As
New
HashSet
(
Of
String
)
'Ajout d'éléments:
hs.Add
(
"toto"
)
hs.Add
(
"lulu"
)
hs.Add
(
"titi"
La méthode Add renvoie True ou False pour indiquer si elle a fonctionné (s'il n'y avait pas déjà dans la HashSet l'élément que l'on veut ajouter).
Dim
caMarche As
Boolean
=
hs.Add
(
"toto"
) 'retourne False
hs.Count
'donne le nombre d'éléments.
On peut effacer un élément :
hs.Remove
(
"lulu"
)
On peut effacer sous condition.
Exemple : effacer tous les éléments contenant un "t":
hs.RemoveWhere
(
Adress Of
Test)
'La fonction Test reçoit chaque string de la table et retourne un booléen qui indique si la condition est remplie ce qui déclenche le Remove.
Private
Shared
Function
Test
(
ByVal
s As
String
) As
Boolean
Return
(
Instr
(
s,"t"
)<>
0
)
End
Function
On peut ajouter la collection hs2 à hs grâce à UnionWith :
hs.UnionWith
(
hs2)
Les éléments doublons (qui existent déjà dans hs) ne sont pas ajoutés.
Cela correspond à un And.
On peut rechercher les éléments communs à hs2 et à hs grâce à IntersectWith :
hs.IntersectWith
(
hs2)
hs contient maintenant les éléments qui étaient présents dans hs et hs2
Cela correspond à un Or.
On supprime tous les éléments de hs qui sont aussi contenus dans la collection passée en paramètre (hs2) avec ExceptWith.
hs.ExceptWith
(
hs2)
hs contient maintenant les éléments qui n'étaient pas présents dans hs et hs2.
On peut rechercher les éléments contenus dans hs2 et dans hs, mais pas dans les 2 grâce à SymmetricExceptWith :
hs.SymmetricExceptWith
(
hs2)
hs contient maintenant les éléments qui étaient présents dans hs ou hs2, mais pas les deux.
On peut rechercher si hs2 est un sous-ensemble de hs grâce à IsSubsetOf :
Dim
b As
Boolean
=
hs.IsSubsetOf
(
hs2)
b est égal à True si hs est un sous-ensemble de hs2 (tous les éléments de hs sont dans hs2).
Il existe aussi :
IsProperSubstOf qui retourne True si hs est un sous-ensemble de hs2 et si hs différent de hs2 (sous ensemble strict).
On peut rechercher si hs2 est un surensemble de hs grâce à IsSupersetOf :
Dim
b As
Boolean
=
hs.IsSupersetOf
(
hs2)
b est égal à True si hs est un sur ensemble de hs2 (tous les éléments de hs2 sont dans hs).
Il existe aussi :
IsProperSupersetOf qui retourne True si hs est un sur ensemble de hs2 et si hs est différent de hs2 (sur ensemble strict).
V-I-12. BitArray▲
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.
La Collection BitVector32:
Ne permet de travailler que sur 32 bits, mais est plus rapide.
Il faut avoir ajouté: Imports System.Collection.Specialized.
V-I-13. StringCollection▲
L'espace System.Collections.Specialized fournit ces nouveaux types de collections très spécifiques, elles ne sont faites que pour un seul type.
StringCollection ne peut contenir que des chaines (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 un é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-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.
Attention le premier élément est ici l'élément 0 (l'index va de 0 à count-1), c'est du .NET !!
V-I-14. ObservableCollections, SortedSet(Of T)▲
Pour mémoire on se souvient qu'il existait un Type Collection en VB6, de Base 1, à oublier.
Par contre, à partir de VB 2008 existent les collections ObservableCollections qui peuvent être 'Bindées' (attachées) à des Objets visuels (comme une List ou une Grid WPF) et qui permettent la mise à jour automatique du contrôle quand on modifie la collection.
Enfin, à partir de VB 2010 existe SortedSet(Of T). Un SortedSet(Of T) maintient un ordre trié à mesure que les éléments sont insérés et supprimés sans que les performances en soient affectées.Les éléments dupliqués ne sont pas autorisés.
V-I-15. 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 les lignes de 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 exemples
Les contrôles ListBox possèdent une collection 'Items' dans laquelle sont placés 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 Collection 'Controls'. Il s'agit d'une collection qui contient tous les contrôles de ce formulaire.
V-I-16. Pourquoi le premier élément est-il 0 ou 1 ?▲
Le .NET Framework normalise les collections comme étant des collections de base zéro (ArrayList par exemple). Visual Basic fournit des collections de base 1 (Comme Collection qu'il ne faut plus utiliser).
V-I-17. 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 noms 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-I-18. Lexique anglais=>français▲
Array = tableau, table.
length= longueur.
Key= clé.
Remove (to)= enlever.
Stack= tas.
V-J. Les 'Structures'▲
En règle générale, une structure est utilisée comme conteneur pour un petit jeu de variables.
Permet de regrouper des données de types différents.
(En Vb6 il y avait les types définis par l'utilisateur, ils sont remplacés par les structures.)
Les structures sont intéressantes quand vous voulez utiliser des variables contenant plusieurs informations de différent type. Les structures sont surtout utilisées dans la programmation non 'objet'(En programmation objet, on utilisera plutôt les Collections).
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ée comme une adresse, elle contient donc :
un numéro qui est dans 'MonAdresse.Numero' ;
un nom de rue qui est dans 'MonAdresse.Rue' ;
un nom de ville qui est 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 de type 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-J-1. Tableau dans une structure▲
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
Mais cela ne fonctionne pas !!
En Visual Basic .NET il y a 2 méthodes pour utiliser un tableau dans une structure :
1-Méthode par initialize
Une structure peut comporter une méthode 'Initialize' qui sera exécutée quand on déclare une variable de type structure.
Ici, on a créé une méthode Initialize qui redimensionne le tableau interne à la structure.
Public
Structure
DriveInfo
Dim
DriveNumber
(
) As
Short
'Noter que le nombre d'éléments 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
Après la déclaration de la variable, on 'Redimensionne' le tableau.
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 faut 'Redim' ou 'Initialize' 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-J-2. Allons plus loin▲
Une structure hérite de System.ValueType
V-J-2-a. 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éfinit une structure Point et on définit 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-J-2-b. Les structures peuvent contenir plein de choses▲
On a vu qu'elles 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 : à 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 calcule le bonus
TextBox1.Text
=
ep.Bonus.ToString
'On affiche le bonus
Cela ressemble aux Classes !! Non ?
V-J-2-c. Portée▲
Vous pouvez spécifier l'accessibilité de la structure à l'aide des mots-clés : 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 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-K. Type valeur ou référence▲
Résumons la notion très importante de variable 'par valeur' ou 'par référence'.
Un type de données est un type valeur s'il contient des données dans l'espace qui lui est alloué en mémoire. Un type référence contient un pointeur vers un autre emplacement en mémoire contenant les données.(dixit Microsoft)
V-K-1. 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écessaires 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-K-2. 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-K-3. Influence sur l'Affectation▲
Posons le problème.
Travaillons sur A et B, 2 variables ayant la même 'nature'.
A existant déjà, faisonsc :
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 entraine que A et B ont même référence: ils 'pointent' sur le même endroit. 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-K-4. Copie d'objet By Ref: exemple des Tableaux▲
Exemple sur les tableaux qui sont 'Par référence':
Dim
A
(
3
) As
String
À
(
1
) =
"a"
Dim
B
(
3
) As
String
B
(
1
) =
"b"
B =
A
À
(
1
) =
"c"
Label1.Text
(
) =
B
(
1
) 'Affiche 'c'
Voyons le détail.
B = A
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. C'est ce qui se passe dans notre exemple.
Copie élément par élément.
Si on a déclaré 2 tableaux distincts, B(2)= À(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. Aussi si on veut faire une copie 'indépendante' d'un tableau, il faut le déclarer puis avec une boucle copier chaque élément du tableau dans le nouveau.
B= A.Clone
B= A.Clone copie le tableau A dans B en conservant 2 tableaux distincts. Ensuite, modifier un élément du tableau ne modifie pas l'autre.
V-K-5. Le cas particulier des 'String'.▲
Elles sont 'Par référence'.
Attention : par contre :
Dim
A As
String
À =
"a"
Dim
B As
String
B =
"b"
B =
A
À =
"c"
Label1.Text
(
) =
B 'Affiche 'a'
Bien que les Strings soit par référence, B=À 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 !!
Pourquoi les String sont 'par référence' et se comportent comme si elles étaient 'par valeur'??
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.
On dit que les String sont 'Immutable' (comme System.Nullable ?).
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 pour cette explication).
V-K-6. 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é, mais on a une référence vide.
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-K-7. 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
S As
String
'S contient Nothing: il ne pointe sur aucun objet.
On peut 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-K-8. 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 espace mémoire. Pour les types valeur, l'égalité est définie comme une égalité au niveau du bit , autrement dit si la valeur est la même.
V-K-9. IsReference▲
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-L. Variable 'Object' et autre type▲
Il existe un autre type de variable: le type 'Object'.
V-L-1. Le Type 'Object'▲
Parfois on ne sait pas ce que va contenir une variable : un Integer ? Un 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
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).
V-L-1-a. Comment utiliser les propriétés d'un objet ?▲
Comment utiliser les membres des variables String qui sont dans un objet ?
Exemple : mettre une string dans une variable Objet, connaitre 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, car length n'est pas une propriété des Object.
Il faut convertir l'objet en String et là, on peut utiliser 'Length' : il faut écrire simplement :(Merci le forum de developpez.com)
Dim
myObjet As
New
Object
myObjet=
"VB"
MessageBox.Show
(
DirectCast
(
myObjet, String
).Length.ToString
)
DirectCase transforme un type de variable en un autre, DirectCase peu'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
)
Au départ, VB ne sait pas quel type de variable sera dans l'objet, on ne connait donc pas les propriétés de la variable; la recherche de la propriété 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).
On évitera donc d'utiliser si possible des variables 'Object'.
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-L-1-b. Comparaison d'objets▲
Is permet de savoir si 2 variables object se rapportent à la même instance.
Dim
o1 As
New
Objet =
monObjet
Dim
o2 As
Objet
o2=
o1
If
o1 Is
o2 Then
…
V-L-1-c. Nothing▲
Après :
Dim
myObjet As
Object
myObjet contient Nothing, c'est-à-dire 'Rien': pas de référence à une instance.
Après avoir utilisé 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és sont libérés 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-L-2. 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 'control' : 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
Autre exemple : créons un TextBox :
Dim
myTextBox As
New
TextBox 'crée une variable myTextBox de type TextBox
V-L-3. Utilisez donc des variables le plus typées possible▲
Éviter les 'Object'. Utilisez donc des variables le plus typées possible.
Si une variable doit contenir des boutons, créer une variable de type 'Button'.
Si une variable doit être utilisée pour contenir diverses 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
Plus la variable sera typée plus le code sera rapide, solide, plus on évitera les erreurs de programmation.
V-L-4. Attention quand on met un objet dans une variable objet▲
Si je mets 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-M. Variable booléenne▲
Il existe un autre type de variable : le type 'Boolien 'ou 'Booléen'(Boolean).
V-M-1. 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 une 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-M-2. 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 montrant comment le raisonnement informatique est 'logique' :
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 :
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-M-3. Les conditions▲
On a vu que quand il faut faire un choix (comme dans 'If condition Then') il faut une condition qui est une expression booléenne. (avec While, Do Loop aussi).
Exemple :