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. }
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.