Энциклопедия Turbo Pascal. Главы 9-11 - Программа, использующая Turbo Access для работы с файлами
ОГЛАВЛЕНИЕ
Программа, использующая Turbo Access для работы с файлами
Целиком программа, использующая Turbo Access для работы с файлами, выглядит следующим образом:
program db_example;
Const
{данные константы сгенерированы программой SETCONST.PAS.
предоставляемой инструментарием баз данных. }
MaxDataRecSize = 108;
MaxKeyLen = 30;
PageSize = 24;
Order = 12;
PageStackSize = 10;
MaxHeight = 4;
type
address = record
status: integer; {используется Turbo Access }
name: string[30];
street: string[40];
city: string[20];
state: string[2];
zip: string[9];
end;
{следующие файлы содержат процедуры баз данных}
{$i access.box} {основные процедуры баз данных}
{$i addkey.box} {добавить элементы }
{$i delkey.box} {удалить элементы }
{$i getkey.box} {поиск по дереву }
var
dbfile: DataFile;
ifile: IndexFile;
done: boolean;
function MenuSelect:char; {возврат пользовательского
выбора }
var
ch:char;
begin
WriteLn('1. ');
WriteLn('2. Удалить имя ');
WriteLn('3. Отобразить список');
WriteLn('4. Обновление ');
WriteLn('5. Поиск по имени ');
WriteLn('6. Выход ');
repeat
WriteLn;
Write('Введите ваш выбор:');
Read(ch); ch:=UpCase(ch); WriteLn;
until (ch>='1') and (ch<='6');
MenuSelect:=ch;
end; {MenuSelect}
{добавить адрес к списку}
procedure Enter;
var
done: boolean;
recnum: integer;
temp: string[30];
info: address;
begin
done:=FALSE;
repeat
Write('Введите имя: ');
Read(info.name); WriteLn;
if Length(info.name)=0 then done:=TRUE
else
begin
Write('Введите улицу: ');
Read(info.street); WriteLn;
Write('Введите город: ');
Read(info.city); WriteLn;
Write('Введите штат: ');
Read(info.state); WriteLn;
Write('Введите индекс: ');
Read(info.zip); WriteLn;
info.status:=0; {сделать активной}
FindKey(ifile, recnum, info.name);
if not OK then {убедитесь, что нет дублированных
ключей }
begin
AddRec(dbfile, recnum, info);
AddKey(ifile, recnum, info.name);
end else WriteLn('Дублированный ключ игнорирован');
end;
until done;
end; {Enter}
{ изменение адреса в списке, исключая поле имени }
procedure Update;
var
done: boolean;
recnum: integer;
temp: string[30];
info: address;
begin
Write('Введите имя: ');
Read(info.name); WriteLn;
FindKey(ifile, recnum, info.name);
if OK then
begin
Write('Введите улицу: ');
Read(info.street); WriteLn;
Write('Введите город: ');
Read(info.city); WriteLn;
Write('Введите штат: ');
Read(info.state); WriteLn;
Write('Введите индекс: ');
Read(info.zip); WriteLn;
info.status:=0; {сделать активной}
PutRec(dbfile, recnum, info);
end else WriteLn('ключ не найден');
end; {Update}
{удалить адрес из списка }
procedure Remove;
var
recnum: integer;
name: string[30];
info: address;
begin
Write('Введите имя для удаления : ');
Read(name); WriteLn;
FindKey(ifile, recnum, name);
if OK then
begin
DeleteRec(dbfile, recnum);
DeleteKey(ifile, recnum, name);
end else WriteLn('Не найдено');
end; {Remove}
procedure Display(info: address);
begin
WriteLn(info.name);
WriteLn(info.street);
WriteLn(info.city);
WriteLn(info.state);
WriteLn(info.zip); WriteLn;
end; {Display}
procedure ListAll;
var
info: address;
len, recnum: integer;
begin
len := fileLen(dbfile) -1;
for recnum:=1 to len do
begin
GetRec(dbfile, recnum, info);
{отобразить, если не уничтожен}
if info.status = 0 then display(info);
end;
end; {ListAll}
{Найти заданный элемент }
procedure Search;
var
name: string[30];
recnum: integer;
info: address;
begin
Write('Введите имя: ');
ReadLn(name);
{найти ключ, если существует}
FindKey(ifile, recnum, name);
if OK then
begin
GetRec(dbfile, recnum, info);
{отобразить, если не уничтожен}
if info.status = 0 then Display(info);
end else WriteLn('не найден');
end; {Search}
begin
InitIndex;
OpenFile(dbfile, 'mail.lst', SizeOf(address));
if not OK then
begin
WriteLn('Cоздание нового файла');
MakeFile(dbfile, 'mail.lst', SizeOf(address));
end;
OpenIndex(ifile, 'mail.ndx', 30, 0);
if not OK then
begin
WriteLn('Cоздание нового файла ');
MakeIndex(ifile, 'mail.ndx', 30, 0);
end;
done:=false;
repeat
case MenuSelect of
'1': Enter;
'2': Remove;
'3': ListAll;
'4': Search;
'5': Update;
'6': done:=true;
end;
until done;
CloseFile(dbfile);
CloseIndex(ifile);
end.