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.
|