OVH Cloud OVH Cloud

Vrai ou Faux ???

27 réponses
Avatar
MrChris
Salut !

Je ne comprend plus...
J'ai une checkbox dans une template columns d'un datagrid.

Pour récupérer sa valeur je fait :
LeBool = CType(Datagrid1.Items(x).Cells(1).Controls(1), CheckBox).Checked
Puis j'aimerais bien que LeBool me renvoi 0 ou 1 à la place de True ou
False.

Donc je fait cint(LeBool) et la c'est le drame, quand c'est true il me
sort -1 !!!

Idem si je fait ctype(LeBool,Integer), de même si j'essaye avec double,
short, int16...

Pourquoi chez moi true = -1 !!!!!!!!!!!

Merci
MrChris

10 réponses

1 2 3
Avatar
AlexC
Ok merci pour l'info, donc je codais de la manière la plus "performante", à
ne pas retenir donc
Merci
"Zazar" a écrit dans le message
de news:

> iif ? ce n'ets pas une faut de frappe ?
> c'est quoi la différence avec if ?

La syntaxe du iff c'est :
result = iif(expr1, expr2, expr3)

Si expr1 est évalué à true, alors result sera égal au résultat de
l'évaluation de expr2, sinon il sera égal à l'évaluation de expr3.
C'est à peu prés l'équivalent de :
result = expr1 ? expr2 : expr3 qui existe en C, java, c#, ...

Le problème du iff, c'est que expr2 et expr3 sont tout le temps évalué :


ça
diminue les performances et ça peut entraîner des bugs. C'est équivalent à


:
_res1 = expr1
_res2 = expr2
_res3 = expr3
if _res1 then
result = _res2
else
result = _res3
end if

Il vaut mieux lui préfèrer la syntaxe suivante :

if expr1 then
result = expr2
else
result = expr3
end if

--
Zazar




Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut...

Franchement , comment veux tu que la vitesse soit affectée alors que l'on
teste une check box... il ne peut pas y en avoir 200 000
2 + si vous vous prenez la tête sur des détail pareils, vous risquer de vous
égarer et pisser de la ligne en oubliant votre objectif

Conclusion

FAITES SIMPLE et ALLEZ DROIT AU BUT !

@++

LJ
"Patrice" a écrit dans le message de
news:
Comment va être utilisée cette variable par la suite ?

Je ferais plutôt :
Dim LeBool As Boolean
LeBool = CType(Datagrid1.Items(x).Cells(1).Controls(1), CheckBox).Checked

Et plus loin

If LeBool Then
' Si vrai
Else
' Si faux
End If

de façon à ne pas utiliser la valeur sous-jacente utilisée pour coder
"vrai".

Initialement CInt(True) devait retourner 1 mais ceux ayant utilisé en VB


la
valeur explicite -1 ont râlé et MS a fait marche arrière d'où la


différence
entre 1 sous .NET et -1 avec les constructions spécifiques à VB (pour
"compatibilité" avec le code existant).

Patrice

--

"Zazar" a écrit dans le


message
de news:
> > L'avantage du iif est que quelque soit la caleur de true, tu es sûr


que
ça
> > marche...
>
> Qu'est ce que vous entendez par là ?
> Convert.ToInt32 fonctionne tout le temps.
>
> --
> Zazar
>
>




Avatar
Zazar
Je suppose que c'est à moi que vous répondiez.

Franchement , comment veux tu que la vitesse soit affectée alors que l'on
teste une check box... il ne peut pas y en avoir 200 000


2 + si vous vous prenez la tête sur des détail pareils, vous risquer de


vous
égarer et pisser de la ligne en oubliant votre objectif

Conclusion

FAITES SIMPLE et ALLEZ DROIT AU BUT !



Ce que je dis, c'est que
1) iif est une construction dangereuse
2) iif est lent
3) il existe une alternative ne présentant pas ces défauts

Alors dans ces cas là, on ne se demande pas si dans telle ou telle
situation, on peut l'utiliser ou non. On ne l'utilise jamais, c'est tout!
Bon aprés, si votre but c'est d'écrire le moins de lignes de code possible
c'est votre droit.

--
Zazar
Avatar
Pierre Alexis [MVP]
Salut Zazar,

Tu as écrit :

Qu'est ce que vous entendez par là ?
Convert.ToInt32 fonctionne tout le temps.



On n'est pas "sûr" de la valeur renvoyée... En effet un booléen est
généralement définis commme étant un entier égal à 0 si le Booléen est faux,
toute autre valeur s'il est vrai... Il est donc nettement plus propre de faire
sa propre conversion.

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Zazar
>
> Qu'est ce que vous entendez par là ?
> Convert.ToInt32 fonctionne tout le temps.

On n'est pas "sûr" de la valeur renvoyée...


Convert.ToInt32(true) renverra toujours 1 et Convert.ToInt32(false) renverra
toujours 0.

En effet un booléen est
généralement définis commme étant un entier égal à 0 si le Booléen est


faux,
toute autre valeur s'il est vrai...



Non, c'est dans l'autre sens que ça marche. Une valeur nulle est
généralement considérée comme égale à false quand on doit l'assimiler à un
boolean et une valeur non nulle est généralement considérée comme égale à
vraie.
Dans le sens bool->int, il n'y a pas de généralités (et si jamais on devait
faire le compte, je crois que le true->1 l'emporterait largement). C'est la
norme qui détermine éventuellement que faire. Et en .NET, la norme dit que
true se convertit en 1.

Il est donc nettement plus propre de faire
sa propre conversion.



Si la sémantique de la conversion, c'est je veux l'entier qui correspond à
true dans le langage que j'utilise alors il faut utiliser Convert.ToInt32(),
si la sémantique de la conversion c'est je veux utiliser ma propre valeur,
alors là ok on fait sa propre conversion.

--
Zazar
Avatar
Zazar
> > On n'est pas "sûr" de la valeur renvoyée...
Convert.ToInt32(true) renverra toujours 1 et Convert.ToInt32(false)


renverra
toujours 0.



Ok, je crois que je viens de comprendre ce que vous vouliez dire par là :

si quelqu'un utilise cette fonction sans en connaître ses spécifications, il
ne peut pas savoir ce qu'elle va lui retourner.

C'est ça ?

--
Zazar
Avatar
Pierre Alexis [MVP]
Salut Zazar,

Tu as écrit :

Ok, je crois que je viens de comprendre ce que vous vouliez dire par là :

si quelqu'un utilise cette fonction sans en connaître ses spécifications, il
ne peut pas savoir ce qu'elle va lui retourner.

C'est ça ?



Oui. Mais d'un autre côté les arguments que tu as donné en réponse à mon
message tienne bien la route ;-)

"Si la sémantique de la conversion, c'est je veux l'entier qui correspond à
true dans le langage que j'utilise alors il faut utiliser Convert.ToInt32(),
si la sémantique de la conversion c'est je veux utiliser ma propre valeur,
alors là ok on fait sa propre conversion."

Mais bon, moi j'éviterais quand même les codes du genre :

i += Convert.ToInt32(true)

Car ce n'est pas vraiment clair ce qui se passe pour quelqu'un qui relis le
programme. Et ça ne rentre pas vraiment dans la catégorie "je veux l'entier
qui correspond à true dans le langage". En général le programmeur qui écrit ce
genre de code a derrière la tête le fait qu'un Booléen vaut telle ou telle
valeur.

--
Pierre ALEXIS - MVP Visual Basic Classique
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
Ambassadeur Kosh
> Vrai ou Faux ???



blblblblbl... Vrai
Avatar
Zazar
>
Mais bon, moi j'éviterais quand même les codes du genre :

i += Convert.ToInt32(true)

Car ce n'est pas vraiment clair ce qui se passe pour quelqu'un qui relis


le
programme. Et ça ne rentre pas vraiment dans la catégorie "je veux


l'entier
qui correspond à true dans le langage". En général le programmeur qui


écrit ce
genre de code a derrière la tête le fait qu'un Booléen vaut telle ou telle
valeur.



Je suis d'accord. En fait, en poussant encore un peu la reflexion, j'irais
jusqu'à dire que je ne vois pas l'intérêt de convertir un booléen en int
quelque soit la méthode. Ca revient à détyper une variable booléenne.

Je ne vois pas quelle logique justifierait un code du style :
i += Convert.ToInt32(true) ' ou MyConvert(true)

Je préfèrerais un code du genre :
if (true) then i += 1 'ou autre valeur

--
Zazar
Avatar
ng
Salut,

En .Net le type boolean renvoie 1 pour True et 0 pour False, CInt()
renvoie -1 pour True pour garder la compatibilité avec les aplications VB6
(qui utilisent un type VARIANT_BOOL : -1 pour True (ou toute autre valeur
diffèrente de 0) et 0 pour False).

De plus CInt() est censé renvoyer un integer vb6 (l'équivalent du short
.Net) c-a-d codé sur 16bits et non 32.
En .Net on utilisera donc Convert.ToInt32() pour récupèrer un entier sur
32bits.


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



MrChris a écrit :

Salut !

Je ne comprend plus...
J'ai une checkbox dans une template columns d'un datagrid.

Pour récupérer sa valeur je fait :
LeBool = CType(Datagrid1.Items(x).Cells(1).Controls(1),
CheckBox).Checked Puis j'aimerais bien que LeBool me renvoi 0 ou 1 à
la place de True ou False.

Donc je fait cint(LeBool) et la c'est le drame, quand c'est true il me
sort -1 !!!

Idem si je fait ctype(LeBool,Integer), de même si j'essaye avec
double, short, int16...

Pourquoi chez moi true = -1 !!!!!!!!!!!

Merci
MrChris


1 2 3