[ASTUCE] INVERSER LA SÉLECTION FACILEMENT AVEC DES CHECKBOX

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 24 déc. 2006 à 16:32
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 29 mars 2007 à 16:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40844-astuce-inverser-la-selection-facilement-avec-des-checkbox

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2007 à 16:45
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)
crasho Messages postés 1 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 29 mars 2007
29 mars 2007 à 16:37
Bonjour,
moi je faisais

check1.Value = 1 - check1.Value
cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008
2 janv. 2007 à 20:49
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...
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
2 janv. 2007 à 19:00
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...

@+
cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008
2 janv. 2007 à 18:29
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....
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
2 janv. 2007 à 18:16
castagne> Oui tu as raison sur ce point depuis VB5 on peut compiler en "code natif" et vb tente d'optimiser le programmes autant que possible. C'est pour cela qu'il est judicieu d'observer constament les listings quand on parle d'optimisation en VB. Pour ce qui est du "Select" comme je le dit souvent : "Le meilleur code c'est avant tout celui qu'on maitrise"

;)

Bonne pr@g
cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008
2 janv. 2007 à 18:07
EBArtSoft>>
Ok merci de me rafraichir la mem , je n'avais pas regarde depuis du VB3, donc chez Bill ils se sont améliorés dans les compils. Quoiqu'il en soit, je garde le select case autant que je peux, question de lisibilite personnelle. Dur dur de veillir...et de changer.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
2 janv. 2007 à 17:56
castagne> Comme tu m'as l'air un peu au courant du fonctionnement de vb je te laisse aprecier le listing suivant. Tu remarqueras que le compilateur n'est pas aussi bete qu'il n'y parait et que pour deux scripts differents d'un point de vue syntaxe il n'en a fait qu'un seul et meme code machine... Comme quoi "il ne faut presumer de rien" :

; 47 :
; 48 : '============================
; 49 : ' Test du Select
; 50 : '============================
; 51 : Select Case Check1_Value

00040 8b 46 34 mov eax, DWORD PTR [esi+52]
00043 33 d2 xor edx, edx
00045 85 c0 test eax, eax
00047 0f 94 c2 sete dl
0004a 89 56 34 mov DWORD PTR [esi+52], edx

; 52 : Case vbUnchecked
; 53 : Check1_Value = vbChecked
; 54 : Case Else
; 55 : Check1_Value = vbUnchecked
; 56 : End Select
; 57 :
; 58 : End Sub


; 61 :
; 62 : '============================
; 63 : ' Test du If
; 64 : '; 65 : If (Check1_Value vbUnchecked) Then

00040 8b 46 34 mov eax, DWORD PTR [esi+52]
00043 33 d2 xor edx, edx
00045 85 c0 test eax, eax
00047 0f 94 c2 sete dl
0004a 89 56 34 mov DWORD PTR [esi+52], edx

; 66 : Check1_Value = vbChecked
; 67 : Else
; 68 : Check1_Value = vbUnchecked
; 69 : End If
; 70 :
; 71 : End Sub

@ la prochaine :p
cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008
2 janv. 2007 à 17:41
EBArtSoft
ce n'est pas le code VB qu'il faut regarder mais le prog compilé en langage machine.Les comparaisons de ce type se font entre 'accumulateur' et la valeur à comparer. Or dans le if, il faut d'abord pusher la variable et la comparer et ce autant de fois que de if. a chaque push , on sauve l'environnement.....
Il faut savoir que la gestion memoire de VB est completement differente du C par exemple.VB deplace en permanence les variables. Donc moins on en fabrique, + ça va vite. Il n'y a pas de vrais pointeurs en VB à la diff du C
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
2 janv. 2007 à 17:10
castagne> Plus rapide que quoi ?

Il ne peux pas etre "LE" plus rapide car il test les valeurs les une apres les autres c'est comme si tu ecrivais :

If (Check1.value = vbUnchecked) then
Check1.Value = vbChecked
Goto Suite
Endif

Check1.Value = vbUnchecked

Suite:

...

Par consequent comme en mathematique il faut developper l'expression et lorsque celle ci est developpé on peut comparer. Comme je le disais plus haut il ne faut pas ce fier au script. Ce n'est pas par ce qu'il semble plus simple qu'il est forcement plus rapide.

@+
cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008
2 janv. 2007 à 14:08
une autre façon
Select Case Check1.Value
Case vbUnchecked
Check1.Value = vbChecked
Case Else
Check1.Value = vbUnchecked
End Select
pas de test de vitesse mais le select case est tjrs + rapide
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
1 janv. 2007 à 20:08
Et béh on les aura tous passés =)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
1 janv. 2007 à 20:04
pourquoi pas on est pas a ça pres :p
cs_caramelmou Messages postés 56 Date d'inscription jeudi 25 décembre 2003 Statut Membre Dernière intervention 23 avril 2008 3
1 janv. 2007 à 14:44
Juste comme ça: Pour éviter ces tests(If,IIf,Select..), est ce qu'il ne serait pas aussi simple et propre (ne pas utiliser de valeur implicites de vbChecked et vbUnchecked)
d'utiliser un tableau (ce qui permet en outre de gerer un nombre d'états superieur à 2)

Ex:
Dim clickCheck(3) As Long
Private Sub Command1_Click()
Me.Check1.Value = clickCheck(Me.Check1.Value)
End Sub

Private Sub Form_Load()
'initialisation du tableau (on cycle sur les 3 états)
clickCheck(vbChecked) = vbUnchecked
clickCheck(vbUnchecked) = vbGrayed
clickCheck(vbGrayed) = vbChecked
End Sub

BONNE ANNEE.. ;-)
xminou Messages postés 1 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 1 janvier 2007
1 janv. 2007 à 11:52
Bonne année à toutes et tous.

Cette séance de pêche à la ligne avec un fil très long est un régal.
JoNasx86 Messages postés 14 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 30 décembre 2006
30 déc. 2006 à 14:08
Et bien en tout cas ça fait plaisir de voir autant d'engouement pour une si petite astuce de programmation! :) Il y a beaucoup de solutions je m'en rends compte grâce à vos posts et il est vrai que chacune correspond à un profil de code particulier : optimisé, clair, concis.

Le fait est qu'il est très bien de proposer au programmeur plusieurs solutions, commentées et classées par catégorie (voir 3 lignes plus haut) afin que celui-ci choisisse en tout etat de cause et par la même (comme moi et comme nous tous ici :) apprenne quelquechose de nouveau en s'apercevant comment les solutions sont diverses et variées et en les comparant par lui même.

Non réellement vous n'avez pas "pourri" mon post, vous y avez apporté le débat mainte fois négligé et pourtant si necessaire à une elaboration plus judicieuse des logiciels :)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
30 déc. 2006 à 13:01
Biensur ou alors :

Check1.Value = (Check1.Value + 1) Mod 3

Enfin ya tellement de solution mathematique qu'il est inutile de toutes les exposer dans ce thread.

@+
Le Papa de Thibaut Messages postés 53 Date d'inscription mercredi 22 novembre 2006 Statut Membre Dernière intervention 7 mars 2015 1
30 déc. 2006 à 11:28
>> si check1.Value n'a que 2 valeurs possibles (0 et 1 et que l'on sait que l'on peut exclure la valeur 2 (grisé)), je préfère utiliser la formule

check1.Value =1 - check1.Value

>> si on considère les 3 valeurs de check1 (checked/unchecked et grayed), il faut écrire

check1.Value = 1 - (check1.Value /2 )
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
27 déc. 2006 à 19:20
Béh didonc c'est parti loin :)

pauvre fonction "Iif" elle en à pris plein sa poire lol !

Non, intéressant ss blague je croyais pas en apprendre autant sur une simple ligne :p

DARKSIDIOUS > Je ne prolongerai pas plus le débat, vu qu'on a déjà bien pourri la source de notre ami JoNasx86, mais je t'invite à en parler en mp si tu veux. <<== Moi je veux bien que vous veniez me pourrir toutes mes sources comme ça ;)
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 15:27
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 déc. 2006 à 15:03
Et si tu faisais le test avec les tois methodes ?

- Par Calcule
- Avec IIf
- Avec If

ça pourrait être interresant

@+
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 14:54
Dark ==> Ok, j'ai compris, merci ^^

EB ==> lol ;) Je n'ai jamais dit une seule seconde que le If était moins rapide que le IIf, bien au contraire :
"-6400 ms de moyenne pour IIf
-6100 ms de moyenne pour If..Then"
Je suis évidemment convaincu que le IIf est plus lent !

Et pour compléter, je donnerais les résultats du test que je donne plus haut (la modification du tien)
-IIf : 3000
-If : 469
Et effectivement, la différence entre If et IIf est bien plus flagrande avec des Functions dans les paramètres du IIf que de simples nombres.


Ce que je m'efforce à dire, c'est que mon test est valable et que la méthode en "+2" est la plus rapide des méthodes, c'est tout !

@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 déc. 2006 à 14:49
Non je suis desolé mais ton test est faux. C'est comme le vendeur de voiture d'occasion qui s'eforce de maquiller la portiere rouiller de son taco ! If sera quoi que tu fasses toujours plus rapide que IIf (Pour un test equivalent biensur) ! Premierement par ce que IIf est une fonction (donc test de pile et appel lointain) qui prend comme parametre trois variants (donc conversion et encore une fois utilisation de la pile) et puis surtout par ce que IIf execute les deux conditions ! Alors forcement si tu place 1 et 2 ou bien True et false ça tu peux metre autant de boucle que tu veux tu testeras le vent ! Alors oui c'est sur + ou - 1 millieme de seconde youhouuu j'ai gagné !! Mais non erreur tu pourrais mettre n'importe quelle fonction de base a la place ce serait pareil. Un If en language machine c'est deux instructions CMP + JMP rien de plus. Un IIF c'est des centaines d'instructions des dixaines d'acces à la pile c'est par consequent incomparable.

Regarde mon test... il est juste lui aussi. Alors dans ce cas suffit de faire la moyenne entre ton test et mon test. Donc dans le plus optimiste des cas on aurait un IIf de vitesse equivalente (enfin selon toi) avec une syntaxe pas forcement meilleure (surtout dans le cas de grand test) et surtout avec un gros potentiel de risque et qui m'execute deux fois plus d'instruction script que l'autre ! L'autre, c'est un petit If innofencif de meme vitesse tres lisible et surtout natif ! Le choix est fait je veux le petit If !!!

Lol pas de probleme le If est vainqueur.

@+
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 déc. 2006 à 14:46
pour le 0 ou 1, y'a pas de problème, vb ne les interprête pas, mais pour des instructions plus complexes, là tu sens la différence !

Le iif, c'est bien beau, mais dans la grande majorité des cas (c'est quand même rare de faire une affectation conditionnelle sur uniquement 2 valeurs possibles), ca rend le code moins rapide, et surtout, ca peut provoquer des erreurs qu'on ne rencontre pas avec un classique test if then else

Je ne prolongerai pas plus le débat, vu qu'on a déjà bien pourri la source de notre ami JoNasx86, mais je t'invite à en parler en mp si tu veux.

DarK Sidious
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 14:39
" Lol, pour ton test du iif sur le checkbox, c'est normal : vb n'ira pas interprêter 0 ou 1, essaye plutôt :"

> J'avoue que je ne comprend pas... Quel est le problème à mettre directement 0 ou 1 ?
@+
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 déc. 2006 à 14:35
non non aucune raison particulière, tu peux le stocker dans un byte aussi (en théorie, ca serait plus rapide sur un long d'ailleurs)
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 déc. 2006 à 14:34
Lol, pour ton test du iif sur le checkbox, c'est normal : vb n'ira pas interprêter 0 ou 1, essaye plutôt :

a = GetTickCount
For x = 1 To 1000000
Check1.Value iif(Check1.Value 0, Check1.Value + 1, Value - 1)
Next x
a = GetTickCount - a
MsgBox CStr(a)


a = GetTickCount
For x = 1 To 1000000
If Check1.Value = 0 Then
Check1.Value = Check1.Value + 1
Else
Check1.Value = Check1.Value - 1
End If
Next x
a = GetTickCount - a
MsgBox CStr(a)

Là c'est tout de suite plus parlant !
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 14:33
"Sinon, c'est très très mal codé de faire :
For (For i=A to B Step IIf(A>B,-1,1)

Car à chaque tour de boucle, il fera le test !
Il vaut mieux faire :
Dim dStep As Double
dStep = IIf(A>B,-1,1)
For (For i=A to B Step dStep"

> Oui oui, tout à fait, j'en suis totalement conscient et dans la pratique je stocke également le IIf dans une variable ;)
Mais perso je le stocke dans un Byte, et toi dans un Double. Une raison particulière pour ce type de variable (qui concomme davantage en mémoire) ?

@+
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
27 déc. 2006 à 14:30
Petite précision sur le IIf :
Le IIf est une fonction => tout les paramètres sont évalués lors de l'appel de la fonction, alors que If est une instruction du langage qui veut que seul le bout de code correspondant au test rattaché est évalué.

Exemple :
If (a <> 0) Then
a = b / a
Else
a = b
End If

a = IIf(a <> 0, b / a, b)

Ceci est très dangeureux dans ce cas de figure (et dans bien d'autres !), et surtout, cela explique la lenteur du Iif par rapport au if !

Sinon, c'est très très mal codé de faire :
For (For i=A to B Step IIf(A>B,-1,1)

Car à chaque tour de boucle, il fera le test !
Il vaut mieux faire :
Dim dStep As Double
dStep = IIf(A>B,-1,1)
For (For i=A to B Step dStep

Bon c'est sûr, c'est pas grand chose, mais sur une instruction de test un peu plus longue, ca se ressent !

DarK Sidious
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 14:24
Oui mais non :)

Si je fais :

a=Gettickcount
For x=1 to 1000000
check1.value=iif(check1.value=0,1,0)
Next x
a=gettickcount-a
msgbox cstr(a)

ou bien

a=Gettickcount
For x=1 to 1000000
if check1.value=0 then
check1.value=1
else
check1.value=0
end if
Next x
a=gettickcount-a
msgbox cstr(a)


la boucle For prend strictement le même temps dans les 2 cas (en tout cas en moyenne sur 5 fois 1000000 itérations). Donc la différence de temps observée entre 2 méthodes, et je dis bien la différence, est due à la différence de temps pris par la méthode au milieu du For (uniquement).


Et pour reprendre ton exemple, un appel de IIf ou de If prend bien moins de 1ms, donc indécelable par le type Long du GetTickCount. Donc en faisant n fois l'appel au IIf, la somme des n appels au IIf (ou au If) prend n fois quelque chose de faible en temps d'exécution, mais au final ce n'est plus négigeable.
Certes le temps d'exécution dû au For n'est lui non plus pas négligeable, mais est par contre identique dans les 2 méthodes, la comparaison reste donc valable.
Je dis bien la comparaison : si je trouve que 10000 IIf prend 500ms, c'est faux car le For prend aussi du temps dans ces 500ms. Mais si je dis que 10000 IIf prend 500 ms et 10000 If prend 10 ms, je peux affirmer que le If est plus rapide.

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command2_Click()
Dim a As Long
Dim b As Long
Dim x As Long

a = GetTickCount()
For x = 1 To 10000000
b IIf(a 1, c, d)
Next x
MsgBox "IIf : " & GetTickCount - a

a = GetTickCount()
For x = 1 To 10000000
If (a 1) Then b c Else b = d
Next x
MsgBox "If :" & GetTickCount - a

End Sub
Function c() As Long
c = 1
End Function
Function d() As Long
d = 1
End Function


voilà la différence ;)

(me trompe-je dans mon raisonnement ?)
@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 déc. 2006 à 14:04
Ahah ouai forcement... mais dans ce cas as tu testé IIf ou for ? et oui c'est toujours comme ça dans les bench faut bien regarder ce que l'on test ! Voila mon test (meme pas besoin de for/next) :

Option Explicit

Private Sub Command2_Click()

Dim a As Long
Dim b As Long

a = GetTickCount()
b IIf(a 1, c, d)
MsgBox "IIf : " & GetTickCount - a

a = GetTickCount()
If (a 1) Then b c Else b = d
MsgBox "If :" & GetTickCount - a

End Sub

Function c() As Long
Sleep 1000
End Function

Function d() As Long
Sleep 1000
End Function

Et boom... voila comment on casse un mythe ;p
(Ok, j'abuse un peu mais qu'importe... c'est vrai !)

@+
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 13:51
Salut, alors pour la méthode de comparaison : bien entendu, mode compilé, code natif etc...
J'ai pris très simplement deux temps GetTickCount, un avant et un après une boucle For de 100000 ou 1000000 (je me rappelle plus du nombre d'itérations) avec uniquement une des procédures à tester au milieu.
C'est peut être primaire, mais il me semble que c'est valable comme test ?
Pour les résultats, çà se tient vraiment :
-6400 ms de moyenne pour IIf
-6100 ms de moyenne pour If..Then
-6150 ms de moyenne pour le code avec Abs
-6020 ms de moyenne avec la méthode +2
J'ai fait une moyenne sur 5 essais de chacune des méthodes.



Pour le test du IIf, j'avoue que c'est assez dingue comme résultat ^^
Je n'utilise en général IIf que comme Step dans les boucles For (For i=A to B Step IIf(A>B,-1,1) donc pas de problème ici), mais je retiens la dangerosité de cette méthode !

@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 déc. 2006 à 13:42
violent_ken> Quelles est ta methode de comparaison ? chez moi rien ne bat le If ! Je parle evidament du mode compilé avec toute option coché ! Car on ne compare rien en mode IDE cela va de soit.

Pour ce qui est de IIf, forcement dans la cas present on ne risque pas grand chose mais voici un exemple plus parlant :

Debug.Print IIf(1 = 1, MsgBox("Pas de probleme"), MsgBox("Gros probleme"))

Je te laisse executer ce code dans l'ide pour que tu puisses aprecier les risques potentiels. Tu veras ça ce passe de commentaire.

@+
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
27 déc. 2006 à 12:26
Salut, j'ai lu tous vos commentaires, c'est intéressant ;)

Mais juste une question : pourquoi dire "Attention IIF est une fonction ! donc vb va tester les deux conditions ! donc perte de temps et faille de securite potentielle !" ?

Je trouve la ligne de code
Check1.Value IIf(Check1.Value vbChecked, vbUnchecked, vbChecked)
très explicite, et ma foi, même si je sais que IIf n'est pas particulièrement rapide, je ne vois pas trop qu'est ce qui pourrait poser problème ?


Pour rentrer dans le débat même, je dirais que la solution la plus rapide (pour avoir comparé toutes celles énoncées) reste quand même celle proposée par JoNasx86.
Alors certes, elle est tout sauf explicite et je recommande moi aussi le bon vieux
If Check1.Value = vbChecked Then
Check1.Value = vbUnchecked
Else
Check1.Value = vbChecked
End If
mais il n'empeche que c'est moins rapide ;)

@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
27 déc. 2006 à 08:58
Mayzz> ahah non non t'inquiete pas tu n'offences personne (enfin je crois lol) et comme tu dis ici tout le monde debute, tout le monde tatonne. Il est evident que personne ne sais TOUT. Au contraire c'est sympa comme discution. Et puis tu sais tout ça est cyclique, a chaque nouvelle tête les même sujets revienne inlassablement ce qui ce comprend mais on a l'impression parfois de de n'avoir rien fait, de n'avoir apporté aucune pierre a l'edifice. C'est juste un probleme d'ego en somme car la realité c'est que tout evolue tout bouge. Ce qui etait vrai avant ne l'ai plus forcement aujourd'hui, les nouvelles generations remplacent les ancienne et parfois certain savoir ce perdent, d'autres apparaissent.

Bref... lol on lui a un peu pourri sa source à JoNasx86 du coup !

Aller Mayzz... continue de donner ton avis de toute façon il y aura toujours quelqu'un pour dire le contraire que tu es raison ou pas :p et puis c'est comme ça qu'on apprend.

B@nne prog et @+
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
26 déc. 2006 à 23:51
Tu as raison EBArt, et j'avais compris ta démarche, mais après chacun à son niveau et le site basé sur un principe d'échange et de partage de savoir, tant qu'il n'y as pas d'abus ou d'excès (comme c'était le cas y a un temps pour les programmes de lamers par exemple...) ben je pense que le site garde sa crédibilité.

D'autre part je pense que vb est un langage de prog simplifié, qui nous évite justement d'avoir à nous plonger dans des connaissances approfondies du langage machine (ce qui est parfois dommage...) c'est pour cela que l'on plus un regard sur le script, et la propreté du code même si cela n'est parfois pas justifié.

C'est juste pr dire au finale que j'ai appris le vb sur un bouquin, en peu de temps et que je n'ai quasi aucune connaissance de la façon dont un pross gère les instructions, et je pense que ce doit être la même pr une partie des membres de vbfrance. Ce que l'on regarde particulièrement c'est le résultat finale, il est rare que l'on rentre ds le détail.

Désolé si je t'ai offensé avec mon poste plus haut je ne voulais pas faire pété une science que je n'ai pas ou te contredire mais juste exprimé une chose que je pensait être juste.

++
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
26 déc. 2006 à 19:58
Mayzz> Si on dit ça c'est pas pour blamer les programmeurs ou casser les sources mais seulement pour faire partager notre maigre mais juste experience. Le probleme avec VB (surtout avec vb6) c'est que ce que l'on ecris n'est pas forcement interpreté comme on le crois par le compilateur.

Donc quand on propose une source "complete" on l'apreci dans sa globalité on ne commente pas forcement dans le detail. Par contre face a une source comme celle ci tu penses bien qu'on va rechercher la petite bête ! On ne peut pas ce permetre de laisser dire n'importe quoi il en va de la credibilité du site. Alors comme sa ça parait anodin mais par respect pour tout les autres vébiste qui en on marre d'être traité comme des sous-programmeurs il faut être serieu un minimum et voir la realité des choses. Au final seul le code machine peut être comparé pas le script !

@+
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
26 déc. 2006 à 19:08
EBArtSoft > : Je me résigne lol =)

Je ne pensait pas que quelques lignes comme celle ci donnerait le droit à des commentaires si poussés, tant mieux plus on en as plus on avance (enfin je dit ça pour moi)...

Ah ces petites choses parfois insignifiantes...
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 déc. 2006 à 09:33
Je suis à 100% d'accord avec notre ami EB !

Ca ne sert à rien d'essayer d'avoir un code le plus court possible si c'est pour le rendre moins lisible ou moins optimisé !

Ici, check1.Value = ((Not (check1.Value)) + 2), je trouve ca vraiment pas lisible du tout ! (pourquoi un +2 par exemple !!!).

Idem pour :
if check1.value=1 then
check1.Value = 0
elseif check1.value=0 then
check1.value=1
end if

Perso, je lui préfère :
If Check1.Value = vbChecked Then
Check1.Value = vbUnchecked
else
Check1.Value = vbChecked
end if

=> 1 seul test, une seule affectation, pas de calcul, code parlant, et je pense pas qu'il existe plus optimisé !
Ca prend 5 lignes de code, certes, mais c'est bien plus élégant que
check1.Value = ((Not (check1.Value)) + 2)

DarK Sidious
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
25 déc. 2006 à 22:40
Mayzz> je ne suis pas d'accord, car on peux decliner le code en un millier d'autre solution toute aussi farfelue. Et puis on prend l'habitude de laisser ça et la des solutions de fortune. Le processeur lui ne vois que le code final. Dans le cas d'un calcule tout un tas de registre sont utilisées, des variables sont placé sur la pile et plusieurs conversions de variant sont effectué. Je ne rentrerais pas dans le detail de la machine virtuelle de VB mais dans le cas present rien ne vaux le "if" > "then". Ok ce n'est pas vitale mais dans quand on post un code aussi simple il faut avoir fait le tour des solutions, les tester et surtout choisir la meilleur (et ce n'est pas forcement celle qui est la plus courte a ecrire).

@+
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
25 déc. 2006 à 22:23
Exacte EBArtSoft, mais pour changer la valeur d'un checkbox la rapidité n'est pas recherché...

Enfin c'est vrais que le calcul reste plus approprié, je trouve ca plus propre.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
25 déc. 2006 à 14:00
ou bien encore sur une seule ligne :

If Check1.Value Then Check1.Value 0 Else Check1.Value 1

Attention IIF est une fonction ! donc vb va tester les deux conditions ! donc perte de temps et faille de securite potentielle !

@+
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
25 déc. 2006 à 13:57
ou encore : Check1.Value = -(Not -(Check1.Value))
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
25 déc. 2006 à 13:55
Check1.Value = Abs(Not CBool(Check1.Value)) !!!

Aller hop pas la peine d'en faire un pavé

@+
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
24 déc. 2006 à 19:18
Chez moi aussi sans le +2 c'est valeur de propriété invalide, cela dépend peut être des version de vb... ou de msvbvm60.dll
JoNasx86 Messages postés 14 Date d'inscription jeudi 19 mai 2005 Statut Membre Dernière intervention 30 décembre 2006
24 déc. 2006 à 17:53
@Willy : Ha bon? Chez moi (VB6 enterprise) il m'envoit un "improperty value" lors de l'éxécution... Mais bon si chez toi ça marche sans +2 et bien tant mieux! :)

@Mayzz : C'est vrai avec un IFF ça marche aussi bien!

Pour ce qui est du réveillon je dirai qu'il n'y a pas de bonne ou de mauvaise époque pour fréquenter vbfrance ou pour programmer!
"Ya pas d'heure pour les braves" (programmeurs)! :)
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
24 déc. 2006 à 17:38
dsl g un petit probleme de clavier on dirait...






... et de lunettes aussi :X

Ps: J'ai une excuse lol, il est 17h30 et je vien de me levé =) mais shuut !
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
24 déc. 2006 à 17:33
Salut !

l'instruction IIF est la pour ca :

Check1.value Iif(Check1.value 0, 1, 0)

mais ton code est marche très bien aussi :)

PS: je ne sais pas mais je pensai être le seul à développer et à fréquenter vfrance à quelques heures du réveillon de noël mais apparement... Enfin ça fait plaisir ;)

Bonne prog @ts et bonnes fêtes
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
24 déc. 2006 à 16:32
sans '+ 2' le résultat est le même...
Rejoignez-nous