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 6 et antérieur Discussion :

[VB6] Changer le TabIndex Dynamiquement


Sujet :

VB 6 et antérieur

  1. #1
    Invité
    Invité(e)
    Par défaut [VB6] Changer le TabIndex Dynamiquement
    Bonjour à tous,

    Je souhaiterais changer dynamiquement l'ordre des tabIndex pour mes controles mais cela ne fonctionne pas.

    En fonction d'une position, je bouge un textbox, qui doit prendre le TabIndex de la position.

    Voici mon code :

    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
    Dim i As Integer
    i = 0
     
    For i = 0 To UBound(tabFileSend)
     
        Select Case tabFileSend(i).OrdredEnvoi 'Position du frame
     
          Case "01": 'Position 1
           TxtOrder(i).TabIndex = 1
     
          Case "02": 'Position 2
           TxtOrder(i).TabIndex = 2
     
          Case "03": 'Position 3
          TxtOrder(i).TabIndex = 3
     
          Case "04": 'Position 4
          TxtOrder(i).TabIndex = 4
     
      End Select
     
    Next i
    End Sub
    Au debugger ca fonctionne, mais dès que je sort de la fonction ca ne garde pas en mémoire les TabIndex, et donc ca ne fonctionne pas.

    Est-ce un bug de windows ? J'ai vu ce bug pour les pockets PC, mais pas pour VB6.

    D'avance merci pour votre aide.
    Dernière modification par Invité ; 12/09/2007 à 11h55.

  2. #2
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    La propriété tagindex d'un controle détermine l'ordre dans le quel le focus est donné aux différents zones de ta feuille losqursque tu utilise la touche tabulation. A ma connaissance, il n'est possible de modifier cet ordre de tabulation qu'au moment de la comception des feuilles.
    Peux être confonds tu avec la methode setfocus qui permet de forcer le focus sur un element précis d'une feuille.

  3. #3
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Salut Delbeke
    Ta boule de cristal doit avoir une petite fêlure, je vois ça sur MSDN :

    Ces changements peuvent être réalisés aumoment de la création à l'aide de la fenêtre Propriétés ou au moment de l'exécution au moyen du code.
    Bizarre sinon ton pb Cherry moon car ce code fonctionne bien (au départ Text1 à Tabindex = 1, text2, tabindex=2, etc...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub Command1_Click()
    Text4.TabIndex = 1
    Text3.TabIndex = 2
    Text2.TabIndex = 3
    Text1.TabIndex = 4
    End Sub

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Par défaut
    Bonjour cherrymoon08

    Ce code est-il dans un événement lié aux controle modifié ?

    Sinon fait attention a ne pas avoir deux controles qui ont le même TabIndex.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Tout d'abord, merci pour vos réponses.

    J'avais également fait un test simple comme le tiens OhMonBato, et effectivement ca fonctionne parfaitement, mais dans mon cas j'ai toujours le meme soucis.

    J'éxécute ma fonction au load de mon form.

    Quand je vérifie au pas à pas, par exemple pour la position 1, j'ai TxtOrder(4).TabIndex = 1.

    Je continue le pas en pas, je vérifie mon TxtOrder(4).TabIndex et là il passe à = 2, puis = 3, ensuite reste à 3, puis = 4.

    Vraiment bizzard.

    Quand je met les tabIndex directement dans le form, si je met par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TxtOrder(0).TabIndex = 1.
    TxtOrder(1).TabIndex = 2.
    TxtOrder(2).TabIndex = 3.
    TxtOrder(3).TabIndex = 4.
    Alors quand je vais vouloir modifier mes tabIndex, je vais retrouver mon problème précédent, à savoir que ca va augmenter comme ca.

    Si je met par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TxtOrder(0).TabIndex = 41.
    TxtOrder(1).TabIndex = 42.
    TxtOrder(2).TabIndex = 43.
    TxtOrder(3).TabIndex = 44.
    Alors ce coup-ci, mon TxtOrder(4).tabIndex va augmenter tout seul.

    Je précise que j'ai d'autre controle sur ce form...j'ai mis tous les TabIndex = 50. Je sais pas si ca peux venir de là.

  6. #6
    Membre Expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Par défaut
    Je pense que c'est dû au fait que ce code soit placé dans le Load de la feuille, il faudrait placer ça ailleurs. Tu peux par exemple appeler une procédure APRES que la feuille soit chargée.

    tu ne peux pas mettre tous les TabIndex à la même valeur, le fait de modifier le TabIndex d'un controle, modifie automatiquement tous les autres.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je viens de changer, mais meme problème, donc ca ne vient pas de là.
    Si je met, par exemple, avant chaque initialisation de mon tabIndex, un = 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select Case tabFileSend(i).OrdredEnvoi 'Position du frame
     
          Case "01": 'Position 1
     
    TxtOrder(i).TabIndex = 0
    TxtOrder(i).TabIndex = 1
    Et bien à chaque fois qu'il va incrémenter mon TxtOrder(i) dans les autres Case, il va rajouter +1 !

    Par exmple, si dans mon case 1 j'ai ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Case "01": 'Position 1
     
    TxtOrder(1).TabIndex = 0
    TxtOrder(1).TabIndex = 1
    Je vais avoir TxtOrder(1).TabIndex = 1 jusqu'à ce que je passe dans mon case 2, où il va valloir TxtOrder(1).TabIndex = 2.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    Il s'agit là avant tout de stratégie car :
    - on ne peut attribuer à un tabindex un numéro déjà attribué (et il y a toutes les chances de se trouver dans ce cas de figure si, par exemple, on traite le 2 pour le tranformer en 11 alors que le 11, non encore transformé, existe déjà)
    - il faut se méfier de la valeur présente de la propriété TabStop

    Quelle est la stratégie la plus simple ? Celle-ci :
    1) liste triée de tous les tabindex présents et relevé du plus grand N° attribué, que l'on va appeler ici N
    2) repasser en boucle tous les tabindex en leur ajoutant une valeur V supérieure ou égale à N + 1
    3) recommencer la boucle en attribuant cette fois-ci les nouvelles valeurs (pour chaque tabindex) en s'assurant de ne pas utiliser 2 fois un même numéro (l'utilisation d'une listbox invisible peut être un moyen astucieux de ne courir aucun risque)

    Bonne continuation ....

  9. #9
    Invité
    Invité(e)
    Par défaut
    Effectivement ca peut-etre une bonne solution afin d'éviter de donner le meme tabIndex.

    Cependant, ca induit qu'il faut, à chaque ajout d'un control, penser à le rajouter dans la liste

    Donc une source d'erreur...actuellement j'ai une trentaine de controle, mais je pense que la form va évoluer par la suite.
    Dernière modification par AlainTech ; 13/09/2007 à 09h17. Motif: Suppression de la citation

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bon
    J'ai répondu, pour ne rien te cacher, avec quelque réticence car je n'aime pas du tout que l'on touche aux TabIndex dynamiquement (c'est un casse-pipe presque assuré... Dans le meilleur des cas, cela alourdira le traitement)

    Je pense qu'il est bien plus astucieux (relis ce qu'a écrit Delbeke) de jouer avec le focus des contrôles à "balayer". Si tu es adroit, utilise donc la propriété Tag de tes contrôles pour y stocker le nom du contrôle "suivant", en oubliant le tabindex. Si tu es encore plus adroit, tu y stockes le nom du contrôle suivant et du contrôle précédent (séparés par le séparateur de ton choix).
    Je te rappelle à tout hasard que tu peux utiliser une chaîne de caractères (celle que tu as mise dans le tag) pour te référer à un contrôle ( controls("nom_du_contrôle" ) fait l'affaire. Attention toutefois à certains pièges à déjouer si tu utilises les Setfocus alors que des instructions des événements GotFocus et LostFocus peuvent entrer en conflit Je laisse Jean-Luc Delbeke te diriger, le cas échéant, vers une conversation ouverte à ce sujet

    Bonne continuation.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je n'étais pas forcément opposé à cette solution, bien au contraire, je suis là pour apprendre et toutes vos suggestions sont (très) bonnes à prendre

    En faisant plusieurs tests sur cette propriété tabIndex, voilà ce que j'ai découvert.

    Admettons qu'on ait 4 textbox, appelé txt0, txt1, txt2 et txt3.

    Sur mon formalaire de départ, je leur donne la valeur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    txt0.TabIndex = 0
    txt1.TabIndex = 1
    txt2.TabIndex = 2
    txt3.TabIndex = 3
    Ensuite, lors du clic sur un bouton, je change leur tabIndex comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    txt0.TabIndex = 3
    txt1.TabIndex = 2
    txt2.TabIndex = 1
    txt3.TabIndex = 0
    Ce qu'on peux remarquer, lors du pas à pas, c'est qu'on va avoir sur ces 3 étapes, les valeurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    txt0.TabIndex = 3
    txt1.TabIndex = 0
    txt2.TabIndex = 1
    txt3.TabIndex = 2
     
    txt0.TabIndex = 3
    txt1.TabIndex = 2
    txt2.TabIndex = 0
    txt3.TabIndex = 1
     
    txt0.TabIndex = 3
    txt1.TabIndex = 2
    txt2.TabIndex = 1
    txt3.TabIndex = 0
    Pour faire simple, on remarque que, si on affecte un tabIndex déja existant à un tabIndex inférieur, alors tout les autres tabIndex vont être diminués de 1.

    Ma solution est donc de donner la valeur de mes tabIndex dans l'ordre croissant, en partant de 0.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    txt3.TabIndex = 0
    txt1.TabIndex = 1
    txt2.TabIndex = 2
    txt0.TabIndex = 3
    J'ai fait plusieurs tests et ca fonctionne correctement.

    Pour finir, si je fais tout ca dynamiquement c'est parce que toute ma form est dynamique, je charge et met dans l'ordre un nombre de frame variable à chaque chargement, et c'était donc plus simple comme cela.

    En tout cas je vous remercie pour votre aide

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

Discussions similaires

  1. [VB6] générer du code dynamiquement
    Par nils.angot dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/03/2006, 09h40
  2. [VB6] Changer fond d ecran
    Par Seth77 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/10/2005, 15h53
  3. [C#] Changer l'icone dynamiquement
    Par Piolet dans le forum Windows Forms
    Réponses: 16
    Dernier message: 25/08/2004, 15h08
  4. [VB6]Changer la couleur d'une ligne d'un ListView
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/03/2003, 18h02
  5. Réponses: 2
    Dernier message: 17/10/2002, 17h16

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