Delphi - Tetszőleges objektum protected tulajdonságainak elérése

forráskód letöltése
Komponens fejlesztési ismereteink között ott szerepel az a tudás is, hogy ha készítünk egy osztályt és ott a protected részben deklarálunk egy property-t, metódust, akkor ezt csak az adott osztályon belül, illetve az ebből leszármazott osztályokban érthetjük el, de máshonnan, például az objektumon kívülről semmiképp.

Nézzünk erre egy konkrét példát. Adott TListBox komponens, melynek a protected részében deklarált egy ResetContent nevű eljárás. Ez annyit tesz, hogy egy üzenetet küld a ListBox ablaknak, hogy az törölje az összes elemét. Mivel ez protected, így nem használhatjuk a ListBox1.ResetContent hívást, mert a Delphi fordítója kiabálni fog, hogy ResetContent nem is létezik. Teszi ezt azért, mert a ResetContent protected-ként deklarált.

De amint az a mellékelt példában látható, egy igen egyszerű trükk révén mégis lehetőségünk nyílik a ListBox1.ResetContent hívására.

Ezzel a trükkel persze bármilyen más objektum, bármilyen más tulajdonságát elérhetjük. A trükk nagyon egyszerű: deklaráljunk egy új osztályt, mely a TListBox-ból származik. Ennek az osztálynak nem kell semmi újat hozzátennie a TListBox-hoz, elegendő csak a deklaráció.
type
  THackListBox=class(TListBox);

Ezután ezt az új típust rádefiniálva a ListBox1-re, láthatóvá válnak a protected mező tulajdonságai.
THackListBox(ListBox1).ResetContent;