IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Ignorer le Tab Order (flèches) [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut Ignorer le Tab Order (flèches)
    Bonjour,
    Est il possible (facile?) de passer outre le Tab Order dans un Windows Form ? J'ai codé des actions sur le KeyDown event mais je suis obligé d'utiliser d'autres touches du clavier car les les flèches répondent au Tab Order du Form.
    Merci par avance.
    Bruno

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour Bruno,

    Lorsque la propriété KeyPreview du Form a la valeur True, il est possible d'obtenir les codes de toutes les touches dans le e.KeyCode de l'événement KeyDown du Form, et donc de les gérer à sa guise.
    Une touche échappe à cela, c'est la touche TAB qui continue à provoquer les déplacements entre les contrôles dont la propriété TabStop est True. Mais si on parcourt le Form en plaçant à False la propriété TabStop de chaque composant, alors la touche Tab n'a plus aucun effet.

    J'espère que ceci t'inspirera ...

  3. #3
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    Merci Phil pour ta réponse. Je n'avais pas pensé au TabStop en effet.
    Toutefois, les touches Up, Down, Left, Right (flèches sur le clavier) déplacent toujours le curseur entre les contrôles.
    Y aurait il une autre astuce ?
    Bruno

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Oui mais tu peux gérer

    Fais donc ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
       '     MessageBox.Show(e.KeyCode & " " & e.KeyData & " " & e.KeyValue)
            If e.KeyCode = 39 Then Button1_Click(Me, Nothing) 'KeyCode 39 = flèche vers la droite
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            MessageBox.Show("Button1")
        End Sub
    Bonne soirée

  5. #5
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    Merci Phil mais il doit y avoir un paramètre qui intercepte le KeyDown event...
    J'ai créé une app WinForm de zéro avec juste un Label et activé le Keydown event:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
            Label1.Text = CStr(e.KeyCode)
        End Sub
    J'ai alors bien une réponse à toutes les touches enfoncées, le code de la touche affiché sur le Label1.
    J'ajoute ensuite juste un bouton Close sur le Form, et là plus rien...

  6. #6
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonsoir Bruno,

    Je viens de faire le même test que toi et je constate la même chose que toi.
    C'est le bouton qui a le focus et c'est lui qui reçoit les KeyDown, et non plus le Form.
    Le bouton est dans ce cas, le premier composant "focusable". Mets-lui la propriété TabStop à False et ton problème sera réglé (dans cet exemple).

    Le label n'a pas de TabStop et n'est pas accessible par la touche Tab.

    ...

  7. #7
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    Hello Phil
    Merci ! Ça a l'air de marcher sur l'exemple.
    Bizarrement, dans un programme un peu plus complexe avec une bonne douzaine de contrôles sur le MainForm (tous à TabStop = False), les touches enfoncées sont bien détectées mais les flèches renvoient le Keycode seulement après avoir fait un cycle complet des tabs.
    Il doit y avoir une interception possible encore plus en amont j'imagine. En tout cas, ça n'est qu'un détail maintenant :-)
    Bon congé de fin de semaine
    Bruno

  8. #8
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Merci Bruno.
    Mais avant de partir en week-end, je voulais encore te faire essayer ceci (sur ton exemple simple d'hier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Class Form1
        Inherits Form           ' !!!!!!!!!!!!!!!!!!!!!
     
        Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
            Static HandleActif As Boolean = False
            If keyData = Keys.Tab Then
                If HandleActif Then
                    RemoveHandler MyBase.KeyDown, AddressOf Form1_KeyDown
                    HandleActif = False
                End If
            Else
                If Not HandleActif Then
                    AddHandler MyBase.KeyDown, AddressOf Form1_KeyDown
                    HandleActif = True
                End If
            End If
        End Function
     
        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) ' Handles MyBase.KeyDown ' !!!!!!!!!
            Label1.Text = CStr(e.KeyCode)
        End Sub
     
    End Class
    Bon week-end à toi aussi

  9. #9
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    Merci Phil. Je ne veux vraiment pas t'importuner davantage mais ces Handlers me dépassent un peu.
    Tu me conseilles de répéter ton code pour les 4 flèches ?
    Bon dimanche
    Bruno

  10. #10
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour Bruno,

    Il est possible d'écrire des Event et de les "associer" à toute procédure que tu peux souhaiter, mais sans entrer dans l'étude des événements, tu peux simplement constater qu'une la ligne d'entête d'une procédure de réponse événementielle, par exemple la réponse au clic d'un bouton, se termine toujours par Handles NomDuComposant.NomDeLEvenement. Dans ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
            Label1.Text = CStr(e.KeyCode)
        End Sub
     
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
           ' ...
        End Sub
    Le code que je t'ai envoyé exploite une fonction de la classe Form, uniquement accessible dans une classe dérivée, d'où la ligne Inherits Form.
    Cette fonction est déclarée ici Overrides Function ProcessCmdKey( ... .... Ceci signifie que mon code remplace celui de la fonction dans sa classe (en supposant qu'elle contienne effectivement du code, ce qui n'est pas obligatoire ...).

    Les codes RemoveHandler MyBase.KeyDown, AddressOf Form1_KeyDown et AddHandler MyBase.KeyDown, AddressOf Form1_KeyDown peuvent être employés ordinairement dans tes programmes pour d'autres événements et d'autres procédures : tu peux ainsi suspendre momentanément "l'écoute" d'un événement sur un composant donné, et la réactiver à ta guise.

    J'en détourne largement l'usage de ProcessCmdKey (je ne l'utilise notamment pas comme fonction, aucune valeur de retour). Comme cette fonction est utilisée dans la classe Form avant la prise en compte de l'événement MyBase.KeyDown, j'en profite pour désactiver cet événement lorsque que je ne veux pas la prise en compte de la touche pressée et je le réactive quand la touche me convient.
    Soit, c'est un outils parmi d'autres ...
    Tu trouveras sur le Web d'autres façons d'utiliser ProcessCmdKey mais comme toujours, tout n'est pas bon à prendre ...

    J'espère que ces explications t'aideront.

    A bientôt

  11. #11
    Membre confirmé
    Homme Profil pro
    Trader / Formateur / Développeur Options CBOE
    Inscrit en
    Septembre 2018
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Trader / Formateur / Développeur Options CBOE
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2018
    Messages : 86
    Par défaut
    Merci Phil, je vais explorer tout ça... quand mon programme arrêtera de me jeter des bâtons dans les roues ! ;-)

    Le dernier en date étant à la compilation:

    Severity Code Description Project File Line Suppression State
    Error BC36970 Failed to emit module 'SOAP.exe'. SOAP C:\TWS API\samples\VB\VB_API_Sample\vbc 1 Active
    Alors que je ne vois nulle part un fichier appelé 'vbc'

    Ah les sempiternels mystères de la programmation....
    L'erreur BC36790 qui bloquait la compilation provenait de la ligne de déclaration strSymbolsFile que je viens de changer de Const à simplement Dim.
    Je vais pouvoir retourner à l'exploration des Key Events

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
            Dim sPath As String = Path.Combine(CurrentFolder, "Settings")
            If Not Directory.Exists(sPath) Then
                Directory.CreateDirectory(sPath)  ' should check for possible errors
            Else
            End If
     
            Dim i As Integer
            Dim sw As StreamWriter
            Const Comma As String = ","
     
            Try
                Dim strSymbolsFile As String = sPath + "\Symbols.csv"
                If Not FileInUse(strSymbolsFile) Then
                    If File.Exists(strSymbolsFile) Then
                        File.Delete(strSymbolsFile)
                    End If
                    sw = File.CreateText(strSymbolsFile)
    etc 
    etc

  12. #12
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bravo !

    Pour info, vbc est le compilateur VB de VisualStudio. Tu en as beaucoup sur ton disque système, et d'autant plus que tu aurais comme moi plusieurs versions de VS.

    Un tout petit extrait des résultats d'une recherche :

    Nom : VBC.jpg
Affichages : 186
Taille : 177,5 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tab order, focus et remplacement de valeur
    Par zekey dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/04/2006, 13h06
  2. Tab order
    Par jmjmjm dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2005, 16h00
  3. [OnClick]ignoré si on utilise tab pour parcourir les textbox
    Par ozzmax dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2005, 22h40
  4. Gestion des "Tab Order"
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2005, 17h24
  5. [tab order] comment le bouger ??
    Par chronos dans le forum Windows
    Réponses: 5
    Dernier message: 17/05/2005, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo