Delphi - RadioGroup-hoz hasonló komponens készítése CheckBox-okkal

forráskód letöltése
A CheckPanel egy speciális komponens, amely egy panelen CheckBox komponenseket jelenít meg. A panelen elhelyezkedő CheckBox-ok tömbként kezelhetőek. Ez jelentősen megkönnyíti használatukat, hiszen az egyes elemek így egy index segítségével elérhetőek és kezelhetőek. A komponenst akkor érdemes használni, amikor több, összetartozó kapcsolót szeretnénk megjeleníteni vagy használni.
A mellékelt példaprogram megnyitása előtt a Check.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Komponensünket a TCustomPanel osztályból származtatjuk. A panelen fogjuk elhelyezni a CheckBox komponenseket, egymás alá, egymástól egyenlő távolságra.

CheckCaption property
Szükségünk van egy tulajdonságra, amely a CheckBox-ok Caption tulajdonságait fogja tárolni. Ez a tulajdonság a CheckCaption property. A CheckCaption a TStringList osztályból származik. Ebből adódóan, amikor fejlesztési időben szerkeszteni szeretnénk ezt a tulajdonságot, a Delphi String List Editor-ja jelenik meg. Forráskódból pedig a StringList-ekre vonatkozó utasításokkal kezelhető.
A CheckCaption tulajdonság kulcsfontosságú a komponens működésében. Az itt megadott elemek száma fogja meghatározni a CheckBox-ok számát. Minden egyes sorhoz egy külön CheckBox rendelődik.
A CheckCaption.Count metódussal kérdezhetjük le a CheckBox-ok számát.
Checked property
Ez a tulajdonság tömbként funkcionál. Lehetővé teszi, hogy az egyes CheckBox-ok Checked tulajdonságait lekérdezzük, illetve módosítsuk azokat. Egy elem lekérdezése a Checked[i] formával, értékének megadása pedig a Checked[i]:=True formával lehetséges. Vigyázzunk arra, hogy a tömb indexelése 0-val kezdődik, az utolsó elem pedig CheckCaption.Count-1.
OnCheckClick esemény
A komponens rendelkezik egy OnCheckClick eseménnyel. Ez az esemény mindig meghívódik, ha valamelyik CheckBox-ra rákattintunk.
A CheckListRefresh metódus
Amikor változtatunk a CheckCaption tulajdonságon, mindig meghívódik ez a metódus. Ez a metódus a felelős azért, hogy a panelen mindig CheckCAption.Count számú CheckBox legyen.
for i:=ControlCount-1 downto 0 do
  begin
    fCheckBox:=Controls[i] as TCheckBox;
    RemoveControl(fCheckBox);
  end;
for i:=0 to fCheckCaption.Count-1 do
  begin
    fCheckBox:=TCheckBox.Create(Nil);
    fCheckBox.Parent:=Self;
    fCheckBox.Left:=10;
    fCheckBox.Top:=10+i*20;
    fCheckBox.Caption:=fCheckCaption[i];
    fCheckBox.Width:=Width-20;
    fCheckBox.OnClick:=CheckBoxClick;
    InsertControl(fCheckBox);
  end;
Ahhoz, hogy ez teljesüljön, mindig letöröljük az előző CheckBox-okat, majd létrehozzuk az újakat, CheckCaption.Count darabot.
Hogy az OnCheckClick esemény működjön, minden egyes CheckBox OnClick eseményét a CheckBoxClick metódusra kell irányítani.
A Paint metódus
A CheckBox-ok rossz tulajdonsága, hogy Width tulajdonságuk nem változik az általuk megjelenített szöveg hosszával együtt. Ezért felül kell bírálnunk a Paint metódust és nekünk kell gondoskodnunk erről az eseményről.
for i:=0 to ControlCount-1 do
  begin
    fCheckBox:=Controls[i] as TCheckBox;
    fCheckBox.Width:=Width-20;
  end;
A GetChecked metódus
Result:=(Controls[Index*2+1] as TCheckBox).Checked;
Itt van egy kis trükk, ami sok fejfájást okozhat. A GetChecked metódus megkapja az Index paramétert, amikor a Checked[i] formát használjuk. Azonban a Controls tömbben csak minden második elem a CheckBox négyzet része, amibe a pipát tesszük, ezért itt az Index*2+1 elemre kell módosítani a hivatkozást.
Ugyanez a helyzet a SetChecked metódussal is.