Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

C


Index » educatie » » informatica » C
» Utilizarea controalelor de tip lista


Utilizarea controalelor de tip lista


Utilizarea controalelor de tip lista

Controalele de tip lista sunt oferite sub patru forme: casete combinate, casete cu lista, arbori si controale lista. Fiecare tip de control este destinat unui anumit scop in programare. La adaugarea controalelor lista in cadrul casetelor de dialog este importanta selectarea proprietatilor de stil adecvate, deoarece acestea pot altera substantial atat aspectul cat si comportamentul controlului. De exemplu, selectia multipla poate fi permisa atat pentru casetele cu lista cat si pentru controalele lista, iar stilul Drop List pentru casetele combinate activeaza functionalitatea de caseta de editare, in timp ce stilul Dropdown o dezactiveaza.

Adaugarea casetelor combinate

Un control caseta combinata se numeste astfel deoarece reprezinta o combinatie de controale: o caseta de editare, o caseta cu lista si un buton. Casetele combinate se folosesc pentru a afisa o serie de optiuni, permitand selectarea uneia singure. Casetele combinate se disting intre controalele de tip lista prin aceea ca elementul selectat este intotdeauna vizibil, fiind afisat in partea superioara a controlului.



Exista trei tipuri de caste combinate, asa cum o arata tabelul 1. Tipul unei casete combinate se stabileste in cadrul paginii Styles a castei de dialog Combo Box Properties.

Tabel 1: Tipuri de casete combinate

Tip de caseta

Descriere

Simpla

Imbina o caseta de editare si o caseta cu lista. Lista este intotdeauna vizibila iar elementul selectat este afisat in caseta de editare.

Derulanta

Imbina o caseta de editare cu un buton si o caseta cu lista. Caseta cu lista este vizibila numai la efectuarea unui click pe buton.

Lista derulanta

Imbina o eticheta statica cu un buton si o caseta cu lista. Acest tip este similar cu caseta derulanta, deosebirea constand in faptul ca utilizatorul nu poate introduce date in cadrul controlului.

In proiectul pe care-l vom crea, numit Lists, vom utiliza o caseta combinata pentru a permite selectarea unui director principal, care va fi apoi inspectat pentru a inscrie in celelalte controale din caseta de dialog informatii privind subdirectoarele si fisierele continute.

Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse si inlaturati eticheta TODO.

Inlaturati butonul Cancel si modificati pozitia butonului OK, plasandu-l in coltul dreapta jos al casetei de dialog.

Selectati pictograma etichetei statice de pe bara cu instrumente Controls, dupa care adaugati un control eticheta in partea superioara stanga a casetei de dialog. Introduceti Main Directory pe post de eticheta.

Selectati pictograma etichetei statice de pe bara cu instrumente Controls, dupa care adaugati un astfel de control in dreapta etichetei Main Directory. Introduceti IDC_MainDir in caseta combinata ID si extindeti lungimea casetei combinate pana in marginea din dreapta a casetei de dialog.

Selectati pagina Styles si alegeti Drop List in cadrul casetei combinate Type.

La adaugarea unei casete combinate intr-o caseta de dialog, optiunea Sort este selectata implicit. Aceasta inseamna ca elementele adaugate in caseta combinata vor fi afisate automat in ordine alfabetica. Pentru a inhiba acest comportament, selectati pagina Styles si deselectati optiunea Sort.

Odata adaugat controlul caseta combinata in cadrul casetei de dialog, apelati la Class Wizard pentru a atasa o variabila.

Apasati CTRL+W pentru a apela Class Wizard si selectati pagina Member Variables.

Selectati CListDlg din caseta combinata ClassName si IDC_MainDir din caseta cu lista Control Ids.

Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type     este selectat CComboBox.

Introduceti m_cbMainDir in caseta Member Variable Name si apoi efectuati click pe OK.

Adaugarea controalelor arbore

Controlul arbore este unic prin aceea ca este singurul control orientat inspre afisarea de informatii ierarhice. Un control arbore este o structura stanga-dreapta. Un element din extremitatea stanga a arborelui se numeste nod radacina, iar un nod din extremitatea dreapta se numeste nod frunza, iar un nod aflat intre o radacina si o frunza se numeste nod ramificatie. Afisarea de linii care s conecteze elementele poate fi stabilita prin intermediul stilurilor. In mod implicit, controalele arbore permit selectarea unui singur element la un moment dat. Daca doriti sa acordati utilizatorului posibilitatea de a selecta simultan mai multe elemente dintr-un arbore, veti fi nevoiti sa scrieti cod in acest sens.

In cadrul proiectului Listsi va fi utilizat un control arbore pentru a afisa fisierele dintr-un director in ordine alfabetica. Veti cea cate un nod radacina pentru fiecare litera din alfabet si apoi veti insera elemente corespunzatoare fisierelor dub nodul adecvat.

Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse.

Adaugati un control eticheta statica, numit Files, pe post de titlu pentru controlul arbore.

Selectati pictograma controlului arbore de pe bara cu instrumente Controls, dupa care adaugati un control arbore in partea stanga a casetei de dialog. Introduceti IDC_filesTree in caseta combinata ID.

Selectati pagina Styles si validati optiunile Has Buttons, Has Lines si Lines at Root.

Apasati CTRL+W pentru a lansa Class Wizard si selectati pagina Member Variables.

Selectati CListDlg din caseta combinata ClassName si IDC_FilesTree din caseta cu lista Control Ids.

Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type     este selectat CTreeCtrl.

Introduceti m_treeFiles in caseta Member Variable Name si apoi efectuati click pe OK.

Adaugarea controalelor caseta cu lista

In cea mai elementara forma a sa, o caseta cu lista consta dintr-o simpla lista de elemente, dar, spre deosebire de caseta combinata si de controlul arbore, o caseta cu lista poate permite atat selectarea elementelor individuale cat si selectii multiple. Sunt prezente patru tipuri de selectie prezentate in tabelul 2.

Tabelul 2: Tipurile de selecti in cadrul casetelor cu lista

Tip de selectie

Descriere

Singulara

Nu poate fi selectat decat un singur element.

Multipla

Pot fi selectate mai multe elemente utilizand mouse-ul in combinatie cu tastele Shift si Ctrl.

Extinsa

Asemanatoare cu selectia multipla, dar o multime de elemente poate fi selectata si prin incadrarea lor cu mouse-ul in timp ce butonul stang este apasat.

Dezactivata

Nu poate fi selectat nici un element.

Proiectul Lists foloseste o caseta cu lista pentru a afisa o lista de subdirectoare. Dintre acestea pot fi selectate mai multe subdirectoare simultan, informatii suplimentare despre elementele selectate fiind afisate intr-un control lista. In proiectul nostru se va face referire la optiunea de stil No Integral Hight, care este deselectata pentru ca inaltimea controlului sa fie astfel calculata incat sa fie afisat un numar intreg de elemente. Daca lasati aceasta optiune selectata, este posibil ca in control sa fie afisate elemente partial.

Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse.

Adaugati un control eticheta statica, numit Sub Directories, pe post de titlu pentru controlul caseta cu lista.

Selectati pictograma casetei cu lista de pe bara cu instrumente Controls, dupa care adaugati o caseta cu lista in partea dreapta a controlului arbore. Introduceti IDC_subDirs in caseta combinata ID.

Selectati pagina Styles si selectati Extended din caseta combinata Selection.

In cadrul paginii Styles deselectati optiunea No Integral Hight.

Apasati CTRL+W pentru a lansa Class Wizard si selectati pagina Member Variables.

Selectati CListDlg din caseta combinata ClassName si IDC_subDirs din caseta cu lista Control Ids.

Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type     este selectat CListBox.

Introduceti m_lbSubDirs in caseta Member Variable Name si apoi efectuati click pe OK.

Adaugarea unui control lista

Controlul lista are o denumire usor derutanta, pentru ca celelalte trei controale prezentate in acest laborator sunt de asemenea controale de tip lista. Si totusi, controlul de tip lista este cel mai complex dintre cele patru. Un control lista este in stare sa afiseze atat pictograme, cat si etichete asociate, si poate opera in oricare din cele patru moduri prezentate in tabelul 3.

Tabelul 3: Moduri de reprezentare ale controlului lista
Mod

Descriere

Pictograme

Afiseaza pictograme mari (32*32 pixeli) cu etichete plasate sub fiecare pictograma. Elementele sunt plasate in ordine de la stanga la dreapta si apoi de sus in jos.

Pictograme mici

Afiseaza pictograme mici (16*16 pixeli) cu etichete plasate in dreapta fiecarei pictograme. Elementele sunt plasate in ordine de la stanga la dreapta si apoi de sus in jos.

Lista

Afisarea este similara cu modul de pictograme mici, dar elementele sunt plasate in ordine de sus in jos si apoi de la stanga la dreapta.

Raport

Afiseaza informatiile sub forma unor coloane ca antet.

In cadrul proiectului Lists, controlul lista va fi utilizat pentru a afisa detalii privind directoarele selectate in caseta cu lista aflata deasupra sa in caseta de dialog. Controlul lista va avea trei coloane: prima coloana va contine numele directorului, cea de-a doua va afisa numarul de fisiere continute, iar cea de-a treia va afisa dimensiunea directorului.

Deschideti caseta de dialog IDD_LISTS_DIALOG in cadrul editorului de resurse.

Adaugati un control eticheta statica, numit Selected Directories Details, pe post de titlu pentru controlul lista.

Selectati pictograma controlului lista de pe bara cu instrumente Controls, dupa care adaugati acest control in partea dreapta a controlului arbore, sub caseta cu lista. Introduceti IDC_selectedDirs in caseta combinata ID.

Selectati pagina Styles si selectati Report din caseta combinata View.

Apasati CTRL+W pentru a lansa Class Wizard si selectati pagina Member Variables.

Selectati CListDlg din caseta combinata ClassName si IDC_selectedDirs din caseta cu lista Control Ids.

Efectuati un click pe butonul Add Variable. Asigurati-va ca in caseta combinata Category este selectat Control si in Variable Type     este selectat CListCtrl.

Introduceti m_lcDirDetail in caseta Member Variable Name si apoi efectuati click pe OK.

Deoarece controalele lista sunt orientate inspre afisarea si selectia elementelor de informatie, prima cerinta in programare este popularea acestor controale cu date. Fiecare informatie adaugata intr-un control de tip lista reprezinta un element. Desi mecanismele de inserare a elementelor prezinta similaritati, veti vedea ca fiecare claa de control are anumite particularitati.

Popularea unei casete combinate

Caseta combinata este singurul dintre cele patru controale de tip lista care poate fi populat cu elemente in cadrul editorului de resurse. Aceasta se realizeaza prin intermediul paginii Data a casetei de dialog Combo Box Properties. Astfel, fiecare element poate fi introdus in caseta Enter Listbox Items. Trebuie apasat Ctrl+Enter dupa fiecare element, pentru ca simpla apasare a tastei Enter va duce la inchiderea casetei de dialog. O astfel de populare a unei casete combinate nu este uzuala. In mod normal, casetele combinate sunt populate in momentul executiei, de multe ori in cadrul functiei OnInitDialog().

Clasa MFC care incapsuleaza casetele combinate este CComboBox. Aceasta clasa contine mai multe functii care se ocupa de adaugarea si inlaturarea elementelor. Acestea sunt prezentate in tabelul 4.

Tabelul 4: Functii de populare din clas CComboBox

Numele functiei

Descriere

AddString

Adauga un element fie la sfarsitul listei, fie in pozitia corespunzatoare ordonarii.



DeleteString

Inlatura un element.

InsertString

Insereaza un element intr-o anumita pozitie.

ResetContent

Inlatura toate elementele existente.

Dir

Metoda speciala de populare pentru inserarea ca elemente a numelor de fisiere

In cazul proiectului Lists, caseta combinata este populata in cadrul functiei OnInitDialog() a casetei de dialog. In acest scop creati mai intai o functie noua avand numele PopulateCombo() si tipul void, care va fi apelata in cadrul functiei OnInitDialog().

BOOL CListsDlg::OnInitDialog()

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

//Initializam caseta combinata cu directoare principale

PopulateCombo();

return TRUE; // return TRUE unless you set the focus to a control

void CListsDlg::PopulateCombo()

Tratarea mesajelor corespunzatoare casetelor combinate

Scopul unei casete combinate este sa permita selectarea uneia dintre elementele pe care le contine. Atunci cand aceasta se intampla natural, programul trebuie sa ale imediat si sa raspunda la modificarea selectiei. Acest lucru este posibil prin intermediul mesajului CBN_SELCHANGE, trimis de catre control casetei de dialog oricand se modifica elementul selectat.

Adaugati o functie de tratare a mesajului CBN_SELCHANGE pentru caseta combinata IDC_mainDir. Astfel ar trebui sa fie creata functia membru OnSelchangeMainDir(). Veti avea nevoie, totodata, de o noua variabila membru de tip CString, m_strMainDir, care va pastra calea selectata. Ea va fi utilizata mai apoi si pentru a popula controlul arbore si caseta cu lista.

Este bine sa verificati valorile intoarse de functiile AddString() si InsertString(). In cazul aparitiei unor erori, aceste functii intorc una din valorile CB_ERR sau CB_ERRSPACE.

void CListsDlg::OnSelchangeMainDir()

Popularea unui arbore

La popularea unui arbore, de multe ori este necesara stocarea de informatii privind structura arborelui pentru a putea insera elemente ca parinti sau ca subordonati ai altor elemente introduse anterior.

Clasa MFC care incapsuleaza un arbore este CTreeCtrl. Aceasta clasa include functii care se ocupa cu inserarea si eliminarea de elemente. Functia InsertItem() are mai multe versiuni supradefinite pentru a putea sa realizeze asocieri de imagini si de pointeri la date externe arborelui, daca este nevoie. Fiecarui element inserat ii este asociat un indicator de tip HTREEITEM care poate fi transmis functiei InsertItem(), facand astfel posibila crearea unei ierarhii.

Tabelul 5:Functii de populare din clasa CTreeCtrl
Numele functiei

Descriere

InsertItem

Insereaza un element, fie ca element radacina, fie ca element subordonat, in functie de parametrii transmisi.

DeleteIem

Inlatura un element.

DeleteAllItems

Inlatura toate elementele existente.

Pentru a popula arborele din proiect, creati mai intai o noua functie membru numita PopulateTree() care intoarce tipul void. Arborele va afisa fisierele aflate in directorul selectat in cadrul casetei combinate, iar acestea vor fi impartite alfabetic. Functia insereaza mai intai cate un element pentru fiecare litera a alfabetului, dupa care va adauga un al 27-lea element care va subordona fisierele ale caror nume nu incep cu o litera. Sunt folosite apoi o serie de functii oferite de Windows pentru a inspecta continutul directorului si a insera numele fiecarui fisier in subordinea elementului corespunzator din arbore.

void CListsDlg::PopulateTree()

//Cautam urmatorul fisier din directorul principal

bMoreFiles=FindNextFile(hFind,&dataFind);

}

//Inchidem indicatorul de cautare

FindClose(hFind);

Uneori este nevoie sa asociati fiecare element din arbore cu un pointer la un obiect. Acest lucru se poate face prin intermediul functiilor SetItemData() si GetIemData().

Popularea unei casete cu lista

Popularea unei casete cu lista se realizeaza practic la fel cu popularea unei casete combinate, deoarece elementele din lista unei casete combinate sunt de fapt elemente ale unei casete cu lista. Diferenta esentiala dintre cele doua controale este modul de afisare si faptul ca in casetele cu lista este posibila selectarea mai multor elemente simultan.

Clasa MFC care incapsuleaza casetele cu lista este CListBox. Functiile care raspund de inserarea si inlaturarea elementelor sunt identic cu cele prezentate in tabelul 4.

In cadrul proiectului Lists caseta cu lista este populata cu numele subdirectoarelor aflate in directorul principal care a fost selectat in caseta combinata. In acest scop veti adauga mai intai o noua functie membru care se numeste PopulateListBox() si are tipul void. Modificati apoi functia OnSelchangeMainDir() pentru a apela aceasta noua functie dupa apelul PopulateTree().

void CListsDlg::PopulateListBox()

//Cautam urmatorul subdirector din directorul principal

bMoreFiles=FindNextFile(hFind,&dataFind);

}

//Inchidem indicatorul de cautare

FindClose(hFind);

Tratarea mesajelor corespunzatoare casetelor cu lista

Actiunile efectuate de utilizator asupra controalelor caseta cu lista au ca efect transmiterea unor mesaje corespunzatoare casetelor de dialog. Mesajul LBN_SELCHANGE este transmis in cazul in care elementul sau elementele selectate se modifica.

Caseta cu lista din proiectul Lists permite selectia multipla. Functia de tratare a mesajului creeaza o lista a directoarelor selectate in cadrul unei noi variabile membru, m_strList, care este de tip CStringList. CStringList este un exemplu de clasa MFC ajutatoare. Ea este folosita pentru administrarea unei liste variabile de obiecte individuale CString.

Adaugati o functie pentru tratarea mesajului LBN_SELCHANGE corespunzator casetei cu lista IDC_subDirs. Ar trebui sa fie creata functia membru OnSelchangeSubDirs(). Aceasta functie va determina numarul elementelor selectate si apoi va extrage numele fiecarui element si-l va adauga in variabila m_strList. In final, functia va apela o noua functie, PopulateListControl(), care va utiliza m_strList pentru a introduce informatii in controlul lista.

void CListsDlg::OnSelchangeSubDirs()

//Stergem vectorul de intregi

delete []items;

}

//Acum populam controlul lista

PopulateListControl();

Popularea unui control lista

Modalitatea de populare a unui control lista difera putin de metodele aplicate in cazul celorlalte controale de tip lista. De asemenea, apar diferente in functie de tipul de control lista care este utilizat. Tipul cel mai intalnit este tipul raport. Acest tip se caracterizeaza prin afisarea informatiilor pe coloane.

Clasa MFC care incapsuleaza controale lista este CListCtrl. Aceasta clasa include functiile prezentate in tabelul 6, functii care se ocupa de adaugarea si inlaturarea elementelor.

Tabelul 6: Functii de populare din clasa CListCtrl
Numele functiei

Descriere

InsertColumn

Adauga o noua coloana intr-o anumita pozitie.

DeleteColumn

Inlatura o coloana.

InsertItem

Adauga un element.

DeleteItem

Inlatura un element existent.

DeleteAllItems

Inlatura toate elementele existente.

SetItemText

Stabileste continutul textual al unei parti dintr-un element.

Proiectul Lists foloseste un control lista de tip raport care contine coloane pentru numele directorului, numarul de fisiere aflate in director si dimensiunea totala a acestor fisiere. Primul lucru care trebuie facut este inserarea coloanelor. Deoarece ele raman neschimbate, aceasta operatie poate fi efectuata in cadrul functiei OnInitDialog(). Elementele propriu-zise vor fi adaugate in control de catre functia PopulateListControl().

BOOL CListsDlg::OnInitDialog()

void CListsDlg::PopulateListControl()

//Cautam urmatorul fisier din directorul principal

bMoreFiles=FindNextFile(hFind,&dataFind);

}

FindClose(hFind);

//Formatam un sir care contine numarul de fisiere si-l inseram in coloana 1

str.Format('%ld',nFileCount);

m_lcDirDetails.SetItemText(nr,1,str);

//Formatam un sir care contine dimensiunea totala a fisierelor si-l inseram in coloana 2

str.Format('%-1.2f', nFileSize/1024.0);

m_lcDirDetails.SetItemText(nr,2,str);

m_strList.GetNext(pos);

}








Politica de confidentialitate




Copyright © 2024 - Toate drepturile rezervate