Naučte se programovat v Delphi (8. díl) - Typy, záznamy a pole - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



Delphi

Naučte se programovat v Delphi (8. díl) - Typy, záznamy a pole

4. října 2001, 00.00 | V dnešním díle seriálu si  povíme něco o programátorem definovaných typech, záznamech a nakonec si vysvětlíme datový typ pole (Array).

Typy

    V Object Pascalu máme primitivní datové typy, které jsem popsal v pátém díle tohoto serálu, ale ty nám brzy přestanou stačit. Například když budeme chtít pracovat se dny v týdnu, tak si jednoduše vytvoříme datový typ TDnyVTydnu, který bude obsahovat dny pondělí, úterý, středa.... To vám asi nic neříká, alespoň ne začátečníkům, pro které je tento seriál určen. Tak si to raději vysvětlíme prakticky.

    První typy, které si dnes představíme budou ordinální nebo též výčtové typy. Ordinální znamená po sobě jdoucí. Např. 1, 2, 3, 4, 5... nebo leden, únor, březen atd. K vytvoření vlastního typu se používá klíčové slovo type. Formální deklarace vypadá takto.

Type Jméno_typu = Definice;

    Jako příklad pro použití si vytvoříme typ TDnyVTydnu. Jistě jste si všimli, že při vytváření nových typů se dává před identifikátor písmeno T. Je to všeobecný zvyk programátorů v Object Pascalu. Odlišuje se tím jméno typu od jména instance. Náš typ TDnyVTydnu bude obsahovat sedm dní v týdnu: pondeli, utery, streda, ctvrtek, patek, sobota, nedele.

Type TDnyVTydnu = (pondeli, utery, streda, ctvrtek, patek, sobota, nedele);

    Pak už jen stačí deklarovat si proměnnou daného typu a už s ní můžete pracovat.

...
var DnyVTydnu:TDnyVTydnu;
begin
  DenVTydnu:=Pondeli;
end;
...

    Výčtové typy můžeme také porovnávat. Podobně jako celočíselné datové typy.

...
var DenVTydnu:TDnyVTydnu;
begin
  DenVTydnu:=Pondeli;
  if (DnyVTydnu = pondeli) then ShowMessage('Pondeli');
end;
...

    Při práci s ordinálními typy se nejčastěji používají tyto funkce:

  • pred() - vrací předchůdce argumentu
  • succ() - vrací následníka argumentu
  • ord() - převede ordinální typ na odpovídající číslo

    Pro demonstraci těchto fcí uvedu krátkou ukázku, prográmku který je bude využívat.

Procedure Test;
var DenVTydnu:TDnyVTydnu;
      i:Integer;
begin
  DenVTydnu:=Streda;    // natavení počáteční hodnoty na streda
  DenVTydnu:=pred(DenVTydnu);    // hodnota proměnné DenVTydnu je utery
  DenVTydnu:=succ(DenVTydnu);    // hodnota proměnné DenVTydnu je opět streda
  i:=ord(DenVTydnu);    // vrací číselnou hodnotu argumentu, v tomto případě číslo 3
end;

    Kromě výčtových typů existují ještě intervalové typy. Deklarují se zadáním nejnižší a nejvyšší hodnoty. Formální deklarace vypadá takto:

Type Jméno_typu = Minimální_hodnota .. Maximální_Hodnota;

    Tento typ se používa ve spojení s ordinálními typy. Např. můžeme zadat interval čísel nebo znaků.

Type Cisla = '0' .. '5';
          Znaky = 'a' ..'k';

    Posledním typem jsou takzvané množiny. Množiny se deklarují klíčovými slovy Set Of. Množina může obsahovat prvky ordinálního typu. Příklady deklarací jsou v následující tabulce.

Type TDnyVTydnu = (pondeli, utery, streda, ctvrtek, patek, sobota, nedele);
         DnyVTydnu = Set Of TDnyVTydnu;
         Cisla = Set Of 1..5;
         Znaky = Set Of Char;

    Potom deklarujeme proměnné tohoto typu a přiřadíme jim hodnoty.

...
var SudaCisla, LichaCisla:Cisla;
begin
  SudaCisla := [2, 4];
  LichaCisla := [1, 3, 5];
end;
...

Při práci s množinami se používají množinové operátory. Typyckým příkladem je operátor in.

if pondeli in DnyVTydnu then ShowMessage('Množina DnyVTydnu obsahuje položku pondeli.');

Záznamy

    Často nastane situace, kdy budete programovat aplikaci, která bude uchovávat informace např. o zákazníkovi, pracovníkovi apod. K tomu budete potřebovat záznamy (records). Formální deklarace vypadá takto:

Identifikátor : record
  Proměnná : Typ_proměnnél;
  // další proměnné
end;

    Zpět k našemu příkladu. Jako demonstraci použití záznamu si vytvoříme jednoduchý záznam, který bude obsahovat informace třeba informace o zákazníkovi.

var  Zakaznik : record
  Jmeno : String;
  Prijmeni : String;
  email : String;
end;

    Při práci se záznami se používá operátor tečka. Oddělují se jím jednotlivé proměnné obsažené v záznamu.

...
  Zakaznik.Jmeno:=('Josef');
  Zakaznik.Prijmeni:=('Novak');
  Zakaznik.email:=('');
...

    Nejšpíš si řeknete, že to asi není úplně ideální způsob zápisu. A nebo přinejmenším zdlouhavý. Proto existuje v Object Pascalu příkaz with. Používá se k přiřazování hodnot jednotlivým dílčím proměnným záznamu.

...
with Zakaznik do
begin
    Jmeno:=('Josef');
    Prijmeni:=('Novak');
    email:=('');
end;
...

    Často nastane situace, kdy spravujeme jeden záznam ve více procedurách. Pak je lepší deklarovat záznam jako typ a pak už jen vytvářet jeho instance.

Type = TZakaznik = record
  Jmeno:String;
  Prijmeni:String;
  email:String;
end;

    Pak už jen stačí vytvořit si instanci daného typu a můžete s ní pracovat jako s předchozím typem záznamů.

...
var Zakaznik : TZakaznik;
begin
  // příkazy
end;
...

Pole

    Pole (Array) je vlastně soubor proměnných. Používají se tehdy, když pracujete s více proměnnými stejného typu. Pole se deklaruje klíčovým slovem array. Formální deklarace vypadá takto: 

var Jméno_pole : Array [od..do] of Typ;

    V hranatých závorkách zadáváme rozsah pole. První hodnota je nejnižší a druhá nejvyšší. Existují jedno i více rozměrná pole, ale zatím si představíme ta jednorozměrná. Deklarace v praxi vypadá takto:

var Zakaznici : Array [1..10] of TZakaznik;

    Takto jsme si definovali deset zákazníků. Zatím jsou jejich záznamy prázdné. Hned to napravíme. Pro demonstraci postačí naplnění jednoho záznamu.

... 
  Zakaznici[1]:Jmeno=('Josef');
  Zakaznici[1].Prijmeni:=('Novak');
  Zakaznici[1].email:=('');
...

    Samozřejmě i zde můžeme použít příkaz with. Při přístupu k jednotlivým prvkům pole se používají hranaté závorky, mezi které se vkládá pořadové číslo prvku.

    Někdy se stane, že při deklaraci pole nevíme, jakou bude mít velikost. Poli, které nemá při deklaraci stanovenou velikost se říká dynamické pole. Později ale musíme přesnou velikost uvést fcí SetLenght().

...
var Zakaznici: Array of TZakaznik;
begin
  SetLenght(Zakaznici, 10);
end;
...

    Při práci s tabulkami, nebo jakýmikoliv souřadnicovými systémy, narazíte na dvourozměrné pole. Dvourozměrné pole se deklaruje podobně jako jednorozměrné ale s tím rozdílem, že nedeklaujeme dva  argumenty ale čtyři.

var Body : Array [1..20, 1..20] of Integer;

    První dva argumenty udávají rozsah pole na osu x a druhé dva rozsah na osu y. V Object Pascalu můžeme používat dvou, tří i vícerozměrná pole. Deklarují se vždy stejně, ale s tím rozdílem, že zadáváte více rozsahů.

    Jistě si vzpomínáte na netypizované konstanty. Netypizovaná konstanta typu pole se deklaruje za klíčovým slovem const a může mít následující tvar.

const Body : Array [1..4] of Integer = (2, 3, 4, 5) ;

    I vícerozměrná pole mohou být použita jako netypizované konstanty.

Příště

    Náplní příštího dílu budou Objekty.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: