    Начало работы 
    
    Если вы столь же нетерпеливы, как и я, то меньше всего хотите читать пять 
или десять глав, чтобы добраться, наконец, до слов: "А теперь давайте создадим 
простейшую форму". Эта глава поможет вам приступить к использованию Delphi 
немедленно. Прочитав ее, вы узнаете, как создавать простые формы и связывать 
их с базами данных. Итак, если вам не терпится поскорее "раскрутить маховик" 
Delphi, то эта глава именно для вас. В данной главе мы рассмотрим следующие темы. 
    Q Создание баз данных с помощью мастера Database Form Wizard. 
    Q Важнейшие свойства компонентов ТТаblе, TDataSource и TDBEdit. 
    Q Создание простых форм баз данных без использования мастера. 
    Q Псевдонимы BDE и их определение. 
    Q Создание модулей данных и их размещение в хранилище объектов. 
    Q Создание формы вида главная-подчиненная. 

    Терминология 

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

    Таблица 2.1. Основные термины для работы с базами данных в Delphi 

    Термин		Описание 

    Таблица	Набор строк в базе данных. Например, для хранения информации о 
		счетах можно создать таблицу СЧЕТА 
    Строка		Одна запись таблицы. Например, в строках таблицы КЛИЕНТЫ может 
		хранится информация о клиентах — по одной строке для каждого клиента 
    Столбец	Поле или атрибут, которое содержится в строке таблицы. Например, 
		таблица СЧЕТА может иметь столбец КодКлиента. В этом случае элемент данных, 
		представляющий код клиента, будет содержаться во всех строках таблицы 

    Глава 2. Начало работы 19 

    продолжение табл. 2 

    Термин			Описание 

    Borland Database Engine	Набор модулей DLL и других файлов, с помощью 
		которых Delphi и другие продукты Borland осуществляют доступ 
            к базам данных. Система Borland Database Engine (BDE) 
		выполняет все операции низкого уровня, которые обычно приходится 
		осуществлять при разработке полнофункциональых приложений баз 
		данных. Это достигается путем предоставления функций программного 
		интерфейса (API — Application Programming Interface), не зависящих 
		на уровне прикладной программы от используемой в качестве платформы 
		СУБД. Все элементы управления баз данных Delphi интенсивно обращаются 
		к интерфейсу API BDE, поэтому вам вряд ли придется работать с ним напрямую.
    IDAPI	Программный интерфейс прикладных программ для работы с ВD
		(Independent Database Application Programming Interface). Так как практически 
		все вызовы функций IDAPI выполняются компонентами баз данных Delphi, вам вряд 
		ли придется обращаться к этим функциям напрямую в подавляющем большинстве 
		случаев достаточно воспользоваться теми или иными методами компонентов баз 
		данных Delphi, которые, в свою очеред обращаются к функциям IDAPI.
    Драйвер BDE	Модуль или набор модулей DLL, предназначенный для обеспечения 
		взаимодействия BDE с конкретной СУБД. В варианте Delphi Client/Server поставлются 
		драйверы для работы с Sybase SQL Server, Microsoft SQL Server, Oracle
		InterBase, Informix, DB2, Paradox, dBASE и других источников данных, поддерживающих 
		32-разрядный протокол ODBC. Программы, написанные с noмощью Delphi, 
		не обращаются напрямую к драйверам BDE, а используют псевдонимы BDE, которые 
		создаются и обрабатываются драйверами 
    Псевдоним BDE	Набор параметров, определяющих метод подключения BDE к 
		определенной базе данных. Использование псевдонимов основывается на применении 
		драйверов BDE. Для создания псевдонима нужно воспользоваться отдельным 
		приложением BDE Administrator или средством Delphi Databas Explorer. 
		Псевдонимы обычно можно создать для любой отдельной баз данных. Например, вы 
		можете создать один псевдоним для базы данных Northwind (Борей), входящей в 
		комплект поставки Microsoft Access, другой — для подчиненной базы данных 
		Orders (Заказы) этой же баз данных. Оба псевдонима будут использовать драйвер 
		Access SQL Links, так как они оба ссылаются на базы данных СУБД Access. В то же 
		время это будут разные псевдонимы, так как они ссылаются на разные базы 
		данных.  В этом и заключается отличие псевдонимов BDE от драйверов BDE: драйвер
		предназначен для обращения к той или иной СУБД, а псевдоним — к конкретной 
		базы данных этой СУБД 
    Драйверы SQL Links	Высокопроизводительные драйверы доступа к базам данных, 
		которые может использовать BDE при обращении к СУБД архитектуры клиент/сервер
		Вариант Delphi Client/Server поставляется с драйверами SQL Links для СУБД 
		Sybase SQL Server, Microsoft SQL Server, Oracle, InterBase, Informix DB2. Так 
		как эти драйверы входят в поставку Delphi, вы можете не использовать другие 
		методы доступа к СУБД, такие, например, как ODBC, хотя если в этом есть 
		необходимость, можно применять и их 
    Драйверы ODBC	   Драйверы для доступа к базам данных на основе спецификации 
		Ореn Database Connectivity, разработанной компанией Microsoft. Delphi может
		подключаться к базам данных, соответствующих этой спецификации, используя 
		32-разрядные драйверы ODBC. Для настройки и управления источниками данных 
		ODBC (аналог псевдонимов BDE), можно использова-утилиту ODBC Data Source 
		Administrator, пиктограмма которой представлена в окне Control Panel (Панель 
		управления) Windows 95 

    20	Часть 1. OCHOI 

    Окончание табл. 2.1 

    Термин 	Описание 

    Элементы управления для доступа к данным   Невизуальные (т.е. такие, которые не отображаются 
		во время выполнения доступа к данным программы) компоненты, с помощью которых 
		приложение осуществляет доступ к базам данных. Эти элементы управления 
		находятся на вкладке Data Access палитры компонентов Delphi. В качестве 
		примеров таких компонентов можно привести компоненты Tdatabase, TTable или TDataSource 
    TDataset Класс Delphi, с помощью которого осуществляется доступ к таблицам 
		баз данных и табличным результатам работы запросов. Так как компоненты TTable, 
		TQuery и TStoredProc являются потомками класса TDataset, я часто буду 
		применять для них общее название "компоненты семейства TDataset" 
    TTable Компонент Delphi, с помощью которого осуществляется доступ к 
		таблицам баз данных. Для указания имени реальной таблицы базы данных 
		используется свойство TableName компонента ТТаblе 
    TQuery Компонент Delphi, с помощью которого создаются, выполняются и 
		обрабатываются запросы SQL 
    TStoredProc Компонент Delphi, позволяющий выполнять ранее 
		откомпилированные процедуры SQL, находящиеся на сервере базы данных, 
		называемые хранимыми процедурами 
    Элементы управления для работы с данными 
 		   Визуальные (т.е. такие, которые отображаются во 
		время выполнения программы) компоненты, которые с помощью 
		элементов управления, предназначенных для доступа к данным, позволяют 
		пользователю просматривать и модифицировать информацию, записанную в базе 
		данных. Эти элементы управления находятся на вкладке Data Controls палитры 
		компонентов Delphi. В большинстве случаев вы можете рассматривать их как 
		варианты аналогичных стандартных элементов управления, "умеющие" работать с 
		данными. Примерами таких компонентов являются TDBGrid, TDBNavigator и TDBEdit 
    TDataSource Компонент Delphi, с помощью которого осуществляется связь 
		между компонентами семейства Tdataset и элементами управления для работы с 
		данными. Последние обращаются за данными к связанным с ними компонентами 
		TDataSource, а те, в свою очередь, — к соответствующим компонентам Tdataset 
    TField Класс Delphi, предоставляющий доступ к полям таблиц баз данных.При 
		использовании редактора полей Delphi создает объекты порожденных классов, 
		такие, например, как TStringField или TIntegerField. Компоненты TField, 
		помещенные на форму, принадлежат форме, а не связанным с ними компонентам TDataset 


    Архитектура баз данных в Delphi 

    Теперь, когда вы ознакомились с основными терминами, давайте поговорим об 
архитектуре. Приложения, созданные с помощью Delphi, обращаются к локальным и 
удаленным базам данных через систему Borland Database Engine (BDE). При 
использовании локальных баз данных, таких как таблицы Paradox или dBASE, BDE 
применяет собственные соответствующие драйверы СУБД. В случае распределенных 
баз данных, например Oracle или Sybase, BDE задействует серверы баз данных, 
используя драйверы SQL Links или ODBC. Часто такие драйверы, в свою очередь, 
обращаются к библиотекам драйверов, разработанных производителем СУБД. Все 
вышесказанное проиллюстрировано на рис. 2.1. 
    Внутри приложения происходит следующее. Элементы управления для работы с 
данными обращаются к компонентам TDataSource. Обычно каждая форма использует 
ограниченное количество компонентов 

    Глава 2. Начало работы  21 

TDataSource, даже если на ней находится множество элементов управления для 
работы с данными. Все такие элементы управления формы обращаются к одному или 
нескольким компонентам TDataSource, которые, в свою очередь, обращаются к 
одному или нескольким компонентам семейства TDataset. Очень часто форма 
использует только один компонент TDataset и один компонент TDataSource. На 
рис. 2.2 представлена взаимосвязь компонентов. 

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

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

    Гибкость, обеспечиваемая с помощью такой многоуровневой архитектуры, 
упрощает задачу разработки не только надежных, но и масштабируемых приложений 
баз данных. Благодаря отделению низкоуровневых драйверов BDE от 
высокоуровневых компонентов приложения, теоретически возможно заменить 
используемую в качестве платформы СУБД без перекомпиляции приложения. Кроме 
того, модульная архитектура позволяет изменить любой элемент без необходимости 
перестраивания или перекомпоновки всего приложения. 
    Теперь, когда я вас ознакомил с основными принципами архитектуры баз 
данных Delphi, позвольте остановится на некоторых моментах, чтобы 
проиллюстрировать методы применения вышеизложенных концепций. Если у вас 
возникают вопросы такого типа: "Все эти архитектурные подробности мне понятны, 
но как их использовать в работе? Как применять эту информацию для решения моих 
задач? И как все это выглядит на практике?" — ознакомьтесь с приведенными ниже 
советами, предназначенными для облегчения понимания архитектуры Delphi. 

    Q Компонент TDatabase никогда не используется для доступа к базам данных. 
Этот компонент имеет ряд дополнительных средств и элементов управления, 
которыми можно либо воспользоваться при разработке приложения базы данных в 
Delphi, либо нет. Другими словами, использование компонента TDatabase не 
является обязательным. 
    Q Еще одним компонентом, с которым вы практически не будете сталкиваться, 
является компонент TSession. Единственной областью применения этого компонента 
является программирование много-

    22 Часть I. Основы 

поточных приложений, в которых несколько процессов могут выполняться 
параллельно и независимо друг от друга. Обычно приложения баз данных не 
используют многопоточность, поэтому я и утверждаю, что компонент TSession вам 
вряд ли понадобиться. При запуске приложения базы данных Delphi автоматически 
создает объект класса TSession (ссылка на него хранится в глобальной 
переменной Session). Необходимость этого объекта объясняется тем, что в 
приложениях для Windows 95 присутствует, по крайне мере, один поток команд, 
который в самом простом случае представляет всю программу в целом. Поэтому, 
если вам по какой-то причине понадобится получить доступ к методам или 
свойствам, предоставляемым компонентом TSession, можете использовать эту переменную. 
    Q Компоненты TQuery и TStoredProc понадобятся вам только в том случае, 
если вы разрабатываете собственные запросы SQL или используете хранимые на 
сервере процедуры. В большинстве случаев при открытии таблиц базы данных 
достаточно возможностей, предоставляемых компонентом Delphi TTable. 
    Q Для получения информации из базы данных и записи ее в базу данных вы 
будете в большинстве случаев использовать компонент TTable. Как уже 
упоминалось, компонент TTable является краеугольным камнем доступа к базам 
данных в Delphi. Он используется для связи с таблицами базы данных и обмена 
данными с элементами управления, предназначенными для работы с данными. 
    Q Компоненты, расположенные на вкладке Data Controls палитры компонентов, 
являются визуальными, предназначенными для работы с данными, элементами 
управления. Именно с их помощью данные отображаются на экране и изменяются 
пользователями. Эти компоненты представляют собой варианты соответствующих 
стандартных компонентов пользовательского интерфейса приложений для Windows, с 
той лишь разницей, что они, в отличие от своих стандартных аналогов, "умеют" 
работать с данными. Используя эти компоненты, вы будете создавать 
пользовательский интерфейс ваших приложений баз данных. Компоненты для работы 
с данными взаимодействуют с компонентами, предназначенными для осуществления 
доступа к данным, такими, например, как TTable, посредством которых происходит 
обращение к собственно данным баз данных. 
    Q Компоненты семейства TDataset (например, TTable, TQuery и TStoredProc) 
получают данные из баз данных, но сами не могут передать их компонентам для 
работы с данными, таким как TDBEdit. Поэтому для обеспечения взаимодействия 
первых и последних используются компоненты TDataSource, выступающие в роли 
посредников. Другими словами, компоненты для работы с данными, такие как 
TDBEdit, не обращаются напрямую к компонентам семейства TDataset, а используют 
компоненты TDataSource, которые, в свою очередь, взаимодействуют с 
компонентами TDataset. 
    Q Итак, для создания простой формы базы данных, вам понадобится всего три 
вида компонентов: 
    TTable, TDataSource и компоненты для работы с данными (TDBEdit, TDBMemo и т.п.). 


    Создание простой формы 


    Теперь, когда вы разобрались в основах архитектуры баз данных Delphi, 
давайте приступим к созданию простой формы базы данных. Создав реальную 
работающую форму, вы поймете, каким образом воплощается в жизнь используемая в 
Delphi архитектура баз данных. 
    Для создания формы базы данных в Delphi имеется два основных способа. 
Первый заключается в разработке формы вручную, путем помещения нужных 
компонентов на пустую форму и связывания их друг с другом. Второй способ 
состоит в использовании мастера Database Form Wizard, который сам создаст 
форму за вас. Мы начнем с использования мастера. Если вы еще не запустили 
Delphi, сделайте это и откройте новый проект. 

    Мастер Database Form Wizard 

    С помощью мастера форм создается форма базы данных путем ответов на 
задаваемые вам вопросы. Выберите пункт меню Database=>Form Wizard, после чего 
запустится мастер Database Form Wizard. 
    В первом диалоговом окне мастера (рис. 2.3) нужно выбрать, будете ли вы 
создавать простую форму (Create a simple form) или форму вида 
"главная-подчиненная" (Create a master/detail form), а также будет ли 
базироваться новая форма на компоненте TTable или на компоненте TQuery. В 
нашем примере оставьте переключатели, выбранные по умолчанию, и щелкните на 
кнопке Next. 
    В следующем диалоговом окне (рис. 2.4) мастер форм попросит вас указать, 
какую таблицу нужно использовать при создании формы. Для начала выберите 
псевдоним DBDEMOS из раскрывающегося списка Drive or Alias name. При выборе 
псевдонима мастер форм устанавливает связь с соответствующим сервером 

    Глава 2. Начало работы 23 

базы данных или каталогом. Если вы выбрали псевдоним DBDEMOS, то в списке 
Table Name увидите перечень таблиц базы данных, представленной в BDE этим 
псевдонимом. Дважды щелкните на имени таблицы BIOLIFE, находящемся в верхней 
части списка. 

    Рис. 2.3. Выбор типа новой формы и связанного с ней набора данных 

    Рис. 2.4. Выбор таблицы, на основе которой будет создана форма 

    24 Часть I. Основы 

    В следующем диалоговом окне (рис. 2.5) будет представлен список полей 
таблицы BIOLIFE. Можно по одному выбирать поля, которые нужно отобразить на 
форме, используя для этого кнопку >, а можно с помощью кнопки >> выбрать сразу 
все поля. Если вы следуете моим рекомендациям, щелкните на кнопке >> а затем на 
кнопке Next. 

    Рис. 2.5. Выбор полей для создаваемой формы 

    В следующем окне мастера форм (рис. 2.6) вам будет предложено выбрать 
вариант расположения полей новой формы. Можно выбрать горизонтальное 
(Horizontally), вертикальное (Vertically) и сеточное (In a grid) расположение. 
Оставьте выбранный по умолчанию переключатель, соответствующий горизонтальному 
расположению, и щелкните на кнопке Next. 
    Следующее, и последнее, диалоговое окно мастера форм предназначено для 
выбора вида генерации формы (рис. 2.7). Если вы хотите, чтобы создаваемая 
форма была главной формой приложения, установите флажок Generate a main form. 
Главной формой приложения в Delphi считается форма, которая появляется на 
экране после запуска приложения. Оставьте вышеупомянутый флажок в 
установленном состоянии, чтобы создаваемая форма была главной формой 
приложения. Естественно, что такая форма в приложении должна быть 
единственной, поэтому при разработке других форм приложения вы будете 
сбрасывать этот флажок. 
    Кроме того, с помощью последнего диалогового окна мастера форм можно 
указать, нужно ли генерировать только саму форму (Form Only) или же, помимо 
формы, выполнить генерацию модуля данных (Form and DataModule). В нашем 
примере оставим выбранный по умолчанию переключатель. Нажав кнопку Finish, вы 
увидите на экране форму, созданную мастером форм (рис. 2.8) в окне 
конструктора форм Delphi. 
    Как видно из рис. 2.8, на форме расположены и элементы управления для 
работы с данными, и компоненты ТТаbе и TDataSource. 
    Создав новую форму, вы тут же можете проверить ее в действии. Для этого 
достаточно нажать клавишу <F9> и приложение будет запущено на выполнение. Так 
как при создании формы мы указали, что она будет главной формой приложения, то 
после завершения компиляции и запуска приложения наша форма тут же появится на 
экране, как показано на рис. 2.9. 

    Глава 2. Начало работы 25 

    Рис. 2.6. Выбор варианта расположения полей на новой форме 

    Рис. 2.7. Последнее диалоговое окно мастера форм 


    Часть I. Основы 26


    Рис. 2.8. Новая форма, созданная мастером форм 

    Рис. 2.9. Новая форма, появляющаяся при запуске приложения 


    Глава 2. Начало работы 27 

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

    На заметку 
    Формы, созданные с помощью мастера Database Form Wizard, можно настраивать 
как и любые другие формы, создаваемые в Delphi. Поработав с мастером форм, вы 
убедитесь, что самый рациональный путь разработки форм приложений баз данных 
заключается в использовании мастера Database Form Wizard с последующим 
редактированием полученных форм в окне конструктора форм Delphi. 


    Анализ новой формы 

    Прежде чем двигаться дальше, давайте внимательнее ознакомимся с только что 
созданной формой. Щелкните на компоненте ТТаbе, находящемся на форме (он 
должен располагаться в верхней части формы). Выбрав компонент, нажмите <F11> 
для переключения в окно просмотра свойств объекта. Сейчас вам достаточно 
обратить внимание только на два самых главных свойства (рис. 2.10). Первым из 
них является DatabaseName. Если вы придерживались изложенных выше 
рекомендаций, то его значением должен быть псевдоним BDE DBDEMOS. Этот 
псевдоним содержит информацию, необходимую для поиска таблицы, определяемой 
значением второго свойства — TableName. Если вы последовательно выполняли все 
указания, то в качестве значения этого свойства должно быть имя таблицы BIOLIFE. 

    Рис. 2.10. Свойства компонента ТТаblе 


    28 Часть I. Основы 

    Теперь давайте обратимся к компоненту TDataSource. Он должен быть размещен 
на форме рядом с компонентом ТТаblе. Найдите на форме компонент TDataSource и 
щелкните на нем. 
    Как и у компонента ТТаblе, среди свойств компонента TDataSource можно 
выделить два ключевых свойства (рис. 2.11). Во-первых, это свойство DataSet — 
в рассматриваемом примере оно содержит ссылку на объект Table1, который в 
данном случае является экземпляром класса ТТаblе формы. Это означает, что 
данные, которыми компонент TDataSource обменивается с элементами управления 
работы с данными, переправляются объекту Table1, представляющему собой 
экземпляр класса ТТаblе, связанный с конкретной таблицей базы данных. 
    Во-вторых, обратите внимание на свойство AutoEdit. Если оно имеет значение 
True (установленное по умолчанию), то компонент TDataSource автоматически 
переключается в режим редактирования. Это означает, что изменения, вносимые с 
помощью элементов управления для работы с данными, могут заносится в 
соответствующие записи таблицы базы данных. 

    Рис. 2.11. Свойства компонента TDataSource 

    Наконец, нужно ознакомиться со свойствами компонентов, представляющих 
собой элементы управления для работы с данными. Щелкните на верхнем компоненте 
TDBEdit формы, чтобы выбрать его, а затем выберите еще несколько компонентов 
TDBEdit. Как только проделаете это, нажмите <F11>, чтобы перейти в окно Object Inspector. 

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

    У компонентов TDBEdit, как и у рассмотренных выше компонентов ТТаblе и 
TDataSource, имеются два самых важных свойства. Первым таким свойством 
является DataSource. Щелкните на нем и посмотрите на его значение. В нашем 
примере это значение представляет собой ссылку на экземпляр класса TDataSource 
формы. Такая связь означает, что данные, которые вы вводите с помощью этого визуального 


    Глава 2. Начало работы 29 


элемента управления, отправляются в соответствующую таблицу базы данных 
через объект DataSource1. Второе свойство, заслуживающее внимания, — свойство 
DataField. Его значение определяет поле таблицы базы данных, с котором связан 
этот элемент управления. 
    Теперь, когда вы ближе познакомились с компонентами ТТаblе, TDataSource и 
TDBEdit, их взаимосвязь стала более очевидной. Компонент ТТаblе связывает форму 
с конкретной таблицей базы данных. Назначение компонента TDataSource — быть 
посредником между компонентом ТТаblе и связанными с ним элементами управления 
для работы с данными. Такие элементы управления, например представленные 
компонентами TDBEdit, получают данные от компонентов TDataSource и отправляют 
их этим компонентам. Таким образом, в Delphi организована гибкая 
многоуровневая архитектура доступа к базам данных. 
    У вас может возникнуть вопрос о необходимости использования компонентов 
TDataSource. Рассмотрим, к примеру, такую задачу. Элементы управления для 
работы с данными могут напрямую ссылаться на компоненты семейства TDataSet. 
Допустим, мы отказались от использования компонента TDataSource и установили в 
качестве значения свойства DataSet всех элементов управления формы ссылку на 
нужный компонент семейства TDataSet. Если теперь нам нужно изменить компонент 
семейства TDataSet формы на другой, сколько ручного труда придется потратить? 
Когда же мы используем компонент TDataSource, то достаточно будет изменить 
только значение свойства DataSet этого компонента — просто значение одного 
свойства одного компонента. Проще не придумаешь. 
    Конечно, вы можете возразить: "Но я же могу выбрать сразу все элементы 
управления и изменить значение их свойств DataSource за одну операцию". Да, 
это возможно во время разработки формы. Но сколько операций придется выполнить 
во время работы программы? Так или иначе, вам все равно придется возиться с 
каждым элементом управления. Итак, метод, предлагаемый Delphi, очень удобен и 
основывается на здравом смысле. 

    Создание простой формы вручную 

    Ознакомившись с простым методом создания форм, давайте попробуем 
воссоздать ее вручную, чтобы разобраться в деталях этого процесса. Для 
подготовки "поля деятельности" выполните следующие операции. 
    1. Откройте форму, которая создается автоматически при открытии нового 
проекта. Эта форма должна иметь имя Form1 и не должна иметь никаких компонентов. 
    2. Поместите на форму два компонента ТPanel. Первый из них разместите в 
верхней части формы и установите его свойство Align равным alTop. При этом 
панель, представленная данным компонентом, растянется в верхней части формы на 
всю ее ширину, независимо от размера окна формы. 
    3. Вторую панель переместите в нижнюю часть формы и установите значение ее 
свойства Align равным alClient. Это приведет к тому, что вторая панель займет 
все пространство окна формы, кроме той его части, которая уже была занята 
первой панелью. 
    4. Теперь нужно удалить заголовки обеих панелей, так как нам они не нужны. 
Для этого выберите обе панели и нажмите <F11>, чтобы перейти в окно Object 
Inspector. Найдите на вкладке свойств общее для обеих панелей свойство Caption 
и удалите его значение. 
    На рис. 2.12 показана форма с выбранными панелями и очищенным значением их 
свойства Caption. 
    5. Теперь на нижнюю панель нужно поместить область прокрутки. Это делается 
для того, чтобы на форме можно было разместить больше элементов управления, 
чем позволяют размеры ее окна. В таких случаях нужно использовать компоненты 
TScrollBox, автоматически создающие полосы прокрутки, с помощью которых 
пользователь во время выполнения программы сможет прокручивать окно формы. 
Поместив компонент TScrollBox на нижнюю панель формы, установите его свойство 
Align равным alClient. 
    На рис. 2.13 показана новая форма с расположенной на нижней панели 
областью прокрутки. 
    Подготовив "плацдарм", можно перейти к размещению на форме компонентов. Мы 
начнем с двух невизуальных компонентов — ТТаblе и TDataSource. Эти компоненты 
находятся на вкладке Data Access палитры компонентов Delphi. Найдите их и 
поместите по одному экземпляру каждого компонента в верхней части формы. 
Строго говоря, место размещения невизуальных компонентов для работы формы не 
имеет никакого значения. Однако, разместив их в верхней части формы, вы 
облегчите себе работу, так как всегда сможете быстро найти эти компоненты, 
независимо от размера формы. 

    30 Часть I. Основы 

    Рис. 2.12. В окне Object Inspector удалите значение свойства Caption обеих панелей 

    Рис. 2.13. Новая форма с областью прокрутки 


    Глава 2. Начало работы 31 

    Установите значение свойства DatabaseName объекта Table1 равным псевдониму 
BDE DBDEMOS, а значение свойства TableName — равным имени файла BIOLIFE.DB. 
    Теперь нужно свойству DataSet компонента TDataSource присвоить в качестве 
значения ссылку на объект Table1. Таким образом будет установлена связь между 
таблицей базы данных и элементами управления, которые будет обслуживать данный 
компонент TDataSource. 

    Совет 
    Щелкнув дважды на значении свойства DataSet компонента TDataSource, вы 
заставите Delphi автоматически создать ссылку на единственный компонент ТТаblе 
формы. Так как на форме находится только один компонент семейства TDataSet 
(т.е. объект Table1), Delphi при двойном щелчке на значении свойства DataSet 
компонента TDataSource автоматически подставляет имя Table1 в качестве 
значения этого свойства. 

    На рис. 2.14 показаны компоненты TTable и TDataSource, помещенные на форму. 

    Рис. 2.14. Новая форма с невизуальными компонентами 

    Разместив на форме невизуальные компоненты, можете перейти к добавлению 
элементов управления для работы с данными. Такие элементы управления очень 
похожи на стандартные элементы управления приложений Windows, однако 
отличаются от последних тем, что "умеют" обмениваться информацией с базами 
данных. Например, компонент TEdit Delphi представляет собой стандартную строку 
ввода. Его "собрат", предназначенный для работы с данными, называется TDBEdit 
и внешне аналогичен компоненту TEdit. Основное же различие между этими 
компонентами состоит в том, что компонент TDBEdit "специализируется" на 
редактировании строк, представляющих содержимое того или иного поля базы данных. 
    Первый из элементов управления для работы с данными, который нужно 
поместить на форму, — навигатор базы данных. Этот элемент управления 
представлен компонентом TDBNavigator, который находится на вкладке Data 
Controls палитры компонентов Delphi. Поместите компонент TDBNavigator на 
верхнюю панель формы, а затем в качестве значения его свойства DataSource 
присвойте ссылку на компонент TDataSource формы (рис. 2.15). 
    Настроив навигатор базы данных, переходите к помещению на форму остальных 
элементов управления для работы с данными. Для этого вы можете воспользоваться 
двумя методами. Первый метод более простой, но и более длительный. Он 
заключается в перетаскивании на форму компонентов, представляющих 

    32 Часть I. Основы 


элементы управления для работы с данными, таких как TDBEdit, TDBMemo и 
т.п., с последующей настройкой свойств DataSource и DataField каждого из этих 
компонентов. Разместив и настроив компонент, поместите рядом с ним компонент 
TLabel, который будет представлять название соответствующего поля базы данных. 
Этот метод является простым, но, к сожалению, монотонным, что особенно 
неприятно, если создается форма с большим количеством элементов управления для 
работы с данными. 

    Рис. 2.15. Форма с навигатором базы данных 

    Второй метод, более эффективный, состоит в перетаскивании на форму 
компонентов TField из окна редактора полей. Стоит только перетащить такой 
компонент на форму, как Delphi тут же автоматически создаст соответствующий 
элемент управления для работы с данными и связанную с ним надпись. Для того 
чтобы воспользоваться этим методом, выполните следующие операции. 
    1. Щелкните дважды на компоненте ТТаblе, чтобы открыть окно редактора полей. 
    2. Щелкните правой кнопкой мыши на окне редактора полей и из появившегося 
контекстного меню выберите пункт Add fields. 
    3. В открывшемся окне со списком полей щелкните на кнопке ОК, чтобы 
добавить на форму все поля. 
    4. Перетащите все выделенные поля из окна редактора полей на форму. Если 
все было сделано правильно, то на форме будут созданы компоненты TField со 
связанными с ними компонентами TLabel, имеющими соответствующие заголовки. 
    В результате будет получена форма, представленная на рис. 2.16. 
    Итак, разработка формы практически завершена. Вы только что вручную 
выполнили то, что мастер Database Form Wizard делает для вас автоматически.
Однако, исследовав оба метода создания форм, вы хорошо разобрались в тонкостях 
процесса разработки форм баз данных в Delphi. 
    Последнее, что нужно сделать, — это определить, как и когда должна 
открываться таблица базы данных, представленная компонентом ТТаblе. Это также 
можно сделать двумя способами. Во-первых, можно еще на этапе разработки формы 
установить свойство Active компонента ТТаblе равным значению True. В этом 
случае таблица будет открыта уже в окне конструктора форм и будет 
автоматически открываться при запуске программы. Во-вторых, можно создать 
обработчик события OnCreate или OnShow формы, в 


    Глава 2. Начало работы 33 
    2 Delphi 3 и системы клиент/сервер 

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

    Рис. 2.16. Новая форма после размещения на ней элементов управления для 
работы с данными 

    Давайте воспользуемся методом мастера форм и создадим обработчик события 
OnCreate формы, в котором будет открываться таблица базы данных. Нажмите 
<F11>, чтобы перейти в окно редактирования свойств и событий объектов, и 
выберите из раскрывающегося списка, находящегося в верхней части этого окна, 
объект Form1, представляющий нашу форму. Затем откройте вкладку Events и 
щелкните дважды на значении события OnCreate. В открывшемся окне 
редактирования введите следующий оператор: 

    Table1.Open; 

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

    Запуск приложения с новой формой 

    Создав форму, нужно запустить приложение на выполнение, чтобы увидеть, как 
эта форма будет выглядеть в работе. Для того чтобы данная форма была первой 
формой, которая появляется на экране при запуске приложения, нужно назначить 
ее главной формой. Для этого выполните следующее. 
    1. Из главного меню Delphi выберите пункт Project=>Options. 
    2. Откройте вкладку Forms диалогового окна Options, щелкните на кнопке 
раскрытия списка Main form и выберите пункт Form1. Выбранная таким образом 
форма будет главной формой приложения. 
    3. Щелкните на кнопке ОК, чтобы сохранить внесенные изменения. 
    Сделав разработанную вами форму главной формой приложения, нажмите <F9>, 
чтобы откомпилировать приложение и запустить его на выполнение. Как только 
приложение загрузиться, на экране появится разработанная вами форма, вид 
которой будет близок к показанному на рис. 2.17. 

    34 Часть I. Основы 


    Рис. 2.17. Возможный вид разработанной вами формы во время выполнения 
приложения Поработав с формой, закройте ее, чтобы вернуться в Delphi. 


    Создание приложения базы данных 

    Теперь, когда вы ознакомились с основными принципами создания простых форм 
баз данных, можно перейти к созданию приложений баз данных. Однако переход от 
разработки форм к разработке целых приложений сопровождается рядом 
принципиальных моментов, без знания которых вы не сможете продвинуться дальше. 
В этом разделе данной главы приведена вся необходимая для этого информация. 
    Q Использование в приложениях компонента TDatabase. 
    Q Определение псевдонимов BDE. 
    Q Настройка модулей данных. 
    Q Создание форм вида "главная—подробная". 
    Q Основы использования компонента TQuery. 
    Q Разработка отчетов. 

    Компонент TDatabase 

    Хотя компонент TDatabase в приложениях баз данных не является 
обязательным, его применение позволяет обеспечить централизованное управление 
доступом ко всей базе данных. Например, чтобы изменить уровень разграничения 
транзакций, достаточно установить нужное значение свойства TransIsolation 
компонента TDatabase. Если возникла необходимость изменения стандартной 
последовательности операций при регистрации — просто напишите нужный код в 
обработчике события OnLogin компонента. А если нужно настроить параметры 
драйвера — Компонент TDatabase снова к вашим услугам со своим свойством Params. 

    Глава 2. Начало работы 35 

    Выполните следующие операции, чтобы добавить компонент TDatabase к форме 
Form1 и настроить его. 
    1. Найдите компонент TDatabase на вкладке Data Access палитры компонентов 
Delphi и поместите на форму. Как и в случае компонентов ТТаblе и TDataSource, 
физическое расположение компонента TDatabase на форме не имеет значения. Этот 
компонент является невизуальным, поэтому во время выполнения программы он не 
отображается на форме. 
    2. Укажите в качестве значения свойства AliasName компонента TDatabase 
псевдоним DBDEMOS, который вы уже использовали для этой формы. 
    3. В качестве значения свойства DatabaseName укажите dbTest. Это свойство 
определяет имя, по которому другие компоненты будут ссылаться на компонент 
TDatabase. Другими словами, чтобы обеспечить связь компонента TDatabase с 
компонентом TTable, нужно в качестве значения свойства DatabaseName компонента 
TTable указать имя, которое вы использовали в качестве значения свойства 
DatabaseName компонента TDatabase. 
    4. Настроив компонент TDatabase, измените свойства компонента TTable. Для 
этого перейдите в окно Object Inspector и раскройте список, находящийся в 
строке ввода значения свойства Database Name компонента TTable. Если все было 
сделано правильно, то в этом списке должно появится имя dbTest. Щелкните на 
этом имени, чтобы выбрать его в качестве значения свойства. Теперь вы имеете 
полный доступ к базе данных с помощью всего одно элемента управления, 
представленного компонентом TDatabase. На рис. 2.18 показана форма с 
размещенным на ней компонентом TDatabase. 
    5. Прежде чем продолжать, убедитесь в том, что сохранили на диске все 
внесенные в проект изменения. 

    Рис. 2.18. Для обеспечения доступа к базе данных нужно использовать компонент 
    TDatabase 


    Псевдонимы BDE 

    Такое мощное средство Delphi как Database Explorer имеет очень широкую 
область применения. Здесь мы воспользуемся им лишь для создания псевдонима 
BDE. Этот псевдоним необходим приложениям, разработанным с помощью Delphi, для 
обеспечения доступа к базам данных через механизм BDE. 

    36 Часть I. Основы 

    Лично мне не нравится термин "псевдоним". В этом слове есть нечто 
нехорошее — как будто мы почему-то пытаемся скрыть за ним какие-то сведения. 
Однако, если абстрагироваться от подтекста и отбросить ассоциации, то 
псевдоним BDE является функциональным аналогом источника данных СУБД. По сути 
псевдоним представляет собой набор параметров, определяющих метод подключения 
драйвера BDE к той или иной базе данных либо СУБД. 
    До сих пор мы использовали созданный по умолчанию демонстрационный 
псевдоним DBDEMOS, который в комплекте поставки Delphi применяется для доступа 
к стандартным примерам приложений баз данных. Теперь же я покажу вам, как 
создать новый псевдоним BDE. Это знание пригодится вам при создании 
собственных баз данных, так как, скорее всего, вы не будете вечно использовать 
демонстрационный псевдоним Delphi. 
    Для создания нового псевдонима BDE выполните следующие операции. 
    1. Из главного меню Delphi выберите команду Database=>Explore, чтобы 
запустить Database Explorer. Появится окно средства Database Explorer, которое 
по каким-то причинам разработчики решили назвать SQL Explorer, хотя, если 
обратиться к документации и справочной системе, то в ней утверждается, что это 
окно называется именно Database Explorer. Чтобы не вносить путаницу, я буду в 
дальнейшем называть окно SQL Explorer так, как его называют разработчики в 
документации, т.е. Database Explorer. 
    2. Щелкните на вкладке Databases, если она не открыта, а затем щелкните на 
пункте Databases. 
    3. В раскрывшемся списке щелкните правой кнопкой мыши на элементе Database 
и из появившегося меню выберите пункт New. 
    4. Появится окно New Database Alias, в котором вам будет предложено 
выбрать драйвер базы данных для нового псевдонима BDE. Так как создаваемый в 
нашем примере псевдоним будет использовать базу данных Paradox, выберите 
значение Standard и щелкните на кнопке ОК. 
    5. Теперь нужно указать имя нового псевдонима базы данных. Введите 
PDOXDEMO и нажмите <Enter>. 
    6. Щелкните на элементе Path, находящемся на правой панели, и введите 
полный путь к демонстрационной базе данных Delphi (например, D:\Program 
Files\Borland\Delphi 3\Demos\Data), а затем нажмите <Enter>. 

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

    7. Теперь щелкните на кнопке Apply, расположенной на панели инструментов 
Database Explorer. На пиктограмме этой кнопки изображена синяя стрелка, 
изогнутая по часовой стрелке. С этого момента новый псевдоним вступил в силу. 
    На рис. 2.19 изображен примерный вид экрана в момент окончания описанной 
выше работы. Создав новый псевдоним BDE, применим его в нашей форме. Для этого 
выполните следующие операции. 
    1. Закройте окно Database Explorer и перейдите в окно конструктора форм Delphi. 
    2. Щелкните на компоненте TDatabase, а затем нажмите <Р11>, чтобы перейти 
в окно Object Inspector. 
    3. Измените значение свойства AliasName объекта Databasel, чтобы оно 
ссылалось на только что созданный вами псевдоним. 
    Результат, который должен отображаться в окне Object Inspector, показан на 
рис. 2.20. Сохраните проект и запустите приложение на выполнение. Если все 
было сделано правильно, то, как и прежде, будет открыта таблица формата Paradox 
BIOLIFE. Убедившись в работоспособности приложения, закройте его и вернитесь в Delphi. 

    Глава 2. Начало работы 37 


    Рис. 2.19. Определение нового псевдонима 

    Рис. 2.20. Компонент TDatabase ссылается на новый псевдоним BDE 


    Часть I. Основы 


    Модули данных 

    Модули данных — это формы специального вида, предназначенные для 
размещения невизуальных компонентов, например элементов управления для доступа 
к данным. С помощью модулей данных можно централизовать работу со всеми 
невизуальными компонентами с целью облегчения доступа к базе данных и 
управления ею. Я рекомендую создавать модули данных для всех баз данных, к 
которым могут обращаться разрабатываемые вами с помощью Delphi приложения. 
Хотя от вас не требуется помещать все объекты, представляющие таблицы базы 
данных, в единый модуль данных, я все же настоятельно рекомендую вам поступать 
именно так. Такой подход позволяет сохранять модули данных в хранилище 
объектов Delphi, а затем использовать их в других приложениях. Это не только 
поможет обеспечить совместимость и преемственность ваших приложений, но и 
позволит централизовать управление доступом к базам данных с помощью хранилища 
объектов Delphi — средства Object Repository. 
    Итак, выберите команду File=>New Data Module. Появится небольшая форма, на 
которую можно помещать невизуальные компоненты. Если вы сочтете, что 
установленные по умолчанию размеры этой формы слишком малы — измените их в 
соответствии со своими вкусами. 
    Теперь можно перенести все невизуальные компоненты, предназначенные для 
обеспечения доступа к базе данных, из окна формы в окно модуля данных. При 
разработке приложений баз данных старайтесь помещать в модуль данных 
приложения все компоненты, обеспечивающие доступ к данным. 
    Выберите компоненты ТТаblе, TsDataSource и TDatabase, находящиеся на форме 
Form1, и нажмите <Ctrl+X>, чтобы переместить их в буфер обмена Windows. Затем 
перейдите в окно модуля данных и нажмите <Ctrl+V>, чтобы вставить находящиеся 
в буфере обмена компоненты в модуль данных. На рис. 2.21 приведен возможный 
вид окон модуля данных и формы после завершения этой операции. 

    Рис. 2.21. Модуль данных с помещенными в него компонентами, 
обеспечивающими доступ к данным 

    Однако одного перемещения невизуальных компонентов в модуль данных 
недостаточно. Теперь нужно перейти в окно формы для работы с таблицей BIOLIFE 
и отредактировать ссылки на только что перемещенные вами компоненты, так как 
теперь эти ссылки нарушились. Так, например, компонент TDBEdit на форме Formi 
раньше ссылался на компонент TDataSource формы, но теперь последнего на форме 
уже нет. Так как компонент TDataSource перемещен с формы, ссылка стала 
неправильной и Delphi удалила ее. Поэтому, прежде чем продолжить работу, нужно 
восстановить все нарушенные ссылки. 

    Глава 2. Начало работы 39 


    Совет 
    В зависимости от того, где в форме располагались компоненты TTable, 
TDataSource и TDatabase, при вставки их в окно модуля данных, компоненты могут 
"уйти" за пределы этого окна. Если после нажатия <Ctrl+V> в окне модуля данных 
неожиданно появятся полосы прокрутки, значит, по крайней мере, один компонент 
находится вне поля зрения. Эту проблему можно решить путем изменения размеров 
окна модуля данных или путем прокрутки окна до нужного компонента с 
последующим перетаскиванием этого компонента поближе к верхнему левому углу окна. 

    Первым шагом, который нужно сделать, чтобы воспользоваться в форме Form1
созданным модулем данных, является включение ссылки на имя файла модуля данных 
в операторе uses модуля формы Form1. Это позволит операторам модуля формы 
"увидеть" компоненты модуля данных. Для этого нужно открыть форму таблицы 
BIOLIFE, выбрать команду File=>Use Unit, а затем указать имя файла с текстом 
модуля данных (если вы придерживались изложенных выше рекомендаций, то это 
будет имя Unit3). Теперь все объекты модуля данных будут доступны для 
операторов модуля формы Form1, как если бы эти объекты находились на самой форме. 
    Выберите все компоненты, обеспечивающие работу с данными (включая 
TDBNavigator), и нажмите <F11>, чтобы перейти в окно Object Inspector. В этом 
окне щелкните на кнопке раскрытия списка в строке значений свойства DataSource 
и выберите из него компонент TDataSource модуля данных. Как видно из рис. 
2.22, теперь имя этого компонента предваряется именем модуля данных. 

    Рис. 2.22. Форма ссылается на созданный модуль данных 

    Как вы, должно быть, помните, мы написали небольшой обработчик события 
OnCreate формы, который открывал таблицу ТТаblе при создании формы. Теперь 
ссылку на объект Table1 также нужно исправить. Нажмите <F11> чтобы перейти в 
окно Object Inspector, а затем выберите имя формы из раскрывающегося списка. 
Щелкните на вкладке Events, найдите событие OnCreate и дважды щелкните на его 
значении. Появится окно редактирования программы со следующей строкой: 

    Table1.Open; 


    40 Часть I. Основы 

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

    DataModule3.Table1.Open; 

    Однако такой оператор приведет к возникновению ситуации перекрестных 
ссылок программных модулей друг на друга, чего, по возможности нужно избегать. 
Другими словами, прежде чем создать форму, вы должны проверить, создан ли уже 
модуль данных. Если это условие не выполняется, то попытка обращения к методу 
Open объекта Table1 приведет к возникновению ошибки нарушения доступа. Поэтому 
лучше всего вообще отказаться от открытия таблицы программным способом. Проще 
и надежнее открыть таблицу на этапе разработки формы. Это позволит вам 
просматривать ее данные при создании связанной с данной таблицей формы и 
избавит от необходимости явного открытия таблицы во время выполнения 
программы. В общем случае этот подход является менее трудоемким и более гибким. 
    Удалите строку Tablel.Open; из обработчика события OnCreate формы и 
сохраните форму на диске. Затем откройте модуль данных и выберите в нем 
компонент TTable. Нажмите <F11>, чтобы перейти в окно просмотра свойств и 
событий, и найдите в нем свойство Active объекта Tablel. Щелкните дважды на 
значении этого свойства, чтобы открыть таблицу. Проделав все это, сохраните 
проект. 
    Теперь можете, если хотите, запустить приложение на выполнение, чтобы 
убедиться в его работоспособности. Проверив работу приложения, закройте его и 
вернитесь в Delphi. 
    Следующим этапом будет сохранение модуля данных в хранилище объектов 
Delphi. Регулярно используя хранилище объектов, вы убедитесь, что помещение в 
него созданных форм — будь то модули данных или "заурядные" формы — 
значительно облегчает работу, так как позволяет вам использовать старые 
наработки для создания новых форм или применения их в других проектах. 
    Щелкните правой кнопкой мыши на модуле данных (проследите, чтобы под 
указатель мыши не попал какой-нибудь компонент модуля данных) и из 
появившегося меню выберите команду Add To Repository. Откроется одноименное 
диалоговое окно (рис. 2.23), в котором вам нужно указать заголовок (Title) и 
описание (Description) нового объекта. Введите в качестве заголовка dmBIOLIFE 
и что-нибудь вразумительное в качестве описания, например Модуль данных формы 
BIOLIFE. Из списка Page выберите пункт Data Modules и, введя имя автора в 
строке Author, щелкните на кнопке ОК. 

    Рис. 2.23. Диалоговое окно Add To Repository 


    Глава 2. Начало работы 41 


    На заметку 
    В этом же диалоговом окне можно выбрать пиктограмму, модуль данных которой 
будет представлен в окне Object Repository. Когда в вашем хранилище объектов 
будет достаточно много модулей данных, вы убедитесь, что назначение каждому из 
них отдельной пиктограммы — очень хорошая идея. Для того чтобы назначить 
нестандартную пиктограмму добавляемому объекту, щелкните в окне Add To 
Repository на кнопке Browse. 

    Если вы еще не сохраняли форму модуля данных, то получите приглашение 
Delphi с предложением сохранить модуль данных на диске, прежде чем добавлять 
его в хранилище объектов. Щелкните на кнопке Yes и введите путь к файлу модуля данных. 
    Сохранив модуль данных dmBIOLIFE в хранилище объектов, вы получили 
возможность использовать этот модуль данных в любом приложении, обращающемся к 
таблице BIOLIFE. 

    Создание формы вида "главная-подчиненная" 

    Форма вида "главная-подчиненная", как правило, предназначена для просмотра 
не менее двух взаимосвязанных таблиц. Обычно в одной части такой формы 
отображается содержимое первой таблицы, а в другой части — содержимое второй 
таблицы. Например, в верхней части такой формы может быть открыта таблица 
ЗАКАЗЫ, а в нижней — связанная с первой таблицей таблица ТОВАРЫ. При 
перемещении по таблице ЗАКАЗЫ отображение содержимого таблицы ТОВАРЫ 
изменяется в соответствии с отображаемым содержимым главной таблицы. Такие 
формы являются типичными для приложений интерактивной обработки транзакций 
(OLTP — Online Transaction Processing). 
    В этом разделе я ознакомлю вас с методами создания формы вида 
"главная—подчиненная", которая будет отображать информацию о заказах клиентов. 
Для этого я воспользуюсь таблицами CUSTOMER и ORDERS из демонстрационной базы 
данных Delphi. 
    Кроме того, при создании этой формы мы ознакомимся с принципами 
использования компонента TQuery. До сих пор вы создавали формы, которые 
базировались только на компоненте ТТаblе. Однако для создания формы 
"главная—подчиненная" нужно использовать компонент TQuery. 
    Начнем с запуска мастера форм (выберите в главном меню Delphi пункт 
Database=>Form Wizard). В появившемся окне мастера форм выберите 
переключатели Create a master/detail form и Create a form using TQuery objects 
(см. рис. 2.3), а затем щелкните на кнопке Next. 
    Во втором окне мастера форм (см. рис. 2.4) из списка Drive or Alias name 
выберите ранее созданный псевдоним PDOXDEMO и щелкните дважды на таблице 
CUSTOMER.DB в списке Table Name. В качестве главной таблицы новой формы из 
демонстрационного каталога Delphi выберите таблицу CUSTOMER, имеющую формат 
таблиц Paradox. 
    В следующем окне мастера форм нужно выбрать поля таблицы CUSTOMER, которые 
будут размещены на форме. Щелкните на кнопке >>, чтобы выбрать все поля, а 
затем — на кнопке Next. 
    Появится следующее окно мастера форм, в котором вам будет предложено 
выбрать тип расположения полей главной таблицы на форме. Щелкните на кнопке 
Next, чтобы принять расположение по горизонтали, установленное по умолчанию. 
    Покончив с главной таблицей, переходим к подчиненной. Выбранный выше 
псевдоним уже автоматически установлен — в очередном окне мастера форм вам 
остается выбрать только таблицу. Щелкните дважды на таблице ORDERS, чтобы 
выбрать ее в качестве подчиненной таблицы новой формы. 
    Мастер форм откроет следующее окно, в котором предложит вам выбрать поля 
подчиненной таблицы для размещения на форме. Сначала щелкните на кнопке >>, 
чтобы выбрать все поля, а затем в списке Ordered Selected Fields выберите поле 
CustNo и щелкните на кнопке <, чтобы удалить его из списка (рис. 2.24). Так 
как поле CustNo главной таблицы будет отображаться в верхней части формы, то 
нет никакого смысла дублировать эту информацию в нижней части формы, где 
отображается подчиненная таблица. Щелкните на кнопке Next для продолжения. 

    Совет 
    В этом же диалоговом окне можно выбрать порядок размещения полей на форме. 
Для этого можно перетаскивать поля вверх и вниз по списку или использовать 
кнопки изменения порядка элементов, находящиеся под списком Ordered Selected Fields, 


    42 Часть I. Основы 


    Рис. 2.24. Выберите все поля, за исключением поля CustNo 

    Как и в случае главной формы, мастер форм попросит выбрать вариант 
расположения полей подчиненной таблицы на форме. По умолчанию для подчиненной 
таблицы выбрано сеточное расположение (In a grid). Щелкните на кнопке Next, 
чтобы принять это расположение и перейти к следующему окну. 
    В следующем окне (рис. 2.25) вам будет предложено выбрать пару полей, по 
которым главная и подчиненная таблицы будут связаны друг с другом. В таблицах 
хорошо спроектированной базы данных такие поля обычно имеют одинаковое 
название. В нашем примере мы свяжем главную и подчиненную таблицы с помощью 
столбцов CustNo, присутствующих в обеих таблицах. Щелкните в каждом из списков 
диалогового окна на элементах CustNo, а затем — на кнопке Add. Как показано на 
рис. 2.25, в области Joined Fields появится пара связанных полей. Создав таким 
образом связь между таблицами, щелкните на кнопке Next для продолжения. 
    Последнее диалоговое окно мастера форм позволяет вам выбрать режимы 
генерации главной формы и модуля данных (см. рис. 2.7). Ничего не изменяя, 
щелкните на кнопке Finish, чтобы сгенерировать только форму без модуля данных 
и сделать ее главной формой приложения. На рис. 2.26 показан вид полученной 
формы в окне конструктора форм Delphi. 
    Прежде чем запустить приложение на выполнение для проверки его работы, 
давайте немного изучим форму, созданную мастером Database Form Wizard. Такое 
исследование поможет вам в дальнейшем при создании собственных форм вида 
"главная—подчиненная". 
    Щелкните на компоненте TQuery, расположенном слева от других невизуальных 
компонентов, нажмите <F11>, чтобы открыть окно Object Inspector, а затем 
дважды щелкните на значении свойства SQL. Кроме того, можно просмотреть 
операторы SQL в окне редактирования Delphi, щелкнув на кнопке Code Editor. На 
рис. 2.27 показан пример того, что вы можете увидеть на экране. 
    Данный оператор SQL выбирает из таблицы CUSTOMER.DB содержимое всех строк 
и всех столбцов. Хотя он и обращается по отдельности к каждому столбцу 
таблицы, но так как вы в окне мастера форм выбрали все поля, то в результате 
этого запроса будет получено содержимое всей таблицы в целом. Так как в данном 
операторе не используется ключевое слово WHERE, то происходит выбор всех строк 
таблицы. Изучив оператор SQL, нажмите <Ctrl+F4>, чтобы закрыть окно редактирования. 

    Глава 2. Начало работы 43 


    Рис. 2.25. Связывание таблиц по полям CustNo 

    Рис. 2.26. Завершенная форма вида "главная—подчиненная" 


    44 Часть I. Основы 


    Рмс. 227. Оператор SQL, сгенерированный мастером форм для обращения к таблице 
    CUSTOMER 

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

    Select 
    ORDERS. "OrderNo", 
    ORDERS. "SaleDate", 
    ORDERS. "ShipDate", 
    ORDERS. "EmpNo", 
    ORDERS. "ShipToContact", 
    ORDERS. "ShipToAddrl", 
    ORDERS. "ShipToAddr2", 
    ORDERS. "ShipToCity", 
    ORDERS. "ShipToState", 
    ORDERS. "ShipToZip", 
    ORDERS. "ShipToCountry", 
    ORDERS. "ShipToPhone", 
    ORDERS. "ShipVIA", 
    ORDERS. "PO", 
    ORDERS. "Terms", 
    ORDERS. "PaymentMethod", 
    ORDERS. "ItemsTotal", 
    ORDERS. "TaxRate", 
    ORDERS. "Freight", 
    ORDERS. "AmountPaid", From "ORDERS.DB", As ORDERS Where 
    "ORDERS"."CustNo" =:"CustNo" 

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

    Глава 2. Начало работы 45 

    Для получения ответа на этот вопрос, вернитесь в окно Object Inspector и 
посмотрите на значение свойства DataSource объекта Query2, который в нашей 
форме представляет запрос к подчиненной таблице. В качестве этого значения 
должна быть указана ссылка на свойство DataSource компонента TQuery, 
являющегося запросом к главной таблице. Это означает, что при изменении 
содержимого поля CustNo объекта Query1 (например, при переходе курсора на 
следующую строку), объект Query2 выполняется повторно для поиска строк, 
соответствующих этому новому содержимому поля CustNo. Таким образом в Delphi 
достигается автоматическая синхронизация двух запросов — в подчиненной таблице 
отображаются только те строки, которые соответствуют текущей строке главной таблицы. 

    Рис. 2.28. Выполнение приложения с формой вида "главная—подчиненная" 

    Для того чтобы увидеть все это в работе, запустите программу на 
выполнение. На рис. 2.28 приведен пример того, что вы можете увидеть на экране. 
    Поработав с формой, закройте ее и вернитесь в Delphi. 

    Резюме 

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

    Что дальше... 

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

    46 Часть I. Основы