Degrader la couleur D'un panel [Résolu]

koaiz 49 Messages postés samedi 26 avril 2003Date d'inscription 8 août 2009 Dernière intervention - 14 sept. 2004 à 22:37 - Dernière réponse : Loulibier 323 Messages postés jeudi 6 juin 2002Date d'inscription 24 septembre 2008 Dernière intervention
- 20 sept. 2004 à 23:11
Je voudrais Changer la couleur D'un panel d'une couleur X vers une couleur Y Mais en la degradant et en n'affichant qu'une couleur a la fois.

Merci
Afficher la suite 

9 réponses

Répondre au sujet
Loulibier 323 Messages postés jeudi 6 juin 2002Date d'inscription 24 septembre 2008 Dernière intervention - 20 sept. 2004 à 23:11
+3
Utile
salut koaiz,

il est vrai que le degradé de couleur ne se fait pas correctement.
Réutilise cette nouvelle function, elle est presque identique à la précédente sauf la déclaration des variables. Elles passent de byte à integer.

function Degrader(StartColor, EndColor : TColor; indexColor : integer): TColor;
var
  StartRGB   : array[0..2] of integer;    {couleur de début RGB}
  EndRGB     : array[0..2] of integer;    {couleur de fin RGB}
  CurrentRGB : array[0..2] of integer;    {couleur de retour RGB}
begin
 { Calcul des valeurs RGB pour la couleur courante }
  StartRGB[0] := GetRValue(ColorToRGB(StartColor));
  StartRGB[1] := GetGValue(ColorToRGB(StartColor));
  StartRGB[2] := GetBValue(ColorToRGB(StartColor));

  { Calcul des valeurs à ajouter pour atteindre la couleur de fin }
  EndRGB[0] := GetRValue(ColorToRGB(EndColor)) - StartRGB[0];
  EndRGB[1] := GetGValue(ColorToRGB(EndColor)) - StartRGB[1];
  EndRGB[2] := GetBValue(ColorToRGB(EndColor)) - StartRGB[2];

 { Calcul de la couleur courante suivant un index allant de 0 à 255 }
  CurrentRGB[0] := StartRGB[0] + MulDiv(indexColor,EndRGB[0],255) mod 256;
  CurrentRGB[1] := StartRGB[1] + MulDiv(indexColor,EndRGB[1],255) mod 256;
  CurrentRGB[2] := StartRGB[2] + MulDiv(indexColor,EndRGB[2],255) mod 256;

  { Retourne la couleur }
  Result := TColor(RGB(CurrentRGB[0],CurrentRGB[1],CurrentRGB[2]));
end;


Bonne Prog,

Olivier.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Loulibier
cs_limy 41 Messages postés mardi 22 avril 2003Date d'inscription 1 octobre 2004 Dernière intervention - 15 sept. 2004 à 09:59
0
Utile
Salut,

tu ne peux pas le faire avec les composant standard de Delphi ! (Enfin je crois...)

Mais un composant a été réalisé par une personne de ce forum.
Tu peux le trouver ici :

http://www.delphifr.com/code.aspx?id=24985

Ce composant fonctionne très bien !!

Bonne prog.....
Limy
Commenter la réponse de cs_limy
koaiz 49 Messages postés samedi 26 avril 2003Date d'inscription 8 août 2009 Dernière intervention - 15 sept. 2004 à 14:20
0
Utile
j'ai essayer mais pas de resultat la boucle fonctionne mais la couleur ne change pas si tu peut me donner un exemple source ca serai mieux

CHUKRAN D'avence
Commenter la réponse de koaiz
Loulibier 323 Messages postés jeudi 6 juin 2002Date d'inscription 24 septembre 2008 Dernière intervention - 15 sept. 2004 à 18:42
0
Utile
Salut koaiz,

que cherche tu réelement à faire ?
Désires tu avoir un panel avec une couleur qui se dégrade vars une autre ?
Ou bien un Panel, qui passe d'une couleur Bleu, puis Vert, Puis Jaune, .... ?

Bonne Prog,

Olivier.
Commenter la réponse de Loulibier
koaiz 49 Messages postés samedi 26 avril 2003Date d'inscription 8 août 2009 Dernière intervention - 15 sept. 2004 à 20:20
0
Utile
Salut Olivier

mon probleme et de canger la couleur d'un panel en passant d'une couleur A puis ses nuance jusqu'a une couleur B une a la fois chaque fois le panel prent une couleur jusqu'a arriver a la couleur B

merci
Commenter la réponse de koaiz
Loulibier 323 Messages postés jeudi 6 juin 2002Date d'inscription 24 septembre 2008 Dernière intervention - 15 sept. 2004 à 21:15
0
Utile
voici une function qui te permettra de faire ce que tu souhaites

function Degrader(StartColor, EndColor : TColor; indexColor : byte): TColor;
var
  StartRGB   : array[0..2] of byte;    {couleur de début RGB}
  EndRGB     : array[0..2] of byte;    {couleur de fin RGB}
  CurrentRGB : array[0..2] of byte;    {couleur de retour RGB}
begin
  { Calcul des valeurs RGB pour la couleur courante }
  StartRGB[0] := GetRValue(ColorToRGB(StartColor));
  StartRGB[1] := GetGValue(ColorToRGB(StartColor));
  StartRGB[2] := GetBValue(ColorToRGB(StartColor));

  { Calcul des valeurs à ajouter pour atteindre la couleur de fin }
  EndRGB[0] := GetRValue(ColorToRGB(EndColor)) - StartRGB[0];
  EndRGB[1] := GetgValue(ColorToRGB(EndColor)) - StartRGB[1];
  EndRGB[2] := GetbValue(ColorToRGB(EndColor)) - StartRGB[2];

 { Calcul de la couleur courante suivant un index allant de 0 à 255 }
  CurrentRGB[0] := (StartRGB[0] + MulDiv(indexColor,EndRGB[0],255)) mod 256;
  CurrentRGB[1] := (StartRGB[1] + MulDiv(indexColor,EndRGB[1],255)) mod 256;
  CurrentRGB[2] := (StartRGB[2] + MulDiv(indexColor,EndRGB[2],255)) mod 256;

  { Retourne la couleur }
  Result := RGB(CurrentRGB[0],CurrentRGB[1],CurrentRGB[2]);
end;


Il te suffit de donner ta couleur de départ A et ta couleur d'arriver B ainsi qu'un index allant de 0 à 255 te permettant d'avoir la plage de couleur entre A et B. Il te reste à boucler entre 0 et 255 pour l'index, afin de faire varier la couleur de ton TPanel.

La function te renvoie une couleur, il te suffira de l'affecté à la propriété Color de ton TPanel. ( Panel.Color )

Bonne Prog,

Olivier. ;)
Commenter la réponse de Loulibier
koaiz 49 Messages postés samedi 26 avril 2003Date d'inscription 8 août 2009 Dernière intervention - 15 sept. 2004 à 23:31
0
Utile
Salut Olivier

J'ai utilier ta fonction en metant l'index en boucle mais ca na pas donner de resulta car je recoit directement la couleur de la fin !!!!!!!!!! je n'ai pas compris ou se situe le probleme peut tu m'expliquer ou si possible me donner un exemple avec source.

Merci.
Commenter la réponse de koaiz
Loulibier 323 Messages postés jeudi 6 juin 2002Date d'inscription 24 septembre 2008 Dernière intervention - 16 sept. 2004 à 00:00
0
Utile
voici deux techniques plus ou moins efficaces suivant tes besoins !

Dans une boucle avec un sleep de 10 ms.
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  for i := 0 to 255 do
  begin
    Panel1.Color := Degrader(clNavy, clBlue, i);
    sleep(10);
    Application.ProcessMessages;
  end;
end;


Dans un Timer avec la tempo. Il faut declarer ton Index dans en variable globale.
procedure TForm1.TimerTimer(Sender: TObject);
begin
  inc(Index);

  if Index > 255 then
    Index := 0;

  Panel1.Color := Degrader(clNavy, clBlue, Index);
end;


Bonne Prog,

Olivier.
Commenter la réponse de Loulibier
koaiz 49 Messages postés samedi 26 avril 2003Date d'inscription 8 août 2009 Dernière intervention - 16 sept. 2004 à 15:33
0
Utile
Salut

J'ai essaye ca marche mais je n'ai pas les bonne nuance de couleur par exemple si la couleur de debut est Jaune et celle de la fin est verte, on vois que la couleur du panel saute du jaune au rouge
puis le vert se degrade, alors que se que je desir faire c'est du jaune puis les nuance de jaune en allon vers un vert claire (vert-Jaune) puis en allons vers un vert plus fonce.
car je suis entaine de travailler sur une application de simulation de T.P de chimie (neutralisation acido-basique) et les couleur c'est tres important.

Merci
Commenter la réponse de koaiz

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.