visual basic

80
3.1. PROIECTAREA UNEI FORME (FORMULAR) Formele (formularele) constituie elementul de la care se începe construirea unei interfeţe în Visual Basic, constituind practic ferestrele prin intermediul cărora utilizatorul va interacţiona cu aplicaţia. Formele posedă propriile proprietăţi, evenimente şi metode cu ajutorul cărora putem controla modul de afişare şi comportamentul. Primul pas în proiectarea unei forme este să-i stabilim proprietăţile. Majoritatea proprietăţilor formei influenţează modul de afişare. Proprietatea Text stabileşte titlul care va fi afişat în bara de titlu a formei; proprietatea Icon stabileşte iconiţa pentru formă; proprietatea MaximizeBox şi MinimizeBox stabilesc dacă forma poate să fie maximizată sau minimizată. Proprietăţile Height şi Width stabilesc dimensiunile iniţiale ale formei; proprietatea WindowState stabileşte modul în care se va afişa forma la început: minimizată, maximizată sau normală; proprietatea Name stabileşte un identificator cu ajutorul căruia putem referi forma respectivă. Observaţie: În mod implicit VB le numeşte Form1, Form2, etc. Este recomandat să schimbăm aceste denumiri cu unele mai familiare şi mai uşor de reţinut. Cel mai bun mod de a ne familiariza cu proprietăţile este să le experimentăm. Schimbaţi pe rând diferite proprietăţi şi executaţi aplicaţia ca să vedeţi efectul. Ca orice obiect forma (formularul) poate executa diverse operaţii (metode) şi poate răspunde la evenimente. Evenimentul Resize al unei forme se declanşează ori de câte ori forma este redimensionată fie de utilizator, fie prin intermediul codului. Acest eveniment al formei oferă posibilitatea de a executa anumite acţiuni - cum ar fi mutarea sau redimensionarea controalelor de pe formă - în momentul în care aceasta îşi schimbă poziţia sau dimensiunile. Pentru a afişa o formă pe ecran se va utiliza metoda Show. Form1.Show (Form1 reprezintă numele formei). Pentru a înlătura o formă de pe ecran (a o ascunde) vom folosi metoda Hide sau funcţia Form1.Hide La crearea unui proiect Visual Basic crează o formă numită implicit Form1. Utilizatorul inserează în această formă controalele (obiectele) prin intermediul cărora realizează funcţiile cu care îşi atinge obiectivele. În exemplul următor se urmăreşte prezentarea şi testarea unor proprietăţi a controalelor Form şi Label, precum şi cum arată inserate în formă controalele Button şi ComboBox.

Upload: mihai-emil-laposi

Post on 20-Jul-2016

42 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Visual Basic

3.1. PROIECTAREA UNEI FORME (FORMULAR)

Formele (formularele) constituie elementul de la care se începe construirea unei

interfeţe în Visual Basic, constituind practic ferestrele prin intermediul cărora utilizatorul va

interacţiona cu aplicaţia.

Formele posedă propriile proprietăţi, evenimente şi metode cu ajutorul cărora putem

controla modul de afişare şi comportamentul.

Primul pas în proiectarea unei forme este să-i stabilim proprietăţile. Majoritatea proprietăţilor

formei influenţează modul de afişare.

Proprietatea Text stabileşte titlul care va fi afişat în bara de titlu a formei; proprietatea Icon

stabileşte iconiţa pentru formă; proprietatea MaximizeBox şi MinimizeBox stabilesc dacă

forma poate să fie maximizată sau minimizată. Proprietăţile Height şi Width stabilesc

dimensiunile iniţiale ale formei; proprietatea WindowState stabileşte modul în care se va afişa

forma la început: minimizată, maximizată sau normală; proprietatea Name stabileşte un

identificator cu ajutorul căruia putem referi forma respectivă.

Observaţie:

În mod implicit VB le numeşte Form1, Form2, etc. Este recomandat să schimbăm aceste

denumiri cu unele mai familiare şi mai uşor de reţinut.

Cel mai bun mod de a ne familiariza cu proprietăţile este să le experimentăm. Schimbaţi pe

rând diferite proprietăţi şi executaţi aplicaţia ca să vedeţi efectul.

Ca orice obiect forma (formularul) poate executa diverse operaţii (metode) şi poate

răspunde la evenimente.

Evenimentul Resize al unei forme se declanşează ori de câte ori forma este redimensionată fie

de utilizator, fie prin intermediul codului. Acest eveniment al formei oferă posibilitatea de a

executa anumite acţiuni - cum ar fi mutarea sau redimensionarea controalelor de pe formă - în

momentul în care aceasta îşi schimbă poziţia sau dimensiunile.

Pentru a afişa o formă pe ecran se va utiliza metoda Show.

Form1.Show (Form1 reprezintă numele formei).

Pentru a înlătura o formă de pe ecran (a o ascunde) vom folosi metoda Hide sau funcţia

Form1.Hide La crearea unui proiect Visual Basic crează o formă numită implicit Form1. Utilizatorul

inserează în această formă controalele (obiectele) prin intermediul cărora realizează funcţiile

cu care îşi atinge obiectivele.

În exemplul următor se urmăreşte prezentarea şi testarea unor proprietăţi a controalelor

Form şi Label, precum şi cum arată inserate în formă controalele Button şi ComboBox.

Page 2: Visual Basic

Fig. 3.1.1 Crearea unei forme

Pentru a înscrie textul a fost creat un obiect etichetă (Label) şi la proprietatea Text a acestuia

(din fereastra Properties) a fost specificat textul “Aceasta este prima formă pe care o

realizăm”.

Dacă vrem să schimbăm numele înscris în titlul formei (Form1) vom înscrie în dreptul

proprietăţii Name numele dorit.

Activând proprietatea BackgroundImage vom putea alege o imagine (un fişier bmp, jpg, gif )

care să fie aplicată pe forma noastră, ca fundal.

Faceţi lucrul acesta! Schimbaţi apoi culorile, stabiliţi alt format de scriere a textului (mărime,

culoare, stil).

Măriţi şi micşoraţi dimensiunea formei, testaţi pe rând proprietăţile acesteia.

Executaţi apoi aplicaţia pentru a vedea ce realizează practic.

Pentru aceasta fie activăm meniul DEBUG şi de acolo opţiunea Start Debugging, fie activăm

butonul Start din bara de butoane.

Page 3: Visual Basic

Vom prezenta acum în detaliu, principalele proprietăţi, evenimente şi metode ale unui control

Form sau Formular:

Tabel 1 Proprietăţile formei

Proprietate Descriere

BackColor Culoarea de fundal a formei. Puteţi selecta o culoare

Windows sau puteţi selecta dintr-o paletă de culori

FormBorderStyle Setat la None atunci când nu există elemente de margine

sau când există doar elemente ca un meniu de control sau

butoane de minimizat sau maximizat; FixedSingle pentru

margini cu mărime fixă; Sizable (default) pentru margine

ajustabilă; Fixed3D pentru margine cu mărime fixă care

include o muchie dublă.

Text

Textul care apare în zona de titlu a formei. Textul default

este Numele formei (implicit Form1, Form2..).

ControlBox Dacă este Adevărat (default), forma conţine un buton de

control şi un meniu de control. Dacă este fals, forma nu

conţine un buton de control şi un meniu de control.

Enabled

(Activat)

Dacă este setat True (defalt), forma poate răspunde la

evenimente. Altfel, Visual Basic opreşte procesarea

evenimentelor pentru forma respectivă.

Fontul Bold Nu are nici un efect asupra textului din Text, dar afectează

textul pe care îl veţi afişa în cele din urmă pe formă dacă

utilizaţi comanda Print.

Fontul Italic Nu are nici un efect asupra textului din Text, dar afectează

textul pe care îl veţi afişa în cele din urmă pe formă dacă

utilizaţi comanda Print

Font Name

(Nume Font)

Nu are nici un efect asupra textului din Text, dar afectează

textul pe care îl veţi afişa în cele din urmă pe formă dacă

utilizaţi comanda Print

FontSize

(Mărime font)

Nu are nici un efect asupra textului din Text, dar afectează

textul pe care dumneavoastră îl veţi afişa în cele din urmă

pe formă dacă utilizaţi comanda Print

Font Strikethrough Nu are nici un efect asupra textului din Text, dar afectează

textul pe care dumneavoastră îl veţi afişa în cele din urmă

pe formă dacă utilizaţi comanda Print

FontUnderline Nu are nici un efect asupra textului din Text, dar afectează

textul pe care dumneavoastră îl veţi afişa în cele din urmă

pe formă dacă utilizaţi comanda Print.

ForeColor Culoarea textului din prim plan pe care îl afişaţi pe formă

dacă utilizaţi comanda Print.

Height

(Înălţimea)

Înălţimea formei în twips.

Icon Pictograma pe care utilizatorul o vede după ce minimizează

Page 4: Visual Basic

(Iconiţa) forma.

KeyPreview Dacă este Fals (default), controlul evidenţiat primeşte

următoarele evenimente: KeyDown, KeyUp, şi KeyPress

înaintea formei. Dacă este True, forma primeşte

evenimentele înaintea controlului.

MaximizeBox Dacă este True (default), butonul de maximizare apare pe

formă în timpul utilizării. Dacă este Fals, utilizatorul nu

poate maximiza fereastra formei.

MinimizeBox Dacă este Adevărat (default), butonul de minimizare apare

pe formă în timpul utilizării. Dacă este Fals, utilizatorul nu

poate minimiza fereastra formei.

Cursor Forma pe care o ia cursorul atunci când utilizatorul mişcă

mouse-ul peste formă. Reprezintă o gamă de forme diferite

pe care le poate lua cursorul.

Name

(Numele)

Numele formei. Default, Visual Basic generează numele

Form1.

BackgroundImage

(Imagine)

Un fişier imagine care va fi afişată pe fundalul formei.

Tag Nu se foloseşte de către Visual Basic. Aceasta este

destinată programatorului pentru identificarea unui

comentariu aplicat la formă..

Visible

(Vizibil)

Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu

(şi deci poate folosi sau nu) forma.

Width

(Lăţimea)

Lăţimea formei în twips.

WindowState Descrie starea de început a formei când utilizatorul rulează

programul. Dacă este setat Normal (default), forma apare

mai întâi la mărimea pe care aţi stabilit-o dumneavoastră.

Dacă este setat Minimize, forma apare mai întâi

minimizată. Dacă este Maximize, forma apare mai întâi

maximizată.

Recapitulare: Puteţi personaliza forma în multe feluri. O puteţi maximiza sau minimiza.

Puteţi folosi culori şi stiluri diferite. De cele mai multe ori, veţi dori o formă simplă cu un text

în titlu care să identifice aplicaţia; în acest caz, singurele valori ale proprietăţii pe care va

trebui să le modificaţi sunt cele ale textului din Text.

Tabelul 2. Evenimentele formei.

Eveniment Descriere

Click Apare când utilizatorul efectuează click pe formă.

DoubleClick Apare când utilizatorul efectuează dublu click pe

formă.

Page 5: Visual Basic

Deactivate

(Dezactivare)

Are loc atunci când o altă formă devine o fereastră

activă.

DragDrop Apare când operaţiunea “drag” peste o formă se

încheie.

DragOver Apare în timpul unei operaţiuni “drag” pe formă.

KeyDown Apare când utilizatorul apasă o tastă, atât timp cât

proprietatea Previzualizare Tastă are valoarea

Adevărat pentru controalele de pe formă; altfel,

controlul primeşte evenimentul KeyDown.

KeyPress Apare când utilizatorul apasă o tastă pe formă..

KeyUp Apare când utilizatorul eliberează o tastă.

Load Apare când forma se încarcă şi înainte ca ea să

apară pe ecran.

MouseDown Apare când utilizatorul apasă butonul de mouse pe

formă.

MouseMove Apare când utilizatorul mişcă mouse-ul peste formă.

MouseUp Apare când utilizatorul eliberează butonul de mouse

pe formă.

Paint Apare atunci când Visual Basic trebuie să

redeseneze o formă deoarece un alt obiect a

suprascris o parte a formei iar apoi utilizatorul a

mutat obiectul şi a expus partea ascunsă a formei.

Resize Apare atunci când utilizatorul redimensionează

forma.

3.2. BUTON DE COMANDĂ (BUTTON)

Un buton de comandă este un control (obiect) care are o anumită formă, afişează o

etichetă şi permite utilizatorului să comande execuţia unor acţiuni prin activarea lui.

Vom utiliza deci butoanele de comandă pentru a permite utilizatorilor să-i „dea comenzi”

aplicaţiei, să-i ceară acesteia să îndeplinească anumite funcţii. Utilizatorii vor executa click

mouse pe buton sau îl vor selecta în alt mod (apăsând tasta Tab până ajung la ele, apoi tasta

Enter), moment în care butonul va arăta ca şi cum ar fi apăsat. Ca efect se va executa secvenţa

de cod (instrucţiuni Visual Basic) care a fost asociată acestui eveniment al controlului buton

de comandă.

Proprietatea Text ne permite să afişăm un anumit text pe buton, de exemplu: OK,

Cancel, Adaugă, Şterge, Exit, etc.

Cum procedăm practic: Selectăm din fereastra din stânga, numită fereastra de obiecte,

obiectul dorit (button) şi apoi îl aducem (cu buton stânga mouse apăsat) în cadrul formei, la

locul dorit. Îi stabilim dimensiunile dorite (ca orice obiect, el trebuie selectat şi apoi fie că

tragem de colţuri pentru a-i schimba dimensiunea, fie că acţionăm asupra marcajelor laterale).

El apare iniţial cu numele dat de sistem în mod automat: Button1 (sau 2,3 etc după numărul de

ordine). Putem schimba numele atribuit acestuia, înscriindu-l pe cel dorit la proprietatea

Name (în acest caz acesta va fi numele cu care el va fi identificat şi referit de sistem – în acest

exemplu EXIT).

Exerciţiu:

Page 6: Visual Basic

Schimbaţi culoarea butonului, formatul de scriere al textului de pe buton, eventual plasaţi o

imagine pe buton.

Testaţi proprietăţile puse la dispoziţia dvs de program.

Cel mai frecvent eveniment întâlnit la acest control şi pentru care vom scrie cel mai mult cod

este evenimentul Click. De câte ori utilizatorul va face clic mouse pe acest buton evenimentul

se va produce şi va determina executarea codului scris în procedura numită:

NumeButon_Click().

Exerciţiu:

La clic mouse pe butonul EXIT se doreşte terminarea programului.

În acest caz se va scrie procedura care va fi executată la clic mouse pe butonul respectiv.

Cum scriem procedura?

Pentru aceasta, se va face dublu clic mouse pe butonul nostru, moment în care se va deschide

o nouă pagină (fereastra de editare a codului) cu numele procedurii care se va scrie şi cursorul

plasat acolo (în regim de editare). Acelaşi efect îl putem obţine şi activând meniul View şi de

acolo comanda Code (pentru a deschide fereastra în care să se scrie codul).

Procedura va arăta astfel:

Private Sub EXIT_Click()

end

End Sub

Executînd din nou aplicaţia, la clic mouse pe butonul EXIT se termină programul şi se revine

în modul de lucru Proiectare (Design) pentru a continua eventual proiectarea aplicaţiei

noastre cu adăugarea altor obiecte (controale) şi a altor metode asociate.

Prezentăm în continuare lista de proprietăţi şi evenimente ale controlului Button.

Tabelul 1 Proprietăţile butonului de comandă

Proprietate Descriere

BackColor

(Culoarea de fundal)

Butonul de comandă este unul dintre puţinele controale pentru

care proprietatea Culoare de fundal nu prea are importanţă.

Când schimbaţi culoarea de fundal, doar linia punctată din

jurul textului butonului de comandă îşi schimbă culoarea.

Text Textul care apare pe butonul de comandă

DragIcon Iconiţa care apare atunci când utilizatorul foloseşte funcţia

drag pentru un buton de comandă pe o formă.

Enabled

(Activat)

Dacă este setat True (default), butonul de comandă poate

răspunde la evenimente. Altfel, Visual Basic opreşte

procesarea evenimentelor pentru controlul respectiv.

FontSize

(Mărime font)

Mărimea, în puncte, a fontului folosit pentru textul afişat pe

butonul de comandă.

Font Strikethrough Adevărat (default), în cazul în care textul este afişat în

caractere strikethrough (caracterele au o linie peste ele).

Font Underline Adevărat (default), în cazul în care textul este afişat în

caractere subliniate.

Page 7: Visual Basic

Height

(Înălţimea)

Înălţimea, în twips, a unui buton de comandă.

Cursor

(Cursorul de Mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă

mouse-ul peste butonul de comandă. Reprezintă o gamă de

forme diferite pe care le poate lua cursorul.

Name

(Numele)

Numele controlului. În mod implicit, Visual Basic generează

numele Command1, Command2 şi aşa mai departe, pe măsură

ce mai adăugaţi butoane pe formă.

TabIndex Ordinea numerotării începe de la 0 şi creşte de fiecare dată

când adăugaţi un nou control. Puteţi schimba ordinea

evidenţierii schimbând TabIndex la alte valori. Nu se poate ca

două controale de pe aceeaşi formă să aibă aceeaşi valoare

TabIndex.

TabStop Dacă este True, utilizatorul poate apăsa Tab pentru a muta

evidenţierea pe acest buton de comandă. Dacă este fals, acest

buton de comandă nu poate fi evidenţiat.

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat

la butonul de comandă.

Top Numărul de twips de la marginea de sus a unui buton de

comandă până la marginea de sus a formei.

Visible

(Vizibil)

Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu

(şi deci poate folosi sau nu) respectivul buton de comandă.

Width

(Lăţimea)

Numărul de twips pe care le ocupă respectivul buton de

comandă în lăţime.

Tabelul 2 Evenimentele butonului de comandă

Eveniment Descriere

Click Apare când utilizatorul efectuează click pe butonul de comandă.

DragDrop Apare când operaţiunea “drag” a butonului de comandă se încheie.

DragOver Apare în timpul unei operaţiuni “drag” a butonului de comandă.

KeyDown Apare când utilizatorul apasă o tastă, iar proprietatea

Previzualizare Tastă are valoarea Fals pentru orice control de pe

formă; altfel, forma primeşte evenimentul KeyDown

KeyPress Apare când utilizatorul apasă o tastă de acces la butonul de

comandă.

KeyUp Apare când utilizatorul eliberează o tastă.

3.3. CONTROALE CARE MANIPULEAZĂ TEXTE

Principalele controale utilizate pentru manipularea textelor sunt:

etichetă (Label)

casetă de text (TextBox).

Page 8: Visual Basic

3.3.1. Controlul Etichetă (LABEL)

Controlul Etichetă este un control grafic folosit pentru afişarea de text pe care

utilizatorul nu îl poate modifica. Textul ce va fi afişat se stabileşte prin intermediul

proprietăţii Text. Acesta poate fi stabilit din faza de proiectare, dar se poate modifica în

timpul execuţiei prin intermediul unei proceduri asociate.

Principalele proprietăţi şi evenimente ale controlului Etichetă se prezintă astfel:

Tabelul 1. Proprietăţile controlului Etichetă (Label)

Proprietate Descriere

AutoSize Dacă este True, controlul se va ajusta automat pentru a încadra

exact conţinutul textului. Dacă este Fals (default), controlul va

trece de marginea din dreapta a textului dacă eticheta nu este

suficient de mare pentru a cuprinde întreaga captură.

BackColor

(Culoarea de

fundal)

Culoarea de fundal a etichetei. Numărul său hexadecimal

reprezintă una din miile de posibile valori de culoare din

Windows. Puteţi selecta dintr-o paletă de culori afişată de Visual

Basic cănd doriţi să stabiliţi proprietatea Culoarea de fundal.

Culoarea prestabilită (default) este aceeaşi cu cea a formei.

BorderStyle Setat la None atunci când nu există elemente de margine,

FixedSingle pentru margini cu mărime fixă; Fixed3D pentru

margine cu mărime fixă care include o muchie dublă.

Text Textul care apare într-o etichetă.

Enabled

(Activat)

Dacă este setat True (default) controlul etichetei poate răspunde la

evenimente. Altfel, Visual Basic opreşte procesarea

evenimentelor pentru controlul respectiv.

Fontul Bold Adevărat (default), în cazul în care textul este afişat în caractere

bold.

Fontul Italic Adevărat (default), în cazul în care textul este afişat în caractere

italice.

Font Name

(Nume Font)

Numele tipului de caractere folosit de controlul etichetei. În mod

normal, veţi folosi numele unui font TrueType din Windows.

FontSize

(Mărime Font)

Mărimea, în puncte, a fontului folosit pentru textul etichetei.

Font

Strikethrough

Adevărat (default), în cazul în care textul este afişat în caractere

strikethrough (caracterele au o linie peste ele).

Font Underline Adevărat (default), în cazul în care textul este afişat în caractere

subliniate.

ForeColor Culoarea textului din interiorul textului.

Height

(Înălţime)

Înălţimea controlului etichetei, în twips.

Cursor

(Cursorul de

Mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă mouse-

ul peste controlul etichetei. Reprezintă o gamă de forme diferite

pe care le poate lua cursorul.

Page 9: Visual Basic

Name

(Numele)

Numele controlului. Default, Visual Basic generează numele

Label1, Label2 şi aşa mai departe, pe măsură ce adăugaţi mai

multe controale de etichetă la formă.

TabIndex Ordinea numerotării începe de la 0 şi creşte de fiecare dată când

adăugaţi un nou control. Puteţi schimba ordinea evidenţierii

schimbând TabIndex la alte valori. Nu se poate ca două controale

de pe aceeaşi formă să aibă aceeaşi valoare TabIndex

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat la

controlul etichetei.

Visible

(Vizibil)

Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu (şi

deci poate folosi sau nu) respectivul control de etichetă.

Width

(Lăţimea)

Numărul de twips pe care-i ocupă respectivul control etichetă în

lăţime.

Tabelul 2. Evenimentele controlului Etichetă (Label)

Eveniment Descriere

Click Apare când utilizatorul efectuează click pe etichetă.

Double Click Apare când utilizatorul efectuează dublu click pe etichetă..

DragDrop Apare când operaţiunea “drag” a etichetei se încheie.

DragOver Apare în timpul unei operaţiuni “drag” a etichetei.

MouseDown Apare când utilizatorul apasă butonul de mouse pe etichetă.

MouseMove Apare când utilizatorul mişcă mouse-ul peste etichetă.

MouseUp Apare când utilizatorul eliberează butonul de mouse pe etichetă.

3.3.2. Controlul Casetă de text (TextBox)

Spre deosebire de controlul etichetă, controlul Casetă de text este folosit pentru a afişa

textul specificat de dumneavoastră din faza de proiectare (la proprietatea Text), sau introdus

de utilizator la execuţie sau asociat controlului prin program.

Prin urmare acest control poate fi folosit şi pentru ca aplicaţia să preia diferite informaţii

de la utilizatori. Textul care se va afişa sau care va fi preluat se gestionează cu ajutorul

proprietăţii Text.

Dacă textul trebuie afişat pe mai multe linii, proprietatea MultiLine trebuie să aibă valoarea

True. Dacă este necesar, cu ajutorul proprietăţii ScrollBars se pot adăuga bare de defilare

controlului.

Exerciţiul 1:

Să se realizeze o aplicaţie care să realizeze concatenarea a două şiruri introduse de la

tastatură.

Rezolvare:

Vom proiecta o formă pe care vom specifica funcţiile aplicaţiei şi vom pune la dispoziţia

utilizatorului două casete de tip Text (Text Box) pentru a specifica cele două şiruri şi o a treia

casetă pentru a afişa rezultatul.

Page 10: Visual Basic

Vom mai pune la dispoziţia utilizatorului un buton de comandă pentru a determina procedura

de calcul, un buton pentru ieşirea din aplicaţie şi unul pentru a şterge conţinutul casetelor în

vederea reluării calculului (un fel de Reset).

Vom şterge textul scris iniţial la proprietatea Text a celor trei casete de text (Text1, Text2 şi

respectiv Text3) şi vom lăsa deci spaţiu.

Vom scrie la proprietatea Text a fiecărui buton de comandă textul dorit, respectiv:

Concatenare, Reset, EXIT.

La lansarea în execuţie (cu DEBUG – Start Debugging sau apăsând tasta F5) aplicaţia se

prezintă astfel:

Utilizatorul va introduce cele două şiruri şi, dacă va acţiona butonul Concatenare aplicaţia va

afişa rezultatul obţinut, astfel:

Acţionând butonul Reset aplicaţia iniţializează cu spaţiu conţinutul celor trei casete de text şi

este gata să accepte alte valori ale celor 2 şiruri. Prin urmare, procedura de cod asociată

acestui buton de comandă va trebui să realizeze aceste funcţiuni.

Page 11: Visual Basic

Procedurile asociate celor trei butoane de comandă sunt: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

TextBox3.Text = TextBox1.Text + TextBox2.Text

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

End

End Sub

Exerciţiul 2:

Adăgaţi pe forma de mai sus un buton nou, la apăsarea căruia să se calculeze suma a două

numere introduse de la tastatură prin intermediul celor două casete de text.

Rezolvare:

Vom modifica mai întâi textul afişat în partea de sus pentru a preciza corect funcţiile

aplicaţiei.

Din analiza problemei, reiese că se poate cere fie concatenarea (alipirea) valorilor introduse în

cele două casete de text, fie suma acestora, dacă au fost introduse valori numerice.

Page 12: Visual Basic

În acest caz, procedura de calcul asociată butonului nou introdus introduce funcţii de

conversie: Val(şir) - pentru a transforma şirul de caractere din variabila Text în valoare

numerică şi a se putea efectua astfel calculul aritmetic (adunarea).

Procedura va fi în acest caz: Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button4.Click

TextBox3.Text = Val(TextBox1.Text) + Val(TextBox2.Text)

End Sub Prezentăm în continuare lista detaliată a proprietăţilor şi evenimentelor controlului TextBox:

Tabelul 1. Proprietăţile controlului Text Box.

Proprietate Descriere

BackColor

(Culoarea de

fundal)

Culoarea de fundal a respectivului text box. Puteţi selecta dintr-

o paletă de culori afişată de Visual Basic când doriţi să stabiliţi

proprietatea Culoarea de fundal. Culoarea prestabilită (default)

este aceeaşi cu cea a formei.

BorderStyle Setat la None atunci când nu există elemente de margine,

FixedSingle pentru margini cu mărime fixă; Fixed3D pentru

margine cu mărime fixă care include o muchie dublă.

Enabled

(Activat)

Dacă este setat True (default) acel text box poate răspunde la

evenimente. Altfel, Visual Basic opreşte procesarea

evenimentelor pentru controlul respectiv.

Font Bold Adevărat (default), în cazul în care textul este afişat în caractere

bold.

Font Italic Adevărat (default), în cazul în care textul este afişat în caractere

italice.

Font Name

(Numele Fontului)

Numele tipului de caractere folosit de text box. În mod normal,

veţi folosi numele unui font TrueType din Windows.

FontSize

(Mărime Font)

Mărimea, în puncte, a fontului folosit pentru scrierea textului din

controlul text box.

Font Strikethrough Adevărat (default), în cazul în care textul este afişat în caractere

Page 13: Visual Basic

strikethrough (caracterele au o linie peste ele).

Font Underline Adevărat (default), în cazul în care textul este afişat în caractere

subliniate.

ForeColor Culoarea textului din interiorul proprietăţii Text.

Height

(Înălţimea)

Înălţimea respectivului text box în twips.

MaxLength Dacă este 0 (default), atunci limita valorii textului poate fi până

la 32767de caractere. Altfel, MaxLength specifică numărul de

caractere pe care utilizatorul le poate introduce în text box.

Cursor

(Cursorul de mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă

mouse-ul peste text box. reprezintă o gamă de forme diferite pe

care le poate lua cursorul.

MultiLine Dacă este True, respectivul text box poate afişa mai mult de o

linie de text. Dacă este Fals (default), acel text box conţine o

singură linie de text, adesea lungă. Textul poate conţine un

carriage return.

Name

(Numele)

Numele controlului. Default, Visual Basic generează numele

Text1, Text2 şi aşa mai departe, pe măsură ce adăugaţi mai multe

text box la formă.

PasswordChar Dacă introduceţi un caracter, cum ar fi un asterisc (*) pentru

PasswordChar, Visual Basic nu afişează textul utilizatorului, ci

caracterul respectiv (în timp ce utilizatorul introduce textul).

Folosiţi text box cu setarea PasswordChar atunci când

utilizatorul are nevoie de o parolă şi nu doriţi ca alţii să vadă

parola introdusă. Astfel, în timp ce respectivul text box va

recepta caracterele tastate de utilizator, pe ecran vor fi afişate

doar caracterele PasswordChar.

ScrollBars Setat pe 0 când nu există bare de scroll, 1 pentru o bară

orizontală, 2 pentru o bară verticală sau 3 pentru ambele tipuri

de bare.

TabIndex Ordinea numerotării începe de la 0 şi creşte de fiecare dată când

adăugaţi un nou control. Puteţi schimba ordinea evidenţierii

schimbând TabIndex la alte valori. Nu se poate ca două

controale de pe aceeaşi formă să aibă aceeaşi valoare TabIndex.

TabStop Dacă este True, utilizatorul poate apăsa Tab pentru a muta

evidenţierea pe acest control de etichetă. Dacă este fals, acest

control de etichetă nu poate fi evidenţiat.

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat la

text box.

Text Valoarea inţială pe care utilizatorul o vede în text box. Valoarea

default este numele controlului. Valoarea continuă să se

updateze pe măsură ce utilizatorul introduce noi texte în tipul

rulării. .

Page 14: Visual Basic

Visible

(Vizibil)

Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu (şi

deci poate folosi sau nu) respectivul text box.

Width

(Lăţime)

Numărul de twips pe care-i ocupă respectivul text box în lăţime

Tabelul 2. Evenimentele controlului Text Box.

Acţiune Descriere

DragDrop Apare când operaţiunea drag respectivului text box se încheie.

DragOver Apare în timpul unei operaţiuni drag a unui text box.

KeyDown Apare când utilizatorul apasă o tastă, atât timp cât proprietatea

Previzualizare Tastă are valoarea Adevărat; altfel, text box

primeşte evenimentul KeyDown.

KeyPress Apare când utilizatorul apasă o tastă pe text box.

KeyUp Apare când utilizatorul eliberează o tastă pe text box

3.4. CONTROALE CARE PERMIT ALEGEREA UNOR OPŢIUNI

Majoritatea aplicaţiilor permit utilizatorilor să aleagă dintre anumite opţiuni, pornind de la

un simplu „da” sau „nu” până la selectarea unor articole dintr-o listă cu multe posibilităţi.

3.4.1. Caseta de validare (CheckBox)

Un control casetă de validare oferă utilizatorilor posibilitatea de a alege sau nu o anumită

opţiune. De regulă sunt prezentate utilizatorului mai multe opţiuni ataşate unor casete de

validare, mai multe dintre acestea putând fi selectate la un moment dat. Când utilizatorul

alege o opţiune, caseta de validare corespunzătoare opţiunii respective este marcată; semnul

de marcare dispare când caseta este deselectată.

Prorietatea Checked este utilizată pentru a determina starea controlului: True= bifat,

False= nebifat.

Cu ajutorul proprietăţii Text putem adăuga textul explicativ dorit în dreptul casetei. În

cadrul unei forme pot exista deci o multitudine de casete de validare, utilizatorul având

posibilitatea să bifeze câte doreşte. Ca şi la butoanele de comandă, evenimentul click al

controlului apare ori de câte ori utilizatorul efectuează clic mouse pe caseta de validare. În

acel moment procedura aferentă evenimentului clik al controlului îşi începe execuţia.

Procedura asociată evenimentului va trebui să testeze starea în care se află caseta de validare

şi, în funcţie de aceasta, să execute o anumită sarcină.

Exemplu:

Creaţi o formă pe care adăugaţi un control tip casetă de validare numit Verifica şi un

control de tip etichetă numit Mesaj . Eticheta va afişa un text indicând starea casetei (bifată,

nebifată sau indisponibilă).

Rezolvare:

Se defineşte caseta Chek cu numele Verifica şi mesajul respectiv.

Page 15: Visual Basic

Se definesc două controale tip etichetă: unul Label1 cu textul Starea casetei la

proprietatea Text, şi altul Label2 având iniţial spaţiu la proprietatea Text. Aceasta îşi va

modifica proprietatea Text în timpul execuâiei şi va afişa un mesaj corespunzător stării

casetei.

Pentru aceasta se scrie procedura (cod) ataşată evenimentului Click al casetei de validare

cu numele Verifică.

Executând aplicaţia noastră, se obţine:

Procedura ataşată evenimentului click al casetei Verifica este: Private Sub

Verifica_CheckedChanged(ByVal sender

As System.Object, ByVal e As

System.EventArgs) Handles

Verifica.CheckedChanged If Verifica.Checked = True

Then

Label2.Text = "Caseta

este bifata"

ElseIf Verifica.Checked =

False Then

Label2.Text = "Caseta nu

este bifata"

End If

End Sub

Prezentăm în continuare principalele

proprietăţi şi evenimente ale controlului

casetă de validare (CheckBox):

Tabel 1. Proprietăţile controlului Check Box

Proprietate Descriere

BackColor

(Culoarea de fundal)

Culoarea de fundal a controlului check box. Puteţi selecta

dintr-o paletă de culori afişată de Visual Basic când doriţi să

stabiliţi proprietatea Culoarea de fundal. Culoarea prestabilită

(default) este aceeaşi cu cea a formei.

Text Textul care apare asociat unui check box. Dacă precedaţi orice

Page 16: Visual Basic

caracter din text cu un &, acel caracter se va comporta ca tasta

de acces a respectivului check box.

Enabled

(Activat)

Dacă este setat True (default), check box poate răspunde la

evenimente. Altfel, Visual Basic opreşte procesarea

evenimentelor pentru controlul respectiv.

Font Bold Adevărat (default), în cazul în care textul asociat este afişat în

caractere bold. Altel, Fals.

Font Italic Adevărat (default), în cazul în care textul asociat este afişat în

caractere italice. Altel, Fals.

Font Name

(Nume font)

Numele tipului de font folosit de textul din check box. În mod

normal, veţi folosi numele unui font TrueType din Windows.

Font Size

(Mărime font)

Mărimea, în puncte, a fontului folosit pentru textul din check

box.

Font Strikethrough Adevărat (default), în cazul în care textul asociat este afişat în

caractere strikethrough (caracterele au o linie peste ele). Altel,

Fals.

Font Underline Adevărat (default), în cazul în care textul asociat este afişat în

caractere subliniate. Altel, Fals.

ForeColor Codul hexadecimal de culoare al culorii textului asociat check

box..

Height

(Înălţime)

Înălţimea, în twips, a unui check box.

Cursor

(Cursorul de Mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă

mouse-ul peste check box. Valorile posibile sunt de la 0 la 12

şi reprezintă o gamă de forme diferite pe care le poate lua

cursorul.

Name

(Numele)

Numele controlului. Default, Visual Basic generează numele

Check1, Check2 şi aşa mai departe, pe măsură ce adăugaţi mai

multe check box la formă.

TabIndex Ordinea de numerotare a controalelor din formă începe de la 0

şi creşte de fiecare dată când adăugaţi un nou control. Puteţi

schimba ordinea evidenţierii schimbând TabIndex la alte

valori. Nu se poate ca două controale de pe aceeaşi formă să

aibă aceeaşi valoare TabIndex.

TabStop Dacă este True, utilizatorul poate apăsa Tab pentru a muta

evidenţierea pe acest check box. Dacă este fals, acest check

box nu poate fi evidenţiat.

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat la

check box.

Checked Arată starea respectivului check box. Poate lua valorile: False-

neselectat (default) sau True-selectat.

Visible Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu (şi

Page 17: Visual Basic

(Vizibil) deci poate folosi sau nu) respectivul check box.

Width

(Lăţimea)

Numărul de twips pe care îi ocupă respectivul check box în

lăţime.

Tabelul următor prezintă evenimentele disponibile pentru controalele check box. La fel ca în

cazul butoanelor de opţiuni, Click este procedura cea mai des folosită.

Tabelul 2. Evenimentele controlului Ceck Box

Eveniment Descriere

Click Apare când utilizatorul efectuează click pe check box.

DragDrop Apare când operaţiunea drag a unui check box se încheie.

DragOver Apare în timpul unei operaţiuni drag.

KeyDown Apare când utilizatorul apasă o tastă, atât timp cât proprietatea

Previzualizare Tastă are valoarea Adevărat pentru controalele check

box; altfel, controlul primeşte evenimentul KeyDown.

KeyPress Apare când utilizatorul apasă o tastă peste check box.

KeyUp Apare când utilizatorul eliberează o tastă.

3.4.2. Butonul de opţiune (RadioButton)

Butoanele de opţiune pun la dispoziţia utilizatorului un set de opţiuni, dintre care acesta are

posibilitatea să marcheze una singură la un moment dat. Selectarea unui buton implică

automat deselectarea celorlalte. Eticheta implicită afişată pe buton poate fi schimbată

atribuind proprietăţii Text valoarea dorită, adică textul care reprezintă opţiunea asociată

butonului respectiv.

Butonul de opţiune care este marcat are proprietatea Checked = True, iar celelalte

butoane din grup au proprietatea Checked = False.

De asemenea, de câte ori utilizatorul marchează sau demarchează un buton de opţiune se

declanşează evenimentul click al controlului, care începe execuţia procedurii aferentă acestui

eveniment. În această procedură putem scrie cod care să verifice starea butonului şi, în funcţie

de aceasta, să execute o anumită funcţie.

Un buton de opţiune poate fi dezactivat atribuind proprietăţii Enable valoarea False.

Dacă este dezactivat, butonul de opţiune apare în timpul execuţiei estompat.

Exerciţiu:

Modificaţi forma de mai jos, astfel încât în locul butoanelor de comandă să afişaţi

butoane de opţiune, corespunzătoare celor două funcţii ale aplicaţiei: suma a două numere sau

concatenarea a două şiruri.

Page 18: Visual Basic

Rezolvare:

Executând aplicaţia se obţine:

Procedura asociată evenimentului clic al butonului Calculează este acum: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

If RadioButton1.Checked = True Then

TextBox3.Text = Val(TextBox1.Text) + Val(TextBox2.Text)

ElseIf RadioButton2.Checked = True Then

TextBox3.Text = TextBox1.Text + TextBox2.Text

End If

End Sub

Page 19: Visual Basic

Celelate două proceduri au rămas neschimbate:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

End

End Sub

Observaţie:

Pentru a fi mai riguroşi ar trebui ca în procedura asociată butonului Reset

(Button2_Click()) să iniţializăm şi butoanele de opţiune, deci să adăugăm comenzile:

RadioButton1.Checked=False

RadioButton2.Checked=False

Prezentăm în continuare principalele proprietăţi şi evenimente ale controlului Option Button:

Tabelul 1 Proprietăţile controlului Option Button

Proprietaze Descriere

BackColor

(Culoarea de fundal)

Culoarea de fundal a butonului de opţiune. Numărul său

hexadecimal reprezintă una din mulţimea de valori posibile de

culoare din Windows. Puteţi selecta dintr-o paletă de culori

afişată de Visual Basic când doriţi să stabiliţi această

proprietate. Culoarea prestabilită (default) este aceeaşi cu cea a

formei.

Text Textul care apare pe un buton de opţiune. Dacă precedaţi orice

caracter din text cu un &, acel caracter se va comporta ca tasta

de acces a butonului de opţiuni.

Enabled

(Activat)

Dacă este setat True (default), butonul de opţiuni poate

răspunde la evenimente. Altfel, Visual Basic opreşte procesarea

evenimentelor pentru controlul respectiv.

Font Bold Adevărat (default), în cazul în care textul din Text este afişat în

caractere bold. Altel, Fals.

Font Italic Adevărat (default), în cazul în care textul din Text este afişat în

caractere italice. Altel, Fals.

FontName Numele stilului folosit pentru textul butonului de opţiuni. În

mod normal, veţi folosi numele unui font TrueType din

Windows.

FontSize

(Mărime font)

Mărimea, în puncte, a fontului folosit pentru textul butonului de

opţiuni.

Font Strikethrough Adevărat (default), în cazul în care textul butonului este afişat

în caractere strikethrough (caracterele au o linie peste ele).

Page 20: Visual Basic

Altel, Fals.

Font Underline Adevărat (default), în cazul în care textul butonului este afişat

în caractere subliniate. Altel, Fals.

ForeColor Codul hexadecimal de culoare al culorii textului asociat

butonului de opţiuni.

Height Înălţimea, în twips, a unui buton de opţiuni.

Cursor

(Cursorul de Mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă

mouse-ul peste butonul de opţiuni. Reprezintă o gamă de forme

diferite pe care le poate lua cursorul.

Name

(Numele)

Numele controlului. Default, Visual Basic generează numele

Option1, Option2 şi aşa mai departe, pe măsură ce adăugaţi mai

multe opţiuni la formă.

TabIndex Ordinea numerotării controalelor începe de la 0 şi creşte de

fiecare dată când adăugaţi un nou control. Puteţi schimba

ordinea evidenţierii schimbând TabIndex la alte valori. Nu se

poate ca două controale de pe aceeaşi formă să aibă aceeaşi

valoare TabIndex.

TabStop Dacă este True, utilizatorul poate apăsa Tab pentru a muta

evidenţierea pe acest buton de opţiuni. Dacă este fals, acest

buton nu poate fi evidenţiat.

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat la

butonul de opţiuni.

Checked

(Valoarea)

True sau False (default), indică faptul că butonul de opţiuni este

selectat sau nu.

Visible

(Vizibil)

True sau False, arată dacă utilizatorul poate vedea sau nu (şi

deci poate folosi sau nu) butonul de opţiuni.

Width

(Lăţimea)

Numărul de twips pe care îi ocupă butonul de opţiuni în lăţime.

Tabelul 2 conţine o listă de evenimente ale butonului de opţiuni care determină proceduri pe

care le puteţi scrie. În general, procedura Click este cel mai des folosită pentru ca aplicaţia să

execute o anumită acţiune atunci când utilizatorul selectează un anumit buton de opţiuni.

Tabelul 2. Evenimentele controlului Option Button

Eveniment Descriere

Click Apare când utilizatorul efectuează click pe butonul de opţiuni.

DragDrop Apare când operaţiunea “drag”a unui buton de opţiuni se încheie.

DragOver Apare în timpul unei operaţiuni “drag”.

KeyDown Apare când utilizatorul apasă o tastă, atât timp cât proprietatea

Previzualizare Tastă are valoarea Adevărat pentru controalele de pe

butonul de opţiuni; altfel, controlul primeşte evenimentul KeyDown.

Page 21: Visual Basic

KeyPress Apare când utilizatorul apasă o tastă peste butonul de opţiuni.

KeyUp Apare când utilizatorul eliberează o tastă.

3.5. CASETA CU LISTĂ (LISTBOX)

Caseta cu listă este un control care permite afişarea pe verticală a unei serii de articole din

care utilizatorul poate alege unul sau mai multe. Dacă numărul de articole depăşeşte

capacitatea de afişare a casetei cu listă proiectată, atunci ei i se vor asocia automat bare de

derulare verticală, respectiv orizontală.

Observaţie:

Barele de derulare asociate automat casetelor cu text nu reprezintă acelaşi lucru cu

controalele de tip bare de derulare, care pot fi introduse separat pentru a controla introducerea

datelor.

În mod implicit articolele sunt afişate pe o singură coloană. Acest lucru poate fi

schimbat prin modificarea proprietăţii MultiColumn. Valorile ce pot fi atribuite proprietăţii

Multicolumn au următoarele semnificaţii:

False - caseta de tip listă are o singură coloană, cu derulare pe verticală;

True – casetă de tip listă multicoloană cu derulare pe orizontală.

Dacă dorim ca utilizatorul să poată selecta mai multe articole din listă, atunci trebuie

stabilită corespunzător valoarea proprietăţii SelectionMode. Astfel, din lista de valori pusă la

dispoziţie de proprietatea SelectionMode vom selecta valorile funcţie de semnificaţia lor,

astfel:

- None – nu permite nici o selecţie;

- One – permite selecţie multiplă simplă; cu un clic mouse simplu sau prin acţionarea

tastei Space se selectează sau se deselectează elementele suplimentare din listă;

- MultiSimple – permite selecţia multiplă.

- MultiExtended - permite selecţie multiplă extinsă.

Aceasta înseamnă practic că pentru a selecta mai multe articole din listă putem proceda

astfel:

- Selectăm primul articol, apoi ţinând tasta CTRL apăsată, selectăm pe rând cu clic

mouse fiecare dintre articolele dorite.

- Dacă articolele care trebuie selectate urmează unele după altele, atunci selectăm

primul articol şi apoi cu tasta SHIFT apăsată, selectăm cu clic mouse ultimul articol

dorit. Toate articolele cuprinse între primul şi ultimul articol selectat din listă vor fi

selectate.

Proprietatea Items.Count a unei liste returnează numărul de articole din listă.

Proprietatea SelectedIndex este utilizată pentru a determina numărul articolului selectat.

Numerotarea articolelor în listă începe de la 0. Pentru a prelucra selecţia se utilizează în

special evenimentele Click sau DoubleClick ale casetei cu listă.

Adăugarea unui articol nou în listă se face cu metoda Items.Add, care are sintaxa:

Nume casetă. Items.Add element[,index]

unde:

- nume casetă este numele obiectului tip listă (implicit este List1, List2, etc);

- element este şirul de caractere care trebuie adăugat în listă şi care poate fi specificat

ca atare, între “ “ sau conţinut într-o variabilă, al cărei nume trebuie precizat;

Page 22: Visual Basic

- index – precizează poziţia din listă unde va fi inserat noul articol. Dacă lipseşte,

articolul va fi adăugat la sfârşit. Dacă index = 0, articolul va fi adăugat la începutul

listei. Dacă are o anumită valoare, articolul se va adăuga la poziţia respectivă.

Metoda Items.Add permite adăugarea de articole în listă fie în timpul proiectării, prin

atribuirea de valori proprietăţii Items, fie în timpul execuţiei aplicaţiei, prin intermediul

procedurilor apelate ca răspuns la acţiunile utilizatorului.

Astfel, la început articolele se vor înscrie la proprietatea Items, în lista pusă la dispoziţie.

Pentru a trece la un nou articol se apasă tastele CTRL/ENTER.

Elementele din listă pot fi apoi ordonate, sortate, caz în care proprietatea Sorted trebuie

să ia valoarea True. În acest caz însă nu mai avem voie să folosim metoda Items.Add cu

index, pentru a controla noi poziţia în care se adaugă articolul în listă.

Accesul la un articol din listă se face prin proprietatea Items, al cărei format este:

Nume casetă.Items (index) unde:

Nume casetă este numele casetei (implicit este List1, List2, etc).

Index reprezintă poziţia articolului în listă (primul are numărul de ordine 0).

Items.Remove este metoda care permite ştergerea unui articol din listă, având formatul

general:

Nume casetă.Items.RemoveAt( index)

Pentru ştergerea tuturor articolelor din listă se utilizează metoda Items.Clear, cu formatul:

Nume casetă.Items.Clear

Exerciţiul 1:

Să se realizeze o aplicaţie care să conţină o casetă cu listă (denumită automat List1). Să se

afişeze (într-un control tip etichetă marcat în cadrul formei noastre) numărul articolului

selectat de utilizator.

Rezolvare:

Proiectăm forma Form1, pe care definim:

- un control etichetă, care să precizeze mesajul adresat utilizatorului, de a selecta

produsul dorit din listă;

- un control tip listă, în care înscriem iniţial la proprietatea List câteva articole;

- un alt control etichetă, care să afişeze poziţia articolului selectat

Executând aplicaţia noastră se obţine:

Page 23: Visual Basic

Procedura asociată evenimentului Click asociat listei este:

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

Label3.Text = ListBox1.SelectedIndex

End Sub

Exerciţiul 2:

Completaţi aplicaţia anterioară astfel încât să permită adăugarea de noi articole în listă,

precum şi ştergerea unora dintre ele.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

ListBox1.Items.Add("Mere")

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

ListBox1.Items.Remove(ListBox1.SelectedItem)

ListBox1.Refresh()

End Sub

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

Label3.Text = ListBox1.SelectedIndex

End Sub

Page 24: Visual Basic

Notă: Ori de câte ori se va executa, aplicaţia noastră va adăuga în listă numai articolul “

mere“, ceea ce nu este normal .

Exerciţiul 3:

Modificaţi aplicaţia de mai sus astfel încât de data aceasta procedura de adăugare a unui

produs nou în listă să se facă prin introducerea datelor de la tastatură. Procedura va fi acum : Private Sub Button1_Click(ByVal sender

As System.Object, ByVal e As

System.EventArgs) Handles

Button1.Click

Dim sir As String

sir = InputBox("Introduceti noul

produs")

ListBox1.Items.Add(sir)

End Sub

Am utilizat de date aceasta comanda de introducere a datelor de la tastatură InputBox şi am

atribuit valoarea citită unei variabile sir care a fost anterior declarată (Public sir As String) în

secţiunea General Declaration.

Prezentăm în continuare principalele proprietăţi, evenimente şi metode ale controlului List

Box:

Tabel 1. Proprietăţile controlului List Box

Proprietate Descriere

BackColor

(Culoarea de

fundal)

Culoarea de fundal a list box. Numărul său hexadecimal reprezintă

una din mulţimea de valori posibile de culoare din Windows. Puteţi

selecta dintr-o paletă de culori afişată de Visual Basic cănd doriţi să

stabiliţi proprietatea Culoarea de fundal. Culoarea prestabilită

(default) este aceeaşi cu cea a formei.

MultiColumn

(Coloanele)

Poate lua valoarea False - caseta de tip listă are o singură coloană,

cu derulare pe verticală sau True – casetă de tip listă multicoloană

cu derulare pe orizontală.

Enabled

(Activat)

Dacă este setat pe valoarea logică True (default), controlul ListBox

poate răspunde la evenimente. Altfel, Visual Basic opreşte

procesarea evenimentelor pentru controlul respectiv.

Font Bold Adevărat (default), dacă valorile din listă sunt afişate cu caractere

bold. Altfel, Fals.

Font Italic Adevărat (default), dacă valorile din listă sunt afişate în caractere

italice. Altfel, Fals.

Font Name Numele stilului de text folosit în text box. În mod normal, veţi folosi

Page 25: Visual Basic

numele unui font TrueType din Windows.

Font Size Mărimea, în puncte, a fontului folosit pentru valorile din list box.

Font Strikethrough Adevărat (default), dacă valorile din listă sunt afişate în caractere

sttrikethrough (caracterele au o linie peste ele). Altel, Fals.

Font Underline Adevărat (default), dacă valorile din listă sunt afişate în caractere

subliniate. Altel, Fals.

ForeColor Culoarea valorilor din interiorul text box.

Height

(Înălţimea)

Înălţimea controlului list box. Se poate preciza sau se defineşte

automat, funcţie de înălţimea aleasă pentru controlul list box.

Items Permite introducerea elementelor din listă la momentul iniţial. Cu

Ctrl/Enter se trece la un rând nou din listă.

Cursor

(Cursorul de

Mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă mouse-ul

peste controlul list box. Reprezintă o gamă de forme diferite pe care

le poate lua cursorul.

SelectionMode

(MultiSelecţia)

Poate lua valorile: None – nu permite nici o selecţie; One – permite

selecţie multiplă simplă; cu un clic mouse simplu sau prin

acţionarea tastei Space se selectează sau se deselectează elementele

suplimentare din listă; MultiSimple – permite selecţia multiplă sau

MultiExtended - permite selecţie multiplă extinsă.

Name

(Numele)

Numele controlului. Default, Visual Basic generează numele List1,

List2 şi aşa mai departe, pe măsură ce adăugaţi mai multe controale

list box.

Sorted

(Sortare)

Dacă are valoarea Fals (default), valorile apar în aceeaşi ordine în

care programul le-a adăugat pe listă. Dacă este True (Adevărat),

Visual Basic nu afişează valorile din list box ordonate numeric sau

alfabetic.

TabIndex Ordinea numerotării controalelor List Box începe de la 0 şi creşte de

fiecare dată când adăugaţi un nou control de acelaşi tip. Puteţi

schimba ordinea evidenţierii schimbând TabIndex la alte valori. Nu

se poate ca două controale de pe aceeaşi formă să aibă aceeaşi

valoare TabIndex (două List1 de exemplu).

TabStop Dacă are valoarea True utilizatorul poate apăsa Tab pentru a muta

cursorul pe acest list box. Dacă este fals, acest list box nu poate fi

activat cu Tab.

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat la

controlul list box.

Visible

(Vizibil)

Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu (şi deci

folosi) controlul list box.

Width

(Lăţimea)

Numărul de twips pe care le ocupă controlul list box în lăţime.

Observaţie:

Page 26: Visual Basic

Când plasăm un control ListBox pe o formă, decidem cât de înalt dorim să fie acel list box

prin redimensionarea controlului la mărimea care se potriveşte cel mai bine. Este important să

ne reamintim că dacă nu toate valorile încap în ListBox, Visual Basic adaugă bare de scroll la

caseta tip listă, pe care utilizatorul le poate folosi pentru a vedea toate valorile.

Tabelul 2 prezintă cele mai multe evenimente pe care le acceptă controlul ListBox şi pe care

le putem utiliza în programe.

Tabelul 2 Evenimentele controlului List Box

Element Descriere

Click Apare când utilizatorul efectuează click pe controlul list box.

Double Click Apare când utilizatorul efectuează dublu-click pe controlul list

box.

DragDrop Apare când operaţiunea “drag” (de tragere) a controlului list

box se încheie.

Drag Over Apare în timpul unei operaţiuni “drag”.

KeyDown Apare când utilizatorul apasă o tastă, atât timp cât proprietatea

Previzualizare Tastă are valoarea Adevărat pentru controalele

de pe formă; altfel, forma primeşte cazul KeyDown.

KeyPress Apare când utilizatorul apasă o tastă peste list box.

KeyUp Apare când utilizatorul eliberează o tastă pe list box.

MouseDown Apare când utilizatorul apasă butonul de mouse peste un list

box.

MouseMove Apare când utilizatorul mişcă mouse-ul peste list box.

MouseUp Apare când utilizatorul eliberează butonul de mouse peste un

list box.

Tabelul 3 conţine o serie de metode ale controlului listbox necesare pentru a iniţializa, analiza

şi elimina elementele unui control list box, deci pentru a le prelucra. Metodele funcţionează ca

programe (proceduri) care operează pe controale.

Tabelul 11.3 Metodele controlului List Box

Numele Metodei Descriere

Items.Add

(Adaugă element)

Adaugă un singur element la list box.

Items.Clear

(Şterge)

Şterge toate elementele din listă

SelectedIndex Are ca valoare numărul articolului selectat în cadrul list box .

Items.Count

(Număr elemente

listă)

Are ca valoare numărul total de elemente dintr-un list box.

Items.Remove Şterge un singur element din listă.

Page 27: Visual Basic

(Şterge element)

SelectedItem

(Selectat)

Arată dacă utilizatorul a selectat un anumit element din list box.

Dacă are valoarea True elementul e selectat.

3.6. CASETA COMBINATĂ (COMBOBOX)

Caseta combinată este un control care combină caracteristicile controlului casetă cu listă

cu cele ale controlului casetă de text.

Dacă utilizatorul nu doreşte să selecteze nici una din opţiunile din listă poate să adauge

una în porţiunea casetei de text a controlului.

Proprietatea Text controlează selecţia articolelor din lista ComboBox. Aceasta înseamnă

că aici vom găsi conţinutul articolului selectat la un moment dat.

Observaţie: Articolul selectat din lista ComboBox la un moment dat se înscrie automat în proprietatea

Text.

Exerciţiu:

Să se realizeze o aplicaţie care să afişeze o listă de produse, utilizatorul având

posibilitatea selectării unei poziţii. Produsul astfel selectat să fie transferat într-o listă

(ListBox) şi afişat pentru control într-o casetă de tip text (TextBox).

Proiectăm forma şi apoi scriem codul. Lista iniţială de produse o definim ca un

ComboBox.

La acţionarea butonului de comandă EXECUTA articolul selectat din Lista de produse va

fi transferat în caseta de tip listă din dreapta şi afişat în caseta de text.

Forma proiectată Execuţia aplicaţiei

Page 28: Visual Basic

Codul corespunzător celor două butoane de comandă este: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

ListBox1.Items.Add(ComboBox1.Text)

TextBox1.Text = ComboBox1.Text

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub

Prezentăm în continuare principalele proprietăţi şi evenimente ale controlului ComboBox:

Tabelul 11.4 Proprietăţile casetei combinate (ComboBox))

Proprietate Descriere

Back Color

(Culoarea de

fundal)

Culoarea de fundal a casetei combo. Numărul său hexadecimal

reprezintă una din mulţimea de valori posibile de culoare din

Windows. Puteţi selecta dintr-o paletă de culori afişată de Visual

Basic când doriţi să stabiliţi această proprietate. Culoarea prestabilită

(default) este aceeaşi cu cea a formei.

Enabled

(Activat)

Dacă este setat pe True (default), controlul casetei combo poate

răspunde la evenimente. Altfel, Visual Basic opreşte procesarea

evenimentelor pentru controlul respectiv.

Font Bold True (default), dacă valorile combo sunt afişate în caractere bold.

Altel, Fals.

Font Italic True (default), dacă valorile combo sunt afişate în caractere italice.

Altel, Fals.

Font Name

(Numele fontului)

Numele stilului de text folosit în caseta combo. În mod normal, veţi

folosi numele unui font TrueType din Windows.

Font Size

(Mărime font)

Mărimea, în puncte, a caracterelor folosite pentru valorile din caseta

combo.

Font Strikethrough True(default), dacă valorile combo sunt afişate în caractere

strikethrough (caracterele au o linie peste ele). Altel, Fals.

Font underline True (default), dacă valorile din caseta combo sunt afişate în caractere

Page 29: Visual Basic

(Font Subliniat) subliniate. Altel, Fals.

ForeColor Culoarea valorilor din interiorul casetei combo.

Height

(Înălţimea)

Înălţimea unui control de tip casetă combo.

Cursor

(Cursorul de

mouse)

Forma pe care o ia cursorul atunci când utilizatorul mişcă mouse-ul

peste controlul casetei combo. Reprezintă o gamă de forme diferite pe

care le poate lua cursorul.

Name

(Numele)

Numele controlului. Default, Visual Basic generează numele Combo1,

Combo2 şi aşa mai departe, pe măsură ce adăugaţi mai multe

controale la formă

Sorted

(Sortare)

Dacă este Fals (default), valorile din listă apar în aceeaşi ordine în care

programul le-a adăugat. Dacă este True Visual Basic afişează valorile

din caseta combo ordonate numeric sau alfabetic.

TabIndex Ordinea de numerotare a controalelor de pe o formă începe de la 0 şi

creşte de fiecare dată când adăugaţi un nou control. Puteţi schimba

ordinea evidenţierii schimbând TabIndex la alte valori. Nu se poate ca

două controale de pe aceeaşi formă să aibă aceeaşi valoare TabIndex.

TabStop Dacă este True, utilizatorul poate apăsa Tab pentru a muta

evidenţierea pe această casetă combo. Dacă este fals, această casetă

nu poate fi activată cu Tab.

Tag Nu se foloseşte de către Visual Basic. Aceasta este destinată

programatorului pentru identificarea unui comentariu aplicat la

controlul casetei combo.

Text Valoarea iniţială pe care utilizatorul o vede în caseta combo. Ulterior

aici se depune valoarea selectată.

Visible

(Vizibil)

Adevarat sau fals, arată dacă utilizatorul poate vedea sau nu (şi deci

poate folosi sau nu) controlul respectiv.

Width

(Lăţimea)

Numărul de twips pe care le ocupă controlul casetei combo în lăţime.

Notă:

Observaţi că nu există proprietatea Selecţie Multiplă la caseta combo, ca în cazul controlului

List box. Utilizatorul poate selecta doar un singur element din listă la un moment dat.

Tabelul 2 conţine o serie de evenimente ale casetei combinate pentru care puteţi scrie

proceduri echivalente atunci când programul trebuie să reacţioneze la manipularea unei casete

combo de către utilizator.

Tabelul 2. Evenimentele controlului casetă combinată (ComboBox)

Eveniment Descriere

Click Apare când utilizatorul efectuează click pe controlul casetei

combo.

DragDrop Apare când operaţiunea “drag” a unei casete combo se

încheie.

Page 30: Visual Basic

DragOver Apare în timpul unei operaţiuni “drag”.

KeyDown Apare când utilizatorul apasă o tastă, atât timp cât proprietatea

Previzualizare Tastă are valoarea True pentru controalele de

pe formă; altfel, forma primeşte evenimentul KeyDown.

KeyPress Apare când utilizatorul apasă o tastă peste caseta combo.

KeyUp Apare când utilizatorul eliberează o tastă pe caseta combo.

Observaţie:

Controalele casetei combo susţin aceleaşi metode ca şi controalele list box. Prin urmare,

puteţi adăuga, elimina, număra şi selecta elementele din caseta combo, dacă aplicaţi metodele

din tabelul prezentat la controlul ListBox.

3.7. CASETA CU POZE (PICTUREBOX)

Este un control utilizat pentru a pentru a afişa poze şi imagini grafice. Poza care se

afişează este stabilită de proprietatea Image care utilizează ca valoare numele fişierului care

conţine poza (opţional se poate specifica şi calea).

În timpul execuţiei programului, pentru a afişa o poză sau pentru a o schimba se

foloseşte funcţia Load pentru a stabili proprietatea Image.

PictureBox1.Load(˝Poza.gif˝)

Dacă poza care va fi afişată nu are aceeaşi dimensiune cu ceea a controlului, se poate seta

proprietatea SizeMode=AutoSize şi astfel controlul va avea aceleaşi dimensiuni cu poza.

Atenţie însă, căci redimensionarea controlului nu va ţine cont de celelalte elemente de

interfaţă, putând să le acopere.

Caseta cu poză poate fi folosită şi drept container pentru alte controale. De exemplu,

plasând în caseta de poze controale imagine care să se comporte ca butoane, aceasta se poate

transforma în bară de instrumente sau introducând controale etichetă care să afişeze text

aceasta se poate transforma în bară de stare.

Exerciţiu:

Să se realizeze o aplicaţie ce afişează o casetă cu poze care să apară sau să dispară în

timpul execuţie aplicaţiei, la cererea utilizatorului. Aplicaţia trebuie să permită comutarea

între două imagini ce se vor afişa.

Am proiectat formularul, am încărcat iniţial o poză în caseta cu poze şi am prevăzut cele 3

Page 31: Visual Basic

butoane necesare.Executând aplicaţia şi acţionând apoi butoanele de comandă aflate la

dispoziţia noastră se obţine:

Acţionând butonul Încarcă alta se încarcă în caseta cu poze cealaltă imagine. Dacă se mai

acţionează odată, se va încărca din nou prima imagine.

Prin urmare, acest buton funcţionează ca un comutator.

Procedurile scrise în acest caz sunt:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

If PictureBox1.Visible = True Then

PictureBox1.Visible = False

Else : PictureBox1.Visible = True

PictureBox1.Load()

End If

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

End

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

Page 32: Visual Basic

If comut = 0 Then

PictureBox1.ImageLocation = "C:\Users\Public\Pictures\Sample

Pictures\Hydrangeas.jpg"

comut = 1

Else : PictureBox1.ImageLocation = "C:\Users\Public\Pictures\Sample

Pictures\Tulips.jpg"

comut = 0

End If

End Sub

3.8. CASETE DE DIALOG PREDEFINITE

Un mod simplu de a adăuga o casetă de dialog aplicaţiei noastre este să folosim casetele de

dialog predefinite, deoarece în acest caz nu trebuie să ne preocupăm de designul, încărcarea şi

afişarea casetei.

Pentru aceasta Visual Basic ne pune la dispoziţie două funcţii:

- InputBox care afişează o casetă de dialog ce permite preluarea datelor de la

utilizator;

- MsgBox care permite afişarea diferitelor informaţii, mesaje.

a). Funcţia InputBox afişează o casetă de dialog modală care cere utilizatorului să introducă

date. Funcţia returnează o valoare de tip String formată din caracterele introduse de utilizator

în caseta cu text din fereastra de dialog atunci când utilizatorul apasă butonul OK; dacă se

apasă butonul Cancel şirul returnat este şirul vid ˝˝.

Sintaxa:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]) unde:

- prompt – este un şir de caractere afişat ca mesaj în caseta de dialog. Numărul maxim

de caractere este de 1024;

- title – este un şir de caractere care va fi afişat ca titlu în bara de titlu a casetei de

dialog;

- default – este un şir de caractere ce va fi afişat în caseta cu text şi care va fi returnat

de funcţie în caz că utilizatorul nu introduce alte date;

- xpos, ypos – expresii numerice care specifică coordonatele colţului stânga sus al

casetei de dialog faţă de colţul stânga sus al ecranului;

- helpfile – un şir de caractere ce specifică numele fişierului Help ce va fi folosit

pentru a oferi asistenţă în lucrul cu caseta de dialog;

Exemplu:

Să se introducă de la tastatură datele despre salariaţii unei firme şi să se adauge într-o

casetă tip listă.

Page 33: Visual Basic

Am proiectat formularul şi apoi am lansat în execuţie aplicaţia:

Acţionând butonul ADAUGA apare caseta de dialog care permite introducerea datelor, sub

forma:

Datele introduse de la tastatură se vor atribui, pe rând, elementelor din listă. Pentru

aceasta e necesar un contor (i, de tip întreg) care va fi incrementat (crescut) cu 1 pentru

fiecare nouă citire de la tastatură. Contorul va controla astfel poziţia articolului adăugat

în listă (List1.list(i)).

Ca efect numele persoanelor introduse de la tastatură se regăsesc în caseta tip listă,

astfel:

Procedurile asociate celor două butoane sunt:

Page 34: Visual Basic

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

ListBox1.Items.Add(InputBox("dati numele:"))

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub

b). Funcţia MsgBox se poate utiliza pentru a obţine răspunsuri de tipul Da / Nu de la

utilizatori sau pentru a afişa diferite mesaje de avertizare, erori, atenţionări. După citirea

mesajului utilizatorul va apăsa un buton pentru a închide fereastra. Funcţia returnează un

număr de tip Integer care precizează ce buton a fost apăsat.

Sintaxa funcţiei:

MsgBox(prompt[, buttons] [, title] [, helpfile, context]) unde:

- prompt – este

un şir de caractere afişat ca

mesaj în caseta de

dialog. Numărul maxim

de caractere este de 1024;

- buttons – este o

expresie numerică ce

reprezintă suma

valorilor care specifică

numărul şi tipul

butoanelor afişate,

iconiţa.

- title – un şir de caractere ce

va fi afişat ca titlu în bara de

titlu a casetei de dialog;

- helpfile - un şir

de caractere ce specifică

numele fişierului Help ce va fi folosit pentru a oferi asistenţă în lucrul cu caseta de

dialog.

Exemplu:

În formularul de mai sus să se avertizeze, printr-un mesaj corespunzător, introducerea unei noi

persoane în listă. Efectul execuţiei aplicaţiei este:

Codul procedurii este: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

MsgBox("Se va adauga o noua persoana...")

ListBox1.Items.Add(InputBox("Dati numele:"))

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub În legătură cu posibilităţile de afişare ale funcţiei MsgBox facem următoarele precizări:

Page 35: Visual Basic

Tabelul 1. Valorile tipului funcţiei MsgBox

Valoare Valoare CONSTANT.TXT Descriere

0 MB_OK Butonul OK apare doar în caseta de

mesaj

1 MB_OKCANCEL Apar butoanele OK şi Cancel

2 MB_ABORTRETRYIGNORE Apar butoanele Abort, Retry şi Cancel

3 MB_YESNOCANCEL Apar butoanele Yes, No şi Cancel

4 MB_YESNO Apar butoanele Yes şi No

5 MB_RETRYCANCEL Apar butoanele Retry şi Cancel

16 MB_ICONSTOP Afişează iconiţa cu semnul stop

32 MB_ICONQUESTION Afişează iconiţa cu semnul întrebării

48 MB_ICONEXCLAMATION Afişează iconiţa cu semnul exclamării

64 MB_ICONINFORMATION Afişează iconiţa cu semnul de

“informaţii”

0 MB_DEFBUTTON1 Primul buton este evidenţiat

256 MB_DEFBUTTON2 Al doilea buton este evidenţiat iniţial

512 MB_DEFBUTTON3 Al treilea buton este evidenţiat iniţial

4096 MB_SYSTEMMODAL Aplicaţia utilizatorului este modală,

ceea ce înseamnă că fereastra de mesaj

trebuie rezolvată înainte de a trece la alt

program Windows

Tabelul 3. Valorile redate ale butonului de comandă al funcţiei MsgBox()

Valoare Valoare CONSTANT.TXT Descriere

1 IDOK Utilizatorul a apăsat butonul OK

2 IDCANCEL Utilizatorul a apăsat butonul Cancel

3 IDABORT Utilizatorul a apăsat butonul Abort

4 IDRETRY Utilizatorul a apăsat butonul Retry

5 IDIGNORE Utilizatorul a apăsat butonul Ignore

6 IDYES Utilizatorul a apăsat butonul Yes

7 IDNO Utilizatorul a apăsat butonul No

3.9. EDITAREA DE MENIURI

Orice program Windows care îndeplineşte mai multe funcţii pune la dispoziţia utilizatorului

un meniu prin care prezintă aceste funcţii. Principala caracteristică a aplicaţiilor Windows o

constituie faptul că permit realizarea unei interfeţe plăcute, comode, uşor de utilizat.

Acest lucru se realizează prin proiectarea unui meniu de comenzi corespunzător. Meniul

conţine principalele comenzi pe care utilizatorul le poate utiliza în cadrul aplicaţiei. Un meniu

Page 36: Visual Basic

bun va face aplicaţia uşor de folosit. Un meniu mai puţin bine conceput va încurca adeseori

utilizatorul, care nu va înţelege bine cum funcţionează programul respectiv.

O posibilitate de a realiza meniuri uşor accesibile o constituie prezentarea funcţiunilor

aplicaţiei prin butoane de comandă, butoane de opţiuni sau casete de validare, care permit şi

controlează succesiunea formularelor în cadrul proiectului

(aşa cum am văzut la aplicaţiile realizate până acum).

Microsoft a încercat să impună o tradiţie în modul de

proiectare a meniurilor. Majoritatea barelor de meniuri din

aplicaţiile Windows conţin meniuri ca: File, Edit, View,

Window sau Help. De aceea se recomandă, dacă este

posibil, ca meniurile aplicaţiilor noastre să se asemene cât

mai mult cu meniurile întâlnite la majoritatea aplicaţiilor

Windows. În acest fel utilizatori aplicaţiei se vor familiariza

foarte repede cu ea.

În acest sens, mediul de programare Visual Basic pune la

dispoziţia programatorilor un editor de meniuri cu ajutorul căruia se pot crea meniuri oricât de

complexe într-un mod relativ simplu. Trebuie să stabilim însă cu multă atenţie proprietăţile

fiecărui element care va forma meniul.

Apelarea editorului se face folosind Toolbox-ul şi de acolo opţiunea Menus & Toolbars şi se

selectează obiectul Menu Strip.

Exerciţiu:

Să se proiecteze un meniu care să pună la dispoziţia utilizatorului opţiuni pentru toate

problemele rezolvate de noi până acum.

Rezolvare:

Să presupunem că acestea pot fi grupate în 4 grupe mari de funcţiuni şi anume:

Calcule (aritmetice sau pentru expresii), Imagini (una sau mai multe), Şiruri (concatenare sau

căutare) şi Ieşire.

Formular proiectat Formular executat

3.10. STRUCTURI DE CONTROL

În cadrul oricărui algoritm de rezolvare a unei probleme se pot identifica diferite structuri de

control.

Page 37: Visual Basic

În cadrul programelor, structurile de control sunt formate din instrucţiuni. Acestea descriu

practic partea algoritmică a unui program. Ele pot fi prefixate de etichete pentru a putea fi

referite în instrucţiunea de salt necondiţionat Goto.

Structura liniară

Structura liniară poate conţine o succesiune de instrucţiuni de tipul:

- instrucţiunea de atribuire

- instrucţiunea de apel procedură.

Instrucţiunea cea mai importantă şi cea mai frecventă a limbajului este instrucţiunea de

atribuire, având forma:

variabilă = expresie

sau

Set variabilă = obiect

sau

Nume_de_funcţie = expresie

Instrucţiunea specifică faptul că unei variabile sau unei funcţii (cea din stânga semnului = )

îi este atribuită o nouă valoare, care este specificată printr-o expresie sau printr-un obiect. O

expresie este o construcţie prin care se reprezintă o formulă pentru calculul valorii unui obiect

oarecare. O expresie constă dintr-o secvenţă formată din operanzi (variabile, constante, etc.) şi

operatori (simboluri operaţionale).

Instrucţiunea de apel procedură specifică activarea (apelul) procedurii al cărui nume apare

în instrucţiune şi are forma:

nume_de_procedură listă_parametri_actuali

sau

Call nume_de_procedură(listă_parametri_actuali)

Structura alternativă

Structura alternativă este descrisă cu ajutorul instrucţiunilor If …Then, If …Then …Else şi

Select Case.

Visual Basic oferă o alternativă la instrucţiunea If… Then…Else ce permite executarea

unui bloc de instrucţiuni dintre mai multe în cazul în care este îndeplinită o anumită condiţie

şi anume instrucţiunea Select Case.

Structura repetitivă

Această structură permite repetarea în anumite condiţii a unei instrucţiuni sau a unei

secvenţe de instrucţiuni. Visual Basic suportă două tipuri de structuri repetitive: structuri

repetitive cu contor descrise de instrucţiunile For …Next şi For…Each…Next care execută

acelaşi lucru de un număr stabilit de ori şi structuri repetitive cu condiţie descrise de diferitele

variante ale instrucţiunii Do…Loop ce îndeplinesc aceeaşi sarcină atâta timp cât o condiţie

există sau până când nu mai există o condiţie.

Exemplu:

Do While i<=9

MsgBox ˝Este repetarea numărului: ˝ + str(i)

Loop

Page 38: Visual Basic

3.11. PROBLEME REZOLVATE

1. Să se realizeze o aplicaţie care să permită afişarea produselor din două nomenclatoare,

fiecare în câte o listă. La apăsarea unui buton de comandă elementele selectate din

prima listă să se mute în cea de-a doua listă. La apăsarea unui alt buton de comandă

toate elementele din prima listă să se mute în cea de-a doua listă.

Alte două butoane să permită apoi aceleaşi operaţii din lista2 în lista1.

Rezolvare:

Page 39: Visual Basic

În casetele de tip Text de sub cele două liste dorim să afişăm, atunci când se face un clic

mouse în interiorul unei liste, numărul de elemente din lista respectivă.

Codul aferent procedurilor scrise se prezintă astfel:

Public Class Form1

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button6.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

' Dim b As Integer

If ListBox1.Items.Count > 0 Then

'b = ListBox1.SelectedIndex

For i = 0 To ListBox1.Items.Count - 1

If ListBox1.GetSelected(i) = True Then

Me.ListBox2.Items.Add(Me.ListBox1.Items.Item(i))

End If

Next i

'Me.ListBox1.Items.RemoveAt(b)

End If

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

If ListBox1.Items.Count > 0 Then

ListBox2.Items.Clear()

For i = 0 To ListBox1.Items.Count - 1

Me.ListBox2.Items.Add(Me.ListBox1.Items.Item(i))

Next i

End If

End Sub

Page 40: Visual Basic

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

'Dim c As Integer

If ListBox2.Items.Count > 0 Then

'c = ListBox2.SelectedIndex

For i = 0 To ListBox2.Items.Count - 1

If ListBox2.GetSelected(i) = True Then

Me.ListBox1.Items.Add(Me.ListBox2.Items.Item(i))

End If

Next i

' Me.ListBox2.Items.RemoveAt(c)

End If

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button4.Click

If ListBox2.Items.Count > 0 Then

ListBox1.Items.Clear()

For i = 0 To ListBox2.Items.Count - 1

Me.ListBox1.Items.Add(Me.ListBox2.Items.Item(i))

Next i

End If

End Sub

Private Sub ListBox1_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles ListBox1.Click

TextBox1.Text = ListBox1.Items.Count

End Sub

Private Sub ListBox2_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles ListBox2.Click

TextBox2.Text = ListBox2.Items.Count

End Sub

End Class

2. Să se realizeze un minicalculator care să aibă formatul de mai jos.

Se cere ca în dreptul primelor două ecrane să scrie A, respectiv B iar la ultimul operaţia

efectuată: A+b, A-B, A*B, A/B după cum a fost acţionat butonul de +,-, * sau /. Rezultatul va fi afişat

în ultima casetă de text.

Rezolvare:

Formatul

cerut

Page 41: Visual Basic

Se proiectează forma, se înscriu pe butoanele de comandă operatorii aritmetici prin

intermediul proprietăţii Text, se adaugă apoi două butoane: Reset şi Exit pentru cele două

funcţii obligatorii în orice aplicaţie.

În partea stângă vom defini trei etichete, dintre care primele două cu un text fixat iniţial tot

prin Text, şi a treia etichetă cu valoarea proprietăţii Text controlată prin program, pentru a

corespunde operatorului cerut.

Executînd aplicaţia se obţine:

Se observă că la împărţire se verifică mai întâi dacă împărţitorul este diferit de 0 şi, dacă nu

este, se afişează un mesaj de eroare.

Procedurile asociate butoanelor de comandă se prezintă astfel: Public Class Form1

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button6.Click

End

End Sub

Page 42: Visual Basic

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

TextBox3.Text = Str(Val(TextBox1.Text) + Val(TextBox2.Text))

Label4.Text = "A+B"

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

TextBox3.Text = Str(Val(TextBox1.Text) - Val(TextBox2.Text))

Label4.Text = "A-B"

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

TextBox3.Text = Str(Val(TextBox1.Text) * Val(TextBox2.Text))

Label4.Text = "A*B"

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button4.Click

Label4.Text = "A/B"

If Val(TextBox2.Text) <> 0 Then

TextBox3.Text = Str(Val(TextBox1.Text) / Val(TextBox2.Text))

Else

TextBox3.Text = "EROARE"

End If

End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button5.Click

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

Label4.Text = " "

End Sub

End Class

3. Să se realizeze un alt calculator simplu, în care operaţiile de calcul să corespundă unor butoane de

opţiuni (butoane radio).

Rezolvare:

Page 43: Visual Basic

Codul sursă aferent procedurilor va fi în acest caz: Public Class Form1

Dim n As Double

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

On Error Resume Next

If RadioButton1.Checked = True Then

TextBox3.Text = Val(TextBox1.Text) + Val(TextBox2.Text)

ElseIf RadioButton2.Checked = True Then

TextBox3.Text = Val(TextBox1.Text) - Val(TextBox2.Text)

ElseIf RadioButton3.Checked = True Then

TextBox3.Text = Val(TextBox1.Text) * Val(TextBox2.Text)

ElseIf RadioButton4.Checked = True Then

If TextBox2.Text = "0" Then

MsgBox("Nu se poate imparti la 0", vbCritical, "Eroare")

TextBox2.Text = ""

Else

TextBox3.Text = Val(TextBox1.Text) / Val(TextBox2.Text)

End If

ElseIf RadioButton5.Checked = True Then

TextBox2.Text = "0"

TextBox2.Enabled = False

If Val(TextBox1.Text) < 0 Then

MsgBox("Nu se poate extrage radical de ordin 2 din numere

negative", vbCritical, "Eroare")

Else

n = Val(TextBox1.Text)

TextBox3.Text = System.Math.Sqrt(n)

End If

End If

TextBox2.Enabled = True

End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Me.Load

TextBox1.Text = "0"

TextBox2.Text = "0"

TextBox3.Text = "0"

End Sub

Private Sub RadioButton5_CheckedChanged(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles RadioButton5.CheckedChanged

TextBox2.Enabled = False

End Sub

End Class

4. Să se proiecteze şi să se realizeze efectiv un mic calculator de buzunar, care să conţină un

ecran (TextBox) pentru afişarea operanzilor şi apoi al rezultatului obţinut.

Calculatorul are prevăzute taste pentru tastarea cifrelor care compun operanzii şi taste

corespunzătoare operatorilor aritmetici, precum şi semnului = . Primul operand se termină

atunci când se apasă pe tasta corespunzătoare unui operator (şi trebuie reţinut într-o variabilă

de memorie). Al doilea operand se termină atunci când se apasă pe tasta =.

Se cere să se afişeze rezultatul obţinut şi apoi să se adauge într-o listă (ListBox) întreaga

operaţie efectuată. Calculatorul trebuie să permită apoi reluarea altei operaţii dorite.

Page 44: Visual Basic

Sugestie:

Toate cifrele de la 0 la 9, precum şi operatorii aritmetici vor avea câte un buton de comandă

corespunzător. Pentru afişarea cifrelor tastate prin apăsarea butoanelor calculatorului, vom

ţine seama de faptul că şirul din caseta de tip text se termină la apăsarea unei taste de operaţie.

Pentru fiecare tastă de cifră în procedura asociată vom avea o instrucţiune de forma:

Text1.text= Text1.text+”1” pentru cifra 1, etc.

Pentru adăugarea în listă vom realiza o concatenare a operanzilor cu operatorii şi cu rezultatul,

vom depune şirul astfel obţinut într-o variabilă de tip şir de caractere şi apoi vom adăuga în

listă conţinutul acestei variabile.

5. Să se proiecteze şi să se realizeze o aplicaţie care să permită analiza unui text introdus de la

tastatură, afişarea primului cuvânt şi apoi la cerere a următoarelor cuvinte din text. Să se afişeze

deasemenea numărul de caractere din text.

Rezolvare:

Public Class Form1

Dim cuv As String

Dim lung As Integer

Dim i1 As Integer

Dim i As Integer

Dim a As Integer

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

LTrim(Me.TextBox1.Text)

Text = Me.TextBox1.Text

lung = Len(Text)

Me.TextBox3.Text = Len(Text)

a = InStr(Text, " ")

i = 1

cuv = Mid(Text, i, a)

Me.TextBox2.Text = cuv

i = a

End Sub

Page 45: Visual Basic

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

a = InStr(Text, " ")

If i < lung - a Then

a = InStr(Mid(Text, i + 1, lung - i), " ")

cuv = Mid(Text, i, a)

Me.TextBox2.Text = cuv

Me.Refresh()

i = i + a

Else

cuv = Mid(Text, i, a)

Me.TextBox2.Text = cuv

Me.Refresh()

End If

End Sub

End Class

6. Să se realizeze un editor de texte, care să permită introducerea unui text de la tastatură şi apoi

salvarea lui pe disc prin intermediul unei ferestre de dialog. Editorul trebuie să permită şi deschiderea

unui fişier existent în vederea editării.

Rezolvare:

Am proiectat 3 forme astfel:

Page 46: Visual Basic
Page 47: Visual Basic

În urma execuţiei se obţine:

Page 48: Visual Basic
Page 49: Visual Basic

Codul sursă aferent primei forme:

Imports System

Imports System.IO

Public Class Form1

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button4.Click

End

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button3.Click

TextBox1.Text = ""

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

Form2.Show()

Form2.TextBox1.Text = ""

Form2.TextBox2.Text = ""

On Error Resume Next

Me.Hide()

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

Form3.Show()

Me.Hide()

End Sub

End Class

Codul sursă aferent formei a II-a:

Page 50: Visual Basic

Imports System

Imports System.IO

Public Class Form2

Private Sub DriveListBox1_SelectedIndexChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

DriveListBox1.SelectedIndexChanged

Try

DirListBox1.Path = DriveListBox1.Drive

Catch

End Try

TextBox1.Text = DirListBox1.Text

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

Form1.Show()

Me.Hide()

End Sub

Private Sub DirListBox1_SelectedIndexChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

DirListBox1.SelectedIndexChanged

Try

FileListBox1.Path = DirListBox1.Path

Catch

End Try

TextBox2.Text = Me.TextBox2.Text & Me.DirListBox1.SelectedItem &

"\"

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

Me.TextBox1.Text = Me.TextBox1.Text & Me.TextBox2.Text &

Me.FileListBox1.SelectedItem

Try

Using fisier As StreamReader = New

StreamReader(Me.TextBox1.Text)

Dim linie As String

Do

linie = fisier.ReadLine()

Form1.TextBox1.Text = Form1.TextBox1.Text & linie

Loop Until linie Is Nothing

fisier.Close()

End Using

Catch

End Try

Form1.Show()

Me.Hide()

End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

TextBox2.Text = ""

TextBox1.Text = ""

Me.DirListBox1.Refresh()

Me.FileListBox1.Refresh()

Me.DriveListBox1.Refresh()

End Sub

Page 51: Visual Basic

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

ComboBox1.SelectedIndexChanged

FileListBox1.Pattern = Me.ComboBox1.Text

End Sub

End Class

Codul aferent formei a treia se prezintă astfel:

Imports System

Imports System.IO

Public Class Form3

Private Sub DriveListBox1_SelectedIndexChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

DriveListBox1.SelectedIndexChanged

Try

DirListBox1.Path = DriveListBox1.Drive

Catch

End Try

TextBox2.Text = DirListBox1.Text

End Sub

Private Sub DirListBox1_SelectedIndexChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

DirListBox1.SelectedIndexChanged

Try

FileListBox1.Path = DirListBox1.Path

Catch

End Try

TextBox3.Text = Me.TextBox3.Text & Me.DirListBox1.SelectedItem &

"\"

End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

ComboBox1.SelectedIndexChanged

FileListBox1.Pattern = Me.ComboBox1.Text

End Sub

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

Form1.Show()

Me.Hide()

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

TextBox1.Focus()

If TextBox1.Text = "" Then

MessageBox.Show("Nu ati introdus numele fisierului!!!",

"Atentie", MessageBoxButtons.OK, MessageBoxIcon.Warning)

Else

Page 52: Visual Basic

TextBox4.Text = Me.TextBox2.Text & TextBox3.Text &

TextBox1.Text

Using fisier As StreamWriter = New StreamWriter(TextBox4.Text)

fisier.WriteLine(Form1.TextBox1.Text)

fisier.WriteLine(DateTime.Now)

fisier.Close()

MessageBox.Show("Fisierul a fost salvat in " &

Me.TextBox4.Text, "Save", MessageBoxButtons.OK, MessageBoxIcon.Question)

End Using

End If

End Sub

End Class

7. Să se proiecteze şi să se realizeze o aplicaţie care să ne pună la dispoziţie un ceas de alarmă.

Rezolvare:

Am proiectat două formulare, astfel:

Form1 este formularul în care este afişată ora sistemului şi conţine 2 butoane Alarmă şi Exit,

un label (care afişează ora exactă) şi un textbox ascuns.

Form2 este activat la actionarea butonului Alarmă şi conţine 2 textboxuri în care se introduc

ora, respectiv minutele la care alarma este activată, trei label-uri şi un buton de Ok.

În urma execuţiei se obţine:

Page 53: Visual Basic

Public Class Form1

Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand

As String) As Long

Dim x

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

On Error Resume Next

Form2.Show()

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Me.Load

Timer1.Enabled = True

Timer1.Interval = 1000

End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Timer1.Tick

Label1.Text = TimeOfDay

End Sub

Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Timer2.Tick

If Label1.Text = TextBox1.Text Then

x = mciExecute("play c:/woody2.mp3")

MsgBox("Alarma", vbInformation, "Alarma")

End If

End Sub

End Class

Codul asociat formei a doua se prezintă astfel: Public Class Form2

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

On Error Resume Next

End Sub

Private Sub Button1_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles Button1.Click

On Error Resume Next

Page 54: Visual Basic

Form1.TextBox1.Text = Me.TextBox1.Text + ":" + Me.TextBox2.Text +

":00 PM"

Form1.Timer2.Enabled = True

Form1.Timer2.Interval = 1000

If TextBox1.Text > 24 Or TextBox1.Text < 0 Then

MsgBox("Introduceti o valoare intre 0 si 24", vbExclamation,

"Ora Incorecta !!!")

TextBox1.Text = ""

ElseIf TextBox2.Text > 59 Or TextBox2.Text < 0 Then

MsgBox("Introduceti o valoare intre 0 si 59", vbExclamation,

"Minute Incorecte !!!")

TextBox2.Text = ""

End If

Me.Hide()

End Sub

End Class

8. Să se realizeze o mică aplicaţie de calcul a salariilor cuvenite ştiind că se dau:

- salariul de încadrare;

- sporul de vechime, de noapte, de toxicitate;

- eventuale prime;

Din total cîştig se scad: impozitul datorat, eventuale penalităţi şi eventualele chirii care trebuie

introduse de la tastatură pentru cei la care este cazul.

Rezolvare:

Am proiectat formele astfel încât unele date (Nume, prenume, salariu) se introduc prin intermediul

unor casete de text, iar altele (chirii, rate) prin intermediul unor comenzi InputBox.

Utilizatorul va preciza prin intermediul unor casete de validare (bifate) elementele de salariu specifice

fiecărui salariat.

Page 55: Visual Basic

Toate opţiunile bifate pentru salariat vor genera mai întâi un dialog cu utilizatorul pentru

a cere datele respective (exemplu: sporul de vechime, funcţia,etc) şi apoi calculele necesare

prin intermediul procedurilor asociate acestor casete de validare.

Page 56: Visual Basic

Butonul Următorul calcul iniţializează elementele formularului pentru a trece la un alt

salariat.

Codul sursă aferent este: Public Class Form1

Dim NUME As String

Dim PRENUME As String

Dim SALARIU As Long

Dim FUNCTIA As String

Dim VEC As Integer

Dim PRIME As Single

Dim SPORV As Single 'SPOR DE VECHIME

Dim SPORT As Single 'SPOR DE TOXICITATE

Dim SPORN As Single 'SPOR DE NOAPTE

Dim PEN As Single 'PENALIZARI

Dim SALB As Single 'SALARIU BRUT

Dim IMPOZIT As Single

Dim CHIRII As Single

Dim RESTP As Single 'SUMA FINALA

Sub CALCUL()

SALB = SALARIU + SPORV + SPORN + SPORT + PRIME

RESTP = SALB - IMPOZIT - CHIRII - PEN

TextBox4.Text = Format(RESTP, "FIXED")

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

TextBox4.Text = ""

CheckBox1.Checked = 0

CheckBox2.Checked = 0

Page 57: Visual Basic

CheckBox3.Checked = 0

CheckBox4.Checked = 0

CheckBox5.Checked = 0

CheckBox6.Checked = 0

CheckBox7.Checked = 0

FUNCTIA = 0

VEC = 0

SPORV = 0

SPORT = 0

SPORN = 0

PRIME = 0

CHIRII = 0

SALB = 0

IMPOZIT = 0

PEN = 0

RESTP = 0

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles TextBox3.TextChanged

SALARIU = Val(TextBox3.Text)

CALCUL()

End Sub

Private Sub CheckBox1_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox1.Click

If CheckBox1.Checked Then

FUNCTIA = InputBox("FUNCTIA")

If UCase(FUNCTIA) = "DIRIGINTE" Then

PRIME = SALARIU * 3 / 100

ElseIf UCase(FUNCTIA) = "DIRECTOR" Then

PRIME = SALARIU * 4 / 100

Else

PRIME = 100000

End If

Else

PRIME = 0

End If

CALCUL()

End Sub

Private Sub CheckBox2_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox2.Click

If CheckBox2.Checked Then

VEC = InputBox("VECHIME")

If VEC < 3 Then

SPORV = 0

ElseIf VEC < 7 Then

SPORV = SALARIU * 3 / 100

ElseIf VEC < 15 Then

SPORV = SALARIU * 5 / 100

ElseIf VEC < 20 Then

SPORV = SALARIU * 7 / 100

ElseIf VEC = 0 Then

SPORV = SALARIU

ElseIf VEC > 20 Then

Page 58: Visual Basic

SPORV = SALARIU * 20 / 100

End If

Else

SPORV = 0

End If

CALCUL()

End Sub

Private Sub CheckBox3_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox3.Click

If CheckBox3.Checked Then

SPORT = 350000 'CONSTANT

Else

SPORT = 0

End If

CALCUL()

End Sub

Private Sub CheckBox4_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox4.Click

If CheckBox4.Checked Then

SPORN = 300000 'CONSTANT

Else

SPORN = 0

End If

CALCUL()

End Sub

Private Sub CheckBox5_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox5.Click

If CheckBox5.Checked Then

PEN = 15000 'SUMA CONSTANTA PENTRU ORICE ABATERE

Else

PEN = 0

End If

CALCUL()

End Sub

Private Sub CheckBox6_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox6.Click

If CheckBox6.Checked Then

SALB = SALARIU + SPORV + SPORT + SPORN + PRIME

If SALB < 606000 Then

IMPOZIT = SALB * 19 / 100

ElseIf SALB < 1300000 Then

IMPOZIT = 127000 + (SALB - 606000) * 21 / 100

Else

IMPOZIT = 320000 + (SALB - 130000) * 25 / 100

End If

Else

IMPOZIT = 0

End If

CALCUL()

End Sub

Private Sub CheckBox7_Click(ByVal sender As Object, ByVal e As

System.EventArgs) Handles CheckBox7.Click

If CheckBox7.Checked Then

CHIRII = InputBox("CHIRII")

Else

CHIRII = 0

Page 59: Visual Basic

End If

CALCUL()

End Sub

End Class

9. Să se realizeze un program care să calculeze maximul şi minimul pentru liniile şi coloanele unei

matrici ce se va introduce de la tastatură.

Se cere de la tastatură numărul de linii şi apoi, în mod asemănător, numărul de coloane.

Prin intermediul unei ferestre de dialog urmează precizarea valorii tuturor elementelor matricei

noastre.

La sfârşit se calculează şi se afişează rezultatele obţinute.

Page 60: Visual Basic

Codul sursă aferent se prezintă astfel:

Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

Dim a(0 To 100, 0 To 100)

Dim i, j, n, m As Integer

Dim maxL(0 To 100), maxC(0 To 100) As Integer

Page 61: Visual Basic

Dim maxLi, maxCi As Integer

Dim minL(0 To 100), minC(0 To 100) As Integer

Dim minLi, minCi As Integer

Dim pauza As String

pauza = Chr(13) & Chr(10)

Label1.Text = ""

Label2.Text = ""

n = InputBox("Introduceti numarul liniilor", "N=")

m = InputBox("introduceti numarul coloanelor", "M=")

For i = 1 To n

For j = 1 To m

a(i, j) = InputBox("A (" & i & "," & j & ") =")

Label3.Text = Label3.Text & a(i, j) & " "

Next j

Label3.Text = Label3.Text & pauza

Next i

For i = 1 To n

maxLi = a(i, 1)

For j = 2 To m

If maxLi < a(i, j) Then

maxLi = a(i, j)

End If

Next j

maxL(i) = maxLi

Next i

For j = 1 To m

maxCi = a(1, j)

For i = 2 To n

If maxCi < a(i, j) Then

maxCi = a(i, j)

End If

Next i

maxC(j) = maxCi

Next j

For i = 1 To n

minLi = a(i, 1)

For j = 2 To m

If minLi > a(i, j) Then

minLi = a(i, j)

End If

Next j

minL(i) = minLi

Next i

For j = 1 To m

minCi = a(1, j)

For i = 2 To n

If minCi > a(i, j) Then

minCi = a(i, j)

End If

Next i

minC(j) = minCi

Next j

Label3.Text = Label3.Text & pauza

For i = 1 To n

Label3.Text = Label3.Text & "Maximul de pe Linia " & i & " este

" & maxL(i) & pauza

Next i

Label3.Text = Label3.Text & pauza

For j = 1 To m

Label3.Text = Label3.Text & "Maximul de pe Coloana " & j & "

este " & maxC(j) & pauza

Page 62: Visual Basic

Next j

Label3.Text = Label3.Text & pauza

For i = 1 To n

Label3.Text = Label3.Text & "Minimul de pe Linia " & i & " este

" & minL(i) & pauza

Next i

Label3.Text = Label3.Text & pauza

For j = 1 To m

Label3.Text = Label3.Text & "Minimul de pe Coloana " & j & "

este " & minC(j) & pauza

Next j

End Sub

End Class

10. Să se realizeze o mică aplicaţie care să analizeze, într-un text dat, tipul caracterelor: majuscule sau

caractere mici.

Rezolvare:

Textul se va introduce în caseta de text şi rezultatul se va afişa chiar pe formular.

Am realizat două proceduri de tip funcţie, care stabilesc, pentru fiecare literă în parte, dacă este

majusculă sau nu, testând codul ASCII al acestora.

Se ştie că pentru majuscule codul Ascii are valori cuprinse între 65 şi 90, iar pentru literele mici între

97 şi 122.

Executând aplicaţia noastră se obţine:

Codul sursă se prezintă astfel:

Public Class Form1

Public Function IsUpper(ByVal CheckLetter As String) As Boolean

IsUpper = True

If Asc(CheckLetter) < 65 Or Asc(CheckLetter) > 90 Then

IsUpper = False

End If

End Function

Page 63: Visual Basic

Public Function IsLower(ByVal CheckLetter As String) As Boolean

IsLower = True

If Asc(CheckLetter) < 97 Or Asc(CheckLetter) > 122 Then

IsLower = False

End If

End Function

Public Sub Main()

Console.WriteLine(IsUpper("A"))

Console.WriteLine(IsUpper("a"))

Console.WriteLine(IsLower("A"))

Console.WriteLine(IsLower("a"))

Console.ReadLine()

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Button1.Click

Dim x As String

Dim y As Integer

Dim g As Boolean

Dim enter As String

x = TextBox1.Text

y = Len(x)

enter = Chr(13) & Chr(10)

For i = 1 To y

g = IsUpper(Mid(x, i, 1))

If g = "True" Then

Label2.Text = Label2.Text & "Caracterul " & i & " este

MAJUSCULA" & enter

Else

Label2.Text = Label2.Text & "Caracterul " & i & " este

litera mica " & enter

End If

Next i

End Sub

End Class

11. Să se realizeze un program care să preia nota obţinută la examenul de admintere şi, funcţie de

aceasta, să comunice candidatului dacă a intrat şi, în acest caz, la ce facultate.

Rezolvare:

Stabilim o grilă de medii de admitere la diversele facultăţi.

Page 64: Visual Basic

Codul sursa este urmatorul: Public Class Form1

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles Button1.Click

Dim Nota

Nota = TextBox1.Text

Select Case Nota

Case Is >= 9.5

Label3.Text = " Felicitari! " & vbCrLf & "Ati intrat

la INFORMATICA."

Case Is >= 8.5

Label3.Text = " Felicitari! " & vbCrLf & "Ati intrat

la Litere"

Case Is >= 7.5

Label3.Text = " Felicitari! " & vbCrLf & "Ati intrat

la Matematica/Fizica"

Case Is >= 5

Label3.Text = " Felicitari! " & vbCrLf & "Ati intrat

la METALURGIE"

Case Is <= 5

Label3.Text = " NE pare rau" & vbCrLf & "Ati PICAT"

End Select

End Sub

End Class

Page 65: Visual Basic

12. Să se proiecteze şi să se realizeze o aplicaţie care să rezolve o ecuaţie de gradul II dată de la

tastatură.

Public Class Form1

Dim A As Integer

Dim B As Integer

Dim C As Integer

Dim Delta As Double

Dim X1 As Double

Dim X2 As Double

Dim d As Double

Dim d2 As Double

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles Button1.Click

A = TextBox1.Text

B = TextBox2.Text

C = TextBox3.Text

If A <> "0" Then

Delta = B * B - 4 * A * C

If Delta < 0 Then

d = Delta * -1

d2 = System.Math.Sqrt(d)

X1 = -B & " +i " & d2 & " / " & 2 * A

X2 = -B & " -i " & d2 & " / " & 2 * A

Label6.Text = X1

Label7.Text = X2

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

Else

X1 = (-B + System.Math.Sqrt(Delta)) / 2 * A

X2 = (-B - System.Math.Sqrt(Delta)) / 2 * A

Label6.Text = X1

Page 66: Visual Basic

Label7.Text = X2

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

End If

Else

MsgBox("Functia nu este de gradul II")

TextBox1.Text = ""

TextBox2.Text = ""

TextBox3.Text = ""

End If

End Sub

End Class

13. Să se realizeze un program care să permită schimbul unei sume în lei într-o valută din lista afişată.

Codul sursă: Public Class Form1

Dim curs As Double

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles Button1.Click

End

End Sub

Private Sub RadioButton1_CheckedChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

RadioButton1.CheckedChanged

curs = InputBox("Introduceti cursul valutar pentru USD:")

TextBox2.Text = CStr(Format(Val(TextBox1.Text) / curs,

"FIXED")) + " USD"

End Sub

Private Sub RadioButton2_CheckedChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

RadioButton2.CheckedChanged

curs = InputBox("Introduceti cursul valutar pentru EURO:")

Page 67: Visual Basic

TextBox3.Text = CStr(Format(Val(TextBox1.Text) / curs,

"FIXED")) + " EURO"

End Sub

Private Sub RadioButton4_CheckedChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

RadioButton4.CheckedChanged

curs = InputBox("Introduceti cursul valutar pentru CHF:")

TextBox5.Text = CStr(Format(Val(TextBox1.Text) / curs,

"FIXED")) + " CHF"

End Sub

Private Sub RadioButton3_CheckedChanged(ByVal sender As

System.Object, ByVal e As System.EventArgs) Handles

RadioButton3.CheckedChanged

curs = InputBox("Introduceti cursul valutar pentru YE:")

TextBox4.Text = CStr(Format(Val(TextBox1.Text) / curs,

"FIXED")) + " YE"

End Sub

End Class

14. Să se realizeze o aplicaţie care să calculeze penalităţile pentru valoarea unor facturi,

funcţie de numărul zilelor de întârziere la plata facturii.

Calculul penalităţilor se face după următorul algoritm:

15. Dezvoltaţi aplicaţia anterioară, astfel încât pe prima formă să afişaţi textul “APLICAŢIE

PENTRU CALCUL PENALITĂŢI “ şi să permiteţi intrarea sau ieşirea din aplicaţie prin

intermediul a 2 butoane de comandă: Start şi Exit. Ca efect al acţionării butonului de Start să

apară o a doua formă, la care să cereţi parola de acces. Permiteţi cel mult trei încercări ale

parolei, după care blocaţi accesul la aplicaţie, permiţând doar acţionarea butonului Exit. Dacă

parola a fost corectă, permiteţi accesul la forma a treia, care cere datele şi calculează

penalităţile cerute.

Penalizări

(%)

Întârziere

(zile)

0 ≤ 30

5 (30,45)

10 [45,60)

20 ≥ 60

Page 68: Visual Basic

16. Să se realizeze o aplicaţie care să afişeze pe ecran un ceas cu limbi (ore, minute, secunde)

care merge (limbile se mişcă pentru a arăta ora exactă).

Rezolvare:

Executând aplicaţia se obţine:

Codul sursă al procedurilor asociate se prezintă astfel: Imports System.Drawing

Imports System.Math

Public Class Form1

Inherits System.Windows.Forms.Form

Page 69: Visual Basic

#Region " Windows Form Designer generated code "

Public Sub New()

MyBase.New()

InitializeComponent()

End Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

Private components As System.ComponentModel.IContainer

Friend WithEvents Timer1 As System.Windows.Forms.Timer

<System.Diagnostics.DebuggerStepThrough()> Private Sub

InitializeComponent()

Me.components = New System.ComponentModel.Container

Me.Timer1 = New System.Windows.Forms.Timer(Me.components)

Me.SuspendLayout()

'Timer1

Me.Timer1.Interval = 10

'Form1

Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

Me.ClientSize = New System.Drawing.Size(344, 302)

Me.MaximizeBox = False

Me.MaximumSize = New System.Drawing.Size(352, 336)

Me.MinimizeBox = False

Me.MinimumSize = New System.Drawing.Size(352, 336)

Me.Name = "Form1"

Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide

Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual

Me.Text = "Animation clock"

Me.ResumeLayout(False)

End Sub

#End Region

Dim bm As Bitmap

Dim g As Graphics

Dim PI As Double = 3.14159

Dim XC, YC, X, Y, R, Secundac As Integer

Dim unghi, AspectRatio As Double

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

bm = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)

g = Graphics.FromImage(bm)

'aflu coordonatele centrului formularului

XC = Me.ClientSize.Width / 2

YC = Me.ClientSize.Height / 2

AspectRatio = Me.ClientSize.Height / Me.ClientSize.Width

Draw_Graphics()

Me.BackgroundImage = bm

'variabila Secunda retine secunda curenta

Secundac = Now.Second

End Sub

Page 70: Visual Basic

Private Sub Draw_Graphics()

'aceasta procedura <<deseneaza>> pe rand elementele componente ale

ceasului

Draw_Clock_Face()

Draw_Clock_Markers()

Draw_Clock_Hands()

End Sub

Private Sub Draw_Clock_Hands()

'trasez limbile ceasului, prima data cea pentru ore, apoi pentru

minute si in final cea pentru secunde

Dim ora1, SS As Double ' variabile care incrementeaza secundele si

minutele

Dim ora, MIN, SEC As Integer 'variabile care pastreaza ora, minutul

si secunda curente

Dim MyBrush As New System.Drawing.SolidBrush(Color.FromArgb(64, 69,

69, 69)) 'setez limbile transparent

Dim fp(5) As Point 'fiecare brat are 5 puncte. Se salveaza aceste

puncte intr-un vector in

the point array

ora1 = (2 * PI) / 12 'formula pentru pasul de incrementare pentru

ora

SS = (2 * PI) / 60

MIN = Now.Minute 'variabila MIN retine minutul curent

SEC = Now.Second 'variabila SEC pastreaza secunda curenta

'desenez limba ceasului care imi indica ora

If Mid(Now.ToLongTimeString, Now.ToLongTimeString.Length - 2,

2).ToUpper.Trim = "PM" Then

'daca data sistemului este returnata cu PM adaugam 12 altfel o

lasam asa

ora = Now.Hour + 12

Else

ora = Now.Hour

End If

If Me.ClientSize.Width > Me.ClientSize.Height Then 'setam unghiul

care va determina ce tip de brat este

R = (Me.ClientSize.Height / 2) - 35

Else

R = (Me.ClientSize.Width / 2) - 35

End If

unghi = ora * ora1 - (3.2 * ora1) 'variabila unghi retine unghiul

de miscare si se calculeaza astfel:

' unghi = ora * ora1 - (3.2 * ora1)

' unghi = ora * ora1 - (2.8 * ora1)

' unghi = ora * ora1 - (3 * ora1)

' punctul de incepere al cercului este pozitia orei 3

X = Cos(unghi) * (R - 20) 'valoarea lui X pentru punctul din stanga

Y = (Sin(unghi) * (R - 20)) * AspectRatio ' valoarea lui Y pentru

punctul din stanga

fp(0) = New Point(XC, YC)

fp(1) = New Point(XC + X, YC + Y)

unghi = ora * ora1 - (2.8 * ora1)

X = Cos(unghi) * (R - 20)

Y = (Sin(unghi) * (R - 20)) * AspectRatio

fp(3) = New Point(XC + X, YC + Y)

unghi = ora * ora1 - (3 * ora1)

X = Cos(unghi) * R

Y = (Sin(unghi) * R) * AspectRatio

fp(2) = New Point(XC + X, YC + Y)

fp(4) = fp(0)

Page 71: Visual Basic

g.FillPolygon(MyBrush, fp)

g.DrawLine(Pens.Black, fp(0), fp(1))

g.DrawLine(Pens.Black, fp(1), fp(2))

g.DrawLine(Pens.Black, fp(2), fp(3))

g.DrawLine(Pens.Black, fp(3), fp(4))

'desenarea minutarului

unghi = MIN * SS - (16 * SS)

X = Cos(unghi) * (R - 40)

Y = (Sin(unghi) * (R - 40)) * AspectRatio

fp(0) = New Point(XC, YC)

fp(1) = New Point(XC + X, YC + Y)

unghi = MIN * SS - (14 * SS)

X = Cos(unghi) * (R - 40)

Y = (Sin(unghi) * (R - 40)) * AspectRatio

fp(3) = New Point(XC + X, YC + Y)

unghi = MIN * SS - (15 * SS)

X = Cos(unghi) * (R - 30)

Y = (Sin(unghi) * (R - 30)) * AspectRatio

fp(2) = New Point(XC + X, YC + Y)

fp(4) = fp(0)

g.FillPolygon(MyBrush, fp)

g.DrawLine(Pens.Black, fp(0), fp(1))

g.DrawLine(Pens.Black, fp(1), fp(2))

g.DrawLine(Pens.Black, fp(2), fp(3))

g.DrawLine(Pens.Black, fp(3), fp(4))

'secundarul

unghi = SEC * SS - (15 * SS)

X = Cos(unghi) * R

Y = (Sin(unghi) * R) * AspectRatio

fp(0) = New Point(XC, YC)

fp(1) = New Point(XC + X, YC + Y)

g.DrawLine(Pens.Black, fp(0), fp(1))

Array.Clear(fp, 0, fp.GetUpperBound(0))

fp = Nothing

MyBrush.Dispose()

MyBrush = Nothing

End Sub

Private Sub Draw_Clock_Markers()

Dim index As Integer

If Me.ClientSize.Width > Me.ClientSize.Height Then

R = (Me.ClientSize.Height / 2) - 25

Else

R = (Me.ClientSize.Width / 2) - 25

End If

index = 0

For unghi = 0 To 2 * PI Step (2 * PI) / 60

X = Cos(unghi) * R

Y = (Sin(unghi) * R) * AspectRatio

If index / 5 = Int(index / 5) Then

g.FillEllipse(Brushes.Firebrick, XC + X - 5, YC + Y - 5,

10, 10)

g.DrawEllipse(Pens.Black, XC + X - 5, YC + Y - 5, 10, 10)

Else

g.FillEllipse(Brushes.Firebrick, XC + X - 2, YC + Y - 2, 4,

4)

g.DrawEllipse(Pens.Black, XC + X - 2, YC + Y - 2, 4, 4)

End If

index += 1

Next

Page 72: Visual Basic

g.FillEllipse(Brushes.Black, XC - 5, YC - 5, 10, 10)

index = Nothing

End Sub

Private Sub Draw_Clock_Face()

Dim gp As New Drawing2D.GraphicsPath

Dim fp(1) As Point

Dim index As Integer

If Me.ClientSize.Width > Me.ClientSize.Height Then

R = (Me.ClientSize.Height / 2) - 15

Else

R = (Me.ClientSize.Width / 2) - 15

End If

index = 1

For unghi = 0 To 2 * PI Step 0.1

X = Cos(unghi) * R

Y = (Sin(unghi) * R) * AspectRatio

If X <> 0 And Y <> 0 Then

If index - 1 > fp.GetUpperBound(0) Then

ReDim Preserve fp(index)

End If

fp(index - 1) = New System.Drawing.Point(XC + X, YC + Y)

index += 1

End If

Next

gp.AddCurve(fp)

gp.CloseFigure()

g.FillPath(Brushes.GhostWhite, gp)

g.DrawPath(Pens.Black, gp)

Array.Clear(fp, 0, fp.GetUpperBound(0))

fp = Nothing

gp.Dispose()

gp = Nothing

index = Nothing

End Sub

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As

System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

bm.Dispose()

g.Dispose()

bm = Nothing

g = Nothing

PI = Nothing

XC = Nothing

YC = Nothing

X = Nothing

Y = Nothing

R = Nothing

unghi = Nothing

Secundac = Nothing

AspectRatio = Nothing

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles Timer1.Tick

If Secundac <> Now.Second Then

Secundac = Now.Second

Draw_Graphics()

Me.BackgroundImage = bm

Me.Refresh()

End If

Page 73: Visual Basic

End Sub

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As

System.EventArgs) Handles MyBase.Activated

If Timer1.Enabled = False Then Timer1.Enabled = True

End Sub

End Class

17. Să se proiecteze şi să se realizeze efectiv o interfaţă gen “Windows Explorer “ pentru

vizualizarea structurii de foldere şi fişiere şi unităţile de disc disponibile. Un dublu click pe un

fişier îl va deschide cu aplicaţia asociată (va lansa în execuţie un fişier executabil sau va

deschide pentru lucru un fişier sub Word, Excel etc).

Sugestie de rezolvare:

Codul sursa al programului este urmatorul: Imports ExpTreeLib

Imports ExpTreeLib.CShItem

Imports ExpTreeLib.SystemImageListManager

Imports System.IO

Imports System.Text

Imports System.Text.RegularExpressions

Imports System.Threading

#Const Ver = 2005

Public Class frmDragDrop

Inherits System.Windows.Forms.Form

Dim testTime As New DateTime(1, 1, 1, 0, 0, 0)

Page 74: Visual Basic

Private LastSelectedCSI As CShItem

Friend WithEvents txtDropOn As System.Windows.Forms.TextBox

Friend WithEvents mnuChangeRoot As System.Windows.Forms.MenuItem

Friend WithEvents mnuRefreshTree As System.Windows.Forms.MenuItem

Friend WithEvents mnuSetToDesktop As System.Windows.Forms.MenuItem

Friend WithEvents mnuExit As System.Windows.Forms.MenuItem

Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem

Friend WithEvents mnuViewLargeIcons As System.Windows.Forms.MenuItem

Friend WithEvents mnuViewSmallIcons As System.Windows.Forms.MenuItem

Friend WithEvents mnuViewList As System.Windows.Forms.MenuItem

Friend WithEvents mnuViewDetails As System.Windows.Forms.MenuItem

Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem

Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

Private Shared Event1 As New ManualResetEvent(True)

#Region " Windows Form Designer generated code "

Public Sub New()

MyBase.New()

InitializeComponent()

SystemImageListManager.SetListViewImageList(lv1, False, False)

SystemImageListManager.SetListViewImageList(lv1, True, False)

#If Ver = 2005 Then

Control.CheckForIllegalCrossThreadCalls = False

#End If

End Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

Private components As System.ComponentModel.IContainer

Friend WithEvents Panel1 As System.Windows.Forms.Panel

Friend WithEvents ExpTree1 As ExpTreeLib.ExpTree

Friend WithEvents Splitter1 As System.Windows.Forms.Splitter

Friend WithEvents Panel2 As System.Windows.Forms.Panel

Friend WithEvents cmdExit As System.Windows.Forms.Button

Friend WithEvents sbr1 As System.Windows.Forms.StatusBar

Friend WithEvents lv1 As System.Windows.Forms.ListView

Friend WithEvents ColumnHeaderName As System.Windows.Forms.ColumnHeader

Friend WithEvents ColumnHeaderSize As System.Windows.Forms.ColumnHeader

Friend WithEvents ColumnHeaderType As System.Windows.Forms.ColumnHeader

Friend WithEvents ColumnHeaderModifyDate As

System.Windows.Forms.ColumnHeader

Friend WithEvents ColumnHeaderAttributes As

System.Windows.Forms.ColumnHeader

<System.Diagnostics.DebuggerStepThrough()> Private Sub

InitializeComponent()

Me.SuspendLayout()

'

'frmDragDrop

'

Me.ClientSize = New System.Drawing.Size(560, 363)

Me.Name = "frmDragDrop"

Me.ResumeLayout(False)

Page 75: Visual Basic

End Sub

#End Region

#Region "Form Exit Methods"

Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles cmdExit.Click

mnuExit_Click(sender, e)

End Sub

Private Sub mnuExit_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles mnuExit.Click

Me.Close()

End Sub

#End Region

#Region "Form Load"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As

System.EventArgs) Handles MyBase.Load

#If Ver = 2005 Then

Control.CheckForIllegalCrossThreadCalls = False

#End If

End Sub

#End Region

#Region " ExplorerTree Event Handling"

Private Sub AfterNodeSelect(ByVal pathName As String, ByVal CSI As

CShItem) Handles ExpTree1.ExpTreeNodeSelected

Dim dirList As New ArrayList()

Dim fileList As New ArrayList()

Dim TotalItems As Integer

LastSelectedCSI = CSI

If CSI.DisplayName.Equals(CShItem.strMyComputer) Then

dirList = CSI.GetDirectories

Else

dirList = CSI.GetDirectories

fileList = CSI.GetFiles

End If

Event1.WaitOne()

TotalItems = dirList.Count + fileList.Count

If TotalItems > 0 Then

Dim item As CShItem

dirList.Sort()

fileList.Sort()

Me.Text = pathName

sbr1.Text = pathName & " " & _

dirList.Count & " Directories " & fileList.Count &

" Files"

Dim combList As New ArrayList(TotalItems)

combList.AddRange(dirList)

combList.AddRange(fileList)

lv1.BeginUpdate()

lv1.Items.Clear()

lv1.Refresh()

For Each item In combList

Dim lvi As New ListViewItem(item.DisplayName)

With lvi

If Not item.IsDisk And item.IsFileSystem Then

Dim attr As FileAttributes

attr = GetAttr(item.Path)

Dim SB As New StringBuilder()

Page 76: Visual Basic

If (attr And FileAttributes.System) =

FileAttributes.System Then SB.Append("S")

If (attr And FileAttributes.Hidden) =

FileAttributes.Hidden Then SB.Append("H")

If (attr And FileAttributes.ReadOnly) =

FileAttributes.ReadOnly Then SB.Append("R")

If (attr And FileAttributes.Archive) =

FileAttributes.Archive Then SB.Append("A")

.SubItems.Add(SB.ToString)

Else : .SubItems.Add("")

End If

If Not item.IsDisk And item.IsFileSystem And Not

item.IsFolder Then

If item.Length > 1024 Then

.SubItems.Add(Format(item.Length / 1024, "#,###

KB"))

Else

.SubItems.Add(Format(item.Length, "##0 Bytes"))

End If

Else

.SubItems.Add("")

End If

.SubItems.Add(item.TypeName)

If item.IsDisk Then

.SubItems.Add("")

Else

If item.LastWriteTime = testTime Then

.SubItems.Add("")

Else

.SubItems.Add(item.LastWriteTime)

End If

End If

.Tag = item

End With

lv1.Items.Add(lvi)

Next

lv1.EndUpdate()

LoadLV1Images()

Else

lv1.Items.Clear()

sbr1.Text = pathName & " Has No Items"

End If

End Sub

#End Region

#Region " IconIndex Loading Thread"

Private Sub LoadLV1Images()

Dim ts As New ThreadStart(AddressOf DoLoadLv)

Dim ot As New Thread(ts)

#If Ver = 2005 Then

ot.SetApartmentState(ApartmentState.STA)

#Else

ot.ApartmentState = ApartmentState.STA

#End If

Event1.Reset()

ot.Start()

End Sub

Page 77: Visual Basic

Private Sub DoLoadLv()

Dim lvi As ListViewItem

For Each lvi In lv1.Items

lvi.ImageIndex = SystemImageListManager.GetIconIndex(lvi.Tag,

False)

Next

Event1.Set()

End Sub

#End Region

#Region " Drag From Routines"

Private Sub lv1_ItemDrag(ByVal sender As Object, ByVal e As

System.Windows.Forms.ItemDragEventArgs) Handles lv1.ItemDrag

With lv1

If .SelectedItems.Count > 0 Then

Dim toDrag As New ArrayList()

Dim lvItem As ListViewItem

Dim strD(.SelectedItems.Count - 1) As String

Dim i As Integer

For Each lvItem In .SelectedItems

toDrag.Add(lvItem.Tag)

strD(i) = CType(lvItem.Tag, CShItem).Path

i += 1

Next

Dim Dobj As New DataObject()

Dim ms As MemoryStream

ms = CProcDataObject.MakeShellIDArray(toDrag)

With Dobj

If Not ms Is Nothing Then

.SetData("Shell IDList Array", True, ms)

End If

.SetData("FileDrop", True, strD)

.SetData(toDrag)

End With

Dim dEff As DragDropEffects

If e.Button = Windows.Forms.MouseButtons.Right Then

dEff = DragDropEffects.Copy Or DragDropEffects.Move Or

DragDropEffects.Link

Else

dEff = DragDropEffects.Copy Or DragDropEffects.Move

End If

Dim res As DragDropEffects = .DoDragDrop(Dobj, dEff)

End If

End With

End Sub

#End Region

Private Sub lv1_DoubleClick(ByVal sender As Object, ByVal e As

System.EventArgs) Handles lv1.DoubleClick

Dim csi As CShItem = lv1.SelectedItems(0).Tag

If csi.IsFolder Then

ExpTree1.ExpandANode(csi)

Else

Try

Process.Start(csi.Path)

Catch ex As Exception

MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Error in starting

application")

End Try

End If

Page 78: Visual Basic

End Sub

Private Sub txtDropOn_DragEnter(ByVal sender As Object, ByVal e As

System.Windows.Forms.DragEventArgs) Handles txtDropOn.DragEnter

If e.Data.GetDataPresent("FileDrop", True) And _

((e.AllowedEffect And DragDropEffects.Copy) =

DragDropEffects.Copy) Then

e.Effect = DragDropEffects.Copy

Else

e.Effect = DragDropEffects.None

End If

End Sub

Private Sub txtDropOn_DragDrop(ByVal sender As Object, ByVal e As

System.Windows.Forms.DragEventArgs) Handles txtDropOn.DragDrop

Dim fList() As String = e.Data.GetData("FileDrop", True)

txtDropOn.Text = ""

Dim S As String

For Each S In fList

txtDropOn.Text += S & vbCrLf

Next

e.Effect = DragDropEffects.None

End Sub

Private Sub SAY(ByVal S As String)

txtDropOn.Text += S & vbCrLf

Debug.WriteLine(S)

End Sub

Private Sub mnuRefreshTree_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles mnuRefreshTree.Click

ExpTree1.RefreshTree()

End Sub

Private Sub mnuChangeRoot_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) Handles mnuChangeRoot.Click

ExpTree1.RootItem = ExpTree1.SelectedItem

End Sub

Private Sub mnuSetToDesktop_Click(ByVal sender As System.Object, ByVal

e As System.EventArgs) Handles mnuSetToDesktop.Click

ExpTree1.RootItem = CShItem.GetDeskTop

End Sub

#Region " Test Routines"

Private Sub mnuShowSpecial_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs)

Dim eNames() As String = [Enum].GetNames(GetType(ExpTree.StartDir))

Dim eNums() As ShellDll.CSIDL =

[Enum].GetValues(GetType(ExpTree.StartDir))

Dim CSI As CShItem

Dim i As Integer

For i = 0 To eNames.Length - 1

Debug.WriteLine("Getting Item for -- " & eNames(i))

Try

CSI = New CShItem(eNums(i))

CSI.DebugDump() : CShItem.DumpPidl(CSI.PIDL)

Catch ex As Exception

Debug.WriteLine("Error on making new CShitem")

Page 79: Visual Basic

End Try

Debug.WriteLine("")

Next

End Sub

Private Sub mnuMakeDigest_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs)

Dim SR As New StreamReader("F:\DragNDropV4\LegalCSIDL.txt")

Dim SW As New StreamWriter("F:\DragNDropV4\LegalCSIDLDigest.txt",

False)

Dim PidlOne As Boolean = False

Do While SR.Peek <> -1

Dim inp As String = SR.ReadLine()

Dim tInp As String = inp.Trim

If tInp.Length > 0 Then

If tInp.StartsWith("Getting") OrElse _

tInp.StartsWith("Error") OrElse _

tInp.StartsWith("DisplayName") OrElse _

tInp.StartsWith("Path") OrElse _

tInp.StartsWith("IsFileSystem") OrElse _

tInp.StartsWith("PIDL") OrElse _

tInp.StartsWith("TypeName") Then

SW.WriteLine(inp)

Debug.WriteLine(inp)

PidlOne = False

ElseIf tInp.StartsWith("ItemID #1") Then

PidlOne = True

SW.WriteLine(inp)

Debug.WriteLine(inp)

ElseIf tInp.StartsWith("ItemID") Then

SW.WriteLine(inp)

Debug.WriteLine(inp)

PidlOne = False

ElseIf PidlOne Then

SW.WriteLine(inp)

Debug.WriteLine(inp)

End If

End If

Loop

SR.Close()

SW.Close()

End Sub

Private Sub mnuTestcPidl_Click(ByVal sender As System.Object, ByVal e

As System.EventArgs)

Dim CSI As CShItem = CShItem.GetDeskTop

dumpCPidl(CSI)

CSI = New CShItem(ShellDll.CSIDL.DESKTOPDIRECTORY)

dumpCPidl(CSI)

CSI = New CShItem("C:\Temp")

dumpCPidl(CSI)

CSI = New CShItem("F:\DragNDropV4\ClipSpy\src")

dumpCPidl(CSI)

CSI = New CShItem(ShellDll.CSIDL.NETHOOD)

dumpCPidl(CSI)

Dim b(14) As Byte

b(0) = 43

Debug.WriteLine("An Invalid Pidl Tests" & IIf(IsValidPidl(b), "

IsValid", " Is NOT Valid"))

End Sub

Page 80: Visual Basic

Private Sub dumpCPidl(ByVal CSI As CShItem)

Dim cp As cPidl = CSI.clsPidl

Dim o() As Object = cp.Decompose

Debug.WriteLine(CSI.DisplayName)

DumpPidl(CSI.PIDL)

Dim b() As Byte

Dim i As Integer = 1

For Each b In o

Debug.Write("cPidl Item #" & i & IIf(IsValidPidl(b), "

IsValid", " Is NOT Valid"))

DumpHex(b)

i += 1

Next

End Sub

Private Sub mnuTestFindCShItem_Click(ByVal sender As System.Object,

ByVal e As System.EventArgs)

ExpTreeLib.Tests.TestFindCShItem()

End Sub

Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As

System.EventArgs)

Dim xxx As CShItem = GetCShItem("C:\")

testJoinBytes(xxx)

xxx = GetCShItem(CType(GetDeskTop.GetItems()(3), CShItem).Path)

testJoinBytes(xxx)

Dim yyy As CShItem = GetCShItem(ShellDll.CSIDL.APPDATA)

xxx = CType(yyy.GetDirectories()(3), CShItem)

testJoinBytes(xxx)

End Sub

Private Sub testJoinBytes(ByVal xxx As CShItem)

Debug.WriteLine("Testing PIDL of -- " & xxx.DisplayName)

DumpPidl(xxx.PIDL)

Dim o() As Object = xxx.clsPidl.Decompose

Dim R() As Byte = o(0)

Debug.WriteLine("Joining Pidls, Step 0")

DumpHex(R)

Dim i As Integer

For i = 1 To o.Length - 1

R = cPidl.JoinPidlBytes(R, o(i))

Debug.WriteLine("Joining Pidls, Step " & i)

DumpHex(R)

Next

End Sub

#End Region

End Class