Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Utilizarea formularelor - Generalitati despre obiecte

Utilizarea formularelor

Componenta vizuala, numita si interfata utilizatorului, se realizeaza folosind doua tipuri de obiecte: formulare si controale. Aceste obiecte va permit sa dirijati introducerea si afisarea informatiei, precum si deciziile utilizatorilor.

Aspectul si functionalitatea acestor obiecte sunt controlate prin intermediul a trei elemente de baza: proprietati, metode si eveniment. In continuare se vor explica aceste elemente in scopul definirii unui formular, dar principiile prezentate sunt aplicabile tuturor controalelor din Visual Basic.



Generalitati despre obiecte

Proprietatile obiectelor

Cand priviti un formular, vedeti o zona dreptunghiulara pe ecran, asemanatoare celei prezentate in figura 1. Dar in realitate, aceasta fereastra este definita printr-o serie de proprietati. Spre exemplu, pozitia formularului pe ecran este controlata prin proprietatile Left si Top, in timp ce dimensiunea formularului este determinata de proprietatile Height si Width. Titlul formularului, care este afisat in bara de titlu a ferestrei, reprezinta continutul proprietatii Caption.


Valorile proprietatilor formularului si ale controalelor de pe acesta, precum si codul procedurilor evenimentelor, sunt stocate intr-un fisier text cu extensia .FRM, care poate fi deschis cu un editor de texte, cum ar fi Notepad (vezi figura 2).

Text Box: 
Figura 2. Continutul unui fisier .FRM deschis cu Notepad.


Observatie Atunci cand un formular contine imagini si alte elemente binare care nu pot fi definite prin text, Visual Basic creaza si un fisier cu extensia .FRX.

Proprietatile obiectelor pot fi considerate ca o descriere a caracteristicilor acestora, similar cu descrierea unei persoane. Spre exemplu, cum v-ati descrie pe dumneavoastra? Probabil ca veti cita drept caracteristici: inaltimea, greutatea, culoarea parului si culoarea ochilor. Fiecare element al descrierii poate fi considerat o proprietate.

Nota:   Termenul 'obiect' va fi folosit in continuare pentru a indica obiecte vizuale, cum ar fi formularele si controalele personalizate.

Proprietati comune tuturor obiectelor

Nu toate obiectele din Visual Basic au acelasi set de proprietati. Totusi, exista cateva proprietati care sunt comune majoritatii obiectelor. Cateva dintre cele mai importante proprietati comune tuturor obiectelor sunt urmatoarele:

Proprietate

Destinatie

Left

Indica distanta dintre marginea din stanga a containerului si latura din stanga obiectului.

Top

Precizeaza distanta dintre mariginea de sus a containerului si marginea de sus a obiectului

Height

Specifica inaltimea obiectului.

Width

Indica latimea obiectului.

Name

Contne numele obiectului.

Enabled

Indica daca obiectul este accesibil sau nu.

Visible

Specifica daca obiectul este vizibil sau nu.

Dimensiunea si pozitia obiectului

Dimensiunea unui obiect poate fi controlata pe timpul proiectarii fie tragand reperele de dimensionare ale acestuia, fie modificand valorile proprietatilor Height si Width in fereastra Properties. Pe timpul executiei programului, puteti folosi cod care sa raspunda la sau sa initieze o modificare a dimensiunii. Pentru a ilustra acest lucru executati urmatoarele operatii:

1. Creati un proiect Standard EXE nou si apasati tasta functionala F5 pentru a-l lansa in executie (sau clic pe butonul Start din bara instrumentelor Standard).
2. Folositi combinatia de taste Ctrl+Break (sau executati clic pe butonul Break din bara instrumentelor Standard) pentru a intra in modul Break.
3. Folositi combinatia de taste Ctrl+G pentru a activa fereastra Immediate.
4. In fereastra Immediate, tastati Print Form1.Width si apasati Enter. Ca urmare a acestei actiuni se va afisa valoarea curenta a proprietatii Width (vezi figura 3).

Nota Fereastra Immediate, denumita uneori si fereastra Debug, va permite sa tastati si sa executati instructiuni de program cat timp sunteti in modul Break.

Text Box: 
Figura 3. Folosirea ferestrei Immediate la testarea instructiunilor.



5. In fereastra Immediate, tastati form1.Width = form1.Width * 2 si apoi apasati Enter.
6. Apasati tasta functionala F5 (sau clic pe butonul Start din bara instrumentelor Standard) si remarcati faptul ca latimea formularului Form1 s-a dublat (vezi figura 4).

Puteti vedea valoarea noii latimi, revenind in modul Break si tastand din nou Print Form1.Width in fereastea Immediate.

Unitatile de masura din Visual Basic
In mod prestabilit, toate distantele sunt masurate in twips. Un twip este 1/20 dintr-un punct de tiparire (pe un inch sunt 1440 twips, pe un centimetru sunt 567 twips). Aceste unitati de masura desemneaza dimensiunea unui obiect atunci cand este tiparit. Marimea reala a unui twip pe ecran variaza in functie de rezolutia ecanului. Puteti specifica o alta unitate de masura pentru obiectele din interiorul unui container, folosind proprietatea ScaleMode a containerului. Totusi, scala ecranului nu o puteti modifica, astfel ca proprietatile Left, Top, Height si Width ale formularului raman masurate tot in twips.

Text Box: 
Figura 4. Dublarea latimii prin modificarea valorii proprietatii Width.


Pozitia unui obiect se controleaza cu proprietatile Left si Top. Proprietatea Left specifica distanta dintre latura din stanga a unui obiect si latura din stanga containerului obiectului. Proprietatea Top indica distanta dintre latura de sus a obiectului si latura de sus a containerului obiectului (vezi figura 5). In cazul unui formular standard, containerul este intregul ecran. Daca pe formular trasati un control, atunci formularul este containerul controlului. Drept containere pentru controale se pot utiliza si controalele de tip PictureBox (caseta de imagine) si Frame (cadru).


Autorizarea interactiunii utilizatorului

Chiar daca aplicatia include multe formulare si controale, este mai mult ca sigur ca nu vreti ca utilizatorul sa aiba acces la toate in acelasi timp. Spre exemplu, sa presupunem ca ati creat un procesor de texte, care are, printre alte controale, si doua butoane, Salvare Fisier si Incarcare Fisier. Vreti ca butonul Salvare Fisier sa poata fi folosit numai daca a fost incarcat fisierul. Gestionarea acestui proces se poate realiza prin intermediul proprietatilor Visible si Enabled (sunt proprietati comune tuturor obiectelor).

Proprietatea Visible determina daca un obiect poate fi vazut sau nu pe ecran, in timp ce proprietatea Enabled determina daca utilizatorul poate interactiona sau nu cu obiectul respectiv. Ambele proprietati pot avea valoarea True sau False.

Daca proprietatea Visible este setata pe valoarea False, obiectul nu este prezentat si utilizatorul nu stie ca obiectul respectiv exista. Daca proprietatea Enabled este setata pe valoarea False, obiectul este vizibil (daca proprietatea Visible are valoarea True), dar utilizatorul nu poate interactiona cu acesta. In mod obisnuit, daca un obiect nu este accesibil, el este afisat pe ecran in modul grayed-out (sau dimmed), adica estompat. Acest mod de prezentare asigura un indiciu vizual asupra faptului ca obiectul nu este accesibil. Spre exemplu, in formularul prezentat in figura 6, una dintre casetele de text nu este accesibila. Ea afiseaza o valoare, dar valoarea nu poate fi editata deoarece nu se poate plasa cursorul in caseta de text.


Referirea obiectelor in cod

Una dintre proprietatile cheie ale oricarui obiect Visual Basic este proprietatea Name  Ea defineste un identificator unic prin care, in cod, va puteti referi la obiectul respectiv. Fiecare formular, caseta de text, eticheta etc. trebuie sa aiba un nume unic.

Nota:   Toate formularele dintr-un proiect trebuie sa aiba nume diferite. In timp ce numele controalelor trebuie sa fi unice numai in formularul in care ele au fost plasate. Adica, puteti avea un control 'Text1' pe fiecare formular din proiect, dar nu puteti avea doua formulare 'Form1' in proiect.

Cand este creat un obiect, Visual Basic ii da un nume prestabilit. Spre exemplu, Form1 este numele dat de Visual Basic primului formular creat in proiect, iar Text1 este numele dat primei casete de text plasate pe un formular. Totusi, este indicat ca dupa ce ati plasat un control sau ati creat un formular sa-i dati un nume care sa aiba o anumita semnificatie. Spre exemplu, eu folosesc intotdeauna frmMain ca nume al fomularului principal din interfata unei aplicatii.

De asemenea, din practica a rezultat ca este indicat sa folositi primele trei caractere ale numelui obiectului pentru a identifica tipul obiectului referit. Prefixul frm din numele de formular despre care tocmai am discutat (frmMain), indica faptul ca obiectul referit este un formular. In tabelul urmator sunt sugerate prefixe pentru majoritatea obiectelor din Visual Basic.

Tip obiect

Prefix

Tip obiect

Prefix

CheckBox

chk

Horizontal ScrollBar

hsb

ComboBox

cbo

Image

img

Command Button

cmd

Label

lbl

Common Dialog

cdl

Line

lin

Data Control

dat

ListBox

lst

Data Bound ComboBox

dbc

Menu

mnu

Data Bound Grid

dbg

OLE Container

ole

Data Bound ListBox

dbl

Option Button

opt

Directory ListBox

dir

Picture Box

pic

Drive ListBox

drv

Shape

shp

File ListBox



fil

TextBox

txt

Form

frm

Timer

tmr

Frame

fra

Vertical ScrollBar

vsb

Grid

grd

Retineti faptul ca numele pe care le atribuiti controalelor va fi utilizat in cod, asa ca evitati folosirea unor prescurtari fara sens.

Pentru a stabili valoarea proprietatii Name a unui obiect, se selecteaza obiectul, se afiseaza fereastra Properties (executand clic pe butonul Properties din bara instrumentelor Standard sau selectand comanda Properties Window din meniul View sau apasand tasta functionala F4), daca nu este deja pe ecran si apoi se executa clic pe proprietatea Name. Acum puteti tasta noua valoare.


Metode si evenimente

Utilizarea metodelor pentru executarea actiunilor

Pe langa proprietati, un obiect poate avea si metode, care definesc sarcinile pe care el le poate executa. Sarcinile pot fi simple, cum ar fi mutarea unui obiect intr-un alt loc sau pot fi complexe, cum ar fi actualizarea informatiilor dintr-o baza de date.

O metoda este in realitate o functie a programului care este continuta in obiect, adica este incapsulata. Folosind metodele acestuia nu mai este necesar sa transmiteti informatii suplimentare, pentru ca el sa execute sarcinile respective. Spre exemplu, formularele au o metoda numita PrintForm care se poate utiliza pentru a tipari formularul la imprimanta curenta. Instructiunea Form1.PrintForm va tipari un duplicat a formularului Form1. Deoarece, detaliile de nivel inferior pentru metoda PrintForm sunt incapsulate in obiectul formular, un programator Visual Basic nu are nevoie sa se concentreze asupra acestora.

Asa dupa cum ati presupus, metodele, la fel ca si proprietatile, folosesc notatia cu punct. Cand ati introdus codul, ati observat ca dupa tastarea numelui de obiect si a punctului, Visual Basic a afisat toate metodele si proprietatile acestuia (aceasta este facilitatea Auto List Member a mediului). Desi fiecare obiect are propriile sale metode, exista insa si cateva metode care sunt comune majoritatii obiectelor si anume:

Drag Gestioneaza operatia de "tragere si plasare" a obiectului in interiorul containerului

Move Modifica dispunerea unui obiect.

SetFocus          Transmite focus-ul controlului specificat.

Zorder Determina daca un obiect apare in fata sau in spatele altor obiecte din containerul sau.

Nota:   Focus-ul se refera la controlul curent care receptioneaza actiunile utilizatorului, cum ar fi apasarile de taste. La un moment dat, pe un formular un singur control poate avea focus-ul. In mod normal, focus-ul este indicat prin pozitionarea cursorului de editare (in cazul casetelor de text) sau printr-un dreptunghi punctat in jurul controlului (in cazul casetelor de validare, butoanelor de optiune si butoanelor de comanda).

Raspunsul la evenimente

Pe langa executarea sarcinilor, obiectele dintr-o aplicatie pot raspunde la actiunile generate de utilizator sau sistem. Aceste actiuni pot fi gestionate prin intermediul evenimentelor. Spre exemplu, cand utilizatorul executa clic pe un buton de comanda, el provoaca declansarea evenimentului Click a acelui control. Tot eveniment este si selectarea unui element dintr-o lista sau schimbarea continutului unei casete de text. De asemenea, evenimentele se produc si atunci cand utilizatorul inchide un formular sau trece intr-un alt formular.

Cand se produce un eveniment, obiectul poate executa procedura eveniment asociata  acelui eveniment. Pentru a raspunde la evenimente, puteti plasa cod program in procedurile eveniment ale obiectului.

Legatura dintre metode si prprietati

Pana acum, am vazut ca obiectele au proprietati care definesc aspectul lor, metode care le permit sa execute sarcini si evenimente care le permit sa raspunda la actiunile utilizatorilor. Este posibil sa credeti ca toate aceste lucruri se produc in mod independent, dar nu este intotdeauna adevarat. Uneori, proprietatile si metodele unui obiect au legatura intre ele. Adica, in timp ce invocati o metoda a unui obiect, anumite proprietati ale obiectului se modifica.

Nota:   Unele proprietati pot declansa evenimente. Spre exemplu, schimbarea prin cod a proprietatii Height sau Width a unui formular declanseaza evenimentul Resize.

Utilizarea metodei Move sau setarea proprietatilor Left sau Top ale unui control este un exemplu a interdependentei dintre metodele si proprietatile unui obiect.. Schimbarea pozitiei unui obiect se poate realiza fie folosind metoda Move fie setand noi valori pentru proprietatile Left si Top. Spre exemplu, urmatoarele doua segmente de cod rezolva aceeasi sarcina: modifica pozitia unei casete de text la 100 twips fata de latura din stanga si la 200 twips fata de latura de sus a containerului sau:

` Segmentul 1 - Mutarea casetei de text prin setarea proprietatilor

txtName.Left = 100

txtName.Top = 200

` Segmentul 2 - Mutarea casetei de text folosind metoda Move

txtName.Move 100, 200

Metoda Move mai are doua argumente suplimentare, care se pot folosi pentru a schimba dimensiunile obiectului, avand acelasi efect ca si setarea proprietatilor Height si Width pe noile valori.

In mod similar, metodele Show si Hide ale unui formular au acelasi efect ca si schimbarea proprietatii Visible. Cand invocati metoda Hide, efectul este acelasi ca si la setarea pe False a proprietatii Visible (adica, formularul dispare din ecran). In mod asemanator, metoda Show a formularului produce acelasi efect ca si setarea proprietatii Visible pe True.

Formulare

Pana-n prezent, majoritatea exemplelor noastre au folosit obiectul Form. Formularul este un container care pastreaza toate celelalte controale (cum ar fi etichete, casete de text, imagini etc.) ce alcatuiesc interfata utilizatorului. O aplicatie poate folosi mai multe formulare.

Nota:   Este posibil sa creati o aplicatie Visual Basic care sa nu contina formulare. Spre exemplu, un program care proceseaza fisiere si nu necesita o interfata utilizator.

Componentele formularului

Cand deschideti un nou proiect Standard EXE, vi se afiseaza un proiect prestabilit, care in mod normal include un singur formular standard (vezi figura 6, pag. 4) ce contine toate elementele pe care le asteptati sa le gasiti la o fereastra dintr-un program. Astfel, formularul contine o bara de titlu, un meniu de control si un set al butoanelor Minimize, Maximize/Restore si Close. De retinut ca multe dintre aceste elemente, cum ar fi butonul Close, sunt intotdeauna prezente pe timpul proiectarii, chiar daca proprietatile sunt setate in asa fel incat ele sa nu fie vizibile pe timpul executiei.

O alta facilitate care apare pe timpul proiectarii este o retea de puncte echidistante dispuse pe orizontala si verticala, numita si reteaua de proiectare, care va permite sa plasati mai usor controalele pe timpul proiectarii interfetei. Comportarea retelei de proiectare poate fi controlata prin intermediul casetei de dialog Options (accesibila prin selectarea comenzii Options din meniul Tools). Folosind controalele din grupul Form Grid Settings (din eticheta General a casetei de dialog, vezi figura 8) puteti modifica distanta dintre punctele retelei (casetele de text Width si Height) si chiar anula afisarea retelei (caseta de validare Show Grid). De asemenea, puteti stabili daca controalele sunt sau nu aliniate automat la retea (caseta de validare Align Controls to Grid). Daca optiunea este activata (setare prestabilita), coltul din stanga-sus al fiecarui control este aliniat la punctul retelei ce corespunde exact coltului. O aliniere mai buna a controalelor trasate pe un formular se poate asigura tastand valori mai mici in casetele de text Height si Width ale retelei (spre exemplu, 60 si 60).


Proprietatile formularului

Formularele, la fel ca majoritatea obiectelor folosite in Visual Basic, au o serie de proprietati care controleaza aspectul si comportarea lor. In tabelul urmator sunt prezentate pe scurt principalele proprietati ale formularului. De asemenea, in tabel se specifica daca proprietatea poate fi modificata sau nu pe timpul rularii aplicatiei.

Nume

Proprietate

Descriere

Modificabila

la executie

BorderStyle

Stabileste tipul de bordura ce se foloseste pentru formular

Nu

ControlBox

Determina daca la rulare in bara de titlu a formularului apare sau nu pictograma meniului de control.

Nu

Font

Determina fontul folosit la afisarea textului pe formular.

Da

Icon

Determina pictograma care este afisata in bara de titlu a formularului si care apare atunci cand formularul este minimizat.

Da

MaxButton

Determina daca la rulare formularul are butonul Maximize

Nu

MDIChild

Determina daca formularul este un formular "copil" intr-o aplicatie MDI.

Nu

MinButton

Determina daca la rulare formularul are butonul Minimize

Nu

StartUp Position

Determina pozitia initiala a formularului cand este prima data afisat.

Da

WindowState

Determina daca formularul este afisat maximizat, minimizat sau in starea lui normala.

Da

In continuare se vor detalia cateva dintre aceste proprietati.

Proprietatea BorderStyle

Proprietatea BorderStyle are sase valori posibile (vezi tabelul urmator) care controleaza tipul bordurii formularului. Aceste valori determina daca formularul este redimensionabil prin tragerea bordurilor, controleaza butoanele care apar si inaltimea barei de titlu. In figura 8 este prezentat acelasi formular dar avand valori diferite pentru proprietatea BorderStyle.


Valoare

Efect

0 - None

Formularul nu are borduri, bara de titlu si nici un buton de control.

1 - Fixed Single

Se foloseste o bordura cu o singura linie. Formularul are bara de titlu si butonul Close. Nu poate fi redimensionat de catre utilizator.

2 - Sizable border

Este valoarea prestabilita. Formularul are bordura, bara de titlu si butoanele de control. Poate fi redimensionat de catre utilizator.

3 - Fixed Dialog

Formularul are bordura, bara de titlu si butonul Close. Nu poate fi redimensionat de catre utilizator. Se comporta ca o caseta de dialog standard.

4 - Fixed ToolWindow

Formularul are o bordura cu o singura linie si afiseaza doar bara de titlu si butonul Close. Aceste elemente sunt afisate cu o marime redusa a fontului (aproximativ jumatate din inaltime). Nu poate fi redimensionat de catre utilizator.

5 - Sizable ToolWindow

Se deosebeste fata de valoarea Fixed ToolWindow prin faptul ca are o bordura redimensionabila..

Nota:   Setarea proprietatii BorderStyle pe o valoare care interzice redimensionarea nu afecteaza aspectul formularului in mediul de proiectare; aceasta are efect doar pe timpul rularii.

Setarea prestabilita (2 - Sizable border) asigura o bordura ce permite utilizatorului sa redimensioneze formularul pe timpul rularii. Acesta este tipul de formular cel mai des utilizat. Totusi, puteti modifica setarea proprietatii BorderStyle pentru a face ca formularul sa arate aproape la fel cu orice tip de fereastra pe care ati vazut-o in programele folosite, inclusiv ca o caseta de dialog sau ca o bara cu instrumente. Dupa cum se poate vedea si din figura 8, puteti chiar elimina bordura.



Din tabelul anterior a rezultat ca anumite valori ale proprietatii BorderStyle indica daca in bara de titlu a formularului se afiseaza pictograma meniului de control si butoanele Close, Minimize si Maximize. Aceasta este comportarea prestabilita. Dar, folosind proprietatile ControlBox, MaxButton si MinButton, puteti controla in mod individual daca aceste elemente apar sau nu pe formular. Aceste proprietati pot avea valoarea True (afisare) sau False; valoarea prestabilita a acestor proprietati este True si ele pot fi modificate numai pe timpul proiectarii.

Proprietatea Font

Proprietatea Font va permite sa stabiliti fontul de baza si atributele acestuia pentru orice text afisat direct pe formular prin utilizarea metodei Print a formularului.

Nota:   Proprietatea Font a unui formular este in realitate un obiect cu propriile sale proprietati. Spre exemplu, pentru a modifica marimea fontului unui formular, numit Form1, puteti introduce linia de cod Form1.Font.Size = 12 in fereastra Code (sau in fereastra Immediate, pentru testare) pentru a schimba marimea acestuia la 12 puncte.

In plus, setarea proprietatii Font a formularului va stabili si fontul pentru toate controalele adaugate in continuare pe formular.

Observatii

* Proprietatea Font a formularului nu are efect asupra titlului formularului; ea afecteaza doar textul din zona interna a acestuia. Fontul pentru titlul unei ferestre este controlat de catre sistemul Windows.

* Pentru ca textul afisat pe formular folosind metoda Print a acestuia sa fie vizibil este necesar ca proprietatea AutoRedraw a formularului sa fie setata pe True sau sa folositi metoda Refresh in cazul cand textul a fost sters ca urmare a plasarii unui alt formular deasupra acestuia.

Proprietatea StartupPosition

Proprietatea StartupPosition defineste pozitia in care apare formularul atunci cand este prima data afisat. In tabelul urmator sunt prezentate valorile posibile pentru aceasta proprietate.

Valoare

Efect

0 - Manual

Pozitia initiala este stabilita de valorile proprietatilor Top si Left ale formularului.

1 - CenterOwner

Formularul este centrat in desktop-ul Windows in afara cazului cand acesta este un formular "copil" MDI, caz in care este centrat in fereastra "parinte".

2 - CenterScreen

Formularul este centrat in desktop-ul Windows.

3 - Windows Default

Formularul este plasat intr-o pozitie determinata de catre Windows pe baza numarului si a pozitiei celorlalte ferestre deschise in acelasi timp.

Proprietatea StartupPosition poate centra formularul atunci cand este incarcat pentru prima data, insa nu pastreaza formularul centrat. Spre exemplu, daca redimensionati formularul, acesta poate sa nu mai ramana centrat. Daca vreti ca formularul sa ramana centrat si dupa redimensionare, este necesar sa scrieti cod pentru rezolvarea acestei sarcini. Codul prezentat in continuare trebuie plasat in procedura evenimentului Resize a formularului:

If Me.Height >= Screen.Height Then

Me.Top = 0

Else

Me.Top = (Screen.Height - Me.Height) / 2

End If

If Me.Width >= Screen.Width Then

Me.Left = 0

Else

Me.Left = (Screen.Width - Me.Width) / 2

End If

Remarcati faptul ca in codul precedent s-a folosit cuvantul cheie Me in locul unui nume de formular (cum ar fi Form1). Atunci cand este folosit intr-un cod al formularului, Me reprezinta formularul insasi, fara a mai fi nevoie de o referire la numele acestuia. Aceasta inseamna ca, acelasi bloc de cod poate fi inserat in diferite formulare fara a nici o modificare. De asemenea, chiar daca un formular este redenumit, Me asigura ca schimbarea numelui sa nu afecteze procedurile care actioneaza pe formular.

Afisarea unui formular

Daca scrieti un program care are doar un singur formular, nu trebuie sa va faceti probleme cu afisarea sau ascunderea lui. Aceasta sarcina este automat rezolvata la lansarea si terminarea programului. Acest formular singular este cunoscut sub numele de Startup Object (obiect de lansare) sau Startup Form (formular de lansare). Cand rulati programul, Visual Basic incarca formularul de lansare in memorie si il afiseaza. Cand executati clic pe butonul Close al formularului sau cand se executa instructiunea End, programul se opreste.

Nota:   Formularul de lansare poate fi selectat in caseta de dialog Project Properties. De asemenea, un program fi lansat in executie printr-o procedura Sub numita Main aflata in modul de cod, in loc sa fie lansat printr-un formular.

Totusi, daca aveti mai multe formulare - caz intalnit foarte des in aplicatii - este necesar sa intelegeti cum le puteti manipula. Starea unui formular este controlata prin doua instructiuni Visual Basic: Load si Unload, precum si prin doaua metode ale formularului: Hide si Show.

Instructiunea Load plaseaza formularul indicat in memorie, dar nu-l afiseaza. Modul de utilizare al acestei instructiuni este:

Load frmMember

Prin utilizarea acesteia, ati incarcat in mod explicit formularul. Totusi, formularul este incarcat automat daca accesati una dintre proprietatile, metodele sau evenimentele acestuia.

Deoarece operatia de incarcare este executata automat, in realitate nu este necesar sa folositi instructiunea Load cu un formular. Totusi, este important sa stiti cand un formular este incarcat, deoarece codul din procedura evenimentului Load (Form_Load) va fi executat doar la incarcarea formularului in memorie.

Pentru a afisa un formular, trebuie sa folositi metoda Show. Metoda Show lucreaza indiferent daca formularul a fost incarcat anterior in memorie sau nu. Daca formularul nu a fost incarcat, atunci metoda Show incarca in mod implicit formularul si apoi il afiseaza. Metoda Show se foloseste astfel:

frmMember.Show

Metoda Show are si doua argumente optionale, care determina daca formularul este un formular modal sau modeless. Daca un formular este afisat in stil modal, atunci nici-un alt formular sau cod din afara formularului respectiv nu se va executa decat dupa ce formularul modal a fost inchis. Un exemplu de formular modal este ecranul Shut Down din Windows 98. Nu puteti pune focus-ul pe o alta fereastra cat timp este afisat formularul Shut Down Windows.

Daca un formular este afisat in stil modeless, puteti muta focus-ul din formularul curent pe alte formulare din program. Instructiunea precedenta afiseaza un formular in stil modeless. Pentru afisa un formular in stil modal, se foloseste constanta vbModal:

frmMember.Show vbModal

Nota:   In mod normal, un formular modal este utilizat atunci cand vreti ca utilizatorul sa termine actiunile pe formularul respectiv inainte de a lucra in orice alta parte a programului.

Dupa ce un formular este afisat exista doua posibilitati de a scapa de el:

Metoda Hide elimina formularul din ecran dar nu si din memorie. Aceasta metoda se va folosi atunci cand este necesara eliminarea sa temporara, dar informatiile din el mai sunt inca necesare. Spre exemplu, urmatoarea linie de cod elimina din ecran formularul frmMember:

frmMember.Hide

Daca ati terminat cu un formular si cu informatia continuta in el, puteti folosi instructiunea Unload pentr a-l elimina atat din ecran cat si din memorie. Sintaxa instructiunii Unload este aceeasi ca si in cazul instructiunii Load. Spre exemplu, urmatoarea linie de cod elimina din ecran si din memorie formularul frmMember:

Unload frmMember

Sugestie Deaorece metoda Show incarca in mod automat un formular in memorie, in mod normal nu este necesar sa folositi peste tot in program instructiunea Load. Totusi, unele formulare care au foarte multe controale se vor afisa mai incet atunci cand se foloseste metoda Show. Una dintre metodele de marire a vitezei este incarcarea formularului in memorie, folosind instructiunea Load la inceputul rularii programului. Avand formularul deja in memorie, metodele Hide si Show folosite in continuare, pot sa se execute mult mai rapid. Daca folositi acest truc, aveti in vedere doua lucruri. Primul, sa nu utitati sa descarcati formularul la terminarea programului. Al doilea, sa cunoasteti limitarile posibile ale memoriei.

Tratarea evenimentelor

Cea mai buna solutie pentru a intelege cum lucreaza in realitate obiectul Form este de a avea o imagine asupra succesiunii producerii evenimentelor. Figura urmatoare prezinta succesiunea prodecerii evenimentelor formularului.


Figura 9. Succesiunea producerii evenimentelor formularului.

Datarita faptului ca firmularul are multe evenimente, in contunuare sunt prezentate doar cele mai utilizate.

Evenimentul Initialize

Primul eveniment din viata oricarui formular este evenimentul Initialize. Acest eveniment eveniment se declanseaza de indata ce in cod va referiti la numele formularului, chiar inainte ca Visual Basic sa creeze fereastra reala si controalele de pe suprafata acesteia. In mod normal, in acest eveniment scrieti cod pentru initializarea corecta a variabilelor formularului:

Public NumeClient As String

Public ClientNou As Boolean

Private Sub Form_Initialize()

NumeClient = '' ' In realitate, nu este necesara.

ClientNou = True ' Necesara. Variabilele booleene sunt

' initializate cu valoarea False.

End Sub

Cand un formular este initializat, variabilelor de nivel modul ale acestuia (NumeClient si ClientNou, din exemplul precedent) li se atribuie valorile lor prestabilite. Astfel incat nu este strict necesar sa atribuiti o valoare unei variabile saca valoarea este 0 sau sirul nul. In codul anterior, de exemplu, nu este necesara initializarea variabilei NumeClient, dar este posibil sa vreti s-o faceti pentru o mai buna lizibilitate..

Evenimentul Load

Ce se intampla dupa evenimentul Initialize depinde de modul in care in cod referiti formularul. Daca referiti numai una dintre variabilele sale publice (sau, mai corect, proprietatile Public ale acestuia), ca in urmatorul cod,

frmClient.NumeClient = 'Ionescu Ion'

nu se intampla nimic alceva si fluxul executiei este inapoiat apelantului. Codul este acum capabil sa seteze variabila/proprietatea NumeClient la noua valoare, deoarece intre timp Visual Basic a creat o noua instanta a obiectului frmClient. Cu alte cuvinte, daca, codul vostru a referentiat o proprietate proprie formularului sau unul dintre controalele de pe insasi formularul, Visual Basic nu poate termina operatia cat timp creaza fereastra si controalele copil ale acesteia. Cand acest pas este terminat, se produce un eveniment Load:

Private Sub Form_Load()

' Puteti initializa controalele copil.

txtNume.Text = NumeClient

If ClientNou Then chkClientNou.Value = vbChecked

End Sub

In acest moment, formularul nu este inca vizibil. Aceasta implica faptul ca daca executati comenzi grafice in Visual Basic - inclusiv o comanda Print, care este considerata o comanda grafica in Visual Basic - nu puteti vedea nimic. De asemenea, in timp ce puteti citi si modifica in mod liber cele mai multe dintre proprietatile controalelor, trebuie sa evitati orice operatii ce nu se pot executa asupra controalelor invizibile. De exemplu, nu puteti invoca o metoda SetFocus pentru a muta focus-ul pe un anumit control.

Incarcarea unui formular nu inseamna neaparat ca el devine vizibil. Un formular devine vizibil numai daca invocati metoda Show a acestuia sa daca formularul este formularul de lansare al aplicatiei. Puteti sa decideti incarcarea unui formular, dar sa-l pastrati ascuns pana cand setati unele proprietati ale acestuia, ca in codul urmator:

' Metoda Load este optionala: Visual Basic incarca formularul

' cand referiti formularul sau unul dintre controalele acestuia.

Load frmClient

' Atribuirea directa a proprietatii unui control.

' (Nu se recomanda, dar acest cod este doar un exemplu)

frmClient.txtNotes.Text = gloClientNotes

frmClient.Show

Referirea directa la un control al formularului din afara formularului insasi, ca in exemplul de cod anterior, este considerata o tehnica de programare gresita. In capitolul 9 se va prezenta initializarea corecta a proprietatilor controalelor.

Evenimentul Resize

Cu o clipa inainte ca formularul sa devina vizibil, Visual Basic declanseaza un eveniment Resize. De regula, veti folosi acest eveniment pentru a rearanja controalele pe formular astfel incat ele sa incapa in spatiul disponibil de pe suprafata formularului. De exemplu, este posibil sa vreti sa extindeti controlul txtClient pana la marginea din dreapta, iar controlul multilinie txtNotex sa-l extindeti pana la marginea din dreapta si de jos a formularului:

Private Sub Form_Resize()

txtClient.Width = ScaleWidth - txtClient.Left

txtNotes.Width = ScaleWidth - txtNotes.Left

txtNotes.Height = ScaleHeight - txtNotes.Top

End Sub

De asemenea, evenimentul Resize se produce cand utilizatorul redimensioneaza manual formularul si cand prin program alterati marimea formularului.

Evenimentul Activate

Imediat dupa primul eveniment Resize vine evenimentul Activate. De asemenea, acest eveniment se produce si cand formularul devine formularul activ din aplicatia curenta, dar si daca acesta pierde si apoi reprimeste focus-ul ca urmare a faptului ca utilizatorul a comutat de pe o alta aplicatie. Evenimentul Activate este de cele mai multe ori util cand aveti nevoie sa actualizati continutul formularului cu datele care probabil au fost modificate intr-un alt formular. Cand focus-ul revine la formularul curent, voi reimprospatati campurile acestuia:

Private Sub Form_Activate()

' Reimprospatarea informatiei afisate din variabilele globale.

txtTotalComenzi.Text = gloTotalComenzi


End Sub

Evenimentul Paint

Un alt eveniment ce se poate produce inainte ca formularul sa devina complet functional este evenimentul Paint. Acest eveniment nu se va produce daca proprietatea AutoRedraw a formularului este setata pe True. Intr-o procedura a evenimentului Paint, va ganditi sa redesenati continutul formularului folosind metodele grafice, cum ar Print, Line, Circle, Point, Cls etc. In continuare este prezentat un exemplu de trasare a unei tinte circulare colorate (vezi fig. 10):

Private Sub Form_Paint()

Dim r As Single, initR As Single

Dim x As Single, y As Single, qbc As Integer

Cls ' Se sterge suprafata formularului.

x = ScaleWidth / 2: y = ScaleHeight / 2 ' Centrul tuturor cercurilor

' Raza initiala este cea mai mica dintre cele doua valori.

If x < y Then initR = x Else initR = y

FillStyle = vbFSSolid' Cercurile sunt umplute.

' Trasarea cercurilor, de la exterior catre interior.

For r = initR To 1 Step -(initR / 16)

' Folosirea unei culori diferite pentru fiecare cerc.

FillColor = QBColor(qbc)

qbc = qbc + 1

Circle (x, y), r

Next

FillStyle = vbFSTransparent ' Se revine la stilul de umplere normal.

End Sub

Text Box: 
Figura 10. Tinta circulara colorata diferit.




Procedura evenimentului Paint se executa daca formularul necesita reimprospatare - de exemplu, inchide sau muta o fereastra care acopera partial sau total formularul. De asemenea, evenimentul Paint se produce si atunci cand utilizatorul redimensioneaza formularul si descopera noi zone. Insa acesta nu se produce daca utilizatorul micsoreaza formularul. Pentru a termina exemplu de mai sus, probabil ca veti dori sa fortati producerea evenimentului Paint din interiorul evenimentului Resize, astfel incat cercurile concentrice sa fie intodeauna in centrul formularului:

Private Sub Form_Resize()

Refresh

End Sub

Atentie Programatorii incepatori sunt tentati sa forteze producerea unui eveniment Paint prin apelarea manuala a procedurii Form_Paint. Acest lucru nu este indicat. Cea mai corecta si eficienta metoda de redesenare a unei ferestre este sa executati metoda Refresh a acesteia si sa lasati Visual Basic sa decida momentul cel mai potrivit sa o faca. Mai mult, daca inlocuiti metoda Refresh cu un apel direct la procedura Form_Paint, in unelr cazuri rezultatul este ca procedura evenimentului Paint se va executa de doua ori!

Dupa primul eveniment Paint - sau imediat dupa evenimentul Activate, daca proprietatea AutoRedraw este setata pe True - formularul este gata sa accepte introducerile utilizatorului. Daca formularul nu contine controale sau daca nici unul dintre controalele acestuie nu poate receptiona focus-ul de introducere, insasi formularul receptioneaza un eveniment GotFocus. Totusi, foare rar veti scrie cod in evenimentul GotFocus a formularului, deoarce in locul lui puteti folosi intotdeauna evenimentul Activate.

Evenimentul Deactivate

Asa cum am mentionat anterior, cand comutati pe un alt formular din aplicatia voastra, formularul receptioneaza un eveniment Deactivate si un alt eveniment Activate atunci cand acesta reprimeste focus-ul. Aceeasi succesiune se produce si daca faceti temporar un formular invizibil prin setarea pe False a proprietatii Visible a acestuia sau prin invocarea metodei Hide a acestuia.

Evenimentul QueryUnload

Cand formularul este gata sa fie descarcat, obiectul formularului receptioneaza un eveniment QueryUnload. Puteti invata ce este descarcarea unui formular prin examinarea parametrului UnloadMode. In continuare se prezinta o schita a codului, care poate fi refolosit in aplicatiile voastre daca este necesar:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Select Case UnloadMode

Case vbFormControlMenu' = 0

' Formularul este inchis de catre utilizator.

Case vbFormCode ' = 1

' Formularul este inchis prin cod.

Case vbAppWindows ' = 2

' Sesiunea Windows curenta este terminata.

Case vbAppTaskManager ' = 3

' Task Manager inchide aceasta aplicatie.

Case vbFormMDIForm ' = 4

' Parintele MDI inchide acest formular.

Case vbFormOwner' = 5

' Formularul propriu este inchis.

End Select

End Sub

Puteti refuza descarcarea prin setarea pe True a parametrului Cancel, ca in urmatorul cod:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

' Nu se permite ca utilizatorul sa inchida acest formular.

Select Case UnloadMode

Case vbFormControlMenu, vbAppTaskManager

Cancel = True

End Select

End Sub

Evenimentul Unload

Daca nu anulati operatia de descarcare, Visual Basic declanseaza evenimentul Unload si va ofera o ultima sansa pentru a preveni inchiderea formularului. In majoritatea cazurilor, este indicat sa avertizati utilizatorul ca datele trevuie sa fie salvate:

Dim Saved As Boolean ' Aceasta este o variabila de nivel modul.

Private Sub Form_Unload(Cancel As Integer)

If Not Saved Then

MsgBox 'Va rog, slavati mai intai datele!'

Cancel = True

End If

End Sub

In afara cazului cand anulati cererea, cand se termina procedura evenimentului Unload, Visual Basic distruge toate controalele si apoi descarca formularul si elibereaza toate resursele sistemului Windows alocate pe timpul incarcarii. In functie de modul de invocare a formularului, aceasta poate provoca evenimentul Terminate a formularului, care este locul unde puteti scrie codul de curatare, inchide fisierele etc.

Atentie Cand se produce evenimentul Terminate, obiectul formularului este deja eliminat si deci in cod nu puteti face o referire la el sau la controalele acestuia. Daca in mod accidental faceti acest lucru, nu se produce nici o eroare. In schimb, Visual Basic creaza o noua instanta a obiectului formularului, care in mod mutual ramane ascuns in memorie, consumand astfel inutil o cantitate din resursele sistemului.

Colectia Controls

Formularele dispun de o proprietate speciala, colecta Controls, care contine toate controalele ce sunt in mod curent incarcate pe insasi formularul. Aceasta colectie va permite de multe ori sa fluidizati codul din modulele de formular si reprezinta cheia unor tehnici de programare ce nu sunt posibile altfel. De exemplu, sa vedem cat de simplu este stergerea tuturor controalelor TextBox si ComboBox din formular folosind doar patru linii de cod:

On Error Resume Next

For i = 0 To Controls.Count - 1

Controls(i).Text = ''

Next

Detectarea erorii este necesara aici deoarece trebuie sa parcurgeti si controalele de pe formular care nu suporta proprietatea Text. De exemplu, colectia Controls include, de asemenea, si toate elementele de meniu care nu au proprietatea Text.

In continuare este prezentata o metoda alternativa de ciclare a tuturor controalelor din colectie, folosind un obiect generic Control si o instructiune For Each.Next:

Dim ctrl As Control ' Declararea unei instante a obiectului Control.

On Error Resume Next

For Each ctrl In Controls

ctrl.Text = ''

Next

Ambele fragmente de cod lucreaza cu orice numar de controale de pe un formular, si dea semenea ele lucreaza si daca le taiati si le lipiti in alt modul de formular. Tavantajul colectiei Controls consta in faptul ca face posibila crearea unor rutine generice, ce nu pot fi scrise prin nici o alta metoda.

Obiectul Screen

Formularele Visual Basic exista pe ecranul calculatorului dumneavoastra. Chiar daca planificati sa folositi numai o portiune din domeniul ecranului pentru aplicatia voastra, in foarte multe cazuri este necesar sa cunoasteti mai multe despre ceea ce este in jur. In acest scop, Visual Basic va furnizeaza obiectul Screen, un obiect global care corespunde desktop-ului vizibil.

Proprietatile Left, Top, Width si Height ale formularului sunt exprimate in twips. Twip-ul este o unitate de masura care poate fi folosita atat pentru ecran cat si pentru imprimanta. Pe imprimanta, 1 inch corespunde la 1440 twips; pe ecran, aceasta depinde de dimensiunea monitorului si de rezolutia curenta a placii video. Puteti gasi dimensiunea curenta a ecranului, in twips, prin intermediul proprietatilor Width si Height ale obiectului Screen. Apoi, aceste puteti utiliza valorile acestor proprietati; de exemplu, puteti muta formularul curent in coltul din dreapta-jos a monitorului folosind urmatoarea linie de cod:

Move Screen.Width - Width, Screen.Height - Height

Desi nu puteti obtine valorile proprietatilor obiectului Screen in unitati diferite de twips, puteti converti usor aceste valori in pixeli folosind proprietatile TwipsPerPixelX si TwipsPerPixelY ale obiectului Screen:

' Evaluarea latimii si inaltimii ecranului in pixeli.

scrWidth = Screen.Width / Screen.TwipsPerPixelX

scrHeight = Screen.Height / Screen.TwipsPerPixelY

' Micsorarea formularului curent cu 10 pixeli pe axa x

' si cu 20 pixeli pe axa y.

Move Left, Top, Width - 10 * Screen.TwipPerPixelX, _

Height - 20 * Screen.TwipsPerPixelY

De asemenea, obiectul Screen va permite sa enumerati toate fonturile disponibile pentru ecran prin utilizarea proprietatilor Font si FontCount ale acestuia:

' Incarcarea tuturor numelor fonturilor ecranului intr-o lista.

Dim i As Integer

For i = 0 To Screen.FontCount - 1

lstFonts.AddItem Screen.Fonts(i)

Next

Obiectul Screen are numai doua proprietati ce pot fi scrise MousePointer si MouseIcon. Puteti modifica indicatorul mouse-ului folosind urmatoarea instructiune:

Screen.MousePointer = vbHourglass

O valoare atribuita acestei proprietati afecteaza in realitate numai aplicatia curenta. Daca mutati indicatorul mouse-ului pe desktop sau intr-o fereastra apartinand unei alte aplicatii, este restaurat indicatorul original al mouse-ului. De asemenea acest concep se aplica si altor proprietati ActiveForm si ActiveControl ale obiectului Screen. Proprietatea ActiveForm este o proprietate ce poate fi numai citita si returneaza o referinta la formularul activ din aplicatia curenta; proprietatea ActiveControl returneaza o referinta la controlul care are focus-ul de pe formularul activ. Deseori, puteti folosi impreuna aceste proprietati:

' Daca formularul curent este frmClient, se sterge controlul ce are focus-ul.

' On Error este necesar deoarece nu puteti fi siguri ca acesta suporta

' proprietatea Text sau daca exista in realitate un control activ.

On Error Resume Next

If Screen.ActiveForm.Name = 'frmClient' Then

Screen.ActiveControl.Text = ''

End If

Un formular poate fi formular activ chiar daca nu are focus-ul de introducere. Daca comutati pe o alta aplicatie, obiectul Screen continua sa retuneze o referinta la ultimul formular activ din aplicatia voastra. Tineti minte intotdeauna ca obiectul Screen nu poate fi vazut dincolo de limitele aplicatiei curente. In ceea ce priveste aplicatia, aplicatia curenta este numai aplicatia care se ruleaza pe sistem. Acesta este genul de axioma din programarea Win32: Nici o aplicatie nu poate sa cunoasca ceva despre sau afecteze intr-un mod oarecare, celelalte aplicatii ce se ruleaza pe sistem.

Tiparirea textului

In majoritatea aplicatiilor Visual Basic, nu afisati in mod direct text pe suprafata formularului. In schimb, folositi in mod normal controalele Label sau afisati mesajele in contraole PictureBox. Dar intelegerea modului de afisare al textului intr-un formular poate sa va ajute in foarte multe situatii deoarece aceasta dezvalue modul in care Visual Basic trateaza textul in general. Mai mult orice se va spune aici despre comenzile si proprietatile grafice ale formularului se aplica si la controalele PictureBox.

Cea mai importanta metoda grafica pentru prezentarea textului esste metoda Print. Aceasta comanda a facut parte din limbajul Basic al versiunilor anterioare si a supravetuit fara modificari majore pana la Visual Basic. Deoarece vechile programe MS-DOS scrise in Basic au folosit din plin aceasta comanda pentru crearea interfetelor utilizatorilor, a fost important pentru Visual Basic sa suporte aceasta comanda. Deoarece programarea Visual Basic moderna nu trateaza aceasta comanda nicaieri, in continuare se vor prezenta numai facilitatile de baza ale acesteia.

Nota Nu cautati metoda Print in Object Browser pentru ca nu o veti gasi. Natura hibrida a a acestei comenzi si sintaxa intortochiata a ei - ganditi-va doar la multitudinea separatorilor pe care-i puteti folosi intr-o instructiune Print, cum ar fi virgula, punctul si virgula si functiile Tab() - au impiedicat inginerii de la Microsoft sa o includa in limbajul Visual Basic. In schimb, metoda Print este direct implementata in limbaj pe timpul executiei,.

De cele mai multe ori folositi metoda Print pentru o iesire rapida pe zona unui formular client. De exemplu, puteti puteti prezenta marimea si pozitia formularului curent folosind urmatorul cod:

Private Sub Form_Resize()

Cls ' Reseteaza pozitia de tiparire la (0,0)

Print 'Stanga = ' & Left & vbTab & 'Sus = ' & Top

Print 'Latime = ' & Width & vbTab & 'Inaltime = ' & Height

End Sub

Sugestie Puteti folosi caracterul ; (punct si virgula) in locul operatorului & si caracterul , (virgula) in locul constantei vbTab.

Iesirea folosind metoda Print este afectata de valorile curente ale proprietatilor Font si ForeColor. In mod prestabilit, proprietatea BackColor nu afecteaza comanda Print pentru ca, in mod normal, textul este tiparit ca si cand ar avea un fundal transparent. De cele mai multe ori, aceasta situatie nu cauzeaza probleme pentru ca de cele mai multe ori tipariti pe suprafata curata a unui formular. Dar daca vreti sa tipariti un mesaj si in acelasi timp sa stergeti mesajul anterior din aceeasi pozitie, puteti face acest lucru setand proprietatea FontTransparent pe valoarea False. In caz contrar, veti pune mesajele unul peste celalalt, facand-le astfel ilizibile.

In mod normal, fiecare comanda Print reseteaza coordonata x a pozitie grafice curente pe 0 si avanseaza coordonata y astfel incat sirul urmator este afisat imediat sub cel anterior. Locul in care urmatoarea comanda Print va afisa iesirea ei poate fi cunoscut prin citirea proprietatilor CurrentX si CurrentY ale formularului. In conditii normale, punctul (0, 0) reprezinta coltul din stanga-sus din zona client (aceasta este, portiunea din interiorul formularului aflata sub bara de titlu a acestuia). Coordonatele x cresc de la stanga spre dreapta, iar coordonatele y cresc de sus in jos. Puteti modifica aceste proprietati pentru a tipari oriunde pe formularul vostru:

' Prezentarea unui mesaj centrat (mai mult sau mai putin) pe formular.

CurrentX = ScaleWidth / 2

CurrentY = ScaleHeight / 2

Print 'Eu sunt aici!'

Totusi, acest cod nu centreaza in realitate mesajul pe ecran; este centrat numai punctul initial de afisare. Pentru a centra in mod precis mesajul pe ecran, trebuie sa se tina cont si de lungimea mesajului, lucru ce se poate realiza folosind metodele TextHeight si TextWidth ale formularului:

msg = 'Sunt aici, in centrul formularului.'

CurrentX = (ScaleWidth - TextWidth(msg)) / 2

CurrentY = (ScaleHeight - TextHeight(msg)) / 2

Print msg

Deseori veti folosi metodele TextWidth si TextHeight pentru a vedea daca un mesaj poate sa incapa intr-o zona data. Aceasta strategie este utila in special cand tipariti pe formular, deoarece metoda Print nu trece automat la linie noua in cazul liniilor lungi. Pentru a vedea cum puteti remedia aceasta deficienta, adaugati urmatorul cod intr-un formular gol, rulati programul si redimensionati formularul. In fig. 11 sunt prezentate doua rezultate obtinute prin redimensionarea formularului.

' O rutina pentru formatarea iesirii metodei Print

Private Sub Form_Paint()

Dim msg As String, pos As Long, spacePos As Long

msg = 'Deseori folositi metodele TextWidth si TextHeight ' _

& 'pentru a testa daca un mesaj poate sa incapa intr-o zona data. ' _

& vbCrLf & ' Aceasta este utila in special cand tipariti ' _

& 'pe un formular, deoarece metoda Print nu asigura ' _

& 'trecerea automata la linie noua in cazul liniilor lungi si ' _

& 'trebuie sa rezolvati problema prin intermediul codului.'

Cls

Do While pos < Len(msg)

pos = pos + 1

If Mid$(msg, pos, 2) = vbCrLf Then

' Perechea CR-LF, tipareste sirul si reseteaza variabilele.

Print Left$(msg, pos - 1)

msg = LTrim$(Mid$(msg, pos + 2))

pos = 0: spacePos = 0

ElseIf Mid$(msg, pos, 1) = ' ' Then

spacePos = pos ' Memoreaza pozitia spatiului pentru mai tarziu.

End If

' Testarea lungimii mesajului.

If TextWidth(Left$(msg, pos)) > ScaleWidth Then

' Mesajul este prea lung, deci este divizat.

' Daca este chiar pe un spatiu, se divizeaza acolo.

If spacePos Then pos = spacePos

' Tiprirea mesajului pana la punctul de divizare.

Print Left$(msg, pos - 1)

' Resetarea variabilelor.

msg = LTrim$(Mid$(msg, pos))

pos = 0: spacePos = 0

End If

Loop

If Len(msg) Then Print msg ' Tirirea caracterelor ramase, daca exista

End Sub

Private Sub Form_Resize()

Refresh

End Sub

Codul anterior lucreaza corect cu orice font. Ca un exercitiu, puteti incerca construirea unei rutine generale care sa accepte orice sir de caractere si orice referinta de formular astfel incat s-o puteti reutiliza in aplicatiile voastre atunci cand este necesar.

O alta problema pe care s-ar putea sa fiti nevoiti s-o rezolvati este determinarea marimii optime a fontului pentru un mesaj astfel incat acesta sa incapa intr-o zona data. Deoarece nu puteti cunoaste cu certitudine care sunt dimensiunile acceptate de fontul curent, va trebui sa folositi un ciclu For.Next pentru a gasi dimensiunea optima. Urmatoarea secventa de cod creaza un ceas digital, pe care il puteti mari si micsora dupa dorinta. Ceasul este actualizat folosind un control Timer, care este ascuns pe timpul executiei:

Private Sub Form_Resize()

Dim msg As String, size As Integer

msg = Time$

For size = 200 To 8 Step -2

Font.Size = size

If TextWidth(msg) <= ScaleWidth And _

TextHeight(msg) <= ScaleHeight Then

Exit For ' S-a gasit dimensiunea optima a fontului.

End If

Next

Timer1.Enabled = True ' Activarea controlului Timer.

Timer1.Interval = 1000

End Sub

Private Sub Timer1_Timer()

' Tipareste timpul folosind setarile curente ale fontului.

Cls

Print Time$

End Sub