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 :

Checkbox vbChecked et vbUnchecked, ne fonctionne que dans un sens


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Couin
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2014
    Messages : 147
    Par défaut Checkbox vbChecked et vbUnchecked, ne fonctionne que dans un sens
    Coucoutte

    Je travaille sur l’amélioration d'un logiciel (cartoucheur pour jingles) et j'ai besoin de désélectionner des checkbox (qui sont en mode graphique mais ca change rien), quand on en clique une autre.

    Pour le sujet, j'ai reproduit de manière symbolique, un form avec 3 checkbox, et le code suivant :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Private Sub Check1_Click()
     
    If Check2.Value = vbChecked Or Check3.Value = vbChecked Then
    Check1.Value = vbChecked
    Check2.Value = vbUnchecked
    Check3.Value = vbUnchecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    End If
     
    End Sub
     
    Private Sub Check2_Click()
     
    If Check1.Value = vbChecked Or Check3.Value = vbChecked Then
    Check1.Value = vbUnchecked
    Check2.Value = vbChecked
    Check3.Value = vbUnchecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    End If
     
    End Sub
     
    Private Sub Check3_Click()
     
    If Check1.Value = vbChecked Or Check2.Value = vbChecked Then
    Check1.Value = vbUnchecked
    Check2.Value = vbUnchecked
    Check3.Value = vbChecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    End If
     
    End Sub
    Considérons que pour chaque ligne, je viens de lancer le logiciel, toutes les checkbox sont décochées.

    Ce qui fonctionne :
    Si je clique sur la 1, et que je clique sur la 2, la 1 se décoche et la 2 se coche.
    Si je clique sur la 1, et que je clique sur la 3, la 1 se décoche et la 3 se coche.
    Si je clique sur la 2, et que je clique sur la 3, la 2 se décoche et la 3 se coche.

    Ce qui ne fonctionne pas :
    Si je clique sur la 3, et que je clique sur la 2, la 3 se décoche pas et la 2 ne se coche pas.
    Si je clique sur la 3, et que je clique sur la 1, la 3 se décoche pas et la 1 ne se coche pas.
    Si je clique sur la 2, et que je clique sur la 1, la 2 se décoche pas et la 1 ne se coche pas.

    Ce code fonctionne encore moins :
    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
    24
    25
    26
    27
    28
    29
    Private Sub Check1_Click()
     
    If Check2.Value = vbChecked Or Check3.Value = vbChecked Then
        If Check2.Value = vbChecked Then Check2.Value = vbUnchecked
        If Check3.Value = vbChecked Then Check3.Value = vbUnchecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    End If
     
    End Sub
     
    Private Sub Check2_Click()
     
    If Check1.Value = vbChecked Or Check3.Value = vbChecked Then
        If Check1.Value = vbChecked Then Check1.Value = vbUnchecked
        If Check3.Value = vbChecked Then Check3.Value = vbUnchecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    End If
     
    End Sub
     
    Private Sub Check3_Click()
     
    If Check1.Value = vbChecked Or Check2.Value = vbChecked Then
        If Check1.Value = vbChecked Then Check1.Value = vbUnchecked
        If Check2.Value = vbChecked Then Check2.Value = vbUnchecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    End If
     
    End Sub
    Je comprends rien et ça fait 5h que je rame

    Une tite idée pour le palmé ?

    Merkouin

  2. #2
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut

    Essais de mettre une variable EncoursTraitement global au niveau Form,
    dés que tu entre dans une des procédures Private Sub Check????_Click() tu mets une nouvelle condition If EncoursTraitement= True Then exit Sub la ligne suivante est EncoursTraitement = True, ton code s’exécute, et juste avant de quitter la procédure, tu remets la variable à EncoursTraitement = False.

    Exemple pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Check1_Click()
    If EncoursTraitement= True  Then exit Sub
    EncoursTraitement = True 
    If Check2.Value = vbChecked Or Check3.Value = vbChecked Then
    Check1.Value = vbChecked
    Check2.Value = vbUnchecked
    Check3.Value = vbUnchecked
    '[...]Autres opérations, dans le code du logiciel cartoucheur[...]
    EncoursTraitement = False
    End If
     
    End Sub
    A faire pour chaque CheckBox.

    Et si tu choisisais des RadioButtons ?
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre très actif Avatar de Couin
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2014
    Messages : 147
    Par défaut
    Hello,

    Merci pour ta réponse

    Je me dois d'apporter quelques précisions sur le besoin du coup :

    -Le logiciel est Jingle Palette, c’est un logiciel existant qui n'est pas de ma création (autant dire que j'ai déjà paumé pas mal de neurones à comprendre comment ça avait été fait, ne serait-ce que pour faire les quelques modifs que j'ai déjà faites).

    Nom : checkboxes.jpg
Affichages : 185
Taille : 20,5 Ko
    - Les checkboxes sont en mode graphique et correspondent aux boutons de fonction Assign Loop, Assign Volume, Autorepeat, Touch Play et Play / Stop.
    L'appui sur un de ces boutons change la couleur de tous les jingles (la couleur dépend de la fonction choisie), et on clique sur le jingle sur lequel on veut appliquer la fonction choisie, ou bien on reclique sur la fonction pour annuler. A priori avec des boutons radio (même en mode graphique), on ne peut pas en sélectionner aucune (donc pour annuler).

    - L'idée étant que si par exemple on a cliqué sur Assign loop et que l'on clique sur Assign Volume, ca décoche Assign Loop et ca mette à jour la bonne couleur pour les boutons de choix du jingle.

    - Il y a d'autres opérations après le End if de chaque Check?_Click(), je pense pas pouvoir mettre un Exit Sub du coup.

    J'ai remarqué que le fait de changer la valeur d'une checkbox dans le Private sub d'une autre Chekbox, faisait en fait comme si on cliquait dessus. Le système se mort un peu la queue.

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut (Re)
    J'ai remarqué que le fait de changer la valeur d'une checkbox dans le Private sub d'une autre Chekbox, faisait en fait comme si on cliquait dessus. Le système se mort un peu la queue.
    Et oui, c'est bien pourquoi je te proposais une variable qui évite de jouer les Subs click des autres CheckBoxs, perso je ne voie pas comment tu peux faire autrement.
    Il y a d'autres opérations après le End if de chaque Check?_Click(), je pense pas pouvoir mettre un Exit Sub du coup.
    Le Exit Sub en début de procédure peut être mis plus loin dans cette même procédure, ou le fait de remettre la variable EncoursTraitement à False pareillement.
    Pour le Fun, postes une des procédures Check????_Click(), il doit bien être possible de trouver une solution.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Membre très actif Avatar de Couin
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2014
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2014
    Messages : 147
    Par défaut
    Pooooc poc poc poc poc (Ouais, ca rend débile )

    Alors, voici le code comprenant le début de la modif :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Private Sub ckAutoRepI_Click()
            On Error GoTo Error_Routine
      
            If ckAssVol.value = vbChecked Or ckLoopI.value = vbChecked Or ckTouchI.value = vbChecked Or ckPlayStopI.value = vbChecked Then
            ckAssVol.value = vbUnchecked
            ckAssVol.BackColor = vbButtonFace
            ckLoopI.value = vbUnchecked
            ckLoopI.BackColor = vbButtonFace
            ckTouchI.value = vbUnchecked
            ckTouchI.BackColor = vbButtonFace
            ckPlayStopI.value = vbUnchecked
            ckPlayStopI.BackColor = vbButtonFace
            For i = 0 To 29
                    b_Jingle(i).BackColor = Jing(i).Color 'vbButtonFace
                Next i
            End If
            
            If ckAutoRepI.value = vbUnchecked Then
                ckAutoRepI.BackColor = vbButtonFace
                ManiPulate = False
                For i = 0 To 29
                    b_Jingle(i).BackColor = Jing(i).Color 'vbButtonFace
                Next i
            Else
                tmout = 0
                ManiPulate = True
                ckAssign.value = vbUnchecked
                b_tmAnJin.value = vbUnchecked
                ckAssVol.value = vbUnchecked
                ckLoopI.value = vbUnchecked
                'ckAutoRepI.value = vbUnchecked
                ckTouchI.value = vbUnchecked
                ckPlayStopI.value = vbUnchecked
                For i = 0 To 29
                    Jing(i).Color = b_Jingle(i).BackColor
                    b_Jingle(i).BackColor = &HFFFF&
                Next i
                ckAutoRepI.BackColor = &HFFFF&
            End If
    
    Exit_Routine:
        Exit Sub
    Error_Routine:
        Debug.Assert False
        ErrorLog "frmMain.ckAutoRepI_Click"
        Resume Exit_Routine
    End Sub
    Ton idée d'ajout d’une variable a été une bonne piste
    J'ai ajouté une variable dans laquelle je stocke le nom de la dernière CheckBox cochée pour l'utiliser sur le clic d'une autre des checkboxes "cousines" (lol) :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Private Sub ckAutoRepI_Click()
            On Error GoTo Error_Routine
      
            If LastCheckBox = "ckAssVol" Then
            ckAssVol.value = vbUnchecked
            ckAssVol.BackColor = vbButtonFace
            End If
      
            If LastCheckBox = "ckLoopI" Then
            ckLoopI.value = vbUnchecked
            ckLoopI.BackColor = vbButtonFace
            End If
      
            If LastCheckBox = "ckAutoRepI" Then
            ckAutoRepI.value = vbUnchecked
            ckAutoRepI.BackColor = vbButtonFace
            End If
      
            If LastCheckBox = "ckTouchI" Then
            ckTouchI.value = vbUnchecked
            ckTouchI.BackColor = vbButtonFace
            End If
      
            If LastCheckBox = "ckPlayStopI" Then
            ckPlayStopI.value = vbUnchecked
            ckPlayStopI.BackColor = vbButtonFace
            End If
            
            LastCheckBox = "ckAutoRepI"
            If ckAutoRepI.value = vbUnchecked Then
                ckAutoRepI.BackColor = vbButtonFace
                ManiPulate = False
                For i = 0 To 29
                    b_Jingle(i).BackColor = Jing(i).Color 'vbButtonFace
                Next i
            LastCheckBox = ""
            Else
                tmout = 0
                ManiPulate = True
                ckAssign.value = vbUnchecked
                b_tmAnJin.value = vbUnchecked
                ckAssVol.value = vbUnchecked
                ckLoopI.value = vbUnchecked
                'ckAutoRepI.value = vbUnchecked
                ckTouchI.value = vbUnchecked
                ckPlayStopI.value = vbUnchecked
                For i = 0 To 29
                    Jing(i).Color = b_Jingle(i).BackColor
                    b_Jingle(i).BackColor = &HFFFF&
                Next i
                ckAutoRepI.BackColor = &HFFFF&
            End If
    
    Exit_Routine:
        Exit Sub
    Error_Routine:
        Debug.Assert False
        ErrorLog "frmMain.ckAutoRepI_Click"
        Resume Exit_Routine
    End Sub
    En gras, les parties du code que j'ai changé. A priori le résultat est celui attendu.
    Je passe en résolu, mais si il y a plus propre, pourquoi pas

    Merkouin

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

Discussions similaires

  1. [Débutant] isEnabled ne fonctionne que dans un sens
    Par Donpi dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 13/06/2018, 16h24
  2. Réponses: 6
    Dernier message: 05/06/2009, 15h20
  3. Tétraèdrisation ne fonctionne que dans certains cas
    Par Rafy dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/12/2008, 20h51
  4. Effet fondu ne fonctionne que dans un sens
    Par Gaspoute dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/01/2008, 10h24
  5. [XP] Bureau à distance ne fonctionne que dans un sens
    Par beegees dans le forum Windows XP
    Réponses: 5
    Dernier message: 09/07/2006, 09h49

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