Počítačová grafika je pojem, který si většina z nás zařadí k některým produktům jako např. Paint Shop Pro apod. Málokdo z nás si je ale schopen představit, co vlastně obnáší vytvoření takové aplikace. Tento kurz se bude snažit podat základy této problematiky v návaznosti na matematickou teorii, která je v pozadí všech těchto produktů.
Tento článek se však ještě nezybývá přímo počítačovou grafikou, ale je určen pro objasnění a vyjasnění chápání některých základních pojmů a dále představuje základní úkony, které se budou v dalších dílech tohoto seriálu hojně využívat.
První, a přitom nultý díl seriálu o počítačové grafice v systému Delphi nás zavede hned na začátek jakéhokoliv programování v tomto systému. Vyjasníme si základní pojmy a ukážeme si základní, a přitom velmi důležité úkony, které je třeba zvládnout. Tento seriál není postaven jako učebnice programování v Delphi, k tomu slouží jiné, ale přeci jen považuji za nutné vyjasnit si chápání některých pojmů.
Počítačová grafika je v dnešní době často skloňovaným souslovím, ale kdo si z nás obyčejných smrtelníků dovede představit, co vše se za tím krásným skrývá?
Nulté cvičení je tedy zaměřeno na zvládnutí základních pojmů a orientace v objektově orientovaném programování. Následují základní informace o programování v Borland Delphi, které budeme v následujících cvičeních používat.
Cvičení je rozděleno na tři části:
- OOP – objektově orientované programování – základní pojmy
- prostředí Borland Delphi
- první program
Objektově orientované programování
Následující odstavec by měl přiblížit pojem objektově orientovaného programování. Tento druh programování by vydal na celý semestr, pokud bychom chtěli alespoň částečně postihnout tento druh programování. Zde půjde jen o jednoduchý nástin této problematiky, protože systém Delphi je založen na objektech.
Objektově orientované programování je dalším a nutným krokem přiblížení ke skutečnosti. V minulém semestru jste se zabývali strukturálním programováním v jazyce Pascal.
Přistupme nyní k objasnění pojmu objekt. Zjednodušeně by se dalo říci, že objekt je typ, který si již při svém vytvoření (deklaraci) nese s sebou dané vlastnosti (property) a metody, pomocí kterých můžeme s daným objektem pracovat.
Uveďme jednoduchý příklad. Chceme programově reprezentovat auto (z reálného života). V Pascalu byste pravděpodobně vytvořili pole, které by na různých pozicích reprezentovalo vlastnosti jednotlivých aut, např. SPZ, barva, výrobce… Určitě vidíte potenciální problémy.
Nyní ukažme výhody objektově orientovaného přístupu.
Řekněme, že vytvoříme objekt AUTO, který bude reprezentovat auto. Jak všichni víme, každému autu je jednoznačně přiřazena SPZ. Tu bychom mohli označit jako vlastnost. Objekt AUTO má však přirozeně další vlastnosti, např. barva, typ, výrobce, značka… S vytvořením objektu AUTO budou vždy vytvořeny i jeho vlastnosti (nebudou však inicializovány).
Téměř vše v Borland Delphi je objektem. K vlastnostem objektu přistupujeme pomocí tečky, např. určíme SPZ auta, které pojmenujeme m_auto.
m_auto : AUTO;
m_auto.SPZ := 'BOI 45-45';
Jsem si plně vědom všech Vašich výtek ohledně výše uvedeneho pojmu objektově orientované programování, ale pro naši práci to úplně stačí.
Prostředí Borland Delphi je určeno k programování v jazyce Pascal (jde o klon jazyka Pascal – objektově orientovaný).
Po spuštení aplikace (Borland Delphi 7) jsou zobrazena čtyři okna aplikace. Jde o hlavní okno, Object TreeView, Object Inspector, formulář a textový editor. Více viz obrázek.
Více o práci v tomto systému bude ukázáno u příkladů, které budou následovat.
Nyní přejdeme k našemu prvnímu programu, na kterém vysvětlíme základní práci.
První program v Delphi
Základní myšlenka programu
Vytvoříme dialogové okno, které bude obsahovat jeden popisek (TLabel), tři editační políčka (TEdit) a dvě tlačítka (TButton). Po stisknutí prvního tlačítka se změní barva pozadí popisky, po stisku druhého tlačítka budou sečtena čísla z prvních dvou editačních políček a výsledek bude vypsán do třetího.
Vlastní realizace programu v prostředí Delphi
Po spuštění programu Borland Delphi se načte prostředí (viz předchozí obrázek). Nyní umístíme na formulář požadované prvky a pojmenujeme je nějakým identifikátorem. Identifikátor je jedinečné jméno, pomocí kterého se k dané komponentě přistupuje. Jinými slovy, jde o proměnnou, která zastupuje daný ovládací prvek (možná lépe komponentu).
Z lišty Komponenty, karty Standard klikneme na položku TLabel a pak na formulář. Poté klikneme na TButton a vložíme ho také do formuláře (máme tam dát dva – ještě jednou zopakujeme). Editovací políčka vložíme analogiky, s využitím komponenty TEdit. Formulář vypadá jako na obrázku.
Všimněte si, že v ObjectTreeView se zobrazí názvy (identifikátory) jednotlivých prvků formuláře. Názvy jsou implicitní. Nyní je změníme. Vždy klikneme na danou komponentu a v ObjectInspectoru a kartě Properties najdeme položmu name, která zastupuje danou komponentu. Všechny vlastnosti dané komponenty jsou na této kartě k dispozici.
Názvy změníme následovně:
Label1 | —> | Popiska |
Edit1 | —> | Edit_x |
Edit2 | —> | Edit_y |
Edit3 | —> | Edit_soucet |
Button1 | —> | pozadi_btn |
Button2 | —> | Secti_cisla |
Dále změníme vlastnost Caption (užijeme ObjectInspector—> Properties) u objektů popiska a pozadi_btn dle obrázku.
Zprávy systému Windows
Nyní si ukážeme, jakým způsobem se v Delphi posílají zprávy jednotlivým komponentám. Systém Windows ja založen na zachytávání zpráv, které vytvářejí jednotlivé části okna programu. Nebudeme se podrobně zabývat touto problematickou, ale řekneme si, že pokud např. uživatel klikne na tlačítko, je vyvolána a následně zaslána zpráva OnClick, při změně např. OnChange apod.
Veškeré zprávy, které může daná komponenta poslat a následně zpracovat, jsou obsaženy v kartě Events ObjectInspectoru.
Klikneme na tlačítko pozadi_btn a v položce OnClick dvakrát klikneme. Otevře se nám okno se zdrojovým kódem a kurzor je umístěn do vytvořené procedury. Všimněte si, že název procedury je odvozen od názvu třídy zastupující dialog (TForm1), dále od názvu (identifikátoru) dané komponenty (pozadi_btn) a navíc je přidán příznak pro obsluhovanou zprávu (Click). Samozřejmě je možné pojmenovat proceduru jinak, ale tento kód se lépe čte. Ještě musíme upozornit, že daná procedura je procedurou třídy, která zastupuje dané dialogové okno (TForm1). Proto na začátku kódu bude přidána deklarace procedury (viz obrázek).
Nyní pomocí kódu změníme pozadí prvku popisek. Následující kód přidáme do těla výše zmíněné procedury.
popiska.Color := clWhite;
// clWhite - předdefinovaná barva - vždy začíná cl
Využijeme tzv. IntelliSense (viz obrázek), která zobrazí dostupné vlastnosti a metody daného objektu. Připomínáme, že k metodám a vlastnostem objektu přistupujeme přes tečku („.“).
Následující obrázek ukazuje špatné použití tečky u objektu (v tomto případě vlastnosti), který nemá další členění. Program hned vypíše chybu v dolní části okna.
Obrázek ukazuje pokus o další řetězení objektu popiska. Vlastnost Color jsme vyvolali pomocí tečky, ale další členění už není. Zmínili jsme se o tom proto, že v případě neznalosti struktury objektu můžeme pomocí řetězení (užití tečky jako odkazu) usuzovat na strukturu objektu.
Kompilace programu
Nyní program musíme přeložit, užívá se spíše termínu zkompilovat. Použijeme ikonu, která připomíná Play na přehrávači, popř. z menu Run.
Po přeložení zdrojového kódu do spustitelného programu (v případě, že neobsahuje kód chybu), je program spuštěn (viz obrázek).
Vyzkoušíme kliknout na tlačítko Zmen pozadi labelu, zda se změní pozadí.
Práce s editovacími políčky – TEdit
Nejprve upravíme editovací políčka. Ve vlastnosti Text každého EditBoxu smažeme řetězec, který se zobrazuje jako text (viz obrázek).
Nyní přistoupíme ke zpracování zprávy OnClick na tlačítku Secti_cisla. Tlačítko vybereme a v ObjectInspectoru na kartě Events najdeme zprávu OnClick a v příslušné položce dvakrát klikneme. V té chvíli Delphi vytvoří novou proceduru, která bude pojmenována pomocí identifikátoru objektu a zprávy, kterou obsluhujeme – Secti_cislaClick (viz obrázek).
Nyní přejděme ke zdrojovému kódu. Nejprve připomeňme, co vše musíme udělat:
- Získat text z prvních dvou EditBoxů
- Převést text na číslo, abychom pak mohli provést součet těchto čísel
- Sečíst čísla a převést je na text, pro vypsání v třetím EditBoxu
- Vypsat text do třetího edit boxu
Pro získání textu z EditBoxu využijeme jeho vlastnosti Text. Dále je nutné převést tento text na číslo. K tomu je určena funkce Val(text,cislo,chyba). Význam jednotlivých proměnných vyplyne z celkového zdrojového kódu. Jen se krátce zastavme u třetího parametru, kvůli kterému vlastně chceme použít tuto funkci, a ne jinou, např. StrToInt. Třetí parametr (chyba) vrací nulovou hodnotu, pokud konverze proběhla bez chyby. V opačném případě vrací pozici, na které se chyba vyskytla a kde se provádění převodu zastavilo. Pro získání řetězce z čísla slouží funkce STR(cislo,text).
Následuje zdrojový kód dané procedury, který je okomentován.
{*******************************************************}
// procedura ziska z editovacich policek cila, secte je
// a vypise do tretiho editovaciho boxu }
procedure TForm1.Secti_cislaClick(Sender: TObject);
var chyba:integer; // lokalni promenne - deklarace
x,y:real;
s:string;
begin
// pomoci VAL prevedu retezec z editboxu na cislo
VAL(Edit_x.Text,x,chyba);
// treti parametr obsahuje cislo pripadne chyby
VAL(Edit_y.Text,y,chyba);
// pomoci STR prevadim cislo na retezec
STR(x+y:10:5,s);
// 10 - pocet mist, 5 - pocet desetinnych - z pascalu
// do tretiho Editboxu vypise retezec
Edit_soucet.text := s;
end;
Nyní už můžeme program přeložit a vyzkoušet.
Úkol
Vytvořte obdobný program, který bude měnit pozadí jednotlivých komponent daného formuláře a např. ještě nápisy na nich.