Управління TDBGrid під час виконання
Приклади, які ви побачите в цій статті, продемонструють основні способи, якими користуються більшість програмістів для показу таблиць БД користувачам. Для розуміння більшої частини матеріалу потрібно загальне знання середовища і мови Delphi.
Відкрийте комбобокс "Object Selector" вгорі Інспектори Об'єктів - в даний час там є два компоненти: TForm і TQuery.
Натисніть праву кнопку миші на об'єкті TQuery і в контекстному меню виберіть пункт "Fields Editor". Натисніть кнопку Add - з'явитися діалог Add Fields, як показано на рис.1
Ці нові об'єкти будуть використовуватися для візуального представлення таблиці CUSTOMER користувачеві.
Ось повний список об'єктів, які тільки що створені:
Ця угода може бути дуже корисно, коли Ви працюєте з декількома таблицями, і відразу хочете знати, на поле якої таблиці посилається дана змінна.
Найбільш важлива властивість називається Value. Ви можете отримати доступ до нього так:
procedure TForm1.Button1Click (Sender: TObject);
У коді, показаному тут, спочатку присвоюються значення змінним d і S. Наступні два рядки змінюють ці значення, а останній дві привласнюють нові значення об'єктів. Не має великого сенсу писати код, подібний цьому, в програмі, але цей код служить лише для того, щоб продемонструвати синтаксис, який використовується з нащадками TField.
Властивість Value завжди відповідає типу поля, до якого воно відноситься. Наприклад у TStringFields - string, TCurrencyFields - double. Однак, якщо ви відображаєте поле типу TCurrencyField за допомогою компонент, "чутливих до даних" (data-aware: TDBEdit, TDBGrid etc.), то воно буде представлена рядком типу: "$ 5.00".
Це могло б змусити вас думати, що у Delphi раптово відключився строгий контроль типів. Адже TCurrencyField.Value оголошена як Double, і якщо Ви пробуєте привласнити йому рядок, Ви отримаєте помилку "type mismatch" (невідповідність типу). Вищезгаданий приклад демонструє насправді властивості об'єктів візуалізації даних, а не послаблення перевірки типів. (Однак, є можливість отримати значення поля вже перетворене до іншого типу. Для цього у TField і його нащадків є набір методів типу AsString або AsFloat. Звичайно, перетворення відбувається тільки тоді, коли має сенс.)
Якщо потрібно отримати імена полів в поточному DataSet, то для цього використовується властивість FieldName одним з двох способів, показаних нижче:
Якщо ви хочете отримати ім'я об'єкта, пов'язаного з полем, то ви повинні використовувати властивість Name:
Для таблиці CUSTOMER, перший приклад поверне рядок "CustNo", а будь-яка з рядків другого прикладу рядок "Query1CustNo".
- виконання обчислень за двома або більше полів в DataSet, і відображення результату обчислень в третьому полі.
- імітація з'єднання двох таблиць з можливістю редагувати результат з'єднання.
Програма CALC_SUM.DPR із прикладів до даного уроку ілюструє перший випадок використання обчислюваних полів.
Ця програма пов'язує три таблиці щодо один до багатьох. Зокрема, ORDERS і ITEMS пов'язані по полю OrderNo, а ITEMS і PARTS пов'язані по полю PartNo. (В таблиці ORDERS зберігаються всі замовлення; в таблиці ITEMS - предмети, зазначені в замовленнях; PARTS - довідник предметів). У програмі можна переміщатися по таблиці ORDERS і бачити пов'язаний з поточним замовленням список включених в нього предметів. Програма CALC_SUM досить складна, але добре ілюструє потужність обчислюваних полів.
Послідовність створення проекту CALC_SUM:
- Створіть новий проект (File | New Project) і видаліть з нього форму (в Менеджері Проекту View | Project 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 і виберіть поле OrderNo з Master і Detail ListBoxes, і натисніть кнопку Add.
- Натисніть Next та згенеруйте форму.
Потрібно багато слів для того, щоб описати процес показаний вище, але, фактично, виконання команд в Експерті форм БД легко і інтуїтивно.
Виділіть перший з двох об'єктів TQuery і встановлять властивість Active в True. Для Query2 у властивості SQL напишіть текст запиту:
select * from 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