WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 | 2 || 4 |

«Содержание Предисловие 1 ЧАСТЬ I. ОСНОВНЫЕ СРЕДСТВА DELPHI 3 Глава 1. Среда Delphi 5 1.1. Характеристика проекта 10 1.1.1. Состав проекта 10 1.1.2. Файл проекта 1.1.3. Файлы формы 12 1.1.4. Файлы ...»

-- [ Страница 3 ] --

Filler Editor Filler Name Все (".") Help 6.9. Редактор фильтра Стандартные диалоги выбора имени файла для открытия или сохранения файла вызываются на экран методом Execute. Эта функция в качестве ре зультата возвращает логическое значение, позволяющее определить, как за крыт диалог. Если пользователь в процессе диалога нажал кнопку Open или 146 Delphi. Быстрый старт Save, то диалог считается принятым, и функция Execute возвращает значе ние True. Если диалог был закрыт любым другим способом, то он считается отвергнутым, и функция возвращает значение False.

Пример. Использование стандартного диалога OpenDiaiog.

procedure TObject);

begin if then end;

При нажатии на кнопку Button2 появляется диалог OpenDialogl выбора имени файла для открытия. При выборе имени текстового файла его содер жимое загружается в компонент Напомним, что многострочный редактор Memo позволяет работать с текстами в коде ANSI. При отмене диа лога OpenDialogl открытия файла не происходит.

Компоненты OpenPictureDialog И SavePictureDialog вызывают ные диалоги открытия и сохранения графических файлов. Эти стандартные диалоги отличаются от OpenDiaiog и окон и установлен ными значениями свойства Filter.

6.6. Шаблоны форм Хранилище объектов позволяет сохранять формы и другие объекты в каче стве шаблонов для последующего использования. Шаблон представляет со бой своего рода заготовку, настраивая которую можно получить требуемый объект. Выделим следующие шаблоны форм:

• страница New:

• пустая форма Form;

страница Forms:

• справочное окно About Box;

• форма Dual List Box с двумя списками;

• форма Quick Report List отчета;

• форма Quick Report Master/Detail отчета;

страница Dialogs:

• диалоговое окно Dialog with Help с кнопкой Help (два варианта фор мы, различающиеся расположением кнопок);

• диалоговое окно Password Dialog для ввода пароля;

• обычный диалог Standard Dialog (два варианта формы, различающиеся расположением кнопок).

Часть I. Основные средства Delphi При добавлении в проект новой формы Delphi автоматически вставляет пус тую форму Form, к которой разработчик добавляет необходимые интерфейс ные компоненты. Новая форма добавляется при выборе пункта меню File | New | Form (Файл | Новый | Форма).

Иногда лучше выбрать подходящий к конкретной ситуации шаблон, чем использовать пустую форму. Например, при вводе пароля таким шаблоном является Password Dialog (Диалог ввода пароля) (рис. 6.10). Эта форма имеет заголовок Password Dialog, имя и содержит надпись и КНОПКИ закрытия Диалога (OKHa): И CancelBtn.

Password Dialog !

6.10. Шаблон диалогового окна Password Dialog Для кнопок закрытия диалога установлены следующие значения свойства — CancelBtn — Программист может изменить значения компонентов, например, заме нив английский текст на русский, или расположить на форме новые компоненты.

После этого окно Password Dialog можно вызвать на экран с помощью мето да следующим образом:

Аналогично можно использовать шаблоны других форм из хранилища объ ектов. Кроме того, возможно сохранение в хранилище своих форм, которые планируется использовать в других проектах.

Кроме шаблонов форм, в Хранилище объектов находятся мастера (wizards) — специальные программы-утилиты, позволяющие достаточно удобно создавать формы. Мастера Хранилища объектов позволяют создать, например, диалоговое окно, форму для работы с базами данных или отчет.

При работе с мастером разработчику в пошаговом режиме предлагается от ветить на ряд вопросов, помогающих мастеру создать требуемую форму.

Мастера в Windows достаточно часто используются для различных ситуаций, например, при построении диаграмм в пакете Microsoft Office или при уста новке в компьютер нового оборудования.

Глава Работа с меню Практически все приложения Windows имеют меню, которое является рас пространенным элементом пользовательского интерфейса. Меню представ ляет собой список объединенных по функциональному признаку пунктов, каждый из которых обозначает команду или вложенное меню (подменю).

пункта меню равносилен выполнению соответствующей команды или раскрытию подменю.

Обычно в приложении имеется главное меню и несколько контекстных (всплывающих или локальных) меню. Главное меню используется для управ ления работой всего приложения, каждое из контекстных меню служит для управления отдельным интерфейсным элементом.

Пункт меню представляет собой объект типа Отдельный пункт меню обычно виден как текстовый заголовок, описывающий назначение пункта меню. Пункт меню может быть выделен (маркирован) для указания на включенное состояние. Класс TMenuitem используется для представления пунктов главного и контекстных меню. Основные свойства пункта меню:

Bitmap типа TBitmap — определяет изображение пиктограммы, разме щаемое слева от заголовка пункта меню. По умолчанию свойство имеет значение nil, и изображение отсутствует;

• Break типа — задает, разделяется ли меню на колонки.

Свойство Break может принимать одно из трех значений:

• — меню не разделяется (по умолчанию);

• — пункты меню, начиная с текущего, образуют новую колонку;

• mbBreakBar — пункты меню, начиная с текущего, образуют новую колонку, котороая отделена линией;

типа string — содержит строку текста, отображаемую как заго ловок пункта меню. Если в качестве заголовка указать символ "-", то на месте соответствующего пункта меню отображается разделительная Часть I. Основные средства Delphi линия. При этом, несмотря на отображение линии, свойство caption по-прежнему имеет значение "-";

типа Boolean — определяет, является ли пункт выделенным.

Если свойству установлено значение True, то пункт выделен и в его заго ловке появляется специальная отметка. По умолчанию свойство имеет значение False, и пункт меню не имеет отметки;

• AutoCheck типа Boolean — определяет автоматическое изменение значе ния свойства на противоположное при выборе пользователем пункта меню (в Delphi 6);

• count типа integer — задает количество подпунктов в данном пункте меню. Это свойство есть у каждого пункта меню. Если какой-либо пункт не содержит подпунктов, то свойство имеет значение нуль;

• Enabled типа Boolean — определяет, активен ли пункт, т. е. будет ли он реагировать на события от клавиатуры и мыши. Если свойству Enabled установлено значение False, то пункт меню неактивен и его заголовок обесцвечен. По умолчанию свойство Enabled имеет значение True, и пункт меню активен;

items типа — является массивом подпунктов текущего пункта меню. Каждый пункт меню, имеющий подпункты (вложенное меню), перечисляет их в свойстве items. Это свойство позволяет полу чить доступ к подпунктам по их позициям в массиве: items [0], items и т. д.;

типа Boolean — определяет вид отметки, появляющейся в заголовке пункта. Если свойству установлено значение False (по умол чанию), то в качестве отметки используется значок в виде галочки, в противном случае пункт отмечается жирной точкой;

shortcut типа TSortCut — определяет комбинацию клавиш для активи зации пункта меню. Определить комбинации клавиш можно также с по мощью свойства caption, но свойство предоставляет для этого более широкие возможности. Обозначение комбинаций клавиш, установ ленных через свойство shortcut, появляется справа от заголовка элемен та меню. Наиболее просто задать комбинацию клавиш при конструиро вании через Инспектор объектов, выбрав нужную комбинацию из списка. Кроме назначить комбинации клавиш можно С ПОМОЩЬЮ ОДНОИМеННОЙ фуНКЦИИ Shortcut (Key: Word;

Shi f t :

: TShortCut. Параметр shift определяет управляющую клавишу, удерживаемую при нажатии алфавитно-цифровой клавиши, на которую указывает параметр Key. Если в процессе выполнения програм мы, например, для пункта меню mnuTest требуется задать комбинацию клавиш +, то это можно выполнить следующим образом:

Delphi. Быстрый старт visible типа Boolean — определяет, виден ли пункт на экране. Если свойству visible установлено значение False, то пункт меню на экране не отображается. По умолчанию свойство visible имеет значение True, и пункт виден в меню.

Основным событием, связанным с пунктом меню, является событие onclick, возникающее при выборе пункта с помощью клавиатуры или мыши.

В приложении для генерации события или для имитации выбора пункта меню можно использовать метод click. Вызов этой процедуры экви валентен выбору соответствующего пункта меню пользователем.

Пример. Имитация выбора пункта меню.

procedure TObject);

begin end;

Нажатие кнопки приводит к тому же эффекту, что и выбор пункта mnuLockltem.

Для создания меню при разработке приложения используется Конструктор меню. Меню также можно создавать или изменять — непо средственно в ходе выполнения приложения.

7.1. Главное меню Главное меню располагается в верхней части формы под ее заголовком (рис. 7.1) и содержит наиболее общие команды приложения. В Delphi глав ное меню представлено компонентом Работа с меню Цвет Формы Управление пунктами меню Рис. 7. 1. Главное меню По внешнему виду главное меню представляет собой строку, и его также называют строчным. Если пункты меню не умещаются на форме в одну строку, то они автоматически переносятся на следующую строку (рис. 7.2).

При изменении размеров формы соответствующим образом меняются раз меры и размещение пунктов строчного меню. Отметим, что уменьшение ширины формы ограничено размером самого длинного заголовка, имеюще гося в меню.

При проектировании приложения на форме видны компонент MainMenu и соответствующая ему строка меню. Отображаемая строка меню выглядит Часть I. Основные средства Delphi и ведет себя так же, как и при выполнении программы. Для перехода на этапе проектирования приложения в процедуру обработки события onclick пункта меню следует выбрать этот пункт с помощью клавиатуры или мыши.

Работа с меню Цвет Формы У правление пунктами меню Выход 7.2. Главное меню с двумя строками 7.2. Контекстное меню Контекстное (всплывающее) меню появляется при нажатии правой кнопки мыши и размещении указателя на форме или в области некоторого управ ляющего элемента. Обычно контекстное меню содержит команды, влияю щие только на тот объект, для которого вызвано это меню, поэтому такое меню также называют локальным. На рис. 7.3 показан примерный вид кон текстного меню.

- Название Переместить - ' • Цвет состояние Рис. 7.3. Контекстное меню Контекстное меню в Delphi представляется компонентом Его основными свойствами являются следующие:

типа Boolean — определяет, появляется ли контекстное меню при щелчке правой кнопки мыши и размещении указателя на компонен те, использующем это меню. Если свойство AutoPopup имеет значение True (по умолчанию), то контекстное меню при щелчке мыши появляет ся автоматически. Если свойство AutoPopup имеет значение False, то появления меню не происходит. Однако в этом случае можно активи зировать меню программно, используя метод Popup. Процедура Popup (х, Y: integer), где х и Y— координаты меню относительно левого верхнего угла экрана монитора, выводит на экран указанное контекстное меню, например, О Alignment типа — определяет место появления кон текстного меню по отношению к указателю мыши. Свойство Alignment может принимать следующие значения:

• — указатель определяет левый верхний край меню (по умол чанию);

Delphi. Быстрый старт • — указатель определяет для меню центр по горизонтали;

• paRight — указатель определяет правый верхний край меню.

Для того чтобы контекстное меню появлялось при щелчке на компоненте, необходимо его свойству PopupMenu присвоить в качестве значения имя тре буемого контекстного меню.

Пример. Задание контекстного меню для формы.

:= Данный оператор задает для формы Forml контекстное меню 7.3. Конструктор меню Для создания и изменения меню в процессе разработки приложения в среде Delphi предназначен Конструктор меню (Menu Designer). Запуск Конструк тора меню можно выполнить по команде Menu Designer (Конструктор ме ню) контекстного меню компонента или PopupMenu, а также с по мощью двойного щелчка мыши на этих же компонентах. Предварительно один из этих компонентов следует добавить на форму. Напомним, что ком поненты MainMenu и PopupMenu размещаются на странице Standard (Стан дартная ) Палитры компонентов.

Конструктор меню похож на текстовый редактор и предоставляет возможность достаточно просто и удобно конструировать меню любого типа. Меню при конструировании имеет тот же вид, что и при выполнении приложения. Вид меню при конструировании с помощью Конструктора меню показан на рис. 7.4.

Forml Цвет Формы Управление пунктами Выход j • Отметка •'.-. Видимость Ins Del Create Submenu.

As Insert From Delete Templates...

Insert 7.4. Вид меню при конструировании При работе с Конструктором меню используются команды его контекстного меню (рис. 7.4), вызываемого правой кнопкой мыши при разме Часть I. Основные средства Delphi щении указателя в области Конструктора меню. С их помощью можно выполнить такие действия, как добавление (Insert) и удаление (Delete) пунк та меню, создание подменю (Create Submenu), выбор меню (Select Menu).

При конструировании меню можно также перемещать указателем мыши пункты меню и подменю по технологии drag-and-drop. Используемый со вместно с Конструктором меню Инспектор объектов позволяет управлять свойствами отдельных пунктов меню. В частности, наименование пункта меню задается путем присвоения нужного значения его свойству caption.

7.4. Динамическая настройка меню С помощью Конструктора создание и настройка меню ведется при создании приложения. Кроме того, меню можно создавать или изменять динамически непосредственно при выполнении приложения. Например, возможно:

• создать новое меню любого типа или удалить его;

заблокировать или разблокировать отдельные пункты;

сделать пункт меню видимым или невидимым;

• добавить или удалить пункт меню;

изменить название пункта;

• установить или убрать отметку пункта;

переключить форму с одного главного меню на другое.

Эти возможности обеспечиваются установкой свойствам пунктов меню тре буемых значений и вызовом соответствующих методов.

Для добавления пунктов меню используются методы Add и insert, для уда ления пунктов меню используется метод Delete.

Процедура Add добавляет определяемый параметром элемент в конец подменю, которое вызвало этот метод. Если подменю не существовало, то оно создается.

Пример. Добавление пункта меню.

procedure :TSender);

var begin Newltem := 'Новый ;

end;

Добавление нового пункта производится в конец списка команд меню Файл. Добавляемый пункт имеет заголовок Новый элемент. Предварительно НОВЫЙ ПуНКТ КОНСТруКТОрОМ Create.

154 Delphi. Быстрый старт Процедура Insert (Index: Integer;

Item:, В ОТЛИЧИе ОТ предыдущего метода, добавляет новый пункт меню на указанное положение.

Параметр index определяет позицию в массиве элементов меню, на которую вставляется новый пункт. Если значение параметра index выходит за преде лы допустимого диапазона, например, больше, чем число подэлементов модифицируемого пункта меню, то возникает исключительная ситуация.

Процедура Delete (index: integer) удаляет указанный пункт меню. Если удаляемый пункт имеет подпункты, то они также удаляются.

Пример. Удаление пункта меню.

procedure :TSender);

begin if = then end;

Процедура выполняет удаление пункта из подменю Файл. Удаляемый пункт имеет заголовок Второй элемент и находится на второй позиции. Предвари тельно производится проверка, действительно ли удаляется пункт с нужным названием.

может иметь более одного главного меню. Это используется, например, в случае, когда одно из них содержит заголовки на английском языке, а другое — на русском. Для реализации такой возможности на форму следу ет поместить два компонента и подготовить соответствующие ме ню. После этого при выполнении программы возможно подключение к форме любого из этих меню. Для подключения к форме главного меню ис пользуется СВОЙСТВО Menu формы.

Пример. Переключение между двумя главными меню.

if = EnglishMenu then := RussianMenu else := EnglishMenu;

Меню ИМеЮТ названия EnglishMenu И RussianMenu. Код, реключение меню, может быть включен в соответствующий обработчик.

Напомним, что Menu является одним из свойств формы, указывающим на главное меню, которое в настоящий момент является активным.

Часть II Работа с базами данных Глава 8. Введение в базы данных Глава 9. Компоненты для работы с данными Глава 10. Операции с данными Глава Подготовка отчетов Глава Введение в базы данных 8.1. Основные понятия Для успешного функционирования различных организаций требуется нали чие развитой информационной системы, которая реализует автоматизиро ванный сбор, обработку и манипулирование данными.

8.1.1. Банки данных Современной формой информационных систем являются банки данных, включающие в свой состав следующие составляющие:

вычислительную систему;

систему управления базами данных (СУБД);

О одну или несколько баз данных (БД);

набор прикладных программ (приложений БД).

БД обеспечивает хранение информации, а также удобный и быстрый доступ к данным. БД представляет собой совокупность данных различного характе ра, организованных по определенным правилам.

СУБД представляет собой совокупность языковых и программных средств, предназначенных для создания, ведения и использования БД. По характеру использования СУБД разделяют на персональные и многопользовательские.

Персональная СУБД обеспечивает возможность создания локальных БД, работающих на одном компьютере. К персональным СУБД относятся Para dox, dBase, FoxPro, Access и другие.

Многопользовательские СУБД позволяют создавать информационные системы, функционирующие в архитектуре "клиент-сервер". К много 158 Delphi. Быстрый старт пользовательским СУБД относятся Oracle, Informix, SyBase, Microsoft SQL Server, InterBase и др.

В состав языковых средств современных СУБД входят:

язык описания данных, предназначенный для описания логической структуры данных;

язык манипулирования данными, обеспечивающий выполнение основ ных операций над данными — ввод, модификацию и выборку;

язык структурированных запросов (Structured Query Language, SQL), обеспечивающий управление структурой БД и манипулирование данными, а также являющийся стандартным средством доступа к удаленным БД;

• язык запросов по образцу (Query By Example, QBE), обеспечивающий визуальное конструирование запросов к БД.

БД содержит данные, используемые некоторой прикладной информацион ной системой, например, системами "Сирена" или "Экспресс" продажи авиа- и железнодорожных билетов. В зависимости от вида организации дан ных различают следующие основные модели представления данных в БД:

иерархическую;

реляционную;

сетевую;

объектно-ориентированную.

Большинство современных БД для персональных компьютеров являются реляционными. При последующем изложении материала речь пойдет имен но о реляционных БД.

Прикладные программы, или приложения служат для обработки данных, содержащихся в БД. Пользователь осуществляет управление БД и работу с ее данными именно с помощью приложений, которые также называют приложениями БД.

Иногда термин БД трактуют в широком смысле слова и обозначают им не только саму БД, но и приложения, обрабатывающие ее данные.

Система Delphi не является СУБД в буквальном смысле этого слова, но об ладает возможностями полноценной СУБД. Предоставляемые Delphi средст ва обеспечивают создание и ведение локальных и клиент-серверных БД, а также разработку приложений для работы практически с любыми БД.

Назвать Delphi обычной СУБД мешает, наверное, только то, что, с одной стороны, она не имеет своего формата таблиц (языка описания данных) и использует форматы таблиц других СУБД, например, dBase, Paradox или InterBase. Это вряд ли является недостатком, поскольку названные форматы хорошо себя зарекомендовали. С другой стороны, в плане создания прило жений различного назначения, в том числе приложений БД, возможности Delphi не уступают возможностям специализированных СУБД, а зачастую и превосходят их.

Часть II. Работа с базами данных 8.1.2. Архитектуры информационных систем В зависимости от взаимного расположения приложения и БД можно выделить:

локальные БД;

удаленные БД.

Для выполнения операций с локальными БД разрабатываются и использу ются так называемые локальные приложения, а для операций с удаленными БД — клиент-серверные приложения.

Расположение БД в значительной степени влияет на разработку приложе ния, обрабатывающего содержащиеся в этой базе данные. Delphi приложение осуществляет доступ к БД через BDE (Borland Database Engine — процессор баз данных фирмы Borland). BDE представляет собой совокупность динамических библиотек и драйверов, обеспечивающих дос туп к данным. Приложение через BDE передает запрос к базе данных, а об ратно получает требуемые данные. BDE должен устанавливаться на всех компьютерах, на которых выполняются Delphi-приложения, осуществляю щие работу с БД. Отметим, что при установке Delphi на компьютер по умолчанию также устанавливается BDE.

Локальные БД располагаются на том же компьютере, что и работающие с ними приложения. В этом случае информационная система имеет локаль ную архитектуру (рис. 8.1). Работа с БД происходит, как правило, в одно пользовательском режиме. При необходимости можно запустить на компью тере другое приложение, одновременно осуществляющее доступ к этим же данным. Для управления совместным доступом к БД необходимы специаль ные средства контроля и защиты. Эти средства могут понадобиться, напри мер, в случае, когда приложение пытается изменить запись, которую редак тирует другое приложение. Каждая разновидность БД осуществляет подобный контроль своими способами и обычно имеет встроенные средства разграничения доступа.

Приложение BDE База данных Компьютер пользователя 8. 1. Локальная архитектура Для доступа к локальной БД процессор баз данных BDE использует стан дартные драйверы, которые позволяют работать с форматами БД dBase, Paradox, FoxPro, а также с текстовыми файлами.

Удаленная БД размещается на компьютере-сервере сети, а приложение, осуществляющее работу с этой БД, находится на компьютере пользователя.

Delphi. Быстрый старт В этом случае речь идет об архитектуре клиент-сервер, когда информацион ная система делится на неоднородные части — сервер и клиент БД.

В связи с тем, что компьютер-сервер находится отдельно от клиента, его также называют удаленным сервером.

В архитектуре "клиент-сервер" клиент посылает серверу запрос на предос тавление данных и получает только те данные, которые действительно были затребованы. Вся обработка запроса выполняется на удаленном сервере.

Достоинствами такой архитектуры являются:

снижение нагрузки на сеть;

повышение безопасности информации;

уменьшение сложности клиентских приложений.

Отметим, что локальные приложения БД называют одноуровневыми, а кли ент-серверные приложения БД — многоуровневыми.

Далее рассматривается работа с локальными БД dBase и Paradox. Отметим, что многие примеры можно также применить и при разработке приложений для работы с удаленными БД.

8.2. Реляционные базы данных Реляционная БД состоит из взаимосвязанных таблиц. Каждая таблица со держит информацию об объектах одного типа, а совокупность всех таблиц образует единую БД.

Таблицы баз данных Таблицы, образующие БД, находятся в каталоге (папке) на жестком диске.

Таблицы хранятся в файлах и похожи на отдельные документы или элек тронные таблицы (например, табличного процессора Microsoft Excel), их можно перемещать и копировать обычным способом, например, с помощью Проводника Windows. Однако, в отличие от документов, таблицы БД под держивают многопользовательский режим доступа, т. е. могут одновременно использоваться несколькими приложениями.

Для одной таблицы создается несколько файлов, содержащих данные, ин дексы, ключи и т. п. Главным из них является файл с данными, имя этого файла является именем таблицы, которое задается при ее создании. В неко тором смысле понятие таблицы и ее главного файла являются синонимами, при выборе таблицы выбирается именно ее главный файл: для таблицы dBase им является файл с расширением DBF, а для таблицы Paradox — с расширением DB. Имена остальных файлов таблицы назначаются автоматически — все файлы имеют одинаковое имя, совпадающее с именем таблицы, и разные расширения, указывающие на содержимое соответст вующего файла.

Часть II. Работа с базами данных Каждая таблица БД состоит из строк и столбцов и предназначена для хра нения данных об однотипных объектах информационной системы. Строка таблицы называется записью, столбец таблицы — полем (рис. 8.2). Каждое поле должно иметь уникальное в пределах таблицы имя.

Поле Запись 8.2. Таблица БД Поле содержит данные одного из допустимых типов, например, строкового, целочисленного или даты. При вводе значения в поле таблицы автоматиче ски производится проверка соответствия типа значения и типа поля. В слу чае, когда эти типы не совпадают, а преобразование типа значения невоз можно, генерируется исключительная ситуация.

Особенности организации таблиц зависят от конкретной СУБД, используе мой для создания и ведения БД. Например, в таблице dBase нет поля авто инкрементного типа (с автоматически наращиваемым значением) и в ней нельзя определить ключ. Подобные особенности необходимо учитывать при выборе типа (формата) таблицы, так как они влияют не только на организа цию БД, но и на построение приложения для работы с этой БД. Однако, несмотря на все различия таблиц, существуют общие правила создания и ведения БД, а также разработки приложений, которые и будут далее рассмотрены.

Основу таблицы составляет описание ее полей, каждая таблица должна иметь хотя бы одно поле. Понятие структуры таблицы является более широ ким и включает в себя:

описание полей;

ключ;

• индексы;

ограничения на значения полей;

Delphi. Быстрый старт ограничения ссылочной целостности между таблицами;

пароли.

Иногда ограничения на значения полей, ограничения ссылочной целостно сти между таблицами, а также права доступа называют одним общим тер мином ограничения.

Отметим, что отдельные элементы структуры зависят от формата таблиц, например, для таблиц dBase нельзя задать ограничения ссылочной целост ности. Все элементы структуры задаются на физическом уровне (уровне таблицы) и действуют для всех программ, выполняющих операции с БД, включая средства разработки и ведения БД (например, программу Database Desktop). Многие из этих элементов (например, ограничения на значения полей или поля просмотра) можно также реализовать в приложении про граммно, однако в этом случае они действуют только в пределах своего приложения.

С таблицей в целом можно выполнять следующие операции:

создание (определение структуры);

изменение структуры (реструктуризация);

переименование;

• удаление.

При создании таблицы задаются структура и имя таблицы. При сохранении на диске создаются все необходимые файлы, относящиеся к таблице.

Их имена совпадают с именем таблицы.

При изменении структуры таблицы в ней могут измениться названия и ха рактеристики полей, состав и названия ключа и индексов, ограничения.

Однако название таблицы и ее файлов остается прежним.

При переименовании таблица получает новое имя, в результате чего новое имя также получают все ее файлы. Для этого используются соответствую щие программы (утилиты), предназначенные для работы с таблицами БД, например, Database Desktop или Data Pump.

Замечание Таблицу нельзя переименовать, просто изменив названия всех ее файлов, например, с помощью Проводника Windows.

При удалении таблицы с диска удаляются все ее файлы. В отличие от пере именования, удаление таблицы можно выполнить с помощью любой про граммы (в том числе и с помощью Проводника Windows).

Часть II. Работа с базами данных 8.2.2. Ключи и индексы Ключ представляет собой комбинацию полей, данные в которых однозначно определяют каждую запись в таблице. Простой ключ состоит из одного поля, а составной (сложный) — из нескольких полей. Поля, по которым построен ключ, называют ключевыми. В таблице может быть определен только один ключ. Ключ обеспечивает:

О однозначную идентификацию записей таблицы;

• предотвращение повторения значений ключа;

ускорение выполнения запросов к БД;

D установление связи между отдельными таблицами БД;

использование ограничений ссылочной целостности.

Ключ также называют первичным ключом или первичным (главньш) индексом.

Информация о ключе может храниться в отдельном файле или совместно с данными таблицы. Например, в БД Paradox для этой цели используется отдельный файл (ключевой файл или файл главного индекса) с расширени ем РХ. В БД Access вся информация содержится в одном общем файле с расширением MDB. Значения ключа располагаются в определенном по рядке. Для каждого значения ключа имеется уникальная ссылка, указываю щая на расположение соответствующей записи в таблице (в главном ее фай ле). Поэтому при поиске записи выполняется не последовательный просмотр всей таблицы, а прямой доступ к записи на основании упорядо ченных значений ключа.

Ценой, которую разработчик и пользователь платят за использование такой технологии, является увеличение размера БД вследствие необходимости хранения значений ключа, например, в отдельном файле. Размер этого фай ла зависит не только от числа записей таблицы (что достаточно очевидно), но и от полей, составляющих ключ. В ключевом файле, кроме ссылок на соответствующие записи таблицы, сохраняются и значения самих ключевых полей. Поэтому при вхождении в состав ключа строковых полей большого размера размер ключевого файла может оказаться соизмеримым с размером файла с данными таблицы.

Таблицы различных форматов имеют свои особенности построения ключей.

Вместе с тем существуют и общие правила, состоящие в следующем.

• Ключ должен быть уникальным. У составного ключа значения отдельных полей (но не всех одновременно) могут повторяться.

Ключ должен быть достаточным и неизбыточным, т. е. не содержать поля, которые можно удалить без нарушения уникальности ключа.

В состав ключа не могут входить поля некоторых типов, например, гра фическое поле или поле комментария.

164 Delphi. Быстрый старт Выбор ключевых полей не всегда является простой и очевидной задачей, особенно для таблиц с большим количеством полей. Нежелательно выби рать в качестве ключевых поля, содержащие фамилии людей в таблице со трудников организации или названия товаров в таблице данных склада.

В этом случае высока вероятность существования двух и более однофамиль цев, а также товаров с одинаковыми названиями, которые различаются, например, цветом (значение другого поля). Для указанных таблиц можно использовать, например, поле кода сотрудника и поле артикула товара. При этом предполагается, что указанные значения являются уникальными.

Удобным вариантом создания ключа является использование для него поля соответствующего типа, которое автоматически обеспечивает поддержку уникальности значений. Для таблиц Paradox таким является поле автоин крементного типа, еще одно достоинство которого заключается в неболь шом размере (4 байта). В то же время в таблицах dBase и InterBase поле по добного типа отсутствует, и программист должен обеспечивать уникальность значений ключа самостоятельно, например, используя специальные генераторы.

Отметим, что при создании и ведении БД правильным подходом считается задание в каждой таблице ключа даже в том случае, если на первый взгляд он не нужен. В примерах таблиц, которые приводятся при изложении мате риала, как правило, ключ создается, и для него вводится специальное авто инкрементное С Code ИЛИ Number.

Индекс, как и ключ, строится по полям таблицы, однако он может допус кать повторение значений составляющих его полей, в этом состоит его ос новное отличие от ключа. Поля, по которым построен индекс, называют индексными. Простой индекс состоит из одного поля, а составной (слож ный) — из нескольких полей.

Индексы при их создании именуются. Как и в случае с ключом, в зависи мости от СУБД, индексы могут храниться в отдельных файлах или совмест но с данными. Создание индекса называют индексированием таблицы.

Использование индекса обеспечивает:

увеличение скорости доступа (поиска) к данным;

сортировку записей;

• установление связи между отдельными таблицами БД;

• использование ограничений ссылочной целостности.

В двух последних случаях индекс используется совместно с ключом второй таблицы. Как и ключ, индекс представляет собой своеобразное оглавление таблицы, просмотр которого выполняется перед обращением к ее записям.

Таким образом, использование индекса повышает скорость доступа к дан ным в таблице за счет того, что доступ выполняется не последовательным, а методом.

Часть II. Работа с базами данных Сортировка представляет собой упорядочивание записей по полю или груп пе полей в порядке возрастания или убывания их значений. Индекс служит для сортировки таблиц по индексным полям. В Delphi записи набора Table можно сортировать только по индексным полям. Набор данных Query позволяет выполнить средствами SQL сортировку по любым полям, однако и в этом случае для индексированных полей упорядочивание записей вы полняется быстрее.

Для одной таблицы можно создать несколько индексов. В каждый момент времени один из них можно сделать текущим, т. е. активным. Даже при су ществовании нескольких индексов таблица может не иметь текущего индек са. Текущий индекс важен, например, при выполнении поиска и сортиров ки записей набора данных Table. Так, для компонента Table сортировка записей автоматически выполняется на основании значений именно теку щего индекса.

Ключевые поля обычно автоматически индексируются. В таблицах Para dox ключ также является главным (первичным) индексом, который не именуется. Для таблиц dBase ключ не создается, и его роль выполняет один из индексов.

Замечание Создание ключа может привести к побочным эффектам. Так, если в таблице Paradox определить ключ, то записи автоматически упорядочиваются по его значениям, что в ряде случаев является нежелательным.

Таким образом, использование ключей и индексов позволяет:

однозначно идентифицировать записи;

избегать дублирования значений в ключевых полях;

выполнять сортировку таблиц;

ускорять операции поиска в таблицах;

устанавливать связи между отдельными таблицами БД;

• использовать ограничения ссылочной целостности.

Одной из основных задач БД является обеспечение быстрого доступа к дан ным (поиска данных).

8.2.3. Способы доступа к данным При выполнении операций с таблицами используется один из следующих способов доступа к данным:

навигационный;

реляционный.

Delphi. Быстрый старт Навигационный способ доступа заключается в обработке каждой отдельной записи таблицы. Этот способ обычно используется в локальных БД или в удаленных БД небольшого размера. Если необходимо обработать несколько записей, то все они обрабатываются поочередно.

Реляционный способ доступа основан на обработке сразу группы записей, при этом если необходимо обработать одну запись, то обрабатывается груп па, состоящая из одной записи. Так как реляционный способ доступа осно вывается на SQL-запросах, то его также называют SQL-ориентированным.

Этот способ доступа ориентирован на выполнение операций с удаленными БД и является предпочтительным при работе с такими БД, хотя его можно использовать также и для локальных БД.

Способ доступа к данным выбирается программистом и зависит от средств доступа к БД, используемых при разработке приложения. Например, в при ложениях, создаваемых в Delphi, для реализации навигационного способа доступа можно использовать компоненты или Query, для реляционно го — компонент Query.

8.2.4. Связь между таблицами В частном случае БД может состоять из одной таблицы, например, с днями рождения сотрудников организации. Однако обычно реляционная БД состоит из взаимосвязанных таблиц. Организация связи (отношений) между таблицами называется связыванием или соединением таблиц.

Связи между таблицами можно устанавливать как при создании БД, так и при выполнении приложения, используя средства, предоставляемые СУБД.

Связывать можно две или несколько таблиц. В реляционной БД, помимо связанных, могут быть и отдельные таблицы, не соединенные ни с одной другой таблицей. Это не меняет сути реляционной БД, которая содержит единую информацию об информационной системе, связанную не в бук вальном смысле (связь между таблицами), а в функциональном смысле — вся информация относится к одной системе.

Для связывания таблиц используются поля связи (иногда применяется тер мин совпадающие поля). Поля связи обязательно должны быть индексиро ванными. В подчиненной таблице для связи с главной таблицей берется ин декс, который также называется внешним ключом. Состав полей этого индекса должен полностью или частично совпадать с составом полей ин декса главной таблицы.

Особенности использования индексов зависят от формата связываемых таб лиц. Так, для таблиц dBase индексы строятся по одному полю и нет деления на ключ (главный или первичный индекс) и индексы. Для организации свя зи в главной и подчиненной таблицах выбираются индексы, составленные по полям совпадающего типа, например, целочисленного.

Часть II. Работа с базами данных Для таблиц Paradox в качестве полей связи главной таблицы должны ис пользоваться поля ключа, а для подчиненной таблицы — поля индекса.

Кроме того, в подчиненной таблице обязательно должен быть определен ключ. На рис. 8.3 показана схема связи между таблицами Paradox.

Главная таблица _Code Ключевое поле Подчиненная таблица Индекс (внешний ключ) D_Code Ключевое Индексное поле поле Рис. 8.3. Схема связи между таблицами Paradox В главной таблице определен ключ, построенный по полю автоин крементного типа. В подчиненной таблице определен ключ по полю также автоинкрементного типа и индекс, построенный по полю D_code целочисленного типа. Связь между таблицами устанавливается по полям D_code и Индекс по полю является внешним клю чом. В названия полей включены префиксы, указывающие на принадлеж ность поля соответствующей таблице. Так, названия полей главной таблицы начинаются буквой (Master), а названия полей подчиненной таблицы на чинаются буквой D (Detail). Подобное именование полей облегчает ориента цию в их названиях, особенно при большом количестве таблиц.

Замечание Как отмечалось, поля связи должны быть индексированными, хотя, строго го воря, это требование не всегда является обязательным. При доступе к данным средствами языка SQL можно связать (соединить) между собой таблицы и по неиндексированным полям. Однако в этом случае скорость выполнения опера ций будет низкой.

Связь между таблицами определяет отношение подчиненности, при котором одна таблица является главной (родительской, или мастером — Master), а вторая — подчиненной (дочерней, или детальной — Detail). Саму связь (от ношение) называют связь "главный-подчиненный", дочерний" или "мастер-детальный". Существуют следующие виды связи:

168 Delphi. Быстрый старт отношение "один-к-одному";

• отношение "один-ко-многим";

отношение "много-к-одному";

отношение "много-ко-многим".

Наиболее часто используется отношение "один-ко-многим", которое означает, что одной записи главной таблицы в подчиненной таблице может соответство вать несколько записей, в частном случае ни одной. После установления связи между таблицами при перемещении в главной таблице на какую-либо за пись в подчиненной таблице автоматически становятся доступными записи, у которых значение поля связи равно значению поля связи текущей записи главной таблицы. Такой отбор записей подчиненной таблицы является сво его рода фильтрацией.

Типичным примером является, например, организация учета выдачи книг в библиотеке, для которой удобно создать следующие две таблицы:

таблицу карточек читателей, содержащую такую информацию о читателе, как фамилия, имя, отчество, дата рождения и домашний адрес;

• таблицу выдачи книг, в которую заносится информация о выдаче книги читателю и о возврате книги.

В этой ситуации главной является таблица карточек читателей, а подчинен ной — таблица выдачи книг. Один читатель может иметь на руках несколь ко книг, поэтому одной записи в главной таблице может соответствовать несколько записей в подчиненной таблице. Если читатель сдал все книги или еще не брал ни одной книги, то для него в подчиненной таблице запи сей нет. После связывания обеих таблиц при выборе записи с данными чи тателя в таблице выдачи книг будут доступны только записи с данными о книгах, находящихся на руках этого читателя.

В приведенном примере предполагается, что после возврата книги соответ ствующая ей запись удаляется из таблицы выдачи книг. Вместо удаления записи можно заносить в соответствующее поле дату возврата книги.

Работа со связанными таблицами имеет следующие особенности.

При изменении (редактировании) связанного поля может нарушиться связь между записями двух таблиц. Поэтому при редактировании поля связи записи главной таблицы нужно соответственно изменять и значе ния поля связи всех подчиненных таблиц.

При удалении записи главной таблицы нужно удалять и соответствующие ей записи в подчиненной таблице (каскадное удаление).

О При добавлении записи в подчиненную таблицу значение ее поля связи должно быть установлено равным значению поля связи главной таблицы.

Ограничения по установке, изменению полей связи и каскадному удалению записей могут быть наложены на таблицы при их создании. Эти ограниче Часть II. Работа с базами данных ния, наряду с другими элементами, например, описаниями полей и индексов, входят в структуру таблицы и действуют для всех приложений, которые вы полняют операции с БД. Указанные ограничения можно задать при созда нии или реструктуризации таблицы, например, в среде программы Database Desktop, которая позволяет устанавливать связи между таблицами при их создании.

Ограничения, связанные с установкой, изменением значений полей связи и каскадным удалением записей, могут и не входить в структуру таблицы (таблиц), а программным способом. В этом случае про граммист должен обеспечить:

• организацию связи между таблицами;

установку значения поля связи подчиненной таблицы (это может также выполняться автоматически);

контроль (запрет) редактирования полей связи;

организацию (запрет) каскадного удаления записей.

Например, в случае удаления записи из главной таблицы программист дол жен проверить наличие соответствующих записей в подчиненной таблице.

Если такие записи существуют, то необходимо удалить их или, наоборот, запретить удаление записей из обеих таблиц. И в том, и в другом случае пользователю должно быть выдано предупреждение.

8.2.5. Механизм транзакций Информация БД в любой момент времени должна быть целостной и непро тиворечивой. Одним из путей обеспечения этого является использование механизма транзакций.

Транзакция представляет собой выполнение последовательности операций.

При этом возможны две ситуации.

Успешно завершены все операции. В этом случае транзакция считается успешной, и все изменения в БД, которые были произведены в рамках транзакции отдельными операциями, утверждаются. В результате БД пе реходит из одного целостного состояния в другое.

Неудачно завершена хотя бы одна операция. При этом вся транзакция считается неуспешной, и результаты выполнения всех операций (даже успешно выполненных) отменяются. В результате происходит возврат БД в состояние, в котором она находилась до начала транзакции.

Таким образом, успешная транзакция переводит БД из одного целостного состояния в другое. Использование механизма транзакций необходимо:

при выполнении последовательности взаимосвязанных операций с БД;

при многопользовательском доступе к БД.

Delphi. Быстрый старт Транзакция может быть неявной или явной. Неявная транзакция стартует автоматически, а по завершении также автоматически подтверждается или отменяется. Явной транзакцией управляет программист с использованием компонента Database и/или средств SQL.

Часто в транзакцию объединяются операции над несколькими таблицами, когда производятся действия по внесению в разные таблицы взаимосвязанных изменений. Пусть осуществляется перенос записей из одной таблицы в другую. Если запись сначала удаляется из первой таблицы, а затем зано сится во вторую таблицу, то при возникновении сбоя, например из-за пере рыва в энергопитании компьютера, возможна ситуация, когда запись уже удалена, но во вторую таблицу не попала. Если запись сначала заносится во вторую таблицу, а затем удаляется из первой таблицы, то при сбое воз можна ситуация, когда запись будет находиться в двух таблицах. В обоих случаях имеет место нарушение целостности и непротиворечивости БД.

Для предотвращения подобной ситуации операции удаления записи из одной таблицы и занесения ее в другую таблицу объединяются в одну тран закцию. Выполнение этой транзакции гарантирует, что при любом ее результате целостность БД нарушена не будет.

8.2.6. Бизнес-правила Бизнес-правила представляют собой механизмы управления БД и предна значены для поддержания БД в целостном состоянии, а также для выполне ния ряда других действий, например, накапливания статистики работы с БД. Отметим, что здесь бизнес-правила являются правилами управления БД и не имеют отношения к бизнесу как предпринимательству.

В первую очередь бизнес-правила реализуют следующие ограничения БД:

задание допустимого диапазона значений;

задание значения по умолчанию;

требование уникальности значения;

запрет пустого значения;

ограничения ссылочной целостности.

Бизнес-правила можно реализовывать как на физическом, так и на про граммном уровнях. В первом случае эти правила (например, ограничения ссылочной целостности для связанных таблиц) задаются при создании таб лиц и входят в структуру БД. В дальнейшей работе нельзя нарушить или обойти ограничение, заданное на физическом уровне.

Вместо заданных на физическом уровне бизнес-правил или в дополнение к ним можно определить бизнес-правила на программном уровне. Действие этих правил распространяется только на приложение, в котором они Часть II. Работа с базами данных реализованы. Для в приложении бизнес-правил исполь зуются компоненты и предоставляемые ими средства. Достоинство такого подхода заключается в легкости изменения бизнес-правил и определении правил "своего" приложения. Недостатком является снижение безопасности БД, связанное с тем, что каждое приложение может устанавливать свои пра вила управления БД.

8.2.7. Форматы таблиц Delphi не имеет своего формата таблиц, но поддерживает, как свои собст венные, два типа локальных таблиц — dBase и Paradox. Каждая из этих таб лиц имеет свои особенности.

Таблицы dBase являются одним из первых появившихся форматов таблиц для персональных компьютеров и поддерживаются многими системами, ко торые связаны с разработкой и обслуживанием приложений, работающих с БД. Основные достоинства таблиц dBase: простота использования и со вместимость с большим числом приложений.

Таблицы dBase являются достаточно простыми и используют для своего хранения на дисках относительно мало физических файлов. По расширению файлов можно определить, какие данные они содержат:

DBF — таблица с данными;

DBT — данные больших двоичных объектов, или BLOB-данные (Binary Large OBject). К ним относятся двоичные, Memo- и OLE-поля. Memo поле также называют полем комментариев;

MDX — поддерживаемые индексы;

NDX — индексы, непосредственно не поддерживаемые форматом dBase.

При использовании таких индексов программист должен обрабатывать их самостоятел Имя поля в таблице dBase должно состоять из букв и цифр и начинаться с буквы. Максимальная длина имени составляет 10 символов. В имена нель зя включать специальные символы и пробел.

К недостаткам таблиц dBase относится то, что они не поддерживают автома тическое использование парольной защиты и контроль целостности связей, поэтому программист должен кодировать эти действия самостоятельно.

Таблицы Paradox являются достаточно развитыми и удобными для создания БД. Можно отметить следующие их достоинства:

большое количество типов полей для представления данных различных типов;

поддержка целостности данных;

организация проверки вводимых данных;

Delphi. Быстрый старт поддержка парольной защиты таблиц.

Большой набор типов полей позволяет гибко выбирать тип для точного представления данных, хранимых в базе. Например, для представления числовой информации можно использовать Благодаря своим достоинствам таблицы Paradox используются чаще.

В табл. 8.1 содержится список типов полей для таблиц Paradox 7. Для каждого типа приводится символ, используемый для обозначения этого типа в программе Database Desktop, и описание значений, которые может содер жать поле рассматриваемого типа.

Таблица Типы полей таблиц в Paradox Тип Обозначение Описание значения A Строка символов. Длина не более Alpha 255 символов N Число с плавающей точкой. Диапазон — Number 10. Точность 15 цифр мантиссы $ Денежная сумма. Отличается от типа Number Money тем, что в значении отображается денежный знак. Обозначение денежного знака зависит от установок Windows S Целое число. Диапазон - 32 768 — 32 Short Целое число. Диапазон — 2 147 483 648 — 2 147 483 BCD # Число в двоично-десятичном формате Date D Дата. Диапазон 01.01.9999 до н.э.— 31.12. Time Время Дата и время Memo Строка символов. Длина не ограничена. Пер вые 240 символов хранятся в файле таблицы, остальные в файле с расширением MB Formatted Строка символов. Отличается от типа Memo Memo тем, что строка может содержать форматиро ванный текст Graphic Графическое изображение. Форматы BMP, PCX, GIF и EPS. При загрузке в поле изо бражение преобразуется к формату BMP. Для хранения изображения используется файл с расширением MB Часть Работас базами данных Таблица 8. (окончание) Тип Обозначение Описание значения OLE Данные в формате, который поддерживается технологией OLE. Данные хранятся в файле с расширением MB Logical Логическое значение. Допустимы значения True (истина) и False (ложь). Разрешается использование прописных букв Автоинкрементное поле. При добавлении к таблице новой записи в поле автоматически заносится значение, на единицу большее, чем в последней добавленной записи. При удалении записи значение ее автоинкре метного поля больше не будет использова но. Значение автоинкреметного поля дос тупно для чтения и обычно используется в качестве ключевого поля Binary Последовательность байтов. Длина не огра ничена. Байты содержат произвольное дво ичное значение. Первые 240 байтов хранят ся в файле таблицы, остальные в файле с расширением MB Последовательность байтов. Длина не более Bytes 255 байтов При работе с таблицей в среде программы Database Desktop значения полей типа Graphic, Binary, Memo и OLE не отображаются.

Имя поля в таблице Paradox должно состоять из букв (допускается кирил лица) и цифр и начинаться с буквы. Максимальная длина имени составляет 25 символов. В имени можно использовать такие символы, как пробел, #, $ и некоторые другие. Не рекомендуется использовать символы., ! и |, так как они зарезервированы в Delphi для других целей.

При задании ключевых полей они должны быть первыми в структуре таблицы.

Замечание с Если требуется обеспечить перенос или совместимость данных из таблиц Paradox с таблицами других форматов, желательно выбирать имя поля длиной не более символов и составлять его из латинских букв и цифр.

Определенным недостатком таблиц Paradox является наличие относительно большого количества типов файлов, требуемых для хранения содержащихся Delphi. Быстрый старт в таблице данных. При копировании или перемещении какой-либо таблицы из одного каталога в другой необходимо обеспечить копирование или пере мещение всех файлов, относящихся к этой таблице. Файлы таблиц Paradox имеют следующие расширения:

— таблица с данными;

• — BLOB-данные;

— главный индекс (ключ);

XG* и YG* — вторичные индексы;

VAL — параметры для проверки данных и целостности ссылок;

TV и FAM — форматы вывода таблицы в программе Database Desktop.

С Замечание Указанные файлы создаются только, если в них есть необходимость;

конкрет ная таблица может не иметь всех приведенных файлов.

8.3. Средства для работы с базами данных Хотя Delphi не имеет своего формата таблиц БД, она, тем не менее, обеспе чивает мощную поддержку большого количества различных СУБД Средства Delphi, предназначенные для работы с БД, можно разделить на два вида:

инструментальные средства;

компоненты.

К инструментальным средствам относятся специальные программы и паке ты, обеспечивающие обслуживание БД вне разрабатываемых приложений.

Компоненты предназначены для создания приложений, осуществляющих операции с БД.

8.3.1. Инструментальные средства Для операций с БД система Delphi предлагает набор инструментальных средств, перечисленных ниже.

Borland Database Engine (BDE) — процессор баз данных, который пред ставляет собой набор динамических библиотек и драйверов, предназна ченных для организации доступа к БД из Delphi-приложений. BDE явля ется центральным звеном при организации доступа к данным.

BDE Administrator — утилита для настройки различных параметров BDE.

Database Desktop — программа создания и редактирования таблиц, SQL запросов и запросов QBE.

Часть II. Работа с базами данных SQL Explorer — Проводник БД, позволяющий просматривать и редакти ровать БД и словари данных.

SQL Builder — программа визуального конструирования SQL-запросов.

• Data Pump — программа для переноса данных между БД.

8.3.2. Компоненты Кроме компонентов, Delphi также предоставляет разработчику специальные объекты, например, объекты типа Как и другие управляющие элементы Delphi, связанные с БД, компоненты делятся на визуальные и невизуальные.

Невизуальные компоненты предназначены для организации доступа к дан ным, содержащимся в таблицах. Они представляют собой промежуточное звено между данными таблиц БД и визуальными компонентами.

Визуальные компоненты используются для создания интерфейсной части приложения. С их помощью пользователь может выполнять такие операции с таблицами БД, как просмотр или редактирование данных. Визуальные компоненты также называют элементами, чувствительными к данным.

Основная часть компонентов, используемых для работы с БД, находится на страницах Data Access, Data Controls, BDE и QReport Палитры компонентов.

Замечание Состав страниц Палитры компонентов, а также состав расположенных на них компонентов различаются в зависимости от версии Delphi. Ниже приведены страницы Палитры компонентов, соответствующие Delphi 6. В предыдущих версиях страница BDE отсутствует, а большинство ее компонентов, включая Table и Query, расположено на странице Data Access.

На странице Data Access (рис. 8.4) находятся невизуальные компоненты, предназначенные для организации доступа к данным:

- источник данных;

- клиентский набор данных;

DataSetProvider - провайдер набора данных.

Data Access Рис. 8.4. Страница Data Access Delphi. Быстрый старт На странице Data Controls (рис. 8.5) находятся визуальные компоненты, предназначенные для управления данными:

DBGrid — сетка (таблица);

DBNavigator — навигационный интерфейс;

DBText — надпись;

DBEdit — однострочный редактор;

— многострочный редактор;

— графический образ;

DBListBox — простой список;

— комбинированный список;

— независимый переключатель;

— группа зависимых переключателей;

— простой список, формируемый по полю другого на бора данных;

— комбинированный список, формируемый другого набора данных;

— полнофункциональный тестовый редактор;

— модифицированная сетка;

DBChart — диаграмма.

| | | • 'S 8.5. Страница Data Controls На странице BDE 8.6) находятся компоненты, предназначенные для управления данными с использованием BDE:

Table — набор данных, основанный на таблице БД;

Query — набор данных, основанный на SQL-запросе;

storedProc — вызов хранимой процедуры сервера;

• DataBase — соединение с БД;

— текущий сеанс работы с БД;

— выполнение операций над группой записей;

updateSQL — модификация набора данных, основанного на SQL-запросе;

Часть II. Работа с базами данных — вложенная таблица;

— клиентский набор данных.

iress j. j ] InterBa 8.6. Страница BDE На странице QReport 8.7) находятся компоненты (в основном визуаль ные), предназначенные для построения отчетов:

QuickRep — отчет;

— полоса отчета для таблиц, связанных отношением "глав ный-подчиненный";

— строковая полоса отчета;

• QRBand — полоса отчета;

— дочерняя полоса отчета;

• QRGroup — группа;

— надпись;

QRDBText — текстовое поле набора данных;

QRExpr — выражение;

— системная информация;

— многострочный текст;

— многострочное выражение;

QRRichText — форматированный текст;

• QRDBRichText — форматированный текст поля данных;

QRShape — геометрическая фигура;

— графический образ;

— графический образ поля набора данных;

• — составной отчет;

• — окно просмотра отчета;

— текстовый фильтр;

— CSV-фильтр;

О — HTNL-фильтр;

QRChart — диаграмма.

Delphi. Быстрый старт | Decision Cube | j Win 3.1 | Samples | | | | Servers | 8.7. Страница QReport Названия многих компонентов, предназначенных для работы с данными, содержат префиксы, например, DB ИЛИ QR. Префикс означает, что визуальный компонент связан с данными и используется для построения интерфейсной части приложения. Такие компоненты размешаются на форме и предназначены для управления данными со стороны пользова теля. Префикс QR означает, что компонент используется для построения отчетов. Эти компоненты размещаются на компоненте отчета и его элементах, например, на полосе QRBand, и служат для оформления внешнего вида отчета.

8.4. Технология создания информационной системы В качестве первого примера использования возможностей Delphi по работе с БД рассмотрим технологию создания простой информационной системы.

Эту информационную систему можно создать без программирования, она не требует написаний кода: все необходимые операции выполняются с помо щью программы Database Desktop, Конструктора формы и Инспектора объ ектов. При создании информационной системы основными являются сле дующие этапы:

создание БД;

создание приложения.

В простейшем случае БД состоит из одной таблицы. Если таблицы уже имеются, то первый этап не выполняется. Отметим, что совместно с Delphi поставляется большое количество примеров приложений, в том числе и приложений БД. Файлы таблиц для этих приложений находятся в каталоге Program Files\Shared Files\Borland Shared\Data. Готовые таблицы можно ис пользовать также и для своих приложений.

8.5. Создание таблиц базы данных Для работы с таблицами БД при проектировании приложения удобно ис пользовать программу Database Desktop, которая позволяет выполнять сле дующие действия:

создание таблицы;

изменение структуры;

редактирование записей.

Часть II. Работа с базами данных Кроме того, с помощью Database Desktop можно выполнять и другие дейст вия над БД (создание, редактирование и выполнение визуальных запросов и SQL-запросов, операции с псевдонимами).

Процесс создания новой таблицы начинается по команде File | New | Table (Файл | Создать | Таблица) и происходит в интерактивном режиме. При этом разработчик должен:

выбрать формат (тип) таблицы;

• задать структуру таблицы.

В начале создания новой таблицы в окне Create Table (Создание таблицы) (рис. 8.8) выбирается ее формат. По умолчанию предлагается формат табли цы Paradox версии 7, который мы и будем использовать. Для таблиц других форматов, например, dBase IV, действия по созданию таблицы практически не отличаются.

Create Table • type:

| Hel p 8.8. Выбор формата таблицы После выбора формата таблицы появляется окно определения структуры таблицы (рис. 8.9), в котором выполняются следующие действия:

описание полей;

задание ключа;

задание индексов;

определение ограничений на значения полей;

определение условий (ограничений) ссылочной целостности;

О задание паролей;

О задание языкового драйвера;

задание таблицы для выбора значений.

В этом списке обязательным является только первое действие, т. е. каждая таблица должна иметь хотя бы одно поле. Остальные действия выполняются при необходимости. Часть действий такие, как задание ключа и паролей, производится для таблиц определенных форматов, например, для таблиц Paradox.

После определения структуры таблицы ее необходимо сохранить, нажав кнопку Save as (Сохранить как) и указав расположение таблицы на диске и ее имя. В результате на диск записывается новая таблица, первоначально пустая, при этом все необходимые файлы создаются автоматически.

Delphi. Быстрый старт Create Paradox 7 Table: ( ) Field [ Secondary Name i 15;

Salary press to choose a field Help 8.9. Определение структуры таблицы 8.5.1. Описание полей Центральной частью окна определения структуры таблицы является список Field roster (Список полей), в котором указываются поля таблицы. Для каж дого поля задаются:

имя — в столбце Field Name;

тип — в столбце размер — в столбце Size.

Имя поля вводится по правилам, установленным для выбранного формата таблиц. Правила именования и допустимые типы полей таблиц Paradox опи саны во введении в БД.

Тип поля можно задать, непосредственно указав соответствующий символ, например, А ДЛЯ СИМВОЛЬНОГО ИЛИ ДЛЯ целочисленного поля, или выбрать его из списка, раскрываемого при нажатии клавиши или щелч ком правой кнопки мыши в столбце (Тип). Список содержит все типы полей, допустимые для заданного формата таблицы. В списке подчеркнуты символы, используемые для обозначения соответствующего типа, при выбо ре типа эти символы автоматически заносятся в столбец (Тип).

Размер поля задается не всегда, необходимость указания зависит от типа поля. Для полей определенного типа, например, автоинкрементно го (+) или целочисленного размер поля не задается. Для поля стро Часть II. Работа с базами данных кового типа размер определяет максимальное число символов, которые могут храниться в поле.

Добавление к списку полей новой строки выполняется переводом курсора вниз на несуществующую строку, в результате чего эта строка появляется в конце списка. Вставка новой строки между существующими строками с описанием полей выполняется нажатием клавиши . Новая строка вставляется перед строкой, в которой расположен курсор. Для удаления строки необходимо установить курсор на эту строку и нажать комбинацию клавиш +.

Ключ создается указанием его полей. Для указания ключевых полей в столбце ключа (Key) нужно установить символ *, переведя в эту позицию курсор и нажав любую алфавитно-цифровую клавишу. При повторном на жатии клавиши отметка о принадлежности поля ключу снимается. В струк туре таблицы ключевые поля должны быть первыми, т. е. верхними в списке полей. Часто для ключа используют автоинкрементное поле (см. рис. 8.9).

Напомним, что для таблиц Paradox ключ также называют первичным индек сом (Primary Index), а для таблиц dBase ключ не создается, и его роль вы полняет один из индексов.

Для выполнения остальных действий по определению структуры таблицы используется комбинированный список Table properties (Свойства таблицы), содержащий следующие пункты:

Secondary Indexes — индексы;

Validity Checks — проверка правильности ввода значений полей (выбира ется по умолчанию);

• Referential Integrity — ссылочная целостность;

Password Security — пароли;

Table Language — язык таблицы (языковой драйвер);

Table Lookup — таблица выбора;

Dependent Tables — подчиненные таблицы.

После выбора какого-либо пункта этого списка в правой части окна опреде ления структуры таблицы появляются соответствующие элементы, с помо щью которых выполняются дальнейшие действия.

Состав данного списка зависит от формата таблицы. Так, для таблицы dBase он содержит только пункты Indexes (Индексы) и Table Language (Язык таблицы).

8.5.2. Задание индексов Задание индекса сводится к определению:

состава полей;

имени.

параметров;

182 Delphi. Быстрый старт Эти элементы устанавливаются или изменяются при выполнении операций создания, изменения и удаления индекса.

Для выполнения операций, связанных с заданием индексов, необходимо выбрать пункт Secondary Indexes (Вторичные индексы) комбинированного списка, при этом под списком появляются кнопки Define (Определить) и Modify (Изменить), список индексов и кнопка Erase (Удалить). В списке индексов выводятся имена созданных индексов, на рис. 8.9 это индекс ind Напомним, что для таблиц Paradox индекс также называют вторичным ин дексом.

Создание нового индекса начинается с нажатия кнопки Define (Опреде лить), являющейся всегда доступной. Это приводит к появлению окна De fine Secondary Index (Задание вторичного индекса), в котором задаются со став полей и параметры индекса (рис. 8.10).

Define Index Fields: fields:

Code alary Change older ' j и -'• •, U n i q u e Г Case sensitive, OK Cancel Help 8.10. Окно задания индекса В списке Fields (Поля) окна выводятся имена всех полей таблицы, включая и те, которые нельзя включать в состав индекса, например, графическое поле или поле комментария. В списке Indexed Fields (Индексные поля) со держатся поля, которые включаются в состав создаваемого индекса. Пере мещение полей между списками выполняется выделением нужного поля (полей) и нажатием расположенных между списками кнопок с изображе нием горизонтальных стрелок. Имена полей, которые нельзя включать в состав индекса, выделяются в левом списке серым цветом. Поле не мо жет быть повторно включено в состав индекса, если оно уже выбрано и находится в правом списке.

Часть II. Работа с базами данных Замечание При работе с записями индексные поля обрабатываются в порядке следования этих полей в составе индекса. Это нужно учитывать при указании порядка по лей в индексе.

Изменить порядок следования полей в индексе можно с помощью кнопок с изображением вертикальных стрелок, имеющих общее название Change or der (Изменение порядка). Для перемещения поля (полей) необходимо его (их) выделить и нажать нужную кнопку.

Переключатели, расположенные в нижней части окна задания индекса, по зволяют указать следующие параметры индекса:

Unique — индекс требует для составляющих его полей уникальных значений;

Maintained — если таблица открыта, индекс автоматически не модифицируется;

Case sensitive — для полей строкового типа учитывается регистр сим волов;

Descending — сортировка выполняется в порядке убывания значений.

Так как для таблиц dBase нет ключей, то для них использование параметра Unique (Уникальный) является единственной возможностью обеспечить уникальность записей на физическом уровне (уровне организации таблицы), не прибегая к программированию.

После задания состава индексных полей и нажатия кнопки появля ется окно Save Index As (Сохранить индекс как), в котором указывается имя индекса (рис. Для удобства обращения к индексу в его имя можно включить имена полей, указав какой-нибудь префикс, например ind. Нежелательно образовывать имя индекса только из имен полей, так как для таблиц Paradox подобная система именования используется при автоматическом образовании имен для обозначения ссылочной целост ности между таблицами. После повторного нажатия ОК сформирован ный индекс добавляется к таблице, и его имя появляется в списке ин дексов.

(Save Index As rams.

, OK | Cancel ] Hel | p 8.11. Задание имени индекса Delphi. Быстрый старт Созданный индекс можно изменить, определив новый состав полей, пара метров и имени индекса. Изменение индекса не отличается от процесса его создания. После выделении индекса в списке и нажатия кнопки Modify (Изменить) снова открывается окно задания (см. рис. 8.10). При нажатии кнопки появляется окно сохранения индекса (рис. 8.11), со держащее имя изменяемого индекса, которое можно исправить или оставить прежним.

Для удаления индекса его нужно выделить в списке индексов и нажать кнопку Erase (Удалить). В результате индекс удаляется без предупреждаю щих сообщений.

Кнопки Modify (Изменить) и Erase (Удалить) доступны, только если индекс выбран в списке.

8.5.3. Задание ограничений на значения полей Задание ограничений на значения полей заключается в указании для полей:

требования обязательного ввода значения;

минимального значения;

максимального значения;

значения по умолчанию;

маски ввода.

( Замечание Установленные ограничения задаются на физическом уровне (уровне таблицы) и действуют для любых программ, выполняющих операции с таблицей: как для систем типа Database Desktop, так и для приложений, создаваемых в Delphi.

Дополнительно к этим ограничениям или вместо них в приложении можно так же задать программные ограничения.

Для выполнения операций, связанных с заданием ограничений на значения полей, нужно выбрать пункт Validity Checks (Проверка значений) комбини рованного списка Table properties (Свойства таблицы) (см. рис. 8.9).

8.5.4. Задание ссылочной целостности Понятие ссылочной целостности относится к связанным таблицам и прояв ляется в следующих вариантах взаимодействия таблиц:

О запрещается изменение поля связи или удаление записи главной табли цы, если для нее имеются записи в подчиненной таблице;

при удалении записи в главной таблице автоматически удаляются соот ветствующие ей записи в подчиненной таблице (каскадное удаление).

Часть II. Работа с базами Для выполнения операций, связанных с заданием ссылочной целостности, необходимо выбрать пункт Referential Integrity (Справочная целостность) комбинированного списка Table properties (Свойства таблицы) (см. рис. 8.9).

8.5.5. Задание паролей Пароль позволяет задать права доступа пользователей (приложений) к таб лице. Если для таблицы задать пароль, то он будет автоматически запраши ваться при каждой попытке открытия таблицы.

Замечание Пароль действует на физическом уровне и его действие распространяется на все программы, выполняющие доступ к таблице: как на программы типа Data base Desktop, так и на создаваемые приложения Delphi.

Для выполнения операций, связанных с заданием пароля, нужно выбрать стро ку Password Security (Защита паролем) в комбинированном списке Table proper ties (Свойства таблицы) окна определения структуры таблицы (см. рис. 8.9).

8.5.6. Задание языкового драйвера Для задания языкового драйвера нужно выбрать пункт Table Language (Язык таблицы) комбинированного списка Table properties (Свойства таблицы) ок на определения структуры таблицы (см. рис. 8.9).

8.5.7. Изменение структуры таблицы Структуру существующей таблицы можно изменить, выполнив команду Ta ble | Restructure (Таблица | Изменение структуры) после предварительного выбора таблицы в окне программы Database Desktop. В результате открыва ется окно определения структуры таблицы, и дальнейшие действия не отли чаются от действий, выполняемых при создании таблицы.

Замечание При изменении структуры таблицы с ней не должны работать другие приложе ния, в том числе Delphi. Поэтому предварительно необходимо закрыть Delphi или приложение, в котором компоненты Table связаны с перестраиваемой таблицей. Другим вариантом является отключение активности компонентов Table, связанных с перестраиваемой таблицей, для чего свойству Acti ve этих компонентов через Инспектор объектов устанавливается значение False.

Переименование таблицы следует выполнять из среды программы Database Desktop, а не из среды Windows, например, с помощью Проводника. Для этого при работе со структурой таблицы можно нажать кнопку Save as... (Сохранить как) и указать новое имя таблицы. В результате в указанном каталоге диска появятся все необходимые файлы таблицы. При этом старая таблица также сохраняется. Информация о названии таблицы используется внутри ее фай 186 Delphi. Быстрый старт лов, поэтому простое переименование всех файлов таблицы приведет к ошиб ке при попытке обратиться к таблице.

Если необходимо просто ознакомиться со структурой таблицы, то выполняется команда Table | Into Structure (Таблица | Структура). В результате появляется окно определения структуры таблицы, но элементы, с помощью которых в структуру таблицы могут быть внесены изменения, заблокированы. Просмотр структуры возможен также для таблицы, с которой связаны другие приложения.

8.5.8. Работа с псевдонимами Для работы с псевдонимами БД можно использовать инструментальное средство Alias Manager (Менеджер псевдонимов) (рис. 8.12), вызываемый по команде Tools | Alias Manager (Сервис | Менеджер псевдонимов) меню про граммы Database Desktop.

[Alias Manager Database i y use.

s not currentl Database alias:

Show aliases only Path: ' Show aliases only Show aliases. •• Cancel fiemove Help 8.12. Окно Менеджера псевдонимов С помощью Менеджера псевдонимов можно создавать (кнопка New) и уда лять (кнопка Remove) псевдонимы. Имя псевдонима вводится (для нового) или выбирается (для существующего) в списке Database alias (Псевдонимы БД). Кроме того, можно изменять параметры псевдонимов: тип драйвера (список Driver type) и путь (поле Path). Путь можно ввести вручную или вы брать в окне просмотра каталогов, вызываемом нажатием кнопки Browse (Обзор).

Информация о псевдонимах сохраняется в конфигурационном файле idapi.cfg процессора баз данных.

Часть II. Работа с базами данных 8.6. Создание приложения Для примера рассмотрим создание приложения, позволяющего перемещать ся по записям таблицы БД, просматривать и редактировать поля, удалять записи из таблицы, а также вставлять новые. Файл проекта приложения обычно не требует от разработчика выполнения каких-либо действий. По этому при создании приложения главной задачей является конструирование форм, в простейшем случае — одной формы.

Вид формы приложения на этапе проектирования показан на рис. 8.13, где форме размещены КОМПОНеНТЫ Tablel, DataSourcel, DBGridl И DBNavigatorl.

Приложение без кода •Davis St.

Jones 2094056 Altos Parker 1209395 74 St Sawyer ;

Dave 101 St LosAltos 8.13. Форма приложения для работы с БД Компонент Tablel обеспечивает взаимодействие с таблицей БД. Для связи с требуемой таблицей нужно установить соответствующее значение свойст вам К БД, И указывающему имя таблицы. После задания таблицы для открытия набора данных свойству Active должно быть установлено значение True.

Замечание с Значение True свойству Acti ve нужно устанавливать после задания таблицы БД, то есть после установки нужных значений свойств DataBaseName и TableName.

Имя таблицы лучше выбирать из раскрывающегося списка в поле значения свойства TableName. Если путь к БД (СВОЙСТВО DataBaseName) задан пра вильно, то в этом списке отображаются главные файлы всех доступных таблиц.

В рассматриваемом приложении использована таблица клиентов, входящая в состав поставляемых с Delphi примеров, ее главный файл — clients.dbf.

Файлы этой и других таблиц примеров находятся в каталоге, путь к которо му указывает псевдоним dbdemos.

7 3ак.

Delphi. Быстрый старт Компонент DataSourcel является промежуточным звеном между компонен том 1, соединенным с реальной таблицей БД, и визуальными компо нентами и DBNavigatorl, с помощью которых пользователь взаи модействует с этой таблицей. На компонент с которым связан компонент DataSourcel, указывает свойство DataSet последнего.

Компонент DBGridl отображает содержимое таблицы БД в виде сетки, в которой столбцы соответствуют полям, а строки — записям таблицы. По умолчанию пользователь может просматривать и редактировать данные.

Компонент DBNavigatorl позволяет пользователю осуществлять перемеще ние по таблице, редактировать, вставлять и удалять записи. Компоненты DBGridl и DBNavigatorl связываются со своим источником данных — ком понентом DataSourcel — через свойства DataSource.

Взаимосвязь компонентов приложения и таблицы БД и используемые при этом свойства компонентов показаны на рис. 8.14.

DataSource DBGridl Client.dbf DataSourcel DataSource DBNavigatorl Active Таблица Форма приложения БД Рис. 8.14. Взаимосвязь компонентов приложения и таблицы БД При разработке приложения значения всех свойств компонентов можно за дать с помощью Инспектора объектов. При этом требуемые значения можно набрать в поле значений или выбрать из раскрывающихся списков. В по следнем случае приложение создается с помощью мыши и не требует набо ра каких-либо символов с клавиатуры. В табл. 8.2 приведены компоненты, используемые для работы с таблицей БД, основные свойства и их значения.

В дальнейшем при организации приложений предполагается, что названные компоненты связаны между собой именно таким образом, и свойства, с по мощью которых эта связь осуществляется, не рассматриваются.

Для автоматизации процесса создания формы, использующей компоненты для операций с БД, можно вызвать Database Form Wizard (Мастер форм баз данных). Этот Мастер расположен на странице Business Хранилища объектов.

Мастер позволяет создавать формы для работы с отдельной таблицей, а так же со связанными таблицами, при этом можно использовать наборы данных Table ИЛИ Query.

Часть II. Работа базами данных с Таблица 8.2. Значения свойств компонентов Компонент Свойства Значения Tablel Active true DataSet Tablel DBGridl DataSource DataSourcel DBNavigatorl DataSource DataSourcel Глава Компоненты для работы с данными 9.1. Компоненты доступа к данным Компоненты доступа к данным являются невизуальными. В этом разделе рассматриваются основные компоненты доступа к данным.

9.1.1. Наборы данных Таблицы БД располагаются на диске и являются физическими объектами.

Для операций с данными, содержащимися в таблицах, используются наборы данных. В терминах системы Delphi набор данных представляет собой сово купность записей, взятых из одной или нескольких таблиц БД. Записи, вхо дящие в набор данных, отбираются по определенным правилам, при этом в частных случаях набор данных может включать в себя все записи из связан ной с ним таблицы или не содержать ни одной записи. Набор данных яв ляется логической таблицей, с которой можно работать при выполнении приложения. Взаимодействие таблицы и набора данных напоминает взаи модействие физического файла и файловой переменной.

Замечание В отличие от Delphi, многие СУБД вместо термина набор данных используют термины выборка или таблица.

В Delphi для работы с наборами данных служат такие компоненты, как Table И Query, КОТОрые ЯВЛЯЮТСЯ ПРОИЗВОДНЫМИ ОТ TDBDataSet — потомка класса TDataSet (через класс TBDEDataSet). Они имеют схожие с базовыми классами характеристики и поведение, но каждый из них имеет Часть II. Работа с базами данных и свои особенности. Рассмотрим наиболее общие характеристики наборов данных.

Расположение БД, с таблицами которой выполняются операции, указывает свойство типа string. Значением свойства является имя ката лога, в котором находится БД (файлы ее таблиц), или псевдоним, ссылаю щийся на этот каталог. Если для БД определен псевдоним (alias), то его можно выбрать через Инспектор объектов в раскрывающемся списке.

Желательно задавать имя БД через псевдоним. Это заметно облегчает пере нос приложения и файлов БД в другие каталоги и на другие компьютеры, так как для обеспечения работоспособности приложения после изменения распо ложения БД достаточно изменить название каталога, на который ссылается псевдоним БД. Псевдоним можно создать с помощью программ Database Desktop или BDE Administrator.

Для компонента Table использование свойства DatabaseName является един ственной возможностью задать местонахождение таблиц БД. Для компонен та Query дополнительно можно указать в запросе SQL путь доступа к каж дой таблице.

Замечание При задании расположения БД программным способом набор данных предва рительно необходимо закрыть, установив его свойству Acti ve значение False. В противном случае генерируется исключительная ситуация.

В зависимости от ограничений и критерия фильтрации один и тот же набор данных в разные моменты времени может содержать различные записи.

Число записей, составляющих набор данных, определяет свойство RecordCount типа Longint. Это свойство доступно для чтения при выпол нении приложения. Управление числом записей в наборе данных осуществ ляется косвенно — путем отбора записей тем или иным способом, напри мер, с помощью фильтрации или SQL-запроса (для компонента Query).

Пример. Перебор всех записей набора данных.

var i: integer;

for i := 1 to do begin // Здесь можно расположить операторы, выполняющие // обработку очередной записи end;

192 Delphi. Быстрый старт Перебор всех записей набора данных осуществляется в цикле, для чего пе ременная i цикла последовательно принимает значения от 1 до Перед началом цикла вызовом метода First выполняется пе реход к первой записи набора данных. В цикле для перехода к следующей записи вызывается метод Next.

Для локальных таблиц dBase или Paradox составляющие набор данных запи си последовательно нумеруются, начиная с единицы. Номер записи в наборе данных определяет свойство RecNo типа Longint, которое доступно во время выполнения программы.

Номер текущей записи можно узнать, например, так:

:= Замечание При изменении порядка сортировки или фильтрации нумерация записей также изменяется.

Для таблиц Paradox свойство RecNo можно использовать для перехода к тре буемой записи, установив в качестве значения свойства номер записи.

Пример. Переход к записи с указанным номером.

Tablel.RecNo := Здесь выполняется переход к записи, номер которой содержится в поле ре дактирования Editl. Эта запись становится текущей.

Для выполнения операций с наборами данных используются два способа доступа к данным:

навигационный;

реляционный.

Навигационный способ доступа заключается в обработке каждой отдельной записи набора данных. Этот способ обычно используется в локальных БД или в удаленных БД небольшого размера. При навигационном способе дос тупа каждый набор данных имеет невидимый указатель текущей записи.

Указатель определяет запись, с которой могут выполняться такие операции, как редактирование или удаление. Поля текущей записи доступны для про смотра. Например, компоненты DBEdit и DBText отображают содержимое соответствующих полей именно текущей записи. Компонент DBGrid указы вает текущую запись с помощью специального маркера.

В разрабатываемом приложении навигационный способ доступа к данным МОЖНО реализовать, ИСПОЛЬЗУЯ ЛЮбоЙ ИЗ КОМПОНеНТОВ Tabl e ИЛИ Query.

Реляционный способ доступа основан на обработке группы записей. Если требуется обработать одну запись, все равно обрабатывается группа, Часть II. Работа с базами данных состоящая из одной записи. При реляционном способе доступа исполь зуются SQL-запросы, поэтому его называют также SQL ориентированным. Реляционный способ доступа ориентирован на работу с удаленными БД и является для них предпочтительным. Однако его можно использовать и для локальных БД.

9.1.2. Состояния наборов данных Наборы данных могут находиться в открытом или закрытом состояниях, на что указывает свойство Active типа Boolean. Если свойству Active уста новлено значение True, то набор данных открыт. Открытый компонент Table содержит набор данных, соответствующий данным таблицы, связан ной с ним через свойство TableName. Для открытого компонента Query на бор данных соответствует результатам выполнения SQL-запроса, содержащегося в свойстве этого компонента. Если свойство Active имеет значение False (по умолчанию), то набор данных закрыт, и его связь с БД разорвана.

Набор данных может быть открыт на этапе разработки приложения. Если при этом к набору данных через источник данных DataSource подключены визуальные компоненты, например, DBGrid или DBEdit, то они отображают соответствующие данные таблицы БД.

( Замечание На этапе проектирования приложения визуальные компоненты отображают данные записей набора данных, но перемещение по набору данных и редакти рование записей невозможны. Исключение составляет возможность переме щения текущего указателя с помощью полос прокрутки компонента DBGrid.

Если по каким-либо причинам открытие набора данных невозможно, то при попытке установить свойству Active значение True выдается сообщение об ошибке, а свойство Active сохраняет значение False. Одной из причин не возможности открытия набора данных может быть неправильное значение СВОЙСТВ ИЛИ SQL.

Замечание На этапе проектирования свойству Acti ve наборов данных автоматически ус танавливается значение False при изменении значения свойств TableName или SQL.

Пример. Управление состоянием набора данных.

Рассмотрим управление состоянием набора данных с помощью свойства Active, которое используется для открытия и закрытия набора данных Queryl.

procedure 194 Delphi. Быстрый старт begin := false;

* from := true;

end;

Управлять состоянием набора данных можно также с помощью методов Open И Close.

Процедура открывает набор данных, ее вызов эквивалентен установке свойству Active значения True. Процедура закрывает набор данных, ее вызов эквивалентен установке свойству Active значения False.

При открытии набора данных любым способом возникают события BeforeOpen И AfterOpen описывается следующим образом:

type TDataSetNotifyEvent = TDataSet) of object;

В этом описании параметр определяет набор данных, для которого произошло событие.

При ДаННЫХ ВОЗНИКаЮТ СОбыТИЯ BeforeClose И типа TDataSetNotifyEvent.

Отметим, что закрытие набора данных автоматически не сохраняет текущую запись, т. е. если набор данных при закрытии находился в режимах редак тирования или вставки, то произведенные изменения данных в текущей за писи будут потеряны. Поэтому перед закрытием набора данных необходимо проверять его режим и при необходимости принудительно вызывать метод сохраняющий сделанные изменения. Одним из вариантов сохранения изменений является вызов метода в обработчике события BeforeClose, возникающего непосредственно перед закрытием набора данных.

Пример. Сохранение изменений при закрытии набора данных.

procedure TDataSet);

begin if = dsEdit) or = then end;

В приведенном примере, если набор данных Tablel находится в режиме редактирования или вставки, то перед его закрытием внесенные изменения сохраняются.

Замечание При закрытии приложения событие BeforeClose не генерируется, и несохра ненные изменения теряются.

Часть II. Работа с базами данных 9.1.3. Режимы наборов данных Наборы данных могут находиться в различных режимах. Текущий режим набора данных определяется свойством state типа TDataSetstate, которое доступно для чтения во время выполнения приложения. Для перевода набора данных в требуемый режим используются специальные методы. Они могут вызываться явно (указанием имени метода) или косвенно (путем управления соответствующими визуальными компонентами, например, навигатором DBNavigator ИЛИ Выделим следующие основные режимы набора данных.

— неактивность;

набор данных закрыт и доступ к его дан ным невозможен. В этот режим набор данных переходит после его за крытия, когда свойству Active установлено значение False.

dsBrowse — осуществляется навигация по записям набора данных и просмотр данных. В этот режим набор данных переходит следующим образом:

• из режима — при установке свойству Active значения True;

• ИЗ режима dsEdit — При методов Post ИЛИ Cancel;

• ИЗ режима — при ВЫЗОВе Post ИЛИ Cancel.

dsEdit — редактирование текущей записи. В этот режим набор данных переходит из режима dsBrowse при вызове метода Edit.

— вставка новой записи. В данный режим набор данных пере ходит ИЗ режима dsBrowse методов Insert, InsertRecord, Append ИЛИ AppendRecord.

dsCalcFields — расчет вычисляемых полей. Используется обработчик события OnCalcFields.

dsSetKey — поиск записи, удовлетворяющей заданному критерию. В этот режим набор данных переходит из режима dsBrowse при вызове SetKey, SetRangeXXX, GotoKey, FindNearest ИЛИ GotoNearest. Возможен только для компонента ттаЫе, так как для ком понента Query отбор записей осуществляется средствами языка SQL.

• — фильтрация записей. В этот режим набор данных автоматически переходит из режима dsBrowse каждый раз, когда выполняется обработчик события В режиме блокируются все попытки изменения за писей. После завершения работы обработчика события OnFiiterRecord на бор данных автоматически переводится в режим dsBrowse.

196 Delphi. Быстрый старт Взаимосвязи между основными режимами наборов данных показаны на рис. 9.1, где приведены также некоторые методы и свойства, с помощью которых набор данных переходит из одного режима в другой.

Post, Cancel Рис. 9.1. Взаимосвязи режимов наборов данных Иногда при описании операций, выполняемых с записями набора данных, под режимом редактирования подразумевается не только режим dsEdit из менения полей текущей записи, но и режим вставки новой запи си. Тем самым режим редактирования понимается в широком смысле слова как режим модификации набора данных.

При выполнении программы определить режим набора данных можно с помощью одноименных свойств state типа TDataSetstate самого набора данных и связанного с ним источника данных DataSource. При изменении режима набора данных для источника данных DataSource генерируется со бытие OnStateChange TNotifyEvent.

Пример. Анализ режима набора данных.

procedure begin case of := данных закрыт';

:= набора dsEdit: := набора dsinsert: := записи в набор Часть II. Работа с базами данных else := Режим набора данных не end;

end;

Здесь определяется режим набора данных, связанного с источником данных и информация об этом режиме выводится в надписи При этом используется свойство state источника данных. Код, выполняю щий анализ режима, помещен в обработчик события компо нента DataSourcel.

Доступ к полям Каждое поле набора данных представляет собой отдельный столбец, для ра боты с которым в Delphi служат объект Field типа и объекты произ водных ОТ ТИПОВ, например, TFloatField ИЛИ Для доступа к этим объектам и, соответственно, к полям за писей набор данных имеет соответствующие методы и свойства, доступные при выполнении приложения.

Для доступа к полям удобно использовать метод Функция String): TFieid Возвращает ДЛЯ набора дан ных поле, имя которого указывает параметр FieldName. Если заданное па раметром FieldName поле не найдено, то генерируется исключительная си туация.

С Замечание Имя поля, определяемое параметром FieldName, является именем физиче ского поля таблицы БД, заданным при создании таблицы, а не именем (свойст вом Name) объекта Fi el d, которое создано для этого поля.

Для набора данных Query имя FieldName физического поля можно переоп ределить в тексте SQL-запроса.

Метод FieidByName часто используется для доступа к значению поля теку щей записи совместно с такими свойствами объекта Field, как AsString, или которые соответственно позволяют об ращаться к значению поля как к строковому, целочисленному, веществен ному или логическому значению.

Пример. Чтение содержимого полей текущей записи.

Var x: integer;

:= x := 198 Delphi. Быстрый старт Здесь строковое значение поля Name отображается в надписи а пе ременной х присваивается целочисленное значение поля Number. Если же поле Number содержит значение, которое нельзя интерпретировать как целое число, то генерируется исключительная ситуация.

9.1.5. Особенности набора данных Table Компонент Table представляет собой набор данных, который в некоторый момент времени может быть связан только с одной таблицей БД. Этот на бор данных формируется на основе навигационного способа доступа к дан ным, поэтому компонент Table рекомендуется использовать для локальных БД, таких как dBase или Paradox. При работе с удаленными БД следует ис пользовать компонент Query.

Связь между таблицей и компонентом Table устанавливается через его свойство типа которое задает имя таблицы (и имя файла с данными таблицы). При задании значения свойству TabieName ука зываются имя файла и расширение имени файла.

На этапе разработки приложения имена всех таблиц доступны в раскры вающемся списке Инспектора объектов. В этот список попадают табли цы, файлы которых расположены в каталоге, указанном свойством Замечание При смене имени таблицы на этапе проектирования приложения свойству Acti ve набора данных автоматически устанавливается значение False. При задании имени таблицы программным способом набор данных предварительно необходимо закрыть, установив его свойству Acti ve значение False. В про тивном случае генерируется исключительная ситуация.

Пример. Задание имени таблицы БД.

procedure ;

begin if then begin := false;

:= := true;

end;

end;

Здесь нажатие кнопки приводит к появлению диалогового окна выбора имени файла. При выборе файла таблицы его имя устанавливается в качест ве значения свойства TabieName. Набор данных Tablel предварительно Часть II, Работа с базами данных закрывается и снова открывается уже после смены таблицы. Тип таблицы определяется автоматически по расширению имени файла.

Свойство ТаЫеТуре типа TTtabieType определяет тип таблицы. Для локаль ных таблиц это свойство может принимать следующие значения:

ttDefauit — тип таблицы автоматически определяется по расширению файла;

ttParadox — таблица Paradox ;

ttDBase — таблица dBASE;

• ttFoxPro — таблица FoxPro;

— текстовый файл, содержащий данные в табличном виде (ASCII-таблица).

Если свойство имеет значение ttDefauit (по умолчанию), то тип таблицы определяется по расширению файла:

• DB или отсутствует — таблица Paradox;

• DBF — таблица dBASE;

• TXT — текстовый файл (ASCII-таблица).

По умолчанию в состав набора данных Table попадают все записи связан ной с ним таблицы. Для отбора записей, удовлетворяющих определенным условиям, используются фильтры.

Чтобы запретить пользователям изменять содержание записей, можно ис пользовать свойство Readonly типа Boolean. По умолчанию оно имеет значение False, что предоставляет пользователю право на модификацию записей.

В наборе данных Table возможно указание текущего индекса, требуемого для выполнения операций:

сортировки записей;

поиска записей;

установки связей между таблицами.

Текущий индекс устанавливается с помощью свойства или типа string. На этапе разработки приложения текущий индекс выбирается из списка индексов, заданных при создании таблицы.

Все возможные значения свойств indexName и содержатся в раскрывающихся списках, доступных через Инспектор объектов. Оба свойства во многом схожи, и их использование практически одинаково.

Значением свойства является имя индекса, заданное при созда нии таблицы, а значением свойства indexFieidNames является имя поля, для которого был создан индекс. Если используется индекс, состоящий из не скольких полей, то для свойства по-прежнему задается имя этого 200 Delphi. Быстрый старт индекса, а для свойства через точку с запятой перечисля ются имена полей, входящие в этот индекс.

Пример. Задание текущего индекса.

: = ' ;

:= Здесь компоненты Tablel и таЫе2 связаны с одной таблицей, для поля Name которой определен индекс indName. Этот индекс устанавливается в ка честве текущего для обоих наборов данных.

Для таблиц Paradox сделать текущим индексом ключ (главный индекс) можно только с помощью свойства indexFieidNames, перечислив ключевые поля таблицы, так как ключ не имеет имени и поэтому недоступен через СВОЙСТВО Задать ключ в качестве текущего индекса можно так:

:= Для таблицы Paradox, с которой связан компонент Tablel, определен ключ, в который входят поля Name, Post и BirthDay. Этот ключ устанавливается в качестве текущего индекса таблицы.

Замечание Свойства IndexName и IndexFieidNames взаимозависимы. При установке значения одного из них другое автоматически очищается.

Индекс, устанавливаемый текущим, должен существовать. Если индекс, зада ваемый как значение свойства IndexName или IndexFieidNames, для табли цы не существует, то возникает исключительная ситуация.

При смене таблицы, с которой ассоциирован компонент Table, значения свойств IndexName и IndexFieidNames не изменяются автоматически, по этому программист должен самостоятельно установить нужные значения.

Получить доступ к полям в составе текущего индекса можно с помощью СВОЙСТВ IndexFieldCount И IndexFields.

9.1.6. Особенности набора данных Query Компонент Query представляет собой набор данных, записи которого фор мируются в результате выполнения SQL-запроса и основаны на реляцион ном способе доступа к данным. В отличие от компонента Table, набор дан ных Query может включать в себя записи более чем одной таблицы БД.

Текст запроса, на основании которого в набор данных отбираются записи, содержится в свойстве SQL типа Запрос включает в себя команды Часть II. Работа с базами данных на языке SQL и выполняется при открытии набора данных. Запрос SQL иногда называют SQL-программой.

При формировании запроса на этапе разработки приложения можно ис пользовать текстовый редактор (рис. 9.2), вызываемый через Инспектор объектов двойным щелчком в области значения свойства SQL.

(string List Editor * FROM BY P 9.2. Редактирование запроса SQL SQL-запрос также можно формировать и изменять динамически, внося из менения в его текст (значение свойства SQL компонента Query), непосред ственно при выполнении приложения.

Замечание с В процессе формирования SQL-запроса проверка его правильности не произ водится, и если в запросе имеются ошибки, то они выявляются только при от крытии набора данных. Одним из вариантов предотвращения ошибок в SQL запросе является его предварительная отладка, например, с помощью про граммы Database Desktop.

Пример. Создадим приложение — простейший редактор, позволяющий под готавливать и выполнять SQL-запросы.

На рис. 9.3 показана форма приложения при его выполнении. Кроме визу альных компонентов, форма содержит два компонента доступа к данным и которые при выполнении приложения не видны.

Редактирование SQL-запроса осуществляется с помощью компонента Набранный запрос выполняется при нажатии кнопки с надписью Выполнить, а результат выполнения отображается в компоненте DBGridi.

202 Delphi. Быстрый старт Редактор SQL-запросов Результат выполнения SQL-запросе P_Coda 1 И.Л. Директор 6 700.00р.

1 Кузнецов Водитель :2 400.00р.

2 Семенов Менеджер | 500.00р.

3 Сидоров Менеджер SQL-запрос SELECT FROM ORDER Name Рис. 9.3. Форма приложения-редактора SQL-запросов При наличии в тексте SQL-запроса ошибки генерируется исключительная ситуация и выдается сообщение об ошибке (рис. 9.4), а результат запроса оказывается не определенным. При этом набор данных автоматиче ски закрывается.

Invalid use of by Line Number: 2.

9.4. Сообщение об ошибке Значения СВОЙСТВ DataSet ИСТОЧНИКОВ данных DataSourcel И сетки DBGridl, с помощью которых организуется взаимодействие компонен тов Queryl, DataSourcel и DBGridl, устанавливаются при создании формы.

В последующих примерах приложений значения этих свойств устанавли ваются через Инспектор объектов, поэтому операторы, присваивающие свойствам требуемые значения, в модуле формы отсутствуют.

Приведем код модуля uSQLEdit формы приложения:

unit uSQLEdit;

interface uses Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables;

type Часть II. Работа с базами данных TForml = TDataSource;

TQuery;

TDBGrid;

Buttonl: TButton;

Labell: TLabel;

Label2: TLabel;

procedure procedure end;

var TForml;

implementation {$R procedure TObject);

begin := Queryl;

:= end;

procedure begin end;

end.

Метод Assign выполняет присваивание одного объекта другому, при этом объекты должны иметь совместимые типы. Применительно к списку строк (класс Tstrings), которому принадлежит свойство SQL компонента Queryl и свойство Lines компонента Memol, подобное присваивание означает копирование информации из одного списка в другой с заменой содержимого последнего. Если размеры списков (число элементов) не сов падают, то после замены число элементов заменяемого списка становится равным числу элементов копируемого списка.

204 Delphi. Быстрый старт Компонент Query обеспечивает выполнение SQL-запроса и является набо ром данных, который формируется на основе этого запроса. Формирование набора данных выполняется при активизации компонента Query вызовом метода Open ИЛИ установкой СВОЙСТВУ Active True.

Компонент Query может быть связан с таблицей БД или напрямую, или со держать копии отобранных записей таблицы, доступные для чтения. Вид определяется СВОЙСТВОМ RequestLive Boolean. По умолчанию свойство имеет значение False, и набор данных Query доступен только для чтения. Если пользователю или программисту требуется возмож ность редактирования записей, то свойству RequestLive нужно установить значение True. В этом случае набор данных Query напрямую связывается с соответствующей таблицей, аналогично набору данных Table.

( Замечание Влияние свойства RequestLive зависит от текста выполняемого SQL-запроса.

Если в результате выполнения запроса не может быть получен редактируемый набор данных, то установка свойству RequestLi ve значения True игно рируется.

Чтобы проверить результат установки значения свойству RequestLive, мож но воспользоваться свойством типа Boolean. Если оно имеет зна чение True, то набор данных является редактируемым, если False - то не Чтобы получить в результате выполнения SQL-запроса редактируемый на бор ДанНЫХ, Кроме СВОЙСТВУ RequestLive ЗНачеНИЯ True, быть выполнены определенные условия, в частности, данные должны отби раться только из одной таблицы, и эта таблица должна допускать модифи кацию.

Вместо компонента Table можно также использовать компонент Query. Ес ли установить свойству SQL значение SELECT * FROM а свойст ву RequestLive — значение True, то набор данных Query будет аналогичен набору данных Table (здесь NameTabieBD является именем таблицы БД, ко торое для компонента задается в свойстве Однако, в отли чие от набор данных Query не имеет системы индексов, поэтому к нему не применимы методы, использующие индексацию, например, методы FindFirst, FindLast, FindNext И FindPrior.

9.1.7. Объекты поля Объекты типа являются невизуальными и служат для доступа к дан ным соответствующих полей записей набора данных.

Часть II. Работа с базами данных Объект поля Field имеет тип TField и является полем набора данных. Тип является абстрактным классом и непосредственно не используется.

Вместо него применяются производные классы, соответствующие типу дан ных, размещаемых в рассматриваемом поле набора данных. Производные классы отличаются от базового класса некоторыми особенностями, связанными с манипулированием конкретным типом данных, например, с символьным, числовым или логическим. Далее под объектами типа TField мы будем понимать либо сам объект типа TField, либо один из производ ных от него объектов, например, типа (строковое значение) или (целочисленное значение). В табл. 8.1 приведены основ ные типы объектов Field.

Таблица 9.1. Основные типы объектов Field Тип объекта Вид поля BLOB-поле Memo-поле (поле комментария) TGraphicField Графическое поле Поле даты и времени Числовое поле TBCDField Поле BCD-значения TFl oatFi el d Поле вещественного значения Поле значения денежной суммы Ti ntegerFi ei d Поле целочисленного значения Поле автоинкрементного значения TStri ngFi ei d Поле строкового значения Существуют следующие два способа задания состава полей набора данных:

по умолчанию (динамические поля);

с помощью редактора полей (статические поля).

По умолчанию при каждом открытии набора данных как на этапе проекти рования, так и на этапе выполнения приложения для каждого поля набора автоматически создается свой объект типа TField. В этом случае мы имеем дело с динамическими полями, достоинством которых является корректность отображения структуры набора данных даже при ее изменении. Напомним, что для компонента Table состав полей определяется структурой таблицы, с которой этот компонент связан, а для компонента Query состав полей за висит от SQL-запроса.

206 Delphi. Быстрый старт Однако использование динамических полей имеет и существенные недос татки, связанные с тем, что для полученного набора данных нельзя выпол нить такие действия, как ограничение состава полей или определение вы числяемых полей. Поэтому при необходимости этих операций следует использовать второй способ задания состава полей.

На этапе разработки приложения с помощью Редактора полей можно созда вать для набора данных статические (устойчивые) поля, основные достоин ства которых состоят в реализации следующих возможностей:

определение вычисляемых полей, значения которых рассчитываются с помощью выражений, использующих значения других полей;

ограничение состава полей набора данных;

изменение порядка полей набора данных;

скрытие или показ отдельных полей при выполнении приложения;

задание формата отображения или редактирования данных поля на этапе разработки приложения.

Отметим, что при модификации структуры таблицы, например, удалении поля или изменении типа, открытие набора данных, имеющего статиче ские поля, может привести к возникновению исключительной ситуации.

Динамические и статические поля имеют одинаковые свойства, события и методы, с помощью которых можно управлять этими объектами при выпол нении приложения. Статические поля определяются на этапе разработки приложения, поэтому многие их свойства доступны через Инспектор объ ектов.

9.1.8. Редактор полей По умолчанию для каждого физического поля при открытии набора данных автоматически создается объект типа а все поля в наборе данных являются динамическими и доступными. Для создания статических (устой чивых) полей используется специальный Редактор полей. В случае, если хо тя бы одно поле набора данных является статическим, динамические поля больше создаваться не будут. Таким образом, в наборе данных будут доступ ны только статические поля, а все остальные — считаться отсутствующими.

Определить или отменить состав статических полей можно с помощью Ре дактора полей на этапе разработки приложения.

( Замечание Для компонента Query состав полей определяется также в тексте SQL запроса, с помощью которого можно задать или изменить состав полей набора данных, несмотря на то, что эти поля являются динамическими.

Часть II. Работа с базами данных Для запуска Редактора полей (рис. 9.5) следует дважды щелкнуть на компо ненте Table или Query или вызвать щелчком правой кнопкой мыши для этих компонентов контекстное меню и выбрать пункт Fields Editor. Боль шую часть Редактора занимает список статических полей, при этом поля перечисляются в порядке их создания, который может отличаться от поряд ка следования полей в таблице БД.

P Salary P 9.5. Редактор полей Первоначально список статических полей пуст, указывая, что все поля на бора данных являются динамическими. С помощью Редактора полей разра ботчик может выполнить следующие операции:

создать новое статическое поле;

удалить статическое поле;

изменить порядок следования статических полей.

Кроме того, для любого выбранного в редакторе статического поля с помо щью Инспектора объектов возможно задание или изменение свойств этого поля (объекта типа TField) и определение обработчиков событий. По добные действия возможны потому, что соответствующие статическим по лям объекты типа TField доступны на этапе разработки приложения.

Для создания статического поля следует вызвать контекстное меню Редак тора полей и выбрать пункт Add Fields (Добавить поля).

Для удаления статического поля нужно выбрать пункт Delete контекстного меню или выделить в списке поле и нажать клавишу . После удале ния статического поля оно становится недоступным для операций в программе, но при необходимости его снова можно сделать статическим, добавив в список Редактора полей. При этом все свойства этого поля уста навливаются заново, а все сделанные ранее изменения теряются.

Замечание Если удалены все статические поля, то тогда все поля набора данных стано вятся динамическими и доступными при выполнении приложения.

208 Delphi. Быстрый старт Порядок следования полей определяется их местом в списке Редактора по лей. По умолчанию порядок полей соответствует порядку физических попей в таблицах БД. Его можно изменить, перемещая поля в списке с помощью мыши или комбинаций клавиш + и +.

( Замечание Если для набора данных определены статические поля, то изменение значения свойства этого набора данных может привести к ошибке, что обыч но и происходит. Это связано с тем, что в новой таблице, связываемой с набо ром данных, могут отсутствовать физические поля, для которых были созданы статические поля. В таких случаях программист должен предусматривать соот ветствующие операции, например, формирование нового состава статических полей.

9.1.9. Доступ к значению поля Объект поля, как и любой другой объект, имеет имя (название), определяе мое его свойством Name типа string. Имя объекта Field зависит от того, является ли поле динамическим или статическим. По умолчанию для дина мического поля имя объекта Field совпадает с именем соответствующего физического поля таблицы БД, для которого создан объект, и не может быть изменено. Имя статического поля является составным и по умолчанию образуется путем слияния имен набора данных и имени физического поля таблицы БД. Например, если для физического поля Name набора данных 1 с помощью Редактора полей создано статическое поле, то оно полу чит имя Программист может изменить это имя через Инспек тор объектов, когда соответствующее статическое поле выбрано в Редакторе полей.

В отличие от имени объекта Field, свойство типа string содер жит имя физического поля, заданное при создании таблицы. Не нужно путать свойства Name и FieldName, они обозначают разные объекты и в общем слу чае могут не совпадать.

Пример. Обращение к полю в программе.

:= 'Количество';

'Количество';

Для статического поля Number возможны два способа обращения: по имени поля в наборе данных и по имени объекта Field поля.

Для доступа к значению поля служат свойства value и Asxxx. СВОЙСТВО типа представляет собой фактические данные в объекте типа TField. При выполнении приложения это свойство используется для чтения и записи значений в поле. Если программист обращается к свойству value, Часть II. Работа с базами данных то он должен самостоятельно обеспечивать преобразование и согласование типов значений полей и читаемых или записываемых значений.

Пример. Доступ к значению поля с помощью свойств Asxxx.

procedure var s: string;

x: real;

begin // Доступ к полю его имени в наборе данных s := х := := s;

:= // Доступ к полю как к отдельному компоненту s TablelSalary.AsString;

х := := s;

:= end;

Здесь чтение значения поля выполняется несколькими способами.

Доступ к полю выполняется по имени поля и по имени объекта поля, а зна чение поля интерпретируется как строковое или как вещественное.

Замечание Для того чтобы записать значение в поле, оно должно допускать модифика цию, а набор данных должен находиться в соответствующем режиме, напри мер, редактирования или вставки.

При необходимости программист может запретить модификацию поля, а также скрыть его, ИСПОЛЬзуя свойства Readonly И Visible типа Boolean.

Сама возможность модификации данных в отдельном поле определяется значением свойства canModify типа Boolean. Напомним, что свойства Readonly и CanModify есть также и у набора данных: они определяют воз можность модификации набора данных (всех его полей) в целом.

( Замечание Даже если набор данных является модифицируемым и его свойство имеет значение True, для отдельных полей этого набора редакти рование может быть запрещено, и любая попытка изменить значение такого поля вызовет исключительную ситуацию.

Если поле является невидимым (свойству vi si bl e установлено значение False), но разрешено для редактирования (свойству Readonly установлено значение False), то возможно изменение значения этого поля программно.

210 Delphi. Быстрый старт Для полей, имеющих типы TBLOBField (BLOB-объект), фическое изображение) и (текст), доступ к их содержимому вы полняется обычными для объектов данного типа способами. Например, для за грузки содержимого из файла можно использовать метод LoadFromFiie.

9.1.10. Источник данных Источник данных используется как промежуточное звено между набором данных и визуальными компонентами, с помощью которых пользователь управляет этим набором данных. В Delphi источник данных представлен Для указания набора данных, с которым связан источник данных, служит свойство типа TDataSet последнего. Визуальные компоненты свя заны с источником данных через свои свойства DataSource. Обычно связь между источником и набором данных устанавливается на этапе проектиро вания в Инспекторе объектов.

Для анализа режима, в котором находится набор данных, можно использо вать свойство state типа TDatasetstate. При каждом изменении режима набора данных для связанного с ним источника данных DataSource генери руется событие OnStateChange TNotifyEvent.

Если набор данных является редактируемым, то свойство AutoEdit типа Boolean определяет, может ли он автоматически переводиться в режим мо дификации при выполнении пользователем определенных действий. На пример, для компонентов DBGrid и DBEdit таким действием является нажа тие алфавитно-цифровой клавиши, когда компонент находится в фокусе ввода. По умолчанию свойство AutoEdit имеет значение True, и автомати ческий переход в режим модификации разрешен. Если необходимо за щитить данные от случайного изменения, то одной из предпринимаемых мер является установка свойству AutoEdit значения False.

( Замечание Значение свойства AutoEdi t влияет на возможность редактирования набора данных только со стороны пользователя. Программно можно изменять записи независимо от значения этого свойства.

Независимо от значения свойства AutoEdi t пользователь может переводить набор данных в режим модификации путем нажатия кнопок компонента DBNavigator.

При изменении данных текущей записи генерируется событие TDataChangeEvent, описан следующим образом:

type TDataChangeEvent = procedure (Sender: Field: TField) of Часть II, Работа с базами данных Параметр Field указывает на измененное поле;

если данные изменены бо лее, чем в одном поле, то этот параметр имеет значение Nil. Следует иметь в виду, что в большинстве случаев событие генерируется и при переходе к другой записи. Это происходит, если хотя бы одно поле за писи, ставшей текущей, содержит значение, отличное от значения этого же поля для записи, которая была текущей. Событие OnDataChange можно ис пользовать, например, для контроля за положением указателя текущей за писи и выполнения действий, связанных с его перемещением. Это событие генерируется также при открытии набора данных.

Вот как осуществляется контроль за перемещением указателя текущей записи:

procedure Field: TField);

begin := 'Запись номер ' + end;

При модификации текущей записи, кроме события OnDataChange, генериру ется еще событие типа TNotifyEvent. Оно возникает непо средственно перед записью данных в БД, поэтому в обработчике можно предусмотреть дополнительный контроль и обработку введенных в поля значений, а также некоторые другие действия, например, отказ от измене ния записи.

9.2. Визуальные компоненты Визуальные компоненты для работы с данными расположены на странице Data Controls (Элементы управления данными) Палитры компонентов и предназначены для построения интерфейсной части приложения. Они ис пользуются для навигации по набору данных, а также для отображения и редактирования записей. Часто эти компоненты называют элементами, чув ствительными к данным.

Одни визуальные компоненты для работы с данными предназначены для выполнения операций с полями отдельной записи, они отображают и по зволяют редактировать значение поля текущей записи. К таким компонен там относятся, например, однострочный редактор DBEdit и графический Образ Другие компоненты служат для отображения и редактирования сразу не скольких записей. Примерами таких компонентов являются сетки DBGrid и выводящие записи набора данных в табличном виде.

Визуальные компоненты для работы с данными похожи на соответствующие компоненты страниц Standard (Стандартная) и Additional (Дополнительная) 212 Delphi. Быстрый старт и отличаются, в основном, тем, что ориентированы на работу с БД и имеют дополнительные свойства и Первое из них указывает на источник данных — компонент Datasource, второе — на поле набора данных, с которым связан визуальный компонент. Например, однострочный редактор DBEdit работает так же, как однострочный редактор Edit, ото бражая строковое значение и позволяя пользователю изменять его. От личие компонентов состоит в том, что в редакторе DBEdit отображается и изменяется содержимое определенного поля текущей записи набора данных.

Отметим, что для всех визуальных компонентов, предназначенных для ото бражения и редактирования полей, при изменении пользователем их содер жимого набор данных автоматически переводится в режим редактирования.

Произведенные с помощью этих компонентов изменения автоматически сохраняются в связанных с ними полях при наступлении определенных со бытий, таких, например, как потеря фокуса визуальным компонентом или переход к другой записи набора данных.

При программном изменении содержимого этих визуальных компонентов набор данных автоматически в режим редактирования не переводится. Для этой цели в коде должен предварительно вызываться метод Edit набора данных. Чтобы сохранить изменения в поле (полях) текущей записи, про граммист также должен предусмотреть соответствующие действия, напри мер, вызов метода или переход к другой записи набора данных.

Отметим, что определенная часть компонентов, используемых для фор мирования отчетов (страница QReport (Быстрый отчет) Палитры компо нентов), тоже имеет свои аналоги среди других визуальных компонентов.

В табл. 9.2 приводятся так называемые стандартные и дополнительные визуальные компоненты, расположенные на страницах Standard (Стан дартная) и Additional (Дополнительная) Палитры компонентов, а также соответствующие им визуальные компоненты для работы с дан ными (страница Data Controls (Элементы управления данными)) и для формирования отчетов (страница (Быстрый отчет)).

Рассмотрим компоненты: сетку DBGrid и навигационный интерфейс DBNavigator, которые не имеют аналогов среди компонентов, рассмотрен ных ранее.

Таблица 9.2. Соответствие визуальных компонентов, расположенных на разных страницах Палитры компонентов Компоненты страниц Компоненты страницы Компоненты страницы Standard и Additional Data Controls QReport Label DBText Edit DBEdit _ Часть II. Работа с базами данных Таблица 9.2. (окончание) Компоненты страниц Компоненты страницы Компоненты страницы Standard и Additional Data Controls QReport Memo — DBRichEdit QRRichEdit, QRDBRichEdit ListBox DBListBox — — CheckBox DBCheckBox — RadioGroup DBRadioGroup — Image QRImage, QRDBImage Shape QRShape — StringGrid DBGrid — Chart DBChart QRChart 9.2.1. Представление записей в табличном виде Для вывода записей набора данных в табличном виде удобно использовать сетку, представленную в Delphi компонентом DBGrid. Внешний вид сетки соответствует внутренней структуре таблицы БД и набора данных, при этом строке сетки соответствует запись, а столбцу — поле.

С помощью сетки пользователь управляет набором данных, поля которого отображаются в ней. Для навигации по записям и их просмотра использу ются полосы прокрутки и клавиши перемещения курсора. Для перехода в режим редактирования поля достаточно установить на него курсор и нажать любую алфавитно-цифровую клавишу. Переход в режим вставки новой за писи выполняется нажатием клавиши , после чего можно заполнять ее поля. Вставка записи происходит в месте нахождения указателя текущей записи. Изменения, сделанные при редактировании или добавлении записи, подтверждаются нажатием клавиши или переходом к другой запи си, а отменяются нажатием клавиши . Для удаления записи следует нажать комбинацию клавиш 9.2.2. Характеристики сетки Несмотря на то, что по своему виду сетка DBGrid похожа на сетку StringGrid, между ними имеются значительные различия. Так, у сетки StringGrid можно устанавливать через соответствующие свойства число ее строк и столбцов. У сетки DBGrid числом строк управлять нельзя, так как она отображает все записи, имеющиеся в наборе данных.

214 Delphi. Быстрый старт Основным свойством сетки является свойство columns типа которое представляет собой массив (коллекцию) объектов типа описывающих отдельные столбцы сетки.

Свойство типа integer задает номер текущего столбца в мас сиве Columns, СВОЙСТВО SelectedField указывает на типа TField, которому соответствует текущий столбец сетки.

Свойство типа integer доступно во время выполнения про граммы и содержит число видимых столбцов сетки, а свойство Fields integer] типа TField позволяет получить доступ к отдельным столбцам. Индекс определяет номер столбца в массиве столбцов и принима ет значения в интервале от 0 до Свойства и типа задают цвета сетки и ее фикси рованных элементов, соответственно. По умолчанию свойство имеет значение (цвет фона Windows), а свойство FixedCoior — значе ние clBtnFace (цвет КНОПКИ).

Свойство типа TFont определяет шрифт, используемый для выво да заголовков столбцов.

Доступ к параметрам сетки для настройки возможен через свойство типа TGridOptions. Это свойство представляет собой множество и принима ет комбинации следующих значений:

dgEditing — пользователю разрешается редактирование данных в ячейках;

О — сетка не блокирует режим редактирования;

— отображаются заголовки столбцов;

— для текущей записи в начале строки выводится указатель;

— пользователь может с помощью мыши изменять раз мер столбцов и перемещать их;

— между столбцами выводятся разделительные вертикальные линии;

— между строками выводятся разделительные горизонталь ные линии;

dgTabs — для перемещения по сетке можно использовать клавиши и +;

О — пользователь может выделить целую строку;

при установке этого значения игнорируются значения dgEditing и dgAiwaysShowEditor;

— ячейка остается выделенной, даже если сетка теряет фокус;

— при удалении строки выдается запрос на подтвер ждение операции;

Часть II. Работа с базами — добавленные к сетке пустые строки (записи) при по тере сеткой фокуса не сохраняются в наборе данных;

— в сетке можно одновременно выделить несколько По умолчанию свойству устанавливается значение [dgEditing, dgTitles, dgColLines, dgRowLines, dgTabs, При щелчке на ячейке с данными генерируется событие а щелчок на заголовке столбца вызывает событие Оба собы тия имеют тип описываемый следующим образом:

type TDBGridciickEvent = procedure (Column: of object;

Параметр column представляет столбец, на котором был произведен щелчок.

При перемещении фокуса между столбцами сетки инициируются события и типа первое из которых возникает при получении столбцом фокуса, а второе — при потере его.

Сетка DBGrid способна автоматически отображать в своих ячейках инфор мацию, при необходимости программист может выполнить и собственное отображение сетки. Например, когда желательно выделить ячейку или стол бец с помощью цвета или шрифта, а также вывести в ячейке кроме тексто вой, также и графическую информацию, в частности, небольшой рисунок.

Для программного отображения сетки используется обработчик события ТИПа При совке любой ячейки. Тип события OnDrawColumnCell описан следующим образом:

type TDrawColumnCellEvent = procedure (Sender: TObject;

const Rect: TRect;

Integer;

Column: TColumn;

State: TGridDrawState) of object;

Параметр Rect содержит координаты ограничивающего ячейку прямоуголь ника, параметр DataCoi определяет номер прорисовываемой колонки в мас сиве столбцов сетки, а параметр является объектом прорисовывае мого столбца. Параметр state задает состояние ячейки и принимает комбинации следующих значений:

— ячейка находится в выбранном диапазоне;

gdFocused — ячейка имеет фокус ввода;

gdFixed — ячейка находится в фиксированном диапазоне.

Порядок вызова события OnDrawColumnCell зависит от значения свойства типа Boolean. Если свойство имеет значение True (по умолчанию), то перед генерацией события OnDrawColumnCell в ячейке ото бражается фон и выводится информация. Затем вокруг выбранной ячейки рисуется прямоугольник выбора. Если свойство DefauitDrawing имеет зна 216 Delphi. Быстрый старт чение False, то вызывается событие в обработчике кото рого следует разместить операции по прорисовке области сетки.

Пример. Программная прорисовка сетки.

// Свойству должно быть установлено значение True procedure const Rect: TRect;

DataCol: Integer;

Column: State: TGridDrawState);

var r s begin s := r := Rect;

if = then begin := := clYellow;

:= ;

if > then begin + 2, +2, 2);

r.Left := r.Left + + 4;

end;

r.Top + 2, s);

end else begin clWhite;

:= clBlack;

:= [];

r.Top + 2, s) ;

end;

end;

Здесь для столбца сетки, который соответствует полю Debt (Задолженность) набора данных, устанавливается красный цвет фона, а данные выводятся желтым цветом и курсивом. Кроме того, если задолженность превышает 1000 (рублей или других денежных единиц), то в поле Debt соответствующей записи слева от числа выводится рисунок, находящийся в компоненте ImageListl (третий по счету). Список с рисунками можно подготовить за ранее при разработке приложения и загрузить динамически в процессе вы полнения программы.

Часть II. Работа с базами данных При прорисовке ячеек используется свойство элемента а также параметр Если обработчик события являет ся общим для нескольких сеток DBGrid, то при отображении их ячеек вме сто названия конкретного компонента (в примере DBGridi) нужно задать КОНСТРУКЦИЮ (Sender as TDBGrid) ИЛИ TDBGrid Например, оператор (Sender as := устанавливает красный цвет для символов ячеек сетки, указываемой пара метром Sender.

9.2.3. Столбцы сетки Отдельный столбец сетки представляется объектом типа По умолчанию для каждого поля набора данных, связанного с компонентом DBGrid, автоматически создается отдельный столбец, и все столбцы в сетке доступны. Такие столбцы являются динамическими. Для создания статиче ских столбцов используется специальный редактор столбцов. Если хотя бы один столбец сетки является статическим, то динамические столбцы уже не создаются ни для одного из оставшихся полей набора данных. Причем в наборе данных доступными являются статические столбцы, а остальные столбцы считаются отсутствующими. Изменить состав статических столбцов можно с помощью Редактора столбцов на этапе разработки приложения.

Взаимодействие между динамическими и статическими столбцами, а также Редактором столбцов аналогично взаимодействию между динамическими и статическими полями набора данных и Редактором полей.

Pages:     | 1 | 2 || 4 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.