Delphi - Név alapján azonosított property-k értékének módosítása a komponens típusától függetlenül

forráskód letöltése
Ha meg akarjuk változtatni egy komponens színét, akkor egyszerű a helyzet, pl.:
Edit1.Color:=clRed;
Ha meg akarjuk változtatni egyszerre több komponens színét, akkor már kissé fárasztóbb a dolog, mivel fel kell sorolnunk az összeset név szerint, pl.:
Edit1.Color:=clRed;
Edit2.Color:=clRed;
ListBox1.Color:=clRed;
Panel2.Color:=clRed;
E helyett írhatnánk egy ciklust is a Components, illetve a ComponentCount property-k segítségével, mely végigmegy az összes fellelhető komponensen az adott Form-on. Itt viszont problémába ütköznénk, mert nem tudhatjuk előre, hogy milyen típusú komponensek is lesznek a Form-on.
Ha pedig a ciklust felkészítenénk az összes lehetséges típusra, akkor ezzel több lenne a munka, mint a fenti felsorolással.

De mi lenne, ha készítenénk egy olyan eljárást, ahol csak annyit kellene megmondani, hogy Color property-ket pirosra és ettől kezdve az összes olyan komponensnél, melynek van Color nevű property-e megkapná a clRed konstanst értékül.

Persze ez az eljárás nem csak a Color property-re, hanem bármelyik másikra is használható. A megoldás nem is olyan bonyolult, mint amennyire első látásra tűnik.

Készítünk egy ciklust, mely végigmegy az összes komponensen, mely a Form-on található.
Ehhez a Components és ComponentCount property-ket használjuk. A ciklusmagba nem teszünk mást, mint meghívunk egy saját eljárást, melynek átadjuk az aktuális komponenst, a keresett property nevét, valamint azt az értéket, melyet értékül szeretnénk adni.

Ebben az eljárásban lekérdezzük az adott objektum típus információt a GetTypeData függvénnyel. Ezt PTypeData típusban kapjuk. Ennek a típusnak a PropCount property-e elárulja, hogy hány property-e van az adott komponensnek.
Most már csak egy ciklus kell, mely végigmegy a property-k listáján és ellenőrzi, hogy az aktuális property neve egyezik-e a keresettel, vagy sem. Ha igen, akkor megtörténik az érték adás a SetOrdProp, illetve a SetStrProp eljárásokkal, attól függően, hogy milyen típusú az adott property (szám, sztring, stb.)