1.5. rad s formama i izbornicima u aplikacijilukic/oop/auditorne_vježbe_6.pdf• dizajn forme (eng....

32
Objektno orijentirano programiranje Auditorne vježbe Elektrotehnički fakultet Osijek Kneza Trpimira 2b 31000 Osijek www.etfos.hr 1.5. Rad s formama i izbornicima u aplikaciji U ovom poglavlju naučiti ćete koji su osnovni standardi za kreiranje sučelja 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 sučelja mogu se koristiti ove dvije vrste formi: 1. SDI forme (eng. single document interface) su forme za sučelje s pojedinačnim 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 sučelja 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 sučelja svaka forma može se micati samostalno neovisno o ostalim formama. Da bi Windows aplikacija bila efikasnija i ugodna za upotrebu korisniku, potrebno je držati 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 položaju dugmadi (npr. dugme za povratak na prethodni ekran stalno na istom mjestu). Konzistentno koristiti izbornike i alate sa sličicama (koristiti iste izbornike i sličice na svim formama, i po mogućnosti one koji su standardni za većinu Windows aplikacija, npr. File, Edit, View, Window, Help). Upotrijebiti pravu kontrolu za prave svrhe (u izboru kontrola koje dodajemo na formu paziti da budu logične kako bi korisniku olakšale unos podataka i rukovanje aplikacijom, npr. ako korisnik treba unijeti podatak za koji postoje unaprijed utvrđene moguće vrijednosti, koristiti ComboBox ili ListBox umjesto textBox-a za unos) . Svojstva forme: U Visual Studio 2008 svojstva forme prikazuju se u prozoru Properties kada mišem označimo formu. Svojstva se mogu podijeliti u 9 kategorija. Kategorije će se prikazati u prozoru Properties ako kliknemo mišem na dugme Categorized ispod naziva forme u tom prozoru. Dugme Categorized prikazuje svojstva grupirana u kategorije, također postoji dugme koje prikazuje svojstva po abecedi. Neke od kategorija svojstava koje ćemo kroz vježbe i zadatke koristiti su: Izgled (eng. Appearance) – podešavanje postavki prikaza kao npr. boje pozadine, širine, visine, pokazivača i dr.). Ponašanje (eng. Behavior) – podešavanje ponašanja forme, npr. da li će forma biti omogućena (svojstvo Enabled).

Upload: others

Post on 11-Feb-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Objektno orijentirano programiranje

Auditorne vježbe

Elektrotehnički fakultet

OsijekKneza Trpimira 2b

31000 Osijek

www.etfos.hr

1.5. Rad s formama i izbornicima u aplikaciji

U ovom poglavlju naučiti ćete koji su osnovni standardi za kreiranje sučelja 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 sučelja mogu se koristiti ove dvije vrste formi:

1. SDI forme (eng. single document interface) su forme za sučelje s pojedinačnim 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 sučelja 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 sučelja svaka forma može se micati samostalno neovisno o ostalim formama. Da

bi Windows aplikacija bila efikasnija i ugodna za upotrebu korisniku, potrebno je držati 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 položaju dugmadi (npr. dugme za povratak na prethodni ekran stalno na istom mjestu). Konzistentno koristiti izbornike i alate sa sličicama (koristiti iste izbornike i sličice na svim formama, i po mogućnosti one koji su standardni za većinu Windows aplikacija, npr. File, Edit, View, Window, Help). Upotrijebiti pravu kontrolu za prave svrhe (u izboru kontrola koje dodajemo na formu paziti da budu logične kako bi korisniku olakšale unos podataka i rukovanje aplikacijom, npr. ako korisnik treba unijeti podatak za koji postoje unaprijed utvrđene moguće vrijednosti, koristiti ComboBox ili ListBox umjesto textBox-a za unos) . Svojstva forme:

U Visual Studio 2008 svojstva forme prikazuju se u prozoru Properties kada mišem označimo formu. Svojstva se mogu podijeliti u 9 kategorija. Kategorije će se prikazati u prozoru Properties ako kliknemo mišem na dugme Categorized ispod naziva forme u tom prozoru. Dugme Categorized prikazuje svojstva grupirana u kategorije, također postoji dugme koje prikazuje svojstva po abecedi. Neke od kategorija svojstava koje ćemo kroz vježbe i zadatke koristiti su:

• Izgled (eng. Appearance) – podešavanje postavki prikaza kao npr. boje pozadine, širine, visine, pokazivača i dr.).

• Ponašanje (eng. Behavior) – podešavanje ponašanja forme, npr. da li će forma biti omogućena (svojstvo Enabled).

Page 2: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. • Predložak (eng. Layout) – određuje početni položaj, min. ili max. veličinu i dr. • Različito (eng. Misc – skraćeno od Miscellaneous) – određuje da li će se tipka Enter

koristiti kao AcceptButton, a tipka Esc kao CancelButton i dr. Primjer kreiranja aplikacije s više 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 mišem na dugme ''Unos podataka'', želimo da se otvori nova forma u kojoj će korisnik moći unijeti podatke. To će biti SDI forma, jer će se otvarati u novom samostalnom prozoru i neće biti podređena 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 može kreirati na dva načina:

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 označiti naziv aplikacije (Forme), kliknuti na desno

dugme miša i u iskočnom izborniku izabrati Add -> New Item. Označiti 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 miša na prvu formu (Form1.cs) vraćamo se na tu prvu formu kako bismo napisali

naredbe kojima će se nakon klika mišem na tipku ''Unos podataka'' prikazati druga forma. Dvokliknite mišem na tipku ''Unos podataka'' kako biste se pozicionirali u programski kod. Kada se nalazite u metodi button1_Click, upišite sljedeće naredbe za prikaz nove forme:

Page 3: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(); frm.Show(); }

Ovim naredbama određuje se da nakon što korisnik klikne mišem 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 mišem 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 moći 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 piše taj naslov forme. U drugu formu dodajte sljedeće kontrole za unos podataka o studentima, te dugme za povratak na prethodnu formu:

U ovoj fazi nećemo pisati naredbe programa koje će se izvršiti kada korisnik klikne na dugme ''Povratak'', nego objasniti dalje rad s više formi. Sada želimo kada korisnik klikne na dugme

Page 4: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

''Izvještaji'' kreirati MDI formu koja će biti u okviru prve forme (Form1), odnosno njezin potomak. Da bismo to mogli ostvariti, potrebno je sljedeće:

1. otvoriti novu formu (Form3) 2. za formu Form1 postaviti svojstvo (property) da može biti forma ''MDI roditelj''. To je

svojstvo ''IsMDIContainer'' u prozoru Properties.

U dizajnu forme Form1 kliknuti dvaput na dugme ''Izvještaji'' 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 način 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. Označite formu i u prozoru Properties postavite svojstvo IsMDIContainer na vrijednost True (time smo omogućili da ta forma bude MDI roditelj forma). Forma će promijeniti boju (postat će transparentna).

3. Kliknite dvaput na dugme ''Izvještaji''. U metodi button2_Click() upišite sljedeći 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 sljedećoj slici (koje će omogućiti ispis izvještaja o imenu i prezimenu i ocjeni):

Naredbe koje će se izvršiti kada korisnik klikne na tipku ''Povratak'' za sada nećemo pisati, niti ispisivati vrijednosti za ime i prezime, te ocjenu, budući da će to biti obrađeno u sljedećim poglavljima. Pohranite i pokrenite aplikaciju tipkom Debug. Kliknite mišem na dugme ''Izvještaji''. Pojavit će nova forma, ali unutar prozora prve forme kao na slici:

Page 5: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Koristeći miš povećajte prvu formu tako da se untar njezinog prozora vidi cijela druga forma. Drugu formu ne možete pomicati izvan prve (roditeljske), što je karakteristika MDI formi. Rad s izbornicima

Izbornici (eng. menus) su važan dio korisničkog sučelja Windows aplikacije. U Visual Studio 2008 izbornici se dodaju na formu s pomoću kontrole MenuStrip. Moguće je dodati horizontalne i vertikalne izbornike, te njihove podizbornike. Naredbe (odgovor na događaj) koje će izvršiti klikom korisnika na odgovarajući izbornik, pišu se u programskom kodu nakon dvoklika mišem 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 mišem na formu, i smjestite u gornji lijevi vrh forme. U prazno polje za upis (označeno s Type here upišite prvi element izbornika, npr. Datoteka kao na sljedećoj slici:

Page 6: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Ispod toga upišite element Spremi, pa ispod toga Zatvori. U vodoravnoj razini upišite izbornike Unos, Izvještaji, Pomoć. U izbornik Unos umetnite u okomitoj razini elemente Unos studenata, Unos predmeta, Unos ocjena ili neke druge proizvoljne elemente. U izbornik Izvješaji umetnite u okomitoj razini elemente Prema broju indeksa, Prema datumu ili dr. Pohranite i debug-irajte aplikaciju. Pogledajte kako izgledaju izbornici na prvoj formi. Izvršavanje naredbi klikom na izbornik bit će također obrađeno u sljedećim poglavljima. 1.6. Klase, objekti i tipovi u C# jeziku

Svaki programski jezik sastoji se od niza ključnih riječi koje imaju svoje unaprijed određeno značenje i mogu se koristiti za pisanje naredbi programa. Osim korištenja ugrađenih ključnih riječi, u naredbama koristimo i proizvoljne nazive za klase, objekte, metode i varijable. Do sada smo u primjerima uvijek koristili klase koje su već ugrađene u razvojni alat Visual Studio 2008 (npr. klasa Form koja je označavala formu u Windows aplikaciji). Međutim, 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 opća svojstva i ponašanje 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 nasljeđuju svojstva koja ima tip button: svojstvo visine, širine, text koji će pisati na dugmetu, položaj dugmeta na formi i druga svojstva zajednička svim instancama koje pripadaju tipu button. Ta se karakteristika objektnog programiranja zove NASLJEĐIVANJE. NASLJEĐIVANJE je mogućnost da instance preuzimaju sva svojstva tipa kojem pripadaju. U C# jeziku se koriste ova 4 različita tipa:

1. Klase, pri čemu se instance klase zovu objekti 2. Enumeracije (eng. enums) 3. Strukture (eng. structs) 4. Delegati (eng. delegates)

Klase se najčešće koriste, pa će biti detaljnije objašnjene u nastavku. KLASA je neki tip

promatranih objekata. Klasa je adekvatna skupini ili vrsti kod bioloških bića, npr. skupina pasa, mačaka, 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

Page 7: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 određuju njezino ponašanje. Naredba za kreiranje nove klase počinje ključnom riječi 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 pripadajuću cjelobrojnu varijablu pod nazivom mojaVarijabla kojoj će se unutar klase mojaKlasa moći dodjeljivati vrijednosti. Npr. sljedećim 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 sadrži 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 omogućiti 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 prosljeđuju mu se nikakve vrijednosti. Zato u zagradama kod ovog standardnog konstruktora ne pišemo ništa. Ukoliko se želi koristiti neki vlastiti određeni konstruktor, tada se on mora deklarirati u programu prije samog korištenja.

Page 8: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 prosljeđuje mu se varijabla dt koja je tipa System.DateTime. Kako bi ovaj primjer radio, potrebno je prije korištenja konstruktora i deklarirati i dodijeliti vrijednosti za varijable Year, Month, Date, Hour, Minute, Second.

Nakon deklaracije konstruktora, u nekoj metodi, npr. Main() može 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 ponašaju. Metodama koje sami kreiramo možemo dati proizvoljne naziv, npr. Ispis(), Racunanje(), itd. Ako želimo napisati odgovor na događaj klik miša na neku kontrolu (button ili dr.), dvostrukim klikom miša 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.

Page 9: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

/// </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 izvršavanja programa. Za nas važna naredba u metodi Main() je ona koja pokreće aplikaciju, i otvara prvu formu aplikacije. To je naredba:

Application.Run(new Form1());

Gornjom naredbom pokreće se aplikacija otvaranjem prve forme Form1. Kada se kreira neka metoda, ona također ima svoju deklaraciju. U deklaraciji se definira tip podatka koji će metoda vraćati, zatim naziv metode i u zagradi parametre koji će se prosljeđivati metodi. Npr. ovako:

Int myMethod(int velicina);

Neke metode uopće ne vraćaju nikakve vrijednosti. Takve metode samo nešto izvode,

i tada je tip metode void, a u zagradi se ne piše ništa, npr. ovako:

void myVoidMethod( );

Ovdje se određuje da će metoda nakon izvršavanja vraćati cjelobrojnu vrijednost. Naziv metode je myMethod (može biti proizvoljan). U C# se prilikom korištenja metode uvijek mora deklarirati tip koji metoda vraća ili napisati ključnu riječ void ako metoda ne vraća nikakvu vrijednost. Npr. do sada smo u primjerima koristili metode koje ne vraćaju vrijednosti, ali su bile standardne metode za klik miša na neko dugme, pa su njihove deklaracije izgledale ovako:

private void button1Click(object sender, EventArgs e) ;

private znači da se metoda koristi samo unutar jedne klase u kojoj je deklarirana, void znači da metoda ne vraća nikakvu vrijednost, button1Click je naziv metode. Metodi se u zagradi prosljeđuju parametri koji su standardni za neku click metodu.

Komentari se u programski kod umeću zbog više razloga: Kako bi olakšali programeru snalaženje u kodu (zbog mogućih kasnijih ispravki), te kako bi omogućili izradu adekvatne programske dokumentacije. Postoji tri osnovna načina 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 može pisati kroz više linija a

vrijedi do znaka */

Page 10: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

3. Komentari za XML dokumente

Operator . koristi se za pristup metodi ili svojstvu unutar neke klase, te kako bi ograničio naziv klase na određeni 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. Korištenje statičnih članova Pri korištenju metode Main() vidjeli smo da naredba sadrži ključnu riječ static:

static void Main()

Riječ static znači da se ta metoda može pozvati samostalno bez prethodnog pozivanja klase. Možete je koristiti bez da u ruci imate instancu te klase. Svojstva i metode neke klase mogu biti instance ili statični č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 statična: Student.Pero.Upisi(); b) ako je prethodno definirana kao statična: Student.Upisi();

Ključna riječ this odnosi se na trenutnu instancu neke klase (ili drugog objekta). this je skriveni pokazivač (pointer) na svaku nestatičnu metodu neke klase. Postoje 3 načina upotrebe this: 1. način: U svrhu kvalificiranja instance ako se ona zove isto kao i parametar koji se prosljeđuje nekoj metodi, pa tada this omogućava da se odredi na koju se vrijednost misli:

public void SomeMethod (int hour) { this.hour = hour;

} Ovoj metodi se prosljeđuje cjelobrojni parametar hour. Međutim, u metodi se koristi i instanca (ili svojstvo) hour kojoj treba dodijeliti vrijednost proslijeđenog parametra. This određuje da se na lijevoj strani jednakosti misli na instancu hour koja pripada aktualnoj klasi.

Page 11: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

2. način: U svrhu prosljeđivanja 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 možemo koristiti pod njezinim nazivom, nego moramo proslijediti parametar – varijablu koja je tipa OtherClass. 3. način: korištenjem indeksera. Primjer ako this koristimo u svrhu određivanja č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); } }

Page 12: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Rekli smo da su prednosti objektno orijentiranog programiranja mogućnost 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 držati ih pod private pristupom. C# stoga ima koncept zvan svojstva (properties) koja omogućavaju 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); } }

Page 13: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

U gornjem primjeru smo napravili dva svojstva public int x i public int y. Oni sada omogućuju pristup varijablama x i y koje su sada pod ključnom riječi private. Unutar svojstava set naredba se izvršava uvijek kada postavljamo vrijednost privatnim varijablama, a get naredba kada čitamo vrijednost varijabli. U slijedećem primjeru:

x=13; poziva se svojstvo i izvršava 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;

Page 14: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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()

Page 15: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

{ 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

Page 16: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

1.7. Nasljeđivanje Ranije smo već objasnili što je to nasljeđivanje, a sada ćemo dati primjer nasljeđivanja. 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(" ");

Page 17: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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();

Page 18: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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); } }

Page 19: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 načina. Prvi put pozivamo je preko objekta radnik i poziva se metoda koja pripada klasi Zaposlenik, no u drugom slučaju 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

Page 20: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 nasljeđuje klasu Osoba... class Poslodavac : Osoba { public string tvrtka; public Poslodavac() : base() {

Page 21: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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

Page 22: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

1.8. Nizovi, liste i kolekcije

U .NET-u postoji više načina kako pohraniti više objekata u jednu kolekciju (ili skup) objekata. Neki od tih načina su: Nizovi (Arrays), Liste (List ili ArrayList), Kolekcije (Collection). Koriste se kada želimo npr. imena ili plaće više djelatnika pohraniti u jedan zajednički 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 položaj (koji je on po redu u tom skupu). Indeksi kreću od vrijednosti 0 nadalje, npr. Djelatnik [0] Djelatnik [1] Djelatnik [2] …. Itd. Klase koje su raspoložive 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, višedimenzionalni i ugnježdeni (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 ugrađenoj klasi System.Array (da Vaša aplikacija koristi ovu klasu možete vidjeti u naredbi Using na početku svoje aplikacije – Using System.Array). Automatski su na raspolaganju ugrađene metode koje vrijede za ovu klasu, a neke od njih su: Clear(), Copy(), Sort(), IndexOf() i dr. čiji puni popis možete pronaći u (Liberty, Programming C#, O’Reilly, 2006). Za deklariranje niza potrebno je upisati naredbu čija je opća sintaksa:

type[ ] naziv-niza; type – označava 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 određeni broj članova tog određenog 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 sadržavat će 5 elemenata niza, koji će biti tipa string (tekstualnog), tj. u ovaj niz moći ćemo upisati imena za 5 studenata (indeks niza kreće 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 numeričkog 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 početnu vrijednost 0, tj. ocjena[0]=0, ocjena[1]=0, ocjena[2]=0. 2

Page 23: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Nizove se preporuča 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 slično. Ne preporuča 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 slučaju se preporuča koristiti kolekcije).

Upotreba nizova bit će objašnjenja 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 ''Ispiši niz''. Klinite na dugme ''Ispiši niz'' i u metodi button1Click() deklarirat ćemo niz od 5 elemenata koji će sadržavati imena studenata, pa će biti tipa string. Deklarirati niz i dodijeliti mu vrijednosti moguće je na više načina:

1. način: Ako bismo htjeli pojedinačno 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. način – deklaracija niza i dodjela vrijednosti u jednoj liniji koda, ovako: string[] imeStudenta = { "Marko", "Janko", "Slavko", "Ante", "Andrija" };

Za naš primjer koristit ćemo drugi, kraći način, 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 više, 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” označava prijelaz u novi red nakon svake vrijednosti. Petlja foreach izgledala bi ovako: foreach (string ime in imeStudenta) { label2.Text += ime + “\n”; }

Page 24: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

U petlji foreach uvodi se nova varijabla ime tipa string koja će preuzeti pojedinačne 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 pomoću 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 ''Ispiši niz'' pojavit će sljedeći rezultat ispisa (imena će biti sortirana po abecedi):

Osim sortiranja, na nizovima se mogu primijeniti i druge metode, o kojima više pogledajte u (Liberty, Programming C#, O’Reilly, 2006). Ako bismo niz htjeli popuniti brojčanim vrijednostima, tada se to može napraviti u petlji for, npr. na sljedeći način: for (int i = 0; i <= 4; i++) { imeStudenta[i] = i.ToString(); } Kada bismo ispisali ovaj niz, rezultat bi bio: 0 1 2 3 4

Page 25: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Liste

Lista (eng. List) je skup objekata istog tipa koji se pohranjuju u zajednički niz objekata (ArrayList) i mogu se dodavati bez da unaprijed znamo dimenziju (broj elemenata) u nizu. Pogodna je za upotrebu ako se vrijednosti objekata učitavaju 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 sljedeća:

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 više metoda naše forme, nećemo 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>(); } }

Page 26: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 miša 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 učinili, potrebno je dvaput kliknuti na dugme ''Pohrani u listu'' kako bismo isprogramirali odgovor na događaj. U metodi button2click upisat ćemo sljedeću naredbu:

studenti.Add(textBox1.Text);

Ova naredba dodat će novi element liste i u njega pohraniti vrijednost iz textBoxa1. Na listi je moguće koristiti ugrađene 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 dinamički 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 povećava. 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 “Ispiši 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"; } }

Page 27: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 ''Ispiši listu''. Prikazat će se rezultat kao na slici:

Kolekcije

Kolekcija (eng. collection) je generička klasa objekata koja se može koristiti za pohranjivanje i rukovanje skupom objekata istog tipa, a korespondira sa skupom klasa zvanim CollectionBase. Sadrži metode za dodavanje, uklanjanje elemenata, promjenu vrijednosti elemenata i dr. Elementi kolekcije su također indeksirani, indeks im počinje od 0 nadalje. Koriste se slično 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:

Page 28: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Djelatnici.Clear();

Za ispis kolekcije na formu (npr. u labelu) koristi se petlja foreach na isti način 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 vježbe 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 izvještaj u drugoj formi (Form2). Da bismo za nekog djelatnika vodili podatke o imenu i prezimenu i plaći, 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 sljedeći način: Otvoriti unutar iste aplikacije u C#-u posebnu datoteku u koju ćemo upisati kod za kreiranje klase. Ta klasa će se moći 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 upišite Djelatnik.cs. U novu praznu datoteku Djelatnik.cs upišite ove naredbe za kreiranje nove klase:

Page 29: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

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 više djelatnika, kreirat ćemo kolekciju klasa, i to kao svojstvo, jer je želimo prenositi kroz više formi iste aplikacije: Ta će kolekcija sadržavati skup unesenih djelatnika, dakle ona će biti tipa Djelatnik. Budući da je treba koristiti u više metoda i više formi, kreirat ćemo je za cijelu formu Form1 kao svojstvo (kasnije i u Form2), tako da u Form1.cs, odmah ispod deklaracije klase Form1 upišemo 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 uključiti 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 može 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));

Page 30: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

Djelatnici.Add(d); Label4.Text = "Uneseno je " + Djelatnici.Count + " djelatnika.";

textBox1.Text = ""; }

Kreira se instanca d klase Djelatnik, i njoj se prosljeđuju 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 izvještaj želimo ispisati u drugoj formi, kreirat ćemo u istoj aplikaciji formu Form2, i iz Form1 dvaput kliknuti na izbornik Izvještaji/Ispis plaća da bismo došli u metodu u kojoj treba upisati naredbe za kreiranje nove instance forme 2 (nazvat ćemo je ''Izvještaji'', i proslijediti joj vrijednosti iz kolekcije Djelatnici ovako: private void ispisPlaćaToolStripMenuItem_Click(object sender, EventArgs e) { Form2 izvjestaji = new Form2(); izvjestaji.Djelatnici = this.Djelatnici; izvjestaji.Show(); } Ispis izvještaja u Form2. U Form2 najprije ćemo dodati kontrole labela za ispis podataka, kao na slici:¸

Želimo da se prilikom učitavanje forme 2, u label3 i label5 upisuju podaci o imenu i prezimenu i plaći 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 početku klase Form2 treba deklarirati kolekciju: public partial class Form2 : Form { private Collection<Djelatnik> _djelatnici; public Collection<Djelatnik> Djelatnici

Page 31: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

{ get { return _djelatnici; } set { _djelatnici = value; } } Nakon toga, u metodi Form2Load() treba upisati sljedeće 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 upišite podatke za 3 djelatnika (svaki put kliknite na dugme ''Pohrani''). Zatim kliknite na izbornik ''Izvještaji'' i ''Ispis plaća''. Na ekranu će se pojaviti druga forma, s ispisom kao na slici:

Zaključak: Ako želimo više objekata pohraniti u jedan zajednički 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 učitavaju iz forme, vrijednosti se pohranjuju s pomoću petlje foreach u kojoj se deklarira neka

Page 32: 1.5. Rad s formama i izbornicima u aplikacijilukic/oop/Auditorne_vježbe_6.pdf• Dizajn forme (eng. Design) – određuje naziv forme, jezik upotrebe, zaključavanje i dr. ... Izbornici

instanca koja predstavlja element te liste ili kolekcije. Ako želimo elemente liste ili kolekcije koristiti kroz više 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 učitati vrijednosti svojstvima koristiti petlju foreach u kojoj se deklarira instanca klase.