Programarea Aplicaţiilor Windows in NET Framework

download Programarea Aplicaţiilor Windows in NET Framework

of 10

description

Programarea Aplicaţiilor Windows in NET Framework

Transcript of Programarea Aplicaţiilor Windows in NET Framework

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    Programarea aplicaiilor Windows n .NET Framework

    .NET Framework asigur i uneltele i tehnologiile necesare dezvoltrii aplicaiilor distribuite, att Windows, ct i Web, inclusiv servicii Web.

    Prin arhitectura sa .NET Framework asigur suportul necesar proceselor de compilare i rulare, necesare dezvoltrii aplicaiilor .NET.

    n acest articol mi propun s prezint aspecte legate de dezvoltarea aplicaiilor Windows.

    Tipuri de aplicaii Windows

    n .NET putem vorbi de dou tipuri de aplicaii: Console Applications i Windows Applications.

    O singur aplicaie poate avea elemente caracteristice celor de tip consola ct i celor Windows. De exemplu, ntr-o aplicaie consol putem s introducem o fereastr MessageBox. Compilatorul C# face diferena dintre cele dou tipuri de aplicaii printr-un switch numit "target" de pe linia de comand a acestuia.

    /target:exe - pentru aplicaii consol

    /target:winexe - pentru aplicaii Windows

    Switch-ul target poate lua i valorile, "libray" sau "module" dac vrem s generm module de cod.

    Dac un executabil marcat ca fiind de tip consol i este lansat n execuie direct din Windows, atunci Windows-ul va crea o fereastr consol pentru aplicaie. Dac aplicaia este pornit dintr-o fereastr Windows, la lansarea n execuie Windows nu se va deschide nici o fereastr consol.

    Hello World

    Aa ar arta clasicul "Hello World" scris n C#, ca aplicaie consol:

    using System; namespace ConsoleApplication { class MyClass { static void Main(string[] args) { Console.WriteLine("Hello World"); } } }

    Punctul de start n orice aplicaie .NET Framework este metoda static Main. Dac ntr-un proiect exist dou clase, fiecare cu cte o metod static Main, atunci trebuie specificat compilatorului va fi folosit ca punct de start pentru firul de execuie principal.

    MessageBox

    Dac dorim s afim ferestre de dialog standard, de tipul "MessageBox", putem modifica codul astfel:

    using System; namespace ConsoleApplication

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    { class MyClass { static void Main(string[] args) { System.Windows.Forms.MessageBox.Show("Hello World"); } } }

    MessageBox este o clas din namespace-ul: System.Windows.Forms.

    Metoda Show face sa apar pe ecran fereastra de dialog. Metoda a fost suprascris, avnd astfel mai multe variante, la care difer lista de parametri.

    Forme

    n lumea real, aplicaiile Windows nu se rezum doar la MessageBox, ci folosesc aa numitele ferestre. n .NET ferestrele sunt implementate de ctre form-uri. Pentru a crea o fereastr trebuie s instaniem o clas "Form" sau una derivat din aceasta. Clasa form o gsim definit n namespace-ul "System.Windows.Forms". Dup instaniere, o putem afia n dou moduri: prin apelul metodei "Show" sau prin setarea proprietii "Visible" la valoarea True.

    using System; using System.Windows.Forms; public class NewForm { public static void Main() { Form form=new Form(); form.Show(); } }

    Ce este cu bucla de mesaje? Este un ciclu "while" care se ocup cu extragerea i tratarea mesajelor din coada de mesaje, n . NET Framework un astfel de mecanism este implementat cu ajutorul clasei "Application".

    public class NewForm { public static void Main() { Form form=new Form(); form.Show(); Application.Run(form); } }

    Daca se dorete terminarea aplicaiei, se apeleaz metoda static "Application.Exit()", care trimite mesajul WM_QUIT n coada de mesaje a aplicaiei.

    Dei se pot crea forme direct din clasa "Form", este preferabil s folosim clase care o motenesc-cazul designer-ul de forme din Visual Studio.NET.

    S crem un proiect nou de tip "Windows Application" n C#, iar n forma creat automat, adugm un textbox i un button, prin "tragerea" lor de pe ToolBox.

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    ntre directivele #region i #endregion, gsim codul generat automat de VS.NET, la adugarea celor dou controale pe suprafaa formei. Acolo unde ncepe definirea clasei, observm declaraiile celor dou obiecte - controalele adugate.

    IDispose

    nainte de a continua, fac o mic parantez. Metoda "Dispose" este declarat n interfaa "IDispose". n C# avem operatorul "new", dar nu avem complementarul su "delete". Asta deoarece cu dealocrile n .NET Framework se ocup "Garbage Collector". Prin urmare nu avem un control strict cnd anume i n ce ordine vor fi dealocate obiectele la care nu mai exist nici o referin sau au ieit din domeniul lor de vizibilitate. .NET Framework, pune la dispoziie o interfa "IDispose", care poate fi folosit n mecanismul de motenire, prin metoda "Dispose". Cnd un obiect urmeaz a fi dealocat, "Garbage Collector" verific dac acel obiect suport interfaa "IDispose" i dac da, atunci apeleaz metoda "Dispose".

    "Anchor" i "Dock"

    Toate controale, au n .NET dou proprieti, ceva cu totul nou fa de cum erau obinuii programatorii n Visual Basic 6.0, care scutesc de o grmad de efort: anchor - permite unui control s pstreze distana absolut fa de una sau mai multe margini ale containerului n care se afl, prin redimensionarea sa; dock - un control este efectiv, lipit de una din marginile containerului su, modificndu-i i dimensiunea. Folosind aceast proprietate putem zice c un control capt comportamentul unui ToolBar.

    Tratarea evenimentelor

    Un control sau o form devin mai utile cnd putem s i captm evenimentele generate de acestea. Dac vrem s tratm evenimentul "Click" pe butonul din form, se selecteaz tab-ul events din fereastra de proprieti a butonului i se d dublu-clic pe evenimentul "Click". n acel moment VS.NET genereaz codul necesar captrii evenimentului. Sau am putea scrie manual codul respectiv. Se adaug o metoda care va trata evenimentul generat de aciunea de clic pe buton:

    private void button1_Click(object sender, System.EventArgs e) { MessageBox.Show("Button"); }

    Iar pentru cuplarea acestei metode la evenimentul click trebuie executat urmtoarea secven:

    this.button1.Click += new System.EventHandler(this.button1_Click);

    S zicem c la un moment nu mai vrem s captm evenimentele de clic pe buton. Pentru aceasta trebuie executat urmtoarea secven:

    this.button1.Click -= new

    System.EventHandler(this.button1_Click);

    Motenirea formelor

    Sa zicem c avem de dezvoltat o aplicaie n care exist mai multe forme de introducere a datelor. Unele seamn ntre ele, singura diferen fiind un control nou sau un set nou de butoane. n .NET Framework, o form este descris de o clas. Prin urmare, formele se pot moteni. Pentru aceasta, crem o form care ar reprezenta intersecia formelor finale, dup care crem celelalte forme pe baza acesteia. Plecnd de la forma pe care tocmai am creat-o s crem una nou care mai are doar un

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    buton n plus. Mai nti trebuie dat un "Build" la soluia noastr ca s avem generat un assembly pe baza cruia se va genera noua form. ntr-un assembly, o form se gsete ca metadate. Astfel putem s motenim o form n C# care a fost creat n VB sau n Cobol.

    Se selecteaz din meniul "Project", "Add Inherited Form", dup care va aprea o fereastr (vezi figura de sus), unde putem s schimbm numele fiierului. Dup ce apsm ok, din urmtoarea fereastr de dialog trebuie s selectm forma i assembly-ul n care se gsete forma pe care vrem s o motenim. Mai adugm aici un buton cu proprietatea "Test" la valoarea "Afieaz":

    Se observ aici c avem cele dou controale motenite. Proprietile acestora apar n culoarea gri i sunt read-only, deoarece cele dou controale au fost implementate n forma de baz ca proprieti de tip "private". Puteam opta i pentru "protected"sau "public".

    Ferestre de dialog

    Ferestrele de dialog sunt tot nite forme, dar care sunt afiate "modal", adic pn la nchiderea casetei de dialog, execuia programului nu poate continua cu o alta form.

    Crearea formelor modale, pe partea de design nu presupune nimic n plus fa de crearea formelor obinuite. Diferena apare la modul n care se vor afia. La cele nemodale, afiarea se face prin apelul metodei "Show" sau prin setarea proprietii "Visible" pe true. n cazul celor modale, vom apela metoda

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    "ShowDialog()". Aceasta ntoarce o valoare de tip enumeraie, "DialogResult", la fel ca-n cazul clasei "MessageBox".

    Dac dorim ca un buton s aib comportamentul butonului "OK", atunci trebuie s atribuim proprietii "AcceptButton" o referin ctre butonul respectiv:

    this.AcceptButton=button1;

    n cazul butonului "Cancel", trebuie s atribuim proprietii "CancelButton" o referin ctre butonul respectiv:

    this.CancelButton=button2;

    Ferestre de dialog standard

    Aproape toate aplicaiile Windows afieaz pe ecran o fereastr de dialog standard "OPEN", implementat n Windows, i care poate fi folosit de orice aplicaie. n .NET Framework avem la dispoziie un set de clase care ne faciliteaz accesul la ferestrele de dialog standard din Windows. Acestea sunt:

    OpenFileDialog Folosit n cazul deschiderii de fiiere, "Open" din meniul "File".

    SaveFileDialog Folosit pentru a selecta un nume i o cale unde se dorete s se salveze fiierul.

    ColorDialog Folosit pentru selectarea unei culori dintr-o palet de culori.

    FontDialog Folosit pentru selectarea unui font.PrintDialog Folosit pentru a selecta imprimanta pe care

    urmeaz a se efectua tiprirea.PageSetupDialog Folosit pentru a modifica setrile imprimantei.PrintPreviewDialog Folosit pentru pre-vizualizarea documentelor care

    se doresc a fi tiprite.

    Validarea datelor i controlul ErrorProvider

    Mecanismul de validare a datelor este asemntor cu cel din Visual Basic 6. Toate controalele folosite la preluarea datelor de la utilizator au un eveniment numit "Validating", lista de parametri pentru acest eveniment (mai exact a lui delegate i nu a evenimentului ca atare) este:

    (object sender, System.ComponentModel.CancelEventArgs e)

    Dac ntr-un control datele introduse sunt eronate atunci n metoda de tratare a evenimentului "Validating" pentru acel control, putem executa:

    e.Cancel=true;

    n urma acestei execuii controlul nu-i mai pierde focusul, oblignd utilizatorul s introduc o alta valoare.

    Evenimentul "Validating" se declaneaz cnd se cere schimbarea focusului pe alt control, dar numai dac urmtorul control are proprietatea "CauseValidation" setat pe true.

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    n cazul aplicaiilor Web a devenit o mod ca dac se introduce o valoare greit ntr-un control dintr-un formular, n urma validrii s se afieze un mic semn (ceva cu rou). n .NET Framework avem la dispoziie un control care face acelai lucru, dar pentru aplicaiile Windows. Acest control este "ErrorProvider" i este o alternativ la "MessageBox". Printre proprietile lui putem enumera:

    -ContainerControl: reprezint o referin ctre containerul su. Implicit se refer la forma care conine controlul;

    -DataSource: un ErrorProvider este capabil s afieze i erorile care se gsesc ntr-un DataSet. Vom seta aceast proprietate doar dac vrem sa o folosim cu un DataSet;

    -Icon: Iconul implicit n caz de eroare este o mica bulin roie cu semnul exclamrii alb n interior. Poate fi schimbat printr-o referin ctre un nou obiect de tip Icon.

    Acest control expune i o metod, care face s apar sau s dispar semnul de eroare.

    De exemplu, errorProvider1.SetError(textBox1,"Not an integer value") face ca n partea dreapt a controlului "textBox1" s apar un icon care indic o eroare, iar dac poziionm mouse-ul deasupra icoanei, va aprea sub form de "ToolTip" mesajul "Not an integer value".

    Crearea controalelor

    n .NET Framework controalele Windows Forms sunt componente reutilizabile care ncapsuleaz o funcionalitate user-interface i sunt folosite n aplicaii client-ceva similar cu ActiveX.

    Cnd construim un control avem la dispoziie trei variante:

    Extinderea unui control existent

    Dac se dorete ca plecnd de la un control de tip "TextBox", s crem un control similar cu un "TextBox", dar care accept numai valori numerice.

    public class NumericTextBox : System.Windows.Forms.TextBox

    n C# constructorii nu sunt motenii. Din aceast cauz cnd implementm constructorul noii clase, trebuie s apelm constructorul clasei de baz:

    public NumericTextBox():base() { ...

    Fiind derivat din TextBox, clasa noastr va avea acces la toate proprietile, metodele i evenimentele clasei "TextBox". n cazul nostru suntem interesai doar de captarea intrrii de la utilizator i de filtrarea acesteia ca s eliminm tot ce este alfabetic, adic trebuie s rescriem metoda OnKeyPress:

    protected override void OnKeyPress(KeyPressEventArgs e) { int asciiInteger=Convert.ToInt32(e.KeyChar); if(asciiInteger>=47 && asciiInteger

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    e.Handled=false; return; } e.Handled=true; }

    Controale compuse

    Este situaia n care controlul este un container pentru alte controale. Clasa acestui control trebuie derivata din: System.Windows.Forms.UserControl

    Pentru aceast categorie avem suport i din partea designerului existent n VS.NET. Cu el, dezvoltarea unui control compus este similar cu dezvoltarea unei forme.

    Custom Contols

    Aici discutm despre controalele care nu motenesc alte controale i care se deseneaz singure prin apeluri directe ctre GDI+. Clasa acestor controale trebuie derivat din: System.Windows.Forms.Control.

    Proprieti cu atribute

    Pentru fiecare proprietate sau eveniment al unui control sau pentru clasa controlului putem specifica urmtoarele atribute:

    Browsable Indic dac proprietatea sau evenimentul va fi afiat n fereastra de proprieti

    Category Afieaz proprietatea respectiv ntr-o anumit categorie n fereastra de proprieti

    Description Afieaz o scurt descriere n fereastra de proprieti cnd este selectat proprietatea respectiv

    DefaultProperty Specific la nivelul clasei care este proprietatea implicit. La un "TextBox", implicit este proprietatea "Text"

    DefaultValue Specific o valoare implicit pentru proprietateTypeConverter Specific ce convertor s se foloseasc la citirea i

    afiarea informaiilor n fereastra de proprieti.Editor Specific editorul folosit n fereastra de proprieti

    pentru o anumit proprietate.RefreshProperties Specific designerului cum i cnd s fac refresh-

    ul proprietii

    Data Binding

    Nu voi face o prezentare a ceea ce este ADO.Net i cum anume se folosete, ci am s prezint mecanismul n care controalele se pot cupla la sursele de date.

    .Net Framework permite cuplarea (binding) nu numai la surse de date de tip ADO ci la aproape toate structurile care conin date. De exemplu se poate face bind la: colecii, iruri, proprieti ale altor controale, precum i la obiecte ADO.Net, cum ar fi coloane din tabele i view-uri. Mai exact, prin procesul de binding, un control care are o proprietate legat la o surs de date, la modificarea

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    proprietii, controlul va cere permisiunea sursei de date, sursa de date controlnd valorile pe care le pe poate avea proprietatea legat. Bind-ul poate fi de dou feluri:

    -Simplu: prin care o proprietate este legat la un singur cmp al sursei de date.

    -Complex: cnd un control este ataat la o ntreag tabel de date: cazul n care atam un "DataGrid" la un "DataTable" dintr-un "DataSet".

    Sincronizarea dintre controale i sursa de date este fcut de un obiect numit "CurrencyManager", fiecare surs de date avnd ataat cte o instan de CurrencyManager:

    Fiecare form are o proprietate numit "BindingContext" care este o colecie ce asigur accesul la toate obiectele "CurrencyManager":

    Localizarea aplicaiilor

    Cnd crem aplicaii care se adreseaz unor utilizatori din ri diferite, se pune problema scrierii interfeelor grafice n mai multe limbi, precum i afiarea corespunztoare a datelor n formatul limbii respective, cum este cazul datei calendaristice. Pentru astfel de aplicaii trebuie ajut n vedere:

    -globalizarea: nucleul aplicaiei care asigur funcionalitatea de baz a aplicaiei, trebuie construit fr modulele care trebuie localizate;

    -localizarea: care se realizeaz prin traducerea modulelor resurs folosite de aplicaie i n alte limbi.

    Suportul pentru localizare n .NET Framework este asigurat de ctre clasa "CultureInfo", care conine informaii despre limba, ara, calendarul, conveniile culturale. Aceast clas asigura existena unui singur nume pentru fiecare cultur. Dar cel mai bine s facem o aplicaie ca exemplu.

    Crem un nou proiect de tip Windows Application n C#, pe care-l vom numi "LocalizedApp". Deoarece versiunea mea de Windows 2000 are suport pentru limba romna (la Regional Options n Control Panel) voi alege urmtoarea politic de localizare: dac aplicaia va rula pe un calculator cu setrile regionale setate pe romn, toate informaiile vor fi afiate n romn, iar pentru orice alt limb se va folosi limba implicit, limba englez.

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    n fereastra de proprieti a formei setez proprietatea "Localizable" pe true, pentru a activa suportul pentru localizare, iar proprietatea language o las pe "Default". Adaug un control "Label" , un edit box lng acea etichet i mai adaug un buton. Schimb proprietatea "Text" a etichetei n "First Name" iar pe cea a butonului n "Show". S zicem c forma noastr este complet. Acum s facem i versiunea n romn. Din fereastra de proprieti a formei pentru proprietatea "Language" selectam "Romanian", dup care schimbm textul celor dou controale n "Nume" i respectiv a butonului n "Mostr".

    Dac n fereastra "Solution Explorer" apsm pe butonul "Show All Files" observm c la forma noastr s-a mai adugat un fiier cu extensia "resx", n care se vor stoca datele ce in de localizarea pentru cea de-a doua limb, romna. Acum trebuie s facem urmtoarele modificri n codul formei.

    Adugm urmtoarele clauze, Pentru a putea folosi clasele necesare accesrii proprietilor firelor de execuie i "Globalization" pentru a putea folosi clasa "CultureInfo":

    using System.Threading;

    using System.Globalization;

    Iar n constructorul formei adugm urmtoarea secven de cod nainte de apelul lui "InitializeComponents()":

    Thread.CurrentThread.CurrentUICulture= Thread.CurrentThread.CurrentCulture;

    CurrentThread este o proprietate static a clasei Thread i conine o referin ctre firul de execuie principal. Fiecare fir de execuie (thread) are dou proprieti, "CurrentUICulture" i "CurrentCulture". Prima este o referin ctre un obiect "CultureInfo" folosit pentru afiarea interfeei utilizator, iar cea de a doua este o referin ctre un obiect "CultureInfo", creat pe baza informaiilor luate din "Control Panel - Regional Options".

    Compilai aplicaia i rulati-o. Vei observa c toate informaiile sunt n englez. n "Regional Options" din "Control Panel", n fia "General", schimbai, "Your locale(location)" pe Romanian. Rulai din nou aplicaia. Toate informaiile se vor afia n romn.

    Daca ne uitm n directorul unde compilatorul a depus executabilul, observm c se mai gsete un subdirector "ro" ce conine fiierul "LocalizedApp.resources.dll" - forma localizat n limba romn. Versiunea pentru limba implicit - engleza, este inclus n fiierul executabil. Pentru ncrcarea unei resurse se folosete un obiect numit "ResourceManager". Vom folosi i noi un astfel de obiect n seciunea care urmeaz.

    Localizarea resurselor

    S vedem cum localizm i alte tipuri de resurse, cum ar fi irurile de caractere, utiliznd resource manager.

    Pentru a folosi clasa "ResourceManager" i clasa "Assembly" n aplicaia noastr adugm urmtoarele clauze:

    using System.Resources;

    using System.Reflection;

    Adugm proiectului dou fiiere de tip resurs. Din meniul "Project" selectm "Add New Item ", n fereastra de dialog care urmeaz selectm ca tip "Assembly Resource File", pe care l vom numi "MyResource.resx". Acest fiier de resurse l deschidem pentru editare i adugm un nou articol cu

  • www.cartiaz.ro Carti si articole online gratuite de la A la Z

    numele "msg1" i cu valoarea "The name is:". Mai adugm un fiier de tip "Assembly Resource File" pe care-l vom numi "MyResource.ro.resx". Observm c am inclus indicativul de limb ca i cum ar fi o extensie. n acest fiier adugm un articol tot cu numele "msg1", dar cu valoarea "Numele:". Adugm un handler pentru evenimentul de clic pe butonul din form i n acest handler scriem urmtoarea secven de cod:

    ResourceManager rm=new ResourceManager("LocalizedApp.MyResource",

    Assembly.GetExecutingAssembly()); MessageBox.Show(rm.GetString("msg1")+" "+textBox1.Text);

    Compilai i rulai, pentru limbile romn i englez. ResourceManager tie s ncarce resursa n funcie de limba setat. Cnd crem un fiier resurs pentru o anumit limb, specificarea limbii se face n numele fiierului.

    Concluzii

    Sper c n aceste pagini am reuit s v fac o scurt descriere a ceea ce nseamn dezvoltarea aplicaiilor Windows pentru .NET Framework. Oricum, cele mai multe lucruri le vei nva prin practic i citind mult documentaie.