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ů.
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.
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!
Doplňte program o možnost opravy záznamu.
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.
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.