ADATBÁZISKEZELÉS KÖZVETLEN ELÉRÉSSEL II...2 2. FELADAT: RENDEZETT LISTA...2 KÉSZITSÜK EL A FILLSORTEDDATA(INT SCOLUMN) SAJÁT METÓDUST!...2 void CBankView::FillSortedData(int scolumn)... 3 KÉSZITSÜK EL AZ OSZLOPRA KATTINTÁS CALLBACK FÜGGVÉNYÉT!...3 void CBankView::OnColumnclick(NMHDR* pnmhdr, LRESULT* presult)... 3 3. FELADAT: MÓDOSÍTÁS/TÖRLÉS/BESZÚRÁS...4 A CUGYFELDLG OSZTÁLY...4 Párbeszédablak létrehozása...4 Dialogusablak cím beállítása...4 Változók hozzárendelése a vezérl khöz...4 Saját adattagok...5 Saját metódusok...5 void UgyfelDlg::GetUgyfel(Ugyfel &uf)... 5 void UgyfelDlg::SetUgyfel(Ugyfel &uf)... 5 Kulcsmez módosítás engedélyezése / tiltása...6 void UgyfelDlg::EnableRefszam()... 6 void UgyfelDlg::DisableRefszam()... 6 TARTSUK NYILVÁN, MELY OSZLOP SZERINT RENDEZETT A LISTA...6 void CBankView::OnColumnclick(NMHDR* pnmhdr, LRESULT* presult)... 6 void CBankView::OnInitialUpdate()... 6 SZÚRJUNK BE/ MÓDOSÍTSUNK DUPLA KATTINTÁSRA...7 void CBankView::OnDblclk(NMHDR* pnmhdr, LRESULT* presult)... 7 A DIALÓGUSBAN MÓDOSÍTÁSNÁL LEGYEN A REFSZÁM CSAK OLVASHATÓ...8 BOOL UgyfelDlg::OnInitDialog()... 8 A CTRL+DEL BILLENTY LEÜTÉSEKOR TÖRÖLJÜK A KIJELÖLT ADATSORT...8 Az icolumn, irow adattagok felvétele...8 Az OnClick() metódus megadása...8 void CBankView::OnClick(NMHDR* pnmhdr, LRESULT* presult)... 9 A Ctrl+Del billenty kezelése...9 Azonositot rendelünk a tevékenységhez... 9 Az azonosítóhoz hozzárendeljük a Ctrl+DEL billenty t... 9 Az azonosítóhoz hozzárendeljük a callback függvényt... 9 void CBankView::OnDel()... 9 4. FELADAT: STÁTUSZSOR MÓDOSÍTÁSA...10 Új indikátorok elhelyezése az állapotsorban...11 Az indikátorok azonosítójának létrehozása... 11 static UINT indicators[] =... 11 Státuszsor indikátorait kezel callback függvények...11 void CBankView::OnUpdateMessage(CCmdUI *pcmdui)... 12 void CBankView::OnUpdateCount(CCmdUI *pcmdui)... 12 1. oldal
Adatbáziskezelés közvetlen eléréssel II. 2. Feladat: Rendezett lista Módosítsuk az Adatbáziskezelés közvetlen eléréssel I. fejezetben elkészült alkalmazásunkat úgy, hogy egy adott oszlopra kattintva az adott oszlop szerinti rendezettségben jelenjenek meg adataink. Refszám szerint rendezett Cím szerint rendezett Saját jegyzeteim Készitsük el a FillSortedData(int scolumn) saját metódust! Workspace/ClassView/CBankView/(jobb egérfül)/add member function Function type: void Function declaration: FillSortedList(int colnumber) Access: Public BankView.h class CBankView : public CListView // Implementation public: void FillList(); void FillSortedList(int scolumn); virtual ~CBankView(); ; 2. oldal
Másoljuk át a FillList() metódusának belsejét a FillSortedData(int scolumn) metódusába, majd módosítsuk az alábbiak szerint. void CBankView::FillSortedData(int scolumn) Ugyfel uf; CListCtrl* plist= &GetListCtrl(); CBankDoc* pdoc = GetDocument(); switch(scolumn) case 0: pdoc->executequery( select * from ugyfel order by refszam; ); case 1: pdoc->executequery( select * from ugyfel order by nev; ); case 2: pdoc->executequery( select * from ugyfel order by cim; ); case 3: pdoc->executequery( select * from ugyfel order by status; ); pdoc->movefirst(); for (int i=0; i<pdoc->count(); i++) pdoc->getcurrentitem(uf); CString str; str.format( %d,uf.refszam()); plist->insertitem(i,str); plist->setitemtext(i,1,uf.nev()); plist->setitemtext(i,2,uf.cim()); plist->setitemtext(i,3,uf.status()); pdoc->movenext(); Készitsük el az oszlopra kattintás callback függvényét! View/ClassWizard/Message Maps Project: Bank Class name: CBankView Object IDs: CBankView Messages: LVN_COLUMNCLICK Add Functions /Edit code void CBankView::OnColumnclick(NMHDR* pnmhdr, LRESULT* presult) NM_LISTVIEW* pnmlistview = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here GetListCtrl().DeleteAllItems(); FillSortedData(pNMListView->iSubItem); *presult = 0; Forditás/Futtatás 3. oldal
3. Feladat: módosítás/törlés/beszúrás A lista egy sorára duplát kattintva jelenjen meg egy párbeszédablak, amelyben módosíthatjuk az adatsort. Üres sorra duplát kattintva új adatot vihetünk fel. Módosításnál ne engedjük meg a kulcsmez (refszam) módosítását. A CUgyfelDlg osztály Insert/Resource/Dialog/Dialog/New Kattintás jobb egérfüllel a dialógusablakon/properties/general: ID: Caption: IDD_UGYFEL Ügyfél A View/ClassWizard parancs kiadásakor az alábbi üzenet figyelmeztet az új dialógus osztály létrehozására. Az OK választása után: Class information/name: UgyfelDlg // az osztály neve Az osztályvarázsló segítségével adjuk meg az alábbi változókat. Control ID Style Variable name Type Tab order IDC_REFSZAM 1 Right, number refszam int 1 IDC_REFSZAM 1 refszam_ctrl CEdit 1 IDC_NEV left nev CString 2 IDC_CIM left cim CString 3 IDC_STATUS left status CString 4 ÜgyfelDlg.h // Dialog Data //AFX_DATA(UgyfelDlg) enum IDD = IDD_UGYFEL ; CEdit refszam_ctrl; int refszam; CString cim; CString nev; CString status; //AFX_DATA 1 Vegyük észre, hogy az IDC_REFSZAM-hoz érték és control kategóriájú változót is rendeltünk. A refszam_ctrl változót fogjuk felhasználni a mez szerkesztésének engedélyezésére/letiltására. 4. oldal
Az enable_refszam logikai változóban azt jelezzük, hogy engedélyezett-e a refszam mez vagy sem. Workspace/ClassView/UgyfelDlg/Jobb egérfül/add member variable / Variable type: bool Variable name:enable_refszam Access: protected UgyfelDlg.h // Implementation protected: bool enable_refszam; módosítása A párbeszédablakban szerepl SetUgyfel saját metódusokat: adatmez k feltöltésére/lekérdezésére definiáljuk a GetUgyfel és Workspace/ClassView/UgyfelDlg/Jobb egérfül/add member function / Function type: void Function declaration: GetUgyfel(Ugyfel &uf) UgyfelDlg.cpp void UgyfelDlg::GetUgyfel(Ugyfel &uf) uf.setrefszam(refszam); uf.setnev(nev); uf.setcim(cim); uf.setstatus(status); Workspace/ClassView/UgyfelDlg/Jobb egérfül/add member function / Function tylpe: void Function declaration: SetUgyfel(Ugyfel &uf) UgyfelDlg.cpp void UgyfelDlg::SetUgyfel(Ugyfel &uf) refszam = uf.refszam(); nev = uf.nev(); cim = uf.cim();; status = uf.status(); Az Ugyfel.h header fájlt illesszük be a UgyfelDlg.h header fájlba. UgyfelDlg.h // UgyfelDlg.h : header file #include Ugyfel.h 5. oldal
!" A CUgyfelDlg osztályban bevezetünk két további saját metódust. Az EnableRefszam() metódussal engedélyezni tudjuk a párbeszédablakban a refszam módosítását, a DisableRefszam metódussal pedig letiltjuk azt. Az éppen aktuális beállítást az enable_refszam adattagban tároljuk. Workspace/ClassView/UgyfelDlg/Jobb egérfül/add member function / Function type: void Function declaration: EnableRefszam() UgyfelDlg.cpp void UgyfelDlg::EnableRefszam() enable_refszam=true; Workspace/ClassView/UgyfelDlg/Jobb egérfül/add member function / Function type: void Function declaration: DisableRefszam() UgyfelDlg.cpp void UgyfelDlg::DisableRefszam() enable_refszam=false; Tartsuk nyilván, mely oszlop szerint rendezett a lista Vezessük be az scolumn adattagot, melyben tároljuk, melyik oszlop szerint rendezett a listánk. Workspace/ClassView/CBankView/(jobb egérfül)/add member variable Variable type: int Variable name: scolumn Access: Protected Egészítsük ki az OnColumnclick metódust az alábbiak szerint: void CBankView::OnColumnclick(NMHDR* pnmhdr, LRESULT* presult) GetListCtrl().DeleteAllItems(); FillSortedData(pNMListView->iSubItem); scolumn=pnmlistview->isubitem; *presult = 0; Módosítsuk az OnInitialUpdate metódust az alábbiak szerint void CBankView::OnInitialUpdate() CListView::OnInitialUpdate(); // TODO: You may populate your ListView with items by directly accessing // its list control through a call to GetListCtrl(). CBankDoc* pdoc = GetDocument(); pdoc->connectdatabase( Bank ); FillHeader(); scolumn=0; FillSortedData(0); 6. oldal
Szúrjunk be/ módosítsunk dupla kattintásra View/ClassWizard/Message Maps Project:Bank Class name:cbankview Object IDs: CBankView Messages:NM_DBLCLK Add Functions /Edit code void CBankView::OnDblclk(NMHDR* pnmhdr, LRESULT* presult) // TODO: Add your control notification handler code here NM_LISTVIEW* pnmlistview = (NM_LISTVIEW*)pNMHDR; int iitem = pnmlistview->iitem; Ugyfel uf; UgyfelDlg dlg; CString str; if (iitem == -1) uf.setrefszam(0); uf.setnev( ); uf.setcim( ); uf.setstatus( ); dlg.enablerefszam(); bool single_key; single_key=false; while(!single_key) single_key=true; dlg.setugyfel(uf); if (dlg.domodal() == IDOK) dlg.getugyfel(uf); str.format( select * from ugyfel where refszam=%d;, uf.refszam()); GetDocument()->ExecuteQuery(str); if (GetDocument()->Count()>0) single_key=false; MessageBox( Van már ilyen refszám! ); else str.format( insert into ugyfel values ( %d, %s, %s, %s );, uf.refszam(), uf.nev(), uf.cim(), uf.status()); GetDocument()->ExecuteQuery(str); else uf.setrefszam(atoi(getlistctrl().getitemtext(iitem,0))); uf.setnev(getlistctrl().getitemtext(iitem,1)); uf.setcim(getlistctrl().getitemtext(iitem,2)); uf.setstatus(getlistctrl().getitemtext(iitem,3)); dlg.disablerefszam(); dlg.setugyfel(uf); if (dlg.domodal() == IDOK) dlg.getugyfel(uf); str.format( update ugyfel set nev = %s, cim = %s, status = %s where refszam = %d;, uf.nev(), uf.cim(), uf.status(), uf.refszam()); GetDocument()->ExecuteQuery(str); GetListCtrl().DeleteAllItems(); FillSortedData(sColumn); *presult = 0; 7. oldal
Az UgyfelDlg.h header fájlt illesszük be a BankView.h header fájlba. BankView.h #endif // _MSC_VER > 1000 #include UgyfelDlg.h class CBankView : public CListView Forditás/Futtatás A dialógusban módosításnál legyen a refszám csak olvasható View/ClassWizard/Message Maps Project:Bank Class name:ugyfeldlg Object IDs: UgyfelDlg Messages:WM_INITDIALOG Add Functions /Edit code UgyfelDlg.cpp BOOL UgyfelDlg::OnInitDialog() CDialog::OnInitDialog(); // TODO: Add extra initialization here if (enable_refszam) GetDlgItem(IDC_REFSZAM)->EnableWindow(TRUE); else GetDlgItem(IDC_REFSZAM)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE A Ctrl+DEL billenty leütésekor töröljük a kijelölt adatsort Felveszünk két adattagot a CListView osztályban és minden kattintásnál beállítjuk a kattintás aktuális pozicióját. # $ %& ' ( BankView.h protected: int icolumn; int irow; int scolumn; #) $*+ ClassWizard / Message Maps Project: Bank Class name: CBankView Object IDs: CBankView Messages: NM_CLICK 8. oldal
Add Function / Edit code void CBankView::OnClick(NMHDR* pnmhdr, LRESULT* presult) // TODO: Add your control notification handler code here NM_LISTVIEW* pnmlistview = (NM_LISTVIEW*)pNMHDR; irow = pnmlistview->iitem; icolumn = pnmlistview->isubitem; *presult = 0; # $,!- Azonositot rendelünk a tevékenységhez View/Resource Symbols/New Name: ID_DEL Value: Fogadjuk el a felajánlott értéket Az azonosítóhoz hozzárendeljük a Ctrl+DEL billenty t Workspace/Resource View/Accelerator/IDR_MAINFRAME/Jobb egérfül 1x/New Accelerator menüpont Az azonosítóhoz hozzárendeljük a callback függvényt ClassWizard / Message Maps Project: Bank Class name: CBankView Object IDs: ID_DEL Messages: COMMAND Add Function / Edit code void CBankView::OnDel() // TODO: Add your command handler code here int refszam = atoi(getlistctrl().getitemtext(irow,0)); CString str; str.format( delete from ugyfel where refszam = %d ;,refszam); GetDocument()->ExecuteQuery(str); GetListCtrl().DeleteAllItems(); FillSortedData(sColumn); 9. oldal
4. Feladat: Státuszsor módosítása Két információt kívánunk elhelyezni az állapotsorban: Hány elem a lista? - ID_INDICATOR_COUNT Hogyan van rendezve? - ID_INDICATOR_MESSAGE. 10. oldal
.!!/ / Az osztályvarázsló az állapotsor kezelését nem ajánlja fel, ezért azt teljes egészében nekünk kell felépíteni. Lista elemszámát jelz indikátor: ID_INDICATOR_COUNT Rendezettséget jelz indikátor: - ID_INDICATOR_MESSAGE. Az indikátorok azonosítójának létrehozása View/Resource Symbols/New Name: ID_INDICATOR_COUNT Value: Fogadjuk el a felajánlott értéket View/Resource Symbols/New Name: ID_INDICATOR_MESSAGE Value: Fogadjuk el a felajánlott értéket Vegyük hozzá a két indikátort a MainFrm programfájlban (MainFrm.cpp) található indicators[] tömbhöz. MainFrm.cpp static UINT indicators[] = ID_SEPARATOR, // status line indicator ID_INDICATOR_COUNT, ID_INDICATOR_MESSAGE, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ; Adjuk meg a két indikátort leiró default szöveget. Work space//resource View/String Table/Jobb egérfül/string Table/Dupla kattintás Jobb egérfül kattintása a String listára/new String menüpont ID: ID_INDICATOR_MESSAGE Caption: Refszám szerint rendezve Jobb egérfül kattintása a String listára/new String menüpont ID: Caption: ID_INDICATOR_COUNT xxx elem Megjegyzés: A caption-ban megadott szöveg hosszával megegyez (0! (0! Deklaráljuk az eseménykezel prototipusát a BankView.h header fájlban lesz az indikátor terület hossza. BankView.h // Generated message map functions //AFX_MSG(CBankView) afx_msg void OnColumnclick(NMHDR* pnmhdr, LRESULT* presult); afx_msg void OnDblclk(NMHDR* pnmhdr, LRESULT* presult); afx_msg void OnDel(); afx_msg void OnClick(NMHDR* pnmhdr, LRESULT* presult); //AFX_MSG afx_msg void OnUpdateMessage(CCmdUI *pcmdui); afx_msg void OnUpdateCount(CCmdUI *pcmdui); DECLARE_MESSAGE_MAP() ; 11. oldal
Az üzenettáblába vegyük fel az ON_UPDATE_COMMAND_UI makrót. BEGIN_MESSAGE_MAP(CBankView, CListView) //AFX_MSG_MAP(CBankView) ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk) ON_COMMAND(ID_DEL, OnDel) ON_NOTIFY_REFLECT(NM_CLICK, OnClick) //AFX_MSG_MAP ON_UPDATE_COMMAND_UI(ID_INDICATOR_MESSAGE, OnUpdateMessage) ON_UPDATE_COMMAND_UI(ID_INDICATOR_COUNT, OnUpdateCount) END_MESSAGE_MAP() Adjuk meg az eseménykezel k definícióit a nekik megfelel.cpp fájlban void CBankView::OnUpdateMessage(CCmdUI *pcmdui) pcmdui->enable(); switch(scolumn) case 0: pcmdui->settext( Refszám szerint rendezve ); case 1: pcmdui->settext( Név szerint rendezve ); case 2: pcmdui->settext( Cím szerint rendezve ); case 3: pcmdui->settext( Státusz szerint rendezve ); void CBankView::OnUpdateCount(CCmdUI *pcmdui) pcmdui->enable(); int i = GetListCtrl().GetItemCount(); CString str; str.format( %d elem,i); pcmdui->settext(str); 12. oldal