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 5
D'autres contrôles
Nous pouvons maintenant reprendre le cours de nos pensées
et nous livrer à notre activité favorite : farfouiller dans la boîte à
outils pour en sortir tous les jolis jouets qu'elle contient.
1. La classe Textbox
La Textbox, c'est par
définition la zone de prédilection pour que l'utilisateur puisse
saisir des informations. Il n'y a en fait pas grand chose à en dire,
sinon que la Textbox partage avec les autre classes la plupart des
propriétés standard dont nous avons déjà parlé à plusieurs reprises.
Un détail qui a toutefois son importance : la propriété Text d'une
Textbox désigne ce qui se trouve à l'intérieur de la Textbox.
Autrement dit, ce qu'aura saisi l'utilisateur. Par conséquent, nous
pouvons en déduire que tout ce que saisit l'utilisateur via une
Textbox, même lorsqu'il s'agit de nombres, est traité par VB comme une
chaîne de caractères. Naturellement, dans certaines circonstances, des
conversions vont s'imposer...
Je mentionne toutefois quelques propriétés typiques
de la classe Textbox, qui valent le coup d'être signalées :
Tout ceci est plus que suffisant pour que vous vous
dérouilliez les neurones avec quelques exercices :
2. La classe Richtextbox
Il s'agit d'une classe fille
de la classe Textbox, qui hérite donc de toutes ses propriétés... tout en
possédant quelques attributs supplémentaires. Et pas des moindres,
puisque les contrôles RichTextBox, sont pour leur part capables de gérer
un contenu au format rtf : c'est-à-dire qu'ils mémorisent de nombreux
attributs de formatage, tels que le gras, l'italique, le souligné,
l'espacement des paragraphes, et autres fanfreluches du même tonneau.
Naturellement, cette bête est directement prédestinée à gérer des
simili-traitements de texte, ou du moins des zones dans lequel l'aspect du
texte est important.
Je ne m'étendrai pas davantage sur cette classe, bien qu'elle possède
pléthore de fonctionnalités, ou plutôt, justement
à cause de cela. Cela nous entraînerait trop longtemps dans des
détails
techniques qui restent d'une importance mineure quant aux mécanismes
essentiels du langage. Et si un jour vous avez besoin d'utiliser une
RichTextBox, vous
trouverez toutes les informations utiles dans la doc.
Alors zou, au suivant.
3. La classe Checkbox
La Checkbox, c'est cette charmante petite case carrée que vous
connaissez bien :
Passons rapidement sur les propriétés que les Checkbox partagent
avec la plupart des autres classes, pour en venir à celle qui nous intéresse
au premier chef : celle qui nous permet de savoir si une Checkbox est
cochée
ou non (si nous l'utilisons en lecture), ou de faire en sorte que Checkbox
soit cochée ou non (si nous l'utilisons en écriture). Il s'agit de
Checked : propriété booléenne, qui vaut naturellement True lorsque la
case est cochée et False lorsqu'elle ne l'est pas.
Remarque
anticipatrice (mais de peu) :
Les Checkbox sont souvent rassemblées dans un conteneur, qui les présente comme faisant partie d'un même groupe. Cette présentation est purement visuelle, pour nepas dire décorative : elle ne possède aucune espèce d'effet sur le fonctionnement de la Checkbox. Celle-ci est toujours individuelle et indépendante de ses éventuelles congénères. Il nous faut enfin mentionner le principal événement
associé aux CheckBox : il s'agit de CheckChanged, qui est déclenché
chaque fois que la
case est cochée ou décochée.
Remarque
fine n°1 :
On remarquera la différence subtile, mais réelle, entre les événements CheckChanged et Click, appliqués à une Checkbox.
Remarque
fine n°2 :
Cette remarque est censée ne rien vous apprendre, car c'est un problème que nous avons déjà rencontré à plusieurs reprises, mais sait-on jamais... Il faut bien évidemment distinguer soigneusement le fait de récupérer à un moment donné l'état d'une case à cocher, ce qui se fait via la propriété Checked, dans n'importe quelle procédure, et le fait de vouloir que l'application réagisse à un changement d'état d'une case ce qui se fait en créant la procédure associée CheckedChanged. Les deux problèmes - et les deux solutions - n'ont rien à voir l'un avec l'autre. Ca va sans dire, mais ça va mieux en le disant. Remarque
fine n3 :
Lorsqu'une case Checkbox déclenche un événement CheckChanged, cela signifie que l'état de la case a changé. Mais rien n'indique donc si c'est parce qu'elle vient d'être cochée ou décochée... Si on a besoin de le savoir, on n'échappera pas à faire un test sur la propriété Checked. Et maintenant, un tour de vice
Dans 99,99% des cas, tout cela suffira à notre bonheur. Oui, mais voilà, j'ai décidé de vous
embêter, et de pousser le contrôle dans ses retranchements. On peut en effet obtenir d'une
CheckBox qu'elle fonctionne non sur deux, mais sur tros jambes, et qu'en plus
des états « cochée » et « décochée », la case puisse aussi être « à moitié cochée »
(cette situation est généralement censée indiquée que certains sous-élements correspondant à
la Checkbox sont actifs, et d'autres non :
Pour pouvoir gérer cette situation nouvelle, on a
recours à deux autres propriétés supplémentaires :
Remarque « utilisons notre science toute fraîche » :
Vous n'aurez bien sûr pas manqué de remarquer que Checked, Unchecked et Indeterminate étaient des membres d'énumération, et donc qu'ils dissimulaient en réalité trois nombres entiers.
4. Les classes Radiobutton, GroupBox et Panel
Trois d'un coup, vous vous rendez compte ? Mais ce ne sont pas les plus
pénibles. Voilà tout de suite une illustration de notre propos :
Le RadioButton, dans sa forme classique, n'est
donc autre que la célèbre petite case ronde. Par définition, cette case ne fonctionne qu'en
groupe, conjointement avec d'autres, puisque par principe, une seule des
cases d'un même groupe peut être cochée à la fois. Dit autrement, cocher
une case d'un groupe décoche automatiquement les autres cases du groupe.
Ce groupe est défini par ce qu'on appelle un conteneur, qui peut au
choix être un objet de la classe GroupBox ou Panel. La différence
entre les deux n'est pas furieuse ; un Panel,
c'est simplement un conteneur sans texte et sans bordure, donc invisible
(mais néanmoins indispensable pour que les cases fonctionnent correctement en groupe).
Un RadioButton appartient
donc au même groupe qu'un autre Radiobutton s'il
est placé dans le même conteneur (généralement, un GroupBox).
Ce simple fait suffit à faire marcher les Radiobutton les uns avec
les autres. Il n'y a pas une seule ligne de code à écrire pour cela.
La propriété la plus utilisée du Radiobutton
est évidemment Checked, propriété booléenne qui renvoie (ou définit) si un bouton
radio est coché ou non.
Encore une astuce pas chère pour tromper son monde
Les RadioButton peuvent parfois prendre une drôle de tête, comme dans cet exemple :
Ici, nous avons un poste de radio (c'est de circonstance), où nous
pouvons, via deux boutons, choisir une gamme de fréquences ou une autre.
Sur l'image ci-dessus, c'est la FM qui est enclenchée.
Eh bien, ce look un peu inattendu est obtenu simplement en réglant la
propriété Appearance de nos RadioButton à Button au lieu de Normal.
Bon, si on se faisait deux petits exos ?
En ce qui concerne Options onéreuses, vous avez toutes les connaissances
pour reproduire l'exécutable. Vos premières tenatives risquent fort d'aboutir à un code lourdingue et répétitif.
Mais si vous utilisez judicieusement certaines connaissances mentionnées dans ce cours, vous pourrez l'alléger
considérablement. En revanche, pour aboutir aux simplifications ultimes, il vous faut disposer de quelques outils
supplémentaires... que nous découvrirons au chapitre suivant, pas avant.
Cette dernière remarque vaut de la même manière pour Sondage. |