Determiner "Valeur1 in valeurs" lorsque Valeur1 et Valeurs sont de type Word ...

Résolu
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 14 juil. 2010 à 14:54
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 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

7 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 juil. 2010 à 16:11
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]
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 juil. 2010 à 16:14
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]
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
14 juil. 2010 à 16:24
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+
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
15 juil. 2010 à 03:40
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
15 juil. 2010 à 03:41
B and A = A excuse ... B and A <> 0 fonctionne quand on vérifie un seul bit

Cordialement, Bacterius !
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
15 juil. 2010 à 10:07
Merci Bacterius pour ces précisions ^^
A+
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 juil. 2010 à 11:49
[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]
0
Rejoignez-nous