You are on page 1of 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 I con
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 WindowStatestabileş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 Resizeal 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 Hidesau 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.


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.




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ă
(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ă.
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:
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 EXI T_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.
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).

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

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.


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

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

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

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).
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.
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 SHI FT 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 I tems.Count a unei liste returnează numărul de articole din listă.
Proprietatea SelectedI ndex 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;
- 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 I tems, 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 I tems, î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 I tems, al cărei format este:
Nume casetă.I tems (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).
I tems.Remove este metoda care permite ştergerea unui articol din listă, având formatul
general:
Nume casetă.I tems.RemoveAt( index)
Pentru ştergerea tuturor articolelor din listă se utilizează metoda Items.Clear, cu formatul:
Nume casetă.I tems.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:


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

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
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:
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ă.
(Ş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



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
(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.
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 I mage 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 I mage.
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
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
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:
- I nputBox 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 I nputBox 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:
I nputBox(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ă.

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:
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 I nteger 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:

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






Î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

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


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

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:



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.

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


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:






În urma execuţiei se obţine:









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:

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

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






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





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.



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







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

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.





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

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
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:")
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


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

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

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()
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

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
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")
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

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