Základní
informace o prostředí Borland DELPHI
Delphi je vývojový prostředek, který v sobě spojuje silnou sadu vizuálních nástrojů pro tvorbu jednotlivých částí aplikace s robustními programovými nástroji a výkonným kompilátorem. V prostředí Delphi vytváříme projekt a v něm jednoduchým způsobem objekty (formuláře, okna, tlačítka apod.), které budou reagovat na události (stisk klávesy, kliknutí nebo tažení myši apod). Na připojeném obrázku (viz následující strana) je prostředí vytvořené při spuštění Delphi. Vidíme zde menu, pod ním ikony spojené s často používanými operacemi (otevření souboru, přenos na disketu...). Následuje vícestránková paleta komponent (Standard, Additional..), s jejíž pomocí lze do formuláře dodávat komponenty (na obrázku je z úsporných důvodů lišta zkrácena). Dále by se mělo objevit okno Object Inspector. Pokud tomu tak není, otevřeme jej z menu View/Object Inspector. Konečně je to samotný formulář. Formulář je objekt, jehož vlastnosti lze prohlížet a také měnit v Object Inspectoru. V příkladu na připojeném obrázku je změněn titulek formuláře – vlastnost Caption (implicitně Form1) a dále rozměry. Ty lze měnit tažením okrajů pomocí myši, nebo zadat číselně (vlastnosti ClientHeight, –Width). Udělali jsme zatím velmi málo práce, zatím jsme nic neprogramovali, ale přesto máme plně funkční aplikaci. Spustíme-li nyní program (tlačítkem s modrou šipkou nebo z menu Run/Run, objeví se náš (zatím prázdný) formulář, se kterým můžeme zacházet jako s každým objektem v prostředí Windows (přesouvat, měnit velikost „taháním“ za okraje, minimalizovat, maximalizovat, zavřít). Všimněte si: Změnili jsme titulek formuláře, nezměnili jsme však jeho jméno pro program, která je nám zatím skryt. Jméno je stále Form1 a formulář (jako proměnná) je typu TForm1, jak si můžeme přečíst v záhlaví Object Inspektoru. Jméno proměnné můžeme změnit pomocí Name, není to však zatím nutné a nebudeme to dělat.
Čas,
po který na naší aplikaci pracujeme, lze rozdělit do dvou skupin. První je design time
(„vývojový čas“) – je to čas, kdy
naši aplikaci
vytváříme (dodáváme komponenty na formulář, měníme jejich
vlastnosti, vypisujeme procedury) a aplikace není spuštěna. Za druhé je to run time
(„čas běžící aplikace“), tj. čas, kdy aplikace je spuštěna a kdy testujeme její chování.
V této době není možné naši aplikaci rozumně modifikovat. Za běhu aplikace
není k dispozici object inspector, formuláři nelze dodávat ani odebírat
komponenty či modifikovat jejich vlastnosti (ledaže by tyto operace prováděla
sama běžící aplikace, což možné je). Pro potřeby ladění jsou za běhu programu k
dispozici zdrojové soubory a je možné do nich zasahovat. Tyto zásahy však nelze
doporučit – pak totiž zdrojový kód
jednak neodpovídá běžící aplikaci, což znemožňuje korektní práci debuggeru a za
druhé se takto provedené změny projeví stejně až po ukončení běhu programu a
nové kompilaci.
Naši
běžící aplikaci můžeme ukončit dvojím způsobem: jednak korektně – tj. spuštěním příslušné procedury, kterou jsme v aplikaci pro
ukončení naprogramovali, jednak resetem (položka menu Run/Program reset v
Ukončeme
tedy naši běh naší aplikace (naše jednoduchá aplikace se korektně ukončí
kliknutím na tlačítko, standardně uzavírající okno ve Windows) a vraťme se
do design time. Odsuňme formulář poněkud stranou. Pod ním objevíme editovací
okno, ve kterém je (zatím prázdná) knihovna s názvem Unit1.pas. Má část interface
(rozhraní), která umožňuje komunikaci s dalšími částmi programu. Jsou
zde odkazy na další knihovny (uses ….) a informativní deklarace
našeho (zatím prázdného) formuláře. Část implementation je také prázdná a je
určena pro definiční deklarace. Z menu View\Units lze také zobrazit hlavní program, který
má jméno Project1.dpr:
program Project1;
uses
Forms,
Unit1 in
'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Bez
podrobnějších znalostí však do něj není radno zasahovat.
Vývoj
programu sestává jednak z tvorby uživatelského rozhraní a jednak z prací
na jeho funkčnosti. Uživatelské rozhraní je prostředek, který umožňuje
vzájemnou komunikaci mezi programem a uživatelem. Uživatelská rozhraní mohou
mít různou formu a složitost, programy mohou fungovat nejrůznějším způsobem.
Každý program obecně však musí nějakým způsobem získat data, zpracovat je a
výsledek tohoto zpracování poskytnout uživateli. Vše si ukážeme na jednoduchém
příkladu řešení kvadratické rovnice.
Příklad 1: Sestavme program na řešení
kvadratické rovnice. Nejdříve navrhneme uživatelské rozhraní.
Sestavíme ho z objektů Edit, Label a Button
v liště Standard,
které umístíme na formulář. Výběr provedeme myší a „natažením“ na
formulář. Na obrázku (viz následující strana) vidíme dvě natažená editovací
okna (objekt Edit), do kterých bude uživatel zadávat koeficienty
kvadratické rovnice (na připojeném obrázku
chybí ještě třetí). Okna mají implicitní jména Edit1,
Edit2 atd. Zde je již první
přejmenováno pomocí vlastnosti Name v Object Inspectoru na EditA, další dvě
doporučujeme přejmenovat na EditB,
EditC. Text obsažený v těchto
oknech určuje vlastnost Text. Doporučujeme ji v object inspektoru změnit
tak, aby po spuštění programu byla programu zadána korektní úloha. Podobně je
na formulář natažen objekt Button. Jmenuje se Button1 (vlastnost Name) a
má nápis Button1
(Caption).
Nápis doporučujeme změnit tak, aby informoval uživatele o funkci tlačítka
(např. Výpočet).
Symbolický zápis kvadratické rovnice dodáme na formulář pomocí objektu Label
(chybějící exponent je třeba doplnit dalším objektem Label s vhodně změněnou
velikostí a umístěním). Všimněte si, že pro všechny objekty, které takto
dodáváme na formulář, jsou do zdrojového kódu automaticky dodávány jejich
informativní deklarace. V případě změny vlastnosti Name je ve zdrojovém textu změněna
jména promenných (viz změnu z Edit1
na EditA). Tyto změny provádí
Na dalším obrázku je pak kompletní rozhraní pro náš program. Editovací okna pro vstup mají jména EditA, EditB a EditC, pro reálný výstup EditX1, EditX1, pro komplexní výstup pak EditRe1, EditIm1, EditRe2, EditIm2. Všechny texty jsou dodány pomocí objektů Label. Mají pouze informativní charakter, v programu se na ně nebudeme odvolávat, proto jsme je nepřejmenovávali.
V object inspectoru jsme zatím měnili
pouze vlastnosti – Properties.
Jsou zde však i události – Events.
Klepneme-li na ně, můžeme zadávat akce, kterými má program (přesněji řečeno
jednotlivé objekty) reagovat na příslušné události. Tímto způsobem se postaráme
o funkčnost programu. Z obrázku je patrné, že objektu Button1 jsme zadali akci Reseni jako
reakci na událost OnClick
(tj. zřejmě zmáčknutí knoflíku). Pozor –
jméno Reseni chápe program jako identifikátor (v tomto případě jméno
procedury). Nelze tedy použít diakritiku, mezery apod. Protože tuto proceduru
náš projekt zatím nezná, reaguje
procedure
TForm1.Reseni(Sender: TObject);
{** deklarace proměnných **}
var a,b,c, {koeficienty kvadr.
rovnice}
d, {diskriminant}
X1,X2, {reálné řešení}
XRe,Xim: Double; {komplexní řešení}
Kod
Integer; {kód pro chybové
hlášení}
TextString:
String; {převodní řetězec}
{**** tělo procedury řešení ****}
begin
(* procedura Val(S:string;var
x:Double;var ErrorCode) převádí řetězec
na číselnou hodnotu. Proběhne-li převod bez chyby, je ErrorCode=0. Okno EditA
je objekt, jeho obsah - text je vlastnost, na kterou
se odvoláme přes
tečku *)
Val(EditA.Text,a,Kod);
{při chybném převodu ohlásí chybu a
ukončí proceduru}
if Kod>0 then
begin ShowMessage('Chybné a');exit;end;
Val(EditB.Text,b,Kod);
if Kod>0 then
begin ShowMessage('Chybné b');exit;end;
Val(EditC.Text,c,Kod);if Kod>0 then
begin ShowMessage('Chybné c');exit;end;
d:=b*b-4*a*c;
if d>=0 then {je-li
diskriminant nezáporný}
begin {složený příkaz pro výpočet reálných kořenů}
X1:=(-b+sqrt(d))/2/a; X2:=(-b-sqrt(d))/2/a;
{vypočítej reálné kořeny}
{procedura Str převede číselnou hodnotu na řetězec,
parametry u čísla specifikují počet cifer - celkem pět toho dvě
desetinné}
Str(X1:5:2,TextString);
EditX1.Text:=TextString;
{výpis
výsledku do příslušného okna}
Str(X2:5:2,TextString);
EditX2.Text:=TextString;
EditRe1.Text:='';EditIm1.Text:='';
{vymazání oken určených pro komplexní kořeny}
EditRe2.Text:='';EditIm2.Text:='';
end {konec
složeného příkazu pro nezáporný diskriminant}
else begin {složený příkaz pro
záporný diskriminant}
XRe:=-b/2/a;XIm:=
sqrt(-d)/2/a;
{výpočet
reálné a imagiární složky kořenů}
Str(XRe:5:2,TextString); {výpisy do příslušných oken}
EditRe1.Text:=TextString;
EditRe2.Text:=TextString;
Str(XIm:5:2,TextString);
EditIm1.Text:=TextString;
EditIm2.Text:=TextString;
EditX1.Text:='';EditX2.Text:='';
{vymazání
oken určených pro reálné kořeny}
end {konec složeného příkazu pro záporný
diskriminant}
end; {**** konec
procedury řešení ****}
Modifikace
příkladu: Editovací okna EditA, EditB, EditC
lze do formuláře umístit přímo místo koeficientů, proceduru Reseni
pak lze spojit nikoli s událostí onClick na Button1, ale např onChange na tato
editovací okna. Řešení se pak provede okamžitě při libovolné změně zadání a
objekt Button je pak zbytečný. To však nelze doporučit při složitějších
výpočtech, které vyžadují delší čas.
Zde najdete kompletní zdrojový kód a zde spustitelný kód