Sunteți pe pagina 1din 10

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
{
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.
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
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
"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.
n cazul aplicaiilor Web a devenit o mod ca dac se introduce o valoare greit ntr-un control dintrun 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<=57)
{
e.Handled=false;
return;
}
if(asciiInteger==8)
{
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 proprietate

TypeConverter

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

S-ar putea să vă placă și