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 [03/05/2020 14:50]
thierry [Enumération]
prog:lazarus:types:enum [15/09/2024 13:15] (Version actuelle)
thierry [Opérateur * pour verifier plusieurs membres du Set]
Ligne 49: Ligne 49:
 Retourne respectivement la plus grande valeur (December) ou la plus petite valeur (January) Retourne respectivement la plus grande valeur (December) ou la plus petite valeur (January)
 ==== Exemples de codes ==== ==== Exemples de codes ====
-==== Parcourir un ensemble ​====+== Parcourir un ensemble ==
 <code delphi> <code delphi>
 for i := Ord(Low(TMonthType)) to Ord(High(TMonthType)) do for i := Ord(Low(TMonthType)) to Ord(High(TMonthType)) do
Ligne 56: Ligne 56:
   end;   end;
 </​code>​ </​code>​
 +
 +<code pascal>
 +var
 +  vHandlerType:​ TDragManagerHandlerType;​
 +begin
 +  for vHandlerType := Low(TDragManagerHandlerTypee) to High(TDragManagerHandlerType) do
 +    FreeThenNil(FDragManHandlers[vHandlerType]);​
 +end;         
 +</​code>​
 +== Passer d'un Type énuméré a un ordinale et réciproquement ==
 +<code delphi>
 +var
 +  vWS: integer;
 + begin
 +  vWS := ord(wsFullScreen);​ //-> 4
 +   ​WindowState:​=TWindowState(vWS);​
 + end;
 +</​code>​
 +
 ===== Set Of ===== ===== Set Of =====
 Ressources sur les Set Of: Ressources sur les Set Of:
   * [[https://​www.tutorialspoint.com/​pascal/​pascal_sets.htm]]   * [[https://​www.tutorialspoint.com/​pascal/​pascal_sets.htm]]
 +  * [[https://​pascal.developpez.com/​cours/​cyberzoide/?​page=pg_Set]]
 +  * [[https://​wiki.freepascal.org/​Set]]
 ==== Déclaration d'une énumération + Set Of ==== ==== Déclaration d'une énumération + Set Of ====
  
Ligne 69: 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 ==== 
 +=== 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.\\ 
 +Et sur 32 Octets pour les ensembles de plus de 32 éléments.\\ 
 +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>​