Представьте себе, например, библиотеку. В любой библиотеке ведется учет книг. Они регистрируются по автору, по содержанию, по издательству, по регистрационному номеру и так далее. Теперь представьте, что библиотекарю требуется создать отчет по количеству книг какого-то конкретного автора. Если вся регистрация хранится только в виде бумажных карточек, то перед библиотекарем стоит довольно непростая задача. Этот автор мог написать не одну книгу, а десяток, каждая книга в библиотеке может быть представлена в 5-10 экземплярах, и еще не факт, что все карточки лежат по порядку. Следовательно, библиотекарю придется перебрать все карточки, чтобы быть уверенным, что отчет правильный. А если этих карточек в библиотеке несколько миллионов?!
Здесь придут на помощь
В старых языках программирования и
Сейчас под понятием
Ведь в случае
Изначально среда Delphi не ориентирована на работу с Базами Данных,
однако реализация механизмов для работы с БД настолько разнообразна,
что делает Delphi одним из самых мощных и удобных сред разработки
приложений БД. Среди этих механизмов можно назвать
Однако для начала разберемся с терминологией.
Теперь представим себе саму таблицу.
| № | Фамилия | Имя | Отчество | Год рождения |
|---|---|---|---|---|
| 1 | Лермонтов | Михаил | Юрьевич | 1814 |
| 2 | Пушкин | Александр | Сергеевич | 1799 |
| 3 | Толстой | Алексей | Константинович | 1817 |
| 4 | Толстой | Лев | Николаевич | 1828 |
Здесь столбцы "№", "Фамилия" и так далее являются
Первичным ключом называется поле, которое позволяет однозначно идентифицировать запись.
Теперь представьте себе другую таблицу – каталог книг.
| № | Автор | Наименование | Кол-во экз. |
|---|---|---|---|
| 1 | 4 | Детство, Отрочество, Юность | 20 |
| 2 | 4 | Война и мир | 15 |
| 3 | 4 | Два гусара | 14 |
| 4 | 3 | Сборник стихотворений | 5 |
Здесь поле "№" идентифицирует уже книгу, а не автора. А в поле
"Автор" нет фамилии, имени и отчества, зато присутствует номер –
идентификатор автора из первой таблицы. Теперь, если связать поле
"Автор" этой таблицы с полем "№" предыдущей, мы можем в отчете
получить полную информацию и о книге, и об авторе. Такие таблицы
называются
Создайте новое приложение. Мы продемонстрируем работу с БД и использование навигационных методов на демонстрационной таблице, поставляемой вместе с Delphi.
Назовите форму fMain, присвойте ей стиль bsDialog, и позицию по
центру рабочего стола. В свойстве Caption напишите "БД Навигатор".
Далее, установите на форму панель GroupBox, в свойстве Caption
которого укажите "Навигация".
На эту панель установите 4 кнопки, на которых укажите "|< Начало", "<< Назад", "Вперед >>" и "Конец >|". Это будут кнопки навигации – перемещения по таблице.
Ниже установите еще один GroupBox, в свойстве Caption которого
напишите "Закладка". В таблице можно установить закладку на любой
записи, а потом перескочить на нее из любого места. В этой панели мы
будем добавлять закладку, удалять ее и перескакивать на нее.
Еще ниже поместите обычную панель, и удалите из нее текст.
Установите на нее компонент Label, в свойстве Caption которого укажите
"Позиция:". Теперь нужно, чтобы эта надпись всегда была посередине.
Поэтому свойство AutoSize переведите в False, а свойство Alignment – в taCenter. Растяните Label, чтобы она занимала почти всю ширину панели.
Здесь вместе с надписью "Позиция:" будет выходить номер записи в
таблице.
Теперь перейдите на вкладку Data Controls. Здесь содержатся
и поместите ее на
форму ниже панели. Сетка очень похожа на сетку StringGrid,
которую мы изучали, но предназначена для отображения и редактирования
данных из таблицы БД. Сразу свойству ReadOnly (только для чтения)
присвойте True, чтобы пользователь не мог испортить демонстрационную
таблицу своим редактированием данных.
Чтобы получить доступ к БД, нужно еще кое-что. На вкладке Table, который обеспечивает доступ к таблице средствами
механизма DatabaseName
выберите демонстрационную базу данных DBDEMOS, которая поставляется
вместе с Delphi. В свойстве TableName необходимо указать саму таблицу,
к которой мы желаем получить доступ. Выберите там biolife.db.
Мы уже выбрали базу данных, то есть набор таблиц, и выбрали
таблицу. Однако, чтобы вывести в сетку данные из таблицы, требуется
компонент управления данными таблицы. Найдите на вкладке Data Access
компонент DataSource. Этот компонент обеспечивает связь базы данных из
таблицы Table с навигационными компонентами, такими, как .
Бросьте его рядом с Table. В свойстве DataSet компонента нужно
указать, с какой же именно таблицей мы желаем работать. В данном
примере у нас одна таблица, но ведь может быть и десяток! Выберите там Table1.
Теперь выделите сетку. Ей нужно указать, какой компонент будет
управлять этой сеткой. В свойстве DataSource укажите наш DataSource1.
Все, теперь мы сделали все приготовления. Единственное, что осталось
сделать – открыть файл с таблицей. Выделите компонент Table1, и в
свойстве Active укажите True. Этим самым мы заставим таблицу
открыться.
Внимание! Работа с базой данных отличается от работы с файлами другого типа. Когда ваша программа работает, например, с текстовым файлом, она открывает этот файл, считывает его содержимое в оперативную память ПК и закрывает его. Пользователь работает уже не с файлом, а с его содержимым в оперативной памяти. Когда он дает команду сохранить результаты работы, программа вновь открывает файл и перезаписывает в него данные из оперативной памяти.
С базами данных все иначе. Как только вы открыли таблицу – указали True у компонента Table1 в свойстве Active, или же программно дали
команду:
Table1.Active := True;
Или
Table1.Open;
то тем самым вы открыли файл. Файл будет открыт на протяжении всего сеанса, и все изменения данных будут немедленно сохраняться в нем! (На самом деле, конечно, всё немного сложнее. Данные изменяются не в физической таблице на жестком диске, а в её копии – компоненте Table. Механизм BDE сам отправляет изменённые данные в физическую таблицу, и делает это пакетами – транзакциями. Впрочем, на начальном этапе, нам об этом заботиться не нужно, можно считать, что мы отправляем данные прямо в таблицу на диске.) Приведенные выше команды открытия таблицы идентичны, вы можете пользоваться любым из этих способов.
Если вы все сделали правильно, то должны получить что-то вроде этого:
(рис 29.1) Внешний вид приложенияДля перемещения по записям таблицы существуют такие методы:
First – переход на первую запись.Last – переход на последнюю запись.Next – переход на следующую запись.Prior – переход на предыдущую запись.Создадим обработчики нажатия на кнопки в панели "Навигация". В обработчике кнопки "Начало" напишем
Table1.First;
В обработчике кнопки "Назад" напишем
Table1.Prior;
В обработчике кнопки "Вперед" напишем
Table1.Next;
В обработчике кнопки "Конец" напишем
Table1.Last;
Сохраните проект, откомпилируйте и посмотрите, как он работает.
Указатель позиции должен перемещаться, когда пользователь нажимает на
кнопки. Кроме того, перемещаться можно будет с помощью самой сетки .
Листая таблицу, вы видели такие данные, как MEMO и GRAPHIC, а сами
данные не отображались. Дело в том, что таблицы имеют разные типы
данных. Бывают числовые типы, строковые, типы "Дата". Обычно, в
строковый тип можно ввести текст длиной не более 255 символов. Если же
вам требуется поместить в таблицу более длинный текст, например,
аннотацию к книге, то можно воспользоваться типом MEMO. При этом
создается новый файл, в котором хранится сам текст, а в таблице
указана ссылка на этот текст. Длина текста в MEMO неограничена. Для
отображения MEMO потребуется специальный компонент.
Поле GRAPHIC хранит изображения – картинки, фотографии. Для их
отображения также нужен специальный компонент.
Улучшим наш пример, создав форму, в которой, как в карточке, мы
сможем видеть все данные текущей записи. Однако для начала
познакомимся с DataModule. Это модуль, который не имеет формы. Его
очень удобно использовать в многооконных проектах, где окна работают с
общими данными. Для нас общие данные – это компоненты Table и DataSource.
Прежде всего, закройте таблицу, указав False в ее свойстве Active.
Выберите команду File-> New -> Data Module. У вас появится новое
окошко, но это не форма. Измените имя этого окна на , чтобы не
нужно было писать длинного обращения к компонентам. Теперь вернитесь
на главную форму и выделите компоненты Table и DataSource. Выберите
команду Edit -> Cut (вырезать). Затем перейдите в окно , и выберите
команду Edit -> Paste (вставить). Если у вас эти компоненты были в
нижней части формы, то они могут оказаться вне зоны видимости окна . Это не страшно – прокрутите окно, либо увеличьте его размеры,
чтобы видеть компоненты, а затем перетащите их в верхнюю часть окна.
После чего можно уменьшить размеры . Сохраните окно в модуле
DM.pas.
Далее переходим на главную форму. Эта форма должна видеть окно ,
чтобы работать с компонентами, установленными в нем, поэтому выберите
команду File -> Use Unit и там выберите DM.
Теперь выделите сетку. В ее свойстве DataSource нужно выбрать наш DataSource, который выглядит уже как . Теперь откройте
таблицу, указав True в ее свойстве Active. Как видите, данные
по-прежнему отображаются, хотя компоненты доступа хранятся в другом
модуле.
Теперь мы готовы к тому, чтобы создать новое окно для просмотра
данных. Создайте новую форму, назовите ее fViewer, и сохраните в
модуле Viewer. Не забудьте выбрать команду Use Unit и там – DM,
ведь новая форма также будет работать с компонентами Table и DataSource. В свойстве Caption напишите "Карточка".
Теперь перейдите на вкладку DataControls. Найдите там компонент DBEdit. От обычного Edit он отличается тем, что поддерживает связь с
базой данных. Бросьте на форму, один под другим, 6 таких компонентов.
Ниже бросьте DBMemo, а справа от DBEdit – DBImage. У вас должна
получится форма примерно такого вида:
(рис 29.2) Внешний вид формы карточкиСлева от компонентов доступа к данным установите соответствующее
количество Label, и пропишите пояснения к полям, как на картинке
выше.
Выделите все компоненты доступа (только все DBEdit, DBMemo и DBImage ). Свойство ReadOnly у них установите в True, чтобы
пользователь не испортил данные демонстрационной таблицы. Далее, в
свойстве DataSource выделенных компонентов нужно выбрать наш . Теперь придется с каждым компонентом работать
отдельно. Выделите верхний DBEdit, и в свойстве DataField (поле)
выберите "Species No". Все компоненты DBEdit, сверху – вниз, должны
быть привязаны к следующим полям:
Species No Category Common_Name Species Name Length (cm) Length_In
Компонент DBMemo должен быть привязан к полю Notes, а компонент DBImage – к полю Graphic. Кстати, у DBMemo установите вертикальную
полосу прокрутки, чтобы можно было листать слишком большие
примечания.
Собственно, карточка готова. Осталось только вызывать ее из главной
формы. Если вы еще не выполнили для главной формы команду File -> Use
Unit, и не выбрали там модуль Viewer, то сделайте это сейчас. Затем
выделите сетку и сгенерируйте для нее событие onDblClick, где
пропишите вызов окна – карточки:
fViewer.ShowModal;
Теперь пользователь, щелкнув дважды по какой либо записи, вызовет
карточку, где будут отражены данные этой записи. Однако перед
компиляцией проекта нужно кое-что исправить. Мы запрограммировали наши
4 кнопки перемещения, когда еще компонент Table был на главной форме.
Однако теперь он в окне DM, поэтому добавьте перед обращением к
таблице во всех 4 кнопках, как в примере:
fDM.Table1.First;
Сохраните проект, скомпилируйте, и посмотрите, как он работает. На следующей лекции мы продолжим работу над этим проектом.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.