Aller au menu - Aller au contenu

Icône Les inclassables

Avatar
Mise à jour : 13/12/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
23 410 visites depuis 7 jours, dont 447 sur ce chapitre classé 14/786
Quelques petits plus pour exploiter encore mieux les fonctionnalités de Visual Basic.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les constantes

Pour commencer cette partie des inclassables, je vais vous apprendre ce qu'est une constante en programmation.

Je pense que vous savez ce qu'est une constante dans le langage normal : c'est une variable qui ne varie pas (rigolo ! :-° ) ; elle garde toujours la même valeur.
Dans notre programme, ce sera pareil : une constante ne variera jamais au cours de notre programme, on ne peut donc pas lui assigner de valeur une fois sa déclaration effectuée.

C'est assez intéressant : imaginez un tableau dans lequel vous demandez dix valeurs à l'utilisateur. Vous allez le déclarer comme ceci :

Code : VB.NET
1
Dim MonTableau(9) As Integer

Et, dans le reste du code, vos boucles auront pour fin :

Code : VB.NET
1
to MonTableau.Length - 1

Si vous souhaitez changer et demander vingt valeurs au lieu de dix, vous allez devoir modifier cela dans la déclaration du tableau, ce qui, pour le moment, est simple si votre déclaration est faite au début de votre code.

Seulement, vous allez rapidement prendre l'habitude de déclarer vos variables en plein milieu du code, là où vous en avez besoin.
La joie pour retrouver son petit morceau de tableau dans tout ça...

Une autre solution serait de déclarer une constante, comme ceci :

Code : VB.NET
1
Const LONGUEURTABLEAU As Integer = 9

... et de déclarer votre tableau ainsi :

Code : VB.NET
1
Dim MonTableau(LONGUEURTABLEAU) As Integer

Eh oui, ça fonctionne ! Maintenant, vous rassemblez toutes vos constantes en haut de la page (ou dans une page à part pour les gros programmes), et voilà le moyen d'adapter facilement vos programmes sans trop de difficulté.

Les structures

Une autre chose qui pourra vous être utile dans certains programmes : les structures.

Alors, à quoi sert et comment utiliser une structure, ou plutôt un tableau de structure ? (Eh oui, on grille les étapes ! :p )

Tout d'abord, une structure est un assemblement de plusieurs variables ; une fois n'est pas coutume, je vais vous donner un exemple.

Vous avez l'intention de créer des fiches de livre dans votre programme. Chaque fiche rassemble les informations d'un livre : titre, auteur, genre, etc. Eh bien, dans ce cas, un tableau de structure va vous être utile (je parle de tableau de structure, car si on n'utilise la structure qu'une seule fois, elle est presque inutile).

Maintenant, comment l'utiliser ?

Sa déclaration est simple :

Code : VB.NET
1
2
3
4
5
6
Structure FicheLivre
   Dim ID        As Integer
   Dim Titre     As String
   Dim Auteur    As String
   Dim Genre     As String
End Structure

Nous voici donc avec une structure définie (comme pour une fonction, il y a un End Structure à la fin). Comme vous pouvez le constater, je l'ai nommée « FicheLivre ».
En définissant cette structure, c'est comme si on avait créé un nouveau type de variable (symboliquement). Mais il faut à présent la déclarer et, pour ce faire, utilisons ce nouveau type ! :p

C'est au moment de la déclaration que l'on décide si l'on souhaite un tableau de structure ou une simple structure :

Code : VB.NET
1
2
3
4
'Déclare une simple structure
Dim MaStructure As FicheLivre
'Déclare un tableau de structure
Dim MonTableauDeStructure(9) As FicheLivre

Je vais donc utiliser le tableau pour vous montrer comment on utilise cette structure.

Code : VB.NET
1
2
3
4
5
MonTableauDeStructure(0).ID = 0
MonTableauDeStructure(0).Titre = "Les Misérables"
'...
MonTableauDeStructure(9).Auteur = "Dan Brown"
MonTableauDeStructure(9).Genre = "Policier"

Voilà comment remplir votre structure ; cette méthode de programmation permet de se retrouver facilement dans le code.

Voici un exemple pour afficher cette structure :

Code : VB.NET
1
2
3
4
5
6
For i As Integer = 0 To 10
   Console.WriteLine("ID : " & MonTableauDeStructure(i).ID)
   Console.WriteLine("Titre : " & MonTableauDeStructure(i).Titre)
   Console.WriteLine("Auteur : " & MonTableauDeStructure(i).Auteur)
   Console.WriteLine("Genre : " & MonTableauDeStructure(i).Genre)
Next

Voilà encore un petit truc toujours utile. :)

Boucles supplementaires

Vous vous souvenez encore des boucles conditionnelles ? :-°

Eh bien, je vais vous en faire découvrir deux nouvelles : For Each et IIf.

Roh, tu es embêtant ! C'était tout à l'heure qu'il fallait nous expliquer ça, pas maintenant !

Désolé mais, tout à l'heure, vous ne pouviez pas vous en servir : vous n'aviez pas encore les connaissances requises.

Bon, je passe tout de suite à la première boucle !

For Each, traduisible par « pour chaque »


Vous vous souvenez des tableaux ?

Code : VB.NET
1
Dim MonTableau(9) As integer

Eh bien, la boucle For Each permet de parcourir ce tableau (un peu à la manière du For traditionnel) et de récupérer les valeurs.

Utilisons donc immédiatement cette boucle :

Code : VB.NET
1
2
3
4
5
For Each ValeurDeMonTableau As Integer In MonTableau
   If ValeurDeMonTableau < 10 Then
      Console.WriteLine(ValeurDeMonTableau)
   End If
Next

Ce qui se traduit en français par ceci : « Pour chaque ValeurDeMonTableau qui sont des entiers dans MonTableau ».

Ce code parcourt mon tableau et, pour chaque valeur, vérifie si elle est inférieure à 10 ; si c'est le cas, il l'affiche.

On ne peut pas assigner de valeurs dans un For Each, seulement les récupérer.

Très utile, donc, pour lire toutes les valeurs d'un tableau, d'un objet liste par exemple (que nous verrons plus tard).

Un For Each peut être utilisé pour parcourir chaque lettre d'un mot :

Code : VB.NET
1
2
3
4
5
6
7
Dim MaChaine As String = "Salut"
Dim Compteur As Integer = 0
For Each Caractere As String In MaChaine
   If Caractere = "a" Then
       Compteur = Compteur + 1
   End If
Next

Ce code compte le nombre d'occurrences de la lettre a dans un mot.


IIF


IIF est très spécial et peu utilisé : dans un certain sens, il simplifie un If. Voici un exemple de son utilisation dans le code précédent :

Code : VB.NET
1
2
3
4
5
6
7
8
Dim MaChaine As String = "Salut"
Dim Compteur As Integer = 0
For Each Caractere As String In MaChaine
   If Caractere = "a" Then
       Compteur = Compteur + 1
   End If
Next
Console.WriteLine(IIF(Compteur > 0, "La lettre 'a' a été trouvée dans " & MaChaine, "La lettre 'a' n'a pas été trouvée dans " & MaChaine))

En clair, si vous avez bien analysé : si le premier argument est vrai (c'est un booléen), on retourne le second argument ; à l'inverse, s'il est faux, on retourne le dernier.

Pour mieux comprendre :

Code : VB.NET
1
IIF(MonBooleen, "MonBooleen est true", "MonBooleen est false")

« MonBooleen » peut bien évidemment être une condition.

Les Cast

J'ai brièvement parlé des Cast dans un chapitre précédent : lorsque j'ai converti un string en un integer et que je vous ai dit que j'avais casté la variable.

Donc, vous l'avez compris, un Cast convertit une variable d'un certain type en un autre.

Attention lors des Cast, soyez bien sûrs que la variable que vous allez transformer peut être convertie : si vous transformez une lettre en integer, une erreur se produira.

Alors, il existe plusieurs moyens d'effectuer des Cast : une fonction universelle, et d'autres plus spécifiques.

Ctype()


La fonction universelle se nomme Ctype. Voici sa syntaxe :

Code : VB.NET
1
Ctype(MaVariableString, Integer)

Ce code convertira « MaVariableString » en integer.

Voici un exemple concret :

Code : VB.NET
1
2
3
4
Dim MonString As String = "666"
If Ctype(MonString, Integer) = 666 Then
'...
End If

Encore une fois, faites attention. Un code du style...

Code : VB.NET
1
2
3
4
Dim MonString As String = "a666"
If Ctype(MonString, Integer) = 666 Then
'...
End If

... produira une grosse erreur !


Les fonctions spécifiques


On a vu l'exemple de Ctype(), utile lorsqu'il s'agit de types peu courants. Mais pour les types courants, il existe des fonctions plus rapides et adaptées :

  • CBool() : retourne un Boolean.
  • CByte() : retourne un Byte.
  • CChar() : retourne un Char.
  • CDate() : retourne une date.
  • CDbl() : retourne un Double.
  • CDec() : retourne un nombre décimal.
  • CInt() : retourne un Integer.
  • CLng() : retourne un Long.
  • CSng() : retourne un Single.
  • CStr() : retourne un String.
  • CUInt() : retourne un Unsigned Integer.
  • CULng() : retourne un Unsigned Long.
  • CUShort() : retourne un Unsigned Short.

Toutes ces fonctions ne prennent qu'un argument : la variable à convertir... c'est facile à retenir !
Les fonctions en rouge sont les plus utilisées.

Que sont ces « unsigned » ?

Ah, tenez... c'est une bonne occasion de vous en parler.
Vous connaissez le type numérique integer ? (Oui, évidemment ! :D )

Eh bien, le unsigned permet d'augmenter la capacité de vos variables : au lieu d'aller d'environ - 2 000 000 000 à 2 000 000 000 dans le cas d'un int, cette capacité s'étend plutôt de 0 à 4 000 000 000 (approximativement) ; « unsigned » signifiant « non signé », il n'y a plus de signe.

En quoi cela peut-il nous être utile ? Je n'ai pas encore trouvé d'utilisation particulière parce que, si j'ai besoin d'un nombre plus grand que quatre milliards, j'utilise long qui peut contenir des nombres beaucoup plus grands.

Il était surtout utilisé à l'époque où chaque bit de données comptait.

De retour à nos petites fonctions : leur utilisation.

Code : VB.NET
1
2
3
4
Dim MonString As String = "666"
If CInt(MonString) = 666 Then
'...
End If

Le type Object

Dernière chose pour cette partie « petits plus » : je vais vous présenter un nouveau type, appelé object.

Ce type object (qui remplace le type variant en VB6) est utilisé lorsque l'on ne sait pas ce que va contenir notre variable. Il peut donc contenir des mots, des nombres, etc.

Exemple concret : vous vous souvenez de notre calculatrice ; les instructions dans lesquelles on demandait la valeur tout en vérifiant qu'il s'agissait d'un nombre étaient les suivantes.

Code : VB.NET
1
2
3
4
5
6
7
8
'Récupération du premier nombre
        Do
            Console.WriteLine("Entrez la première valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un double
        Valeur1 = ValeurEntree

Nous allons refaire cette partie en utilisant le type object.
Déclarons notre variable de type objet :

Code : VB.NET
1
Dim MonObjet As Object

Nous allons devoir tourner dans notre boucle tant qu'il ne s'agit pas d'un nombre.

Il est tout à fait possible d'utiliser la fonction IsNumeric() dans le cas d'un object, mais il existe aussi TypeOf MonObjet Is Integer qui renvoie un booléen.
Une fois placé dans une boucle, on retrouve notre programme sous une autre forme :

Code : VB.NET
1
2
3
4
5
6
7
Dim MonObjet As Object
Do
    Console.WriteLine("Entrez la première valeur")
    MonObjet = Console.ReadLine()
    'Tourne tant que ce n'est pas un nombre
Loop Until IsNumeric(MonObjet)
MonObjet = CInt(MonObjet)

Cela revient au même que le code précédent, hormis que l'on n'utilise qu'une seule variable.

Lorsque, par exemple, vous castez un object en integer, vérifiez bien qu'il n'y a que des nombres à l'intérieur (comme les string, quoi).
En résumé, je ne vous conseille vraiment pas d'utiliser ce type, des erreurs de conversion de type pouvant très vite être oubliées.

Les MsgBox et InputBox

Deux petites choses qui peuvent également vous aider : les MsgBox et les InputBox.
Image utilisateur

Sur le côté droit, vous pouvez voir une MsgBox sous sa forme la plus basique.
Image utilisateur

Et, juste en dessous, une InputBox.

À quoi ça sert ?


Première question... Eh bien, diverses utilisations peuvent en être faites, puisqu'elles seront utilisables du côté visuel également.

Les MsgBox peuvent signaler une erreur, demander une confirmation, etc. Les InputBox, quant à elles, peuvent être utilisées dans des scores par exemple, pour demander le nom du joueur.

Beaucoup d'arguments existent pour les paramétrer, je vais vous les expliquer.

La MsgBox



Les paramètres


Image utilisateur


Voilà la liste des arguments. Pas de panique, il n'y en a que trois !
Je vais vous les décrire :

  1. Prompt : message qui apparaîtra dans la MsgBox.
  2. Buttons : type de boutons à utiliser (style de la boîte).
  3. Title : titre de la boîte.

Pour ce qui est du deuxième argument — les boutons à utiliser —, lorsque vous êtes sur le point d'entrer cet argument, une liste s'offre à vous : c'est cette liste qu'il vous faut utiliser pour trouver votre bonheur.

Voici divers exemples de style.

MembreValeurDescription
OKOnly 0 Affiche le bouton « OK » uniquement.
OKCancel 1 Affiche les boutons « OK » et « Annuler ».
AbortRetryIgnore 2 Affiche les boutons « Abandonner », « Réessayer » et « Ignorer ».
YesNoCancel 3 Affiche les boutons « Oui », « Non » et « Annuler ».
YesNo 4 Affiche les boutons « Oui » et « Non ».
RetryCancel 5 Affiche les boutons « Réessayer » et « Annuler ».
Critical 16 Affiche l'icône « Message critique ».
Question 32 Affiche l'icône « Requête d'avertissement ».
Exclamation 48 Affiche l'icône « Message d'avertissement ».
Information 64 Affiche l'icône « Message d'information ».
DefaultButton1 0 Le premier bouton est le bouton par défaut.
DefaultButton2 256 Le deuxième bouton est le bouton par défaut.
DefaultButton3 512 Le troisième bouton est le bouton par défaut.
ApplicationModal 0 L'application est modale. L'utilisateur doit répondre au message avant de poursuivre le travail dans l'application en cours.
SystemModal 4096 Le système est modal. Toutes les applications sont interrompues jusqu'à ce que l'utilisateur réponde au message.
MsgBoxSetForeground 65536 Spécifie la fenêtre de message comme fenêtre de premier plan.


Les numéros indiqués correspondent aux ID, que vous pouvez cumuler. En gros, si vous souhaitez que votre boîte bloque le système et que l'on doive y répondre avant de continuer, avec une icône « Message critique » et des boutons « OK − Annuler », il faut que vous tapiez… 4096 + 1 + 16 = « 4113 ».

Voici donc le code correspondant, les Chr(13) représentant des retours à la ligne :

Code : VB.NET
1
MsgBox("Je suis une MsgBox qui bloque votre système tant que vous n'avez pas répondu" & Chr(13) & " J'ai l'icône d'une croix rouge (critical) et mes boutons sont : Ok / Annuler" & Chr(13) & "Je vous souhaite un agréable vol sur notre compagnie ...", 4113, "Ma boiboitte")

Cela donne ce résultat :

Image utilisateur


Pour le moment, c'est bon ? :lol:

Le retour


Passons à la valeur de retour !

Les boutons sur lesquels on clique ne renvoient pas tous la même valeur :

  1. OK → 1
  2. Cancel → 2
  3. Abort → 3
  4. Retry → 4
  5. Ignore → 5
  6. Yes → 6
  7. No → 7

Un petit If devrait vous permettre d'effectuer une action précise en fonction de ce que l'utilisateur a entré !

InputBox



Les paramètres


Les arguments de l'InputBox sont un peu moins ennuyeux...

Image utilisateur


Les arguments ne sont donc pas difficiles à retenir :

  1. Le Prompt, comme pour la MsgBox.
  2. Le titre de la fenêtre.
  3. La valeur par défaut entrée dans le champ à remplir.
  4. La position de la boîte en X.
  5. La position de la boîte en Y.

Image utilisateur


Comme vous pouvez le voir sur le dessin que j'ai fait (ou plutôt, essayé de faire... :p ), l'origine du repère se situe en haut à gauche. Si vous entrez « 0 » pour les positions X et Y, alors la boîte se retrouvera en haut à gauche ; pour la laisser centrée, ne mettez rien.

Le retour


Cette fois, la valeur de retour n'est pas forcément un nombre : cela peut être une chaîne de caractères ou toute autre chose que l'utilisateur a envie d'écrire.

Voilà pour les Box, c'est fini !

Q.C.M.

Est-ce ce code est valide :
Code : VB.NET
1
2
Const LONGEURTABLEAU As Integer = 10
LONGEURTABLEAU = 20
Le mot-clé de définition d'une structure est ?
Un for each sur "Bonjour, je m'appelle Thomas" s'arrêtera où ?
Dans le second argument d'une MsgBox, de quelle valeur ai-je besoin pour une fenêtre d'informations avec un bouton Ok et un bouton Annuler ?

Statistiques de réponses au QCM

Chapitre précédent Sommaire Chapitre suivant

Partager

14 commentaires pour "Les inclassables"
Note moyenne : 3.60 / 4 (543 votes)
Pseudo Commentaire
Hors ligne armion # Posté le 26/11/2010 à 17:43:04

superbe tuto.
seulement j'aurais bien aimer que tu nous aprenne comment exploiter le resultat des messages box pour que si par exemples la personne clique sur ok on reinitialise une variable et nn si elle clique sur annuler.
Hors ligne matthieu35 # Posté le 25/01/2011 à 21:56:15
PUDDI PUDDI ~ Giga PUDDI !
Avatar

Études : INSA Rennes

Sympa le tuto, même si je l'ai lu par pure curiosité, étant déjà plutôt calé en VB.NET.

C'est pour cette dernière raison que je tiens à signaler que la fonction IIf est, justement, une fonction, et non un élément du langage.
De ce fait, tous les paramètres qui lui sont envoyés sont évalués.

Pour s'en assurer, on peut tester ceci :

Code : VB.NET
1
2
3
Dim matin as Boolean = True

IIf(matin, MsgBox("Bonjour"), MsgBox("Bonsoir"))

On pourrait légitimement s'attendre à voir seulement s'afficher "Bonjour".
Eh bien, non, les deux MsgBox sont affichées tour à tour.

Je sais que cette utilisation de IIf est affreuse, c'était juste pour l'exemple.   :-°

Une utilisation plus courante et bien plus légitime de IIf est celle-ci :

Code : VB.NET
1
2
3
4
5
Dim tab1 As Integer() = {0, 2, 4, 6, 8, 10}
Dim tab2 As Integer() = {1, 3, 5, 7}

Console.WriteLine(IIf(tab1.Length > 4, tab1(4), "Tableau ""tab1"" trop petit"))
Console.WriteLine(IIf(tab2.Length > 4, tab2(4), "Tableau ""tab2"" trop petit"))

On exécute, et on voit bien s'afficher "8" en premier, jusque là tout va bien.
Mais... à la dernière ligne, une erreur IndexOutOfRangeException est levée ?!   :o
Pourtant je lui avais bien demandé de m'afficher « Tableau "tab2" trop petit » si sa longueur n'était pas supérieure à 4...

Eh oui, tab2(4) est quand même évalué, alors que sa valeur n'est pas définie.
C'est la source de bien des erreurs, et c'est pour ça qu'on a inventé... l'élément de langage If !   :)

If(TestExpression, TruePart, FalsePart) est l'exact équivalent de la condition ternaire en C et les autres langages C-like, c'est-à-dire :

Code : C
1
TestExpression ? TruePart : FalsePart


Son avantage par rapport à IIf, c'est que seul le paramètre retourné selon la véracité de TestExpression est évalué.

Par exemple, le code précédent en utilisant If à la place de IIf fonctionne comme prévu :

Code : VB.NET
1
2
3
4
5
Dim tab1 As Integer() = {0, 2, 4, 6, 8, 10}
Dim tab2 As Integer() = {1, 3, 5, 7}

Console.WriteLine(If(tab1.Length > 4, tab1(4), "Tableau ""tab1"" trop petit"))
Console.WriteLine(If(tab2.Length > 4, tab2(4), "Tableau ""tab2"" trop petit"))

On obtient comme résultat :
Code : Console
8
Tableau "tab2" trop petit



tl;dr : Utilisez If() à la place de IIf() afin d'éviter les mauvaises surprises.   ;)
Hors ligne Garouda # Posté le 20/04/2011 à 10:40:39

Quand j'ai commencé à programmer en VBA, suivant ce que les bouquins de l'époque expliquaient (+/- 1995) je déclarais toutes mes variables au niveau module. Aujourd'hui, je ne déclare pratiquement plus aucune variable au niveau module mais au niveau procédure (Sub ou Function) Si j'ai besoin de "trimballer" une variable, j'utilise les arguments. J'adore utiliser ByRef, c'est super puissant. Par contre je résiste toujours à la tentation de déclarer une variable au beau milieu du jeu de quilles. Je ne dois jamais aller bien loin, car je ne déclare quasi pas de variables au niveau module, je vais donc au début de ma Sub ou Function qui n'est jamais longue comme un roman de Proust.
Je bannis la déclaration "Public", ma version de l'encapsulation...
On en est à la console, mais j'ajouterais que pour passer une valeur d'une feuille à une autre, je la stocke dans un tag et je m'y réfère par frmMaFeuille.lblEtiquetteXYZ.Tag ou je l'y envoie par un argument. Pas de variables qui traînent dans la nature. Je n'ai encore rien fait en .Net, c'est pour cela que je suis ce tuto, très bien fait comme quasi tout sur ce site!
Hors ligne Garouda # Posté le 20/04/2011 à 11:07:16

Pour info Dim MaTante as Object existe en VB6, ce n'est pas propre à VB.Net
par exemple, pour travailler en Excel depuis VB6:
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim xlRange As Object etc...

Autre remarque au niveau des Structures, je trouve cela lourd d'emploi et préfère un tableau à 2 dimensions.
Petit inconvénient, il faut se souvenir que 0 correspond à ID, 1 à Auteur etc... mais en contrepartie, on peut "jongler" avec le tableau. La structure est moins abstraite, je le reconnais, mais une fois que l'on sait se servir de tableaux multi-dimensionnels, on ne peut plus s'en passer.
Hors ligne Mudarou # Posté le 12/03/2012 à 11:49:43

Il y a un truc que je n'ai pas compris avec les structures:
J'ai voulu en déclarer une dans le Sub Main() mais ça n'a pas marché, j'ai essayé en dehors du Sub Main() et ça a marché!

Donc je voulais savoir: comment ça marche exactement? pour les déclarer et s'en servir comment on fait?
Parce que j'ai vraiment pas compris là :/

Voir tous les commentaires