фывфыв. Практикум по дисциплине Разработка приложений в визуальных средах для студентов специальностей
Скачать 1.39 Mb.
|
ЛАБОРАТОРНАЯ РАБОТА 6Разработка приложения с использованием записей и файловЦель лабораторной работы: изучить правила работы с компонентами TOpenDialog и TSaveDialog. Написать программу с использованием файлов и данных типа запись. 1. Краткие сведения1.1. Программирование с использованием переменных типа запись Запись - это структура данных, объединяющая элементы одного или различных типов, называемыми полями. Записи удобны для создания структурированных баз данных с разнотипными элементами, например: Type TStudent = record //Объявление типа запись Fio : string[20]; //Поле ФИО Group : integer; //Поле номера студ. группы Осn : array[1..3] of integer; //Поле массива оценок end: Var Student: TStudent; //Объявление переменной типа запись Доступ к каждому полю осуществляется указанием имени записи и поля, разделенных точкой, например: Student.Fio := 'Иванов А.И.'; //Внесение данных в поля записи Student.Group := 107218; Доступ к полям можно осуществлять также при помощи оператора With: With Student do begin Fio := 'Иванов А.И.'; Group := 107218; end; 1.2. Работа с файлами Файл - это именованная область данных на внешнем физическом носителе. В ObjectPascal различают три вида файлов в зависимости от способа их организации и доступа к элементам: текстовые, типизированные и нетипизированные. Текстовой файл - это файл, состоящий из строк. Примером текстового файла может служить файл исходного текста программы в Delphi (расширение *.pas). Для работы с текстовым файлом должна быть описана соответствующая файловая переменная: var F : TextFile; Типизированные файлы имеют строго заданную их описанием структуру, когда все элементы имеют фиксированный и одинаковый размер. Это свойство типизированных файлов позволяет получить доступ к любому компоненту файла по его порядковому номеру. Элементами такого файла являются, как правило,записи. В описании файловой переменной указывается ее тип: Var F: TStudent; Нетипизированный файл – это файл, в котором данные не имеют определенного типа и рассматриваются, как последовательность байт. Файловая переменная объявляется: Var F: File; Порядок работы с файлами следующий: AssignFile(F, 'FileName.txt'); //Связывание файловой переменной F //с именем дискового файла "FileName.txt" Rewrite(F); //Создание нового файла Reset(F); //Открытие уже существующего файла Read(F, Stud); //Чтение данных из файла Write(F, Stud) //Запись данных в файл CloseFile(F); //Закрытие файла 1.3. Процедуры работы с файлами AssignFile(var F; FileName: string) - связывает файловую переменную F и файл с именем FileName. Reset(var F[: File; RecSize: word]) - открывает существующий файл. При открытии нетипизированного файла RecSize задает размер элемента файла. Rewrite(var F[: File; RecSize: word]) - создает и открывает новый файл. Append(var F: TextFile) - открывает текстовый файл для дописывания текста в конец файла. Read(F, v1[, v2...vn]) - чтение значений переменных, начиная с текущей позиции для типизированных файлов, и строк для текстовых. Write(F, v1[, v2,...vn]) - запись значений переменных начиная с текущей позиции для типизированных файлов и строк для текстовых. CloseFile(F) - закрывает ранее открытый файл. Rename(var F; NewName: string) - переименовывает неоткрытый файл любого типа. Erase(var F) - удаляет неоткрытый файл любого типа. Seek(var F; NumRec: Longint) - для нетекстового файла устанавливает указатель на элемент с номером NumRec. SetTextBuf(var F: TextFile; var Buf[;Size: word]) - для текстового файла устанавливает новый буфер ввода-вывода объема Size. Flush(var F: TextFile) - немедленная запись в файл содержимого буфера ввода-вывода. Truncate(var F) - урезает файл, начиная с текущей позиции. LoResult: integer - код результата последней операции ввода-вывода. FilePos(var F): longint - для нетекстовых файлов возвращает номер текущей позиции. Отсчет ведется от нуля. FileSize(var F): longint - для нетекстовых файлов возвращает количество компонентов в файле, Eoln(var F: TextFile): boolean - возвращает True, если достигнут конец строки. Eof(var F) ): boolean - возвращает True, если достигнут конец файла. SeekEoln(var F: TextFile): boolean - возвращает True, если пройден последний значимый символ в строке или файле, отличный от пробела или знака табуляции. SeekEoln(var F: TextFile): boolean - то же, что и SeekEoln, но для всего файла. BlockRead(var F: File; var Buf; Count: word[; Result: word]) BlockWrite(var F : File; var Buf; Count: word[; Result: word]) - соответственно процедуры чтения и записи переменной Buf с количеством Count блоков, 1.4.Компоненты TOpenDialog и TSaveDialog Компоненты TOpenDialog и TSaveDialog находятся на странице DIALOGS. Все компоненты этой страницы являются невизуальными, т.е. не видны в момент работы программы. Поэтому их можно разместить в любом удобном месте формы. Оба рассматриваемых компонента имеют идентичные свойства и отличаются только внешним видом. После вызова компонента появляется диалоговое окно, с помощью которого выбирается имя программы и путь к ней. В случае успешного завершения диалога имя выбранного файла и маршрут поиска содержится в свойстве FileName. Для фильтрации файлов, отображаемых в окне просмотра, используется свойство Filter, а для задания расширения файла, в случае, если оно не задано пользователем - свойство DefaultExt. Если необходимо изменить заголовок диалогового окна – используется свойство Title. 1.5. Пример выполнения задания Задание: написать программу, вводящую в файл или читающую из файла ведомость абитуриентов, сдавших вступительные экзамены. Каждая запись должна содержать фамилию, а также оценки по физике, математике и сочинению. Вывести список абитуриентов, отсортированный в порядке уменьшения их среднего балла и записать эту информацию в текстовой файл. Настройка компонентов TOpenDialogaTSaveDialag Для установки компонент TOpenDialog и TSaveDialog на форму необходимо, на странице Dialogs палитры компонентов щелкнуть мышью соответственно по пиктограммам или и поставить их в любое свободное место формы. Установка фильтра производится следующим образом. Выбрав соответствующий компонент, дважды щелкнуть по правой части свойства Filter инспектора объектов. Появится окно Filter Editor, в левой части которого записывается текст, характеризующий соответствующий фильтр, а в правой части - маску. Для OpenDialog1 установим значения маски как показано на рисунке 6.1. Формат *.dat означает что, будут видны все файлы с расширением dat, а формат *.* - что будут видны все файлы (с любым именем и с любым расширением). Рисунок 6.1 – Установка фильтра для файлов Для того чтобы файл автоматически записывался с расширением .dat в свойстве DefaultExt запишем требуемое расширение - .dat. Аналогичным образам настроим SaveDialog1 для текстового файла (расширение *.txt). Работа с программой После запуска программы на выполнение появится диалоговое окно программы. Кнопка “Ввести запись” видна не будет. Необходимо создать новый файл записей, нажав на кнопку "Создать" или открыть ранее созданный, нажав - кнопку "Открыть". После этого станет видна кнопка "Ввести запись" Рисунок 6.2 – Форма приложения и можно будет вводить записи. При нажатии на кнопку "Сортировать" будет проведена сортировка ведомости по убыванию среднего балла и диалоговое окно примет вид, как на рисунке 6.2. Затем при нажатии на кнопку “Сохранить” будет создан текстовой файл, содержащий отсортированную ведомость. Файл записей закрывается одновременно с программой при нажатии на кнопку "Close". Текст программы: Unit LabRab_6; Interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls; Type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; BitBtn1: TBitBtn; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Memo1: TMemo; Procedure FormCreate(Sender: TObject); Procedure Button1Click(Sender: TObject); Procedure Button2Click(Sender: TObject); Procedure Button3Click(Sender: TObject); Procedure Button4Click(Sender: TObject); Procedure Button5Click(Sender: TObject); Procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Type TStudent = record FIO : string[40]; //Поле Ф.И.О. otc : array[1..3] of word; //Поле массива оценок sball : extended; //Поле среднего балла end; var Fz : file of TStudent; //Файл типа запись Ft : TextFile; //Текстовой файл Stud : array[1..100] of TStudent; //Массив записей Nzap : integer; //Номер записи FileNameZ, FileNameT : string; //Имена файлов var Form1: TForm1; Implementation {$R *.dfm} Procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit4.Text := ''; Memo1.Clear; Button1.Hide; //Сделать невидимой кнопку "Ввести запись" Nzap := 0; end; Procedure TForm1.Button1Click(Sender: TObject); begin nzap := nzap + 1; with stud[nzap] do begin FIO := Edit1.Text; otc[1] := StrToInt(Edit2.Text); otc[2] := StrToInt(Edit3.Text); otc[3] := StrToInt(Edit4.Text); sball := (otc[1] + otc[2] + otc[3])/3; Memo1.Lines.Add(fio + '' + IntToStr(otc[1 ]) + ' ' + IntToStr(otc[2]) + '' + IntToStr(otc[3])); end; Write(fz, Stud[nzap]); //Запись в файл Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit4.Text := ''; end; Procedure TForm1.Button2Click(Sender: TObject); begin OpenDialog1.Title := 'Создать новый файл'; // Изменение заголовка окна диалога if OpenDialog1.Execute then // Выполнение стандартного диалога выбора имени файла begin FileNameZ := OpenDialog1.FileName; // Возвращение имени дискового файла AssignFile(Fz, FileNameZ); // Связывание файловой переменной Fz с именем файла Rewrite(Fz); //Создание нового файла Button1.Show; //Сделать видимой кнопку "Ввести запись" end; end; Procedure TForm1.Button3Click(Sender: TObject); begin if OpenDialog1.Execute then //Выполнение стандартного диалога выбора имени файла begin FileNameZ := OpenDialog1.FileName; // Возвращение имени дискового файла AssignFile(Fz, FileNameZ); // Связывание файловой переменной Fz с именем файла Reset(Fz); //Открытие существующего файла end; While not EOF(fz) do begin nzap := nzap + 1; Read(fz, stud[nzap]); //Чтение записи из файла with stud[nzap] do Memo1.Lines.Add(fio + '' + IntToStr(otc[1]) + ' ' + IntToStr(otc[2]) + '' + IntToStr(otc[3])); end; Button1.Show; //Сделать видимой кнопку "Ввести запись" end; Procedure Tform1.Button4Click(Sender: TObject); // Сортировка записей var i, j : word; st : Tstudent; begin for i := 1 to nzap-1 do for j := i + 1 to nzap do if Stud[i].sball < Stud[j].sball then begin st := Stud[i]; Stud[i] := Stud[j]; Stud[j] := st; end; Memo1.Clear; for i := 1 to nzap do // Вывод в окно Memo1 отсортированных записей with stud[i] do Memo1.Lines.Add(IntToStr(i) + '' + fio + '' + FloatToStrF(sball, ffFixed, 4, 2)); end; Procedure Tform1.Button5Click(Sender: TObject); // Сохраниение результатов сортировки в текстовом файле var i : word; begin if SaveDialog1.Execute then // Выполнение стандартного диалога выбора имени файла begin FileNameT := SaveDialog1.FileName; // Возвращение имени дискового файла AssignFile(Ft, FileNameT); // Связывание файловой переменной Ft с именем файла Rewrite(Ft); //Открытие нового текстового файла end; for i:=1 to nzap do with stud[i] do Writeln(Ft, i:4, '.', fio, sball:8:2); // Запись в текстовой файл CloseFile(Ft); //Закрытие текстового файла end; Procedure TForm1.BitBtn1Click(Sender: TObject); begin CloseFile(fz); // Закрытие файла записей при нажатии на кнопку "Close" end; { Procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseFile(fz); // Закрытие файла записей при нажатии на кнопку end; } end. |