Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
prog:lazarus:types:enum [07/05/2020 12:47]
thierry [Déclaration d'une énumération + Set Of]
prog:lazarus:types:enum [15/09/2024 13:15] (Version actuelle)
thierry [Opérateur * pour verifier plusieurs membres du Set]
Ligne 55: Ligne 55:
      x:= GetEnumName(TypeInfo(TMonthType),​ Ord(i));      x:= GetEnumName(TypeInfo(TMonthType),​ Ord(i));
   end;   end;
 +</​code>​
 +
 +<code pascal>
 +var
 +  vHandlerType:​ TDragManagerHandlerType;​
 +begin
 +  for vHandlerType := Low(TDragManagerHandlerTypee) to High(TDragManagerHandlerType) do
 +    FreeThenNil(FDragManHandlers[vHandlerType]);​
 +end;         
 </​code>​ </​code>​
 == Passer d'un Type énuméré a un ordinale et réciproquement == == Passer d'un Type énuméré a un ordinale et réciproquement ==
Ligne 81: Ligne 90:
   TMonths = set of TMonth; ​             ​   TMonths = set of TMonth; ​             ​
               ​               ​
-</​code> ​     +</​code> ​   
 +==== In ==== 
 +on peut tester si un membre fait parti d'un SetOf avec l'​operateur IN. 
 +<code delphi>​ 
 +Months: TMonths 
 +... 
 +if January in Months then... 
 +</​code>​ 
 + 
 +==== Opérateur * pour verifier plusieurs membres du Set ==== 
 +<code pascal>​ 
 +if [csLoading,​csDestroying,​csDesigning]*ComponentState=[] then ... 
 +</​code>​ 
 + 
 +==== Include / Exclude ==== 
 +<code pascal>​ 
 +Include (FComponentState,​csUpdating);​  
 +... 
 +Exclude(FComponentState,​csUpdating);​ 
 + 
 +</​code>​ 
 + 
 + 
 +   
 ==== Comprendre les sets ==== ==== Comprendre les sets ====
-D’après ce que j'ai compris les Sets sont en fait un masque de bits dont la longueur est égal au nombre d’élément dans l'​ensemble de base.+=== Comment sont ils stocké en mémoire ? === 
 + 
 +D’après ce que j'ai compris les Sets sont en fait un masque de bits dont la longueur est égal au nombre d’élément dans l'​ensemble de base (voir l'​exemple ci dessous)
  
 Le Set serait représenté par un  ''​Longint''​ pour les ensembles de moins de 32 éléments.\\ Le Set serait représenté par un  ''​Longint''​ pour les ensembles de moins de 32 éléments.\\
 Et sur 32 Octets pour les ensembles de plus de 32 éléments.\\ Et sur 32 Octets pour les ensembles de plus de 32 éléments.\\
-Ce qui nous ferais un nombre de 256 éléments maximum (A vérifier)...+Ce qui nous ferais un nombre de 256 éléments maximum (Set Of Byte = OK / Set Of Word = Error)... 
 + 
 +Donc cela implique qu'il n'est pas possible de connaitre facilement le nombre d’éléments dans un Set, il n'​existe pas de length(Set) ou autre. 
 + 
 +Un ''​high(Set)''​ sera égale a un ''​high(Elements)''​ 
 + 
 +Exemple:​\\ 
 +avec l'​ensemble ''​TTest =  (b1,​b2,​b3,​b4)''​ soit 4 éléments\\ 
 +Le Set of ''​TTests = set of TTest''​ sera représenté par 4 bits d'un longint\\ 
 +Donc ''​vTests :​=[b1,​b4]''​ sera representé par ''​1001''​\\ 
 +Donc ''​vTests :​=[b2,​b3]''​ sera representé par ''​0110''​\\ 
 +Donc ''​vTests :​=[]''​ sera representé par ''​0000''​\\ 
 +=== Démo === 
 + 
 +Petit programme de démo: 
 +<code delphi>​ 
 +program project1; 
 + 
 +uses 
 +   ​sysutils;​ 
 + 
 +type 
 +   ​TBit ​ = (b0, b1, b2, b3, b4, b5, b6, b7); 
 +   TBits = set of TBit; 
 +var 
 +   ​vS: ​   string; 
 +   ​vBits:​ TBits; 
 +   ​pI: ​   pinteger; 
 + 
 +begin 
 +   vBits := [];  //​(00000000...) 
 +   ​pI ​   := @vBits; // on "​convertit"​ le Set en Integer 
 +   ​writeln(IntToStr(pI^));​ // -> 0 
 + 
 +   vBits := [b0]; //​(10000000...) 
 +   ​writeln(IntToStr(pI^));​ // -> 1 
 + 
 +   vBits := [b1]; //​(01000000...) 
 +   ​writeln(IntToStr(pI^)); ​ // -> 2 
 + 
 +   vBits := [b0, b1]; //​(11000000...) 
 +   ​writeln(IntToStr(pI^));​ // -> 3 
 + 
 +   vBits := [b0, b7]; //​(10000001...) 
 +   ​writeln(IntToStr(pI^));​ // -> 129 
 + 
 +end. 
 +</​code>​ 
 +=== Passer d'un Integer en Set of === 
 +Tout se passe dans la procedure ''​IntAsSet''​ ci-dessous... 
 +<code delphi>​ 
 +program project2; 
 + 
 +uses 
 +   ​sysutils;​ 
 + 
 +type 
 +   ​TBit ​  = (b0, b1, b2, b3, b4, b5, b6, b7); 
 +   ​TBits ​ = set of TBit; 
 +var 
 +   ​vS: ​   string; 
 +   ​vBits:​ TBits; 
 +   ​pI: ​   pinteger; 
 + 
 +   ​procedure test(ABits: TBits); 
 +   var 
 +      //vBit: TBit; 
 +      vI: integer; 
 +   ​begin 
 +      for vI := Ord(low(TBit)) to Ord(high(TBit)) do 
 +      begin 
 +         if TBit(vI) in ABits then 
 +            writeln(IntToStr(vI) + ' = 1') 
 +         ​else 
 +            writeln(IntToStr(vI) + ' = 0'); 
 +      end; 
 +   ​end;​ 
 + 
 +   ​procedure IntAsSet(AInt:​ integer; PSet: pointer); 
 +   var 
 +      pI: pInteger; 
 +   ​begin 
 +      pI  := PSet; 
 +      pI^ := Aint; 
 +   ​end;​ 
 + 
 + 
 +begin 
 + 
 +   vBits := [];  //​(00000000...) 
 +   ​IntAsSet(255,​ @vBits); 
 +   ​test(vBits);​ 
 + 
 +   ​ReadLn(vS);​ 
 +end.                   
 +</​code>​