Delphi - StringGrid celláiba nyomógomb elhelyezése, a szerkesztési lehetőségek megtartása mellett

forráskód letöltése
A StringGrid néha igen hasznos lehet, de alapból elég korlátozottak a lehetőségei. Ebben a példában egy kicsit módosítjuk a komponenst úgy, hogy a cella szerkesztése közben egy gomb is megjelenik, amelyhez tetszőleges funkciót rendelhetünk. Ennek segítségével könnyedén készíthetünk olyan adatbeviteli Form-ot, ami mondjuk az Object Inspector-ra hasonlít. Természetesen lehetnek olyan cellák a táblázatban, amihez nem kell gombot megjeleníteni, így arról is gondoskodunk, hogy futási időben eldönthető legyen, hogy az éppen szerkesztett mezőben kell-e gombot megjeleníteni.
A mellékelt példaprogram megnyitása előtt a StringGridButton.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Mivel a gomb a StringGrid-ben megjelenő Edit komponensben jelenik meg, ezért készítenünk kell egy új osztályt a TInplaceEdit osztályból származtatva. Ebben létrehozunk egy SpeedButton-t, amelyet jobbra igazítunk, valamint a BoundsChanged eljárásban beállítjuk a gomb szélességét, valamint az Edit szerkesztő területének szélességét. Ebből az eljárásból meghívjuk a TStringGridButton OnVisibleButton eseményét. Az eseménynek a szokásos Sender-en kívül három paramétere van: az oszlop és a sor száma, valamint egy logikai típusú paraméter, amelynek értékét az eseményben programból meg tudjuk változtatni. Az alapértelmezett értéke igaz, ebben az esetben a gomb megjelenik, ellenkező esetben nem.
A StringGridButton komponensben a legfontosabb a CreateEditor függvény felülírása. Ennek visszatérési értéke egy TInplaceEdit típusú objektum. Az eljárásban létre kell hoznunk az Edit komponenst, ami viszont már nem TInplaceEdit, hanem az új, TInplaceEditor típusú lesz.
Az OnVisibleButton eseményről már volt szó, az OnButtonClick esemény a gomb OnClick eseményének hatására hívódik meg.
Létrehozunk egy Editor nevű property-t is, amin keresztül az Edit komponenst érhetjük el futási időben.