Bonjour,
J'essai d'affecter une couleur dégrader sur un Panel, jusque là tout va bien si je place cela dans un evenement onmousedoxn du panel.
Mais lorsque je créer Un panel en dynamique je n'arrive pas à imposer cette couleur dégrader
voici le code complet sous delphi 7 qui fonctionne au clique sur un panel mais pas en dynamique
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, math, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure PanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PanelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
Procedure Degrader(Canevas : TCanvas;Rect : TRect;FStartColor:Tcolor;FEndColor:Tcolor);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Procedure TForm1.Degrader(Canevas : TCanvas;Rect : TRect;FStartColor:Tcolor;FEndColor:Tcolor);
Var
aBand : TRect; { Bande rectangulaire de couleur courante }
i : Integer; { Compteur pour parcourir la hauteur de la fiche }
FStartRGB : Array[0..2] of Byte; { RGB de la couleur de départ }
FCurrentRGB : Array[0..2] of Byte; { RGB de la couleur courante }
FDeltaRGB : Array[0..2] of Integer; { RGB à ajouter à la couleur de départ pour atteindre la couleur de fin }
nbtranches: integer;
Begin
{ Calcul des valeurs RGB pour la couleur courante }
FStartRGB[0] := GetRValue( ColorToRGB( FStartColor ) );
FStartRGB[1] := GetGValue( ColorToRGB( FStartColor ) );
FStartRGB[2] := GetBValue( ColorToRGB( FStartColor ) );
{ Calcul des valeurs à ajouter pour atteindre la couleur de fin }
FDeltaRGB[0] := GetRValue( ColorToRGB( FEndColor )) - FStartRGB[0] ;
FDeltaRGB[1] := GetgValue( ColorToRGB( FEndColor )) - FStartRGB[1] ;
FDeltaRGB[2] := GetbValue( ColorToRGB( FEndColor )) - FStartRGB[2] ;
{ Initialisation des dimensions de la bande de couleur }
aBand.Left :=Rect.Left;
aBand.Right:=Rect.Right;
nbtranches:=min(256, Rect.Bottom-Rect.Top);
{ Boucle pour remplir la fiche courante en dégradé }
With Canevas Do
Begin
Pen.Style:=psSolid;
Pen.Mode:=pmCopy;
For i:= 0 To nbtranches-1 Do
Begin
{ Dimensions verticales de la bande }
aBand.Left :=Rect.Left;
aBand.Right:=Rect.Right;
aBand.Top := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*i);
aBand.Bottom := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*(i+1));
{ Calcul de la couleur courante }
FCurrentRGB[0] := (FStartRGB[0] + MulDiv( i , FDeltaRGB[0] , nbtranches )) mod 256;
FCurrentRGB[1] := (FStartRGB[1] + MulDiv( i , FDeltaRGB[1] , nbtranches )) mod 256;
FCurrentRGB[2] := (FStartRGB[2] + MulDiv( i , FDeltaRGB[2] , nbtranches )) mod 256;
{ Affichage sur la fiche }
Brush.color:=RGB(FCurrentRGB[0],FCurrentRGB[1],FCurrentRGB[2]);
FillRect(aBand);
End;
End;
End;
procedure TForm1.FormCreate(Sender: TObject);
Var
PanelCanvas: TControlCanvas;
PanelRect : TRect;
i: Integer;
Panel: Tpanel;
begin
for i := 1 To 10 do
Begin
Panel := TPanel.Create(Form1);
Panel.Font.Size := 8;
Panel.Font.Name := 'Tahoma';
Panel.Name := 'PANEL' + inTtoStr(i);
Panel.Caption := Panel.Name;
Panel.Height := 20;
Panel.Top := 30 * i;
Panel.Parent := Form1;
Panel.OnMouseDown := PanelMouseDown;
Panel.OnMouseUp := PanelMouseUp;
PanelCanvas:= TControlCanvas.Create;
PanelCanvas.Control:= Panel;
PanelRect.Left := 0;
PanelRect.Top := 0;
PanelRect.Right := Panel.width;
PanelRect.Bottom := Panel.Height;
Degrader(PanelCanvas,PanelRect,clblue,clwhite);
end;
end;
procedure TForm1.PanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var
PanelCanvas: TControlCanvas;
PanelRect : TRect;
begin
// On remet la structure graphic du Panel comme initial
PanelCanvas:= TControlCanvas.Create;
PanelCanvas.Control:= Tpanel(sender);
PanelRect.Left := 0;
PanelRect.Top := 0;
PanelRect.Right := Tpanel(sender).Width;
PanelRect.Bottom := Tpanel(sender).Height;
Degrader(PanelCanvas,PanelRect,clwhite,clblue);
end;
procedure TForm1.PanelMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var
PanelCanvas: TControlCanvas;
PanelRect : TRect;
begin
// On remet la structure graphic du Panel comme initial
PanelCanvas:= TControlCanvas.Create;
PanelCanvas.Control:= Tpanel(sender);
PanelCanvas.Brush.Style := bsClear;
PanelCanvas.Font.Name := 'Tahoma';
PanelCanvas.Font.Size := 8;
PanelRect.Left := 0;
PanelRect.Top := 0;
PanelRect.Right := Tpanel(sender).Width;
PanelRect.Bottom := Tpanel(sender).Height;
DrawText(PanelCanvas.Handle, PChar(Tpanel(Sender).Caption) , -1, PanelRect, DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE);
end;
end.
Je pense que le problème se situe dans la procedure oncreate de la form à :
Panelcanvas.Control = Panel;
Mais je vois pas quoi mettre d'autre, auriez vous une idée ?