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í naprogra­movali, jednak resetem (položka menu Run/Program reset v Delphi). Tímto způsobem lze aplikaci ukončit kdykoli např. pokud se vinou chyby v programu dostala do nekonečného cyklu a není možné ji ukončit korektně.

 

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í Delphi automaticky a neznalému uživateli nedoporučujeme do těchto změn zasahovat.

 

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 Delphi tím, že ji založí. V této chvíli Delphi požaduje kód procedury Reseni. Tato procedura může mít, jak již bylo řečeno, obecně stejnou strukturu, jako celý Pascalovský program a může vypadat třeba takto:

 

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 odvome 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