Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. 2006 г. - 1152 с.
Оголошення запису
Як будь-який тип, що створюється програмістом, тип "запис" повинен бути оголошений в розділі type. У загальному вигляді оголошення типу "запис" виглядає так:
type <ім'я типу> = record
<ім'я поля1>:<тип>;
..................
<ім'я поляN>:<тип>;
end;
var <ім'я змінної>:<ім'я типу>;
де:
· Ім'я — ім'я типу "запис";
· record — зарезервоване слово мови Delphi, що означає, що далі слідує оголошення компонентів (полів) запису;
· поле_i і тип_i — ім'я і тип i-го компоненту (поля) запису, де i=1 ..., до;
· end — зарезервоване слово мови Delphi, що означає, що список полів закінчений.
Приклади оголошень:
Type
TPerson = record
FName: string[20];
LName: 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.FName + #13 + 'Адреса: ', student.address);
виводить на екран вміст полів f_name (ім'я) і address (адреса) змінній-запису student.
Іноді тип змінної-запису оголошують безпосередньо в розділі оголошення змінних. В цьому випадку тип запису указується відразу за ім'ям змінної, через двокрапку. Наприклад, запис student може бути оголошена в розділі var таким чином:
student: record
FName:string[20];
LName: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 // інформація про студента
FName: string[30]; // прізвище
LName: string[20]; // ім'я
address: string[50]; // адреса
End;
і дані про студента знаходяться в полях Edit1, Edit2 і Edit3 діалогового вікна, то замість інструкцій
student.FName := Edit1.text;
student.LName := Edit2.text;
student.address := Edit3.text;
можна записати:
with student do begin
FName := Edit1.text;
LName := Edit2.text;
address := Edit3.text;
End;
7.3. Введення і виведення записів у файл
Запису можна зберігати у файлі. Для того, щоб програма могла зберегти значення змінної-запису у файлі або ввести його з файлу, необхідно оголосити файл, вказавши як тип його компонентів тип "запис". Наприклад, інструкції:
type Треrson = record FName: string [20] ; LName: string[20]; address: string[50]; end; var f: file of TPerson; |
оголошують файл, компонентами якого є записи типу TPerson.
Процес роботи з файлом записів практично нічим не відрізняється від процесу роботи із звичайним файлом. Спочатку треба оголосити файлову змінну і за допомогою процедури Assign пов'язати цю змінну з конкретним файлом. Потім потрібно відкрити файл (для читання, запису або оновлення). Після цього можна прочитати запис з файлу або записати запис у файл.
Виведення запису у файл
Розглянемо програму, яка записує у файл введені користувачем дані про результати змагань, формуючи, таким чином, просту базу даних. Початкові дані вводяться в поля діалогового вікна (мал. 8.1) і зберігаються у файлі, компонентами якого є записи типу TOCinka.
Мал. 7.1.Вікно програми Додавання записів у файл
Для введення прізвища cтудента застосовується поле редагування (компонент 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 | Ознака спадкоємства властивостей шрифту батьківської форми | ||
Список, який з'являється в результаті клацання на кнопці розкриття списку, може бути сформований як в процесі розробки форми додатку, так і під час роботи програми. Щоб сформувати список під час розробки форми, потрібно у вікні ObjectInspectorвибрати властивість Items,клацнутина кнопці активізації редактора списку рядків (кнопка з трьома крапками) і ввести елементи списку (мал. 7.3).
Мал. 7.3.Введення списку для компоненту ComboBox1 та ComboBox2під час створення форми додатку
Повний текст програми приведений в лістингу 7.1.
Лістинг 7.1. Додавання записів у файл
unit AddRecord;
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);
TOcinka=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 IOResult = 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.ItemIndex of
0: ball := NEZADOV;
1: ball := ZADOV;
2: ball := DOBRE;
3:ball := VIDMIN;
End;
End;
write(f,ocinka); // записати вміст полів запису у файл
End;
// завершення роботи програми
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
Begin
CloseFile(f); // закрити файл
End;
End.
У представленій програмі процедура TForm1.FormActivate відкриває файл бази даних для додавання. Тут слід звернути увагу на те, як це реалізовано. Процедуру AppendFile, яка відкриває файл для додавання в кінець, використовувати не можна, оскільки файл не є текстовим. Тому файл спочатку відкривається процедурою Rewrite в режимі перезапису, а потім процедура Seek встановлює покажчик читання/запису в кінець файлу. Параметром процедури seek є функція Filesize, значення якої рівне розміру файлу (у байтах).
Процедура TForm1.Button1Click, яка запускається натисненням кнопки Додати(Button1), виконує безпосереднє додавання запису у файл. Поля NumberGroup і NazvaPredmt запису, що додається, заповнюються з властивості Text комбінованих списків Номер - назва групи(СomboBox1) і Назва предмету (ComboBox2).
Поле fName формованого запису заповнюється з поля введення Прізвище студента(компонент Edit1), а вміст поля ball визначається вибраною кнопкою компонентуRadioGroup1.
Процедура TForm1. FormClose закриває файл бази даних оскільки типTOCinka використовується двома процедурами (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 ReadRec;
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}
Type
TBall = (NEZADOV, ZADOV, DOBRE, VIDMIN); // тип оцінки
TOcinka=record // запис файлу
NumberGroup: string[80]; // номер- назва групи
NazvaPredmt: string[100]; // назва предмету
FName: string[40]; // студент
ball: TBall; // оцінка
End;
procedure TForm1.Button1Click(Sender: TObject) ;
Var
f: file of TOcinka; // файл записів
rec: TOcinka; // запис, прочитаний з файлу
n: integer; // к-ть записів, що задовольняють запиту
st: string[80];
Begin
AssignFile(f,'c:\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.
Питання:
1. Що таке запис?
2. Як створити запис?
3. Як записати запис у файл?
4. Як зчитати запис з файлу?
Література:
Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. 2006 г. - 1152 с.
2. Архангельский А.Я. Delphi 2006. Справочное пособие: язык Delphi, классы, функции Win32 и .NET, 2006 г. - 1152 с.