Méthode dégradé optimisé pour compo et autres ...

Contenu du snippet

Bem voilà, comme certains le savent déjà, je ne fais pas de compos alors que je programme avec Delphi depuis 7 ans! Donc, je m' y suis mis pour savoir au moins quelle est la sensation d' utiliser nos propres compos. J' ai donc fais un TPanel avec un dégradé. Il y en a des centaines allez-vous me dire ... C' est vrai !
Comme on peut le constater, la procédure qui fait le dégradé est identique quel que soit le compo trouvé sur les diverses sites de Delphi.
Alors moi, j' y est apporté une modification qui peut faire que le Paint soit bien plus rapide!
Je vous donne que la procédure, je mettrai peut-être un compo plus tard ...

Source / Exemple :


procedure TdgradPaintbox.GradFill(fromColor, toColor: TColor; adgradOrientation: TdgradOrientation);
var
  aBand : TRect;    { Bande rectangulaire de couleur courante        }
  i, nbDgrad   : integer;  { Compteur pour parcourir la hauteur de la fiche }
  Arr_StartRGB : Array[0..2] of Byte;     { RGB de la couleur de départ }
  Arr_DifRGB   : Array[0..2] of integer;  { RGB à ajouter à la couleur de départ pour atteindre la couleur de fin }
  Arr_CurRGB   : Array[0..2] of Byte;     { RGB de la couleur courante  }
begin
  // Calcul des valeurs RGB pour la couleur courante
  Arr_StartRGB[0] := GetRValue( ColorToRGB( fromColor ) );
  Arr_StartRGB[1] := GetGValue( ColorToRGB( fromColor ) );
  Arr_StartRGB[2] := GetBValue( ColorToRGB( fromColor ) );

  // Calcul des valeurs à ajouter pour atteindre la couleur de fin
  Arr_DifRGB[0] := GetRValue( ColorToRGB( toColor )) - Arr_StartRGB[0] ;
  Arr_DifRGB[1] := GetgValue( ColorToRGB( toColor )) - Arr_StartRGB[1] ;
  Arr_DifRGB[2] := GetbValue( ColorToRGB( toColor )) - Arr_StartRGB[2] ;

  With Canvas do
  begin
    Pen.Style := psSolid;
    Pen.Mode  := pmCopy;
    Pen.Width := 1;
    nbDgrad   := 255;

    if adgradOrientation = doVertical
    then begin
      if ClientRect.Bottom - ClientRect.Top < 255
      then nbDgrad := ClientRect.Bottom - ClientRect.Top;
    end
    else begin
      if ClientRect.Right - ClientRect.Left < 255
      then nbDgrad := ClientRect.Right - ClientRect.Left;
    end;

    for i:= 0 to nbDgrad do       // Degradé de um max. de 255 cores ...
    begin
      If adgradOrientation = doVertical
      Then begin
        aBand.Left   := ClientRect.Left;
        aBand.Right  := ClientRect.Right;
        aBand.Top    := ClientRect.Top + MulDiv(i, ClientRect.Bottom - ClientRect.Top, nbDgrad+1 );
        aBand.Bottom := ClientRect.Top + MulDiv( i+1 , ClientRect.Bottom - ClientRect.Top, nbDgrad+1 );
      End
      Else begin
        aBand.left   := ClientRect.Left + MulDiv( i , ClientRect.Right - ClientRect.Left, nbDgrad+1 );
        aBand.right  := ClientRect.Left + MulDiv( i+1 , ClientRect.Right - ClientRect.Left, nbDgrad+1 );
        aBand.Top    := ClientRect.Top;
        aBand.Bottom := ClientRect.Bottom;
      End;

      // Calcul de la couleur courante
      Arr_CurRGB[0] := (Arr_StartRGB[0] + MulDiv( i, Arr_DifRGB[0] , nbDgrad ));
      Arr_CurRGB[1] := (Arr_StartRGB[1] + MulDiv( i, Arr_DifRGB[1] , nbDgrad ));
      Arr_CurRGB[2] := (Arr_StartRGB[2] + MulDiv( i, Arr_DifRGB[2] , nbDgrad ));

      Brush.color:=RGB(Arr_CurRGB[0], Arr_CurRGB[1], Arr_CurRGB[2]);
      FillRect(aBand);
    end;
  end;
end;

Conclusion :


L' astuce comme vous pouvez le remarquez est de voir si le nombre de dégradé est inférieur à 255.
Ça evitera de faire 255 fois quelques chose qui, avec 50 fois suffit. Biensûr, plus le compo est petit sur l' axe d' application du dégradé et plus c' est rapide avec cette correction. Faites en le test et donnez moi votre avis.

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.