
A mellékelt példaprogram megnyitása előtt a CircleControls.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A CircleControls komponens CenterX és CenterX property-jein keresztül adhatjuk meg a kör középpontját. A kör sugara Radius méretű lesz. A képzeletbeli körvonal lesz a komponensek középpontja.
Amikor a komponenst elhelyezzük egy Form-on, akkor a kör középpontját automatikusan a Form közepére állítja be, a sugár pedig a Form magasságának negyede lesz.
A ControlNames, TStringList típusú property-ben sorolhatjuk fel azoknak a kontroloknak a nevét, amelyeket rendezni szeretnénk. A kontrolokra, az Object Inspector-ban használt nevük alapján kell hivatkoznunk. A felsorolás sorrendje határozza meg a kontrolok sorrendjét a körvonalon.
Az első kontrol a 12 óra helyére kerül, a többi pedig az óramutató járásával megegyező irányban kerül elhelyezésre.
A komponensek mindig teljes kört alkotnak.
Az elrendezés a SetCircle metódus meghívására jön létre.
A komponens elkészítése
A CircleControls komponenst a TComponent osztályból származtatjuk.
A komponens OnCreate eseményében feljegyezzük az őt tartalmazó Form-ot, az FOwner, TForm típusú változó segítségével.
Rögtön be is állítjuk a komponens kezdeti értékeit.
FCenterX:=FOwner.ClientWidth div 2;
FCenterY:=FOwner.ClientHeight div 2;
A komponens működésének kulcsa a SetCircle metódus.
Ismerjük a kör középpontját. E körül kell elhelyeznünk a ControlNames property-ben felsorolt kontrolokat. A kontrolok száma határozza meg, hogy a teljes kört hány részre kell osztanunk, azaz hány fok lesz a kontrolok közti lépésköz.
Degree:=(PI/180)*(360/FControlNames.Count);
Egy for ciklus (i) segítségével végigmegyünk a ControlNames property bejegyzésein. Minden egyes elemet meg kell keresnünk, és azonosítanunk kell a Form kontroljai között.
j:=0;
while (j<FOwner.ControlCount-1) and (FOwner.Controls[j].GetNamePath<>FControlNames[i]) do
Inc(j);
A kontrolokat a Controls tömb tartalmazza.
A kontrolok koordinátáinak meghatározásához egy matematikai képletet használunk fel, a pont origó körüli elforgatását.
Kiindulási pontként a (0,-Radius) pontot használjuk fel. Ezt a pontot forgatjuk a Degree*i értékkel.
NewX:=(-1)*Round(x*Cos(Degree*i)+y*Sin(Degree*i));
NewY:=Round(-x*Sin(Degree*i)+y*Cos(Degree*i));
NewX:=NewX+FCenterX;
NewY:=NewY+FCenterY;
Ha a NewX értékének kiszámolásánál a képlet elején lévő (-1) szorzót elvesszük, akkor a kontrolok elrendezése az óramutató járásával ellentétes irányú lesz.
Nincs más hátra, mint hogy a kiszámolt koordinátákra beállítsuk az adott kontrol Left és Top értékeit.
if LowerCase(FOwner.Controls[j].GetNamePath)=LowerCase(FControlNames[i]) then begin
c:=FOwner.Controls[j];
c.Left:=Round(NewX-c.Width div 2);
c.Top:=Round(NewY-c.Height div 2);
end;