Determiner "Valeur1 in valeurs" lorsque Valeur1 et Valeurs sont de type Word ... [Résolu]

Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 14 juil. 2010 à 14:54 - Dernière réponse :
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 15 juil. 2010 à 11:49
Bonjour!

voilà, j' ai un souci d' écriture ...

A l' image de ce que l' on fait avec une variable de type "Set of":
if goColumnResize in DBGrid1.Options
then beep;

Je voudrais tester si "Valeur1" (de type Word) est comprise dans "Valeurs" (de type Word):
Disons que j' ai 4 constantes:
Valeur1 = 1;
Valeur2 = 2;
Valeur3 = 4;
Valeur4 = 8;
et que j' ai "Valeurs" représentant donc la somme d' un regroupement de Valeur1 à Valeur4.
Disons que Valeurs = 5:
Valeurs est donc représenté par Valeur3 + Valeur1.

Je voudrais donc écrire quelque chose dans ce genre :
if valeur3 in valeurs then Beep;

Je voudrais savoir s' il existe quelques chose pour faire cela ^^

Merci de votre aide,
Mauricio
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 14 juil. 2010 à 16:11
3
Merci
Salut,

[hr]procedure TForm1.Button9Click(Sender: TObject);

[b]const
  /bValeur1 =  1;
  Valeur2 = 2;
  Valeur3 = 4;
  Valeur4 = 8;
[b]var
  /bValeurs: Word;
[b]begin
  /bValeurs := 5;

   if  (Valeurs and Valeur1)  = Valeur1 [b]then
    if /b(Valeurs and Valeur3) = Valeur3 [b]then
      /bShowMessage( 'Valeur1 && Valeur3 présents');
end;
[hr]

[hr]@+Cirec
[hr]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 14 juil. 2010 à 16:14
3
Merci
où encore:
[hr]  if (Valeurs and (Valeur1 or Valeur3)) = (Valeur1 or Valeur3) [b]then

    /bShowMessage( 'Valeur1 && Valeur3 présents');
[hr]à toi de voir ce qui t'arrange


[hr]@+Cirec
[hr]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 14 juil. 2010 à 16:24
0
Merci
Salut Cirec,

c' est exactement ça! J' ai déjà vu ça mais je n' arrivais pas à me rappeler, merci beaucoup!!!
J' allais partir sur une fonction mais là, c' est beaucoup mieux

Regarde mes yeux pleins de reconnaissance:
A+
Commenter la réponse de cs_MAURICIO
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
- 15 juil. 2010 à 03:40
0
Merci
De façon générale, on peut voir un nombre comme un vecteur binaire, où chaque bit représente une information particulière. Une propriété intéressante du système binaire fait qu'il est très simple de décider si tel ou tel nombre est contenu dans tel autre nombre sous la loi d'addition.

Donc oui, de façon générale, si B and A <> 0, alors A est compris dans B.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
- 15 juil. 2010 à 03:41
0
Merci
B and A = A excuse ... B and A <> 0 fonctionne quand on vérifie un seul bit

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 15 juil. 2010 à 10:07
0
Merci
Merci Bacterius pour ces précisions ^^
A+
Commenter la réponse de cs_MAURICIO
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 15 juil. 2010 à 11:49
0
Merci
[quote= Bacterius]B and A = A excuse ... B and A <> 0 fonctionne quand on vérifie un seul bit
/quote en fait ça fonctionne pour les deux.

la plupart des Dev utilisent "B and A > 0" mais je trouve que c'est plus parlant quand on relis un code :"if (B and A) = A then"
que "if (B and A) <> 0 then"


sinon avec cette méthode on peut (par exemple) stocker 32 valeurs Boolean dans un entier non signé.
Les composants sont "Tagés" de 0 à 31 (Maximum):
[hr] function  Tfrm_Main.GetCheckedComponents: Cardinal;

[b]var
  /bIdx: Integer;
[b]begin
  /bResult : = 0;
  for Idx :=  0  to  ComponentCount - 1 [b]do
    if /bComponents[Idx] is TCheckBox [b]then
    begin
      with /bTCheckBox(Components[Idx]) [b]do
        if /bChecked [b]then
          /bResult : = Result or (1 shl Tag);
    [b]end
    else if /bComponents[Idx] is TRadioButton [b]then
    begin
      with /bTRadioButton(Components[Idx]) [b]do
        if /bChecked [b]then
          /bResult :=  Result  or  (1 shl Tag);
    end;
end;

// la récupération des Valeurs se fait comme ceci:
procedure Tfrm_Main.SetCheckedComponents(Value: Cardinal);
[b]var
  /bIdx: Integer;
[b]begin
  for /bIdx : = 0 to ComponentCount - 1 [b]do
    if /bComponents[Idx] is TCheckBox [b]then
    begin
      with /bTCheckBox(Components[Idx]) [b]do
        /bChecked :=  (Value  and  (1 shl Tag)) > 0;
    [b]end
    else if /bComponents[Idx] is TRadioButton [b]then
    begin
      with /bTRadioButton(Components[Idx]) [b]do
        /bChecked : = (Value and (1 shl Tag)) > 0;
    [b]end
end/b;
[hr]




[hr]@+Cirec
[hr]
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.