[astuce] inverser la sélection facilement avec des checkbox

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 542 fois - Téléchargée 25 fois

Contenu du snippet

Ceci est plus une astuce de programmation concernant les checkbox qu'une source à proprement parler.

Je trouvais lourde la manière d'inverser la sélection de checkbox dans un programme, transformer tous les checkbox "checked" (checkbox.value=1) en checkbox "unchecked" (checkbox.value=0) nécessitait 2 "if then else" par checkbox!! Soit un code super lourd, peu esthetique et pas du tout optimisé!

Je me suis donc creusé la tête et fit un peu de binaire pour essayer de trouver une solution pour améliorer mon code (pour écrire beaucoup moins de ligne de code surtout :p )

Voici ma démarche :

Mathématiquement nous avons:
NOT 0 = -1 et NOT 1 = -2

Soit:
(NOT 0)+2 = 1 et (NOT 1)+2 = 0

exemple : notre checkbox est "unchecked" (value=0), on fait checkbox.value=(NOT(checkbox.value))+2 et hop il devient "checked" (value=1) et inversement pour un checkbox "checked" au départ!

Bingo!
Donc nous n'avons qu'à faire une seule affectation par checkbox (au lieu de 2 test et 1 affectation auparavant)!!

Voir le code pour avoir un aperçu concret de mes explications :)

Source / Exemple :


'SANS L'ASTUCE :

Private Sub Inverser_Selection_Click()

if check1.value=1 then
check1.Value = 0
elseif check1.value=0 then
check1.value=1
end if

if check2.value=1 then
check2.Value = 0
elseif check2.value=0 then
check2.value=1
end if

if check3.value=1 then
check3.Value = 0
elseif check3.value=0 then
check3.value=1
end if

End Sub

'===============================================

'AVEC L'ASTUCE :

Private Sub Inverser_Selection_Click()

check1.Value = ((Not (check1.Value)) + 2)
check2.Value = ((Not (check2.Value)) + 2)
check3.Value = ((Not (check3.Value)) + 2)

End Sub

Conclusion :


Aucun bug connu :P

A voir également

Ajouter un commentaire

Commentaires

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
vi, c'est je pense une bonne solution, et pas trop mal en terme de vitesse... une simple soustraction, pas de saut, etc

c'est ce que fais également Le Papa de Thibaut (cf commentaire du 30/12/2006 11:28:13)
Messages postés
1
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
29 mars 2007

Bonjour,
moi je faisais

check1.Value = 1 - check1.Value
Messages postés
20
Date d'inscription
jeudi 27 mars 2003
Statut
Membre
Dernière intervention
9 janvier 2008

OK, suis d'accord pour une bouclette ou deux ça vaut pas le coup, mais si on l'applique tjrs, au fil du temps on en gagne...
A la prochaine...
Messages postés
4531
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
8
Hum j'ai testé par curiosité. Le code produit est similaire à trois ou quatres instructions près (on va me dire oui mais c'est ce qui fait la difference ! lol). A vrais dire si on y regarde de plus près "With" sauvegarde l'adresse de l'objet sur la pile ce qui est potentiellement plus rapide quand on a beaucoup d'acces à l'objet. Hors ici on en a que deux une lecture + une ecriture. Je ne vais pas ajouter tout les listings ce serait inutile mais encore une fois le chemin était plus attrayant que court...

@+
Messages postés
20
Date d'inscription
jeudi 27 mars 2003
Statut
Membre
Dernière intervention
9 janvier 2008

EBArtSoft
Je n'ai pas le temps de tester mais je pense que le code le + rapide que vous avez tous produit pourrait peut être gagner un peu en vitesse avec
with Check1
if .value ...

end with
Si tu as le temps, j'aimerais bien savoir
du moins c'etait explique chez Bill dans une doc....
Afficher les 49 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.