|
Rappel : Ce cours est enseigné dans la |
||||||||||||||||||||||||||||||||||||||||||||||||||
Il existe sous Windows deux sortes de cases :
Illustrations :
Moralité, avant de mettre des cases et
d’écrire le code qui s’y rapporte, il faut bien se demander de quel type
de cases on a besoin.
Une fois ce préambule posé, il n’y a pas
de problèmes particuliers, hormis que pour des
cases d'option, il faut toujours créer le Frame avant de poser des cases à
l’intérieur de ce Frame. Dans le cas contraire, le langage ne
reconnaîtra pas les cases comme faisant partie du même ensemble, et elles
auront un comportement erratique.
Sinon, la propriété la plus intéressante d’une case est de
loin celle qui nous permet de savoir si elle
est cochée ou non. Cette propriété s’appelle
Value.
Comme toute propriété, Value peut être
utilisée en écriture (pour initialiser telle ou telle case au moment où
elle arrive à l’écran) ou en lecture (pour tester quelle case a coché
l’utilisateur, et accomplir du coup un traitement ou un autre).
Dans les corrigés de ces
exercices, on vous assène que le code est lourd et maladroit. Pourtant,
c'est le seul que vous êtes pour le moment en état de produire ! Mais
c'est pour vous mettre l'eau à la bouche : attendez un peu la suite, et
vous allez voir ce que vous allez voir...
Avec les deux exercices qui précèdent, on constate un alourdissement considérable
du code, qui devient redondant pour un certain nombre d'objets.
Cela tient au fait que jusqu'à présent, nous avons toujours considéré que chaque
contrôle était un objet complètement indépendant de ses congénères. Cela
se manifestait de deux manières :
Mais cette stratégie induit lors de certains programmes une lourdeur qui ne vous aura pas
échappé. Lorsque plusieurs objets de même type remplissent des tâches
voisines, voire semblables (cf. les deux exercices précédents), on se
retrouve avec une flopée de procédures événementielles
(une par objet, parfois davantage) qui se ressemblent beaucoup,
voire qui sont carrément semblables.
La création d’un groupe de contrôles a pour but
d’alléger tout ceci. Comment ça marche, me direz-vous ? Eh bien voici.
Lors de la création des contrôles
(mettons, une série de quatre cases à cocher),
on procède dorénavant par copier-coller, en prenant soin, s'il s'agit de cases
d'options, que le collage s’effectue bien au sein du Frame (sinon, elles ne
marcheront pas correctement ensemble). A la question
"souhaitez-vous créer un groupe de contrôles?", on répond sans réserves
par l’affirmative.
Dès lors, les quatre objets ainsi créés seront en fait des membres d’un même groupe.
En Français, cela signifie que ces quatre objets porteront le même nom
(Name) mais affublé d’un Index
qui servira à les identifier individuellement. Tout cela rappelle furieusement les tableaux, hein ?
C'est bien normal, puisque c'en est.
Si j’osais une métaphore ailée (mais non filée), je dirais que
le groupe est au contrôle ce que le tableau est à la
variable simple. Limpide, non ? J'ajoute pour conclure que
Index est une propriété – c'est logique – de tout élément d'un groupe de
contrôles, définissant son indice (propriété à ne surtout pas confondre
avec TabIndex,
qui définit son ordre dans la tabulation, ce qui n'a rien à voir avec la choucroute).
Donc, résumons nous.
Si on a créé un groupe de 4 contrôles de classe Checkbox
le nom par défaut de ce groupe sera Check1.
Rebaptisons-le CaseCarrée pour plus de clarté. On aura alors
CaseCarrée(0), car l'Index commence à zéro comme pour tout tableau qui se respecte,
CaseCarrée(1), CaseCarrée(2) et CaseCarrée(3).
Si on a un traitement à effectuer sur les quatre cases, on
pourra dorénavant écrire une boucle, par exemple pour décocher tout ça :
For i = 0 to 3
CaseCarrée(i).Value = 0 Next i
Déjà, on se marre bien. Mais c’est encore plus rigolo quand on crée la procédure
associée à ce groupe. Cela produit un intitulé du genre :
Private Sub CaseCarrée_Click (Index as Integer)
End Sub
Eh oui, vous avez bien vu. Cela signifie que dorénavant,
pour un événement donné, il n’y a plus qu’une seule procédure pour
l’ensemble des contrôles du groupe !
Quant à la variable Index, dont vous voyez que Visual Basic la crée automatiquement
en tant que paramètre en entrée de cette
procédure,
elle contient à chaque exécution de la procédure,
l'indice de l'élément du groupe qui vient de déclencher l'événement.
Ainsi par exemple, si au sein de cette procédure,
on a besoin de savoir quelle case a été cliquée,
il suffit de tester la variable Index,
qui, en l'occurrence, vous l’aurez deviné, peut valoir de zéro à trois.
A noter qu'Index est ici une simple variable, à ne pas confondre avec la propriété
Index des éléments des groupes de contrôles. Donc, si ce nom de
variable vous semble trop lourdingue, rien ne vous interdit de le modifier.
Formulons tout cela d'une traite : Index est le nom
par défaut du paramètre
en entrée pour la procédure événementielle, paramètre qui prend à chaque
exécution la valeur de la propriété Index du membre du groupe qui a
déclenché cette exécution.
Avec tout cela, certains programmes vont pouvoir s'alléger considérablement.
Moralité, en VB, c’est comme pour tout le reste, pour pouvoir être
fainéants, devenons compétents.
Les exercices liés aux groupes reprennent ceux que l'on vient
d'effectuer à propos des cases. Mais à présent, ils doivent bien sûr
être programmés très différemment... Les sources présentées ici
donnent la solution employant la technique des groupes.
Pour les Options Onéreuses, il y a au moins deux moyens d'éviter une fastidieuse série de tests. A Table et Cinq à la suite sont deux autres exemples simples du gain de temps que peuvent permettre les groupes. A signaler que pour le Cavalier Déchaîné (déjà nettement plus difficile), il existe plusieurs astuces (plus ou moins méchantes) pour s'épargner de longs fragments de code répétitifs. Que voulez-vous, quand on aime les vicieusetés algorithmiques, on ne se refait pas.
3.1 deux contrôles de listes
Les listes classiques dans Windows peuvent posséder ou non deux caractéristiques.
Une liste peut donc prendre quatre têtes, selon qu’elle est modifiable ou non,
déroulante ou non ("chez les papous, y a les papous à poux et les papous
pas à poux, etc.")
VB fournit deux contrôles de liste :
Le gag (ce Bill Gates, quand même, quel rigolo), c’est qu’en réalité, la liste dite
modifiable est aussi une liste déroulante… Alors, pour résumer la situation,
voici un petit récapitulatif de ce qu’il faut utiliser :
Propriétés indispensables :
Pour récupérer sous forme de texte l’élément actuellement sélectionné dans la
liste appelée Produits, on écrira donc le code suivant :
NuméroProduit = Produits.ListIndex
NomProduit = Produits.List(NuméroProduit) MsgBox "Vous avez choisi le produit : " & NomProduit
Ou plus directement :
NomProduit = Produits.List(Produits.ListIndex)
MsgBox "Vous avez choisi le produit : " & NomProduit
Toutefois, il faut noter que les contrôles ComboBox
nous simplifient grandement la vie, puisqu'à la différence des
ListBox, ils nous proposent directement une propriété
Text. Ainsi, si Produits est un contrôle
ComboBox, et uniquement dans ce cas,
on pourra écrire :
NomProduit = Produits.Text
MsgBox "Vous avez choisi le produit : " & NomProduit Autres propriétés intéressantes :
Méthodes à connaître
Nous découvrons avec les contrôles ListBox et
ComboBox des méthodes qu'il est indispensable
de connaître afin de gérer des objets de type liste :
Comme à l'accoutumée, voilà deux petits exercices pour se mettre tout cela en
tête.
3.2 Trois autres contrôles pour des usages spéciaux
Il n'est pas rare que dans une application, on doive permettre à l'utilisateur de
naviguer dans le disque dur, les répertoires, les fichiers, etc. (comme
dans la commande Fichier – Ouvrir de tout logiciel).
Pour réaliser cela, on va avoir recours à trois contrôles supplémentaires,
spécialisés, dont le rôle est de reproduire des outils familiers sous
Windows :
Illustration :
La présence de ces contrôles soulage votre tâche, mais ne vous épargne toutefois pas
totalement d’écrire un chouïa de code, afin de les faire fonctionner ensemble.
Ces trois objets étant des cas particuliers
de contrôle liste, s’y appliquent éventuellement
List, Listcount et Listindex.
Mais pour gérer la mise à jour de ces contrôles les uns en fonction des autres,
les propriétés suivantes sont indispensables (et suffisantes) :
Allez, un peu de pratique n'a jamais fait de mal à personne :
|