![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
На практике мы часто сталкиваемся с задачами, где используются данные, состоящие из других данных. Например, информация о студентах может состоять не только из фамилии и инициалов, паспортных данных, номера группы, но и оценок, полученных на экзаменах. Для работы с такой информацией в 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!