Professional Documents
Culture Documents
CSharp Srpski PDF
CSharp Srpski PDF
2
.NET programski jezici mogu pristupiti svim ovim .NET prevoenje
klasama i u tom smislu su prilino ravnopravni, bez obzira Prilikom prevoenja koda napisanog u bilo kojem
na to da li koristite Visual Basic .NET, C#, Fortran .NET ili programskom jeziku postoje dve mogunosti: prevodioci i
neki drugi programski jezik. Razlika izmeu jezika svodi se tumai.
na sintaksu, strukturu i lini izbor. Trenutno su svi najee
korieni programski jezici prilagoeni .NET tehnologiji. Prevodioci prevode izvorni kd direktno u mainski
kd procesora. U sluaju tumaa se prilikom pokretanja
Programski jezik C# se izdvaja od drugih i smatra programa prevodi linija po linija - kako se program izvra-
se prirodnim za .NET okruenje. Ovaj programski jezik je va. NET je tuma, ali ne vri prevoenje direktno u main-
nastao kao potpuno nov i nije optereen kompatibilnou ski jezik procesora, ve u takozvani MSIL (Microsoft Inter-
sa ranijim verzijama. Radno okruenje Visual Studio je u mediate Language). Po pokretanju programa na scenu
potpunosti napisano ba u C# jeziku. On je moderno stru- stupa JIT (Just In Time) prevodilac, koji dalje prevodi MSIL
kturiran, potpuno objektno orijentisan, zasnovan na C++ u mainski jezik procesora i izvrava ga. Ovakva slojevita
jeziku i zvanino prihvaen kao standard od strane organi- arhitektura omoguava portabilnost .NET aplikacija izme-
zacija ECMA (European Computer Manufacturers Associa- u razliitih operativnih sistema u budunosti.
tion) i ISO (International Organization for Standardizati-
on).
3
Poetak izabrati stavku Aplikacija konzole (Console Application) i
Za poetak je potreban operativni sistem Windows kliknuti na dugme U redu (OK).
XP i instaliran C# Express 2005. Kada se pokrene radno Sve linije primera koda u ovom lanku su prikazane
okruenje, na uvodnom ekranu postoje opcije za kreiranje crvenom bojom, a kd koji je automatski generisalo radno
novog ili otvaranje postojeeg projekta (1). Takoe, tu se okruenje prikazan je sivom bojom.
nalazi i lista prethodno otvorenih projekata (2) koja je
sada prazna. Veoma su korisna i okna sa vezama za poe- Posle par momenata se otvara prozor za pisanje
tnike (3) i najnovijim vestima (4) koje se automatski auri- koda sa ve ispisanim kosturom aplikacije. Potrebno je
obratiti panju na liniju static void Main(string[] args). Ona
definie glavnu (Main) funkciju koja se prva pokree prili-
kom pokretanja programa. U telu ove funkcije treba upisa-
ti kd koji je potrebno izvriti. Telo funkcije je definisano
poetnom { i zavrnom } velikom zagradom, to predstav-
lja nain na koji se obeleava poetak i kraj svih segmena-
ta u C# jeziku.
4
Analiza koda: Za pojmove: klasa, objekat, objektno programiranje,
nasleivanje, metodi i slino uli ste ili proitali u literaturi
Linija: Console.WriteLine("Moja prva C# aplikacija"); i oni (po mom iskustvu) izazivaju odbojnost ka objektnom
je odgovorna za ispis teksta. Console objekt predstavlja programiranju, bez obzira na to da li ste poetnik ili profe-
prozor komandne linije, dok je WriteLine metod ovog sionalac. Ne treba se tako oseati jer objektno programira-
objekta kojim se ispisuje tekst. Kasnije emo videti ta su nje predstavlja nain razmiljanja koje je najblie svakod-
klasa, objekat i metoda klase. Oigledno, parametar meto- nevnom iskustvu i najuspenije modelira stvarnost.
de WriteLine je tekst koji elimo da se ispie.
U sledeem nastavku serijala o programiranju bavi-
Linija: Console.ReadKey(); emo se ba ovim pojmovima jer oni predstavljaju okosni-
postoji samo da bi se napravila pauza. Bez nje bi se otvori- cu u C# programiranju.
o prozor komandne linije, ispisao tekst i prozor bi se
odmah zatvorio jer se aplikacija zavrila. Slino kao i u
prethodnoj liniji koristi se objekat Console, a ovog puta
metod ReadKey koji eka da korisnik pritisne taster na
tastaturi. Pokuajte da obriete ovu liniju i pokrenete pro-
gram i vidite ta se dogaa.
5
Mala kola programiranja C# (2) Uenik takoe na odreeni nain reaguje na dea-
vanja u kolskom okruenju. Reakcija na dobru ili lou
U ovom nastavku male kole jezika C# posvetiemo ocenu, izostanak u sluaju bolesti i slino predstavljaju
se osnovama objektnog programiranja. Za razliku od tra- dogaaje (eng. events) klase.
dicionalnog proceduralnog programiranja koje se sastoji Sada, posle detaljne analize svih osobina, radnji i
od niza funkcija i njihovih poziva, objektno programiranje reakcija uenika mogue je kreirati klasu koja verno i deta-
bolje i skladnije oslikava realni svet i omoguava loginije ljno moe da opie uenika sa svim potrebnim karakteris-
projektovanje programskih zahteva. Da odmah u poetku tikama.
bude jasno: problem se moe reiti pomou tradicional-
nog i objektnog programiranja. Fizika implementacija klase
Ono to nam donosi objektno programiranje je
Svojstva klase su predstavljena razliitim varijabla-
skladniji programski model i jo neke lepe stvari kao to je
ma koje su javno vidljive van klase. Korisnik klase e po
ponovna upotrebljivost i nasleivanje objekata.
kreiranju objekta na osnovu klase uspostaviti odgovaraju-
Jedan objekat je uvek predstavljen jednom klasom.
e vrednosti varijabli i time definisati objekat.
Klasu treba posmatrati kao nacrt ili plan za izgradnju obje-
Metode klase su predstavljene funkcijama u klasi.
kta. Na primer, plan za izgradnju kue predstavlja klasu, a
Na primer, funkcija UradiDomaiZadatak koja bi kao
kua napravljena po tom planu predstavlja objekat zasno-
ulazne parametre verovatno trebalo da sadri opis doma-
van na klasi. Sama klasa za sebe nije objekat, ve predsta-
eg zadatka, predmet, vreme kada je zadat i rok izvrava-
vlja samo opis po kome e objekat biti napravljen. Kada
nja. Metod klase moe imati i povratnu vrednost koja se
napravimo (kae se instanciramo) objekat na osnovu
obino koristi kao status izvravanja metoda, odnosno
klase, on se kreira u memoriji raunara i tek tada se moe
funkcije. Nepisano pravilo jeste da povratna vrednost nula
koristiti. Na osnovu jedne klase moe se napraviti neogra-
znai uspeno izvrenu radnju, a vrednost razliita od nule
nieni broj objekata, odnosno broj koji je tehniki ograni-
oznaava problem definisan tim brojem.
en memorijom raunara.
Da bismo mogli da napravimo prvi primer za
demonstraciju jednostavne klase, neophodno je da se
Svojstva, metode i dogaaji upoznamo sa nainom deklaracije varijabli i funkcija u C#
Uzmimo uenika kao primer. Ako bismo hteli da ga jeziku.
predstavimo u objektnom svetu, ta bi klasa koja ga opisu-
je trebalo da sadri? Moemo poeti od fizikih karakteris- Deklaracija varijabli i funkcija
tika. Ime uenika, pol, godina roenja, boja oiju i kose,
Sve varijable u programskom jeziku C# moraju se
razred i slino. Sve pomenuto predstavlja svojstva (eng.
deklarisati pre upotrebe. Deklaracija varijable podrazume-
properties) klase. Kada instanciramo objekat na osnovu
va da definiemo naziv, tip, vidljivost i opcionalno njenu
klase Uenik, postaviemo ova svojstva da odgovaraju
poetnu vrednost. Sintaksa je sledea:
konkretnom ueniku.
Oigledno, na osnovu dobro kreirane klase uenik
vidljivost tip varijable naziv = poetna vrednost
moemo tano opisati sve uenike svoje kole. Meutim,
ovo nije dovoljno. Uenik obavlja veliki broj kolskih aktiv-
Na primer:
nosti koje takoe treba opisati. To je ono to uenik radi u
koli i kod kue, na primer, radi pismeni i domai zadatak,
public string ImeUcenika;
prisustvuje odreenom asu, dobija ocenu i slino. Ove
private int Razred = 1;
radnje koje uenik izvrava i koje se odnose na njega nazi-
vaju se metodima (eng. methods) klase.
6
U prvom primeru je deklarisana varijabla pod nazi- public void PokreniProgram (string LokacijaPrograma)
vom ImeUcenika koja pripada tipu niska (eng. string), {
to znai da moe da sadri bilo koji niz znakova i njena // kd koji pokree program...
vidljivost je javna (public). return;
Vidljivost definie odakle se varijabli moe pristupi- }
ti. Kljuna re public znai da je varijabla javna u celom
opsegu u kome je deklarisana na primer, u celoj klasi i U tom sluaju se navodi samo kljuna re return
da je takoe vidljiva korisnicima te klase. bez parametra. U primeru je takoe prikazan nain za upi-
U drugom sluaju deklarisali smo varijablu pod sivanje komentara u programskom jeziku C#. Dve kose
nazivom Razred koja pripada tipu int (pozitivni i nega- crte // oznaavaju komentar sve do kraja reda.
tivni celi brojevi u odreenom opsegu) sa privatnom vidlji- Ovaj komentar se zanemaruje prilikom prevoenja,
vou dostupna je samo u okviru dela u kome je deklari- a dobra praksa je pisati komentare uvek kada je to potreb-
sana, ali ne i korisnicima klase. Inicijalnu vrednost varijable no radi boljeg razumevanja koda.
takoe smo postavili na 1. Osim ove jednolinijske varijante komentara postoji i
vielinijski komentar koji poinje parom znakova /* i zavr-
Osim javnih (eng. public) i privatnih (eng. private) ava sa */. Sve linije izmeu smatraju se komentarom i ne
tipova vidljivosti postoji jo nekoliko varijanti o kojima e izvravaju se.
biti govora kasnije. Za poetak je dovoljno znati da privat-
ne varijable nisu vidljive van klase, a javne jesu. Primer klase
Sada znamo dovoljno da bismo mogli da kreiramo
Deklaracija funkcija je slina. Takoe se definie jednostavnu klasu kao primer. Sama deklaracija klase je
vidljivost, ime funkcije, tip (koji u sluaju funkcije znai tip jednostavna:
vrednosti koju vraa funkcija) uz dodatak deklaracije ulaz-
nih argumenata funkcije ako postoje. Class NazivKlase
{
Primer funkcije koja vraa zbir dva broja: /*
telo klase sa svim potrebnim svojstvima,
public double Zbir (double a, double b) metodima i dogaajima
{ */
return a + b; }
}
Kao i u prethodnom nastavku primer emo zasno-
Funkcija Zbir je javna (dostupna korisnicima klase) i vati na konzolnoj aplikaciji. Pokrenite C# Express, kliknite
kao rezultat vraa tip double (broj sa decimalnom ta- na vezu Kreiraj projekat (eng. Create project), izaberite
kom). Postoje dva ulazna parametra a i b koji su takoe tip projekta Konzolna aplikacija (eng. Console Application)
tipa double. Telo funkcije je odreeno otvorenom i zat- i kliknite na dugme U redu (eng. OK).
vorenom vitiastom zagradom. Naredba return oznaava Zadatak je napraviti klasu Matematika koja e
bezuslovni zavretak rada funkcije i povratnu vrednost znati da sabere i oduzme dva broja. Klasa e sadrati dva
funkcije. U naem primeru funkcije postoji samo naredba metoda (funkcije) Zbir i Razlika. Obe funkcije imaju
return koja vraa zbir dva broja. po dva ulazna parametra i brojeve koji se sabiraju, odnos-
U sloenijim klasama moe postojati puno funkcija no oduzimaju. Svi ulazni parametri i obe funkcije su tipa
koje implementiraju razliite metode klase. Neke od njih double.
e imati povratnu vrednost, a neke ne. Funkcije koje
nemaju povratnu vrednost deklariu se kao tip void. Na
primer:
7
U kodu koji vidite na ekranu prvo treba deklarisati Tehniki gledano, pravljenje objekta se svodi na
klasu Matematika. Deklaracija se upisuje posle deklaraci- kreiranje mini-programa u memoriji raunara koji sadri
je klase Program kao to je prikazano: kompletan kd iz klase. Instanca klase se jednostavno pra-
vi.
class Program NazivKlase NazivVarijable = new NazivKlase();
{ U naem primeru klasu pravimo u delu static void
static void Main(string[] args) Main kao to je prikazano:
{
} static void Main(string[] args)
} {
class Matematika Matematika M = new Matematika();
{ }
8
Pokrenite primer pritiskom na funkcijski taster F5.
Ako je kd dobro unet, dobija se rezultat kao na slici:
Vebanje
Na osnovu primera u ovom lanku, dodajte jo dva
metoda klasi Matematika koji izvravaju proizvod i delje-
nje. Zatim u kodu ispitajte funkcionisanje ova dva nova
metoda.
9
Mala kola programiranja C# (3) Zatim u okviru klase Ucenik, treba uraditi deklaraciju svoj-
stava, odnosno javnih (public) varijabli, obe tipa string:
Klase - nastavak
Vreme je da nauimo vie o svojstvima klase. U class Ucenik
prolom nastavku smo se upoznali sa funkcijama i na koji {
nain se pomou njih implementiraju metode klase. Svojs- public string Prezime;
tva klase, prenesena u realni svet bi mogla da se poistove- public string Ime;
te sa osobinom objekta ili osobe u prirodi. Na primer, sva- }
ki uenik ima niz osobina (svojstava) koje ga opisuju. Ime,
godina roenja, adresa stanovanja, telefon, boja kose i Za sada, veoma jednostavno i oigledno. Kako se
oiju, u kom je razredu, koji smer i tome slino. koriste ova svojstva na strani korisnika ove klase? U okviru
U programiranju, kao to smo rekli ranije, klasa Main funkcije treba prvo deklarisati varijablu koja pokazu-
predstavlja ablon za objekat. Poto definiemo svojstva u je na objekat zasnovan na klasi Ucenik, kao to smo radili
klasi i na osnovu nje napravimo (instanciramo) vie obje- ranije. Ime varijable cu, je proizvoljno izabrano. Postavi-
kata, tipino e svaki od njih imati svoj skup svojstava, ba emo svojstva Prezime i Ime na proizvoljne vrednosti i
kao to svaki uenik ima samo svoje osobine. potom ispisati sadraj:
class Program
{
static void Main(string[] args)
{
}
}
class Ucenik
{
}
10
Tehnologija koja prua ovakvu (i jo neke) vrste Rezultat izvravanja programa je oekivan. Ispisane su
pomoi se zove InteliSense i izuzetno je korisna jer skra- vrednosti svojstava Prezime i Ime kao to je prikazano na
uje vreme unosa koda i eliminie sintaksne greke. Pri- slici:
metiete da su svojstva prikazana plavom, a metode crve-
nom bojom. Takoe ete videti metode koji niste sami
napisali. O ovim metodama e biti rei kasnije.
Napomena:
Ako umesto "Peri" na svom raunaru vidite "Peric", nema
razloga za brigu. U pitanju je podeavanje fonta koji se
koristi za komandni prozor. U svakom sluaju svojstvo
11
class Ucenik Rezime
{
Ako elimo da napravimo zatiena svojstva, kod
public string Ime;
kojih treba vriti proveru pre dodele vrednosti procedura
public string Prezime;
je sledea:
private int prRazred;
napraviti privatnu varijablu koja ima isto ime kao elje-
no svojstvo sa nekim prefiksom. (Ovu konvenciju ime-
public int Razred
novanja treba shvatiti kao preporuku, a ne kao vrsto
{
pravilo)
get
{ napraviti javno (public) svojstvo sa eljenim imenom i
return prRazred; tipom istim kao privatna varijabla
} unutar javnog svojstva uneti get i set delove.
u get delu korisniku pomou return naredbe vratiti
set
vrednost privatne varijable
{
prRazred = value; u set delu proveriti vrednost koju korisnik dodeljuje
} svojstvu (value) i ako je vrednost validna dodeliti je
} privatnoj varijabli. U suprotnom prikazati poruku o gre-
} ci.
Objanjenje:
Privatna varijabla prRazred nije vidljiva van klase, i Vano je primetiti da se ovde javno svojstvo koristi
korisnici klase ne mogu niti da postavljaju niti da itaju kao interfejs ka privatnoj varijabli. Kao neka vrsta zatite
njenu vrednost. Ipak, ova varijabla je ona koja je nama gde se mogu ispitati validne vrednosti pre dodele privat-
bitna i sa kojom radimo unutar svoje klase. noj varijabli. Ovo ispitivanje moe biti jednostavno, ali i
Korisnik moe da postavlja vrednost ove varijable, veoma sloeno zavisno od potrebe.
ali na posredan nain pomou public svojstva deklarisa- Dobro napravljena klasa treba sama sebe da "brani"
nog u liniji public int Razred. Svojstvo Razred se sastoji od od pogrenih vrednosti. Nekada ete je koristiti vi, a neka-
dva dela: get deo koji se automatski poziva kada korisnik da drugi programeri i to stalno treba imati u vidu.
ita vrednost svojstva Razred i set deo koji se automatski
U sledeem nastavku e biti govora o najeem
poziva kada korisnik postavlja vrednost svojstva Razred.
nainu za proveru, kako se pokree i obrauje greka u
U get delu, se korisniku zapravo vraa vrednost
sluaju da vrednost nije validna.
privatne varijable prRazred:
return prRazred;
U set delu se dodeljuje vrednost privatnoj varijabli prRaz-
Vebanje:
red.
prRazred = value; U klasi Ucenik napravite svojstvo Godiste godina
kada je roen uenik. Da li je ovom svojstvu potrebna za-
Promenjiva value je specijalna C# varijabla i pred- tita od pogrenog unosa i koje su validne vrednosti?
stavlja vrednost koju je korisnik upotrebio prilikom dodele Da li su validne vrednosti fiksne, a ako nisu od ega
vrednosti svojstvu. I ovde se nalazi klju za proveru vred- zavise?
nosti pre dodele varijabli prRazred.
Pre linije prRazred = value treba proveriti da li je sadraj
varijable value ispravan. Ako jeste dodeljuemo tu vrednost
varijabli prRazred, u suprotnom najee generiemo gre-
ku sa odgovarajuom porukom.
12
Mala kola programiranja C# (4) set
{
U predhodnom nastavku serijala smo govorili o prRazred = value;
kreiranju zatienih metoda klase. Kreiranjem privatne }
varijable i parom get i set funkcija smo implementirali }
interfejs za privatnu varijablu. Na ovaj nain smo dobili U klasi postoji javno svojstvo Razred koje definie u
potpunu kontrolu nad procesom dodele i itanja vrednosti kom razredu je uenik srednje kole. Oigledno, validne
svojstva. vrednosti za ovo svojstvo su brojevi od 1 do 4.
U ovom nastavku e biti obraena tehnika kojom se Svojstvo Razred je u stvari interfejs za privatnu vari-
vrednost svojstva moe zatititi, odnosno ograniiti samo jablu prRazred koja je tip int. Bitno je shvatiti da iako kori-
na validne vrednosti. snik klase vidi samo svojstvo Razred, za klasu je vana
samo vrednost koja se nalazi u privatnoj varijabli prRaz-
itaoci koji prate ovaj serijal treba da otvore projekt red.
na kome smo radili u prolom nastavku. Get procedura je zaduena za itanje svojstva i kao
Novi itaoci treba da urade sledee: to vidimo u kodu, ona korisniku klase jednostavno vraa
pokrenite Visual C# Express Edition vrednost varijable prRazred. S druge strane, za postavlja-
kliknite na link za kreiranje novog projekta (eng. Create nje vrednosti varijable prRazred je zaduena set funkcija
Project) koja vrednost (value) dodeljuje varijabli prRazred.
kliknite na ikonu "Konzolna Aplikacija" (eng. Console
Application) Da bi vrednost varijable prRazred ograniili na
napiite sledei kod (kod koji automatski generie rad- interval od 1 do 4, u set funkciji je potrebno izvriti prove-
no okruenje je sive boje, kod koji treba uneti je plave ru vrednosti varijable value. Vreme je da se upoznamo sa
boje): naredbom u C# jeziku koja nam ovo omuguava.
class Program
if naredba
{
static void Main(string[] args) { Kao i svi ostali programski jezici i C# poseduje ovu
Ucenik cu = new Ucenik(); osnovnu naredbu za proveru uslova. Sintaksa je jednosta-
cu.Prezime = "Peri"; vna:
cu.Ime = "Petar"; if (uslov) {
Console.WriteLine(cu.Prezime); // deo koji se izvrava ako je uslov taan
Console.WriteLine(cu.Ime); }
Console.ReadKey(); else {
} // deo koji se izvrava ako uslov nije taan
} }
13
U sluaju da varijabla a ima vrednost 5, uslov je public int Razred {
taan i izvrava se blok linija izmeu otvorene i zatvorene get {
vitiaste zagrade odmah ispod if naredbe. U naem slua- return prRazred;
ju to je samo jedna linija koda, ali ih moe biti proizvoljni }
broj. U suprotnom (eng. else), izvrie se blok linija ispod set {
naredbe else. Deo else je inae opcioni, ne mora se navo- if (value > 0 && value < 5) {
diti ako nam ne treba. prRazred = value;
}
Operator za proveru jednakosti je ==, a osim njega else {
postoje i sledei: // greska
> vee od if (a > 5) ... }
< manje od if (a < 5) ... }
!= razliito if (a != 5) ... }
>= vee ili jednako if (a >= 5) ...
<= manje ili jednako if (a <= 5) ... Na ovaj nain smo zatitili privatnu varijablu prRaz-
red od pogrenih vrednosti. Dodeljujemo joj vrednost
Uslov moe biti i sloen kada se sastoji od dva ili samo ako je value vee od 0 i manje od 5, odnosno u
vie osnovna uslova. U tom sluaju neophodno je navesti i intervalu od 1 do 4. ta raditi ako korisnik klase unese
logike operatore koji vezuju dva ili vie uslova. Na primer pogrenu vrednost? Taj sluaj se obrauje u else delu
elimo da proverimo da li varijabla a ima vrednost 5 i vari- uslova gde trenutno stoji samo komentar // greska.
jabla b ima vrednost 3.
Kompletan uslov je taan samo ako su tani iskazi Najei nain je da se generie greka u izvrava-
a == 5 i b == 3. Logiki operand koji na ovaj nain spaja nju koja se prosleuje korisniku klase. On je dalje odgovo-
dva uslova se zove i (eng. and) i simboliki se obeleava ran za obradu ove greke, a ako to ne uradi greka e zau-
se &&: staviti izvravanje programa.
if (a == 5 && b == 3)
// izraz je taan samo ako su oba uslova tana. Greke i njihovo pokretanje
14
U naem sluaju greka je opisana tekstom
"Pogrena vrednost svojstva Razred" i to je poruka koju e
dobiti korisnik klase kada vrednost svojstva Razred postavi
van validnog opsega.
15
Zanimljivost: static void Main(string[] args)
Opte prihvaen termin za greku u programiranju je {
"buba" (eng. bug). Otud i termin otklanjanje buba u pro- Ucenik cu = new Ucenik();
gramu (eng. debugging program). cu.Prezime = "Peri";
Odakle ovaj termin? cu.Ime = "Petar";
Prvi kompjuteri, pre pronalaska tranzistora su se try
zasnivali na vakumskim cevima - kao stari radio aparati i {
televizori. One su se u toku rada naravno grejale i pri cu.Razred = 7;
tome emitovale spektar svetlosti veoma privlaan za raz- }
norazne insekte. catch (Exception ex)
Jedna od dunosti osoba koji su tada odravali {
raunare je bilo redovno ienje vakumskih cevi od inse- Console.WriteLine ( ex.Message );
kata koji su se na njih zalepili i time im ometali hlaenje. }
Otud i potie ovaj termin. Console.WriteLine(cu.Prezime);
Console.WriteLine(cu.Ime);
Console.WriteLine(cu.Razred);
Obrada greke u C# se vri pomou naredbi try i Console.ReadKey();
catch. U osnovnom obliku sintaksa je sledea: }
16
Mala kola programiranja C# (5) Posle par sekundi, nov projekt je kreiran i u njemu
se inicijalno nalazi poetna forma koja je prikazana na
Kreiranje Windows aplikacija
ekranu. U ovom momentu moete ak i pokrenuti program
(F5 funkcijski taster) i videti praznu formu na ekranu. Tre-
U ovom i sledeim nastavcima emo se posvetiti nutno naa aplikacija ne izgleda nita posebno, jednostav-
kreiranju Windows aplikacija u radnom okruenju Micro- na prazna forma ali ako malo bolje pogledamo ona ima
soft Visual C# Express edition. Na poetku, kada su se sve funkcionalnosti Windows forme: naslov, ikonu, mogu-
pojavile prve verzije Windowsa, programiranje Windows nost da je poveamo preko celog ekrana ili minimizujemo i
aplikacija je bilo veoma teko i dostupno samo odabranim konano zatvorimo, to ujedno i zaustavlja izvravanje pro-
profesionalcima. Pojavom vizualnih alata i takozvanog jekta.
RAD (Rapid Application Development rapidni razvoj
aplikacija) sistema, kreiranje ovakvih aplikacija je znaajno Odakle joj sve ove funkcionalnosti kada jo uvek
pojednostavljeno i postalo je dostupno irokom krugu nismo nita programirali? U predhodnim nastavcima ovog
programera. Kako je ovo postignuto? U predhodnim serijala bilo je govora o klasama, a naa forma je naslednik
poglavljima smo uili objektno programiranje i u njemu je postojee klase Form koja se nalazi u .NET Frameworku.
klju. Svi elementi koji se koriste u programiranju Svi naslednici bilo koje klase nasleuju njene funkcionalno-
Windows aplikacija su "prefabrikovani" - stoje nam na ras- sti uz mogunost dodavanja novih. Dakle puno stvari za
polaganju sa svojom paletom svojstava, metoda i dogaa- nas je unapred ve uraeno.
ja u vidu gotovih klasa. Nama samo ostaje da ih
organiyujemo na nain koji nam je potreban, postavimo Kada radimo Windows aplikacije razlikujemo dva
im odgovarajua svojstva i napiemo kod kao odgovor na osnovna dela:
akcije korisnika dogaaji klasa. Dizajn korisnikog interfejsa u kome "crtamo" i raspore-
Postavljamo se u ulogu arhitekte koji ima na raspo- ujemo kontrole na formi. Ovde takoe vrimo i pode-
laganju veliki broj elemenata koji ine jednu kuu. Na avanje svojstava i ponaanje kontrola.
nama je da dobro upoznamo te elemente, ukomponujemo
Kodiranje, deo u kome piemo kod kao odgovor na
ih i podesimo da harmonino funkcioniu.
akcije korisnika, na primer klik miem na komandno
Na vrhu hijerarhije elemenata je sama aplikacija,
dugme, izbor iz liste, zatvaranje forme i slino.
odnosno objekt Application. Ispod njega se nalazi bar
jedna, a obino i vie Windows formi. Svaka od njih sadri
standardne elemente korisnikog interfejsa Windowsa koje
nazivamo kontrole. Svakom korisniku Windowsa su poz-
nati ovi elementi u koje spadaju komandna dugmad, liste,
padajue liste, izbor opcija, meniji i tako dalje.
U ovom i sledeim nastavcima emo se upoznati sa
funkcionalnou koje nude ove kontrole i nauiti da ih
programiramo.
17
1. Paleta sa alatima (Eng. Toolbox) lista kontrola koje se Kada elimo da napiemo kod koji se izvrava kada
mogu koristiti na formi korisnik neto uradi sa dugmetom postoji vie naina. Naj-
2. Pretraiva reenja (Eng. Solution Explorer) prikaz jednostavniji je da uradite dupli klik na komandno dugme.
svih projekata i njihovih elemenata (forme, klase, resursi i Sada je otvoren prozor za pisanje koda i kurzor se
ostalo) nalazi tano na poziciji gde treba da ponemo pisanje.
18
Kliknite na dugme "OK" i potom zatvorite formu
kako bi zaustavili program.
U razvojnom okruenju obratite panju na dve kar-
tice (Eng. Tab) iznad prozora za pisanje koda:
Form1.cs i Form1.cs [Design].
19
Mala kola programiranja C# (6) Prilikom izvoenja programa, moramo programski
instancirati ovu klasu kako bi bilo ta dalje mogli raditi. U
Rad sa formama vreme dizajniranja forme, moemo po potrebi postavljati
razliite osobine svojstva forme, ali ih takoe i naknadno
Svaka Windows aplikacija se sastoji najmanje od menjati u vreme izvravanja.
jedne forme (formulara), meutim najee ih ima nekoli-
ko, pa ak i nekoliko desetina u sloenijim aplikacijama.
Dodavanje nove forme u program
Jasno je da treba nauiti naine kako programski otvoriti i
zatvoriti eljenu formu, kao i naine postavljanja osobina
forme. Otvorite primer koji smo radili u predhodnom broju
Ovo nas ponovo vraa na objektno programiranje, asopisa (Demo1), ili moete kreirati nov projekt: pokrenite
jednostavno zbog toga to svaka forma prilikom kreiranja Visual C# Express Edition, iz opcije File izaberite stavku
aplikacije predstavlja jednu klasu. Koncept je jednostavan: New Project, u otvorenom dijalogu izaberite Windows
obino se poinje od kreiranje "glavne" forme ona koja Application. Za ime projekta ukucajte Demo1 (linija
prva otvara prilikom pokretanja same aplikacije i onda se Name:). Na kraju kliknite na dugme OK. U oba sluaja se
dodaju sve ostale koje su nam potrebne. dobija kreiran projekt pod nazivom Demo1 sa prvom i za
Na primer, prilikom pokretanja programa MS Word, sada jedinom poetnom formom.
glavna forma je zapravo deo Worda gde unosimo i ureu-
jemo tekst. Svi ostali dijalozi kao to je ekran za podeava-
Napomena:
Paljivi itaoci i posmatrai e primetiti da se prilikom
pokretanja Worda zapravo prvo pokree ekran sa Word
logotipom i raznim informacijama. Ovaj ekran se posle
par sekundi automatski yatvara (zavisno od brzine rau-
nara) i tek onda se prikazuje prozor za unos teksta. Ovo
vai za sve office aplikacije i skoro sve ostale programe na
tritu.
Poetni prozori ovog tipa se zovu "Splash screen"
po uzoru na "Splash news" i oznaavaju prikaz oigledne
informacije koju je nemogue prevideti. Osim manje-vie
znaajnih informacija koje su prikazane na ovom ekranu,
oni imaju jo jednu, bitniju namenu: dok gledate ovaj ek-
ran, istovremeno, u pozadini se vri inicijalizacija ap-
likacije koju ste pokrenuli.
Psiholoki efekat je da im korisnik pokrene ap- Sada u Project Exploreru uradite desni klik na pro-
likaciju odmah vidi neku aktivnost na ekranu - ne treba da jekt Demo1, iz padajueg menija izaberite Add i iz podme-
eka par ili vie sekundi i da se pita da li je sve u redu. nija izaberite Windows Form kao to je prikazano na slici:
Na ovaj nain se otvara opti dijalog za dodavanje
nje opcija, umetanje tabela i mnogi drugi, predstavljaju nove stavke u projekat, sa izabranom ikonom Windows
zasebne forme koje se otvaraju kao odgovor na akciju Form. U ovom dijalogu moemo odmah dati i ime novoj
korisnika. formi (klasi) to emo i uiniti.
Teoretski gledano, svaka forma predstavlja klasu Ranije sam pomenuo da tehniki gledano nije neop-
koja je nasleena od bazne .NET Framework klase Form iz hodno, ali je svakako korisno i predstavlja dobru praksu
imenovanog prostora System.Windows.Forms. Bazna klasa davati unificirana imena svim klasama i objektima.
prua mnoge fukcionalnosti naoj klasi (formi) koje moe-
mo odmah koristiti. 20
U ovom smislu emo novoj formi dati naziv frm- Poto sada radimo na klasi Form1 i to u dizajn rei-
DrugaForma (jedna re, bez razmaka) koji treba upisati u mu, u Solution Exploreru uradite dupli klik na klasu Form1.
liniju Name i na kraju kliknuti na dugme Add.
Na formu je dalje potrebno postaviti komandno
Dodata forma je prikazana na ekranu, a u Solution dugme. Kao i u prolom nastavku serijala iz palete sa alati-
Exploreru je takoe prikazana sa specifinom ikonom koja ma (Toolbox) izaberite komandno dugme (Button) i nacr-
oznaava sve forme u projektu: tajte ga na povrini forme. Alternativno moete uraditi i
dupli klik miem na Button stavku iz palete sa alatima.
Svojstvo Name
21
Primetiete da se natpis na dugmetu nije promenio. Klasa (pa i objekat) tipa Form ima metodu kojom se
Oigledno natpis na dugmetu ne prikazuje njegovo ime forma iscrtava i prikazuje na ekranu. Metoda Show() je
ve neto drugo. iskoriena u drugoj liniji. Sintaksa poziva metode bilo kog
Svaki element korisnikog interfejsa koji ima neki objekta je jednostavna:
natpis na sebi, ukljuujui i formu ima svojstvo Text koje ImeObjekta.NazivMetode (argumenti)
odreuje ovaj natpis.
U listi svojstava (Properties dijalog) za komandno Verzija metode Show koju mi koristimo nema argu-
dugme pronaite Text svojstvo i izmenite ga na mente, ali svejedno moramo napisati otvorenu i zatvorenu
"Otvori drugu formu". Text svojstvo ne podlee pravilima zagradu.
za zadavanje imena klasama i varijablama, tako da moete Pokrenite program (F5 funkcijski taster) i proverite
upisati ta god elite. Na kraju forma za dugmetom treba kako radi.
da izgleda ovako:
Modalne i nemodalne forme
Ako malo eksperimentiete primetiete sledee:
kada kliknete na dugme otvara se druga forma preko prve,
ali uvek moete kliknuti miem na prvu formu ime ona
sada prekriva drugu. Ovakva relacija izmeu dve forme se
zove "nemodalne forme".
esto je u praksi potrebno drugaije ponaanje. Nije
dozvoljeno ovakvo preklapanje formi, ve korisnik mora
zatvoriti drugu formu da bi se vratio na predhodnu. Ovak-
va relacija izmeu formi se zove "modalne forme" (esto
je u upotrebi i termin "Dialog forma"). Kao primer modal-
Kodiranje nog ponaanja moete opet pogledati skoro sve dijaloge u
Na kraju ostaje da upiemo kod koji e otvoriti dru- MS Wordu.
gu formu. Duplim klikom na dugme otvaramo kod za Da bi implementirali modalnu relaciju izmeu nae
pisanje dogaaja. Dugme poznaje puno dogaaja, meu- dve forme, potrebno je umesto metode Show() koristiti
tim ubedljivo najee se koristi Click dogaaj, to nam metodu ShowDialog(), takoe bez argumenata.
razvojno okruenje inicijalno i nudi. Zaustavite program ako je pokrenut, i izmeniti dru-
Poto forma frmDrugaForma predstavlja klasu, pre gu liniju koda:
korienja moramo napraviti instancu te klase.
Deklarisaemo varijablu koja e biti odgovarajueg MojaForma.ShowDialog();
tipa i inicijalizovati je kao pokaziva na instancu klase frm-
DrugaForma. Ime varijable nije bitno, a mi emo koristiti Ponovo pokrenite program i sada vidite da se ne
ime MojaForma. moete prebaciti na prvi formu dok ne zatvorite drugu.
Modalni (dialog) nain otvaranja forme se u praksi znatno
Na mestu gde se nalazi kurzor ukucajte sledee dve ee koristi.
linije koda: Zatvaranje forme
frmDrugaForma MojaForma = new frmDrugaForma();
Otvorenu formu moemo uvek zatvoriti na standar-
MojaForma.Show();
dni nain klikom na dugme x u njenom gornjem desnom
uglu. Meutim esto je potrebno programski zatvoriti for-
U prvoj liniji deklariemo varijablu MojaForma koja
mu. Da bi ovo uradili moramo se predhodno upoznati sa
je tipa frmDrugaForma i odmah joj dodeljujemo novu
pokazivaem this.
instancu (kljuna re new) objekta koji je baziran na klasi
frmDrugaForma.
22
this je varijabla koja pokazuje na objekat u kome se
nalazi u naem sluaju na formu. Kada bilo gde u kodu
koji se nalazi u formi napiete this vi se zapravo referiete
na sam form objekat te su dostupne sve metode i svojstva
ne samo forme, ve i svih elemenata koje se nalaze na
njoj.
Napomena:
Za programere u Visual Basicu i u VB.NET postoji istovetni
pokaziva koji se zove Me.
this.Close();
Veba
Za vebu na kraju ovog nastavka pokuajte da ura-
dite sledee:
Na drugoj formi (frmDrugaForma) postavite dug-
me, dajte mu naziv btnZatvoriFormu i neka na njemu
bude tekst "Zatvori formu".
Kada korisnik klikne na ovo dugme treba naravno
zatvoriti ovu formu.
23
Mala kola programiranja C# (7) Za dugme, kao i za veinu ostalih kontrola moemo
Windows kontrole postaviti font koji se koristi kao i njegove atribute
(podebljan, ukoen, podvuen). Svojstvo Font nam omogu-
Osnove svake windows aplikacije predstavljaju for- ava sve ovo i na sledeoj slici je prikazano sa svim svojim
mulari (eng. forms) koji se po potrebi otvaraju i zatvaraju,
zavisno od toka i logike korisnikog okruenja. N a
svakom formularu se nalazi vie objekata koji predstavljaju
korisniki interfejs windows kontrole. U narednim pogla-
vljima emo se upoznati sa osnovnim windows kontrola-
ma, njihovom namenom, svojstvima, metodima i dogaa-
jima.
Osnovno za svaku kontrolu je svojstvo Name koje
predstavlja njen jedinstveni identifikator u okviru formula-
ra na kome se nalazi. Ovo znai da na jednom formularu
ne moemo imati dve ili vie kontrola koje se isto zovu.
Meutim, na dva ili vie formulara to je mogue.
Svojstvo Name treba zadavati po istom principu po kome
zadajemo imena varijabli u programskom kodu - bez raz-
maka i specijalnih karaktera, moemo imati brojeve u
nazivu, ali naziv mora poeti slovom. Kao to emo videti
kasnije, svojstvo name zapravo i jeste objektna varijabla
koja je pokaziva na instancu klase odgovarajue kontrole.
Dobra praksa je davati prefiks imenu svake kontrole
zavisno od njenog tipa. Nije obavezno, ali kasnije znaajno
olakava preglednost programskog koda. Lista preporue-
nih prefiksa za svaku kontrolu se nalazi na lokaciji atributima.
http://msdn2.microsoft.com/en-us/library/ms229045.aspx Od dogaaja, najee se koristi Click, koji se pokre-
e kada korisnik klikne na dugme.
Komandno dugme (eng. command button)
Veba:
Komandno dugme (ili samo dugme), predstavlja
Pokrenite nov projekt i kreirajte novu Windows apli-
najoigledniju i verovatno najjednostavniju kontrolu. Omo-
kaciju.
guava korisniku da klikom na njega pokrene odgovaraju-
Postavite komandno dugme na poetni formular.
u akciju segment programskog koda. Kljuno
Svojstvo Name postavite na cmdKrajRada, a svojstvo Text
svojstvo dugmeta je svojstvo Text kojim se postavlja nat-
na &Kraj rada.
pis na njemu. Generalno, svaka kontrola koja na sebi
poseduje neki natpis ima svojstvo Text.
Ovo svojstvo ima jo jednu mogunost: ako postavi-
te znak & ispred bilo kog karaktera u Text svojstvu, taj
karakter je podvuen i predstavlja skraenicu sa tastature
za klik akciju dugmeta.
Na primer, kada svojstvo Text dugmeta postavimo
na Lista &uenika, prikazuje se Lista uenika a skraenica
sa tastature je Alt+U. Jasno, na jednoj formi je potrebno
imati jedinstvene skraenice kako bi sve funkcionisalo
kako treba.
24
Kod za razliite dogaaje kontrole (eng. control Labela (eng. Label)
events) piemo na sledei nain: miem izaberite dugme i
kliknite na ikonu (narandasta munja) u dijalogu svojstava
Labela daje mogunost prikaza teksta na formularu
koja daje listu svih raspoloivih dogaaja izabranog ele-
koji moe biti samostalan, ali se obino vezuje za neku
menta, kao to je prikazano na slici.
drugu kontrolu i na taj nain opisuje njeno znaenje.
Najee se postavlja uz TextBox kontrolu koja je
opisana sledea. Kljuno svojstvo kontrole je Text koje
takoe poseduje mogunost dodele skraenice sa tastature
kao to smo radili na dugmetu.
25
1. Postavite prvu Label kontrolu i postavite joj sledea Napomena:
svojstva: Postoji vie varijanti metode Show MessageBox
Name: lblIme i Text: &Ime
2. Postavite prvu TextBox kontrolu sa svojstvom Pokrenite primer, unesite svoje ime i prezime i klik-
Name: txtIme i MaxLength: 15 nite na dugme Snimi. Ako ste sve upisali kako treba, dobi-
ete sledei rezultat sa dva uzastopna dijaloga za poruke.
3. Postavite drugu Label kontrolu sa svojstvima:
Name: lblPrezime i Text: &Prezime
Analiza primera:
Name: cmdSnimi i Text: &Snimi
Formular treba da izgleda ovako: Poto smo postavili skraenice na obe Label kontro-
U realnosti klikom na dugme cmdSnimi bi unete le, ispitajte kako funkcioniu. Kombinacija Alt+I treba da
podatke snimili u bazu podataka, ali za sada emo ih kurzor postavi na TextBox za unos imena, a Alt+P na
samo ispisati u dijalogu za poruke. TextBox za unos prezimena. Alt+S e pokrenuti Click
Kao to je opisano na poetku ovog nastavka, otvo- dogaaj dugmeta. Kako je ovo postignuto?
rite kod za Click dogaaj komandog dugmeta i napiite
sledee dve linije koda: U svakoj Windows formi postoj pojam TabOrder. On
definie redosled kojim se vri navigacija kada korisnik klik-
MessageBox.Show (txtIme.Text); ne na Tab ili Shift+Tab taster na tastaturi.
MessageBox.Show (txtPrezime.Text);
Veoma je bitno postaviti logini redosled kretanja po
Objekat MessageBox predstavlja dijalog za poruke. formularu. Svaka kontrola poseduje numeriko svojstvo
Poseduje metodu Show koja ima jedan parametar tekst TabIndex koje poinje od broja 0 pa na dalje.
koji treba prikazati. U ovom primeru prikazujemo sadraj U naem primeru prva labela ima TabIndex svojstvo
(uneti tekst) u kontrolama txtIme i txtPrezime. postavljeno na 0, prvi TextBox na 1, i tako redom.
Vidimo i sintaksu pristupa svojstvu bilo koje kontro-
le: ImeKontrole.SvojstvoKontrole.
Na ovaj nain moemo itati ali i postavljati vredno-
sti svojstava kontrola.
26
Drugi pojam koji treba znati je Focus.
On predstavlja situaciju kada kontrola postaje aktiv-
na. Na primer kada je kurzor postavljen u kontroli za unos
prezimena, kaemo da je TextBox txtPrezime dobio
fokus.
27
Mala kola programiranja C# (8) Klikom na dugme elimo da proverimo stanje
Windows kontrole CheckBox kontrole i da zavisno od toga ispiemo odgova-
rajuu poruku.
Prilikom kreiranja korisnikog interfejsa u Da bi ovo uradili, moramo se upoznati sa naredbom
Windowsu, na raspolaganju nam je veliki broj grafikih za ispitivanje uslova u C# programskom jeziku. Poznavaoci
elemenata kontrola. U ovom nastavku se upoznajemo sa C ili C++ programskog jezika e videti da je sintaksa identi-
malo sloenijim kontrolama koje nam nude specifine fun- na:
kcionalnosti.
if (Uslov)
CheckBox kontrola
{
Ova kontrola omoguava korisniku da markira ili
// blok naredbi koji se izvrava kada je uslov taan
demarkira neku opciju. Ako imamo vie CheckBox kontrola
}
na formularu, one su meusobno nezavisne mogu se
Else
proizvoljno markirati ili demarkirati.
{
Kljuno svojstvo ove kontrole je svojstvo Checked
// blok naredbi koji se izvrava kada je uslov nije
koje moe imati dve vrednosti - True (da) i False (ne).
taan
Svojstvo Checked moemo postavljati i itati kako u rei-
}
mu dizajniranja tako i u reimu izvravanja aplikacije.
U kodu se najee koristi kroz IF uslov koji vri
Na primer:
ispitivanje da li je CheckBox markiran ili ne i u zavisnosti
If (a == 2)
od toga se vri dalje grananje koda.
{
Opis znaenja CheckBox kontrole se definie kroz
neki kod...
njeno Text svojstvo. Nije potrebno postavljati zasebnu
}
Label kontrolu ona je integrisana u CheckBox.
Veba:
Deo else je opcioni i ne mora se navoditi.
Pokrenite C# Express razvojni alat, kreirajte novu
Uslov moe biti kompozitni, sloen od dva ili vie
Windows aplikaciju i na inicijalnu formu postavite jednu
pojedinanih uslova. U tom sluaju je neophodno ove poje-
CheckBox i jednu Button kontrolu.
dinane uslove spojiti odgovarajuim logikim operatori-
Za Text svojstvo CheckBox kontrole unesite
ma.
"Opcija" (bez znakova navoda), a za Text svojstvo Button
Operatori AND (i) i OR (ili) se sintaksno oznaavaju
kontrole unesite "Test". Formular treba da izgleda kao to
sa && i II respektivno.
je prikazano na slici:
Na primer:
If (a==5 || b ==7)
uslov je taan ako je tano a=5 ili b=7 ili su oba uslova ta-
na.
Sada duplim klikom na dugme otvorite prozor za
pisanje koda. Poto nismo menjali inicialno postavljena
imena kontrola, CheckBox kontrola se zove checkBox1.
Upiite sledei segment koda u button1_Click proceduri:
if (checkBox1.Checked == true) {
MessageBox.Show("Opcija markirana");
}
else {
MessageBox.Show("Opcija nije markirana");
}
28
Pokrenite aplikaciju (F5 funkcijski taster) i isprobajte Sada pokrenite aplikaciju i testirajte je. Primetiete
je. Zavisno od stanja CheckBox kontrole treba da dobijete da moete markrati samo jedno radio dugme u svakoj gru-
odgovarajuu poruku: pi.
U praksi se Panel kontrola najee koristi za grupi-
sanje radio dugmadi.
Bitna svojstva su identina kao kod CheckBox kon-
trole: Checked i Text sa istim vrednostima i funkcijom.
Korienje je takoe identino kao kod CheckBox
kontrole. U kodu se proveravaju statusi radio kontrola i
zavisno od toga se vri grananje u aplikaciji.
29
Indeksi objekata lanova kolekcije idu od nula do int i;
MojaKolekcija.Count 1 listBox1.Items.Clear();
U List Box kontroli ova kolekcija se zove Items i for (i = 1; i <= 100; i++)
sastoji se od lanova pod nazivom Item. {
Sve kolekcije .NET Framework-a potuju istu listBox1.Items.Add(i);
nomenklaturu: kolekcija je imenica u mnoini a svaki lan }
kolekcije je ista imenica u jednini. Na primer kolekcija Tab-
les se sastoji od objekata tipa Table. Sada, pre punjenja liste uvek briemo sve stavke.
Na formu postavite List Box i jednu Button kontro-
lu. Ostaviemo inicijalne nazive ovih kontrola listBox1 i Ako elimo da proitamo vrednost izabrane stavke iz
button1. liste, postoje dva naina:
elimo da klikom na dugme napunimo listu brojevi- jednostavno proitamo svojstvo Text: listBox1.Text
ma od 1 do 100. Koristimo metodu Add kolekcije Items pomou svojstva SelectedItem koja vraa Object pre-
gde je ulazni parametar generiki tip Object to znai da zentaciju izabrane stavke: listBox1.SelectedItem
moemo "podmetnuti" varijable numerikog ili string tipa
svejedno, sve su interno nasleene od istog Object tipa.
Brisanje pojedinane stavke iz liste se vri metodom
Duplim klikom na dugme otvorite prozor za pisanje koda:
RemoveAt kolekcije Items. Na primer ako elimo da obri-
emo treu stavku u listi:
int i;
for (i = 1; i <= 100; i++)
listBox1.Items.RemoveAt (2);
{
listBox1.Items.Add(i);
Obratite panju da je indeks tree stavke = 2 jer se
}
indeksi broje od nule.
listBox1.SelectedIndex = 4;
30
Mala kola programiranja C# (9) Osim teksta stavka menija moe imati sliicu (eng.
Kreiranje menija u aplikaciji Icon) i definisanu skraenicu sa tastature (eng. Shortcut).
Kreiranje menija
Posle letnjih odmora nastavljamo sa malom kolom
Pokrenite Visual C# Express razvojno okruenje i
programiranja u C# programskom jeziku. Nadam se da
kreirajte novu Windows aplikaciju. Meni emo kreirati na
smo se svi odmorili i da smo spremni za uenje.
inicijalnoj formi (Form1).
U paleti sa alatkama (eng. Toolbox) pronaite sekci-
Rad sa menijem ju Menus & Toolbars. U okviru nje pronaite kontrolu
Gotovo svaka Windows aplikacija ima meni kao MenuStrip koja daje potrebne funkcionalnosti menija na
davno ustanovljeni vid interakcije sa korisnikom. Prednosti formi.
menija su mogunost hijerarhijske organizacije koje odgo-
varaju vaoj aplikaciji uz minimalno zauzee prostora.
Meni se obino nalazi pri vrhu forme, ali to ne mora
biti sluaj. Moete ga postaviti na dno ekrana, pa ak i po
vertikali ako vam to odgovara.
Dodatnu snagu menija predstavlja mogunost dina-
mikog dodavanja ili sakrivanja stavki ime meni prati
korisnika zavisno od akcija koje se dogaaju u aplikaciji.
U Visual Studiju kreiranje menija je lako, moe se
rei zabavno i znaajno je unapreeno u odnosu na sada
ve prastari ali svojevremeno veoma popularni Microsoft
Visual Basic 6.
Prilikom kreiranja menija razlikujemo horizontalnu
liniju i vertikalne delove menija koji se prikazuju kada kori-
snik klikne na stavku u horizontalnoj liniji. Vertikalna linija
moe imati stavki na vie nivoa hijerarhije. Prevucite je i pustite na formu - nije vano gde, jer
Na sledeoj slici vidite View meni iz radnog okrue- se meni automatski pozicionira na vrh forme, a sama kon-
nja Visual C# Express edition. trola u specijalnom prozoru ispod forme kao to je prikaza-
no na sledeoj slici.
31
Ako elite da kreirate meni, prvo morate da kliknete &Otvori
na kontrolu na dnu forme koja je dobila inicijalno ime &Snimi
menuStrip1. Tada se u dizajneru prikazuje meni na vrhu
Snimi k&ao
forme.
Zapazite tekst Type Here koji dovoljno govori -
sam za sebe. Napraviemo deo menija koji je manje-vie &Kraj rada
standardan za veinu aplikacija.
Tamo gde pie Type Here otkucajte Ako za tekst stavke unesete samo znak (minus),
Datoteka (bez znakova navoda) ili File ako elite meni on ima specijalno znaenje: u meniju se prikazuje horizon-
na engleskom jeziku. talni separator. Korisno kada treba da vizuelno razdvojite
im ponete da kucate odmah e se ispod i desno razliite funkcionalne grupe u okviru vertikalnog menija.
od ove stavke otvoriti mogunost za dalji unos stavki Na kraju na meni treba da izgleda kao na sledeoj slici:
menija, horizontalno i vertikalno:
32
Application je referenca na aplikaciju koju kreiramo.
Programiranje menija:
Poseduje metod Exit koji izvrava bezuslovni prekid rada
Svaku stavku menija je najbolje tretirati kao komad-
aplikacije i oslobaa sve resurse koje je aplikacija zauzela
no dugme (eng. Button). Programiranje se vri u Click
(memoriju, datoteke, baze podataka i tako dalje...)
dogaaju stavke menija.
U primeru koji smo zapoeli kliknite samo jednom
Pokrenite aplikaciju i miem kliknite na Kraj rada.
na stavku menija Kraj rada. Svaka stavka menija ima
Pokuajte takoe i pomou skraenica sa tastature:
svoj set svojstava koja su vidljiva u standardnom prozoru
prvo Alt+D kako bi otvorili meni Datoteka, a potom samo
za prikaz svojstava objekta - Properties prozoru:
taster K kako bi aktivirali stavku Kraj rada.
Skraenice
Da li je mogue definisati skraenicu sa tastature
koja e, na primer, direktno aktivirati stavku Kraj rada?.
Naravno da je mogue, ak se moe definisati kom-
binacija bilo kog specijalnog tastera (Control, Alt ili Shift) i
obinog karaktera. Takoe moete iskoristiti funkcijske i
druge specijalne karaktere sa tastature.
Kao i kod svake druge kontrole kljuno svojstvo je Markirajte Alt i iz padajue liste izaberite slovo K
Name koje je automatski generisano u naem sluaju kao to je prikazano na gornjoj slici. Sada kombinacija
krajRadaToolStripMenuItem. Alt+K zavrava nau aplikaciju. Pokrenite aplikaciju i pro-
Svojstvo Text definie tekst stavke menija i njega bajte.
smo podeavali iz dizajnera. Primetite da se uz stavku menija prikazuje i njena
Sada uradite dupli klik na stavku menija Kraj s k ra e ni ca . O v o s e p o d e a va s vo j s t v om
rada, ime je otvoren Click dogaaj u prozoru za pisanje ShowShortcutKeys koja moe imati vrednosti True (da)
koda. Kada korisnik klikne na Kraj rada elimo da zaus- ili False (ne).
tavimo izvravanje programa. Upiite sledeu liniju koda:
Application.Exit();
33
Korisna je i mogunost da pored svake stavke meni-
ja imate znak za overu (eng. Check).
Svojstvo Checked koje moe imati vrednosti True ili
False obezbeuje upravo ovo.
34
Mala kola programiranja C# (10) U svakom sluaju osnovne funkcionalnosti su iste:
Rad sa standardnim dijalozima i datotekama Mogue je izabrati datoteku, prikazane su samo datoteke
koje zadovoljavaju odreeni kriterijum (samo doc ekstenzi-
Veina Windows aplikacija ima potrebe da manipu- je na prvoj, odnosno mdb na drugoj slici) uz mogunost da
lie razliitim datotekama; tekstualne datoteke, slike, itd. u se runo unese ime datoteke - File name polje.
smislu itanja i pisanja sadraja.
U ovom nastavku male kole programiranja za C# Dobra vest je to nema potrebe runo programirati
emo se posvetiti upravo ovome. Manipulacija datotekama ove dijaloge. Oni su sistemski i postoje u svakoj verziji
obavezno ukljuuje i standardne dijaloge za izbor i uva- Windowsa od kada on postoji. ak, ako na primer kreirate
nje sadraja. Oni se otvaraju izborom opcija Snimi (eng. aplikaciju u Windowsu XP sa ovim dijalozima i kopirate
Save) i Otvori (eng. Open). izvrnu datoteku na Windows Vistu videete Vistine dijalo-
ge bez ikakve izmene aplikacije.
Na primer, u Microsoft Wordu dijalog za otvaranje Korienje ovih dijaloga je veoma jednostavno,
dokumenta je prikazan na sledeoj slici: direktno i potpuno podrano u Visual C# Express Edition.
35
Iz ovoga se vidi da se svaki filter sastoji od dva dela.
Naziv filtera i kriterijum za prikaz datoteka. Separator je
vertikalna crta. Obratite panju da na kraju ne treba staviti
vertikalnu crtu.
Dozvoljene su i sledee kombinacije:
Slike|*.jpg;*.gif;*.bmp|Video|*.mpg;*.avi;*.wmv
U ovom sluaju takoe imamo dva filtera, Slike i
Video ali svaki od njih e prikazati datoteke sa vie eksten-
zija. Separator izmeu ekstenzija istog filtera je karakter
taka-zarez.
U naem primeru, svojstvo Filter openFileDialog1
kontrole postavite na:
Tekst datoteke|*.txt|Sve datoteke|*.*
NAPOMENA:
2. Postaviti potrebna svojstva kontrole (naslov, poetni Sva pomenuta svojstva se mogu postaviti kako u vreme
direktorijum, filter za ekstenzije datoteka) dizajniranja (kao to smo mi uradili), tako i u vreme izvra-
Kada pokrenemo dijalog za otvaranje datoteke, vanja programa.
uobiajeno je da u njemu vidimo samo datoteke sa odre-
enom ekstenzijom koju naa aplikacije prepoznaje. Obi-
no se za svaki sluaj dodaje i opcija za prikaz svih datoteka
3. Otvaranje dijaloga
- filter *.* sigurno ste do sada u ovakvim dijalozima videli
opciju All files (sve datoteke). Dijalog poseduje metodu ShowDialog koja kao
Filter Open dijaloga se postavlja pomou istoime- rezultat izvravanja vraa akciju korisnika u dijalogu. Ova
nog svojstva Filter. Ovo svojstvo je tipa string i zahteva akcija predstavlja enumeraciju pod nazivom DialogResult.
specifino formatiranje. Na primer, ako ovo svojstvo pos- Nama su od interesa samo dve opcije:
tavimo na: DialogResult.OK - korisnik je izabrao datoteku
Tekst datoteke|*.txt|Sve datoteke|*.*
DialogResult.Cancel - korisnik je zatvorio dialog (kliknuo
napravili smo dva filtera. Prvi sa nazivom Tekst datote-
na Cancel dugme)
ke koji prikazuje sve datoteke sa ekstenzijom txt, i drugi
sa nazivom Sve datoteke koji prikazuje upravo to: sve
datoteke sa bilo kojom ekstenzijom.
36
Proverom ove povratne vrednosti znamo da li je Prikaz sadraja izabrane datoteke
datoteka izabrana i dalje nastavljamo rad sa njom.
37
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.Text = openFileDialog1.FileName;
System.IO.StreamReader sr =
new StreamReader
(openFileDialog1.FileName);
textBox1.Text = sr.ReadToEnd();
sr.Close();
} Provebajte sami!
}
Pokuajte da proirite primer tako to ete omogui-
Inicijalizujemo objekat sr tipa
ti korisniku da sadraj textBox1 kontrole snimi kao novu
System.IO.StreamReader i u konstruktoru postavljamo ime datoteku.
datoteke koju je korisnik izabrao u dijalogu. Treba dodati jo jedno dugme (Button) na formular
u kome ete za Click dogaaj napisati sav potrebni kd.
Metodom ReadToEnd() itamo kompletni sadraj
datoteke i postavljamo ga u Text svojstvo kontrole
Ovog puta koristimo SaveFileDialog kontrolu. Svojs-
textBox1. tva i upotreba je identina kao u OpenFileDialog kontroli
Na kraju treba obavezno treba zatvoriti StreamRea-
koju smo koristili u primeru.
der objekat, to se radi metodom Close(). Klasa StreamWriter nam daje sve potrebne funkcio-
UPOZORENJE: nalnosti. U konstruktoru se takoe navodi puna putanja i
Ako StreamReader ne zatvorite metodom Close(), ime datoteke, ali sada je to datoteka koja ne postoji, ve e
datoteka koja se ita ostaje zakljuana (eng. Locked) tako je kreirati StreamWriter objekat.
da ni jedna druga aplikacije ne moe da je otvori. Kae se Upis sadraja u datoteku se vri metodom Write
da StreamReader datoteku otvara u eksluzivnom reimu. koja kao ulazni argument ima tekst koji treba da upie u
Meutim, ako regularno zatvorite svoju aplikaciju, datoteku.
automatski se otkljuavaju sve otvorene datoteke. Takoe je potrebno na kraju zatvoriti StreamWriter
objekat pomou metode Close().
38
Mala kola programiranja C# (11) Pokrenite Visual C# Express i kreirajte novu
Greke u programiranju i obrada greaka Windows aplikaciju. Na inicijalnu formu postavite jedno
komandno dugme u uradite dupli klik. Kao to smo videli
U februarskom broju asopisa i etvrtom nastavku ranije, automatski se otvara prozor za pisanje koda koji
kole programiranja smo prvi put pomenuli i ukratko obja- obrauje Click dogaaj komandnog dugmeta.
snili greke u C# programiranju. Sada je vreme da detalj- Ovde emo namerno napraviti sintaksnu greku i
nije obradimo ovu problematiku. videti kako je ona prikazana u razvojnom okruenju. Otku-
cajte sledeu liniju koda:
Greke u programiranju se dogaaju. Nije pitanje
da li e se u vaoj aplikaciji dogoditi greka, ve kada e se private void button1_Click(object sender, EventArgs e)
ona dogoditi. Greke u radu programa su injenice koje {
treba prihvatiti i na odgovarajui nain reagovati. MessageBox ("TEST");
Teoretski govorei, postoje tri grupe greaka na }
koje se nailazi u svakom programiranju:
Simulirali smo greku tako to smo izostavili metodu
1. Sintaksne greke Show, tako da bi ispravna linija trebala da glasi:
Nastaju kada pogreite u sintaksi programskog jezi-
ka, korienju neke klase i slino. Ove greke nisu MessageBox.Show("TEST");
opasne jer aplikacija koja ih sadri jednostavno ne moe
da se prevede (kompajlira), pa samim tim ni pokrene. Sada pokrenite aplikaciju (F5 funkcijski taster).
Obratite panju na pitanje koju dobijate:
2. Greke u vreme izvravanja (run-time errors)
Aplikacija nema sintaksnih greaka, uspeno je
kompajlirana i pokrenuta. Meutim, u toku rada aplikacije
dogodila se greka (na primer deljenje sa nulom) i ako
nita nismo preduzeli, aplikacija e prestati sa radom. Ovo
su najee greke i predstavljaju fokus ovog lanka.
3. Logike greke
Aplikacija je uspeno kompajlirana, prilikom rada ne Ako odgovorite potvrdno na ovo pitanje, bie pokre-
prijavljuje nikakve greke niti prestaje sa radom. Sve je u nuta predhodno uspeno kompajlirana verzija aplikacije
redu, ali va program samo ne radi ono to treba da (ako postoji). Meutim ovo obino nema smisla, tako da
radi. Vraa pogrene rezultate, ne upisuje podatke i tome treba kliknuti na No, ime je obustavljeno pokretanje
slino. Ovo su verovatno greke koje je najtee otkriti jer aplikacije. Ako sada pogledate kod, primetiete da je prob-
su posledice loeg dizajna aplikacije. lematina linija podvuena talasastom plavom linijom, kao
to je prikazano na sledeoj slici:
1. Sintaksne greke
Radno okruenje Visual Studio C# Express prua
puno pomoi za otkrivanje i uklanjanje sintaksnih greaka.
Ve prilikom pisanja koda, sve problematine konstrukcije
e biti jasno oznaene, sa ponudom za pomo ili automat-
sko ispravljanje gde god je to mogue.
39
Takoe pogledajte prozor Error list (lista greaka) U fazi testiranja aplikacije se upravo i otkrivaju takva
koji se inicijalno nalazi na dnu razvojnog okruenja. mesta koja moda u poetku nisu oigledna.
.NET Framework ima snanu podrku i mogunosti
za upravljanje grekama u vreme izvravanja programa.
U C# programskom jeziku je usvojena klasina struktura za
obradu greaka koja postoji u C / C++ programskim jezici-
ma. Sintaksa je sledea:
try
{
U ovom prozoru se nalazi lista svih sintaksnih gre- // linije koda gde moe da nastane greka
aka kao i lista greaka koje se dogode u vreme izvrava- }
nja. Za svaku greku imamo opis, u kojoj datoteci se nala- catch (Exception e1)
zi, broj linije i kolone, kao i naziv projekta. {
Ako uradite dupli klik na greku u ovom prozoru, // obrada greke
automatski se otvara datoteka gde se ona nalazi, a kurzor }
se pozicionira na problematinu liniju. Ostaje da ispravite finally
greku i ponovo pokrenete program. {
// deo koji se uvek izvrava
}
2. Greke u vreme izvravanja (run-time errors)
Postoje tri bloka od kojih je poslednji (finally) opci-
on.
Greke koje ne moemo izbei i koje su rezultat
unosa korisnika, infrastrukture, mree i drugih raunarskih U bloku try treba da se nalazi jedna ili vie linija
resursa. Poetnici u programiranju obino ne shvataju ta koda gde se mogu pojaviti greke u vreme izvravanja apli-
sve moe krenuti naopako, iako je program besprekorno kacije.
napisan.
Na primer, napisan je program koji ita podatke iz U bloku catch se nalazi kod koji obrauje greke
baze podataka i prikazuje ih na formularu. Baza podataka (eng. error handler). Ako se na bilo kojoj liniji koda u try
je na drugom raunaru u mrei. Ovde u praksi moe nas- bloku dogodi greka, tok programa se automatski preus-
tati mnogo problema gde direktni razlog nije sama aplika- merava na prvu naredbu u catch bloku.
cija. Ako iz nekog razloga mrea nije dostupna zbog hard- Ovde moete probati da ispravite greku, ili samo
verskih problema (a njih zaista moe biti puno), aplikacije informiete korisnika i prikaete mu poruku greke.
e krahirati. Moda je mrea u redu, ali database server Moe postojati vie catch blokova koji hvataju raz-
nije pokrenut. Moda je u redu i mrea i database server, liite grupe greaka. Na primer, ako otvarate konekciju ka
ali je baza podataka oteena, ili ima previe korisnika, ili bazi podataka, prvo bi mogli da uhvatimo probleme u mre-
je ba u tom momentu baza off-line jer administrator radi i, zatim probleme sa bazom podataka i na kraju sve ostale
svoj posao... probleme. U ovom sluaju bi imali tri catch bloka. Zavisno
Dobili ste sliku. od tipa greke, kod se automatski preusmerava na odgova-
Strogo govorei, svaka linija koda u programu moe rajui catch blok.
da generie greku. U praksi, neemo za svaku liniju pos-
tavljati obradu greaka, ve samo tamo gde postoji realna Blok finally (ako postoji) se izvrava uvek, bez obzira
verovatnoa da greka nastane. da li je do greke zaista dolo ili ne. Ovde upisujemo linije
koda koje uvek treba da se izvre.
40
ta se dogaa kada se pojavi greka u vreme izvr- Cilj je da korisnik vaeg programa nikada ne dobije
avanja koju nismo obradili try-catch blokom? ovakvu poruku o greci. Iako se u dijalogu nudi opcija da
se nastavi sa izvravanjem programa (dugme Continue) u
Na formular dodajte jo jedno dugme i uradite praksi nastavak rada programa posle greke obino dovodi
dupli klik na njega. Ovde emo napisati sintaksno ispravni do daljnjih greaka i nema smisla.
kod koji e uvek generisati greku u toku izvravanja:
Sada emo izmeniti kod i dodati obradu greke:
private void button2_Click (object sender, EventArgs e)
{ private void button2_Click(object sender, EventArgs e)
int a = 10, b = 0, c; {
c = a / b; int a = 10, b = 0, c;
} try
{
Deklariemo tri varijable i nakon toga namerno pra- c = a / b;
vimo greku deljenja sa nulom (b = 0). Pokrenite program }
i kliknite na dugme. Kada se greka dogodi u programu catch
koji je pokrenut iz okruenja, on se zaustavlja i prikazuje {
se problematina linija se opisom greke i predlozima MessageBox.Show("GRESKA: deljenje sa
kako se greka moe ispraviti: nulom");
}
}
41
Mala kola programiranja C# (12)
Rad sa bazama podataka
ADO.NET
42
Primer u est lakih koraka U Change Data Source dijalogu izaberite Microsoft Access
Database File, kao to je prikazano na slici i kliknite na
Uz pretpostavku da ste preuzeli bazu sa Interneta i dugme OK.
da se nalazi na C:\BAZA\NWIND.MDB, proiemo kroz
sledee korake kako bi postigli cilj.
43
5. U ovom koraku "Choose your database objects" treba
da izaberemo jednu ili vie tabela sa kojom hoemo da
radimo. U listi se, izmeu ostalog, nalaze sve tabele u bazi
podataka. Kliknite na znak + pored Tables i izaberite tabe-
lu Customers kao to je prikazano na slici.
Otvorite padajuu listu pored svojstva DataSource i izabe- Probajte da skrolujete po visini i irini kako bi videli sve
rite kao to je prikazano na sledeoj slici: podatke.
Kliknite na zaglavlje tabele. ta se deava? Oigledno puno
Primetiete da je radno okruenje automatski dodalo jo ugraenih gotovih funkcionalnosti koje ne treba runo pro-
neke objekte (vide se ispod forme), a takoe je gramirati.
DataGridView kontrola dobila zaglavlje sa imenima atri-
buta tabele Customers koju smo izabrali. U sledeem nastavku emo prouiti objekte koji se u ovom
primeru koriste.
I to je sve (za sada).
44
Mala kola programiranja C# (13) uradimo bez ispravno formiranog primarnog kljua.
Rad sa bazama podataka
Tehniki gledano tabela ne mora da ima primarni klju, ali
Da bi mogli da napiemo bilo kakav program ili web sajt to zaista nikako nije dobra praksa.
koji pristupa bazi podataka neophodno je da upoznamo
jezik kojim se manipulie podacima baze podataka. U pita- Ponekad ne postoji ni jedna kolona u tabeli koja je jedins-
nju je jezik pod nazivom SQL (eng. Structured Query Lan- tvena i moe da bude kandidat za primarni klju. U tom
guage) odnosno struktuiranu jezik za zadavanje upita. sluaju se vetaki dodaje jo jedna kolona, najee
Ponegde se SQL akronim interpetira kao i "Standard Query numerika, gde baza podataka sama upisuje brojeve u ras-
Language" odnosno standardni jezik za zadavanje upita. tuem nizu. Ovakva kolona, zavisno od baze podataka, se
Kako bilo, SQL jezik je standardni jezik koji je predstavljen zove Autonumber, Identity i slino.
ranih 1970-tih i od tada je doiveo nekoliko standardizaci-
ja od kojih je poslednja bila 1999, a nakon nje jo nekoliko Tipovi podataka u tabeli
revizija. Zavisno od potreba, u svakoj koloni tabele se upisuju razli-
iti tipovi podataka. Da se ne bi previe udaljavali od teme
Dobra stvar kod standardizacije SQL jezika je to jednom pomenuemo samo osnovne grupe:
nauen moe biti primenjen na bazama podataka razliitih Tekstualni podaci slue za slobodni unos alfanu-
proizvoaa. Da ne bi sve bilo idealno, u praksi moete merikog teksta
raunati da predhodna tvrdnja nije potpuno tana, jer sva- Celobrojni numeriki podaci unos celobrojnih
ki proizvoa uvodi nove mogunosti koje manje ili vie pozitivnih i negativnih vrednosti
odstupaju od standarda. Numeriki podaci sa pokretnim zarezom
Datumski podaci
Primarni klju tabele Specijalni tipovi tekstualna polja velikog kapacite-
U prolom nastavku je pomenuta tabela kao osnovni nosi- ta, slike, zvuk, geografski podaci i slino
lac informacija. Osim ovoga svaka tabela poseduje jedan Tip podatka u nekim sluajevima odreuje i sintaksu SQL
vaan objekat primarni klju tabele (eng. Primary Key upita kao to emo videti u narednom tekstu.
ili skraeno PK). Primarni klju predstavlja jedna ili vie
kolona sa ciljem da se svaki red u tabeli jedinstveno iden- Tipovi SQL upita
tifikuje. Na primer, ako bi eleli da kreirate tabelu sa poda- SQL upiti se po svojoj funkciji mogu podeliti na sledee
cima studenata jednog fakulteta, najbolji kandidat za pri- grupe:
marni klju je broj indeksa studenta. Ako bi za primarni DML (eng. Data Manipulation Language), jezik za
klju postavili ime i prezime, pogreili bi jer to nije jedins- manipulaciju podataka. Ovu grupu emo detaljnije
tvena vrednost. prouiti jer se odnosi na pregled, dodavanje, izmenu
i brisanje podataka.
Ponekad jedna vrednost nije dovoljna za jedinstvenu iden- DDL (eng. Data Definition Language) pomou koga
tifikaciju reda tabele. Ako bi eleli da napravimo tabelu sa se kreiraju, menjaju i briu objekti u bazi podataka.
podacima o studentima svih fakulteta u Srbiji, samo broj Pomou njih moemo kreirati tabele, odrediti nazive
indeksa ne bi bio dovoljan. Morali bi da dodamo grad i i tipove podatka, definisati primarni klju tabele i
naziv fakulteta. Ovako kreirani primarni klju koji se sastoji slino.
od dve ili vie vrednosti (u naem primeru tri), se zove DCL (eng. Data Control Language) jezik za kontro-
kompozitni primarni klju. lu podataka pomou koga se odreuje koji korisnik
ta sme da radi sa podacima. Na primer, moete
Zato je primarni klju vaan? odreenim korisnicima data pravo da samo pregle-
Ako elimo da pogledamo podatke, izmenimo ili izbriemo daju podatke, a nekim i da ih menjaju.
tano odreeni podatak to ne bi mogli precizno da
45
Na cilj je upoznavanje sa jezikom za manipulaciju poda- Ako bi eleli da prikaemo pomenute kolone iz tabele Cus-
taka. tomers, SELECT upit bi trebao da izgleda ovako:
Prikaz podataka
Prikaz podataka iz baze se dobija pomou SELECT nared-
be. Osnova sintaksna struktura SELECT naredbe je veoma
jednostavna:
Nazivi kolona su razdvojeni zarezom, a posle FROM klau- Ako elite dobiti sve kolone iz tabele moete ih sve redom
zule se upisuje ime tabele. Navedena imena kolona mora- navesti ali postoji i skraeni oblik upiite zvezdicu umesto
ju postojati u tabeli, u suprotnom dobiemo poruku o gre- liste kolona:
ci.
SELECT *
U Northwind bazi postoji tabela pod nazivom Customers FROM Customers
u kojoj se nalazi lista svih kupaca sa kolonama Custome-
rID (ifra kupca), CompanyName (ime kompanije), City
(grad) i tako dalje.
Rezultat:
46
Ovo je i zgodan nain da se brzo sazna koje kolone ima
tabela.
Rezultat:
47
Mala kola programiranja C# (14)
Rad sa bazama podataka
Vertikalni filter znai da ne prikazujemo sve kolone iz Ako na primer, elimo da prikaemo kupce iz Londona i
tabele, ve samo one koje nam zaista trebaju. Na primer, Berlina onda se radi o sloenom uslovu sa dva kriterijuma.
elite videti samo ifru i naziv kompanije i nikakve druge itajte ovako: prikai kupce koji su iz Londona ili Berlina
podatke. Ovo se implementira jednostavno tako to u znai radi se o OR (eng. ili) operatoru.
SELECT listi navedete samo potrebna polja.
SELECT CustomerID, CompanyName, City
Horizontalni filter znai da ne elite da vidite sve slogove FROM Customers
(redove) iz tabele. Na primer, elite da vidite samo kupce WHERE City = 'London' OR City = 'Berlin'
za zadati grad. Ovo se postie pomou WHERE naredbe u
kojoj se definie jedan ili vie kriterijuma koji moraju biti Rezultat upita:
ispunjeni da bi se slog prikazao. WHERE naredba (jo se
zove klauzula) je veoma slina if naredbi u programskim
jezicima. Mogue je zadati vie kriterijuma koji se meu-
sobno povezuju OR i AND operatorima.
48
Na primer: vidimo sve kupce iz gradova London, Berlin, Madrid i Pariz
SELECT ContactName, CustomerID, CompanyName, City kriterijum bi se skraeno napisao na sledei nain:
FROM Customers
WHERE City = 'London' OR City = 'Berlin' SELECT ContactName, CustomerID, CompanyName, City
ORDER BY ContactName FROM Customers
WHERE City IN ('London', 'Berlin', 'Madrid', 'Paris')
Rezultat upita:
Rezultat upita:
49
SELECT ProductID, ProductName, UnitPrice :
FROM Products
WHERE UnitPrice >= 50 AND UnitPrice <= 100
Rezultat upita:
50
Mala kola programiranja C# (15) malo komplikuju jer, istorijski gledano, postoji vie tehno-
Rad sa bazama podataka logija od kojih je svaka donela svoj set drajvera. Da ne ula-
zimo previe u priu, OleDb je tehnologija koja se koristi za
U predhodnom nastavku smo se upoznali sa osnovama pristup bazama kao to su Access, FoxPro, stari DBF i slini.
SELECT naredbe SQL upita. Ovo nam daje dovoljnu osno- Takoe je mogue sa Web sajtova proizvoaa baza poda-
vu da dalje nauimo kako napraviti aplikaciju koja bazi taka preuzeti razliite tipove drajvera za njihov format. Na
podataka zadaje SELECT upit i prikazuje rezultat njegovog primer Oracle i MySql omoguavaju besplatno preuzimanje
izvravanja. Za primer emo koristiti ve pomenutu Nwind drajvera bilo u OleDb ili .NET tehnologiji. Odlina stvar kod
bazu podataka u Microsoft Access formatu. Preduslov je ovakvog koncepta je to se sistem rada sa bazama meu-
da na disku C: imate direktorijum baza i u njemu datoteku sobno minimalno razlikuje. Uvek su u pitanju iste klase sa
Nwind.mdb. Ovo je vano, jer se prilikom obraanja bazi istim ili slinim funkcionalnostima. U praksi ovo znai da
referenciramo na njenu putanju u naem sluaju nije komplikovano napisati aplikaciju koja e podjednako
C:\baza\nwind.mdb. Pripremite se za malo teorije koja dobro raditi sa razliitim formatima baze podataka rezul-
nam je neophodna kako bi u sledeem nastavku napravili tat je proirena vrednost aplikacije jer, na primer, korisnik
odgovarajui primer. moe izabrati koju bazu eli da koristi, a programer moe
da napie aplikaciju koja radi sa postojeom bazom i poda-
Imenovani prostori i upravljaki programi cima.
Prilikom rada sa bazama podataka, C# i generalno .NET Poto koristimo Access bazu podataka, treba koristiti
radno okruenje nude veliki broj klasa koje su rasporee- OleDb drajvere, odnosno klase u System.Data.OleDb ime-
ne u dva imenovana prostora (Eng: name spaces): novanom prostoru.
System.Data.SqlClient
System.Data.OleDb Klase za rad sa bazama podataka
Oba se nalaze hijerarhijski ispod System.Data prostora Govorili smo o dva imenovana prostora koji imaju isti set
imena. ablon "Windows Application" inicijalno ve ima klasa. Razlikuju se u prefiksu naziva. Na primer imamo
referencu na System.Data, tako da nema potrebe praviti SqlConnection (System.Data.SqlClient) i OleDbConnection
dodatne reference u projektu. Meutim, kao i do sada, (System.Data.OleDb imenovani prostor). Ovo imajte u vidu
zgodno je iskoristiti using direktivu kako bi jednostavno jer u narednom tekstu radimo sa OleDb* objektima zbog
skratili pisanje prilikom kodiranja. Access baze podataka.
U imenovanom prostoru System.Data.SqlClient se nalazi
set klasa koja slui za rad sa bazom podataka Microsoft Konekcija
SQL Server. Imenovani prostor System.Data.OleDb sadri U svakom sluaju, bez obzira ta radili sa bazom podataka,
klase kojima se radi sa ostalim formatima baza podataka. neophodno je prvo napraviti vezu konekciju (Eng: Con-
Termin koji treba razumeti je "drajver za bazu podataka". nection) ka njoj. Ovu funkcionalnost nam daje klasa OleDb-
Moemo napraviti poreenje sa drajverom (pogonskim Connection. Osnovno svojstvo ove klase koje i odreuje
programom) za grafiku karticu raunara. Da bi kartica parametre konekcije je svojstvo ConnectionString. Kao to
radila u bilo kom operativnom sistemu, neophodno je se iz imena da pretpostaviti svojstvo je tipa string. Setite se
instalirati odgovarajui drajver. U pitanju je softver koji nastavka #12 ovog serijala kada smo pomou arobnjaka
predstavlja vezu izmeu operativnog sistema i fizikog indirektno postavljali ovo svojstvo. Potrebno je podesiti
hardvera u raunaru. string tako da se sastoji od parova: naziv
Slino je i sa bazama podataka. Drajver za bazu podataka parametra1=vrednost parametra1; naziv
omoguava sve funkcionalnosti za zadati format i na taj parametra2=vrednost parametra2;... i tako redom. Oigle-
nain (na sreu) skriva od programera kompleksnost prili- dno, separator je znak ;
kom rada sa razliitim formatima baza na tritu Ovo je
koncept koje se naziva enkapsulacija. Na dalje se stvari Parametri i njihovo znaenje je sledee:
51
Provider oznaava ime potrebnog drajvera baze poda- NAPOMENA
taka kako je registrovan u sistemu. Za Access bazu ime
drajvera je uvek Microsoft.Jet.OLEDB.4.0 1. Strogo obratite panju na parametre Data Source
Kada ovo sklopimo dobijamo: i User id. Morate ih pisati sa jednim razmakom izmeu
"Provider= Microsoft.Jet.OLEDB.4.0;" rei, u suprotnom dobijate poruku o greci.
Data Source kada je Access baza u pitanju, ovaj para- 2. Kada postavljate ovo svojstvo OleDbConnection
metar oznaava putanju i ime datoteke koja predstavlja objekta, treba voditi rauna o specifinosti rada sa stringo-
bazu. U naem sluaju baza se nalazi na putanji vima u jeziku C#. Znak \ (obrnuta kosa crta) u stringu ima
C:\baza\Nwind.mdb specijalno znaenje takozvani Escape ili kontrolni karak-
Sada ConnectionString izgleda ovako: ter posle koga se oekuje najee specijalni znak za for-
"Provider=Microsoft.Jet.OLEDB.4.0; Data Sour- matiranje. Zbog ovoga, ako na primer napiete:
ce=C:\baza\Nwind.mdb" Obj.ConnectionString =
U osnovnoj varijanti ovo je dovoljno. Meutim, ako je baza "Provider=Microsoft.Jet.OLEDB.4.0;Data
zatiena korisnikim imenom i ifrom, neophodno je i to Source=C:\baza\Nwind.mdb"
navesti. Na primer korisnik nae baze je Admin sa ifrom Odmah dobijate sintaksnu greku. Postoje dva reenja.
123 (u praksi izbegavajte ovako "jake" ifre). Da bi ovo Moete napisati ispred stringa znak @ koji govori kompa-
postigli koristimo jo dva parametra: User id i Password jleru da znak \ tretira kao i svaki drugi:
Finalna verzija stringa konekcije bi mogla da izgleda ova- Obj.ConnectionString =
ko: @"Provider=Microsoft.Jet.OLEDB.4.0;Data
"Provider=Microsoft.Jet.OLEDB.4.0;Data Sour- Source=C:\baza\Nwind.mdb"
ce=C:\baza\Nwind.mdb;User id=Admin;Password=123"
Ili moete posle svakog znaka \ jednostavno dopisati jo
Kada smo postavili ConnectionString svojstvo potrebno je jedan:
eksplicitno otvoriti konekciju ka bazi. Za ovo se koristi jed- Obj.ConnectionString =
nostavna metoda Open() bez argumenata. U sluaju da je "Provider=Microsoft.Jet.OLEDB.4.0;Data
baza iz nekog razloga nedostupna, oteena ili postoji Source=C:\\baza\\Nwind.mdb"
problem u mrei, metoda Open() e generisati greku u Oba naina su ispravna izaberite koji vam se vie svidja.
vreme izvravanja.
3. Ako elite da u mrei vie korisnika pristupa istoj
Kada zavrimo posao, potrebno je zatvoriti konekciju sa Access bazi podataka, bazu je potrebno postaviti u deljeni
bazom. Ovo tehniki nije neophodno, ali obavezno to ura- direktorijum na jednom raunaru. Sa ostalih raunara se
dite kako bi sauvali resurse (broj istovremenih konekcija) bazi pristupa tako to se za Data Source postavi puna
baza, mrea i na kraju korisnici vae aplikacije e vam mrena putanja do datoteke. Na primer ako na raunaru
biti zahvalni ako potujete ovo pravilo. ije je mreno ime Server, u direktorijum Podaci smesti
baza Nwind.mdb i potom podeli (Eng: share) ovaj direk-
torijum, puna putanja do baze je:
\\Server\Podaci\Nwind.mdb a ConnectionString je:
Obj.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.
0;Data Source=\\Server\Podaci\Nwind.mdb "
52
Komanda Kada sve ovo uradimo kako treba, rezultat je DataSet
Objekat pomou kojeg zadajemo SQL upit bazi podataka popunjen podacima koga koristimo za prikaz na ekranu ili
je OleDbCommand. Komanda se uvek izvrava preko ve tampanje izvetaja.
definisane konekcije. Moe predstavljati razliite stvari
koje su izvan opsega ovog serijala. Mi emo se ograniiti itaocu koji se prvi put susree sa ovim objektima sve
na jednostavno slanje osnovnih SQL upita i prikaza rezul- verovatno izgleda (pre)komplikovano na prvi pogled.
tata izvravanja. Meutim kreatori ove tehnologije su imali u vidu mogu-
nosti rada sa praktino svim postojeim formatima baza
Svojstva komande i njihovo znaenje su sledee: podataka koji su trenutno na tritu ili vie nisu, ali su od
znaaja.
Svojstvo Connection definie po kojoj konekciji e koman-
da biti izvrena. Svojstvo je objektnog tipa i to OleDbCon- U sledeem nastavku emo ovu teoriju prevesti u praktini
nection. primer i tada e sve doi na svoje mesto. Posle malo prakse
bie oigledno koliko je ovaj koncept fleksibilan i prilagod-
Svojstvo CommandText je string tipa i pomou njega pos- ljiv u realnom radu.
tavljamo potrebni upit.
DataSet
DataSet predstavlja memorijski prostor u kome se uva
rezultat SELECT upita. Moemo ga tretirati kao matricu
koja se sastoji od redova i kolona. Tanije reeno, DataSet
moe biti i niz matrica jer kroz jednu komandu moemo
poslati vie SELECT upita. Tada svaki SELECT pravi svoju
matricu koja je u ovom kontekstu predstavljena objektom
Table.
Obratite panju da DataSet nema prefiks Sql niti OleDb.
DataSet se koristi kao univerzalni skladini prostor koji ak
ne mora biti ni na koji nain povezan sa bazama podataka.
Poseduje puno svojstava i metoda, ali o njima kasnije.
OleDbDataAdapter
Ovaj objekat predstavlja sponu izmeu komande i objekta
DataSet. OleDbDataAdapter je zaduen za pokretanje
komande, prosleivanje SELECT upita preko konekcije i na
kraju popunjavanje DataSet objekta podacima koji su
rezultat SELECT upita.
Svojstvo koje definie komandu koju treba izvriti je Selec-
tCommand. Ovo svojstvo je tipa OleDbCommand.
53
Mala kola programiranja C# (16) Svaki put kada elite da zadate SELECT upit bazi podataka
Rad sa bazama podataka procedure je ista. Na sledeem dijagramu je prikazan redo-
sled kreiranja objekta, njihove veze i kljuna svojstva sva-
U prethodnom nastavku serijala smo se pozabavili teoret- kog od njih:
skim delom pristupa podacima pomou ADO.NET tehnolo-
gije. U ovom nastavku emo naueno iskoristiti u primeru i
tako teoriju preneti u praktini primer.
Komanda:
OleDbCommand Komanda = new OleDbCommand();
Komanda.Connection = Konekcija;
Komanda.CommandText =textBox1.Text;
DataSet:
DataSet Ds = new DataSet();
OleDbConnection Konekcija = new OleDbConnection(); Svojstvo DataSource, kao to moete pretpostaviti iz nazi-
Konekcija.ConnectionString = va, pokazuje koji je izvor podataka koje treba prikazati u
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = kontroli. U ovom primeru, izvor podataka je prvi (i jedina)
C:\baza\Nwind.mdb"; tabela u DataSet-u koji ima index 0 (Ds.Tables[0]).
55
Kompletan kod za click dogaaj dugmeta: Pokuajte sledei upit:
OleDbConnection Konekcija = new OleDbConnection(); SELECT ProductName, UnitPrice FROM Products ORDER
Konekcija.ConnectionString = BY ProductName
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Sour- (Prikai naziv i cenu proizvoda iz tabele Products i sortiraj
ce=C:\baza\Nwind.mdb"; po nazivu proizvoda).
OleDbCommand Komanda = new OleDbCommand();
Komanda.Connection = Konekcija;
Komanda.CommandText =textBox1.Text;
DataSet Ds = new DataSet();
OleDbDataAdapter Da = new OleDbDataAdapter();
Da.SelectCommand = Komanda;
Da.Fill(Ds);
DataGridView1.DataSource = Ds.Tables[0];
56
Mala kola programiranja C# (17) prikaemo u TextBox kontroli, to inimo preko njenog
Data Binding svojstva Text. Ako u podacima imamo kolonu koja moe
imati samo vrednosti tano/netano (Eng. true/false) logi-
U ovom nastavku emo obraditi vezivanje sa podacima no je koristiti CheckBox kontrolu i vezati podatke na njeno
(Eng. Data binding). svojstvo Checked.
U prolom nastavku smo zapravo radili data binding kada Sintaksa za povezivanje svojstva kontrole sa kolonom tabe-
smo postavljali DataSource svojstvo kontrole le iz DataSet objekta je raznolika, ali najee se koristi sle-
DataGridView. Slinu stvar moemo uraditi i sa gotovo dea:
svakom kontrolom korisnikog interfejsa. Vezivanje poda- (predpostavka je da na formi imamo TextBox kontrolu u
taka znai da se u nekoj kontroli automatski prikazuju kojoj elimo da prikaemo vrednost kolone
podaci iz baze, najee kao rezultat SELECT upita. Poto "CompanyName" iz ve napunjenog DataSet objekta)
SELECT upit moe da obuhvati podatke iz jedne ili vie
tabela, ovo predstavlja veoma elegantan nain za prikaz TextBox1. DataBindings.Add ("Text", Ds.Tables[0],
podataka korisniku, uz minimum programiranja. Kontrole "CompanyName");
se povezuju na potrebnu tabelu u okviru DataSet objekta.
U ovoj liniji koda za kontrolu TextBox1 dodajemo novo
Princip rada je identian kao to je demonstrirano u pred- vezivanje tako to za svojstvo Text iz prve tabele DataSet-a
hodnom primeru, uz dodatak par linija koda koje su odgo- pod nazivom Ds, vezujemo kolonu "CompanyName". Vodi-
vorne za povezivanje podataka. Postoje dve varijante koje te rauna da ne vezujete dva ili vie puta podatke za isto
moemo koristiti i iji izbor zavisi od mogunosti same svojstvo kontrole jer ete tada dobiti poruku o greci.
kontrole. Neke kontrole su u stanju da tabelarno prikau
podatke, kao to je DataGridView. U ovom sluaju potreb- Primer
no je podesiti samo DataSource svojstvo i to je sve. Ovaj
nain vezivanja se zove simple data binding. Da bi ovo ilustrovali napraviemo jednostavan primer za
simple i complex data bindigs. Kao i ranije koristimo Micro-
Neke druge kontrole kao to TextBox, Label i sline oi- soft Access bazu podataka. Pokrenite Microsoft C# 2005
gledno ne mogu prikazati redove i kolone podataka, ve Express Edition i kreirajte novi projekt tipa Windows
mogu da prikau samo vrednost odreene kolone (polja iz Application.
tabele), odreenog sloga (reda u tabeli). Ovo nas dovodi
do pojma Current record (aktivni slog-zapis) ije vrednosti Sve to treba emo uraditi u Form_Load dogaaju kako bi
kolone elimo da prikaemo u kontroli. se odmah po otvaranju forme prikazali i podaci.
Kao i u prolom nastavku koristimo objekte:
Kada "napunimo" DataSet podacima, inicijalno aktivni slog
je prvi (pod uslovom da uopte postoje slogovi). U toku OleDbConnection
rada korisnik moe da vri navigaciju po slogovima i na taj OleDbCommand
nain menja aktivni slog koji se prikazuje u ovako vezanim DataSet
kontrolama. OleDbDataAdapter
Svaka kontrola koja podrava vezivanje podataka poseduje Za prikaz podataka koristiemo NWind.mdb bazu i sledee
kolekciju DataBindings koja moe da sadri vie vezivanja kolone iz tabele Products:
podataka za istu kontrolu, a u praksi se koristi najee
samo jedna. Vano je napomenuti da moemo odrediti na ProductName (naziv proizvoda)
koje svojstvo kontrole elimo da veemo vrednost kolone UnitPrice (cena proizvoda)
aktivnog sloga. Na primer ako elimo da podatke Discontinued (da li je proizvod dostupan)
57
SELECT upit koji emo poslati bazi je:
Sada na formu treba postaviti elemente korisnikog inter- Na kraju elimo da vrednost kolone " Discontinued" prika-
fejsa. Na formu postavite redom: emo u CheckBox kontroli. Vrednosti u ovoj koloni mogu
biti samo true ili false, zbog ega smo i izabrali CheckBox
Jednu DataGridView kontrolu za njen prikaz. Dopiite jo jednu liniju koda:
Dve Label kontrole
Dve TextBox kontrole checkBox1.DataBindings.Add("Checked", Ds.Tables[0],
Jednu CheckBox kontrolu "Discontinued");
Svojstva Text za Label i CheckBox kontrole postavite kao Obratite panju da ovde ne vezujemo svojstvo "Text" ve
to je prikazano na sledeoj slici: svojstvo "Checked".
58
Sada pokrenite primer. Ako ste sve ispravno upisali treba Za kraj ovog nastavka i serijala, pokuajte sledee:
da dobijete rezultat kao na sledeoj slici:
Sama forma takoe poseduje DataBindings kolekciju. Ako
elimo da u naslovu forme prikaemo naziv proizvoda,
dovoljno je setiti se da referencu na formu predstavlja klju-
na re this.
this.DataBindings.Add("Text", Ds.Tables[0],
"ProductName");
59