Adott tehát a TFontStyles és még sok más hasonló halmaz típus, de a teszt kedvéért hozzunk még létre néhány saját halmaz típust is:
type
TOneTest = (otYellow, otBlue, otGreen, otBlack, otWhite, otRed, otSilver, otLime);
TOneTests = set of TOneTest;
TTwoTest = (ttOne, ttTwo, ttThree, ttFour, ttFive, ttSix, ttSeven);
TTwoTests = set of TTwoTest;
Készítünk majd egy eljárást mely egy tetszőleges típusú halmaz példánya alapján egy GroupBox-on lévő CheckBox-okat tud kezelni oly módon, hogy felhasználva azokat megjeleníti a halmaz elemeinek megnevezését és a Checked property-t igazra állítja, ha az adott érték szerepel a megadott halmaz példányában.
Ez az eljárás a SetFlags nevet kapja, melynek első paraméterként a GroupBox-ot kell megadni, melyre a CheckBox-okat helyeztük, másodikként a halmaz típusát, amit a TypeInfo függvény szolgáltat egy tetszőleges típus esetén, végül a halmaz azon példányát, melynek aktuális értékét szeretnénk megjeleníteni a CheckBox-ok segítségével.
procedure TForm1.Button1Click(Sender: TObject);
var
a: TOneTests;
begin
a:=[otBlue, otRed];
SetFlags(GroupBox1, TypeInfo(TOneTest), a);
end;
Nézzük most miként is működik a SetFlags. Első lépésként a GroupBox Caption property-jét állítjuk be méghozzá az adott halmaz típusának nevére. Ezt követően további adatokat kérünk le a GetTypeData függvénnyel az adott halmaz típusról. Felhasználva ezeket egy ciklust tudunk írni, mely végigmegy a halmaz elemein az elsőtől az utolsóig.
procedure SetFlags(gb: TGroupBox; ti: PTypeInfo; var data);
begin
gb.Caption:=ti^.Name;
td:=GetTypeData(ti);
for i:=td^.MinValue to td^.MaxValue do begin
A ciklusmagban sorra vesszük a GroupBox-ban lévő CheckBox-okat és mindegyik feliratát az adott halmazbéli elem nevére állítjuk, majd a Checked property-jüknek adunk értéket attól függően, hogy az adott elem szerepel-e a halmazban vagy sem. Végül a láthatóságot állítjuk igazra.
with gb.Controls [i] as TCheckBox do begin
Caption:=GetEnumName(ti, i);
Checked:=value and (1 shl i)<>0;
Visible:=true;
end;
end;
Azoknál a CheckBox-oknál, melyekre nincs szükség, mivel nincs annyi eleme esetleg az adott halmaztípusnak, azokat egyszerűen elrejtjük.
for i:=td^.MaxValue+1 to 15 do begin
with gb.Controls [i] as TCheckBox do begin
Visible:=false;
end;
end
end;