
A mellékelt példaprogram megnyitása előtt a MovingBorder.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens, működését tekintve, ugyanolyan, mint a Bevel komponens. A háttérben elhelyezve, keretet képezhetünk vele, valami számára.
A komponens alján és tetején megjelenik egy-egy színátmenetekből álló csík. Ennek a csíknak a vastagságát a BorderWidth property segítségével állíthatjuk be.
A színcsíkok színátmenetet képeznek két szín között. Ezt a két színt a StartColor és az EndColor tulajdonságokban adhatjuk meg. A két szín közti árnyalatok számát a komponens szélessége határozza meg.
Ha a Moving tulajdonság értékét igazra állítjuk, a színátmenet elkezd mozogni, balról jobbra. Hamis érték megadásával a mozgás leáll.
A mozgás sebességét az Interval property értéke szabályozza.
A komponenst a TGraphicControl osztályból származtatjuk.
A mozgó színárnyalatok alapvető működési elve az, hogy létrehozunk egy színeket tároló tömböt, amelynek tartalmát a Paint metódus felülírásával csak kirajzolunk a Canvas-ra. Egy időzítő segítségével a tömbben elhelyezkedő színeket mindig eggyel előrébb csúsztatjuk, a tömb végén kieső szín pedig újra bekerül az első helyre. Ezáltal a keret mozgás hatását kelti.
A mozgatás ütemezését és a színek mozgatását egy Timer komponens OnTimer eseményében hajtjuk végre.
Nem tudjuk előre a szükséges színek számát, ezért azok tárolásához egy dinamikus tömbre van szükségünk, amelyet az alábbi módon deklarálhatunk:
FColorArray : array of TColor;
A tömböt mindig a ColorArrayCreate metódusban töltjük fel értékekkel. Ezt a metódust mindig meg kell hívnunk, ha a StartColor vagy az EndColor bármelyike megváltozik, és akkor is, amikor a komponens átméretezésre kerül.
A ColorArrayCreate metódus
Ahhoz, hogy a StartColor-ban és az EndColor-ban megadott színek közti átmeneteket meg tudjuk határozni, először a színeket vörös – zöld – kék összetevőkre kell bontanunk.
Például a StartColor vörös összetevőjét az alábbi módon tudjuk meghatározni.
r:=GetRValue(StartColor);
Ha megvannak az egyes összetevők, akkor meg kell határoznunk a színátmenetek közti lépésközt, színkomponensenként.
sr:=(GetRValue(EndColor)-r)/(Width div 3);
A léptéket úgy állítjuk be, hogy minden egyes színárnyalat 3 képpont széles legyen, és az egymásmellé rajzolt színárnyalatok pontosan lefedjék a komponens szélességét.
Ennek a 3 képpontos méretnek megfelelően állítjuk be a színeket tároló tömb méretét is.
SetLength(FColorArray,Width div 3);
A tömböt egy for ciklus segítségével fel tudjuk tölteni a színárnyalatokkal. Elindulunk a StartColor színösszetevőitől, és a ciklus minden egyes lefutásakor növeljük azok értékét a lépésközzel.
Szükségünk van egy olyan metódusra, amely az időzítő futásakor mindig elmozdítja a színeket a tömbben. Ezt a MoveColors metódus fogja végrehajtani. A MoveColors-t az FTimer objektum OnTimer eseményében kell meghívnunk.
A Paint metódus
A színátmenetek kirajzolásához felül kell írnunk a Paint metódust.
A komponens szélessége bármikor változhat, ezért erre figyelnünk kell. Az FLastWidth változóban eltároljuk a komponens előző szélességét. A változó értékét mindig a ColorArrayCreate metódus állítja be. A Paint metódusban csak annyi a dolgunk, hogy az FLastWidth értékét mindig összehasonlítsuk a Width értékkel.
if Width<>FLastWidth then
ColorArrayCreate;
Ha a kettő nem egyezne meg, akkor új színskálára van szükségünk.
Mivel a színskála már rendelkezésünkre áll és annak mozgását az FTimer objektum vezérli, itt nincs más dolgunk, mint egy for ciklus segítségével megrajzolni az alsó és felső csíkot, az FBorderWidth property értékében megadott vastagsággal. A színeket az FColorArray tömbben szereplő sorrendjük alapján kell felhasználnunk.
for i:=0 to Length(FColorArray)-1 do
begin
Canvas.Brush.Color:=FColorArray[i];
Canvas.FillRect(Rect(i*3,0,i*3+3,FBorderWidth));
Canvas.FillRect(Rect(i*3,Height-FBorderWidth,i*3+3,Height));
end;