Most, hogy már nagyjából megismerkedtünk a VB-s alkalmazások létrehozásának legfontosabb lépéseivel, itt az ideje, hogy egy kicsit komolyabb programok elkészítésének is nekirugaszkodjunk. A következőkben egy példaalkalmazáson keresztül szeretném megismertetni az olvasót a leggyakrabban használt vezérlőelemek felhasználásának lehetőségeivel, és hogy, milyen módszerekkel valósíthatunk meg adatbázis kezelést Visual Basicben.

A megoldandó probléma a következő: egy videotéka kölcsönzési nyilvántartását szeretnénk valamilyen formában, adatbázisban tárolni, és rendszerezni. A program által használt egyszerű adatbázis szerkezete adott (a mellékelt 'video.mdb' ), így ezzel nem kell foglalkoznunk. Az elkészítendő program feladatai a következők lennének:

  • Nyilvántartani a kölcsönző személyek adatait
  • Nyilvántartani a tékában meglévő filmeket kategóriák szerint
  • Tárolni és rendszerezni az egyes személyek kölcsönzéseit (mikor és milyen filmeket kölcsönöztek)
  • Kimutatásokat készíteni az egyes filmek kikölcsönzéseiről (egy adott időpontra adja meg, hogy mely filmek voltak a legkeresettebbek)
  • Stb.
Első lépésként tervezzük meg a program felhasználói felületét. Induljunk ki abból, hogy milyen adatokat és milyen formában szeretnénk megjeleníteni a formokon. Elsőként is szükség van a kölcsönzők adatainak karbantartására (adatfelvitel, módosítás), valamint az egyes személyek által kikölcsönzött és még vissza nem hozott filmek adatainak megjelenítésére. Ezen adatok megjelenítését akár egy helyen is megtehetnénk. Másodsorban kell egy olyan felület, ahol magát a kölcsönzési folyamatot megvalósíthatjuk. Mivel itt szükség van az egyes filmek adatainak megjelenítésére is, így ezen adatok karbantartását akár ide is helyezhetnénk. Harmadik lépésként hozzuk létre az egyes kimutatások elkészítéséhez szükséges felületet.

Felhasználói felületek

A program könnyebb átláthatósága miatt, célszerű az egyes felületeket "egymás közelében" elhelyezni. Ennek egyszerű megvalósítását teszi lehetővé az ún. SSTab vezérlőelem. Segítségével szinte "lapozgathatunk" az egyes felületek között. A kontrol használatával lehetőségünk nyílik arra, hogy egyetlen űrlapon (formon), akár több dialógusablaknyi vezérlőelemet helyezhessünk el.

SSTab vezérlőelem

Maga a vezérlőelem ún. Tab-okból épül fel. Ezek segítségével válthatunk, lapozgathatunk az egyes felhasználói felületek között. Minden egyes fül egy különálló dialógusablakként is felfogható, és már a tervezési fázisban is észrevehetjük, hogy az egyes fülek között váltogatva, azokra egymástól függetlenül helyezhetünk el más-más vezérlőelemeket.

A vezérlőelem füleinek (Tab-ok) számát a Tabs tulajdonság beállításával változtathatjuk meg. A fülek számán kívül megadható azok elhelyezkedése is. Négy lehetséges helyzetet adhatunk meg a TabOrientation tulajdonság segítségével:

  • ssTabOrientationTop          0    A fülek a kontrol tetején helyezkednek el.
  • ssTabOrientationBottom     1    A fülek a kontrol alján helyezkednek el.
  • ssTabOrientationLeft          2    A fülek a kontrol bal oldalán helyezkednek el.
  • ssTabOrientationRight       3     A fülek a kontrol jobb oldalán helyezkednek el.
Minden egyes fülre külön feliratot állíthatunk be a TabCaption értékének megadásával. Ezt a következőképpen tehetjük:

SSTabObj.TabCaption(tabindex) = felirat

  • SSTabObj Az SSTab kontrol neve.
  • tabindex Annak a fülnek a sorszáma amit be szeretnénk állítani (a sorszámozás 0-tól kezdődik, tehát az első fül a 0. sorszámú )
  • felirat Egy szöveges kifejezés


1. Ábra SSTab vezérlőelem (sstab.bmp)

Előfordulhat, hogy túl sok fül beállítása esetén, azok nem férnek el egy sorban. Ilyenkor megtörténhet az is, hogy bizonyos fülek már nem lesznek kiválaszthatók, mivel kívül esnek a kontrol területén és nem láthatók. Ennek elkerülését segíti a TabsPerRow tulajdonság, amivel azt adhatjuk meg, hogy egy sorban maximum hány fül helyezkedhet el. Ha a fülek száma ennél nagyobb, akkor több sorban rendeződnek el.

A TabVisible tulajdonsággal egyes füleket akár el is tűntethetünk. Alkalmazása megegyezik a TabCaption tulajdonságéval:

SSTabObj.TabCaption(tabindex) = boolean (logikai érték, True vagy False).

Még egy tulajdonság van amit érdemes megemlíteni, ez pedig a Tab. Segítségével beállíthatjuk, hogy melyik fül legyen aktuálisan kiválasztva.

SSTabObj.Tab = tabindex

Példaalkalmazásunkban legyen három fül létrehozva. Az elsőn lesznek a kölcsönzők adatai, valamint az általuk utoljára kölcsönzött filmek listája. A másik fül tartalmazza a filmek listáját, és itt végezhetjük el magát a kölcsönzést (filmek személyekhez rendelése). A harmadik fülön pedig legyenek az egyes kimutatások alapadatainak beállításai, valamit az eredményül kapott adatok listája.

Első fül - Kölcsönzői tagok adatai

Ez az a fül, ahol a tagok személyi adatait tarthatjuk karban, valamint megtekinthetjük az egyes tagok "aktív" kölcsönzésének adatait (mikor és milyen filmet kölcsönöztek). Az adatok megjelenítésére mindkét esetben az ún. ListView kontrolt használjuk, mivel esetünkben talán ez a legáttekinthetőbb. A kontrol első ránézésre igen ismerős lehet, mivel a Windows intézőjében is egy ilyen vezérlőelemmel találkozhatunk. Röviden nézzük át a legfontosabb jellemzőit.


2. Ábra - Első fül

ListView vezérlőelem

Ahogy azt a Windows intézőjében is megszokhattuk, ennél a vezérlőnél lehetőségünk van négy különböző adatnézet megvalósítására. Azt, hogy éppen melyik nézet az aktív, a kontrol View tulajdonságával állíthatjuk be.

  • lvwIcon 0 (Alapértelmezett) Icon. Minden listaelem a megadott ikonnal és a beállított szöveggel jelenik meg a listában.
  • lvwSmallIcon 1 SmallIcon. Minden listaelem a hozzá beállított kis ikonnal és a megadott szöveggel jelenik meg a listában. Az elemek vízszintes elrendezésűek.
  • lvwList 2 List. Minden listaelem a hozzá beállított kis ikonnal és a megadott szöveggel jelenik meg a listában. Az elemek függőleges elrendezésűek.
  • lvwReport 3 Report. Minden listaelem a kis ikonjával és a beállított szöveggel jelenik meg. Ezen kívül a beállított SubItem-ek is megjelenítődnek oszlopokba szervezve.
A Report nézetben látható oszlopszervezést mi magunk állíthatjuk be két féle módon. Az egyik a tervezési időben történő tulajdonság beállítás, ahol a vezérlő properti ablakán van lehetőségünk az oszlopfejlécek megadására. A másik módszer a futásidejű beállítás. Ekkor a kontrol ColumnHeaders objektumgyűjteményén keresztül variálhatjuk az egyes oszlopok megjelenését.

Egy új oszlop hozzáadását az Add metódussal valósíthatjuk meg:

ColumnHeadersObj.Add(index, key, text, width, alignment)

  • ColumnHeadersObj Egy ColumnHeaders objektumgyűjtemény.
  • index Egy integer, amely egyedileg azonosítja az egyes tagokat az objektumgyűjteményben. Opcionális.
  • Key Egy egyedi string kifejezés, amivel azonosíthatunk egy elemet az objektumgyűjteményben. Opcionális.
  • text Az oszlop felirata. Opcionális.
  • width Numerikus kifejezés, az oszlop szélességét állítja be. Opcionális.
  • alignment Az oszlopban lévő szöveg rendezését állítja be. (Jobbra, balra vagy középre). Opcionális.
Egy oszlopot a Remove metódussal távolíthatunk el a gyűjteményből.

Példa.:

with ListView1         .ColumnHeaders.Add , , "Név", 500         .ColumnHeaders.Add , , "Azonosító", 300         .ColumnHeaders.Add , , "Cím", 800         .ColumnHeaders.Add , , "Telefon", 500 end with

ListView1. ColumnHeaders.Remove(3) - A harmadik oszlop eltávolítása.

A példában négy oszlopot definiáltunk az adott feliratokkal és szélességgel.


3. Ábra - ListView Icon nézet


4. Ábra - ListView List nézet


5. Ábra - ListView Report nézet

Első lépés tehát minden esetben a használni kívánt oszlopok adatainak beállítása. Ezek után tölthetjük fel adatokkal a listát. Az adatok feltöltését a kontrol két tulajdonságának felhasználásával tehetjük meg. A lista "elsődleges" oszlopának adatait a ListItems objektumgyűjtemény használatával állíthatjuk be.

Új elem hozzáadása.

ListItemsObj.Add(index, key, text, icon, smallIcon)

  • ListItemsObj Egy ListItems objektumgyűjtemény.
  • index Optional. Egy integer kifejezés, amellyel megadhatjuk a beszúrni kívánt elem helyét a gyűjteményben. Amennyiben nem kerül megadásra, úgy a lista végéhez fűződik az új elem. Opcionális.
  • key Egy egyedi string kifejezés mellyel azonosíthatjuk, elérhetjük az adott listaelemet. Opcionális.
  • text Az új elem értéke. Opcionális.
  • icon Egy integer kifejezés, annak az ikonnak az ImageList-beli sorszáma, amelyet az adott elemhez szeretnénk rendelni. Icon nézetben ezzel az ikonnal jelenik meg a listaelem. Opcionális.
  • smallIcon Egy integer kifejezés, annak az ikonnak az ImageList-beli sorszáma, amelyet az adott elemhez szeretnénk rendelni. SmallIcon nézetben ezzel az ikonnal jelenik meg a listaelem. Opcionális.
Egy elem eltávolítását a listából a Remove metódussal tehetjük meg, ahol meg kell adnunk az eltávolítandó elem sorszámát. (lsd. ColumnHeaders)

A lista teljes törlését pedig a Clear metódussal érhetjük el. Ekkor a lista teljes tartalma elvész.

A ListItems objektumgyűjteménnyel, mint láthattuk csak egyetlen oszlop adatait állíthatjuk be. Ahhoz hogy a többi oszlop adatait is megjeleníthessük, a ListItem objektum SubItems tulajdonságát is használnunk kell. A lista minden egyes eleme egy-egy ListItem objektum, így minden egyes elem rendelkezik egy SubItems tulajdonsággal is. Ez a tulajdonság reprezentálja az egyes "extra" oszlopok adatait. (Extra oszlopon az elsődleges oszlop után következő oszlopokat értem, mivel az elsődleges oszlop minden esetben látható, míg az extra oszlopok csak report nézetben.) Ez a SubItems tulajdonság egy összoszlopszám-1 elemű tömbként fogható fel, és értéket is ennek megfelelően adhatunk neki.

Pl.:

SubItems(1) = "szöveg"

Most, hogy már ismerjük egy ListView adatfeltöltésének menetét. Nézzünk erre egy pédát.

Private Sub Form_Load()     Dim itmx As ListItem     With ListView1         .ColumnHeaders.Add , , "Név", .Width / 4         .ColumnHeaders.Add , , "Azonosító", .Width / 4         .ColumnHeaders.Add , , "Cím", .Width / 4         .ColumnHeaders.Add , , "Telefon", .Width / 4         Set itmx = .ListItems.Add(, , "Kiss Elemér", 3, 1)         itmx.SubItems(1) = "13CF6X"         itmx.SubItems(2) = "Pécs Jókai u. 56."         itmx.SubItems(3) = "72/xxx-xxx"         Set itmx = .ListItems.Add(, , "Kovács Péter", 4, 2)         itmx.SubItems(1) = "56FG8D"         itmx.SubItems(2) = "Pécs Kossuth u. 5."         itmx.SubItems(3) = "72/xxx-xxx"         Set itmx = .ListItems.Add(, , "Varga István", 3, 1)         itmx.SubItems(1) = "78GH9J"         itmx.SubItems(2) = "Pécs Janus P. u. 6."         itmx.SubItems(3) = "72/xxx-xxx"         Set itmx = .ListItems.Add(, , "Tóth Zoltán", 3, 1)         itmx.SubItems(1) = "56FT8U"         itmx.SubItems(2) = "Pécs Melinda u. 7."         itmx.SubItems(3) = "72/xxx-xxx"     End With End Sub

Láthatjuk nem is olyan bonyolult. Példaalkalmazásunkban az adatok egy adatbázisból kerülnek beolvasásra, és ennek megvalósítása még ennél is egyszerűbb lesz. De azt majd nézzük egy kicsit később.
Nézzünk egy következő problémát. Programunkban szeretnénk, pl. ha a tagok listájából választva a kiválasztott személy adatai megjelennének a megfelelő TextBox -okban. Ehhez azonban tudnunk kell, hogy az adott listából éppen melyik elem került kiválasztásra. Ennek meghatározására szolgál a SelectedItem tulajdonság. Ez a tulajdonság egy referencia objektum, amely az aktuálisan kiválasztott elem ListItem objektumát reprezentálja. Ezen keresztül érhetjük el az elem tulajdonságait. A tulajdonságot nemcsak a kiválasztott elem elérésére, de egy elem kiválasztására is használhatjuk.

Pl..
Az aktuálisan kiválasztott elem értékének kiíratása egy TextBox-ba.

Text1.Text = ListView1.SelectedItem.Text

A lista második elemének kiválasztása a SelectedItem tulajdonság segítségével.

Set ListView1.SelectedItem = ListView1.ListItems(2)

Ha már az elemszelektálásnál tartunk, van még egy tulajdonság, amivel befolyásolhatjuk az elemkiválasztás láthatóságát a ListView kontrol fókuszból való kikerülése után. Ez a HideSelection. Ha értéke True akkor a fókusz elvesztése után a kiválasztott elem nem lesz kijelölve, míg False esetén a kiválasztás látható marad.

Egy másik tulajdonsággal befolyásolni tudjuk a lista elemeinek rendezettségét. Ha a Sorted értéke True, akkor a rendezés engedélyezett és a SortKey értékétől függően kerülnek rendezésre az adatok. Ha a SortKey értéke 0, akkor a ListItem Text tulajdonsága, vagyis az elsődleges oszlop tartalma alapján kerül rendezésre a lista. Ha az értéke nagyobb 0-nál, akkor a megfelelő sorszámú SubItem lesz a rendezés alapja. Ezeket felhasználva egy nagyon egyszerűen változtathatjuk a lista rendezettségét a következő esemény lekezelésével.

Private Sub ListView1_ColumnClick (ByVal ColumnHeader as ColumnHeader)     ListView1.SortKey=ColumnHeader.Index-1 End Sub

A ColumnClick esemény akkor következik be, ha a lista valamely oszlopának fejlécén kattintunk. Ehhez rendeltük hozzá az adatrendezést úgy, hogy mindig az alapján az oszlop alapján történik a rendezés, amelyiken kattintottunk.

A kontrol többi eseményéről nem szeretnék említést tenni, mivel ezek használata nagyjából megegyeznek a már ismert kontrolokéval.

Egy dologról kell még említést tennem és ez pedig a listán belüli keresés. Szerencsére ezt sem kell leprogramoznunk, mivel a ListView vezérlő rendelkezik egy metódussal, ami ezt megoldja helyettünk. Ez pedig a FindItem metódus. Alkalmazása a következő.

ListViewObj.FindItem (string, value, index, match)

  • ListViewObj Egy ListView kontrol.
  • string Egy sztring kifejezés, amit keresni szeretnénk.
  • value Egy integer kifejezés, ami azt mutatja meg, hogy a szöveget hol keresse a metódus.
  • index Egy integer, vagy string kifejezés, amely egyértelműen azonosít egy elemet a ListItems gyűjteményben amitől a keresés kezdődik. Ha integert adunk meg, akkor az index, ha stringet akkor a key alapján azonosítja az elemet.
  • match A keresés típusát adja meg.
A value mező értékei
  • lvwText 0 (Alapértelmezett) A sztringet a ListItem Text tulajdonságában keresi.
  • lvwSubitem 1 A sztringet a ListItem objektumok SubItems tulajdonságaiban keresi.
  • lvwTag 2 A sztringet a ListItem objektumok Tag tulajdonságaiban keresi.
A match mező értékei
  • lvwWholeWord 0 (Alapértelmezett) Csak teljes egyezést keres.
  • lvwPartial 1 Részsztringet keres.
ListBox és ComboBox vezérlőelemek

Több helyen is előfordulhat, hogy olyan listára lenne szükségünk, amely csak egyetlen adatoszlopot tartalmaz, valamint lehetőség van arra, hogy a lista egy nem látható eleméhez, tulajdonságához valamilyen azonosítókat rendeljünk. Ilyen esetekben választhatjuk a ListBox vagy a ComboBox vezérlőket. Mivel kezelésük szinte teljesen megegyezik, ezért egy kalap alatt megismerhetjük mindkettőt.


6. Ábra - ListBox vezérlő


7. Ábra - ComboBox vezérlő

Elsőként is nézzük meg, miben különbözik a két vezérlő. A legfeltűnőbb a megjelenésük. A ListBox egy normál lista doboz, ahol egyszerre több elem is megtekinthető, ill. kiválasztható. A ComboBox ellenben egy egyszerű TextBox-hoz hasonlítható, azzal a különbséggel, hogy értékét nemcsak manuálisan változtathatjuk, hanem egy úm. beépített listából is választhatjuk.

Mindkét vezérlő több stílussal is rendelkezhet. A ListBox esetén a listánk lehet egy normál lista doboz, valamit lehet egy ún. checkbox-okkal ellátott lista is. Az első esetben az elemkiválasztás a kiválasztott elem eltérő színével jelentkezik, míg a második esetben a listaelemek előtt elhelyezkedő kis négyzetekben lévő pipa jelzi a szelektálást. A ComboBox összesen három stílust engedélyez.

  • Dropdown Combo: ez egy normál legördülő lista, ahol a Combo tartalmát editálással és listából történő választással is megváltoztathatjuk.
  • Simple Combo: első ránézésre egy normál TextBox, azonban ha a mezőben a le ill. föl nyilakkal navigálunk, akkor a megadott lista elemei között válogathatunk. Az editálás is megengedett.
  • Dropdown List: egy olyan lista, ahol a Combo tartalma manuálisan már nem editálható, csak a lista elemei közül választva határozhatunk meg értéket.
Mindkét esetben a lista elemeinek a felvitele ugyanazzal a metódussal történik.

ListObj.AddItem item, index

  • ListObj Egy ListBox vagy ComboBox vezérlő.
  • item Egy sztring kifejezés.
  • index Az a pozíció, ahová az új elemet beszúrni szeretnénk. Elhagyása esetén a lista végére kerül. Opcionális.
Minden egyes elem hozzáadása után az új elem indexe a NewIndex tulajdonságból határozható meg. A lista elemeinek számát a ListCount tulajdonsággal határozhatjuk meg.

Elemek eltávolításához a RemoveItem metódus használható.

ListObj.RemoveItem index

  • ListObj Egy ListBox vagy ComboBox vezérlő.
  • index Az eltávolítandó elem pozíciója.
A teljes lista ürítéséhez pedig a Clear metódust használjuk.

Lehetőség van arra, hogy minden egyes listaelemhez hozzárendeljünk egy speciális számértéket. Például esetünkben egy ListBox-ban szeretnénk megjeleníteni a tékában lévő filmek címeit, és szeretnénk az egyes címekhez hozzárendelni a megfelelő azonosítókat is. Erre ad lehetőséget az ItemData tulajdonság.

ListObj.ItemData(index) [= number]

  • ListObj Egy ListBox vagy ComboBox vezérlő.
  • index Az adott listaelem sorszáma.
  • number A számérték amit a listaelemhez rendelünk.
A következő példában megláthatjuk, hogyan történik mindez a gyakorlatban.
For i = 0 to ubound(mxAdatok,2)   LstAdatok.AddItem mxTagok(1, i)   LstAdatok.ItemData(LstAdatok.NewIndex) = mxTagok(0, i) Next i

A példában egy egyszerű for ciklussal végigmegyünk egy kétdimenziós mátrix sorain, és annak megfelelő értékeit hozzáadjuk a listához. Ezután az újonnan hozzáadott elem indexét felhasználva, a megfelelő elem ItemData-jához hozzárendeljük a mátrix egy másik értékét.

Most nézzük meg hogyan érhetjük el a létrehozott lista egyes elemeit programból, valamint, hogyan határozhatjuk meg a kiválasztott elem vagy elemek indexét és értékét.

Mindkét vezérlő rendelkezik egy List tulajdonsággal, amely segítségével meghatározhatjuk, illetve beállíthatjuk a lista egy adott indexű elemének az értékét.

ListObj.List(index) [= string]

  • ListObj Egy ListBox vagy ComboBox vezérlő.
  • index Az adott elem idexe.
  • string Egy sztring kifejezés, amely a beállítandó értéket tartalmazza.
Pl.:
    ListBox1.List(0) = "<nincs>" - Érték adás     StrListItem = ListBox1.List(0) - Érték kiolvasás

Ha arra vagyunk kíváncsiak, hogy a listából éppen mely érték került kiválasztásra, akkor annak indexét a ListIndex tulajdonságból határozhatjuk meg. Ennek birtokában pedig már könnyedén meghatározhatjuk a kiválasztott elem értékét, és ItemData-ját.

X = ListBox1.Itemdata(ListBox1.ListIndex) StrListItem = ListBox1.List(ListBox1.ListIndex)

ListBox esetén lehetőség van egyszerre több elem kiválasztására is abban az esetben ha a MultiSelect tulajdonság true értékű. Ilyenkor a kiválasztott elemek számát a SelCount tulajdonságból olvashatjuk ki. A kiválasztott elemek indexének meghatározásához pedig a Selected tulajdonság alkalmazható.

ListObj.Selected(index) [= boolean]

  • ListObj Egy ListBox vagy ComboBox vezérlő
  • index Az adott elem idexe.
  • boolean Egy logikai kifejezés mely meghatározza hogy az adott indexű elem ki van -e választva. (Ha true akkor igen, ha false akkor nem)
Egy egyszerű for ciklussal már könnyedén meg is határozhatjuk a kiválasztott elemek indexeit.

Mindkét vezérlőnél lehetőség van a lista adatainak abc sorrendbe való rendezésére, amit egyetlen tulajdonság beállításával végrehajthatunk. Ez a tulajdonság a Sorted. Ha értéke true, akkor a rendezés automatikusan végrehajtódik, más esetben az elemek a hozzáadás sorrendjét veszik fel.

Második fül - Kölcsönzések

Ezen a fülön található a film adatok karbantartása, valamint itt rendelhetjük a már előzőleg kiválasztott személyhez a kölcsönözni kívánt filmeket. Az ablakot a már említett vezérlőkből építhetjük fel.


8. Ábra - Második fül

Hát egyenlőre most ennyit. A leírtak alapján és a mellékelt forráskód segítségével remélem sikerült bemutatnom a lista kezelések legalapvetőbb mozzanatait. A következő részben ugyanezt a példaalkalmazást folytatva bemutatom, hogy miként kapcsolhatjuk ezeket a felületeket egy adatbázishoz. Az adatbázis elérés amit használni fogok a Microsoft ActiveX Data Objects objektumkönyvtára lesz. A példaprogram most még egy alapszintre butított verzióját mellékelem (nincsenek bent a fontosabb adatkezelő rutinok), a következő alkalommal már a teljes programot kipróbálhatjátok.