32 Уроку по delphi
32 уроку по Delphi
Урок 20: Компонент TTable. створення таблиць
за допомогою компонента TTable
На цьому невеликому уроці ми завершимо вивчення можливостей створення таблиць. Як Ви пам'ятаєте, ми вже освоїли два способи створення таблиць - за допомогою утиліти Database Desktop, що входить в поставку Delphi (урок 11) і за допомогою SQL-запитів (урок 12), які можна використовувати як в WISQL (Windows Interactive SQL - клієнтська частина Local InterBase), так і в компоненті TQuery. Тепер ми розглянемо, як можна створювати локальні таблиці в режимі виконання за допомогою компонента TTable.
Компонент TTable можна помістити на форму в режимі проектування або створити динамічно під час виконання. В останньому випадку перед використанням його необхідно створити, наприклад, за допомогою наступної конструкції:
Перед викликом методу CreateTable необхідно встановити значення властивостей
TableType - тип таблиці
DatabaseName - база даних
TableName - ім'я таблиці
FieldDefs - масив описів полів
IndexDefs - масив описів індексів.
Властивість TableType має тип TTableType і визначає тип таблиці в базі даних. Якщо це властивість встановлено в ttDefault. тип таблиці визначається по розширенню файлу, що містить цю таблицю:
Розширення .DB або без розширення: таблиця Paradox
локальний алиас, певний через компонент TDatabase.
Властивість TableName визначає ім'я таблиці бази даних.
Властивість FieldDefs (має тип TFieldDefs) для існуючої таблиці містить інформацію про всі полях таблиці. Ця інформація доступна тільки в режимі виконання і зберігається у вигляді масиву примірників класу TFieldDef. зберігають дані про фізичних полях таблиці (таким чином обчислювані на рівні клієнта поля не мають свого об'єкта TFieldDef). Число полів визначається властивістю Count. а доступ до елементів масиву здійснюється через властивість Items.
property Items [Index: Integer]: TFieldDef;
При створенні таблиці, перед викликом методу CreateTable. потрібно сформувати ці елементи. Для цього у класу TFieldDefs є метод Add.
procedure Add (const Name: string; DataType: TFieldType; Size: Word; Required: Boolean);
Параметр Name. має тип string. визначає ім'я поля. Параметр DataType (тип TFieldType) позначає тип поля. Він може мати одне з наступних значень, зміст яких ясний з їх назви:
TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftBlob, ftMemo,
Параметр Size (тип word) являє собою розмір поля. Цей параметр має сенс тільки для полів типу ftString. ftBytes. ftVarBytes. ftBlob. ftMemo. ftGraphic. розмір яких може сильно варіюватися. Поля інших типів завжди мають строго фіксований розмір, так що даний параметр для них не береться до уваги. Четвертий параметр - Required - визначає, чи може поле мати пусте значення при записи в базу даних. Якщо значення цього параметра - true. то поле є "необхідним", тобто не може мати порожнього значення. В іншому випадку поле не є "необхідним" і, отже, допускає запис значення NULL. Відзначимо, що в документації по Delphi і online-довіднику допущена помилка - там не згадується про четвертому параметрі для методаAdd.
Якщо Ви бажаєте індексувати таблицю по одному або декількох полях, використовуйте метод Add для властивості IndexDefs. яке, як можна здогадатися, також є об'єктом, тобто екземпляром класу TIndexDefs. Властивість IndexDefs для існуючої таблиці містить інформацію про всі індекси таблиці. Ця інформація доступна тільки в режимі виконання і зберігається у вигляді масиву примірників класу TIndexDef. зберігають дані про індекси таблиці. Число індексів визначається властивістю Count. а доступ до елементів масиву здійснюється через властивість Items.
property Items [Index: Integer]: TIndexDef;
Метод Add класу TIndexDefs має наступний вигляд:
procedure Add (const Name, Fields: string;
Options: TIndexOptions);
Параметр Name. має тип string. визначає ім'я індексу. Параметр Fields (також має тип string) позначає ім'я поля, яке повинно бути індексовано, тобто ім'я індексованого поля. Складовою індекс, використовує кілька полів, може бути заданий списком імен полів, між якими ставиться крапка з комою "; ", Наприклад: 'Field1; Field2; Field4'. Останній параметр - Options - визначає тип індексу. Він може мати набір значень, що описуються типом TIndexOptions.
TIndexOptions = set of (ixPrimary, ixUnique, ixDescending,
Пояснимо ці значення. ixPrimary позначає первинний ключ, ixUnique - унікальний індекс, ixDescending - індекс, відсортований по зменшенню значень (для рядків - в порядку, зворотному алфавітному), ixCaseInsensitive - індекс, "нечутливий" до регістру букв, ixExpression - індекс за висловом. Відзначимо, що згадка про останньому значенні також відсутня в документації і online-довіднику. Опція ixExpression дозволяє для таблиць формату dBase створювати індекс за висловом. Для цього достатньо в параметрі Fields вказати бажане вираз, наприклад: 'Field1 * Field2 + Field3'. Взагалі кажучи, не всі опції індексів пишуться для всіх форматам таблиць. Нижче ми наведемо список допустимих значень для таблиць dBase і Paradox:
Опції індексів dBASE Paradox
ixDescending ь ь
Необхідно дотримуватися зазначеного порядку застосування опцій індексів щоб уникнути некоректної роботи. Слід зазначити, що для формату Paradox опція ixUnique може використовуватися тільки разом з опцією ixPrimary (див. Приклад на диску - рис. Помилка! Текст зазначеного стилю в документі відсутня. -a).
Отже, після заповнення всіх зазначених вище властивостей і виклику методів Add для FieldDefs і IndexDefs необхідно викликати метод класу TTable - CreateTable.
with FieldDefs do
Add ( 'Surname', ftString, 30, true);
Add ( 'Name', ftString, 25, true);