Действия с типизированными файлами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Действия с типизированными файлами



Типизированные файлы представляют собой последовательность компонентов одного типа. Они, в отличие от текстовых файлов, предполагают произвольный доступ к элементам файла по их номеру (нумерация от нуля) [6]. Покажем реализацию действий на конкретном примере. Создадим приложение с интерфейсом для выполнения основных действий с несложной по структуре базой данных о студентах некоторой группы. Разместим на форме компоненты TMainMenu (меню), TStringGrid (таблица записей файла) и TImage (картинка на форме). С первыми двумя компонентами мы уже знакомы. Компонент TImage вкладки Additional позволяет отображать иллюстрации, фото, рисунки. Картинку можно задать на этапе разработки формы (как значки для пунктов меню) или загрузить из файла при запуске программы. Файл с картинкой должен быть в bmp -формате или в формате jpg (jpeg). В последнем случае необходимо включить в текст модуля директиву uses jpeg. В нашем примере мы будем отображать фото группы (см. рисунок) вместе с созданием главной формы следующей процедурой.

procedure TForm1.FormCreate(Sender: TObject);

begin

Image1.Picture.LoadFromFile('gruppa.jpeg');

end;

Объект Picture (свойство Image1) представляет собой картинку, которую загружает из файла gruppa.jpeg метод LoadFromFile. При размещении на форме Image1 следует задать значения и другим его свойствам:

· AutoSize = false – признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации;

· Strech = true – признак автоматического масштабирования картинки в соответствии с реальным размером компонента;

· Proportional = true – признак автоматического масштабирования без искажения картинки;

· Align = alClient – задает границу формы, к которой привязан компонент. Значение alClient означает, что размер изображения будет изменяться автоматически с изменением клиентской части формы (ее внутренней части). Полезно познакомиться и с другими свойствами объекта Image.

Для удобства выполнения определенных действий полезно включить в состав проекта модуль с описанием глобальных объектов:

unit Unit2;

// Модуль с параметрами

interface

type

student = record // Тип записей в файле

fio: string[30];

sb: real;

end;

var

s: ShortString = 'gruppa'; // Имя файла на диске

zapis: student;

// Файловая переменная для работы с типизированным файлом

f: file of student;

implementation

end.

Теперь реализуем обработчики кликов по пунктам меню.

procedure TForm1.N10Click(Sender: TObject);

begin // Пункт "Выход" секции "Файл"

Form1.Close; // Закрытие основной формы приводит к прекращению

end; // работы приложения

 

procedure TForm1.N2Click(Sender: TObject);

var // Пункт "Открыть" секции "Файл"

i, n: integer;

begin

AssignFile(f, s);

if not FileExists(s) then ShowMessage('Файл отсутствует')

else begin // Если файл существует

StringGrid1.Visible:= true; // Сделать видимой таблицу записей

StringGrid1.Cells[1,0]:= 'Фамилия Имя Отчество';

StringGrid1.Cells[2,0]:= 'Средний балл';

reset(f); // Открываем файл для действий с ним

i:= 1;

n:= FileSize(f); // Определяем количество записей в файле

StringGrid1.RowCount:= n + 1; // Задаем количество строк в таблице

while not EOF(f) do // Пока не конец файла

begin

StringGrid1.Cells[0,i]:= IntToStr(i); // Нумеруем строку

read(f, zapis); // Читаем из файла запись в переменную zapis

StringGrid1.Cells[1,i]:= zapis.fio;

StringGrid1.Cells[2,i]:= FloatToStr(zapis.sb);

inc(i);

end;

CloseFile(f);

end;

end;

 

procedure TForm1.N3Click(Sender: TObject);

begin // Пункт "Добавить" секции "Файл"

Form1.Visible:= false; // Делаем невидимой главную форму

Form3.Visible:= true; // и видимой вспомогательную форму

end;

В результате выполнения команды "Добавить" откроется форма, предназначенная для ввода полей записи, добавляемой в файл. Представим обработчики событий, связанных с щелчками по кнопкам этой формы.

procedure TForm3.Button1Click(Sender: TObject);

var // Записать

n, i: integer;

begin

if (Edit1.Text = '') or (Edit2.Text = '') then

ShowMessage('Нет данных')

else begin

AssignFile(f, s);

zapis.fio:= Edit1.Text;

zapis.sb:= StrToFloat(Edit2.Text);

if not FileExists(s) then rewrite(f) // Если файла нет, он создается

else begin // Если файл существует

reset(f);

n:= FileSize(f);

seek(f, n); // Указатель в файле à за последнюю запись

write(f, zapis); // Добавление записи в файл

CloseFile(f);

reset(f); // Указатель à на первую запись файла

Form1.StringGrid1.Visible:= true;

Form1.StringGrid1.Cells[1,0]:= 'Фамилия Имя Отчество';

Form1.StringGrid1.Cells[2,0]:= 'Средний балл';

i:= 1;

n:= FileSize(f); // Определяем количество записей в файле

Form1.StringGrid1.RowCount:= n + 1;

while not EOF(f) do // Пока не конец файла

begin // вывод записей из файла в таблицу

Form1.StringGrid1.Cells[0,i]:= IntToStr(i);

read(f, zapis); // Читаем из файла запись в zapis

Form1.StringGrid1.Cells[1,i]:= zapis.fio;

Form1.StringGrid1.Cells[2,i]:= FloatToStr(zapis.sb);

inc(i);

end;

Edit1.Text:= '';

Edit2.Text:= '';

Edit1.SetFocus;

Form3.Visible:= false;

Form1.Visible:= true;

end;

end;

end;

 

procedure TForm3.Button2Click(Sender: TObject);

begin // Отмена записи в файл

Edit1.Text:= '';

Edit2.Text:= '';

Edit1.SetFocus;

Form3.Close; // Вариант действий с формой ввода записи

Form1.Visible:= true;

end;

Покажем код еще одной процедуры, сортирующей записи в файле по среднему баллу и выводящей результат сортировки в таблицу.

procedure TForm1.N8Click(Sender: TObject);

var // Сортировка по среднему баллу

i, j, n: integer;

flag: 0..1; // Признак обмена

z1, z2: student;

begin

AssignFile(f, s);

if not FileExists(s) then ShowMessage('Файл отсутствует')

else begin

reset(f);

n:= filesize(f); // n - число записей в файле

if n > 1 then // если в файле 0 или 1 запись, то не сортируем

for j:= 0 to n-2 do // Сортировка методом просеивания

begin

for i:= j downto 0 do

begin

flag:= 0;

seek(f, i); // позиционирование маркера на i-ю запись в файле

read(f, z1, z2); // чтение двух записей, идущих друг за другом

if z1.sb < z2.sb then // сравнение средних баллов в них

begin

flag:= 1;

seek(f, i);

write(f, z2, z1); // обмен записей в файле

end;

if flag = 0 then break // Если обменов нет,

end // то сортировка завершена

end;

reset(f);

i:= 1;

while not EOF(f) do // Пока не конец файла

begin

StringGrid1.Cells[0,i]:= IntToStr(i);

read(f, zapis); // Читаем из файла запись в zapis

StringGrid1.Cells[1,i]:= zapis.fio;

StringGrid1.Cells[2,i]:= FloatToStr(zapis.sb);

inc(i);

end;

CloseFile(f); // закрытие файла

end;

end;

И наконец, реализуем действия, связанные с удалением записи.

procedure TForm1.N4Click(Sender: TObject);

var // Пункт "Удалить" секции "Файл"

p, i, n: integer;

res: word; // Тип результата функции MessageDlg

begin // Вызываем модальное окно диалога

res:= MessageDlg('Вы действительно хотите'#13#10'Удалить эту запись?',

mtConfirmation, [mbYes, mbNo], 0);

if res = mrYes then begin // mrYes соответствует кнопке mbYes

p:= StringGrid1.Row; // Выделенная (удаляемая) строка в таблице

AssignFile(f, s);

reset(f);

n:= FileSize(f); // Количество записей в файле

if p = 1 then // Если удаляется первая запись

if n = 1 then // Если она одна в файле, то

truncate(f) // пишем в ее позицию EOF,

else begin // а иначе переписываем все записи,

while p < n do // сдвигая их на одну влево

begin

seek(f, p);

read(f, zapis);

seek(f, p - 1);

write(f, zapis);

inc(p);

end;

dec(p);

truncate(f); // Усекаем файл на одну запись – пишем EOF

end

else if p = n then begin // Если запись не одна и она последняя,

seek(f, p - 1); // то указатель в файле à на нее

truncate(f); // и пишем туда EOF

end

else begin // Для всех остальных p и n

while p < n do

begin

seek(f, p);

read(f, zapis);

seek(f, p - 1);

write(f, zapis);

inc(p);

end;

dec(p);

truncate(f);

end;

StringGrid1.RowCount:= 1; // Оставляем у таблицы только шапку

reset(f); // Указатель в файле на первую запись

i:= 1;

while not EOF(f) do begin // Пока не конец файла

StringGrid1.RowCount:= StringGrid1.RowCount + 1;

StringGrid1.Cells[0, i]:= IntToStr(i);

read(f, zapis); // Читаем из файла запись в zapis

StringGrid1.Cells[1, i]:= zapis.fio;

StringGrid1.Cells[2, i]:= FloatToStr(zapis.sb);

inc(i);

end;

CloseFile(f); end; end;

При удалении записи мы воспользовались еще одной формой окна диалога, вызываемого функцией MessageDlg(). Первый ее параметр задает текст сообщения, второй – тип окна (mtWarning – внимание; mtError – ошибка; mtInformation – информация; mtConfirmation – запрос; mtCustom – без значка), третий – множество командных кнопок окна диалога (mbYes, mbNo, mbOk, mbCancel, mbHelp, mbAbort, mbRetry, mbIgnore, mbAll) и четвертый – задает раздел справочной системы программы (при отсутствии – 0). Функция возвращает код кнопки, щелкнув по которой, пользователь закрыл окно диалога (значением функции становятся соответствующие кнопкам константы: mrYes … mrAll).

Варианты задания

1. Создать файл данных о сотрудниках отдела: ФИО, должность, стаж. Отсортировать содержимое файла по убыванию стажа работы.

2. Сравнить два файла, содержащие по 10 целых чисел.

3. Занести 6 случайно выбранных значений перечисляемого типа в файл.

4. На основе файла с символами создать файл с их порядковыми номерами по таблице кодировки.

5. На основе файлов исходных данных создать файл значений функции XOR и вывести данные из файлов в виде таблицы истинности.

6. В файле из символов переписать символы в обратном порядке.

7. Отсортировать строки файла по нарастанию их длины.

8. Создать файл из 7 чисел и записать на первую позицию их сумму.

9. Записать в файл средние значения всех пяти векторов исходного файла.

10. В файл из нескольких строчных латинских букв вставить после каждой из них аналогичную прописную букву.

11. Переписать файл из 3 пятиэлементных векторов в файл целых чисел.

12. На основе файла записей о деталях создать файл с их массами.

13. В файле из 10 целых чисел поменять местами четные и нечетные эле менты файла.

14. В файле из 10 вещественных чисел сделать первые пять чисел последними и наоборот.

15. В файле из трех пятиэлементных векторов расположить векторы в порядке возрастания их суммы.

16. Создать файл из трех матриц 2х2 и найти сумму элементов каждой.

17. Не используя массива, записать в файл 10 чисел и поменять местами первый и наибольший элементы файла.

18. Содержимое файла из матриц 3х3 переписать в файл из векторов.

19. Из исходного файла с полями: ФИО, возраст, - создать файл возрастов.

20. Из двух файлов с именами и адресами создать результирующий файл.

Библиографический список

1. Архангельский А.Я. Delphi 2006. Справочное пособие: Язык Delphi, классы, функции Win32 и.NET. – М.: ООО «Бином-Пресс», 2006. – 1152 с.

2. Попов В.Б. Паскаль и Дельфи. Учебный курс. – СПб.: Питер, 2005. – 576 с.

3. Белов В.В., Чистякова В.И. Программирование в Delphi: процедурное, объектно-ориентированное, визуальное: учеб. пособие для вузов. – М.: Горячая линия – Телеком, 2009. – 240 с.

4. Фленов М.Е. Библия Delphi. – 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2008. – 800 с.

5. Культин Н.Б. Основы программирования в Turbo Delphi. – СПб.: БХВ-Петербург, 2007. – 384 с.

6. Карасев В.В. Основы информатики: учеб. пособие (часть II). - Рязань: РГРТУ, 2007. – 68 с.

 

ОГЛАВЛЕНИЕ

Введение …………………………………………………………………….. 1

1. Модель решения задачи в Turbo Delphi ………………………………… 2

2. Проект приложения и связанные с ним действия в среде TD ………… 4

3. Файлы проекта …………………………………………………………… 8

4. Создание простейшего приложения ……………………………………. 9

5. Типы данных в Delphi ………………………………………………….. 13

6. Основная форма и ее свойства ………………………………………... 16

7. Палитра базовых компонентов ………………………………………… 19

7.1. Надпись (TLabel) …………………………………………………… 19

7.2. Многострочное поле ввода (ТМето) ……………………………… 20

7.3. Флажок (TCheckBox) ………………………………………………. 23

7.4. Панель (TPanel) …………………………………………………….. 24

7.5. Переключатель (TRadioButton) …………………………………… 25

7.6. Группа компонентов TRadioButton (TRadioGroup) ……………… 25

7.7. Список выбора (TListBox) ………………………………………… 26

7.8. Ниспадающие списки (TComboBox) ……………………………… 27

7.9. Полосы прокрутки (TScrollBar) …………………………………… 28

7.10. Группировка объектов (TGroupBox) ……………………………. 29

7.11. Список действий (TActionList) ………………………………….. 29

7.12. Меню приложения (TMainMenu) ……………………………….. 31

7.13. Матрица строк (TStringGrid) …………………………………….. 34

7.14. Таймер (TTimer) …………………………………………………… 35

7.15. Индикация процесса (TProgressBar) …………………………….. 37

7.16. Изменение значения параметра (TUpDown) ……………………. 38

7.17. Ползунок (TTrackBar) ……………………………………………. 38

7.18. Выбор даты (TDataTimePicker) ………………………………….. 39

7.19. Стандартные диалоги при работе с файлами …………………… 40

8. Отладка приложения ……………………………………………………. 41

9. Исключения и их обработка ……………………………………………. 43

10.Лабораторный практикум ………………………………………….. 45

10.1. Простое приложение ………………………………………….. 45

10.2. Рекурсивные вычисления …………………………………….. 48

10.3. Обработка текстовых файлов ………………………………… 52

10.4. Действия с типизированными файлами ……………………… 56

Библиографический список ……………………………………………. 63

 



Поделиться:


Последнее изменение этой страницы: 2016-06-19; просмотров: 375; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.146.37.35 (0.056 с.)