Une remarque pertinente ? Une critique impertinente ? Un lynchage en règle ? Une invitation sous les tropiques ? Ecrivez-moi ! |
|
Conçu et enseigné tel qu'en lui même, avec pertes, fracas et
humour de qualité supérieure par Christophe Darmangeat dans le M2 PISE du Master MECI (Université Paris 7) |
|
|
Partie 7
Encore et toujours des contrôles
Reprenons à présent notre tour d'horizon des différents
contrôles proposés par VB.Net. Bon, les Button, c'est fait. Les Label
et les Textbox, on les a vues aussi, hmmm... les cases, ça y est... que
reste-t-il ? Oh, tiens, ben oui :
1. La classe Listbox
La Listbox est à l'ensemble des classes de listes ce qu'est la 2CV aux
automobiles : un prototype ancien et basique, mais solide, rustique, et
qu'on a toujours plaisir à voir en service :
La Listbox, par définition :
Les Listbox, nous offrent plusieurs propriétés concernant le
mode d'affichage, dont entre autres :
Et une propriété fondamentale pour son comportement :
En ce qui concerne la gestion des items de la ListBox,
il faut avoir à
l'esprit une chose, de laquelle se déduisent toutes les autres :
Théorème
:
Un item d'une Listbox est une chaîne de caractères, membre de la collection définie par la Listbox. Par conséquent, ce que nous avons appris au chapitre
précédent sur
les collections s'applique de plein droit aux items des Listbox.
Comme quoi, on dira ce qu'on voudra, mais au niveau de l'articulation
pédagogique, on sent bien que ce cours est drôlement bien goupillé et
qu'on a pas affaire à un amateur. Enfin,
moi, ce que j'en dis, hein...
1.1 Gérer la ListBox comme une collection
Pour balayer les éléments d'une Listbox du
premier au dernier, nous pourrons donc utiliser leurs numéros d'indice.
Attention toutefois, la collection définie par une Listbox
possède une syntaxe que nous n'avons pas encore rencontrée, mais qui obéit à une logique certaine.
La Listbox étant un contrôle conteneur, on aurait pu être tenté de
caractériser sa collection par Controls. Oui, mais voilà, elle ne
contient pas des contrôles, mais des éléments (chaînes de caractères). Alors, sa collection est
donnée par la propriété Items (avec un « s »).
Bref, pour mettre tous les éléments de notre ListBox en majuscules, on pourra donc écrire :
Dim i As Integer
For i = 0 To ListBox1.Items.Count - 1 ListBox1.Items(i) = ListBox1.Items(i).ToUpper Next i
Remarque
de bon ton :
Dans une Listbox, les éléments sont numérotés à partir de l'indice zéro, ce qui est cohérent avec le fait qu'il s'agisse d'un contrôle conteneur. On pourra tout aussi bien utiliser la boucle
For Each ... Next, par exemple ici pour récupérer tout le contenu de la
liste dans une seule chaîne appelée Alaqueueleuleu. La variable servant à la boucle sera tout naturellement
de type String :
Dim element As String
Dim MaListe As String = "" For Each element In ListBox1.Items Alaqueueleuleu = Alaqueueleuleu & element Next element On peut, comme dans n'importe quelle collection, ajouter un élément
dans une liste via la méthode Add :
Listbox1.Items.Add("Nouvel élément")
Pour supprimer un élément, on n'a que l'embarras du
choix. La méthode
Remove demandera de fournir l'élément lui-même...
Listbox1.Items.Remove("Midnight Jokers")
...tandis que la méthode RemoveAt demandera
un indice :
Listbox1.Items.RemoveAt(5)
Enfin, Clear procèdera au nettoyage complet de la liste, en
supprimant tous les éléments d'un seul coup d'un seul :
Listbox1.Items.Clear
1.2 Propriétés gérant la sélection
Le but d'une liste, c'est de permettre à l'utilisateur d'en
sélectionner un ou plusieurs items. Cette action de l'utilisateur
affectera deux propriétés à la fois :
On n'a donc que l'embarras du choix pour savoir (ou, plus raremen, pour définir) l'élement
actuellement sélectionn d'une liste. Par son texte ou par son indice, c'est vous qui voyez !
Plus fort : on le disait un peu plus haut, il est possible d'autoriser
l'utilisateur à sélectionner plusieurs éléments à la fois en mettant la propriété SelectionMode
à l'une de ses valeurs multiples (MultiSimple ou MultiExtended). Lorsque c'est
le cas, on récupèrera les résultat via deux autres propriétés, qui cette fois définissent à leur tour des collections (si
vous ne comprenez pas pourquoi, relisez depuis le début, mais tout cela est d'une logique imparable). Ces deux propriétés,
qui font écho aux deux précédentes, sont :
1.3 Évènement(s)
En ce qui concerne les événements, on peut bien sûr associer une
Listbox à l'action Click. Mais ça n'est pas très malin, parce qu'on
peut tout à fait changer une sélection avec son clavier, et pas avec sa souris...
Un événement spécifique est donc disponible, qui ne
se déclenche en cas de changement de l'item sélectionné, quelle que soit la manière dont cela
se produit. Il s'agit de SelectedIndexChanged. Cet événement est à la fois plus
restrictif et plus large que le Click. Plus restrictif, car il ne se
déclenche pas en cas de clic sur un item déjà sélectionné. Plus large,
car il détectera un changement de sélection survenant y compris suite à
une manoeuvre au clavier.
Bon, c'est pas tout ça, mais on va pouvoir utiliser notre science
toute neuve :
Cet exercice n'est pas spécialement facile. Afin de
graduer la difficulté, on pourra commencer par réaliser une première version,
qui ne se préoccupe pas de la multisélection. Une fois que c'est au
point, on introduira la case à cocher, et on modifiera le code là où
c'est nécessaire.
2. La classe Combobox
Il s'agit d'une classe-fille à la fois de la classe Listbox et
de la classe Textbox. Elle en hérite
donc l'essentiel des propriétés. En gros, on peut considérer
qu'une ComboBox,
c'est une liste modifiable et/ou déroulante :
L'aspect de la ComboBox dépend de la valeur donnée
à la propriété DropDownStyle :
Je rappelle que le caractère déroulant
d'une Combobox n'influence que son aspect, alors que son caractère
modifiable influence son comportement (peut-on ou non y entrer
autre chose qu'un item de la liste).
3. La classe CheckedListBox Cette classe est une espèce de croisement
entre la
Listbox et la Checkbox.
De la première, elle hérite
toutes les propriétés hormis celles liées à la
multisélection.
Cette classe
affiche une liste dans laquelle chaque élément
est représenté avec
une case à cocher :
A noter que :
Comme ça, ça a l'air compliqué, mais c'est plus laborieux que
vraiment méchant.
4. La classe ImageList
Ce contrôle n'a aucun intérêt par lui-même. Mais
il peut rendre des services inestimables.
Son rôle consiste à être un tableau d'images pour que d'autres contrôles viennent
puiser dedans. Il
s'agit d'un contrôle invisible. Ce n'est pas le seul,
mais c'est le premier que nous rencontrons. Encore une fois, il
ne sert que
d'espace de stockage. D'ailleurs, lorsque que nous le sélectionnons
dans la boîte à outils, nous voyons tout de suite
qu'il ne se pose pas sur la Form, mais à côté.
On remplit le contrôle ImageList par sa propriété
Images, qui désigne une collection (et à laquelle s'appliquent
donc les méthodes Add et Remove, si on veut en manipuler le contenu
par du code). La propriété ColorDepth permet de régler la qualité
de codage des images en question, et roule Raoul : on accède ensuite aux images que contient ImageList par
la propriété ImageIndex.
Ayé, on a fait le tour de ce petit contrôle. Si on s'en servait ?
Cet exercice fait fonctionner trois contrôles les uns avec les autres :
la liste de cases à cocher pilote la liste déroulante, qui elle-même pilote la liste déroulante, qui elle-même
provoque l'affichage des images. Pour afficher celles-ci, vous aurez besoin du contenr à images ; celui-ci s'appelle
un PictureBox, et la seule propriété qui nous intéresse est celle qui désigne son
contenu, en l'occurrence Image. Une dernière chose : il vous faut les 26 images
des jetons de scrable. Vous les trouverez dans cette archive.
Une dernière chose, avant de vous lancer dans un code compliqué comme une usine réelle à gaz virtuel, si on fait preuve d'un peu d'astuce et qu'on prend les choses par le bon bout, le tout tient en une quinzaine de lignes simples comme bonjour (ou presque). |