Intercepter réception de key_press (ou key_down) dans une box

Résolu
sirdarkwin
Messages postés
12
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
4 février 2010
- 14 déc. 2004 à 22:30
cboulas
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
- 15 déc. 2004 à 23:02
Le titre n'est pas très explicite et je m'en excuse...

Voici le problème : je cherche à créer un combobox qui trouve tout seul le reste du texte à taper : si on rentre "vbf" dans le comboBox, il complète tout seul depuis ma BD et affiche "vbfrance".
Jusque là, tout va bien avec la gestion de key_press.

Mais il entre toujours le caractère appuyé APRES que j'ai géré l'évènement. Malgré mes bidouilles, en essayant de gérer key_down et key_up aussi, je n'ai pas réussi à empêcher qu'il ajoute la lettre entrée après que j'ai tout mis en forme :(
Ce qui fait qu'il détecte que le nom n'est pas conforme lorsque l'on presse une touche APRES avoir entré le caractère non conforme (heu, ouais, pas clair, mais relisez)

Donc je voudrais :
- Soit intercepter l'écriture du caractère dans la combobox
- Soit pouvoir faire mes fonctions après que la touche soit pressée et le caractère entré dans le combobox (pas de combobox_textChanged, ça ne va pas)

Merci d'avance

10 réponses

crenaud76
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
29
15 déc. 2004 à 08:43
Essaye de passer le Keyascii à zéro avant de sortir de ton evt Key_press ...

Christophe R.
3
cboulas
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
16
15 déc. 2004 à 22:21
Salut, bhà si tu veux récupérer la référence d'une variable change le byVal en ByRef.

Tu utilise VB6 ou VB.Net ?

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
3
cboulas
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
16
14 déc. 2004 à 23:26
Salut,

Bien j'ai pensé que en fait dans le Key_Press ou Key_Down tu intercepte le texte contenu dans ton textbox y ajoute le caractère de la touche pressée. ensuite avec ce nouveau mot (incomplet bien sûr) tu recherche dans un dictionnaire interne s'il y a un caractère qui peux suivre ou pas. Si aucun caractère ne peux suivre ce qui est noter (car non présent dans le dico) alors la lettre s'affiche mais avec un message d'erreur prévenant l'user que le mot qu'il tape n'est pas présent dans le dico, sinon s'il n'y a qu'un seul mot qui peux avoir les lettres suivantes : tu affiche le mot, sinon tu propose les mot dans le ToolTipBox.

Avec un exemple ce sera + clair :

Le dico des mots
Moto
Voiture
VBFrance
Chien
Chat


Par exemple l'user tape "M", là ton soft remplis la textbox par "Moto" automatiquement car c'est le seul mot qui peux correcpondre à partir du dico.

Si l'user tape : "V", là le tooltipbox affiche la liste des mots pouvant commencer par "V", soit "Voiture" et "VBFrance", si l'user tape ensuite "B" à la suite de "V" donc on obtient "VB", alors le soft remplis tout seul la textbox par "VBFrance" car c'est le seul mot pouvant correspondre au dico.

Si l'user tape : "C", le soft affiche dans le tooltipbox : "Chien" et "Chat", ensuite il tape : "h" qui donne "Ch", le tooltipbox affiche tjs pareil : "Chien" et "Chat", ensuite l'user tape "a" pour obtenir : "Cha", là le soft remplis la textbox avec "Chat"

Si l'user tape autre chose que les lettres dispo alors tu affiche un message indiquant que aucun mot ne peux correspondre par rapport au dico. ensuite tu annule la touche par : KeyAscii=0 selon KeyPress ou KeyDown...

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0
sirdarkwin
Messages postés
12
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
4 février 2010

15 déc. 2004 à 22:18
Merci pour vos réponses, mais j'en suis (presque toujours au même point).

cboulas, tu es un débrouillard et veut user d'une autre méthode. Mais Ô combien cela est fourbe! ça alourdirait mon interface de rajouter une liste (déjà que j'ai du mal à tout cadrer) et ça ne ferait pas assez propre...

crenaud76, OK ta solution ne manque pas d'astuce, mais la touche pressée est passée en paramètre ByVal, ce qui veut dire que comme on n'a pas la référence de l'objet on ne peut pas le modifier. A moins qu'il y ait une autre astuce pour le récupérer par référence...

Je sais que ce que je veux faire est possible, plein de programmes sont dotés d'une telle interface. Je continue mes recherches plus avant... Si quelqu'un a une autre idée, elle est la bienvenue!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cboulas
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
16
15 déc. 2004 à 22:22
P.S. : Si tu n'utilise pas de dictionnaire, ton soft ne pourra pas déterminer les mots, mais tu pourra fournir une liste proposant l'alphabet

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0
sirdarkwin
Messages postés
12
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
4 février 2010

15 déc. 2004 à 22:40
J'utilise VB.Net, j'avais pas pensé à changer la signature avec un ByRef =)

Mais j'utilise à présent l'évènement textChanged (désolé...) et je resélectionne la fin du texte de façn à ce que la prochaine lettre entrée efface la fin. J'y travaille là, je devrais tout débuguer d'ici peu...

Pour le dictionnaire, je récupère depuis des entrées dans une base de données, donc aucun souci. En fait c'ets l'index de la ligne qui me pose souci là, mais c'est pas grand chose... merci de ta réponse rapide!

Je poste d'ici 10 minutes le code qui marche
0
cboulas
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
16
15 déc. 2004 à 22:53
Pour infos :

Par contre il faut savoir que si ton ByRef est souvent utiliser et que ton texte saisi est stocké dans une variable tu va perdre BEAUCOUP de rapidité pour concaténer les lettres qui suivent.
Et comme le Garbage Collector ne se déclenchera pas de suite ta RAM va monter vite en flèche.

Si tu doit concaténé du texte comme je l'explique ici, ajoute ceci :

Imports System.Text

Dim toto As StringBuilder
toto.append("X")


Les temps ne sont pas négligeable parfois, car en temps normal avec ceci :

toto &= "X" 'Ajout un X à chaque appel, il te faudrat 40sec pour concaténé 700 000 "X"
Alors qu'avec cette méthode il te faudrat moins de 0.14 sec !

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0
sirdarkwin
Messages postés
12
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
4 février 2010

15 déc. 2004 à 22:54
Ayé! Mon erreur venait d'autre part, rien à voir avec la conception de ce petit truc...

Comme promis le code pour ceux qui en auraient besoin :
ici on a dtClient un dataset rempli avec les valeurs dico
et combobox9 la combobox où l'utilisateur rentre son texte
Cette combobox est remplie avec les valeurs du dataset (dans le bon ordre pour ceux qui feraient la même erreur que moi en oubliant un ORDER BY!!)

-----------------------------------------------------------------

Private Sub ComboBox9_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox9.TextChanged
If chercheclient Then Exit Sub
'la variable chercheClient sert à éviter des boucles infinies quand on change le texte dans cette fonction. la variable est globale

chercheClient = True
Dim str As String
str = ComboBox9.Text

Dim i, pos As Integer

pos = ComboBox9.SelectionStart

Dim trouve As Boolean = False
i = 0
Ici on parcourt l'ensemble du dataset
For i = 0 To dtClient.Tables(0).Rows.Count - 1
'On compare le texte du dataset avec un pattern égal au texte du combobox suivi de *
If dtClient.Tables(0).Rows(i).Item(0) Like str & "*" Then
'Si ça correspond, on sélectionne le bon indice
ComboBox9.SelectedIndex = i
trouve = True
Exit For
End If
Next

If Not trouve Then
MsgBox("Aucun client ne correspond à ce nom")
chercheClient = False
Exit Sub
End If

'Ici on resélectionne la fin du texte pour une saisie plus facile!
ComboBox9.SelectionStart = pos
ComboBox9.SelectionLength = ComboBox9.Text.Length - pos

chercheClient = False
End Sub
0
sirdarkwin
Messages postés
12
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
4 février 2010

15 déc. 2004 à 22:56
P.S : Merci pour le StringBuilder, je ne connaissais pas ce truc! ça sert pour des variables de type string souvent modifiées c'est ça? une sorte de liste de chars... (je regarde la MSDN quand même)
0
cboulas
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
16
15 déc. 2004 à 23:02
Bhà ça sert surtout si tu concatène des chaîne de caractère super longue ou qui seront sur un PC super lent, car mettre
200 000 "X" les uns après les autres ça peux prendre 3 minutes sur un 286 (si toutefois cela marche) mais avec le stringbuider tu peux descendre à quelques seconde.

Comme je te le disais c'est super cool pour concaténé des chaînes

Y'a surement d'autres utilitées mais je ne l'ai pas encore visité totalement

Je vais zieuté ton code

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0