Datový typ record (záznam)

Pole musí obsahovat vždy hodnoty stejného typu. Ve složitějších, například databázových programech, by se hodilo, kdyby jedna proměnná mohla obsahovat data různých typů, třeba stringy pro jména, příjmení a adresy, hodnoty typu integer (nebo real) pro platy a podobně. K tomuto účelu lze v Delphi používat složený typ record. V minulé lekci jsme pracovali s typem TPoint, což je záznam obsahující dvě velikosti souřadnic X, Y.

Typ record může obsahovat více různých typů hodnot, např.:

type os_karta = record
jmeno:string;
prijmeni:string;
vek:integer;
pohlavi:char;
end;

Klíčové slovo type říká, že se definuje nový typ proměnných os_karta, který obsahuje položky různých typů. Všimněte si také, že seznam položek je ukončen klíčovým slovem end, ačkoliv tu není žádný begin.
V programu například na evidenci zaměstnanců bychom potom mohli použít pole proměnných typu os_karta, například:
zamestnanci :array[1..20] of os_karta;

K jednotlivým položkám záznamu se přistupuje pomocí tečky, pro tisk jmen všech zaměstnanců lze například použít cyklus for:
for n:=1 to pocet do
listbox1.Items.Add(zamestnanci[n].jmeno + zamestnanci[n].prijmeni+' , '+inttostr(zamestnanci[n].vek));

Abychom nemuseli pokaždé (a někdy dost často) vypisovat název záznamu, je možné k položkám záznamu přistupovat také pomocí příkazu with:
with zamestnanci[pocet] do
begin
jmeno:=edit1.Text;
prijmeni:=edit2.Text;
vek:=edit3.text;
end;

Nový datový typ využijeme pro jednoduchou aplikaci evidence telefonních kontaktů.

Projekt Telefoní seznam

Komponenty aplikace jsou "čitelné" z obrázku - edity, tlačítka, spinedit, listbox, labely - nic nového pod Delphi sluncem :-) .

Novinkou v této lekci jsou záznamy (record), neboli nový datový typ definovaný uživatelem, pro tento projekt je definovaný typ názvu polozka. Kromě definice tohoto nového typu uvádím i část kódu s definicí typu TForm (nekopírovat!), kterou Delphi vytváří automaticky, to z toho důvodu, aby bylo jasné, kam zapsat definici nového typu - za end definice předcházejícího typu:
type
TForm1 = class(TForm)
Label1: TLabel;
......
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type polozka = record
jmeno: string;
prijmeni: string;
cislo: string;
end;
A protože dáváme uživateli jen dvě možnosti, na dvou tlačítkách mohou být tyto dvě procedury:
procedure TForm1.Button1Click(Sender: TObject);
begin
pocet:=pocet+1;
with adresy[pocet] do
begin
jmeno:=edit1.Text;
prijmeni:=edit2.Text;
cislo:=edit3.text;
end;
listbox1.Clear;
for n:=1 to pocet do listbox1.Items.Add(inttostr(n)+'. '+adresy[n].jmeno +' '+ adresy[n].prijmeni+': '+adresy[n].cislo);
end;
Proměnná pocet uchovává počet zapsaných kontaktů, při přidávání nového se zvětší o 1. Do jednotlivých položek příslušné proměnné pole adresy se uloží texty z Editů a vyprázdní se ListBox. Pomocí for cyklu se do ListBoxu potom vypíší všechny zapsané kontakty.

procedure TForm1.Button2Click(Sender: TObject);
begin
if (spinedit1.value>pocet) or (spinedit1.value<0) then begin showmessage('Položka neexistuje'); exit end;
if pocet=0 then begin showmessage('Seznam je prázdný'); exit end;
if pocet=1 then begin listbox1.Clear; pocet:=0; exit end;
for n:=spinedit1.Value to pocet-1 do adresy[n]:=adresy[n+1];
pocet:=pocet-1;
listbox1.Clear;
for n:=1 to pocet do listbox1.Items.Add(inttostr(n)+'. '+adresy[n].jmeno + ' ' +adresy[n].prijmeni+': '+adresy[n].cislo);
end;
Pro smazání záznamu je potřeba nejprve vyřešit případy, kdy je seznam prázdný nebo je v něm jen jeden záznam, v obou případech se smaže ListBox a procedura se ukončí příkazem exit (případně se ještě vynuluje počet). Pro větší počet záznamů než jeden, se pomocí for cyklu záznamy od smazaného přepíšou následujícím záznamem - s indexem o jedničku větším (všechny se "posunou" o jedno místo nahoru). Počet se zmenší o jedničku, vyprázdní ListBox, aby se do něj vypsal nový seznam.

Aplikaci ukládej do složky s názvem lekce21 .

Úkoly:

Základní úloha:

Vytvořte aplikaci podle textu lekce (viz ukázka ) - pozor - v lekci není uvedena definice proměnných, musíte všechny správně nadefinovat!


Úloha na plus:

Doplňte program o možnost opravy záznamu.


Úloha na jedničku:

Doplňte projekt o možnost vyhledání záznamu - uživatel zadá část příjmení a program mu vypíše příslušnou položku.


Úloha pro experty:

Vytvořte databázový program pro banku (důvěryhodnou) - evidovat se může jméno, příjmení, telefon, číslo účtu a samozřejmě jeho stav. Program má umožnit vkládat a vybírat částky z konta, zobrazovat údaje o zákazníkovi.