Évènement 'e' [Résolu]

Signaler
Messages postés
58
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
17 février 2021
-
Messages postés
15789
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 avril 2021
-
Bonjour,
Je voudrais obtenir le code de la touche pressée dans un textbox (sans utiliser 'e As KeyEventArgs').
J'ai trouvé un exemple avec DIRECTCAST/CTYPE mais ça ne fonctionne pas, pourtant à l'"arrêt sur la faute", le curseur sur 'e' me donne bien le code de la touche pressée.

 Private Sub TextBox1_Changed(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

        Dim tmp As KeyPressEventArgs = DirectCast(e, KeyPressEventArgs)
        MessageBox.Show(tmp.KeyChar)

    End Sub


Grand merci pour l'aide.

JPM

8 réponses

Messages postés
2398
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 avril 2021
130
Bonjour
Le code à la rubrique 10 est avec Textbox1.KeyPress et non avec Textbox1.Changed .
De plus vous avez pressé la touche 0 du pavé numérique . Faites le avec la touche 0 avec shift ( au-dessus des lettres O et P ) et vous n'aurez pas le même résultat .

Code modifié par moi car 'e' est un EventArgs, je l'ai donc casté ainsi :
Dim tmp As KeyPressEventArgs = CType(e, KeyPressEventArgs)
, comme le proposé par VBNET.
VB NET vous l'a sûrement proposé mais cela ne peut fonctionner . KeyPressEventArgs et EventArgs ne sont pas interchangeables entre les contrôles . Ils sont définis pour des évènements bien particuliers aux contrôles ( voir le réponse de Whismeril que je salue ) .

Messages postés
15789
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 avril 2021
529
Bonjour

L’événement Changed n’envoie pas les mêmes informations que les événements keydown, keypress et keyup. C’est d’ailleurs pour ça que e n’a pas le même type.
En plus
  • changed n’est pas déclenché que lors d’une saisie au clavier mais aussi lors d’un changement via le code, un copier coller à la souris, un drag and drop, etc...
  • quand il est déclenché par le clavier cela arrive après que la touche soit relâchée


Bref, à brule pourpoint c’est pas gagné.

Peux tu expliquer plus en détails ton besoin pour voir quelles solutions appliquer
Bonjour,
merci pour l'info de non-possibilité.
Bien à vous,
JPM
Messages postés
2398
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 avril 2021
130
Bonjour
Pouvez-vous nous dire où vous avez trouvé cet exemple et nous le montrer si possible ?
Car moi en lançant votre code j'ai une belle erreur sur
 Dim tmp As KeyPressEventArgs = DirectCast(e, KeyPressEventArgs)
et je ne vois aucun code au niveau du e .
J'utilise Visual Studio Net Community 2019 qui contient VB Net 2019 .
De toute façon l'erreur est inévitable dans votre code .

Remarquez que la signature de l'évènement contient
e As EventArgs
ce qui montre que l'on ne peut pas dans ce cas obtenir le caractère tapé .

Il faut utiliser
Private Sub Textbox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Textbox1.KeyPress

Dans ce cas e.Keychar contient le caractère tapé au clavier .

e contient des paramètres produits par l'évènement .

Messages postés
58
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
17 février 2021
1
Voici le lien :

https://stackoverflow.com/questions/2752424/detecting-enter-keypress-on-vb-net

en Rubrique "10" avec
Dim tmp As System.Windows.Forms.KeyPressEventArgs = e


Code modifié par moi car 'e' est un EventArgs, je l'ai donc casté ainsi :
Dim tmp As KeyPressEventArgs = CType(e, KeyPressEventArgs)
, comme le proposé par VBNET.

Mais l'erreur vient probablement du fait que mon Handle n'est pas un KeyPress.
NÉANMOINS, je peux voir la valeur de la touche via l'Info-Bulle (j'ai pressé zéro).
J'ai fait une copie d'écran ci-après.

Merci
Messages postés
15789
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 avril 2021
529
Je n'ai jamais dit que c'était impossible.
Je t'ai demandé de détailler ton besoin, ce que tu n'as pas fait.

Tout à l'heure, je n'avais pas le temps de faire une explication plus complète.

On va commencer par quelques notions sur l'héritage.
La programmation objet est très largement inspirée de la vraie vie, notamment sur l'héritage (je ne parle pas de succession hein....)

Une adolescente est une humaine. Un quadragénaire est un humain. Une grand-mère est une humaine. Un ouvrier est un humain, une institutrice est une humaine. Etc...

Donc dans une variable de type Humain, on peut mettre des instances de Adolescente, de Quadragénaire etc...
Ça a un certain nombre d'avantages, mais cela a aussi pour inconvénient majeur qu'on ne peut pas accéder aux spécificités de chaque type depuis une variable Humain. Pour cela il faut caster dans le type d'origine

Dim humain as Humain = new Adolescente()
'....
Dim adolescente = DirectCast(humain, Adolescente)

fonctionne très bien.
Là où ça ne va pas marcher, c'est si on a mis un ouvrier (par exemple) dans la variable humain. Pire, si on a mis un Humain dans humain, on ne pourra le caster en rien d'autre, enfin rien d'autre "en dessous".

Car Humain hérite de Mammifère, on pourra donc caster la variable humain en Mammifère. Mais si on a mis un Chat dans une variable de type Mammifère on ne pourra pas la caster en Humain.

(OK?, plus de détails là https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3#l-heritage )

C'est donc pour ça que la variable sender est toujours du type Object dans les contrôles de Microsoft, car Object c'est la mère de toutes les classes. Tous, absolument tous les types en .Net héritent plus ou moins directement de Object.

Ça permet, par exemple, de n'écrire qu'un code qui gère l'évènement Click de textbox, de labels, de boutons et de je ne sais quoi
Et quand on veut utiliser les spécificités du type initial de sender, il faut le caster judicieusement.

Revenons maintenant plus précisément à ton problème.
Ton premier code montre la signature d'un évènement Change, qu'on pourrait associer avec un évènement KeyPress ou KeyDown, parce que l'argument sender est quoi qu'il arrive de type Object et que les "e" de KeyPress et de KeyDown (bien que de types différents) dévirent tous les 2 de EventsArg.

Donc, si et seulement si
  • on a associé un évènement Keydown ou Keypress à une méthode ayant la signature d'un évènement Change
  • on a vérifié que le changement est bien dû à la pression d'une touche
  • on a vérifié si ça vient d'un KeyDown ou d'un Keypress (en fait on peut fusionner avec la condition au-dessus mais j'ai écrit 2 conditions pour bien détailler)


On peut caster, avec le type qui va bien.
Parce que là ton message te dit clairement, que tu veux caster un e qui vient d'un KeyDown comme s'il venait d'un KeyPress.....

Quand on ne maitrise pas toutes ces subtilités, le plus simple c'est d'associer
  • un évènement KeyPress à une méthode avec la signature normale pour un KeyPress
  • un évènement KeyDown à une méthode avec la signature normale pour un KeyDown
  • un évènement Change à une méthode avec la signature normale pour un Change


Maintenant, si tu veux absolument "mélanger" ça peut s'envisager, à condition que tu détailles ton besoin

EDIT orthohraphe
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
2398
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 avril 2021
130
Salut Whis
il n'y aurait pas une erreur là dans ton message précédent

tu dis : "Parce que là ton message te dit clairement, que tu veux caster un e qui vient d'un KeyDown comme s'il venait d'un KeyPress.....

Cela serait plutôt : "Parce que là ton message te dit clairement, que tu veux caster un e qui vient d'un Changed comme s'il venait d'un KeyPress.....

Car KeyDown et KeyPress ont le même e de type KeyEventArgs .

Messages postés
15789
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 avril 2021
529
Non pas d'erreur

KeyPress => KeyPressEventArgs [https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.keypresseventargs?view=net-5.0
KeyDown => KeyEventArgs https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.control.keydown?view=net-5.0
Et c'est bien les 2 types mentionnés par le message d'erreur
Messages postés
2398
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 avril 2021
130
Exact Whis ! J'ai fait une boulette encore une fois !
Messages postés
15789
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 avril 2021
529
non, la doc en ligne peut être trompeuse, en .Net 5.0 (celle affichée par défaut aujourd'hui) et selon le contrôle ça peut être KeyEventArgs pour les 2