Учебник по Delphi

Типизированные файлы.

   Такие файлы я особенно люблю. Писал я как-то код игры и использовал типизированные файлы для удобства ее сохранения. Я создал тип Game (type Game=record), в котором хранил все данные, относящиеся к конкретной игре в текущий момент и к определенному игроку. В общем, это все переменные, которые используются в течение игры и которые нужно сохранять и загружать.

   Так как все данные об игре хранятся в одной переменной типа Game (который я сам придумал), то для сохранения игры достаточно записать в SAV-файл всего лишь одну эту переменную.

   Ее размер, конечно, получался большой — десятки, а то и сотни килобайт, но удобство в том, что не нужно было заниматься подготовкой к сохранению, выискивая среди огромного количества те переменные, которые нужно сохранять. А потом заниматься этим же еще и при загрузке сохраненной игры. Все проще: раз — и сохранил игру в виде одной переменной, раз — и загрузил.

   Удобно, быстро и с минимальной вероятностью ошибиться. И все это благодаря типизированным файлам. Если использовать простейшие типизированные файлы, то тип объявлять не нужно. Например, работа с типизированным файлом типа integer выглядит так.

Листинг 8.6
procedure TForml.ButtonlCIick(Sender: TObject);
var
F: File of Integer;
i, n: Integer;
begin
Randomize;
AssignFi le(F,bredt.out);
Rewrite(F);
for i := 1 to 20 do
begin
n := Random(10);
Write(F.n);
end;
CloseFi le(F);

5по\*/Меззаде(Файл вроде бы записан.);
end;

   Данная процедура создает файл bredl. out, после чего генерирует 20 случайных чисел и записывает их в файл в нетекстовом виде. Естественно, при просмотре файла текстовым редактором получается ерунда.

   Обратите внимание на процедуру ShowMessage. Она выводит на экран окно с текстом . Это очень удобный и простой способ донести до пользователя какое-нибудь короткое сообщение.

   В таком виде типизированные файлы используются редко. Я не помню, чтобы мне хоть раз доводилось пользоваться ими без объявления своего собственного типа. Поэтому перейдем к использованию типизированных файлов с объявлением своего типа данных. Создадим новый проект (File > New > Application) и будем делать записную книгу, чтобы вносить в нее адреса друзей и знакомых (данный проект можно найти на компакт-диске, прилагаемом к книге, по адресу ExamplesXNotebook). Поместите на форму все необходимые компоненты: три этикетки (Label), три текстовых поля (Edit) и две кнопки (Button).

Измените некоторые свойства формы Forml в соответствии с таблицей:

СвойствоЗначение
Borderlcons
biMaximize
False
BorderStylebsSingle
CaptionЗаписная книга
PositionpoScreenCenter

   Остальные свойства оставьте по умолчанию. В свойстве Caption компонентов Labell, Label2 и Label3 укажите Фамилия, Год рождения и E-mail. Свойство Text компонентов Editl, Edit2 и Edit3 сделайте пустыми. Значением свойства Caption кнопки Buttonl должно быть «, а кнопки Button2 — ».

   На всякий случай скажу, что мы изменяли и для чего. В свойстве Borderlcons формы можно установить такие параметры: отображать ли меню окна (и кнопку закрытия окна — крестик'в правом верхнем углу), разрешить ли сворачивание окна и разворачивание его во весь экран, показывать ли кнопку помощи (значок вопроса). Изменив значение свойства biMaximize на False, мы запретили разворачивание формы во весь экран, иначе она будет выглядеть не очень симпатично. BorderStyle — стиль формы. Стиль bsSingle означает, что пользователю нельзя изменять размеры формы. Caption — это текст заголовка формы, a Position указывает место, где форма будет появляться на экране (в данном случае в центре).

   Теперь можно писать код программы. Создадим новый тип данных, который назовем MyBook. Перейдите в окно редактирования текста программы (в его заголовке написано Unitl.pas), найдите раздел type и после слова end; добавьте новый тип данных.

Листинг 8.7
MyBook=record
fio: String[150];
year: Integer;
emai I : String[150];
end;

   Откройте редактирование процедуры FormActivate формы Forml: щелкните на форме мышью, а затем в Object Inspector на вкладке Events дважды щелкните в пустом поле рядом со строкой события OnActivate. В редакторе текста программы откроется пустая процедура TForml.FormActivate.

   Она будет выполняться при активации формы, а активация происходит при запуске программы. Поэтому в начале работы нашего приложения будем проверять, существует ли файл с данными. Если его нет, то создадим пустой файл.

Листинг 8.8
procedure TForml. FormAct ivate(Sender: TObject);
var
F: File of MyBook;
p: MyBook;
begin

// проверяем наличие файла
if Fi leExists(book.dat)=False then
begin
AssignFile(F,book.dat);
Rewrite(F);
p . f io := ;
p.year := 0;
p.emai I := ;
W r i t e ( F . p ) ;
CloseFi le(F);
end;
end;

   Если создается пустой файл, то в него добавляется одна пустая запись. Здесь была использована функция FileExists. Использовать ее несложно. Функции передается один параметр — имя файла. Она возвращает True, если файл с таким именем существует, и False, если его нет.

   Пусть сразу же после запуска программы из файла считывается первая запись и данные из нее выводятся на экран. Если файл только что создан, то одна запись все равно выведется — пустая. Для этого мы ее и создавали.

   Объявим глобальную переменную гее, в которой будет храниться номер текущей записи. Нужно объявить ее в разделе var выше всех процедур перед словом implementation.

Листинг 8.9
var
Form1: TForml;
гее: Integer;
implementation


Добавим в процедуру FormActivate чтение первой записи..

Листинг 8.10
// читаем первую запись
AssignFi l.e(F, book, dat);
Reset(F);
Read(F.p);
CloseFi le(F);
rec := 0;

   Здесь все просто. Открываем файл, читаем первую запись (то есть нулевую, так как в файлах нумерация записей начинается с нуля) и присваиваем переменной гее номер нулевой записи.

   Можете запустить получившуюся программу на выполнение (клавиша F9) и удостовериться, что файл book, dat появился в той же директории, где и программа. Напишем код вывода на экран данных из первой записи.

Листинг 8.11
// выводим на экран данные из первой записи
Edifl.Text := p. f io;
Edit2.Text := IntToStr(p.year);
Edit3.Text := p.emai I;

   Как видите, обращение к данным идет через точку. То, что мы указывали в описании типа, теперь доступно в переменной р типа MyBook, но через точку. В строке, где выводится на экран год (р. year), применена функция intToStr. Delphi не позволяет присваивать текстовым переменным числовые значения, и наоборот. Поэтому для того чтобы это сделать, нужно сначала преобразовать значения. Для преобразования из текста в число служит функция strToint, а для преобразования из числа в текст — IntToStr. Год у нас хранится в переменной year типа Integer. Чтобы вывести его как string (в текстовое поле), пришлось применить функцию IntToStr.

   Не забудьте, что две кнопки на форме внизу нужны, чтобы переходить от одной записи к Другой: левая позволяет листать записную книгу назад, а правая — вперед. А что делать, если листать некуда? Нужно отключить эти кнопки, изменив значение свойства Enabled кнопок Button с False на True. Мы это сделаем с помощью программирования — добавим в процедуру активации формы еще такие строки:

// включаем/отключаем кнопки
if rec=0 then Buttonl.Enabled := False
else Buttonl.Enabled := True;

   Данную программу можно улучшить. Вероятно, вы заметили, что в нескольких местах программы повторяется один и тот же код (в разных процедурах). Такой подход неправильный. Повторяющиеся фрагменты кода лучше формировать в виде отдельной процедуры и просто вызывать ее нужное количество раз. Там же приведен полный окончательный текст нашей программы, хотя, если вы все сделали правильно, он у вас уже есть.




 

Рейтинг@Mail.ru          Rambler's Top100

X-ZiBiT