Práce se soubory

Většina programů by nebyla moc užitečná, kdyby nebylo možné zapsaná nebo zpracovaná data uložit na disk. Například telefonní seznam z minulé lekce by nám bez uložení moc neposloužil :-). Pro práci se soubory můžeme využít metody (procedury) některých komponent Delphi, nebo příkazy Pascalu pro práci s různými typy souborů.

Souborová podpora v Delphi

Obsah některých komponent, které jsme poznali v minulých lekcích, lze snadno jedním příkazem uložit nebo načíst, při tvorbě textového editoru jsme například načítali nebo ukládali obsah Richeditu:
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
Parametrem těchto procedur jsou názvy souborů (řetězce) převzaté z příslušných dialogů.
Podobným způsobem je možné uložit nebo načíst obsah ListBoxu (položky - items) nebo komponenty Memo (řádky - lines):
listbox1.Items.LoadFromFile('c:\data.txt');
memo1.lines.LoadFromFile('c:\data.ham');
listbox1.Items.SaveToFile('data.csv');
memo1.Lines.SaveToFile('data.dat');
Jako parametr jsou pro ukázku použity tentokrát přímo názvy souborů (řetězce, proto v apostrofech), buď uvedené i s cestou (c:\data.csv), nebo jen název souboru bez cesty, v tom případě se soubor ukládá do složky projektu. Příponu souboru můžete zvolit libovolnou, ať už bude jakákoliv, můžete si soubor prohlédnout například v Poznámkovém bloku. (Lepší by ale bylo používat známé přípony, které napovídají o obsahu souboru: txt - textový soubor, csv - soubor položek oddělených středníkem, apod.)

Uvedené procedury ukládají řetězce (řádky), to se ale pro ukládání například jednotlivých záznamů našeho telefonního seznamu z minulé lekce příliš nehodí, pro takový případ spíš využijeme další způsob, pomocí příkazů Pascalu pro práci se soubory (i když se od příkazů Pascalu trochu liší - poznámka pro ty, kdo Pascal znají.)

Souborová podpora v Object Pascalu

Pascal rozlišuje tři typy souborů - soubory s udaným typem, textové soubory a netypové binární soubory. V této lekci se zaměříme na první z nich, nejlepší bude, když si rovnou vše ukážeme na doplnění projektu z minulé lekce o uložení a načtení dat zatím bez ošetření chyb při práci se soubory.

Pro doplnění telefonního seznamu o práci se soubory je zapotřebí několik kroků (žádný nelze vynechat :-) ):

- doplnit definici typu polozka o délku řetězců, protože řetězce bez udané délky nelze tímto způsobem ukládat:
type polozka = record
jmeno: string[20];
prijmeni: string[20];
cislo: string[15];
end;

- definovat proměnnou typu soubor, který obsahuje data daného typu, například:
var
soubor: file of polozka;
- definuje proměnnou soubor, jejíž hodnotou je soubor složený ze záznamů typu polozka (v projektu z minulé lekce záznam polozka obsahoval jméno, příjmení a číslo)

- potom je potřeba proměnné typu soubor přiřadit skutečný soubor na disku příkazem AssignFile, který použijeme nejlépe už při vytvoření formuláře:
procedure TForm1.FormCreate(Sender: TObject);
begin
AssignFile(soubor,'adresy.dat');
end;
Parametry jsou název proměnné a název souboru (v apostrofech) případně s cestou.

- dále je nutné vytvořit soubor příkazem Rewrite(soubor) - pozor, pokud soubor existuje, dojde k jeho smazání a znovuvytvoření! Příkaz umístíme na speciální tlačítko pro vytvoření nového souboru adresáře:
procedure TForm1.novyClick(Sender: TObject);
begin
listbox1.clear;
rewrite(soubor);
pocet:=0;
end;

Jestliže je soubor vytvořený, můžeme začít používat příkazy pro práci s tímto souborem:
reset(soubor); - otevření souboru, není-li otevřený, nelze z něj číst, nebo do něj ukládat
closefile(soubor); - zavření souboru, je potřeba přinejmenším před ukončením programu, jinak není zaručeno, že budou data uložena
read(soubor,proměnná) - přečte položku daného typu ze souboru a uloží do proměnné
write(soubor,proměnná) - uloží hodnotu proměnné do souboru
filesize(soubor) - velikost souboru, nikoli v bytech, ale v počtu uložených položek

Uvedené příkazy využijeme v procedurách pro tlačítka Uložit a Načíst:
procedure TForm1.ulozitClick(Sender: TObject);
begin
rewrite(soubor);
for n:=1 to pocet do write(soubor,adresy[n]);
closefile(soubor);
end;
V proceduře se otevře soubor a potom se do něj ve for cyklu uloží všechny hodnoty pole adresy, nakonec se soubor zavře.

procedure TForm1.nacistClick(Sender: TObject);
begin
reset(soubor);
pocet:=filesize(soubor);
for n:=1 to pocet do read(soubor,adresy[n]);
closefile(soubor);
listbox1.clear;
for n:=1 to pocet do listbox1.Items.Add(inttostr(n)+'. '+adresy[n].jmeno + ' ' +adresy[n].prijmeni+': '+adresy[n].cislo);
end;
Po otevření souboru se zjistí počet uložených položek, ve for cyklu se položky načtou do pole adresy, soubor se zavře, vyčistí listbox, aby se do něj znovu vypsaly všechny hodnoty.

Aplikace ukládej do složky s názvem lekce22 .

Úkoly:

Základní úloha:

Podle textu lekce a ukázky doplň projekt z minulé lekce o možnost uložení a načtení dat.


Úloha na plus:

Místo tlačítek doplň do projektu menu.


Úlohy na jedničku:

Doplň některou úlohu na jedničku o možnost uložení a načtení dat z menu za pomoci dialogů.

Některou z her z minulých lekcí doplň o tabulku rekordů.