Trochu teórie
Prečo ideme programovať v Delphi?
- Delphi je vizuálne programové prostredie, ktoré slúži na vývoj aplikácií pre OS Windows (podobne ako Visual Basic, C++Builder a pod.) - takéto prostredia zjednodušujú programovanie Windows aplikácií - vzhľad aplikácie pod Windows môžeme zostavovať z ponuky komponentov, pričom samotné vývojové prostredie (napr. Delphi) pomáha pri začleňovaní zodpovedajúceho kódu
- takéto moderné programovacie jazyky umožňujú začať programovať objektovým prístupom – je to metodológia, bez ktorej sa v súčasnosti nezaobídeme pri práci v tíme, pri práci s veľkými projektmi, pri tvorbe Windows aplikácií
- v Delphi sa programuje moderným programovacím jazykom objektovým pascalom - tento vychádza z Turbo Pascalu, ale pritom si treba uvedomiť, že
Pascal sa v informatickej komunite považuje za "esperanto" programovacích jazykov
-
je ideálny jazyk ako úvodný pri vyučovaní programovania - môžeme sa v ňom naučiť veľmi efektívne programovať modernými metódami,
kto ovláda Pascal, ľahko neskôr prejde na iné procedurálne programovacie jazyky
Čo znamená objektovo - orientovaný jazyk?
V doterajších príkladoch sme zadefinovali a používali buď jednoduché premenné (integer, real, char, ...), štruktúrované premenné (array, set, record, ...). V predchádzajúcom príklade sme však pouťili premenné typu grafická plocha TImage, typu tlačidlo TButton atď. Tieto premenné sa líšia od "obyčajných" premenných tým, že
-
pamätajú si svoj momentálny stav v svojich tzv. stavových premenných (napr. pozícia, farba, tvar, ...)
-
majú svoje súkromné príkazy, pomocou ktorých ich nejako riadime, resp. meníme ich stavové premenné - takýmto príkazom (sú to procedúry) hovoríme metódy
-
musia byť vytvorené (nie deklarované) špeciálnym spôsobom - konštruktorom ( Create(...); ) a kým sa takto nevytvoria, nesmú sa vôbec používať
-
takýmto premenným hovoríme OBJEKT - object a typom, z ktorých vytvárame objekty (napr. TCanvas) hovoríme TRIEDA - class, niekedy sa objektu hovorí aj inštancia triedy
-
stretli sme sa už s objektmi ako sú napr. Form1, Image1, Button1 aj premenná g, ktoré sú inštanciou triedy TCanvas
-
zatiaľ si o objektoch treba zapamätať, že sú to premenné, ktoré môžu v sebe obsahovať veľa stavových premenných a tiež "v sebe" obsahujú nejaké svoje procedúry (metódy) => tomuto hovoríme zapuzdrenie - enkapsulácia, lebo v jednom "puzdre" sú aj údaje (stavové premenné) aj algoritmy (metódy), ktoré vedia s týmito údajmi pracovať
- okrem zapuzdrenia medzi ďalšie vlastnosti objektov patrí dedičnosť - inheritance
- od definovaného objektu môžeme odvodiť celú hierarchiu objektov t.j. potomkov, ktoré dedia prístup k dátovým aj programovým zložkám a polymorfizmus - zdielanie akcií v hierarchii objektov.
Zopakujme si, čo vieme z "Pascalu"!
Logické hodnoty, logické výrazy
- každý výraz sa vyhodnocuje zľava doprava
- vždy je buď pravdivý alebo nepravdivý, má jednu z dvoch logických hodnôt true alebo false
- logickú hodnotu vrátia napr. relácie: <, <=, =, <>, >=, >
- logické operátory: not, or, and, xor
- priorita operátorov:
not
*, /, div, mod, and
+, –, or, xor
=, <>, <, >, <=, >=, in
unárne
multiplikatívne
aditívne
relačné
|
|
FOR - cyklus = cyklus a určitým počtom opakovaní
for riadiaca_premenná:=výraz1 to výraz2 do príkaz
Pre riadiacu premennú (premennú cyklu for) platí:
- priradí sa jej hodnota akú nadobúda výraz1
- výraz2 sa vyhodnotí na začiatku cyklu
- ak je jeho hodnota menšia ako hodnota výraz1, cyklus sa nevykoná
- ak je výraz1=výraz2, cyklus prebehne práve raz
- inak riadiaca_premenná prechádza rozsahom hodnôt medzi výraz1 a výraz2
- musí byť ordinálneho typu (zatiaľ poznáme len celočíselný ordinálny typ - integer)
- jej hodnotu programátor v priebehu cyklu nesmie meniť, t.j. nesmie byť na ľavej strane žiadneho priraďovacieho príkazu počas prechodu for-cyklu
- po skončení cyklu má nedefinovanú hodnotu
Poznámka: Po skončení cyklu riadiaca premenná nemá hodnotu, ktorú nadobúda výraz2+1 ani žiadnu inú, jej podobnú.
|
|
While - cyklus = cyklus s podmienkou na začiatku
Táto programová konštrukcia slúži na opakovanie príkazov, kým je splnená nejaká podmienka
Všeobecný tvar príkazu je:
while podmienka do príkaz
- otestuje sa podmienka a ak je pravdivá (true), tak sa vykoná príkaz (t.j. telo cyklu) a celé sa to opakuje
- ak bude podmienka nepravdivá (false), tak sa telo cyklu už nevykoná a pokračuje sa na príkaze za cyklom
- ak podmienka bude mať stále hodnotu true, tak vznikne nekonečný cyklus
- ak nekonečný cyklus (alebo veľmi dlho trvajúci cyklus) neobsahuje špeciálnu vsuvku pre Windows, tak počas cyklu sa systém nedostane ku slovu a tým sa napr. normálne nedá zhodiť bežiaci program
- jedným z riešení je raz začas použiť volanie Application.ProcessMessages;, ktoré pustí Windows na chvíľu ku slovu a tým dovolí používateľovi ukončiť aplikáciu alebo zatlačiť tlačidlo a pod. - toto volanie ale trochu spomalí priebeh výpočtu
|
|
Repeat - cyklus = cyklus s podmienkou na konci
Táto programová konštrukcia slúži na opakovanie príkazov, až kým nie je splnená nejaká podmienka
Všeobecný tvar príkazu je:
repeat
príkaz 1
príkaz 2
...
príkaz k
until podmienka
- tento cyklus opakovane vykonáva telo cyklu (príkazy medzi slovami repeat a until) a po každom takomto vykonaní týchto príkazov, otestuje podmienku cyklu (logický výraz za slovom until)
- keď je podmienka splnená (hodnota je true), cyklus končí a pokračuje sa príkazmi za cyklom
- keď je podmienka nepravdivá (hodnota je false), cyklus pokračuje - hovoríme tomu podmienka ukončenia cyklu
- tento cyklus sa správa "opačne" ako cyklus while
- telo cyklu sa vykoná vždy aspoň raz, aj keď je podmienka hneď na začiatku splnená
|
|
If a Case
if podmienka then príkaz 1 else príkaz 2
- ak je podmienka splnená, vykoná sa vnorený príkaz 1, ak je hodnota podmienky nepravda, tak sa vykoná vnorený príkaz 2. Neúplný príkaz nemá časť "else".
case výraz of
konštanta1: príkaz1;
konštanta2: príkaz2;
...
else príkazy
end;
pričom vetva else (podobne ako pri if) môže chýbať,
výraz aj konštanty môžu byť len celočíselného typu
|
|
Procedúry - podprogramy
procedure meno;
... // lokálne deklarácie pre procedúru
begin
... // telo procedúry
end;
- pri volaní podprogramu mu môžeme poslať nejaké hodnoty, aby sme nemuseli rôzne špeciality nastavovať v globálnych premenných, v podprograme zadefinujeme špeciálne lokálne premenné, tzv. formálne parametre, do ktorých sa pred samotným volaním priradia (inicializujú) hodnoty skutočných parametrov.
|
|
Štandardné jednoduché typy INTEGER, REAL, BOOLEAN, CHAR
Integer
- hodnoty sú z intervalu -2147483648 .. 2147483647
- zaberá 4 bajty = 32 bitov, 1bit znamienko
- definované sú aritmetické operácie +, -, *, div, mod, obidva operandy sú celé čísla
- relačné operácie <, <=, ..., funkcie pred a succ, príkazy inc a dec
- štandardné funkcie, napr. sqr, abs
- šestnástkové konštanty - $, napr. $1e=30
Real
- čísla vyjadrené desatinným zápisom aj s exponentom
- obsahuje des. bodku, exponent približne ±300
- real ± (5.0 x 10^–324 .. 1.7 x 10^308 ) 15-16 číslic 8 bajtov
- ukážky reálnych čísel 1.23, -3.23989E+02, 9.89E-01
- pre každé číslo nevieme určiť nasledovné reálne číslo,
t.j. medzi 0 a 0.0001 možno existuje číslo, nemá zmysel nasledovník,
t.j. nefunguje pred ani succ, inc, dec
- operácie - +, -, *, /
- automatická konverzia - keď sa pri reálnej operácii vyskytne celočíslený operand konvertuje sa na reálne číslo, napr. 1+1.5, 1/3 = 1.0/3.0
- reálne operácie veľmi často majú chyby spôsobené realizáciou v počítači
- štandardné funkcie, napr. sqrt, sqr, sin, cos, abs
Boolean
- konštanty - predefinované identifikátory konštanty true, false (ako predtým definované naše konštanty), v pamäti zaberá 1 bajt
- operácie and, or, not, xor
- FALSE
- štandardné funkcie: ord, boolean( 0 alebo 1), napr. boolean(0)=FALSE,
pred, succ
Char
- ordinálny typ, ktorý obsahuje sadu 256 znakov (tzv. ASCII), tieto sú usporiadané
vnútorne sú reprezentované číselným kódom 0..255, t.j. zaberajú 1 bajt (8 bitov)
- znakové konštanty v apostrofoch alebo #kód
- treba si pamätať:
' '<...<'0'<'1'<...<'9'<...<'A'<'B'<...<'Z'<...<'a'<'b'<...<'z'
- znakové funkcie: pred, succ, ord, chr (char)
- treba si pamätať:
ord(' ')=32; ord('0')=48; ord('1')=49; ...
alebo #32=' '; #48='0'; #49='1'; ...
ord('A')=65; ord('a')=ord('A')+32=97; ...
t.j. #65='A'; #97='a'; ...
- ak c obsahuje znak cifry ('0'..'9'), tak ord(c)-ord('0')=cifra (podobne pre písmená)
- príkazy inc, dec fungujú aj pre znaky (napr. c:='A'; inc(c,32); )
|
|
Práca s farbami
Už sme sa zoznámili s niekoľkými situáciami, keď sme zadávali nejakú farbu (farba pera, farba výplne, farba pera) - doteraz sme používali preddefinované konštanty, napr. clBlack, clRed, clBlue a pod.
Vo Windows sa farba určuje trojicou čísel, ktoré vyjadrujú v akom množstve treba "namiešať" tri základné farby - červenú, zelenú a modrú, aby vznikla žiadaná farba - množstvá týchto zložiek sa zadávajú celým číslom od 0 do 255 ,
napr. ak namiešame 0 červenej, 0 zelenej a 255 modrej, vznikne jasná modrá farba;
0 červenej, 0 zelenej a 0 modrej je čierna; všetky zložky po 255 znamená bielu;
255 červenej, 255 zelenej a 0 modrej vyrobí žltú a pod.
Vo Windows sa tieto zložky nazývajú Red Green Blue a v Delphi môžeme farby definovať aj pomocou funkcie RGB, ktorá dostáva 3 čísla popisujúce zastúpenie zložiek.
Mená niektorých preddefinovaných farieb:
clBlack
clMaroon
clGreen
clOlive
clNavy
clPurple
clTeal
clGray
clSilver
clRed
clLime
clYellow
clBlue
clFuchsia
clAqua
clLtGray
clDkGray
clWhite |
RGB(0,0,0)
RGB(128,0,0)
RGB(0,128,0)
RGB(128,128,0)
RGB(0,0,128)
RGB(128,0,128)
RGB(0,128,128)
RGB(128,128,128)
RGB(192,192,192)
RGB(255,0,0)
RGB(0,255,0)
RGB(255,255,0)
RGB(0,0,255)
RGB(255,0,255)
RGB(0,255,255)
RGB(192,192,192)
RGB(128,128,128)
RGB(255,255,255)
|
|