Редактор DataSet, Обчислювані поля

У цій статті ви дізнаєтеся про Редактора DataSet та про способи керування компонентом TDBGrid під час виконання програми. Тут же будуть розглянуті поля, що обчислюються - дуже цінна особливість Редактора DataSet.

Приклади, які ви побачите у цій статті, продемонструють основні способи, якими користуються більшість програмістів для показу таблиць БД користувачам. Для розуміння більшої частини матеріалу потрібне загальне знання середовища та мови Delphi.Редактор DataSet

Редактор DataSet може бути викликаний за допомогою об'єктів TTable або TQuery. Щоб почати працювати з ним, покладіть об'єкт TQuery на форму, встановіть псевдонім DBDEMOS, введіть SQL запит "select * from customer" та активізуйте його (встановивши св-во Active у True).

Відкрийте комбобокс "Object Selector" вгорі Інспектора Об'єктів - в даний час там є два компоненти: TForm і TQuery.

Натисніть праву кнопку миші на об'єкті TQuery і в контекстному меню виберіть “Fields Editor” . Натисніть кнопку Add - з'явиться діалог Add Fields, як показано на мал.

dataset

Рис.1: Діалог Add Fields Редактора DataSe t.

поля

Мал.2: Object Selector показує у списку всі об'єкти, створені в Редакторі DataSet. Ви можете знайти цей список у визначенні класу TForm1.

Ці нові об'єкти використовуватимуться для візуального представлення таблиці CUSTOMER користувачеві.

Ось повний список об'єктів, які щойно створені:

Я вирізав і вставив цей список із визначення класу TForm1, яке можна знайти у вікні Редактора вихідного тексту. Походження імен, показаних тут, має бути досить очевидним. Частина Query1 береться за замовчуванням від імені об'єкта TQuery, а друга половина від імені поля в таблиціCustomer. Якби ми зараз перейменували об'єкт Query1 на Customer, то отримали б такі імена:

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

Найважливіша властивість називається Value. Ви можете отримати доступ до нього так:

procedure TForm1.Button1Click(Sender: TObject);

У коді, показаному тут, спочатку надаються значення змінним d і S. Наступні два рядки змінюють ці значення, а останній два надають нові значення об'єктам. Не має великого сенсу писати код, подібний до цього, у програмі, але цей код служить лише для того, щоб продемонструвати синтаксис, що використовується з нащадками TField.

Властивість Value завжди відповідає типу поля, якого воно належить. Наприклад у TStringFields - string, TCurrencyFields - double. Однак, якщо ви відображаєте поле типу TCurrencyField за допомогою компонент, “чутливих до даних” ( data-aware: TDBEdit, TDBGr >), воно буде представлено рядком типу: "$5.00".

Це могло б змусити вас думати, що Delphi раптово відключився строгий контроль типів. Адже TCurrencyField.Value оголошена як Double, і якщо Ви намагаєтесь привласнити йому рядок, Ви отримаєте помилку “type mismatch” (невідповідність типу). Вищезгаданий приклад демонструє насправді властивості об'єктів візуалізації даних, а чи не ослаблення перевірки типів. (Однак, є можливість отримати значення поля вже перетворене до іншого типу. Для цього TField та його нащадки мають набір методів типу AsString або AsFloat. Звичайно, перетворення відбувається тільки тоді, коли має сенс.)

Якщо потрібно отримати імена полів у поточному DataSet, то для цього використовується властивість FieldName одним здвох способів, показаних нижче:

Якщо ви хочете отримати ім'я об'єкта, пов'язаного з полем, ви повинні використовувати властивість Name:

Для таблиці CUSTOMER перший приклад поверне рядок "CustNo", а будь-який з рядків другого прикладу рядок "Query1CustNo".

  • Обчислювані поля
  • Створення полів, що обчислюються, - одна з найбільш цінних властивостей Редактора DataSet. Ви можете використовувати ці поля для різних цілей, але два випадки виділяються особливо:
    • виконання обчислень за двома або більше полями в DataS et, і відображення результату обчислень у третьому полі.
    • імітація з'єднання двох таблиць із можливістю редагувати результат з'єднання.
    Програма CALC _SUM .DPR з прикладів цього уроку ілюструє перший випадок використання обчислюваних полів.

    Ця програма пов'язує три таблиці по відношенню один до багатьох. Зокрема, ORDERS та ITEMS пов'язані по полю OrderNo, а ITEMS та PARTS пов'язані по полю PartNo. (У таблиці ORDERS зберігаються всі замовлення; у таблиці ITEMS - предмети, зазначені в замовленнях; PARTS - довідник предметів). У програмі можна переміщатися по таблиці ORDERS та бачити пов'язаний із поточним замовленням список включених до нього предметів. Програма CALC_ SUM досить складна, але добре ілюструє потужність полів, що обчислюються.

    Послідовність створення проекту CALC_SUM:

    • Створіть новий проект (FileNew Project) та видаліть з нього форму (у Менеджері Проекту ViewProject Manager)
    • Виберіть експерта форм БД із меню Help.
    • На першому екрані виберіть "Create a master/detail form" та "Create a form using TQuery Objects".
    • Натисніть кнопку Next і виберіть таблицю ORDERS.DB із псевдоніма БД DBDEMOS.
    • Натисніть Next і виберіть поля OrderNo, CustNo, SaleDate, ShipDate та ItemsTotal з таблиціORDERS.DB.
    • Натисніть Next і виберіть "Horizontal" з розміщення компонентів dbEdit на формі.
    • Натисніть Next та виберіть таблицю ITEMS.DB.
    • У двох наступних екранах виберіть усі поля з таблиці та помістіть їх у grid.
    • Натисніть Next і виберіть поле Order No з Master і Detail ListB oxes, а потім натисніть кнопку Add.
    • Натисніть Next та згенеруйте форму.
    Потрібно багато слів для того, щоб описати процес показаний вище, але фактично виконання команд в Експерті форм БД легко і інтуїтивно.

    Виділіть перший із двох об'єктів TQuery і встановлять властивість Active у True. Для Query2 як SQL напишіть текст запиту :

    select * від Items I, Parts P

    where (I.OrderNo =:OrderNo) and

    Простий процес описаний у попередньому абзаці, показує як створити обчислюване поле. Якщо подивитися в DBGrid, можна побачити, що там тепер є ще одне порожнє поле. Для того, щоб помістити значення в це поле, відкрийте в Інспекторі Об'єктів сторінку подій для об'єкта Query2 і зробіть подвійне клацання на OnCalcFields. Заповніть створений метод так:

    procedure TForm2.Query2CalcFields(DataSet: TDataSet);

    Після запуску програми поле Total містить рядок $23.00.

    Це показує, наскільки просто створити поле, що обчислюється, яке показує правильно сформатовані дані. Насправді це поле має показувати щось інше - добуток полів Qty (кількість) та ListPrice (ціна). Для цього вищенаведений код для події OnCalcFields потрібно змінити так:

    procedure TForm1.Query2CalcFields(DataSet: TDataset);

    Якщо тепер запустити програму, поле Total буде містити необхідне значення.

    В обробнику події OnCalcFields можнавиконувати і складніші обчислення (це буде показано пізніше), проте слід пам'ятати, що це спричиняє відповідне уповільнення швидкості роботи програми.

    procedure TForm1.Query1CalcFields(DataSet: TDataset);

    with Query2 do begin

    У цьому прикладі сума підраховується за допомогою простого перебору записів, це не оптимальний варіант - можна, наприклад, для підрахунку суми використовувати додатковий об'єкт типу TQuery . МетодDisableControlsвикликається у тому, щоб скасувати перемалювання DBGr > під час сканування таблиці. Запит Query2 відкривається для впевненості, що його поточний набір записів відповідає поточному замовленню.

    Помістіть на форму ще один елемент DBEdit та прив'яжіть його до Query1, полю NewItemsTotal. Запустіть програму, її зразковий вигляд показано на рис.3

    обчислювані

    Рис.3: Програма CALC_SUM

    Як видно з програми, наявність поля ItemsTotal у таблиці ORDERS для даного прикладу необов'язкова і його можна було б видалити (проте, воно необхідне в інших випадках).

    1. Керування TDBGrid під час виконання
    Об'єкт DBGrid може повністю реконфігурований під час виконання програми. Ви можете ховати та показувати колонки, змінювати порядок показу колонок та їх ширину.

    Ви можете використовувати властивість Options об'єкта DBGrid для зміни її представлення. Властивість Options може приймати такі можливі значення:

    DgEditingВстановлений за замовчуванням у true, дозволяє користувачеві редагувати grid. Ви також можете встановити властивість ReadOnly grid в True або False.
    DgTitlesЧи буде видно назви колонок.
    DgIndicatorЧи будуть видніневеликі іконки зліва.
    DgColumnResizeЧи може користувач змінювати розмір колонки.
    dgColLinesЧи показувати лінії між колонками.
    dgRowLinesПоказувати лінії між рядками.
    dgTabsЧи може користувач використовувати tab та shift-tab для перемикання між колонками.

    Як оголошено у цій структурі:

    dgIndicator, dgColumnResize, dgColLines,

    Наприклад Ви можете встановити опції в Runtime, написавши такий код:

    Якщо Ви хочете вмикати та вимикати опції, це можна зробити за допомогою логічних операцій. Наприклад, наступний код додаватиме dgTitles до поточного набору параметрів:

    Нехай є змінна ShowTitles типу Boolean, тоді наступний код дозволяють включати та вимикати параметр однією кнопкою:

    procedure TForm1.Button3Click(Sender: TObject);

    if ShowTitles then

    ShowTitles := not ShowTitles;

    Якщо Ви хочете приховати поле в run-time, то можете встановити властивість visible у false:

    Обидва рядки коду виконують ідентичне завдання. Щоб показати поле знову, встановіть видимий у true:

    Якщо Ви хочете змінити положення колонки в Runtime, можете просто змінити індекс (перше поле в записі має індекс нуль):

    За замовчуванням поле CustNo у таблиці Customer є першим. Код у першому рядку переміщує це поле у ​​другу позицію, а наступний рядок переміщує його у третю позицію. Пам'ятайте, що нумерація полів починається з нуля, тому присвоєння властивості Index 1 робить поле другим запису. Перше поле має Index 0.

    Коли Ви змінюєте індекс поля, індекси інших полів змінюються автоматично.

    Якщо Ви хочете змінити ширину колонки вRuntime тільки змініть властивість DisplayWidth відповідного TField.

    Величина 12 належить до символів, які можуть бути показані у видимому елементі.

    Програма DBGR_RT показує, як працювати з DBGrid в Runtime. Програма досить проста, крім двох невеликих частин, що описані нижче. Перша частина показує, як створити check box у Runtime, а друга показує, як змінити порядок пунктів у listbox у Runtime.

    Під час створення форми (подія OnCreate) ListBox заповнюється іменами полів, далі створюється масив об'єктів CheckBox , відповідний полям у таблиці. Спочатку всі CheckBox'и вибрані і всі поля в таблиці видимі. Програма дізнається через T Table1 імена полів і надає їх властивості Caption відповідного CheckBox. Крім того, обробнику події OnClick всіх CheckBox'ів надається процедура ChBClick, яка і включає/вимикає поля в DBGrid.

    procedure TForm1.FormCreate(Sender: TObject);