Quand on transmet à la fonction MsgBox les boutons à afficher, on le fait
avec quelque chose qui ressemble à ceci: vbOkCancel + vbCritical +
vbSystemModal.
Le résultat retourné est donc un nombre qui représente la
somme des valeurs saisies et qui constitue un 'masque binaire' ou quelque
chose du genre.
Comment fait-on pour décortiquer ce résultat de façon à
retrouver chaque valeur pour chaque catégorie de boutons?
Quand on transmet à la fonction MsgBox les boutons à afficher, on le fait
avec quelque chose qui ressemble à ceci: vbOkCancel + vbCritical +
vbSystemModal.
Le résultat retourné est donc un nombre qui représente la
somme des valeurs saisies et qui constitue un 'masque binaire' ou quelque
chose du genre.
Comment fait-on pour décortiquer ce résultat de façon à
retrouver chaque valeur pour chaque catégorie de boutons?
Quand on transmet à la fonction MsgBox les boutons à afficher, on le fait
avec quelque chose qui ressemble à ceci: vbOkCancel + vbCritical +
vbSystemModal.
Le résultat retourné est donc un nombre qui représente la
somme des valeurs saisies et qui constitue un 'masque binaire' ou quelque
chose du genre.
Comment fait-on pour décortiquer ce résultat de façon à
retrouver chaque valeur pour chaque catégorie de boutons?
Salut Guy ! :O)
> Quand on transmet à la fonction MsgBox les boutons à afficher, on le
> avec quelque chose qui ressemble à ceci: vbOkCancel + vbCritical +
> vbSystemModal.
En fait, il faut employer l'opérateur binaire Or et non le plus +.
Car :
1 + 3 = 4
et
1 Or 3 = 3
> Le résultat retourné est donc un nombre qui représente la
> somme des valeurs saisies et qui constitue un 'masque binaire' ou
> chose du genre.
Yep.
> Comment fait-on pour décortiquer ce résultat de façon à
> retrouver chaque valeur pour chaque catégorie de boutons?
On emploi Or pour bâtir le masque et And pour le décortiquer (non testé) :
'***
Dim masque As Long
masque = vbOkCancel Or vbCritical Or vbSystemModal
If ((masque And vbCritical) = vbCritical) Then
' vbCritical est actif
End If
'***
Voici un vieux post à ce sujet qui pourrait (ou non) t'intéresser :
Salut Guy ! :O)
> Quand on transmet à la fonction MsgBox les boutons à afficher, on le
> avec quelque chose qui ressemble à ceci: vbOkCancel + vbCritical +
> vbSystemModal.
En fait, il faut employer l'opérateur binaire Or et non le plus +.
Car :
1 + 3 = 4
et
1 Or 3 = 3
> Le résultat retourné est donc un nombre qui représente la
> somme des valeurs saisies et qui constitue un 'masque binaire' ou
> chose du genre.
Yep.
> Comment fait-on pour décortiquer ce résultat de façon à
> retrouver chaque valeur pour chaque catégorie de boutons?
On emploi Or pour bâtir le masque et And pour le décortiquer (non testé) :
'***
Dim masque As Long
masque = vbOkCancel Or vbCritical Or vbSystemModal
If ((masque And vbCritical) = vbCritical) Then
' vbCritical est actif
End If
'***
Voici un vieux post à ce sujet qui pourrait (ou non) t'intéresser :
Salut Guy ! :O)
> Quand on transmet à la fonction MsgBox les boutons à afficher, on le
> avec quelque chose qui ressemble à ceci: vbOkCancel + vbCritical +
> vbSystemModal.
En fait, il faut employer l'opérateur binaire Or et non le plus +.
Car :
1 + 3 = 4
et
1 Or 3 = 3
> Le résultat retourné est donc un nombre qui représente la
> somme des valeurs saisies et qui constitue un 'masque binaire' ou
> chose du genre.
Yep.
> Comment fait-on pour décortiquer ce résultat de façon à
> retrouver chaque valeur pour chaque catégorie de boutons?
On emploi Or pour bâtir le masque et And pour le décortiquer (non testé) :
'***
Dim masque As Long
masque = vbOkCancel Or vbCritical Or vbSystemModal
If ((masque And vbCritical) = vbCritical) Then
' vbCritical est actif
End If
'***
Voici un vieux post à ce sujet qui pourrait (ou non) t'intéresser :
> Ainsi, si A=1, B=2 et C=4,
si on veut exprimer: R = A + C ça donne
R = 00001 + 0100 = 0101
> Ainsi, si A=1, B=2 et C=4,
si on veut exprimer: R = A + C ça donne
R = 00001 + 0100 = 0101
> Ainsi, si A=1, B=2 et C=4,
si on veut exprimer: R = A + C ça donne
R = 00001 + 0100 = 0101
Ainsi, si A=1, B=2 et C=4,
si on veut exprimer: R = A + C ça donne
R = 00001 + 0100 = 0101
mais il faut remplacer + par Or. ;O)
--
Cordialement
Yanick
MVP pour Visual Basic
Ainsi, si A=1, B=2 et C=4,
si on veut exprimer: R = A + C ça donne
R = 00001 + 0100 = 0101
mais il faut remplacer + par Or. ;O)
--
Cordialement
Yanick
MVP pour Visual Basic
Ainsi, si A=1, B=2 et C=4,
si on veut exprimer: R = A + C ça donne
R = 00001 + 0100 = 0101
mais il faut remplacer + par Or. ;O)
--
Cordialement
Yanick
MVP pour Visual Basic
On voit très nettement que nous ne sommes plus dans le cadre des masques
binaires habituels.
On voit très nettement que nous ne sommes plus dans le cadre des masques
binaires habituels.
On voit très nettement que nous ne sommes plus dans le cadre des masques
binaires habituels.
Bonjour Messieurs ! :O)On voit très nettement que nous ne sommes plus dans le cadre des masques
binaires habituels.
En effet, les constantes définie dans l'enum vbMsgBoxStyle ne respecte pas
les règles habituelles d'un bitmask. J'ai l'impression que le premier octet
de la valeur désigne un nombre standard (0 à 15) et que le reste est
considéré comme un bitmask. AMHA, cette pratique n'est pas courante. :O)
La question semblait portée plus sur l'emploi de masque binaire d'une
manière générale et non seulement de l'emploi des constantes définie par
vbMsgBoxStyle. Étant donnée que notre collègue Guy tente de créer sa propre
MsgBox, il peut facilement redéfinir ces valeurs comme bon lui semblera en
respectant les règles de l'art.
Bonjour Messieurs ! :O)
On voit très nettement que nous ne sommes plus dans le cadre des masques
binaires habituels.
En effet, les constantes définie dans l'enum vbMsgBoxStyle ne respecte pas
les règles habituelles d'un bitmask. J'ai l'impression que le premier octet
de la valeur désigne un nombre standard (0 à 15) et que le reste est
considéré comme un bitmask. AMHA, cette pratique n'est pas courante. :O)
La question semblait portée plus sur l'emploi de masque binaire d'une
manière générale et non seulement de l'emploi des constantes définie par
vbMsgBoxStyle. Étant donnée que notre collègue Guy tente de créer sa propre
MsgBox, il peut facilement redéfinir ces valeurs comme bon lui semblera en
respectant les règles de l'art.
Bonjour Messieurs ! :O)On voit très nettement que nous ne sommes plus dans le cadre des masques
binaires habituels.
En effet, les constantes définie dans l'enum vbMsgBoxStyle ne respecte pas
les règles habituelles d'un bitmask. J'ai l'impression que le premier octet
de la valeur désigne un nombre standard (0 à 15) et que le reste est
considéré comme un bitmask. AMHA, cette pratique n'est pas courante. :O)
La question semblait portée plus sur l'emploi de masque binaire d'une
manière générale et non seulement de l'emploi des constantes définie par
vbMsgBoxStyle. Étant donnée que notre collègue Guy tente de créer sa propre
MsgBox, il peut facilement redéfinir ces valeurs comme bon lui semblera en
respectant les règles de l'art.
Zoury a écrit :
> Bonjour Messieurs ! :O)
>
>
>>On voit très nettement que nous ne sommes plus dans le cadre des masques
>>binaires habituels.
>
>
> En effet, les constantes définie dans l'enum vbMsgBoxStyle ne respecte
> les règles habituelles d'un bitmask. J'ai l'impression que le premier
> de la valeur désigne un nombre standard (0 à 15) et que le reste est
> considéré comme un bitmask. AMHA, cette pratique n'est pas courante. :O)
>
> La question semblait portée plus sur l'emploi de masque binaire d'une
> manière générale et non seulement de l'emploi des constantes définie par
> vbMsgBoxStyle. Étant donnée que notre collègue Guy tente de créer sa
> MsgBox, il peut facilement redéfinir ces valeurs comme bon lui semblera
> respectant les règles de l'art.
>
En fait, ce type de structure correspond à un bitfield. C'est tout à
fait dans les rêgle de l'art. En C, la structure correspondante serait
quelque chose comme:
struct
{
unsigned char Buttons:4;
unsigned char Type:4;
...
} config;
(Je vais travailler seulement sur le premier octet)
Les types de fenetres crées par vbOkOnly, vbOkCancel,
vbAbordRetryIgnore, vbYesNoCancel, vbYesNo, vbRetryCancel sont
mutuellement exclusives. Elles vont donc correspondre à un champ de bit
(bitfield) unique dans le "mot" de configuration. VbOkOnly est le
défault, donc 0. Les suivantes sont incrémentées de 1. Il y 6 valeurs
possibles, donc de 0 à 5. 5 est codé en binaire par 101, donc 3 bits
sont nécessaires. Probablement pour des raisons d'alignement, et pour
réserver de la place pour des cas définis ultérieurements, les
ingénieurs de MS ont choisit de faire un champ de 4 bits.
Les types de fenetres crées par vbCritical, vbQuestion, vbExclamation et
vbInformation sont également exclusives, avec en plus la possibilité
d'être aucun de ces types (normale), ce qui est le cas par défaut. On a
donc ici 4+1 = 5 valeurs, de 0 à 4. 3 bits sont suffisants, mais pour
les mêmes raisons que ci-dessus, on a choisit d'en reserver 4.
En C, on pourrait utiliser(*) directement les bonnes valeurs en disant
config.Type = 3 pour vbExclamation, mais Visual Basic ne gère pas les
bitfields, donc il faut tenir compte de l'offset du bitfield dans le
champs et donc vbExclamation devient 3 * (10000b) = 48
En fait, un bitmask est simplement un bitfield ou tous les champs sont
de longeur 1.
Vincent Guichard
(*) pourrait, parce qu'en fait on va souvent initaliser les champs de la
même façon qu'en VB. Les bitfields ne sont pas souvent présentés à
l'utilisateur mais réservés à l'implémentations interne.
Zoury a écrit :
> Bonjour Messieurs ! :O)
>
>
>>On voit très nettement que nous ne sommes plus dans le cadre des masques
>>binaires habituels.
>
>
> En effet, les constantes définie dans l'enum vbMsgBoxStyle ne respecte
> les règles habituelles d'un bitmask. J'ai l'impression que le premier
> de la valeur désigne un nombre standard (0 à 15) et que le reste est
> considéré comme un bitmask. AMHA, cette pratique n'est pas courante. :O)
>
> La question semblait portée plus sur l'emploi de masque binaire d'une
> manière générale et non seulement de l'emploi des constantes définie par
> vbMsgBoxStyle. Étant donnée que notre collègue Guy tente de créer sa
> MsgBox, il peut facilement redéfinir ces valeurs comme bon lui semblera
> respectant les règles de l'art.
>
En fait, ce type de structure correspond à un bitfield. C'est tout à
fait dans les rêgle de l'art. En C, la structure correspondante serait
quelque chose comme:
struct
{
unsigned char Buttons:4;
unsigned char Type:4;
...
} config;
(Je vais travailler seulement sur le premier octet)
Les types de fenetres crées par vbOkOnly, vbOkCancel,
vbAbordRetryIgnore, vbYesNoCancel, vbYesNo, vbRetryCancel sont
mutuellement exclusives. Elles vont donc correspondre à un champ de bit
(bitfield) unique dans le "mot" de configuration. VbOkOnly est le
défault, donc 0. Les suivantes sont incrémentées de 1. Il y 6 valeurs
possibles, donc de 0 à 5. 5 est codé en binaire par 101, donc 3 bits
sont nécessaires. Probablement pour des raisons d'alignement, et pour
réserver de la place pour des cas définis ultérieurements, les
ingénieurs de MS ont choisit de faire un champ de 4 bits.
Les types de fenetres crées par vbCritical, vbQuestion, vbExclamation et
vbInformation sont également exclusives, avec en plus la possibilité
d'être aucun de ces types (normale), ce qui est le cas par défaut. On a
donc ici 4+1 = 5 valeurs, de 0 à 4. 3 bits sont suffisants, mais pour
les mêmes raisons que ci-dessus, on a choisit d'en reserver 4.
En C, on pourrait utiliser(*) directement les bonnes valeurs en disant
config.Type = 3 pour vbExclamation, mais Visual Basic ne gère pas les
bitfields, donc il faut tenir compte de l'offset du bitfield dans le
champs et donc vbExclamation devient 3 * (10000b) = 48
En fait, un bitmask est simplement un bitfield ou tous les champs sont
de longeur 1.
Vincent Guichard
(*) pourrait, parce qu'en fait on va souvent initaliser les champs de la
même façon qu'en VB. Les bitfields ne sont pas souvent présentés à
l'utilisateur mais réservés à l'implémentations interne.
Zoury a écrit :
> Bonjour Messieurs ! :O)
>
>
>>On voit très nettement que nous ne sommes plus dans le cadre des masques
>>binaires habituels.
>
>
> En effet, les constantes définie dans l'enum vbMsgBoxStyle ne respecte
> les règles habituelles d'un bitmask. J'ai l'impression que le premier
> de la valeur désigne un nombre standard (0 à 15) et que le reste est
> considéré comme un bitmask. AMHA, cette pratique n'est pas courante. :O)
>
> La question semblait portée plus sur l'emploi de masque binaire d'une
> manière générale et non seulement de l'emploi des constantes définie par
> vbMsgBoxStyle. Étant donnée que notre collègue Guy tente de créer sa
> MsgBox, il peut facilement redéfinir ces valeurs comme bon lui semblera
> respectant les règles de l'art.
>
En fait, ce type de structure correspond à un bitfield. C'est tout à
fait dans les rêgle de l'art. En C, la structure correspondante serait
quelque chose comme:
struct
{
unsigned char Buttons:4;
unsigned char Type:4;
...
} config;
(Je vais travailler seulement sur le premier octet)
Les types de fenetres crées par vbOkOnly, vbOkCancel,
vbAbordRetryIgnore, vbYesNoCancel, vbYesNo, vbRetryCancel sont
mutuellement exclusives. Elles vont donc correspondre à un champ de bit
(bitfield) unique dans le "mot" de configuration. VbOkOnly est le
défault, donc 0. Les suivantes sont incrémentées de 1. Il y 6 valeurs
possibles, donc de 0 à 5. 5 est codé en binaire par 101, donc 3 bits
sont nécessaires. Probablement pour des raisons d'alignement, et pour
réserver de la place pour des cas définis ultérieurements, les
ingénieurs de MS ont choisit de faire un champ de 4 bits.
Les types de fenetres crées par vbCritical, vbQuestion, vbExclamation et
vbInformation sont également exclusives, avec en plus la possibilité
d'être aucun de ces types (normale), ce qui est le cas par défaut. On a
donc ici 4+1 = 5 valeurs, de 0 à 4. 3 bits sont suffisants, mais pour
les mêmes raisons que ci-dessus, on a choisit d'en reserver 4.
En C, on pourrait utiliser(*) directement les bonnes valeurs en disant
config.Type = 3 pour vbExclamation, mais Visual Basic ne gère pas les
bitfields, donc il faut tenir compte de l'offset du bitfield dans le
champs et donc vbExclamation devient 3 * (10000b) = 48
En fait, un bitmask est simplement un bitfield ou tous les champs sont
de longeur 1.
Vincent Guichard
(*) pourrait, parce qu'en fait on va souvent initaliser les champs de la
même façon qu'en VB. Les bitfields ne sont pas souvent présentés à
l'utilisateur mais réservés à l'implémentations interne.