Джерело даних — компонент TDataSource

Розглянувши основні характеристики проектів роботи з базами даних, приходимо до висновку, що джерело даних являється незмінним елементом при розробці будь-яких клієнтських програм, що пряцюють з даними такого типу. Компонент TDataSource (міститься на закладці Data Access палітри компонентів Delphi) і виконує функції джерела даних в таких програмах. Власних властивостей і методів у нього небагато, а якщо бути більш точним, то чотири властивості, два методи і три обробника подій. Але, незважаючи на таку скромність, він прекрасно вирішує поставлені перед ним завдання.

По-перше, організація взаємодій між компонентами доступу до набору даних (компоненти типу TTable, TQuery, TStoredProc,...) і елементами управління даними (TDBNavigator, TDBEdit, TDBGrid,...) здійснюється саме з допомогою компонентаTDataSource. Джерело даних, в такому випадку, бере на себе відповідальність за передачу інформації в компоненти відображення даних і повертає назад здійснені користувачем зміни. Завдяки такій винятковій здатності питання відображення і редагування пов'язаних з TDataSource даних не викликає ніяких труднощів.

По-друге, компонент TDataSource здатний організувати зв'язок між головним та підлеглим наборами даних. Це питання більш детально буде розглянуто в подальших параграфах, де з допомогою компонента TDataSource ми навчимося встановлювати відношення («один до одного»«один до багатьох»«багато до одного» і «багато до багатьох») між двома таблицями бази даних.

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

Для демонстрації вищесказаного, відкриємо delphi-проект, який ми створювали в параграфі, що міститься за вказаним вище посиланням, та доповнимо його таким чином, щоб користувач мав змогу переглядати не тільки талицю cars («Автомобілі») бази даних dbautobazar («Автобазар»), а і таблицю vendors («Продавці»). Для цього, на головній формі розмістимо додаткове джерело даних Table2 типу TTable та кнопку Button1 типу TBatton.

Головна форма delphi-проекту

На наступному кроці, для відповідних їх властивостей, встановимо наступні значення:

Значення властивостей компонентів

Далі, оголосивши глобальну змінну k цілого типу та присвоївши, в якості початкового, для неї значення рівне нулю, на подію OnClick кнопки Button1 напишемо наступний програмний код:

var
k: integer = 0;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Збільшуємо значення змінної k на одиницю
k := k + 1;
// В залежності від значення яке приймає змінна k, встановлюємо зв'язок з тим чи іншим набором даних
if (k mod 2 <> 0) then
DataSource1.DataSet := Table2
else
DataSource1.DataSet := Table1;
end;

Тобто, в залежності від того, яке значення приймає лічильник k (парне чи непарне), компонент DataSource1 розриває та встановлює зв'язок з тим чи іншим набором даних (Table1 чи Table2). Компонент DBGrid1, при цьому, відображає ту чи іншу таблиця бази даних (cars чи vendors).

Розрив та встановлення нового зв'язок між джерелом і набором даних

Продовжуючи розгляд властивостей та методів компонента TDataSource далі, зупинемося на властивості State типу TDataSetState. Дана властивість використовується для аналізу стану, в якому, в даний момент, знаходиться набір даних (чи знаходиться він в стані редагування, вставки даних і так далі). При кожній зміні стану набору даних для пов'язаного з ним джерела даних TDataSource генерується подія OnStateChange типуTNotifyEvent.

Якщо набір даних є редагованим, то властивість AutoEdit типу Boolean визначає, чи може він автоматично переводитися в режим модифікації при виконанні користувачем певних дій. Наприклад, для компонентів TDBGrid і TDBEdit такою дією є натискання алфавітно-цифрової клавіші, коли компонент знаходиться в фокусі введення. За замовчуванням властивість AutoEdit приймає значення True, і автоматичний перехід в режим модифікації дозволений. Якщо необхідно захистити дані від випадкової зміни, то одним з вжитих заходів є присвоєння властивості AutoEdit значення False.

Зауваження: властивість AutoEdit впливає на можливість редагування набору даних тільки з боку користувача. Програмно записи можна змінювати незалежно від значення цієї властивості. Без урахування значення властивості AutoEdit користувач може переводити набір  даних в режим модифікації шляхом натискання кнопок компонента TDBNavigator.

При зміні даних поточного запису генерується подія OnDataChange, типу TDataChangeEvent, який описується наступним чином:

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

Параметр Field вказує на поле, значення якого було змінено (якщо дані змінені більше ніж в одному полі, то цей параметр приймає значення Nil). Слід мати на увазі, що в більшості випадків подія OnDataChange генерується і при переході до іншого запису. Тобто, подію OnDataChange можна використовувати, наприклад, для виконання певних дій, пов'язаних з переміщенням між записами. Ця подія генерується також при відкритті набору даних.

При модифікації поточного запису крім події OnDataChange генерується також і подія OnUpdateData типу TNotifyEvent. Вона виникає безпосередньо перед записом даних в БД, тому в її обробнику можна передбачити додатковий контроль і обробку введених в поля значень, а також деякі інші дії, наприклад, відмова від зміни запису.

Для прикладу, скориставшись подією OnDataChange та властивістю State джерела даних DataSource1, реалізуємо процес обчислення кількості років для автомобіля, інформація про який міститься в поточному записі. Для цього, на головній формі розмістимо компонент Label1 типу TLabel і в тілі процедури DataSource1DataChange напишемо наступний програмний код:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
// В залежності від того, чи міститься в наборі даних з яким, в даний момент, пов'язане джерело данийх DataSource1 поле 'outputyear' для властивості Caption компонента Label1 присвоюємо відповідне значення (набір даних, при цьому повинен знаходитись в режимі перегляду)
if (DataSource1.DataSet.FindField('outputyear') <> nil) and (DataSource1.DataSet.State = dsBrowse)then
Label1.Caption := 'Кількість років: ' + IntToStr(CurrentYear — DataSource1.DataSet.FieldValues['outputyear'])
else
Label1.Caption := '';
end;

Запустивши проект на виконання, та скориставшись кнопками переміщення покажчика поточного запису компонента DBNavigator1, перевіримо правильність виводу результатів.

Приклад використання події OnDataChange компонента TDataSource

І на завершення, хочеться розглянути ще одну властивість, а саме Enabled, компонента TDataSource та два методи — Edit та IsLinkedTo.

procedure Edit;
function IslinkedTo(DataSet: TDataSet):Boolean;

Отже, власьтвість Enabled, типу Boolean, визначає, чи відображаються дані в компонентах відображення, пов'язаних з цим джерелом. Відмітимо, що використання даної властивості, може бути корисним в тому випадку, коли потрібно програмно пройти через всі записи таблиці бази даних. Адже якщо таблиця пов'язана з візуальними компонентами (TDBGrid, TDBEdit, TDBMemo,...), то кожен раз, коли здійснюється метод Next відповідного набору даних, візуальні компоненти будуть перемальовуватись. Навіть якщо саме сканування таблиці, яка зберігає тисячі записів не займе багато часу, то може знадобитися значно більше часу, для того щоб стільки ж раз перемалювати візуальні компоненти. У випадках, подібних до цього, найкраще встановити значення властивості Eabled рівним False. Це дозволить просканувати записи без перемальовування візуальних компонентів і значно скоротити відведений для цього час.

Виклик методу Edit — це ще один спосіб переходу набору даних в режим редагування  (не плутати цей метод з методом Edit з набору TDataSet). І використання функції IslinkedTo дає можливість перевірити, чи пов'язане, в даний момент часу,  джерело даних TDataSource з зазначеним набором даних (зазвичай не використовується, а застосовується при розробці нових компонентів).

Скачати delphi-проект Зв'язок між набором даних і компонентами відображення та редагування даних.

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

Якщо тобі сподобалась дана тема, залиш свій коментар