× Aktuálně z oboru

Programátoři po celém světě dnes slaví Den programátorů [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]
Celá zprávička [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]

Delphi II - 3. lekce

[ http://programujte.com/profil/1345-dan-vratil/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/20356-josef-vitu/ ]Google [ ?rel=author ]       6. 12. 2006       39 419×

V dnešním díle se podíváme na procedury a funkce a nakonec si uděláme i nějaký ten prográmek…

Dnes se podíváme na hlavní část programů (nejen) v Delphi – na proceduryfunkce a nakonec využijeme dosavadních poznatků a vytvoříme jednoduchý program.


Procedury

Každá aplikace se skláda z procedurfunkcí. V této kapitole se budeme věnovat procedurám. Procedura je ohraničený úsek kódu. Pokud chceme proceduru spustit, provedeme tzv. zavolání procedury.


procedure TForm1.Button1Click(Sender: TObject);
begin
 ...
 ...
end;

Takto vypadá procedura Button1Click. Tato procedura je potomkem třídy TForm1. Samotný kód procedury se poté píše mezi tzv. klíčová slova beginend.

A takto je procedura deklarována:


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  ...

Když vytvoříte proceduru události u některé z komponent, procedura se sama nadeklaruje a vytvoří se její základní kostra.


Funkce

Funkce je jakási obdoba procedury, jenom s tím rozdílem, že má tzv. návratovou hodnotu – tzn. že vy ji zavoláte, ona provede nějakou operaci a vrátí určitou hodnotu (výsledek oné operace). K tomuto výsledku se poté přistupuje přes název funkce.

Pro ujasnění zde uvádím ukázku:


procedure TForm1.Button1Click(Sender: TObject);
var c:integer;
begin
  ...
  c:=secti(1,2); //volám fci SECTI s parametry 1 a 2...výsledek funkce se poté
                 //přiřadí do proměnné c
  ...
end;

function TForm1.secti(a: integer; b: integer): integer; //vlastní funkce, kterou jsme si sami vytvořili a nadeklarovali
var vysledek: integer;
begin
  vysledek:=a+b; //tohle asi ani komentář nepotřebuje
  result:=vysledek;
end;

Ve funkci jste si určitě všimli proměnné result, kterou jsme nikde předem nedeklarovali. Tato proměnná je deklarávána automaticky v každé funkci a přiřazuje se do ní ona výsledná hodnota, kterou má funkce vrátit.

Funkci secti mám samozřejmě definovanou o pár řádek výše:


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    function secti(a:integer; b: integer): integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Zde se ještě na chvilku vrátím k procedurám. Aby vše bylo úplně jasné, uvádím ještě, že jako můžeme definovat vlastní funkce, lze stejně definovat i vlastní procedury. Zároveň také mohou obsahovat vlastní parametry:


procedure TForm1.vlastniprocedure(cislo: integer; slovo: string; pravda: boolean);
...

Konec, zpět k funkcím…

Určitě jste si všimli oné zvláštní věci, že funkce má za výčtem parametrů ještě typ proměnné. Ten určuje, jakého typu bude návratová hodnota – tedy hodnota, kterou fce vrátí. V našem případě bude funkce vracet celočíselné hodnoty.


Přetížené procedury

Přetížené procedury je něco, co se v Delphi objevilo až od 4. verze. Pokud tedy máte verzi 3 a nižší, můžete tuto část v klidu přeskočit.

Princip přetížených procedur je celkem jednoduchý: Potřebujete jednoduchou proceduru, která bude měnit popisku tlačítka. OK, v tom by nebyl problém, ale co když předem nevíte, jekého typu bude ta hodnota, která se má zobrazit na tlačítku – integer, string, real, …? Přetížené procedury to zvládnou: jednoduše nadefinujete tu jednu proceduru třeba třikrát, jednou u ní nastavíte parametr typu integer, podruhé typu string a potřetí typu real:


procedure zmenpopisku(text: string); overload;
begin
 Button1.Caption:=text;
end;

procedure zmenpopisku(celecislo: integer); overload;
begin
 Button1.Caption:=IntToStr(celecislo);
end;

procedure zmenpopisku(desetinnecislo: integer); overload;
begin
 Button1.Caption:=FloatToStr(desetinnecislo);
end;

No a takto budeme postupně procedury volat:


...
zmenpopisku('Nová popiska');
zmenpopisku(15);
zmenpopisku(3.3658);
...

Tyto procedury se nemusí deklarovat, protože není definován jejich vlastník (není tam to TForm1 před názvem procedury) a lze je libovolně volat odkudkoliv z programu. Další věcí, které jste si asi všimli, je klíčové slovíčko overload uvedené za názvem procedury. To informuje Delphi, že se jedná o přetíženou proceduru.


Program

A je to tady – vrchol našeho dílu, na který jste se již všichni určitě těšili ;) Náš program totiž bude fungovat jako VELMI jednoduchá kalkulačka. Využijeme zde lokálně i globálně deklarované proměnné, procedury, funkce, přetížené procedury a další věci… Jdeme na to.

Na formulář umístěte komponenty podobně jako na obrázku:

TEditTButton najdete na paletě Standart. Události OnClick vytvoříte buď dvojklikem na komponentu, nebo když v Object Inspectoru v záložce Events poklepete na to bílé pole na řádku OnClick.

A teď už k programování:

Nejprve globálně deklarujte proměnnou predchozi typu real (pokud nevíte jak na to, tak se podívejte do předchozího dílu). Následně 2× nadefinujte přetíženou proceduru s názvem zobrazokno:


procedure zobrazokno(zprava:string); overload;
begin
  ShowMessage(zprava); //zobrazí v dialogu zprávu
end;

procedure zobrazokno(vysledek: real); overload;
begin
  ShowMessage('Minulý výsledek: '+FloatToStr(predchozi)+#13+'Výsledek: '+FloatToStr(vysledek)); //zobrazí v dialogu předchozí a aktuální výsledek
end;

Znak #13 je v sadě znaků ASCII reprezentuje klávesu ENTER a s ní související zalomení textu na další řádek.

Takto bude vypadat procedura OnButton1Click:


procedure TForm1.Button1Click(Sender: TObject);
var vysledek: real;
begin
  if Edit2.Text='+' then //podle znaménka v poli Edit2 provedeme příslušnou operaci
    vysledek:=StrToFloat(Edit1.Text)+StrToFloat(Edit3.Text)
    else if Edit2.Text='-' then
      vysledek:=StrToFloat(Edit1.Text)-StrToFloat(Edit3.Text)
      else if Edit2.Text='*' then
        vysledek:=StrToFloat(Edit1.Text)*StrToFloat(Edit3.Text)
        else if Edit2.Text='/' then
          vysledek:=StrToFloat(Edit1.Text)/StrToFloat(Edit3.Text)
          else zobrazokno('Špatné znamínko!'); //pokud bylo zadáno jiné znaménko, zobrazí se přes proceduru zobrazokno chybová hláška
  zobrazokno(vysledek); //přes proceduru zobrazokno se vypíše výsledek
  predchozi:=vysledek; //a aktualizuje proměnná predchozi
end;

Tato procedura by se dala řešit i elegantněji, než přes if else if else, ale to zatím neumíme, takže si vystačíme s tímto provedením. Funkce StrToFloat slouží k přetypování proměnné z typu string na reálný typ (v našem případě na typ real, protože proměnná výsledek je právě typu real).

Nakonec ještě vytvořte událost tlačítka Button2 (tlačítko vynulování):


procedure TForm1.Button2Click(Sender: TObject);
begin
  Edit1.Text:=''; //vynulujeme jednotlivá pole
  Edit2.Text:='';
  Edit3.Text:='';
end;

Tím je náš program hotový. A také končí i dnešní lekce. Ale ještě tu pro vás nakonec něco mám:

Úkol

  1. Jako vždy – naučte se, co jsou to procedury a funkce a jaký je mezi nimi rozdíl.
  2. Dobrovolný úkol: naučte se používat přetížené funkce a procedury (opravdu myslím, že není nutné je úplně znát, že je stejně moc často nevyužijete…)
  3. Vytvořte program, který po stisku tlačítka zavolá funkci, která provede operaci a:=i+1 (i nadefinujte jako konstantu o libovolné výchozí hodnotě). Výsledek této operace (tedy proměnná a) bude návratovou hodnotou funkce. Pomocí jiné procedury pak nastavte popisek tlačítka na onu hodnotu a. Je to jistá obdoba toho, co bylo úkolem minule, takže z toho můžete vycházet.

Na závěr

Pro dnešek je to tedy úplně vše. V příštím díle se podíváme na tzv. řídící struktury a řekneme si něco o základech OOP.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006110701-delphi-ii-3-lekce/ ].