Docsity
Docsity

Pripremite ispite
Pripremite ispite

Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u


Nabavite poene za preuzimanje
Nabavite poene za preuzimanje

Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan


Školska orijentacija
Školska orijentacija


Programiranje u C# za početnike, Skripte od Računarstvo i informatika

U svrhu svih koji zele programirani u C#.

Tipologija: Skripte

2019/2020

Učitan datuma 02.04.2020.

Bekmiva
Bekmiva 🇧🇦

5

(1)

2 dokumenti

1 / 30

Toggle sidebar

Ova stranica nije vidljiva u pregledu

Ne propustite važne delove!

bg1
Programski jezik C#
&
Windows Forms
Saša Fajković
2014
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Delimični pregled teksta

Preuzmite Programiranje u C# za početnike i više Skripte u PDF od Računarstvo i informatika samo na Docsity!

Programski jezik C#

Windows Forms

Saša Fajković

    1. Potrebno predznanje
    1. OOP – Objektno Orijentirano Programiranje
    1. Klase (razredi) i objekti (instance)
        1. Što su klase i objekti
        1. Kako se stvaraju klase..............................................................................................................
        1. Dodavanje članova klasi
        1. Dodavanje metoda klasi
        1. Nasljeđivanje klasa
    1. Prava pristupa svojstvima i metodama: Internal, Public, Private, Protected, Protected Internal
        1. Teorija o pravu pristupa
        1. Internal pravo pristupa
        1. Public pravo pristupa
        1. Private pravo pristupa
        1. Protected pravo pristupa
        1. Protected Internal pravo pristupa
    1. Konstruktor i Destruktor
        1. Općenito o konstrukteru
        1. Stvaranje konstruktora
        1. Pretpostavljeni konstruktor...................................................................................................
        1. Preopterećenje konstruktora
        1. Destruktor
    1. This - referenca na trenutnu instancu
    1. Getters & Setters (Geteri i Seteri)
        1. Općenito i zašto ih koristiti
        1. Kako napraviti Getter i Setter svojstva
        1. Postavljanje „Read-Only“ svojstva
    1. Windows Forms
        1. Što su Windows Forms
        1. Uređivanje svojstava
        1. Akcije/Događaji nad Windows Formama
        1. Brisanje metoda za neki događaj
    1. Elementi na Windows Formi - uvod
        1. Što su elementi
        1. Dodavanje elemenata
        1. Svojstva elemenata
        1. Akcije/Događaji nad elementima
    1. Svojstva i akcije elemenata na Windows Formi – nastavak (čitanje, pisanje i izmjena)
    1. Iznimke u C# jeziku
        1. Što su iznimke
        1. Obrada iznimki (try / catch)
        1. Bacanje iznimki (throw)
    1. Popis slika:

1) Potrebno predznanje

Prije proučavanja ovih materijala, pretpostavka je da ste dobro upoznati s radom i pojmovima poput varijable, funkcije, operatori, polja, petlje, grananje i kontrola toka. Također, očekuje se da imate osnovno znanje u radu s razvojnim sučeljima tj. da znate stvoriti novi projekt, otvoriti postojeći te da ste upoznati s osnovama rada na računalu (otvaranje mapa, dvostruki lijevi klik, desni klik, instalacija aplikacija i slično). Poznavanje razreda String i pozivanja funkcija nad njim se također smatra usvojenim gradivom. Ukoliko to nije slučaj, prvo utvrdite to gradivo, potom krenite na ove materijale jer se ovdje neće objašnjavati spomenuti pojmovi, već će se podrazumijevati da ste upoznati s njima te njihovom funkcionalnošću. Svi primjeri će biti rađeni u Microsoft Visual Studio 2013 razvojnom sučelju. Ukoliko koristite neko drugo razvojno sučelje, princip rada je potpuno identičan i nećete imati problema. Besplatne distribucije Microsoft Visual Studio razvojnog sučelja koje nose oznaku „ Express “ su dostupne za preuzimanje sa službene Microsoft stranice: http://www.visualstudio.com/downloads/download-visual-studio-vs

3) Klase (razredi) i objekti (instance)

3. 1. Što su klase i objekti

Klasa odnosno razred predstavlja tip podatka. Navikli smo na tipove podataka poput Integera koji predstavljaju cijele brojeve, ili recimo charactere koji predstavljaju jedan znak. No što ako želimo raditi s kompleksnim brojevima^1. U tom slučaju možemo definirati vlastite tipove podataka tako da napravimo klasu koja će imati svojstvo realne i imaginarne komponente. Do sada ste prilikom pisanja varijabli vjerojatno radili postupak da prvo upišete tip podatka varijable koju stvarate, zatim njeno ime te ste eventualno pridijelili neku vrijednost toj varijabli - > Int broj = 5. Napravimo li klasu kompleksnih brojeva u kojoj definiramo da varijable koje će biti tipa „Kompleksni“ sadrže realnu i imaginarnu komponentu mogli bi napraviti ovako nešto: Kompleksni broj = 12+24i. U ovom slučaju, imamo tip podatka koji zna prepoznati realne i imaginarne komponente kompleksnog broja. Također, takvim razredima možemo dodati funkcije za zbrajanje, oduzimanje, množenje i dijeljenje kompleksnih brojeva. Kako bi lakše shvatili apstraktnost klase, pogledajmo na primjeru realnog svijeta. Zamislite da imate tip podatka „Vozilo“. Za sada se ograničavamo samo na automobile. Svako vozilo može imati različite članove poput broja kotača, vrsta motora (benzin ili dizel), manualni ili automatski mjenjač, dužina, širina, visina, boja i ostalo. U programerskom svijetu, to znači da možemo stvoriti klasu „Vozilo“ sa istim tim svojstvima. Zatim možemo napraviti varijablu koja je po tipu podataka „Vozilo“. Primjer stvaranja takve varijable bi bio: „Vozilo autoBroj1;“. Stvorili smo varijablu imena „autoBroj1“ koji je po tipu „Vozilo“. Kada stvorimo varijablu nekog takvog tipa, kažemo da smo stvorili objekt odnosno instancu klase. Kako znamo da klasa „Vozilo“ unutar sebe sadrži svojstva poput boje, dužine, širine i ostalih, ista ta svojstva se primjenjuju na varijablu „autoBroj1“. Ako bi napisali „autoBroj1.boja = „crvena“, tada bismo za tu varijablu definirali svojstvo „boja“ i tom svojstvu dodijelili vrijednost „crvena“. Isto tako, možemo stvoriti i drugi objekt „autoBroj2“ koji će imati sva svojstva koja ima i klasa „Vozilo“. Sada tom auto možemo definirati njegova svojstva. „autoBroj2.boja = „plava“ će tom objektu definirati svojstvo „boja“ s dodijeljenom vrijednosti „plava“. (^1) Kompleksni broj se sastoji od realnog i imaginarnog dijela. Primjerice 3+2i ili 4-5i. Slovo „i“ obilježava imaginarnu komponentu.

3. 2. Kako se stvaraju klase.

U Visual Studio razvojnom sučelju, unutar Solutiona na kojem radimo napravimo desni klik, odaberemo Add i zatim „ New Item “. Slika 1 - Dodavanje nove klase Otvara se izbornik za dodavanje datoteka. Slika 2 - Izbornik za dodavanje klase Obavezno mora biti odabrana datoteka „ Class “. U donjem dijelu upisujemo ime klase koju želimo dodati. Nakon upisa imena, odabiremo tipku „ Add “ te će se nova klasa pojaviti unutar Solutiona.

3. 3. Dodavanje članova klasi

Kada stvaramo klasu, moramo imati na umu da stvaramo novi tip podataka. Kao takav, taj tip podataka je zapravo kompleksan tip podataka. Uostalom, da nam treba samo primitivan tip podataka ( Integer, Float, Double, Character, ...) ne bismo niti radili novi tip podataka. Kompleksni tipovi podataka se sastoje od jednostavnih tipova podataka. Upravo te vodilje se držimo i prilikom izrade vlastitih klasa. Unutar vitičastih zagrada koje obilježavaju početak i kraj neke klase odnosno bloka naredbi, pišemo članove (i metode) te klase. Slika 5 - Dodavanje svojstava klasi Vidimo kako su članovi napisani kao obične varijable nekog određenog primarnog tipa (izuzetak je String tip podataka koji sam po sebi nije primarni tip podataka, no sigurni smo da će Compiler znati raditi s takvim tipom podataka). Sada smo stvorili klasu Vozilo koja ima članove „boja“ i „visina“. Napravimo li instancu te klase odnosno novi objekt koji je tipa „Vozilo“, imati ćemo na raspolaganju ta dva svojstva. Svojstvima (i metodama) pristupamo tako da iza objekta upišemo simbol točke nakon čega će se pojaviti dostupna svojstva i metode kojima zatim standardno pomoću operatora pridruživanja (znak jednakosti) pridjeljujemo neku vrijednost.

3. 4. Dodavanje metoda klasi

Na isti način kako smo dodavali i svojstva klasi, dodajemo i funkcije. Kada je neka funkcija dodana klasi, odnosno vezana za tu klasu, tada se to zove metoda. Metoda pozivamo nad objektima odnosno instancama neke klase. Slika 6 - Dodavanje metoda klasi Ovdje je napravljena metoda koja se zove „DohvatiBoju()“. Ta metoda ne prima niti jedan parametar i vraća ono što je pohranjeno u svojstvu „boja“ klase „Vozilo“.

3. 5. Nasljeđivanje klasa

Mogućnost nasljeđivanja klasa nam dopušta da stvorimo glavnu klasu iz koje izvodimo druge klase. Izvedene klase poprimaju svojstva glavne klase. Primjerice, imamo li klasu „Vozilo“ s elementom „brojKotaca“ koje obilježava broj kotača vozila i „duzina“ koji obilježava dužinu vozila, možemo napraviti dvije naslijeđene klase, jednu „Automobil“ i drugu „Motocikl“. Unutar svake od tih klasa ćemo definirati zasebna njihova svojstva koja su karakteristična samo za njih, no osnovna svojstva koja su zajednička motociklu i automobilu ćemo naslijediti iz klase Vozilo. Slika 7 - Nasljeđivanje klasa Sintaksa za nasljeđivanje je : (eventualno pravo pristupa ) – ključna riječ „ class “ - nova klasa koju stvaramo – simbol dvotočke ( : ) – ime klase koju nasljeđujemo.

4) Prava pristupa svojstvima i metodama:

Internal, Public, Private, Protected, Protected Internal

U prethodnom kӧdu ste mogli uočiti ključnu riječ „ public “, no nigdje nije bilo objašnjenja za nju. U ovom poglavlju naučit ćemo što je ta riječ te koje su još takve riječi i njihovu ulogu.

4. 1. Teorija o pravu pristupa

Klasama, njenim članovima i metodama možemo dodijeliti pravo pristupa koje se razlikuje kroz tri stupnja. Primjerice, želimo onemogućiti pristup nekim varijablama iz neke druge klase. S druge strane, možda ciljano želimo napraviti klasu čijim svojstvima i metodama želimo dati pravo pristupa iz svih ostalih klasa.

4. 2. Internal pravo pristupa

Klasu, svojstva i metode smo pisali s prefiksom „ public “ kako bi joj mogli pristupiti iz glavne klase koju je Visual Studio generirao (kao i popratne datoteke). Pretpostavljeno ( engl. Default ) pravo pristupa klasi koja se NE NALAZI unutar druge klase je Internal. Internal omogućava pristup klasi iz istog „ Assembly “ ali ne i iz vanjskih. U našem slučaju, klasi možemo pristupiti iz ostalih klasa ukoliko se nalaze unutar istog Solutiona.

4. 3. Public pravo pristupa

Public (javno) pravo pristupa će omogućiti pristup klasi od bilo kuda. Takvoj klasi možemo pristupiti iz istog projekta, ali i iz drugih projekata, odnosno iz istog Assembly-a , ali i iz ostalih. Pojednostavljeno – ovakvim klasama možemo pristupiti iz cijelog Solutiona.

4. 4. Private pravo pristupa

Private (privatno) pravo pristupa će dopustiti pristup klasi samo u kӧdu unutar te klase. Pojednostavljeno – ovakvim klasama možemo pristupiti samo iz te same klase. Njenim metodama i članovima ne možemo pristupiti iz drugih klasa.

4. 5. Protected pravo pristupa

Protected (zaštićeno) pravo pristupa dopušta pristup klasi samo iz te same klase ili iz klase koja je stvorena iz klase koja ima zaštićeno pravo pristupa. Pojednostavljeno – ovakvim klasama možemo pristupiti samo iz te same klase ili klase koju napravimo da nasljeđuje takvu klasu.

4. 6. Protected Internal pravo pristupa

Protected Internal (Zaštićeno privatno) pravo pristupa dopušta pristup klasi samo iz tog Assembly a i iz naslijeđenih klasa. Pojednostavljeno – spoj prava pristupa Protected i Internal. Klase i strukture mogu imati samo Public i Internal prava pristupa. Elementi unutar klase mogu imati sva od navedenih prava pristupa.

5. 3. Pretpostavljeni konstruktor

Prilikom stvaranja instanci klase, poziva se pretpostavljeni konstruktor ukoliko drugačije nije specificirano. Pretpostavljeni konstruktor će stvoriti elemente te klase koje potom možemo pozvati nad objektom te klase. Savjet: Za brže pisanje konstruktora možete upisati ključnu riječ „ ctor “ i pritisnuti tipku „Tab“ dva puta te će Visual Studio sam generirati pretpostavljeni konstruktor.

5. 4. Preopterećenje konstruktora

Ukoliko prilikom stvaranja instance neke varijable želimo postaviti vrijednosti elemenata te klase na neke određene vrijednosti, tada pozivamo konstruktor namijenjen tome. Unutar jedne klase možemo imati više konstruktora. Svi konstruktori se „zovu“ isto, odnosno ime im mora biti identično kao i ime klase. Jedina razlika je u broju i/ili poretku parametara koje prima konstruktor. Slika 11 - Preopterećenje konstruktora Vidimo kako postoji prvi konstruktor „ Vozilo() “ koji ne dodjeljuje nikakve vrijednosti elementima klase. Drugi konstruktor „ Vozilo (string dodijeliBoju) “ će postaviti vrijednost elementa (varijable) „ boja “ na vrijednost jednaku parametru „ dodijeliBoju “. Treći konstruktor „ Vozilo(string dodijeliBoju, float dodijeliVisinu) “ će dodijeliti vrijednosti za dva elementa klase. Element „ boja “ će poprimiti vrijednost jednaku parametru „ dodijeluBoju “, a element „ visina “ će poprimiti vrijednost jednaku parametru „ dodijeliVisinu “. Kako se pozivaju konstruktori i stvaraju objekti ćemo upoznati u daljnjem tekstu

5. 5. Destruktor

Suprotno od konstruktora, destruktore koristimo kada želimo uništiti instancu neke klase. Pritom moramo pratiti neka pravila jezika C#.  Destruktor ne smije biti definiran unutar struktura, već samo unutar klasa  Svaka klasa smije imati najviše jedan destruktor  Destruktori nemaju svojstvo nasljeđivanja niti preopterećivanja  Destruktor nema pravo pristupa niti parametre S obzirom da C# jezik ne zahtijeva kontrolu nad memorijom poput nekih drugih programskih jezika, konstruktorima se nećemo posvetiti. Detalje oko konstruktora možete pročitati ovdje: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

7) Getters & Setters (Geteri i Seteri)

7. 1. Općenito i zašto ih koristiti

Prilikom stvaranja elementa klase, praksa je ograničiti direktno pravo upisa odnosno izmjene vrijednosti tih elemenata. Ovo se pokazalo kao dobra ideja kako ne bi došlo do slučajnog mijenjanja tih vrijednosti „negdje kasnije“ u kӧdu, a također se štitimo od nevaljanog unosa vrijednosti prilikom samog stvaranja varijable. Za to koristimo metode (funkcije) koje pozivamo nad svakim elementom. Unutar tih metoda navodimo želimo li imati pravo samo čitanja, samo pisanja/izmjene podataka ili oboje. Takvim načinom pisanja kӧda ne pristupamo direktno nekom elementu već prvo pozivamo metodu klase koja ima pravo pristupa tim elementima i preko te metode utječemo na vrijednosti elemenata. Takve metode se popularno zovu Getteri i Setteri. Gettere koristimo za čitanje odnosno dohvaćanje vrijednosti nekog elementa, a Settere za postavljanje/izmjenu vrijednosti nekog elementa. Također, ovakvim pristupom možemo zaštiti aplikaciju od rušenja izazivanjem iznimki prilikom nevaljanog unosa i obradom tih iznimaka. Iznimke ćemo obraditi naknadno.

7. 2. Kako napraviti Getter i Setter svojstva

Slika 13 - Izrada Getter i Setter svojstava Vidimo da unutar klase „ Vozilo “ imamo tri konstruktora s kojima smo se već upoznali. Ispod toga se nalaze dva elementa; „visina“ i „ visina “. Pretpostavljeno pravo pristupa za elemente je kao i za klase – Internal****. Pokušamo li pristupiti iz druge klase elementima instance proizašle iz klase „ Vozilo “ to neće biti moguće. Na ovaj način smo se zaštitili od potencijalno neželjenog upisa i promjena vrijednosti tih elemenata. Ispod deklaracije ta dva elementa nalazimo svojstvo „ Boja “. Primijetite da je to svojstvo pisano velikim početnim slovom. Ovo je konvencija da se svojstvo za neki element nazove kao i taj element, samo početnim velikim slovom (elementi se naravno po konvenciji nazivaju s malim početnim slovom). Unutar svojstva „ Boja “ nalazimo dvije ključne riječi; „g et “ i „set“. „ Get “ svojstvo koristimo za dohvaćanje podataka, a to smo napravili korištenjem ključne riječi „ return “ te imena elementa. Svojstvo „ set “ koristimo za dodjelu ili izmjenu vrijednosti nekog elementa. Unutar „ set “ dijela izvršili smo dodjelu vrijednosti elementu „ boja “. Ovdje se pojavljuje nova ključna riječ „ value “. „ Value “ dohvaća vrijednost koju pridjeljujemo elementu