Delphi - Delphi kiegészítése: komponensek varázsló

forráskód letöltése

Amikor egy új komponenst készítünk, akkor általában a Component menü New Component menüpontját használjuk, amivel létrehozhatjuk a komponens forráskódját, amit aztán kiegészíthetünk. Most készítünk egy olyan komponens varázslót, amiben már a property-ket is megadhatjuk, sőt az osztály típusú property-khez elkészíti az objektumokat létrehozó, illetve megszüntető kódot is a konstruktorban és a destruktorban. A példaprogram kipróbálásához telepítenie kell a cmpwz.dpk-t, és a compwiz.ini fájl be kell másolnia a Delphi Bin könyvtárába. Ha a cmpwz.dpk-t telepítette, akkor az Animare menüben létrejön egy új menüpont Component Wizard névvel. Ezt kiválasztva indíthatja el a varázslót.

A komponens ténylegesen úgy működik, mint egy varázsló, tehát az ablak több oldalból áll, melyek között a Vissza és a Tovább gombokkal lépkedhetünk.
Az első lapon a szokásos adatokat adhatjuk meg, ugyanazokat, mint a Delphi New component ablakában, tehát
  • az új komponens osztály nevét;
  • az ős osztály nevét, amiből az új komponenst származtatjuk;
  • a paletta nevét, ahol a komponens ikonja jelenik meg;
  • a unit nevét.
A következő oldalon a property-ket adhatjuk meg. A property nevén és típusának megadásán kívül az alábbi tulajdonságokat kapcsolhatjuk be, vagy ki:
  • Read Function: a property értékét nem közvetlenül a változóból olvassuk ki, hanem létrehozunk egy Get függvényt (pl. az Enabled nevű property-hez a GetEnabled nevű függvényt);
  • Write Procedure: ha nem kapcsoljuk be, akkor a property-hez nem készül Set eljárás, vagyis a property csak olvasható lesz. Ha ez, és az előző kapcsoló kikapcsolt állapotban van, akkor csak a változó lesz létrehozva, amit property-ként nem érhetünk el.
  • Published: a property a published részben lesz deklarálva, így ha a Write Procedure kapcsoló is be van kapcsolva, akkor a property megjelenik az Object Inspector-ban.
  • Class Type: ha a property típusa egy osztály (pl. TBitmap), akkor ezt a kapcsolót be kell kapcsolni (ez automatikusan is működik, erről lejjebb lesz néhány szó). Ha a kapcsoló be van kapcsolva, akkor a konstruktorban létre lesz hozva a property-hez egy objektum (pl. FBitmap:=TBitmap.Create, stb.), valamint ugyanaz meg lesz szüntetve a destruktorban (pl. FBitmap.Free). A Set eljárásban is lesz különbség, mivel ott nem egyszerű értékadás történik ilyenkor, hanem az Assign eljárással az adatok átvétele (pl. FBitmap.Assign(Value)).
A következő oldalon már az elkészült forráskódot látjuk, de itt még beállíthatjuk a tabulátor méretét (a forráskód eszerint fog változni). A Tovább gomb felirata Befejez-re változik, ami azt is jelenti, hogy ez az utolsó oldal. A gombra kattintva elmenthetjük a forráskódot, amit rögtön meg is nyitunk, a varázslót pedig bezárjuk.
A varázslóhoz tartozik egy compwiz.ini nevű fájl is. Ebben tárolja a varázsló a beállításokat, valamint a property típusokat (kivéve az alaptípusokat). Az ini fájl TYPE szekciójában felsorolhatjuk azokat a típusokat, amelyeket a varázsló alapból nem ismer. A típus neve után egy egyenlőségjel következik, majd egy 0, vagy egy 1 érték. Ha az érték 0, akkor a típus egy osztály típus, ha 1, akkor nem.
Ha a típus osztály, és a konstruktora az egyszerű Create függvénytől eltér, akkor azt a CONSTRUCTOR szekcióban adhatjuk meg, pl.
[CONSTRUCTOR]
TTimer=Create(self).
Részletesen most csak azokkal a programrészekkel foglalkozunk, amelyek a ToolsAPI-val függnek össze, illetve a Paletta nevek lekérdezésével.
Az első lapon egy ComboBox-ból választhatjuk ki az ős osztályt. Ebben a ComboBox-ban fel van sorolva az összes telepített komponens osztálya, még azok is, amelyeket mi telepítettünk. A beolvasást a GetComponentList eljárásunk végzi el. A komponens csomagokat az IOTAPackageServices interfészen keresztül érhetjük el. Ehhez fel kell használnunk a BorlandIDEServices osztályt, amit csak akkor érünk el, ha Delphi kiegészítést csinálunk.
var
  PackageSvc: IOTAPackageServices;
...
  PackageSvc:=(BorlandIDEServices as IOTAPackageServices);
Egy ciklusban kiolvassuk a csomagokban található komponensek neveit. Ehhez szükség van a csomagok számára, amit a PackageCount property-ből tudunk meg. Egy belső ciklusban a komponensek számára lesz szükség, amit viszont a GetComponentCount függvény segítségével kapunk meg. A komponensek neveit a ComponentName tömb property-ből olvashatjuk ki.
A Paletta nevek beolvasása nem interfészen keresztül, hanem egyszerűen a Registry-ből történik. A HKEY_CURRENT_USER\Software\Borland\Delphi kulcs alatt megtaláljuk a telepített Delphi verziókhoz tartozó kulcsokat (pl. „5.0”, „6.0”, stb.). A kulcsok alatt a Paletta kulcsban vannak felsorolva a paletta nevei. Ezeket egy ciklusban kiolvassuk, az összes Delphi verzióét.
Amikor a forráskódot elmentjük, akkor a fájlt egyből meg is nyitjuk a Delphi-vel. Ehhez a művelethez az IOTAActionServices interfészre lesz szükség, ennek is az OpenFile függvényére:
  (BorlandIDEServices as IOTAActionServices).OpenFile(Edit2.Text);