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 :
  • Charactercasing : qui permet de convertir d'autorité le contenu en majuscules ou en minuscules
  • Multiline : qui autorise ou non la saisie de plusieurs lignes dans le contrôle
  • Passwordchar : qui permet de convertir d'office, à l'affichage uniquement, le texte tapé en un caractère (typiquement, l'astérique, pour des mots de passe)
  • Readonly : propriété booléenne qui interdira éventuellement à l'utilisateur de modifier le contenu de la Textbox.
Tout ceci est plus que suffisant pour que vous vous dérouilliez les neurones avec quelques exercices :
 
Exercice
Exécutable
Sources
Calculator
Agglutinator
Convertisseur
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.
  • Click ne se produira qu'en cas d'action sur la case via la souris (comme qui dirait, un clic).
  • CheckChanged, en revanche, se produira en cas de clic de souris, mais aussi si une ligne de code ou la frappe de la touche Espace a modifié l'état de la case.
Il faut donc bien réfléchir avant de choisir l'événement que l'on souhaite gérer - sachant tout de même que la logique veut que dans l'immense majorité des cas, il s'agit de CheckChanged
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 :
  • Threestate : propriété booléenne, qui indique, dans le cas où elle vaut True, que l'utilisateur a désormais le choix entre trois états et non plus deux. C'est donc cette propriété qui change le fonctionnement de la case.
  • Pour récupérer la valeur, on utilisera alors Checkstate. Cette propriété, à la différence de Checked, n'est pas booléenne, et peut donc faire la différence entre les valeurs Checked, Unchecked et Indeterminate.
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.
Exercice
Exécutable
Sources
Options onéreuses
Sondage