Faq/Base/147/fr
Utilisation de zones de groupe (GroupBox)
Une zone de groupe contient plusieurs boutons radio (boutons d'option) dont un seul pourra être sélectionné par l'utilisateur. L'assistant de création de ces zones de groupe donne le même nom à chaque bouton qu'elle contient ainsi qu'un autre nom à la zone de groupe elle-même. La documentation dit que le fait que le nom soit le même permet à l'application de savoir qu'ils font partis de la même zone de groupe (ce qui n'est plus indispensable avec LibreOffice)… A l'écriture d'une macro, nous voulons savoir quelle bouton l'utilisateur a sélectionné pour déclencher une action ou une autre.
Plusieurs méthodes sont possibles :
1 - A chaque bouton, on associe une procédure Sub différente ;
2 - Malgré ce qui est écrit dans la documentation, et pour LibreOffice seulement en 2023, on peut renommer chaque bouton différemment et ainsi identifier dans le code chacun des boutons. Dans les propriétés de chaque bouton (pour sélectionner un bouton et pas toute la zone de groupe, tenir la touche Ctrl appuyée en cliquant sur le bouton voulu), on trouve la propriété « Nom du groupe » qu'il faut compléter avec le nom de la zone de groupe et qui va permettre de rattacher le bouton à cette zone de groupe. Ainsi, il conserve la fonctionnalité où un seul bouton peut être sélectionné dans le groupe. L'utilisation du navigateur de formulaire (menu Outils) est fortement conseillé pour visualiser les noms des différents éléments. Ensuite pour connaître l'état de chaque bouton (sélectionné ou non), il suffit d'identifier le bouton et d'utiliser la propriété .State du bouton pour orienter la procédure. Exemple :
oBouton1 = oForm.getByName("Bouton1")
If oBouton1.State = 1 then 'le bouton est activé
etc
3 - On laisse les noms des boutons identiques (obligatoire pour OpenOffice en 2023). A ce moment-là, on utilise un artifice pour les repérer : pour chaque bouton, on peut utiliser la propriété « Complément d'information » pour donner un qualificatif différent à chaque bouton, ou son étiquette. Dans le code, on pourra alors faire appel à cette propriété par le mot-clé .Tag pour le « Complément d'information » et .label pour l'étiquette. Dans les exemples de code trouvés sur Internet ou dans le livre de référence sur la programmation de B. Marcelly et L. Godard, une procédure est proposée pour passer en revue les différents boutons et identifier celui qui est sélectionné :
Extrait du code :
unFormulaire = lesFormulaires.getByName("FM1")
unFormulaire.getGroupByName("avisDuClient", opinion())
for each alternative in opinion()
With alternative
MsgBox("Label= " & .Label & chr(13) & _
"Tag= " & .Tag & chr(13) & "Etat= " & .State)
End With
next
Et il est précisé concernant l'instruction getGroupByName : le premier argument est le nom commun à tous les boutons du groupe.
Or, ceci se révèle faux actuellement (avec L.O. 7.3.5) : c'est bien le nom du groupe (pas son étiquette) et non le nom des boutons qui doit être utilisé ! Comme :
unFormulaire.getGroupByName("nomduGroupe", opinion())
Et les lignes suivantes de la procédure récupèrent l'étiquette du bouton (.Label), le complèment d'information (.Tag), et son état -coché ou pas- par .State On peut ensuite déclencher des actions suivant la valeur de ces propriétés.
Ci-joint un fichier exemple conçu sous LibreOffice 7.3 utilisant les méthodes 2 et 3. File:Zone groupe.odb