Sunteți pe pagina 1din 8

1

Laboratorul 1
Primii pai n Visual C#


Ce ne propunem astzi?

n laboratorul de astzi ne propunem crearea unei aplicaii simple pentru
evidena studenilor unei faculti. n cadrul acestei aplicaii vom utiliza cteva
dintre facilitile POO oferite de Visual C#. Din pcate vom arta numai o mic
parte din acestea, urmnd s nvm mai mult la curs i pe parcursul lucrrilor
de laborator ce vor urma.

Microsoft Visual Studio .NET este un mediu de dezvoltare folosit pentru crearea de aplicaii
n limbajele de programare: C#, Visual Basic, C++ sau F#.
Visual Studio .NET dispune de un editor complex de cod, care se folosete pentru crearea,
modificarea i depanarea codului aplicaiei (poate fi vorba de cod Visual Basic .NET, Visual C#
.NET etc.). De asemenea, ofer un set de obiecte i instrumente cu ajutorul crora se pot
realiza cu uurin interfee cu utilizatorul pentru Windows, Web, servicii WEB etc.
Visual C# .NET (sau, mai simplu, C#) este un limbaj de programare care face parte din familia
de limbaje .NET, dup cum o sugereaz i numele, care pstreaz sintaxa specific limbajelor
din categoria C. Este un limbaj modern, puternic, complet orientat pe obiecte, cel puin la
fel de valoros ca Visual Basic, Visual C++ sau Java, care permite dezvoltarea att de aplicaii
Windows ct i de aplicaii i servicii WEB.
O aplicaie tipic Windows, realizat n C#, afieaz una sau mai multe ferestre coninnd
obiecte cu care utilizatorul va interaciona. Obiectele vizuale ale aplicaiei sunt ferestrele
(denumite de asemenea Forms, sau formulare) i controalele desenate pe ele. n cadrul
unei aplicaii Windows formularele sunt elementele de baz ale interfeei cu utilizatorul. n
C# formularele sunt complet orientate pe obiecte, ele reprezentnd de fapt clase.
n momentul n care se creeaz un nou formular, fie deschiznd un proiect nou de tip
Windows Forms Application, fie adugnd un nou formular proiectului existent (prin
comanda Add Windows Form din meniul Project), i se adaug de fapt proiectului o clas care
deriv din clasa System.Windows.Forms.Form, creia i se mai spune pe scurt clasa Form, iar
noua clas motenete toi membrii clasei existente.
Controalele reprezint suportul interfeei cu utilizatorul, al dialogului cu acesta. Acestea nu
pot exista independent de formular, formularul fiind din acest punct de vedere un container
pentru controale.
Dup crearea formularelor i adugarea controalelor dorite pe acestea, programatorul
trebuie s adauge cod surs i s-l ataeze unor evenimente care s permit utilizatorilor s
interacioneze cu programul. De exemplu, dac se dorete ca la apsarea unui buton de
comand s se deschid un formular, n metoda corespunztoare evenimentului Click
asociat acelui buton se va plasa codul corespunztor deschiderii i afirii formularului.
Evenimentele se produc ca urmare a aciunilor utilizatorului (de exemplu, apsarea unei
taste, efectuarea unui click sau deplasarea cursorului de mouse), a execuiei programului,
Laborator 1 MTP

2
sau pot fi declanate de sistem. Producerea unui eveniment (Click, Double Click, Drag&Drop,
KeyPress etc.) declaneaz execuia unei proceduri eveniment. Utilizatorul poate scrie
propriul cod n corpul acestei proceduri. Apelarea unei proceduri eveniment pentru un
obiect dat se face automat, dac obiectul e focalizat i dac se produce o aciune care s
declaneze respectivul eveniment. Procedura eveniment poate fi apelat i prin cod, la fel ca
orice alt procedur, ns acest lucru nu va duce i la declanarea evenimentului asociat.
Metodele obiectelor vizuale, spre deosebire de procedurile eveniment, sunt read-only. Ele
pot fi doar apelate. Exist cteva metode comune tuturor obiectelor vizuale, n rest fiecare
obiect avnd propriile lui metode. Metodele se apeleaz n felul urmtor:
Nume_Obiect.Nume_Metoda(Lista_Argumente);
Att formularele ct i controalele au asociate un set de proprieti prin intermediul crora
pot fi setate caracteristici ale acestora, cum ar fi:
poziia i dimensiunea
stilul i comportamentul
aspectele grafice etc.
Unele proprieti pot fi modificate la proiectare (folosind fereastra de proprieti), altele pot
fi modificate doar n timpul execuiei, iar altele permit accesul att la proiectare ct i la
execuie. La execuie, valoarea unei proprieti poate fi modificat prin instruciuni de
forma:
Nume_Obiect.Nume_Proprietate = Valoare;
Realizarea unei aplicaii de tip Windows Forms Application n C# implic, n linii mari, parcur-
gerea urmtoarelor etape:
proiectarea mental sau pe hrtie a interfeei utilizator,
crearea unui proiect nou,
crearea de formulare (unul pentru fiecare fereastr a aplicaiei),
adugarea de controale formularelor, folosind caseta de instrumente (ToolBox),
crearea unei bare de meniu i/sau a unei bare de instrumente (ToolBar) pentru
funciile principale ale aplicaiei (opional),
setarea proprietilor formularelor i controalelor,
scrierea codului (declaraii de variabile, funcii, proceduri sau clase, respectiv
asocierea de cod pentru evenimentele obiectelor vizuale),
testarea aplicaiei,
crearea fiierului executabil i a kit-ului de distribuie.


Noiuni elementare de Programare Orientat pe Obiecte n C#

Clase i proprieti
O clas poate conine cmpuri, metode sau proprieti. Membrii claselor pot avea oricare
din specificatorii de acces: public, protected internal, protected, internal sau private.
Proprietile reprezint modaliti de expunere public a cmpurilor private ale unei clase,
putnd, la nevoie, s ofere numai drept de citire (read only), numai drept de scriere (write
only), sau i drept de citire i de scriere (read-write). Avantajul utilizrii proprietilor este
acela c ele permit scrierea de cod asociat operaiilor de atribuire i verificarea n acest fel a
validitii datelor transmise.
Primii pai n Visual C# .NET
3
n exemplul de mai jos se definete clasa Persoana care are dou cmpuri private i dou
proprieti publice care acceseaz cmpurile private nume i varsta. Proprietatea
NumePersoana poate fi accesat att n mod citire ct i n mod scriere, pe cnd proprietatea
VarstaPersoana poate fi accesat numai n mod citire.
class Persoana
{
private string nume;
private byte varsta;

public string NumePersoana //proprietate read-write
{
get { return nume; }
set { nume=value; }
}

public byte VarstaPersoana //proprietate read-only
{
get { return varsta; }
}
}

Interfee
O interfa nu poate conine cod executabil, numai semnturi de metode, proprieti,
evenimente sau indexatori. O clas sau structur care implementeaz interfaa trebuie s
implementeze membrii specificai n definiia interfeei. Codul din fiecare proprietate i
metod implementat poate s difere de la clas la clas, semantica fiecrei metode fiind
pstrat. Faptul c fiecare clas poate implementa aceeai proprietate sau metod ntr-un
mod diferit reprezint baza pentru comportamentul polimorfic.
Putei defini o interfa n C# astfel:
interface Interfata
{
string Denumire { get; set; }
int Valoare { get; }
void Init();
}
Iat cum ar arta o clas care implementeaz interfaa definit mai sus:
class Clasa : Interfata
{
string nume;
int n;

string Interfata.Denumire
{
get { return nume; }
set { nume = value; }
}
int Interfata.Valoare
{
get { return n; }
}
void Interfata.Init()
{
}
}

Laborator 1 MTP

4
Motenire
n C#, o clas poate moteni numai o singur clas de baz. Totui, o clas poate implementa
mai multe interfee. Pentru a putea observa modul de utilizare a motenirii n C#, vom defini
o clas de baz:
class Persoana
{
public string Nume;
public string Prenume;

//constructor cu parametri
public Persoana(string nume, string prenume)
{
Nume = nume;
Prenume = prenume;
}

public string NumeComplet()
{
return Nume + " " + Prenume;
}
}
Pentru a deriva clasa Angajat din Persoana avei nevoie s o declarai ca n exemplul de mai
jos. Observai modul n care constructorul clasei derivate apeleaz explicit constructorul
clasei de baz:
//clasa Angajat motenete clasa Persoana
class Angajat : Persoana
{
public int salariu;
public Angajat(int salar, string nume, string prenume)
: base(nume, prenume)
{
}
}


Partea practic a laboratorului
n cadrul acestui laborator se va crea n C# o aplicaie de tip Windows Forms Application a
crei interfa grafic o putei vedea n Figura 1. Aplicaia va permite:
crearea unei structuri de clase i a unei liste generice de studeni,
afiarea ntr-un control de tip ListBox a studenilor din cadrul unei faculti,
adugarea unui nou student,
ordonarea studenilor dup nume,
ordonarea studenilor dup medie,
afiarea studenilor dintr-un anumit an de studiu,
cutarea unui student dup nume,
tergerea studentului selectat n controlul de tip ListBox.
Primii pai n Visual C# .NET
5

Figura 1. Fereastra aplicaiei
Sfaturi utile

Nu pierdei timpul ncercnd s construii o interfa grafic extraordinar de
spectaculoas. Axai-v n principal asupra aspectului funcional al aplicaiei.
ncercai s implementai toate cerinele aplicaiei, apoi testai aplicaia i
eliminai posibilele erori!


Mod de lucru
Iat paii care trebuie urmai pentru dezvoltarea cu succes a aplicaiei:
1. Se creeaz un proiect Visual C# nou de tip Windows Forms Application. Reinei care
este directorul n care va fi salvat proiectul, iar dac este nevoie modificai-l.
2. Se deseneaz interfaa grafic a aplicaiei prin
adugarea de controale pe fereastra prezentat
n Figura 1. Controalele pot fi adugate pe
suprafaa ferestrei numai prin selectarea lor n
prealabil din panoul ToolBox situat n stnga
ferestrei Visual Studio (vezi Figura 2).





Figura 2. Panoul ToolBox.
Laborator 1 MTP

6
Principalele tipuri de controale care apar pe suprafaa ferestrei sunt:
TextBox: pentru introducerea numelui studentului.
NumericUpDown: pentru selectarea vrstei.
ComboBox: pentru selectarea anului de studiu i a notelor studentului.
Label: pentru etichetele text din stnga controalelor amintite mai sus.
Button: pentru butoanele de adugare a studenilor n list, ordonare, afiare i
cutare a lor.
GroupBox: pentru controlul care grupeaz butoanele. Acesta este un control de
tip container (conine i grupeaz alte controale) i trebuie adugat pe fereastr
naintea controalelor coninute.
ListBox: pentru lista care va afia datele studenilor.
3. Se modific proprietile ferestrelor i controalelor din panoul Properties (implicit situat
n partea dreapta-jos a ferestrei Visual Studio). De exemplu, pentru modificarea textului
afiat pe suprafaa controalelor se modific proprietatea Text. Proprietatea Name se
refer la numele controlului cu care acesta poate fi referit prin cod. Pentru popularea
controalelor ComboBox cu valori se folosete proprietatea Items.
Observaie:
Pe parcursul dezvoltrii aplicaiei vei avea nevoie s folosii att designerul de
interfee grafice ct i editorul de cod. Pentru a comuta ntre ele putei accesa
comenzile de meniu View -> Code i View -> Designer.
4. Se definesc dou clase: clasa Persoana (clas de baz) i clasa Student (clas derivat).
o Clasa Persoana va avea ca membri:
Variabile protected: string nume, byte varsta
Un constructor cu parametri pentru iniializarea cmpurilor clasei.
o Clasa Student va avea ca membri:
Variabile private: byte an, byte[] note (vector de 5 valori byte).
Vectorul note se va declara n felul urmtor:
byte[] note = new byte[5];
Proprieti publice read-only: byte AnStudiu, string NumeStudent
Metode publice: float Medie(), string AfisareStudent()
Un constructor cu parametri pentru iniializarea cmpurilor clasei.
Atenie la modul n care acesta va apela explicit constructorul clasei de
baz!
Observaii:
Proprietile read-only NumeStudent i AnStudiu din clasa Student, dau acces n
mod citire la datele studentului, care altfel nu ar fi fost accesibile din afara clasei.
Cele dou clase pot fi create fie n fiierul Form1.cs n care este implementat
clasa Form1 (adugnd la namespace cele dou clase noi), fie n fiiere distincte,
prin comanda de meniu Project -> Add Class.
Observai modul n care este declarat clasa Form1. Ea este declarat ca parial
deoarece Visual Studio .NET va plasa codul aferent interfeei grafice ntr-un fiier
separat: Form1.Designer.cs, care devine n timpul compilrii parte a aceleiai
clase. Acest fiier conine instruciuni pentru desenarea ferestrei i a tuturor
controalelor componente.
Primii pai n Visual C# .NET
7
5. Se implementeaz o list generic de obiecte de tip Student. O list generic reprezint
o list de obiecte care pot fi accesate prin index. Listele generice ofer metode pentru
cutare, sortare i manipulare a elementelor din list.
Exemplu de utilizare:
//declarare lista generica
private List<Student> lista = new List<Student>();

...

Student s = new Student(/*lista parametri*/);
lista.Add(s); //adaugarea unui element in lista

...

lista[0].AfisareStudent(); //accesarea metodelor unui element din lista
Toate operaiile asupra studenilor se vor efectua nti asupra listei generice (adugare,
tergere, sortare) i de abia dup aceea studenii din list vor fi afiai n controlul ListBox
(preferabil, ntr-o bucl foreach):
foreach(Student s in lista)
lstStudenti.Items.Add(s.AfisareStudent());
Datele preluate din controalele de tip ComboBox sunt de tip string, astfel c va fi nevoie de
conversia lor explicit la un tip de date numeric. Iat cum va arta, de exemplu, apelul
constructorului clasei Student:
Student s = new Student(Convert.ToByte(cmbAn.Text), n, txtNume.Text,
(byte)numVarsta.Value);
6. Se vor prevedea modaliti de verificare a validitii datelor introduse de la tastatur
(cazul variabilelor numerice), prin utilizarea blocurilor trycatch.
Exemplu de utilizare:
try
{
//instructiunile care pot provoca aparitia unei erori
}
catch (Exception ex)
{
//Tratarea erorii si eventual afisarea mesajului de eroare:
MessageBox.Show(ex.Message);
}
7. Sortarea studenilor se va face prin metoda sort a listei generice. Pentru fiecare tip de
sortare (dup nume i dup medie) trebuie definit cte o clas care s implementeze
interfaa IComparer i s suprancarce metoda Compare pentru a-i da sensul dorit.
Interfaa IComparer are un singur membru: metoda public Compare, care primete doi
parametri de tipul obiectelor ce trebuie sortate i va returna -1, 0 sau 1 n funcie de
rezultatul comparrii celor doi membri (mai mic, egal, mai mare).
class ComparaMedie : IComparer<Student>
{
public int Compare(Student x, Student y)
{
if (x.Medie() > y.Medie())
return 1;
else if (x.Medie() == y.Medie())
return 0;
else
return -1;
}
}
Laborator 1 MTP

8
Cu ce ne-am ales?

Prin aplicaia dezvoltat n cadrul laboratorului de astzi am reuit s ne
familiarizm pe de-o parte cu stilul de programare Visual C# .NET, iar pe de alt
parte am luat contact cu o parte din facilitile POO oferite de acest limbaj.


Bibliografie

Visual C# Resources: http://msdn.microsoft.com/en-us/vstudio/hh341490