|
Formularele si controalele sunt obiecte care dispunde proprietati, metode si evenimente. Proprietatile pot fi considerate ca atribute ale unui obiect, metodele ca actiuni ale acestuia si evenimentele ca raspunsuri ale acestuia.
Un obiect din lumea reala, cum ar fi un balon cu heliu pentru copii, are de asemenea proprietati, metode si evenimente. Proprietatile unui balon include atribute vizibile, cum ar fi diametrul, inaltimea si culoarea acestuia. Alte proprietati descriu starea acestuia (umflat sau dezumflat) sau atribute care nu sunt vizibile, cum ar fi vechimea acestuia. Prin definitie, toate baloanele au aceste proprietati; valorile acestor proprietati pot diferi de la un balon la altul.
Un balon are metode sau actiuni mostenite pe care le poate executa. Aceasta poate fi o metoda de umflare (actiunea de umplere cu heliu), o metoda de dezumflare (golirea continutului sau) si o metoda de inaltare (daca il lasati liber). Toate baloanele dispun de aceste metode.
De asemenea, baloanele au raspunsuri predefinite la anumite evenimente externe. Spre exemplu, un balon va raspunde prin dezumflare atunci cand este intepat sau prin inaltarea in aer cand este eliberat.
Daca ati fi capabil sa programati un balon, atunci codul Visual Basic ar putea arata ca mai jos. Pentru setarea proprietatilor:
Balloon.Color = Red
Balloon.Diameter = 10
Balloon.Inflated = True
Remarcati sintaxa codului - obiectul (Balloon) urmat de proprietate (.Color) si apoi valoare de atribuit (Red). Puteti schimba culoarea balonului din cod prin repetarea instructiunii si inlocuirea cu o culoare diferita. De asemenea, proprietatile pot fi stabilite in fereastra Properties pe timpul proiectarii aplicatiei.
Metodele unui balon sunt invocate astfel:
Balloon.Inflate
Balloon.Deflate
Balloon.Rise 5
Sintaxa este similara proprietatii - obiectul (un substantiv) urmat de metoda (un verb). In al treilea exemplu, exista un element suplimentar, numit argument, care indica distanta de ridicare. Unele metode vor avea unul sau mai multe argumente pentru a descrie actiunea ce va fi executata.
Balonul poate raspunde la evenimente asa cum se arata in continuare:
Sub Balloon_Puncture()
Balloon.Deflate
Balloon.MakeNoise 'Bang'
Balloon.Inflated = False
Balloon.Diameter = 1
End Sub
In acest caz, codul descrie comportarea balonului atunci cand se produce evnimentul de intepare: invoca metoda Deflate, apoi invoca metoda MakeNoise cu argumentul 'Bang' (tipul de zgomot pe care-l face). Deoarece balonul nu mai este umflat, proprietatea Inflated este setata pe False iar proprietatea Diameter este setata pe o noua valoare.
In timp ce in realitate nu puteti programa un balon, puteti programa un formular si un control Visual Basic. Ca programator decideti ce proprietati se vor modifica, ce metode se vor invoca si la ce evenimente se va raspunde in scopul obtinerii aspectului si comportarii dorite.
Obiectele de tip Form reprezinta elementele de baza ale realizarii unei aplicatii Visual Basic, adica ferestrele reale cu care un utilizator va interactiona atunci cand ruleaza aplicatia. Formularele au propriile lor proprietati, evenimente si metode cu care puteti controla aspectul si comportarea lor.
Primul pas in proiectarea unui formular este stabilirea proprietatilor acestuia. Puteti seta proprietatile unui formular pe timpul proiectarii in fereastra Properties sau pe timpul executie prin codul scris.
Nota Dumneavoastra lucrati cu formulare si controale, setati proprietatile acestora si scrieti cod pentru avenimetele acestora pe timpul proiectarii, care reprezinta timpul de realizare a unei aplicatii in mediul Visual Basic. Timpul executiei este timpul in care rulati in realitate aplicatia si interactionati cu ea ca un utilizator.
Multe dintre proprietatile formularului afecteaza aspectul sau fizic. Proprietatea Caption determina textul care este afisat in bara de titlu a formularului; proprietatea Icon stabileste pictograma care se afiseaza atunci cand formularul este minimizat. Proprietatile MaxButton si MinButton determina daca formularul poate fi maximizat sau minimizat. Prin schimbarea proprietatii BorderStyle, puteti controla modul de comportare al formularului la redimensionare.
Proprietatile Height si Width determina dimensiunea initiala a formularului; proprietatile Left si Top determina localizarea formularului fata de coltul din stanga sus a ecranului. Proprietatea WindowState poate fi setata pentru a lansa formularul intr-o forma maximizata, minimizata sau normal.
Proprietatea Name stabileste numele prin care va veti referi in cod la formular. In mod prestabilit, cand un formular este adaugat unui proiect, numele acestuia este setat pe Form1, Form2, s.a.m.d. Este indicat sa setati proprietatea Name pe ceva mult mai sugestiv, cum ar fi frmInput pentru un formular de introducere date.
Cea mai buna cale de a va familiariza singuri cu amjoritatea proprietatilor formularului este exeperimentarea. Schmbati unele proprietati ale formularului in fereastra Properties (vezi figura 3), apoi rulati aplicatia pentru a vedea efectul. Puteti invata mai multe despre fiecare proprietate prin selectarea ei si apasarea tastei functionale F1 pentru a vizualiza Help-ul contextual.
Ca orice obiect, formularul poate executa metode si raspunde la evenimente.
Evenimentul Resize al unui formular se declanseaza atunci cand formularul este redimensionat fie prin interactiunea utilizatorului fie prin cod. Aceasta permite ca dumneavoastra sa executati actiuni ca mutarea si redimensionarea controalelor de pe formular atucni cand dimensiunile acestuia se schimba.
Evenimentul Activate se produce atunci cand formularul devine formular activ; evenimentul Deactivate se produce atunci cand un alt formular al aplicatiei devine activ. Aceste evenimente sunt convenabile pentru initializare sau terminare. Spre exemplu, in evenimentul Activate puteti scrie cod pentru selectarea textului dintr-o anumita caseta de text; in evenimentul Deactivate puteti scrie cod pentru salvarea unui fisier sau a unei baze de date.
Pentru a face vizibil un formular, puteti invoca metoda Show:
Form2.Show
Invocarea metodei Show are acelasi efect ca si setarea proprietatii Visible a formularului pe valoarea True.
Multe dintre metodele unui formular invoca text sau grafice. Metodele Print, Line, Circle si Refresh sunt utilizabile pentru afisarea si desenarea directa pe suprafat formularului. Aceste metode si ,ulte altele vor fi dicutate in "Lucrul cu text si grafice".
Cea mai usoara metoda de a permite utilizatorului sa interactioneze cu aplicatia este de asigura un buton pentru executarea unui clic. Puteti folosi controale de tip CommandButton furnizate de Visual Basic sau puteti crea un "buton" propriu folosind un control de tip Image continand o imagine, cum ar fi o pictograma.
Majoritatea aplicatiilor Visual Basic au butoane de comanda care permit utilizatorului ca printr-un simplu clic pe ele sa execute actiunile asociate lor. Cand un utilizator alege un buton, el numai are grija de actiunea corespunzatoare; de asmenea, butonul arata ca fiind apasat sau eliberat. Cand utilizatorul executa clic pe un buton se produce evenimentul Click. In procedura evenimentul Click plasati codul care va executa actiunea selectata.
Pe timpul executiei, exista mai multe procedee de a selecta un butoan de comanda:
Folosirea mouse-ului pentru a executa clic pe butonul dorit.
Mutarea focus-ului pe buton prin apasarea tastei TAB si apoi selectarea lui prin apasarea tastei SPACEBAR sau ENTER.
Apasarea tastei de acces (ALT+ litera subliniata) a butonului de comanda dorit.
Setarea pe True a proprietatii Value a butonului de comanda folosin cod:
cmdClose.Value = True
Invocarea in cod a evenimentului Click:
cmdClose_Click
Daca butonul de comanda este un buton de comanda prestabilit (predefinit) pentru formular, apasarea tastei ENTER va determina selectarea butonului, chiar daca ati mutat focus-ul pe un control diferit de butonul de comanda. Pe timpul proiectarii, stabilirea butonului de comanda predefinit se realizeaza prin setarea pe True a proprietatii Default a butonului de comanda respectiv.
Daca un buton de comanda este definit ca buton Cancel pentru formular, atunci apasarea tastei ESC va determina selectarea respectivului buton, chiar daca ati mutat focus-ul pe un control diferit de butonul de comanda. La proiectare, stabilirea butonului de comanda predefinit Cancel se realizeaza prin setarea pe True a proprietatii Cancel a butonului de comanda respectiv.
Toate aceste actiuni determina ca Visual Basic sa invoce procedura evenimentului Click.
Puteti folosi proprietatea Caption pentru a afisa text in butonul de comanda pentru a-i indica utilizatorului ce face butonul de comanda. In figura 4, exemplul Test Buttons din aplicatia model Controls contine un buton de comanda care are in proprietatea Caption textul 'Change Signal' (pentru a lucra cu acest exemplu, vizualizati formularul Button.frm din aplicatia model Controls.vbp)
Remarcati faptul ca 'S' este tasta de acces pentru acest buton, marcata prin subliniere. Inserarea unui ampersand (&) in textul proprietatii Caption (spre exemplu, Change &Signal) face ca litera care urmeaza sa fie tasta de acces pentru acel buton.
Atunci cand utilizatorul executa clic pe butonul de comanda, se executa codul procedurii evenimentului Click. In cazul exemplului prezentat, se va afisa o alta pictograma ori de cate ori se va executa clic pe buton.
Interfata utilizatorului este, probabil, cea mai importanta componenta a unei aplicatii; cu singuranta este cea mai vizibila. Pentru utilizatori, interfata este aplicatia insasi; ei probabil ca nici nu stiu codul care se executa in "spatele scenei". Nu conteaza cat de mult cod scrieti pentru a o realiza, utilitatea unei aplicatii depinde de interfata ei.
Cand proiectati o aplicatie, trebuie sa luati cateva hotarari privind realizarea interfetei. Trebuie sa folositi un stil cu un singur document sau cu mai multe documente? Cate formulare sunt necesare? Ce comenzi trebuie sa fie incluse in meniuri si ce bare cu instrumente folositi pentru a duplica functiile meniurilor? Ce casete de dialog sunt necesare pentru a interactiona cu utilizatorul? Cata asistenta este necesar sa asigurati?
Inainte de a incepe proiectarea interfetei trebuie sa va ganditi la destinatia aplicatiei. Proiectul pentru o aplicatie de baza care va fi folosita in mod constant trebuie sa difere de cea a uneia folosita ocazional pentru scurt timp. O aplicatie care are ca principala destinatie afisarea de informatii este diferita de una utilizata pentru culegerea informatiilor.
De asemenea, tipul utilizatorilor terbuie sa influenteze proiectarea aplicatiei. O aplicatie pentru incepatori trebuie sa fie simpla, in timp ce una pentru utilizatori experimentati poate fi mult mai complexa. Daca doriti ca aplicatia sa fie distribuita pe plan international, atunci limba si cultura trebuie sa aiba influenta asupra proiectului.
Proiectarea unei interfete utilizator se rezolva foarte bine printr-un proces iterativ - rareori veti obtine un proiect perfect de prima oara.
Daca ati folosit aplicatii Windows, ati remarcat ca nu toate interfetele arata sau se comporta la fel. Exista doua stiluri de baza pentru interfetele utilizatorului: interfata pentru un singur document (Single-Document Interface - SDI) si interfata pentru mai multe documente (Multiple-Document Interface - MDI). Un exemplu de interfata SDI este aplicatia WordPad, inclusa in Microsoft Windows ( vezi figura 5). In WordPad, poate fi deschis doar un singur document; pentru a deschide un nou document trebuie sa inchideti documentul curent.
Aplicatiile de tipul Microsoft Excel si Microsoft Word sunt interfete MDI interfaces; ele va permit sa afisati mai multe documente in acelasi timp, fiecare document fiind afisat in propria sa fereastra (vezi figura 6). Puteti recunoaste o aplicatie MDI prin faptul ca aceasta are inclus in meniu un element de meniu, numit Window cu submeniuri pentru comutarea intre ferestre sau documente.
In determinarea stilului interfetei trebuie sa tineti cont de destinatia aplicatiei. O aplicatie pentru procesarea facturilor necestita un stil MDI - un client poate comanda mai multe produse. Pe de alta parte, pentru o aplicatie tip calendar este mai indicat stilul SDI - foarte rar veti avea nevoie sa aveti la un moment dat mai mult de un calendar.
Stilul SDI este cel mai folosit, majoritatea exemplelor din Programmer's Guide preupun o aplicatie SDI.
Pe langa aceste doua stiluri de baza, SDI si MDI, un al treilea stil a devenit mai popular, interfata stil explorare (vezi figura 7). Interfata stil explorare are o singura fereastra ce contine doua panouri sau regiuni, continand in mod normal o vizualizare tip arbore sau ierarhica in stanga si o zona de afisare in dreapta, ca la Microsoft Windows Explorer. Acest gen de interfata dirijeaza navigarea si explorarea unui mare numar de documente, imagini sau fisiere.
Pe langa exemplele de aplicatii MDI si SDI care insotesc acest capitol, Application Wizard asigura un procedeu bun pentru a compara diferite stiluri de interfete. Puteti folosi expertul pentru a genera un framework pentru fiecare stil si apoi sa vizualizati formularele si codul pe care-l genereaza.
Interfata pentru mai multe documente (MDI) va permite sa creati o aplicatie care gestioneaza mai multe formulare intr-un singur formular container. Aplicatiile cum ar fi Microsoft Excel si Microsoft Word au interfete pentru mai multe documente.
O aplicatie MDI permite utilizatorului sa afiseze mai multe documente in acelasi timp, fiecare fiind afisat in propria sa fereastra. Documentele sau ferestrele copil sunt continute intr-o fereastra parinte, care asigura spatiul de lucru pentru toate ferestrele copil din aplicatie. Spre exemplu, Microsoft Excel va permite sa creati si sa afisati mai multe efestre de documente de tipuri diferite. Fiecare fereastra individuala este limitata la zona ferestrei parinte Excel. Cand minimizati Excel, toate ferestrele de document sunt minimizate; in bara de sarcini apare numai pictograma ferestrei parinte.
Un formular copil este un formular obisnuit care are proprietatea sa MDIChild setata pe True. Aplicatiile dumneavoastra pot include mai multe formulare MDI copil similare sau de diferite tipuri.
Pe timpul executiei, formularele copil sunt afisate in interiorul spatiului de lucru (zona dintre marginile formularului si de sub bara de titlu si barele de meniu) al formularului MDI parinte. Cand un fomular copil este minimizat, pictograma sa apare in interiorul spatiului de lucru a formularului MDI parinte si nu pe bara de sarcini, asa dupa cum se poate vedea din figura 8.
Nota Aplicatia poate sa includa si formulare standard, non-MDI care sa fie continute om formularul MDI. Un exemplu tipic de utilizare a unui formular standard intr-o aplicatie MDI este afisarea modala a casetei de dialog.
Un formular MDI este similar unui formular standard cu o singura restrictie. Pe un formular MDI nu puteti plasa direct un control care nu are proprietatea Align (cum ar fi un control de tip caseta pentru imagine) sau nu are o interfata vizibila (cum ar fi un control timer).
Pentru a crea un formular MDI si formularele sale copil se foloseste urmatoarea procedura:
1. Se creaza un formular MDI selectand comanda Add MDI Form din meniul Project.
Nota O aplicatie poate avea doar un singur formular MDI. Daca proiectul are deja un formular MDI, atunci comanda Add MDI Form din meniul Project nu este selectabila.
2. Se creaza formularele copil ale aplicatiei. Pentru a crea un formular MDI copil, se creaza un nou formular (sau se dseschide unul deja existent) si se seteaza proprietatea MDI Child a acestuia pe True.
La proiectare, formularele copil nu sunt restrictionate la zona din interiorul formularului MDI. Puteti adauga controal, stabili proprietatile, scrie cod si proiecta facilitatile formularelor copil la fel cum ati procedat in taote celelalte formulare Visual Basic.
Puteti determina daca un formular este un formular MDI copil prin vizualizarea proprietatii MDIChild a lui sau examinand fereastra Project Explorer. Daca proprietatea MDIChild este setata pe True, atunci acesta este un formular copil. Visual Basic afiseaza pictograme speciale in fereastra Project Explorer pentru formularele MDI si MDI copil, asa cumse vede si in figura 9.
Pe timpul executiei, un formular MDI si toate formularele sale copil dispun de caracteristici speciale:
Toate formularele copil sunt afisate in interiorul spatiului de lucru a formularului MDI. Utilizatorul poate muta si redimensiona formularele copila la fel ca la celelalte tipuri de formulare; totusi, ele sunt restrictionate la acest spatiu de lucru.
Cand este minimizat un formular copil, pictograma lui apare in formularul MDI si nu in bara de sarcini. Cand este minimizat formularul MDI, formularul MDI si toate formularele copil ale sale sunt reprezentate printr-o singura pictograma. Cand este restaurat formularul MDI, formularul MDI si toate formularele copil ale sale sunt afisate in aceeasi stare ca inainte de a fi minimizate.
Cand un formular copil este maximizat, titlul sau este combinat cu titlul formularului MDI si este afisat in bara de titlu a formularului MDI (vezi figura 10).
Prin setarea proprietatatii AutoShowChildren, puteti afisa automat formularele copil atunci cand formularele sunt incarcate (True), sau sa incarcati formularele copil ca fiind ascunse (False).
Meniul formularului copil activ (daca exista) este afisat pe bara de meniu a formularului MDI, nu pe formularul copil.
Aplicatia model MDI NotePad este un simplu editor de texte similar aplicatiei NotePad inclusa in Microsoft Windows. Totusi, aplicatia MDI NotePad foloseste o interfata pentru mai multe documente (MDI). Pe timpul executie, cand utilizatorul solicita un nou document (implementat cu comanda New din meniul File al aplicatiei), aplicatia creaza o noua instanta a formularului copil. Aceasta permite utilizatorului sa creeze atatea formulare copil sau documente cate are nevoie.
Pentru a crea in Visual Basic o aplicatie centrata pe document, aveti nevoie de cel putin doua formulare - un fomular MDI si un formular copil. La proiectare, dumneavoastra creati un formular MDI care contine aplicatia si un singur formular copil care va servi ca sablon pentru documentul aplicatiei.
Pentru a crea propria aplicatie MDI NotePad executati urmatoarele operatii:
1. In meniul File selectati comanda New Project.
2. In meniul Project selectati comanda Add MDI Form pentru a crea formularul container. Proiectul va contine un formular MDI (MDIForm1) si un formular standard (Form1).
3. Pe formularul Form1 creati o caseta de text (Text1).
4. Setati proprietatile celor doua formulare si ale casetei de text la valorile din tabelul urmator:
Obiect
Proprietate
Valoare
MDIForm1
Caption
MDI NotePad
Form1
Caption
fara titlu
MDIChild
True
Text1
MultiLine
True
Text
(gol)
Left
0
Top
0
5. Folosind comanda Menu Editor din meniul Tools, creati un meniu File pentru formularul MDIForm1.
Caption
Name
Indented
&File
mnuFile
No
&New
mnuFileNew
Yes
6. Adaugati urmatorul cod procedurii mnuFileNew_Click:
Private Sub mnuFileNew_Click ()
' Crearea unei noi instante a lui Form1, numita NewDoc.
Dim NewDoc As New Form1
' Afisarea noului formular.
NewDoc.Show
End Sub
Aceasta procedura creaza si apoi afiseaza o noua instanta (sau o copie) a lui Form1, numita NewDoc. De fiecare data cand utilizatorul selecteaza comanda New din meniul File, se creaza un duplicat (o instanta) a lui Form1, incluzand toate controalele si codul pe care acesta il contine.
7. Adaugati urmatorul cod procedurii Form_Resize pentru formularul Form1:
Private Sub Form_Resize ()
' Se extinde caseta de text pt. a umple formularul copil curent
Text1.Height = ScaleHeight
Text1.Width = ScaleWidth
End Sub
Codul procedurii evenimentului Resize pentru formularul copil, la fel ca intregul cod adin formularul Form1 este partajat de fiecare instanta a lui Form1. Cand sunt afisate mai multe copii ale unui formular, fiecare dintre ele isi recunoaste propriile evenimente. Cand se produce un eveniment, este apelat codul pentru acel eveniment. Deoarece acelasi cod este distribuit fiecarei instante, probabil ca va mirati cum refera formularul ce a apelat codul - in special din cauza ca toate instantele au acelasi nume (Form1). Aceasta va fi discutat intr-un paragraf urmator din acest capitol 'Lucrul cu formulare MDI si formulare MDI copil'.
8. Apasati tasta functionala F5 pentru a rula aplicatia.
Sugestie Aplicatia model Mdinote.vbp contine exemple a multor din tehnicile MDI mentionate in acest capitol. Acordati timp pentru a descoperi aceste tehnici. Aplicatia model Sdinote.vbp este o implementare a aceleasi aplicatii convertita insa la stilul SDI; comparati cele doua modele pentru a va insusi diferentele dintre tehnicile MDI si SDI.
Atunci cand aplicatia MDI deschide, salveaza sau inchide intr-o sesiune diferite formulare copil, ea trebuie sa fie capabila sa refere formularul activ si sa intretina informatiile despre formularele copil. Acest paragraf descrie tehnicile de codificare pe care le puteti folosi pentru a specifica formularul copil sau controlul activ, incarca sau descarca formularul MDI si formularele copil si intretinerea informatiilor de stare pentru un formular copil.
Uneori vreti sa asigurati o comanda care sa opereze pe controlul cu focus-ul din formularul copil care este activ in momentul respectiv. Spre exemplu, sa presupunem ca vreti sa copiati in Clipboard textul selectat din caseta de text a unui formular copil. In aplicatia model Mdinote.vbp, evenimentul Click a elementului Copy din meniul Edit apeleaza EditCopyProc, o prcedura care copiaza in Clipboard textul selectat.
Deoarece aplicatia poate avea mai multe instante ale aceluiasi formular copil, procedura EditCopyProc trebuie sa cunoasca ce formular foloseste. Pentr a specifica acest lucru, se foloseste proprietatea ActiveForm a formularului MDI, care returneaza formularul copil care are focus-ul sau care a fost cel mai recent activat.
Nota Atunci cand accesati proprietatea ActiveForm trebuie sa fie incarcat si vizibil cel putin un formular MDI copil; in caz contrar, se produce o eroare de executie.
Cand aveti mai multe controale pe un formular, este necesar sa specificati si care este controlul activ. La fel ca proprietatea ActiveForm, si proprietatea ActiveControl returneaza controlul care are focus-ul de pe formularul activ. In continuare se prezinta un exemplu a rutinei de copiere ce poate fi apelata din meniul formularului copil, un meniu din formularul MDI sau dintr-un buton al barei cu instrumente:
Private Sub EditCopyProc ()
' Copiaza in Clipboard textul selectat.
ClipBoard.SetText frmMDI.ActiveForm.ActiveControl.SelText
End Sub
Daca scrieti cod care va fi apelat de mai multe instante ale unui formular, este indicat sa nu folositi identificatorul de formular atunci cand accesati controalele sau proprietatile formularului. Spre exemplu, referiti inaltime casetei de text de pe Form1 sub forma Text1.Height in loc de Form1.Text1.Height. In acest mod, codul va afecta intotdeauna formularul curent.
Un alt procedeu de a specifica in cod formularul curent este utilizarea cuvantului cheie Me. Puteti folosi Me pentru formularul al carui cod este executat in momentul respectiv. Acest cuvant cheie este util atunci cand este necesar sa transmiteti o referinta la instanta formularului curent ca argument al unei proceduri.
Cand incarcati un formular copil, formularul parinte al acestuia (formularul MDI) este in mod automat incarcat si afisat. Totusi, cand incarcati un formular MDI formularele copil ale acestuia nu sunt incarcate automat.
In exemplul MDI NotePad, formularul copil este predefinit formular de lansare, astfel incat ambele formulare, atat formularul copil cat si formularul MDI, sunt incarcate cand aplicatia este lansata in executie. Daca schimbati formularul de lansare din aplicatia MDI NotePad pe frmMDI (din eticheta General a casetei de dialog Project Properties) si apoi rulati aplicatia, numai formularul MDI va fi incarcat. Primul formular copil se va incarca atunci cand selectati comanda New din meniul File.
Proprietatea AutoShowChildren se poate folosi pentru a incarca ferestrele MDI copil ca ascunse si le puteti lasa ascunse pana cand le afisati folosind metoda Show. Aceasta va permite sa actualizati diferite detalii, cum ar fi: titlurile, pozitiile si meniurile inainte ca un formular copil sa devina vizibil.
Nu puteti afisa in mod modal un formular MDI copil sau un formular MDI (folosind metoda Show cu argumentul vbModal). Daca intr-o aplicatie MDI vreti sa folositi o caseta de dialog modala, folositi un formular avand proprietatea MDIChild setata pe False.
Cand un formular MDI copil are o bordura redimensionabila (BorderStyle = 2), Microsoft Windows determina inaltimea, latimea si pozitia lui initiala atunci cand acesta este incarcat. Dimensiunea si pozitia initiala a unui formular copil cu bordura redimensionabila depinde de marimea formularului MDI si nu de marimea formularului copil de la proiectare. Cand bordura unui formular copil nu este modificabila (BorderStyle = 0, 1 sau 3), acesta este incarcat folosind valorile proprietatilor Height si Width stabilite la proiectare.
Daca setati proprietatea AutoShowChildren pe False, puteti schimba pozitia formularului MDI copil dupa incarcare, dar inainte de-al face vizibil.
Utilizatorul care se decide sa iasa dintr-o aplicatie MDI trebuie sa aiba posibilitatea de a-si salva munca. Pentru a face posibil acest, aplicatia trebuie sa fie capabila sa determine in orice moment daca datele din formularul copil au fost modificate de la ultima lor salvare.
Puteti realiza acest lucru prin declararea unei variabile publice pe fiecare formular copil. Spre exemplu, puteti declara o variabila in sectiunea Declarations a unui formular copil astfel:
Public boolDirty As Boolean
De fiecare data cand se schimba textul din Text1, caseta de text a formularului copil, evenimentul Change seteaza variabila boolDirty pe True. Puteti adauga urmatorul cod pentru a indica daca continutul casetei de text Text1 a fost schimbat de la ultima salvare:
Private Sub Text1_Change ()
boolDirty = True
End Sub
De fiecare data cand utilizatorul salveaza continutul formularului copil, evenimentul Change al casetei de text seteaza variabila boolDirty pe False pentru a indica faptul ca nu mai este necesara salvarea continutului lui Text1. In codul care urmeaza, se presupune ca exista o comanda de meniu numita Save (mnuFileSave) si o procedura numita FileSave care salveaza continutul casetei de text:
Sub mnuFileSave_Click ()
' Salvarea continutului lui Text1.
FileSave
' Setarea variabilei de stare.
boolDirty = False
End Sub
Indicatorul boolDirty devine util atunci cand utilizatorul decide parasirea aplicatiei. Aceasta se poate produce atunci cand utilizatorul selecteaza comanda Close din meniul de control al formularului MDI sau printr-o comanda de meniu asigurata de dumneavoastra, cum ar fi comanda Exit din meniul File. Daca utilizatorul inchide aplicatia folosind folosind meniul de control al formularului MDI, Visual Basic va incerca descarcarea formularului MDI.
Cand un formular MDI este descarcat, este invocat evenimentul QueryUnload in primul rand pentru formularul MDI si apoi pentru fiecarea formular copil care este deschis. daca nici unul din codurile procedurilor evenimentului QueryUnload nu abandoneaza evenimentul Unload, atunci fiecare formular copil este descarcat si in final este descarcat si formularul MDI.
Deoarece evenimentul QueryUnload este invocat inaintea descarcarii unui formular, puteti oferi utilizatorului posibilitatea sa-si salveze formularul inainte de descarcarea lui. Urmatorul cod foloseste indicatorul boolDirty pentru a determina daca utilizatorul trebuie intrebat despre salvare inainte ca formularul sa fie descarcat. Retineti faptul ca puteti accesa valoarea unei variabile publice de nivel modul oriunde in proiect. Acest cod presupune ca exista o procedura, FileSave, care salveaza intr-un fisier continutul lui Text1.
Private Sub mnuFExit_Click()
' Cand utilizatorul selecteaza File Exit dintr-o aplicatie MDI
' descarca formularul MDI, invoca evenimentul QueryUnload
' pentru fiecare event formular copil deschis.
Unload frmMDI
End
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, _
UnloadMode As Integer)
If boolDirty Then
' Apelarea rutinei pentru a interoga utilizatorul si
' a slava fisierul daca este necesar.
FileSave
End If
End Sub
Pe langa elementele de baza ale proiectari formularului, trebuie sa va ganditi si la modul de incepere si terminare a aplicatiei. Exista cateva tehnici pentru a determina ce va vedea utilizatorul atunci cand lanseaza aplicatia. De asemenea, este necesar sa asigurati prelucrarile ce se vor produce atunci cand se inchide aplicatia.
In mod prestabilit, primul formular creat in eplicatie este desemnat ca formular de lansare. cand aplicatia este lansata, acest formular este afisat (astfel incat primul cod care se executa este cel din evenimentul Form_Initialize al acestui formular). Daca vreti sa afisati un alt formular atunci cand este lansata in executie aplicatia, trebuie sa executati urmatoarele operatii:
1. Selectati comanda Project Properties din meniul Project.
2. Selectati eticheta General din caseta de dialog Project Properties..
3. In lista derulanta Startup Object, selectati formualrul care vreti sa devina noul formular de lansare.
4. Selectati OK.
Este posibil ca uneori sa vreti ca aplicatia sa fie lansata fara sa aiba un formular incarcat initial. Spre exemplu, este posibil sa vreti sa incarcati un fisier de date si apoi sa afisati unul dintre formularele existente in functie de ce este in fisierul de date. Acest lucru il puteti realiza prin crearea unei proceduri Sub, numita Main, in modulul standard, ca in exemplul urmator:
Sub Main()
Dim intStatus As Integer
' Apelarea unei functii pentru verificarea starii utilizatorului.
intStatus = GetUserStatus
' Afisarea formularului de lansare in functie de stare.
If intStatus = 1 Then
frmMain.Show
Else
frmPassword.Show
End If
End Sub
Aceasta procedura trebuie sa fie o procedura Sub si nu poate fi intr-un modul de formular. Pentru a seta procedura Sub Main ca obiect de lansare se procedeaza astfel: in meniul Project se selecteaza comanda Project Properties, in caseta de dialog Project Properties se selecteaza eticheta General iar din lista derulanta Startup Object se selcteaza optiunea Sub Main.
Daca va trebuie o procedura lunga de lansare, cum ar fi incarcarea unui volum mare de date dintr-o baza de date sau incarcarea catorva imagini mari, este posibil sa doriti ca la lansare sa se afiseze un ecran de tip splash. Un ecran de tip splash este un formular, care in mod obisnuit afiseaza numele aplicatiei, drepturile de autor su o imagine simpla. Ecranul care se afiseaza atunci cand este lansat Visual Basic este un ecran splash.
Pentru a afisa un ecran splash, folositi o procedura Sub Main ca obiect de lansare si apoi utilizati metoda Show pentru a afisa formularul:
Private Sub Main()
' Afisarea ecanului splash.
frmSplash.Show
' Aici se adauga procedura de lansare.
' Afisarea formularului principal si descarcarea ecranului splash.
frmMain.Show
Unload frmSplash
End Sub
Ecranul splash distrage atentia utilizatorului pe timpul executiei rutinei de lansare, dand iluzia ca aplicatia se inacraca rapid. Cand rutina de lansare s-a terminat, puteti incarca primul formular si descarca ecranul splash.
Este indicat ca ecranul splash sa fie cat mai simplu. Daca folositi o imagine mare sau un numar mare de controale, atunci insasi ecarnul splash se va incarca incet.
O aplicatie dirijata prin evenimente se opreste din executie atunci cand toate formularele sale sunt inchise si nu mai exista cod in executie. Daca un formular ascuns mai exista inca atunci cand ultimul formular vizibil a fost inchis, aplicatia va parea ca fiind terminata (deoarece nu exista formulare vizibile), dar ea continua sa se execute pana cand toate formularele ascunse sunt inchise. Aceasta situatie poate sa apara deoarece orice acces la proprietatile si controalele unui formular neincarcat determina incarcarea implicita a acelui formular fara insa a-l afisa.
Cea mai buna metoda de a evita aceasta problema atunci cand inchideti aplicatia este sa va asigurati ca toate formularele ei au fost descarcate. Daca aveti mai mult de un singur formular, puteti folosi colectai Forms si instructiunea Unload. Spre exemplu, pe formularul principal puteti avea un buton de comanda numit cmdQuit care sa permita utilizatorului iesirea din program. Daca aplicatia are un singur formular, procedura evenimentului Click poate fi foarte simpla:
Private Sub cmdQuit_Click ()
Unload Me
End Sub
Daca aplicatia foloseste mai multe formulare, puteti descarca formularele prin scrierea codului in procedura evenimentului Unload a formularului principal. Puteti utiliza colectia Forms pentru a va asigura ca ati gasit si inchis toate formularele. Urmatorul cod utilizeaza colectia de formulare pentru a descarca toate formularele:
Private Sub Form_Unload (Cancel As Integer)
Dim i as integer
' Se parcurge colecti formularelor si se descarca fiecare formular.
For i = Forms.Count - 1 to 0 Step - 1
Unload Forms(i)
Next
End Sub
Pot exista si cazuri cand trebuie sa inchideti aplicatia fara a tine cont de starea formularelor sau obiectelor existente. In acest scop se foloseste instructiunea End.
Instructiunea End termina imediat o aplicatie; dupa End nici un cod nu se mai executa si nici nu se mai produc evenimente. In particular, Visual Basic nu va executa procedurile evenimentelor QueryUnload, Unload sau Terminate pentru nici unul dintre formulare. Referintele obiectelor vor fi eliberate, dar daca aveti definite clase proprii, atunci Visual Basic nu va executa evenimentele Terminate ale obiectelor create din calsele dumneavoastra.
Pe langa instructiunea End si instructiunea Stop opreste o aplicatie. Totusi, trebuie sa folositi instructiunea Stop doar pe timpul depanarii, deoarece aceasta nu elibereaza referintele obiectelor.