Touche d'accès / Clé d'accès (accesskey) sur un bouton ou une checkbox

Bonjour à tous,
au risque de paraître complètement niais, j’aimerais savoir s’il existe un moyen dans 4D de faire la même chose qu’en visual basic, à savoir : souligner, dans le libellé d’un bouton ou d’une checkbox, la lettre qui correspond au raccourci clavier qui déclenche ce bouton (ou qui coche/décoche cette checkbox)
En VB, il suffit pour cela de mettre un “&” devant la lettre en question, dans le titre du bouton ou de la checkbox. J’ai bien tenté ça dans 4D, mais sans résultat.
Comment faites-vous, autrement, pour signaler de manière explicite à vos utilisateurs quels sont les raccourcis claviers pour chaque bouton, checkbox, etc. de votre interface graphique ??
Merci par avance pour votre aide et vos lumières !

Salut Pierre-Aurélien,
il te faut des macrons souscrits. :joy:

Bon, en fait c’est pas une blague, en unicode tu as des caractères mais aussi des trucs qu’on peut leur ajouter. Les accents, par exemple : “e”+"`"=“è”. Je ne sais pas si c’est ça qu’on appelle des glyphes, donc je dis truc, et parmi ces trucs, tu as de quoi barrer, souligner, etc. Je te mets une méthode en exemple, je pense que les commentaires suffiront mais n’hésite pas si ce n’est pas clair.

  //Str_strike (txt_t {;strikeChar_l) -> txt
  //$0 = texte $1 barré
  //$2 optionnel parmi
  // U+0331 macron souscrit (U+0331) : m̱a̱c̱ṟo̱ṉ s̱o̱u̱s̱c̱ṟi̱ṯ
  // U+0332 trait souscrit (U+0332) : t̲r̲a̲i̲t̲ s̲o̲u̲s̲c̲r̲i̲t,
  // U+0335 “combining short stroke overlay” individually struck out characters * A̵B̵C̵D̵ ̵e̵f̵g̵h̵i̵
  // U+0336 “combining long stroke overlay” unbroken stroke across the text * A̶B̶C̶D̶ ̶e̶f̶g̶h̶i̶
  // U+0337 “combining short solidus overlay” diagonally struck out letters * A̷B̷C̷D̷ ̷e̷f̷g̷h̷i̷
  // U+0338 “combining long solidus overlay” longer diagonal strokes * A̸B̸C̸D̸ ̸e̸f̸g̸h̸i̸
  //cf http://forums.4d.com/Post/FR/27649297/1/27651804#27651531
C_TEXT($0)
C_TEXT($1)
C_LONGINT($2)
C_TEXT($in_t)
C_TEXT($out_t)
C_LONGINT($strike_l)
C_LONGINT($i_l)
  //_
$in_t:=$1
$out_t:=""
$strike_l:=0x0337  //default
If (Count parameters>1)
	  //U+0332
	ARRAY LONGINT($line_al;0)
	APPEND TO ARRAY($line_al;0x0335)
	APPEND TO ARRAY($line_al;0x0335)
	APPEND TO ARRAY($line_al;0x0336)
	APPEND TO ARRAY($line_al;0x0337)
	APPEND TO ARRAY($line_al;0x0338)
	$strike_l:=$2
End if 
$strike_t:=Char($strike_l)
C_COLLECTION($char_c)
$char_c:=New collection
For ($i_l;1;Length($in_t))
	$char_c.push($in_t[[$i_l]]+$strike_t)
End for 
$out_t:=$char_c.join("")
$0:=$out_t
1 Like

C’est pas très heureux, ce double ascenseur horizontal dans l’échantillon de code.
Ça se soigne ?

Bonjour Arnaud,
j’en suis effectivement arrivé à la même conclusion que toi :confused:
Du coup je me suis fabriqué une méthode qui rajoute automatiquement des diacritiques (je crois que c’est comme ça que ça s’appelle) “souligné” sur la lettre qui correspond au raccourci clavier :

  // Accesskeys à la Visual Basic:

  // $1 nom du ou des objets sur lequels on veut souligner 
  // la 1ere lettre correspondant au raccourci clavier

Si (Nombre de parametres>0)
$critere_objets:=$1
Sinon 
$critere_objets:="@"
Fin de si 

TABLEAU TEXTE($objets;0)
FORM LIRE OBJETS($objets)
Boucle ($i;1;Taille tableau($objets))
Si ($objets{$i}=$critere_objets)
OBJET LIRE EQUIVALENT CLAVIER(*;$objets{$i};$touche;$modifiers)
Si ($touche#"")
$titre:=OBJET Lire titre(*;$objets{$i})
$pos:=Position($touche;$titre;1;$longueurTrouvee)
Si ($pos>0)
OBJET FIXER TITRE(*;$objets{$i};Sous chaine($titre;1;$pos)+Caractere(0x0332)+Sous chaine($titre;$pos+1))
Fin de si 
Fin de si 
Fin de si 
Fin de boucle 

Il suffit d’appeler cette méthode depuis la méthode du formulaire, et le tour est joué.

Mince alors, comment tu as fait pour que l’indentation soit conservée dans ton code ?
J’ai juste fait un copier/coller de mon code depuis 4D vers le forum, et ça m’a fait sauté toutes les tabulations…

J’ai copié collé depuis une v17, il me semble que les versions antérieures ne conservent pas les tabulations quand on copie, par exemple quand on veut faire un diff avec BBEdit entre du code v17 et une autre version, il faut chercher remplacer sinon ça énerve. C’est pas ça ?

Sinon, tant qu’à comparer nos errements à essayer de coller du code, le mien arbore 2 ascenseurs horizontaux, c’est immonde. Tu le vois de la même façon ? Et pourquoi le tien n’en a qu’un ? (fit-il, jaloux)

ah oui, c’est ça : j’ai copié/collé depuis une v13 (car le code que j’ai donné ci-dessus fonctionne à partir de v13, donc j’ai voulu le tester en conditions réelles sur une v13)

Sinon, en ce qui concerne les deux ascenseurs, que je vois moi aussi, il y a la même chose sur mon bout de code que sur le tien.

Bon, on ne voit pas la même chose, donc. J’ai regardé avec FF (usuellement je suis scotché à safari), j’ai vu brièvement 2 puis c’est revenu à 1. Très bizarre.

Un autre truc super pénible, l’ascenseur vertical n’est opérationnel que s’il est visible, et n’est visible que si l’horizontal est au taquet à droite.

J’ai fait une demande pour que ce soit amélioré.

Nouvelle version du code : ajout d’un second paramètre (optionnel) qui permet de faire le lien par ex. entre le nom des boutons invisibles et le nom des libellés associés à ces boutons :


 // Accesskeys à la Visual Basic:

 // $1 (facultatif) nom du ou des objets sur lequels on veut souligner 
 // la 1ere lettre correspondant au raccourci clavier (par défaut, "@")

 // $2 (facultatif) expression régulière de type rechercher/remplacer à
 // appliquer pour retrouver l'objet associé dont il faut changer le titre
 // (par défaut, ""). => fait appel au Regex component de V. DE LACHAUX.
 // Cela peut servir si par ex. vous ciblez dans $1 des boutons invisibles,
 // et vous souhaitez changer le titre des libellés associés à ces boutons.
 // Il faut alors passer dans $2 la regex qui permet de retrouver le nom
 // du libellé à partir du nom du bouton invisible. Par ex:
 //     $1 = "Bouton@" et $2 = "s/Bouton/Label/"

 // Requires: 4Dv13 or later

Si (Nombre de parametres>0)
$critere_objets:=$1
Sinon 
$critere_objets:="@"
Fin de si 

TABLEAU TEXTE($objets;0)
TABLEAU POINTEUR($variables;1)
FORM LIRE OBJETS($objets)
Boucle ($i;1;Taille tableau($objets))
Si ($objets{$i}=$critere_objets)
OBJET LIRE EQUIVALENT CLAVIER(*;$objets{$i};$touche;$modifiers)
Si ($touche#"")
Si (Nombre de parametres<2)
$objet_associe:=$objets{$i}
Sinon 
$objet_associe:=""
TABLEAU TEXTE($split_segments;0)
Si (Rgx_SplitText ("^s/|/";$2;->$split_segments)=0)
$pos:=1
Si ($split_segments{$pos}="")
$pos:=2
Fin de si 
$taille:=Taille tableau($split_segments)
Si (($taille=($pos+1)) | (($taille=($pos+2)) & ($split_segments{$taille}="")))
$objet_associe:=$objets{$i}
Si (Rgx_SubstituteText ($split_segments{$pos};$split_segments{$pos+1};->$objet_associe)=0)
$variables{1}:=OBJET Lire pointeur(Objet nommé;$objet_associe)
Sinon 
$objet_associe:=""
Fin de si 
Fin de si 
Fin de si 
Fin de si 
$titre:=OBJET Lire titre(*;$objet_associe)
Si (($titre="") & Non(Nil($variables{1})))
Si (Type($variables{1}->)=Est un texte)
$titre:=$variables{1}->
$objet_associe:=""
Fin de si 
Fin de si 
$pos:=Position($touche;$titre;1;$longueurTrouvee)
Si ($pos>0)
$titre:=Sous chaine($titre;1;$pos)+Caractere(0x0332)+Sous chaine($titre;$pos+1)
Si ($objet_associe#"")
OBJET FIXER TITRE(*;$objet_associe;$titre)
Sinon 
$variables{1}->:=$titre
Fin de si 
Fin de si 
Fin de si 
Fin de si 
Fin de boucle

Nécessite 4Dv13 ou ultérieur, + le composant Regex component de Vincent DE LACHAUX.