
A mellékelt példaprogram megnyitása előtt a FormGradient.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponenst el kell helyeznünk a Form-on. A StartColor és az EndColor tulajdonságokban állíthatjuk be a színátmenet első és utolsó színét. A kitöltési effektus irányát a Gradient property-ben választhatjuk ki. A színezés történhet balról, jobbról, fentről, lentről, középről, valamint a négy sarokból.
Ahhoz, hogy a komponens átszínezze a Form-ot, meg kell hívnunk a PaintGradient metódust.
Ha azt akarjuk, hogy a Form folyamatosan rendelkezzen színátmenettel, bármi történik, akkor a Form OnPaint és OnResize eseményeiben is hívjuk meg a PaintGradient metódust.
A színátmenetet bármikor törölhetjük a ClearGradient metódus meghívásával.
A komponenst a TComponent osztályból származtatjuk.
A kitöltési effektusok megadásához létre kell hoznunk egy új típust.
TGradientType = (gLeft, gRight, gTop, gBottom, gCenter, gLeftUpper, gLeftLower, gRightUpper, gRightLower);
A PaintGradient metódusban kell leprogramoznunk, hogy a színátmeneteket milyen formában rajzoljuk ki, a Gradient tulajdonságban megadott értéknek megfelelően.
A színátmenetek meghatározásához a színeket szét kell bontanunk RGB összetevőikre, majd meg kell határoznunk, hogy hány színátmenetre van szükségünk a Form magasságának vagy szélességének függvényében.
Egy színnek például a vörös összetevőjét az alábbi módon határozhatjuk meg:
r:=GetRValue(StartColor);
Ha szétbontottuk a kezdőszínt, meg kell határoznunk, hogy hány darab színárnyalatra lesz szükségünk, így ki tudjuk számolni az átmenetek közti lépésközt. Ez a Gradient tulajdonság értékének megfelelően változó. Egy Case szerkezet segítségével el kell ágaztatnunk a programot, hogy minden lehetséges beállítás esetén kiszámoljuk a színek közötti lépésközt.
gLeftUpper, gLeftLower, gRightUpper, gRightLower: begin
sr:=(GetRValue(EndColor)-r)/((Owner as TForm).ClientWidth+2)/2;
sg:=(GetGValue(EndColor)-g)/((Owner as TForm).ClientWidth+2)/2;
sb:=(GetBValue(EndColor)-b)/((Owner as TForm).ClientWidth+2)/2;
Ratio:=(Owner as TForm).ClientWidth/(Owner as TForm).ClientHeight;
end;
A fenti kódrészlet a sarkokból induló kitöltések lépésközét határozza meg, színösszetevőként. A Ratio változóban a Form szélességének és a magasságának az arányát tároljuk el. Erre a kitöltés megrajzolásánál lesz szükségünk. Ez alapján tudunk majd az átlóval párhuzamos vonalakat húzni.
A következő lépés ismét egy Case elágazás. Most meg kell rajzolnunk az egyes színátmeneteket. A színátmeneteket vonalakból építjük fel. A vonalakat for ciklusok segítségével rajzolhatjuk meg a legkönnyebben.
A gLeft, GRight, gTop, és gBottom beállítások esetén egyszerű dolgunk van, mert csak függőleges vagy vízszintes vonalakat kell húzni.
A bonyolítás ott kezdődik, amikor a sarkokból kiindulva kell megrajzolni a vonalakat, párhuzamosan az átlóval. Itt képzeletben ketté kell bontanunk a Form-ot, két háromszögre az átló mentén. A színátmeneteket a két háromszögben külön tudjuk megrajzolni, két külön for ciklus segítségével. A magassági koordináta megadásánál a Form szélességének és magasságának az arányát is figyelembe kell vennünk. Ezt a hányadost tároltuk el a Ratio változóban.
A legnehezebb a középről kiinduló kitöltést megrajzolni. Itt képzeletben meg kell feleznünk a Form-ot szélességében és magasságában is. Így kapunk négy téglalapot, amelyeket külön-külön a sarkokból induló kitöltések algoritmusával ki tudunk színezni. Ehhez 4x2 db for ciklusra van szükség. Figyelnünk kell a megfelelő koordináta transzformációkra.
Ha végeztünk a rajzolással, frissítenünk kell a Form-on elhelyezkedő komponenseket, mivel a rajzolás során azok is lefestésre kerülnek.
for i:=0 to (Owner as TForm).ControlCount-1 do
(Owner as TForm).Controls[i].Refresh;
A ClearGradient metódusban a Form-ot újra átfestjük, de ez alkalommal a saját színével.
with (Owner as TForm).Canvas do begin
Brush.Color:=(Owner as TForm).Color;
FillRect(Rect(0,0,(Owner as TForm).ClientWidth,(Owner as TForm).ClientHeight));
end;
A festés után itt is frissítenünk kell a komponenseket.