ADATBÁZIS-KEZELÉS ACTIVEX VEZÉRLİK ALKALMAZÁSÁVAL I.... 1 ACTIVEX... 1 ACTIVEX CONTROL... 1 SAJÁT ACTIVEX VEZÉRLİ LÉTREHOZÁSA... 1 circctrl.cpp... 2 Háttérszín tulajdonság hozzárendelése a vezérlıhöz... 2 Saját ActiveX vezérlı regisztrálása... 3 Az ActiveX vezérlık használata... 4 Teszt projekt létrehozása... 4 A Circ ActiveX Control vezérlıelem beillesztése a Control eszköztárba... 4 ADATBÁZIS-KEZELİ ALKALMAZÁS KÉSZÍTÉSE ACTIVEX VEZÉRLİK HASZNÁLATÁVAL... 5 Projekt létrehozása... 5 ActiveX vezérlık beillesztése a projektbe... 5 A DBGrid Control és a Data Control vezérlık mőködése... 6 Data Control attribútumok (Microsoft ADO Data Control Version 6.0 (OLEDB))... 6 DBGrid attribútumok (True OLE DBGrid 8 Control)... 6 ActiveX vezérlık elhelyezése az alkalmazás ablakon... 6 IDC_DATA_CONTROL beállítása... 7 IDC_GRID_CONTROL beállítása... 7 Dinamikus táblacsere megvalósítása... 8 Összetett SQL parancsok végrehajtása... 9 SZABÓNÉ NACSA ROZÁLIA Email: nacsa@inf.elte.hu Honlap: people.inf.elte.hu/nacsa 2004. november Adatbázis-kezelés ActiveX vezérl k alkalmazásával I. Ebben a munkafüzetben megismerkedünk elıregyártott grafikus komponensek (ActiveX Control) használatával. ActiveX Az ActiveX a Microsoft által kifejlesztett technológia család, amellyel megoldható a különbözı alkalmazások közötti információ csere. Ez a technológia két, korábban alkalmazott technológiát ötvöz: OLE (Object Linking and Embedding); COM (Component Object Model). Az ActiveX technológia szabványa pontosan meghatározza, hogyan kell készíteni, és hogyan kell alkalmazni az ActiveX komponenseket. ActiveX Control Az ActiveX Control az ActiveX technológia család egy speciális fajtája. Az ActiveX vezérlık a Windows grafikus alkalmazásainál megismert GUI vezérlıkhöz hasonlóan viselkedı komponensek. Saját ActiveX vezérlı létrehozása Mielıtt alkalmazni kezdenénk bármely adatbázis-kezeléshez készített, összetett ActiveX komponenst, nézzük meg, hogyan hozhatunk mi magunk létre egy egyszerő, saját ActiveX vezérlıt. 1. oldal
Feladat: Készítsünk kört rajzoló grafikus vezérlıt, melynek be lehet állítani a háttérszínét. ActiveX projekt létrehozása File/New/Projects MFC ActiveC ControlWizard Projekt neve: Circ Platform: Win32 OK Finish OK A varázsló automatikusan létrehozza a vezérlıhöz szükséges osztályokat és fájlokat. Osztály CCircApp CCircCtrl CCircPropPage Feladat A main DLL forrás implementálása. Általában nem kell módosítani. A vezérlıelem funkcióinak implementálása. Ide írjuk be a vezérlı specifikus kódot. Sablon a tulajdonságlapok számára. Itt adjuk meg a vezérlı specifikus tulajdonságlapokat. A CCircCtrl osztály OnDraw() függvénye alapértelmezésben egy kört rajzol, így akár azonnal lefordíthatjuk és használhatjuk a vezérlıt. circctrl.cpp void CCircCtrl::OnDraw(CDC* pdc, const CRect& rcbounds, const CRect& rcinvalid) pdc->fillrect(rcbounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); Háttérszíntulajdonsághozzárendeléseavezérlőhöz pdc->ellipse(rcbounds); Készítsünk eszközgombot a vezérlıhöz. A RecourceView Bitmap könyvtárában kattintsunk duplán az IDB_CIRC bejegyzésre, majd rajzoljunk egy tele kört az eszközgombra. Ezután fordítsuk le a programot. A projekt lefordítása után keressük meg a project debug/release könyvtárában a circ.ocx kiterjesztéső fájlt. Ez a mi ActiveX Control komponensünk. Legyen a háttérszín a vezérlı egyik beállítható tulajdonsága (property). A háttérszín beépített tulajdonság (stock property), ezért nagyon könnyen hozzá tudjuk adni a vezérlıhöz. 2. oldal
View/ClassWizard/Automation fül Osztály neve: CCtrlCirc Add Property External name: BackColor Implementation: Stock OK/Close Illesszük be a színkezelı tulajdonságlapot a vezérlı tulajdonságlapjai közé. CCircCtrl.cpp ///////////////////////////////////////////////////////////////////////////// // Property pages // TODO: Add more property pages as needed. Remember to increase the count! BEGIN_PROPPAGEIDS(CCircCtrl, 2) PROPPAGEID(CCircPropPage::guid) PROPPAGEID(CLSID_CColorPropPage) END_PROPPAGEIDS(CCircCtrl) Módosítsuk a rajzoló függvény viselkedését, majd fordítsuk le a programot. void CCircCtrl::OnDraw( CDC* pdc, const CRect& rcbounds, const CRect& rcinvalid) CBrush* poldbrush; CBrush bkbrush(translatecolor(getbackcolor())); CPen* poldpen; // Paint the background using the BackColor property pdc->fillrect(rcbounds, &bkbrush); SajátActiveXvezérlőregisztrálása // Draw the ellipse using the BackColor property and a black pen poldbrush = pdc->selectobject(&bkbrush); poldpen = (CPen*)pdc->SelectStockObject(BLACK_PEN); pdc->ellipse(rcbounds); pdc->selectobject(poldpen); pdc->selectobject(poldbrush); Ahhoz, hogy az alkalmazások készítésekor használhassuk ezt a vezérlı elemet, regisztrálnunk kell. Vegyük fel a Circ ActiveX vezérlıt (circ.ocx) a Microsoft regisztrált komponensei közé. Ehhez meg kell nyitnunk a Circ ActiveX projektünket, majd ki kell adni a Tools/Register Control parancsot. A felbukkanó üzenet jelzi, hogy a regisztráló megtalálta a circ.ocx komponenst, és azt fel is vette a regiszrált komponesek közé. Ettıl a ponttól kezdve ezt a vezérlıt ugyanúgy használhatjuk, mint bármely más Windows-os GUI vezérlıt. A Tools/ ActiveX Control Test Container segítségével azonnal tesztelhetjük is a vezérlınket. A Test Container kiválasztása után az Edit/Insert New Control paranccsal töltse be a tesztelni kívánt vezérlıt, a Control/Invoke Methods paranccsal tesztelheti a vezérlı metódusait. Tesztelés után zárja be a projektet. 3. oldal
aa AzActiveXvezérlőkhasználata Tesztprojektlétrehozása Elemi alkalmazások fejlesztése IV. Adatbázis-kezelés ActiveX vezérlıkkel - 1 Feladat: Készítsünk egy egyszerő projektet, amelyben megtanuljuk, hogyan kell használni az ActiveX típusú komponenseket. Project/New/MFC AppWizard(Exe) Project neve: CircTest Single Document Printing - kikapcsolva Base Class: CFormView Finish/OK A Circ ActiveX Control vezérlıelem beillesztése a Control eszköztárba Project/Add to Project/Component and Controls Registered ActiveX Controls könyvtár kiválasztása Circ Control kiválasztása Insert/Ok/Ok/Close Vegyük észre, hogy a Control vezérlı eszköztárán megjelent a Circ Control gombja. Helyezzünk el néhány Circ típusú vezérlıt (kört) az őrlapon, majd a Tulajdonság lap segítségével állítsunk be különbözı háttérszíneket az egyes vezérlıkön. A Circ ActiveX projekt és a CircTest tesztelı projekt letölthetı a people.inf.elte.hu/nacsa/eaf4/project/circ és a people.inf.elte.hu/nacsa/eaf4/project/circtest címekrıl. 4. oldal
Adatbázis-kezelı alkalmazás készítése ActiveX vezérlık használatával Feladat: Készítsünk egy olyan grafikus felülető alkalmazást, amellyel rugalmasan kezelni tudjuk az Eaf projekt tábláit. A feladat megoldásához használjunk ActiveX vezérlıket. Az ActiveX vezérlık használatának az a célja, hogy a mások által és/vagy egy másik alkalmazással elkészített, jól letesztelt vezérlıket használjunk a programunk gyors elkészítése érdekében. A Microsoft Visual 6.0 fejlesztıkörnyezet rendelkezik saját adatbázis-kezelést támogató komponenssel. Ilyen komponens például a DBGridControl (C:\Widows\System32\DBGRID32.OCX), vagy a Microsoft Remote Data Control (C:\Windows\System32\MSRDC20.OCX) adatbázis-kezelést támogató vezérlı. E két vezérlı alkalmazása során azonban azt tapasztaltam, hogy üres táblázatok esetén nem jól mőködik az új rekord felvétele, ezért helyette a True DBGrid Pro 8.0 ActiveX vezérlıt fogjuk használni. Ezt a vezérlıt 30 napos kipróbálásra lehet letölteni. Letöltéshez regisztrálni kell a http://www.logon-int.com/product_evaluate.asp címen, majd a levélben visszajelzett tdbgrid8_****.exe fájl végrehajtása után a vezérlı bekerül a regisztrált ActiveX vezérlık közé, és az elızıekben bemutatott módon felhasználható. Megjegyzés: Természetesen, ha Önnek nem sikerül beszerezni az itt ismertetett ActiveX vezérlıt, használja nyugodtan a Microsoft vezérlıit, vagy bátran keressen más AciveX vezérlıt a feladat megoldásához. Az adatbázis-kezelést támogató ActtiveX vezérlık használata és beállítása nagyon hasonlít egymáshoz. Projekt létrehozása Project/New/MFC AppWizard(Exe) Project name: ActiveTables Single Document Printing - kikapcsolva Base Class: CFormView Finish/OK Forditás/Futtatás A projekt lefordítása után azonnal rendelkezésünkre állnak a legalapvetıbb adatbázis navigáló funkciók. ActiveX vezérlők beillesztése a projektbe Project/Add to Project/Component and Controls 5. oldal
Registered ActiveX Controls könyvtár kiválasztása True OLE DBGrid 8 Control kiválasztása - Insert/Ok/Ok Microsoft ADO Data Control Version 6.0 (OLEDB) kiválasztása - Insert/Ok/Ok Close Keresse meg a Control eszköztárban az új vezérlıelemek gombjait. A DBGrid Control és a Data Control vezérlők működése A Data Control kezeli, a DBGrid Control táblázatos formában megjeleníti az adatokat. A DBGrid az adatbázis felépítésére vonatkozó információt a Data Control vezérlıtıl kapja meg, és a kapott információk alapján automatikusan megjeleníti az adatbázis tábla oszlopait. Az alábbiakban felsoroljuk a két vezérlı legfontosabb attribútumait és azok jelentését. Data Control attribútumok (Microsoft ADO Data Control Version 6.0 (OLEDB)) General fül ID: A azonosítója Caption:: A vezérlı felirata Visible: Látható, vagy nem látható a vezérlı Control fül Source of Connection: Adatforrás beállítása Use ODBC Data source name: ODBC adatforrás neve Record Source fül Command type: DBGrid attribútumok tribútumok (True OLE DBGrid 8 Control) General fül ID: Caption: Visible: Tab stop: All fül Data Source AllowAddNew AllowUpdate AllowDelete CursorLocation CursorType ActiveX vezérlők elhelyezése az alkalmazás ablakon Adatkijelölés módja: tábla; SQLszöveg A vezérlı azonosítója A tábla cím felirata Látható vagy nem látható a tábla A Tab leütésekor itt meg kell-e állni Ezen a helyen hozzárendelhetünk a táblázathoz egy adatszolgáltatót. Ekkor az adatszolgáltatóval együttmüködve jelennek meg az adatok a táblázatban. Új rekord felvételének tiltása/engedélyezése Rekord módosítás tiltása/engedélyezése Rekord törlés tiltása/engedélyezése Ezzel a beállítással arról dönthetünk, hogy a lekérdezett táblázat adatait a szerver oldalon (ott, ahol az adatbázis-kezelı van), vagy a kliens oldalon (ott, ahol az alkalmazás fut), szeretnénk tárolni. Ezzel a beállítással arról dönthetünk, hogyan viselkedjen a adatbázisunk az adatok megváltoztatásakor, ha egyszerre több felhasználó is használja az adatbázist.( Kinek a módosítása érvényes? ) Helyezzünk el egy Microsoft ADO Data Control Version 6.0 (OLEDB) vezérlıt és egy True OLE DBGrid 8 Control vezérlıt az alkalmazás ablakra. A Data Control (adatvezérlı) az adatokért, a DBGrid Control az adatok táblázatos formában történı megjelenítésért felel. Ha a két vezérlıt összekapcsoljuk, akkor a DBGrid az adatbázis felépítésére vonatkozó információt megkapja a Data Control vezérlıtıl, és a kapott információk alapján automatikusan megjeleníti z adatbázis tábla mezıit. A vezérlık összekapcsolása után akár a megjelenített táblában, akár az adatokban történik változás, mindkét vezérlı azonnal érzékeli azt. 6. oldal
IDC_DATA_CONTROL beállítása (Kattintsunk jobb egérfüllel a vezérlıre és válasszuk ki a Properties menüpontot.) General fül ID: IDC_DATA_CONTROL Caption:: Adat vezérlı Visible: true Control fül Source of Connection Use ODBC Data source name: Elemi alkalmazások fejlesztése Record Source fül Command type 2 adcmdtext Command Text(SQL): select * from csoport (A program indításakor a csoport tábla jelenik majd meg.) IDC_GRID_CONTROL beállítása (Kattintsunk jobb egérfüllel a vezérlıre és válasszuk ki a Properties menüpontot.) General fül ID: IDC_GRID_CONTROL Caption: Adat tábla Visible: true Tab stop: true All fül Data Source IDC_DATA_CSOPORT AllowAddNew true AllowUpdate true AllowDelete true Split fül Split(00) ExtendedRightColumn: Igazra állítva az utolsó (jobb oldali) oszlop kitölti a táblaméret jobb szélét. Forditás/Futtatás A projekt lefordítása után azonnal dolgozhatunk a csoport táblázattal. Beszúrhatunk új rekordokat, ill. törölhetjük, módosíthatjuk azokat. Vegye észre, hogy a két vezérlı a navigálás során összehangoltan mőködik. 7. oldal
Dinamikus táblacsere megvalósítása Feladat: Egészítsük ki a programot úgy, hogy gombokkal lehessen kiválasztani, melyik táblával szeretnénk dolgozni. Az utolsó oszlop mögötti üres sáv eltüntetésére állítsuk be az ExtendedRightColumn opciót igazra. DBGrid Control módosítása: Split fül Split(00) ExtendedRightColumn: true Rendeljünk változót a Data Control (m_datacontrol) és a DBGrid (m_gridcontrol) vezérlıhöz, azért, hogy a beállításokat programból is megadhassuk. (ResourceView/Dialog/IDC_ACTIVETABLES_FORM/Ctrl+Dupla kattintás a Data Control-ra/Változó neve: m_datacontrol) A projekt különbözı táblázatainak megjelenítéséhez helyezzünk gombokat az őrlapra. IDC_DIAK (Caption: Diákok); IDC_CSOPORT (Caption: Csoportok); IDC_FELEV (Caption:Félévek); IDC_GYAKVEZ (Caption: Gyakorlatvezetık) Az osztályvarázsló segítségével rendeljünk eseménykezelıket a gombokhoz, majd adjuk meg az eseménykezelık mőködését. Activetablesview.cpp ///////////////////////////////////////////////////////////////////////////// // CActiveTablesView message handlers void CActiveTablesView::OnCsoport() m_datacontrol.setrecordsource("select * from csoport"); m_datacontrol.refresh(); void CActiveTablesView::OnDiak() m_datacontrol.setrecordsource("select * from diak"); m_datacontrol.refresh(); void CActiveTablesView::OnFelev() m_datacontrol.setrecordsource("select * from felev"); m_datacontrol.refresh(); void CActiveTablesView::OnGyakvez() m_datacontrol.setrecordsource("select * from gyakvez"); m_datacontrol.refresh(); 8. oldal
Rejtsük el az adatvezérlıt az alkalmazás ablakon. Data Control beállításai (Property) General fül ID: IDC_DATA_CONTROL Caption: Adat tábla Visible: false Összetett SQL parancsok végrehajtása Feladat: Összetett lekérdezések kezelésére helyezzünk el egy szövegdobozt az alkalmazás ablakon. Az SQL parancs végrehajtása gombra kattintva állítsuk át az adatforrást a szövegdobozban megadott SQL parancs szerint. Helyezzünk el egy gombot (IDC_SQL_EXECUTE- Caption: Sql parancs végrehajtása) és egy szövegdobozt (IDC_SQL_TEXT) az alkalmazás ablakon. Rendeljünk érték típusú változót (CString m_sqltext) a szövegdobozhoz. Az osztályvarázsló segítségével illesszük be a projektbe az IDC_SQL_EXECUTE gomb eseménykezelıjét, majd adjuk meg az eseménykezelı mőködését. activetableviews.cpp void CActiveTablesView::OnSqlExecute() UpdateData(); m_datacontrol.setrecordsource(m_sqltext); m_datacontrol.refresh(); Teszteljük az új funkciót! Íme egy lehetséges összetett Sql parancs: select tag.diak_id, concat(diak.nev,'[',diak.azon,']') diak_azon,tag.csoport_id,pont1,pont2,pont3,pont4 from tag,diak where tag.diak_id=diak.diak_id and csoport_id = 3 Forditás/Futtatás Vegyük észre, hogy a DBGrid vezérlı módosítása nélkül, csupán az adatszolgáltató vezérlı módosításával a DBGrid átkonfigurálta önmagát, és mindenkor az SQL parancs szerinti táblázatot jeleníti meg. Ha a lekérdezés eredménye egy igazi táblázat, lehetséges új rekord felvitele, módosítása és törlése. Összetett lekérdezések esetében nem lehet új sort beszúrn, ill. sorokat törölni még akkor sem, ha az AllowAddNew ill. az AllowDelete igazra lett állítva. 9. oldal
Megjegyzés: Az alkalmazás gyorsan elkészíthetı, de nem minden esetben kényelmes. Sokkal egyszerőbb lenne az adatok kezelése, ha pl. a gyakvez_id helyett a gyakorlatvezetı nevét, félév_id helyett a félévet azonosító szöveget látnánk. Ilyen megoldásra az Adatbázis-kezelés ActiveX vezérlıkkel II. munkafüzetben mutatunk példát. A munkafüzetben bemutatott példaprogram letölthetı a people.inf.elte.hu/nacsa/eaf/eaf4/projects/activetables címrıl. 10. oldal