Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Структура данных — запись



На практике мы часто сталкиваемся с задачами, где используются данные, состоящие из других данных. Например, информация о студентах может состоять не только из фамилии и инициалов, паспортных данных, номера группы, но и оценок, полученных на экзаменах. Для работы с такой информацией в Delphi используется структура данных — запись (record).

Запись — это структура данных, состоящая из полей. Поля — это именованные компоненты разного типа.

Переменную-запись можно в общем виде описать в разделе описания переменных как:

Имя-переменной: record

Поле_1: Тип_1;

Поле­_2: Тип_2;

Поле_К: Тип_K;

End;

Например,

Student: record

f_name: string[20];

l_name: string[20];

day: integer;

month: integer;

year: integer;

address: string[50];

end;

Если в программе нужно использовать много переменных-записей одной структуры, то целесообразно в разделе Type объявить тип «запись»:

Имя = record

Поле_1: Тип_1;

Поле_2: Тип_2;

Поле_K: Тип_К;

End;

Например,

Type

TDate = record

Day: integer;

Month: integer;

Year: integer;

End;

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

Var

Birthday: TDate;

Dat1, Dat2: TDate;

Для работы с записями в языке Delphi предусмотрен оператор With. Он позволяет много раз не писать имя переменной-записи, а работать просто с полями. В общем виде оператор With выглядит так:

With Имя do

Begin

{операторы программы}

End;

где:

Имя — имя переменной-записи;

With — зарезервированное слово, означающее, что далее, до слова end, при обращении к полям записи «Имя», имя записи можно не указывать.

Например, если в программе объявлена запись Student (см. выше) и данные о студенте вводятся в поля Edit1, Edit2 и Edit3 диалогового окна, то вместо операторов

Student.f_name:=Edit1.Text;

Student.l_name:=Edit2.Text;

Student.address:=Edit3.Text;

можно записать

with student do

begin

f_name:=Edit1.Text;

l_name:=Edit2.Text;

address:=Edit3.Text;

end;

Практика

Задача

Дана следующая информация об индивидуальных домах в некотором регионе: номер кадастрового дела, Фамилия И.О. собственника, адрес дома, общая площадь (кв.м), дата последней уплаты налога на недвижимость. Составить программу, которая: 1) находит собственников, не уплативших налог за предыдущий год; 2) выводит информацию о домах площадью более 100 кв.м. Предусмотреть возможности ввода исходных данных с клавиатуры и файла на диске. Вывод предусмотреть в двух вариантах: файл либо принтер.

Для решения задачи предлагается создать три окна

Компоненты
Имя Компонента Свойства компонента Значение Назначение
Form1 Caption Учет индивидуальных домов Заголовок главной формы
Label1 Caption     Visible Для перехода в новую ячейку таблицы использовать клавишу «ENTER». При вводе данных в последнюю ячейку строки нажать «ENTER» и клавишу «СТРЕЛКА ВНИЗ» для перехода в другую строку False Справочная информация для пользователя программы   Строка подсказки невидима
Form1.StringGrid1 ColCount     FixedCol   FixedRow   Options: goFixedVertLine     goFixedHorzLine   goVertLine     goHorzLine   goEditing   goTabs   goAlwaysShowEditor     ScrollBars           True     True   True     True   True   True   True   ssBoth Количество столбцов по умолчанию Количество фиксированных слева столбцов   Количество фиксированных сверху строк   Опции: Разметка зафиксированных вертикальных линий Разметка зафиксированных горизонтальных линий Разметка вертикальных линий внутри таблицы Разметка горизонтальных линий внутри таблицы Признак допустимости редактирования содержимого ячеек таблицы.True ― редактирование разрешено. False ― запрещено Разрешает использование клавиши Tab для перемещения в другую ячейку   Признак нахождения компонента в режиме редактирования Выводятся обе полосы прокрутки
Form1.MainMenu N1 N2 N3 N4 N5   N6 N7 N8 N10   N1001     N11 N1003   N9 N1002 Ввод данных Клавиатура Файл Расчет Вывод результатов Файл Принтер Вывод Найти собственников, не уплативших налог за предыдущие годы Вывести информацию о домах, площадь которых превышает 100 кв. м Список должников Площадь больше 100 кв.м Список должников Площадь больше 100 кв.м Названия пунктов меню
OpenDialogs1 Name Od1 Имя компонента
SaveDialog1 Name SaveDialog1 Имя компонента
Form2 Caption Дома с площадью более 100 кв.м Заголовок формы
Form2.StringGrid1 Свойства аналогичны свойствам Form1.StringGrid1 (см. выше)
Label1 Caption   Поле вывода результата
Form2.Button1 Caption Закрыть Кнопка для закрытия окна “ Дома с площадью более 100 кв.м ”
Form3 Caption Должники Заголовок формы
Form3.StringGrid1 Свойства аналогичны свойствам Form1.StringGrid1 (см. выше)
Label1 Caption Список собственников, не уплативших налог на недвижимость в предыдущие годы, включая прошлый Справочная информация для пользователя программы
Label2 Caption   Поле для вывода результата
Form3.Button1 Caption Закрыть Кнопка для закрытия окна “Должники”
Для наглядности приведем структуру создаваемого главного меню:
 

Переменные и массивы

Обозначение в программе Содержание Тип
L количество домов с площадью более 100 кв.м целый
M количество должников целый
Delo_N массив номеров кадастровых дел   строковый длиной 4
Famil массив собственников индивидуальных домов строковый длиной 20
Adres массив адресов индивидуальных домов строковый длиной 30
S массив площадей индивидуальных домов вещественный
D массив дат последней уплаты налога на недвижимость Объект типа дата
n Счетчик объектов в файле или таблице целый
F Файловая переменная текстовый
NameFile Имя файла строковый длиной 20
DA День уплаты налога Целый беззнаковый
M Месяц уплаты налога Целый беззнаковый
Y Год уплаты налога Целый беззнаковый
i Счетчик строк, управляющая переменная в цикле Целый
TextToPrint Файловая переменная для вывода на принтер Системный текс

Текст модуля

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, Grids, DateUtils, StdCtrls, Unit2,Unit3, Printers;

// подключаются модули, связанные с 2-ой и 3-ей формами,

// библиотека функций и процедур работы с принтером

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

N10: TMenuItem;

N1001: TMenuItem;

StringGrid1: TStringGrid;

od1: TOpenDialog;

SaveDialog1: TSaveDialog;

N9: TMenuItem;

N1002: TMenuItem;

N11: TMenuItem;

N1003: TMenuItem;

Label1: TLabel;

procedure N8Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure N10Click(Sender: TObject);

procedure N1001Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure N1003Click(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure N1002Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

L:Integer;// количество домов с площадью более 100 кв.м

M:Integer;// количество должников

Delo_N:Array[1..1000] of String[4];// массив номеров кадастровых дел

Famil:Array[1..1000] of String[20]; ];{ массив собственников

индивидуальных домов}

Adres:Array[1..1000] of String[30];{ массив адресов индивидуальных домов}

S:Array[1..1000] of Real;// массив площадей индивидуальных домов

D:Array[1..1000] of TDate;{ массив дат последней уплаты налога на недвижимость}

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

// процедура закрывает главное окно — ВЫХОД

procedure TForm1.N8Click(Sender: TObject);

begin

Form1.Close;

end;

//активизация ввода с клавиатуры

procedure TForm1.N2Click(Sender: TObject);

begin

N2.Checked:= True;// ставится галочка напротив пункта Клавиатура

Label1.Visible:=True;// поле с подсказкой становится видимым

StringGrid1.SetFocus;// фокус переносится в таблицу StringGrid

StringGrid1.Options:= StringGrid1.Options + [goEditing];

// в StringGrid добавляется свойство,

// разрешающее редактирование ячеек

end;

// процедура ввода исходных данных из файла на диске

procedure TForm1.N3Click(Sender: TObject);

Var

n:integer;// счетчик объектов в файле

F:TextFile;// файловая переменная текстового типа

NameFile:String[20];// имя файла

DA,M,Y:Word;{ день, месяц, год последней уплаты

налога на недвижимость, в файле эти числа вводятся через пробел }

begin

N3.Checked:=True;// ставится галочка напротив пункта «Файл»

if not od1.Execute then Exit;// если в открывшемся списке

// не выбрано имя файла, то прекращается выполнение процедуры

NameFile:= od1.FileName;{ переменной имя_файла присваивается

имя, выбранное из списка}

AssignFile(F,NameFile);// процедура связывает файловую переменную

// и конкретный файл

Reset(F);// процедура открывает файл для чтения

// счетчик объектов инициализируется единицей

n:=1;

{пока не достигнут конец файла, из файла читаются построчно:

номер кадастрового дела, фамилия собственника, адрес дома, площадь, дата в виде трех чисел на одной строке. Данные одновременно выводятся в таблицу в главном диалоговом окне}

While Not(EoF(F)) Do // пока не достигнут конец файла, делать

Begin

Readln(F,Delo_N[n]); // из файла читается номер кадастрового дела

StringGrid1.Cells[1,n]:=Delo_N[n]; { номер кадастрового дела выводится в таблицу на 1 форме}

Readln(F,Famil[n]); // из файла читается фамилия собственника

StringGrid1.Cells[2,n]:=Famil[n];// фамилия выводится в форму на экран

Readln(F,Adres[n]); // читается адрес

StringGrid1.Cells[3,n]:=Adres[n];// адрес выводится в форму на экран

Readln(F,S[n]);// читается площадь

StringGrid1.Cells[4,n]:=FloatToStr(S[n]); {площадь выводится в таблицу на экране}

Readln(F,DA,M,Y);D[n]:=EncodeDate(Y,M,DA);{преобразование трех чисел в объект типа дата – массив дат}

StringGrid1.Cells[5,n]:=DateToStr(D[n]);// дата выводится в таблицу

n:=n+1;// счетчик объектов увеличивается на 1

{если количество строк в таблице на форме меньше n, то ему присваивается значение счетчика объектов }

if StringGrid1.RowCount < n then

StringGrid1.RowCount:= n;

End;

{после того как достигнут конец файла, файл закрывается}

CloseFile(F);

end;

{процедура выполняется при появлении диалогового окна (формы) на экране, связана с событием — создание формы}

procedure TForm1.FormCreate(Sender: TObject);

Var

n:Integer; // счетчик объектов в таблице

begin

// заполнение шапки таблицы нулевой строки

StringGrid1.Cells[0,0]:='Номер п/п';

StringGrid1.Cells[1,0]:='Номер кадастрового дела';

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

StringGrid1.Cells[3,0]:='Адрес';

StringGrid1.Cells[4,0]:='Общая площадь (кв.м)';

StringGrid1.Cells[5,0]:='Дата последней уплаты налога на недвижимость';

// цикл нумерации строк таблицы

For n:=1 to 1000 Do

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

end;

{Процедура, связанная с событием, нажатие клавиши в ячейке таблицы.

Проверяется правильность нажатия клавиш при вводе — «ENTER» (для перехода в ячейку справа) и последовательно клавиш «ENTER» и «СТРЕЛКА ВНИЗ» (для перехода на следующую строку). Здесь же происходит считывание данных из ячеек таблицы в массивы. Такая технология ввода позволила организовать ввод для заранее неизвестного количества данных.}

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

Begin

// если нажата клавиша «СТРЕЛКА ВНИЗ»

if Key = VK_DOWN then begin

// то если текущий номер строки таблицы меньше предыдущего

// значения количества строк в таблице, тогда ВЫХОД

if StringGrid1.Row < pred(StringGrid1.RowCount) then Exit;

// количество строк в таблице увеличивается на единицу

StringGrid1.RowCount:= StringGrid1.RowCount + 1;

StringGrid1.Col:= 1; // переход в начало строки

// если в первую ячейку текущей строки ничего не введено,

// то добавленная строка убирается

if (Length(StringGrid1.Cells[1,StringGrid1.Row]) = 0) then begin

StringGrid1.RowCount:=pred(StringGrid1.RowCount);Exit;

end;

end;

// если нажата клавиша «ENTER», то

if (Key = VK_RETURN) then begin

case StringGrid1.Col of

// если номер столбца таблицы равен 1 и если ячейка не пуста,

1: if (Length(StringGrid1.Cells[1,StringGrid1.Row]) > 0)

// тогда содержимое ячейки с индексом равным номеру текущей строки

// помещается в массив «Номер кадастрового дела»

then

Delo_N[StringGrid1.Row]:= StringGrid1.Cells[1,StringGrid1.Row]

// иначе количеству строк в таблице

// присваивается предыдущее значение и выход, т.е. программа будет

// ждать заполнения первой колонки в этой строке

else begin

StringGrid1.RowCount:=pred(StringGrid1.RowCount);Exit;

end;

// если текущий номер колонки таблице равен 2, то

// в массив собственников под номером равным номеру текущей строки // таблицы, помещается содержимое ячейки, стоящей на пересечении

// второго столбца и текущей строки

2: Famil[StringGrid1.Row]:= StringGrid1.Cells[2,StringGrid1.Row];

// аналогично предыдущему вводится адрес

3: Adres[StringGrid1.Row]:= StringGrid1.Cells[3,StringGrid1.Row];

// если четвертая колонка не пуста, то строка символов преобразуется

// в вещественное число и помещается в массив площадей домов

4: if Length(StringGrid1.Cells[4,StringGrid1.Row]) > 0 then

S[StringGrid1.Row]:=StrToFloat(StringGrid1.Cells[4,StringGrid1.Row])

// иначе в массив вводится число 0.00

else

S[StringGrid1.Row]:= 0.00;

// если пятая колонка не пуста, то строка символов преобразуется в дату

// и помещается в массив дат

5: if Length(StringGrid1.Cells[5,StringGrid1.Row]) > 0 then

D[StringGrid1.Row]:= StrToDate(StringGrid1.Cells[5,StringGrid1.Row])

// иначе в массив дат помещается 0

else

D[StringGrid1.Row]:= 0;

end;

// если текущий номер колонки меньше 5, то он увеличивается на 1

if StringGrid1.Col < 5 then

StringGrid1.Col:= StringGrid1.Col +1

end;

end;

{ процедура, связанная с пунктом меню «Найти собственников, не уплативших налог за предыдущие годы»}

procedure TForm1.N10Click(Sender: TObject);

Var

i,n:integer;

begin

// ставится галочка напротив пункта меню

// «Найти собственников, не уплативших налог за предыдущие годы»

N10.Checked:=True;

// подписывается шапка таблицы

Form3.StringGrid1.Cells[0,0]:='Номер по п/п';

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

Form3.StringGrid1.Cells[2,0]:='Дата последней уплаты налога на недвижимость';

i:=0;// — номер строки в таблице

{ В цикле последняя дата уплаты налога собственником дома сравнивается

с текущей датой, установленной на компьютере. Если разница превышает 1 год, собственник является должником. Фамилии должников выводятся в таблицу в третьей форме. Если дата неизвестна, то выводится сообщение: «нет сведений»}

For n:= 1 to pred(StringGrid1.RowCount) Do

// функция YearsBetween(D1,D2) находит разницу между двумя датами

IF YearsBetween(Date,d[n]) >= 1 then Begin

Inc(i); // i:=i+1;

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

Form3.StringGrid1.Cells[1,i]:=Famil[n];

if D[n]=0 then Form3.StringGrid1.Cells[2,i]:='нет сведений'

else

Form3.StringGrid1.Cells[2,i]:=DateToStr(D[n]);

Form3.StringGrid1.RowCount:=Form3.StringGrid1.RowCount+1

end;

// вывод количества должников

M:=i;

Form3.Label2.Caption:='Всего: '+ IntToStr(M)+' должников';

//показать форму 3

Form3.Show;

end;

{процедура, связанная с пунктом меню «Вывести информацию о домах, площадь которых превышает 100 кв.м»}

procedure TForm1.N1001Click(Sender: TObject);

Var n,i:Integer;

Begin

// поставить галочку напротив выбранного пункта меню

N1001.Checked:=True;

Form2.StringGrid1.Cells[0,0]:='Номер по п/п';

Form2.StringGrid1.Cells[1,0]:='Номер кадастрового дела';

Form2.StringGrid1.Cells[2,0]:='Фамилия И.О. собственника';

Form2.StringGrid1.Cells[3,0]:='Адрес';

Form2.StringGrid1.Cells[4,0]:='Общая площадь (кв.м)';

Form2.StringGrid1.Cells[5,0]:='Дата последней уплаты налога на недвижимость';

i:=0;

{ В цикле производится сравнение площадей всех домов со 100 кв.м. Если площадь дома превышает 100 кв.м, то вся информация о нем выводится в таблицу на форме 2}

For n:=1 to pred(Form1.StringGrid1.RowCount) Do

IF S[n]>100 Then Begin

Inc(i); // i:=i+1;

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

Form2.StringGrid1.Cells[1,i]:=Delo_N[n];

Form2.StringGrid1.Cells[2,i]:=Famil[n];

Form2.StringGrid1.Cells[3,i]:=Adres[n];

Form2.StringGrid1.Cells[4,i]:=FloatToStrF(S[n],ffFixed,10,2)+' кв.м';

if D[n]=0 then Form2.StringGrid1.Cells[5,i]:='нет сведений'

else

Form2.StringGrid1.Cells[5,i]:=DateToStr(D[n]);

Form2.StringGrid1.RowCount:=Form2.StringGrid1.RowCount+1

end;

L:=i;

Form2.Label1.Caption:='Всего домов площадью более 100 кв.м:'+IntToStr(L);

Form2.Show;

end;

{процедура, связанная с пунктом меню «Вывод в файл» — список должников}

procedure TForm1.N11Click(Sender: TObject);

Var f:TextFile;

NameFile:String;

i:Integer;

begin

N11.Checked:=True;

{Если из панели диалога не выбрано или не задано имя файла сохранения, то выход. Т.е. панель диалога будет находится на экране, пока пользователь не задаст имя файла.}

if not SaveDialog1.Execute then Exit;

// переменной ИмяФайла присваивается имя файла,

// заданное в панели диалога

NameFile:=SaveDialog1.FileName;

// устанавливается физическая связь между файловой переменной

// и конкретным файлом на внешнем носителе

AssignFile(f,NameFile);

// открыть файл для записи

Rewrite(f);

// в следующем фрагменте программы информация о должниках

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

Writeln (f,'список должников:');

Writeln (f,'Номер п/п ','Фамилия И.О. собственника',

' Дата последней уплаты налога на недвижимость');

For i:=1 To M do

Writeln (f,Form3.StringGrid1.Cells[0,i]:4,Form3.StringGrid1.Cells[1,i]:30,' ',

Form3.StringGrid1.Cells[2,i]:30);

// закрытие файла

CloseFile(f);

end;

{процедура, связанная с пунктом меню «Вывод в файл» — список домов с площадью более 100 кв.м}

procedure TForm1.N1003Click(Sender: TObject);

Var f:TextFile;

NameFile:String;

i:Integer;

begin

N1003.Checked:=True;

// если не задано имя файла в панели диалога,

// панель диалога остается на экране

if not SaveDialog1.Execute then Exit;

// переменной ИмяФайла присваивается имя файла,

// заданное в панели диалога

NameFile:=SaveDialog1.FileName;

// устанавливается физическая связь между файловой переменной

// и конкретным файлом на внешнем носителе

AssignFile(f,NameFile);

// открыть файл для записи

Rewrite(f);

// в следующем фрагменте программы информация о домах с площадью

// более 100 кв.м из формы 2 записывается в файл

Writeln (f,'Дома с площадью более 100 кв. м:');

Writeln (f,'Номер п/п ','Номер кадастрового дела ',

'Фамилия И.О. собственника ', ' Адрес ',

'Общая площадь (кв.м) ', 'Дата последней уплаты налога на недвижимость');

For i:=1 To L do

Writeln (f,Form2.StringGrid1.Cells[0,i]:4,Form2.StringGrid1.Cells[1,i]:20,' ',

Form2.StringGrid1.Cells[2,i]:30,' ',Form2.StringGrid1.Cells[3,i]:30,

Form2.StringGrid1.Cells[4,i]:16,' ',Form2.StringGrid1.Cells[5,i]:20);

CloseFile(f);

end;

{процедура, связанная с пунктом меню «Вывод на принтер» — список должников}

procedure TForm1.N9Click(Sender: TObject);

Var TextToPrint:System.Text;

i:integer;

begin

N9.Checked:=True;

// устанавливается физическая связь с печатающим устройством

AssignPrn(TextToPrint);

// открытие для вывода

Rewrite(TextToPrint);

// в следующем фрагменте осуществляется вывод списка должников

// из формы 3 на принтер

Writeln (TextToPrint,'список должников:');

Writeln (TextToPrint,'Номер п/п ','Фамилия И.О.',

' Дата последней уплаты ');

Writeln (TextToPrint,' ','собсвенника',

' налога на недвижимость ');

For i:=1 To M do

Writeln (TextToPrint,Form3.StringGrid1.Cells[0,i]:4,

Form3.StringGrid1.Cells[1,i]:30,' ',Form3.StringGrid1.Cells[2,i]:30);

System.Close(TextToPrint);

end;

{процедура, связанная с пунктом меню «Вывод на принтер» — список домов с площадью более 100 кв.м}

procedure TForm1.N1002Click(Sender: TObject);

Var TextToPrint:System.Text;

i:integer;

begin

N1002.Checked:=True;

// ассоциация с принтером

AssignPrn(TextToPrint);

// открытие для вывода

Rewrite(TextToPrint);

// в следующем фрагменте осуществляется вывод списка

// домов с площадью более 100 кв.м из формы 2 на принтер

Writeln (TextToPrint,'Дома с площадью более 100 кв. м:');

Writeln (TextToPrint,'N п/п','Номер кад. дела ',

'Фамилия И.О.собств.',' Адрес ',

'Общ. площ.(кв.м)','Дата посл. Уплаты налога на недвижимость');

For i:=1 To L do

begin

Writeln (TextToPrint,Form2.StringGrid1.Cells[0,i]:4,

Form2.StringGrid1.Cells[1,i]:20,' ',Form2.StringGrid1.Cells[2,i]:20,' ',

Form2.StringGrid1.Cells[3,i]:40,Form2.StringGrid1.Cells[4,i]:16,' ',

Form2.StringGrid1.Cells[5,i]:20);

end;

System.Close(TextToPrint);

end;

end.

{модуль Unit2 связан с формой Form2, куда выводится список домов с площадью превышающей 100 кв.м}

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type

TForm2 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

Label1: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);

begin

Form2.Close

end;

end.

{модуль Unit3 связан с формой Form3, куда выводится список должников по уплате налога на недвижимость}

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

TForm3 = class(TForm)

Label1: TLabel;

StringGrid1: TStringGrid;

Button1: TButton;

Label2: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);

begin

Form3.Close

end;

end.

Вид некоторых диалоговых окон во время работы программы

Файл с исходной информацией удобнее подготовить с помощью стандартной программы «Блокнот». Каждое поле записи набирается на отдельной строке. Десятичный разделитель — точка. Дата уплаты налога в файле набирается в виде трех чисел на одной строке через пробел. Для приведенного выше примера файл с исходными данными выглядит так:

Задача

Составить программу, которая записывает в файл введенные пользователем данные о результатах экзаменов, формируя таким образом простую базу данных. Исходные данные вводятся в поля диалогового окна и сохраняются в файле, компонентами которого являются записи типа TOzenka.

unit apprec_;

……………………….

// тип оценки

TKind = (NeUd, Ud, Hor,Otl);

// запись файла

TOzenka=record

Facultet: string[20]; // факультет

Predmet: string[20]; // предмет

person: string[40]; // студент

Oz: TKind; // оценка

end;

var

Form1: TForm1;

f: file of TOzenka; // файл записей – база данных

implementation

{$R *.DFM}

// активизация формы

procedure TForm1.FormActivate(Sender: TObject);

var

resp: word; // ответ пользователя

begin

AssignFile(f, 'D:\Ozenki.db');

{$I-}

Reset(f); // открыть файл

Seek(f, FileSize(f)); // указатель записи в конец файла

{$I+}

if IOResult = 0

then button1.enabled:=TRUE // теперь кнопка «Добавить» доступна

else

begin

resp:=MessageDlg('Файл базы данных не найден.'+

' создать новую БД?',mtInformation,[mbYes,mbNo],0);

if resp = mrYes then

begin

{$I-}

rewrite(f);

{$I+}

if IOResult = 0

then button1.enabled:=TRUE

else ShowMessage('Ошибка создания БД.');

end;

end;

end;

// щелчок на кнопке «Добавить»

procedure TForm1.Button1Click(Sender: TObject);

var

Ozenka: TOzenka;

oz:TKind;

begin

with Ozenka do

begin

Facultet:= ComboBox1.Text;

Predmet:= ComboBox2.Text;

person:= Edit1.Text;

case RadioGroup1.ItemIndex of

0: oz:= NeUd;

1: oz:= Ud;

2: oz:= Hor;

3: oz:= Otl;

end;

end;

write(f,Ozenka); // записать содержимое полей записи в файл

end;

// завершение работы программы

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

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

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.Close

end;

end.

Так выглядит форма в процессе выполнения программы:

Задача

Составить программу, которая читает и обрабатывает данные, записанные в файл программой Добавление записи в файл, и, в зависимости от того, какой из переключателей — все или — выбрать выбран, выводит список оценок, полученных студентами всех факультетов или факультета, название которого введено в поле «Факультет».

unit rdrec_;

…………….

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

type

// тип оценки

TKind = (NeUd,Ud,Hor,Otl);

// запись файла

TOzenka = record

Facultet:string[20];

Predmet:string[20];

person:string[40];

kind:TKind;

end;

var

f: file of TOzenka; // файл записей

rec: TOzenka; // запись, прочитанная из файла

n: integer; // количество записей, удовлетворяющих запросу

st: string[80];

begin

AssignFile(f,'D:\ozenki.db');

{$I-}

Reset(f); //открыть файл для чтения

{$I-}

if IOResult <> 0 then

begin

ShowMessage('Ошибка открытия файла БД.');

Exit;

end;

Memo1.Clear; // очистить список поля Memo

// обработка БД

if RadioButton2.Checked then

Memo1.Lines.Add('*** ' + ComboBox1.Text + ' ***');

n:= 0;

while not EOF(f) do

begin

read(f, rec); // прочитать запись

if RadioButton1.Checked or

(rec.facultet = ComboBox1.Text) then

begin

n:= n + 1;

st:= rec.person+ ', ' + rec.predmet;

if RadioButton1.Checked then

st:= st + ', '+ rec.facultet;

case rec.kind of

NeUd: st:= st+ ', неудовлетворительно ';

Ud: st:= st+ ', удовлетворительно';

Hor: st:= st+ ', хорошо';

Otl: st:= st+ ', отлично';

end;

Memo1.Lines.Add(st);

end;

end;

CloseFile(f);

if n = 0 then

ShowMessage('В БД нет запрашиваемой информации.');

end;

// переключатель «Выбрать»

procedure TForm1.RadioButton2Click(Sender: TObject);

begin

Label1.Enabled:= True;

ComboBox1.Enabled:= True;

// теперь поля Факультет доступно

ComboBox1.SetFocus; // курсор в поле «Факультет»

end;

// переключатель «Все»

procedure TForm1.RadioButton1Click(Sender: TObject);

begin

Label1.Enabled:= False;

ComboBox1.Enabled:= False;

// теперь поле «Факультет» не доступно

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Form1.Close

end;

end.

Возможный вариант решения:





Дата публикования: 2014-11-02; Прочитано: 481 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.116 с)...