
- •Розділ 1. Об’єктно-орієнтоване програмування
- •Тема 1.1. Візуальне програмування.
- •Тема 1.2. Приклади та застосування інкапсуляції, успадкування, поліморфізму.
- •Тема 1.3. Бібліотека візуальних компонентів vcl та її базові класи.
- •1. Клас tWinControl.
- •2. Клас tСustomControl.
- •3. Клас tGraphicControl.
- •Тема 1.4. Обробка виняткових ситуацій.
- •1. Використовування виняткових ситуацій.
- •2. Протоколювання виняткових ситуацій.
- •3. Коди помилок у виняткових ситуаціях.
- •4. Виняткова ситуація eAbort. Функція Assert.
- •Розділ 2. Мова програмування Object Pascal.
- •Тема 2.1. Середовище Delphi.
- •Тема 2.2. Елементи мови Object Pascal.
- •1. Коментарі.
- •2. Логічні вирази.
- •Тема 2.3. Типи даних, процедури та функції.
- •1. Вказівники та динамічна пам'ять. Динамічна пам'ять
- •Вказівники
- •Виділення і звільнення динамічної пам'яті
- •Процедури і функції для роботи з динамічною пам'яттю
- •Тема 2.4. Управляючі структури Object Pascal.
- •Розділ 3. Програмування в середовищі Delphi.
- •Тема 3.1. Застосування списків. Способи запису/читання зі списків.
- •Є списком CheckBox елементів.
- •Тема 3.2. Масиви.
- •1. Пошук мінімального (максимального) елементу масиву.
- •2. Пошук в масиві заданого елементу.
- •Тема 3.3. Робота з файлами.
- •Тема 3.4. Типи даних визначені програмістом.
- •1. Показники.
- •2. Динамічні змінні.
- •Тема 3.5. Графічні програми.
- •1. Бітові образи.
- •2. Мультиплікація.
- •Властивості компоненту Timer
- •Тема 3.6. Приклади застосування анімацій у Delphi.
- •Тема 3.7. Рекурсія.
- •1. Крива Гільберта.
- •2. Пошук шляху.|колії|
- •Значення властивостей компоненту stringGrid1
- •3. Пошук найкоротшого шляху.|колії|
- •Тема 3.8. Компоненти для інтернету. Компонента tSocketConnection
- •Розділ 4. Бази даних.
- •Тема 4.1. Види баз даних. Структура та зв’язки між таблицями. Бази даних
- •Класифікація баз даних
- •Структура бази даних
- •Модель бази даних в Delphi
- •Тема 4.2. Модифікація структури таблиці в bde.
- •1. Зміна структури таблиці.
- •2. Встановлення перевірок правильності даних.
- •3. Завдання вторинних індексів.
- •Тема 4.3. Об’єкти відображення даних бази даних Delphi.
- •1. Класифікація компонентів відображення даних.
- •2. Елемент керування тdbGrid.
- •3. Компонент tdbEdit.
- •4. Компонент tdNavigator.
- •Тема 4.4. Обчислювальні поля і поля підстановки в Delphi.
- •1. Створення поля підстановки (поля синхронного перегляду).
- •2. Обчислювальні поля.
- •Тема 4.5. Компонента tdbEdit.
- •Тема 4.6. Переміщення по записам таблиці. Набір методів і властивостей tDataSet. Огляд
- •Клас tDataSet
- •Відкриття і закриття DataSet
- •Тема 4.7. Налаштування фільтрів.|
- •Тема 4.8. Приклади застосування пошуку.
- •Тема 4.9. Поєднання різних видів пошуку.
- •Тема 4.10. Типи даних та пошук в діапазоні.
- •Список літератури
Тема 4.6. Переміщення по записам таблиці. Набір методів і властивостей tDataSet. Огляд
Є декілька основних компонент(об'єктів), які потрібно використовувати постійно для доступу до БД. Ці об'єкти можуть бути розділені на три групи:
невізуальні: TTable, TQuery, TDataSet, TField
візуальні: TDBGrid, TDBEdit
зв’язуюючі: TDataSource
Перша група включає невізуальні класи, які використовуються для управління таблицями і запитами. Ця група зосереджується навколо компонент типу TTable, TQuery, TDataSet і TField. В Палітрі Компонент ці об'єкти розташовані на сторінці Data Access.
Друга важлива група класів - візуальні, які показують дані користувачу, і дозволяють йому переглядати і модифікувати їх. Ця група класів включає компоненти типу TDBGrid, TDBEdit, TDBImage і TDBComboBox. В Палітрі Компонент ці об'єкти розташовані на сторінці Data Controls.
Є і третій тип, який використовується для того, щоб зв'язати попередні два типи об'єктів. До третього типу відноситься тільки невізуальний компонент TDataSource.
Клас tDataSet
TDataSet клас – один з найбільш важливих об'єктів БД. Щоб почати працювати з ним, Ви повинні поглянути на наступну ієрархію:
TDataSet
|
TDBDataSet
|
|-- TTable
|-- TQuery
|-- TStoredProc
TDataSet містить абстрактні методи там, де повинне бути безпосереднє управління даними. TDBDataSet знає, як поводитися з паролями і те, що потрібно зробити, щоб приєднати Вас до певної таблиці. TTable знає (тобто вже всі абстрактні методи переписані), як поводитися з таблицею, її індексами і т.д.
Як Ви побачите в далі, TQuery має певні методи для обробки SQL запитів.
TDataSet – інструмент, який Ви будете використовувати щоб відкрити таблицю, і переміщатися по ній. Звичайно, Ви ніколи не будете безпосередньо створювати об'єкт типу TDataSet. Натомість, Ви будете використовувати TTable, TQuery або інших нащадків TDataSet (наприклад, TQBE).
На найбільш фундаментальному рівні, Dataset це просто набір записів.
В більшості випадків DataSet буде мати пряме, один до одного, відповідність з фізичною таблицею, яка існує на диску. Проте, в інших випадках Ви можете виконувати запит або іншу дію, які повертають dataset, який містить або будь-яку підмножину записів однієї таблиці, або об'єднання (join) між декількома таблицями. В тексті будуть іноді використовуватися терміни DataSet і TTable як синоніми.
Звичайно в програмі використовуються об'єкти типу TTable або TQuery, тому в наступних декількох розділах буде передбачатися існування об'єкту типу TTable званого Table1.
Отже, самий час почати дослідження TDataSet. Як тільки Ви познайомитеся з його можливостями, Ви почнете розуміти, які методи використовує Delphi для доступу до даних, що зберігаються на диску у вигляді БД. Ключовий момент тут – не забувати, що майже всякий раз, коли програміст на Delphi відкриває таблицю, він буде використовувати TTable або TQuery, які є просто деякою надбудовою над TDataSet.
Відкриття і закриття DataSet
В цьому розділі Ви дізнаєтеся деякі факти про відкриття і закриття DataSet.
Якщо Ви використовуєте TTable для доступу до таблиці, то при відкритті даної таблиці заповнюються деякі властивості TTable (кількість записів RecordCount, опис структури таблиці і т.д.).
Перш за все, Ви повинні помістити під час дизайну на форму об'єкт TTable і вказати, з якою таблицею хочете працювати. Для цього потрібно заповнити в Інспекторі об'єктів властивості DatabaseName і TableName. В DatabaseName можна або вказати директорію, в якій лежать таблиці у форматі dBase або Paradox (наприклад, С:\DELPHI\DEMOS\DATA), або вибрати із списку псевдонім бази даних (DBDEMOS). Псевдонім бази даних (Alias) визначається в утиліті Database Engine Configuration. Тепер, якщо властивість Active встановити в True, то при запуску додатку таблиця буде відкриватися автоматично.
Є два різні способи відкрити таблицю під час виконання програми. Ви можете написати наступний рядок коду:
Table1.Open;
Або, якщо Ви вважаєте за краще, то можете встановити властивість Active рівне True:
Table1.Active := True;
Немає ніякої відмінності між результатом вироблюваним цими двома операціями. Метод Open, проте, сам закінчується установкою властивості Active в True, так що може бути навіть трохи більш ефективно використовувати властивість Active напряму.
Також, як є два способи відкрити таблицю, так і є два способи закрити її. Найпростіший спосіб просто викликати Close:
Table1.Close;
Або, якщо Ви бажаєте, Ви можете написати:
Table1.Active := False;
Навігація (Переміщення по записах)
Після відкриття таблиці, наступним кроком Ви повинні взнати як переміщатися по записах усередині нього.
Наступний обширний набір методів і властивості TDataSet забезпечує все, що Вам потрібно для доступу до будь-якого конкретного запису усередині таблиці:
procedure First;
procedure Last;
procedure Next;
procedure Prior;
property BOF: Boolean read FBOF;
property EOF: Boolean read FEOF;
procedure MoveBy(Distance: Integer);
Дамо короткий огляд їх функціональних можливостей:
Вклик Table1.First переміщує Вас к перого запису в таблиці.
Table1.Last переміщує Вас к последней записи.
Table1.Next переміщує Вас на один запис вперед.
Table1.Prior переміщує Вас на один запис Назад.
Ви можете перевірити властивості BOF або EOF, щоб зрозуміти, знаходитесь Ви на початку чи в кінці таблиці.
Процедура MoveBy переміщує Вас на N записів вперед або назад в таблиці. Немає ніякого функціональної різниці між запитом Table1.Next і викликом Table1.MoveBy(1). Аналогічно, виклик Table1.Prior має той же самий результат, що і виклик Table1.MoveBy(-1).
Щоб почати використовувати ці навігаційні методи, Ви повинні помістити TTable, TDataSource і TDBGrid на форму, також, як Ви робили це в попередньому уроці. Приєднайте DBGrid1 до DataSource1, і DataSource1 до Table1. Потім встановите властивості таблиці:
в DatabaseName ім'я підкаталогу, де знаходяться демонстраційні таблиці (або псевдонім DBDEMOS);
в TableName установите ім’я таблиці CUSTOMER.
Якщо Ви запустили програму, яка містить видимий елемент TDBGrid, то побачите, що можна переміщатися по записах таблиці за допомогою смуг прокрутки (scrollbar) на нижній і правій сторонах DBGrid.
Проте, іноді потрібно переміщатися по таблиці "програмним шляхом", без використовування можливостей, вбудованих у візуальні компоненти. В наступних декількох абзацах пояснюється як можна це зробити.
Помістіть дві кнопки на форму і назвіть їх Next і Prior.
Двічі клацніть на кнопці Next – з'явиться заготівка обробника події:
Тепер додайте одну строчку коду так, щоб процедура виглядала так:
procedure TForm1.NextClick(Sender: TObject);
begin
Table1.Next;
end;
Повторіть ті ж самі дії з кнопкою Prior, так, щоб функція пов'язана з нею виглядала так:
procedure TForm1.PriorClick(Sender: TObject);
begin
Table1.Prior;
end;
Тепер Ви побачите, що вони легко дозволяють Вам переміщатися по записах в таблиці.
Тепер додайте ще дві кнопки і назвіть їх First і Last
Зробіть те ж саме для нових кнопок.
procedure TForm1.FirstClick(Sender: TObject);
begin
Table1.First;
end;
procedure TForm1.LastClick(Sender: TObject);
begin
Table1.Last;
end;
Немає нічого більш простого чим ці навігаційні функції. First переміщає Вас в початок таблиці, Last переміщає Вас в кінець таблиці, а Next і Prior переміщають Вас на один запис вперед або назад.
TDataSet.BOF – readonly Boolean властивість, використовується для перевірки, чи знаходитеся Ви на початку таблиці. Властивості BOF повертає true в трьох випадках:
Після того, як Ви відкрили порожній файл;
Після того, як Ви викликали TDataSet.Last;
Після того, як виклик TDataSet.Next не виконується.
Перші два пункти – очевидні. Коли Ви відкриваєте таблицю, Delphi поміщає Вас на перший запис; коли Ви викликаєте метод First, Delphi також переміщає Вас в початок таблиці. Третій пункт, проте, вимагає невеликого пояснення: після того, як Ви викликали метод Prior багато раз, Ви могли добратися до початку таблиці, і наступний виклик Prior буде невдалим – після цього BOF і буде повертати True.
Наступний код показує найзагальніший приклад використовування Prior, коли Ви потрапляєте до початку файла:
while not Table.Bof do begin
DoSomething;
Table1.Prior;
end;
В коді, показаному тут, гіпотетична функція DoSomething буде викликана спершу на поточному записі і потім на кожному наступному записі (від поточної і до початку таблиці). Цикл буде продовжуватися до тих пір, поки виклик Table1.Prior не зможе більше перемістити Вас на попередній запис в таблиці. У цей момент BOF поверне True і програма вийде з циклу. (Щоб оптимізувати вищенаведений код, встановіть DataSource1.Enabled в False перед початком циклу, і поверніть його в True після закінчення циклу.)
Все сказане щодо BOF також застосовується і до EOF. Іншими словами, код, приведений нижче показує простий спосіб пробігти по всіх записах в dataset:
Table1.First;
while not Table1.EOF do begin
DoSomething;
Table1.Next;
end;
Класична помилка у випадках, подібних цьому: Ви входите в цикл while або repeat, але забуваєте викликати Table1.Next:
Тому, краще використовувати цикл while замість repeat в ситуаціях подібних цій.
EOF повертає True в наступних трьох випадках:
Після того, як Ви відкрили порожній файл;
Після того, як Ви викликали TDataSet.Last;
Після того, як виклик TDataSet.Next не виконується.
Навігаційна процедура, – MoveBy, яка дозволяє Вам переміститися на N записів вперед або назад в таблиці. Якщо Ви хочете переміститися на два записи вперед, то напишіть:
MoveBy(2);
І якщо Ви хочете переміститися на два записи назад, то:
MoveBy(-2);
Питання для самоконтролю:
Які є об’єкти для доступу до баз даних?
Для чого призначений клас TDataSet?
Які методи використовують для відкриття та закриття DataSet?
Які методи TdataSet забезпечують переміщення по таблиці?
Які методи використовують для перевірки знаходження курсору на початку чи в кінці таблиці?