Controale ActiveX si Dialoguri
Proiectele create în Visual Basic for Applications pot fi completate cu o interfata utilizator evoluata, sub forma unor cutii de dialog la nivelul celor existente deja în Microsoft Office. Performantele si aspectul dialogurilor utilizator sunt îmbunatatite prin posibilitatea de plasare a unor controale ActiveX (numite anterior controale OLE).
Un control ActiveX trebuie gândit ca un obiect caruia i se pot stabili atribute (prin proprietati) si care recunoaste evenimente (este "viu").
Aceste controale, cu proprietati ajustabile, recunosc multiple evenimente. Astfel, prin scrierea procedurilor eveniment, interfata cu utilizatorul proiectului poate fi personalizata si diferentiata corespunzator.
Controalele ActiveX pot fi plasate si direct în documentele aplicatiilor: documente Word, foi de calcul Excel, diapozitive PowerPoint. Inserarea acestora este facilitata de cutia de unelte Control Toolbox, care poate fi afisata la fel cu orice alta bara de unelte.
Aplicatiile din Office 97 utilizeaza aceleasi unelte pentru proiectarea dialogurilor, astfel încât prezentarea care urmeaza este valabila pentru toate proiectele VBA (din Word, Excel, PowerPoint si, cu unele exceptii, pentru Access).
Crearea unui dialog utilizator (termenul utilizator este adaugat pentru diferentierea de dialogurile built-in, încorporate mediului si se refera la cel care scrie codul si nu la cel care îl va utiliza, confuzia nefiind atât de mare încât sa trebuiasca o denumire speciala) necesita parcurgerea mai multor etape:
Atunci când se proiecteaza un dialog, în Visual Basic Editor, suntem în modul de proiectare (design mode). În acest mod se pot edita controalele si controalele nu reactioneaza la evenimente. La executia boxei de dialog, deci la afisarea dialogului exact cum va fi vazut de un utilizator, suntem în modul de executie (run mode). Controalele raspund evenimentelor în modul executie.
Orice boxa de dialog utilizator din proiect este o forma (sau UserForm). O UserForm noua contine o bara de titlu si o zona goala în care se pot plasa controale.
Este afisata o forma noua ale carei
proprietati se stabilesc în fereastra Properties (vezi figurile atasate, în
figura cu forma sunt plasate si doua controale).
Proprietatile formei sunt clasificate în categoriile:
dupa cum se vizualizeaza alegând fisa Categorized din fereastra Properties.
Proprietatile de aparenta se refera la
culorile utilizate, la efectele vizuale de umplere etc.
Proprietatile de comportare descriu modul de continuare a actiunilor la parasirea ultimului control de pe forma (Cycle) sau accesul utilizatorului la obiect (Enabled).
Prin Font se specifica fontul utilizat implicit pe forma (poate fi modificat pentru fiecare control în parte).
În Misc se gasesc proprietatile care stabilesc numele formei, memoria utilizata la afisare, imaginea mouse-ului etc.
În Picture se dau specificatiile imaginii utilizate pentru pavarea formei.
În Position sunt specificatiile de pozitie si dimensiuni.
În Scrolling se fixeaza vizibilitatea si pozitia barelor de defilare.
Concomitent cu afisarea formei, în Design Mode, devine vizibila si cutia cu controale, Toolbox, (vezi figura).
Pentru a adauga un control pe forma, se
trage controlul dorit pe forma si se ajusteaza dimensiunile în mod uzual, sau
se click-eaza controlul dorit, cursorul devine cursor cruce si se întinde pe
forma cu dimensiunile dorite.
Operatiunea de dragare din cutie pe forma poate fi efectuata si în sens invers: tragerea unui control, sau a unui grup de controale, de pe forma în cutie de unelte creeaza un template care poate fi reutilizat.
Dupa adaugarea controalelor pe forma, se utilizeaza comenzile din meniul Format sau butoanele de pe bara de unelte UserForm din VBE pentru a ajusta alinierea si spatierea controalelor. Se utilizeaza dialogul Tab Order (din meniul View) pentru a modifica ordinea de parcurgere a controalelor la tastari succesive de Tab (în executie – run time).
VBE stabileste proprietatea TabIndex a controloalelor pentru a determina ordinea la Tab-uri.. Daca se doreste ca utilizatorul sa nu aiba acces prin Tab la un control, se va stabili proprietatea TabStop la False. Pentru aceasta, se actioneaza butonul drept al mouse-ului pe control si selectarea comenzii Properties din meniul contextual.
Fiecare forma sau control recunoaste un set predefinit de controale, care pot fi declansate fie de utilizator, fie de sistem. De exemplu, un buton de comanda recunoaste evenimentul Click declansat de actionarea cu mouse-ul, iar forma recunoaste evenimentul Initialize care apare atunci când este initializata.
Pentru a scrie o procedura eveniment, se deschide fereastra Code prin dublu click pe UserForm sau pe controlul respectiv, selectarea numelui evenimentului în boxa Procedure a ferestrei Code. Procedurile eveniment au denumiri create într-un mod standard: numele formei sau controlului, liniuta de subliniere si numele evenimentului, de exemplu Command1_Click, UserForm_Deactivate etc.
Evenimentele recunoscute de un obiect sunt listate în boxa Procedure a ferestrei Code asociate, cele care au deja atasate proceduri fiind scrise în bold.
La scrierea codului de raspuns la evenimente, controalele sunt numite cu denumirile existente la acel moment. Cum aceste denumiri pot fi modificate oricând în dezvoltarea proiectului, procedurile eveniment atasate nu se redenumesc în mod automat. Se recomanda astfel ca denumirile sa fie acordate înainte de scrierea procedurilor respective, în caz contrar orice modificare a numelor trebuie sa fie însotita de modificarile denumirilor procedurilor.
În aceasta sectiune se explica, pe scurt, principalele controale disponibile în proiectarea dialogurilor.
Un control Label este utilizat pentru afisarea unui text, descriptiv, cum ar fi titluri, captari, instructiuni de ajutor. Textul afisat nu este si nu poate fi legat de surse de date.
Proprietatea implicita este Caption, reprezentând textul afisat.
Evenimentul implicit este Click, declansat la actionarea butonului stâng mouse pe control.
Afiseaza informatie scrisa de utilizator sau primita dintr-o multime organizata de date.
Daca TextBox este legata de o sursa de date, atunci modificarea informatiei afisate produce si modificarea informatiei din sursa de date (de exemplu un câmp dintr-o tabel). Informatia afisata poate fi formatata doar unitar (acelasi font, acelasi stil).
Proprietatea implicita este Value, reprezentând continutul boxei.
Evenimentul implicit este Change, declansat la modificarea proprietatii Value.
Afiseaza o lista de valori si permite selectarea unei sau mai multor intrari din lista.
Într-o ListBox cu o singura coloana se poate adauga o intrare prin metoda AddItem.
Daca ListBox este legata de o sursa de date, atunci este memorata valoarea selectata în sursa.
Controlul ListBox poate sa apara ca
o lista ori ca un grup de controale OptionButton sau CheckBox.
Pentru aceasta din ultima optiune se va stabili proprietatea ListStyle
la Option; proprietatea MultiSelect va determina atunci intrarile:
Single – butoane radio, Multi sau Extended – boxe de control.
Proprietatea implicita este Value, reprezentând valoarea selectata curent (din coloana data de proprietatea BoundColumn).
Evenimentul implicit este Click.
Combina posibilitatile de la ListBox
si TextBox: utilizatorul poate introduce o valoare noua (ca la TextBox),
sau poate selecta o valoare dintr-o lista (ca la ListBox). Grafic, un
control ComboBox arata ca o lista ascunsa (doar o linie este afisata).
Daca se leaga controlul la o sursa de date (celule dintr-o foaie de calcul) va fi afisata valoarea selectata în sursa. Pentru un control cu mai multe coloane, proprietatea BoundColumn determina unde se afiseaza sursa de date.
Proprietatea implicita este Value, reprezentând valoarea selectata.
Evenimentul implicit este Change.
Afiseaza starea selectat / neselectat a unui element. Este utilizat pentru alegeri între doua alternative (Yes/No, True/False sau On/Off.).
Selectarea este afisata prin prezenta unui X în caseta corespunzatoare si starea curenta este Da, Adevarat, Prezent etc. Neselectarea este aratata printr-o caseta vida si indica starea Nu, Fals, Absent etc. În functie de valoarea proprietatii TripleState, controlul poate sa aiba si valoarea Null.
La legarea de o sursa de date, schimbarea starii se reflecta în modificarea valorii sursei. Un CheckBox suspendat (disabled) afiseaza starea dar nu poate fi modificat.
Proprietatea implicita este Value, , adica Null – starea null (nici selectat nici deselectat), (–1) – True (selectat), 0 – False (deselectat).
Evenimentul implicit este Click.
Permite afisarea elementului selectat dintr-un grup de optiuni. Controlul este cunoscut si ca buton radio (apasarea unui buton de selectare a unei game de lungimi de unda le deselecteaza pe celelalte). Este de observat ca butoanele de optiune dintr-un frame sunt mutual exclusive. Figura este capturata din modul Design.
Daca un OptionButton este legat la
o sursa de date, controlul poate sa arate valori Yes/No, True/False sau On/Off,
corespondentele între valori si starea controlului fiind evidente. Schimbarea
starii butonului modifica si sursa.
Un control inhibat este desenat sters si nu arata nici o valoare. În functie de proprietatea TripleState, controlul poate avea si valoarea Null.
Arata starea de selectare a unui element (similar unui checkbox) prin imaginea grafica a unui buton apasat sau nu.
Daca un control ToggleButton este legat de
o sursa de date, controlul arata valoarea curenta a sursei ca Yers/No,
True/False, On/Off sau ceva similar. Butonul apasat reprezinta Yes, True sau
On. Daca ToggleButton este legat de o sursa de date, schombarea starii
controlului se reflecta si în valoarea sursei.
Un control ToggleButton inhibat (disabled) este desenat neclar, arata totusi valoarea dar nu poate fi modificat.
Proprietatea implicita este Value, adica Null – starea null (nici selectat nici deselectat), (–1) – True (selectat), 0 – False (deselectat).
Evenimentul implicit este Click.
Este utilizat pentru indicarea începerii, terminarii sau întreruperii unei actiuni. Este reprezentat grafic precum butoanele uzuale OK, Cancel etc. din dialogurile aplicatiilor din Office (si nu numai).
În general, pentru realizarea scopului este utilizata procedura (sau macro) asociat evenimentului Click. Pe un CommandButton se poate afisa text (proprietatea Caption), imagine (proprietatea Picture) sau ambele.
Proprietatea implicita este Value, întotdeauna False. Stabilind proprietatea Value drept True (într-o procedura), initiaza evenimentul Click al butonului de comanda.
Evenimentul implicit este Click.
Este utilizat, de obicei, pentru prezentarea unor seturi de informatii (ca valori ale unor controale grafice), fiecare grup de informatii apartinând altei entitati. Prin urmare structura informatiei afisate este întotdeauna aceeasi, dar se refera la entitati diferite (persoane, fapte etc.).
Din punct de vedere grafic, se poate
confunda acest control cu MultiPage, diferenta fiind aceea ca la TabStrip
zona de afisare (client region) este comuna tuturor fiselor (doar
informatia se modifica), pe când la MultiPage fiecare fisa (pagina) are
o zona proprie, cu controale proprii.
Se poate spune ca daca se pastreaza structura informatiei, atunci se va utiliza un control TabStrip, un tab definind purtatorul informatiilor. Daca informatia este structurata în categorii, atunci se poate utiliza controlul MultiPage, fiecare categorie având propria zona client.
Observatie. TabStrip este implementat ca un container a unei colectii Tabs de obiecte Tab.
Proprietatea implicita pentru TabStrip este SelectedItem, care returneaza obiectul Tab selectat si este folosit la controlarea programatica a obiectului.
Evenimentul implicit este Change, declansat la selectarea altui Tab.
Prezinta mai multe pagini de informatii distincte.
Spre deosebire de controlul TabStrip, selectarea altei pagini poate prezenta o
alta structura de informatii.
În acest mod se pot afisa seturi consistente (categorii) de informatii, pastrând în acelasi timp unitatea întregii înregistrarii.
Observatie. MultiPage este implementat ca un container a unei colectii Pages de obiecte Page.
Proprietatea implicita este Value, care returneaza indexul paginii avtive curente (în colectia Pages).
Evenimentul implicit este Change, declansat la schimbarea paginii.
Reprezentat grafic ca un chenar cu o denumire, controlul serveste la gruparea unor controale. Grupul poate fi unit doar prin categoria de informatii, permitând utilizatorului o identificare rapida a controalelor, dar, pentru anumite controale cum ar fi OptionButton, gruparea are efect si în comportarea controalelor din grup. Exemplul de la OptionButton arata un Frame care include butoane radio: acestea sunt mutual exclusive. Exemplul de la ToggleButton arata un Frame similar, dar butoanele pot fi actionate în orice configuratie.
Evenimentul implicit este Click.
Permite afisarea unui imagini (poze) pe o forma, ca element al datelor reprezentate pe forma si nu ca un simplu element decorativ. De exemplu fotografia unui angajat în forma cu informatiile personale ale angajatului. Cu alte cuvinte, nu se controleaza aspectul grafic al imaginii, ci modul cum ea apare în control (de unde, cât de mare etc.).
Controlul permite taierea (retezarea) imaginii, dimensionare, mariri, dar nu permite editarea propriu-zisa (care va fi efectuata printr-un program de grafica).
Daca se da controlului o dimensiune egala cu cea a formei, atunci Image poate furniza un fundal pe care se pot pozitiona alte controale.
Sunt suportate formatele .bmp, .cur, .gif, .ico, .jpg, .wmf de fisiere grafice.
Evenimentul implicit este Click.
Pentru a schimba informatii cu utilizatorul proiectului printr-o cutie de dialog utilizator, trebuie ca
Afisarea unui dialog pentru testare, deci în Design Mode, se realizeaza prin comanda Run Sub/UserForm (meniul Run din VBE). Afisarea dialogului în mod programatic se realizeaza utilizând metoda Show dupa modelul
[object.]Show
daca object nu este specificat, atunci se va considera implicit dialogul asociat modulului activ UserForm.
Daca obiectul specificat nu este încarcat la apelarea metodei, atunci VB îl încarca automat. O cutie de dialog utilizator este întotdeauna modala, deci utilizatorul trebuie sa raspunda (chiar daca prin închidere) înainte de a utiliza altceva din aplicatie. Nu se executa alte instructiuni pâna când dialogul nu este ascuns sau închis (descarcat – unloaded). Este posibil totusi sa se lucreze în alte aplicatii.
Pentru modificari ale proprietatilor unui control este necesar ca valorile acestora sa fie citite si redefinite în timpul executiei (Run time sau Run Mode).
Asemenea actiuni sunt, de exemplu, utile atunci când pentru un control se dau valori implicite (default), deci valori cu care dialogul sa se afiseze indiferent de actiunile de la alte afisari anterioare. În acest caz, se va adauga codul corespunzator în procedura de eveniment Initialize a dialogului. Afisarea formei declanseaza evenimentul Initialize si astfel au loc si atribuirile de valori specificate.
Exemplul urmator presupune existenta unei forme UserForm, denumita frmPhoneOrders, care are
Codul urmator realizeaza initializarea valorilor de pe forma, încât orice aratare a formei se realizeaza în aceeasi configuratie:
Private Sub UserForm_Initialize()Este de remarcat ca desi în modelele de obiecte Word, Excel si PowerPoint colectiile sunt indexate de la 1, în tablourile si colectiile asociate formelor se foloseste indexarea de la 0. De aici selectarea ultimei intrari (cu numarul de ordine 3) din lista prin instructiunea ListIndex = 2.
Daca se doreste stabilirea valorilor initiale pentru un control, dar apelurile ulterioare sa retina modificarile efectuate, se vor da aceste valori înainte afisarii dialogului. Urmatorul exemplu arata o procedura care afiseaza forma dupa atribuirea valorilor implicite.
Private Sub GetUserName( )Prin setarea proprietatilor unui control si aplicarea metodelor în timpul executiei, se pot efectua modificari într-un dialog utilizator care se executa, modificari aparute ca raspuns la actiunile si alegerile utilizatorului. De exemplu, accesibilitatea unor controale poate fi controlata prin modificarea proprietatii Enabled. Daca proprietatea este setata pe False, atunci utilizatorul nu poate accesa controlul: cum ar fi interzicerea accesului la butonul OK pâna când o anumita informatie nu este completata în dialog.
Exemplul urmator arata cum accesul la un grup de butoane radio nu este permis decât daca o CheckBox este marcata:
Private Sub CheckBox1_Change()Prin intermediul metodei SetFocus se controleaza focalizarea. Un control care are focusul este cel care raspunde la intrarile din tastatura. De exemplu
Private Sub Image1_Click ()realizeaza trecerea focusului la CheckBox1 atunci când imaginea din controlul Image1 (unde este scrisa procedura eveniment) este click-ata.
În timpul executiei se pot manevra si proprietatile/metodele formei. În acest mod se modifica dinamic aspectul formei.
Astfel, o utilizare frecventa este aceea când se modifica portiunea afisata a formei, vizualizând (deci dând acces) controale suplimentare, sau ascunzându-le (nu mai pot fi accesate, desi nu sunt inhibate). În acest scop se opereaza cu proprietatea Height.
Presupunem ca o forma, cu un buton radio, este dimensionata în proiectare cu Height = 120 si se adauga un control, de exemplu un CheckBox, la baza formei, controlul fiind pozitionat prin proprietatea Top setata la mai mult de 120 (deci în afara zonei afisate din forma). Se adauga urmatoarele proceduri eveniment:
Private Sub UserForm_Initialize ()Pentru ca exemplul sa functioneze corect se presupune ca forma extinsa la 180 afiseaza si boxa de control.
În exemplul urmator se arata cum putem parcurge informatii printr-un obiect TabStrip. Valoarea afisata într-o boxa text este modificata dupa indexul tab-ului selectat:
Private Sub TabStrip1_Click (ByVal Index As Long)De amintit ca numerotarea începe de la 0 într-o colectie de pe o forma.
Validarea informatiilor introduse de un utilizator este un alt subiect important în procesarea unui dialog. Pentru efectuarea verificarilor ca utilizatorul a introdus tipul corect de informatii printr-un control, se va testa valoarea atunci când controlul pierde focusul sau când întregul dialog este închis. Evenimentele Enter si Exit pot fi utilizate în acest scop.
Enter apare imediat înainte ca un control sa primeasca efectiv focusul de la alt control de pe aceeasi forma. Exit apare imediat înainte ca un control sa piarda focusul în favoarea altui control de pe aceeasi forma. Sintaxa procedurilor eveniment respective este
Private Sub object_Enter( )
Private Sub object_Exit( ByVal Cancel As MSForms.ReturnBoolean)
unde
object este un nume valid de control care recunoaste evenimentul
Cancel este starea evenimentului: False arata procesarea evenimentului de catre control (optiunea implicita); True arata ca evenimentul este tratat de aplicatie si focusul ramâne pe controlul curent.
Deoarece evenimentul Enter se declanseaza înainte ca focusul sa fie dat unui control, poate fi utilizat pentru afisarea unui text explicativ, de procesare a respectivului obiect.
În scrierea procedurii pentru Exit nu trebuie uitata atribuirea valorii True argumentului pentru ca focusul sa ramâna pe controlul curent.
De studiat si metoda SetFocus prin care un anumit control de pe forma primeste focusul.
Urmatorul exemplu previne utilizatorul sa paraseasca o zona text în care trebuie sa introduca neaparat o valoare numerica:
Private Sub txtCustAge_Exit (ByVal Cancel As MsForms.ReturnBoolean)Pentru verificarea datelor înainte de închiderea dialogului, se include codul corespunzator (prin care se pot verifica valorile mai multor controale de pe forma) în aceeasi procedura care descarca (închide) dialogul. Daca exista erori de completare se va parasi procedura, prin Exit Sub, înainte de executarea instructiunii Unload si se va da focusul primului control eronat.
Exemplul urmator se executa la actionarea butonului de comanda, denumit cmdOK, si previne parasirea dialogului prin actionarea acestui buton daca boxa text txtCustAge nu este numerica:
Private Sub cmdOK_Click ()Este de mentionat ca pentru trecerea valorii în alt modul de cod, variabila custAge trebuie calificata, de exemplu ThisDocument.custAge.
La închiderea unui dialog, toate datele introduse de utilizator se pierd. Returnarea valorilor controalelor dintr-o forma dupa ce forma a fost descarcata conduce la valorile implicite în locul celor introduse/selectate de utilizator. Din acest motiv, informatia necesara trebuie sa fie salvata în variabile de la nivelul modul, înaintea descarcarii formei. Exemplul precedent utilizeaza în acest scop variabila custAge, care trebuie sa fie declarata la nivel de modul prin
Public custAge As Integerde exemplu.
Cutiile de dialog utilizator sunt afisate întotdeauna drept modale. Prin urmare utilizatorul trebuie sa închida dialogul înainte de a se întoarce în aplicatia principala.
Închiderea (descarcarea) formei se realizeaza prin instructiunea Unload. În mod uzual se va include în forma cel putin un buton de comanda prin actionarea caruia se închide forma.
Exemplul urmator insereaza în documentul Word textul introdus de utilizator în boxa txtUserName si închide forma, la actionarea butonului de comanda denumit cmdOK:
Private Sub cmdOK_Click ()Pentru a utiliza aceeasi boxa de dialog în mai multe aplicatii (Word, Excel, PowerPoint accepta aceleasi dialoguri). Daca dialogul contine totusi referiri la obiecte specifice unei aplicatii, atunci utilizarea în alta aplicatie nu este lipsita de erori.
Pentru reutilizarea dialogurilor proiectate se exporta ca un fisier .frm care poate fi importat în alte aplicatii:
În acelasi mod în care controalele se adauga unei forme, acestea pot fi adaugate unui document, foi de calcul sau slide pentru a le transforma în obiecte interactive. De exemplu, se pot adauga boxe text, lista, butoane radio etc. unui document, pentru a-l transforma într-un formular online. Se pot adauga butoane de comanda pe o foaie de calcul pentru a executa proceduri macro uzuale etc.
Desi modul de operare este foarte asemanator, exista deosebiri precum
La adaugarea si operarea cu controale într-un document Word sunt importante urmatoarele idei:
Se pot adauga controale, la caiete sau foi de calcul, lânga datele pe care le controleaza, astfel încât operarea în foaia de calcul sa se efectueze cât mai cursiv si mai pe înteles.
Urmatoarele afirmatii puncteaza principalele aspecte ale plasarii controalelor ActiveX pe o foaie de calcul Excel.
Se observa revenirea la activarea butonului de comanda dupa ce s-a efectuat sortarea.
Adaugarea controalelor ActiveX la diapozitive PowerPoint pot produce un schimb de informatii cu utilizatorul, de exemplu personalizari ale prezentarii dupa optiunile privitorului.
Principalele aspecte care trebuie urmarite sunt:
Accesul programatic la un control se poate obtine prin numele controlului sau prin intermediul colectiei careia îi apartine. Denumirea unui obiect este cea specificata drept valoare a proprietatii (Name) în fereastra Properties a controlului.
Urmatoarele exemple prezinta principalele actiuni care implica controale si documente.
Stabilirea titlului (caption) unui control:
CommandButton1.Caption = "Run"Daca numele controlului se utilizeaza în afara modulului clasa asociat documentului, foii de calcul sau diapozitivului care contine controlul, atunci numele controlului trebuie calificat cu numele documentului respectiv:
Sheet1.CommandButton1.Caption = "Run"Se poate accesa un control ActiveX si prin colectia Shapes, OLEObjects sau InlineShapes, dupa caz.
Pentru accesul prin intermediul colectiilor, se utilizeaza numele obiectului Shape care contine un control particular si nu numele din cod al controlului. În Excel si PowerPoint, numele obiectului care contine un control este numele de cod implicit al controlului (cum ar fi CommandButton1). În Word, numele obiectului (de forma implicita Control 1) care contine un control nu este legat de numele de cod al controlului. Pentru a schimba numele de cod al unui control se selecteaza controlul si se schimba valoarea proprietatii (Name). Pentru a schimba numele unui obiect Shape, OLEObject sau altui obiect care contine un control se va schimba valoarea proprietatii Name.
|