Egy Visual Basic alkalmazás modulokból épül fel. Egy modul 3 típusú lehet: form, standard, illetve osztálymodul. A Visual Basic program projectjében fel kell sorolni azokat a modulokat, amelyeknek valamilyen kapcsolata van az alkalmazásunkkal.
Form modul: Az alkalmazás minden ablakához tartozik egy form modul (*.frm), amelyik a tulajdonságait tartalmazza. Minden form modul esemény-eljárásokat tartalmaz, amelyekben azok az utasítások szerepelnek, melyeket az adott esemény bekövetkezésekor kell végrehajtani. Ezek a modulok tartalmazzák az ablakon található control-ok és az ablak esemény-eljárásait, illetve tartalmazhatnak általános (objektum nélküli) alprogramokat, melyek csak expliciten hívhatóak meg az eseményvezérlőkből. Standard modul: A standard modul olyan kódot tartalmaz, ami egyetlen konkrét ablakhoz vagy control-hoz sem kapcsolódik (pl. ha több, különböző objektumokon bekövetkező esemény ugyanazt az utasítássorozatot tartalmazná, akkor azt írhatjuk standard modulba, így nem kell minden eseménykezelőbe bemásolni ugyanazt, és kevesebbet is kell gépelnünk). Itt szerepelnek a globális deklarációk is. Osztálymodul: A Visual Basic objektum orientált programozásának alapjai az osztálymodulok. Az alkalmazásunk által használt objektumok létrehozására használható. A standard modullal ellentétben, amely csak kódot tartalmaz, az osztálymodul tartalmazhat kódot és adatot is. Úgy is elképzelhető, mint egy control fizikai reprezentáció nélkül.
Mindegyik modul egy deklarációs és egy kódrészből áll. A deklarációs részben a konstansok, változók, típusok és DLL eljárások modul szintű deklarációja adható meg, míg a kódrész a Sub, Function és Property alprogramok kódját tartalmazza.
ActiveX komponensekkel igen hasznos alkalmazásokat készíthetünk (olyan komponenseket hozhatunk létre, melyek módosítás nélkül használhatóak több alkalmazásban). Egy ActiveX komponens olyan újrahasznosítható programrészlet és adathalmaz, amely egy vagy több ActiveX technológiával létrehozott objektumból áll (ilyen felhasználható komponenseket találhatunk a Microsoft Office alkalmazásokban: kód komponensek, ActiveX dokumentumok és ActiveX control-ok).
ActiveX komponensek típusai
Az ActiveX technológiát támogató alkalmazások (Excel, Word, Access) olyan objektumokat biztosítanak, melyek a Visual Basic alkalmazásokból a programkódból módosíthatóak (pl. használhatjuk egy Excel munkalap tulajdonságait, metódusait és eseményeit).
A kód komponensek programozható objektumok könyvtárait biztosítják (pl. gyakran használt Dialog_Box-okat , vagy speciális pénzügyi függvényeket stb.).
Az ActiveX control komponensekkel új szolgáltatásokat kaphatunk (pl. speciális szolgáltatásokat, pl. egy naptár megjelenítése egy ablakon).
Az ActiveX dokumentumokkal interaktív Internetes alkalmazásokat készíthetünk.
Saját ActiveX komponenseket csak a Professional és az Enterprise Edition-ban hozhatunk létre.
Ha egy ActiveX komponens egy típuskönyvtárat biztosít, akkor a használatához a Visual Basic projecthez hozzá kell venni egy erre a típuskönyvtárra vonatkozó referenciát. Az Object Browser-ben kiválasztva a típuskönyvtár nevét megnézhetjük a benne szereplő objektumokat, illetve azok jellemzőit és metódusait. Ha egy olyan objektumváltozót szeretnénk létrehozni, amely egy ilyen komponensben szereplő objektumra mutat, akkor a deklarálásnál a típuskönyvtárat és az osztály nevét is meg kell adni
Példa:
Ha a New kulcsszót is használjuk a deklarációban, akkor a Visual Basic automatikusan létrehoz egy objektumot, és az első használatkor hozzárendel egy objektum referenciát.
Ha az objektum eseményeit is szeretnénk használni, akkor a deklarálásnál használni kell a WithEvents kulcsszót is.
Példa:
Ekkor az objektum eseményeihez ugyanúgy írhatjuk meg a kódot, mint a Control vagy Form objektumok eseményeinél. A WithEvent kulcsszóval deklarált változóra viszont van néhány megszorítás: nem lehet általános objektumváltozó, nem deklarálható As New-ként, nem deklarálható standard modulban, és nem készíthető belőle tömb.
A Visual Basicben vannak előre definiált párbeszédablakok, amelyeket felhasználhatunk az alkalmazásunkban. Ezeknek a tervezésével és kezelésével már nem kell foglalkoznunk, viszont csak modal típusúak lehetnek. Ezeket a párbeszédablakokat függvények hívásával jeleníthetjük meg:
InputBox: Bemutatja a párbeszédablakot, melyben egy szöveg, egy soreditor és egy gomb lesz látható, visszatérési értéke a felhasználó által begépelt szöveg.
MsgBox (eljárás): Megmutatja a paraméterében megadott üzenetet.
MsgBox (függvény): Megmutatja a paraméterében megadott üzenetet, a visszatérési értéke pedig attól függ, hogy a felhasználó melyik parancsgombot választotta (Ok vagy Mégse)
Ha ezeket az alprogramokat megfelelő paraméterezéssel hívjuk meg, akkor már semmilyen dolgunk nincs velük, a gombok és a beviteli mező kezelését automatikusan végzik. Mi is létrehozhatunk dialógusablakokból álló gyűjteményt, amit a későbbiekben csak át kell paraméterezni a célnak megfelelően.
A dinamikus adatcsere (DDE) a Windows által biztosított lehetőség, mellyel az egyik program egy másikkal adatokat cserélhet, sőt, bizonyos korlátok mellett annak parancsokat adhat. Amikor egy csatoláshoz a DDE-t használjuk, az adatokat szolgáltató alkalmazást forrásalkalmazásnak (vagy röviden forrásnak) nevezzük, míg a másikat célalkalmazásnak (vagy célnak). A forrás jelentheti a forrásalkalmazást, a forrásadatot, vagy a forrástárolót is. A DDE kapcsolatot mindig a célalkalmazás kezdeményezi. A kapcsolat kialakításához a célalkalmazásnak meg kell adnia a forrásalkalmazás nevét. Általában ez az alkalmazás kiterjesztés nélküli neve. A kapcsolat létrehozásakor a célalkalmazásnak meg kell adnia a kapcsolat témáját. Amikor a kapcsolat felépült, az éppen átvitel alatt lévő adatot nevezzük elemnek. Az elemet a forrás számára érthető módon kell azonosítani. Pl. egy táblázatkezelő program számára cellákban, míg egy szövegszerkesztő számára sorokban és karakterpoziciókban.
Az alkalmazás, a téma és az elem megadásán kívül a DDE csatolás megadja a frissítés módját is. Három ilyen van: - Automatikus csatolás: a cél automatikusan ellenőrzi, hogy a forrásadatok módosultak-e. - Kézi csatolás: a célnak kérnie kell a frissítést a forrástól. - Értesítéses csatolás: a forrás automatikusan értesíti a célt, valahányszor az adatok módosulnak, de az adatok frissítésére csak akkor kerül sor, ha azt a cél kéri.
A DDE és a Visual Basic objektumok
Csak a szövegmező, a kép és a címke vezérlők azok a Visual Basic objektumok, melyek egy DDE kapcsolatban egy elem tárolójaként, célként szolgálhatnak. Ezek a vezérlők három olyan tulajdonsággal rendelkeznek, melyek meghatározzák a kapcsolat részleteit:
- A LinkTopic adja meg az alkalmazást és a kapcsolat témakörét. - A LinkItem adja meg az adatelemet. - A LinkMode határozza meg a csatolási módot.
Visual Basic vezérlők, mint cél:
Ha egy szövegmezőt, képet vagy címkét DDE célként szeretnénk használni, akkor a vezérlő Linktopic tulajdonságában kell megadjuk mind a forrásalkalmazás nevét, mind a témát. A forrásalkalmazás neve és a téma közé egy filter karaktert ("|", "Chr$(124)") kell elhelyezni. Ha egy szövegmezőt szeretnénk a REPORTS.XLS nevű Excel munkalapban lévő adatokhoz csatolni, írjuk a következőt:
A vezérlő LinkItem tulajdonsága a csatolni kívánt adatot adja meg. A LinkItem pontos tartalma és formátuma mindig a forrásalkalmazástól függ (ezen formátumokról az alkalmazáshoz tartozó dokumentációból tudhatunk meg többet).
A kapcsolat céljaként megadott vezérlő LinkMode tulajdonsága határozza meg a használt frissítési módot. Az alapértelmezett beállítás a 0-None, tehát nincs frissítés. Itt állíthatjuk be, ha frissítést szeretnénk használni.
A hosszadalmas kapcsolatok esetén (de főleg például képeknél) lehet fontos a LinkTimeout, amely meghatározza, hogy meddig várakozzon a cél a válaszra, mielőtt hibát vált ki. A használt mértékegység a tizedmásodperc, az alapértelmezett érték az 50, tehát 5 másodperc. A maximális várakozási idő eléréséhez állítsuk be az értéket -1-re (ez kb. 1 óra 49 perc).
Visual Basic vezérlők, mint források:
A DDE beszélgetésben forrásként használt Visual Basic vezérlők szintén tartalmaznak tulajdonságokat. Mivel mindegyik DDE beszélgetést a célalkalmazás kezdeményezi, ahhoz, hogy egy Visual Basic alkalmazás DDE forrásként működjék, csupán annyit kell tudjon, hogy válaszol a cél által küldött DDE kérdésekre. Egy olyan DDE kapcsolatot, mely programunkhoz érkezhet három adatot határoz meg: a forrásalkalmazás, a témakör és az elem. Ezt az alábbiak szerint használjuk:
- Alkalmazás: a forrásalkalmazás neve .EXE kiterjesztés nélkül. - Témakör: egy DDE kapcsolatban bármely form (beleértve az MDI formokat is) lehet forrás. A form LinkTopic tulajdonsága adja meg azt a nevet, amit a célalkalmazás használhat témaként, ha az adott formot kívánja elérni. Ez alapértelmezés szerint "Form1", "Form2", stb. - Elem: Az elérni kívánt adatot tartalmazó vezérlő Name tulajdonsága.
A form LinkNode tulajdonsága határozza meg, hogy a DDE kapcsolat kiépíthető-e a benne lévő vezérlőkkel. Ha a LinkMode értéke 0-None (ez az alapértelmezés), akkor nem lehet DDE kapcsolatot felépíteni, míg ha 1-Source, úgy a formon lévő bármelyik címke, kép vagy szövegmező szolgálhat forrásként.
DDE események:
A DDE beszélgetésekhez számos esemény társul. Az adott események és azok használata attól függően különbözik, hogy a DDE beszélgetésben a Visual Basic objektum forrás-e vagy cél.
A LinkOpen esemény akkor következik be, amikor egy célként működő Visual Basic vezérlő sikeresen kezdeményez DDE beszélgetést. Akkor is bekövetkezhet, amikor egy külső célalkalmazás DDE beszélgetést kezdeményez egy Visual Basic forrásablakkal. Arra is használható, hogy a már kiépített csatolásokat számoljuk, és ha már túl sok csatolás van, egyszerűen visszautasítjuk az újabbakat.
A LinkClose esemény a csatolás megszüntetésekor (akár a forrás, akár a cél kérésére) váltódik ki. Az ehhez az eseményhez tartozó eljárás nem kap információt arról, hogy a beszélgetés miért fejeződött be.
A LinkError esemény hiba fellépésekor következik be. A cél oldalon a vezérlő eseménykezelő eljárása, míg a forrás oldalán a formé fut le. Ha a hiba a kódban lép fel, akkor nem ez az eljárás, hanem a Visual Basic szokásos hibakezelő rutinjai lépnek életbe. Tehát a LinkError esemény akkor történik, ha a hiba okozója nem a mi kódunk (például olyan formátumú adat átvitele, amit a cél nem tud értelmezni).
A LinkNotify olyan célvezérlőknél léphet fel, ahol a LinkMode tulajdonság beállítása 3-Notify lett. Az esemény akkor következik be, ha a forrásadat megváltozik. Az ehhez tartozó eljárásban használhatjuk a LinkRequest metódust az adatok azonnal frissítésére.
Ha cél a forrásnak egy parancsot küld egy stringben, akkor a LinkExecute esemény segítségével teszi.
Ha az IDE-ben fejlesztünk lehetőségünk van a Controlokat tömbben tárolni. Ilyenkor a Controlra nem egyszerűen a nevével, hanem azonkivül egy indexszel hivatkozhatunk. Lehetőségünk van ilyenkor a tömbbe új Controlokat felvenni, melyek az eredeti példány klónjai lesznek, azaz minden tulajdonságuk azonos lesz az eredeti példányéval, kivéve láthatóságukat, alapértelmezetten ezek láthatatlan másolatok.
Új Control hozzáadásához a Load parancsot használjuk, és adjuk meg az új elem indexét. Szintaxis: Load név(index). Ha már létező index helyére akarunk felvenni újabbat, az futási idejű hibához vezet. Ha mégis újra fel akarjuk venni, akkor előbb a korábbit törölni kell. Ehhez az Unload utasítást használjuk: Unload név(index). Nem létező index unloadolásánál hibát kapunk.
Ez igazán előnyös, mert a VB-ben nem tudunk öröklődéssel létrehozni például egy saját gomb osztályt, de ily módon csoportosíthatunk hasonló viselkedésű Controlokat, és hozzájuk egy közös eseménykezelőt rendelhetünk, ami megadja az eseményt kiváltó Control indexét is, így még tovább finomíthatjuk az eseménykezelő viselkedését.