You are on page 1of 32

Objektno orijentirano programiranje Elektrotehniki fakultet

Osijek
Auditorne vjebe Kneza Trpimira 2b
31000 Osijek

www.etfos.hr

1.5. Rad s formama i izbornicima u aplikaciji

U ovom poglavlju nauiti ete koji su osnovni standardi za kreiranje suelja u Windows
aplikaciji. Kako se dodaju nove forme u Windows aplikaciju, to su SDI, a to MDI forme , te
kako se dodaju izbornici u formu. U nekoj aplikaciji za kreiranje suelja mogu se koristiti ove
dvije vrste formi:

1. SDI forme (eng. single document interface) su forme za suelje s pojedinanim


dokumentima, pri emu se posebna forma koristi za prikaz svakog dokumenta. Svaka
forma se promatra kao odvojeni prozor.
2. MDI forme (eng. multiple document interface) je vrsta suelja gdje postoji glavni
prozor, a svi ostali prozori (forme) se otvaraju sa njega. Glavna forma zove se MDI
roditelj, a forme MDI potomci se mogu pomicati samo u okviru glavne roditeljske
forme.

Kod SDI suelja svaka forma moe se micati samostalno neovisno o ostalim formama. Da
bi Windows aplikacija bila efikasnija i ugodna za upotrebu korisniku, potrebno je drati se
nekih standarda pri izradi formi (Barker, 2007): tj. koristiti ustaljenu kombinaciju boja koje
ne iritiraju korisnike (npr. standardne su siva ili bijela boja pozadina formi). Prikazivati
dugmad na standardnim mjestima i biti konzistentan u poloaju dugmadi (npr. dugme za
povratak na prethodni ekran stalno na istom mjestu). Konzistentno koristiti izbornike i alate sa
sliicama (koristiti iste izbornike i sliice na svim formama, i po mogunosti one koji su
standardni za veinu Windows aplikacija, npr. File, Edit, View, Window, Help). Upotrijebiti
pravu kontrolu za prave svrhe (u izboru kontrola koje dodajemo na formu paziti da budu
logine kako bi korisniku olakale unos podataka i rukovanje aplikacijom, npr. ako korisnik
treba unijeti podatak za koji postoje unaprijed utvrene mogue vrijednosti, koristiti
ComboBox ili ListBox umjesto textBox-a za unos) .

Svojstva forme:

U Visual Studio 2008 svojstva forme prikazuju se u prozoru Properties kada miem
oznaimo formu. Svojstva se mogu podijeliti u 9 kategorija. Kategorije e se prikazati u
prozoru Properties ako kliknemo miem na dugme Categorized ispod naziva forme u tom
prozoru. Dugme Categorized prikazuje svojstva grupirana u kategorije, takoer postoji
dugme koje prikazuje svojstva po abecedi. Neke od kategorija svojstava koje emo kroz
vjebe i zadatke koristiti su:

Izgled (eng. Appearance) podeavanje postavki prikaza kao npr. boje pozadine,
irine, visine, pokazivaa i dr.).
Ponaanje (eng. Behavior) podeavanje ponaanja forme, npr. da li e forma biti
omoguena (svojstvo Enabled).
Dizajn forme (eng. Design) odreuje naziv forme, jezik upotrebe, zakljuavanje i dr.
Predloak (eng. Layout) odreuje poetni poloaj, min. ili max. veliinu i dr.
Razliito (eng. Misc skraeno od Miscellaneous) odreuje da li e se tipka Enter
koristiti kao AcceptButton, a tipka Esc kao CancelButton i dr.

Primjer kreiranja aplikacije s vie formi:

U Visual Studio 2008 otvorite novi projekt pod nazivom Forme. Kreirati emo
aplikaciju koja koristi i SDI i MDI forme. Kreirajte prvu formu s kontrolama kao na slici:

Nakon to korisnik klikne miem na dugme ''Unos podataka'', elimo da se otvori nova
forma u kojoj e korisnik moi unijeti podatke. To e biti SDI forma, jer e se otvarati u
novom samostalnom prozoru i nee biti podreena prvoj formi. Potrebno je u Visual Studio
2008 kreirati novu formu (pod nazivom Form2), a zatim u kodu programa pozvati prikaz te
nove forme.

Postupak za kreiranje nove SDI forme: Nova forma se moe kreirati na dva naina:

1. Aktivirati izbornik Project -> Add Windows Form, (ili Add New Item), te u prozoru
odabrati Windows form, i upisati eljeni naziv forme (npr. Form2).
2. U prozoru Solution Explorer oznaiti naziv aplikacije (Forme), kliknuti na desno
dugme mia i u iskonom izborniku izabrati Add -> New Item. Oznaiti Windows
form za kreiranje nove forme. Upisati naziv nove forme. Nakon ovog postupka, u
prozoru Solution Explorer prikazat e se nova forma kao dio istog projekta, pod
nazivom Form2.cs.

Klikom mia na prvu formu (Form1.cs) vraamo se na tu prvu formu kako bismo napisali
naredbe kojima e se nakon klika miem na tipku ''Unos podataka'' prikazati druga forma.
Dvokliknite miem na tipku ''Unos podataka'' kako biste se pozicionirali u programski kod.
Kada se nalazite u metodi button1_Click, upiite sljedee naredbe za prikaz nove forme:
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(); frm.Show();
}

Ovim naredbama odreuje se da nakon to korisnik klikne miem na dugme Button1,


deklarira se nova forma kao varijabla frm tipa Form2, i pojavljuje na zaslonu. Pohranite i
debug-irajte aplikaciju kako biste vidjeli rezultat. Prilikom debug-iranja, kliknite miem na
dugme ''Unos podataka''. Trebala bi se pojaviti nova forma kao na slici:

Vratite se natrag u dizajn aplikacije. Na drugu formu dodajte sada kontrole s kojima e
korisnik moi unijeti podatke, npr. Ime i prezime, te Ocjenu studenta (labele i okvire za tekst).
Postavite svojstvo za text druge forme na ''Unos podataka'' (tako da u naslovnoj traci forme
pie taj naslov forme. U drugu formu dodajte sljedee kontrole za unos podataka o
studentima, te dugme za povratak na prethodnu formu:

U ovoj fazi neemo pisati naredbe programa koje e se izvriti kada korisnik klikne na dugme
''Povratak'', nego objasniti dalje rad s vie formi. Sada elimo kada korisnik klikne na dugme
''Izvjetaji'' kreirati MDI formu koja e biti u okviru prve forme (Form1), odnosno njezin
potomak. Da bismo to mogli ostvariti, potrebno je sljedee:

1. otvoriti novu formu (Form3)


2. za formu Form1 postaviti svojstvo (property) da moe biti forma ''MDI roditelj''. To je
svojstvo ''IsMDIContainer'' u prozoru Properties.

U dizajnu forme Form1 kliknuti dvaput na dugme ''Izvjetaji'' kako bismo se pozicionirali
u kod programa, u metodu button2_click(), i tamo upisati potrebne naredbe da se deklarira i
otvori nova forma MDI dijete. Postupak:

1. Kreirajte novu formu na isti nain kao to je kreirana forma Form2. Novoj formi
dodijelite naziv Form3. Provjerite da li se u prozoru Solution Explorer nalazi na
popisu formi Form3.
2. Vratite se u dizajn forme Form1. Oznaite formu i u prozoru Properties postavite
svojstvo IsMDIContainer na vrijednost True (time smo omoguili da ta forma bude
MDI roditelj forma). Forma e promijeniti boju (postat e transparentna).
3. Kliknite dvaput na dugme ''Izvjetaji''. U metodi button2_Click() upiite sljedei kod:

private void button2_Click(object sender, EventArgs e)


{
Form3 frm = new Form3();
frm.MdiParent = this; frm.Show();
}

Nakon toga u dizajnu Form3 forme dodajte kontrole kao na sljedeoj slici (koje e omoguiti
ispis izvjetaja o imenu i prezimenu i ocjeni):

Naredbe koje e se izvriti kada korisnik klikne na tipku ''Povratak'' za sada neemo pisati,
niti ispisivati vrijednosti za ime i prezime, te ocjenu, budui da e to biti obraeno u sljedeim
poglavljima. Pohranite i pokrenite aplikaciju tipkom Debug. Kliknite miem na dugme
''Izvjetaji''. Pojavit e nova forma, ali unutar prozora prve forme kao na slici:
Koristei mi poveajte prvu formu tako da se untar njezinog prozora vidi cijela druga forma.
Drugu formu ne moete pomicati izvan prve (roditeljske), to je karakteristika MDI formi.

Rad s izbornicima

Izbornici (eng. menus) su vaan dio korisnikog suelja Windows aplikacije. U Visual
Studio 2008 izbornici se dodaju na formu s pomou kontrole MenuStrip. Mogue je dodati
horizontalne i vertikalne izbornike, te njihove podizbornike. Naredbe (odgovor na dogaaj)
koje e izvriti klikom korisnika na odgovarajui izbornik, piu se u programskom kodu
nakon dvoklika miem na element izbornika.

Da biste u aplikaciju Forme dodali izbornik na vrhu prozora, na prvoj formi (Form1) u
dizajnu aktivirajte Toolbox, te izaberite kontrolu MenuStrip (nalazi se u grupi kontrola pod
naslovom Menus & Toolbars). Povucite je miem na formu, i smjestite u gornji lijevi vrh
forme. U prazno polje za upis (oznaeno s Type here upiite prvi element izbornika, npr.
Datoteka kao na sljedeoj slici:
Ispod toga upiite element Spremi, pa ispod toga Zatvori. U vodoravnoj razini upiite
izbornike Unos, Izvjetaji, Pomo. U izbornik Unos umetnite u okomitoj razini elemente
Unos studenata, Unos predmeta, Unos ocjena ili neke druge proizvoljne elemente. U
izbornik Izvjeaji umetnite u okomitoj razini elemente Prema broju indeksa, Prema
datumu ili dr. Pohranite i debug-irajte aplikaciju. Pogledajte kako izgledaju izbornici na
prvoj formi. Izvravanje naredbi klikom na izbornik bit e takoer obraeno u sljedeim
poglavljima.

1.6. Klase, objekti i tipovi u C# jeziku

Svaki programski jezik sastoji se od niza kljunih rijei koje imaju svoje unaprijed
odreeno znaenje i mogu se koristiti za pisanje naredbi programa. Osim koritenja ugraenih
kljunih rijei, u naredbama koristimo i proizvoljne nazive za klase, objekte, metode i
varijable. Do sada smo u primjerima uvijek koristili klase koje su ve ugraene u razvojni
alat Visual Studio 2008 (npr. klasa Form koja je oznaavala formu u Windows aplikaciji).
Meutim, u aplikaciji programeri esto trebaju kreirati vlastite klase po potrebi. Kako kreirati
vlastite klase? Za odgovor na to pitanje, potrebno je razumjeti osnovne koncepte objektnog
programiranja to su tipovi, klase, instance, objekti.

Bit objektnog programiranja je kreiranje novih tipova. Tip predstavlja neku stvar (eng.
thing). Ponekad je stvar abstraktna (npr. tablica), a ponekad je vrlo konkretna (npr. dugme u
nekom prozoru). Tip definira opa svojstva i ponaanje neke stvari. Npr. dugme (kontrola
button) je jedan tip objekta. OK je jedna instanca dugmeta, Cancel je jedna instanca dugmeta,
Help je jedna instanca dugmeta. Sva ova tri objekta su tipa button (sve su to dugmadi).

Ako smo kreirali tri dugmeta (OK, Cancel i Help), sva tri nasljeuju svojstva koja ima
tip button: svojstvo visine, irine, text koji e pisati na dugmetu, poloaj dugmeta na formi i
druga svojstva zajednika svim instancama koje pripadaju tipu button. Ta se karakteristika
objektnog programiranja zove NASLJEIVANJE. NASLJEIVANJE je mogunost da
instance preuzimaju sva svojstva tipa kojem pripadaju.

U C# jeziku se koriste ova 4 razliita tipa:

1. Klase, pri emu se instance klase zovu objekti


2. Enumeracije (eng. enums)
3. Strukture (eng. structs)
4. Delegati (eng. delegates)

Klase se najee koriste, pa e biti detaljnije objanjene u nastavku. KLASA je neki tip
promatranih objekata. Klasa je adekvatna skupini ili vrsti kod biolokih bia, npr. skupina
pasa, maaka, studenata, radnika, artikala, itd. Objekt je instanca neke klase.

Primjeri:

1. Pas = klasa Rex = instanca klase Pas (konkretan pas iz klase Pas)
2. Student = klasa Pero Peri = instanca klase Student
3. Button = klasa OK button koji napravimo u aplikaciji = instanca klase button
Kada kreiramo neku vlastitu klasu, potrebno je definirati:

1. njezina svojstva (properties) ili varijable kojima e dodjeljivati vrijednosti (ako se radi
o javnim svojstvima, tada se koristi izraz svojstvo (eng. property), a ako se radi o
privatnim varijablama koje e se koristiti samo u toj klasi, tada govorimo koristimo
izraz varijabla
2. metode koje odreuju njezino ponaanje. Naredba za kreiranje nove klase poinje
kljunom rijei class, zatim dolazi naziv klase, zatim deklaracija svojstava
(properties) koja se definiraju za tu klasu, te metode koje pripadaju klasi.

Npr. ovako bismo kreirali vlastitu klasu:

class mojaKlasa {
//ovdje definicija svojstava ili varijabli, npr. int mojaVarijabla;
}

Gornjim naredbama kreirali smo klasu pod nazivom mojaKlasa, i njoj pripadajuu
cjelobrojnu varijablu pod nazivom mojaVarijabla kojoj e se unutar klase mojaKlasa moi
dodjeljivati vrijednosti. Npr. sljedeim naredbama definira se klasa ili skupina objekata
Student, a unutar nje metoda pod nazivom Main(). Main() je glavna metoda za neki program,
a nalazi se u datoteci Program.cs u okviru Solution Explorer-a. U metodi Main() se definira
instanca klase.

class Student {
// ovdje definiramo svojstva koja pripadaju toj klasi:
int Ocjena;
// ovdje definiramo metodu:
public void Main() {
Student Pero = new Student();
Pero.Ocjena= 3;
}
}

Kreirali smo instancu Pero koja pripada klasi Student, varijabli Ocjena koja pripada
instanci Pero dodjelili smo vrijednost 3. Naredba kojom se definira instanca neke klase
izgleda ovako: (npr. za kreiranje instance Pero klase Student).

Student Pero = new Student();

Naredba sadri na kraju zagrade (), pa izgleda kao da poziva metodu. Zapravo, pri
kreiranju nove instance poziva se jedna metoda koja se zove konstruktor (eng. constructor).
Zadatak konstruktora je kreirati instancu (objekt) neke klase i omoguiti da se toj instanci
dodijeli vrijednost kasnije u programu. Nakon to se konstruktorom kreira nova instanca, u
memoriji se ostavlja prostor za vrijednosnu instancu. Ako ne specificiramo koji konstruktor
pozivamo, CLR poziva standardni (default) konstruktor kojim se definira nova instanca klase
i ne prosljeuju mu se nikakve vrijednosti. Zato u zagradama kod ovog standardnog
konstruktora ne piemo nita. Ukoliko se eli koristiti neki vlastiti odreeni konstruktor, tada
se on mora deklarirati u programu prije samog koritenja.
Primjer: deklariranje konstruktora koji e ispisivati sistemsko vrijeme

Time(System.DateTime dt) {
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}

Deklaracija konstruktora je javna (public) iz razloga da bi se mogao koristiti u svim


metodama. On e konstruirati instance klase Time, a prosljeuje mu se varijabla dt koja je
tipa System.DateTime. Kako bi ovaj primjer radio, potrebno je prije koritenja konstruktora i
deklarirati i dodijeliti vrijednosti za varijable Year, Month, Date, Hour, Minute, Second.

Nakon deklaracije konstruktora, u nekoj metodi, npr. Main() moe se koristiti


deklarirani konstruktor da bi kreirao novu instancu klase Time. Deklarirani konstruktor koristi
se u klasi Tester, u metodi Main():

public class Tester {


static void Main( ) {
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t.DisplayCurrentTime( );
}
}

Metoda je neka funkcija koja se nalazi unutar klase. Ona je lan (eng. member) klase.
Metode definiraju to klase rade i kako se klase ponaaju. Metodama koje sami kreiramo
moemo dati proizvoljne naziv, npr. Ispis(), Racunanje(), itd. Ako elimo napisati odgovor
na dogaaj klik mia na neku kontrolu (button ili dr.), dvostrukim klikom mia program e
kreirati metodu i dati joj standardni naziv, npr. button1Click(). U svakoj aplikaciji postoji
prva, glavna metoda iz koje se pozivaju sve ostale metode te aplikacije. Ta se metoda zove
Main(). Otvorite u Visual Studio 2008 novi projekt (Windows aplikaciju) i dajte joj ime
RadSaKlasama. U Solution Explorer prozoru kliknite na Program.cs. Pojaviti e se
programski kod za glavni program aplikacije koji poziva sve metode te aplikacije. Glavni
program aplikacije izgleda ovako:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace RadSaKlasama
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

Unutar prostora za nazive (namespace-a) RadSaKlasama kreira se klasa Program,


unutar te klase se defira metoda Main(). Metoda Main() se automatski poziva od strane CLR-a
(Common Language Runtime-a) prilikom izvravanja programa. Za nas vana naredba u
metodi Main() je ona koja pokree aplikaciju, i otvara prvu formu aplikacije. To je naredba:

Application.Run(new Form1());

Gornjom naredbom pokree se aplikacija otvaranjem prve forme Form1. Kada se


kreira neka metoda, ona takoer ima svoju deklaraciju. U deklaraciji se definira tip podatka
koji e metoda vraati, zatim naziv metode i u zagradi parametre koji e se prosljeivati
metodi. Npr. ovako:

Int myMethod(int velicina);

Neke metode uope ne vraaju nikakve vrijednosti. Takve metode samo neto izvode,
i tada je tip metode void, a u zagradi se ne pie nita, npr. ovako:

void myVoidMethod( );

Ovdje se odreuje da e metoda nakon izvravanja vraati cjelobrojnu vrijednost.


Naziv metode je myMethod (moe biti proizvoljan). U C# se prilikom koritenja metode
uvijek mora deklarirati tip koji metoda vraa ili napisati kljunu rije void ako metoda ne
vraa nikakvu vrijednost. Npr. do sada smo u primjerima koristili metode koje ne vraaju
vrijednosti, ali su bile standardne metode za klik mia na neko dugme, pa su njihove
deklaracije izgledale ovako:

private void button1Click(object sender, EventArgs e) ;

private znai da se metoda koristi samo unutar jedne klase u kojoj je deklarirana, void
znai da metoda ne vraa nikakvu vrijednost, button1Click je naziv metode. Metodi se u
zagradi prosljeuju parametri koji su standardni za neku click metodu.

Komentari se u programski kod umeu zbog vie razloga: Kako bi olakali programeru
snalaenje u kodu (zbog moguih kasnijih ispravki), te kako bi omoguili izradu adekvatne
programske dokumentacije. Postoji tri osnovna naina upotrebe komentara:

1. C++ stil: // ovo je C++ stil pisanja komentara i vrijedi do kraja // jedne linije
2. C stil: /* ovo je C stil pisanja komentara. Komentar se moe pisati kroz vie linija a
vrijedi do znaka */
3. Komentari za XML dokumente

Operator . koristi se za pristup metodi ili svojstvu unutar neke klase, te kako bi ograniio
naziv klase na odreeni prostor za nazive (namespace), npr. u naredbi:

using System.Windows.Forms;

koristi se prostor za nazive System, u njemu podprostor Windows, a u njemu podprostor


Forms.

Primjer:

Student.Pero.Visina=175;

koristi instancu Pero klase Student, i njegovom svojstvu Visina dodjeljuje vrijednost 175.

Koritenje statinih lanova

Pri koritenju metode Main() vidjeli smo da naredba sadri kljunu rije static:

static void Main()

Rije static znai da se ta metoda moe pozvati samostalno bez prethodnog pozivanja
klase. Moete je koristiti bez da u ruci imate instancu te klase. Svojstva i metode neke klase
mogu biti instance ili statini lanovi. Ako su instance, moraju se pozivati preko operatora ''.''
tako da se najprije navede klasa kojoj pripadaju, npr. ako definiramo klasu Student, i u okviru
nje instancu Pero, a zatim neku metodu Upisi() (kojom e se studenti upisivati na fakultet),
tada se ta metoda poziva:

a) ako prethodno nije definirana kao statina: Student.Pero.Upisi();


b) ako je prethodno definirana kao statina: Student.Upisi();

Kljuna rije this odnosi se na trenutnu instancu neke klase (ili drugog objekta). this
je skriveni pokaziva (pointer) na svaku nestatinu metodu neke klase. Postoje 3 naina
upotrebe this:

1. nain: U svrhu kvalificiranja instance ako se ona zove isto kao i parametar koji se
prosljeuje nekoj metodi, pa tada this omoguava da se odredi na koju se vrijednost misli:

public void SomeMethod (int hour) {


this.hour = hour;
}

Ovoj metodi se prosljeuje cjelobrojni parametar hour. Meutim, u metodi se koristi i


instanca (ili svojstvo) hour kojoj treba dodijeliti vrijednost proslijeenog parametra. This
odreuje da se na lijevoj strani jednakosti misli na instancu hour koja pripada aktualnoj klasi.
2. nain: U svrhu prosljeivanja trenutno aktivnog objekta kao parametra drugoj metodi.

public void FirstMethod(OtherClass otherObject) {


otherObject.SecondMethod(this);
}

Ovaj primjer uspostavlja dvije klase, jedna je klasa koja ima metodu FirstMethod(), a druga
je klasa OtherClass koja ima metodu SecondMethod(). Ako unutar prve metode elimo
pozvati metodu koja pripada drugoj klasi, tada tu drugu metodu moramo pozvati iz te druge
klase. Tu klasu ne moemo koristiti pod njezinim nazivom, nego moramo proslijediti
parametar varijablu koja je tipa OtherClass.

3. nain: koritenjem indeksera. Primjer ako this koristimo u svrhu odreivanja ije svojstvo
(property) e se koristiti:

label4.Text = this.ImePrezimeStudenta;

Gornjom naredbom u tekstu labele label4 e se ispisati vrijednost svojstva


ImePrezimeStudenta koje pripada aktualnoj klasi (u kojoj se nalazi ta metoda i naredba).

textBox1.Text = this.Ocjena;

Gornjom naredbom u tekstu textBox1 e se ispisati vrijednost svojstva Ocjena koje pripada
aktualnoj klasi (u kojoj se nalazi ta metoda i naredba).

Primjer klase Tocka:

class tocka
{
public int x;
public int y;
}

class tockaApp
{
public static void Main()
{
tocka starting = new tocka();
tocka ending = new tocka();
starting.x = 1;
starting.y = 4;
ending.x = 10;
ending.y = 11;
System.Console.WriteLine("Tocka 1: ({0},{1})", starting.x, starting.y);
System.Console.WriteLine("Tocka 2: ({0},{1})", ending.x, ending.y);
}
}
Rekli smo da su prednosti objektno orijentiranog programiranja mogunost kontrole
pristupa podacima.U gornjem primjeru koristili smo javni pristup varijablama i pristup je
dozvoljen iz bilo kojeg dijela programa. No mi elimo imati kontrolu nad pristupom
varijablama i drati ih pod private pristupom. C# stoga ima koncept zvan svojstva
(properties) koja omoguavaju pristup privatnim lanovima i koja emo kasnije jo detljanije
objasniti.

Primjer svojstva za klasu Tocka:

class tocka
{
int privatni_x; //private
int privatni_y; //private
public int x
{
get
{
return privatni_x;
}
set
{
privatni_x = value;
}
}
public int y
{
get {
return privatni_y;
}
set {
privatni_y = value;
}
}

class tockaApp
{
public static void Main()
{
tocka starting = new tocka();
tocka ending = new tocka();
starting.x = 1;
starting.y = 4;
ending.x = 10;
ending.y = 11;
System.Console.WriteLine("Tocka 1: ({0},{1})", starting.x, starting.y);
System.Console.WriteLine("Tocka 2: ({0},{1})", ending.x, ending.y);
}
}
U gornjem primjeru smo napravili dva svojstva public int x i public int y. Oni sada
omoguuju pristup varijablama x i y koje su sada pod kljunom rijei private. Unutar
svojstava set naredba se izvrava uvijek kada postavljamo vrijednost privatnim varijablama, a
get naredba kada itamo vrijednost varijabli. U slijedeem primjeru:

x=13;

poziva se svojstvo i izvrava se kod unutar set naredbe i postavlja vrijednost varijable
privatni_x na 13.

Primjer klase sa metodama:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sharp
{
class Krug
{
public int x;
public int y;
public double radius;
public double area()
{
double theArea;
theArea = 3.14159 * radius * radius;
return theArea;
}
public double radijus()
{
double theCirc;
theCirc = 2 * 3.14159 * radius;
return theCirc;
}
}
class KrugApp
{
public static void Main()
{
Krug prvi = new Krug();
Krug drugi = new Krug();
double area;
double circ;
prvi.x = 10;
prvi.y = 14;
prvi.radius = 3;
drugi.x = 10;
drugi.y = 11;
drugi.radius = 4;
System.Console.WriteLine("Krug 1: Centar = ({0},{1})",
prvi.x, prvi.y);
System.Console.WriteLine(" Radius = {0}", prvi.radius);
System.Console.WriteLine(" Area = {0}", prvi.area());
System.Console.WriteLine(" Circum = {0}", prvi.radijus());
area = drugi.area();
circ = drugi.radijus();
System.Console.WriteLine("\nKrug 2: Centar = ({0},{1})",
drugi.x, drugi.y);
System.Console.WriteLine(" Radius = {0}", drugi.radius);
System.Console.WriteLine(" Area = {0}", area);
System.Console.WriteLine(" Circum = {0}", circ);
}
}
}

Rezultat:

Krug 1:
Centar = (10,14)
Radius = 3
Area = 28.27431
Circum = 18.84954
Krug 2:
Centar = (10,11)
Radius = 4
Area = 50.26544
Circum = 25.13272

Primjer konstruktora i destruktora:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sharp
{
public class test
{
static public int sctr = 0;
public int ctr = 0;
public void routine()
{
Console.WriteLine("In the routine - ctr = {0} / sctr = {1}", ctr, sctr);
}
public test()
{
ctr++;
sctr++;
Console.WriteLine("In Constructor");
}
~test()
{
Console.WriteLine("In Destructor");
}
}
class TestApp
{
public static void Main()
{
Console.WriteLine("Start of Main method");
test first = new test();
test second = new test();
first.routine();
test third = new test();
third.routine();
second.routine();
Console.WriteLine("End of Main method");
}
}
}

Rezultat:

Start of Main method


In Constructor
In Constructor
In the routine - ctr = 1 / sctr = 2
In Constructor
In the routine - ctr = 1 / sctr = 3
In the routine - ctr = 1 / sctr = 3
End of Main method
In Destructor
In Destructor
In Destructor
1.7. Nasljeivanje

Ranije smo ve objasnili to je to nasljeivanje, a sada emo dati primjer nasljeivanja.

Primjer:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sharp
{
class Osoba
{
protected string Ime;
protected string Nadimak;
protected string Prezime;
private int godine;

public Osoba()
{
}
public Osoba(string fn, string ln)
{
Ime = fn;
Prezime = ln;
}
public Osoba(string fn, string mn, string ln)
{
Ime = fn;
Nadimak = mn;
Prezime = ln;
}
public Osoba(string fn, string mn, string ln, int a)
{
Ime = fn;
Nadimak = mn;
Prezime = ln;
godine = a;
}
public void displaygodine()
{
Console.WriteLine("godine {0}", godine);
}
public void displayFullName()
{
StringBuilder FullName = new StringBuilder();
FullName.Append(Ime);
FullName.Append(" ");
if (Nadimak != "")
{
FullName.Append(Nadimak[0]);
FullName.Append(". ");
}
FullName.Append(Prezime);
Console.WriteLine(FullName);
}
}

class Zaposlenik : Osoba


{
private ushort gZapsolenja;
public ushort godinaZaposlenja
{
get { return (gZapsolenja); }
set { gZapsolenja = value; }
}
public Zaposlenik()
: base()
{
}
public Zaposlenik(string fn, string ln)
: base(fn, ln)
{
}
public Zaposlenik(string fn, string mn, string ln, int a) :
base(fn, mn, ln, a)
{
}
public Zaposlenik(string fn, string ln, ushort hy)
: base(fn, ln)
{
godinaZaposlenja = hy;
}
public new void displayFullName()
{
Console.WriteLine("Zaposlenik: {0} {1} {2}",
Ime, Nadimak, Prezime);
}
}

class NameApp
{
public static void Main()
{
Osoba myWife = new Osoba("Melissa", "Anne", "Jones", 21);
Zaposlenik me = new Zaposlenik("Bradley", "L.", "Jones", 23);
Zaposlenik you = new Zaposlenik("Kyle", "Rinni", 2000);
myWife.displayFullName();
myWife.displaygodine();
me.displayFullName();
Console.WriteLine("Godina Zaposlenja: {0}", me.godinaZaposlenja);
me.displaygodine();
you.displayFullName();
Console.WriteLine("Zaposleni ste: {0}", you.godinaZaposlenja);
you.displaygodine();
}
}

Rezultat:

Melissa A. Jones
godine 21
Zaposlenik: Bradley L. Jones
Godina zaposlenja: 0
Age 23
Zaposlenik: Kyle Rinni
Zaposleni ste: 2000
godine 0

Primjer polimorfizma:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sharp
{
class Osoba
{
protected string Ime;
protected string Prezime;
public Osoba()
{
}
public Osoba(string fn, string ln)
{
Ime = fn;
Prezime = ln;
}
public void displayFullName()
{
Console.WriteLine("{0} {1}", Ime, Prezime);
}
}
class Zaposlenik : Osoba
{
public ushort gZaposlenja;
public Zaposlenik()
: base()
{
}
public Zaposlenik(string fn, string ln)
: base(fn, ln)
{
}
public Zaposlenik(string fn, string ln, ushort hy)
: base(fn, ln)
{
gZaposlenja = hy;
}
public new void displayFullName()
{
Console.WriteLine("Zaposlenik: {0} {1}", Ime, Prezime);
}
}
class NameApp
{
public static void Main()
{
Zaposlenik radnik = new Zaposlenik("Bradley", "Jones", 1983);
Osoba Brad = radnik;
radnik.displayFullName();
Console.WriteLine("Zaposlen godine: {0}", radnik.gZaposlenja);
Brad.displayFullName();
}
}

U gonjrem primjeru smo stvorili instancu klase Zaposlenik sa imenom radnik. Nakon toga
smo stvorili referencu na klasu Osoba sa imenom Brad i pridjelili mu adresu instance radnik.
Nakon toga pozivamo metodu za ispis imena na dva naina. Prvi put pozivamo je preko
objekta radnik i poziva se metoda koja pripada klasi Zaposlenik, no u drugom sluaju poziva
se preko reference na klasu Osoba i pozvat e se metoda iz klase Osoba iako objekt pripada
klasi Zaposlenik. Ako elimo da se pozove metoda klase kojoj pripada objekt, a ne referenca
metodu moramo proglasiti virtualnom.

Rezultat:

Zaposlenik: Bradley Jones


Zaposlen godine: 1983
Bradley Jones
Primjer virtualne metode:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sharp
{
class Osoba
{
protected string ime;
protected string prezime;
public Osoba()
{
}
public Osoba(string fn, string ln)
{
ime = fn;
prezime = ln;
}
public virtual void displayFullName()
{
Console.WriteLine("{0} {1}", ime, prezime);
}
}
class Zaposlenik : Osoba
{
public ushort gZaposlenja;
public Zaposlenik()
: base()
{
}
public Zaposlenik(string fn, string ln, ushort hy)
: base(fn, ln)
{
gZaposlenja = hy;
}
public override void displayFullName()
{
Console.WriteLine("Zaposlenik: {0} {1}", ime, prezime);
}
}
// Klasa Poslodavac nasljeuje klasu Osoba...
class Poslodavac : Osoba
{
public string tvrtka;
public Poslodavac()
: base()
{
}
public Poslodavac(string fn, string ln, string c)
: base(fn, ln)
{
tvrtka = c;
}
public override void displayFullName()
{
Console.WriteLine("Poslodavac: {0} {1}", ime, prezime);
}
}
class NameApp
{
public static void Main()
{
Osoba Brad = new Osoba("Bradley", "Jones");
Osoba me = new Zaposlenik("Bradley", "Jones", 1983);
Osoba Greg = new Poslodavac("Hill", "Batfield", "Data Diggers");
Brad.displayFullName();
me.displayFullName();
Greg.displayFullName();
}
}
}

Rezultat:

Bradley Jones
Zaposlenik: Bradley Jones
Poslodavac: Hill Batfield

U gornjem primjeru metoda displayFullName je virtualna i iako svaki njen poziv ide preko
reference na klasu Osoba poziva se metoda iz klase kojoj pripada objekt na koji pokazuje
referenca.
1.8. Nizovi, liste i kolekcije

U .NET-u postoji vie naina kako pohraniti vie objekata u jednu kolekciju (ili skup)
objekata. Neki od tih naina su: Nizovi (Arrays), Liste (List ili ArrayList), Kolekcije
(Collection). Koriste se kada elimo npr. imena ili plae vie djelatnika pohraniti u jedan
zajedniki skup objekata i s tim skupom rukovati u aplikaciji (npr. sortirati, mijenjati
vrijednosti, brisati, prikazivati, i dr.). Taj skup objekata je indeksiran, tj. za svaki objekt u tom
skupu poznat je njegov poloaj (koji je on po redu u tom skupu). Indeksi kreu od vrijednosti
0 nadalje, npr. Djelatnik [0] Djelatnik [1] Djelatnik [2] . Itd. Klase koje su raspoloive za
skupove objekata u .NET-u su: Array, ArrayList, NameValueCollection, StringCollection,
Queue, Stack, and BitArray.

Nizovi

Niz (eng. array) je indeksirani skup objekata koji su istog tipa. Vrste nizova:
jednodimenzionalni, viedimenzionalni i ugnjedeni (tj. nizovi niza). S obzirom da su u C#-u
lanovi niza objekti, oni mogu imati svoja svojstva i metode. Kada se deklarira neki niz u
C#-u, automatski se kreira objekt u ugraenoj klasi System.Array (da Vaa aplikacija koristi
ovu klasu moete vidjeti u naredbi Using na poetku svoje aplikacije Using System.Array).
Automatski su na raspolaganju ugraene metode koje vrijede za ovu klasu, a neke od njih su:
Clear(), Copy(), Sort(), IndexOf() i dr. iji puni popis moete pronai u (Liberty,
Programming C#, OReilly, 2006).

Za deklariranje niza potrebno je upisati naredbu ija je opa sintaksa:

type[ ] naziv-niza;

type oznaava tip niza, npr. string, int, double i dr. naziv-niza proizvoljni naziv niza. Na
primjer:
string[] imeStudenta;
Int[] ocjenaStudenta;
Double[] prosjOcjena;

Da bismo kreirali instancu niza (tj. ostavili prostor u memoriji za odreeni broj lanova tog
odreenog niza) potrebno je upisati ovakvu narebu: naziv-niza = new type[dimenzijaniza];

Npr. imeStudenta = new string[5];

Ovime smo otvorili u memoriji prostor za niz koji e se zvati imeStudenta, a


sadravat e 5 elemenata niza, koji e biti tipa string (tekstualnog), tj. u ovaj niz moi emo
upisati imena za 5 studenata (indeks niza kree od 0,1,2,3,4), dakle za imeStudenta[0],
imeStudenta[1],imeStudenta[4]. Nakon deklaracije, elementi niza kao standardne
vrijednosti automatski dobivaju: 0, ako je niz numerikog tipa (int ili double), Null, ako je
niz tipa reference koji pokazuje na neki objekt, npr. Button ili Form ili dr.

Npr.ako deklariramo niz: ocjena = new int[3];

U memoriji e se ostaviti prostor za 3 ocjene, ocjena[0], ocjena[1], ocjena[2], a svaka e imati


poetnu vrijednost 0, tj. ocjena[0]=0, ocjena[1]=0, ocjena[2]=0. 2
Nizove se preporua koristiti kada elite kreirati poznati broj objekata istog tipa i
dodijeliti im neke vrijednosti kroz kod programa, npr. ako elite napraviti niz brojeva kojima
ete dodijeliti vrijednosti od 1 do npr. 100, ili npr. niz od 20 upanija, ili niz ocjena od 1 do 5 i
slino. Ne preporua se koristiti nizove ako: nije poznato koliko e elemenata niza biti,
vrijednosti niza treba unijeti korisnik kroz aplikaciju (preko textBox-ova ili dr.) ili upisivati u
bazu (u tom sluaju se preporua koristiti kolekcije).

Upotreba nizova bit e objanjenja kroz primjer Nizovi. Otvorite novi projekt pod
nazivom Nizovi. Ccilj nam je kreirati u programskom kodu niz i taj niz ispisati u labelu na
formi. Liste i kolekcije emo dodati kasnije, pa zasad napravite samo label ''Rad s nizovim''
i dugme ''Ispii niz''.

Klinite na dugme ''Ispii niz'' i u metodi button1Click() deklarirat emo niz od 5 elemenata
koji e sadravati imena studenata, pa e biti tipa string. Deklarirati niz i dodijeliti mu
vrijednosti mogue je na vie naina:

1. nain: Ako bismo htjeli pojedinano dodjeljivati vrijednosti za imena studenata, tada
bismo u posebnoj naredbi deklarirali niz od 5 elemenata, a u posebnoj naredbi
dodijelili vrijednost prvom elementu, drugom, itd. ovako: imeStudenta = new
string[5]; imeStudenta[0] = "Marko"; imeStudenta[1] = Janko"; imeStudenta[2] =
Slavko"; imeStudenta[3] = Ante"; imeStudenta[4] = Andrija";
2. nain deklaracija niza i dodjela vrijednosti u jednoj liniji koda, ovako: string[]
imeStudenta = { "Marko", "Janko", "Slavko", "Ante", "Andrija" };

Za na primjer koristit emo drugi, krai nain, pa e naredbe u metodi button1clik()


izgledati ovako:

private void button1_Click(object sender, EventArgs e)


{
string[] imeStudenta = { "Marko", "Janko", "Slavko", "Ante", "Andrija" };
}

Osim to deklariramo niz i dodijelimo mu vrijednosti, potrebno je u toj metodi i ispisati


vrijednosti elemenata niza u labeli. Ako elimo ispisati samo jedan element niza, npr. ime
prvog studenta, napisali bismo ovakvu naredbu:

label2.Text = imeStudenta[0];

Rezultat ove naredbe bi bio ispisan tekst: Marko.

S obzirom da elemenata niza ima vie, da bismo ih sve ispisali, potrebna je petlja iteracije.
Ispis elemenata niza u petlji for i foreach. Petlja for izgledala bi ovako:

for (int i = 0; i <= 4; i++) { label2.Text += imeStudenta[i] + \n; }

Znak += stavlja se kako bi u labelu uvijek ispisivala nova vrijednost kao dodatak staroj, a
ne samo zadnja. Znak \n oznaava prijelaz u novi red nakon svake vrijednosti. Petlja
foreach izgledala bi ovako:

foreach (string ime in imeStudenta) { label2.Text += ime + \n; }


U petlji foreach uvodi se nova varijabla ime tipa string koja e preuzeti pojedinane elemente
niza. Sortiranje i ispis elemenata niza Za na primjer koristit emo petlju foreach. Prije ispisa
u labelu, sortirat emo elemente niza po abecednom redosljedu, i to s pomou naredbe:

Array.Sort(nazivniza);

pa e cijela metoda izgledati ovako:

private void button1_Click(object sender, EventArgs e)


{
string[] imeStudenta = { "Marko", "Janko", "Slavko", "Ante", "Andrija" };
Array.Sort(imeStudenta);
foreach (string ime in imeStudenta) {
label2.Text += ime + "\n";
}
}

Pohranite i debug-irajte aplikaciju. Kada kliknemo na dugme ''Ispii niz'' pojavit e sljedei
rezultat ispisa (imena e biti sortirana po abecedi):

Osim sortiranja, na nizovima se mogu primijeniti i druge metode, o kojima vie pogledajte u
(Liberty, Programming C#, OReilly, 2006).

Ako bismo niz htjeli popuniti brojanim vrijednostima, tada se to moe napraviti u petlji for,
npr. na sljedei nain:

for (int i = 0; i <= 4; i++) { imeStudenta[i] = i.ToString(); }

Kada bismo ispisali ovaj niz, rezultat bi bio: 0 1 2 3 4


Liste

Lista (eng. List) je skup objekata istog tipa koji se pohranjuju u zajedniki niz objekata
(ArrayList) i mogu se dodavati bez da unaprijed znamo dimenziju (broj elemenata) u nizu.
Pogodna je za upotrebu ako se vrijednosti objekata uitavaju od strane korisnika kroz formu
(npr. iz textBox-a). Sintaksa za deklaraciju liste:

List djelatnici = new List();

Npr. List imeStudenta = new List();

Ako se u deklariranu listu imeStudenta ele pohraniti vrijednosti koje korisnik unese u
textBox1, naredba je sljedea:

imeStudenta.Add(textBox1.Text);

Nastavit emo projekt pod nazivom Nizovi. Nakon rada s nizovima, drugi cilj nam je:
Kreirati listu pod nazivom studenti, dodjeljivati joj vrijednosti koje korisnik unese u textBox
i ispisati elemente liste Za te potrebe dodajte kontrole za rad s listama objekata prikazane na
slici:

S obzirom da listu studenti elimo koristiti u vie metoda nae forme, neemo je deklarirati
unutar jedne metode, nego za cijelu formu, tj. odmah ispod naredbi kojima se kreira klasa
forme upisat emo deklaraciju liste:

namespace Nizovi
{
public partial class Form1 : Form
{
List<string> studenti = new List<string>();
}
}
List je tipa string, jer e se u njezine elemente upisivati tekstualne vrijednosti za imena
studenata, ali se u aplikaciji mogu kreirati i liste raznih drugih tipova (int, double, button, itd.)
Dodjeljivanje vrijednosti liste napravit emo u metodi koja se aktivira na klik mia na dugme
''Pohrani u listu''.

elimo listu puniti vrijednostima koje korisnik unese u textBox1, tj. nakon to korisnik
unese ime studenta u textBox1 i klikne na tipku ''Pohrani u listu'', elimo u listu studenti
pohraniti unesenu vrijednost za novi element liste. Da bismo to uinili, potrebno je dvaput
kliknuti na dugme ''Pohrani u listu'' kako bismo isprogramirali odgovor na dogaaj. U metodi
button2click upisat emo sljedeu naredbu:

studenti.Add(textBox1.Text);

Ova naredba dodat e novi element liste i u njega pohraniti vrijednost iz textBoxa1.
Na listi je mogue koristiti ugraene metode koje mogu npr. dodati novi element liste (Add),
prebrojati koliko je elemenata uneseno u listu (Count), prikazati koliko elemenata stane u listu
(Capacity), obrisati listu (Clear) i dr. U metodi button1click osim dodavanja elementa liste,
prebrojat emo i koliko je elemenata liste dodano, te koliki je kapacitet liste. Te emo podatke
upisati u labele (label6 i label7).

Upotreba metoda Count i Capacity:

label5.Text = "Uneseno je " + studenti.Count + " imena";


label7.Text = "Kapacitet liste je " + studenti.Capacity;

Kapacitet liste se mijenja dinamiki ovisno o broju unesenih elemenata u listu. Najprije se u
memoriji otvara mjesta za 4 elementa, a ako se unese 4 elementa, ostavlja se 8 itd. kapacitet
se automatski poveava. Cijela metoda button2click() izgleda ovako:

private void button2_Click(object sender, EventArgs e)


{
studenti.Add(textBox1.Text);
label5.Text = "Uneseno je " + studenti.Count + " imena";
label7.Text = "Kapacitet liste je " + studenti.Capacity;
textBox1.Text = "";
}

Da bismo ispisali elemente liste, potrebno je dvaput kliknuti na dugme Ispii listu, kako
bismo se pozicionirali u metodu button3click(). U njoj treba ispisati elemente liste u petlji
iteracije foreach:

private void button3_Click(object sender, EventArgs e)


{
foreach (string student in studenti) {
label6.Text += student + "\n";
}
}
Pokrenite debug-iranje aplikacije. Unesite nekoliko vrijednosti u textBox1, nakon unosa
svake kliknite na tipku ''Pohrani u listu''. U label5 e biti ispisano koliko je elemenata liste
uneseno. Zatim kliknite na dugme ''Ispii listu''.

Prikazat e se rezultat kao na slici:

Kolekcije

Kolekcija (eng. collection) je generika klasa objekata koja se moe koristiti za


pohranjivanje i rukovanje skupom objekata istog tipa, a korespondira sa skupom klasa zvanim
CollectionBase. Sadri metode za dodavanje, uklanjanje elemenata, promjenu vrijednosti
elemenata i dr. Elementi kolekcije su takoer indeksirani, indeks im poinje od 0 nadalje.
Koriste se slino kao i liste. Za deklariranje kolekcije koristi se sintaksa:

Collection nazivkolekcije = new Collection();

Npr. ako elimo deklarirati kolekciju djelatnici, tada bismo upisali:

Collection djelatnici = new Collection();

Za dodavanje elemenata kolekciji koristi se metoda Add,

npr. ako bismo eljeli dodati 3 djelatnika u kolekciju, napisali bismo:

Djelatnici.Add(Marko Markovi);
Djelatnici.Add(Ivo Ivi);
Djelatnici.Add(Mara Mari) ;

Za brisanje nekog djelatnika iz liste napisali bismo:

Djelatnici.Remove(Marko Markovi);

Za brisanje cijele kolekcije napisali bismo:


Djelatnici.Clear();

Za ispis kolekcije na formu (npr. u labelu) koristi se petlja foreach na isti nain kao i kod
ispisa liste:

foreach (string djelatnik in djelatnici) { label2.Text += djelatnik + "\n"; }

Za prebrojavanje elemenata kolekcije koristi se (kao i kod liste) metoda Count, npr. ako u
labelu 5 elimo ispisati koliko je elemenata u nekoj kolekciji:

Label5.Text= Djelatnici.Count;

U Visual Studio 2008 otvorite novu aplikaciju, nazovite je Kolekcije, te na formu dodajte ove
kontrole kao na slici:

Cilj vjebe je kreirati kolekciju djelatnika koja e biti tipa klase djelatnika. Klasa
djelatnika e imajti svojstva: imeDjelatnika i placaDjelatnika. Tim svojstvima treba unositi
vrijednosti putem textBoxova u jednoj formi, a zatim u putem izbornika, napraviti izvjetaj u
drugoj formi (Form2).

Da bismo za nekog djelatnika vodili podatke o imenu i prezimenu i plai, potrebno je


kreirati vlastitu klasu koju emo nazvati Djelatnik. Klasa Djelatnik imat e dva svojstva:
imePrezime (tipa string), placa (tipa double). Klasu emo kreirati na sljedei nain:

Otvoriti unutar iste aplikacije u C#-u posebnu datoteku u koju emo upisati kod za kreiranje
klase. Ta klasa e se moi koristiti u cijeloj aplikaciji. U izborniku Project->Add New Item,
pa u prozoru za izbor objekata izaberite CodeFile (jer ne otvaramo novu formu, nego novu
datoteku za pisanje programskog koda). Kao naziv datoteke upiite Djelatnik.cs. U novu
praznu datoteku Djelatnik.cs upiite ove naredbe za kreiranje nove klase:
public class Djelatnik {
private string imePrezime;
public string ImePrezime {
get {
return imePrezime;
}
set {
imePrezime = value;
}
}
private double placa;
public double Placa {
get { return placa;
}
set {
placa = value;
}
}
public Djelatnik(string imePrezime, double placa) {
this.ImePrezime = imePrezime; this.Placa = placa;
}
}

U datoteci Djelatnik.cs sada imamo kreiranu klasu Djelatnik sa svojstvima. Da bismo mogli
tu klasu koristiti za vie djelatnika, kreirat emo kolekciju klasa, i to kao svojstvo, jer je
elimo prenositi kroz vie formi iste aplikacije: Ta e kolekcija sadravati skup unesenih
djelatnika, dakle ona e biti tipa Djelatnik. Budui da je treba koristiti u vie metoda i vie
formi, kreirat emo je za cijelu formu Form1 kao svojstvo (kasnije i u Form2), tako da u
Form1.cs, odmah ispod deklaracije klase Form1 upiemo deklaraciju za kolekciju:

public partial class Form1 : Form


{
private Collection<Djelatnik> _djelatnici = new Collection<Djelatnik>();
public Collection<Djelatnik> Djelatnici
{
get { return _djelatnici; }
set { _djelatnici = value; }
}

Napomena treba ukljuiti i naredbu: using System.Collections.Generic;

Da bismo u tako deklarirana svojstva unijeli vrijednosti koje korisnik unese u TextBox-ove,
dvaput emo kliknuti na dugme ''Pohrani'' i u metodi button1click() upisati naredbe za unos
vrijednosti u klasu Djelatnik. Za te potrebe, moramo kreirati instancu klase djelatnik, nazvat
emo je d, i ta instanca moe poprimiti vrijednosti unesene u textBox-ove, tako ih da ih
proslijedimo u zagradi. Naredbe izgledaju ovako:

private void button1_Click(object sender, EventArgs e)


{
Djelatnik d = new Djelatnik(textBox1.Text, Convert.ToDouble(textBox2.Text));
Djelatnici.Add(d);
Label4.Text = "Uneseno je " + Djelatnici.Count + " djelatnika.";
textBox1.Text = "";
}

Kreira se instanca d klase Djelatnik, i njoj se prosljeuju u zagradi vrijednosti unesene


u textBox1 i textBox2. Vrijednost iz textBox1 e se pohraniti u svojstvo imePrezime, a iz
textBox2 u svojstvo placa.

S obzirom da izvjetaj elimo ispisati u drugoj formi, kreirat emo u istoj aplikaciji
formu Form2, i iz Form1 dvaput kliknuti na izbornik Izvjetaji/Ispis plaa da bismo doli u
metodu u kojoj treba upisati naredbe za kreiranje nove instance forme 2 (nazvat emo je
''Izvjetaji'', i proslijediti joj vrijednosti iz kolekcije Djelatnici ovako:

private void ispisPlaaToolStripMenuItem_Click(object sender, EventArgs e)


{
Form2 izvjestaji = new Form2();
izvjestaji.Djelatnici = this.Djelatnici;
izvjestaji.Show();
}

Ispis izvjetaja u Form2. U Form2 najprije emo dodati kontrole labela za ispis podataka, kao
na slici:

elimo da se prilikom uitavanje forme 2, u label3 i label5 upisuju podaci o imenu i


prezimenu i plai djelatnika. Dvaput kliknite na neko prazno mjesto na formi 2 i
programskom kodu treba upisati naredbe koje slijede. Najprije na vrhu forme2, prije svih
metoda, na poetku klase Form2 treba deklarirati kolekciju:

public partial class Form2 : Form


{
private Collection<Djelatnik> _djelatnici;
public Collection<Djelatnik> Djelatnici
{
get { return _djelatnici; }
set { _djelatnici = value; }
}

Nakon toga, u metodi Form2Load() treba upisati sljedee naredbe za ispis svojstava svih
djelatnika iz kolekcije. U petlji foreach se za svakog djelatnika u kolekciji Djelatnici ispisuju
podaci. Prije petlje dobro je isprazniti tekst u labelama, kako se ne bi vidjele na ekranu oznake
label3 i label5:

private void Form2_Load_1(object sender, EventArgs e){


label3.Text = "";
label5.Text = "";
foreach (Djelatnik djelatnik in this.Djelatnici) {
label3.Text += djelatnik.ImePrezime + "\n";
label5.Text += djelatnik.Placa.ToString("c") + "\n";
}
}

Pri tome je: Djelatnik = tip (klasa koju smo deklarirali u posebnoj .cs datoteci).

djelatnik = instanca tipa Djelatnik.


Djelatnici = kolekcija koja je deklarirana kao svojstvo forme

Pohranite aplikaciju i pokrenite debug. U prvoj formi u textBox-ove upiite podatke za 3


djelatnika (svaki put kliknite na dugme ''Pohrani''). Zatim kliknite na izbornik ''Izvjetaji'' i
''Ispis plaa''. Na ekranu e se pojaviti druga forma, s ispisom kao na slici:

Zakljuak: Ako elimo vie objekata pohraniti u jedan zajedniki skup objekata, gdje e
objekti biti indeksirani, koristit emo ili nizove, ili liste ili kolekcije. Nizove, liste i kolekcije
najprije treba deklarirati, a zatim im dodijeliti vrijednosti. Ako se vrijednosti liste ili kolekcije
uitavaju iz forme, vrijednosti se pohranjuju s pomou petlje foreach u kojoj se deklarira neka
instanca koja predstavlja element te liste ili kolekcije. Ako elimo elemente liste ili kolekcije
koristiti kroz vie formi neke aplikacije, potrebno je: U posebnoj datoteci te aplikacije kreirati
vlastitu klasu objekata (npr. Djelatnik). U svakoj formi aplikacije deklarirati svojstva koja su
tipa kolekcije klase. U metodi koja treba ispisati ili uitati vrijednosti svojstvima koristiti
petlju foreach u kojoj se deklarira instanca klase.

You might also like