[astuce] haaa les couleurs, integer, byte ... evitez les shr shl et autres fonctions ... delphi va se charger de tout.


Contenu du snippet

Petite astuce qui vaut le coups et qui vas vous permettre de gagner un temps fou dans l'ecriture de programme.

tout le monde connais les fonctions RGB et autre permettant de transformer un TColor ou couleur Integer en 3 bytes RGB et inversement.
qu'elle perte de temps.

on se retrouve avec des lignes et des lignes de codes inutile.

(voir le code pour la suite)

Source / Exemple :


{ L'ENREGISTREMENT MAGIQUE }

type
  TRGBColor = record
    case integer of
      0 : (Color : integer);
      1 : (R,G,B : byte);
      2 : (RGB   : array[0..2] of byte);
  end;

TARGBColor = record
  case integer of
    0 : (Color : integer);
    1 : (R,G,B,A : byte);
    2 : (RGBA : array[0..3] of byte);
end;

{ cet enregistrement vas tout simplement permettre de remplir soit Color soit R,G ou B, vous n'aurez alors plus qu'a lire l'une des propriétés pour en connaitre la valeur. Simple et efficace.}

{ ------------------------------------------- }

{ ABSOLUTE variable qui pointe sur l'adresse memoire une autre variable }

type
  TRGBRec = record
    R,G,B : byte;
  end;
  TARGBRec = record
    R,G,B,A : byte;
  end;

var
  Color : integer; { ou TColor }
  RGB   : TRGBRec ABSOLUTE Color;
  ARGB  : TARGBRec ABSOLUTE Color;

{ ici, l'astuce consiste a faire pointer des enregistrement (record) sur l'addresse memoire de Color, la manipulation se ferat alors d'une maniere completement transparante et facile elle permettras egalement une utilisation avec la methode Scanline de TBitmap en ajoutant ce qui suis}

type
  TRGBScanline = array[0..0] of TRGBRec;
  pRGBScanline = ^TRGBScanline;

var
  pRGBScan : pRGBScanline;
  RGBRec   : TRGBRec;
  Color    : integer ABSOLUTE RGBRec;
  MagicRGB : TRGBColor;

begin
  pRGBScan := BMP.Scanline[Y];

  { avec absolute }
  RGBRec := pRGBScan[X];
  Label1.caption := format('La couleur du pixel %dx%d est : $%.8x',[X,Y,Color]);

  { avec MagicRGB }
  with pRGBScan[X] do begin
       MagicRGB.R := R;
       MagicRGB.G := G;
       MagicRGB.B := B;
  end;
  Label2.caption := format('La couleur du pixel %dx%d est : $%.8x',[X,Y,MagicRGB.Color]);
end;

{ et voila, comme cela on evite les SHL et SHR et autre methodes de convertion. Notez que ce n'est qu'un exemple pour les couleurs, on peu egalement appliquer ces astuces a d'autre type de valeurs.}

{ !ATTENTION! 
  l'ordre de declaration de R,G,B et A est important, 
  en effet, lors du transtypage la lecture se fait dans le sens de lecture binaire (droite a gauche) mais dans certain cas
  les valeur R et B peuvent etre inversée, il faudrat alors modifier la declaration du Record.
  voici comment son placer les octets :
  integer   : AA BB GG RR ->
  byte quad : RR GG BB AA <-
  byte tri  :    RR GG BB <-

              R +----> byte(Color)
              G +----> byte(Color shr 8)
              B +----> byte(Color shr 16)
              A +----> byte(Color shr 24)
}

{ Cette astuce fonctionne aussi par exemple pour eviter l'utilisation des Double word (DWORD) avec MakeLong, Low et High }

type
  THLWord = record
    H,L : word;
  end;

var
  LongMsg : DWORD;
  HLMsg   : THLWord ABSOLUTE LongMSG;  

{ ici, plus besoin de faire Low et High pour couper LongMSG et plus besoin de faire MakeLong pour reconstruire LongMSG a partir de HLMSg.
  vous en trouverez l'utilitée notement avec BASS pour la recuperation du Volume Gauche/Droite ou encore dans certaines API utilisant
  des messages au format DWORD ou Cardinal. }

A voir également

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.