Environnement de Développement graphique Visual Basic.NET Maher Kouraichi Sommaire ◼ ◼ ◼ ◼ ◼ ◼ ◼ ◼ ◼ Introduction Notion d’objet Présentation de Visual Basic Syntaxe de base Contrôles et Propriétés Evénements et Méthodes Fonctions prédéfinies Fonctions et Procédures utilisateur Transmission des paramètres Sommaire ◼ ◼ ◼ ◼ ◼ ◼ ◼ Types de données utilisateur Manipulation des Dates Les boîtes de message et la fonction InputBox Formatage de données (Fonction Format) Contrôles avancés (menus et menus contextuels – les grilles) Gestion des erreur (L’objet Err) Accès aux bases de données GÉNÉRALITÉS Deux mondes de programmation: • Temps • Orienté objet Procédural ou Structuré • • • • on manipule des objets: ensembles groupés de variables et de méthodes Généralement la programmation est évènementielle le sujet est prépondérant: Voiture.calculVitesse() on définit des fonctions s'appelant mutuellement. Une fonction principal orchestre l’exécution du programme (main) travaille sur l'action ou le verbe: calculVitesse(voiture) Evolution Notion d’objet Objet:Super-variable(groupe de variables de différents types) Les variables sont désignées par un nom = Propriétés Exemple 1 : l’objet Voiture Propriétés: couleur, marque, modèle, carburant, puissance fiscale, vitesse Maxi, prix…. Syntaxe : objet propriété Voiture1.couleur = rouge Voiture1.marque = ‘’Peugeot’’ p = Voiture1.puissanceFiscale Notion d’objet Exemple 2 : l’objet Etudiant Propriétés: nom, classe, adresse, situation familiale, âge, taille, budget, situation/justice…. utilisation : Etudiant1.âge = 23 Etudiant1.Budget = Etudiant1.Budget + 100 n = Etudiant1.nom Notion d’objet Méthodes = fonctions de l’objet Exemple : Voiture Accélérer, ralentir, avancer, reculer, s’arrêter…. Syntaxe : objet Méthode() Voiture1.accélérer() Voiture1.reculer(10 m) Voiture1.changerCouleur(bleu) Voiture1.couleur = bleu Notion d’objet Exemple 2 : Méthode de l’objet : Etudiant Réussir, Redoubler, Tricher, s’absenter, préparerExamen, AugmenterBudget…. Syntaxe : objet Méthode() Etudiant1.Réussir() Etudiant1.Sabsenter(2) Etudiant1.AugmenterBudget(100) Etudiant1.Budget = Etudiant1.Budget + 100 Présentation de visual basic Explorateur de solution Formulaire (Base de l’application) Toolbox :Boite à outils (Ctrl+Alt+x) Properties window (F4) Familiarisation avec les propriétés d’un contrôle Sélectionner le formulaire « Form1 » et explorer ses propriétés. Modifier les attributs suivants afin de voir leurs effets: • Name • Backcolor • Background Image • Cursor • Opacity • Text Exploration de quelques outils Placez les contrôles suivants et essayer de voir les utilisations et les propriétés de chacun: • Button • TextBox • Label • ComboBox • listBox • DateTimePicker • CheckBox • RadioButton Exploration de quelques outils Maintenant exécuter cette application VB.net en appuyant sur le triangle vert et vérifier les différentes utilités 1ère Application: Procédure évènementielle Évènement C’est un message qui provient: ❑ D’une action de l’utilisateur sur l’interface Cliquer sur un bouton Bouger le curseur de la souris Cliquer sur la souris Enfoncer une touche du clavier … ❑ D’une action intrinsèque du système Premier chargement d’une fenêtre Déclenchement d’évènements cycliques (Timer) C’est une méthode associée a un contrôle. Exécution d’une liste d’instructions • Fermer fenêtre • Afficher un message • ….. 1ère Application: Procédure évènementielle Maintenant on va voir comment programmer en VB. Faire un nouveau projet ou modifier l’ancien afin d’obtenir cette interface: En cliquant sur le bouton, l’interface devient: 1ère Application: Procédure évènementielle Pour pouvoir passer à l’interface de programmation, cliquer 2 fois sur un contrôle: Interface de programmation ComboBox contenant les outils de l’application Évènement en cours Classe en cours de programmation 1ère Application: Procédure évènementielle liaison entre une procédure et un événement ? Procédure Non évènementielle Private Sub Calcul() instructions End Sub -*- sender: est un paramètre en entrée (par valeur) qui désigne l'objet qui a déclenché l'événement. -*- e: représente un paramètre en entrée (par valeur) qui spécifie les conditions de l'événement. Procédure évènementielle Private Sub Calcul(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click instructions End Sub NOTION DE BASE Syntaxe de base: Les variables Noms de variables: 1-Pas de longueur maximale 2-Commence par un caractère: 12xy 3-Pas d’espace: date_de_naissance date de naissance 4-Pas de sensibilité à la casse (toto=Toto=ToTO) Syntaxe de base: Les variables Déclaration: • En VB la déclaration des variables n’est pas obligatoire tant que l’option Explicit n’est pas activée: Option Explicit On Private Dim Nom_variable As Type_variable Public Portée des Variables: 1-Niveau Procédure : Dim NomVariable As Type 2-Niveau Form : Dim NomVariable as Type 3-Niveau Projet (module) : Public NomVariable As Type Exemple: Dim i As integer, Public b As boolen Syntaxe de base: Les types Type Plage des valeurs Taille conversion Short -32 768 à 32 767 2 octets CShort Integer - 2 147 483 648 à 2 147 483 647 4 octets CInt Long -9 223 372 036 854 775 808 à -9 223 372 036 854 775 807 à 8 octets CLng Single -3,4028235E+38 à -1,401298E-45 pour les valeurs négatives 1,401298E-45 à 3,4028235E+38 pour les valeurs positives 4 octets CSng Double -1,7976931348623157E+308 à -4,94065645841246544 E-324 pour les valeurs négatives -4,94065645841246544E-324 à -1,7976931348623157E+308 pour les valeurs positives 8 octets Decimal +/- 79 228 162 514 264 337 593 543 950 335 sans chiffre décimal +/- 7,922 816 251 426 433 759 354 395 033 5 avec 28 positions à droite de la virgule 12 octets CDbl CDec Syntaxe de base: Les types Byte Entiers non-signés de 0 à 255 1 octets CByte Boolean True / False 2 octets CBool 10 octets + (2 * nbr. caractères de la chaîne) String de 0 à environ 230 caractères CStr char 0 à 65 535 (non signés). 2 octets CChar Date 01/01/1 à 31/12/9999 8 octets CDate Object référence à un objet 4 octets + objet - Syntaxe de base: les tableaux et les matrices ◼ Variables indicées (Tableaux): Déclaration obligatoire!! 1- Taille connue à l’avance : Dim MonTableau(n) As Integer : n représente l’indice de la dernière case Dim MonTableau(11) As Integer (indices : de 0 à 11 => 12 éléments) 2- Déclaration avec Initialisation: Dim A={1,5,9,12} Dim A() as integer ={1,5,9} Dim Mois () as string ={"janvier", "février"} 27 Syntaxe de base: les tableaux ◼ Pour parcourir un tableau il suffit d’utiliser une structure répétitive. For i =0 to 3 MsgBox("A( " & i & " )= " & A(i)) Next On peut utiliser la méthode length pour récupérer le nombre de cases du tableau. Exemple: For i =0 to 3 ‘For i =0 to A.length-1 MsgBox(" A( " & i & " )= " & A(i)) Next 28 les tableaux et les matrices Tableau dynamique qui change de taille : Dim MonTableau( ) As Integer Taille fixée ultérieurement : Redim MonTableau(10) Préserver les valeurs existantes : Redim Preserve MonTableau(11) Les Matrices (mêmes règles que les tableaux!) Dim Mat(2,3) As Integer Dim m1(1,2) as integer {{1,2,3},{5,6,7}} 29 Syntaxe de base: les Opérateurs ◼ Opérateurs arithmétiques Opérateurs numérique : + - * / Opérateurs booléens : And Or Xor Not Opérateur caractère : & (concaténation) \ : Division entière ^ : puissance Mod : reste de la division entière Syntaxe de base: les Opérateurs Opérateurs de concaténation L'opérateur & permet de concaténer (réunir) deux chaînes. L'opérateur + peut être aussi utilisé pour concaténer deux chaines de caractères. ◼ Exemple : MsgBox "le périmètre est de " & Circonference & « mètres" ◼ Notez que la variable concaténée « Circonference » est une valeur numérique et qu'il y a une conversion implicite vers le type String. Syntaxe de base: les Opérateurs Opérateurs logiques ◼ Opérateur And, Or, Xor, Not ◼ Opérateur d’affectation et de test d’égalité = Il peut quand meme il y avoir des ambiguïtés dans certains cas: Sub OperateurEgal() Dim Var1 As Integer, Var2 As Integer, Var3 As Integer Var1 = 10 Var3 = Var2 = Var1 End Sub ce code ne veut pas dire: « mettre var2 et var3 à 10 » MAIS « mettre dans var3, le résultat de l’expression var2 = var1 » Syntaxe de base: les structures conditionnelles ◼ L’alternative (si…..sinon…..) If (Conditions) Then Liste d’instructions End If If (Conditions) Then Liste d’instructions Else Liste d’instructions End If If (Conditions) Then Liste d’instructions Elseif (Conditions) Then Liste d’instructions Elseif (Conditions) Then Liste d’instructions Else Liste d’instructions End If Exercice ◼ ◼ Avec quelle structure de IF peut on traiter des RadioButton, afficher le resultat. Avec quelle structure de IF peut on traiter des CheckBox, afficher le resultat. Syntaxe de base : les structures conditionnelles ◼ Select case : Select case x case 0 instructions case 1 to 6 instructions case 7,9,15 instructions case IS>17 instructions case else instructions End Select Syntaxe de base: Les boucles ◼ La boucle For For x = a to b Step c Liste d’instructions Next x Exemple : For i = 1 to 10 s=s+i Next i ◼ Fin prématurée (Exit For) For i = 1 to 10 If t(i) = c then Trouvé = true Exit For End if Next i Syntaxe de base: Les boucles ◼ La boucle For… Each … Next C’est une extension de la boucle For ... To … Next. For Each Elément In Ensemble ‘Ensemble est le plus souvent un tableau. Instructions [Exit For] Next [Elément] Exemple : Dim TabHasard() As Integer = {3, 4, 5, 1} Dim Cellule As Integer For Each Cellule In TabHasard MsgBox(Cellule) ’Affiche le contenu du tableau TabHasard Next Cellule Syntaxe de base: Les boucles ◼ Les Boucles (test avant exécution) While (Condition de continuité) Do While (condition de continuité) Liste d’instructions End while instructions Loop Do Until (condition d’arrêt) instructions Loop Syntaxe de base (complément) ◼ Les Boucles (test apès exécution) Do instructions Loop While (condition de continuité) Do instructions Loop Until (condition d’arrêt) Exemple→ Exemple Dim mot as string Dim i as interger=1 Do mot= inputBox("Donner votre mot de passe" ) i=i+1 If i=3 then Exit do End If Loop Until (mot= motdepasse) Exercice ◼ Application sur les tableaux et les boucles: Construire une application qui permet de saisir le nom, prénom et les notes d’un étudiant. Le nombre de notes à introduire est inconnu à priori: Vous devrez travailler avec un tableau dynamique. Comme résultat, afficher la moyenne de l’étudiant Vous utiliserez des InputBox pour faire entrer les données et les MsgBox pour l’affichage. Voici la syntaxe. Dim saisie As String Saisie = InputBox("je suis un INPUTBOX..., Ecrivez votre donnée") MsgBox("je suis un MSGBOX...") 42 Correction Conversion string → integer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Label3.Text = "" Label3.Text = TextBox1.Text + TextBox2.Text End Sub Conversion string → integer ??!?? Conversion string → integer Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Label3.Text = "" Label3.Text = Val(TextBox1.Text) + CInt(TextBox2.Text) End Sub Et si… Que serait le resultat? ooops Le problème est dans maman? Pkoi pas papa??! Isnumeric… Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Label3.Text = "" If (IsNumeric(TextBox1.Text) And IsNumeric(TextBox2.Text)) Then Label3.Text = Val(TextBox1.Text) + CInt(TextBox2.Text) Else MsgBox("vérifiez votre saisie") End If End Sub Cours VB.NET GESTION DES ERREURS Gestion des erreurs ◼ ◼ Différentes erreurs peuvent survenir lors de l’exécution du code. Si pas de gestion de l’erreur, l’interruption de l’exécution survient. Le programme continu à fonctionner Exécution du code Le programme plante Les erreurs de syntaxe ◼ ◼ ◼ Sont reconnus par le compilateur Empêchent le programme de passer à l’exécution Exemple: ◼ Utilisation d'un mauvais nom de variable Erreur dans la portée d'une variable. Erreur dans le passage de paramètres Erreur dans la conception de l'algorithme. Ces erreurs ne sont pas concernées par la gestion. Les erreurs d'exécution ◼ ◼ Surviennent en mode « Run » ou lors de l'utilisation de l'exécutable: Une instruction ne peut pas être effectuée. En cours de test, s'il y a une exception (erreur), le logiciel s'arrête, l'instruction qui a planté apparaît en jaune et VB donne une explication. ◼ Soit une erreur de conception : ◼ ouvrir un fichier qui n'existe pas, division par zéro, utiliser un index d'élément de tableau supérieur au nombre d'élément, envoyer un mauvais paramètre à une fonction. Soit une erreur d’utilisation : On demande de taper un chiffre, l’utilisateur tape une lettre ou rien puis valide. Exemple ◼ Calculer 10 / un entire saisi… Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim s As String Dim x As Integer s = InputBox("donner un entier non nul") If IsNumeric(s) Then x = CInt(s) If (x <> 0) Then MsgBox( 10 / x) Else MsgBox("vous avez donné 0", MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Erreur") End If Else MsgBox("vous avez donné un texte",MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, Erreur" End If MsgBox(“Aurevoir") End Sub Comment éviter les erreurs? ◼ Capter les erreurs avec Try Catch Finally : Essayer l'instruction (Try), si une erreur se produit Intercepter l'erreur (Catch) puis poursuivre (après Finally) Try 'Instruction susceptible de provoquer une erreur. Catch 'Traitement de l'erreur Finally 'Code toujours exécuté End Try ◼ Mais plusieurs type d’erreurs peuvent survenir… comment distinguer l’une de l’autre???? Gestion des erreurs : Try … catch … Finally …End Try ◼ Il est possible d'utiliser Catch pour récupérer l'objet 'Exception' qui est généré par l'erreur. Catch ex As Exception ◼ L’objet Exception à des propriétés: .Message qui contient le descriptif de l'erreur. .Source qui contient l'objet qui a provoqué l'erreur.... Et alors!! En quoi ça aide??? ◼ ◼ ex.Message contient donc le message de l'erreur. Cet objet généraliste Exception a aussi des classes dérivées: ◼ StackOverFlowException : problem in recursive call FileNotFoundException: problem in file path or existance EndOfStreamException : reading is attempted past the end of a stream FileLoadException: file can’t be loaded PathTooLongException : path is too long Enfin une exception peut provenir de l'espace System: argumentExceptions; ArithmeticException: DivideByZeroException InvalidCastException Gestion des erreurs: Exemple s = InputBox("donner un entier non nul") Try x = CInt(s) MsgBox(10 \ x) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Erreur") Finally MsgBox(“Au revoir") End Try Personalisation des messages s = InputBox("donner un entier non nul") Try x = CInt(s) MsgBox(10 \ x) Catch ex As DivideByZeroException MsgBox("Division par zero", MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Erreur") Catch ex As InvalidCastException MsgBox("Problème de conversion", MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Erreur Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "Erreur") Finally MsgBox(“Au revoir") End Try LES PROCEDURES ET FUNCTION EN VB.NET Les procédures en VB.net ◼ ◼ ◼ Nous pouvons simplifier la programmation des tâches en divisant les programmes en plusieurs éléments logiques de plus petite taille. Les procédures utilisées dans un programme peuvent être reprises dans d'autres programmes, moyennant peu ou pas de modifications. Visual Basic comporte plusieurs types de procédures : Les procédures Sub ne renvoient pas de valeur. 1. 2. Procédures générales Procédures évènementielles Les procédures Function renvoient une valeur. 64 Fonction et procédure Fonction Retour de function vers programme appelant Paramètres d’entrée Procédure Paramètres d’entrée Procédures Sub : générales [Private|Public] Sub Nom_proc (liste des arguments) Instructions [Exit Sub] End Sub ◼ ◼ Une procédure générale indique à l'application la façon de mener à bien une tâche particulière. Une fois qu'une procédure générale est définie, elle doit être invoquée spécifiquement par l'application. Ces procédures ne renvoient pas de valeurs à la procédure appelante. Une procédure Sub est un bloc de code qui est exécuté en réponse à un appel de procédure par une autre. Exemple : Dim resul as string Sub affiche() lblRes.Text= result End Sub 66 Procédures Sub ◼ L’appel de la procédure en utilisant: call : call affiche() en écrivant uniquement le nom de la procédure ◼ Affiche() ◼ ◼ Chaque fois que la procédure est appelée, les codes compris entre Sub et End Sub sont exécutées. Par défaut, les procédures Sub sont des procédures Public dans tous les modules, ce qui signifie qu'elles peuvent être appelées à partir de n'importe quel endroit de l'application. Exemple : private Sub resultat() affiche () ‘ou bien call affiche() 67 End Sub ◼ Procédure d'événement Private Sub NomCtrl_Event(sender As Object, e As EventArgs) Handles . NomCtrl Event Instructions [Exit Sub] End Sub ◼ ◼ Elle reste inactive jusqu'au moment où elle est appelée pour réagir à des événements L’ événement est provoqué par: ◼ l'utilisateur: button.click, txtbox.textchanged, SelectedIndexChanged ou déclenché par le système: MyBase.Load, Timer1.Tick… On dit que les procédures d'événement sont attachées aux feuilles et aux contrôles. 68 Bonnes pratiques ◼ Utiliser les procédures de code fournies par Visual Basic, car elles incluent automatiquement le nom correct des procédures. 69 Bonnes pratiques ◼ ◼ Définir la propriété Name des contrôles avant de commencer à écrire les procédures d'événement qui leur sont associées. Si on modifie le nom d'un contrôle après lui avoir associé une procédure, on devra également modifier le nom de la procédure afin qu'elle corresponde au nouveau nom du contrôle. Principaux Événements Click :Se produit lorsque l’utilisateur appuie puis relâche le bouton gauche de la souris (ou entrée si le contrôle a le focus) Private Sub Bt_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt.Click ◼ DblClick : Se produit lorsque l’utilisateur réalise un double click Private Sub Lb_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Lb.DoubleClick ◼ TextChange : Se produit lorsque le text d’une zone de texte change ◼ KeyPress : Se produit lorsque l’utilisateur appuis et relâche une touche du clavier ◼ 71 Procédures Fonction : [Private|Public] Function Nom_Fonction (arguments) [As type] Instructions Return valeur ‘ ou Nom_Fonction = valeur End Function ◼ La valeur qui doit être retournée par la fonction doit être: ◼ ◼ affectée au nom de la fonction ou utiliser l’instruction Return. La déclaration de la fonction se termine par les mots réservés ”End function”. Il est possible de quitter prématurément une fonction en inscrivant simplement l’instruction Exit Function. Private Function factoriel(ByRef N As Integer) As Integer Dim f = 1, i As Integer For i = 1 To N f = f * i Next Return f End Function 72 Procédures Fonction : ◼ L’appel à une fonction peut se faire par: Directement dans une affectation Affichage x = factoriel(5) MsgBox(factoriel(5)) 73 Exemple Ecrire une fonction qui permet le calcul de l'hypoténuse d'un triangle rectangle à partir des deux autres côtés : Function Hypotenuse(A As Integer, B As Integer) Hypotenuse = Math.Sqrt(A ^ 2 + B ^ 2) End Function ◼ L’appel se fera: Label1.text = Hypotenuse(CInt(Text1.Text), CInt(Text2.Text)) strX = Hypotenuse(longueur, largeur) 74 Les arguments des procédures et fonctions ◼ ◼ ◼ Lors de déclaration de la procédure, vous devez spécifier la liste des paramètres qui seront attendus. Cette liste est située entre les parenthèses de la déclaration de la procédure. Pour passer une variable comme paramètre à une procédure, il y a deux possibilités: ◼ ◼ Le passage par valeur : ByVal Le passage par référence : ByRef 75 Précautions ◼ ◼ ◼ Le passage par valeur est l’option par défaut . Il faut indiquer pour chaque paramètre son type de passage. Private Sub test(ByRef x As Integer, ByRef y As Integer) Si on ne met pas ByRef, “y” passera ByVal Passage des arguments Par valeur : ByVal Quand un argument est passé par valeur, seule une copie de la variable est passée à la procédure. Si celle-ci modifie la valeur, le changement affecte uniquement la copie et non la variable proprement dite. Utiliser le mot clé ByVal pour indiquer qu'un argument est passé par valeur ou ne rien écrire…. Par exemple : private Sub Somme (ByVal a as Integer, b as Integer ) ◼ a=a+b End Sub ◼ Private Sub BtSomme_Click (sender As Object, e As EventArgs) Handles BtSomme.Click Dim x As Integer = 10 Dim y As Integer = 20 Somme(x, y) Label1.Text = x ‘x=10 Label2.Text = y ‘y=20 End Sub 77 Limites du ByVal? ◼ ◼ Ecrire une procedure permute qui permet de permute deux entiers qui lui sont passes en parameter… Utiliser cette procedure dans une procedure évènementielle Btn_Click pour afficher les valeurs des variables passes en paramètres… Passage par valeur 1 Btn_Click X 10 y 20 Private Sub permuter(A As Integer, B As Integer) Dim aux As Integer aux = A A = B B = aux MsgBox("A = " & A & "B = " & B) End Sub Private Sub Btn_Click(sender As Object, e As EventArgs) Handles Btn.Click Dim x = 10, y As Integer = 20 permuter(x, y) MsgBox("x = " & x & "y = " & y) End Sub Passage par valeur 2 Btn_Click Permuter X A 10 10 y B 20 20 AUX Passage par valeur 3 Permuter Btn_Click AUX X A 10 10 y B 20 20 Passage par valeur 4 Btn_Click Permuter X A AUX 10 20 10 y B 20 10 Passage par valeur 5 Btn_Click Permuter X 10 A AUX 20 10 y B 20 10 Pas de changement !!! Passage par reférence Passage par reference 1 Private Sub permuter(ByRef A As Integer, ByRef B As Integer) Dim aux As Integer aux = A A = B B = aux MsgBox("A = " & A & "B = " & B) End Sub Btn_Click Permuter AUX X 10 A y 20 B Passage par reference 2 Permuter AUX X 20 A y 10 B 10 Passage par reference 3 Btn_Click Permuter AUX X 20 A y 10 B 10 Passage par reference 4 Btn_Click Permuter X AUX 10 10 y 20 Passage d'arguments par référence :ByRef ◼ ◼ ◼ Quand on fait passer des arguments par référence ByRef la procédure peut accéder à la variable proprement dite au niveau de l'emplacement de son adresse mémoire. La valeur de la variable peut ainsi être modifiée de manière permanente par la procédure à laquelle elle est passée. Exercice: Ecrire une procédure som_prod qui permet de calculer la somme et le produit de deux entiers qui lui sont passés en paramètre. La procédure n’affiche rien… faire l’affichage dans une procédure évènementielle qui fera appel à som_prod. 89 Exercice 1 ◼ ◼ ◼ Ecrire une fonction « IsPaire » recevant un entier et retourne 1 si l’entier est pair et -1 sinon. Ecrire une procédure « Saisie » dans laquelle on saisit un entier dans une zone texte Txtsaise et qui appelle la fonction « IsPaire » et affiche dans un messageBox « le nombre est pair » ou le « nombre est impair » suivant le cas. La procédure évènementielle test s’exécute lorsqu’on clique sur le bouton bttest et qui appelle la procédure Saisie 90 Exercice 2 ◼ ◼ ◼ Ecrire une fonction « RemplirTab » qui permet de remplir un tableau T (donné en argument) par des entiers saisis par l’utilisateur(en utilisant des inputBox), la saisie s’arrête avec 0 qui ne sera pas ajouté au tableau. La fonction retourne la taille du tableau. Ecrire une procédure Min_Max qui cherche le max et le min d’un tableau passé en paramètre sans l’afficher. Ecrire une procédure traitement dans laquelle s’exécutent les traitements suivant : Déclaration d’un tableau TAB dynamique d’entiers Remplissage de TAB en faisant appel à la fonction RemplirTab Afficher la taille du tableau dans un label « LbAffiche » Afficher le max et le min de TAB dans un msgbox 91 Exercice 3 ◼ Ecrire une procédure qui détermine les nombres parfaits qui existent entre et 2 et 10000. l’affichage sera dans un MsgBox. NB: un nombre parfait est un nombre dont la somme de ses diviseurs (sauf lui-même) est égale à lui-même 92 Exercice 4 ◼ ◼ ◼ ◼ Ecrire une procédure qui permet remplir un tableau T de taille n avec des notes positives. Ecrire une procédure qui permet de calculer la moyenne de ses notes sans l’afficher. Ecrire une procédure « Recherche » qui recherche une valeur X passé en paramètre dans le tableau T. si X se trouve plusieurs fois elle retourne sa première position sinon -1. Ecrire une procédure générale « Saisie » dans laquelle s’exécutent les traitement suivants: ◼ Déclaration d’un tableau Tab dynamique, Saisir la taille du tableau avec 1<=taille<=20, Remplir le tableau en utilisant la procédure nécessaire, Afficher la moyenne en utilisant un MsgBox, Saisir une valeur a et afficher dans un MsgBox la position de a dans Tab Comment voir le résultat de votre travail proposer une solution. 93 INTERACTION AVEC L’UTILISATEUR Les MsgBox MsgBox - Instruction ou fonction ? Cette instruction très utilisée dans Visual Basic permet de poser une question à l' utilisateur au travers d' une boîte de dialogue. Syntaxe: Variable = MsgBox("Message", Type, "Titre de la fenêtre") Variable : Variable de type Entier(Integer) recevant la valeur du bouton Message : Prompt :Chaîne de caractères affichée comme message dans la boîte de dialogue Type : Expression numérique qui contrôle les boutons et les icônes à afficher. Titre : Expression chaîne affichée dans la barre de titre de la boîte de dialogue. MsgBox (type) ◼ Les constantes pour les boutons Constante VB valeur Affichage MsgboxStyle.OKOnly 0 le bouton OK uniquement MsgboxStyle.OKCancel 1 les boutons Ok et Annuler MsgboxStyle.CancelRetryIgnore 2 les boutons Abandonner, Répéter et Ignorer MsgboxStyle.YesNoCancel 3 les boutons Oui, Non et Annuler MsgboxStyle.YesNo 4 les boutons Oui et Non MsgboxStyle.RetryCancel 5 les boutons Répéter et Annuler MsgBox (type) ◼ Les constantes pour les icônes Constante VB valeur Affichage MsgboxStyle.Critical 16 l'icône erreur critique MsgboxStyle.Question 32 l'icône question MsgboxStyle.Exclamation 48 l'icône message d'avertissement MsgboxStyle.Information 64 l'icône message d’information MsgBox ("Erreur fatale, division par 0", MsgboxStyle.Critical) MsgBox (type) ◼ Les constantes pour le bouton par défaut Constante valeur Description MsgboxStyle.DefaultButton1 10 Le 1er bouton est le bouton par défaut MsgboxStyle.DefaultButton2 256 Le 2ème bouton est le bouton par défaut MsgboxStyle.DefaultButton3 512 Le 3ème bouton est le bouton par défaut MsgBox Exemple x = MsgBox("Echec de connexion!", MsgboxStyle.DefaultButton2 + MsgboxStyle.AbortRetryIgnore or MsgboxStyle.Information, "titre") MsgBox (constantes renvoyées) ◼ Les constantes renvoyées par MsgBox Constante valeur Description MsgBoxResult.Ok 1 OK MsgBoxResult.Cancel 2 Annuler MsgBoxResult.Abort 3 Abandonner MsgBoxResult.Retry 4 Réessayer MsgBoxResult.Ignore 5 Ignorer MsgBoxResult.Yes 6 Oui MsgBoxResult.No 7 Non La fonction : InputBox ◼ Syntaxe InputBox (prompt [, title] [, default] [, xpos] [, ypos] [, helpfile, context]) ch = "" ch = InputBox("Quel est votre age", "Age S.V.P", "20 ans") Exemple Voici un exemple au sein de lequel l’utilisateur est invité à spécifier s’il désire terminer un processus quelconque ou s’il désire continuer à l’aide de la boîte de dialogue ci-contre. ◼ ◼ Si l’utilisateur appuie sur le bouton Oui, le script s’arrête à l’aide de l’instruction Exit Do vue précédemment. 103 Cours VB.NET LES CHAINES DE CARATÈRES: STRING Les chaines de caractères ◼ ◼ ◼ ◼ ◼ Le type 'String' peut contenir une 'chaîne de caractères' (alphanumérique) comme du texte. La longueur de la chaîne n'est pas fixe et une String peut avoir un nombre de caractère allant de 0 jusqu'à environ 2 milliards de caractères. Le Type 'Char' contient un seul caractère. On utilise souvent des tableaux de 'Char'. 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 ou chaque caractère était codé sur un octet). Les premiers caractères ont le même code Unicode et Ascii La table UNICODE https://unicode-table.com/en/ UNICODE = Tous les caractères possibles Les methods de la classe string ◼ ◼ Le type System.String ou String (Chaîne de caractères) est une Classe du Framework, qui a des méthodes. Pour ces méthodes, le premier caractère est à la position 0. Méthodes de string ◼ .Trim : Permet de supprimer des caractères en début et fin de chaîne. s=" Bonjour “ s=s.Trim(" ") 'donne s="Bonjour" ◼ .Length : Taille d'une chaîne en nombre de caractère. Dim s As String= "VB" MsgBox(s.Length.ToString) ◼ .Insert : Insère une chaîne dans une autre. Dim s As String= "VisualBasic" s= s.Insert(6," " ) 'Donne s= "Visual Basic" ◼ .Remove : Enlève des caractères à une certaine position dans une chaîne. Dim s As String = "VisualBasic" s = s.Remove(2, 7) 'Donne s= "Viic" 'Affiche 2 Méthodes de string ◼ .Replace : Remplace dans une chaîne de départ, toutes les occurrences d'une chaîne par une autre. ◼ .Contains : Permet de savoir si une chaîne apparaît dans une autre. Retourne True ou False. Dim s As String= "Visual_Basic" s= s.Replace("_"," " ) 'Donne s= "Visual Basic" Dim a As String= "Visual_Basic" Dim trouve As Boolean trouve = a.Contains( « al") Méthodes de string ◼ .Split : Découpe en plusieurs sous chaînes une chaîne de départ par rapport à un séparateur et les place dans un tableau de string. Par défaut le séparateur est l’espace “ " 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" ◼ .Join : Concatène tous les éléments d'un tableau et peut ajouter des séparateurs. q = String.Join(" ", nom) .Substring : Extrait une partie d'une chaîne. Le premier paramètre indique la position de départ; le second, le nombre de caractères à extraire. Dim a As String= "Informatique" MessageBox.show(a.Substring( 2,3)) 'Affiche for ◼ Donne Philippe Jean Toto .substring ◼ Exercice comment obtenir les 4 caractères de droite d’une chaine. Dim a As String= "Informatique" MessageBox.show(a.Substring(A.Length-4)) 'Affiche ique comment obtenir les 3 caractères de gauche d’une chaine. Dim a As String= "Informatique" MessageBox.show(a.Substring(0, 3)) 'Affiche inf Méthodes de string ◼ .Chars : Une chaîne peut être perçue comme un tableau de caractères (instances Char) ; on peut 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. ◼ .StartsWith() et EndsWith() : Permettent de tester si une string commence ou se termine par une string, retourne True ou False. ◼ .ToString : convertit n’importe quel information vers string Dim maString As String = "ABCDE" Dim monChar As Char monChar = maString.Chars(3) ' monChar = "D" ‘Tester si la String s commence par "abc" et se termine par "xyz": If s.StartsWith ("abc") And s.EndsWith ("xyz") Then ….. End if Dim I As Integer=12 Label.Text = I.ToString Comparaison de chaines ◼ On peut comparer 2 String avec les opérateurs '=', '>', '<' : Dim s1 As String = "ABCD" Dim s2 As String = "XYZ" If (s1 > s2) Then MsgBox(s1 & ">" & s2) Else MsgBox(s2 & ">" & s1) End If ◼ ◼ Les caractères sont classés dans un ordre croissant (l'ordre de leur code unicode). l'ordre de certains caractères particuliers: " " +,-./ 0123456789 :;ABCDEF abcdef èéê Les instructions 'Visual Basic' ◼ ◼ ◼ ◼ ◼ Elles sont anciennes (avant .NET) et font partie intégrante de VisualBasic; Sont parfois plus simples, mais ne fonctionnent pas comme des Objets mais plutôt comme des instructions. Elles font double emploi avec les méthodes de la classe String. Elles ne sont pas toujours cohérentes avec le reste et cela peut induire en erreur. Attention : le premier caractère est en position 1 dans les instructions VB Position d’une chaine dans une autre ◼ ◼ ◼ InStr : Retourne un entier spécifiant la position de début de la première chaîne à l'intérieur d'une autre à partir de la position indiquée. Si la chaîne n'est pas trouvée, retourne 0. Asc : Retourne le code de caractère du caractère. entre 0 et 255 pour le le jeu de caractères codés sur un octet entre -32 768 et 32 767 pour le jeu de caractères codés sur deux octets AscW : AscW retourne le code Unicode du caractère entré. Il peut être compris entre 0 et 65 535. n=InStr(1,"aaaaRaa","R") 'retourne 5 x=Asc("A") 'retourne 65 x=AscW("A") 'retourne 65 Exercice 1 ◼ ◼ Ecrire une procédure qui demande à l’utilisateur de saisir 2 chaines de caractères de taille 10 maximum. Afficher un message d’erreur à chaque fois qu'une chaine saisie par l’utilisateur dépasse la taille autorisée. Vérifier si ces deux chaines sont identiques, si non, vérifier si la chaine la plus petite existe dans la plus grande à l’aide de fonction InStr, si elle existe, alors afficher la position trouvée. 117 Cours VB.NET PROGRAMMATION DES CONTÔLES C’est quoi et pourquoi? ◼ ◼ C’est le fait de programmer de toute pièce l’interface… (sans passer par la phase de design) Ça sert à faire des niveaux, programmer de grandes applications etc… Déclaration d’un contrôle avec New ◼ ◼ ◼ ◼ Les contrôles (Button, TextBox, PictureBox…) sont des objets et donc des instances de classes. On peut donc declarer un contrôle presque comme on declare une variable. On doit prendre en compte que c’est un objet et a des propriétés et des methods. Pour declarer un composant, on utilize new Dim BtnTest As New Button 'un bouton est un objet par référence Si on fait « Dim BtnTest As Button » on crée une référence vide, mais pas d'objet Button. Modification des propriétés du contrôle ◼ Avant d’être placé sur le Form, un contrôle est paramétré : on lui donne l’allure finale qu’il doit avoir. BtnTest.Location = New System.Drawing.Point(56, 144) BtnTest.Name = "BtnTest" BtnTest.Size = New System.Drawing.Size(104, 24) BtnTest.TabIndex = 0 BtnTest.Text = "Test" ◼ ◼ Dans quel procédure seront mis ces instructions? Mais en exécutant, le bouton n’existe pas!!! Affichage du contrôle ◼ ◼ ◼ Les instructions devront être mises dans une procédure qui sera exécutée au démarrage de la form… ce sera la procédure qui correspond à l’évènement chargement de la form (Form_Load) On devra aussi ajouter le composant à l’ensemble des contrôle de fenètre Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load BtnTest.Location = New System.Drawing.Point(56, 144) BtnTest.Name = "BtnTest" BtnTest.Size = New System.Drawing.Size(104, 24) BtnTest.TabIndex = 0 BtnTest.Text = "Test" Me.Controls.Add(BtnTest) 'ajoute le composant à la ‘fenêtre End Sub Ajouter des évènements au contrôle ◼ ◼ ◼ ◼ le bouton ne commence à exister qu’au moment du démarrage de l’application. Lorsque la fenêtre est chargée, le bouton existe mais il ne gère aucun évènement. Pour lui attribuer un évènement, Il faut inscrire le bouton dans une méthode de gestion d'évènements. Donc, VB.NET doit savoir quelle procédure doit être déclenchée quand un évènement survient sur l’objet créé. ◼ I. II. Pour écrire une procédure évènementielle liée à un contrôle (bouton) dynamiquement ajouté, il faut: Écrire une procédure contenant les instruction à faire en cas d’évènement et contenant les paramètres Sender et e. Lier cette procédure avec le contrôle et l’évènement en question. Ecrire une procédure ayant les paramètres Sender et e ◼ Elle contient les instructions à exécuter si l’évènement survient : Private Sub BouttonClique(sender As Object, e As EventArgs) Msgbox("je suis un nouveau bouton") End Sub ◼ Mais cette procedure n’est pas evenementielle, Pas de handles, donc pas de liaison à aucun evennement Ce sera une procedure ayant les parametres d’evènement mais sans l’evènement Lier la procédure avec le contrôle et l’évènement Pour cela on utilisera l’instruction AddHandler qui sera écrite comme suit: ◼ AddHandler BtnTest.Click, AddressOf BouttonClique • • AddHandler permet d’affecter une procédure à un évènement. AdressOf permet de désigner la procédure à utiliser en cas d’évènement. Code complet Public Class FrmTest Dim BtnTest As New Button Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ‘Attribution des paramètres du bouton BtnTest.Location = New System.Drawing.Point(56, 144) BtnTest.Name = "BtnTest" BtnTest.Size = New System.Drawing.Size(104, 24) BtnTest.TabIndex = 0 BtnTest.Text = "Test“ ‘Ajout du contrôle aux contrôles de la fenètre (apparition sur la form) Me.Controls.Add(BtnTest) ‘Inscription de la liaison entre évènement sur le contrôle et procedure à exécuter AddHandler BtnTest.Click, AddressOf BouttonClique End Sub ‘procédure à exécuter en cas d’évènement Private Sub BouttonClique(ByVal sender As Object, ByVal e As EventArgs) MsgBox("Je suis un nouveau bouton") End Sub End Class Remarques ◼ ◼ ◼ ◼ ◼ le mot clé « Handles » permet d'associer un événement à une procédure au moment de la conception. le mot clé « Addhandler » permet d'associer un événement à une procédure au moment de l'exécution. L’instanciation d’un nouvel objet (déclaration du contrôle) est faite en dehors de toute procédure pour que l’objet soit vu par tous les sous programmes (objet global). Le paramétrage ainsi que l’attribution des évènements (les instructions AddHandler faisant les correspondances des différents évènements aux différents objets) se font dans la procédure Form_Load pour que ce soit exécuté au démarrage de l’application. Une procédure attribuée à un évènement d’un objet peut être réattribué à un autre objet et/ou un autre évènement. Utilisation des paramètres « sender » et « e » ◼ ◼ On veut placer dynamiquement deux boutons, BtnTest1 et BtnTest2, sur l’interface et leurs associer la même procedure évènementielle. Dans la procedure faire le test si c’est BtnTest1 que l’utilisateur a appuyé, afficher que c’est le premier. Si c’est BtnTest2 dire que c’est le deuxième… Public Class Form1 Dim BtnTest1, BtnTest2 As New Button 'un bouton est un objet par référence Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load BtnTest1.Location = New System.Drawing.Point(56, 120) BtnTest1.Name = "BtnTest1" BtnTest1.Size = New System.Drawing.Size(104, 24) BtnTest1.TabIndex = 0 BtnTest1.Text = "Test1" Me.Controls.Add(BtnTest1) BtnTest2.Location = New System.Drawing.Point(56, 144) BtnTest2.Name = "BtnTest2" BtnTest2.Size = New System.Drawing.Size(104, 24) BtnTest2.TabIndex = 1 BtnTest2.Text = "Test2" Me.Controls.Add(BtnTest2) 'ajoute le composant à la fenètre AddHandler BtnTest1.Click, AddressOf BoutonClique AddHandler BtnTest2.Click, AddressOf BoutonClique End Sub Private Sub BoutonClique(sender As Object, e As EventArgs) If (sender.name = BtnTest1.Name) Then MsgBox("Bouton I appuyé", MsgBoxStyle.Information, "Bouton apuyé") Else MsgBox("Bouton II appuyé", MsgBoxStyle.Information, "Bouton apuyé") End If End Sub End Class Private Sub BouttonClique(sender As Object,e As EventArgs) If sender Is BtnTest1 Then MsgBox("Je suis le premier bouton") ElseIf sender Is BtnTest2 Then MsgBox("Je suis le deuxième bouton") End If End Sub le paramètre « e » pour un textbox, les évènements suivant sont relatifs à la touche appuyée : ◼ KeyDown : survient quand on appuie sur la touche. ◼ KeyPress : quand la touche est enfoncée. ◼ KeyUp : quand on relâche la touche. Ces évènements surviennent dans cet ordre. ◼ KeyPress permet de récupérer la touche tapée dans e.KeyChar (le code unicode mais pas les touches de fonction de direction comme CTRL,F1, F2, flèche haut...). ◼ KeyDown et KeyUp permettent de voir ce qui a été tapé physiquement, le code clavier (dans e.KeyCode) et aussi si MAJ ALT CTRL ont été pressés (dans e.Shift, e.Alt..) Exemple Private Sub TextBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyUp If e.Shift And e.KeyCode = Keys.A Then MsgBox("La lettre 'A' a été tapée") End If End Sub Déclaration d’un tableau de contrôle Public Class FrmTest Dim TabBouton(5) As Button Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim i As Integer For i = 0 To 5 TabBouton(i) = New Button TabBouton(i).Location = New System.Drawing.Point(56, 50 + 30 * i) TabBouton(i).Name = "TabBouton" & i TabBouton(i).Size = New System.Drawing.Size(104, 24) TabBouton(i).TabIndex = i TabBouton(i).Text = i Me.Controls.Add(TabBouton(i)) AddHandler TabBouton(i).Click, AddressOf BouttonClique Next End Sub Private Sub BouttonClique(sender As Object, e As EventArgs) MsgBox("Je suis le bouton Num " & sender.tabindex) End Sub End Class Exemple matrice de boutons Dim l, c As Integer Dim TabBouton(,) As Button Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim i As Integer l = CInt(InputBox("donner nbr ligne")) c = CInt(InputBox("donner nbr colonne")) ReDim TabBouton(l, c) For i = 0 To l For j = 0 To c TabBouton(i, j) = New Button TabBouton(i, j).Location = New System.Drawing.Point(50+31 * j, 50 + 31 * i) TabBouton(i, j).Name = "TabBouton" & i & j TabBouton(i, j).Size = New System.Drawing.Size(30, 30) TabBouton(i, j).Text = i * c + j Me.Controls.Add(TabBouton(i, j)) AddHandler TabBouton(i, j).Click, AddressOf BouttonClique Next Next End Sub Private Sub BouttonClique(sender As Object, e As EventArgs) MsgBox("Je suis le bouton Num " & sender.name) End Sub Cours VB.NET GESTION DES FICHIERS TEXTE Utiliser les "Stream" du Framework ◼ ◼ ◼ Le Stream (flux, torrent, courant) est une notion générale, c'est donc un flux de données provenant ou allant vers un fichier, un port, une connexion TCP/IP... Ici on utilise un Stream pour lire ou écrire dans un fichier. L'accès est séquentiel: les données sont traitées du début à la fin du fichier. Différents types de stream ◼ Stream en sortie: pour écrire dans un fichier ◼ Stream en entrée: pour lire à partir d’un fichier ◼ ◼ StreamWriter StreamReader Ce sont des classes, pour pouvoir les utiliser, il faut en instancier des objets… Utiliser new pour le faire Pour écrire dans un fichier texte ◼ Pour ouvrir un fichier en mode écriture, Il faut instancier un objet de la classe StreamWriter. Dim SW As New StreamWriter ("MonFichier.txt") ' crée le fichier ou, si existe déja, écrase MonFichier.txt Programme VB.NET SW Dim SW As New StreamWriter("MonFichier.txt") Création d’un nouveau fichier. Si le fichier existe déjà, il sera écrasé Ajouter sur un fichier ◼ Pour ne pas écraser mais ajouter à la fin du fichier (concatener): Dim SW As New StreamWriter ("MonFichier.txt", True) ' crée ou si ‘existe ajoute MonFichier.txt Programme VB.NET SW ceci est un texte déja existant dans un fichier, le curseur vient juste après Dim SW As New StreamWriter("MonFichier.txt", True) Write ◼ Puis on écrit avec la méthode Write MonFichier.txt Bonjour Programme VB.NET SW SW.Write("Bonjour ") WriteLine ◼ On peut aussi écrire avec la méthode WriteLine qui ajoute un saut de ligne. MonFichier.txt Bonjour Monsieur Programme VB.NET SW SW.WriteLine("Monsieur") Write et WriteLine SW.Write("Bonjour ") SW.WriteLine("Monsieur") ‘écrit bonjour sur la première ligne ‘écrit Monsieur à la dernière position du 'curseur puis revient à la ligne Close ◼ Enfin on ferme avec Close. Rupture du lien entre programme et fichier SW.Close() MonFichier.txt Bonjour Monsieur Programme VB.NET SW SW.close() Ouvrir un fichier texte en Lecture ◼ Pour ouvrir un fichier en mode Lecture, Il faut instancier un objet de la classe StreamReader. Position du curseur Caractère de fin de ligne MonFichier.txt Programme VB.NET SR cette ligne est à lire. s'il n'y a pas de retour à la ligne, tous les caractères seront considérés comme sur la même ligne. Dim SR As New StreamReader("MonFichier.txt") Lire à partir d’un fichier texte ◼ On peut lire par ligne avec ReadLine (une ligne) ReadLine, Ne lit pas le caractère de retour à la ligne Dim ligne As String ligne = SR.ReadLine MonFichier.txt Programme VB.NET SR cette ligne est à lire. s'il n'y a pas de retour à la ligne, tous les caractères seront considérés comme sur la même ligne. Dim ligne As String ligne = SR.ReadLine Readline Lire la totalité du fichier ◼ Pour lire ligne par ligne jusqu’à la fin, utiliser SR.EndOfStream qui retourne TRUE quand c’est la fin, FALSE sinon. Dim ligne As String Do ligne = SR.ReadLine TextBox2.Text += ligne & vbCrLf Loop While (Not SR.EndOfStream) MsgBox("fin fichier") Lire à partir d’un fichier texte ◼ On peut lire en bloc avec ReadToEnd (de la position courante jusqu'à la fin). TextBox2.Text = SR.ReadToEnd MonFichier.txt Programme VB.NET SR cette ligne est à lire. s'il n'y a pas de retour à la ligne, tous les caractères seront considérés comme sur la même ligne. Dim ligne As String ligne = SR.ReadTo End Fermeture du fichier ◼ Fermer le fichier avec la méthode close SR.Close() MonFichier.txt Programme VB.NET SR SR.close() cette ligne est à lire. s'il n'y a pas de retour à la ligne, tous les caractères seront considérés comme sur la même ligne.