Настройка компоненту TDataSource

Архітектура приложень баз даних

Приложення баз даних, як слід вже з його назви, призначене для взаємодії з деяким джерелом даних — базою даних (БД). Взаємодію має на увазі отримання даних, їх уявлення в певному форматі для перегляду користувачем, редагування відповідно до реалізованих в програмі бизнес- алгоритмами і повернення оброблених даних назад в базу даних.

Як джерело даних можуть виступати як власне бази даних, так і звичайні файли — текстові, електронні таблиці і так далі Але тут ми розглядатимемо приложення, що працюють з базами даних.

Бази даних обслуговуються спеціальними програмами — системами управління базами даних (СУБД), які діляться на локальних, переважно однопользовательские, призначені для настільних приложень, і серверні — мережеві (часто видалені), многопользовательские, функціонують на виділених комп'ютерах — серверах. Головний критерій такої класифікації — об'єм бази даних і середнє навантаження на СУБД.

Само приложення включає механізм отримання і відправки даних, механізм внутрішнього представлення даних в тому або іншому вигляді, призначений для користувача інтерфейс для відображення і редагування даних, бізнес-логіку для обробки даних.

Механізм отримання і відправки даних забезпечує з'єднання з джерелом даних (часто опосередковано). Він повинен "знати", куди йому звертатися і який протокол обміну використовувати для забезпечення двонаправленого потоку даних.

Як працює приложення баз даних

У Репозіторії Delphi відсутній окремий шаблон для приложення баз даних. Тому, як і будь-яке інше приложення Delphi, приложення баз даних починається із звичайної форми. Безумовно, це виправданий підхід, оскільки приложення баз даних має призначений для користувача інтерфейс. І цей інтерфейс створюється з використанням стандартних і спеціалізованих візуальних компонентів на звичайних формах.

Візуальні компоненти відображення даних розташовані на сторінці Data ControlsПалітри компонентів. У більшості вони є модифікаціями стандартних елементів управління, пристосованих для роботи з набором даних.

Приложення може містити довільне число форм і використовувати будь-який інтерфейс (MDI або SDI). Зазвичай одна форма відповідає за виконання групи однорідних операцій, об'єднаних загальним призначенням.

Модуль даних

Для розміщення компонентів доступу до даних в приложенні баз даних бажано використовувати спеціальну "форму" — модуль даних (клас TDataModule). Звернете увагу, що модуль даних не має нічого загального із звичайною формою приложення, адже його безпосереднім предком є клас TComponent. У модулі даних можна розміщувати тільки невізуальні компоненти. Модуль даних доступний розробникові, як і будь-який інший модуль проекту, на етапі розробки. Користувач приложення не може побачити модуль даних під час виконання.

Для створення модуля даних можна скористатися Репозиторієм об'єктів або головним меню Delphi. Значок модуля даних Data Moduleрозташований на сторінці New.

Як вже мовилося, модуль даних має мало загального із стандартною формою, хоч би тому, що клас TDataModule походить безпосередньо від класу TComponent. У нього майже повністю відсутні властивості і методи-обробники подій, адже від платформи для інших невізуальних компонентів майже нічого не потрібне, хоча нащадки модуля даних, що працюють в розподілених приложеннях, виконують вельми важливу роботу.

Для створення структури (моделі, діаграми) даних, з якою працює приложення, можна скористатися можливостями, що надаються сторінкою DiagramРедактора коди. Будь-який елемент з ієрархічного дерева компонентів модуля даних можна перенести на сторінку діаграми і задати зв'язки між ними.

За допомогою кнопок, що управляють, можна задавати між елементами діаграми відношення синхронного перегляду і главный/подчиненный. При цьому проводиться автоматична настройка властивостей відповідних компонентів.

Для створення модуля даних можна скористатися Репозиторієм об'єктів або головним меню Delphi. Значок модуля даних Data Moduleрозташований на сторінці New.

Для звернення компонентів доступу до даних, розташованих в модулі даних, з інших модулів проекту необхідно включити ім'я модуля в секцію uses:

unit InterfaceModule;

...

implementation

uses DataModule;

...

DataModule.Tablel.Open;

...

Перевагою розміщення компонентів доступу до даним в модулі даних є те, що зміна значення будь-якої властивості виявиться відразу ж у всіх звичайних модулях, до яких підключений цей модуль даних. Окрім цього, всі обробники подій цих компонентів, тобто вся логіка роботи з даними приложення, зібрані в одному місці, що теж вельми зручно.

 

Підключення набору даних

Компонент доступу до даних є основою приложення баз даних. На основі вибраної таблиці БД він створює набір даних і дозволяє ефективно управляти їм. В процесі роботи такий компонент тісно взаємодіє з функціями відповідної технології доступу до даним. Зазвичай доступ до функціональності технології доступу до даних здійснюється через сукупність інтерфейсів. Всі компоненти доступу до даних є невізуальними.

Для створення нового проекту досить вибрати команду New Applicationз меню Fileабо скористатися Репозиторієм об'єктів, який відкривається командою Newз меню File.

Тут розглядається простий варіант створення приложення. У реальних проектах для розміщення компонентів доступу до даних слід використовувати модуль даних.

Потім на форму нового проекту необхідно перенести компонент, що інкапсулює набір даних, і виконати наступні дії. Послідовність дій розглянемо для компоненту, що інкапсулює функції таблиці.

1. Підключити компонент до бази даних. Для цього, залежно від конкретної технології, використовується або спеціальний компонент, що встановлює з'єднання, або пряме звернення до драйвера, інтерфейсу або динамічної бібліотеки.

2. Підключити до компоненту таблицю БД. Для цього використовується властивість TableName, доступна в Інспекторові об'єктів. Після виконання дій першого етапу в списку цієї властивості повинні з'явитися імена всіх доступних в підключеній базі даних таблиць. Після вибору імені таблиці у властивості TableName компонент виявляється пов'язаним з нею.

3. Перейменувати компонент. Це не обов'язкова дія. Проте, в будь-яких випадках бажано привласнювати компонентам доступу до даним осмислені імена, відповідні назвам підключених таблиць. Звичайна назва компоненту копіює назву таблиці (наприклад, Orders або OrdTable илт tblOrders).

4. Активізувати зв'язок між компонентом і таблицею БД. Для цього використовується властивість Active. Якщо в Інспекторові об'єктів привласнити цій властивості значення True, то зв'язок активізується. Цю операцію можна виконати і в початковому коді приложення. Також існує метод open, який відкриває набір даних, і метод close, що закриває його.

Як приклад спробуємо створити просте приложення баз даних, COUNTRY, що працює з таблицею.DB із стандартної демонстраційної бази даних DBDEMOS через драйвер процесора Borland Database Engine.

На форму нового проекту необхідно перенести компонент TTаblе із сторінки BDE Палітри компонентів. Властивість DatabaseName повинна посилатися на псевдонім DBDEMOS, який створюється автоматично при установці Delphi, його можна вибрати із списку властивості DatabaseName. Для властивості TableName необхідно задати ім'я таблиці "COUNTRY.DB". Його також можна вибрати із списку. Подвійне клацання на властивості Active в Інспекторові об'єктів привласнює йому значення True. Після цього зв'язок компоненту з таблицею активізується. Властивість Name має значення "CountryTable".

Відкриття і закриття набору даних можна передбачити як реакцію на дії користувача або виникнення події. Найчастіше набір даних повинен відкриватися при першому показі форми і закриватися при її закритті.

 

Лістинг 1.Секція Implementation головного модуля проекту DemoDBApp

implementation

$R *.DFM}

procedure TForml.FormShowfSender: TObject);

begin

try

CountryTable.Open;

except

ShowMessage('Table open error');

end;

end;

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

begin

CountryTable.Close;

end;

end.

При відкритті форми виконується метод обробник FormShow. У нім набір даних відкривається за допомогою методу Open. Звернете увагу на використання конструкції try..except, яка забезпечує коректне завершення при виникненні виняткових ситуацій.

Оскільки помилки в роботі приложень баз даних можуть привести до серйозних наслідків (втрата або спотворення даних), то захисний код повинен бути присутнім у всіх критичних місцях.

У методі-обробнику FormClose, який викликається при закритті форми, набір даних закривається методом close.

В принципі, для виконання розглянутих операцій можна скористатися і властивістю Active. Проте реальні операції виконують вказані методи. Тому використання властивості є зайвим етапом, та і з погляду ООП всі дії повинні виконувати методи об'єкту, а властивості служать тільки для представлення значень. Властивість Active сигналізує про стан набору даних.

Настройка компоненту TDataSource

На другому етапі розробки приложення баз даних необхідно перенести на форму і набудувати компонент TDataSource. Він забезпечує взаємодію набору даних з компонентами відображення даних. Частіше всього одному набору даних відповідає один компонент TDataSource, хоча їх може бути декілька.

Для настройки властивостей компоненту необхідно виконати наступні дії.

1. Зв'язати набір даних і компонент TDataSource. Для цього використовується властивість DataSet компоненту TDataSource, доступне через Інспектор об'єктів. Це покажчик на екземпляр компоненту доступу до даним. У списку цієї властивості в Інспекторові об'єктів перераховані всі доступні компоненти наборовши даних.

2. Перейменувати компонент. Це не обов'язкова дія. Проте бажано привласнювати компонентам осмислені імена, відповідні назвам зв'язаних наборів даних. Звичайна назва компоненту комбінує ім'я набору даних (наприклад OrdSource або dsOrders).

У приложенні DemoDBApp компонент countrysource пов'язаний з компонентом CountryTable. Тому властивість DataSet має значення CountryTable.

Компонент TDataSource можна підключити не тільки до набору даних з тієї ж форми, але і будь-який інший, модуль якої вказаний в секції uses.

Компонент TDataSource має ряд корисних властивостей і методів. Отже, пов'язання з компонентом набору даних виконує властивість

property DataSet: TDataSet;

а визначити поточний стан набору даних можна, використавши властивість

type TDataSetState = (dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc); property State: TDataSetState;

За допомогою властивості

property Enabled: Boolean;

можна включити або відключити всі зв'язані візуальні компоненти. При значенні False жоден зв'язаний компонент відображення даних не працюватиме.

Властивість

property AutoEdit: Boolean;

при значенні True завжди переводитиме набір даних в режим редагування при отриманні фокусу одним із зв'язаних візуальних компонентів.

Аналогічно, метод

procedure Edit;

переводить зв'язаний набір даних в режим редагування.

Метод

function IsLinkedTo(DataSet: TDataSet): Boolean;

повертає значення True, якщо компонент, вказаний в параметрі DataSet, дійсно пов'язаний з даним компонентом TDataSource.

Метод-обробник

type TDataChangeEvent = procedure(Sender: TObject; Field: TField)

of object;

property OnDataChange: TDataChangeEvent;

викликається при редагуванні даних в одному із зв'язаних візуальних компонентів.

Метод-обробник

property OnUpdateData: TNotifyEvent;

викликається перед збереженням змін в базі даних. Метод-обробник

property OnStateChange: TNotifyEvent;

викликається при зміні стану зв'язаного набору даних.

Відображення даних

На третьому етапі створення приложення баз даних необхідно розробити призначений для користувача інтерфейс на основі компонентів відображення даних. Ці компоненти призначені спеціально для вирішення завдань перегляду і редагування даних. Зовні більшість цих компонентів нічим не відрізняються від стандартних елементів управління. Більш того, багато хто з компонентів відображення даних є спадкоємцями стандартних компонентів — елементів управління.

Компоненти відображення даних повинні бути пов'язані з компонентом TDataSource і через нього з компонентом набору даних. Для цього використовується їх властивість DataSource. Воно присутнє у всіх компонентах відображення даних.

Більшість компонентів призначені для представлення даних з одного єдиного поля. У таких компонентах є ще одна властивість DataField, яка визначає поле зв'язаного набору даних, що відображається в компоненті.

Особливе значення для приложень баз даних грає компонент TOBGrid, який представляє дані у вигляді таблиці. У стовпцях таблиці розміщуються поля набору даних, а в рядках — записі. Для цього компоненту не має сенсу визначати конкретне поле, але можна задати набір колонок, що настроюється, а для кожної з них визначити поле набору даних.

Таким чином, для кожного візуального компоненту відображення даних необхідно виконати наступні операції:

1. Зв'язати компонент відображення даних і компонент TDataSource. Для цього використовується властивість Datasource, яка повинна указувати на екземпляр необхідного компоненту TDataSource. Один компонент відображення даних можна пов'язати тільки з одним компонентом TDataSource. Необхідний компонент можна вибрати в списку властивостей в Інспекторові об'єктів.

2. Задати поле даних. Для цього використовується властивість DataField типу TFields. У нім необхідно вказати ім'я поля зв'язаного набору даних. Після завдання властивості Datasource поле можна вибрати із списку. Цей етап застосовується тільки для компонентів, що відображають єдине поле.

Окреме місце серед компонентів відображення даних займає компонент TDBNavigator. Він призначений для переміщення по записах набору даних.

У приложенні DemoDBApp використані компоненти TDBGrid, TDBNavigator і TDBEdit.

Всі три компоненти відображення даних пов'язано з компонентом CountrySource типу TDataSource за допомогою властивості DataSource.

Компонент TDBEdit відображає дані з поля capital (столиця держави) і дозволяє редагувати їх.

Компонент TDBGrid показує набір даних цілком, дані в осередках можна редагувати.

Компонент TDBNavigator дозволяє переміщатися по записах набору даних CountryTable. При цьому результат помітний у всіх підключених до набору даних компонентах відображення даних.

Висновок

Приложення баз даних можуть діставати доступ до джерел даних за допомогою різноманітних технологій доступу, багато хто з яких використовується і в приложеннях Delphi. Проте будь-яке приложення баз даних в Delphi має стандартне ядро, структура якого визначена архітектурою приложення баз даних.

Набір базових компонентів і способів розробки є єдиною основою, на якій базуються технології доступу до даним. Це дозволило уніфікувати процес розробки приложень баз даних.

У основі процесу розробки лежить тріада компонентів:

· невізуальні компоненти набору даних;

· невізуальні компоненти TDataSource;

· візуальні компоненти відображення даних.

Контрольні запитання:

1. Основні компоненти архітектури приложень баз даних в Delphi.**

2. Який компонент використовується для забезпечення зв'язку набору даних з візуальними компонентами відображення даних. ***

3. Які дії може виконувати користувач за допомогою компонентів відображення даних.***

4. Які дії необхідно виконати для настройки властивостей компоненту.****

5. Які операції необхідно виконати для кожного візуального компоненту відображення даних.****

 

Література: