Vrai ou True dans les API

Signaler
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
-
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
-
bonjour à tous
je suis sous window vista (je ne sais si cà a de l'importance, car je n'avais jamais auparavant détecté ce problème).
donc j'ai voulu faire un petit prog pour gérer l'écran de veille, donc j'utilise cette fonction déclaré ainsi
Private Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" ( _
                        ByVal uAction As Integer, _
                        ByVal uParam As Integer, _
                        ByRef lpvParam As Any, _
                        ByVal fuWinIni As Long) As Integer
dim veille as boolean

et bizarement dans mon prog lorsque je teste la variable veille
msgbox veille            'affiche alors Vrai
if veille= true then ... 'et là même si veille est Vrai la fonction IF ne la considère pas à true!!!
j'ai donc essayé
if veille = Vrai then...   'et là ça ne fonctionne pas non plus la variable Vrai étant considéré comme vide
donc ce qui fonctionne c'est
if veille then....       'là la fonction IF considère bien veille comme étant vrai ou true!!

voilà ça j'ai réglé mais après ça la fonction systemparametersinfo pour activé ou désactivé l'écran de veille utilise comme 2 ième paramètre une valeur qui va activé ou désactivé l'écran de veille
donc si j'utilise la valeur de ma variable boolean "veille"
Ret = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, veille, Null, 0)
la fonction renvoi bien ret=1 comme si elle avait pris en compte la demande mais lorsqu'on interroge la fonction en faisant
Ret = SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, mem, 0)
alors "mem" ne donne pas le toujours même  résultat! si veille est à vrai donc pour activer l'action passe "mem" est aussi à vrai, mais si je veux désactiver et passer veille à faux alors là l'action ne passe pas et "mem" renvois vrai comme quoi la veille est toujours active!
Alors autre bizarerie je n'ai ce dernier défaut que si mon prog est compilé sous Vb pas de problème.
j'ai donc résolut ce dernier prob en :
        If veille Then
        Ret = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, True, Null, 0) 
        Else
        Ret = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, False, Null, 0) 
        End If

Que pensez vous de tout ceci

11 réponses

Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Tout ce que cela m'inspire, c'ets que c'est une bonne raison de ne pas passer à Vista ! Surtout si tu développes en VB6, qui manifestement n'apprécie pas Vista (ou l'inverse ?)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
vista s'en fiche... VB6 fonctionne sans soucis.

assures toi d'avoir bien 'Option Explicit' tout en haut de tes modules.
relis bien la doc MSDN concernant les APIs employées
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Rien à voir avec Vista,
Vraisemblablement tu mélanges des integers et des booléens.
Petit rappel :
Un booléen vaut False si tous ses bits sont à 0, True sinon.
Pour peu que tu fasse une conversion implicite et que tu affecte un integer à ta variable booléenne, si vb6 utilise un comparaison d'entier et non de booléen, il est tout à fait normal que (veille = true) soit faux.
Par contre lorsque tu fais If veille Then, il fait bien un test de booléen.

Ca me semble surtout une bonne raison de passer à .Net, qui ne t'aurait pas permis cette conversion implicite, et t'aurais forcé à écrire une véritable expression booléenne , comme par exemple :
Dim iVeille as Integer
iVeille = ...
Dim bVeille as Boolean
bVeille = (iVeille > 0)

<hr size="2" width="100%" />Julien.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
If veille Then
n'est pas plus une comparaison de "booleen" qu'autre chose, un test IF vérifie si NON ZERO et rien d'autre. C'est exactement ce qu'il faut toujours faire, que soit du bool ou nimporte quel autre type.
If var = True Then EST A BANNIR DEFINITIVEMENT.

ciao...
BruNews, MVP VC++
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
et If (var=true) = true then ?
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
moi, je préfère écrire ceci
If Not ((Var True) False) Then ...

Je trouve cela bcp plus clair !! ;)

OK ! Je sors ...
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
1
bonsoir à tous

merci pour vos réponses
j'ai bien déclaré option explicit
si j'ai bien compris lorsqu'on veut faire
une comparaison d'un booleen donne faux si le résultat de la comparaison est égal à 0 est vrai  pour tout autre résulat?!
donc on devrait écrire ceci même si veille est déclaré dim veille as boolean :
if veille=0 then 'pour faux ou
if not(veille=0) ' pour vrai
donc je pense que la fonction SystemParametersInfo ne renvois pas obligatoirement un booleen!
et je pense aussi que le type des variables utilisé par window ne sont pas totalement identique à VB!

mais dernier point comment expliquez vous qu'une fois compilé les réponses ne sont pas identiques au logiciel non compilé

merci A+
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Bon alors c'est vrai que ce que tu écris te donnerais les bonnes réponses, toutefois, c'est assez ridicule de passer par de telles artifices lorsque tu peux faire
If veille Then
If Not veille ThenSinon, pourquoi ne pas faire If (vartrue) true then comme l'a ironisé (oui c'était ironique) Renfield ?

"et je pense aussi que le type des variables utilisé par window ne sont pas totalement identique à VB"
-> Windows est un système d'exploitation, pas un langage, les déclarations d'API sont différentes selon le langage utilisé, à toi de prendre la bonne. Celle que tu as là semble bonne, mais tu remarqueras qu'elle ne contient aucun booléen, d'où peut-être ton erreur...

"mais dernier point comment expliquez vous qu'une fois compilé les réponses ne sont pas identiques au logiciel non compilé"
-> Tu peux expliciter ?

<hr size ="2" width="100%" />Julien.
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
If Not veille Then ne marchera pas !

pour en faire la demonstration tapez ceci :

print (not 1)
-2
print (not -1)
 0

0 sera egal a "false" mais pas -2 tandis que 1 et -1 seront tout deux des valeurs non nul !

voila c'est demontré ;-)

E.B.
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
C'est juste...
Toujours est-il que le vrai problème, il me semble, est d'assigner une valeur entière à un booléen... Alors qu'il suffirait de remplacer
b = i
par
b = (i > 0)

<hr size="2" width="100%" />Julien.
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
Oui deja... c'est pas malin.

E.B.