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

Signaler
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
-
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
-
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

Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
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]
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
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]
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
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+
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
B and A = A excuse ... B and A <> 0 fonctionne quand on vérifie un seul bit

Cordialement, Bacterius !
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Merci Bacterius pour ces précisions ^^
A+
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
[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]