Архангельский А.Я. Программирование в 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 с.