OSNOVI PROGRAMIRANJA U PROGRAMSKOM JEZIKU DELPHI

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                                                                      Autor : Dojčinović Dejan

 


DELPHI

 

 

 

Da bi u Delphi-ju uspešno kreirali poluprofesionalne aplikacije potrebno je :

-         Poznavanje programiranja u Pascal-u

-         Poznavanje rada s Visual alatima

-         Poznavanje Windows-a (Windows-ov interfejs – GUI(Graphical User Interface), rad u Windows-u, kao i način rada(pozadina) Windows-a)

 

Pošto Delphi predstavlja ništa drugo do objektni Pascal, vrlo je bitno poznavati osnovne tehnike programiranja u Pascal-u jer su sve upravljačke strukture u Delphi-ju identične s odgovarajućim u Pascal-u. Takođe, da bi kreirali aplikacije u Windows-u moramo poznavati rad s Visual alatima, a to ćemo ostvariti tokom ovog kursa kada se i upoznajemo s Delphi-jem. Takođe, potrebno je i poznavanje ne samo rada u Windows-u već i osnovnih elemenata koji se pojavljuju u aplikacijama (Windows-ov interfejs), a poželjno je i poznavati način rada Windows-a, međutim ne i neophodno. Takođe, poželjno je i poznavati elemente objektnog programiranja. Našu aplikaciju će činiti elementi(kontrole) koji se nalaze na prozoru naše aplikacije(obrazac) a lepak koji će povezivati ove kontrole je kod koji ćemo pisati, a to ćemo ostvariti putem određenih događaja, naime, kad god nešto uradimo u Windows-u mi izazivamo određeni događaj (kliktanje dugmeta miša, pritisak tastera na tastaturi, pomeranje kursora miša...) i taj događaj će obrađivati određene procedure. Te procedure (event procedure) se nazivaju procedure za obradu događaja i naša uloga će biti u tome da pišemo kod za određenu proceduru, odnosno da napišemo šta treba da se desi na određeni događaj. Zbog toga je vrlo važno podsetiti se proceduralnog načina programiranja.

 

 

1. OBJEKTNO PROGRAMIRANJE

 

 

Pod pojmom objektno programiranje podrazumevamo objektno-orijentisano programiranje(OOP).

          To je vrsta programiranja u čijoj srži leži ideja objedinjavanja podataka i akcija nad tim podacima(metode) u jednu strukturu.

          Objektno programiranje se zasniva na 3 osnovna principa :

1.     Enkapsulacija

2.     Nasleđivanje

3.     Polimorfizam

1.     Enkapsulacija – To je mogućnost kombinovanja podataka sa funkcijama i procedurama koje operišu s tim podacima. Kao rezultat ovakvog načina kombinovanja dobijamo novi tip koji se naziva klasa.

2.     Nasleđivanje – To je mogućnost koričćenja već izgrađenih klasa za građenje hijerarhije klasa izvođenjem iz njih. Na taj način naslednik” nasleđuje opise podataka “praroditelja” kao I pristup metodama njihove obrade.

3.     Polimorfizam – To je mogućnost definisanja jedinstvenog po imenu metoda (procedura ili funkcija) koji je primenljiv nad svim klasama hijerarhije nasleđivanja s tim da svaka klasa hijerarhije može naznačiti specifičnosti nad njom samom te akcije.

1.1 KLASE

 

          Klasičan proizvod jednog od tri principa na kojima se zasniva objektno programiranje, enkapsulacije je klasa. Klase su po svom obliku slične slogovima u Pascal-u. Klasa predstavlja strukturu koja objedinjuje 2 komponente :

1.     Komponenta-podaci (polja ili podaci) koja predstavlja razne podatke klase, različitih tipova

2.     Komponenta-funkcije i procedure (metode) koja predstavlja akcije nad tim podacima

Na taj način kada definišemo određenu klasu dobijamo novi tip podataka koji se naziva klasni tip. Klasni tip se definiše na sledeći način :

 

Type    TImeKlase=class

            PoljaPodataka;

            ZaglavljaMetoda

            end;

Na ovakav način smo definisali novi tip podataka nazvan TImeKlase (obratite pažnju da uvek ime klasnog tipa počinjemo slovom T) koji je klasni tip (što je definisano službenom rečju class) koji se sastoji od polja podataka nazvanih PoljaPodataka i zaglavlja metoda nazvanih ZaglavljaMetoda (vrlo je bitno obratiti pažnju da prvo idu polja podataka pa tek onda zaglavlja metoda).

Kada kasnije definišemo konkretnu promenljivu ovog tipa to činimo vrlo prosto na sledeći način :

 

Var PromenljivaKlasa : TImeKlase;

Na ovaj način smo definisali promenljivu PromenljivaKlasa koja je tipa TImeKlase (koji smo ranije definisali u odeljku za definisanje tipova Type). Konkretna promenljiva PromenljivaKlasa definisana tipom TimeKlase predstavlja primerak (instancu) tog tipa.

 

Način definisanja klasnog tipa dočaraću na sledećem primeru :

 

Type TTacka = class

X,Y : real; {Polje podataka klase}

{Metode klase}

Procedure Postavi(PosX,PosY : real);

Procedure Translacija(dX,dY : real);

Procedure Simetrija;

Procedure Rotacija(a : real);

Procedure Zaglavlje;

Procedure Pozicija;

Procedure Ispisi;

end;

 

          U ovom primeru smo definisali položaj tačke u koordinatnom sistemu, kao i sve operacije nad njom. U ovom primeru podaci(polja su X i Y koji čuvaju podatke o pložaju tačke u koordinatnom sistemu. Procedure(metode) definišu akcije koje se mogu vršiti nad tačkom, a to su u našem primeru sledeće procedure : Postavi – definisanje položaja tačke, Translacija – pomeranje tačke za određeni priraštaj, Simetrija – simetrično preslikavanje tačke, Rotacija – rotacija tačke za određeni ugao, Zaglavlje, Pozicija i Ispisi – poruka o položaju tačke, gde zadnja Ispisi objedinjuje prve 2.

Ove metode se mogu realizovati na sledeći način :

 

Procedure TTacka.Postavi(PosX,PosY : real);

begin

X:=PosX;

Y:=PosY

end;

 

Procedure TTacka.Translacija(dX,dY : real);

begin

X:=X+dx;

Y:=PosY

end;

 

Procedure TTacka.Simetrija;

begin

X:=–X;

Y:=–Y

end;

 

Procedure TTacka.Rotacija(a : real);

begin

XR:=X*cos(a)–Y*sin(a);

YR:=Y*cos(a)+X*sin(a);

end;

 

Procedure TTacka.Zaglavlje;

begin

writeln(‘Pozicija tacke je :’

end;

 

Procedure TTacka.Pozicija;

begin

writeln(‘X=’,X,‘ Y=’,Y)

end;

 

Procedure TTacka.Ispisi;

begin

Zaglavlje;

Pozicija

end;

 

Definisaćemo promenljive :

Var Tacka,Tacka1,Tacka2 : TTacka;

 

Ovako napisano za promenljivu Tacka kompajler rezerviše prostor samo za adresu objekta, a ne za objekat tipa TTacka.

          Dodeljivanje memorije u dinamičkoj zoni vrši se funkcijom Create koja se nasleđuje iz klase TObject koja je zajednički predak svih klasa iako nigde to eksplicitno nije navedeno.

Tacka:= TTacka.Create;

 

          Dodelom jedne klasne promenljive drugoj kopira se samo adresa objekta, ne i ceo objekt.

Tacka1:= TTacka.Create;

Tacka2:= TTacka.Create;

Tacka1:= Tacka2;

 

          Promenljive Tacka,Tacka1 i Tacka2 su dinamičke promenljive koje se nazivaju pokazivači.

 

Sa objektom se manipuliše običnim pozivanjem metoda :

 

Tacka.Postavi(7,7);

Tacka.Translacija(0.5,0.5);

Tacka.Simetrija;

Tacka.Rotacija(PI/2);

Tacka.Ispisi;

 

Da bi se izbeglo pisanje ime promenljive može se koristiti i naredba With na sledeći način :

 

With Tacka Do

begin

Postavi(7,7);

Translacija(0.5,0.5);

Simetrija;

Rotacija(PI/2);

Ispisi

end;

 

Poljima klasne promenljive može da se pristupa ne samo preko metoda, već i direktno :

 

Tacka.X:=7;

Tacka.Y:=7;

Tacka.Ispisi;

 

          Ovakav način treba izbegavati jer se na ovakav način gubi prednost prilikom objektnog pristupa programiranju.

          Prilikom programiranja u Delphi-ju treba sticati naviku da za svaki objekat, kada prestane potreba za njim, treba osloboditi prostor koji je on zauzimao. To se postiže procedurom Free.

Tacka.Free;

 

          Prilikom opisa klase treba voditi računa o sledećem :

opis tipa class može se kreirati samo u odeljku za opis tipova osnovnog programa ili u odeljcima modula

ne smeju se opisivati lokalne klase u procedurama i funkcijama

prilikom opisa klasa polja podataka idu pre zaglavlja metoda

komponente klase ne mogu biti fajlovi, a fajlovi ne mogu sadržati komponente klasa

 

Primer : Napisati program kojim se obavljaju sve moguće akcije nad tačkom koja je zadata svojim položajem u koordinatnom sistemu.

 

          Prilikom kreiranja klasnog tipa može se iskoristiti svojstvo klasnih tipova da se iskoristi ranije definisan klasni tip. Tako neki klasni tip može iskoristiti neka polja podataka kao i metode već definisanog klasnog tipa. Na taj način iz klase pretka klasa potomak nasleđuje sva polja podataka kao i sve metode. Takođe klasa potomak može imati i neka svoja polja podataka kao i metode. Ovo se postiže tako što prilikom definisanja klase nakon službene reči class u zagradama navodimo ime klase roditelja a nakon toga navodimo nova polja podataka i nove metode na sledeći način :

 

Type TimeKlaseNaslednika = class (TimeKlasePretka)

NovaPoljaKlaseNaslednika;

NoveMetodeKlaseNaslednika

end;

 

Primer : Definisati klasni tip koji definiše položaj kruga u koordinatnom sistemu, kao i sve opreacije nad njim.

 

Ovde možemo iskoristiti već definisani tip TTacka, s tom razlikom da je položaj kruga osim koordinata njegovog centra definisan i sa dužinom poluprečnika, dok kod metoda imaćemo nove metode Postavi gde ćemo postavljati i dužinu poluprečnika kao i Zaglavlje i Pozicija gde ćemo drugačije ispisivati poruke o položaju kruga, tako da možemo da pišemo sledeće :

 

Type TKrug = class (TTacka)

R : real; {Novo polje podataka klase}

{Nove metode klase}

Procedure Postavi(PosX,PosY,DR : real);

Procedure Zaglavlje;

Procedure Pozicija;

end;

 

Procedure TKrug.Postavi(PosX,PosY,DR : real);

begin

X:=PosX;

Y:=PosY;

R:=DR

end;

 

Procedure TKrug.Zaglavlje;

begin

writeln(‘Pozicija kruga je :’

end;

 

 

Procedure TKrug.Pozicija;

begin

writeln(‘X=’,X,‘ Y=’,Y,‘ R=’,R)

end;

Pristup članovima klase može biti :

javni (public)

privatni (private)

zaštićeni (protected)

publikovani (published)

 

 

2. RAD S KONTROLAMA

 

 

Bitni delovi buduće aplikacije :

1.     Forma (obrazac)

2.     Kontrole

 

Našu aplikaciju povezuje kod koji se piše na odgovarajući događaj bilo koje kontrole (pa i obrasca).

Upravljačke strukture su iste kao i kod Pascal-a.

Svaki događaj obrađuje odgovarajuća procedura.

 

Naš rad u Delphi-ju je projekat(project).

Svaki projekat se snima slično kao i bilo koji fajl u bilo kom programu ali se on sastoji iz 2 komponente (Unit-Unit1.pas i Project-Project1.dpr).

Svaki projekat obavezno snimamo u posebnom direktorijumu.

 

Fajlovi koji se mogu pojaviti u Delphi-ju :

       *.dpr   - projektni fajl

       *.dfm - fajl koji sadrži sva svojstva forme i svih kontrola na njoj

       *.pas   - izvorni kod programa

       *.exe   - aplikacija (kompajlirana verzija projekta) - naš program

       *.res    - fajl koji sadrži binarne resurse

       *.dcu - prevedeni kod programskog modula i program ih stalno pravi

       ~*.*    - rezervne kopije bilo kojih fajlova

       *.dof   - tekstualni fajl sa aktuelnim podešavanjima opcija projekta

       *.dll    - biblioteke - vrsta izvršnog fajla

       *.cfg   - konfiguracioni fajl

       ostali fajlovi ponekad neophodni uz našu aplikaciju : *.bmp, *.ico ...

 

 

2.1 FORMA (OBRAZAC)

 

– Svojstva :

1.     Caption – naslov forme

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice

5.     Left – udaljenost od leve ivice

6.     Width – širina

7.     Height – visina

8.     Border Icons – ikone na naslovnoj liniji

9.     Border Style – vrste ivica

10. Font – vrsta fonta

11. Cursor – vrsta kursora

12. Icon – vrsta ikonice

13. Window State – način početnog prikazivanja

 

Obrazac predstavlja osnovni nosilac svih naših kontrola – on u stvari, predstavlja prozor naše buduće aplikacije. Sve kontrole koje budemo dodavali u naš projekat se nalaze na obrascu i zbog toga je on kontejner za te kontrole odnosno nosilac svih kontrola. Od događaja koje prima obrazac spomenućemo uopštene događaje OnClick i OnDoubleClick, za početak. Događaj OnClick nastaje kada pritisnemo levo dugme miša bilo gde na obrascu, a događaj OnDoubleClick kada 2 puta pritisnemo levo dugme miša bilo gde na obrascu. Od karakterističnih događaja spomenućemo OnCreate koji nastaje u trenutku kreiranja obrasca i OnClose koji nastaje kada zatvaramo obrazac i oni se mogu koristiti za slučajeve kada trebamo povezati pojavljivanje više formulara jedan za drugim.

 

 

2.2 KONTROLE

 

2.2.1 KOMPONENTA LABEL

 

– Svojstva :

1.     Caption – naslov (tekst)

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Word Wrap – prelom teksta

10. Hint – objašnjenje

11. Show Hint – prikazivanje objašnjenja

 

Komponenta Label predstavlja naslov (nalepnicu) koja često nosi naziv (objašnjava) neke druge kontrole. Kontrola Label takođe prihvata događaje OnClick i OnDoubleClick mada se retko u praksi koriste jer bi Label trebalo da predstavlja statičan tekst – naziv neke druge kontrole.

 

 

 

 

2.2.2 KOMPONENTA BUTTON

 

– Svojstva :

1.     Caption – naslov (naziv) dugmeta

2.     Name – generičko ime

3.     Top – udaljenost od gornje ivice forme

4.     Left – udaljenost od leve ivice forme

5.     Width – širina

6.     Height – visina

7.     Font – vrsta fonta

8.     Hint – objašnjenje

9.     Show Hint – prikazivanje objašnjenja

10. Cancel – reagovanje na taster Esc

11. Default – reagovanje na taster Enter

 

Komponenta Button je jedan od najčešćih delova Windows aplikacija i ona, kao što joj ime pokazuje služi kao okidač za neku određenu komandu. Ova kontrola prihvata događaje OnClick i OnDoubleClick, s tim da je najčešći događaj kod ove kontrole OnClick. Takođe, kontrola Button može da prihvati i događaj OnExit koji nastaje kada fokus prebacimo na neku drugu kontrolu.

 

2.2.3 KOMPONENTA EDIT

 

– Svojstva :

1.     Text – tekst

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. Border Style – vrste ivica

 

Komponenta Edit predstavlja najčešći način za unos nekog teksualnog podatka. Ova komponenta takođe prihvata događaje OnClick i OnDoubleClick (retko se koriste kod ove kontrole) kao i događaj OnExit (on se koristi često kada treba proveriti ispravnost podataka u njoj, pa kada izgubimo fokus, odnosno pređemo na neku drugu kontrolu, recimo drugu Edit kontrolu, sledi provera tih podataka). Od novih događaja spomenućemo događaj OnKeyPress koji nastaje kada pritisnemo taster na tastaturi, i on se često koristi kada treba proveriti da li je određeni taster u pitanju, kao i događaj OnChange koji nastaje uvek kada se sadržaj u Edit kontroli promeni. Kod Edit kontole se često pojavljuje i dodatni kod za moguće greške jer nam Edit kontrola služi u najvećem broju slučaja kao kontrola koja omogućuje unos podataka a ti podaci mogu biti u pogrešnom formatu, nedozvoljeni, nemogući itd. Pošto je svojstvo Text u formatu Tstring a nama često trebaju neki drugi tipovi podataka, recimo brojevi koristićemo funkcije koje prebacuju formate podataka.

Kod komponente Edit često se koriste sledeće funkcije :

- StrToFloat(tekst) - pretvaranje teksta u numeričku vrednost

- StrToFloat(tekst) - pretvaranje teksta u numeričku vrednost

- FloatToStr(broj) - pretvaranje numeričke vrednosti u tekst

- IntToStr(broj)     - pretvaranje numeričke vrednosti u tekst

Često će nam trebati prikazivanje informacionog prozora koji sadrži neku poruku (obaveštenje, poruku o grešci, preporuku, savet, informaciju ...) a to ćemo ostvariti sledećom naredbom :

ShowMessage(˘Poruka˘) – pojavljivanje informacionog prozora sa tekstualnom porukom Poruka.

Takođe, pošto smo pričali o prebacivanju fokusa često će nam trebati da se u slučaju neodgovarajućeg podatka vrati fokus na tu Edit kontrolu i recimo da se selektuje čitav sadržaj u njoj, što je čest slučaj u Windows aplikacijama.

Metod Edit1.SetFocus – vraća fokus edit kontroli

Metod Edit1.SelectAll – selektuje čitav tekst iz edit kontrole

 

2.2.4 KOMPONENTA TIMER

 

– Svojstva :

1.     Enabled – uključivanje tajmera

2.     Interval – reguliše brzinu tajmera

 

Komponenta Timer služi za izazivanje događaja u nekom vremenskom trenutku i pogodna je, u kombinaciji sa nekom drugom komponentom za prikazivanje vremena. Najvažniji događaj kod ove kontrole je OnTimer koji nastaje prilikom aktiviranja tajmera u određenom vremenskom trenutku.

Kod tajmera se često koristi funkcija TimeToStr(Time) koja pretvara vreme u string sa parametrom Time koji predstavlja sistemsko vreme.

 

Primer – Na kontroli Label prikazati vreme :

Procedure TForm1.Timer1Timer(Sender:TObject);

begin

Label1.Caption:=TimeToStr(Time)

end;

 

Primeri za vežbanje :

1.     Promena imena obrasca

2.     Različiti događaji kod kontrole Label

3.     Kontrola Button i kombinacija sa različitim komponentama

4.     Kontrola Edit

5.     Aplikacija za izračunavanje, informacioni prozor i složenije aplikacije

 

2.2.5 KOMPONENTA LISTBOX

 

– Svojstva :

1.     Name – generičko ime

2.     Color – boja

3.     Top – udaljenost od gornje ivice forme

4.     Left – udaljenost od leve ivice forme

5.     Width – širina

6.     Height – visina

7.     Font – vrsta fonta

8.     Hint – objašnjenje

9.     Show Hint – prikazivanje objašnjenja

10. Border Style – vrste ivica

11. Items – stavke

12. MultiSelect – selektovanje više stavki

13. ItemIndex – redni broj stavke (od 0 do Items.Count-1)

14. ExtendedSelect – način odabiranja više stavki

15. Sorted – sortirane stavke

 

Komponenta ListBox je čest elemenat u Windows aplikacijama i ona predstavlja u stvari proširenu Edit kontrolu koja može imati više tekstualnih podataka i oni su prikazani kao stavke u ovoj kontroli. Razlika u odnosu na Edit kontrolu je ta što po ovoj kontroli ne pišemo podatke već odabiramo određene podatke iz nje koji su dati u vidu stavki. Kontrola ListBox prihvata događaje OnClick, OnDoubleClick, OnExit, OnKeyPress i OnChange.

Bitno svojstvo kod ove kontrole je Items koje predstavlja stavke u ovoj kontroli i sa ovim svojstvom se vrlo lako barata u trenutku projektovanja, jer se postupak svodi na to da nakon kliktanja na svojstvo Items u prozoru Object Inspector-a (tačnije na desni deo ovog svojstva koji je prikazan trima tačkama) samo navodimo stavke u prozoru koji se pojavljuje običnim ukucavanjem istih.

Stavke u ListBox-u su indeksirane od nule do Count-1 (svojstvo Count daje ukupan broj stavki), tako da se konkretnoj stavci pristupa sa Items i uglastim zagradama u kojim navodimo indeks stavke, kao kod nizova.

ListBox1.Items[3] – 4. stavka kontrole ListBox

          Kontrola ListBox poseduje i svojstvo ItemIndex koje vraća indeks aktuelne stavke, na primer stavke koja je odabrana.

Prikazivanje aktuelne stavke u edit kontroli :

Edit1.Text:=ListBox1.Items[ListBox1.ItemIndex];

Ako želimo da se prikažu sve stavke kontrole ListBox u Edit kontroli to možemo postići putem Count svojstva Items ove kontrole :

Prikazivanje svih stavki List Box kontrole u Edit kontroli :

For i:=0 to ListBox.Items.Count-1 do

Edit1.Text:=Edit1.Text+ ListBox1.Items[i]

Stavke mogu i da se učitaju iz fajla(tekstualni) metodom LoadFromFile :

ListBox1.Items.LoadFromFile('C:\Ucitaj.txt');

Takođe, mogu i da se snime u fajl(tekstualni) metodom SaveToFile :

ListBox1.Items.SaveToFile('C:\Snimi.txt');

U kontrolu mogu da se dodaju nove stavke metodom Add svojstva Items kontrole :

ListBox1.Items.Add('Dodata stavka');

 

2.2.6 KOMPONENTA COMBOBOX

 

– Svojstva :

1.     Name – generičko ime

2.     Color – boja

3.     Top – udaljenost od gornje ivice forme

4.     Left – udaljenost od leve ivice forme

5.     Width – širina

6.     Height – visina

7.     Font – vrsta fonta

8.     Hint – objašnjenje

9.     Show Hint – prikazivanje objašnjenja

10. Items – stavke

11. Text – tekst

12. ItemIndex – redni broj stavke (za razliku od ListBox može biti i -1)

13. Sorted – sortirane stavke

 

Komponenta ComboBox prestavlja kombinaciju klasične Edit kontrole i ListBox kontrole. Kontrola ComboBox u stvari predstavlja malo modifikovanu ListBox kontrolu, čak može biti prikazana i kao obična ListBox kontrola, što se postiže izborom iz svojstva Style pa na taj način imamo različite tipove ove kontrole. Ova kontrola ima slična svojstva kao i ListBox, prihvata sve događaje kao i ListBox a i sličan je način rada s njom.

Postoje više tipova kombinovane liste što se postiže svojstvom Style, pa kombinovana lista na osnovu ovog svojstva može biti :

– Simple (Style =csSimple) – obična lista

– Drop-Down (Style =csDropDown) – padajuća lista

– Drop-Down-List (Style =csDropDownList) – kombinovana padajuća lista koja ne dozvoljava bilo koji tekst

– Owner-Draw-Fixed (Style =csOwnerDrawFixed) – vrsta prethodne liste

– Owner-Draw-Variable (Style =csOwnerDrawVariable) – vrsta prethodne liste

 

Stavke mogu i da se dodaju ne samo prilikom projektovanja već i prilikom izvršavanja aplikacije metodom Add svojstva Items ove kontrole kao i kod kontrole ListBox :

ComboBox1.Items.Add('Nova stavka');

Takođe, moguće je kao stavku dodati i tekst iz iste kontrole, što je i najčešće ono što želimo :

ComboBox1.Items.Add(ComboBox1.Text);

 

2.2.7 KOMPONENTA RADIOBUTTON

 

– Svojstva :

1.     Caption – naslov(naziv opcije)

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. Checked – svojstvo koje ukazuje da li je opcija odabrana

 

Komponenta RadioButton predstavlja kontrolu kojom se neka opcija odabira ili ne. Ova kontrola se često koristi u kombinaciji s više RadioButton kontola, s tim da samo jedna može biti odabrana. Ova kontrola nema specifičnosti i vrlo se lako radi s njom.

Vrlo bitno svojstvo kod RadioButton kontrole je Checked (može biti true-odabrana i false-nije odabrana) na osnovu koga možemo da utvrdimo da li je neka opcija odabrana ili ne.

 

Rad s RadioButton – proveravanje da li je neka konkretna opcija odabrana :

If RadioButton1.Checked then

Edit1.Text:='Jeste'

Else

Edit1.Text:='Nije';

Takođe, ovaj primer se može proširiti na više kontrola (recimo 3 kontrole) i kada želimo da znamo koja od tih opcija je odabrana :

If RadioButton1.Checked then

Edit1.Text:='Odabrana je prva opcija'

else If RadioButton2.Checked then

Edit1.Text:='Odabrana je druga opcija'

Else Edit1.Text:='Odabrana je treća opcija';

 

2.2.8 KOMPONENTA RADIOGROUP

 

– Svojstva :

1.     Caption – naziv

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. Items – opcije(stavke)

12. ItemIndex – redni broj opcije

 

Komponenta RadioGroup u stvari predstavlja više komponenata RadioButton grupisanih u jednu celinu, s tim što samo jedna opcija može biti odabrana, tako da je komponenta RadioGroup kontejnerska komponenta za komponente RadioButton. Kada treba postaviti više komponenti RadioButton, a naročito kada postoji više grupa ovih kontrola, preporučuje se upotreba ove kontrole na koju se kasnije vrlo lako dodaju opcije, odnosno RadioButton kontrole.

Bitno svojstvo je svojstvo Items koje predstavlja stavke i sa kojim se radi identično kao i kod kontrole ListBox, kao i svojstvo ItemIndex koje vraća indeks one stavke koja je odabrana (aktuelne stavke s kojom radimo) i koje je u trenutku projektovanja postavljeno na -1 što predstavlja slučaj kada nijedna opcija nije odabrana. Kod ove kontrole stavke(opcije) su indeksirane isto kao i kod ListBox kontrole. Pomoću ovih svojstava vrlo lako možemo da odredimo koja opcija je odabrana.

Rad s RadioGroup – proveravanje koja je opcija odabrana :

Case RadioGroup1.ItemIndex of

0: Edit1.Text:= 'Odabrana je prva opcija';

1: Edit1.Text:= 'Odabrana je druga opcija';

2: Edit1.Text:= 'Odabrana je treća opcija'

else Edit1.Text:= 'Nije odabrana nijedna opcija'

end;

 

Zadaci :

1) Kreirati aplikaciju koja dati broj ispisuje u obrnutom redosledu. Oba broja se nalaze u Edit kontrolama a konverzija se obavlja klikom na odgovarajuće dugme.

2) Kreirati aplikaciju koja izračunava zbir cifara nekog broja. Broj, kao i zbir njegovih cifara se nalaze u kontrolama Edit. Zbir cifara se izračunava klikom na komandno dugme. Prozor aplikacije ima izgled dijalog prozora.

3) Kreirati aplikaciju koja sabira sve brojeve koji se redom unose u jednoj te istoj Edit kontroli. Sabiranje se vrši klikom na odgovarajuće komandno dugme, a aktuelni rezultat se prikazuje u drugoj Edit kontroli. Prozor nema osnovnih ikona, a sabiranje se vrši sve do izlaska iz aplikacije, a to se postiže klikom na komandno dugme koje je nazvano Izlaz.

4) Kreirati aplikaciju koja na osnovu koeficijenata kvadratne jednačine (datih u Edit kontrolama) ispisuje izgled kvadratne jednačine i njena rešenja (izgled kvadratne jednačine se piše u posebnoj Edit kontroli, a oba rešenja u drugoj Edit kontroli). Svaku od Edit kontrola nazvati odgovarajućim imenima putem kontrole Label. Promeniti ikonicu i ime prozora.

5) Kreirati aplikaciju Digitron koja nad 2 broja, data u odgovarajućim edit kontrolama, vrši sve računske operacije(klikom na odgovarajuću komandnu dugmad) i rezultat prikazuje u novoj Edit kontroli. Sve kontrole imenovati odgovarajućim kontrolama Label, a izgled dugmadi urediti prema računskoj operaciji koju vrši odgovarajuće dugme. Promeniti ikonicu forme po želji, a ime forme promeniti u Digitron.

 

2.2.9 KOMPONENTA CHECKBOX

 

– Svojstva :

1.     Caption – naziv opcije

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. Checked – svojstvo koje ukazuje da li je opcija odabrana

12. AllowGrayed – uključivanje i trećeg stanja

13. State – stanje kontrole kada su moguća 3 stanja

 

Komponenta CheckBox služi, slično komponenti RadioButton, za odabiranje opcija i ona može za razliku od komponente RadioButton imati i treće stanje(to je stanje koje u aplikacijama često obeležava da ta opcija nije dostupna) ukoliko to želimo – svojstvom AllowGrayed, a onda stanju kontrole pristupamo svojstvom State.

2.2.10 KOMPONENTA GROUPBOX

 

– Svojstva :

1.     Caption – naziv

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. ParentFont – font isti kao i kod forme

12. ParentColor – boja ista kao i kod forme

13. Controls – kontrola, koje predstavlja redni broj kontrole ali se mora pisati kao (GroupBox.Controls[i] As TRadioButton, recimo) da bi se znalo koja je kontrola u pitanju i može ići od 0 do ControlCount-1 – Controls[3] – 4.ta kontrola

 

Komponenta GroupBox služi kao nosilac mogućih opcija odabiranja tipa RadioButton i CheckBox i ona je kontejnerska komponenta za komponente RadioButton i CheckBox.

 

2.2.11 KOMPONENTA MEMO

 

– Svojstva :

1.     Name – generičko ime

2.     Lines – linije teksta

3.     Text – čitav tekst u kontroli, nije vidljiv tokom projektovanja, već samo prilikom izvršavanja aplikacije

4.     Aligment – poravnjanje teksta

5.     Color – boja

6.     Top – udaljenost od gornje ivice forme

7.     Left – udaljenost od leve ivice forme

8.     Width – širina

9.     Height – visina

10. Font – vrsta fonta

11. Hint – objašnjenje

12. Show Hint – prikazivanje objašnjenja

13. WordWrap – prelom teksta

 

Komponenta Memo je slična komponenti Edit, s tim da se u nju može unositi više redova teksta, i njeno bitno svojstvo je Lines što u stvari predstavlja njene linije, a rad s njom je sličan radu s ListBox kontrolom. Takođe možemo pristupiti i svojstvu Text (koje nije dostupno tokom projektovanja – u prozoru Object Inspector) koje predstavlja čitav tekst u Memo kontroli, odnosno sve linije teksta. Kod kontole Memo linije teksta predstavljaju u stvari elemente niza čije je ime u stvari svojstvo Lines, pa je često ova komponenta zgodna kada radimo sa nizovima.

 

Linije teksta idu od 0 do Count-1

Obraćanje konkretnoj liniji teksta :

Memo1.Lines[1] – druga linija teksta

Obrada svih linija teksta :

For i:=0 to Memo1.Lines.Count-1 do

s:=s+Lines[i];

Nova linija se dodaje metodom Add svojstva Lines ove kontrole

Učitavanje teksta iz fajla se vrši metodom LoadFromFile svojstva Lines ove kontrole

Snimanje teksta u fajl se vrši metodom SaveToFile svojstva Lines ove kontrole

Sadržaj se može brisati metodom Clear svojstva Lines – Memo1.Lines.Clear ili metodom Clear komponente – Memo1.Clear

Mogući su i metodi za rad s klipbordom : CutToClipboard, CopyToClipboard i PasteFromClipboard

 

2.2.12 KOMPONENTA MASKEDIT

 

– Svojstva :

1.     Text – tekst

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. EditMask – vrsta formata teksta

 

Komponenta Maskedit je modifikovana kontrola Edit tako da se tekst unosi u preddefinisanom formatu.

Kod ove komponente je vrlo bitno svojstvo EditMask gde birate masku bilo iz ponuđenih ili novih maski, može se menjati znak za obeležavanje separatora i za odvajanje

 

Često kod kontrole Edit treba obraditi moguće greške pri unosu (kao i kod drugih kontrola iz kojih možemo unositi odgovarajuće podatke).

 

Navešćemo primer kada nam je u nekoj Edit kontroli potreban broj – možemo se ograničiti na sledeći način – ako se unese nešto što nije cifra (ili taster za brisanje) aplikacija će dotični podatak sa tastature ignorisati (staviti znak #0 što u stvari predstavlja odsustvo bilo kog tastera) i čuće se odgovarajući zvuk. To ćemo postići u odgovarajućoj proceduri za događaj OnKeyPress kontrole Edit. Ovakav način je najelegantniji i koriste ga veliki broj Windows aplikacija.

 

Procedure TForm1.Edit1KeyPress(Sender:TObject; var Key:char);

begin

If not(Key in ['0'..'9',#8]) then

begin

Beep;

Key:=#0

end;

end;

 

Ostali načini su : metode SetFocus i SelectAll, Informacioni prozori, zatvaranje aplikacije, obrada greške, informacije i ostalo koje smo već naveli.

 

2.2.13 KOMPONENTA PANEL

 

– Svojstva :

1.     Caption – naslov

2.     Name – generičko ime

3.     Color – boja

4.     Top – udaljenost od gornje ivice forme

5.     Left – udaljenost od leve ivice forme

6.     Width – širina

7.     Height – visina

8.     Font – vrsta fonta

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. Aligment – poravnjanje naslova

12. Align – poravnjanje Panel-a u odnosu na prozor

13. BevelInner – izgled

14. BevelOuter – izgled

15. BevelWidth – izgled

16. BorderStyle – vrste ivica

17. BorderWidth – debljina ivica

 

Komponenta Panel služi kao kontejnerska komponenta za razne alate.

 

2.2.14. KOMPONENTA BEVEL

 

– Svojstva :

1.     Name – generičko ime

2.     Top – udaljenost od gornje ivice forme

3.     Left – udaljenost od leve ivice forme

4.     Width – širina

5.     Height – visina

6.     Font – vrsta fonta

7.     Hint – objašnjenje

8.     Show Hint – prikazivanje objašnjenja

9.     Shape – oblik

 

Kontrola Bevel nije kontejnerska komponenta već samo vizuelno odvaja određene opcije.

 

 

2.2.15. KOMPONENTA SCROLLBAR

 

– Svojstva :

1.     Name – generičko ime

2.     Top – udaljenost od gornje ivice forme

3.     Left – udaljenost od leve ivice forme

4.     Width – širina

5.     Height – visina

6.     Hint – objašnjenje

7.     Show Hint – prikazivanje objašnjenja

8.     Kind – vrsta klizača

9.     Position – pozicija klizača

10. Min – minimalna pozicija klizača

11. Max – maksimalna pozicija klizača

 

Komponenta Scrollbar u stvari predstavlja klizače, koji se često koriste u Windows aplikacijama.

 

2.2.16. KOMPONENTA POPUPMENU

 

– Svojstva :

1.     Name – generičko ime

2.     Items – stavke

3.     Alligment – pozicija

4.     AutoPopup – aktiviranje kontekstnog menija

 

Komponenta PopUpMenu predstavlja u stvari kontekstni meni koji se dobija desnim dugmetom miša.

          Rad s kontekstnim menijem je vrlo lak, naime, odabiranjem svojstva Items u prozoru Object Inspector-a (tačnije, desnog dela koje je predstavljeno trima tačkama) ili dvoklikom na dotičnu komponentu pojavljuje se prozor gde ukucavamo stavke kontekstnog menija. Bitno je obratiti pažnju da kada unosimo stavke pojavljuju se svojstva u prozoru Object Inspector-a za dotičnu stavku. Na taj način kucanjem imena određene stavke mi u stvari menjamo svojstvo Caption dotične stavke u kontekstnom meniju. Programiranje stavki u kontekstnom meniju se vrši najčešće putem događaja OnClick konkretne stavke i pisanjem koda za ovaj događaj. Pojavljivanje kontekstnog menija se vrši tako što u prozoru Object Inspector-a za glavni obrazac odaberemo događaj OnPopup i u padajućoj listi za ovaj događaj izaberemo konkretni kontekstni meni.

 

2.2.17. KOMPONENTA MAINMENU

 

– Svojstva :

1.     Name – generičko ime

2.     Items – stavke

 

Komponenta MainMenu predstavlja u stvari jedan od najglavnijih delova svih Windows aplikacija – meni.

          Rad s kontrolom MainMenu je vrlo lak – odabiranjem svojstva Items iz prozora Object Inspector-a ove kontrole (tačnije desnog dela koje je predstavljeno trima tačkama) ili dvoklikom na ovu kontrolu pojavljuje se prozor u kome je potrebno uneti sve stavke i podstavke budućeg menija. Odabiranje menija za obrazac se vrši u prozoru Object Inspector-a konkretne forme putem događaja Menu gde se navodi ime konkretnog menija.

 

 

Zadaci :

1) Kreirati aplikaciju koja dati broj pretvara u odgovarajući broj u nekom drugom sistemu (sistemi su sa osnovom 2-10). Broj, njegov ekvivalent u drugom sistemu kao i osnova novog sistema su dati u odgovarajućim Edit kontrolama. Pretvaranje broja se vrši klikom na odgovarajuće dugme. Sve kontrole imenovati odgovarajućim imenima, bilo Label kontrolama ili samim natpisom na komandnom dugmetu, a aplikaciju nazvati Pretvarac.

2) Kreirati aplikaciju koja simulira rad kalkulatora. Aplikaciju nazvati Digitron 2.

3) Kreirati aplikaciju koja u kontroli ListBox ispisuje kvadrate svih prirodnih brojeva do 1000, a u drugoj ListBox kontroli kvadrate svih prirodnih brojeva do 1000. Ispis kvadrata i korena vrši se klikom na odgovarajuću dugmad.

 

2.2.18. KOMPONENTA LABELEDEDIT

 

– Svojstva :

1.     Caption – naslov – nalazi se u opciji EditLabel gde se nalazi još opcija vezanih za podešavanje naslova

2.     Name – generičko ime

3.     Text – tekst

4.     Color – boja

5.     Top – udaljenost od gornje ivice forme

6.     Left – udaljenost od leve ivice forme

7.     Width – širina

8.     Height – visina

9.     Font – vrsta fonta

10. Hint – objašnjenje

11. Show Hint – prikazivanje objašnjenja

 

Komponenta LabeledEdit je kombinacija kontrola Edit i Label.

 

2.2.19. KOMPONENTA SPINEDIT

 

– Svojstva :

1.     Name – generičko ime

2.     Color – boja

3.     Top – udaljenost od gornje ivice forme

4.     Left – udaljenost od leve ivice forme

5.     Width – širina

6.     Height – visina

7.     Font – vrsta fonta

8.     Hint – objašnjenje

9.     Show Hint – prikazivanje objašnjenja

10. Value – početna vrednost

11. Increment – korak

12. MinValue – najmanja vrednost

13. MaxValue – najveća vrednost

 

Komponenta SpinEdit predstavlja numeričko tekstualno polje u kome se strelicama s desne strane uvećava numerička vrednost u njoj za određeni korak.

 

2.2.20. KOMPONENTA RICHEDIT

 

– Svojstva :

1.     Name – generičko ime

2.     Color – boja

3.     Top – udaljenost od gornje ivice forme

4.     Left – udaljenost od leve ivice forme

5.     Width – širina

6.     Height – visina

7.     Font – vrsta fonta

8.     Hint – objašnjenje

9.     Show Hint – prikazivanje objašnjenja

10. BorderStyle – vrste ivica

11. Lines – linije teksta(stavke)

12. Text – čitav tekst – nije vidljiv u trenutku projektovanja

13. Aligment – poravnjanje teksta u kontroli

14. WordWrap – prelom teksta u kontroli

 

Komponenta Richedit je slična kontroli Memo, ali može da primi različite formate teksta.

 

Kontrole LabeledEdit, SpinEdit i RichEdit su neka vrsta modifikacije kontrole Edit.

 

2.2.21. KOMPONENTA STRINGGRID

 

- Svojstva :

1.     Name – generičko ime

2.     Cells – predstavlja ćelije tabele

3.     ColCount – broj kolona

4.     RowCount – broj redova

5.     FixedCols – mogućnost da neke od kolona tabele budu iskorišćene kao zaglavlje tabele

6.     FixedRows – mogućnost da neki od redova tabele budu iskorišćeni kao zaglavlje tabele

7.     Options – omogućava razne načine korišćenja tabela i ono ima podsvojstva od kojih su neka : goEditing – dozvoljava unos i editovanje sadržaja ćelije, goAlwaysShowEditor – omogućava da je tabela uvek u režimu menjanja teksta a prethodno svojstvo mora biti uključeno, inače bi pre unosa teksta bilo potrebno pritisnuti Enter

8.     FixedColor – boja zaglavlja

9.     Color – boja

10. Top – udaljenost od gornje ivice forme

11. Left – udaljenost od leve ivice forme

12. Width – širina

13. Height – visina

14. Font – vrsta fonta

15. Hint – objašnjenje

16. Show Hint – prikazivanje objašnjenja

17. BorderStyle – vrste ivica

 

Sa tabelom manupulišemo na sledeci nacin – Recimo da na klik dugmeta Button1 zelimo da ispisemo u svakoj celiji poziciju date celije u tabeli računajuči i zaglavlja (koja obuhvataju prvi red i prvu kolonu) onda bi u proceduri za obradu događaja Button1Click koristeći metode ColCount i RowCount pisali sledeći kod :

 

Procedure TForm1. Button1Click(Sender: TObject);

Var i,j : integer;

begin

For i:=0 to StringGrid1.RowCount-1 do

For j:=0 to StringGrid1.ColCount-1 do

StringGrid1.Cells[i,j]:=’Celija ’+IntToStr(i)+ ’,’+ IntToStr(j);

End;

 

          Ukoliko bi zeleli da u zaglavlju kolona i redova (koja i dalje obuhvataju prvi red i prvu kolonu)  upisemo samo broj kolone, odnosno reda a u ostalim poziciju date celije u tabeli pisali bi :

Procedure TForm1. Button1Click(Sender: TObject);

Var i,j : integer;

begin

StringGrid1.Cells[0,0]:=’’;

For i:=1 to StringGrid1.RowCount-1 do

For j:=1 to StringGrid1.ColCount-1 do

StringGrid1.Cells[j,i]:=’Celija ’+IntToStr(i)+ ’,’+ IntToStr(j);

For i:=1 to StringGrid1.RowCount-1 do

StringGrid1.Cells[0,i]:= IntToStr(i);

For j:=1 to StringGrid1.ColCount-1 do

StringGrid1.Cells[j,0]:= IntToStr(j);

End;

 

          Ako bi u tabeli da izračunamo najveći elemenat u tabeli (ne uzimajući u obzir zaglavlja koja i dalje obuhvataju 1. red i 1. kolonu) pisali bi sledeći kod :

 

Procedure TForm1. Button1Click(Sender: TObject);

Var i,j : integer;

Max:Real;

begin

Max:= StrToFloat(StringGrid1.Cells[1,1]);

For i:=1 to StringGrid1.RowCount-1 do

For j:=1 to StringGrid1.ColCount-1 do

If StrToFloat(StringGrid1.Cells[j,i])>Max then Max:=StrToFloat(StringGrid1.Cells[j,i]);

Edit1.Text:=’Najveci elemenat je ’+FloatToStr(Max);

End;

2.2.22. KOMPONENTA GAUGE

 

– Svojstva :

1.     Name – generičko ime

2.     Kind – vrsta merača nekog procesa

3.     MinValue – početna vrednost, obično 0%

4.     Maxvalue – krajnja vrednost, obično 100%

5.     Progress – ukazuje dokle je neki proces stigao

6.     Color – boja

7.     BackColor – boja centralnog dela koji pokazuje ceo proces

8.     ForeColor – boja koja ukazuje dokle je stigao proces

9.     ShowText – prikazivanje teksta

10. Top – udaljenost od gornje ivice forme

11. Left – udaljenost od leve ivice forme

12. Width – širina

13. Height – visina

14. Font – vrsta fonta

15. Hint – objašnjenje

16. Show Hint – prikazivanje objašnjenja

17. BorderStyle – vrste ivica

 

Sada već možemo da kreiramo aplikacije koje sadrže kontrole i menije.

 

Podešavanje atributa aplikacije se vrši putem menija Project/Options gde možemo podešavati forme koje se pojavljuju prilikom startovanja aplikacije, ikonu aplikacije, help fajl, izlazna podešavanja, informacije o vrsti, verziji i autoru aplikacije kao i ime aplikacije. Nakon pokretanja ove opcije pojaviće se prozorčić sa određenim jezičcima od kojih su za nas bitni : Forms – ovde podešavamo koje će se forme pojavljivati (ukoliko ih ima više) kako u toku izvršavanja, tako i koja se prva forma pojavljuje nakon pokretanja aplikacije, Application – ovde podešavamo ime aplikacije, gde se nalazi help fajl ukoliko ga ima i ikonicu naše aplikacije, Version Info – ovde podešavamo podatke o verziji programa, proizvođaču, autorskim pravima, podverziji, kao i druge podatke o programu koje možemo uklučiti u naš program.

 

Zadaci :

1) Kreirati aplikaciju koja za 2 data broja u Edit kontrolama izračunava, na osnovu odabrane računske aplikacije, rezultat i prikazuje ga u Edit kontroli – izbor računske operacije se vrši :

a)     komandnim dugmadima

b)    izborom stavki u ListBox kontroli

c)     izborom stavki u ComboBox kontroli

d)    izborom odgovarajuće opcije u kontroli RadioGroup

e)     izborom odgovarajuće opcije u kontrolama CheckBox

f)      izborom opcije iz kontekstnog menija

g)     izborom opcije iz menija

2) Kreirati aplikaciju kojom se klikom na odgovarajuće komandno dugme vrši dodavanje stavke u ListBox kontroli, klikom na dugme Snimi opcije se snimaju u tekstualni fajl a klikom na dugme Ucitaj ucitavaju se stavke u kontrolu ListBox iz unapred snimljenog fajla. Kontrolu ListBox nazvati Lista i dodeliti joj žutu boju i font Times New Roman 13, prvo komandno dugme nazvati Dodaj a nova stavka se uzima iz kontrole Edit koja je nazvana Nova stavka. Aplikaciju nazvati Rad s listom i promeniti joj ikonicu. Kontrola ListBox mora na početku imati 3 stavke. Boja Edit kontrole je zelena.

 

 

2.3. PARAMETAR SENDER

 

          Parametar Sender se često pojavljuje u procedurama za obradu događaja pa se postavlja pitanje šta on znači. Parametar Sender u stvari predstavlja objekat koji je izazvao taj događaj. Sa ovim parametrom možemo da baratamo putem operatora Is gde nakon njega unosimo konkretni objekt. Na primer sintaksa Sender Is TEdit daje vrednost true ako je objekat koji je izazvao događaj tipa TEdit, inače daje vrednost false. Međutim ne smemo nikako da pišemo Sender.Text:='Nije dozvoljeno'; čak i kada smo sigurni da je u pitanju kontrola Edit koja poseduje ovo svojstvo. To je zbog toga što je Sender tipa TObject koji nema ovo svojstvo. Ovo možemo postići korišćenjem operatora As :

(Sender As TEdit).Text:= 'Dozvoljeno';

          Sada možemo da se vratimo na primer kontrole GroupBox koji smo ranije spominjali. Naime, ova kontrola može u sebi sadržati kontrole RadioButton i CheckBox koje nemaju ista svojstva a želimo da upotrebimo svojstvo Control da bi znali koja kontrola je u pitanju. Kontrole su u kontroli GroupBox numerisane od 0 do ControlCount-1 (metod ControlCount daje ukupan broj kontrola). Na taj način Control[3] predstavlja 4. kontrolu. Recimo da imamo kontrolu GroupBox u kojoj se nalazi određen broj kontrola RadioButton i CheckBox a želimo da u Edit kontroli ispišemo ime radio dugmeta koje je odabrano – to ćemo postići sledećim kodom :

 

For i:=0 to ControlCount-1 do

If (GroupBox1.Controls[i] Is TRadioButton) then

If (GroupBox1.Controls[i] As TRadioButton).Checked then

Edit1.Text:=(GroupBox1.Controls[i] As TradioButton).Caption;

 

          Korišćenjem parametra Sender možemo biti efikasniji jer umesto da pišemo kod za više procedura možemo da pišemo samo jednu koja izvršava određene narebe na osnovu objekta koji je izazvao određeni događaj.

 

 

2.4. PODEŠAVANJE KONTROLA

 

          Osim pravilnog rada, naša aplikacija treba da  i izgleda lepo, da bude dovoljno intuivna kao i da rad s njom bude što lakši i efikasniji. U tu svrhu potrebno je pravilno rasporediti i podesiti kontrole, kao i obratiti pažnju da bude što je manje moguće kontrola. Što se tiče podešavanja, odnosno poravnjanja i ravnomernog raspoređivanja kontrola to se postiže iz menija View/Alignment Palette ili tako što se selektuju potrebne komponente a onda se desnim dumetom aktivira kontekstni meni iz koga se odabere opcija Position koja sadrži opcije vezane za poravnjanje kontrola i promenu veličina kontrola.

          Takođe, ovde ćemo spomenuti i neka svojstva vezana za komonente. Ovde u stvari pričamo o objektima tip TComponent. Neka od tih svojstva su ComponentCount koje daje ukupan broj komponenata, ComponentIndex koje vraća indeks određene komponente (komponente su indeksirane na uobičajeni način), Components koje predstavlja listu komponenti (koristi se sa uglastim zagradama kao i kod nizova na uobičajeni način), Tag kojim možemo na svoj način numerisati komponente i Name koje daje ime komponente. Takođe možemo spomenuti i funkciju FindComponent koja daje komponentu koja je kao string navedena u ovoj funkciji kao argument. Takođe, možemo pričati i o svojstvima objekta tipa TControl koja su izvedena iz objekta TComponent, a to su : ControlCount, ControlIndex, Controls, Tag kao i svojstvo Name objekta tipa TControl koje daje ime kontrole.

          Takođe, i za svaku kontrolu pojedinačno iz prozora Object Inspector-a možemo da podešavamo svojstvo Tag za svaku kontrolu tako da možemo da sami indeksiramo kontrole da bi kasnije koristili taj redosled ukoliko nam je potrebno.

          Što se tiče izgleda aplikacije, odnosno forme i kontrola to zavisi od vrste aplikacije koju kreiramo ali se u principu treba rukovoditi time da aplikacija treba da bude što neupadljivija, da alati njoj treba da budu što intuivniji, da se kontrole koje se odnose na slične akcije trebaju biti grupisane u celinu, da se određene naredbe koje se često koriste mogu dobiti i preko dugmadi i preko menija i kontekstnog menija, da bude što je moguće manje kontrola na samom obrascu i najvažnije od svega da rad s našom aplikacijom korisniku bude što lakši.

 

 

3. DIJALOG PROZORI

 

 

          U našim aplikacijama često ćemo imati potrebu za raznim dijalog prozorima. Ovde ćemo spomenuti neke od najčešće korišćenih dijalog prozora kao što su ShowMessage, MessageDlg, OpenDialog, SaveDialog, FontDialog, ColorDialog, FindDialog, ReplaceDialog, PrintDialog, PrintSetupDialog, OpenPictureDialog i SavePictureDialog.

          Što se tiče procedure ShowMessage ona je u obliku

Procedure ShowMessage (const Poruka : string);

i nju smo već pominjali pa bi se nakon sledeće naredbe ShowMessage('Informaciona poruka') pojavio informacioni prozor koji sadrži samo Ok dugme i poruku koja je navedena u zagradama tipa TString, koja u ovom slučaju glasi Informaciona poruka, a ovaj prozor bi zatvorili klikom na Ok dugme. Ovakav prozor je u stvari informacioni prozor čija je namena da obavesti korisnika o nečemu i zato on sadrži samo Ok dugme a ako su nam potrebni još neki dugmići koristićemo MessageDlg funkciju. Ukoliko želimo da se pojavi ovakav prozor ali na određenoj poziciji koristićemo proceduru ShowMessagePos koja je sledećeg oblika :

Procedure ShowMessagePos (const Poruka : string; X,Y : integer);

i sledeća naredba ShowMessagePos ('Informacioni prozor na određenoj poziciji',50,100) bi dala informacioni prozor za porukom Informacioni prozor na određenoj poziciji ali na poziciji 50 i 100 u X i Y pravcu gledano iz gornjeg levog ugla prozora. Ukoliko bi želeli da se pojavi prozor u kome bi unosili neki podatak u cilju njegovog daljeg obrađivanja koristili bi funkcije InputBox i InputQuery. Funkcija InputBox je u obliku :

          Function InputBox(const Naslov, Tekst, Podrazumevana vrednost : string) : string;

gde se podatak unosi u vidu stringa u okviru tekstualnog polja koje se pojavljuje u novom prozoru a argumenti funkcije su : argument Naslov je u stvari naslov prozora koji se pojavljuje, argument Tekst predstavlja tekst koji bi se pojavio iznad tekstualnog polja u koji se unosi string a argument Podrazumevana vrednost predstavlja u stvari podrazumevanu vrednost tog stringa koji se unosi u edit kontroli. Tako bi naredba S:=InputBox('Prozor za pretragu', 'Unesite tekst koji tražite', 'Početni tekst') otvorila prozor sa naslovom Prozor za pretragu u kome bi iznad Edit kontrole pisalo Unesite tekst koji tražite dok bi se u Edit kontroli unapred nalazio tekst Početni tekst, dok bi se tekst koji je unet u Edit kontroli obrađivao u obliku stringa S. Klasična upotreba ove funkcije bi bila sledeća :

S:=InputBox('Prozor za pretragu', 'Unesite tekst koji tražite', 'Početni tekst');

If Length(S)>0 then ShowMessage('Obrada stringa');

gde bi se, nakon unosa stringa u datom prozoru, obrađivao string ukoliko je unet, odnosno u ovom slučaju bi se pojavio odgovarajući informacioni prozor.

Međutim, ukoliko bi želeli sličan prozor ali za koji bi funkcija vraćala True pritiskom na dugme OK, a False pritiskom na dugme Cancel onda bi koristili funkciju InputQuery koja je u obliku :

          Function InputQuery(const Naslov, Tekst, var Vrednost: string) : Boolean;

gde bi se kreirao sličan prozor kao u prethodnom primeru, ali ovde imamo argument Vrednost koji u stvari predstavlja promenljivi parametar koji daje podrazumevajuću vrednost, odnosno ukoliko bi se pritisnulo OK dugme funkcija bi vraćala vrednost True a sadržaj Edit kontrole se predaje argumentu Vrednost, a ukoliko se pritisne Cancel funkcija vraća vrednost False a argument Vrednost zadržava vrednost koju je imao i pre pozivanja ove funkcije. Tako bi recimo, sledeći primer :

S:= 'Ovo se pojavljuje u prozoru';

If InputQuery('Naziv prozora', 'Unesi tekst',S)

Then Showmessage('Informacioni prozor ' + S);

otvorio novi prozor posle koga bi se, ukoliko je on zatvoren pritiskom na dugme OK pojavio informacioni prozor u kome bi se faktički pojavio sadržaj iz njegove Edit kontrole.

          Funkcija MessageDlg daje prozor s više dugmadi i više opcija i njen potpuni oblik je sledeći :

Function MessageDlg (const Poruka : string ; TipDijaloga : TmsgDlgType ;

Dugmad : TmsgDlgButtons ; Pomoc : Longint) : Word;

          Kao što vidimo iz oblika prvi argument Poruka je tipa TString i predstavlja tekst(poruku) koja se ispisuje u prozoru, drugi argument TipDijaloga je tipa TmsgDlgType i on predstavlja tip dijalog prozora, treći argument Dugmad je tipa TmsgDlgButtons i na osnovu njega biramo koja će se dugmad pojaviti u našem prozoru a četvrti argument Pomoc nam ukazuje kakvu će pomoć dobiti korisnik. Funkcija MessageDlg vraća vrednost tipa Word i ona ukazuje na to koje je dugme korisnik pritisnuo.

          Sada ćemo bez daljeg upuštanja u suštinu ovih argumenata reći o vrednostima koje oni mogu dobiti. Što se tiče prvog argumenta Poruka on je potpuno jasan a što se tiče četvrtog argumenta Pomoc stavljaćemo uvek vrednost 0, dok drugi i treći argument TipDijaloga i Dugmad zahtevaju malo više objašnjenja. Drugi argument TipDijaloga kao što smo rekli ukazuje na vrstu dijalog prozora koji će se pojaviti i tu pre svega mislimo na neki način na izgled prozora, odnosno sličicu na prozoru, i on može imati sledeće vrednosti : mtWarning, mtError, mtInformation, mtConfirmation i mtCustom. Ti argumenti znače sledeće : mtWarning – prozor upozorenja s velikim ! u pozadini, mtError – prozor o grešci s velikim x u pozadini, mtInformation – informacioni prozor s velikim i u pozadini, mtConfirmation – prozor za potvrdu s velikim ? u pozadini i mtCustom – običan prozor bez ikakve pozadine. Treći argument Dugmad kao što smo rekli definiše koje dugmiće ćemo imati na prozoru i on može imati sledeće vrednosti : mbYes , mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll   , mbNoToAll, mbYesToAll i mbHelp. Takođe postoje i modifikovane vrednosti koje podrazumevaju više dugmadi odjednom a to su : mbYesNoCancel, mbYesNoAllCancel, mbOKCancel, mbAbortRetryIgnore i mbAbortIgnore. Oni znače pojavljivanje sledećih dugmadi : mbYes – dugme Yes       , mbNo – Dugme No, mbOK – dugme Ok, mbCancel – dugme Cancel, mbAbort – dugme Abort, mbRetry – dugme Retry, mbIgnore – dugme Ignore, mbAll – dugme All, mbNoToAll – dugme NoToAll, mbYesToAll – dugme YesTo All i mbHelp – dugme Help, dugmad koju inače viđamo u skoro svim Windows aplikacijama a modifikovane vrednosti predstavljaju više dugmadi odjednom i to se vidi po njihovim imenima.

          Na primer sledeća funkcija MessageDlg ('Da li ste sigurni', mtConfirmation, [mbYes,mbNo,mbCancel],0) bi izazvala pojavljivanje dijalog prozora s porukom 'Da li ste sigurni' koji bi bio tipa prozora za potvrdu i na sebi imao dumad Yes,No i Cancel (obratiti pažnju da su ovi argumenti u uglastim zagradama) i rezultujuća vrednost ove funkcije bi imala vrednost u zavisnosti koje bi dugme korisnik pritisnuo pa bi na osnovu te rezultujuće vrednosti pisali odgovarajući kod. Znači ovde bi na klasičan način uzimali informacije od korisnika I na osnovu toga preuzimali odgovarajuće radnje.

          Primer : Nakon klika na dugme želimo da se pojavi dijalog prozor iz prethodnog primera ali da na osnovu izabranog dugmeta imamo odgovarajuću poruku. Tada bi u proceduri za obradu događaja OnClick kontrole Button pisali sledeći kod :

 

var w:integer;

begin

w:=MessageDlg ('Da li ste sigurni', mtConfirmation, [mbYes,mbNo,mbCancel],0);

if w = mrYes then ShowMessage('Dobro sigurni ste')

else  if w = mrNo then ShowMessage('Mnogo ste nesigurni')

 

          U ovom primeru vidimo da smo definisali promenljivu koja prima rezultat naše funkcije i ona je tipa integer (tačnije bi bilo tipa word) pa na osnovu nje ispisujemo poruku. Obratiti pažnju da vrednosti funcije imaju iste vrednosti kao i za dugmad, s tim da umesto slova b imamo r – na primer ako je pritisnuto dugme Yes (mbYes) imamo vrednost funkcie mrYes itd. Kao što vidimo ovde pisali smo if pitalicu na osnovu w promenljive a nismo dvaput pisali ime funkcije : if MessageDlg ('Da li ste sigurni', mtConfirmation, [mbYes,mbNo,mbCancel],0) = mrYes then ShowMessage('Dobro sigurni ste')

else  if MessageDlg ('Da li ste sigurni', mtConfirmation, [mbYes,mbNo,mbCancel],0) = mrNo then ShowMessage('Mnogo ste nesigurni') jer bi se tako 2 puta pojavio isti dijalog prozora. Postoje i drugi načini za rešavanje istog problema ali ovaj je sasvim zadovoljavajući.

 

          Sada ćemo se zadržati na OpenDialog i SaveDialog prozorima. Naime, čest slučaj u Windows aplikacijama su Open i Save (Save As) prozori preko kojih otvaramo ili snimamo određene fajlove. Rad s ovim dijalog prozorima je vrlo lak i ovi prozori izgledaju vrlo slično. Oba dijalog prozora su predstavljena kontrolama koje se nalaze u jezičku Dialogs i zovu se OpenDialog i SaveDialog kontrole. Sada ćemo pomenuti njihova osnovna svojstva.

 

 

          3.1 DIJALOG PROZORI KAO KOMPONENTE

 

3.1.1 KOMPONENTA OPENDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Filter – filter za prikazivanje samo određenih fajlova

3.     Filename – ime fajla koji će biti inicijalno prikazan

4.     InitialDir – folder koji će se inicijalno prikazati

5.     Title – naslov dijalog prozora

 

3.1.2 KOMPONENTA SAVEDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Filter – filter za prikazivanje samo određenih fajlova

3.     Filename – ime fajla koji će biti inicijalno prikazan

4.     InitialDir – folder koji će se inicijalno prikazati

5.     Title – naslov dijalog prozora

 

Ovi prozori se aktiviraju funkcijom Execute i ova funkcija ima logičke vrednosti u zavisnosti da li je dijalog prozor aktiviran ili ne. Njihovo bitno svojstvo je FileName i predstavlja ime fajla koji je odabran i ovo svojstvo zajedno sa svojstvom InitialDir može da se koristi u trenutku projektovanja da bi se specifiralo ime fajla ili foldera gde se dati dijalog otvara na početku. Na primer ako bi klikom na komandno dugme želeli da aktiviramo OpenDialog prozor a da bi se recimo u Edit kontroli ispisalo ime fajla kojeg smo odabrali u proceduri za obradu događaja OnClick kontrole Button pisali sledeći kod :

 

If OpenDialog1.Execute then Edit1.Text:=OpenDialog1.FileName;

 

3.1.3 KOMPONENTA FONTDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Font – font

3.     MaxFontSize – maksimalna veličina fonta

4.     MinFontSize – minimalna veličina fonta

 

Ovaj prozor služi za odabir fontova i on se slično kao i prethodni prozori aktivira metodom Execute. Bitno svojstvo je Font koje predstavlja izabrani font i ono ima svoja podsvojstva od kojih su bitnija FontName, Size i Style koja predstavljaju ime, veličinu i stil fonta. Na primer ako bi na komandno dugme želeli da promenimo font RichEdit kontrole u onaj font koji je izabran u FontDialog-u pisali bi u proceduri za obradu događaja OnClick kontrole Button sledeće :

 

If FontDialog1.Execute then RichEdit1.Font:=FontDialog1.Font

 

3.1.4 KOMPONENTA COLOR DIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Color – boja

 

Ovaj prozor služi za izabir odgovarajuće boje. Njegovo bitno svojstvo je Color koje predstavlja izabranu boju. Na primer ako bi želeli da na komandno dugme promenimo boju fonta u RichEdit kontroli bojom kou smo odabrali u ColorDialog-u pisali bi u proceduri za obradu događaja OnClick kontrole Button sledeće :

 

If ColorDialog1.Execute then RichEdit1.Font.Color:=ColorDialog1.Color

3.1.5 KOMPONENTA FINDDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     FindText – tekst koji se traži

 

Ovaj prozor služi za pronalaženje odgovarajućeg teksta. Njegovo bitno svojstvo je FindText koje predstavlja tekst koji se traži.

 

3.1.6 KOMPONENTA REPLACEDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     FindText – tekst koji se traži

3.     ReplaceText – tekst kojim se nađeni tekst zamenjuje

 

Ovaj prozor služi za zamenu pronađenog teksta odgovarajućim tekstom. Njegovo bitno svojstvo osim FindText koje predstavlja tekst koji se traži je i ReplaceText koje predstavlja tekst kojim se pronađeni zamenjuje.

 

3.1.7 KOMPONENTA PRINTDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Copies – broj kopija

 

Ovaj prozor služi za štampanje odgovarajućih dokumenata. Njegovo bitno svojstvo je Copies koje predstavlja broj kopija koje treba da se štampaju.

 

3.1.8 KOMPONENTA PRINTERSETUPDIALOG

 

– Svojstva :

1.     Name – generičko ime

 

Ovaj prozor služi za podešavanje prilikom štampanja i on je povezan sa prethodnim dijalog prozorom.

 

 

3.1.9 KOMPONENTA OPENPICTURE DIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Filter – filter za prikazivanje samo određenih fajlova

3.     Filename – ime fajla koji će biti inicijalno prikazan

4.     InitialDir – folder koji će se inicijalno prikazati

5.     Title – naslov dijalog prozora

 

 

3.1.10 KOMPONENTA SAVEPICTUREDIALOG

 

– Svojstva :

1.     Name – generičko ime

2.     Filter – filter za prikazivanje samo određenih fajlova

3.     Filename – ime fajla koji će biti inicijalno prikazan

4.     InitialDir – folder koji će se inicijalno prikazati

5.     Title – naslov dijalog prozora

 

Ovi prozori su slični Open i Save prozorima. Ovi prozori služe za otvaranje i snimanje slika. Često se koriste kod multimedijalnih sadržaja.

 

          Dijalog prozori služe za dobijanje informacija od korisnika koje su potrebne aplikaciji i vrlo su korisni. Pomoću njih možemo da dobijemo vrlo korisne radnje koje možemo da integrišemo u našu aplikaciju. Kod Open i Save dialoga vrlo je bitno svojstvo Filename i pomoću njih možemo da manipulišemo dodatnim fajlovima, kod Font,Find i Replace vrlo bitno je svojstvo Font kojim možemo da menjamo ceo font ali postoji i svojstvo SelText kojim menjamo font samo selektovanog dela, kod Color prozora svojstvom Color menjamo boje.

 

Sada već možemo da pravimo poluprofesionalne aplikacije koje u sebi sadrže menije, kontekstne menije i raznobrojne kontrole.

- Korisne aplikacije

- Lepe aplikacije

- Efikasne aplikacije

 

 

4. RAD S GRAFIKOM

 

 

          U ovom delu ćemo se upoznati sa grafikom u Delphi-ju, odnosno sa načinom na koji se ona upotrebljava. Kada želimo da u Delphi-ju da nacrtamo nešto mi u stvari crtamo preko određenog platna (Canvas) koje se u stvari prostire preko naše aplikacije ili objekta na kome crtamo. Ovo platno, ili mreža se sastoji iz niza piksela, odnosno mreža je podeljena horizontalnim i vertikalnim linijama. Tako svaki piksel ima svoje X i Y koordinate. Koordinatni početak ovog platna je kao i kod većine sličnih sistema za implementaciju grafike je u gornjem levom uglu. Tačka u gornjem levom uglu ima koordinate X=0 i Y=0, dok tačka u donjem desnom uglu prozora ima koordinate X=ClientWidth-1 i Y=ClientHeight-1, gde ClientWidth i ClientHeight predstavljaju širinu i visinu klijentske oblasti. Crtanje na ovom platnu se u stvari vrši tako što se osvetljava pojedinačni piksel ovog platna određenom bojom. Ovo platno predstavlja u stvari objekat tipa TCanvas koji ima svoja određena svojstva kao i metode. Ovo platno ima svojstvo Pixels[X,Y], koje predstavlja određeni piksel gde su X i Y njegove koordinate. Znači, ukoliko bi želeli da obojimo piksel na poziciji 5,20 žutom bojom pisali bi sledeće : Canvas.Pixels[5,20]:=clYellow. Kao što vidimo boje su predstavljene njihovim imenom, s tim što ispred imena ide prefiks cl što je skraćeno od color. Boja je tipa TColor, tako da bi za neku promenljivu Boja pisali : var Boja : Tcolor. Međutim, postoji i način da se boja prikaže kao broj, jer je svakoj boji dodeljen određen broj pa bi za neku promenljivu Boja mogli da pišemo i sledeće : var Boja : Longint. Takođe, dozvoljeno je i obrnuto, odnosno ukoliko bi želeli da neka promenljiva dobije vrednost boje nekog piksela pisali bi :

Prvo bi definisali promenljivu recimo boja

Var Boja:TColor;

Nakon toga bi pisali sledeću naredbu :

Boja:=Canvas.Pixels[5,20];

          Što se tiče platna (Canvas) njega poseduju komponente : Form, Image, Printer i StringGrid. Svojstvo Canvas ima svoja podsvojstva : Pen – pero za bojenje, Brush – četku za bojenje, Font – font, Pixels – Pikseli koji čine ovu mrežu i PenPos – pozicija pera za crtanje. Podsvojstvo Pen ima svoja svojstva : Color - boja, Style - stil, Mode – režim rada i Width – širina, podsvojstvo Brush ima svoja svojstva : Color – boja i Style – stil, podsvojstvo Font ima svoja svojstva : Color – boja, Style – stil, Size – veličina i Name – ime, dok se sa podsvojstvima Pixels i PenPos postupa na drugačiji način.

          Postoji još jedan način definisanja boja a to je korišćenje funkcije RGB. Ona je sledećeg oblika : Function RGB(R:Byte, G:Byte, B:Byte):longint, gde paramatri R,G i B predstavljaju učešće R(Red)-crvene, G(Green)-zelene i B(Blue)-plave boje u onoj boji koju vraća funkcija RGB, s tim da ovi parametri mogu da budu u opsegu od 0 (odsustvo boje) do 255 )puno prisustvo boje). Na taj način crvena boja bi bila predstavljena kao RGB(255,0,0), zelena kao RGB(0,255,0) a plava kao RGB(0,0,255).

          Ako bi smo želeli da iscrtamo 500 slučajnih piksela na površini koja obuhvata četvrtinu prozora tako što bi kliknuli na dugme Button1 onda bi u proceduri za obradu događaja Button1Click pisali sledeći kod :

 

Procedure TForm1.Button1Click(Sender: TObject);

var I:Integer;

Boja:TColor;

begin

Randomize;

For i:=1 to 500 do

begin

Boja:=clRed;

Canvas.Pixels[Random(ClientWidth div 2 +1), Random(Clientheight div 2 +1)]:=Boja;

end;

end;

 

          Ako bi smo želeli na drugačiji način da iscrtamo 2000 piksela uz to da budu obojeni slučajnim brojem klikom na dugme Button1 onda bi u proceduri za obradu događaja Button1Click pisali sledeći kod :

 

Procedure TForm1.Button1Click(Sender: TObject);

var I:Integer;

Boja:Longint;

begin

Randomize;

For i:=1 to 2000 do

begin

Boja:=RGB(Random(255),Random(255),Random(255));

Canvas.Pixels[Random(ClientWidth div 2 +1), Random(Clientheight div 2 +1)]:=Boja;

end;

end;

 

          Kao što smo videli ovo smo pisali tako da se crtanje vrši klikom na odgovarajuće dugme, međutim mnogo je bolje da se crtanje vrši na događaj OnPaint jer bi ukoliko se ispred površine za crtanje našao recimo prozor onda bi se deo površine koji je nacrtan oštetio i njegovo ponovno crtanje bi bilo moguće samo na ponovno kliktanje dugmeta dok se prilikom korišćenja događaja OnPaint to vrši automatski jer kada se prozor neke aplikacije nađe ispred našeg prozora pa se skloni forma se ponovo iscrtava, odnosno boji, pa se uvek ponovo izaziva događaj OnPaint prozora Form1. Ukoliko bi želeli da se iscrtavanje vrši ponovo u zavisnosti od dimenzija prozora onda bi koristili u proceduri za obradu događaja FormResize metod Repaint koja izaziva ponovno crtanje (bojenje) forme. Ako bi smo želeli da obrišemo ono što smo crtali koristili bi smo metod Refresh.

          Sada ćemo reći nešto o najšešćim greškama koje se javljaju prilikom ovakve vrste crtanja, odnosno kada crtamo putem osvetljavanja piksela. Ovakav način crtanja ćemo najčešće izbegavati jer postoji drugačiji način crtanja preko osnovnih elemenata i preko komponente Shape. Znači moguće je crtati osnovne grafičke elemente preko odgovarajućih metoda koje to omogućavaju a moguće je i crtanje preko komponente Shape koja daje osnovne oblike preko svog svojstva Shape a poseduje i veliki broj drugih svojstava pomoću kojih možemo dobiti željene rezultate, međutim često je potrebno docrtati neke delove pa je potrebno reći nešto o ovakvom načinu crtanja iako je moguće i dosta lakše crtanje. Recimo da želimo da klikom na dugme nacrtamo krug sa centrom u sredini forme i poluprečnikom koji je jednak četvrtini širine forme. Ovaj krug će imati centar u tački (xc,yc), dok je svaka tačka na kružnici sa koordinatama (xc+r*cos(a),yc-r*cos(a)) kao što se vidi na slici 4.1. ukoliko vršimo crtanje u smeru suprotnom od smera kazaljke na satu. Znači imamo krug sa definisanim centrom u tački (xc,yc) koja se nalazi u sredini forme, poluprečnik r koji je jednak četvrtini širine forme kao i tačno definisanu jednačinu tačaka koje čine kružnicu pa možemo da vrlo nacrtamo dotični krug. Tada bi u proceduri za obradu događaja ButtonClick pisali sledeći kod :

 

 

Slika 4.1. Crtanje kruga tačku po tačku

 

 

Procedure TForm1.Button1Click(Sender: TObject);

var xc,yc,r,x,y:integer;

ugao:real;

begin

xc:=(ClientWidth) div 2;

yc:=ClientHeight div 2;

r:=xc div 2;

ugao:=0;

repeat

x:=Round(xc+r*cos(ugao));

y:=Round(yc+r*sin(ugao));

Canvas.Pixels[x,y]:=clBlack;

Ugao:=Ugao+0.01;

until Ugao>=2*Pi;

end;

 

          Na ovakav način bi dobili krug koji nije svuda iscrtan već je na nekim mestima isprekidan. To se dešava zato što je priraštaj ugla od 0.01 nedovoljno mali pa se na nekim mestima ne iscrtava deo kruga. Takođe je moguće da priraštaj ugla bude isuviše mali pa se neki pikseli više puta boje. Zato treba pronaći zadovoljavajuči priraštaj ugla. Za priraštaj ugla ćemo uzeti 1/r. Sada će kod u proceduri za obradu događaja ButtonClick biti sledeći :

 

Procedure TForm1.Button1Click(Sender: TObject);

var xc,yc,r,x,y:integer;

ugao:real;

begin

xc:=(ClientWidth-Panel1.Width) div 2;

yc:=ClientHeight div 2;

r:=xc div 2;

ugao:=0;

repeat

x:=Round(xc+r*cos(ugao));

y:=Round(yc+r*sin(ugao));

Canvas.Pixels[x,y]:=clBlack;

Ugao:=Ugao+1/r;

until Ugao>=2*Pi;

end;

 

          Na ovakav način smo dobili pravilno iscrtan krug nakon klika na odgovarajuće dugme Button1. Zašto je ugaoni priraštaj 1/r. To ćemo videti iz sličnosti trouglova sa slike 4.2. Naime, recimo da želimo da odredimo radijanski ugao U tako da se na poluprečniku R za priraštaj ugla U boje susedni pikseli koji su na rastojanju 1. Tada možemo da pišemo da je 1:R=U:1 pa na osnovu toga dobijamo da je U=1/R, odnosno u našem slučaju je priraštaj ugla 1/r.

 

 

Slika 4.2. Određivanje priraštaja ugla prilikom crtanja kruga

 

          Sada ćemo spomenuti još jedan slučaj. Recimo da želimo da klikom na dugme nacrtamo deo sinusoide od početnog ugla koji se unosi u kontrolu Edit do krajnjeg ugla koji se takođe unosi u Edit kontroli a crtanje se izvodi u odnosu na koordinatnom početku koji se nalazi u centru klijentske površine. Kada kažemo klijentska površina mislimo na onaj deo forme u kome crtamo a on će biti umanjen, tačnije njegova širina za širinu kontrole Panel1 kojoj ćemo izbrisati Caption a njega stavljamo da bi u njemu stavili kontrole : Button1, Edit1 i Edit2 kojim vršimo crtanje i unosimo podatke vezane za crtanje. Tada ćemo u proceduru za obradu događaja ButtonClick uneti sledeći kod :

 

Procedure TForm1.Button1Click(Sender: TObject);

var xc,yc,xt,yt:integer;

a,b,y,Ugao,f:real;

begin

xc:=(ClientWidth-Panel1.Width) div 2;

yc:=ClientHeight div 2;

Canvas.MoveTo(xc,0);

Canvas.LineTo(xc,ClientHeight-1);

Canvas.MoveTo(0,yc);

Canvas.LineTo(ClientWidth-1,yc);

Canvas.TextOut(xc+3,yc+3,'(0,0)');

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

Ugao:=a;

While Ugao<=b do

begin

y:=sin(Ugao);

xt:=Round(xc+Ugao);

yt:=Round(yc-y);

Canvas.Pixels[xt,yt]:=clBlack;

Ugao:=Ugao+1;

end;

 

          Na ovakav način nećemo dobiti zadovoljavajuće rezultate, tačnije dobićemo vrlo mali deo sinusoide kao na slici 4.3. koja se skoro ne vidi a to je zbog toga što smo naredbama xt:=Round(xc+Ugao) i yt:=Round(yc-y) dobili veoma malu površinu za crtanje – recimo da smo uneli uglove 0 i 3.14 mi bi smo dobili da nam je X koordinata na ekranu predstavljena samo sa 3 piksela dok Y koordinata nije veća od 1 piksela. Zbog ovakvog načina interpretacije dobijamo rezultat kakav smo dobili.

 

 

Slika 4.3. Crtanje sinusoide na pogrešan način

 

          Ovo ćemo ispraviti tako što ćemo na neki način povećati površinu u okviru koje se crta sinusoida. To ćemo postići tako što ćemo uvesti razmeru, odnosno broj N koji predstavlja broj piksela koji odgovara jedinici koordinatnog sistema. Taj broj ćemo unositi recimo preko kontrole SpinEdit. Sada kada smo ovo uradili i implementirali u naš rad procedura za obradu događaja ButtonClick bi izgledala ovako :

 

Procedure TForm1.Button1Click(Sender: TObject);

var xc,yc,xt,yt,n:integer;

a,b,y,Ugao:real;

begin

xc:=(ClientWidth-Panel1.Width) div 2;

yc:=ClientHeight div 2;

Canvas.MoveTo(xc,0);

Canvas.LineTo(xc,ClientHeight-1);

Canvas.MoveTo(0,yc);

Canvas.LineTo(ClientWidth-1,yc);

Canvas.TextOut(xc+3,yc+3,'(0,0)');

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

n:=SpinEdit1.Value;

Ugao:=a;

While Ugao<=b do

begin

y:=sin(ugao);

xt:=Round(xc+Ugao*n);

yt:=Round(yc-y*n);

Canvas.Pixels[xt,yt]:=clBlack;

Ugao:=Ugao+1/n;

end;

end;

 

          Sada bi smo nakon unosa uglova kao i razmere dobili pravilno nacrtanu sinusoidu koja izgleda kao na slici 4.4.

 

 

Slika 4.4. Crtanje sinusoide na pravilan način

 

          Znači ovde smo uneli početni ugao 0 i krajnji ugao 3.14 i uneli razmeru 70 tako da 70 piksela na slici prestavlja jednu jedinicu koordinatnog sistema, pa smo dobili zadovoljavajući rezultat. Prilikom crtanja na ovakav način je uvek moguće prevideti ovakve stvari. Zati prilikom crtanja treba obratiti pažnju i uvažavati ovakve stvari.

 

          U Delphi-ju mogu da se crtaju određeni oblici kao što su : linije, pravougaonici, kvadrati, krugovi, elipse, pravougaonici sa zaobljenim vrhovima, izlomljene linije, poligoni i složeni oblici. Takođe, neki od ovih oblika se mogu dobiti i korišćenjem kontrole Shape koja se nalazi u kartici Additional. Mi ćemo ovde razmotriti oba načina.

 

 

4.1 CRTANJE LINIJA

 

          Crtanje linije se vrši pomoću takozvanog “pera” – Pen, tačnije njegovim metodom LineTo(X,Y) gde X i Y parametri predstavljaju koordinate tačke do koje se vrši crtanje linije, s tim da početnu tačku definiše aktuelni položaj gde se nalazimo. U trenutku startovanja aplikacije položaj pera je u tački 0,0 tj. u gornjem levom uglu. Pozicija pera se može očitati svojstvom PenPos, ali ne i menjati. Pomeranje do određene tačke (bez ikakvog crtanja) vrši se metodom MoveTo(X,Y), gde X i Y parametri predstavljaju koordinate tačke gde se pero pomera. Znači ako bi želeli da crtamo recimo  2 paralelne linije pisali bi sledeći kod :

Canvas.MoveTo(50,50);

Canvas.LineTo(50,150);

Canvas.MoveTo(100,50);

Canvas.LineTo(100,150);

Prvom naredbom MoveTo(50,50) pomerili bi smo se na tačku sa koordinatama 50,50 (na početku – u trenutku startovanja aplikacije se nalazimo u gornjem levom uglu čije su koordinate 0,0), zatim bi smo naredbom LineTo(50,150) nacrtali liniju do tačke sa koordinatama 50,150, zatim bi smo se naredbom MoveTo(100,50) pomerili do tačke sa koordinatama 100,50 i na kraju bi naredbom LineTo(100,150) povukli liniju do tačke sa koordinatama 100,150 i na taj način bi smo nacrtali 2 paralelne linije. Način na koji penkalo crta može se menjati, recimo debljina pera metodom Pen.Width, boja metodom Pen.Color a stil metodom Pen.Style (psSolid, psDash, psDot, psdashDot, psDashDotDot, psClear, psInsideFrame). Brisanje crteža se vrši metodom Refresh što u stvari predstavlja dodeljivanje one boje pikselima u kojima je prikazan aktuelni obrazac.

 

 

4.2 CRTANJE PRAVOUGAONIKA

 

          Crtanje pravougaonika se vrši metodom Rectangle(X1,Y1,X2,Y2), gde X1 i Y1 predstavljaju koordinate gornjeg levog temena pravougaonika, a X2 i Y2 koordinate donjeg desnog temena pravougaonika. Takođe, postoji i još jedna grupa pravougaonika – sa zaobljenim vrhom gde se osim ovih parametara navode još 2 parametra koji predstavljaju zaobljenost i oni se crtaju metodom RoundRect(X1,Y1,X2,Y2,zx,zy) gde zadnja 2 parametra predstavljaju zaobljenost u x i y smeru. Kvadrati se crtaju kao pravilni pravougaonici.

          Na sledećoj slici vidimo pravougaonik sa svojim temenima koji učestvuju kao argumenti x1,y1,x2,y2 u metodi Rectangle.

 

 

Slika 4.2.1. Crtanje pravougaonika sa temenima kao argumentima

 

 

          Osim crtanja običnog pravougaonika, postoji način crtanja pravougaonika sa zaobljenim temenima i on se postiže metodom RoundRect s tim da se osim temena pravougaonika kao argumenti navode i zaobljenost tih uglova datih kao elipsa čija se jedna četvrtina koristi za crtanje zaobljenog ugla pravougaonika pa bi naredbom RoundRect(x1,y1,x2,y2,x3,x4) dobili pravougaonik sa zaobljenim vrhovima kao na sledećoj slici :

 

 

Slika 4.2.2. Crtanje pravougaonika sa zaobljenim uglovima

 

          Ako bi recimo, želeli da klikom na dugme iscrtamo pravougaonik čije se koordinate temena unose u SpinEdit kontrolama tada bi u proceduri za obradu događaja Button1.Click pisali sledeci kod :

 

Procedure Tform1.Button1Click(Sender: TObject);

begin

Canvas.Rectangle(SpinEdit1.Value, SpinEdit2.Value, SpinEdit3.Value, SpinEdit4.Value);

end;

 

 

4.3 CRTANJE KRUGOVA I ELIPSI

 

          Crtanje elipsi se vrši slično kao i pravougaonika s tim da se navodi pravougaonik koji elipsa dodiruje, pa bi se elipsa crtala metodom Ellipse(X1,Y1,X2,Y2). Krug se crta kao pravilna elipsa.

 

 

Slika 4.3.1. Crtanje elipsi i krugova

 

 

4.4 CRTANJE OSTALIH OBLIKA

 

          Takođe, postoji još niz raznih oblika koje možemo da crtamo u Delphi-ju, od kojih ćemo spomenuti sledeće : crtanje luka, crtanje pite kao i crtanje poligona, odnosno izlomljenih linija.

 

 

 

4.4.1 CRTANJE LUKA

 

          Crtanje luka se postiže metodom Arc koja je data u sledećem obliku : Arc (x1,y1, x2,y2, x3,y3, x4,y4) gde prva 4 parametra označavaju elipsu po kojoj se crta dati luk a ostalih 4 parametara definišu početnu i krajnju tačku luka tako da je početna tačka tačka preseka elipse i prave koja prolazi kroz centar elipse i tačku (x3,y3), a krajnja tačka je tačka preseka elipse i prave koja prolazi kroz centar elipse i tačke (x4,y4). Crtanje se izvodi u smeru suprotnom od smera kazaljke na satu. Tako bi ako bi želeli da nacrtamo figuru na slici 4.4.1.1. levo pisali : Canvas.Arc(x1,y1,x2,y2,x3,y3,x4,y4) a ako bi želeli da nacrtamo figuru na slici 4.4.1.1. desno pisali : Canvas.Arc(x1,y1,x2,y2,x4,y4,x3,y3).

 

 

Slika 4.4.1.1. Crtanje luka

 

 

4.4.2 CRTANJE PITE

 

          Crtanje pite se izvodi slično kao i crtanje luka, s obzirom da je to zatvorena površina, odnosno isečak elipse koji je definisan određenim lukom. Crtanje pite se postiže metodom Pie koja je data u obliku : Pie (x1,y1,x2,y2,x3,y3,x4,y4) gde prva 4 parametra označavaju elipsu koja daje datu pitu a ostalih 4 parametara definišu početnu i krajnju tačku pite tako da je početna tačka tačka preseka elipse i prave koja prolazi kroz centar elipse i tačku (x3,y3), a krajnja tačka je tačka preseka elipse i prave koja prolazi kroz centar elipse i tačke (x4,y4). Crtanje se izvodi u smeru suprotnom od smera kazaljke na satu. Tako bi ako bi želeli da nacrtamo figuru na slici 4.4.2.1. levo pisali : Canvas.Pie(x1,y1,x2,y2,x3,y3,x4,y4) a ako bi želeli da nacrtamo figuru na slici 4.4.2.1. desno pisali : Canvas.Pie(x1,y1,x2,y2,x4,y4,x3,y3).

 

 

Slika 4.4.2.1. Crtanje pite

 

4.4.3 CRTANJE POLIGONA I IZLOMLJENIH LINIJA

 

Od ostalih oblika možemo da spomenemo izlomljene linije i poligone koji se crtaju metodama Polyline i Polygon koje kao parametre uzimaju niz s komponentama tipa TPoint. Ovaj tip je definisan na sledeći način :

TPoint=Record

X:Integer;

Y:integer

end;

Crtanje se vrši tako što se parametri predaju ovim metodama funkcijom Point koja barata s celobrojnim vrednostima i daje vrednost tipa TPoint. Na taj način crtanje izlomljene linije bi se vršilo na sledeći način : Polyline([Point(x1,y1), Point(x2,y2), ... Point(xn,yn)]) gde se navode koordinate svih tačaka (ma koliko ih bilo), dok se crtanje poligona vrši na sledeći način : Polygon([Point(x1,y1), Point(x2,y2), ... Point(xn,yn)]) gde poslednja linija ide od zadnje navedene tačke do početne kao što je to prikazano na slici 4.4.3.1.

 

 

Slika 4.4.3.1. Crtanje poligona i izlomljenih linija

 

 

          4.5 ISPISIVANJE TEKSTA

 

          Takođe, u Delphi-ju možemo da ispišemo određeni tekst na nekim koordinatama a to se postiže metodom TextOut koja je u obliku : TextOut(x,y,Tekst) gde su x i y koordinate teksta a argument Tekst je tekst koji se ispisuje kao što je to prikazano na slici 4.5.1. Tako bi naredba TextOut (50,100,’Tekst koji se ispisuje’) ispisala na poziciji 50,100 odgovarajući tekst.

 

 

Slika 4.5.1. Ispisivanje teksta na željenoj poziciji

 

 

          4.6 CRTANJE PUTEM SHAPE KOMPONENTE

 

          Ovde smo videli crtanje pomoću osnovnih elemenata, ali postoji još jedan način crtanja koji se zasniva na komponenti Shape pomoću koje je moguće dobiti najosnovnije oblike podešavanjem njenog svojstva Shape.

4.6.1 KOMPONENTA SHAPE

 

Razni oblici se mogu dobiti i iz komponente Shape.

 

– Svojstva :

1.     Name – generičko ime

2.     Shape – daje obilik koji se crta

3.     Pen – način na koji će oblici biti crtani

4.     Brush – definiše način popunjavanja oblika

5.     Top – udaljenost od gornje ivice forme

6.     Left – udaljenost od leve ivice forme

7.     Width – širina

8.     Height – visina

9.     Hint – objašnjenje

10. Show Hint – prikazivanje objašnjenja

11. Visible – ukazuje da li će objekat biti vidljiv ili ne

 

 

4.7 KOMPONENTA IMAGE

 

Komponenta Image služi kao kontejner za slike i pomoću ove kontrole je vrlo lako postaviti određenu sliku na prozor.

 

– Svojstva :

1.     Name – generičko ime

2.     Picture – slika koja se prikazuje

3.     Center – centriranje slike

4.     Strech – slika se prilagođava veličini Image komponente

5.     AutoSize – kontrola se prilagođava veličini slike

6.     Proportional – prilikom prilagođavanja dimenzijama komponente slika čuva svoje proporcije

7.     Transparent – definiše da li će određeni slike biti providan

8.     Top – udaljenost od gornje ivice forme

9.     Left – udaljenost od leve ivice forme

10. Width – širina

11. Height – visina

12. Hint – objašnjenje

13. Show Hint – prikazivanje objašnjenja

 

Recimo da se na našoj formi nalazi kontrola Image1 u koju želimo da ubacimo sliku koja se zove Homer.jpg i nalazi se na hard disku onda bi u kliknuli na svojstvo Picture kontrole Image1 i u sledećem prozoru koji bi se pojavio kliknuli na dugme Load a onda bi u diajlog prozoru pronašli datu sliku čija je putanja C:\Homer.jpg. sada bi želeli da se slika prilagodi veličini kontrole Image1 što je najčešći slučaj onda bi svojstvo Strech podeslili na True i onda bi imali izgled našeg prozora kao na slici 4.7.1.

 

 

Slika 4.7.1. Prozor sa Image kontrolom koja sadrži sliku

 

          Ukoliko u toku izvršavanja aplikacije želimo da promenimo sliku u kontroli Image možemo koristiti metod LoadFromFile i na taj način u komponentu učitati konkretnu sliku. Ovde možemo kombinovati Open dijalog ili još bolje OpenPicture dijalog i na taj način odabrati sliku. Recimo da želimo da klikom na dugme Button1 u kontrolu Image1 učitamo sliku koju ćemo odabrati iz diajaloga OpenPictureDialog1 u proceduri za obradu događaja Button1.Click bi pisali sledeći kod :

 

Procedure TForm1.Button1Click(Sender: TObject);

begin

If OpenPictureDialog1.Execute then

Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

 

          Ukoliko ne želimo da se slika prilagođava veličini Image Kontrole onda bi svojstvo Strech postavili na false, a ako bi želeli da se centar slike poklapa sa centrom Image kontrole onda bi svojstvo Center postavili na true. Ako bi svojstvo Strech postavili na false a želeli bi da se veličina kontrole prilagodi veličini slike onda bi svojstvo AutoSize postavili na true. Vidi se da svojstva Strech i AutoSize isključuju jedna drugo. Ukoliko bi želeli da se slika prilagodi veličini Image kontrole ali da zadrži svoje proporcije onda bi svojstvo Strech postavili na true a svojstvo Proportional takođe na true i na taj način bi moglo da se desi da deo kontrole ostane nepopunjen. Ovde treba reći da ikonice – fajlovi sa ekstenzijom ico uvek zadržavaju svoje dimenzije. Pomoću ovih svojstava možemo vrlo lako da manipulišemo slikama na interfejsu naše aplikacije. Komonenta Image ima takođe svojstvo Canvas koje ćemo kasnije upotebljavati. Mana ove kontrole je da ne može da prikazuje fajlove sa formatom gif koji se često koriste. Inače, ova komponenta može da prikazuje fajlove formata jpg,bmp i ico tako da možemo ubacivati grafičke formate fajlova koji se najčešće koriste.

          Znači ova kontrola je veoma korisna i pomoću nje možemo na vrlo lak način postaviti sliku u prozor naše aplikacije. Ona poseduje veliki broj svojstava kojim možemo da podešavamo sliku. Ova kontrola je vrlo efikasna i često se koristi u aplikacijama i na taj način daje našim aplikacijama multimedijalni izgled.

 

 

          4.8 POMERANJE PREDMETA PO PROZORU

 

          Često ćemo želeti da u našim aplikacijama ostvarimo kretanje predmeta po prozoru. Ukoliko te predmete predstavimo kao slike to kretanje preko prozora ćemo ostvariti pomoću komponente Image. Naime u komponentu Image ćemo postaviti određenu sliku i menjanjem njenog položaja na prozoru tj. menjanjem njenih svojstava Left i Top menjati njen položaj u određenom vremenskom trenutku što ćemo najbolje postići kombinacijom sa komponentom Timer. Takođe, ukoliko imamo više slika tog istog predmeta u različitim položajima možemo naizmeničnim menjanjem svojstva Picture komponente Image postići potpuni utisak da se predmet kreće po prozoru, a pogodnim mejanjem vremenskog intervala i pomeranja možemo postići vrlo lepu animaciju.

 

4.8.1. KRETANJE PREDMETA PREKO NEKE POZADINE

 

          Recimo da želimo da izvedemo kretanje nekog predmeta preko neke pozadine koja se nalazi preko celog prozora naše aplikacije. Prvo ćemo postaviti pozadinu, odnosno određenu sliku preko celog prozora naše aplikacije. To ćemo postići tako što ćemo postaviti komponentu Image1 na naš formular a zatim njeno svojstvo Align postaviti na alClient tako da se ona prostire preko celog formulara. Zatim ćemo u nju postaviti sliku pozadine – recimo, konkretnu sliku C:\Pozadina.jpg, tako što u svojstvu Picture navedemo ovu sliku. Neka ova slika predstavlja pejzaž po kome će se kretati drugi predmet – recimo avion. Sada ćemo postaviti drugu komponentu Image2 u kojoj će se nalaziti konkretna slika aviona – recimo C:\Slika.bmp. Sada imamo sliku pejzaža preko celog prozora i sliku aviona koju smo stavili u gornji desni ugao prozora tako da možemo pristupiti kretanju aviona po ovom atraktivnom pejzažu. To ćemo ostvariti tako što ćemo smanjivati svojstvo Left kontrole Image2 na svakih recimo pola sekunde a to ćemo realizovati tako što na formular postavljamo komponentu Timer1 čiji interval postavljamo na 500 (pola sekunde) i koji će izazivati umanjenje svojstva Left. U proceduri za obradu događaja Timer1Timer bi imali sledeći i jedini kod :

 

Procedure TForm1.Timer1Timer(Sender: TObject);

begin

Image2.Left:=Image2.Left-10;

end;

 

          Na ovaj način smo postigli animaciju kao na slici 4.8.1.1. i pravilnim odabiranjem vremenskog intervala koji izaziva pomeranje kao i pravilnim izabiranjem priraštaja, u našem slučaju -10 jer se predmet kreće s desne ka levoj strani, možemo postići vrlo glatku animaciju. 

 

Slika 4.8.1.1. Slike i animacija

 

 

4.8.2. KRETANJE PREDMETA U OKVIRU PROZORA

 

          U prethodnom primeru smo videli kako se vrši kretanje predmeta preko formulara a sada ćemo videti kako možemo kontrolisati kretanje predmeta u okviru formulara, odnosno kako postići da se predmet kada dođe do ivice formulara odbije o njegovu ivicu, odnosno nastavi kretanje u suprotnom smeru. Recimo, želimo da kreiramo aplikaciju koja će simulirati kretanje loptice u prozoru, kao i njeno odbijanje o ivice prozora. U našu aplikaciju ćemo uključiti jednu Shape kontrolu koja će simulirati lopticu i kojoj ćemo staviti svojstvo Shape na stCircle odnosno dodelićemo joj oblik kruga, a svojstvo Brush, tačnije podsvojstvo Color ćemo podesiti na clYellow tako da ima žutu boju. Veličina ove komponente će biti 25, odnosno Heiht i Width će biti 25. Takođe, dodaćemo i kontrolu Timer1 kojoj ćemo podesiti Interval na 100 i koji će u tom vremenskom intervalu inicirati kretanje. Našem prozoru ćemo promeniti svojstvo BorderStyle na Dialog da bi ivice prozora bile nepromenljive. Ostaje nam još da u kretanje uklučimo i promenu pravca kada predmet dođe do ivica. To je sve što nam je potrebno od komponenata. Sada ćemo kretanje urediti na sledeći način : Shape1.Left:=Shape1.Left+10 ako se predmet kreće na desno, Shape1.Left:=Shape1.Left-10 ako se predmet kreće na levo, Shape1.Top:=Shape1.Top+10 ako se predmet kreće na dole i  Shape1.Top:=Shape1.Top-10 ako se predmet kreće na gore, gde se kao što vidimo predmet pomera u jednom trenutku za priraštaj od 10. Međutim pošto predmet menja pravac u odnosu na ivicu na koju je naišao bolje ćemo urediti kretanje na sledeći način : Shape1.Left:=Shape1.Left+Znak1*10 i Shape1.Top:=Shape1.Top+Znak2*10, gde promenljive Znak1 i Znak2 naizmenično uzimaju vrednosti 1 i -1 i na taj način određuju smer kretanja. Ove preomenljive ćemo definisati kao globalne za ceo unit u odeljku var za Unit1. Na početku ćemo im dodeliti vrednost Znak1:=1 i Znak2:=1, što možemo pisati u proceduri za obradu događaja FormCreate jer on nastaje samo jednom – u trenutku kada se kreira forma, što određuje da se predmet kreće desno na dole. Sad ćemo u proceduru za obradu događaja Timer1.Timer pisati sledeći kod :

Procedure TForm1.Timer1Timer(Sender: TObject);

begin

If (Znak1=1) and (Shape1.Left>ClientWidth-25) then

Znak1:=-Znak1;

If (Znak1=-1) and (Shape1.Left<0) then

Znak1:=-Znak1;

If (Znak2=1) and (Shape1.Top>ClientHeight-25) then

Znak2:=-Znak2;

If (Znak2=-1) and (Shape1.Top<0) then

Znak2:=-Znak2;

Shape1.Left:=Shape1.Left+Znak1*10;

Shape1.Top:=Shape1.Top+Znak2*10;

end;

 

 

Slika 4.8.2.1 Kretanje predmeta u okviru prozora

 

          Na ovaj način postižemo kretanje predmeta u prozoru, s tim da on ostane u granicama prozora tako što se odbija od ivica kada naiđe na njih kao što se vidi na slici 4.8.2.1. i tako beskonačno ukoliko se u aplikaciju ne uključi i neka komponenta koja bi zaustavljala kretanje predmeta. Što se tiče kretanja ono se može modifikovati i ovde tako da se dobiju što bolji rezultati, a oni su najbolji pre svega kod malih predmeta i kada je priraštaj za koji se vrši promena kretanja mali, a interval komponente Timer što manji tako da se često izaziva promena kretanja. Takođe, sa aplikacijom se može eksperimentisati menjanjem dimenzije predmeta, boje predmeta, veličine prozora kao i dodavanjem još nekih elemenata tako da se dobije efektniji rezultat.

 

4.8.2. POMERANJE PREDMETA

 

          Sada ćemo pokušati da izvršimo kretanje predmeta po prozora ali tako da ono bude inicirano od strane korisnika. Korisnik može pomerati predmet bilo tastaturom ili mišem. Ovde ćemo se opredeliti da korisnik izaziva pomeranje predmeta preko tastera na tastaturi. Postupak se svodi na pisanje koda u proceduri za obradu događaja FormKeyPress u zavisnosti od tastera koje smo odabrali da se pomoću njih izvodi kretanje.Što se tiče tastature odabraćemo da se kretanje vrši na sledeći način : W – gore, Z – dole, A – levo i S – desno. Kretanje predmeta se izvodi na sličan način kao do sada, odnosno povećaćemo ili smanjiti položaj predmeta, tačnije njegova svojstva Left i Top, odnosno svojstva komponente Image1 u kojoj će se nalaziti slika. Znači na prozor ćemo postaviti komponentu Image1 u nju postaviti sliku automobila koja se nalazi na hard disku i zove se Auto. Podesićemo svojstva komponete Image1 Strech na true i Transparent na true. Sada ćemo u proceduru za obradu događaja Form1.OnKeyPress pisali sledeći kod :

 

Procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

If Key='w' then Image1.Top:=Image1.Top-10;

If Key='z' then Image1.Top:= Image1.Top+10;

If Key='a' then Image1.Left:= Image1.Left-10;

If Key='s' then Image1.Left:= Image1.Left+10;

end;

 

          Nakon startovanja imaćemo aplikaciju koja na osnovu toga šta korisnik pritisne na tastaturi vrši pomeranje malog automobila čiju sliku smo ubacili u komponentu Image1 i čiji ćemo u stvari položaj i menjati, a prozor aplikacije će izgledati kao na slici 4.8.2.1.

 

 

Slika 4.8.2.1. Pomeranje predmeta

 

          U našu aplikaciju možemu ubaciti i sliku neke lepe pozadine, možemo podešavati brzinu pomeranja, dodati još neku sliku automobila – recimo sliku istog automobila ali slikanog od napred, iza, i sa leve strane, pa u zavisnosti od toga šta pritisnemo na tastaturi pojavljuje se slika automobila sa te strane tako da dobijamo utisak trodimenzionalnosti, odnosno da se automobil okreće kada pritisnemo odgovarajući taster, podešavati veličinu prozora, ubaciti i nemogućnost da automobil udari u ivicu ili mogućnost da kada automobil udari u ivicu prozora pojavi se neka slika, animacija ili tekst, podesiti ostale atribute aplikacije. Takođe u našu aplikaciju možemo uklučiti i druge predmete i njihovo kretanje, kao i interakciju s našim predmetom i na taj način dobiti aplikacije zabavnim tipom.

 

          4.9 MULTIPLIKACIJA

 

          Pod pojmom multiplikacija podrazumevamo kretanje predmeta po prozoru, odnosno njihovu animaciju, kao i interakciju sa pozadinom. Mi smo videli kako možemo realizovati kretanje predmeta preko prozora putem Image komponente, međutim ovde ćemo ovom pojmu pristupiti na drugačiji način. Naime, ovde ćemo učitavati slike, tačnije bitmape direktno na platno (Canvas) prozora ili neke druge komponente. Zato ćemo se ovde upoznati sa objektom tipa TBitmap koji predstavlja bitmapu. Znači ovako napisana promenljiva Slika :

Var Slika:TBitmap predstavlja promenljivu tipa TBitmap odnosno jednu običnu bitmapu tj. sliku. Kada želimo da u programu iniciramo jednu promenljivu Slika to bi postigli sledećom naredbom : Slika:=TBitmap.Create. Ako želimo da toj promenljivoj dodelimo neku konkretnu sliku, koja se recimo nalazi na hard disku, tada bi upotrebili metod LoadFromFile gde bi se nakon toga u zagradama ispisivala njena putanja, kao na primer : Slika.LoadFromFile(C:\Slika.bmp’) i na ovakav način bi promenljivoj Slika dodelili bitmapu koja se nalazi na hard disku C: i zove se Slika. Iscrtavanje slika se vrši metodom Draw gde se u zagradama navode X i Y koordinata slike a zatim i promenljiva koja sadrži sliku. Tako, ako bi smo želeli da nacrtamo prethodnu sliku na poziciji 50,100 pisali bi sledeće : Canvas.Draw(50,100,Slika). Tako, ako bi smo želeli da izvedemo kretanje ove slike bilo bi potrebno samo da menjamo njene koordinate. Međutim na ovakav način na prozoru bi ostajale i slike u prethodnim položajima. Zato ćemo ovde renovirati stalno površinu pozadine gde se nalazi prethodni položaj slike. Ovo ćemo uspeti putem funkcije Rectangle koja pamti pravougaonu površinu koja je zadata svojim temenima. Na primer nakon pozivanje sledeće funkcije : StariPravougaonik:=Rect(x,y,x+50,x+70) imali bi smo promenljivu StariPravougaonik koja je tipa TRect i koja pamti pravougaonu površinu definisanu temenima sa koordinatama x,y i x+50,x+70. Kada želimo da osvežimo površinu gde je potrebno da se prikaže slika pozadine, a ne slike u prethodnom položaju koristićemo metodu CopyRect čiji prvi parametar predstavlja pravougaonu površinu koju smo zapamtili, drugi parametar je slika(izgled) kojom zamenjujemo ovu površinu a treći parametar je pravougaona površina kojom je zamenjujemo. Ova metoda je data u obliku : Objekat1.CopyRect(GdeSeKopira, Objekat2, StaSeKopira) gde je parametar Objekat1 u stvari objekat ili tačnije prijemnik na čiju se pravougaonu oblast koja je definisana sa GdeSeKopira kopira pravougaona oblast čije su dimenzije definisane sa StaSeKopira kopira, parametar GdeSeKopira definiše pravougaonu oblast gde se kopira, parametar  Objekat2 definiše objekat čije se deo platna kopira (tačnije ovaj parametar je Objekat2.Canvas) a parametar StaSeKopira definiše dimenzije pravougaone oblasti koja se kopira. Parametri GdeSeKopira i StaSeKopira su najčešće isti jer se najčešće na jednu pravougaonu oblast kopira neki sadržaj istih dimenzija. Što se tiče parametara Objekat1 i Objekat2 oni su različiti jer u stvari predstavljaju staru sliku i novu sliku kojom je zamenjujemo. Recimo da smo u programu definisali promenljive var Pozadina, Slika : Tbitmap, a kasnije u programu smo ovim promenljivima dodelili konkretne slike : Pozadina:=TBitmap.Create; Pozadina.LoadFromFile(‘C:\Pozadina.bmp’); i Slika:=TBitmap.Create; Slika.LoadFromFile(‘C:\Slika.bmp’); a zatim smo te slike i nacrtali tako da je Pozadina velika slika a Slika manja slika koja se nalazi na ovoj pozadini : Canvas.Draw(1,1,Pozadina); i Canvas.Draw(100,150,Slika); tada ćemo naredbom StariPravougaonik:=Rect(100,150,100+Slika.Width,150+Slika.Height) u promenljivoj StariPravougaonik, koja je tipa TRect, zapamtiti pravougaonu oblast koja u stvari predstavlja celu sliku Slika a onda bi naredbom Canvas.CopyRect(StariPravougaonik,Pozadina.Canvas, StariPravougaonik) na platno našeg formulara kopirali preko Slike deo Pozadine koji se tu nalazi i na taj način bi smo dobili čistu pozadinu. Na taj način mi stalno zamenjujemo onaj deo slike koji nam nije potreban novom slikom a pošto stalno na novom mestu iscrtavamo novu sliku dobijamo kretanje ovog predmeta. Pravilno kretanje se postiže optimalnim izborom trenutka kada se vrši crtanje nove slike kao i rastojanja na kome se crta nova slika. Na ovakav način možemo dobiti veoma zadovoljavajuće efekte.

          Ovakav način kretanja predmeta ćemo najbolje predstaviti sledećom aplikacijom koja kombinuje kretanje slike na način koji smo ranije predstavili i na ovakav način, a njen izgled je predstavljen na slici 4.9.1.

 

 

Slika 4.9.1. Kretanje slika

 

 

          U ovoj aplikaciji ćemo imati sliku manjeg aviona koji se kreće preko pozadine i koji je realizovan putem menjanja položaja komponente Image i sliku većeg aviona koji se kreće preko iste pozadine putem učitavanja slika. U prozoru naše aplikacije imamo sledeće kontrole : Image1 koja sadrži sliku manjeg aviona, Timer1,Timer2 i Timer3 koje regulišu brzinu pomeranja kontrole Image1, brzinu iscrtavanja slike aviona na nepravilan način bez osvežavanja pozadine i brzinu iscrtavanaja slike aviona na pravilan način kada se vrši osvežavanje pozadine i Button1, Button2, Button3, Button4 i Button5 koja za svojstva Caption imaju Osvezi pozadinu, Prikazi novu sliku, Kreni, Osvezi sliku i Pravilno kretanje koja osvežavaju pozadinu bez slike manjeg aviona, prikazuju sliku većeg aviona, izazivaju kretanje većeg aviona na nepravilan način, osvežavaju sliku uz prikazivanje većeg aviona i izazivaju kretanje većeg aviona na pravilan način.

          U ovoj aplikaciji imamo definisane sledeže globalne promenljive : var Form1: TForm1; Slika:TBitmap; I:integer; P,P2:boolean; koje predstavljaju formular, sliku aviona i logičke promenljive koje pokazuju da li je kliknuto na dugme Kreni i Pravilno kretanje tako da bi mogli da isklučimo tajmere Timer1 i Timer2 i one moraju biti globalne jer su nam potrebne u celom programu i koje prilikom kreiranja obrasca postavljamo na sledeće vrednosti : I:=700; p:=false; p2:=false. Sada treba isprogramirati događaje Timer1.OnTimer, Timer2.OnTimer i Timer3.OnTimer koji regulišu brzinu kretanja manjeg aviona, brzinu nepravilnog kretanja većeg aviona i brzinu pravilnog kretanja većeg aviona. Takođe, isprogramiraćemo i događaje Button1.Click, Button2.Click, Button3.Click, Button4.Click i Button5.Click kojim iniciramo osvežavanje slike tako da ostane samo pozadina, učitavanje slike velikog aviona, nepravilno kretanje velikog aviona, osvežavanje slike tako da ostane i pozadina i slika većeg aviona i pravilno kretanje većeg aviona. U ovoj aplikaciji imamo sledeći kod :

 

Procedure TForm1.Timer1Timer(Sender: TObject);

begin

Image2.Left:=Image2.Left-10;

end;

Procedure TForm1.Button1Click(Sender: TObject);

begin

Image1.Picture.LoadFromFile('C:\Pozadina.bmp');

Image2.Destroy;

Timer1.Enabled:=False;

end;

Procedure TForm1.Button2Click(Sender: TObject);

begin

Slika:=TBitmap.Create;

Slika.LoadFromFile('C:\Slika.bmp');

Slika.Transparent:=True;

Slika.TransparentColor:=Slika.Canvas.Pixels[1,1];

Canvas.Draw(I,50,Slika);

end;

Procedure TForm1.FormCreate(Sender: TObject);

begin

I:=700;

p:=false;

p2:=false;

end;

Procedure TForm1.Button3Click(Sender: TObject);

begin

p:=true;

end;

Procedure TForm1.Timer2Timer(Sender: TObject);

begin

If p then

begin

Canvas.Draw(I,50,Slika);

I:=I-50;

end;

end;

Procedure TForm1.Button4Click(Sender: TObject);

begin

Refresh;

Timer2.Enabled:=False;

I:=700;

Canvas.Draw(I,50,Slika);

end;

Procedure TForm1.Button5Click(Sender: TObject);

begin

p2:=true;

end;

Procedure TForm1.Timer3Timer(Sender: TObject);

var

StariPravougaonik:TRect;

begin

If p2 then

begin

StariPravougaonik:=Rect(I,50,I+Slika.Width,50+Slika.Height);

Image1.Canvas.CopyRect(StariPravougaonik,Image1.Canvas,StariPravougaonik);

I:=I-50;

Canvas.Draw(I,50,Slika);

end;

end;

 

          Na ovaj način smo videli kako se postiže multiplikacija, odnosno rad s slikama i pomeranje ovih slika. Što se tiče ova dva načina kretanja slika koji smo videli svaki ima svoje prednosti i mane pa izbor zavisi od onog ko razvija program. Takođe postoji i način animacije predmeta u pravom smisli te reči koji ovde nećemo spominjati ali i na ovakav način možemo dobiti vrlo lepu grafiku, slike i animaciju, odnosno vrlo lepe efekte.

 

 

5. MULTIMEDIJA

 

 

          U ovom delu ćemo videti upotrebu multimedije. U našim aplikacijama ćemo osim teksta i slika često imati i zvukove i video zapis. Postoji veliki broj naredbi koje ovo omogućavaju. Takođe, postoji i kontrola MediaPlayer koji dozvoljava upotrebu multimedijalnih fajlova. Na taj način aplikacije koje kreiramo postaju veoma atraktivne i multimedijalne.

          Do sada smo videli kako se u naš projekat dodaje tekst i slike a sada ćemo pokušati da u naš projekat uključimo i zvuk. U tu svrhu postoji naredba PlaySound koja služi za reprodukovanje određenog zvuka. Ona je u sledećem obliku :

PlaySound(ImeFajla,0,SND_FileName) gde parametar ImeFajla označava ime zvučnog fajla koji puštamo, dok drugi i treći parametar mogu imati najrazličitije oblike, ali za sada ćemo se zadržati na ovim parametrima koji su dati. Prilikom korišćenja ove naredbe potrebno je u sekciji Uses formulara unesemo i ime modula koji omogućava korišćenje ove naredbe a to je konkretno modul po imenu MmSound. Za rad s multimedijom postoji još veliki broj Windows API funkcija koje su vrlo lake za rad. Međutim, mi ćemo raditi sa kontrolom Media Player koja olakšava rad s multimedijom.

 

 

5.1 KOMPONENTA MEDIAPLAYER

 

          Komponenta MediaPlayer je komponenta koja omogućuje reprodukovanje multimedijalnih fajlova kako zvučnih – *.wav tako i video fajlova – *.avi. Ova komponenta može biti vidljiva tokom izvršavanja programa, ali i ne mora, jer je njena svrha da reprodukuje određene zvučne i video fajlove a vizuelni deo se može ostvariti preko sasvim nekih drugih komponenti. Ova komponenta veoma olakšava rad s multimedijalnim fajlovima.

– Svojstva :

1.     Name – generičko ime

2.     FileName – ime fajla koji se reprodukuje

3.     Top – udaljenost od gornje ivice forme

4.     Left – udaljenost od leve ivice forme

5.     Width – širina

6.     Height – visina

7.     Hint – objašnjenje

8.     Show Hint – prikazivanje objašnjenja

 

Pomoću ove komponente možemo da reprodukujemo najrazličitije formate fajlova bilo da je u pitanju zvuk ili video zapis. Ova komponenta ima kontrole kojima se upravlja odreženim fajlom i sa njima se vrlo lako radi, bilo da je u ptianju puštanje, premotavanje ili zaustavljanje fajla. Ovaj plejer barata sa najosnovnijim zvučnim ili video zapisima. Često ovaj plejer može da se postavi da bude nevidljiv, a za manipulisanje fajlom mogu da se naprave naše kontrole, a takođe mogu da se s ovim plejerom kombinuju najrazličitije komponente. Na taj način naše aplikacije postaju potpuno multimedijalne.

 

 

6. RAD S BAZAMA PODATAKA

 

 

          U Delphi-ju postoji veliki broj komponenti za rad s bazama podataka. Najlakši način za izradu aplikacije koja radi s bazama podataka je wizzard koji se nalazi u Delphi-ju i naj tačin je olakšano kreiranje aplikacije koja radi s bazama podataka. Ovde se nećemo baviti samim bazama podataka već načinom na koji se njima manipuliše u Delphi-ju. Postoji više načina za rad s bazama podataka od kojih ćemo napomenuti ADO i DAO način. Što se tiče samog sistema za upravljanje bazama podataka ovde ćemo se opredeliti za sistem koji koristi Microsoft Access. Takođe, ovde ćemo napomenuti da pre nego što krenemo da radimo s bazama podataka treba kreirati pseudonim za konkretnu bazu podataka a to možemo da učinimo preko određenih programa : BDE Administrator, Database Desktop i Database Explorer. Za rad s bazama podataka možemo koristiti veliki broj komponenti a sve ove komponente možemo da podelimo na : vizuelne, nevizuelne i komponente za povezivanjem s bazama podataka. U sistemu koji koristi Microsoft Access entiteti su prikazani kao tabele koje se fizički nalaze na disku. Ovim tabelama ćemo pristupati preko određenih komponenti. Da bi pristupili ovim podacima koristićemo tzv. Dataset koji u stvari predstavlja skup različitih slogova iz različitih tabela, što u stvari predstavlja logičku tabelu za razliku od ovih fizičkih tabela, ali ćemo u istom smislu koristiti pojmove Dataset i Tabela. Ove komponente pomoću kojih pristupamo Datasetu su nevizuelne komponente. Njihova namena je da pristupe podacima i nema potrebe da se vide tokom izvršavanja programa. Najbitnije komponente ovog tipa su Table i Query. Što se tiče vizuelnih komponenti one služe za prikazivanje i modifikovanje podataka iz baze, pa je naravno potrebno da se vide i da budu efektne i efikasne. Najpoznatije komponente ovog tipa su : DBGrid, DBEdit, DBText, DBImage i DBComboBox. Za povezivanje komponenti za pristup podacima i za prikazivanje podataka služe komponente za povezivanje. U tu svrhu ćemo koristiti komponentu koja se nalazi u jezičku DataAcess i koja se naziva DataSource. Njena uloga će biti za povezivanje neke od komponenti za pristup podacima – najčešće Table i komponente za prikaz podataka – najčešće DBGrid. Princip rada s bazama podataka je u tome da se postavi komponenta za pristup podataka – Table koja je obavezna da bi uopšte pristupili podacima iz baze, zatim se postavi određena komponenta za prikaz podataka – DBGrid s tim da se sa ovim komponentama vrlo lako radi jer su slične običnim komponentama ali su naravno okrenute radu s bazama podtaka a ove dve komponente su povezane DataSorce komponentom. Na taj način možemo kreirati aplikacije koje rade s bazama podataka.

 

 

7. PODEŠAVANJE KONTROLA I KREIRANJE EFIKASNIH APLIKACIJA

 

 

          Sada već možemo da kreiramo aplikacije koje su vizuelno privlačne i vrlo efikasne. U ovim aplikacijama smo koristili veliki broj komponenata koje se inače koriste u Windows okruženju. Takođe, kreirali smo aplikacije koje imaju svoju praktičnu upotrebu. Sve ove aplikacije koje smo kreirali imaju i veoma dobar vizuelni efekat. Međutim, nije problem napraviti program, već je problem napraviti program koji je efikasniji, pouzdaniji i bolji od sličnih programa za određenu namenu, pa je potrebno izvršiti dodatna podešavanja. U tu svrhu kada pravimo program pravićemo više verzija programa. Naravno, poželjno je testirati ove verzije programa koji pravimo. Najbolji način na koji možemo da usavršimo program je način da kada napravimo program provedemo jedno vreme koristeći program, jer ćemo na taj način videti kako se program ponaša, pa na osnovu toga ćemo moći da kreiramo novu verziju koja će sadržati nove funkcije za koje smo uvideli da bi bilo dobro da sadrži naš program, koja će ukloniti eventualne greške i koja će biti efikasnija u smislu povećanja brzine rada programa, smanjenja resursa koji su potrebni za naš program kao i poboljšavanje ugodnosti i lakoće rada sa našim programom. Što se tiče izgleda aplikacije to zavisi od onog ko pravi aplikaciju, međutim prilikom korišćenja određenih komponenti treba voditi računa da se komponente nalaze na pristojnom rastojanju jedna od druge, da se komponente koje rade sličnu radnju uokvire ili grupišu u određenu celinu, da se ne koriste ekstremne ili veome različite boje, kao i ostale naznake, što se najbolje postiže praćenjem načina na koji se razvijaju određena rešenja u Windows okruženju, mada se uvek može dobiti na originalnošću. Što se tiče smanjenja resursa i brzine rada naše aplikacije to je nešto na čemu se uvek može raditi i poboljšavati. Takođe, uvek treba voditi računa i o tome da se olakša rad korisniku koji će raditi s našom aplikacijom, pa treba uvek obraćati pažnju da se određena radnja može dobiti s što manje poteza i na što vidljiviji način, zatim da se dobro organizuju meniji, da se omogući rad s prečicama, da se omogući da se ista naredba može dobiti na više načina recimo preko ikonica i preko menija, da se obezbedi help u našoj aplikaciji, da se omogući što više informacija u raznim i običnim i dijalog prozorima itd. Što se tiče efikasnijeg rada i ispravljanje grešaka treba iskoristiti sve mogućnosti koje nudi objektno programiranje. Takođe, često je efikasnije iskoristiti već urađeno rešenje za određeni problem umesto programirati ispočetka. Naravno, uvek je poželjno i neko novo i originalno rešenje kao i rešenje koje koristi nove tehnologije. Prilikom finaliziranja programa treba obratiti pažnju i na to da program sadrži što više informacija vezana za onog ko razvija aplikaciju, da cena programa bude pristupačna kao i da se proizvod što bolje plasira na tržište i da zaživi u praksi.

          Ovde ćemo  spomenuti još neke od karakterističnih događaja koje ranije nismo spominjali : OnKeyDown – događaj koji nastaje kada se pritisne neki taster na tastaturi, OnKeyUp – događaj koji nastaje kada se otpusti neki taster na tastaturi, OnMouseDown – događaj koji nastaje kada se pritisne dugme na mišu, OnMouseUp – događaj koji nastaje kada se otpusti dugme na mišu, OnMouseMove – događaj koji nastaje kada se pomera miš iznad neke komponente, OnPaint – događaj koji nastaje kada se recimo prozor iscrtava, odnosno, popunjava određenom bojom, Menu – povezivanje sa određenim menijem, PopupMenu – povezivanje sa određenim kontekstnim menijem, OnActivate – događaj koji nastaje kada se aktivira određena komponenta, OnDeactivate – događaj koji nastaje kada se deaktivira određena komponenta, OnCreate – događaj koji nastaje prilikom kreiranja određene komponente, OnDestroy – događaj koji nastaje kada se oslobodi memorijski prostor koji je zauzimala komponenta i OnShow – događaj koji nastaje kada se u prvom planu prikazuje određena komponenta.

          Ukoliko bi smo želeli da naša aplikacija sadrži više prozora koji bi se prikazivali jedan za drugim u određenom trenutku to bi nakon kreiranja prozora koji su nam potrebni mogli da podešavamo u meniju Project/Options pod opcijom Forms.

          Ovde ćemo spomenuti još neke komponente koje ranije nismo spomenuli a vrlo su efikasne kao što su : Forms – u našoj aplikaciji možemo da imamo više prozora, Frames, ActionList, Splitter, StaticText, AplicationEvents, ColorBox, ActionManager, ActionMain MenuBar, ActionToolbar, TabControl, PageControl, ImageList, TreeView, ListView, StatusBar, Toolbar, ColorGrid, TrackBar i ProgressBar.

          Često ćemo u našim aplikacijama koristiti slučajne brojeve pa ćemo ovde reći nešto i o funkciji koja generiše slučajne brojeve.

 

 

          7.1 FUNKCIJA SLUČAJNIH BROJEVA

 

          U ovom delu ćemo objasniti funkciju Random koja generiše slučajne brojeve i ona je u obliku :

          Function Random (Opseg:Integer) : integer;

 

i ona daje kao rezultat slučajan broj tipa integer koji se nalazi u opsegu [0,Opseg). Ova funkcija ima i oblik kada se ne navodi argument i ona onda daje slušajan broj u intervalu [0,1). Ova funkcija daje slučajne brojeve koji se nazivaju i pseudo slučajni brojevi jer se ovi ‘slučajni’ brojevi generišu po unapred utvrđenom pravilu, pa ovu funkciju treba izbegavati u onim slučajevima kada su nam stvarno potrebni slučajni brojevi jer oni zavise od kompajlera, verzije i načina na koji se oni generišu. Ukoliko želimo da iniciramo generisanje slučajnih brojeva onda pre nego što počnemo da radimo sa slučajnim brojevima pozivamo proceduru Randomize koja je u obliku Procedure Randomize; i ona ‘vraća na početak’ generator slučajnih brojeva.

          Ako bi želeli da na klik dugmeta Button1 u Edit1 kontroli ispišemo slučajni broj u intervalu recimo od 0 do 50 onda bi u funkciju Button1Click pisali sledeći kod :

 

Procedure TForm1.Button1Click(Sender: TObject);

var i:integer;

begin

Randomize;

I:=Random(51);

Edit1.Text:=IntToStr(I);

end;

 

          Na ovakav način možemo dodatno podešavati aplikacije.


Sadržaj :

 

DELPHI. 1

1. OBJEKTNO PROGRAMIRANJE.. 1

1.1 KLASE.. 2

2. RAD S KONTROLAMA.. 6

2.1 FORMA (OBRAZAC) 6

2.2 KONTROLE.. 7

2.2.1 KOMPONENTA LABEL. 7

2.2.2 KOMPONENTA BUTTON.. 7

2.2.3 KOMPONENTA EDIT. 8

2.2.4 KOMPONENTA TIMER.. 9

2.2.5 KOMPONENTA LISTBOX.. 9

2.2.6 KOMPONENTA COMBOBOX.. 10

2.2.7 KOMPONENTA RADIOBUTTON.. 11

2.2.8 KOMPONENTA RADIOGROUP. 12

2.2.9 KOMPONENTA CHECKBOX.. 13

2.2.10 KOMPONENTA GROUPBOX.. 13

2.2.11 KOMPONENTA MEMO.. 14

2.2.12 KOMPONENTA MASKEDIT. 15

2.2.13 KOMPONENTA PANEL. 16

2.2.14. KOMPONENTA BEVEL. 16

2.2.15. KOMPONENTA SCROLLBAR.. 16

2.2.16. KOMPONENTA POPUPMENU.. 17

2.2.17. KOMPONENTA MAINMENU.. 17

2.2.18. KOMPONENTA LABELEDEDIT. 18

2.2.19. KOMPONENTA SPINEDIT. 18

2.2.20. KOMPONENTA RICHEDIT. 19

2.2.21. KOMPONENTA STRINGGRID.. 19

2.2.22. KOMPONENTA GAUGE. 20

2.3. PARAMETAR SENDER.. 22

2.4. PODEŠAVANJE KONTROLA.. 22

3. DIJALOG PROZORI. 23

3.1 DIJALOG PROZORI KAO KOMPONENTE.. 25

3.1.1 KOMPONENTA OPENDIALOG.. 25

3.1.2 KOMPONENTA SAVEDIALOG.. 25

3.1.3 KOMPONENTA FONTDIALOG.. 26

3.1.4 KOMPONENTA COLOR DIALOG.. 26

3.1.5 KOMPONENTA FINDDIALOG.. 26

3.1.6 KOMPONENTA REPLACEDIALOG.. 27

3.1.7 KOMPONENTA PRINTDIALOG.. 27

3.1.8 KOMPONENTA PRINTERSETUPDIALOG.. 27

3.1.9 KOMPONENTA OPENPICTURE DIALOG.. 27

3.1.10 KOMPONENTA SAVEPICTUREDIALOG.. 27

4. RAD S GRAFIKOM... 28

4.1 CRTANJE LINIJA.. 34

4.2 CRTANJE PRAVOUGAONIKA.. 35

4.3 CRTANJE KRUGOVA I ELIPSI. 36

4.4 CRTANJE OSTALIH OBLIKA.. 36

4.4.1 CRTANJE LUKA.. 36

4.4.2 CRTANJE PITE. 37

4.4.3 CRTANJE POLIGONA I IZLOMLJENIH LINIJA.. 37

4.5 ISPISIVANJE TEKSTA.. 38

4.6 CRTANJE PUTEM SHAPE KOMPONENTE.. 38

4.6.1 KOMPONENTA SHAPE. 39

4.7 KOMPONENTA IMAGE.. 39