A CIKK TARTALMA
ActiveX Control készítés Visual Basic 6.0-val

Vizuális tervezés

Programkészítés

A kontrol felhasználása más programokban
ActiveX Control készítés Visual Basic 6.0-val
 
Gondolom sok kezdő programozó került már olyan helyzetbe, hogy a használt vizuális programnyelv által biztosított "építőelemek" nem igazán nyerték el a tetszését, vagy ha tetszett is nem rendelkezett minden olyan funkcióval, amit elvárhatott volna tőle. Ilyen esetekben a legegyszerűbb megoldás, ha ezekre a speciális esetekre saját magunk készítünk vezérlőelemeket. A Visual Basic által nyújtott ActiveX vezérlőelem-készítés talán ez egyik leggyorsabb és legkényelmesebb módja az ilyen vizuális építőelem gyártásnak. A mostani alkalommal szeretném bemutatni, hogyan is készíthetünk egyszerűen és gyorsan hatékony vezérlőelemeket.

Első lépésként nyissunk meg egy új "ActiveX Control" projektet.(1. ábra) A projekt megnyitása után láthatjuk, hogy egy a dialógus ablakok tervezésénél megszokott tervező nézetet kapunk. Ez a tervező nézet tartalmazza magát az elkészítendő vezérlőelemet (UserControl1) - amely első ránézésre egy fejléc nélküli dialógus ablaknak tűnik - valamint a már megszokott kontrolokat (TextBox, CommandButton, stb). Maga a vizuális kontrol-építés nem sokban különbözik egy dialógus ablak elkészítésétől. Az alapformon vezérlőelemeket helyezünk el, majd ezen vezérlőelemek tulajdonságait és metódusait felhasználva összeállítunk egy az adott feladat megoldásához legideálisabb kontrolt.


1.ábra

Nézzük meg egy rövid példaalkalmazáson keresztül, hogyan is készíthetünk saját adatvezérlőt. Először is nézzük meg mit is szeretnénk elvárni az adatvezérlőtől.

  • Egy megnyitott recordset rekordjain történő navigálás
  • Aktuális rekord törlése
  • Recordset frissítés
  • Stb.
  • Rekordok számának és az aktuális rekord sorszámának kiíratása
1. Vizuális tervezés

Talán a legegyszerűbb feladat. A kontrol felületén helyezzünk el egy Frame elemet, majd ezen a kereten helyezzünk el hat darab nyomógombot (CommandButton) és egy Label vezérlőelemet. A 6 nyomógombot fogjuk használni a navigálás és a többi funkció elvégzésére, a Label pedig az adott pozíció és a rekordszám kiíratásához kell. (2. ábra)


2.ábra

2. Programkészítés

Miután végeztünk a tervezéssel, nézzük meg milyen funkciókat és kellene megvalósítani, és azokat hogyan valósítsuk meg. Legelső lépésként, tegyük publikussá a vezérlő gombok engedélyezését és tiltását, vagyis a kontrol felhasználója szabadon dönthesse el, hogy a vezérlő navigációs és funkció gombjai közül melyeket szeretné engedélyezni, tiltani. Ezt legegyszerűbben úgy tehetjük meg, ha a vezérlőhöz ezeket a funkciókat vezérlő tulajdonságokat rendelünk hozzá. Nézzük meg hogyan is történik ez a gyakorlatban. Definiáljunk egy tulajdonságot, ami a törlés gomb engedélyezését vezérli.

Public Property Get EnableDel() As Boolean   EnableDel = cmdDel.Enabled End Property Public Property Let EnableDel(b As Boolean)   cmdDel.Enabled = b End Property

Láthatjuk, hogy a saját tulajdonságok elkészítése nem túlságosan ördöngös. Mindösszesen egy eljárást és egy függvényt kell definiálnunk az adott tulajdonság értékének kiolvasására és beállítására.

Property Get tulajdonság_neve () as típus: az adott tulajdonság értékének kiolvasása (a tulajdonság típusával megegyező típusú értéket visszaadó függvény)

Property Let tulajdonság_neve (változó as típus): az adott tulajdonság értékének beállítása (egy eljárás, amely a paraméterként átadott érték alapján állítja be a tulajdonság értékét) - nem objektum típusú tulajdonságok esetén.

Property Set tulajdonság_neve (változó as típus): az adott tulajdonság értékének beállítása (egy eljárás, amely a paraméterként átadott érték alapján állítja be a tulajdonság értékét) - objektum típusú tulajdonságok esetén.

Egy property eljáráson/függvényen belül tetszőleges műveleteket végezhetünk:

Public Property Set OpenedRecordset(rs As ADODB.Recordset)   Set xRecordset = rs   xRecordset.MoveFirst   lblRecords = "<" & xRecordset.RecordCount &     "/" & xRecordset.AbsolutePosition & ">"   If xRecordset.EOF Then     cmdStart.Enabled = False     cmdPrev.Enabled = False     cmdNext.Enabled = False     cmdEnd.Enabled = False     cmdDel.Enabled = False     cmdNew.Enabled = False   Else     cmdStart.Enabled = False     cmdPrev.Enabled = False     cmdNext.Enabled = True     cmdEnd.Enabled = True     cmdDel.Enabled = False     cmdNew.Enabled = False   End If End Property

A fent említettek analógiájára készítsük el az összes vezérlőgomb engedélyezését segítő tulajdonságokat. Az előző példában már előkerült a következő fontos tulajdonság. A kontrolunknak tudni kell, hogy mely recordset rekordjain kell lépkednie, ezért definiálnunk kell egy olyan tulajdonságot is, mely az adott recordset-et fogja tartalmazni (vagyis csak egy arra mutató hivatkozást).

Public Property Set OpenedRecordset(rs As ADODB.Recordset)

Ez az eljárás nem csak a referencia-recorset beállítását végzi, hanem a vezérlő gombok alaphelyzetbe állítását is.

Miután minden szükséges tulajdonságot definiáltunk, nézzük meg milyen eljárásokra lesz szükségünk az egyes funkciók megvalósításához.

A két legegyszerűbb eljárás a legelső valamint a legutolsó rekordra történő mozgatás. Ezen eljárások csak egy MoveFirst/Movelast metódushívást, valamit a megfelelő vezérlőgombok beállításait tartalmazzák.

Private Sub cmdStart_Click()   xRecordset.MoveFirst   cmdStart.Enabled = False   cmdPrev.Enabled = False   cmdEnd.Enabled = True   cmdNext.Enabled = True End Sub Private Sub cmdEnd_Click()   xRecordset.MoveLast   cmdEnd.Enabled = False   cmdNext.Enabled = False   cmdStart.Enabled = True   cmdPrev.Enabled = True End Sub

A következő két eljárás az előző ill. a következő rekordra történő ugrást vezérli. Itt már egy kicsit bonyolultabb a dolgunk mivel a rekordmutató aktuális helyzetét is figyelembe kell vennünk a mozgások során - mikor kerülünk a recordset elejére/végére. Ezt az ellenőrzést az AbsolutePosition tulajdonság használatával, igen egyszerűen megvalósíthatjuk.

Private Sub cmdPrev_Click()   If xRecordset.AbsolutePosition > 1 Then     xRecordset.MovePrevious     If xRecordset.AbsolutePosition = 1 Then       cmdStart.Enabled = False       cmdPrev.Enabled = False     Else       cmdStart.Enabled = True       cmdPrev.Enabled = True     End If     If xRecordset.AbsolutePosition = xRecordset.RecordCount Then       cmdEnd.Enabled = False       cmdNext.Enabled = False     Else       cmdEnd.Enabled = True       cmdNext.Enabled = True     End If   End If End Sub Private Sub cmdNext_Click()   If xRecordset.AbsolutePosition < xRecordset.RecordCount Then     xRecordset.MoveNext     If xRecordset.AbsolutePosition = 1 Then       cmdStart.Enabled = False       cmdPrev.Enabled = False     Else       cmdStart.Enabled = True       cmdPrev.Enabled = True     End If     If xRecordset.AbsolutePosition = xRecordset.RecordCount Then       cmdEnd.Enabled = False       cmdNext.Enabled = False     Else       cmdEnd.Enabled = True       cmdNext.Enabled = True     End If   End If End Sub

Ezzel a rekordokon történő mozgás minden lehetséges módját definiáltuk. Most nézzük meg, hogyan tudnánk a legegyszerűbben figyelni és kiíratni az aktuális rekord sorszámát. Erre szintén az AbsolutePosition tulajdonságot használhatjuk, valamint a recordset objektum egy eseményét. Hogy hogyan érhetjük el egy deklarált objektum eseményeit programkódból? Ezt nagyon egyszerűen megtehetjük, csak a deklaráció helyén a következő kulcsszót kell használnunk: WithEvents. Mint ahogy azt a neve is mutatja az adott objektum az eseményeivel együtt kerül definiálásra. Ezek után az adott objektum a kódszerkesztő ablak Objects listájában is elérhető, valamint minden eseményét megtalálhatjuk a Procedure listában.

Private WithEvents xRecordset As ADODB.Recordset

Ahhoz, hogy az aktuális rekord sorszámát ki tudjuk íratni, érzékelnünk kell a rekordokon történő mozgást. Erre használhatjuk a recordset objektum MoveComplete eseményét.

Private Sub xRecordset_MoveComplete(   ByVal adReason As ADODB.EventReasonEnum,   ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum,   ByVal pRecordset As ADODB.Recordset)   lblRecords = "<" & xRecordset.RecordCount & "/" & xRecordset.AbsolutePosition & ">"   RaiseEvent ChangeRecord End Sub

A visszamaradt két eljárás (törlés, frissítés) elkészítését az olvasóra bízom. A fent említett módszerek analógiájára nagyon egyszerűen megvalósíthatók.

3. A kontrol felhasználása más programokban

Most, hogy elkészült az új vezérlőnk, nézzük meg milyen módon hordozhatnánk, hogyan építhetjük be más VB-s programunkba. Először is nézzük meg hogy a kontrolt a fejlesztése alatt milyen módon tesztelhetjük. A már nyitott és fejlesztés alatt lévő projektünkhöz, adjunk hozzá egy újabb projektet (Standard exe). Ezt a Fájl/Add project paranccsal tehetjük meg. Most egyszerre két projekten is dolgozhatunk. Ezek közül mindig csak a Standard exe lehet az indítható program. (A Project Explorer ablakban válasszuk ki a Standard exe-t, majd egy jobb egérgomb megnyomása után válasszuk ki a Set as Start Up parancsot.)

Jelenítsük meg az indítható programunk dialógus ablakát (a szerkesztés alatt lévő kontrol ablakát ilyenkor be kell zárni!), és nézzük meg a Toolbox vezérlőelemeit. A legutolsó elem eddig nem szerepelt a vezérlők között! Ez a mi saját vezérlőnk. Válasszuk ki és rakjuk fel a formra. Mint láthatjuk, ugyanúgy viselkedik, mint az összes többi vezérlő, vagyis szabadon áthelyezhető, mozgatható, méretezhető. Ezzel a módszerrel tesztelhetjük a fejlesztés alatt lévő kontroljainkat. Csak arra az egyre kell odafigyelnünk, hogy a standard exe formja és a kontrolunk szerkesztő ablaka közül egyidőben csak az egyik lehet megnyitva.

Most nézzük meg hogyan építhetjük be az elkészített kontrolunkat egy másik Basic programba. Miután elkészítettük a kontrolt fordítsuk le a projektet (Fájl/Make). Láthatjuk, hogy a kontrolok nem egy futtatható állományba fordítódnak, hanem egy speciális formátumú OCX kiterjesztésű fájlba. Ez az állomány tartalmazza a kontrol teljes definícióját, így szabadon hordozható. Ahhoz hogy ezt az állományt - mint egyedi vezérlőt - más programjainkban is használni tudjuk, csak hozzá kell adnunk a megfelelő projekthez A Project/Components parancsot aktiválva megjelenik egy dialógus ablak, mely egy listát tartalmaz a Windowsban regisztrált vezérlőelemekről. Ebből a listából kiválaszthatjuk a saját vezérlőnket, és ezek után már szabadon használhatjuk. Ha a kontrolt egy másik gépen szeretnénk használni, akkor a szükséges OCX fájlt előbb regisztrálnunk kell a Windows számára. Ezt a regsvr32 program segítségével tehetjük meg.

Példa:

    Regsvr32 ActiveX_Sample.ocx (Az ocx a system32 könyvtárban van. Ellenkező esetben az útvonalat is meg kell adni)
Mellékelt példaprogram és forráskód!