OVH Cloud OVH Cloud

Faire le contraire de l'api animateWindow ???

14 réponses
Avatar
LE TROLL
Bonjour,

A l'ouverture chat va, mais à la fermeture il n'est pas possible de
faire le contraire de l'ouverture, y aurait-il une manoeuvre particulière ou
une autre API ???

Le code :

Private Declare Function AnimateWindow Lib "user32" ( _
ByVal hWnd As Long, ByVal dwTime As Long, ByVal dwFlags As Long) As Long
' (&H + ) : > = 1, < = 2, V = 4, /\ = 8
' réduit = 10, cache = 1000, active = 2000, roule = 4000, fond = 8000

Sub Form_Load()
Dim r As Long
r = AnimateWindow(Me.hWnd, 2000, &H10)
End Sub

Sub Form_Terminate()
Dim r As Long
r = AnimateWindow(Me.hWnd, 2000, &H10)
End Sub

Merci, cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.

4 réponses

1 2
Avatar
Jean-marc
Jean-marc wrote:
LE TROLL wrote:
Merci Jacques (Jean-Marc aussi),

Le "OU" je ne comprends pas, je me souviens d'avoir appris un truc
à 2 "ou" en tc3++, mais je n'ai jamais utilisé, alors je ne comprends
pas le mécanisme "ici" ?



Tu as raison, c'est un peu déconcertant pour qui n'est pas familier de
la chose.
Il y a 2 sortes de OU : le OU logique, et l'opérateur bit-à-bit OU de
l'agèbre de boole, qu'on appelle aussi OU arithmétique.

Le problème de compréhension vient du fait que VB représente ces 2
opérateurs
(OU logique et OU arithmétique) de la même façon: Or.

[En C par exemple, le OU logique est noté "||" alors que le OU
bit-à-bit est noté "|".]

Par exemple le ou classique, exclusif, qui exclut ceci ou cela : if x
< 10 or x > 10 (seule le 10 passe, ça exclut le reste)...



Ce "ou" , c'est le OU Logique (ça ne s'appelle pas un ou exclusif: un
ou exclusif, c'est autre chose - voir plus loin)

Le OU logique, c'est facile: c'est un opérateur booléen qui obéit
à la table de vérité bien connue:

A Or B
+------+--------+-------+
| A | False | True |
|B | | |
+------+--------+-------+
| False| FALSE | TRUE |
+------+--------+-------+
| True | TURE | TRUE |
+------+--------+-------+

Donc quand on écrit en VB:

If A or B Then
=> EXECUTE CECI
End If

Le code après le If est exécuté si A est Vrai, ou Si B est Vrai.

NOTE: Ce n'est PAS un OU Exclusif : un OU Exclusif, encore appelé XOR
est légèrement différent. Sa table est :

A XOr B
+------+--------+-------+
| A | False | True |
|B | | |
+------+--------+-------+
| False| FALSE | TRUE |
+------+--------+-------+
| True | TURE | FALSE |
+------+--------+-------+

Tu vois la différence : Si A et B sont tous 2 VRAI, alors A XOR B est
faux.
En VB il n'y a pas de XOR, mais on s'en sort quand même car:

A XOR B = (A And NOT(b)) OR (not(A) And B)
A


Mais là, en fait ça veut dire : si 1 n'est pas ça alors fait 2 et si
2 n'est pas ça alors fait 3 ? Ou ça veut dire, fait un, puis 2 puis 3
? Ou encore : fait 1 et 2 et 3 ?
Et bien le OU de l'API il ferait quoi, peux-tu me l'expliquer par
d'autres signes ou un case, ce doit être faisable ?



Oui, ici on emploie le Or en tant qu'opérateur bit-à bit. IL est très
courant en informatique d'utiliser un entier long (donc sur 32 bits)
pour stocker plein de petites valeurs booléennes.
Et l'opérateur Or sert à mettre à 1 les bits nécessaires. De même le
And bit-à-bit servira à fabriquer des masques de bits.

Le fonctionnement du Or est simple. Il agit avec les bits comme le Or
logique avec les booléens.
0 Or 0 = 0
0 or 1 = 1
1 or 0 = 0
1 or 1 = 1

Exemple pratique

const TOTO = 1
Const TITI = 2
Const TUTU = 4
Const TATA = 8

(tu noteras qu'on utilise uniquement des puissances de 2, pour des
raisons évidentes: ainsi, un seul bit à la fois est à 1 dans la
représentation binaire du nombre).

Dim v as Integer

v = TOTO Or TITI ' ca nous donne un entier avec le bit 0 et le bit
1 à 1 => ca vaut 3
v = TITI Or TATA ' ca nous donne un entier avec le bit 1 et le bit
3 à 1 => ca vaut 10 (&h0A)

C'est vraiement une pratique très courante d'utiliser cela.

On comprend mieux en représentant les nombres en hexa ou en binaire,
auquel cas ça devient évident.
C'est une petite gymnastique mentale qui vient avec le temps: après
30 ans d'utilisation, tu additionnes, tu "OR" et tu "AND" bit-à-bit
sur des nombres de 32 bits sans efforts :-)

Bon Aprèm !

Cordialement,



--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
> Le fonctionnement du Or est simple. Il agit avec les bits comme le Or
logique avec les booléens.
0 Or 0 = 0
0 or 1 = 1




1 or 1 = 1 !! BIEN SUR


1 or 1 = 1


Avatar
LE TROLL
Bonjour Jean-Marc,

Merci d'avoir pris le temps, en fait dans :

Oui, le classique c'est simple :
a = x OR b = x
a = x OR b = y
a = y OR b = x

L'autre j'ai déjà vu, mais je n'ai pas appris à l'utiliser, car ont peut
facielement le substituer, ça donne un truc du genre :
(a = x or b = y and a <> b) = (a = x XOR b = y) ???

Mais est-ce
AND a <> b
ou
AND x <> y
ou
AND x <> y and a <> b
???

Car en fait pour l'exemple tu donnes x OR y, x XOR y, mais en VB ça ne va
pas passer, à chaque teste il doit y avoir une égalité... (a = x Xor b =
y)...

-------------------

Pour la manipulation des bits je connais, c'est avec ça que j'ai commencé
dns les anénes 80 en BAL de ProloguE (Bull France), sauf que j'ai appris ça
à cause du manque de RAM jadis, on utilisait les variables au plus juste, je
me souviens, poid faible, fort, quartet, ocet, valeur prise en compte selon
l'état 0 on laisse, 1 on prend, et selon la position à 1, vaut sa valeur de
position, oui, ça je connais même bien, et selon je ne sais plus quel bit,
c'est positif ou négatif, et enfin on addition les valeurs non nulles, mais
je ne connais pas les outils VB pour l'utiliser, faut dire que je n'en ai
pas besoin, maintenant on peut faire : dim b(8) as boolean et on a la même
chose pour un octet, enfin, presque, et ceci peut de toute façon se
contourner...
Mais avant le C, en BAL de Bull, le systèem était encore autre, plus
gourmand mais plus parlant, tu connais peut être : pour une valeur numérique
sur un quartet tu avais au début le signe (tout en hexa évidemment), puis la
valeur sur chaque quartet 0 à 9, puis la virgule que un quartet, etc. Je ne
le souviens plus exactement du symbole de la virgule et du moins, mais
disons que "-" c'était A, "+" c'était B, virgule = C, pour 248,35 tu avais
donc un truc du genre A248C35, l'inconvénient c'est que ça prenait un peu
plus de place, mais l'avantage est que tu lisais facilement tes variables en
RAM, car la RAM se visualisait exactement comme un disque (ce qui n'est plus
le vas VB), tu faisais par exemple dir ram/moProgram et tu avait dans un
éditeur modifiable la RAM du programme, c'était super vous voir ce qui se
passait sans rien tester, mais je crois que VB ne sait pas faire ça... Ou
alors par des subterfuge...
Nota bene : tu as un très bon exemple pratique avec les accès fichiers et
répertoires (que j'utilise parfois), qui fonctionne encore exactement comme
ça...

-------------------

In fine, peut être que j'aurais du le déduire, mais ça ne me donne pas ipso
facto l'utilisation de la syntaxe ", constante1, constante2, constante3)
En bit si nous avons ça 101, est à dir qu'on ne va pas exécuter le bit 2
(constante2) ?
Par exemple la constante3 est 3eme donc elle a la place de la valeur 16 si
elle est à 1, elle va donc passer 16 en paramètre, ou elle va simplement
s'exécuter avec sa valeur de constante du fait que son bit est à 1, ah ???
En dernier, sur ce modèle, à quel moment sont chargés les bits pour les
constantes, car en définitive les constante vont lire un champ de bits, mais
ou, dans un variable d'environnement produite pas la DLL ??

En pratique ça donne quoi si nous avons
champ de bits = 101 (début)
et constantes = c1, c2, c3
Il va se passer quoi au noveau de la pris een compte des constante par la
DLL, de quelle façon, ceci pour que je comprenne la syntaxe et son
utilisation ???

-------------------

Je te félicite, tu as pris une fonction que tu assumes très bien, y
attachant une contribution pédagogique qui te fait honneur, encore toutes es
félicitations.

Cordialement.

Joe (Joseph), dit LE TROLL :o)
_______________________
.
.


"Jean-marc" a écrit dans le message de
news:4ab4bfef$0$2864$
LE TROLL wrote:
Merci Jacques (Jean-Marc aussi),

Le "OU" je ne comprends pas, je me souviens d'avoir appris un truc
à 2 "ou" en tc3++, mais je n'ai jamais utilisé, alors je ne comprends
pas le mécanisme "ici" ?



Tu as raison, c'est un peu déconcertant pour qui n'est pas familier de
la chose.
Il y a 2 sortes de OU : le OU logique, et l'opérateur bit-à-bit OU de
l'agèbre de boole, qu'on appelle aussi OU arithmétique.

Le problème de compréhension vient du fait que VB représente ces 2
opérateurs
(OU logique et OU arithmétique) de la même façon: Or.

[En C par exemple, le OU logique est noté "||" alors que le OU bit-à-bit
est
noté "|".]

Par exemple le ou classique, exclusif, qui exclut ceci ou cela : if x
< 10 or x > 10 (seule le 10 passe, ça exclut le reste)...



Ce "ou" , c'est le OU Logique (ça ne s'appelle pas un ou exclusif: un ou
exclusif, c'est autre chose - voir plus loin)

Le OU logique, c'est facile: c'est un opérateur booléen qui obéit
à la table de vérité bien connue:

A Or B
+------+--------+-------+
| A | False | True |
|B | | |
+------+--------+-------+
| False| FALSE | TRUE |
+------+--------+-------+
| True | TURE | TRUE |
+------+--------+-------+

Donc quand on écrit en VB:

If A or B Then
=> EXECUTE CECI
End If

Le code après le If est exécuté si A est Vrai, ou Si B est Vrai.

NOTE: Ce n'est PAS un OU Exclusif : un OU Exclusif, encore appelé XOR est
légèrement différent. Sa table est :

A XOr B
+------+--------+-------+
| A | False | True |
|B | | |
+------+--------+-------+
| False| FALSE | TRUE |
+------+--------+-------+
| True | TURE | FALSE |
+------+--------+-------+

Tu vois la différence : Si A et B sont tous 2 VRAI, alors A XOR B est
faux.

En VB il n'y a pas de XOR, mais on s'en sort quand même car:

A XOR B = (A And NOT(b)) OR (not(A) And B)
A


Mais là, en fait ça veut dire : si 1 n'est pas ça alors fait 2 et si
2 n'est pas ça alors fait 3 ? Ou ça veut dire, fait un, puis 2 puis 3
? Ou encore : fait 1 et 2 et 3 ?
Et bien le OU de l'API il ferait quoi, peux-tu me l'expliquer par
d'autres signes ou un case, ce doit être faisable ?



Oui, ici on emploie le Or en tant qu'opérateur bit-à bit. IL est très
courant en informatique d'utiliser un entier long (donc sur 32 bits) pour
stocker plein de petites valeurs booléennes.
Et l'opérateur Or sert à mettre à 1 les bits nécessaires. De même le And
bit-à-bit servira à fabriquer des masques de bits.

Le fonctionnement du Or est simple. Il agit avec les bits comme le Or
logique avec les booléens.
0 Or 0 = 0
0 or 1 = 1
1 or 0 = 0
1 or 1 = 1

Exemple pratique

const TOTO = 1
Const TITI = 2
Const TUTU = 4
Const TATA = 8

(tu noteras qu'on utilise uniquement des puissances de 2, pour des raisons
évidentes: ainsi, un seul bit à la fois est à 1 dans la représentation
binaire du nombre).

Dim v as Integer

v = TOTO Or TITI ' ca nous donne un entier avec le bit 0 et le bit 1 à
1 => ca vaut 3
v = TITI Or TATA ' ca nous donne un entier avec le bit 1 et le bit 3 à
1 => ca vaut 10 (&h0A)

C'est vraiement une pratique très courante d'utiliser cela.

On comprend mieux en représentant les nombres en hexa ou en binaire,
auquel cas ça devient évident.
C'est une petite gymnastique mentale qui vient avec le temps: après 30 ans
d'utilisation, tu additionnes, tu "OR" et tu "AND" bit-à-bit sur des
nombres de 32 bits sans efforts :-)

Bon Aprèm !

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Jean-marc
LE TROLL wrote:
Bonjour Jean-Marc,

Merci d'avoir pris le temps, en fait dans :

Oui, le classique c'est simple :
a = x OR b = x
a = x OR b = y
a = y OR b = x

L'autre j'ai déjà vu, mais je n'ai pas appris à l'utiliser, car ont
peut facielement le substituer, ça donne un truc du genre :
(a = x or b = y and a <> b) = (a = x XOR b = y) ???

Mais est-ce
AND a <> b
ou
AND x <> y
ou
AND x <> y and a <> b
???



c'est AND x<>y , pour reprendre des conventions.


Car en fait pour l'exemple tu donnes x OR y, x XOR y, mais en VB ça
ne va pas passer, à chaque teste il doit y avoir une égalité... (a > x Xor b = y)...



ben non, pas forcément.

un if sert à tester une valeur booléenne, une valeur booléenne pouvant
être une combinaison logique de 1 ou plusieurs autres valeurs booléennes.

Tu peux écrire les 2 choses suivantes, identiques;

Dim a as Integer
dim b as Integer

a = 3
b = 10

If a< b then
mgbox " A est plus petit que B"
Endif

OU, Et c'est strictement équivalent:
=================================== ===================================
Dim c as boolean

c = (a<b)

if c then
msgbox " a est plus petit que b"
Endif


==> Si tu as compris ça (peu importe que tu aimes ou non
cette façon d'écrire), alors tu as tout compris et tout le
reste devrait devenir limpide.

Il faut comprendre qu'écrire:
If A<B then
' xxx

Ca va etre compris et traduit par le compilateur comme:
SI IL EST VRAI QUE (A est plus petit B) ALORS
' xxx

C'est une notion fondamentale en informatique.



-------------------



<snip>

Nota bene : tu as un très bon exemple pratique avec les accès
fichiers et répertoires (que j'utilise parfois), qui fonctionne
encore exactement comme ça...



Tout à fait.


-------------------

In fine, peut être que j'aurais du le déduire, mais ça ne me donne
pas ipso facto l'utilisation de la syntaxe ", constante1, constante2,
constante3) En bit si nous avons ça 101, est à dir qu'on ne va pas
exécuter le
bit 2 (constante2) ?



On n'exécute pas un bit, on le teste.

Par exemple la constante3 est 3eme donc elle a la place de la valeur
16 si elle est à 1, elle va donc passer 16 en paramètre, ou elle va
simplement s'exécuter avec sa valeur de constante du fait que son bit
est à 1, ah ???



Voir mon exemple plus loin.

En dernier, sur ce modèle, à quel moment sont chargés
les bits pour les constantes, car en définitive les constante vont
lire un champ de bits, mais ou, dans un variable d'environnement
produite pas la DLL ??



Dans une simple variable. Les DLL contiennent des fonctions (comme les
fonctions VB), qui reçoivent des paramètres (comme les fonctions VB). Voir
la suite.

En pratique ça donne quoi si nous avons
champ de bits = 101 (début)
et constantes = c1, c2, c3
Il va se passer quoi au noveau de la pris een compte des constante
par la DLL, de quelle façon, ceci pour que je comprenne la syntaxe et
son utilisation ???



L'idée c'est de mettre effectivement des bits à 0 ou à 1 dans un champ de
bit.
La Dll qui va s'en servir va récupérer chaque bit en faisant un AND logique
bit à bit.

Voici un exemple très simple.

Disons que je veux utiliser 3 variables (booléennes):
A : FERME(0) ou OUVERT(1)
B : LENT(0) ou RAPIDE (1)
C : FROID(0) ou CHAUD (1)

Je pourrais faire tout ça avec 3 "vraies" variables booléennes,
mais je peux aussi le faire avec un simple entier en l'utilisant
comme un champ de bit.
Je vais utiliser pour cela une variable entière, nommée "BControl".
Je décide de stocker A dans le bit le plus à droite(bit 0),
B dans bit 1 et C dans BIT 2.
Je définis 3 constantes:

Const A as Integer = 1 ' bit0, car 1 = 2^0
Const B as Integer = 2 ' bit1, car 2 = 2^1
Const C as Integer = 4 ' bit2, car 4 = 2^2

Puis ma variable :

Dim BControl as Integer

Pour mettre les bits à 1, on fait des OR.

Disons que je veuille mettre mes états à

OUVERT, RAPIDE, CHAUD:

BControl = 0
BControl = (A or B or C) ' ICI, VB SAIT QUE C EST UN OR BIT-A-BIT
(en binaire, BControl vaut maintenant 0111)

Et maintenant pour tester:

[NOTE : C'est exactement ce que va faire la DLL dont nous parlions
tout à l'heure]

Pour l'exemple, je vais créer 3 variables booléennes:
Dim bEstOuvert as Boolean
Dim bEstRapide as Boolean
Dim bEstChaud as Boolean

Puis je teste les bits avec AND et je transforme en booléan
bEstOuvert = (BControl And A) <> 0
bEstRapide = (BControl And B) <> 0
bEstChaud = (BControl And C) <> 0

Le AND tel qu'on l'utilise aussi fait un AND bit-à-bit entre la
valeur et le masque.

Supposons que BControl soit à 111 en binaire
Donc quand on fait (BControl And B), ça fait:

(binaire)111 AND (binaire)010 = (binaire)010
010 en binaire, ça fait 2 en décimal.

Puis Quand on fait
Dim toto as Boolean
toto = (2<>0)
=> toto devient Vrai, car 2 est en effet différent de 0.

Et on teste tout naturellement:

If bEstOuvert then
msgbox "Etat : " Ouvert"
Endif
' etc.

Très simple une fois qu'on a compris que ce qui se trouve derrière un IF,
c'est simplement une ou plusieurs expressions booléennes.

Pour l'arithmétique Booléenne, le lien de JAcques est parfait.


-------------------

Je te félicite, tu as pris une fonction que tu assumes très bien, y
attachant une contribution pédagogique qui te fait honneur, encore
toutes es félicitations.



Merci :-)


Cordialement.

Joe (Joseph), dit LE TROLL :o)
_______________________


1 2