tutorial - delphi skola 1 - РАЧУНАРСТВО И...

41
Tutorial - Delphi skola 1 Programe cu raditi u Delphi 7, ali ce vecina moci bez problema da se uradi i u ranijim verzijama. Necemo se patiti sa konzolnim programima (mozda ih kasnije budemo radili) nego cemo odmah praviti GUI i kroz neke jednostavne programcice i igre objasnjavati sta koja kontrola moze i slicno. Predpostavljam da vec znate nesto o Delphi IDE tako da o tome necu mnogo pricati. Spomenucu samo ono sto budemo koristili i to samo jednom. Bez daljeg odlaganja pocinje prva lekcija :) Kada pokrenete Delphi projekat ce vam vec biti otvoren. Ako to nije slucaj novi projekat se kreira tako sto iz File menija izaberete New->Application Prvi primer ce biti sasvim jednostavan. Na formi ce biti jedno dugme koje ce, kada bude pritisnuto, prikazati poruku "Hello world!!!", ali na srpskom :) Kontrole cemo dodavati sa Component

Upload: tranminh

Post on 22-May-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Tutorial - Delphi skola 1

Programe cu raditi u Delphi 7, ali ce vecina moci bez problema da se uradi i u ranijim verzijama.Necemo se patiti sa konzolnim programima (mozda ih kasnije budemo radili) nego cemo odmah praviti GUI i kroz neke jednostavne programcice i igre objasnjavati sta koja kontrola moze i slicno.Predpostavljam da vec znate nesto o Delphi IDE tako da o tome necu mnogo pricati. Spomenucu samo ono sto budemo koristili i to samo jednom.Bez daljeg odlaganja pocinje prva lekcija :)

Kada pokrenete Delphi projekat ce vam vec biti otvoren. Ako to nije slucaj novi projekat se kreira tako sto iz File menija izaberete New->Application

Prvi primer ce biti sasvim jednostavan. Na formi ce biti jedno dugme koje ce, kada bude pritisnuto, prikazati poruku "Hello world!!!", ali na srpskom :) Kontrole cemo dodavati sa Component List

Komponente se na formu dodaju vrlo lako. Neki od nacina su da kliknete dva puta na kontrolu i ona ce se pojaviti negde na sredini forme sa default velicinom, da kliknete jednom na kontrolu i jednom

Page 2: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

na formu i kontrola ce se pojaviti gde ste kliknuli sa default velicinom. Mozete i da jednom kliknete na kontrolu zatim da na formi kliknete i vuzete strelicu tako da oznacite zeljenu velicinu kontrole i ona ce se pojaviti na zeljenom mestu i imace oznacenu velicinu (ili pribliznu njoj ako komponenta ima neka ogranjicenja za velicinu).

Dodajmo komponentu TButton sa Standard palete bilo gde na formu.

Sad kad imamo formu i na njoj dugme pozabavicemo se nekim njihovim osobinama (properties). U zavisnosti od kontrole ona moze imati ime, velicinu, boju, svoju vrstu fonta i slicno. Ta osobine se menjaju u Object Inspector-u.

Pa... hajde da promenimo neke osobine dugmeta.

Prvo sto imam naviku da radim je promena imena. Tesko se snalazim u kodu kad mi se kontrole

Page 3: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

zovu Button1, Button2,.. ButtonX jer ne znam sta koje dugme radi. Moram da pogledam formu da bih mogao da se setim. Zato kontrolama dajem neko opisno ime. Mozda postoji neki bolji nacin (ispravite me ako zelite da koristimo drugacije nazive), ali ja koristim ovaj nacin:Prva tri slova je skraceni naziv kontrole napisan malim slovima. Tako da za ovu kontrolu stavljam btn.Ostatak je kratak opis onoga sto kontrola radi. Ovo dugme ce prikazivati poruku pa cu ga nazvati ShowMsg.Dakle, pun naziv kontrole ce biti btnShowMsg. Naziv kontrole se nalazi u Name property-u... pa... menjajmo ga :)

Sledeci bitan property za dugme je Caption. To je tekst koji ce se videti na dugmetu. Neka pise... recimo... "&Prikazi poruku". & u Caption-u oznacava ono podvuceno slovo u kontroli. U ovom slucaju ce to biti slovo P i pritisak na Alt + P ce biti isto kao i pritisak na dugme.Pozicija dugmeta (uglavnom i svih ostalih kontrola) se kontrolise Left, Top, Width i Height property-ima. Left je leva ivica kontrole, Top gornja, Width je sirina, a Height je visina. Pomeranjem kontrola po formi ova polja se sama podesavaju na vrednost na kojoj se trenutno nalazi kontrola tako da jednostavnim pomeranjem mozete postavljati ove property-e. Postavimo Left na 51, Top na 13, Width na 99 i Height na 25. Kasnije cemo spomenuti i neke stvari koje IDE ume da uradi (Align, Size, Scale) koje nam mogu pomoci prilikom postavljanja kontrola.

Pa... to je dovoljno za dugmence... sad da se bacimo na formu. Prvo ime... to je forma pa su prva tri slova frm, a uz to je i glavna forma pa cemo je nazvati frmMain. Caption postavimo na "Lekcija br. 1". Poziciju mozemo menjati isto kao i kod dugmeta, ali forma ima jos 2 property-a za kontrolu sirine i visine. Kada postavimo Height na 200 u tih 200 pixela ulazi i visina titlebar-a, border-a, meni-a... slicno se desava ako postavimo Width na neku vrednost. Ako zelimo da onaj deo u kojem mogu da se nalaze kontrole (to je Client prostor) bude odredjene velicine onda koristimo ClientWidth i ClientHeight. Za nasu formu postavimo ClientWidth na 200, a ClientHeight na 50.Kad vec pricamo o titlebar-u i border-ima treba spomenuti da se njihov izgled moze birati BorderStyle, BorderWidth i BorderIcons property-ima. BorderStyle ima nekoliko opcija.Po defaultu vrednost je bsSizable sto znaci da forma ima titlebar i ivice koje mogu da menjaju velicinu forme.bsSingle je slicno kao i dsSizable jedino sto nije moguce menjati velicinu forme.bsNone znaci da nema ni ivica ni titlebar-a.bsDialog ima titlebar i ivice, ali nije moguce menjati velicinu forme i BorderIcons vrednost se zanemaruje.bsSizeToolWin daje formi tanak titlebar, ivice koje mogu da menjaju velicinu forme, a vrednost BorderIcons se zanemaruje.bsToolWindow je slicno kao i bsSizeToolWin samo sto menjanje velicine forme nije dozvoljeno.

BorderWidth oznacavi sirinu ivica u pixelima. 0 znaci da se koriste sistemska podesavanja.

BorderIcons su oni dugmici u gornjem desnom uglu i ikonica u gornjem levom uglu. biSystemMenu oznacava da li ce se ikonica videti, a biMinimize, biMaximize i biHelp da li ce se videti dugmici za minimize, maximize i mali znak pitanja. Za nasu formu cemo postaviti BorderStyle na bsSingle tako da korisnik ne moze da joj menja velicinu i u BorderIcons cemo iskljuciti biMaximize tako da forma

Page 4: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

ne moze da se maximizira.Kod forme cemo jos menjati Position property. Ovde mozemo birati gde ce se forma prikazati kad se kreira.poDefault oznacava da Windows sam odluci gde i koje velicine ce biti forma.poDefaultPosOnly znaci da ce forma biti velicine koju smo odredili, ali ce je Windows postaviti gde zeli.poDefaultSizeOnly, pozicija ce biti kako smo odredili, ali ce velicinu da odredi Windows.poDesigned znaci da ce sve biti kako smo postavili.poDesktopCenter znaci da ce velicina biti kako sto smo je podesili, ali ce forma biti postavljena na sredinu desktop-a. Kod ovog podesavanja treba obratiti paznju da desktop moze biti rasiren i preko vise monitora.poMainFormCenter postavlja poziciju forme na centar glavne forme.poOwnerFormCenter znaci da ce forma biti u centru neke druge forme koja ju je kreirala.poScreenCenter znaci da ce se forma pojaviti na centru ekrana.Za nas primer postavimo Position na poScreenCenter.

Jos malo i zavrsili smo prvu lekciju. Ostaje nam jos samo da odradimo nesto kada se dugme klikne. U Delphi-u postoje dogadjaji (event-i). Kad se nesto dogodi poziva se odredjeni deo koda. Svaka kontrola moze da reaguje na razne dogadjaje. Nama je sada bitan dogadjaj kada se klikne na nase dugme. Izaberimo dugme na formi i u Object Inspectoru kliknimo Events jezicak.

Kada kliknemo na dugme to ce aktivirati OnClick event. Delphi nam moze pomoci da ispise praznu proceduru za event tako sto dva puta kliknemo na combobox pored naziva event-a. Kada to uradimo za OnClick event Delphi ce nam dodati sledeci kod

procedure TfrmMain.btnShowMsgClick(Sender: TObject);

Page 5: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

begin

end;

Ostaje nam jos samo da napisemo kod za prikazivanje poruke.

procedure TfrmMain.btnShowMsgClick(Sender: TObject);begin  ShowMessage('Zdravo svete!!!');end;

ShowMessage funkcija uzima samo jedan parametar, text koji se prikazuje u dialogu sa samo Ok dugmetom i koji ima naziv isti kao i aplikacija.

Eto... dosli smo skoro do kraja. Sad bi mogli i da snimimo nasu aplikaciju :) Snimanje se najlakse vrsi klikom na File->Save all. Ta komanda ce snimiti sve fajlove koji su promenjeti tako da necete morati da se brinete da li ste sve snimili ako imate vise fajlova u projektu.

Sad da smislim sta da stavim za drugu lekciju :)Tutorial - Delphi skola 2

U drugoj lekciji cemo pokazati kako se u programu mogu menjati osobine kontrola. Cesto ce se u programu desavati da ne znamo sta ce trebati da pise u Caption-u nekog dugmeta nego ce to zavisiti

od podesavanja koja ce izabrati korisnik (izbor jezika ili nesto slicno). Pa... da vidimo kako se to radi.

Prvo sredimo formu. Nazovimo je frmMain, u Caption napisimi Lekcija br. 2, Width i Height na 400 i Position na poScreenCenter.

Dodajmo 4 TEdit kontrole iz Standard palete. One ce nam sluziti da unosimo podatke koje ce menjati izgled neke druge kontrole koju cemo kasnije dodati.

Prvi TEdit postavimo na Left 8 i Top 8. Text property je text koji se vidi u Edit box-u i za sad cemo ga obrisati. Ovaj Edit box ce nam cuvati podatak o Left propery-u kontrole koju cemo kontrolisati pa

cemo ga nazvati txtLeft.Sledecu kontrolu cemo postaviti malo ispod prve... na Left 8 i Top 32. Obrisimo Text property i nazovimo kontrolu txtTop. Slicno cemo raditi i za sledeca dva edit box-a. Oba cemo postaviti na

Left 8, jedan na Top 56, a drugi Top 80. Obrisacemo im Text property i nazvati ih txtWidth i txtHeight.

Ostao nam je jos jedan edit box. Obrisimo mu Text property i postavimo ga na Left 8 i Top 104. Ovaj edit ce kontrolisati sta ce pisati u Caption property-u kontrole koju cemo menjati pa ga

nazovimo txtCaption.

Poslednje sto nam je potrebno za sad je je dugme koje ce na osnovu podataka iz edit box-eva promenuti kontrolu koju zelimo da menjamo. Postavimo TButton na formu (Left 8, Top 136), nazovimo ga btnApply i u Caption napisimo Apply. Uradicemo jos jednu stvar... postavicemo

Page 6: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Default property na True.Default property sluzi da se aktivira OnClick event dugmeta pritiskom na Enter cak i kada ono nije

selektovano tj. nema fokus. Samo jedno dugme sme da ima Default = True.

Sad da dodamo kontrolu koju cemo da pomeramo :)Prvo cemo dodati jedan TPanel. TPanel postavlja praznu povrsinu na prozoru u kojoj mozemo da

stavljamo druge kontrole. Panel ce nam pomoci da onemogucimo kontrolu koju stavimo u njega da izadje iz okvira TPanela. Takodje ce i koordinate kontrole u Panelu biti relativne u odnosu na taj

panel. To znaci da ako kontrolu stavimo na Left 0 Top 0 ona nece biti u gornjem lefom cosku forme, nego u gornjel levom cosku panela.

Obrisimo Caption panela i postavimo Width na 250. Sad cemo iskoristiti neke olaksice koje nam Delphi pruza. Hocemo da napravimo da se panel nalazi sa desne strane forme. To cemo uraditi tako sto cemo postaviti Align property na alRight. Vidite kako se panel odmah rasirio po desnoj strani.

Bez obzira kolika je visina forme panel ce uvek sam podesavati svoju visinu da bi zauzeo celu visinu forme. Align property moze postaviti formu na sve 4 strane forme ili preko cele forme (alClient).

Panel je sada sa desne strane, ali bilo bi dobro da stalno bude isto udaljen od svih ivica forme... da ne bude sirok samo 250 pixela ako se forma rasiri ili skupi nego da se siri i skuplja zajedno sa formom.

Za to se koristi Anchors property. Mozemo birati za koju ivicu forme da se kontrola "zakaci". Po default-u kontrola je zakacena za gornju i levu ivicu sto znaci da bez obzira kako menjamo velicinu forme kontrola uvek ostaje isto udaljena od gornjeg desnog ugla forme. Za nas panel mi bi zeleli da uvek bude udaljen od svih stranica kao sto je sad pa cemo ukljuciti sve opcije u Anchors property-u.

Nazovimo ovaj panel... recimo... pnlTestArea.

Page 7: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Ok... sad cemo da na panel dodamo kontrolu koju ce program menjati. Neka to bude jedan TButton. Da bi smo dodali kontrolu u panel prvo treba da ga obelezimo na formi i onda da dodamo kontrolu.

Necemo nista menjati kod ovog dugmeta, samo ga nazovimo btnTestButton.

To je bilo to sto je vezano za pravljenje forme... sada da pisemo malo koda :) Pisacemo samo kod za OnClick event btnApply dugmeta. Naucili smo u prvoj lekciji kako Delphi moze da nam pomogne da pocnemo da pisemo event... u Object Inspectoru izaberemo Events jezicak i dva puta kliknemo u

combo box pored imena eventa koji zelimo da pisemo.

procedure TfrmMain.btnApplyClick(Sender: TObject);begin

  btnTestButton.Left := StrToInt(txtLeft.Text);  btnTestButton.Top := StrToInt(txtTop.Text);

  btnTestButton.Width := StrToInt(txtWidth.Text);  btnTestButton.Height := StrToInt(txtHeight.Text);

  btnTestButton.Caption := txtCaption.Text;end;

Vidite da koristimo u kodu btnTestButton.Left, btnTestButton.Top i slicno... primecujete da je btnTestButton ime dugmeta kojeg zelimo da menjamo. Da bismo pristupili kontroli u kodu dovoljno

je da samo napisemo njeno ime jer je Delphi vec postavljanjem kontrole na formu napravio i

Page 8: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

promenljivu koja je vezana za tu kontrolu i nosi njeno ime. Sledece sto primecujemo da posle imena kontrole stoji tacka i ime nekog property-a. Znamo da dugme ima i left i top property i sta oni te

osobine rade. U kodu je dovoljno samo dodeliti vrednost ImeKontrole.ImeProperya i odgovarajuci property ce dobiti novu vrednost :) Prilicno lako. Citanje property-a je takodje lako... koristili smo u kodu txtLeft.Text... taj deo koda nam je dao vrednost Text property-a kopntrole txtLeft. Potpuno je

ispravno napisati

S := txtLeft.Text

Promenljiva S ce tada dobiti vrednost Text property-a.

Za slucaj da ne znate sta radi funkcija StrToInt ona prevodi string (Text property edit box-a je string) u Integer (Left, Top, Width i Height property-i su Integeri).

To je sve sto je potrebno da bi program radio... pokrenimo ga i mozemo da menjamo polozaj, velicinu i text dugmeda :)

Tutorial - Delphi skola 3

U prosloj lekciji smo naucili kako se u toku izvrsavanja programa citaju i menjaju property-i kontrola. Ovog puta cemo nauciti kako se u toku rada programa dodaju i brisu kontrole na formi.

Krenucemo sa formom sirine i visine 400.Dodajmo jedno dugme na koordinatama 8, 8 sa default visinom i sirinom. Kada to dugme budemo pritisnuli ono ce kreirati novu kontrolu pa ga nazovimo btnDodaj i u Caption stavimo "Dodaj".Pored tog na 88, 8 postavimo novo dugme i nazovimo ga btnObrisi... pretpostavljate sta ce to dugme da radi :).Jos cemo dodati evente za ova dva dugmeta, a sve ostalo radimo u kodu.

Page 9: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Komponente koje cemo kreirati ce biti TCheckBox. Text ce biti isti za sve "Da li da obrisem" i sve check box-ove koji su obelezeni ce dugme Obrisi da obrise.Hajde da dodajemo komponente... pisacemo kod za OnClick event btnDodaj dugmeta

procedure TfrmMain.btnDodajClick(Sender: TObject);var  chbNew: TCheckBox;begin  chbNew := TCheckBox.Create(Self);  chbNew.Caption := "Da li da obrisem";  chbNew.Left := Random(300);  chbNew.Top := 50 + Random(300);end;

Definisali smo promenljivu tipa TCheckBox i prvo sto smo uradili je kreiranje novog objekta tipa TCheckBox. Kreiranje novog objekta se vrsi pozivanjem funkcije Create. Parametar koji prosledjujemo je objekat koji je "vlasnik" nase kontrole. Posto se kontrola nalazi na formi kao parametar prosledjujemo nasu formu (Self moze da se koristi samo u funkcijama i procedurama nekih klasa i Self oznacava taj objekat cija je funkcija ili procedura pozvana).Ostatak je jasan :) Postavljamo Caption i Left i Right property (koristili smo Random funckiju koja vraca "slucajan" broj od 0 do parametra koji smo dali). I to je to... ovaj kod ce nam kreirati nove kontrole. Kod kreiranja kontrola bitno je samo da pozovete Create i da kao parametar postavite formu u kojoj ce se te nove kontrole nalaziti.

Ostaje nam jos kod za brisanje u OnClick eventu btnObrisi dugmeta. Koristicemo mogucnost koju nam daju forme i vecina objekata koje mozemo da postavimo na formama... Pretrazivacemo sve kontrole i proveravato da li su to check box i ako jesu onda cemo pogledati da li su "otkaceni"... ako jesu onda ih brisemo :) Nista komplikovano, zar ne :).

procedure TfrmMain.btnObrisiClick(Sender: TObject);var  I: Integer;begin  for I := ControlCount - 1 downto 0 do  begin    if (Controls[I] is TCheckBox) and       (TCheckBox(Controls[I]).Checked) then      Controls[I].Free;  end;

Page 10: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

end;

ControlCount je property koji nam govori koliko komponenti ima u formi (ili nekom drugom objektu). Posto ne znamo koliko cemo imati komponenti koristimo ovaj property da do saznamo. Sledeci property koji prvi put srecemo je Controls. To je niz komponenti koje se nalaze na formi. Pregledanjem tog niza mozemo izabrati bilo koju komponentu.U Delphi-u postoji rezervisana rec IS. Ona se koristi da se proveri da li je neki objekat odredjene klase. Koristili smo Controls[I] is TCheckBox sto nam vraca True ako je objekat koji trenutno gledamo TCheckBox ili False ako nije.Jedna od vrlo koristnih mogucnosti Delphi-a je "type casting" sto nam omogucava da bilo koju promenljivu "gledamo" kako je zelimo. To bi znacilo da ako deklaricemo promenljivu C kao Char i pristupimo joj ovako:

Byte(C)

Delphi ce sam podatak koji se nalazi u C da protumaci kao da je u toj lokaciji upisan Byte. To smo radili i mi kad smo napisali TCheckBox(Controls[I]). Prvo smo proverili da li je Controls[I] TCheckBox i sada posto smo 100% sigurni da jeste slobodno mozemo da kazemo Delphio da taj podatak tumaci kao TCheckBox. Proverili smo da li je property Checked (da li je check box "otkace") True i ako jeste brisemo kontrolu.Svi objekti u Delphi-u se brisu sa Free funkcijom i svaki objekat je ima.

To bi bilo sve... kod za brisanje ce obrisati sve one cjeck box-ove koji su "otkaceni" pritiskom na dugme. Neko ce se mozda zapitati sta se desava sa onim objektima koje smo kreirali i potom ugasili program, a nismo ih pre toga obrisali!? Za njih ce se pobrinuti forma jer smo prilikom kreiranja objekta (TCheckBox.Create(Self)) rekli ko je odgovoran za njega i zbog toga ce ga forma, kada i sama bude trebala da se obrise, obrisati.

To je to za ovaj put :)

Page 11: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Tutorial - Delphi skola 4

U ovoj lekciji cemo objasniti malo Canvas property kontrola i pokazacemo kako je moguce crtati po njima. Canvas je klasa koja nam omogucava da vrlo lako menjamo linije kojom se crta, fontove kojima pisemo, boje i oblike sara figura koje crtamo...Ovog puta cemo koristiti Canvas property forme, a na isti nacin se koristi i Canvas svih ostalih kontrola.

Postavicemo ClientWidth i ClientHeight na 608 i postaviti da formi ne moze da se menja velicina i da se pojavljuje na sredini ekrana. Ostaje nam samo jos da pisemo kod... ceo kod ce nam se nalaziti u OnPaint eventu forme. Ovaj event se poziva kad god forma treba da se iscrta (kada se kreira, kada se promeni velicina, kada se nas prozor prekrije nekim drugim i zatim ponovo otkrije...)

Da pocnemo sa crtanjem... nacrtacemo par jednostavnih oblika. Pravougaonik, elipsu i pravougaonik sa oblim ivicama.

  Canvas.Rectangle(8, 8, 100, 50);  Canvas.Ellipse(108, 8, 200, 50);  Canvas.RoundRect(208, 8, 300, 50, 20, 20);  Canvas.Arc(308, 8, 400, 50, 354, 0, 400, 29);  Canvas.Chord(408, 8, 500, 50, 454, 0, 500, 29);  Canvas.Pie(508, 8, 600, 50, 554, 0, 600, 29);

Prva cetiri parametra predstavljaju koordinate tacaka koje definisu objekat koji konstruisemo. Za pravougaonik prva dva parametra su X i Y koordinata gornje leve tacke, a druga dva parametra su X i Y koordinate donje desne tacke. Treba samo imati u vidu da objekti nece biti nacrtani skroz do donje leve ivice nego ce biti za 1 pixel manji... mi smo definisali da je donja tacka na 100, 50 sto bi znacilo da ce stvarna donja desna ivica biti na 99, 49. Da smo hteli da nacrtamo kvadrat samo bi trebali postaviti koordinate tako da je X kooridana desne ivice - X koordinata lefe ivice jednaka Y koordinata donje ivice - Y koordinata gornje ivice :)Za elipsu je prica ista... devinisemo pravougaonik u kojoj ce biti iscrtana elipsa. Sve sto je napisano za pravougaonik vazi i za elipsu.RoundRect crta pravougaonik sa oblim ivicama... prva cetiri parametra imaju isto znacenje kao i kod crtanja pravougaonika, a druga dva definisu sirinu i visinu elipse koja ce predstavljati uglove oblog pravougaonika.Arc, Chord i Pie su funkcije za crtanje dela elipse na razlicite nacine. Prva cetiri parametra su ista kao i kod crtanja pravougaonika. Sledeca dva predstavljaju X i Y koordinatu koja zajedno sa centrom elipse definise liniju. Tacka u kojoj ta linija preseca elipsu je pocetak dela elipse koji se crta. Poslednja dva parametra zajedno sa koordinatom centra elipse definisu drugu liniju koja na mestu sa presekom elispe definise kraj dela elipse koji se crta. Elipsa se crta u smeru obrnutom od smera kazaljke na satu.Funkcija Arc crta luk izmedju te dve tacke na elipsi, Chord radi isto sto i Arc samo sto jos i spaja te dve tacke tako da se dobija zatvorena linija. Pie crta slicno kao i Chord samo sto se dve krajnje tacke

Page 12: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

ne spajaju direktno nego linija ide iz jedne tacke prema centru i zatim iz centra prema drugoj tacki.

Svi objekti koje crtamo imaju linije koje ih definisu. Za sad smo crtali samo tankom, crnom, punom linijom. Canvas nam daje mogucnost da koristimo deblje linije, linije bilo koje boje i linije koje su isprekidane. Za biranje izgleda linije se koristi Pen property Canvas-a. Ono sto nam je za pocteak bitno je Pen.Width (sirina linije), Pen.Color (boja linije) i Pen.Style (izgled linije... puna, isprekidana...). Treba samo obratiti paznju da nije moguce crtati isprekidane linije ako je Pen.Width vece od 1. Promenucemo izgled linije i ponovo iscrtati ove oblike.

  with Canvas.Pen do  begin    Color := clBlue;    Style := psDashDot;  end;  Canvas.Rectangle(8, 68, 100, 110);  Canvas.Ellipse(108, 68, 200, 110);  Canvas.RoundRect(208, 68, 300, 110, 20, 20);  Canvas.Arc(308, 68, 400, 110, 354, 0, 400, 89);  Canvas.Chord(408, 68, 500, 110, 454, 0, 500, 89);  Canvas.Pie(508, 68, 600, 110, 554, 0, 600, 9);

Zatvoreni oblici imaju i boju kojom se boji unutrasnjost. Boja unutrasnjosti i sara se odredjuju Brush property-jem Canvas-a. Koristimo Brush.Color (boja unutrasnjosti), Brush.Style (izgled sare... horizontalne linije, vertikalne, krstici...) i Brush.Bitmap (moguce je koristiti sliku dimenzija 8*8 za saru). Sad cemo opet promenuti boju linije, a ovog puta i pozadine pa da vidimo kako ce sad nasi objekti izgledati.

  with Canvas.Pen do  begin    Color := clBlue;    Width := 3;  end;  with Canvas.Brush do  begin    Color := clRed;    Style := bsDiagCross;  end;  Canvas.Rectangle(8, 128, 100, 170);  Canvas.Ellipse(108, 128, 200, 170);  Canvas.RoundRect(208, 128, 300, 170, 20, 20);  Canvas.Arc(308, 128, 400, 170, 354, 0, 400, 149);  Canvas.Chord(408, 128, 500, 170, 454, 0, 500, 149);

Page 13: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

  Canvas.Pie(508, 128, 600, 170, 554, 0, 600, 149);

Jos malo cemo se igrati linijama pre nego sto predjemo na ispisivanje teksta. Crtanje obicne prave linije se izvodi pozivanjem dve funkcije, MoveTo i LineTo. MoveTo postavlja pocetnu tacku za crtanje, a LineTo crta od pocetne tacke do koordinate koja je definisana i zatim postavlja pocetnu tacku tamo gde se linija zavrsava tako da sledecim pozivanjem funkcije LineTo linija pocinje od mesta gde se zavrsila prosla funkcija LineTo. Sada cemo narctati pravougaonik crtanjem svake linije posebno.

  Canvas.MoveTo(8, 200);  Canvas.LineTo(600, 200);  Canvas.LineTo(600, 250);  Canvas.LineTo(8, 250);  Canvas.LineTo(8, 200);

Ostale funkcije koje cemo koristiti za crtanje kao ulaz zahtevaju niz koordinata (array of TPoint) pa moramo definisati jednu promenljivu

  var  Tacke: array of TPoint;

Pocecemo sa PolyBezier funkcijom. Ona crta Bezier krive. Na osnovu 4 tacke (pocetak, dve kontrolne i kraj) crta se kriva linija. Linija se crta na sledeci nacin... krece od pocetka i polako se priblizava prvoj kontrolnoj tacki, zatim odatle krece polako prema drugoj i zatim se krece polako prema krajnjoj tacki. Kroz pocetnu i krajnju tacku prolazi, a kontrolne tacke samo deformisu liniju i sto su dalje linija se sve vise krivi. Za crtanje jedne linije koriste se 4 tacke kao sto sam vec objasnio, a za svaku sledecu se koriste jos samo 3 tacke (dve kontrolne i krajnja) jer se krajnja tacka prethodne linije koristi kao pocetak sledece tako da za crtanje 3 linije jednim pozivom ove funkcije treba niz od 10 tacaka.

  SetLength(Tacke, 4);  Tacke[0] := Point(8, 300);  Tacke[1] := Point(200, 240);  Tacke[2] := Point(500, 360);  Tacke[3] := Point(600, 280);  Canvas.PolyBezier(Tacke);

Page 14: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Sledece dve funkcije su vrlo slicne. Polygon i Polyline sluze za crtanje vise povezanih pravih linija. Polyline crta linije od prve do druge tacke, od druge do trece... od predzadnje do zadnje i taj objekat se smatra za otvoren i zato se ne boji iznutra. Polygon radi isto sto i Polyline samo sto na kraju jos nacrta i liniju izmedju zadnje i prve tacke i taj objekta se smatra zatvorenim i on se boji iznutra.

  SetLength(Tacke, 5);  Tacke[0] := Point(200, 350);  Tacke[1] := Point(250, 450);  Tacke[2] := Point(140, 380);  Tacke[3] := Point(260, 380);  Tacke[4] := Point(150, 450);  Canvas.Polygon(Tacke);

  Canvas.Polyline([Point(400, 350),  Point(500, 450), Point(300, 450)]);

To bi bilo to o linijama i oblicima... sad cemo malo da predjemo na fontove.Koristicemo Font property Canvas-a da definisemo font, velicinu, boju, bold, italic ili neki drugi stil za pisanje. Property-ji fonta koji su nam bitni su Font.CharSet (ovde biramo da li cemo koristiti engleska slova, srpska, ruska...), Font.Color (boja fonta), Font.Size (velicina fonta), Font.Name (ime fonta) i Font.Style (bold, italic...). Pre nego sto budemo ispisivali text postavicemo font.

  with Canvas.Font do  begin    Name := 'Tahoma';    Size := 10;    Color := clRed;    Style := [fsBold];    Charset := EASTEUROPE_CHARSET;  end;

Ovo ce postaviti font na Tahoma, crveni i bold, velicine 10 i moci cemo da koristimo nasa slova jer smo postavili Charset na EASTEUROPE_CHARSET.Funkcije TextOut i TextRect se koriste za ispis teksta.TextOut uzima X i Y koordinatu gde ce tekst biti iscrtan i tekst... vrlo je laka za koriscenje.

  Canvas.TextOut(8, 550, 'Ovako radi TextOut funkcija...' +  'cak podržava i naša slova!');

Page 15: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

TextRect radi malo drugacije. Ona za prvi parametar uzima promenljivu tipa TRect (ona sadrzi 4 koordinate kao kod crtanja pravougaonika) i taj pravougaonik se prvo brise pozadinskom bojom (po defaultu je to crna boja i moguce je da bude promenjena, ali cemo o tome nekom drugom prilikom) zatim se na osnovu sledeca dva parametra (X i Y koordinata tacke od koje ce poceti pisanje teksta) tekst iscrtava, ali samo ako upadne u pravougaonik koji smo definisali.

  Canvas.TextRect(Rect(300, 570, 600, 600), 250, 570,  'Ovo je malo duži tekst, ali nece moci da se vidi ceo' +  ' jer mu ova funkcija to nece dozvoliti!!!');

To bi bilo to za ovu lekciju... nadam se da nije bila previse duga i naporna :)

Tutorial - Delphi skola 5

Do sad smo vec naucili dosta, ali jos ne znamo sta koja komponenta radi i za sta se koristi. Sada cemo objasniti nekoliko komponenti koje se najcesce koriste.

TButton komponentu smo vec koristili. To je obicno dugmence koje moze da izvrsi nesto kada ga korisnik klikne.

Od property-a izdvajamo:

Action - akcija koja je povezana sa komponentom (o akcijama cemo malo kasnije... ona moze da utice na izgled komponente i na to sta ce komponenta da radi... ovaj property imaju skoro sve

komponente).Anchors - odredjuje kako ce komponenta da menja svoj polozaj i velicinu u odnosu na velicinu

forme (ovaj property imaju skoro sve komponente).Cancel - ako je postavljen na True pritiskon na taster Escape aktivira se OnClick event.

Caption - takst koji se vidi na dugmetu (u ovom tekstu moze da se definise acceleration key... to je taster koji kada se pritisne sa Alt tasterom poziva neku funkciju kontrole... u slucaju TButton

komponente poziva se Click procedura).Constraints - definisemo minimalnu i maximalnu velicinu komponente (ovaj property imaju skoro

sve komponente).Cursor - izgled kursora kada se nadje iznad dugmeta (ovaj property imaju skoro sve komponente).

Default - ako je postavljen na True pritiskom na taster Enter aktivira se OnClick event.DragCursor - izgled kursora kada pocnemo da "vucemo" komponentu (kada kliknemo na nju, ne

pustamo taster misa i pomeramo kursor... ovaj property imaju skoro sve komponente).DragKind - odredjuje da li kada "vucemo" komponentu ona prenosi podatke u drugu komponentu ili se menja njen polozaj (o ovome cemo malo kasnije... ovaj property imaju skoro sve komponente).

Page 16: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

DragMode - odredjuje da li kada zelimo da "vucemo" komponentu Delphi sam zapocinje tu operaciju ili moramo sami da je zapocnemo (ovaj property imaju skoro sve komponente).

Enabled - ako je postavljen na True dugme moze da reaguje na poruke (ovaj property imaju skoro sve komponente).

Font - izgled slova kojima je ispisan tekst na dugmetu.Height - visina komponente (ovaj property imaju skoro sve komponente).

Hint - tekst koji se prikazuje ako se kursor malo duze zadrzi na komponenti (ovaj property imaju skoro sve komponente).

Left - udaljenost komponente od leve ivice forme (ovaj property imaju skoro sve komponente).ModalResult - kada napravite neki dialog, postavite dugme na njega i ModalResult postavite na bilo

sta osim mrNone pritiskon na to dugme dialog ce se zatvoriti i vratiti vrednost ovog property-ja.PopupMenu - meni koji se pojavljuje ako desnim tasterom kliknemo na komponentu (ovaj property

imaju skoro sve komponente).ShowHint - da li se vrednost property-ja Hint prikazuje ili ne (ovaj property imaju skoro sve

komponente).TabOrder - na kom se mestu nalazi ova komponenta kada se kroz komponente prolazi pritiskom na

taster Tab (ovaj property imaju skoro sve komponente).TabStop - da li se komponenta moze izabrati pritiskanjem Tab (ovaj property imaju skoro sve

komponente).Tag - ovu vrednost ne koristi Delphi... mozete staviti bilo sta i koristiti tu vrednost kako god zelite

(ovaj property imaju skoro sve komponente).Top - udaljenost od gornje ivice forme (ovaj property imaju skoro sve komponente).

Visible - da li je komponenta vidljiva ili ne (ovaj property imaju skoro sve komponente).Width - sirina komponente (ovaj property imaju skoro sve komponente).

WordWarp - ako Caption ne moze da se ispise u jednom redu zato sto je siri od komponente da li da se tekst ispise u vise redova (ovaj property imaju skoro sve komponente).

To bi bile osobine koje bi trebali da znamo (neke i nisu tako bitne)... preskocili smo neke koje nisu mnogo bitne, ali cemo ih kasnije kroz primere objasniti.

Od eventa izdvajamo:

-OnClick: poziva se kada se klikne na dugme.-OnContextPopup: poziva se kada se otvara meni desnim klikom na komponentu.

-OnDragDrop: poziva se kada se podaci koji se prevlace sa druge komponente puste na ovu komponentu.

-OnDragOver: poziva se kada se podaci koji se prevlace sa druge komponente nadju iznad ove kontrole.

-OnEndDock: poziva se kada se zavrsi pomeranje komponente.-OnEndDrag: poziva se kada se zavrsi prevlacenje podataka.

-OnEnter: poziva se kada kontrola dobije fokus.-OnExit: poziva se kada kontrola izgubi fokus.

-OnKeyDown: poziva se kada se neki taster pritisne.-OnKeyPress: poziva se kada se neki taster pritisne i otpusti (ako se taster drzi malo duze Delphi poziva OnKeyPress vise puta u zavisnosti od duzine pritiska na karakter i podesavanja tastature u

Control Panel-u).

Page 17: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

-OnKeyUp: poziva se kada se tastar pusti.-OnMouseDown: poziva se kada se taster misa pritisne.

-OnMouseMove: poziva se kada se mis pokrece.-OnMouseUp: poziva se kada se taster misa pusti.

-OnStartDock: poziva se kada se zapocne pomeranje komponente.-OnStartDrag: poziva se kada se zapocne prevlacenje podataka.

To su eventi za TButton komponentu... mnogi od ovih eventa ce se pojavljivati i za druge komponente pa ih necemo ponovo objasnjavati.

Idemo sada na sledecu komponentu, ali necemo spominjati prperty-je koji se pojavljuju cesto (Left, Top, Width, Height, Caption... i slicne), nego samo one specificne za datu komponentu.

TEdit komponenta sluzi za unos teksta ili za prikazivanje teksta korisnicima tako da taj tekst mogu da obeleze i kopiraju.

Od property-a izdvajamo:

-AutoSelect: ako je ovaj property True kada komponenta dobije fokus tekst se automatski selektuje.-AutoSize: visina komponente se automatski prilagodjava tekstu (prilikom promene fonta ili izgleda

ivice komponente)-BevelEdges: dodatne ivice oko komponente (izgleda lepo kada je BorderStyle = bsNone).

-BevelInner: izgled unutrasnjih ivica.-BevelOuter: izgled spoljasnjih ivica.

-BevelKind: nacin iscrtavanja dodatnih ivica.-BorderStyle: da li komponenta ima standardne ivice.

-CharCase: odredjuje da li da se sva slova koja korisnik unosi pretvaraju u mala ili velika slova, ili da se ostavljaju kao sto su unesena.-Color: boja pozadine komponente.

-Ctl3D: da li da se koristi 3D izgled prilikom crtanja.-HideSelection: da li da tekst izgleda kao neobelezen kada komponenta izgubi fokus.

-MaxLength: maksimalna duzina teksta u komponenti.-PasswordChar: ako komponenta treba da sluzi za unos sifara ovaj property se postavlja na vrednost drugaciju od #0 i tada svaki karakter koji unesemo se u komponenti vidi kao karakter koji smo ovde

definisali.-ReadOnly: nije dozvoljen upis u komponentu (ovo se koristi kada je potrebno samo prikazivati

tekst).-Text: tekst koji se vidi u komponenti.

Od eventa izdvajamo:

-OnChange: poziva se kada se tekst u komponenti promeni.-OnDblClick: poziva se kada se dva puta klikne ka komponentu.

To je to sto je bitno za TEdit komponente.

Page 18: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

TLabel komponenta sluzi za prikaz teksta na formi koji moze da bude povezan sa nekom drugom kontrolom i pritiskom na odredjeni karakter (acceleration key) da prebaci fokus na tu

kontrolu.

Od property-ja izdvajamo:

-Align: vezuje kontrolu za odredjeni deo forme (leva strana, donje, gornja...).-Alignment: mesto na kojem ce se tekst ispisati (horizontalno).

-AutoSize: velicina kontrole se menja na osnovu teksta.-FocusControl: kontrola na koju se prenosu fokus ako se pritisne acceleration key.

-Layout: mesto na kojem ce se tekst ispisati (vertikalno).-ShowAccelChar: odredjuje da li se acceleration key prikazuje i da li se prenosu fokus na zeljenu

kontrolu ako se acceleration key pritisne.-Transparent: odredjuje da li je pozadina komponente providna.

Sve evente koje ima TLabel komponenta smo do sad vec spomenuli.

TMemo je komponenta vrlo slicna TEdit komponenti samo sto sluzi za unos i prikaz teksta koji ima vise redova.

Od property-ja izdvajamo:

-Lines: ovde se nalazi tekst koji je unesen.-ScrollBars: odredjuje koji ce se scroll bar videti na kontroli (horizontalni, vertikalni, oba ili ni

jedan).-WantReturns: odredjue da li kontrola prihvata taster Enter... ako je ovaj property False onda se za

nov red koristi Ctrl + Enter.-WantTabs: odredjue da li kontrola prihvata taster Tab... ako je ovaj property False onda se za nov

red koristi Ctrl + Tab.

Sve evente koje ima TMemo komponenta smo do sad vec spomenuli.

TCheckBox komponenta omogucava korisniku da napravi izbor. Korisnik moze da oznaci check box ili da ga ostavi praznog.

Od property-ja izdvajamo:

-AllowGrayed: dozvoljava trece stanje (gray) kada je check box zasivljen (ovo se koristi kada treba da se naznaci da je korisnik izabrao samo neke opcije).

-Checked: oznacava da li je komponenta obelezena ili nije.-State: daje trenutno stanje komponente.

Sve evente koje ima TCheckBox komponenta smo do sad vec spomenuli.

Page 19: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

TRadioButton sluzi za postavljanje izbora korisniku gde moze da izabere samo jednu od ponudjenih opcija. Ova kontrola nema novih property-ja ni eventa, ali se koristi malo drugacije od ostalih. Ove kompnonente moraju da se grupisu da bi mogle da rade kako treba. Za grupisanje se

uglavnom koriste TGroupBox ili TPanel, a njih cemo uskoro da objasnimo.

Prelazimo na TListBox komponentu. Ova komponente sluzi za prikaz podataka koje korisnik moze da obelezi, da obrise, promeni raspored ili doda nove podatke.

Od property-ja izdvajamo:

-AutoComplete: ako je postavljeno na True kucanjem teksta dok komponenta ima fokus automatski se kroz listu trazi stavka koja pocinje slovima koje smo ukucai.

-Columns: broj kolona liste.-ExtendedSelection: ovaj property se uzima u obzir samo kada je MultiSelect postavljen na True i

oznacava da li korisnik moze da koristi Shift i Ctrl tastere prilikom obelezavanja stavki.-IntegralHeight: oznacava da li ce lista sama da promeni visinu tako da se stavke nikad ne vide samo

delimicno (Height := X * ItemHeight).-ItemHeight: oznacava visinu jedne stavke.

-Items: ovde se cuva lista stavki.-MultiSelect: oznacava da li je dozvoljeno oznacavanje vise od jedne stavke.

-ScrollWidth: oznacava logicku sirinu komponente... ako je potrebno prikazivati stavke koje su previse duge da bi stale u komponentu, ScrollWidth se postavlja na zeljenu sirinu i na osnovu ovog

property-ja se kreira scroll bar koji omogucava skrolovanje podataka po horizontali.-Sorted: oznacava da li su stavke sortirane po abecedi.

-Style: oznacava vrtu list box-a... po default-u ovaj property je lbStandard i tada komponenta sama iscrtava podatke koji se nalase u Items property-ju. Ako je ovaj property lbVirtual kontrola ce sama

iscrtavati podatke, ali ne iz Items property-ja nego one koje joj dajemo preko OnData eveta. OwnerDraw tipovi sluze za to da program sam moze da iscrtava stavke kako zeli (ovako se moze

dobiti vrlo zanimljiv izgled list box komponente).-TabWidth: oznacava sirinu svakog Tab karaktera u teksu stavki koje se iscrtavaju.

Od eventa izdvajamo:

-OnData: daje tekst stavke kada je vrsta list box-a virtual.-OnDataFind: daje redni broj stavke u listi kada je vrsta list box-a virtual.

-OnDataObject: daje objekat vezan za odredjenu stavku kada je vrsta list box-a virtual.-OnDrawItem: poziva se kada treba da se iscrta stavka kada je vrsta list box-a OwnerDraw.

-OnMeasureItem: poziva se kada je potrebno odrediti visinu stavke kada sve stavke nisu iste visine.

To je to za TListBox.

TComboBox komponenta kombinuje TEdit i TListBox komponente. Korisnik moze da izabere stavku iz liste ili da upise njeno ime u edit box-u.

Page 20: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Od property-ja izdvajamo:

-AutoCloseUp: ako je True combo box ce se sam zatvoriti kada se neka stavka izabere.-AutoComplete: text u edit box-u ce se sam popuniti na osnovu slova koje smo uneli i stavki koje se

nalaze u listi.-AutoDropDown: ako je True cim korisnik pocne da pritiska tstere combo box se otvara.

-DropDownCount: broj stavki koje ce se videti kada se combo box otvori.-ItemIndex: redni broj stavke koja je obelezena.

-Style: izgled combo box-a... DropDown omogucava korisniku da ukuca sta zeli u edit (cak i tekst koji ne sadrzi ni jedna stavka), Simple kreira poseban edit i list box, DropDownList ne omogucava

korisniku da kuca sta zeli u edit komponenti nego samo da izabere stavke iz liste, OwnerDraw stilovi su isti kao i kod liste.

Od eventa izdvajamo:

-OnCloseUp: aktivira se kada se combo box zatvori.-OnDropDown: aktivira se kada se combo box otvori.

Ostale evente smo vec ranije objasnili.

TScrollBar je komponentama koja omogucava drugim da pomeraju svoj sadrzaj. Komponente koje imaju potrebe za pomeranjem sadrzaja uglavnom vec imaju TScrollBar u sebi, ali ponekad je

potrebno kreirati i posebnu TScrollBar komponentu.

Od property-ja izdvajamo

-Kind: odredjuje da li je komponenta vertikalna ili horizontalna.-LargeChange: odredjue koliko ce se pozicija pomeriti kada se pritisne PgUP ili PgDown, ili se

klikne sa leve ili desne strane dugmeta koje odredjuje poziciju.-Max: maksimalna vrednost koju pozicija moze da ima.-Min: minimalna vrednost koju pozicija moze da ima.-PageSize: velicina dugmeta koji odredjuje poziciju.

-Position: trenutna pozicija.-SmallChange: odredjue koliko ce se pozicija pomeriti kada se pritisne levo, desno, gore ili dole, ili

se klikne strelica na kraju scroll bar-a.

Od eventa jedini nov je:

-OnScroll: aktivira se kada se pozicija promeni.

TGroupBox je komponenta koja sluzi za grupisanje drugih komponenti. Ova komponenta moze da prihvata druge komponente ako se prevuku preko nje (docking). O ovome ce biti reci u nekom

drugom tutorialu.

Od property-ja izdvajamo:

Page 21: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

-DockSite: odredjuje da li komponenta moze da prihvata druge komponente ako se prevuku preko nje.

Ostali property-ji su vec ranije objasnjeni.

Od eventa izdvajamo:

-OnGetSiteInfo: poziva se kada treba da se odredi gde komponenta koja se prevlaci preko TGroupBox-a moze da se postavi.

-OnUnDock: poziva se kada komponenta treba da se skine sa TGroupBox-a zato sto je korisnik poceo ponovo da je pomera.

TRadioGroup je malo modifikovana TGroupBox komponenta. Ona ne dozvoljava postavljanje drugih komponenti i jedino podrzava TRadioButton komponente na sebi. Ova komponenta olaksava

upotrebu TRadioButton komponenti.

Od property-ja izdvajamo:

-Columns: broj kolona u kojima ce biti kreirane TRadioButton komponente.-ItemIndex: redni broj TRadioButton komponente koja je obelezena.-Items: imena TRadioButton komponenti koje treba da budu kreirane.

Sve evente koje TRadioGroup ima smo ranije vec objasnili.

Poslednja komponenta koju cemo objasniti je TPanel . TPanel komponenta je vrlo slicna TGroupBox komponenti, ali bolje podrzava dodavanje komponenti na sebi.

Od property-ja izdvajamo:

-AutoSize: velicina panela se menja tako da sve komponente koje su na njemu budu vidiljive.-FullRepaint: odredjuje da li ce se ceo panel iscrtati ponovo kada mu se promeni velicina.

-Locked: panel moze sluziti i za uzimanje komponenti iz drugih aplikacije (preko OLE)... da bi se to dozvolilo ovaj property mora biti False.

-UseDockManager: ako je True panel ce koristiti DockManager koji olaksava postavljanje i uklanjanje komponenti na panel-u.

Jedini nov event je:

-OnResize: poziva se kada se promeni velicina panela.

To su neke osnovne komponente koje se najcesce koriste. Ostale komponente cemo objasnjavati kad ih budemo koristili. Sve ostale komponente su uglavnom slicne ovim osnovnim uz neke izmene i

dodatke.

Toliko za sad. Sledeci put cemo da radimo menije.

Page 22: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Tutorial - Message Dialogs

Message Dialogs su jedan od osnovnih elemenata interakcije izmedju korisnika i programa.Sastoje se od teksta i jednog do tri dugmica za izbor.Windows poznaje sledece tipove Message Dialogs-a:- Warning- Error- Information- Confirmation- CustomOsim zadnje, svaka ima standardizovanu ikonicu i naslov koji ce da se pojavi u Title Bar-u.

Prethodni Message Dialog je tipa Warning, i sadrzi dva dugmeta (dugmad su objekti tipa TMsgDlgBtn).Dugmad su takodje unapred definisana, i mogu se odabrati iz sledece grupe:mbOKmbCancelmbYesmbNombAbortmbRetrymbIgnorembAllmbNoToAllmbYesToAllmbHelp

Osim pojedinacnih, Delphi poseduje i predefinisane grupe dugmica:mbYesNoCancel mbYesAllNoAllCancelmbOKCancelmbAbortRetryCancelmbAbortIgnore

Message Dialog ne moze da sadrzi dva dugmeta istog tipa (recimo dva OK dugmeta). Ukoliko

Page 23: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

programer to i pokusa, pojavice se samo jedno dugme.

Da jos napomenemo da su Message Dialogs modalne forme.

Posto smo objasnili sve osnovne elemente Message Dialogs-a, red je i da napravimo jedan. Sintaksa je sledeca:

  MessageDlg(Text, tip, [button1, button2, button3], 0);

gde je Text tekst koji zelimo da se ispise u Message Dialogu, tip je tip poruke (mtWarning, mtError...), a button je tip dugmeta koji zelimo da bude prikazan na poruci (mbOK, mbCancel...). Zadnji parametar je vezan za HelpContext.Konkretno, za poruku sa pocetka teksta bi kod izgledao:

  MessageDlg('System is melting down!!!',              mtWarning, [mbOK, mbIgnore], 0);

Poseban tip poruka su Custom, kod kojih Title Bar nema standardizovane nazive, vec preuzima tekst iz Title Bar-a aplikacije koja je generisala Message Dialog. Custom dialog ne prikazuje nikakvu ikonicu.

Preuzimanje izbora (koje je dugme korisnik pritisnuo) moze se vrsiti na sledeci nacin:

  If MessageDlg('Are you sure ? ', mtConfirmation,     [mbYes, mbNo], 0) = mrYes Then....

Neke ranije verzije Delphi-ja su, kao rezultat izbora, vracale Integer vrednost (ovo je neprovereno, ali izgleda da su u pitanju Delphi 5 i ranije verzije) po sledecoj tabeli:

1 = mrOK2 = mrCancel3 = mrAbort4 = mrRetry5 = mrIgnore6 = mrYes7 = mrNo8 = mrAll9 = mrNoToAll10 = mrYesToAll

Kao primer koji ce demonstrirati sve mogucnosti Message Dialogsa, dajemo program err_gen, koji sam napisao pre godinu dana za svoje potrebe. Osim spomenutih Message Dialogs, program jos sadrzi i rutinu za skrivanje iz Task Bar-a. Svrha programa je bila da ispisuje dialoge preko otvorenih programa, tako da izgleda da su ih ti programi otvorili (Fake Error Messages).

Pozdrav do sledeceg tutorijala

Page 24: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

bobby

Tutorial - Rad sa *.ini fajlovima

Napravili ste aplikaciju koja poseduje nekakva podesavanja, i zelite da podesavanja budu tu i sledeci put kada startujete aplikaciju. Pod Windowsom imate dve mogucnosti: ili da promene sacuvate u Registry bazi, ili da ih sacuvate u INI fajlovima.Mozete naici na razlicita misljenja koja od ove dve metode je bolja. Mnogi ce reci da su INI fajlovi prevazidjeni, i da je koriscenje Registry baze naprednija tehnologija. Ja se necu sloziti sa ovim iz vise razloga:- koriscenje registry baze otezava deinstalaciju programa, tj. program bi morao da negde vodi evidenciju koje kljuceve je koristio, pa da ih obrise pri deinstalciji. Ovo je malo teze podstici ako koristite gotove instalere- koriscenjem registry baze vas program nije vise portabilan (Kylix, CrossKylix)

Ljudi su protivnici INI fajlova zato sto su oni cisto tekstualni fajlovi, i u njima se ne moze nista sakriti. Ovo je samo donekle tacno, posto postoje i binarni INI fajlovi.

Moji argumenti za koriscenje standardnih INI fajlova:- olaksajte korisnicima zivot i pustite ih da edituju INI fajlove- olaksajte deinstalaciju (brisanje samo jednog INI fajla je daleko lakse nego ciscenje registry baze)

Da skratimo uvod, i da predjemo na konkretnije stvari...

INI fajlovi su tekstualni fajlovi koji se sastoje od proizvoljnog broja poglavlja, varijabli, i vrednosti dodeljenih varijablama.Dva poglavlja mogu da sadrze istu varijablu, posto se varijablama eksplicitno pristupa preko imena poglavlja.Primer INI fajla:

[Poglavlje_1]prva_var=32druga_var=srce

[Poglavlje_2]prva_var=45 Pre nego sto krenemo dalje, treba napomenuti da su INI fajlovi case sensitive (razlikuju mala od velikih slova, tako da 'varijabla' nije isto sto i 'Varijabla'). Znakovi (vrednost varijable) iza znaka '=' ce biti citani sve dok se ne naidje na kraj reda. Iz tog razloga je malo teze u INI fajlove, u vrednost jedne varijable, 'strpati' tekstove koji imaju vise redova. I ovo je moguce ako se pre toga uradi konverzija, tako da se svaki ASCII kod 10 i kod 13 pretvore u neki drugi ASCII kod (neki koji se ne koristi za alfabet), i da se kod citanja uradi konverzija nazad.

Page 25: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Da bi se koristili INI fajlovi, potrebno je u 'uses' klauzuli dodati i 'INIFiles'.Prethodni INI fajl bismo mogli koristiti (citati) na sledeci nacin:

var  Ini: TIniFile;  test_1: integer;  test_2: string;  test_3: integer;beginIni := TIniFile.Create('Proba.ini');  try    test_1:=Ini.ReadInteger('Poglavlje_1', 'prva_var', 0);    test_2:=Ini.ReadString('Poglavlje_1', 'druga_var', 'glava');    test_3:=Ini.ReadInteger('Poglavlje_2', 'prva_var', 12);  finally    Ini.Free;  end;end;

Kao sto vidite, citanje se vrsi direktnim dodeljivanjem vrednosti lokalnoj varijabli, a takodje je moguce vrednosti dodeljivati i komponentama, recimo nekoj Labeli:

Label1.Caption:=Ini.ReadString('Poglavlje_1', 'druga_var', '');

Da razjanimo parametre Read metode (ReadBool, ReadString, ReadInteger...):

Neki_String := Ini.ReadString(poglavlje, varijabla, def_vr);

Neki_String je lokalna promenljiva kojoj se dodeljuje vrednostIni je prethodno otvoren INI fajl (Ini := TIniFile.Create('Proba.ini');u prethodnom primeru)ReadString znaci da se vrednost varijable iz INI fajla cita kao Stringpoglavlje - ime poglavlja u INI fajluvarijabla - ime varijable u INI fajludef_vr - ukoliko varijabla ne postoji u INI fajlu, ili nema dodeljenu vrednost, onda lokalnoj varijabli dati ovu vrednost (INI fajl nece biti menjan)

Upis u INI fajl:

var  Ini: TIniFile;  test_1: integer;  test_2: string;  test_3 :integer;beginIni := TIniFile.Create('Proba.ini');  try    Ini.WriteInteger('Poglavlje_1', 'prva_var', test_1);    Ini.WriteString('Poglavlje_1', 'druga_var', test_2);    Ini.WriteInteger('Poglavlje_2', 'prva_var', test_3);    Ini.WriteString('Poglavlje_3', 'prva_var', Label1.Caption);  finally

Page 26: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

    Ini.Free;  end;end; Mislim da je sintaksa jasna. Ukoliko Poglavlje ili varijabla ne postoje u datom INI fajlu - bice formirani, ukoliko vec postoje, samo ce vrednosti biti promenjene. Iz tog razloga ne postoje razlicite metode za prvo formiranje INI fajla, i za kasnije dopisivanje.

Vazno je napomenuti pre nego sto probate prethodne primere, prvo morate da u programu regulisete u kom ce Folderu da se trazi INI fajl. Fajl ce biti potrazen Folderu definisanom u CurrentDir. Ukoliko vasa aplikacija poseduje OpenFileDialog ili slicne, CurrentDir ce se menjati svaki put po pozivanju istog.Prakticno je INI fajl drzati u Folderu aplikacije, pa se onda CurrentDir lako postavlja pomocu:

Setcurrentdir(ExtractFilePath(Application.EXEName));

Ovaj kod ce postaviti da CurrentDir dobije vrednost Foldera u kome se nalazi vas program.

Pozdrav do sledeceg tutorijala

bobby

Tutorial - Rad sa Thread-ovima

Da napomenem na samom pocetku da sledeci tekst sadrzi samo moja iskustva, i rezultate dobijene empirijskim putem. Iako su niti (threads) u Delphi-ju dokumentoveni, Delphi Help nece da pruzi dovoljno informacija da bi moglo da se pocne sa programiranjem threadova.

Za pocetak je potrebno objasniti sta su niti i cemu sluze. Svaki program sadrzi barem jednu nit (Main Thread). Zamislite sada program koji u jednom momentu mora da izvrsi neku operaciju koja traje par sekundi, ili cak minuta. Jasno je da ce program, dok traje ta operacija, biti zamrznut (u ekstremnim uslovima ce i interfejs biti zamrznut, ili pretvoren u beli kvadrat, tj. ni grafika nece da se osvezava).Dolazimo do ideje da bi bilo zgodno da se formira nezavistan proces koji ce da obavi spornu operaciju, i da za to vreme moze da se nastavi rad u programu (makar update interfejsa, ili update nekog status bara).Ti paralelni procesi se nazivaju nitima (threads).Delphi poseduje mogucnost rada sa nitima. Da ne bi bilo sve tako jednostavno, potrebno je od samog pocetka reci da VCL komponente nisu thread-safe, tj. jedna instanca VCL komponente moze primati poruke od samo jedne niti. Primera radi, jedna labela na Main formi moze primati poruke samo od Main Threada. Ukoliko se malo porazmisli, shvata se ogranicenost ovakve konstrukcije. Postoje tehnike koje prevazilaze ova ogranicenja, i njih cemo uvesti od samog pocetka, iako ce to mozda nekom otezati ucenje iz ovog tutorijala.

Page 27: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

Napravimo, za pocetak, jedan mali thread:

unit testThread;

interface

uses  Windows, Messages, SysUtils, Variants, Classes,  Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;

type  MyThread = class(TThread)  private    { Private declarations }  protected    procedure Execute; override;  end;

implementation

procedure MyThread.Execute;begin  MessageDlg('Poruka iz threada', mtInformation, [mbOK], 0);end;

end.

Snimimo ovaj fajl kao testThread.pasSada je potrebno da napravimo nas glavni program, koji ce po potrebi da poziva ovaj thread.Otvorite novi projekat, formu nazovite frmMain, na formu ubacite jedno dugme i nazovite ga btTest. Unit snimite pod imenom untMain.pas. U var sekciju ubacite liniju kao dole, i u implementation ubacite red uses testThread da bi fajl koji smo malopre napisali bio prepoznat.

unit untMain;

interface

uses  Windows, Messages, SysUtils, Variants, Classes,  Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;

type  TfrmMain = class(TForm)

    btTest: TButton;

  private    { Private declarations }  public    { Public declarations }  end;

Page 28: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

var  frmMain: TfrmMain;  FirstThread: TThread;

implementation

{$R *.dfm}uses testThread;

Sada je potrebno da uradimo proceduru koja ce pozvati nas thread. Uradimo onClick proceduru za dugme koje smo napravili na formi, i u proceduru ubacite sledeci kod:

begin  FirstThread := MyThread.Create(false);end;

Parametar false znaci da se thread formira bez cekanja (suspend).Startovanjem prethodnog primera, i klikom na dugme sa forme, na ekranu bi trebala da se pojavi poruka formirana u threadu.Jeste da od ovoga nema neke prakticne koristi, ali je barem neki pocetak.Iz prethodnog smo videli da svaki thread mora da poseduje proceduru Execute, koja ce automatski biti pozvana kada se thread formira.Mana prethodnog primera je sto thread nece biti izbrisan iz memorije nakon zavrsetka.Ispravan kod bi bio:

begin  FirstThread := MyThread.Create(true);  FirstThread.FreeOnTerminate := true;  FirstThread.Resume;end;

U cemu je sada razlika? Prvo, formirali smo thread u memoriji, ali smo ga postavili u stanje cekanja (true parametar za suspend). Svrha suspenda je da se thread ne startuje dok se ne podese i ostale varijable (parametri threada). U drugoj liniji smo naredili da se oslobodi memorija nakon zavrsetka threada, i u trecoj smo naredili da thread konacno krene da se izvrsava.Oslobadjanje memorije bi bila prva mera na koju moramo obratiti paznju pri radu sa threadovima.

Da sada malo zakomplikujemo stvar: napravimo i jednu labelu na glavnoj formi, a da jedan od zadataka u threadu bude da promeni caption labele.Ukoliko to uradimo ovako:

unit testThread;

interface

uses  Windows, Messages, SysUtils, Variants, Classes,  Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;

Page 29: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

type  MyThread = class(TThread)  private    { Private declarations }  protected    procedure Execute; override;  end;

implementationuses untMain;   // <--- nova linija, sada                   thread postaje svestan postojanja glavne                    forme i njenih elemenata

procedure MyThread.Execute;begin  MessageDlg('Poruka iz threada', mtInformation, [mbOK], 0);  untMain.frmMain.Label1.Caption:='Done';  // <--- ovo menja tekst                                              labelaend;

end.

Dobili ste poruku o gresci? Naravno, posto je Label VCL komponenta koja se nalazi na glavnoj formi, i prima poruke samo od Main threada. Za divno cudo, meni je ovo uspelo vise puta bez poruke o gresci (Delphi 7), ali se desavalo da komponenta na formi pobrljavi.Zarad ovih i ovakvih stvari, postoji posebna metoda prenosenja poruka izmedju threadova, i naziva se sinhronizacijom.Ispravan kod za nas thread bi bio:

unit testThread;

interface

uses  Windows, Messages, SysUtils, Variants, Classes,  Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;

type  MyThread = class(TThread)  private    { Private declarations }  protected    procedure Execute; override;    procedure UpdateLabel;  end;

implementationuses untMain;   // <--- nova linija, sada                   thread postaje svestan postojanja glavne forme i njenih elemenata

procedure MyThread.Execute;begin  MessageDlg('Poruka iz threada', mtInformation, [mbOK], 0);

Page 30: Tutorial - Delphi skola 1 - РАЧУНАРСТВО И …informatikazemunska.weebly.com/uploads/3/8/1/5/38156335/... · Web viewMozete i da jednom kliknete na kontrolu zatim da na

  Synchronize(UpdateLabel);end;

procedure MyThread.UpdateLabel;begin  untMain.frmMain.Label1.Caption := 'Done';end;

end.

Mislim da nije tesko shvatiti sta smo upravo uradili. Menjanje Captiona tabele smo strpali u posebnu proceduru, a tu proceduru pozivamo iz Execute procedure pomocu naredbe Synchronize. Ovo nam omogucuje da se nas thread sinhronizuje sa glavnim threadom, i da uspesno prenese poruku Labeli.Na ovaj nacin mozemo da, u nekom nasem programu, onemogucimo neke dugmice dok se thread ne zavrsi, ili da osvezavamo status bar, itd itd...Od ostalih stvari potrebnih stvari za rad sa threadovima, spomenuo bih jos jednu stvar, a to je prekidanje threada u toku izvrsavanja. To se radi pozivanjem procedure Terminate. Za nas gornji primer, to bi znacilo da negde u glavnom programu mozete postaviti FirstThread.Terminate;.Dacu vam ideju za daljnje eksperimente i razmisljanja:- formirajte jos jednu instancu naseg threada (SecondThread) i izvrsite ga istovremeno sa prvim. Da nismo uradili menjanje teksta na Labeli pomocu synchronize, onda bi oba threada pokusala istovremeno da pristupe labeli, pa bi nastao haos- uradite vise razlicitih threada, a samo jedno Cancel dugme, koje treba da prekine threadove koji se trenutno izvrsavaju. Znaci, negde morate da vodite evidenciju koji thread se izvrsava, posto ce pozivanje Terminate za thread koji se trenutno ne izvrsava rezultovati greskom. Ja sam koristio boolean varijable za svaki thread, pa kada startujem thread - setujem i varijablu. Kada stisnem Cancel, odradim Terminate samo za one za koje je odgovarajuca varijabla setovana.Pozdrav do sledeceg tutorijalabobby