curs c# infoiasi g negara

203
Dezvoltare de aplicatii in Visual Studio .NET Presented by developerWorks, your source for great tutorials ibm.com/developerWorks Table of Contents If you're viewing this document online, you can click any of the topics below to link directly to that section. 1. Despre manual si despre autorul sau ............................... 2 2. Introducere in .NET Framework - I .................................. 3 3. Tipuri de date si membri- II ........................................... 12 4. Gestionarea interfetelor utilizator - III ............................... 35 5. Concepte POO in Visual Studio .NET - IV ......................... 61 6. Testarea si debugging-ul aplicatiilor - V ............................ 80 7. Accesarea bazelor de date. ADO.NET - VI ........................ 98 8. GDI+. Controale utilizator. Atribute - VII ............................ 122 9. Programare folosind fire de executie - VIII ......................... 140 10. .NET Framework Advanced - IX ................................... 142 11. Assemblies. Aplicatii - configurare, securizare, instalare, rulare - X .................................................................... 158 12. XML, Web Services - XI ............................................. 177 13. ASP.NET - XII ......................................................... 187 14. Appendix ............................................................... 202 15. Bibliografie, referinte ................................................. 203 Dezvoltare de aplicatii in Visual Studio .NET Page 1 of 203

Upload: marian

Post on 24-Nov-2015

224 views

Category:

Documents


11 download

DESCRIPTION

Curs C#

TRANSCRIPT

  • Dezvoltare de aplicatii in Visual Studio.NET

    Presented by developerWorks, your source for great tutorials

    ibm.com/developerWorks

    Table of ContentsIf you're viewing this document online, you can click any of the topics below to link directly to that section.

    1. Despre manual si despre autorul sau............................... 22. Introducere in .NET Framework - I .................................. 33. Tipuri de date si membri- II ........................................... 124. Gestionarea interfetelor utilizator - III ............................... 355. Concepte POO in Visual Studio .NET - IV ......................... 616. Testarea si debugging-ul aplicatiilor - V ............................ 807. Accesarea bazelor de date. ADO.NET - VI ........................ 988. GDI+. Controale utilizator. Atribute - VII............................ 1229. Programare folosind fire de executie - VIII......................... 14010. .NET Framework Advanced - IX ................................... 14211. Assemblies. Aplicatii - configurare, securizare, instalare,rulare - X ....................................................................

    158

    12. XML, Web Services - XI ............................................. 17713. ASP.NET - XII ......................................................... 18714. Appendix ............................................................... 20215. Bibliografie, referinte ................................................. 203

    Dezvoltare de aplicatii in Visual Studio .NET Page 1 of 203

  • Section 1. Despre manual si despre autorul sau

    Despre manual...Manualul contine tematica cursului "Dezvoltare deaplicatii in Visual Studio .NET" si se adreseaza, inprimul rand, studentilor Facultatii de Informaticacare au optat sa urmeze acest curs. Cititorii acestuimanual trebuie sa posede cunostinte medii deprogramare orientata obiect si sa fie familiarizati cumedii de programare vizuala. In plus, o doza deambitie este suficienta pentru a garanta o bunaasimilare a cunostintelor de Visual Studio .NET si,in particular, de C# pe care autorul intentioneazasa le transmita.

    Despre autor...Gabriel NEGARA

    Preparator universitar, Facultatea de Informatica, IASI Lucrare de licenta, iunie 2002 - Ant Colony Optimisation Master, iunie 2003 - Tehnici de clasificare in Data Mining MCP 70-316 feb. 2004 Pagina web: http://www.infoiasi.ro/~ngabi E-mail:[email protected] Telefon: 0232 201549

    Gabriel NEGARA februarie-mai 2004, Iasi

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 2 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Section 2. Introducere in .NET Framework - I

    1. NET Framework - privire de ansamblu.NET Framework este o tehnologie care a reusit sa atraga simpatia lumii IT mondialeprin:

    -usurinta in dezvoltare si utilizare (developing and deploying)-disponibilitatea pe termen lung (high availability)-stabilitatea (reliability)-suportul pentru o gama larga de aplicatii (multi-target application support)-rezultatul rapid (strength)-modernitatea

    -interoperabilitatea

    .NET Framework este o platforma de dezvoltare de aplicatii care implementeaza unmecanism eficient de alocare de memorie pentru stocarea datelor si instructiunilor,permitand executia unei aplicatii utilizator numai dupa verificarea unui set depermisiuni; daca sunt indeplinite conditiile de lansare in executie a aplicatiei, mediulde dezvoltare initiaza si gestioneaza executia aplicatiei, gestionand, de asemenea,mecanismul de realocare zonelor de memorie provenite de la resurse care nu maisunt utlizate de aplicatie. .NET Framework consta in doua mari componente:CommonLanguage Runtime si NET Framework Class Library.

    .NET Framework este baza dezvoltarii de programe.

    CLR furnizeaza mare parte din serviciile de baza necesare executiei programelor.

    Libraria de clase de baza BCL .NET expune un set de clase pre-implementate, carefaciliteaza dezvoltarea de programe.

    Common Language Specification (CLS) defineste un set minim de standarde pecare toate limbajele care folosesc .NET Framework trebuie sa le suporte.Common Type System(CTS) stabileste compatibilitatea de tipuri intre componenteimplementate in diverse limbaje.

    Unitatea de baza, elementara a unei aplicatii .NET este assembly-ul, care include unmanifest al assembly-ului. Acest manifest descrie assembly-ul si unul sau mai multemodule, iar modulele contin codul sursa al aplicatiei.

    Un executabil .NET este stocat ca un fisier IL (MSIL - Microsoft IntermediateLanguage). La incarcare, compilatorul transforma codul sursa in code managed(compilat si administrat de CLR), se verifica daca assembly-ul verifica conditiile desecuritate impuse de sistemul local. Daca se permite rularea, se creaza un fisier .exesau .dll numit PE - Executabil Portabil. Acesta este incarcat de motorul de executiecare extrage separat MSIL si Metadata. MSIL este JIT-compilat in cod masina(binar) si executat. Prezenta metadatei (data describing data, self describing data)face ca acest cod administrat sa poata sa se auto-descrie (definitii de tipuri,versiune, restrictii legate de securitate, etc). Aceasta extra-informatie asigura practico interoperabilitate fara compromisuri.

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 3 of 203

  • CLR - interoperabilitate multi-limbaj

    Integrare

    compilatorul limbajului L in care se programeaza trebuie sa stie sa furnizeze codintermediar pentru masina virtuala .NET -CLR.

    Exista, in prezent, cateva zeci de limbaje compatibile cu .NET (C#, C++, Visual Basic.NET, Jscript .NET, COBOL, Perl, etc).

    Interoperabilitate

    Modulele scrise in limbajul L pot fi utilizate in orice alt limbaj compatibil .NET. Spreexemplu, o clasa scrisa in L poate fi mostenita in C#, etc. In plus, in .NET, nu se maipune problema vulnerabilitatii legate de versiunea modulului scris in L (in care seregaseste signatura si implementarea clasei de mai sus). Introducerea metadateirezolva aceasta problema importanta.

    Figura 1 - structura .NET Framework. Interoperabilitate

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 4 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Figura 2 - privire de ansamblu .NET Framework - aplicatii, tehnologii, protocoale

    2. Libraria de clase de baza .NET (BCL)Spatii de nume .NET reprezentative

    Spatiu de nume DescriereSystem Reprezinta spatiul de nume radacina pentru tipurile

    low-level din .NET Framework si, de asemenea, pentrutipurile primitive de data, si este baza tuturor celorlalte spatiide nume din .NET BCL.

    System.Collections Contine clase care reprezinta o varietate de tipuri container,cum ar fi ArrayList, SortedList, Queue si Stack. Contine, deasemenea, clase abstracte, cum ar fi CollectionBase, foarteutile pentru implementarea propriilor clase cu functionalitatede container.

    System.ComponentModel Contine clase utile pentru implementarea comportamentelorcomponentelor si controalelor la run-time si design-time -convertori de tipuri si atribute, legare la surse de date(binding), componente care asigura managamentullicentelor.

    System.Data Contine clase necesare accesarii si manipularii bazelor de

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 5 of 203

  • date, precum si spatii de nume aditionale utilizate pentruaccesul la date.

    System.Data.Common Contine un set de clase distribuite pentru provideri de date.NET.

    System.Data.OleDb Contine clase care pot efectua operatii cu provideri de datede tip managed, pentru acces OLE DB la surse de date.

    System.Data.SQLClient Contine clase optimizate pentru interactiunea cu MicrosoftSQL Server.

    System.Drawing Expune functionalitati GDI+, continand clase care faciliteazarandarea grafica.

    System.IO inglobeaza tipuri pentru efectuarea operatiilor de I/O insistemul de fisiere.

    System.Math Contine un set de functii matematice.System.Reflection Furnizeaza suport pentru obtinerea de informatii si

    generarea dinamica de tipuri la runtime.System.Security Tipuri cu ajutorul carora se pot crea si manipula permisiuni,

    aspectele legate de criptografie si securitatea accesariicodului constituie, de asemenea, subiecte strans legate deacest spatiu de nume.

    System.Threading Contine clase care faciliteaza implementarea de aplicatii cufire de executie multiple.

    System.Windows.Forms Contine tipuri implicate in crearea aplicatiilor Windowsstandard. Clasele care reprezinta forme si controale sunt,de asemenea, incluse aici.

    Numele spatiilor de nume sunt auto-descriptive prin design. Aceasta modalitate deutilizare a numelor face ca .NET Framework sa fie usor de folosit si permiteutilizatorului o familiarizare rapida cu mediul de lucru.

    Libraria de clase de baza .NET Framework este o librarie de cod care furnizeazafunctionalitati folositoare pentru construirea aplicatiilor. BCL este organizata in spatii denume, care contin tipuri si spatii de nume aditionale, legate prin functionalitate comuna.

    Se poate folosi cuvantul rezervat using pentru a permite referentierea unor membri aiunui spatiu de nume fara a folosi un nume specificat prin calea comnpleta catremembrul respectiv. Daca se doreste folosirea unei librarii externe, trebuie creata maiintai o referinta catre aceasta.

    Tipuri valoare si tipuri referinta

    Tipurile pot fi: tipuri valoare sau tipuri referinta. O variabila de tip valoare continetoate datele asociate cu tipul respectiv. O variabila de tip referinta contine un pointerla o instanta a unui obiect de tipul respectiv.

    Tipurile valoare predefinite sunt create la declarare si ramin vide pana in momentulin care li se asigneaza o valoare. Tipurile referinta trebuie instantiate dupa declararepentru a crea efectiv un obiect de acel tip. Declararea si instantierea pot fi combinate

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 6 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • intr-un singur pas, fara nici o pierdere legata de performanta. Cand o variabila de tip valoare este asignata unei alte variabile de tip valoare, datele

    continute in prima variabila sunt copiate in cea de-a doua. Atunci cand o variabila detip referinta este asignata unei alte variabile de acelasi tip, numai referinta catreobiect este copiata, si ambele variabile vor face referire catre acelasi obiect.

    3. Clase si structuriClase versus Structuri

    La prima vedere, clasele si structurile par foarte asemanatoare. Ambele pot continemembri, cum ar fi campuri si metode, ambele necesita un constructor pentru a se creao noua instanta si, ca toate tipurile din .NET Framework, ambele sunt derivate dinObject. Diferenta dintre clase si structuri este accea ca structurile sunt tipuri valoare,iar clasele sunt tipuri referinta. La nivel de alocare, aceasta inseamna ca datele deinstantiere pentru clase sunt alocate pe heap, in timp ce pentru structuri acestea suntalocate pe stack. Acesul la stack a fost proiectat in asa fel incat sa fie facil si rapid, darstocarea unor date de dimensiuni mari pe stack pot conduce la diminuari aleperformantei aplicatiei.

    in termeni practici, structurile reprezinta varianta optima pentru obiecte de dimensiunimici si pentru care se definesc putine instante, persistente pentru perioade relativ miciin memorie. Clasele sunt optim folosite pentru obiecte de dimensiuni mai mari si pentrucare de definesc un numar mai mare de instante, cu posibilitatea mentinerii lor inmemorie pentru perioade mari de timp.

    Sinteza

    Tipurile definite de uzilizator includ clase si structuri. Ambele pot avea membri -campuri, proprietati, metode sau evenimente. Clasele sunt tipuri referinta iarstructurile sunt tipuri valoare.

    Cuvantul rezervat class este folosit in Visual C# pentru a defini clase. Structurile suntcreate utilizand cuvantul cheie struct. Atat clasele, cat si structurile pot contine tipuriimbricate.

    Tipurile definite de utilizator sunt instantiate in acceasi maniera ca tipurile predefite,exceptand faptul ca atat tipurile caloare cat si tipurile referinta trebuie sa foloseascacuvantul cheie new pentru instantiere.

    4. Cum folosim metodele? Metodele executa manipulari ale datelor care imprima claselor si structurilor un

    anumit comportament. Metodele pot returna o valoare, dar acest lucru nu estenecesar. in Visual C#, daca o metoda nu returneaza o valoare, se specifica voiddrept tip returnat. Metodele sunt apelate prin plasarea numelui metodei in cod,specificandu-se eventualii parametrii necesari.

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 7 of 203

  • Metodele pot avea parametri, care reprezinta valori solicitate de metoda. Parametriisunt transmisi, implicit, prin valoare. Transmiterea parametrilor prin referinta se facein Visual C# folosind cuvantul rezervat ref. Visual C# permite specificareaparametrilor de iesire pentru o anumita metoda.

    Constructorul este prima metoda apelata la instantierea unui tip. Constructorulfurnizeaza o modalitate de a seta valori implicite ale datelor sau de a executa alteoperatii necesare, inainte ca obiectul sa fie disponibil pentru operatii ulterioare.Destructorii sunt apelati exact inainte ca un obiect sa fie distrus si pot fi folositi pentrua executa cod de clean-up, de dealocare de memorie. Pentru ca dealocareamemoriei alocate obiectelor este controlata de common language runtime,utilizatorul nu poate controla momentul apelarii destructorului.

    5. Nivele de acces si domenii de vizibilitate (scope)C# - Access Levels

    Modificator de acces Efect asupra membrilorpublic poate fi accesat de oriundeprivate poate fi accesat doar de membrii din cadrul tipului care il

    defineste

    internal poate fi accesat de toate tipurile din cadrul assembly-uluiparinte, dar nu dinafara acestuia

    protected poate fi accesat numai de membrii din cadrul tipului care ildefineste sau de tipuri care mostenesc acest tip

    protected-internal poate fi accessed de toate tipurile din assembly sau detipuri mostenite din tipul care contine membrul in discutie;reprezinta reuniunea tipurilor de acces protected si internal

    Modificatorii de acces sunt folositi pentru a controla domeniul de vizibilitate amembrilor unui tip de date. Exista 5 modificatori de acces: public, internal,private,protected si protected internal. Fiecare dintre acestea determina un anumitnivel de acces.

    Daca pentru o metoda nu se specifica nici un modificator de acces, nivelul de accesasociat implicit este private pentru clasele si structurile din Visual C#. Daca nu estespecificat nici un modificator de acces pentru o variabila membru, acesta esteconsiderata private intr-o clasa si publicintr-o structura.

    Modificatorii de acces pot fi, de asemenea, folositi pentru a controla modul in careeste instantiat un tip. Nivelele de acces pentru tipuri sunt urmatoarele: tipurile publicpot fi instantiate de oriunde. Tipurile internal pot fi instantiate numai de membriiassembly-ului, tipurile private pot fi instantiate numai de ele insele sau dintr-un tipcare le contine.

    Daca nu se specifica un modificator de acces pentru o clasa sau structura, esteconsiderata public.

    Tipurile imbricate se supun acelorasi reguli ca si tipurile ne-imbricate dar, in practica,

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 8 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • ele nu vor avea niciodata un nivel de acces mai mare decat cel al tipului parinte. Membrii de tip static apartin tipului si nu unei instante anume a tipului respectiv. Ei

    pot fi accesati fara a crea o instanta a tipului si sunt accesati folosind numele tipului.

    6. Garbage Collection.NET Framework executa managementul automat al memoriei, ceea ce inseamna caatunci cand un obiect nu mai este folosit, .NET Framework elibereaza automatmemoria folosita de acel obiect. Acest proces se numeste garbage collection.

    Sa consideram urmatorul exemplu:

    void GarbageCollectionExample()

    {

    TipObiect obiect = new TipObiect();

    }

    La sfarsitul acestei proceduri, variabila obiect iese domeniul sau de vizibilitate, iarobiectul la care face referire nu mai este referentiat de nici o variabila din cadrulaplicatiei. Garbage collector-ul gestioneaza in background arborele de referinte siidentifica obiectele catre care nu se mai face referinta. Cand gaseste un astfel deobiect, cum ar fi TipObiect din exemplul anterior, il sterge si solicita eliberarea zonei dememorie ocpate de obiectul respectiv. Pentru ca garbage collector-ul ruleaza continuu,utilizatorul nu trebuie sa distruga explicit obiectele la care nu se mai face referire inprogram de la un anumit moment.

    Garbage collector-ul reprezinta, de fapt, un fir de executie de prioritate scazuta, inconditii normale. El intervine in executia programului cand timpul procesor nu esteconsumat de sarcini mai importante. Totusi, atunci cand zonele de memorie libera seimputineaza semnificativ, firul de executie asociat garbage collector-ului creste inprioritate. Memoria utilizata de obiecte care nu mai sunt referentiate in program estesolicitata intr-o maniera mai insistenta, pana cand se elibereaza o zona suficienta dememoria, caz in care firul de executie al garbage collector-ului trece la o prioritatescazuta.

    Aceasta abordare non-deterministica de eliberare a memoriei are ca scop maximizareaperformantei aplicatiei si furnizeaza un mediu de aplicatii mai putin predispus laactiunea bug-urilor (less bug-prone ). Exista, insa, un cost. Datorita mecanismului princare opereza garbage collector-ul, utilizatorul nu poate sti momentul in care un obiectva fi dealocat. Deci, nu exista control asupra momentului apelarii destructorului claseiVisual C# in cauza. Aceste metode ar trebui sa nu contina cod care se proiecteaza a fiexecutat la un anumit moment. in schimb, pot fi scrise clase care utlizeaza o cantitateimportanta de resurse si care contin o metoda Dispose() pentru eliberarea explicita aacestor resurse, atunci cand o instanta a acestei clase nu mai este necesara inprogram.

    Referinte circulare

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 9 of 203

  • Procesul de garbage collection are in vedere, de asemenea, si referintele circulare, oforma foarte comuna de utilizare ineficienta a memoriei in medii de dezvoltareanterioare. Sa consideram urmatorul exemplu:

    class Widget

    {

    public Widget ChildWidget;

    public Widget Parent;

    }

    class aClass

    {

    Widget GrandParent;

    void Demo()

    {

    Widget Parent;

    Widget Child;

    GrandParent = new Widget();

    GrandParent.ChildWidget = new Widget();

    Parent = GrandParent.ChildWidget;

    Parent.ChildWidget = new Widget();

    Child = Parent.ChildWidget;

    Child.Parent = Parent;

    GrandParent = null;

    //acum, Parent si Child se autorefera - referintacirculara

    }

    }

    Desi referintele circulare pot crea probeleme in ceea ce priveste detectarea zonelor dememorie ocupate inutil in alte platforme de dezvoltare, garbage collector-ul din .NETFramework este capabil sa detecteze si sa faca disponibile aceste zone. Deci, daca opereche de obiecte se autoreferentiaza, vor fi supuse procesului de garbage collection.

    .NET Framework gestioneaza procesul de eliberare automata a memoriei prinintermediul garbage collector-ului. Garbage collector-ul este un fir de executie deprioritate scazuta care ruleaza intotdeauna im background-ul aplicatiei. Candmemoria disponibila s-a diminuat, prioritatea garbage collector-ului creste pana candse vor elibera destule resurse.

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 10 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Pentru ca nu se poate stabili momentul in care un anumit obiect va fi eliminat degarbage collector, utilizatorul nu trebuie sa mizeze de codul scris in interioruldestructorilor. in schimb, pentru eliberarea resurselor, se poate folosi o metodaDispose() care va fi apelata explicit.

    Garbage collector-ul analizeaza in mod continuu arborele de referinte si eliminaobiectele la care nu se mai face referinta, precum si obiectele cu referinte circulare.

    Detalii - MSDN Library, criteriu de cautare circular reference

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 11 of 203

  • Section 3. Tipuri de date si membri- II

    1. Tipuri de date. Utilizare.Microsoft .NET Framework furnizeaza un sistem foarte robust de tipuri primitive carepot fi folosite pentru stocarea si reprezentarea datelor din cadrul aplicatiei. Dateleprimitive reprezinta numere intregi, flotante, valori booleene, caractere si string-uri.Sistemul de tipuri de date .NET Framework este type-safe, adica conversiile impliciteintre diferitele tipuri de date au loc numai daca acest lucru nu conduce la pierderi dedate. Conversiile explicite pot fi executate in situatii cate pot provoca pierderi de date.Tipurile de date .NET contin functionalitati pentru a executa un set diversificat deconversii de tip si alte sarcini similare.

    OBIECTIVE:

    intelegerea mecanismului conversiilor implicite si explicite dintre tipuri descrierea functionalitatilor oferite de tipurile .NET Framework prezentarea operatiilor cu string-uri, folosind metodele clasei String

    .NET Framework pune la dispozitia utilizatorului un sistem extensibil de tipuri carepermit stocarea, manipularea si transmiterea valorilor intre diferitele entitati din cadrulaplicatiei. Limbajele .NET sunt puternic tipizate (strongly typed). Aceasta inseamnaca obiectele de un anumit tip nu pot fi schimbate cu obiecte de un alt tip. Apelul uneimetode va esua daca nu se specifica parametri avand tipurile corespunzatoarte.Conversiile implicite si explicite permit transformari asupra datelor atunci cand estenevoie. Acest lucru este posibil deoarece toate tipurile din .NET Framework suntderivate din Object, tipul de baza al tuturor claselr si structurilor.

    Tipuri de date .NET

    Tipuri valoare - subcategorii:

    tipuri intregi tipuri flotante tipul Boolean tipul Char

    Tipuri referinta - frecvent folosite in aplicatii:

    String Object

    Tipuri intregi

    Tabelul urmator sintetizeaza aceste tipuri, prezentand tipurile din Visual C#corespunzatoare.

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 12 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Tip Reprezentare C# Descriere DomeniuSystem.Byte byte intreg fara semn pe 8 biti de la 0 la 255System.Int16 short intreg cu semn pe 16 biti de la -32768 la

    32767

    System.Int32 int intreg cu semn pe 32 biti de la -2 la 31 la 2la 31 - 1

    System.Int64 long intreg cu semn pe 64 biti de la -2 la 63 la 2la 63 - 1

    System.SByte sbyte intreg cu semn pe 8 biti de la -128 la 127System.UInt16 ushort intreg fara semn pe 16 biti de la 0 la 65535System.UInt32 uint intreg fara semn pe 32 biti de la 0 to 2 la 32

    -1

    System.UInt64 ulong intreg fara semn pe 64 biti de la 0 to 2 la 64-1

    Tabel 1 - Tipuri intregi

    Se pot atribui valori tipurilor intregi folosind fie notatia zecimala, fie hexazecimala.Pentru a folosi notatia hexazecimala pentru un literal intreg, acesta trebuie prefixat cu0x in Visual C#. De exemplu: int nr_intreg;

    nr_intreg = 0x36BA;

    Tipuri flotante Exista trei astfel de tipuri care pot fi folosite pentru a reprezenta numerecu parte fractionara. Tabelul urmator sintetizeaza aceste tipuri:

    Tip Reprezentare C# DescriereSystem.Single float variabila flotanta pe 32 biti, precizie - 7 cifre

    semnificative

    System.Double double pe 64 biti semnificativi, precizie 15-16System.Decimal decimal pe 128 biti, precizie - 28 semnificativa

    Tabel 2 - Tipuri flotante

    Observatii:

    System.Single - util pentru calcule in virgula mobila care necesita un grad scazut deprecizie

    System.Double - pentru calcule cu un grad mai mare de precizie, operand cunumere dintr-un interval foarte vast

    System.Decimal - grad foarte mare de precizie, folosind insa numere dintr-un intervalmai restrans

    Tipuri non-numerice

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 13 of 203

  • System.Boolean System.Char System.String System.Object

    System.Boolean

    Tipul System.Boolean este folosit pentru a reprezenta o valoare care este fie true, fiefalse. In C#, o variabila booleana este desemnata prin intermediul tipului bool, cuvalorile posibile true si false.

    System.Char

    Tipul System.Char reprezinta un caracter Unicode pe 16 biti. In C#, o variabila de tipchar (tipul C# asociat) poate fi definita prin specificarea explicita a unui caracter intreapostroafe: char caracter;

    caracter = 't';

    sau atribuind valoarea numerica a codului Unicode al caracterului variabilei de tip char,folosind o valoare hexazecimala din 4 cifre, corespunzatoare: char caracter;

    caracter = '\u01fe';

    System.String

    Tipul System.String este un tip referinta care reprezinta o succesiune de date de tipChar. Cu alte cuvinte, un string poate desemna un cuvant, un paragraf, un cod sauorice alta succesiune de caractere. Tipul C# asociat este desemnat de cuvantulrezervat string.

    Exemplu de utilizare: string sir;

    sir = "Acesta este un string.";

    System.Object

    Tipul Object este parintele tuturor tipurilor din .NET Framework. Orice tip, fie valoare,fie referinta, este derivat din System.Object. Tipul C# asociat - object. Unei variabileobject i se poate asocia orice valoare sau obiect: object obj;obj = 233;obj = new System.Collections.ArrayList();

    !

    Daca un obiect de un anumit tip este stocat intr-o variabila object, trebuie reconvertitexplicit la acel tip pentru a accesa intreaga sa functionalitate.

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 14 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Tipuri de conversii

    Datele pot convertite in doua feluri: implicit, caz in care conversia este executataautomat, si explicit - conversie executata de utilizator.

    Conversii implicite

    Sunt conversii care se executa atunci cand nu exista riscul pierderilor de date. Deexemplu: int un_short = 100;

    long un_long;

    un_long = un_short;

    Daca un tip poate fi convertit implicit la un alt tip, atunci primul tip poate fi utilizatoriunde in program unde se solicita cel de-al doilea tip, fara a folosi o sintaxa speciala.De exemplu: // functia prelucare_long

    // are un parametru de tip long

    int x = 100; // conversie implicita de la int la long

    // efectuata la apelul functiei

    prelucare_long(I);

    Tabelul urmator ilustreaza conversiile implicite permise in C#:

    De la La

    byte short, ushort, int, uint, long, ulong, float, double, decimalshort int, long, float, double, decimalint long, float, double, decimallong float, double, decimalfloat double

    char int, uint, long, ulong, float, double, decimalsbyte short, int, long, float, double, decimalushort int, uint, long, ulong, float, double, decimaluint long, ulong, float, double, decimalulong float, double, decimal

    Conversii explicite

    In cazul unei conversii in care tipurile nu pot fi convertite implicit, trebuie aplicata oconversie explicita. Aceasta conversie se mai numeste cast. In C#, conversiile explicitenecesita folosirea unei sintaxe speciale. Exemplu:

    int un_int = 100;

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 15 of 203

  • short un_short;

    un_short = (short)un_int;

    ! Conversiile explicite pot fi riscante. In exemplul anterior, conversia s-a efectuat faranici un fel de problema pentru ca atat o variabila int, cat si una de tip short poate retinevaloarea 100. Sa consideram acum urmatorul exemplu:

    int un_alt_int = 80000;

    short un_alt_short;

    un_alt_short = (short)un_alt_int;

    Codul acestui exemplu nu va furniza eroare de compilare sau la run-time. Totusi,examinand valoarea lui short, aceasta nu va fi cea dorita, deoarece valoarea maxima adomeniului tipului short este mai mica decat valoarea la care se incearca conversia.

    ! Deoarece conversiile explicite sunt adesea riscante, este indicata folosirea lor numaiin cazuri absolut necesare, implementand un sistem adecvat de tratare a conversiilornereusite si a tuturor exceptiilor care ar putea fi aruncate. (vezi cursul 5).

    Functionalitati asociate tipurilor de date Toate tipurile de date au o functionalitateimplicita (built-in ). Acestea suporta urmatoarele patru metode:

    Equals - determina daca doua instante sunt egale GetHashCode - actioneaza ca o functie hash pentru un tip de date GetType - returneaza tipul obiectului pentru instanta curenta ToString - returneaza o descriere a obiectului, intr-un format accesibil utilizatorului

    ? Din cele prezentate mai sus, reiese faptul ca tipurile de date ocupa un relativ mic dememorie. Totusi, cum este posibil ca fiecare tip sa implementeze aceste metode?Raspunsul este dat in cele ce urmeaza.

    Boxing Boxing reprezinta conversia implicita a tipurilor valoare la tipuri referinta. Toateclasele si tipurile sunt derivate din Object, fiecare din cele patru metode amintite fiindmembre ale clasei Object. Deoarece toate clasele sunt derivate din Object, fiecareclasa poate fi convertita implicit la acest tip. La apelul uneia dintre cele patru metode,Common Language Runtime creaza o referinta temporara variabila de tip valoaredeclarata de utilizator si se permite tratarea acesteia ca fiind de tip referinta.

    Boxing explicit(manual) - prin atribuirea variabilei detip valoare unei variabile de tipObject. Exemplu:

    short s = 10;

    object O;O = s;

    Unboxing reprezinta conversia unei variabile boxed la un tip valoare. Se realizeazaprin conversia explicita a obiectului la tipul dorit. Se poate executa unboxing numaipentru obiectele care au fost supuse operatiei de boxing.

    Metoda Parse

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 16 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Parse - metoda statica, asociata tuturor tipurilor de date. Efectueaza conversiastring-ului primit ca parametru la tipul din care face parte. Daca string-ul nu are uncontinut specific(potrivit) tipului care apeleaza metoda, se va genera o eroare.

    short s;

    string input;

    input = "321";

    // s = 321

    s = short.Parse(input);

    Functii pentru operatii cu siruri de caractere

    Metode de instanta pentru siruri de caractere

    Metoda Descriere

    String.Insert Insereaza un string specificat in instanta curentaString.PadLeft,String.PadRight

    Adauga caractere la stanga, respectiv la dreapta sirului

    String.Remove Elimina un numar specificat de caractere din string, incepand de la uncaracter precizat

    String.Replace Inlocuieste toate aparitiile unui caracter specificat din string cu un altcaracter

    String.Insert Insereaza un string specificat in instanta curentaString.Split Returneaza un array de substringuri, obtinut prin separarea

    token-urilor din stringul initial, dupa un separator specificatString.Substring Returneaza un substring al stringului initialString.ToCharArray Returneaza caracterele compunente ale sirului, sub forma de array de

    caractere

    String.ToLower,String.ToUpper

    Transforma stringul, convertind caracterele la litere mici, respectivmari

    String.TrimEnd,String.TrimStart, String.Trim

    Elimina spatiile de la sfarsitul, inceputul stringului sau, respectiv toatespatiile din cadrul sirului

    Metode statice cu siruri de caractere

    Metoda Descriere

    String.Compare compara doua stringuriString.Concat returneaza un string obtinut prin concatenarea a doua sau mai multe

    siruri de caractere

    String.Format returneaza stringul formatatString.Join returneaza un string obtinut prin concatenarea unui array de stringuri,

    specificand un separator si inserandu-l intre componentele array-ului

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 17 of 203

  • Sinteza

    .NET Framework furnizeaza un sistem robust, puternic tipizat de tipuri de date.Principalele tipuri - intregi, flotante, boolean, caracter si string.

    Exista doua tipuri de conversii - implicite, executate automat de CLR, atunci cand nuexista riscul pierderii de date si explicite, efectuate explicit prin scriere de cod,programatorul trebuind sa analizeze ci atentie cazurile care ar putea conduce laerori.

    Boxing - macanismul care permite tratarea tipurilor valoare ca tipuri referinta.Unboxing - converteste un tip referinta asupra caruia s-a efectuat anterior boxingcatre un tip valoare.

    Tipurile .NET contin functionalitate built-in specifica tipului. Metoda Parse esteimplementata de toate tipurile valoare, fiind utila pentru conversia string-uriloe latipuri valoare. Clasa String contine un set de functii care faciliteaza manipulareastring-urilor.

    2. Constante, enumerari, tablouri, colectiiUtilizatorul simte adesea necesitatea organizarii grupurilor de obiecte intr-un anumit tipde structura. De exemplu, anumite obiecte, de acelasi tip sau de tipuri diferite trebuieaccesate secvential si este necesara o sintaxa pentru gestionarea organizariiobiectelor. Tablourile (array) permit organizarea grupurilor de obiecte similare sireferirea lor printr-un index, adesea in defavoarea accesarii prin nume. Colectiile suntsimilare tablourilor, dar implementeaza o functionalitate mai complexa, fiind utilizate, inspecial, pentru organizarea grupurilor de obiecte de tipuri diferite. Constantele pot priminume familiare si contin valori utilizate frecvent in program. Enumerarile (enum) permitorganizarea unor multimi de constante, facilitand executia anumitor operatii din cadrulprogramului.

    Constante si enumerari

    Constantele permit asignarea unor nume familiare anumitor valori utilizate frecvent incod. Enumerarile sunt multimi definite de utilizatori continand constante asociate uneimultimi de nume. Folosirea constantelor si enumerarilor faciliteaza scrierea de cod,debugging-ul codului si reduc numarul erorilor de scriere.

    Utilizarea constantelor

    Se foloseste cuvantul rezervat const Exemplu:

    public const int MAX = 25000;Constantele pot fi de orice tip intrinsec sau enumerativ, dar nu de un tip definit deutilizator sau array. Constantele au o valoare fixata care odata stabilita nu mai poate fischimbata sau redefinita. Dupa definire, o constanta poate fi folosita in cod, prinspecificarea numelui asociat. De exemplu:

    public const int MAX = 25000;

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 18 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • public int half_max()

    {

    return MAX/2;

    }

    Ca si variabilele, constantele pot avea orice nivel de acces. Pentru a defini o constantacare va putea fi accesata de toti utilizatorii aplicatiei sau componentei, trebuie declaratapublic. O constanta declarata private va putea fi accesata doar in cadrul domeniuluiclasei care o defineste. internal permite accesarea constantei din cadrul assembly-uluicare o contine, iar o constanta protected permite accesul la constanta si tipurilormostenite din clasa care contine constanta.

    Enumerari

    Enumerarile permit lucrul cu multimi de constante, prin asocierea acestora cu numefamiliare utilizatorului. Exemplu:

    public enum LunileAnului

    {

    Ianuarie = 1,

    Februarie = 2,

    // si celelalte..., cu valorile uzuale

    Decembrie = 12

    }

    Tipul asociat implicit elementelor enumerarilor int, dar poate fi setat la orice alt tipnumeric integral de date (byte, short, int si long). Modalitatea de definirea explicita atipului elementelor se poate observa in exemplul urmator:

    public enum LunileAnului : short

    // cod ...

    NU este obligatorie asocierea de valori membrilor enumerarii. Implicit, membrii vorprimi valori implicite, secvential, pornind de zero. Exemplu:

    public enum Cifre

    {

    zero, // egal cu zero

    unu, // egal cu doi

    doi // egal cu trei

    }

    Dupa definirea membrilor enumerarii, acestia pot fi folositi in cod. In C#, trebuieefectuata o conversie explicita a membrilor la tipul dorit pentru a putea accesa valoareareprezentata. De exemplu:

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 19 of 203

  • // se utilizeaza enumerarea Cifre anterioara

    MessageBox.Show(((int)Cifre.doi * 3).ToString());

    // se afiseaza 6

    ! Pot fi scrise metode care primesc enumerari ca parametri; codul scris astfel este maiputin supus la erorile de scriere. Exemplu:

    public void PlanLunar(LunileAnului luna)

    //enumerarea definita mai sus

    {

    switch(luna)

    {

    case LunileAnului.Februarie:

    // cod...

    break;

    case LunileAnului.Martie:

    // cod...

    break;

    // alte case-uri...

    }

    }

    Tablouri (array)

    Reprezinta o modalitate de gestionare a unei multimi de elemente de tip valoare sau aunei multimi de obiecte. Folosind tablouri, se pot grupa o serie de variabile, la care sepoate face referire folosind un index. Se pot accesa toate sau o parte dintre variabile siexamina sau modifica fiecare dintre aceste variabile. Se pot defini, de asemenea,tablouri multidimensionale. In .NET Framework, tablourile contin functionalitatiintrinseci(buit-in) care faciliteazaa o serie de operatii.

    Declararea si initializarea tablourilor

    Declararea si initializarea se pot face in cadrul aceleasi instructiuni. Pentru declarare,se specifica tipul si numarul elementelor din tablou. Pentru toate tablourile din C#,indexul primului element este zero, celelalte avand indecsi calculati secvential, pornindde la zero.

    Exemplu:

    // tablou cu 20 de elemente de tip short

    short[] array_shorts = new short[20];

    Declararea si initializarea se pot efectua, desigur, si in pasi separati. Exemplu:

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 20 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • //declarare

    short[] array_shorts;

    // initializare

    array_shorts = new short[20];

    Un tablou poate fi redefinit, modificandu-i dimensiunea la run-time. Exemplu:

    // declarare si initializare

    int[] intregi = new int[20];

    // reinitializare

    intregi = new int[45];

    In exemplul anterior, datele continute de tablou sunt pierdute la reinitializare. Nu existanici o modalitate de salvare a datelor la reinitializare (excluzand o varianta manuala).

    La crearea unui tablou cu elemente de tip referinta, declararea si initializarea tablouluinu conduc la umplerea tabloului cu membri de tipul respectiv. De fapt, se creaza untablou de referinte null care pointeaza la acel tip. Pentru a completa tabloul cu membrii,trebuie asignata fiecare variabila la un obiect. De exemplu:

    // se creaza un tablou de obiecte

    TipObiect[] obiecte = new TipObiect[10];

    // se asigneaza elementului obiecte[0] un nou obiect de tipTipObiect

    obiecte[0] = new TipObiect();

    // asigneaza elementului obiecte[1] un obiect existent

    TipObiect un_obiect = new TipObiect();

    obiecte[1] = un_obiect;

    // se atribuie celorlalte elemente cate un nou obiect

    for (int contor = 2; contor < 10; contor++)

    {

    obiecte[contor] = new TipObiect();

    }

    Tablouri multidimensionale

    Tablourile prezentate pana acum sunt liniare, adica, tablouri cu o singura dimensiune.Exista in .NET Framework doua tipuri de tablouri multidimensionale: tablourirectangulare si tablouri jagged.

    Tablouri rectangulare

    Sunt tablouri in care fiecare membru al fiecarei dimensiuni este extins in fiecare alta

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 21 of 203

  • dimensiune folosind aceeasi lungime. De exemplu, un tablou bidimensional,rectangular, poate fi gandit ca un tabel tabel, continand linii si coloane, fiecare linieavand acelasi numar de coloane.

    Exemplu:

    // tablou de 4 pe 3

    int[ , ] intregi = new int[4, 3];

    // tablou bidimensional cu valori initiale specificate

    int[ , ] intregi2 = {{1, 2, 3}, {4, 5, 6}};

    // tablou tridimensional

    int[ , , ] cubeArray = {{{2, 2}, {2, 4}}, {{5, 5}, {4, 4}}};

    // tablou complex: 2 x 3 x 5 x 5 x 6

    int[ , , , , ] tablou_complex = new int[2, 3, 5, 5, 6];

    Tablouri jagged

    Un astfel de tablou, bidimensional, poate fi conceput ca un tabel in care fiecare liniepoate avea un numar diferit de coloane. De exemplu, sa consideram un tabel in carefiecare linie reprezinta un grad universitar, iar coloanele contin numele profesorilor careau gradul respectiv. Liniile vor putea avea, deci, un numar diferit de elemente. Pentru agestiona o astfel de structura, se foloseste un tablou jagged, ca mai jos:

    // tablou de 5 tablouri

    string[][] grade = new string[5][];

    // specificam numai prima dimensiune

    // primul tablou are 4 membri

    grade[0] = new string[] {"Popescu", "Negara", "Ionescu","Radulescu"};

    //o alta varianta de declarare si initializare

    // al doilea tablou are 3 elemente

    grade[1] = new string[] {"Vidrescu", "Alexandrescu", "Macovei"};

    // si asa mai departe...

    grade[3] = new string[] {"Buburuzan", "Georgescu"};

    ...

    Colectii

    Colectiile contin functionalitati avansate pentru gestionarea grupurilor de obiecte. Ocolectie este o clasa specializata care organizeaza si permite manipularea unui grupde obiecte. La fel ca la tablouri, membrii unei colectii pot fi accesati prin index. In plus,colectiile pot fi redimensionate dinamic, existand posibilitatea adaugarii si eliminarii deelemente la run time.

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 22 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Colectiile sunt utile pentru gestionarea grupurilor de elemente create dinamic la runtime. De exemplu, ne putem imagina o colectie in care un element contine informatiidespre un salariat al unei institutii. Creand o colectie de obiecte de tip Salariat, va fiposibila accesarea obiectelor, iterarea acestora, adaugarea de noi obiecte saueliminarea obiectelor care devin irelevante.

    Clasa ArrayList

    System.Collections.ArrayList - confera functionalitati specifice de colectie utile intr-oserie intreaga de situatii. Aceasta clasa permite adaugarea si eliminarea dinamica deelemente din lista. Elementele sunt accesate prin index Exemplu:

    System.Collections.ArrayList lista = new

    System.Collections.ArrayList();

    Metoda Add

    Dupa instantiere, pot fi adaugate elemente intr-un ArrayList utilizand metoda Add:

    TipObiect obiect = new TipObiect();

    lista.Add(obiect);

    !

    Orice lista de tip ArrayList este o colectie zero-based . Primul obiect introdus in lista areindexul zero, elementele adaugate ulterior primind indexul imediat urmator elementuluianterior.

    In C#, indexatorii sunt folositi pentru accesarea elementelor colectiilor, utilizand osintaxa similara tablourilor. Exemplu:

    object obj;obj = lista[0];!

    Toate referintele dintr-o colectie sunt de tipul object. Se impune, deci, folosireaconversiilor explicite, pentru a obtine un element avand acelasi tip ca tipul elementuluidin lista, returnat de indexator:

    TipObiect obj;obj = (TipObiect)listaObiecte[1];Metodele Remove si RemoveAt

    Remove - elimina obiectul a carui referinta este primita ca parametru din colectie RemoveAt - elimina din colectie elementul de la indexul a carui valoare este primita

    ca parametru

    Exemplu:

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 23 of 203

  • TipObiect obj = new TipObiect();System.Collections.ArrayList lista = new

    System.Collections.ArrayList();

    // adauga obj la colectielista.Add(obj);// elimina obiectul obj din colectielista.Remove(obj);System.Collections.ArrayList lista = new

    System.Collections.ArrayList();

    // adauga 5 elemente la colectie

    for (int i = 0; i < 5; i++)

    {

    TipObiect obj = new TipObiect();lista.Add(obj);}

    // elimina elementul cu indexul 3

    lista.RemoveAt(3);

    !

    Incercarea de eliminare a unui obiect care nu este continut in colectie va fi ignorata,fara a se genera eroare.

    La eliminarea unor elemente din colection, are loc o reasignare a indecsilor pentru a seocupa spatiile disponibile. Deci, valorile indecsilor sunt dinamice si pot returna referintediferite la momente diferite ale executiei aplicatiei.

    Proprietatea Count Returneaza numarul de elemente din colectie (cu 1 mai mult decatindexul maxim).

    Alte tipuri de colectii

    Clasa DescriereBitArray tablou compact de bitiCollectionBase serveste drept clasa de baza pentru implementarea propriilor

    clase cu functionalitate de colectie

    Hashtable colectie de perechi de tip cheie-valoare, organizate dupa codulhash al cheii

    Queue gestioneaza un grup de obiecte dupa principiul first-in, first-outSortedList contine un grup de obiecte care pot fi accesate dupa index sau

    dupa valoare

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 24 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Stack gestioneaza un grup de obiecte dupa principiul last-in, first-out

    Enumerarea (iterarea) membrilor unui tablou sau colectii

    C# ofera o sintaxa specializata pentru parcurgerea membrilor unui tablou sau colectii.Utilizarea cuvantului rezervat foreach permite examinarea succesiva a fiecarui membrual unui tablou sau colectii. Exemplu:

    int[] tab = new int[] {1,2,3,4};

    foreach (int i in tab)

    {

    MessageBox.Show(i.ToString());

    }

    !

    Pentru o utilizare corecta a acestei sintaxe, toti membrii colectiei trebuie sa aiba acelasitip ca al variabilei desemnate ca iterator (i pentru exemplul anterior). In caz contrat, vafi aruncata o exceptie de tipul InvalidCastException. Solutie:declararea variabileiiterator de tip object si utilizarea metodei GetType pentru a inspecta tipul obiectelor dincolectie. Exemplu:

    // lista este un ArrayList care contine

    // elemente de tip string si alte elemente de alte tipuri

    foreach (object o in lista){

    if (o.GetType() == typeof(string))

    {

    MessageBox.Show(o.ToString());

    }

    }

    !

    Referinta continuta de iterator este read-only . Deci, sintaxa foreach nu poate fi folositapentru a efectua modificari ale tabloului sau colectiei. Solutie: folosirea unei sintaxe detip for. Exemplu:

    int[] tab = new int[] {1,2,3,4};

    for (int i = 0; i

  • }Sinteza:

    Constante si enumerari (const si enum). Constantele pot avea orice tip. Enumerariletrebuie sa aiba un tip numeric integral.

    Tablourile pot fi unidimensionale sau multidimensionale. Tablourilemultidimensionale pot fi rectangulare sau jagged.

    Colectiile permit gestionarea grupurilor de obiecte, cu elemente de acelasi tip sau detipuri diferite System.Collections ofera un set de clase cu diverse functionalitatispecifice colectiilor.

    Sintaxa foreach permite iterarea membrilor unui tablou sau colectii, fara a puteamodifica membrii. Pentru a altera valorile membrilor unui tablou sau colectii, sepoate utiliza o sintaxa de tip for.

    3.ProprietatiProprietatile sunt membri ai claselor care acceseaza variabile sau obiecte membre.Prezinta similaritati atat fata de campuri cat si fata de metode. Valorile sunt setate siinspectate folosind acceasi sintaxa ca in cazul campurilor: de fapt aceste doua operatiisunt efectuate prin apelul unor metode specializate. Proprietatile pot contine cod carevalideaza valorile inainte de a le seta sau pot indeplini alte functionalitati impuse deaplicatie.

    Implementarea proprietatilor

    Proprietatile permit accesarea valorilor si obiectelor membre intr-o maniera mai robustain comparatie cu inspectarea obisnuita a campurilor. O proprietate este o metodaspecializata care se comporta ca un camp. Valorile proprietatilor sunt setate siinspectate in acelasi mod ca si campurile, fapt ilustrat in exemplul urmator:

    // seteaza proprietatea Text a butonului btnExit la "Exit"

    btnExit.Text = "Exit";

    string sir;

    // returneaza valoarea lui btnExit.Text si o asigneazastring-ului sir

    sir = btnExit.Text;

    Pana acum, o proprietate arata si se comporta exact ca un camp. Totusi, codul asociatunei proprietati este mai complex. Exista doua metode speciale asociate uneiproprietati, un getter si un setter care returneaza si, respectiv, seteaza valoareaproprietatii. Exemplu:

    // proprietatea se numeste Xmax

    // o variabila locala care stocheaza valoarea

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 26 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • private short x;

    // implementarea proprietatii

    public short Xmax

    {

    get

    {

    // returneaza valoarea variabilei locale

    return x;

    }

    set

    {

    // seteaza valoarea variabilei locale

    x = value;

    }

    }

    Cuvantul rezervat value este un cuvant special folosit in setter-ul unei proprietati sireprezinta intotdeauna valoarea la care se seteaza proprietatea. Proprietatile potexpune orice tip de obiecte, tablouri sau colectii. Valoarea sau obiectul este retinut, deobicei, intr-o variabila privata locala (x in exemplul anterior) si returnat atunci candproprietatea este accesata.

    Exemplul anterior poate fi considerat trivial, proprietatea Xmax comportandu-se exactca un camp. Avantajul utilizarii proprietatilor consta in posibilitatea scrierii de codaditional in getter-ul si setter-ul proprietatii pentru a efectua calcule sau valida input-ul.Exemplu:

    private short x;

    public short Xmax

    {

    get

    {

    // returneaza valoarea variabilei locale

    return x;

    }

    set

    {

    // valoarea nu trebuie sa depaseasca 500

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 27 of 203

  • if (value > 500)

    MessageBox.Show(value.ToString() +

    " coordonata x nu poate depasi valoarea 500!");

    else

    x = value;

    }

    }

    De retinut:

    Pentru a crea o proprietate:

    creati o variabila private care va retine valoarea sau obiectul returnat de proprietate scrieti cod pentru returnarea valorii proprietatii adaugati cod pentru validare sau efectuare de calcule in getter-ul si setter-ul

    proprietatii

    Proprietati read-only si write-only

    Uneori, programatorul trebuie sa implementeze a proprietate care returneaza o valoarecare nu mai poate fi modificata dupa ce clasa a fost initializata. Alteori, intr-un numarmai mic de situatii, se impune crearea unei proprietati a carei valori poate fi modificatadar nu poate fi citita. Aceste proprietati sunt numite read-only si, respectiv, write-only .

    Proprietati read-only

    Crearea unei proprietati read-only se realizeaza prin specificarea getter-ului si omitandsetter-ul proprietatii. Variabila private care retine valoarea proprietatii este declarata, incele mai multe cazuri, readonly (acest lucru nu este obligatoriu). Exemplu:

    private readonly short s;

    public short ShortNumber

    {

    get

    {

    return s;

    }

    }

    !

    Setarea variabilei care retine valoarea proprietatii trebuie efectuata in constructorulclasei sau la initializarea variabilei.

    Proprietati write-only

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 28 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • In anumite cazuri, pot fi implementate proprietati care pot fi scrise, dar nu citite, decatre utilizator. Exemplu: pozitionarea unei forme in functie de setari specificelocalizarii(culturii) aplicatiei (localizare - concept care va fi prezentat intr-un curs viitor) -forma este pozitionata la lansarea aplicatiei, nefiind necesara consultarea valoriiproprietatii respective.

    O proprietate write-only se creaza similar unei proprietati obisnuite, omitandimplementarea getter-ului. Exemplu:

    private short x;

    public short XmaxForm

    {

    set

    {

    x = value;

    }

    }

    Indexatori

    Sunt proprietati specializate care permit accesarea obiectelor dintr-un grup. Numeleproprietatii este this, asociindu-se o variabila index. Exemplu:

    // tablou care va stoca valorile retunate de indexator

    private int[] tablou;

    // sintaxa speciala care foloseste cuvantul rezervat this

    public int this[int index] // indexatorul

    {

    get

    {

    return tablou[index];

    }

    set

    {

    tablou[index] = value;

    }

    }

    Proprietati ale colectiilor

    Expunerea colectiilor de obiecte ca proprietati permite controlarea accesului laobiectele componente si validarea operatiilor de atribuire. Modalitatile de implementare

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 29 of 203

  • a acestor proprietati depind de natura si functionalitatea colectiilor. O proprietate simplaeste cea care returneaza colectia ca un singur obiect (pentru siguranta, proprietateapoate fi definita read-only, utilizatorul putand modifica obiectele din colectie folosindmetodele colectiei). Exemplu:

    private readonly System.Collections.ArrayList list_objects = newSystem.Collections.ArrayList();

    public System.Collections.ArrayList objects{

    get

    {

    return list_objects;}

    }

    !

    Aceasta abordare nu rezolva problema verificarii tipurilor obiectelor adaugate lacolectie (membrii colectiei sunt tratati ca obiecte).

    Iata o abordare mai pertinenta:

    private System.Collections.ArrayList list_objects = newSystem.Collections.ArrayList();

    public ItemType GetItem(int i)

    {

    return (ItemType)list_objects[i];}

    public void SetItem(int i, ItemType item)

    {

    list_objects[i] = item;}

    Acesta abordare rezolva problema tipizarii, insa rapeste utilizatorului posibilitateafolosirii sintaxei foreach pentru parcurgerea elementelor colectiei.

    !

    Pentru implementarea unor proprietati care implica functionalitati avansate se pot definicolectii derivate din System.Collections.CollectionBase.

    Sinteza:

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 30 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • proprietati - expun variabile sau obiecte membre, furnizand cod pentru validareavalorilor proprietatilor sau pentru efectuarea altor operatii; proprietatile read-only siwrite-only limiteaza abilitatea utilizatorului de a consulta sau modifica propriatatile.

    indexator - proprietate implicita a colectiilor proprietatile colectiilor expun grupuri de obiecte din colectie

    4.Delegati.EvenimenteEvenimentele reprezinta o notificare determinata de o actiune survenita intr-o sectiunea a aplicatiei. La aparitia unui eveniment, altor parti ale aplicatiei li se oferaoportunitatea de a raspunde prin executis unor metode denumite event handler-e.

    Delegati

    Un delegat este, in principiu, un pointer type-safe la o functie care permitetransmiterea unei referinte catre inceputul unei metode si apelarea metodei fara afolosi un apel explicit al acesteia. La declararea unui delegat, se specifica signaturametodei apelate si tipul returnat

    Exemplu:

    public delegate int firstDelegate(double D);

    // acest delegat poate invoca metode care returneaza un int

    // si primesc un parametru double

    // metoda care va fi invocata de delegat

    public int ReturnInt(double D)

    {

    // implementare...

    }

    // declararea unei instante firstDelegate si

    // invocarea metodei ReturnInt

    public void invokeMethod()

    {

    firstDelegate aDelegate = new firstDelegate(ReturnInt);

    }

    Invocarea metodei pentru care s-a instantiat delegatul:

    aDelegate(6780.87);

    Declararea si folosirea unui delegat:

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 31 of 203

  • se declara delegatul, specificand o signatura identica cu cea a metodelor care vor fiinvocate

    se creaza o instanta a delegatului care pointeaza catre o metoda care are signaturaadecvata

    se apeleaza delegatul prin folosirea numelui sau, cu parametrii corespunzatori

    Declararea si lansarea evenimentelor

    Declaring and Raising Events Formele si controalele au evenimente membre implicite(built-in) care sunt apelate cand au loc anumite actiuni in program. De exemplu,evenimentul Click este lansat la executia unui clic asupra butonului.

    In C#, pentru declararea unui eveniment, trebuie desemnat explicit tipul delegatuluicare va fi utilizat de eveniment:

    public delegate void calculationDelegate(double d);

    public event calculationDelegate CalculationComplete;

    Odata declarat, evenimentul poate fi lansat in code atunci cand actiunile care vor finotificate de eveniment au loc. De exemplu, o componenta BankAccount lanseaza uneveniment Closing atunci cand se doreste inchiderea contului.

    //Evenimentle in C# sunt lansate prin nume,

    //ca in cazul unei metode

    CalculationComplete(100000);

    Tratarea evenimentelor

    Dupa declarare, evenimentul trebuie asociat unuia sau mai multor event handlereinainte de a putea fi lansat raised. Un event handler este o metoda apelata prinintermediul unui delegat atunci cand un eveniment este lansat. Lansarea unuieveniment care nu are asociat nici un event handler provoaca aparitia unei erori.

    Event Handlere

    Un event handler C# poate returna o valoare care poate fi asignata unei variabile la felca in cazul unui apel de functie. Asocierea unei metode cu un eveniment se realizeazaprin crearea unei instante a unui delegat adecvat evenimentului care specifica, larandul sau, metoda pe care o invoca; se utilizeaza operatorul += pentru realizareaasocierii. Se pot crea, de aemenea, asocieri intre un evenimentt si o instanta a unuidelegat existent. De exemplu:

    // metoda DisplayResults are signatura adecvata

    // delegatului CalculationDelegate

    // se creaza un nou delegat pentru a crea asocierea

    Account.CalculationComplete += newcalculationDelegate(DisplayResults);

    // asociere cu un delegat existent

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 32 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • calculationDelegate calc = newcalculationDelegate(DisplayResults);

    Account.CalculationComplete += calc;

    Pentru evenimentele asociate controalelor si claselor .NET Framework exista delegatiimpliciti; acestia nu mai trebuie declarati ci doar instantiati. Exemplu: clasaSystem.EventHandler este clasa cea mai utilizata pentru instantierea delegatilor.

    button1.Click += new

    System.EventHandler(clickHandler);

    Sinteza:

    pentru a trata un eveniment in C#, se creaza o instanta a delegatului care va fi asociatevenimentului care va fi tratat si se foloseste operatorul += pentru a realiza asociereaeveniment - delegat.

    Event-handlere care trateaza mai multe evenimente

    // ClickHandler este o metoda cu signatura adecvata

    // tratarii evenimentului clic pentru un buton

    button1.Click += new System.EventHandler(ClickHandler);

    button2.Click += new System.EventHandler(ClickHandler);

    Evenimente cu handlere multiple

    Un eveniment poate fi tratat de mai multe handlere,acestea apelandu-se in ordineaasocierii (operatorul +=), valoarea returnata de eveniment avand tipul returnat deultimul event handler asociat.

    Eliminarea handlerelor la run-time

    // se foloseste operatorul -=

    Account.CalculationComplete -= new

    calculationDelegate(DisplayResults);

    Sinteza

    evenimentele sunt membri ai claselor utilizati pentru notificarea anumitor actiuni dinprogram. O instanta a unei clase poate lansa un eveniment membru pentru atransmite notificarea. Evenimentul poate fi trata de metode desemnate drept eventhandlere. Aceste metode sunt executate la lansarea evenimentului.

    delegatii implementeaza functionalitatea de la baza evenimentelor. Un delegat estepointer la o functie, puternic tipizat. Poate invoca o metoda fara apelul explicit alacesteia. Asocierile dintre evenimente si event handlere implica utilizarea explicita adelegatilor.

    Evenimentele sunt declarate ca membri ai clasei; pot fi apelati prin nume si potreturna o valoare.

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 33 of 203

  • Metodele care trateaza evenimentele se numesc event handlere. Un event handlerse creaza prin utilizarea operatorului += pentru a asocia un delegat evenimentului.

    Evenimentele pot avea mai multe event handlere asociat, si evenimente multiple potfi tratate de acceasi metoda. Event handlerele pot fi eliminate dinamic (folosindoperatorul -=).

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 34 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Section 4. Gestionarea interfetelor utilizator - III

    1. Design-ul interfetelor utilizator - principii Descrierea importantei interfetei utilizator Rolul formelor, controalelor si a meniurilor in cadrul interfetelor Importanta compozitiei si culorilor interfetei utilizator Explicarea folosirii imaginilor, icon-urilor si a fonturilor in design-ul interactiv

    Forme, controale, meniuri

    formele contin informatii si optiuni utile utilizatorilor fiecare forma este o clasa, pentru care se pot crea instante sau care poate fi folosita

    drept clasa de baza controalele fac informatiile accesibile utilizatorilor meniurile si tool box-urile furnizeaza o modalitate structurata de a expune comenzile

    disponibile utilizatorilor aplicatiei

    Aspectul si functionalitatea aplicatiei

    simplitate pozitionarea controalelor consistenta: organizare, culori, forme, marime, tipuri, imagini, transparenta estetica

    Sinteza:

    o interfata consistenta din punct de vedere vizual si logic este mult mai usor deinteles si folosit

    elementele de baza ale unei interfete sunt formele, controalele si meniurile o interfata reusita trebuie sa tina cont de cateva aspecte legate de look si feel sunt importante deciziile de design adresate direct utilizatorilor - semnificatii

    culturale, consistenta, simplitate

    2. Forme

    Formele reprezinta unitatea fundamentala a unei interfete utilizator. Ele furnizeaza oplatforma pe care se plaseaza controalele si permit prezentarea aplicatiei intr-omaniera consistenta si atractiva. Formele afiseaza date si primesc input-ul utilizatorilor.De obicei, aplicatiile contin una sau mai multe forme, organizate astfel incat sa urmezelogica fireasca a aplicatiei.

    stabilirea rolului unei forme intr-o aplicatie

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 35 of 203

  • adaugarea de forme la o aplicatie setarea formei de start si a locatiei de start setarea aspectului vizual al unei forme folosirea metodelor unei forme evenimente din cadrul metodelor

    Adaugarea de forme la o aplicatie

    La crearea unui proiect de tip Windows Forms, se creaza si se adauga la proiect oforma initiala, denumita Form1. Form1 nu reprezinta, efectiv, o instanta a unei forme, cimai degraba o clasa care contine codul asociat unei instante a formei. Designer-ul esteo reprezentare grafica a componentei(de obicei o forma) supuse design-ului, conferindposibilitatea adaugarii de controale, meniuri sau alte elemente vizuale formeirespective. Odata cu cresterea in dimensiuni a aplicatiei, se creaza noi forme sau altecomponente necesare bunei functionalitati a aplicatiei.

    Adaugarea unei noi forme la un proiect:

    1. Meniul Project, Add Windows Form. Se deschide astfel fereastra de dialog Add NewItem.

    2. Se selecteaza Windows Form, apoi Open. Este adaugata o noua forma mediului delucru.

    Adaugarea unei forme la o aplicatie la run time:

    Se declara si se instantiaza o variabila reprezentand forma in aceeasi maniera ca incazul oricarei alte clase.

    De exemplu:

    // se presupune existenta unei forme de tip DialogForm

    DialogForm forma1;

    forma1 = new DialogForm();

    Mostenirea vizuala

    Mostenirea vizuala este un concept care se refera la crearea de noi forme, pornind dela forme existente, in ideea de a pastra caracteristicile vizuale si functionalitateaclaselor de baza. Aceasta tehnica permite crearea unei forme care incorporeaza totimembrii, controalele, meniurile si codul asociat unei forme existente, folosind aceastaforma ca baza pentru implementarea unei functionalitati aditionale. Pentru a crea relatiide mostenire se poate folosi fie Inheritance Picker-ul, fie varianta scrierii de cod.

    Crearea unei forme derivate folosind Inheritance Picker-ul:

    1. Meniul Projects, Add Inherited Form. Se deschide fereastra de dialog Add New Item.2. In panoul din stanga se selecteaza Local Project Item, in dreapta, Inherited Form. Se

    introduce un nume si se deschide Inheritance Picker-ul.3. Acesta afiseaza formele existente in proiect, dintre acestea selectandu-se forma de

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 36 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • baza care va fi asociata noii forme create.

    ! se poate alege drept clasa de baza si o forma dinafara proiectului, aceasta trebuie safie compilata intr-un fisier EXE sau DLL.

    Crearea unei forme derivate folosind scrierea de cod:

    1. Meniul Projects, Add Windows Form.2. Se modifica, in codul asociat clasei create, declaratia clasei.

    // FormaBaza este o clasa existenta,

    // asociata unei forme din proiect

    public class FormaDerivata : FormaBaza

    {

    // implementare

    }

    ! Proiectul trebuie sa aiba acces la forma din care de deriveaza. Deci, el trebuie saincluda fie o referinta la assembly-ul care contine forma parinte (in acest exemplu,MainForm) sau forma trebuie sa fie inclusa in proiect.

    Setarea formei de start

    Daca o aplicatie de tip Windows Forms contine mai multe forme, trebuie sa sedesemneze o forma de start. Forma de start va fi prima forma incarcata la executiaaplicatiei.

    public static void Main()

    {

    Application.Run(new myForm());

    }

    Setarea formei de start in Visual C# se face utilizand meniul Projects, optiuneaProperties, apoi la StartupObject se alege forma dorita.

    Setarea pozitiei de start

    Proprietatea StartPosition se poate utiliza pentru a determina pozitia pe ecran la carese va afisa prima data o forma. Aceasta poate fi setata la oricare dintre valorileenumerarii FormStartPosition.

    Valori FormStartPosition

    Valoare Efect

    Manual Forma se deschide la pozitia determinata de proprietateaLocation.

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 37 of 203

  • CenterScreen Forma se deschide centrat pe ecran.WindowsDefaultLocation Forma se deschide la locatia implicita determinata de

    setarile Windows.

    WindowsDefaultBounds Forma se deschide la pozitia Windows implicita, avandmarimea stabilita prin setari Windows implicite.

    CenterParent Forma se deschide centrat, peste forma parinte.

    Modificarea aspectului unei forme

    Aspectul unei interfete este o parte importanta a unei aplicatii. Utilizarea proprietatiloratasate diferitelor obiecte permite utilizatorului modificarea aspectului formelor.

    Modificarea proprietatilor:

    - din fereastra Properties

    - modificand codul, la run-time

    // schimbarea culorii unei forme form1

    form1.BackColor = System.Drawing.Color.Red;

    Proprietatile BackColor, ForeColor si Text

    Text - stabileste titlul formei. BackColor si ForeColor - reprezinta culorile atasate unei forme.

    ForeColor este culoarea textului in foreground.

    BackColor reprezinta culoarea de background a formei.

    Alte proprietati:

    Valoare Efect

    Font specifica fontul folosit in cadrul formeiCursor specifica icon-ul care apare atunci cand sageata

    mouse-uluise afla deasupra formeiBackGroundImage permite setarea unei imagini de background

    Opacity

    - variaza gradul de transparenta al formei

    - valori posibile: in intervalul [0, 1]. Valoarea 1 indica faptul ca forma este completopaca, iar valoarea 0 creaza o forma complet transparenta. Valorile intermediareimprima formei o transparenta partiala. Valoarea implicita este 1 (opacitate totala).

    // o forma semi-transparenta

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 38 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • MyForm.Opacity = .5;

    ! in fereastra Properties, Opacity este reprezentata ca o valoare procentuala.

    Utilizarea metodelor specifice formelor

    Orice forma incapsuleaza un set functional de baza mostenit din clasaSystem.Windows.Forms.Form. Printre acestea, se gasesc metodele responsabile demodul de afisare si de posibilitatile de accesare a formei in mediul de lucru. Cele maiimportante astfel de metode:

    Form.Show Form.ShowDialog Form.Activate Form.Hide Form.Close

    Folosirea acestor metode implica existenta unei instante a formei in memorie. Pe langainstantele formelor create in cod, aplicatia creaza o instanta a formei de start-up inlansarii in executie a programului.

    Show si ShowDialog

    - Form.Show - face forma vizibila (se incarca in memorie o instanta a formei, seafiseaza forma pe ecran si primeste focus-ul aplicatiei). Proprietatea Visible este setatala true dupa apelul lui Form.Show. Pentru o forma incarcata in memorie dar care esteinvizibila (de exemplu, daca proprietatea Visible a fost setata la valoarea false), apelulForm.Show are acelasi efect ca setarea proprietatii Visible la valoarea true.

    - Form.ShowDialog - in plus, afiseaza forma modal, adica forma trebuie inchisa inainteca orice alta forma sa poata primi focus-ul.

    // DialogForm este o clasa asociata unei forme existente

    DialogForm myForm = new DialogForm();

    //afiseaza fereastra in mod uzual

    myForm.Show();

    //afizeaza fereastra modal

    myForm.ShowDialog();

    Activate

    pentru o forma vizibila, dar care nu a primit inca focus-ul, se poate utiliza metodaForm.Activate

    apelata in cadrul aplicatiei active, metoda Form.Activate aduce forma in prim-planulaplicatiei si ii transmite focus-ul

    apelarea metodei pentru o aplicatie inactiva in interfata utilizator, determina clipireatitlului aplicatiei din taskbar

    forma pentru care se apeleaza metoda Activate trebuie sa fie vizibila pentru a obtine

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 39 of 203

  • efectul scontat.

    //apelarea metodei Activate

    myForm.Activate();

    Hide

    face forma invizibila. Desi forma persista in memorie, nu va mai fi vizibila pana laapelarea metodei Form.Show sau la setarea proprietatii Visible la valoarea true incod

    apelul metodei Hide seteaza proprietatea Visible la false

    //apelarea metodei Hide

    myForm.Hide();

    Close

    Form.Close inchide forma si o elimina din memorie se inchid toate resursele continute de forma, fiind preluate de garbage collector apelul Form.Close anuleaza efectul unui apel ulterior Form.Show, pentru ca

    resursele asociate formei nu mai sunt disponibile apelul Form.Close pentru forma de start-up determina inchidera aplicatiei

    //apelarea metodei Close

    myForm.Close();

    Evenimente din cadrul formelor

    Eveniment - o notificare survenita in urma unei actiuni din program. Aplicatia lanseazaevenimentul, iar o alta componenta a aplicatiei are oportunitatea de a trata evenimentulrespectiv. Fiecare dintre metodele prezentate anterior lanseaza unul sau mai multeevenimente; utilizatorul are oportunitatea de a trata prin cod aceste evenimente.Exemple: apelul metodei Form.Hide determina lansarea evenimentelor Deactivate siVisibleChanged. Un event handler este o metoda care se executa ca raspuns lalansarea unui eveniment.

    Crearea unui event handler pentru o forma, un control sau o componenta

    1. Design view - selectarea formei sau a controlului pentru care se va crea eventhandler-ul

    2. Properties - butonul Events3. din lista evenimentelor disponibile se selecteaza evenimentul dorit4. se scrie codul pentru event handler

    Argumentele event handler-elor

    Exemplu:

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 40 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • private void Form1_Load(object sender, System.EventArgs e){

    // codul metodei

    }

    Argumente:

    - sender - obiect care contine o referinta catre obiectul care a lansat evenimentul

    - e - instanta a clasei EventArgs; poate contine informatii suplimentare

    ! se poate obtine o referinta catre tipul care a cauzat lansarea evenimentului, in cazulin care se cunoaste acest tip, printr-o conversie explicita a argumentului sender la tipulrespectiv. De exemplu:

    Form1 myForm;

    myForm = (Form1)sender;

    In multe cazuri, parametrul EventArgs nu contine informatii folositoare din punct devedere programatic. Exista insa situatii in care acest parametru furnizeaza informatiiutile.

    Evenimente referitoare la durata de viata a unei forme

    Load Activated/Deactivate VisibleChanged Closing Closed

    Load

    Se lanseaza in momentul in care o forma este incarcata pentru prima oara in programla primul apel al metodelor Form.Show sau Form.ShowDialog.

    Exemplu:

    Form myForm = new Form();

    myForm.Show();

    // se lanseaza Load

    myForm.Hide();

    // forma este acum invizibila

    myForm.Show();

    // nu se mai lanseaza Load

    myForm.Close();

    // se inchide forma

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 41 of 203

  • myForm.Show();

    // exceptie, forma nu mai este disponibila

    !

    evenimentul Load este lansat o singura data pe parcursul duratei de viata a uneiinstante a formei

    Activated/Deactivate

    Evenimentul Activated poate aparea in urmatoarele situatii (la primirea focus-ului):- la apelul metodelor Form.Show, Form.ShowDialog, Form.Activate

    - cand o forma este adusa in prim-planul aplicatiei

    Deactivate apare ori de cite ori o forma pierde focus-ul:

    - prin interactiunea utilizatorului cu interfata

    - la apelul metodelor Form.Hide sau Form.Close (Form.Close lanseaza evenimentulnumai daca forma este activa)

    ! Activated si Deactivate sunt lansate numai cand focus-ul este modificat prinintermediul programului.

    VisibleChanged

    - lansat la schimbarea proprietatii visible a formei la apelul metodelor Form.Show,Form.ShowDialog, Form.Hide si Form.Close.

    Closing - lansat in cazul in care forma este in curs de inchidere, dar nu este incainchisa complet

    - prin apelul Form.Close sau prin apasarea butonului Close al formei

    - signatura event handler-ului asociat evenimentului Closing include o instansa a claseiCancelEventArgs

    //anularea inchiderii formei

    private void Form1_Closing(object sender,System.ComponentModel.CancelEventArgs e)

    {

    e.Cancel = true;

    }

    Closed

    - se lanseaza dupa ce forma a fost inchisa prin apelul Form.Close sau prin inchidereamanuala a formei; apare dupa lansarea evenimentului Closing si dupa executia tuturorhandler-elor asociate acestuia

    Sinteza:

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 42 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • Formele reprezinta elementul de baza al interfetei utilizator pentru un program de tipWindows Forms. Formele trebuie sa contina o interfata consistenta, completa siatractiva pentru utilizator.

    Proprietati care controleaza aspectul unei forme:

    BackColor ForeColor Text Font Cursor BackGroundImage Opacity

    Metode care controleaza durata de viata si modul de afisare a formelor:

    Form.Show Form.ShowDialog Form.Activate Form.Hide Form.Close

    Fiecare dintre aceste metode provoaca schimbari de vizualizare si lanseaza diverseevenimente. Printre acestea:

    Load Activated/Deactivate VisibleChanged Closing Closed

    Event handler-e: metode specializate de tratare a evenimentelor.

    3. Controale si componenteControalele reprezinta al doilea element al unei interfete vizuale, in ordinea importantei,dupa forme.

    Functionalitate:

    - o parte dintre controale, cum ar fi Button sau TextBox, sunt desemnate sa accepteinput-ul utilizatorului si sa execute operatii bazate pe interactiunea utilizatorului

    - o alta parte constituie componente specializate, proiectate sa execute interactiunicomplexe cu alte parti ale aplicatiei.

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 43 of 203

  • Asemanari si deosebiri intre controale si componente: ambele reprezinta unitati de codcare incapsuleaza functionalitati specifice; controalele au o reprezentare vizuala, intimp ce componentele nu.

    Controale

    Adaugarea unui control intr-o aplicatie Windows Forms

    1. din Toolbox, se selecteaza controlul dorit.2. se adauga controlul pe forma3. eventual, se face o repozitionare a controlului.

    Setarea proprietatilor unui (sau mai multor) control (controale) se realizeaza, cel maifrecvent, folosind fereastra Properties

    Adaugarea de componente la o forma se face in acelasi mod, la fel si setareaproprietatilor. Diferenta principala fata de controale este aceea ca nu exista oreprezentare vizuala a componentelor, odata cu adaugarea lor la o forma.

    Control Tab Order

    Utilizatorii pot folosi tasta Tab pentru a transmite focus-ul de la un control la altul, intr-oanumita ordine - tab order. Aceasta ordine este specificata de proprietatea TabIndex.Pentru a stabili ordinea de primire a focus-ului, se seteaza proprietatea TabIndex afiecarui control la o anumita valoare. Focus-ul va fi transmis controalelor in ordineacrescatoare a valorilor proprietatii TabIndex. Visual Studio ofera a alta modalitate desetare a ordinii de primire a focus-ului. Din meniul View, se alege Tab Order. Indesigner, apare o casuta in interiorul fiecarui control care, prin clic ofera posibilitateasetarii unui numar. Ordinea de primire a focus-ului este ordinea data de valorilenumerelor respective.

    !

    Exista controale care nu pot primi focus-ul, deci nu au asociata proprietatea TabIndex.

    Controale container

    Sunt controale speciale care ofera posibilitatea gruparii mai multor butoane in interiorullor. Exemple de astfel de controale - Panel, GroupBox si TabControl. Pot fi folositepentru organizarea logica a grupurilor de controale pe o forma. De exemplu, se potgrupa un set de butoane radio intr-un control GroupBox.

    !

    - Un control container se comporta ca o gazda pentru alte controale, dar esteindependent de aceste controale. In contrast, exista controale utilizator care pot legacontroale multiple intr-o singura unitate interdependenta.

    - Modificarea proprietatilor unui control container poate afecta proprietatile controalelorcontinute. De exemplu, daca proprietatea Enabled a unui GroupBox este setata lafalse, toate controalele continute devin disabled. La fel se intampla in cazulproprietatilor BackColor, ForeColor, Visible si Font. Acesta confera un aspect

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 44 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • consistent interfetei utilizator.

    GroupBox si Panel

    Sunt doua controale container similare. Amandoua furnizeaza posibilitatea grupariilogice si fizice a controalelor. Pot fi proiectate ca subdiviziuni ale formei. Modificareaproprietatilor unui control Panel sau GroupBox afecteaza toate controalele continute.Acestea pot fi grupate sau repozitionate ca o singura unitate in momentul design-ului.La run-time, tot grupul poate fi dezactivat prin setarea proprietatii Enabled la false.

    GroupBox - furnizeaza un titlu care va fi asociat intregului grup controale (modificandproprietatea Text).Panel - un container cu scroll, nu contine o proprietate text. Setand proprietateaAutoScroll la true, se ataseaza bare de defilare panel-ului respectiv.

    TabControl

    - grupeaza controalele intr-o multime de tabele (similar diviziunilor dintr-o carte deadrese)- un TabControl este un suport pentru un anumit numar de TabPages, care gazduiescalte controale

    - exemplu de TabControl: pagini de proprietati pentru o aplicatie, fiecare tab continandproprietati referitoare la o componenta specifica aplicatiei.

    Proprietatea TabPages reprezinta o colectie de controale TabPage, fiecare cu setulsau de proprietati. O pagina din TabPages este similara controlului de tip Panel.Adaugarea de TabPages se efectueaza prin utilizarea proprietatii TabPages.

    Docking si Anchoring

    Reprezinta proprietati ale controalelor care dicteaza comportamentul acestora in cadrulformei sau controlului parinte.

    - Anchor permite definirea unei distante constante intre un control si una sau mai multemargini ale formei

    - redimensionarea unei forme la run time implica pastrarea unei distante specifice fatade marginile indicate

    - valori posibile : o enumerare care poate contine, separate prin virgule una sau maimulte dintre valorile Top, Left, Right, Bottom

    - Dock permite atasarea controlului la una din marginile formei sau ocuparea completaa formei de catre control

    - redimensionarea formei atrage dupa sine redimensionarea controlului

    - setarea valorii se face prin folosirea micro-interfetei grafice puse la dispozitie infereastra Properties

    Utilizarea colectiei Controls

    Fiecare container, incluzand formele, expun o colectie a tuturor controalelor continute -controls collection. Colectia expune o proprietate Count care returneaza numarul de

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 45 of 203

  • elemente continute si o proprietate Item care returneaza un element specific. Exista, deasemene, metode care pot fi folosite pentru a adauga si elimina controale in cadrulcolectiei.

    // se presupune existenta unei instante myForm

    Control aControl;

    aControl = myForm.Controls[3];

    Label aLabel = new Label();

    aLabel.Text = "Eticheta adaugata dinamic";

    myForm.Controls.Add(aLabel);

    myForm.Controls.Remove(Button1);

    myForm.Controls.RemoveAt(3);

    //sintaxa similara pentru adaugare si eliminare

    //de controale intr-un

    //Panel, GroupBox sau TabPage control

    // myTabControl este o instanta a unui TabControl

    Button aButton = new Button();

    // se adauga un buton paginii cu indexul 1 in colectia

    // TabPages din TabControl

    myTabControl.TabPages[1].Controls.Add(aButton);

    Adaugarea de noi controale in Toolbox

    1. Se alege colectia din Toolbox la care se doreste adaugarea controlului.

    2. Right-click in interiorul colectiei selectate - Customize Toolbox.

    !

    se pot adauga componente .NET sau componente COM existente

    3. se poate selecta un control deja inregistrat in lista sau se foloseste Browse pentru alocaliza un control inca neinregistrat.

    !

    un control care se doreste adaugat trebuie recunoscut ca ActiveX Control, componentaCOM sau assembly .NET

    Event Handlere pentru controale

    Fiecare control poate lansa o varietate de evenimente care corespund interactiunii cuutilizatorul. Un exemplu este apasarea unui buton care determina lansarea unuieveniment, cautandu-se apoi eventualele handlere; handlerele gasite sunt lansate inexecutie. Fiecare control are un eveniment implicit asociat, care reprezinta evenimentullansat cel mai frecvent. De exemplu, evenimentul implicit pentru Button este Click, iar

    ibm.com/developerWorks Presented by developerWorks, your source for great tutorials

    Page 46 of 203 Dezvoltare de aplicatii in Visual Studio .NET

  • pentru Checkbox, CheckChanged.

    Crearea unui event handler pentru evenimentul implicit al unui control:

    1. In designer, se executa dublu clic pe control. Se deschide fereastra de cod asociataevent handler-ului.

    2. Se scrie codul dorit pentru event handler.

    Pentru a crea un event handler pentru un eveniment in general:

    1. Design view - se selecteaza controlul.

    2. Din fereastra Properties - se selecteaza Events. Se afiseaza lista evenimentelordisponibile pentru controlul respectiv.

    3. Se alege evenimentul dorit, apoi se scrie codul.

    4. Daca exista deja event handler-e implementate pentru controlul respectiv, se poatealege una din metodele existente, din drop-down-ul asociat evenimentului respectiv.

    Interactiunea cu mouse-ul

    Tabel - Evenimente determinate de interactiunea cu mouse-ul

    Eveniment Descriere Tip EventArgsMouseEnter mouse-ul intra in zona controlului System.EventArgsMouseMove mouse-ul se misca pe suprafata

    controluluiSystem.MouseEventArgs

    MouseHover mouse-ul se afla pe suprafatacontrolului

    System.EventArgs

    MouseDown mouse-ul se afla pe suprafatacontrolului si se apasa un buton

    System.MouseEventArgs

    MouseWheel miscarea rotitei de scroll a mouse-uluiatunci cand controlul are focus-ul

    System.MouseEventArgs

    MouseUp mouse-ul se afla pe suprafatacontrolului si se elibereaza un buton

    System.MouseEventArgs

    MouseLeave mouse-ul paraseste suprafatacontrolului

    System.EventArgs

    MouseEnter, MouseHover si MouseLeave semnaleaza faptul ca mouse-ul se afla inregiunea unui control, transmitand putine informatii event handler-elor. MouseMove,MouseDown, MouseWheel si MouseUp, din contra, pot fi folosite pentru a implementainteractiuni substantiale intre utilizator si interfata. Un obiect de tip MouseEventArgscontine informatii despre starea si locatia mouse-ului.

    Tabel - proprietati MouseEventArgs

    Proprietate Descriere

    Presented by developerWorks, your source for great tutorials ibm.com/developerWorks

    Dezvoltare de aplicatii in Visual Studio .NET Page 47 of 203

  • Button specifica daca s-a apasat un buton al mouse-uluiClicks returneaza numarul de click-uri efectuateDelta Returneaza numarul de actionari asupra rotitei mouse-ului;

    acesta poate fi pozitiv sau negativ - deplasare inainte sauinapoi; fiecare astfel de deplasare adauga sau scade 120din valoarea anterioara