
- •6. Разработка приложений
- •7. Работа с базами данных
- •7.8. Добавление записей
- •7.9. Удаление записей
- •8. Работа с запросами sql
- •Visual query builder (vqb)
- •9. Отчеты
- •Procedure NewPage;
- •Procedure Preview;
- •Property Enabled: Boolean;
- •Property ForceNewPage: Boolean;
- •Property BeforePrint: tqrBeforePrintEvent;
- •Property Data : tqrSysData Type;
- •Property DataSet: tDataSet;
- •Property Bands : tqrSubDetailGroupBands;
- •Property HasHeader : Boolean; property HasFooter: Boolean;
7. Работа с базами данных
7.1. Ядро процессора БД.
Delphi обеспечивает доступ к данным для большинства существующих форматов данных. Начиная от настольных СУБД Paradox, dBase, Access, FoxPro и заканчивая серверами баз данных Oracle, Sybase, Informix и InterBase.
У каждого формата данных есть свои специфические особенности. Для того чтобы разработчик не задумывался над этим, Delphi содержит ядро процессора баз данных (BDE). Разработчик строит обращения к данным через посредника - BDE BDE взаимодействует непосредственно с данными в определенном формате.
Чтобы указать BDE с какими конкретно данными вы хотите работать, необходимо определить псевдоним (Alias), который однозначно определяет местоположение и тип данных.
Все компоненты доступа к данным работают с псевдонимами. Если вы перенесли базу данных в другой каталог или сервер, то нет необходимости перекомпилировать ее. Достаточно только изменить псевдоним. Работа с псевдонимами осуществляется программой BDE Administrator поставляемой вместе с Delphi.
Программа Borland Database Desktop (DBD)
Database Desktop предназначен для работы с таблицами. С помощью DBD вы можете создавать и модифицировать таблицы.
Рассмотрим использование DBD для создания таблиц формата Paradox.
Работа с таблицами Paradox
DBD отображает диалоговое окно Create Paradox 7 Table (или другую версию Paradox) Это модальное диалоговое окно, поэтому вы не сможете использовать другие инструменты DBD, пока не щелкните на кнопке ОК или Cancel.
Использование списка полей
Секция списка полей (Field Roster) в диалоговом окне Create Table содержит список имен и размеров полей новой таблицы. Paradox допускает имена полей до 25 символов. Вы можете использовать любые алфавитные символы и пробелы, но желательно применять только буквы от А до Z и цифры, так как некоторые серверы SQL не воспринимают специальные символы. Paradox не допускает одинаковые имена полей. Вы можете использовать прописные и строчные буквы, но это не влияет на уникальность имени.
Для определения типа данных каждого поля используются кнопки Туре и Size. Список допустимых типов для активного поля вызывается щелчком правой кнопки мыши или нажатием клавиши <Space> в столбце Туре.
Каждый тип данных имеет соответствующий символ, который отображается в столбце Type. Paradox поддерживает типы данных, представленные в таблице:
Типы полей Paradox |
|
||
Символ |
Размер |
Тип |
Описание |
А |
1-255 |
Строковый |
Простой текст и числа |
N |
|
Вещественный |
Числа с плавающей точкой |
$ |
|
Денежный |
То же, что и вещественный, но отформатированный для записи денежных сумм |
S |
|
Короткий целый |
Двухбайтное целое |
1 |
|
Длинный целый |
Четырехбайтное целое |
# |
0-32 |
BCD |
Двоичное кодирование |
D |
|
Дата |
Дата от 1 января 9999 г. до н.э. до 31 декабря 9999 г. н.э. |
T |
|
Время |
Миллисекунды с полуночи |
@ |
|
Дата-время |
Комбинация даты и времени |
M |
1-240 |
Memo |
Очень большой текст |
F |
0-240 |
Форматируемый Memo |
Очень большой текст с возможностью форматирования |
G |
0-240 |
Графический |
Изображения |
0 |
0-240 |
OLE |
Формат OLE |
L |
|
Логический |
Истинно/ложно |
+ |
|
Наращиваемый |
Длинное целое с автоматическим наращиванием |
В |
|
Двоичный |
Большие бинарные массивы, хранимые в файлах с расширением .MB |
Y |
1-255 |
Байтовый |
Двоичные данные, хранимые в файлах с расширением .DB |
Как видно из таблицы, некоторые типы имеют размер, а некоторые нет. Типы данных, для которых размер не указан, имеют в Paradox предопределенные размеры. Например, вещественный тип (Numbers) имеет размер 8 байт. Хотя утилита DBD и позволяет создавать таблицы со сложными типами данных, например Graphics и Memo, в ней вы не сможете редактировать их.
Таблицы Paradox хранят данные в двух типах файлов, с расширением .DB и .MB. Файл .DB содержит основные типы данных, такие как Alpha, Number, Data и т. д. В файлах .MB хранятся части больших полей, таких как Memo. Для этого типа полей столбец Size содержит размер поля, хранимого в файле .MB. По этой причине столбец Size не имеет ограничений на размер поля Memo. Delphi автоматически решает проблемы работы с несколькими файлами, поэтому у вас нет причин беспокоится о том, как распределены данные по файлам.
Таблицы Paradox поддерживают первичные и вторичные индексы. Первичные индексы создаются при размещении звездочки (символ * ) в столбце Key. В первичный индекс могут входить несколько полей, но поля должны следовать друг за другом и начинаться с первого поля таблицы. Paradox требует, чтобы каждая запись в индексированной таблице имела уникальный ключ. В случае возникновения повтора в полях с первичным индексом используются автоматически добавляемые поля. Например, если вы создали таблицу с адресами ваших друзей, вы можете проиндексировать поля First_Name (дополнительное поле). Но всегда существует возможность, что среди ваших друзей найдется парочка с одинаковыми именами. Включение автоматически добавляемого поля в качестве третьего в индексе позволит программе различать ваших друзей.
Задание вторичных индексов
Вторичные индексы используются в таблице Paradox для выполнения запросов и изменения порядка просмотра записей. В диалоговом окне Create Table откройте список Table Properties и выберите строку Secondary Indexes. Для создания нового индекса щелкните на кнопке Define, для изменения существующего индекса щелкните на кнопке Modify. DBD отобразит диалоговое окно Define Secondary Indexes.
В списке Fields выберите необходимое для индекса поле (поля) и щелкните на кнопке с правой стрелкой. Вы можете переупорядочить эти поля в списке Indexed Fields при помощи кнопок с вертикальными стрелками. В панели Index Options всегда выделен флажок Maintained. Это означает, что процессор базы данных будет обновлять индекс при каждом изменении данных в таблице. Для учета регистра при сортировке используется флажок Case Sensitive.
После заполнения диалогового окна щелкните на кнопке ОК. Если вторичный индекс основан на одном поле и учитывается регистр, DBD присвоит индексу имя того поля, на основе которого проводится сортировка. В противном случае вам потребуется задать свое имя индекса.
Обеспечение ссылочной целостности
Таблицы Paradox поддерживают механизм ссылочной целостности (Referential Integrity), который обеспечивает взаимодействие между таблицами. Например, ссылочная целостность может быть установлена между таблицами Orders (Счета) и Customer (Покупатель). Это означает, что каждый счет связан с покупателем и запись покупателя не может быть удалена, если он имеет счет.
В диалоговом окне Create Table откройте список Table Properties и выберите строку Referential Integrity. Щелкните на кнопке Define для создания новой зависимости или на кнопке Modify для изменения существующей. DBD открывает
диалоговое окно Referential Integrity.
В правой части диалогового окна расположен список главных таблиц. Выберите таблицу и под заголовком Parent Key появятся поля, составляющие первичный ключ таблицы. В левой части диалогового окна выберите связанные поля. Связанные поля должны быть того же типа, что и поле, выбранное в главной таблице. Определять связанное поле для каждого поля главной таблицы необязательно.
Выберите переключатель Cascade в группе Update Rule, если вы хотите, чтобы изменения, сделанные в связанных полях в главной таблице, производились автоматически и в связанных полях подчиненной таблицы. Флажок Strict Referential Integrity служит для предохранения ранних версий Paradox от разрушения ссылочной целостности. После завершения работ с диалоговым окном Referential Integrity щелкните на кнопке ОК. DBD запросит название для установленной ссылочной целостности. Введите имя и щелкните на кнопке ОК.
Определение языка таблицы
Таблицы Paradox поддерживают ряд языков. Табличный язык определяет набор используемых символов и порядок сортировки. По умолчанию DBD присваивает новой таблице язык, определенный в строке LANGORIVER утилиты конфигурации BDE. Для изменения языка таблицы откройте список Table Properties и выберите строку Table Language. Щелкните на кнопке Define и появится диалоговое окно Table Language. Выберите нужный язык и щелкните на кнопке ОК.
Название новой таблицы
Когда работа с диалоговым окном Create Table завершена, щелкните на кнопке Save As. DBD отобразит диалоговое окно Save Table As.
Дайте новой таблице подходящее имя. Для показа созданной таблицы выделите флажок Display Table. Щелкните на кнопке ОК. DBD создаст новую пустую таблицу.
7.2. Компоненты доступа к базам данных (страница «Data Access»)
Также как и любое другое приложение Delphi, приложение для работы с базами данных начинается с создания формы, затем к нему добавляются как минимум три компонента:
Компонент доступа к данным, например ТТаble или TQuery, который связывает ваше приложение с таблицей базы данных. На рис, 7.1 показан такой компонент — ТТаblе.
Компонент TDataSource, который делает доступной приложению информацию, хранящуюся в таблице базы данных.
Один или несколько компонентов отображения данных, например TDBEdit, TDBGrid, TDBNavigator. Пользователи вашего приложения вводят, изменяют или просматривают данные при помощи этих компонентов.
На рис. 7.1 показан компонент отображения данных TDBGrid. Компонент TDBGrid создает элемент управления DBGrid, который отображает информацию из таблицы таким образом, что ее можно просматривать и редактировать.
Компонент ТТаblе
Это основной компонент доступа данных. Все операции с данными происходят через него. Обязательными свойствами компонента ТТаble являются следующие:
DatabaseName - указывает псевдоним базы данных;
TableName - конкретная таблица с которой свяжется компонент.
В форме может быть расположено несколько таких компонентов. Они могут ссылаться на разные псевдонимы, а могут связываться с одной и той же таблицей. С основными методами мы познакомимся позже.
Когда вы соединяете компонент доступа к данным (ТТаble или TQuery) с таблицей базы данных и/устанавливаете свойство Active в True, Delphi автоматически генерирует компонент TField для каждого поля таблицы.
У компонента доступа к данным имеется специальное средство работы с полями -Конструктор набора данных, который используется в режиме design-time. Он позволяет контролировать некоторые характеристики компонента TField. Вы можете, например, ограничивать число отображаемых полей, определять имена полей и компонентов, управлять визуализацией полей в форме.
Для активации Конструктора набора данных щелкните дважды на компоненте ТТаblе или TQuery (рис.7.2.). Для создания статического набора полей щелкните правой кнопкой мыши и в контекстном меню пункт Add fields.
Если список полей Конструктора набора данных пуст, то это значит, что список компонентов TField будет создаваться динамически.
Если список содержит перечень полей, то при запуске приложения только для этих полей будет формироваться объект TField, все остальные поля будут недоступны компоненту ТТаЫе.
Конструктор набора данных позволяет создавать временные поля ( вычисляемые поля и поля автоподстановки).
Компонент TDataSource
Компонент TDataSource — неотъемлемая часть приложения для работы с базами данных. Каждая форма, содержащая один или более компонентов отображения данных, с которыми пользователь может взаимодействовать, должна иметь по крайней мере один компонент TDataSource.
Работа TDataSource заключается в том, что он выступает связующим звеном между компонентами ТТаЫе или TQuery и одним или несколькими компонентами отображения данных. TDataSource незаменим при операциях с базами данных, так как компоненты для доступа к данным не могут работать напрямую с компонентами для отображения данных. Они должны взаимодействовать через TDataSource.
Для доступа к одной таблице из нескольких форм необходимо разместить по одному компоненту TDataSource на каждой форме. Каждый компонент TDataSource обращается к таблице, которая может отображаться на любой форме.
Компонент TField
Одним из важнейших компонентов, который обычно работает за сценой, является TFieid. Этот компонент содержит свойства, которые описывают тип, текущее значение, формат отображения, формат редактирования и другие атрибуты поля данных. Если вы открываете таблицу базы данных при помощи компонентов ТТаЫе или TQuery, то каждое поле этой таблицы представлено отдельным компонентом TFieid.
Вы можете достаточно долгое время создавать программы для работы с базами данных и не испытывать потребности в компоненте TFieid, так как Delphi создаст компонент TFieid для каждого поля таблицы по умолчанию каждый раз, когда она открывается компонентами ТТаЫе или TQuery. Генерируемые во время выполнения приложения компоненты TField создаются на основе внутренней физической структуры таблицы.
Следует иметь в виду, что поскольку Delphi генерирует компоненты TField динамически, то они отслеживают любые изменения структуры таблиц. Если, например, какое-либо поле исчезло из таблицы в момент ее связывания с приложением, то объектно-ориентированный компонент TField не будет создаваться для него при выполнении приложения. В результате ваше приложение будет обращаться к полям, которые содержит неиспользуемые данные или больше не существуют, т. е. возникает ситуация, которая может вызвать трудности для приложения.
Вы можете решить эту проблему, создав постоянный список компонент TField для каждой таблицы вашего приложения. Тогда Delphi использует ваши статические компоненты TField вместо генерируемых динамически компонентов для каждой открываемой таблицы.
Когда вы создаете набор постоянных компонентов TField для каждой таблицы вашего приложения, следует иметь в визу, что эти компоненту будут применены для доступа к данным таблицы, даже если ее структур изменилась. Поэтому, если вы не будете обладать информацией об изменениях в структуре таблицы, Delphi обнаружит ошибку и сгенерирует соответствующую исключительную ситуацию при попытке обратиться к несуществующим данным.
Для того чтобы помочь вам создать собственный статический список компонентов TField, в Delphi имеется специальный инструмент, называемый Конструктор набора данных. Вы можете использовать эту утилиту для ограничения числа отображаемых полей таблицы и управления способами отображения этих полей.
Пример. Первая программа работы с БД.
Создайте новое приложение;
Используя Object Inspector, установите свойства формы:
Left -209
Тор -134
Height -405
Width -623
Position - poScreenCenter
Из страницы Data Access Палитры компонентов добавьте компоненты DataSource и ТТаblе (рис. 7.3);
Установите свойства элемента Таblе1 следующим образом:
DatabaseNarne (псевдоним) - DBDEMOS
TableName - EVENTS.DB
Для элемента DataSourcel:
DataSet -Tablei
Из страницы Data Controls Палитры компонентов добавьте компонент TDBGrid. Настройте его свойства:
DataSource - DataSourcel
Добавьте компонент TDBNavigator:
DataSource - DataSourcel
Добавьте компонент TDBImage:
DataSource - DataSourcel
DataField - EventPhoto
Добавьте следующие компоненты со страницы «Data Controls»: TDBMemo, TDBText, TDBEdit, TDBComboBox и З компонента TLabel со страницы «Standart» (рис. 7.3);
Настройте их свойства:
DBMemol
DataSource DataSource1
DataField Event_Description
DBText1
DataSource DataSource1
DataField Event_Date
DBEdit
DataSource DataSource1
DataField Event_Name
DBComboBox1
DataSource DataSource1
DataField Ticket_price
Label1
Caption Дата события
Label2
Caption Наименование события
Label3
Caption Цена билета
Выберите элемент DBComboBox1 и в свойство Items введите строки:
5.00; 7.50; 10.00; 12.50
Установите свойство Active элемента Таblе1 в True;
Откомпилируйте и запустите программу.
7.4. Компоненты визуального отображения данных
Понятие набора данных (НД)
Под набором данных в Delphi понимается группа записей из одной или нескольких таблиц, доступная для использования через компоненты ТТаblе или TQuery.
Компонент TDBGrid
Компонент TDBGrid используется дня показа содержимого записей НД в табличном формате, когда строки соответствуют записям НД, а столбцы - полям записи.
Свойство DataSource компонента TDBGrid содержит имя компонента TDataSource, который ссылается на соответствующий НД (компоненты ТТаЫе или TQuery). Изменяя значение свойства DataSource во время выполнения, можно использовать один компонент TDBGrid для показа содержимого различных наборов данных.
Для определения состава столбцов в TDBGrid можно использовать редактор столбцов (Columns Editor). В этом случае используются только те столбцы, которые созданы в редакторе столбцов компонента TDBGrid, и принимаются во внимание только их характеристики. Порядок следования столбцов в сетке TDBGrid определяется порядком следования определений столбцов в редакторе столбцов.
Если редактор столбцов не использовался, берутся поля (компоненты TField), объявленные при помощи редактора полей НД. При этом вид столбцов определяется соответствующими характеристиками компонентов TField, а порядок следования столбцов - порядком их определений.
В случае, когда для НД компоненты TField не создавались, порядок следования полей и их характеристики соответствуют тем, что были заданы при определении структуры записи данной ТБД в момент создания таблицы. Заметим, что умалчиваемый порядок следования столбцов в TDBGrid можно изменить лишь при помощи редактора полей или редактора столбцов.
Компонент TDBText
Компонент TDBText применяется для показа значения текстового поля текущей записи НД. Изменять значение, показываемое при помощи TDBText, нельзя. Компонент является аналогом компонента TLabel, за исключением того, что значение для отображения берется из текущей записи НД.
Для использования компонента TDBText нужно:
указать в свойстве DataSource: TDataSource; имя соответствующего компонента TDataSource, связанного с НД;
указать в параметре DataField: String; имя поля. При заполненном свойстве DataSource в инспекторе объектов, когда мы устанавливаем значение свойства DataField, появляется список:
имен полей, определенных в редакторе полей;
имен всех полей НД, на который ссылается соответствующий компонент TDataSource, если редактор полей не применяется.
Компонент TDBEdit
Компонент TDBEdit позволяет редактировать значение строкового поля текущей записи НД. Он повторяет функциональность компонента TEdit (позволяющего корректировать значение переменной), но источником данных и их приемником в этом случае служит поле НД. Поэтому для TDBEdit необходимо указывать свойства
DataSource: TDataSource; - имя компонента DataSource, определяющего НД;
DataField: String; - имя редактируемого поля;
Readonly: Boolean; - если содержит True, значение поля доступно только для чтения, если False - значение поля можно изменять.
При вводе значения в TDBEdit приложение автоматически отслеживает, чтобы введенное значение было совместимо по формату с полем набора данных, с которым связан данный компонент TDBEdit. Ввод неверных значений блокируется Например, если в компонент TDBEdit, связанный с полем типа даты и времени попытаться поместить строковое значение, будет возбуждено исключение.
Свойство Text: string; хранит текущее содержимое поля НД в текстовом виде.
Компонент TDBCheckBox
Компонент TDBCheckBox позволяет «отметить» и «снять отметку» с логического поля в составе текущей записи НД.
Он обладает функциональностью компонента TCheckBox, но источником данных и их приемником в этом случае служит поле НД.
Компонент TDBCheckBox можно связывать и не с логическим, а с символьным полем. В этом случае необходимо установить значения приводимых ниже свойств.
Свойство ValueChecked: string; устанавливает значение поля, при которых TDBCheckBox переходит в состояние cbChecked. При наличии нескольких значений они разделяются точкой с запятой:
DBCheckBoxl.ValueChecked := 'True; Yes; On; Да; Д';
Свойство ValueUnChecked: string; устанавливает значения поля, при которых TDBCheckBox переходит в состояние cbUnChecked, При наличии нескольких значений они разделяются точкой с запятой:
DBCheckBoxl.Value Unchecked := 'False; No; Off; Her; IP;
Компонент TDBRadioGroup
Компонент TDBRadioGroup служит для предоставления фиксированного набора возможных значений поля при помощи группы зависимых переключателей. Этот компонент обладает функциональностью компонента TRadioGroup, но источником данных и их приемником в этом случае служит поле НД.
Напомним, что число и названия вариантов возможных значений поля, содержащихся в TDBRadioGroup, определяются в его свойстве Items: TStrings.
Компонент TDBListBox
Компонент TDBListBox применяется, когда нужно выбрать значение поля из предустановленного списка значений. Возможные значения содержатся в качестве строк компонента TDBListBox.
Свойство items: TStrings; содержит список возможных значений поля.
Компонент TDBComboBox
Этот компонент аналогичен компоненту TDBListBox, за исключением того, что в режиме dsBrowse текущее значение поля показывается аналогично TDBEdit, а в режимах добавления (dslnsert) и редактирования (dsEdit) при занесении значения в поле появляется «выпадающий список». Длина списка в строках определяется свойством DropDownCount: Integer;
Компонент TDBLcokupComboBox
Компонент TDBLookupComboBox применяется для выбора значений в поле одного набора данных (назовем его НД-1) из списка значений, источником которого выступают значения какого-либо поля из другого набора данных (НД-2). Наборы данных НД-1 и НД-2 связываются по полю связи. Это поле присутствует и в НД-1, и в НД-2 и имеет идентичный тип. Таким образом, НД-1 и НД-2 состоят в связи, как правило, «многие (НД-1) к одному (НД-2)». При этом реляционная связь может быть не оформлена при помощи первичного (НД-1) и внешнего (НД-2) индексов. Поэтому вхождения поля связи ни в текущей, ни в какой-либо иной индекс не требуется.
Разберем ключевые свойства и методы компонента TDBLookupComboBox.
DataSource: TDataSource; - указывает на компонент TDataSource, связанный с НД-1.
DataField: String; - устанавливает поле НД-1, в которое будет помещаться значение из НД-2.
ListSource: TDataSource; - указывает на компонент TDataSource НД-2. ListField: String; - устанавливает поле, значения которого будут показываться в списке выбора. Если значение не заполнено, берется значение свойства KeyField.
Можно указать несколько полей. Тогда все они будут показываться в списке выбора. Имена полей разделяются точкой с запятой.
RowCount: Integer; - указывает, сколько строк показывается в выпадающем списке. При изменении размеров списка, например путем занесения нового значения в свойство Height, RowCount изменяется автоматически. KeyField: String; - устанавливает поле связи между наборами данных 1 и 2. KeyValue: Variant; - содержит текущее значение поля связи. Если во время выполнения программы его значение изменится, будет осуществлена попытка отыскать в НД-2 запись со значением, содержащимся в этом свойстве.
Компонент TDBLookupListBox
Повторяет функциональность компонента TDBLookupComboBox, за исключением того, что выбор производится из постоянно присутствующего на экране, а не «раскрывающегося» (или «выпадающего») списка. Отсутствуют следующие свойства и методы компонента TDBLookupComboBox: DropDownAling, DropDownRows, DropDownWidth, DropDown и CloseUp.
Компонент TDBMemo
Компонент TDBMemo предназначен для показа мемо-полей (полей комментариев). Поля комментариев могут хранить многострочные тексты. Компонент TDBMemo является аналогом компонента ТМето с той лишь разницей, что источником данных в этом случае служит поле комментария набора данных.
При корректировке текста комментария в компоненте TDBMemo набор данных, к которому принадлежит поле комментария, автоматически переводится в состояние dsEdit.
7.5. Навигация по НД
Для перемещения по НД используются следующие методы:
First - на первую запись;
Last - на последнюю запись;
Next - на следующую запись;
Prior - на предыдущую запись.
Для проверки выхода за пределы набора HД применяются следующие свойства:
EOF - Конец НД;
BOF - Начало НД.
Пример. Приложение с собственными кнопками навигации.
Создайте новый проект и размесите на нем элементы (рис. 7.4);
Измените надписи (рис. 7.5);
Переименуйте кнопки на следующие:
Button 1 - btnFirst
Button2 - btnLast
Button3 - btnNext
Button4 - btnPrior
Введите код в обработчик события OnClick кнопки btnFirst:
Tablel. First;
Для btnLast:
Tablel. Last;
Для btnNext:
if Not Tablel. EOF then Tablel.Next;
Для btnPrior:
if Not Tablel. BOF then Tablel. Prior;
Для Table1 определите:
DatabaseName - DBDEMOS
TableName - B1OLIFE.DB
Выделите все элементы отображения данных и установите свойство DataSource в DataSource1.
Настройте для свойства DataField:
DBimage1 Graphic
DBMemol Notes
DBEditi Category
DBEdit2 Common_Name
DBEdit3 Scpecies_Name
Установите свойство Active элемента Table1 в True
7.6. Работа с полями таблицы
Выполните упражнение с элементом DBGrid (упражнение №5).
Пример 1. Ограничение списка полей в элементе DBGrid с помощью Column Editor.
Сделаем так, чтобы в DbGrid отображались только три поля: CustNo, Company и Addr2.
Два раза щелкните на элементе DBGrid 1. Появится диалог Column Editor.
Нажмите кнопку Add. В списке появится новый элемент.
Выберите этот элемент и в Object Inspector настройте свойства:
FieldName - CustNo
Title.Caption - «Код клиента»
Добавьте второй столбец со свойствами
FieldName - Company
Title.Caption - «Имя»
Добавьте третий столбец
FieldName - Country
Title.Caption - «Страна»
Закройте окно
Пример2. Ограничение списка полей в элементе DBGrid с помощью Fields Editor.
Настройки Fields Editor распространяются на все визуальные компоненты связанные с полями НД (набор данных).
Для начала войдите в диалог Column Editor и удалите все элементы.
Дважды щелкните на элементе Table1. После этого откроется окно Конструктора набора данных.
Обратите внимание, что список полей в окне утилиты пуст. Это связано с тем, что все поля таблицы CUSTOMER.DB являются динамическими, т.е. информация о полях таблицы анализируется только при запуске приложения ( когда создается объект TTable ), а такие поля в списке Конструктора набора данных не отображаются. Если вы включите поле в этот список, то это значит, что поле стало статическим. После этого Delphi будет генерировать исключительную ситуацию при каждой неудачной попытке доступа к этим полям.
Для того чтобы добавить поле в список Конструктора набора данных, щелкните правой кнопкой мыши в любом месте окна утилиты и, появившегося всплывающего меню выберите команду Add Fields
Выберите поле Company из списка Available Fields и щелкните на кнопке ОК. После этого диалоговое окно Add Fields закроется, и в списке Конструктора набора данных появится поле Company.
Из всплывающего меню утилиты еще раз выберите команду Add Fields для отображения диалогового окна Add Fields.
Из списка Available Fields выберите коде Addr1 и щелкните на кнопке ОК. Диалоговое окно Add Fields закроется, и имя поля Addr1 появится в списке Конструктора набора данных вместе с полем Company (см. рис. 7.6).
Замечание. Так как Delphi поддерживает механизм drag-and-drop, вы можете изменить порядок следования полей в списке Конструктора набора данных простым перемещением имен при помощи мыши.
Затем закройте окно Конструктора набора данных, нажав кнопку закрытия окна.
7.7 Поиск записей
Поиск с использованием цикла
Пример. Поиск с использованием цикла.
■■<
Добавьте компонент TEdit и TButton (рис.)
Переименовать Edit1 - edtFind, Button2 - btnFind;
Процедура OnClick элемента btnFind:
Table 1.First;
while not Tablel .EOF do
begin
if Table 1 .FieldByName('Name').AsString = edtFind.Text then break;
Table 1.Next;
end;
Чтобы получить значение поля Name текущей записи, используйте свойство FieldByName компонента ТТаblе.
Мы преобразуем значение поля к строковому типу (asString)
Откомпилируйте и запустите программу.
Поиск по индексу
Предыдущий пример можно использовать, когда записей в НД не так много. Для быстрого поиска в больших таблицах необходимо использовать индексы. Для поиска с помощью индекса используются методы:
FindKey([cписок значений]): Boolean - ищет запись, точно удовлетворяющую условиям в списке значений.
FindNearest([cnncoK значений]) – ищет запись, приблизительно удовлетворяющую условиям в списке значений.
Внимание. Прежде чем использовать эти методы поиска, необходимо установить текущим нужный индекс. Установка индекса происходит в свойстве IndexName.
Пример1. Точный поиск по индексу.
1. Добавьте кнопку TButton.
2. Переименуйте ее в btnFindKey
3. Надпись на кнопке - «Точный поиск»;
4. Введите код в ее событие OnClick:
Table 1.Open;
Tablel.IndexName := 'Name';
Tablel.Close;
if not Table 1 .FindKey([edtFind.Text]) then
ShowMessage('Нeт такого зверя');
5. Откомпилируйте программу и запустите
Чтобы сменить индекс, необходимо закрыть таблицу (метод Close), а потом открыть (метод Open).
Пример2. Приблизительный поиск по индексу.
Сделаем так, чтобы при вводе символа в элемент edtFind автоматически осуществлялся переход на запись с близким значением.
1. Добавьте компонент TCheckBox рядом с элементом edtFind.
2. Измените надпись на «Поиск»;
3. В событие OnChange элемента edtFind введите код:
if CheckBox1 .Checked then
Table1.FindlNearest([edtFind.Text]);
4. Для события OnClick элемента CheckBox1 введите код:
if CheckBox1.Checked then Table1.IndexName:='Name'
else Table1.IndexName:=";
Событие OnChange возбуждается каждый раз при изменении строки редактирования (свойство Text).
Использование закладок
Так как НД, с которым работает компоненты ТТаblе и TQuery, меняется в зависимости от индекса, фильтра или действия других пользователей, то нет возможности определить номер конкретной записи.
Для реализации такой возможности возврата на нужную запись используются закладки (Bookmark). Закладка позволяет маркировать запись и затем вернуться на нее.
Для работы с закладками используются следующие методы:
GetBookmark: TBookmark - создает для текущей записи объект закладку и возвращает на нее ссылку;
GotoBookmark (Bookmark: TBookmark) -перемещает курсор на запись, определенную закладкой - параметром;
FreeBookmark (Bookmark: TBookmark) - освобождает системные ресурсы закладки Bookmark.
Пример. Использование закладок.
1. В процедуре btnFind добавьте подчеркнутый код:
var
Bookmark: TBookmark;
begin
Bookmark := Table1.GetBookmark;
Table1. First; while not Tablel.EOF do
begin
if Tablel.FieldByName('Name').AsString = edtFind.Text then
break;
Table1.Next;
end;
if Tablel.Eof then Table 1 .GotoBookmarkfBookmark);
Table1.FreeBookrnark(Bookmark);
end;