Gestion clavier sur listbox

Bonjour à tous.

En gros, je veux tout simplement gérer la frappe clavier sur une listbox non modifiable (IMPORTANT)

En gros mon idée est de pouvoir saisir un buffer de texte et aligner la ligne sur le texte tapé. Admettons une liste complexe à plusieurs colonnes, en tapant les premières lettres on s’aligne sur une des cellules.

Or: malgré les coches avant et après frappe clavier actives, les deux événements ne sont pas détectés. par la listbox.

Si quelqu’un a une astuce/exemple…

NOTA: j’ai essayé l’appel sur événement, cela ne fonctionne pas plus, aucune détection concrète des frappes clavier.
NOTA 2: j’en ai fait autant côté formulaire lui-même. Sur une zone de saisie (variable par ex) pas de souci, mais si le focus n’est sur aucun objet, nada.

Je suis preneur de toute solution!>Product :4D - 4D Server

OS : Windows

Faut pas chercher à gérer ça avec la méthode objet de la listbox, si tu l’as rendue non saisissable, elle ne déclenchera jamais Sur avant / après frappe clavier.

Perso j’opterais pour la classique petite zone de recherche au-dessus : on y tape un caractère, dans le sur après frappe clavier on fait le boulot de sélection dans la listbox. De plus ça permettra de chercher sur plus d’une lettre, si ça a un intérêt dans ton cas.

Maintenant, si c’est précisément ce que tu ne veux pas, faut passer au choix :

  • autant de boutons que de frappes possibles (A…Z et autres) avec la touche comme raccourci
    avec dupliquer objet c’est jouable, il suffit de les placer “hors fenêtre” (du genre coordonnée Y négative)
  • appeler sur événement (“maMethode”)
    installer cette méthode dans le sur chargement, l’enlever dans le sur libération ; avec l’exemple de la doc, ça le fait pas ?

Le problème est que j’aurais besoin d’un point de vue ergonomique d’intercepter ces frappes. En gros, admettons une sélection multiple de lignes, et que je veux activer une fonctionnalité via une touche de raccourci paramétrable, ça n’est pas idéal d’avoir une touche par défaut pour chaque touche possible du clavier!

Il n’y aurait donc aucun moyen?

Je me réponds à moi-même.

Au final j’ai fait comme suggéré, en créant un bouton invisible hors cadre que je duplique auquel j’affecte en cascade toutes les touches.
L’enfer… c’est la quantité atroce de codes ASCII “chiants” à gérer.

Ci-dessous la génération des boutons au démarrage du formulaire.

<code 4D>
TABLEAU TEXTE($tabCars;0)
Boucle ($i;1;255)
Si ($i>=48) & ($i<=57)
//0 — 9
AJOUTER À TABLEAU($tabCars;Caractère($i))
Fin de si
Si ($i>=65) & ($i<=90)
//A — Z
AJOUTER À TABLEAU($tabCars;Caractère($i))
Fin de si
Si ($i>=97) & ($i<=122)
//A — Z
AJOUTER À TABLEAU($tabCars;Caractère($i))
Fin de si

Fin de boucle
AJOUTER À TABLEAU($tabCars;"[home]")
AJOUTER À TABLEAU($tabCars;"[esc]")
AJOUTER À TABLEAU($tabCars;"[enter]")
AJOUTER À TABLEAU($tabCars;"[F1]")
AJOUTER À TABLEAU($tabCars;"[F10]")
AJOUTER À TABLEAU($tabCars;"[F11]")
AJOUTER À TABLEAU($tabCars;"[F12]")
AJOUTER À TABLEAU($tabCars;"[F13]")
AJOUTER À TABLEAU($tabCars;"[F14]")
AJOUTER À TABLEAU($tabCars;"[F15]")
AJOUTER À TABLEAU($tabCars;"[F2]")
AJOUTER À TABLEAU($tabCars;"[F3]")
AJOUTER À TABLEAU($tabCars;"[F4]")
AJOUTER À TABLEAU($tabCars;"[F5]")
AJOUTER À TABLEAU($tabCars;"[F6]")
AJOUTER À TABLEAU($tabCars;"[F7]")
AJOUTER À TABLEAU($tabCars;"[F8]")
AJOUTER À TABLEAU($tabCars;"[F9]")
AJOUTER À TABLEAU($tabCars;"[end]")
AJOUTER À TABLEAU($tabCars;"[down arrow]")
AJOUTER À TABLEAU($tabCars;"[right arrow]")
AJOUTER À TABLEAU($tabCars;"[left arrow]")
AJOUTER À TABLEAU($tabCars;"[up arrow]")
AJOUTER À TABLEAU($tabCars;"[page up]")
AJOUTER À TABLEAU($tabCars;"[page down]")
AJOUTER À TABLEAU($tabCars;"[insert]")
AJOUTER À TABLEAU($tabCars;"[return]")
AJOUTER À TABLEAU($tabCars;"[del]")

OBJET FIXER COORDONNÉES(;“btn”+Chaîne($u);-10;-10)
Boucle ($u;1;Taille tableau($tabCars))
OBJET DUPLIQUER(
;“btn”;“btn”+Chaîne($u);-10;-10)
OBJET FIXER TITRE(;“btn”+Chaîne($u);$tabCars{$u})
OBJET FIXER ÉQUIVALENT CLAVIER(
;“btn”+Chaîne($u);$tabCars{$u})
Fin de boucle
</code 4D>
Pourquoi faire comme ça
1° Créer un bouton nomme “btn” (nom et variable)
Le positionner n’importe où mais visible pour pouvoir le modifier
A ce bouton, ajouter le code suivant pour traquer le texte des boutons via une méthode unique. L’intérêt est qu’en dupliquant le bouton par le code on duplique son code! Donc… x boutons, un point d’entrée qui “capte” sa fonctionnalité

<code 4D>
$nomFrappe:=OBJET Lire titre(Self->)
C_ENTIER LONG($codeFrappe)
$codeFrappe:=0
Si (Longueur($nomFrappe)=1)
$codeFrappe:=Code de caractère(Majusc($nomFrappe))
Sinon
// transposer les chaines en $code_ASCII cohérent (bonjour l’angoisse)

$codeFrappe:=parseZoneTexte ($nomFrappe)

Fin de si

</code 4D>

Et la méthode parseZoneTexte ?
<code 4D>
// parseZoneTexte
C_TEXTE($entree)
$entree:=$1
C_ENTIER LONG($retour)
TABLEAU ENTIER LONG($frappes;0)
Au cas ou
: ($entree="[F@")
$valeur:=Num(Remplacer chaîne(Remplacer chaîne($entree;"[F";"");"]";""))
Au cas ou
: ($valeur=1)
$retour:=Touche F1
: ($valeur=2)
$retour:=Touche F2
: ($valeur=3)
$retour:=Touche F3
: ($valeur=4)
$retour:=Touche F4
: ($valeur=5)
$retour:=Touche F5
: ($valeur=6)
$retour:=Touche F6
: ($valeur=7)
$retour:=Touche F7
: ($valeur=8)
$retour:=Touche F8
: ($valeur=9)
$retour:=Touche F9
: ($valeur=10)
$retour:=Touche F10
: ($valeur=11)
$retour:=Touche F12
: ($valeur=12)
$retour:=Touche F12
: ($valeur=13)
$retour:=Touche F13
: ($valeur=14)
$retour:=Touche F14
: ($valeur=15)
$retour:=Touche F15
Fin de cas
Sinon
Au cas ou
: ($entree="[insert]")
$retour:=ASCII ENQ // Insert
: ($entree="[enter]")
$retour:=Entrée // entree
: ($entree="[del]")
$retour:=ASCII DEL // DEl
: ($entree="[esc]")
$retour:=ASCII ESC //ESC

		: ($entree="[page up]")
			$retour:=ASCII VT  // PG UP/
		: ($entree="[page down]")
			$retour:=ASCII FF  // PG dwn
			
		: ($entree="[up arrow]")
			$retour:=Touche haut
		: ($entree="[down arrow]")
			$retour:=Touche bas
			
		: ($entree="[home]")
			$retour:=ASCII SOH  // Home
		: ($entree="[end]")
			$retour:=ASCII EOT  // Fin
			
		: ($entree="[return]")
			$retour:=Touche retour chariot  // RETOUR
	Fin de cas 

Fin de cas
$0:=$retour

</code 4D>
Comme ça toutes les touches classiques (hors caractères spéciaux, ponctuation…) sont prises en compte!
Chiant comme la pluie à faire, mais ça a le mérite de faire la blague!

MErci pour le coup de main

Si, avec appeler sur evenement… comme dit dans ma réponse précédente :wink:

Un exemple d’une telle méthode :
<code 4D>
//myOnEventCall
//intercepte la frappe des caractères a-z
$codeCar:=KeyCode
Case of
: (Modifiers ?? Command key bit)
: (Modifiers ?? Option key bit)
: (Modifiers ?? Control key bit)
: ($codeCar>=97) & ($codeCar<=122) //a-z : on traite
FILTER EVENT //on intercepte pour que 4D ne traite pas
BEEP //pouêêêt
End case
</code 4D>
pour installer :
<code 4D>
ON EVENT CALL(“myOnEventCall”)
</code 4D>
pour désinstaller :
<code 4D>
ON EVENT CALL("")
</code 4D>

La difficulté avec appeler sur événement est sa portée : partout dans 4D. Si tu vas par exemple dans l’éditeur de méthodes en ayant installé la méthode ci-dessus, plus moyen de saisir a-z puisqu’on lui a dit d’intercepter. Là encore 2 choix :
1/ simple : la méthode est installée quand le formulaire concerné s’ouvre, désinstallée quand il se referme
2/ plus compliqué : la méthode est installée en permanence, dans ce cas il faut qu’elle sache quelle fenêtre est au 1er plan pour gérer tous les cas de figure

Je n’avais pas lu ta réponse entre temps…
Perso, je préfère souvent gérer comme tu l’as fait, en multipliant les touches comme de petits pains, ça créé moins d’interdépendances.

Bonjour à TOUS…

Le hasard fait assez bien les choses… et pour Arnaud : Jamais dire Jamais :slight_smile:
Nous sommes en train d’étudier le problème et de voir s’il est possible de faire en sorte qu’une listbox (saisissable ou non, mais pas en cours de saisie) puisse intercepter ce genre d’évenement (ou un nouvel événement) afin de pallier ce genre de besoin.

La solution des “n” touches (A-Z-0-9-_— "etc…) a été proposée sur le BLOG, mais ça ne nous semble pas satisfaisant (sur du long terme).
En effet, il est souhaitable de pouvoir “bufferiser” les caractères, mais la simple concaténation des caractères reçus n’est pas idéale non plus, en tout cas pas dans toutes les langues, asiatiques notamment.

à suivre donc.

“Patience longueur de temps font plus que force ni que rage”

Roland Lannuzel

T’es trop fort, Roland, tu vois dans le futur :wink:

Je ne l’ai pas dit mais c’est précisément la “bufferisation” qui fait que je préfère la solution à “n” boutons. Une méthode d’interception d’événement met plus ou moins de temps à s’exécuter. Si ce temps est supérieur à la vitesse de frappe de l’utilisateur, on perd une partie de sa frappe (genre on saisi “dupont”, elle ne va intercepter que “dpt”). Avec les boutons ça n’arrive pas.

Un petit HS, à propos de frappe rapide : pendant le discours de notre président d’hier, le texte s’affichait en bas de l’écran pendant qu’il parlait, comme saisi au fur et à mesure. Je me suis demandé s’il y a des fusées du clavier capables de ça, ou quel est le truc. Quelqu’un sait ?

Il m’a semblé que la personne utilisait de temps en temps des sortes de “raccourcis” qui transformaient le texte en expressions complètes. (Dactylo ?)
Les greffiers de justice ont des machines spéciales pour retranscrire à la volée, mais ce n’est pas intelligible en vrai français il me semble.

: Manuel PIQUET

Il m’a semblé que la personne utilisait de temps en temps des sortes
de “raccourcis” qui transformaient le texte en expressions complètes.
(Dactylo ?)
Les greffiers de justice ont des machines spéciales pour retranscrire
à la volée, mais ce n’est pas inéligible en vrai français il me semble.

Cela doit être le même principe que pour la retranscription écrite d’un discours présidentiel à la TV. :sunglasses:

Me suis demandé comment c’était fait. Le discours est écrit d’avance mais notre président peut broder, et ça n’explique pas qu’on voyait : des morceaux déjà tapés être effacés et corrigés, des bouts qui passaient à la trappe, etc. Marrant… Mais du coup ça m’a déconcentré, j’ai pas capté comment se gesticule “coller une prune pour défaut d’autorisation de sortie” en langue des signes.

Désolé pour le bruit, mais je ne sais plus quand nous sommes vendredi.

https://fr.wikipedia.org/wiki/Vélotypie

: Eric JUHEL

Désolé pour le bruit.
Bah, non, il est intéressant, cet article, je connaissais pas, j’aime bien le concept (je déteste mon clavier azerty qui me le rend bien). Et puis, comme on n’a plus grand monde à qui parler, on pourrait instaurer le mercredi jour déconfiné sur 4dbb et ce jusqu’au 11 mai (sans remettre le vendredi en question, bien sûr). On aurait juste à s’auto signer une dérogation de sortie de route du mercredi, valable une heure sur un fil de discussion maximum.

Ils ne connaissent pas Siri ou Alexia ?

hello,

Si les utilisateurs ne sont pas des pros de la frappe clavier (ce que je ne leur reprocherai pas)
Rien n’empeche à la 1ere lettre frappe, quand la listbox a le focus, de faire apparaître un dialogue dans ce cas…

Le tout c’est d’être prévenu, après on fait ce qu’on veut.

Aujourd’hui, on a PAS d’événement “on before keystroke” quand on n’est pas en saisie de texte…)

Roland Lannuzel