четверг, 3 мая 2012 г.

Работа с типизированными файлами. Практика


Задача: Требуется организовать запись TPupil, содержащую в себе поля:
  • Name - имя ученика 
  • Surname - фамилия ученика 
  • Age - возраст 
  • Sex - пол 


  1. На форме создать таблицу StringGrid, в которой подписать столбцы, в соответствии с полями: Имя, Фамилия, Возраст, Поло нажатию на кнопку “Добавить и сохранить”, из полей ввода (Edit) внести данные в таблицу, в переменную типа TTable и дозаписать в файл info.dat. Очистить эти поля ввода.
  2. По нажатию на кнопку “Сохранить” записать данные в массив типа TTable и в  типизированный файл info.dat (файл перезаписывать)
  3. По нажатию на кнопку “Загрузить”, загрузить данные из файла info.dat в массив типа TTable и вывести в таблицу

Рассмотрим программу.

На  форме  расположим три компонента типа TLabel  (подписи), два поля для ввода данных типа TEdit - для ввода имени и фамилии и компонент типа TSpinEdit для ввода возраста - целого числа. Кроме того, на форму поместим компонент RadioGroup1 - для указания пола,  три кнопки, соответственно для выполнения задания №№4,3,2 и компонент тип TStringGrid для  просмотра данных.
Объявления нового типа реализуем следующим образом:
type

 TPupil = record

   Name: string[20];    // указываем фиксированную длину строки

   Surname: string[20]; //
   Age: integer;
   Sex: boolean;
 end;
Рассмотрим процедуру добавления данных в файл и в таблицу:
procedure TForm1.Button1Click(Sender: TObject);
var
 F: file of TPupil; // объявляем файловую переменную
 P: TPupil;
 i: integer;
begin
 AssignFile(F,’info.dat’); // связываем переменную с файлом на диске
 if FileExists(’info.dat’) then //проверяем, существует ли файл
 begin
   Reset(f); //если файл существует, открываем его
   Seek(f,system.FileSize(f)); //устанавливаем указатель на коне файла //после последней записи
 end
 else Rewrite(f); //если файла не существует, создаем его
 //считываем данные из Edit-ов в поля записи
P.Name:=Edit1.Text;
 P.Surname:=Edit2.Text;
 P.Age:=Spinedit1.Value;
 if RadioGroup1.ItemIndex=0 then P.Sex:=true //"true" обозначает мужской пол
 else P.Sex:=false; //"false" обозначает женский пол
 write(F,P); //записываем значение переменной P файл F на текущую позицию
 //при этом позиция указателя сместится на одну вправо, то есть в конец файла
 SG.RowCount:=SG.RowCount+1; //добавим одну пустую строку в таблицу
 //заносим данные из переменной типа TPupil в ячейки таблицы
 SG.Cells[0,SG.RowCount-1]:=P.Name;
 SG.Cells[1,SG.RowCount-1]:=P.Surname;
 SG.Cells[2,SG.RowCount-1]:=IntToStr(P.Age);
 if P.Sex then SG.Cells[3,SG.RowCount-1]:='М'
 else SG.Cells[3,SG.RowCount-1]:='Ж';
 closefile(f); //обязательно закрываем файл по окончании работы с ним!
 edit1.Clear;  //очищаем поля для ввода
 edit2.Clear;
end;      
Далее рассмотрим реализацию процедуры загрузки данных из файла в таблицу на форме:
procedure TForm1.Button3Click(Sender: TObject); var
 F: file of TPupil; // объявляем файловую переменную
 P: array[1..100] of TPupil;
 i: integer;
begin
 if FileExists(FName) then //проверяем, существует ли файл
 begin
   i:=1;
   AssignFile(F,FName);//связываем переменную с файлом на диске
   Reset(f);  //открываем файл
   //будем читать содержимое, пока указатель на достигнет конца файла
   while not(EOF(F)) do
   begin
     read(f,P[i]);//считываем данные в переменную типа TPupil
     // указатель смещается на следующую запись в файле
     SG.RowCount:=SG.RowCount+1; //увеличиваем количество строк в таблице
     // заносим данные из полей записи в ячейки таблицы в новую строку
     SG.Cells[0,SG.RowCount-1]:=P[i].Name;
     SG.Cells[1,SG.RowCount-1]:=P[i].Surname;
     SG.Cells[2,SG.RowCount-1]:=IntToStr(P[i].Age);
     if P[i].Sex then SG.Cells[3,SG.RowCount-1]:='М'
     else SG.Cells[3,SG.RowCount-1]:='Ж';
     inc(i);//увеличиваем счетчик записей
   end;
   CloseFile(f); //обязательно закрываем файл!
 end;
end;

Процедура сохранения данных в файл с полной перезаписью данных:
procedure TForm1.Button2Click(Sender: TObject); var
 F: file of TPupil;// объявляем файловую переменную
 P: array[1..100] of TPupil;
 i: integer;
begin
     AssignFile(F,FName);// связываем переменную с файлом на диске
     Rewrite(f); // открываем файл, перезаписываем его содержимое
     i:=1; //запускаем счетчик записей
     while i<SG.RowCount do //пройдем по всем строкам в таблице
     begin
       //считываем данные из ячеек таблицы в переменную типа TPupil
       P[i].Name:=SG.Cells[0,i];
       P[i].Surname:=SG.Cells[1,i];
       P[i].Age:=StrToInt(SG.Cells[2,i]);
       if SG.Cells[3,i] = 'М' then P[i].Sex:=true
       else P[i].Sex:=false;
       write(f,P[i]); //записываем данные в файл
       inc(i); //увеличиваем счетчик
     end;
   CloseFile(f); //обязательно закрываем файл!
end;  

Комментариев нет:

Отправить комментарий