Лекція №9
З курсу: «Застосування засобів ООП в лінгвістичних задачах»


Розділ 7. Запис
У практиці програмування досить часто доводиться мати справу
даними, які природним чином складаються з інших даних. Наприклад,
відомості про учня містять прізвище, ім'я, по батькові, число, місяць і рік
народження, домашню адресу і інші дані. Для представлення подібної
інформації в мові Delphi використовується структура, яка носить назву
запис (record).
З одного боку, запис можна розглядати як єдину структуру, а з іншої —
як набір окремих елементів, компонентів. Характерною особливістю запису
є те, що складові її компоненти можуть бути різного типу. Інша особливість
запису полягає в тому, що кожен компонент запису має ім'я.
Отже, запис — це структура даних, що складається з окремих
іменованих компонентів різного типу, званих полями.

7.1. Оголошення запису
Як будь-який тип, що створюється програмістом, тип "запис" повинен
бути оголошений в розділі type. У загальному вигляді оголошення типу
"запис" виглядає так:
Ім'я = record
Поле_1 : Тип_1;
Поле_2 : Тип_2;
Поле_к :
Тип_к;
end;
де:
Ім'я — ім'я типу "запис";
record — зарезервоване слово мови Delphi, що означає, що далі
слідує оголошення компонентів (полів) запису;
поле_i і тип_i — ім'я і тип i-го компоненту (поля) запису, де i=1 ...,
до;
end — зарезервоване слово мови Delphi, що означає, що список
полів закінчений.
Приклади оголошень:

type
TPerson = record
f_name: string[20];
l_name: string[20];
day: integer;
month: integer;
year: integer;
address: string[50];
end;
TDate = record
day: integer; month: integer; year: integer;
end;
Після оголошення типу запису можна оголосити змінну-запис (або
просто запис), наприклад:
var
student : TPerson;
birthday : TDate;
Для того, щоб дістати доступ до елементу (полю) змінної-запису
(записи), потрібно вказати ім'я запису і ім'я поля, розділивши їх крапкою.
Наприклад, інструкція
ShowMessage('Ім'я: ', student.f_name + #13 + 'Адреса: ', student.address);
виводить на екран вміст полів f_name (ім'я) і address (адреса)
змінній-запису student.
Іноді тип змінної-запису оголошують безпосередньо в розділі
оголошення змінних. В цьому випадку тип запису указується відразу за
ім'ям змінної, через двокрапку. Наприклад, запис student може бути
оголошена в розділі var таким чином:
student: record
f_name:string[20];
l_name:string[20];
day:integer;
month:integer;
year:integer;
address:string[50];
end;


7.2. Інструкція with
Інструкція with дозволяє використовувати в тексті програми імена
полів без вказівки імені змінної-запису. У загальному вигляді інструкція

with виглядає таким чином:
with Ім'я do
begin
( інструкції програми }
end;
де:
ім'я — ім'я змінної-запису;
with — зарезервоване слово мови Delphi, що означає, що далі, до
слова end, при зверненні до полів запису ім'я, ім'я запису можна не
указувати.
Наприклад, якщо в програмі оголошений запис
student:record // інформація про студента
f_name: string[30]; // прізвище
l_name: string[20]; // ім'я
address: string[50]; // адреса
end;
і дані про студента знаходяться в полях 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; f_name := Edit2.text; address := Edit3.text;
end;

7.3. Введення і виведення записів у файл
Запису можна зберігати у файлі. Для того, щоб програма могла
зберегти значення змінної-запису у файлі або ввести його з файлу,
необхідно оголосити файл, вказавши як тип його компонентів тип "запис".
Наприклад, інструкції
type
Треrson = record
f_riame: string [20] ;

l_name: string[20];
address: string[50];
end;
var
f: file of TPerson;
оголошують файл, компонентами якого є записи типу TPerson.
Процес роботи з файлом записів практично нічим не відрізняється від
процесу роботи із звичайним файлом. Спочатку треба оголосити файлову
змінну і за допомогою процедури Assign пов'язати цю змінну з конкретним
файлом. Потім потрібно відкрити файл (для читання, запису або
оновлення). Після цього можна прочитати запис з файлу або записати
запис у файл.

7.4. Виведення запису у файл
Розглянемо програму, яка записує у файл введені користувачем дані
про результати змагань, формуючи, таким чином, просту базу даних.
Початкові дані вводяться в поля діалогового вікна (мал. 8.1) і зберігаються
у файлі, компонентами якого є записи типу TOCinka.

Мал. 7.1. Вікно програми Додавання записів у файл
Для введення прізвища спортсмена застосовується поле редагування
(компонент Edit). Для введення назви виду спорту і країни
використовуються компоненти ComboBox (комбінований список).

Компонент ComboBox, значок якого знаходиться на вкладці Standard
(мал. 7.2), дає можливість ввести дані або безпосередньо в поле введення-
редагування, або шляхом вибору із списку, який з'являється в результаті
клацання на кнопці списку, що розкривається.

Мал. 7.2. Значок компоненту ComboBox В табл. 8.1 перераховані
властивості компоненту ComboBox.
Таблиця 7.1. Властивості компоненту ComboBox





Властивість
Визначає


Name
Ім'я компоненту. Використовується для доступу
до властивостей компоненту


Text
Текст, що знаходиться в полі введення-
редагування


Items
Елементи списку, що розкривається


DropDownCount
Кількість елементів, що відображаються, в
розкритому списку


Left
Відстань від лівої межі компоненту до лівої межі
форми


Top
Відстань від верхньої межі компоненту до
верхньої межі форми


Height
Висоту компоненту (поля введення-
редагування)


Width
Ширину компоненту


Font
Шрифт, використовуваний для відображення
елементів списку


ParentFont
Ознака спадкоємства властивостей шрифту
батьківської форми






Список, який з'являється в результаті клацання на кнопці розкриття
списку, може бути сформований як в процесі розробки форми додатку, так
і під час роботи програми. Щоб сформувати список під час розробки
форми, потрібно у вікні Object Inspector вибрати властивість Items,
клацнути на кнопці активізації редактора списку рядків (кнопка з трьома
крапками) і ввести елементи списку (мал. 7.3).







Мал. 7.3. Введення списку для компоненту ComboBox1 та ComboBox2
під час створення форми додатку
Повний текст програми приведений в лістингу 7.1.
Лістинг 7.1. Додавання записів у файл
unit аррrес_;
interface
uses
Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit; //студент
ComboBox1: TComboBox; // назва номер групи
ComboBox2: TComboBox; // назва предмету
RadioGroup1: TRadioGroup; // оцінка
Button1: TButton; // кнопка Додати
Label3: TLabel;
Label4: TLabel;

procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
// тип оцінкиі
TBall = (NEZADOV, ZADOV, DOBRE, VIDMIN);
TOcinkal=record // запис файлу
NumberGroup: string[80]; // номер назва групи
NazvaPredmt: string[100]; // назва предмету
fName: string[40]; // студент
ball: TBall; // оцінка
end;
var
Form1: TForm1;
f: file of TOcinka; // файл записів — база даних
implementation
{$R *.DFM}
// активізація форми
procedure TForm1.FormActivate(Sender: TObject);
var
resp : word; // відповідь користувача
begin
AssignFile(f, 'c\ocinka.db');
{$I-}
Reset (f); // відкрити файл
Seek(f, FileSize(f)); // покажчик запису в кінець файлу
{$I!+}
if IOResult = 0

then Button1.Enabled:=TRUE // тепер кнопка Додати доступна
else begin
resp:=MessageDlg('Файл бази даних не знайдений.'
+ 'Створити нову БД?', mtlnformation,[mbYes,mbNo],0);
if resp = mrYes then
begin
{$I-}
rewrite(f);
{$I+}
if lOResult = 0
then Button1.Enabled:=TRUE
else ShowMessage('Помилка створення файлу БД.');
end; end;
end;
procedure Tform1.Button1Click(Sender: TObject); // клацання на кнопці Додати
var ocinka: TOcinka;
begin
with ocinka do begin
NumberGroup := ComboBox1.Text; NazvaPredmt := ComboBox2.Text;
fName := Edit1.Text;
case RadioGroup1.Itemlndex of
0: ball := NEZADOV;
1: ball := ZADOV;
2: ball := DOBRE;
3:ball := VIDMIN;
end;
end;
write(f,medal); // записати вміст полів запису у файл
end;
// завершення роботи програми
procedure TForm1.FormClose(Sender: TObject;
var

Action: TCloseAction);
begin
CloseFile(f); // закрити файл
end;
end.
У представленій програмі процедура TForm1.FormActivate відкриває
файл бази даних для додавання. Тут слід звернути увагу на те, як це
реалізовано. Процедуру AppendFile, яка відкриває файл для додавання в
кінець, використовувати не можна, оскільки файл не є текстовим. Тому
файл спочатку відкривається процедурою Rewrite в режимі перезапису, а
потім процедура Seek встановлює покажчик читання/запису в кінець
файлу. Параметром процедури seek є функція Filesize, значення якої рівне
розміру файлу (у байтах).
Процедура TForm1.Button1Click, яка запускається натисненням
кнопки Додати (Button1), виконує безпосереднє додавання запису у
файл. Поля country і sport запису, що додається, заповнюються з
властивості Text комбінованих списків Номер назва групи (СomboBox1)
і Назва предмету (ComboBox2).
Поле fName формованого запису заповнюється з поля введення
Прізвище студента (компонент Edit1), а вміст поля ball визначається
вибраною кнопкою компоненту RadioGroup1.
Процедура TForm1. FormClose закриває файл бази даних оскільки
тип TMedal використовується двома процедурами (TForm1.FormActivate і
TForm1.Button1Сlick), то його опис поміщений в розділ type модуля
форми. Оголошення файловій змінній f з цієї ж причини поміщене в розділ
оголошення змінних модуля форми.
У приведеному варіанті програми передбачається, що списки номера
групи і назв предметів формуються за допомогою редактора списку рядків
під час розробки форми. Разом з тим, список можна сформувати під час
розробки програми. Для цього треба до властивості items застосувати
метод Add. Наприклад, список номерів груп може бути сформований за
допомогою наступних інструкцій (їх потрібно помістити в процедуру
Tform1.FormActivate):
Form1.ComboBox1.Item.Add('ПРЛс-11');
Form1.ComboBox1.Item.Add('ПРЛс-12');
Form1.ComboBox1.Item.Add('ПРЛс-13');
Form1.ComboBox1.Item.Add('ПРЛм-11');
Form1.ComboBox1.Item.Add('ПРЛм-12');

7.5. Зчитування записів з файлу
Розглянемо програму, що демонструє процес читання і обробки записів
файлу. Програма Зчитування записів з файлу, діалогове вікно якої
представлене на мал. 7.4, а текст — в лістингу 7.2, відкриває файл,
сформований програмою Додавання записи у файл, і, залежно від того,
який з перемикачів все або вибрати — встановлений, виводить список
оцінок, відповідно представниками всіх груп або групи, назва якої введена
в поле Номер, назва групи. Для виведення результату читання з файлу
використовується компонент Memo1.
У табл. 7.2 приведені значення властивостей компонентів форми.
Оскільки компонент Memo1 призначений тільки для проглядання
інформації, то властивості Readonly (тільки читання, перегляд)
привласнено значення True. Властивість scrollBars (смуги прокрутки)
компоненту Memo дозволяє задавати смуги прокрутки, що відображаються.
За умовчанням властивості scrollBars привласнено значення ssNone, тобто
смуги прокрутки не відображаються. У даному прикладі виводиться
вертикальна смуга, тому властивості ScrollBars привласнено значення
ssVertical.
Таблиця 7.2. Значення властивостей компонентів





Властивість
Значення


RadioButton1 . Checked
True


Label1 .Enabled
False


ComboBox1 . Enabled
False


Memo1 . Readonly
True


Memo1. ScroiiBars
ssVertical





Для введення назви номеру групи використовується компонент
ComboBox1, що дозволяє задавати номер-назву групи не тільки прямим
введенням назви, але і вибором із списку. Список номер-назву групи
потрібно сформувати під час створення форми шляхом привласнення
значення властивості items.
Щоб відразу після запуску програми список вибору номер-назву групи
був недоступний (оскільки вибраний перемикач всі групи Показати),
властивості Enabled компонентів ComboBox1 і Label1 під час створення
форми потрібно привласнити значення False.
Список введення-вибору назви номер-назву групи (ComboBox1) стає
доступним в результаті вибору під час роботи програми перемикача

вибрати. Процедура обробки події Onclick на перемикачі RadioButton2
робить доступним поле ComboBox1.

Мал. 7.4. Вікно програми Зчитування записів з файлу
Лістинг 7.2. Зчитування записів з файлу
unit rdrec_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
RadioButton1: TRadioButton; // перемикач Все
RadioButton2: TRadioButton; // перемикач Вибрати
// текст номер групи
Button1: TButton;
GroupBox1: TGroupBox;
Label1: TLabe1;
procedure Button1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
ComboBox1: TComboBox; // комбінований список
// для введення назви номера групи
Memo1: TMemo; // поле виведення записів, що задовольняють

// умові запиту
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject) ;
type
TBall = (NEZADOV, ZADOV, DOBRE, VIDMIN); // тип оцінки
TOcinkal=record // запис файлу
NumberGroup: string[80]; // номер- назва групи
NazvaPredmt: string[100]; // назва предмету
fName: string[40]; // студент
ball: TBall; // оцінка
end;
var
f: file of TOcinkal; // файл записів
rec: TOcinka; // запис, прочитаний з файлу
n: integer; // к-ть записів, що задовольняють запиту
st: string[80];
begin
AssignFile(f,'a:\ocinka.db');
{$I-}
Reset (f); // відкрити файл для читання
{$I-}
if IOResult <> 0 then begin
ShowMessage('Помилка відкриття файлу БД.');
Exit;

end;
// обробка БД
if RadioButton2.Checked then
Memo1.Lines.Add('*** ' + ComboBox1.Text + ' ***');
n := 0;
Memo1.Clear; // очистити список поля Memo
while not EOF(f) do begin
read(f, rec); // прочитати запис
if RadioButton1.Checked or
(rec.NumberGroup = ComboBox1.Text) then begin
n := n + 1;
st := rec.fName+ ', ' + rec.NazvaPredmt;
if RadioButton1.Checked then
st := st + ', '+ rec.NumberGroup;
case rec.ball of
VIDMIN: st := st+ ', відмінно';
DOBRE:st := st+ ', добре';
ZADOV:st := st+ ', задовільно';
NEZADOV: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;
end.
Процедура TForm1.Button1Click відкриває файл і послідовно
прочитує записи, що знаходяться в нім. Вміст запису додається в полі
Memo1, якщо прочитаний запис задовольняє умові запиту, тобто вміст
поля NumberGroup співпадає з назвою номер-назва групи, введеним
користувачем в полі редагування компоненту ComboBox1, або якщо
вибраний перемикач RadioButton1.
Інформація в полі Memo додається інструкцією Memo1.Lines.Add(st),
яка є інструкцією застосування методу Add (Додати) до компоненту
Memo1.
Примітка
Поняття "метод" ми розлядали детально розглядали, в розділі,
присвяченому об'єктно-орієнтованому програмуванню. Зараз тільки
скажемо, що метод— це процедура, інструкція виклику якої записується
особливим чином з метою показати, що одним з її параметрів є об'єкт.