|
Cuprins lab 6
Tipuri_de_obiecte_meniu
utilizate in constructia de meniuri
Atribuirea de valori
Clonarea de obiecte
Mai mult despre clonare
Colectii de obiecte de meniu
Metode_ale_colectiilor
Atribute_ale_obiectelor
Instalarea barei de meniu
Submeniuri in trepte
Completare References
Utilizarea in meniuri a unor
butoane din meniul ACCESS
O varianta de meniu
Sa se elaboreze o procedura care sa genereze un meniu pentru aplicatia de contabilitate, dupa modelul de mai jos:
Bara de meniu: Agenda. Tranzactii . Iesire
Societatea Editare transa
Terti .... Clienti Simulare transa
Efect pe conturi
Pe bara de meniu distingem doua submeniuri (Agenda si Tranzactii ) si un buton (Iesire).
Submeniul Agenda are montate pe el doua butoane (Societatea si Carnete CEC) si un submeniu Terti pe care s-au montat butoanele Clienti si Furnizori.
Submeniul Tranzactii nu are decat butoane.
butonul Societatea lanseaza macroul ShowForm_Societatea , care deschide formularul Societatea.
submeniul Terti, deschide optiunile Clienti si Furnizori, care lanseaza macrourile ShowForm_Clienti si respectiv ShowForm_Furnizori
butonul Carnete CEC inca nu dispune de un program, de aceea i-am atasat un subprogram care lanseaza mesajul 'Programul pentru aceasta optiune inca nu este disponibil'. Cand va fi gata, programul pentru aceasta optiune va deschide un formular pentru evidenta carnetelor CEC.
butonul Iesire este chiar butonul Exit din meniul File al aplicatiei Access.
butonul Editare transa lanseaza macroul Deschid_form_Adaos;
butonul Simulare efect transa lanseaza subprogramul Impact_sold;
butonul Vizualizare efect lanseaza macroul Open_form_impact;
butonul Efect pe conturi lanseaza macroul Open_form_evolutie;
ANEXA 1. Suport teoretic pentru lucrare
Din descrierea meniului de la punctul 1 nu rezulta ce face fiecare buton sub aspectul lansarii in executie a unei proceduri. Acest lucru se precizeaza in programul cu care definim structura meniului. Programul se va scrie sub forma de procedura (subrutina) intr-un modul de clasa ce va fi atasat unui obiect (de exemplu formularul principal cu care incepe aplicatia). Pentru elaborarea de meniuri se folosesc 4 tipuri de obiecte de meniu. In program vom declara cate una sau mai multe variabile de fiecare tip de obiect. De exemplu:
Dim Contab as CommandBar
Dim submenu1 as CommandBarPopup
Dim buton1 as CommandBarButton
Dim combobox1 as CommandBarCombobox.
In continuare, cu ajutorul fiecarui tip de obiect (in cazul de fata a variabilelor contab, submenu1, buton1, combobox1) putem genera diferite obiecte (pentru fiecare obiect specificand unde se adauga, adica la ce colectie se adauga si ce proprietati are).
Sa remarcam ca putem folosi de mai multe ori acelasi tip de obiect pentru a genera cu el ori cate obiecte de acel tip dorim. De exemplu daca am declarat submenu1 ca un CommandBarPopup, atunci cu el putem instala (clona) mai multe submeniuri ca Agenda, Tranzactii, Terti, etc. toate de tip CommandBarPopup. Acest lucru este posibil datorita modului cum se atribuie valoare acestor obiecte, respectiv unui obiect de tip CommandBarPopup cum este cazul submeniului submenu1 si mai precis, datorita instructiunii de mai jos cu care incepe procesul de atribuire de valoare:
Set submenu1 = menubar.Controls.Add(msoControlPopup)
Aceasta instructiune se bazeaza pe faptul ca barele de meniu si obiectele de control de pe ele (butoane, combobox si submeniuri de tip Pop-up) sunt grupate in colectii. Astfel exista Colectia de CommandBars si colectia CommandBarControls. Sa observam ca daca colectia CommandBars este omogena, deci contine numai bare de meniu, colectia CommandBarControls nu este omogena: ea contine butoane, combobox si submeniuri de tip Pop-up.
Ca orice colectie, si cele doua colectii enumerate mai sus, dispun de metode cum ar fi metoda Add, cu care putem adauga noi elemente la o colectie sau alta. Obiectele acestor colectii au proprietati, cum ar fi visible (adica daca obiectul este vizibil sau nu), style (stilul), caption (ce sa scrie pe el, adica eticheta ) s.a.m.d.
De exemplu instructiunea Set submenu1 de mai sus, pentru a atribui o valoare obiectului submenu1 foloseste metoda Add a colectiei CommandBarControls, invocata in instructiune prin cuvantul Controls. Sintaxa acestor instructiuni prevede ca imediat dupa semnul = ele sa contina locul pe care va fi amplasat obiectul din stanga semnului =. In cazul de fata instructiunea Set submenu1, precizeaza ca pentru moment, obiectul submenu1 este asezat pe bara de meniu numita menubar, care la randul ei este un obiect de tip CommandBar. Cuprinsul lucrarii 6
Procesul de atribuire de valoare unui obiect de tip CommandBarControls, nu se opreste la precizarea locului unde se instaleaza obiectul ci trebuie sa continue cu precizarea altor atribute cum ar fi Caption, Style, Visible si OnAction, unde Caption se refera la ce va scrie pe obiectul respectiv cand el apare pe ecran in cadrul meniului, Style se refera la aspectul sau (proprietatea este valabila in cazul butoanelor, pentru care exista stilul implicit msoButtonCaption), visible precizeaza daca obiectul este vizibil pe ecran sau nu si cel mai important - OnAction precizeaza ce se va intampla cand obiectul respectiv va fi selectat. Aici se specifica un nume de subprogram sau de macro ce va fi executat la selectarea obiectului respectiv, sau un MsgBox.
In cazul submeniului Agenda, a doua instructiune dupa Set submenu1 va fi
submenu1.caption="Agenda"
Procesul de atribuire de valoare descris mai sus decurge la fel pentru toate tipurile de obiecte folosite pe bare de meniu, cu observatia ca intai trebuie sa-i atribuim valori obiectului pe care urmeaza sa instalam alte obiecte. Cu alte cuvinte in exemplul de mai sus, ar fi trebuit mai intai sa atribuim valori barei de meniu menubar si numai dupa aceea sa-i atribuim o valoare submeniului submenu1.
Instructiunea de instalare a barei de meniu are forma
Set menubar = Application.CommandBars.Add(Name:='Contab', Position:=msoBarTop, menubar:=True, temporary:=True), unde postion mai poate lua valorile msoBarBottom, msoBarLeft sau msoBarRight, adica precizeaza pe ce latura a ecranului se va instala bara de meniu, iar parametrul menubar, in cazul in care nu avem de gand sa inlocuim meniul Access cu meniul nostru, mai poate lua si valoarea False. Daca parametrul temporay este True, atunci meniul nostru este temporar, adica la urmatoarea pornire a aplicatiei el nu mai exista si, daca avem nevoie de el trebuie sa rulam din nou procedura care genereaza acest meniu. Altminteri meniul ramane in colectia de meniuri CommandBars si poate fi folosit ca orice trusa de instrumente de tip Access. Este bine sa stim ca trusele de instrumente Access sunt de fapt meniuri din colectia CommandBars.
Sa retinem ca proprietatea Visible a noii bare trebuie pusa pe True altfel bara nu se vede pe ecran. Ca urmare imediat dupa instructiunea de mai sus, vom avea
menubar.Visible = True. In mod normal abia dupa aceasta instructiune trebuia sa incepem atribuirea de valori submeniului submenu1, respectiv submeniului Agenda.
Dupa instalarea submeniului Agenda pe bara de meniu, nu avem decat sa instalam pe submenu1 si alte obiecte cum ar fi alte submeniuri sau butoane. In general orice submeniu trebuie sa se incheie cu cu cel putin un buton, iar orice buton trebuie sa aiba precizat atributul OnAction, altfel nu-si are rostul pe submeniu sau pe bara de meniu.
Mai sus am precizat ca submeniul submenu1 va fi folosit pentru a crea si alte submeniuri decat Agenda. Cum este posibil acest lucru?
Simplu atribuind obiectului submenu1 o alta valoare si bineinteles o alta eticheta (caption), eventual un alt stil sau acelasi ca intr-un caz precedent, o alta procedura sau un alt macro care sa fie executat la alegerea acelui, obiect, s.a..m.d., dar atentie, nu vom atribui obiectului submenu1 o alta valoare pana ce nu vom declara, adica nu vom atribui valori tuturor obiectelor care vor fi asezate pe el. Orice obiect care capata valoare in zona ce urmeaza dupa ce i s-a atribuit o valoare obiectului submenu1, daca in instructiunea de atribuire de valoare a acelui obiect se specifica locul de amplasare ca fiind submenu1, el va fi instalat pe acel submeniu.
Dupa ce am atribuit o alta valoare obiectului submenu1, de exemplu Tranzactii, orice obiect care in instructiunea de atribuire de valoare are precizat locul ca fiind submenu1, nu va mai fi instalat pe submeniul precedent ci pe ultimul submeniu declarat in fata instructiunii curente, in cazul de fata pe Tranzactii.
Faptul ca acelasi obiect (cum este cazul submenu1) poate fi folosit pentru a genera mai multe obiecte de acelasi tip pe bara de meniuri (cum ar submeniurile Agenda, Tranzactii, Terti, etc.) se repeta si la nivel buton. Ca urmare cu un buton declarat la inceput ca buton1 as CommandBarButton, putem plasa pe submeniul curent cate butoane dorim.
Astfel pe submeniul Tranzactii vom avea: Cuprinsul lucrarii 6
Set buton1 = submenu1.Controls.Add(msoControlButton)
buton.Caption = ' Editare transa'
Set buton1 = submenu1.Controls.Add(msoControlButton)
Buton1.Caption = ' Simulare transa '
Set buton1 = submenu1.Controls.Add(msoControlButton)
buton.Caption = ' Vizualizare_efect '
Set buton1 = submenu1.Controls.Add(msoControlButton)
Buton1.Caption = ' Efect pe conturi '
Evident la fiecare buton vor fi precizate si celelte proprietati cum ar fi buton1.style si buton1.OnAction. De exemplu
Buton1.Style = msoButtonCaption
Buton1. OnAction = '=MsgBox(''Bravo!'')'
Este foarte important sa retinem ca daca avem de gand sa instalam pe un submeniu un alt submeniu, nu mai putem folosi obiectul submenu1, pentru ca el va figura in instructiune la locul de instalare. De aceea vom declara atatea obiecte de tip CommandBarPopup, cate trepte de submeniuri avem de gand sa folosim in meniul nostru. Astfel daca pe submeniul submenu1, pe langa butoane avem de gand sa instalam si alt submeniu, atunci vom mai declara inca un submeniu, de exemplu submenu2, cu care vom putea instala pe submeniul submenu1, cate submeniuri dorim. Instructiunea de instalare a unui submeniu de nivel 2 va fi
Set submenu2 = submenu1.Controls.Add(msoControlPopup)
Sa observam ca daca submeniul Agenda era instalat pe bara de meniu menubar, acest submeniu va fi instalat pe ultimul submeniu caruia i s-a atribuit valoare prin intermediul submeniului submenu1 (de exemplu pe submeniul Agenda).
Pentru a scrie programe cu obiecte de tip CommandBars, deci pentru a genera un meniu pentru aplicatia noastra, trebuie subrutina noastra sa aiba acces la biblioteca Microsoft Office 8.0 sau 9.0 in functie de versiunea de Access cu care lucram. Pentru aceasta, din fereastra CodeBuilder-ului vom da clic pe References din optiunea de meniu Tools si vom selecta caseta de validare de langa Microsoft Office 8.0 Object Library, respectiv Microsoft Office 9.0 Object Library.
Practic in acest stadiu avem toate elementele necesare pentru a trece la scrierea unei proceduri care sa genereze meniul cerut la punctul 1, cu o singura mentiune:
In meniuri, putem adauga si butoane folosite in meniul principal Access, cum ar fi butoanele Copy si Paste din meniul EDIT sau butonul Exit de care avem nevoie si in meniul nostru si care trebuie sa fie chiar butonul Exit din meniul File al aplicatiei Access. Pentru aceasta trebuie stiut ca sintaxa completa a metodei Add (aplicata colectiei CommandBarControls) este urmatoarea:
expresie.Add(Type, Id, Parameter, Before, Temporary), unde:
- expresie este ceruta si indica un obiect de tip CommandBarControls.
Type este o variabila optionala si reprezinta tipul de control ce va fi adaugat pe bara specificata. Se pot folosi urmatoarele constante de tip MsoControlType:
msoControlButton, msoControlEdit, msoControlDropdown,
msoControlComboBox, or msoControlPopup. Cuprinsul lucrarii 6
Id este o variabila optionala si poate fi un intreg care sppecifica un control din trusa lui Acccess. Daca valoarea acestui argument este 1 sau a fost omis, atunci se va adauga un control in alb (fara eticheta) de un tip specificat de programator.
In exemplul urmator
With menubar.Controls.Add Type:=msoControlButton, Id:= _
CommandBars('Edit').Controls('Copy').ID
Visible = True
End With
zona in bold CommandBars('Edit').Controls('Copy').ID atribuie parametrului Id Id-ul controlului "Copy" din colectia de controale a barei "Edit", care, la randul ei, este un element din colectia de bare de meniu .
- Parameter o variabila optionala. Pentru controale venite cu Access acest argument este folosit pentru a rula comanda. In cazul butoanelor create de programator, se poate folosi acest argument pentru a trimite informatii catre procedurile Visual Basic, sau se poate folosi pentru a stoca informatii despre controale ( ceva similar cu o a doua valoare a proprietatii Tag).
Before o variabila optionala. De fapt este un numar care indica pozitia noului control pe bara. Noul control va fi instalat inaintea controlului a carui numar a fost specificat. Daca acet numar este omis, noul control va fi instalat la sfarsitul barei specificate.
Temporary o variabila optionala. Daca ia valoarea True noul control este temporar. Valoarea implicita este False.
Dam acum un exemplu de cum se poate crea un submeniu continand optiunile meniului de sistem Edit si anume: Cut, Copy si Paste:
Set submenu = menubar.Controls.Add(msoControlPopup)
submenu.Caption = 'Editare '
submenu.Visible = True
Set buton = submenu.Controls _
.Add(msoControlButton, CommandBars('Edit') _
.Controls('Cut').ID)
Set buton = submenu.Controls _
.Add(msoControlButton, CommandBars('Edit') _
.Controls('Copy').ID)
Set buton = submenu.Controls _
.Add(msoControlButton, CommandBars('Edit') _
.Controls('Paste').ID)
Sa observam ca optiunea Edit, ca de altfel toate optiunile barei de meniu a produsului Access nu sunt submeniuri ci sunt bare de meniu, asamblate astfel incat sa para ca formeaza o singura bara de meniu. Le da de gol ca sunt bare de meniu faptul ca la ele se face referire cu colectia CommandBars si nu cu CommandBarsControls.
Sa mai observam ca un element al unei colectii poate fi indicat prin numele sau, de exemplu CommandBars('Edit'), sau prin numarul sau de ordine (indexul sau) in cadrul colectiei.
Nota. Spre deosebire de celelalte colectii din Microsoft Access, colectia de CommandBars si toate colectiile pe care le contine sunt indexate incepand cu 1 si nu cu 0. Daca vreti sa vedeti care sunt toate barele de meniu incluse in Access rulati urmatorul program: Cuprinsul lucrarii 6
For Each cmdbar In CommandBars
MsgBox cmdbar.Name
Next 'In Access exista cca. 140 de bare de meniu!
Sub barademeniu()
Dim menubar As CommandBar
Dim submenu As CommandBarPopup
Dim submenu1 As CommandBarPopup
Dim buton As CommandBarControl
Dim bare As Integer
Set menubar = Application.CommandBars.Add(Name:='Contab', Position:=msoBarTop, menubar:=True, temporary:=True)
Menubar.visible=True
Set submenu = menubar.Controls.Add(msoControlPopup)
submenu.Caption = 'Agenda '
submenu.Visible = True
Set buton = submenu.Controls.Add(msoControlButton)
buton.Caption = 'Societatea'
buton.Style = msoButtonCaption
buton.OnAction = 'ShowForm_Societatea'
Set submenu1 = submenu.Controls.Add(msoControlPopup)
submenu1.Caption = 'Terti'
submenu1.Visible = True
Set buton = submenu1.Controls.Add(msoControlButton)
buton.Caption = 'Clienti'
buton.Style = msoButtonCaption
buton.OnAction = 'ShowForm_Clienti'
Set buton = submenu1.Controls.Add(msoControlButton)
buton.Caption = 'Furnizori'
buton.Style = msoButtonCaption
buton.OnAction = 'ShowForm_furnizori'
Set buton = submenu.Controls.Add(msoControlButton)
buton.Caption = 'Carnete CEC'
buton.Style = msoButtonCaption
buton.OnAction = 'buton_jurnal'
' Aici puteam folosi si un MsgBox cu mesajul care acum este prevazut in subrutina
' buton_jurnal.
Set buton = menubar.Controls.Add(msoControlButton, CommandBars('File') _
.Controls('exit').ID)
buton.Caption = 'Iesire'
buton.Style = msoButtonCaption
End Sub
Sub buton_jurnal()
MsgBox 'Programul pt. ac. optiune inca nu este disponibil'