    Подготовка 

    9 ГЛАВА 

    И так, создав объекты базы данных, мы можем перейти к проектированию и 
разработке приложения RENTMAN. В главе 7, "Проектирование 
приложения архитектуры клиент/сервер", я поделился с вами некоторыми 
соображениями о подходах, применяемых при проектировании приложений баз 
данных. Если при чтении данной главы вам что-то покажется не совсем понятным, 
можете обращаться к главе 7 за более подробными объяснениями. 
    Начнем с того, что вспомним пять этапов разработки приложения, а затем 
продолжим с той точки, на которой мы остановились в главе 8, "Ваша первая 
система клиент/сервер". Итак, процесс создания приложения состоит из следующих 
пяти этапов. 
    Анализ. 
    Проектирование. 
    Разработка. 
    Тестирование. 
    Совершенствование. 
    В главе 8 мы выполнили этапы анализа, проектирования и разработки базы 
данных системы RENTMAN. В этой главе мы займемся сначала анализом и 
проектированием самого приложения RENTMAN, а затем перейдем к его разработке, 
начав с некоторых подготовительных мероприятий. Таким образом, в данной главе 
мы приступим к созданию приложения, основывающегося на базе данных, 
разработанной в главе 8. 

    База данных системы RENTMAN 

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

    Определение типа приложения 

    Как упоминалось в главе 7, на первой стадии создания приложения базы 
данных необходимо определить тип этого приложения. Имеются два основных типа 
таких приложений: диалоговые системы обработки транзакций (OLTP — online 
trasaction processing) и системы поддержки принятия решения (DSS — 

    182   Часть II. Учебный курс 

decision support systems). Системы первого типа предназначены для ввода и 
обработки данных, а системы второго типа — для их представления руководящим 
работникам организации. Кроме того, системам OLTP нужен полный доступ к 
данным, тогда как системам DSS достаточно доступа только для чтения. Именно 
из-за таких фундаментальных различий в подходах необходимо определить тип 
будущего приложения еще до начала его разработки. 
    Приложение RENTMAN является системой обработки транзакций. Пользователи 
этой системы должны иметь возможность читать, изменять и удалять данные, 
поэтому очевидно, что данное приложение не соответствует критериям систем DSS. 
С другой стороны, некоторые обобщенные данные, собранные приложением, будут 
использоваться руководящим составом нашей вымышленной компании Allodium для 
принятия решений. Поэтому, система RENTMAN, как большинство приложений 
архитектуры клиент/сервер, будет гибридной — в ней будут присутствовать как 
элементы систем OLTP, так и элементы систем DSS. В нашем случае мы все же 
сделаем акцент на свойствах, характерных для систем обработки транзакций, так 
как системы OLTP обладают всеми свойствами, необходимыми для систем DSS. 

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

    Используя модели процессов предметной области, разработанные в главе 8, 
проанализируйте каждый из процессов на предмет определения объектов приложения 
(как правило, форм и отчетов), необходимых для реализации этих процессов. 
Например, вы можете прийти к выводу, что приложение должно обладать средствами 
ввода данных в каждый накопитель, используемый в моделях процессов. Как вы 
помните, существует определенная корреляция между накопителями и таблицами 
физической базы данных. Точно такая же корреляция имеется и между таблицами 
базы данных и формами приложения. Как правило для каждой таблицы нужно не 
менее одной формы. Такая форма может использоваться как для ввода данных 
таблицы, так и для работы с таблицей — для поиска, добавления, изменения и 
удаления строк. 
    Не волнуйтесь, если пока не можете точно определить все нужные формы и 
отчеты. На данном этапе достаточно выявить лишь самые главные объекты 
приложения. Иными словами, нужно создать эскиз приложения — все детали будут 
уточняться в ходе разработки. 
    После определения всех форм, отчетов и других объектов приложения, 
соответствующих элементам модели процессов, нужно создать аннотации моделей, в 
которых указывается данная информация. На рис. 9.1 показана модель процесса 
аренды системы RENTMAN, с аннотациями, описывающими объекты приложения, 
необходимые для реализации этой модели. 
    Обратите внимание, что объектам приложения RENTMAN я присвоил имена, 
соответствующие соглашениям, описанным в главе 4, "Соглашения". Кроме того, 
как видно из рис. 9.1, по этим именам можно судить о типе каждой формы. 
Другими словами, я отличаю как формы, имеющие компонент управляющей сетки 
данных, от форм, на которых находится обычная сетка данных, так и стандартные 
формы ввода данных от форм ускоренного ввода данных. Что такое управляющая 
сетка данных? Подробнее мы поговорим об этом компоненте несколько позже, 
сейчас скажу лишь, что он называется DBCtrlGrid и предназначен для отображения 
нескольких записей на одной форме. Логика его работы несколько отличается от 
стандартного компонента сетки данных, DBGrid, предназначенного для отображения 
нескольких строк. Умение предвидеть такие подробности реализации интерфейса 
приходит с опытом. Разработчики, которые создают приложения клиент/сервер на 
протяжении нескольких лет, могут без труда определить детали реализации 
системы еще на ранних стадиях ее создания. 
    Итак, вам нужно идентифицировать объекты приложения всех процессов 
предметной области, представленных соответствующими моделями. В случае 
приложения RENTMAN таких процессов два: процесс аренды и процесс эксплуатации. 
Исследовав оба процесса на предмет выявления возможных эквивалентов в 
приложении, классифицируйте каждый из полученных объектов как отчет, форму или 
неинтерактивный вспомогательный код (последний представляет собой программный 
объект не имеющий визуального представления, реализация которого необходима 
для функционирования приложения). Каждый из выявленных объектов должен быть 
отнесен к одному из трех типов (в данном примере диаграммы можно также отнести 
к отчетам). Кроме того, постарайтесь поточнее определить не только тип, но и 
подтип каждого объекта (например, форма быстрого ввода данных, подробный отчет 
и т.д.). 
    Помните, что некоторые объекты приложения определены по умолчанию. 
Например, каждое приложение имеет главную форму того или иного вида. Кроме 
того, каждой таблице вашего приложения нужна форма, с помощью которой можно 
было бы добавлять, изменять или удалять строки этой таблицы. В табл. 9.1 
приведен предварительный перечень форм и отчетов приложения RENTMAN. 

    Глава 9. Подготовка 183 


    Рис. 9.1. Модель процесса аренды с аннотациями, описывающими объекты приложения 

    Таблица 9.1. Предварительный перечень форм и отчетов приложения RENTMAN 

    Имя                  Назначение    	Тип объекта				Описание 

    fmRSYSMANO	Обработка транзакций	Форма SDI 				Главное меню системы 
    fmRCALEDTO    Ввод данных   		Форма быстрого ввода данных	Форма ввода и редактирования данных звонков 
    fmRCALGRDO	Обработка транзакций 	Форма управляющей сетки		Сеточная форма списка звонков данных 
    fmRWORMDEO	Обработка транзакций 	Форма типа "главная-подчиненная"     Форма нарядов на работы 
    fmRWORGRDO	Обработка транзакций 	Форма сетки данных     		Сеточная форма списка нарядов на работы 
    fmREMPENTO	Ввод данных 		Форма быстрого ввода данных 	Форма ввода данных служащего 
    fmREMPGRDO	Обработка транзакций 	Форма сетки данных 		Сеточная форма списка служащих 
    fmRWKTGRDO	Обработка транзакций 	Форма сетки данных     		Сеточная форма списка типов работ 
    fmRWKTENTO	Ввод данных 		Форма быстрого ввода данных 	Форма ввода типа работ 
    fmRPROCGDO	Обработка транзакций 	Форма управляющей сетки     	Форма таблицы PROPERTY данных 
    fmRTENCGDO	Обработка транзакций 	Форма управляющей сетки     	Форма таблицы TENANT данных 
    fmRLEAGRDO	Обработка транзакций 	Форма сетки данных 		Форма таблицы LEASE 
    rpRLEAPRTO	Отчет     			Форма-отчет     			Договор аренды 


    184 Часть II. Учебный курс 


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

    Имя            Назначение   	Тип объекта       Описание 

    rpRWORORDO	Отчет     		Форма-отчет     	Наряд 
    rpRTSKLSTO	Отчет          	Подробный отчет   Список текущих работ служащих 


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

    Разработка иерархии форм 

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

    Классы форм Delphi 

    Первым шагом в разработке иерархии форм является классификация их по 
функциям. Так как вы уже определили тип каждой формы, сделать это будет 
несложно. Формы баз данных Delphi можно разделить на четыре следующих 
функциональных класса. 
    Q Редактирование и ввод. Простая форма, представляющая одну запись одной таблицы. 
    Q Сетка. Форма, которая отображает несколько строк одной таблицы, как это 
делается в программах электронных таблиц (каждая строка таблицы базы данных 
занимает одну строку на экране). 
    Q Управляющая сетка. Форма, которая отображает несколько строк одной 
таблицы (каждая строка таблицы занимает несколько строк экрана). 
    Q Главная-подчиненная. Форма, которая показывает строки двух или более 
связанных таблиц. 
    Если применить эту классификацию к формам, перечисленным в табл. 9.1, 
получим распределение форм по классам, приведенное в табл. 9.2. 

    Таблица 9.2. Формы системы RENTMAN, распределенные по классам 

    Форма		Класс 

    fmRCALEDTO	Редактирование и ввод 
    fmRCALGRDO	Сетка 
    fmRWORMDEO	Главная-подчиненная 
    fmRWORGRDO	Сетка 
    fmREMPENTO	Редактирование и ввод 
    fmREMPGRDO 	Сетка 
    fmRWKTGRDO 	Сетка 
    fmRWKTENTO 	Редактирование и ввод 
    fmRPROCGDO 	Управляющая сетка 
    fmRLEAGRDO 	Сетка 
    fmRTENCGDO 	Управляющая сетка 


    Глава 9. Подготовка 185 

    После выполнения такого разделения становится ясно, что "система ^RENTMAN 
"состоит из четырех функциональных групп. В связи с этим имеет смысл 
объединить формы, являющиеся предками всех групп, в иерархию форм системы 
RENTMAN. На рис. 9.2 показан простой пример такой иерархии. 
    При разработке приложения прежде всего создаются и сохраняются в хранилище 
объектов Delphi формы-предки. Затем на их основе создаются все формы, 
являющиеся потомками. 
    Каждый из классов иерархии форм RENTMAN называется по типу форм, которые 
он обобщает. Все классы форм, включая формы, не относящиеся к базе данных, 
являются потомками класса AnyForm. Этот класс представляет собой базовый класс 
форм, на основе которого создаются все остальные формы приложения RENTMAN. 
Такой подход позволяет обеспечить единообразие внешнего вида и логики работы 
всех форм приложения. Точно так же класс DatabaseForm обеспечивает подобие 
всех форм, работающих с базой данных. Это распространяется и на все остальные 
классы форм — каждый из них является основой какого-то подвида форм приложения RENTMAN. 

    Рис. 9.2. Иерархия форм приложения RENTMAN 

    Подготовка к разработке приложения 

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

    Создание псевдонима BDE 

    Первое, что надо сделать при разработке приложения базы данных с помощью 
Delphi, — это создать псевдоним BDE, представляющий базу данных вашего 
приложения. Само собой разумеется, что в тех случаях, когда одно приложение 
работает с несколькими базами данных, нужно создать несколько псевдонимов. 
    Что касается приложения RENTMAN, то для него нужно определить псевдоним, 
описывающий базу данных СУБД InterBase, созданную в главе 8. Созданный 
псевдоним будет использоваться в приложении для обращения к реальной базе данных. 

    186 Часть II. Учебный курс 

    Вы уже знакомы со средством Delphi Database Explorer. Сейчас мы 
воспользуемся этим многофункциональным средством для создания псевдонима BDE. 
Для этого выполните следующие операции. 
    1. Запустите Delphi и выберите пункт меню Database=>Explore. На экране 
появится окно средства Database Explorer. (Как вы уже знаете из предыдущих 
глав, в варианте Delphi Client/Server это окно называется SQL Explorer.) 
    2. Щелкните на вкладке Databases окна SQL Explorer, если она не является 
текущей, а затем щелкните на пункте Databases в списке, представленном на этой вкладке. 
    3. Щелкните правой кнопкой мыши на пункте Databases и из появившегося меню 
выберите команду New. Это приведет к созданию нового шаблона BDE. 
    4. Появится диалоговое окно, в котором вам будет предложено указать 
драйвер базы данных для нового псевдонима. Выберите из списка пункт INTRBASE и 
щелкните на кнопке ОК. 
    5. В качестве имени нового псевдонима базы данных введите RENTMAN, а затем 
нажмите <Enter>. 
    6. Щелкните на пункте SERVER NAME и введите полный путь к базе данных 
RENTMAN, созданной в главе 8. По умолчанию — это с: \DATA\RENTMAN\RENTMAN.GDB. 
Для того чтобы выбрать имя файла с помощью мыши, можно воспользоваться кнопкой 
подстановки, находящейся справа от строки ввода. 
    7. Щелкните на пункте USER NAME и введите существующее имя пользователя 
СУБД InterBase (например, SYSDBA). 
    8. Измените значение параметра ENABLE BCD на True. 
    9. Щелкните на кнопке Apply панели инструментов Database Explorer (на 
пиктограмме этой кнопки изображена синяя стрелка, изогнутая по часовой 
стрелке). Теперь внесенные вами изменения вступили в силу. 
    На рис. 9.3. показан вид окна Database Explorer после выполнения описанных 
выше операций. 

    Рис. 9.3. Окно Database Explorer после добавления нового псевдонима BDE 

    Глава 9. Подготовка 187 

    Внимание! 
    Обязательно установите параметр ENABLE BCD равным значению True. Этот 
параметр влияет на метод, который использует система InterBase при обработке 
полей типа NUMERIC или DECIMAL. Указанное выше изменение значения этого 
параметра отключает используемый по умолчанию режим оптимизации BDE, в котором 
поля данных типов обрабатываются как поля с целочисленными значениями. Смысл 
оптимизации состоит в том, чтобы рассматривать числа с плавающей точкой, у 
которых нет значащих цифр после десятичной точки, как целые числа. Такой 
подход позволяет повысить скорость работы. Однако имеется и побочный эффект — 
оптимизация распространяется на всю базу данных в целом, даже если какие-то 
поля тех или иных таблиц действительно содержат числа с плавающей точкой, а не 
целые. Данный эффект проявляется в запрете элементами управления для работы с 
данными, такими, например, как компонент DBEdit, ввода десятичных знаков в 
соответствующие поля, так как все они рассматриваются как поля целочисленного 
типа. Присвоение параметру ENABLE BCD значения True включает режим, в котором 
все типы с плавающей точкой рассматриваются как числа в формате BCD (Binary 
Coded Decimals — десятичные числа в упакованном формате), а не целые числа. 

    Создание нового проекта 

    Закройте окно Database Explorer, чтобы вернуться в Delphi, а затем 
выберите из главного меню Delphi команду File=>New Application. Система создаст 
новый проект и откроет новую пустую форму. Выберите команду File=>Save All, 
чтобы сохранить проект. Оставьте для файла модуля используемое по умолчанию 
имя Unit1, а в качестве имени файла проекта укажите имя RENTMAN. Сохраните 
этот файл в том каталоге, который вы выделили для размещения файлов данного 
учебного приложения (например, C:\DATA\DELPHI\RENTMAN). 

    Создание модуля данных 

    Следующий подготовительный шаг к разработке приложения RENTMAN — создание 
формы модуля данных. Модуль данных — это форма специального вида, 
предназначенная для хранения невизуальных компонентов, таких, например, как 
компоненты для доступа к базе данных. Модули данных, о которых рассказывается 
в этой книге, ориентированы на работу с базами данных. Другими словами, они 
содержат все табличные объекты определенной базы данных. В нашем примере 
модуль данных приложения RENTMAN будет содержать компоненты Table и DataSource 
для всех таблиц системы RENTMAN. Я рекомендую создавать такие модули данных 
для каждой базы данных, с которыми работают создаваемые вами с помощью Delphi 
приложения. Хотя нет формального требования, согласно которому все компоненты, 
ссылающиеся на одну и ту же базу данных, должны храниться в одном модуле 
данных, я рекомендую везде, где это возможно, поступать именно так. При таком 
подходе можно сохранять модули данных в хранилище объектов Delphi, а затем 
использовать в других приложениях, обращающихся к этим же базам данных. Это 
позволит обеспечить преемственность и единообразие ваших приложений и 
осуществлять централизованное управление доступом к той или иной базе данных. 
    Итак, выберите команду File=>New Data Module из меню Delphi. Появится новая 
форма небольшого размера, на которую мы будем помещать невизуальные 
компоненты. Щелкните на свойстве Name в окне Object Inspector и измените имя 
этой формы на dmRENTMAN. 
    Вы, наверняка, захотите увеличить размер формы модуля данных, чтобы 
облегчить последующую работу с многочисленными объектами, которые нужно на ней 
разместить. Сделайте это, а затем выполните следующие операции. 
    1. Щелкните на вкладке Data Access палитры компонентов Delphi и поместите 
на форму модуля данных компонент Database. 
    2. С помощью окна редактирования свойств и событий измените свойство 
AliasName компонента Database, назначив ему в качестве значения псевдоним 
RENTMAN, созданный в предыдущем разделе. 
    3. Измените свойства DatabaseName и Name компонента Database, присвоив им 
в качестве значения ИМЯ dbRENTMAN. 
    4. Поместите на форму модуля данных восемь компонентов Table и восемь 
компонентов DataSource. 

    188 Часть II. Учебный курс 

    Совет 
    Для размещения на форме сразу нескольких экземпляров одного компонента 
можно воспользоваться следующим способом. Перед тем, как щелкнуть на кнопке 
компонента, расположенной в палитре компонентов Delphi, нажмите и удерживайте 
клавишу <Snift>. В этом режиме при каждом щелчке в окне конструктора форм 
Delphi вы будете получать очередную копию выбранного компонента. Для 
отключения этого режима достаточно щелкнуть на кнопке выбора (на ее 
пиктограмме изображен стандартный указатель курсора мыши), расположенной в 
левой части палитры компонентов. 
    5. Присвойте ссылки на псевдоним базы данных в приложении (т.е. dbRENTMAN) 
в качестве значения свойств DatabaseName всех компонентов Table. 

    Совет 
    Для того чтобы быстро выбрать сразу несколько компонентов, охватите их 
контуром выделения. Для этого нужно поместить указатель мыши немного левее и 
выше самого левого компонента выделяемой группы, нажать кнопку мыши, 
используемую для выделения (по умолчанию — левая), и протащить правый нижний 
угол появившегося пунктирного контура выделения так, чтобы он охватил все 
нужные компоненты. Отпустив кнопку мыши, вы увидите, что все компоненты, 
которые были охвачены контуром выделения, стали выбранными. 
    6. Измените свойства Name и TableName компонента Table в соответствии со 
списком, приведенным в табл. 9.3. 

    Таблица 9.3. Соответствие имен компонентов и таблиц системы RENTMAN 

    Name  		TableName 

    taTENANT 	TENANT 
    taPROPERTY 	PROPERTY 
    taLEASE 	LEASE 
    taCALL 		CALL 
    taWORDER 	WORDER 
    taWODETAIL 	WODETAIL 
    taEMPLOYEE 	EMPLOYEE 
    taWORKTYPE 	WORKTYPE 


    На заметку 
    В этот момент может появиться диалоговое окно, запрашивающее ввод пароля 
для доступа к базе данных dbRENTMAN. Для используемого по умолчанию имени 
пользователя SYSDBA нужно указать используемый по умолчанию пароль masterkey. 
Удостоверьтесь, что пароль вводится в нижнем регистре, а после ввода щелкните 
на кнопке ОК. Если попытка регистрации завершится неудачно, сервер InterBase 
может не запуститься. Процесс запуска сервера подробно описан в разделе 
"Создание базы данных" главы 8. Для того чтобы сервер InterBase запускался 
автоматически при каждом запуске Windows, можно поместить его пиктограмму в 
папку автозапуска. 
    7. Снова выберите все восемь компонентов таблиц и установите их свойства 
Active равными значению True. Это приведет к автоматическому открытию всех 
таблиц как при разработке форм, так и при запуске любого приложения, которое 
будет использовать создаваемый модуль данных. 
    8. Настроив компоненты Table, можно заняться компонентами DataSource. 
Измените свойства DataSet и Name всех компонентов DataSource в соответствии с 
приведенным ниже списком. 

    Глава 9. Подготовка 189 

    DataSet       Name

    taTENANT 	dsTENANT 
    taPROPERTY 	dsPROPERTY 
    ta LEASE 	dsLEASE 
    taCALL 		dsCALL 
    taWORDER 	dsWORDER 
    taWODETAIL 	dsWODETAIL 
    taEMPLOYEE 	dsEMPLOYEE 
    taWORKTYPE 	dsWORKTYPE 


    На рис. 9.4 показан вид окна завершенного модуля данных. 


    Рис. 9.4. Завершенный модуль данных системы RENTMAN 


    Теперь можно поместить разработанный модуль данных в хранилище объектов Delphi. 
    1. Из главного меню Delphi выберите команду File=>Save и сохраните модуль 
данных на диске как файл С:\DATA\DELPHI\RENTMAN\RENTDATA.РАЗ (если вы 
используете другой каталог — замените путь С:\DATA\DELPHI\RENTMAN). 
    2. Щелкните правой кнопкой мыши на модуле данных и из появившегося меню 
выберите команду Add То Repository. 
    3. В строке Title появившегося окна введите dmRENTMAN, а в строке 
Description — Data module form for the RENTMAN database. 
    4. Из списка Page выберите пункт Data Modules и щелкните на кнопке ОК, 
чтобы закрыть окно Add To Repository. 
    На рис. 9.5 показано диалоговое окно Add To Repository с введенными 
указанными выше значениями. 
    
    190 Часть II. Учебный курс 


    Рис. 9.5. Внесение модуля данных dmRENTMAN в хранилище объектов 


    Теперь модуль данных dmRENTMAN можно использовать во всех приложениях, 
обращающихся к базе данных RENTMAN. 

    Создание иерархии форм 

    Следующим шагом в разработке приложения RENTMAN является создание ранее 
определенной иерархии форм. Впоследствии этой иерархией также можно будет 
пользоваться в других системах клиент/сервер, создаваемых с помощью Delphi. 
Напомню, что иерархия определяет шесть форм: форму верхнего уровня, форму базы 
данных, форму редактирования, сеточную форму, форму с управляющей сеткой и 
форму вида "главная-подчиненная". Начнем с формы верхнего уровня. 

    AnyForm 

    Выберите из меню команду File=>Close, чтобы закрыть модуль данных, а затем 
щелкните на кнопке New form панели инструментов или выберите из подменю File 
команду New Form). В окне конструктора форм Delphi должна появится новая 
форма, озаглавленная Forml. Выполните следующие операции для того чтобы 
настроить эту форму и сохранить ее, согласно приведенной выше иерархии, в виде 
класса AnyForm в хранилище объектов. 
    1. Укажите в качестве значения свойства Name имя fmAnyForm, а свойству 
position присвойте значение poScreenCenter. 
    2. Присвойте свойству AutoScroll значение False. 
    3. Поместите на форму три компонента Panel и расположите их друг над 
другом. Назовите эти панели (т.е. измените значения их свойств Name) paTop 
(верхняя), paMiddle (средняя) и paBottom (нижняя). 
    4. Присвойте свойству Align панели paTop значение alTop и удалите значение 
ее свойства Caption. 
    5. Измените размер панели paTop так, чтобы она занимала примерно 1/3 
высоты формы. 
    6. Установите свойство Align панели paBottom равным значению alBottom и 
удалите ее заголовок. 
    7. Измените размер панели paBottom так, чтобы ее высота равнялась 40 пикселям. 

    Глава 9. Подготовка 191 

    8. Установите свойство Align панели paMiddle равным значению alClient. Это 
приведет к тому, что данная панель заполнит все пространство между 
компонентами раТор и paBottom. 
    9. Удалите значение свойства Caption панели paMiddle. 
    Хотя это и не очевидно, но все формы создаваемой нами системы, за 
небольшим исключением, должны иметь три панели, подобные тем, которые мы 
только что разместили на форме AnyForm. Кроме того, мы установили свойство 
Position этой базовой формы таким образом, чтобы обеспечить одинаковое 
расположение всех форм. На рис. 9.6 показан примерный вид только что созданной формы. 

    Рис. 9.6. Завершенная базовая форма класса AnyForm 

    Завершив разработку формы, поместим ее в хранилище объектов. 
    1. Из главного меню Delphi выберите команду File=>Save и сохраните модуль 
формы на диске как файл ANYFORM.РАS в каталоге системы RENTMAN. 
    2. Щелкните правой кнопкой мыши на форме и из появившегося меню выберите 
команду Add To Repository. 
    3. В строке Title появившегося окна введите finAnyForm, а в строке 
Description — Top-level generic form class. 
    4. Из списка Page выберите пункт Forms и щелкните на кнопке ОК, чтобы 
закрыть окно Add To Repository. На рис. 9.7 показано диалоговое окно Add To 
Repository с введенными указанными выше значениями. 

    Database Form 

    Создав класс базовой формы, перейдем к классу DatabaseForm. Для того чтобы 
создать соответствующую форму, выполните следующие операции. 
    1. Выберите из меню команду File=>New, а затем в открывшемся диалоговом 
окне New Items — вкладку Forms. 
    2. На вкладке Forms щелкните на пиктограмме fmAnyForm, а в нижней части 
окна выберите переключатель Inherit. 

    192 Часть II. Учебный курс 


    Рис. 9.7. Добавление класса формы AnyForm в хранилище объектов 

    3. Щелкните на кнопке ОК, чтобы закрыть окно и создать новую форму. В окне 
конструктора форм Delphi должна появится новая форма, озаглавленная 
fmAnyForm1. Как вы убедитесь, она унаследовала все визуальные атрибуты класса fmAnyForm. 
    4. Присвойте свойству Name значение fmDatabaseForm. 
    5. Щелкните на панели paBottom и поместите на нее компонент DBNavigator, 
разместив его ближе к левой стороне панели. 
    6. Снова выберите панель paBottom и поместите на нее четвертый компонент 
Panel, разместив его ближе к правой стороне панели. 
    7. Установите свойство Name новой панели равным значению paRight, свойство 
Align — alRight, a свойство BevelOuter — bvNone. 
    8. Удалите заголовок панели paRight и перетащите ее левую границу вплотную 
к правой границе компонента DBNavigator. 
    9. Поместите на панели paRight два компонента BitBtn. Левую кнопку 
разместите как можно ближе к левой границе панели paRight, а правую — как 
можно ближе к левой кнопке. 
    10. Уменьшите ширину панели paRight настолько, сколько необходимо для 
размещения обеих кнопок. 
    11. Установите свойство Kind левой кнопки BitBtn равным значению bkOK, а 
правой — bkCancel. 
    12. Измените свойства Name кнопок, присвоив этому свойству кнопки ОК 
значение bbОК, а кнопки Cancel — bbCancel. 
    13. Щелкните дважды на компоненте ЬЬОК и добавьте следующие операторы в 
исходный текст обработчика события OnClick. 

    if (DBNavigator1.DataSource.State in [dsEdit, dsInsert]) then 
          DBNavigatorl.DataSource.DataSet.Post; 
          Close; 

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

    Глава 9. Подготовка 193  
    7 Delphi 3 и системы клиент/сервер 

    14. Щелкните дважды на компоненте bbCancel и введите следующий оператор в 
обработчике события 

    OnClick.Close; 

    Это обеспечит закрытие формы при щелчке на кнопке Cancel. Так как в данном 
случае никаких операций по сохранению внесенных изменений не выполняется, они 
будут возложены на обработчик события OnClose самой формы. 
    15. Выберите в окне Object Inspector объект fmDatabaseForm, представляющий 
собой форму, и щелкните дважды на значении обработчика события OnClose формы 
(вкладка Events окна Object Inspector). Введите следующий оператор в исходный 
текст обработчика события OnClose формы fmDatabaseForm. 

    if (DBNavigatorl.DataSource.State in [dsEdit, dslnsert]) then 
       DBNavigatorl.DataSource.DataSet.Cancel; 

    Выполнение этого оператора обеспечит отмену всех внесенных изменений при 
любом закрытии формы, кроме закрытия по щелчку на кнопке ОК. Другими словами, 
если пользователь щелкнет на кнопке Cancel или на кнопке закрытия окна формы 
либо просто завершит сеанс работы с приложением, то все внесенные изменения не 
будут сохранены. 
    Создание класса DatabaseForm завершено. Выберите команду File=>Save и 
сохраните модуль формы в файле DBFORM.PAS, расположив его в каталоге системы 
RENTMAN. На рис. 9.8 показан вид завершенной формы. 

    Рис. 9.8. Завершенная форма класса DatabaseForm 

    Четвертая панель, которую вы добавили на форму, нужна для того, чтобы 
зафиксировать расположение кнопок ОК и Cancel формы, независимо от размера 
формы. Так как четвертая панель, благодаря установке соответствующего значения 
свойства Align, привязана к правой границе окна формы, то размер этого окна 
никак не влияет на отображение данной панели и, соответственно, расположенных 
на ней кнопок. 
    Теперь нужно поместить класс формы в хранилище объектов. Щелкните правой 
кнопкой на форме и из появившегося меню выберите команду Add To Repository. В 
качестве имени объекта введите fmDatabaseForm, а в качестве строки описания — 
Generic database form class. Из списка Page выберите пункт Forms и щелкните на 
кнопке ОК. 

    194 Часть II. Учебный курс 


    Edit Form 

    Покончив с классом DatabaseForm, перейдем к созданию класса EditForm. 
Назначение этого класса состоит в определении базовой формы редактирования 
одной таблицы по одной строке. Класс EditForm является потомком только что 
созданного класса DatabaseForm. Для того чтобы создать класс формы EditForm, 
выполните следующие операции. 
    1. Выберите команду File=>New и на вкладке Forms открывшегося диалогового 
окна New Items выберите форму fmDatabaseForm. 
    2. Щелкните на переключателе Inherit, а затем — на кнопке ОК. В окне 
конструктора форм Delphi должна появится форма с именем frnDatabaseForml. 
    3. Измените свойство Name новой формы, указав в качестве его значения имя fmEditForm. 
    4. Увеличьте размер панели раТор таким образом, чтобы панель paMiddle 
стала по высоте примерно равной размеру панели paBottom. Панель раТор 
предназначена для размещения на формах-потомках таких компонентов для работы с 
данными, как DBEdit и DBComboBox. 
    5. Щелкните на панели paMiddle, чтобы выбрать ее, а затем поместите на нее 
три компонента Button. Первый объект-кнопку назовите btAdd, второй — btEdit, 
третий — btDelete. 
    6. Установите свойство Caption кнопки btAdd равным &Add, кнопки btEdit — 
&Edit, а кнопки btDelete — &Delete. Обратите внимание на символ амперсанда, 
который обозначает клавишу, используемую для мнемонического доступа к кнопке. 
    7. Щелкните дважды на кнопке btAdd и в исходном тексте ее обработчика 
события OnClick введите следующий оператор. 

    DBNavigator1.BtnClick(nblnsert); 

    8. Щелкните дважды на кнопке btEdit и в исходном тексте ее обработчика 
события OnClick введите следующий оператор. 

    DBNavigator1.BtnClick(nbEdit) ; 

    9. Дважды щелкните на кнопке btDelete и введите в исходный текст ее 
обработчика события OnClick следующий оператор: 

    DBNavigator1.BtnClick(nbDelete); 

    Такая настройка обеспечивает выполнение этими кнопками действий, 
аналогичных действиям соответствующих кнопок навигатора базы данных. Даже если 
вы потом в формах, наследующих класс fmEditForm, добавите к этому обработчику 
события другие действия, кнопки по-прежнему будут выполнять операции навигатора. 
    Разработка класса EditForm завершена. Выберите команду File=>Save и 
сохраните модуль формы в файле EDITFORM.PAS, разместив его в каталоге системы 
RENTMAN. На рис. 9.9 показан вид завершенной формы. 
    Поместите класс формы в хранилище объектов, указав в качестве имени 
объекта fmEditForm, а в качестве строки описания — Generic database edit form 
class. Разместите объект на вкладке Forms. 

    GridForm 

    Следующий класс, который нам нужно создать — это класс GridForm. Он 
является потомком класса EditForm и позволяет отображать несколько строк 
таблицы одновременно, причем каждая строка таблицы занимает одну строку 
экрана. Для того чтобы создать форму fmGridForm, выполните следующие операции. 
    1. Выберите команду File=>New и на вкладке Forms появившегося диалогового 
окна New Items выберите элемент fmEditForm. 
    2. Щелкните на переключателе Inherit, а затем — на кнопке ОК. В окне 
конструктора форм Delphi должна появиться форма fmEditForml. 
    3. Измените значение свойства Name, указав имя fmGridForm. 
    4. Выберите панель раТор, а затем поместите на нее компонент DBGrid 
(находится на вкладке Data Controls палитры инструментов Delphi). 
    5. Установите свойство Align компонента DBGrid равным значению alClient, 
чтобы сетка данных заполнила все пространство панели. 

    Глава 9. Подготовка 195 


    Рис. 9.9. Завершенная форма класса Edit Form 

    6. В списке окна Object Inspector выберите саму форму fmGridForm и дважды 
щелкните на событии OnShow вкладки Events. Наберите в исходном тексте 
обработчика события OnShow формы fmGridForm следующий оператор: 

    if (DBGridl.DataSource = nil) then 
       DBGrid1.DataSource := DBNavigatorl.DataSource; 

    При выполнении этого оператора компонент сетки данных DBGrid, который вы 
только что поместили на форму, в качестве источника данных получит ссылку на 
источник данных, используемый навигатором базы данных. Таким образом, в 
порожденных формах вам будет достаточно присвоить значение лишь свойству 
DataSource компонента DBNavigator. 
    На этом создание формы fmGridForm закончено (рис. 9.10). Сохраните эту 
форму в файле GRIDFORM.PAS каталога системы RENTMAN. 
    Поместите класс формы в хранилище объектов, указав в качестве имени 
объекта fmGridForm, а в качестве строки описания — Generic database grid form 
class. Разместите объект на вкладке Forms. 

    ControlGridForm 

    Следующий класс форм — класс ControlGridForm. Этот класс также является 
потомком класса EditForm. Форма fmControlGridForm обладает более широкими 
возможностями отображения нескольких строк одной таблицы, чем форма 
fmGridForm. В частности, она позволяет выводить одну строку таблицы в 
нескольких строках экрана. Для этого в форме класса ControlGridForm 
используется компонент DBCtrlGrid, а не DBGrid, как в формах класса GridForm. 
Для того чтобы создать класс форм ContrMGridForm, выполните следующие операции. 
    1. Выберите команду File=>New и щелкните на пиктограмме fmEditForm, 
расположенной на вкладке Forms диалогового окна New Items. Выберите 
переключатель Inherit и щелкните на кнопке ОК. В окне конструктора форм должна 
появится форма с именем fmEditForml. Измените значение свойства Name формы на 
fmControlGridForm. 
    2. Выберите панель раТор, а затем поместите на нее компонент DBCtrlGrid 
(находится на вкладке Data Controls палитры инструментов Delphi). 

    196 Часть II. Учебный курс 


    Рис. 9.10. Завершенная форма класса GridForm 

    3. Установите свойство Align компонента DBCtrlGrid равным значению 
alClient, чтобы управляющая сетка данных заполнила все пространство панели. 
    4. В списке окна Object Inspector выберите саму форму fmControlGridForm и 
дважды щелкните на событии OnShow вкладки Events. Наберите следующий оператор 
в исходном тексте обработчика события OnShow формы fmControlGridForm: 

    if (DBCtrlGridI.DataSource = nil) then 
       DBCtrlGridl.DataSource := DBNavigatorl.DataSource; 

    При выполнении этого оператора компонент управляющей сетки данных 
DBCtrlGrid, который вы только что поместили на форму, в качестве источника 
данных получит ссылку на источник данных, используемый навигатором базы 
данных. Таким образом, в порожденных формах вам будет достаточно присвоить 
значение лишь свойству DataSource компонента DBNavigator. 
    На этом создание формы fmControlGridForm закончено (рис. 9.11). Сохраните 
эту форму в файле CGRDFORM.РАS каталога системы RENTMAN. 
    Поместите класс формы в хранилище объектов, указав в качестве имени 
объекта fmControlGridForm, а в качестве строки описания — Generic database 
control grid form class. Разместите объект на вкладке Forms. 

    Master Detail Form 

    Следующий и последний в иерархии классов форм — класс MasterDetailForm. Он 
является потомком класса DatabaseForm и позволяет отображать и редактировать 
две взаимосвязанные таблицы, одна из которых — главная, а другая — 
подчиненная. Формы класса MasterDetailForm отличаются от форм класса 
DatabaseForm тем, что у первых на средней панели paMiddle находится компонент 
DBGrid. Сетка данных, представленная этим компонентом, используется для 
отображения строк подчиненной таблицы. На верхней панели раТор формы класса 
MasterDetailForm отображается текущая строка главной таблицы. Для создания 
класса форм MasterDetailForm проделайте следующие операции. 
    1. Выберите команду File=>New и щелкните на пиктограмме frnDatabaseForm, 
расположенной на вкладке Forms диалогового окна New Items. Выберите 
переключатель Inherit и щелкните на кнопке ОК. В окне конструктора форм должна 
появится форма с именем fmDatabaseForml. 

    Глава 9. Подготовка 197 


    Рис. 9.1]. Завершенная форма класса ControlGridForm 

    1. Измените значение свойства Name формы на fmMasterDetailForm. 
    3. Измените размеры компонента раТор таким образом, чтобы он занимал 
примерно в два раза больше Пространства, чем компонент paMiddle. 
    4. Щелкните на компоненте paMiddle и поместите на него компонент DBGrid 
(находится на вкладке Data Controls палитры компонентов). 
    5. Установите свойство Align компонента DBGrid равным значению alciient, 
чтобы он занял все пространство панели paMiddle. 
    На этом создание формы fmMasterDetailForm закончено (рис. 9.12). Сохраните 
эту форму в файле MSTRFORM.PAS каталога системы RENTMAN. 
    Поместите класс формы в хранилище объектов, указав в качестве имени 
объекта fmMasterDetailForm, а в качестве строки описания — Generic database 
master-detail form class. Разместите объект на вкладке Forms. 

    Остальные формы 

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

    Совет 
    Созданные выше модуль данных и иерархию форм можно сохранить в отдельном 
проекте Delphi, чтобы впоследствии загружать их вместе как единое целое. 
Особенно удобна такая возможность с точки зрения того, что помещенные в 
хранилище формы можно открывать в окне конструктора форм без добавления в 
проект форм-предков. 
    Для того чтобы сохранить созданные формы в отдельном проекте, сохраните 
текущий проект под каким-нибудь понятным именем, например FORMREPO (от form 
repository). Я рекомендую разместить файл этого проекта в том же каталоге, где 
находятся файлы модулей форм. Для того чтобы не включать в проектхранилище 
создаваемый по умолчанию модуль Unit1, можно перед сохранением файла проекта 
на диске удалить этот модуль из проекта. 


    198 Часть II. Учебный курс 


    Рис. 9.12. Завершенная форма класса MasterDetallForm 


    Главная форма 

    Следующим шагом в создании приложения RENTMAN является разработка главной 
формы приложения. Так как мы договорились, что все формы приложения RENTMAN, в 
том числе и главная форма, будут наследниками класса fmAnyForm, вам не 
понадобиться создаваемый по умолчанию модуль Unitl. Поэтому закройте его и 
удалите из проекта RENTMAN. 
    Прежде чем приступать к созданию главной формы, сохраните текущий проект в 
файле RENTMAN.DPR. Проделав это, выполните следующие операции, в результате 
которых будет получена главная форма fmRSYSMANO. 
    1. Выберите команду File=>New и щелкните на пиктограмме fmAnyForm, 
расположенной на вкладке Forms диалогового окна New Items. Выберите 
переключатель Inherit и щелкните на кнопке ОК. В окне конструктора форм должна 
появится форма с именем fmAnyForml. 
    2. Измените значение свойства Name формы на fmRSYSMAN0, а свойства Caption 
— на RENTMAN Rental Management System. 
    3. Выберите команду Project=>Options и, открыв вкладку Forms диалогового 
окна Project Options, в качестве главной формы приложения RENTMAN укажите 
форму fmRSYSMANO. Для закрытия диалогового окна Project Options щелкните на 
кнопке ОК. 
    4. Установите свойство WindowState главной формы равным значению 
wsMaximized, а свойство Position — значению poDesigned. Установка данных 
значений приведет к тому, что после запуска приложения RENTMAN главная форма 
будет занимать весь экран. 
    5. Уменьшите высоту панелей раТор и paBottom так, чтобы она равнялась 30 
пикселям. Верхняя панель будет преобразована в панель инструментов, а нижняя — 
в строку состояния приложения RENTMAN. 
    6. Поместите на форму компонент MainMenu и установите его свойство Name 
равным mmRentMan. Данный компонент будет представлять собой главное меню 
приложения. Дважды щелкните на компоненте MainMenu, чтобы перейти в режим 
использования конструктора меню Delphi. 
    Для создания главного меню системы RENTMAN выполните следующие операции. 


    Глава 9. Подготовка 199 

    1. Добавьте в главное меню пункт File, изменив значение свойства Caption 
имеющегося элемента меню на &File. Амперсанд означает, что клавиша <F> будет 
использоваться для мнемонического доступа к данному пункту главного меню. 
    2. В подменю File создайте новый элемент меню с заголовком (свойство 
Caption) &Log a Call и клавиатурным эквивалентом команды (свойство shortcut) 
<F2>. В табл. 9.4 содержится описание подменю File. 

    Таблица 9.4. Пункты подменю File системы RENTMAN 

    Caption		ShortCut 

    &Log a Call	F2 
    &Print Setup	None 
    E&xit		None 

    3. В главное меню добавьте подменю Tables (свойству Caption присвойте 
значение &Tables) и создайте его пункты в соответствии с табл. 9.5. 

    Таблица 9.5. Пункты подменю Tables системы RENTMAN 

    Caption 	Shortcut 

    &Calls 		F3 
    &Property 	F4 
    &Tenants 	F5 
    &Leases 	F6 
    &Work Orders 	F7 
    &Employees 	F8 
    W&ork Types 	F9 

    4. В главное меню добавьте подменю Reports (свойству Caption присвойте 
значение &Reports) и создайте его пункты в соответствии с табл. 9.6. 

    Таблица 9.6. Пункты подменю Reports системы RENTMAN 

    Caption 	ShortCut 

    &Work Order 	None 
    &Lease 		None 
    &Task List 	None 

    5. В главное меню добавьте подменю Help (свойству Caption присвойте 
значение &Неlр). 
    6. В подменю Help добавьте пункт Contents (свойству Caption присвойте 
значение &Contents). 
    7. В конце подменю Help добавьте пункт About (свойству Caption присвойте 
значение &About). 
    
    На рис. 9.13 показано завершенное меню приложения. Закончив создание меню, 
закройте окно конструктора меню Delphi. 
    
    200 Часть II. Учебный курс 


    Рис. 9.13. Завершенное главное меню системы RENTMAN 


    Кнопки панели инструментов 

    Теперь перейдем к созданию и настройке кнопок панели инструментов, с 
помощью которых пользователи смогут выполнять главные функции приложения. Для 
этого выполните следующие операции. 
    1. Щелкните на панели раТор, а затем поместите на ней шесть компонентов 
SpeedButton. 
    2. Выделите сразу все компоненты SpeedButton и щелкните на них правой 
кнопкой мыши. 
    3. Из появившегося меню выберите пункт Align. Появится окно установки типа 
выравнивания. Выберите переключатели Space equally группы Horizontal и Tops 
группы Vertical, а затем щелкните на кнопке ОК. 
    4. В качестве значений свойств Name компонентов SpeedButton укажите (слева 
направо) sbLogCall, sbProperty, sbTenants, sbLeases, sbWorkOrders и sbPrintSetup. 
    5. Пиктограммы кнопок панели инструментов, определяемые значением свойства 
Glyph, могут быть любыми. Если вы не испытываете большого желания 
попрактиковаться в дизайне пиктограмм, можете воспользоваться набором 
стандартных пиктограмм из комплекта поставки Delphi. Эти пиктограммы находятся 
в подкаталоге системы Delphi\IMAGES\BUTTONS. В табл. 9-7 показано, какие 
пиктограммы выбрал я, создавая систему RENTMAN. 

    Таблица 9.7. Файлы пиктограмм, используемые кнопками панели инструментов 

    Кнопка		Файл 

    sbLogCall 	Phonerng.bmp 
    sbProperty 	Doorshut.bmp 
    sbTenants 	Picture.bmp 
    sbLeases 	Report.bmp 
    sbWorkOrders 	Tools.bmp 
    sbPrintSetup 	Printer.bmp 


    Глава 9. Подготовка 201 

    Для того чтобы справа от созданных кнопок панели инструментов поместить 
кнопку вызова справочной системы, выполните следующие операции. 
    1. Щелкните на панели раТор и поместите на нее компонент Panel, разместив 
его в правой части панели раТор. 
    2. Удалите заголовок новой панели и установите значение свойства 
BevelOuter равным bvNone. 
    3. Присвойте свойству Align новой панели значение alRight, а свойству Name 
— значение paRight. 
    4. Установите размер панели paRight таким образом, чтобы она была немного 
больше устанавливаемого по умолчанию размера компонента SpeedButton. 
    5. Поместите компонент SpeedButton на компонент paRight. 
    6. Присвойте свойству Name новой кнопки панели инструментов значение 
sbHelp, а в качестве файла пиктограммы используйте файл Help.bmp (он также 
находится в подкаталоге \IMAGES\BUTTONS основного каталога системы Delphi). 
Так как панель paRight привязана к правому краю формы, то кнопка справки 
всегда будет находится и том же месте, независимо от размера формы. На 
рис.9.14 показана главная форма со всеми кнопками панели инструментов. 

    Рис. 9.14. Панель инструментов системы RENTMAN 


    На заметку 
    Для создания панели инструментов можно также воспользоваться такими 
компонентами Delphi, как CoolBar и ToolBar (находятся на вкладке Win32 палитры 
компонентов). Для работы этих компонентов нужна обновленная версия файла 
CTL3D32.DLL, поэтому они могут не работать на тех компьютерах, где этого файла 
нет. Кроме того, при использовании этих компонентов нельзя назначать файлы 
пиктограмм, перечисленные в табл. 9.7, так как данные компоненты используют 
пиктограммы, подготовленные специальным образом. Поэтому я выбрал подход, 
который будет работать независимо от версии Win32 и для которого можно 
использовать пиктограммы, поставляемые вместе с Delphi. 


    202 Часть II. Учебный курс 


    Строка состояния 

    Единственный элемент главной формы системы RENTMAN, который нам осталось 
реализовать после создания панели инструментов, — строка состояния. Для ее 
создания необходимо выполнить следующие операции. 
    1. Выберите панель paBottom и поместите на нее компонент StatusBar 
(находится на вкладке Win32 палитры инструментов). 
    2. Укажите в качестве значения свойства Name компонента StatusBar имя 
stRENTMAN, а в качестве значения свойства Align — аlClient. 
    3. Щелкните дважды на значении свойства Panels компонента StatusBar и 
добавьте в список три подпанели. 
    4. Присвойте качестве значения свойства Text первой подпанели компонента 
StatusBar строку Status, второй подпанели — User, а третьей — Version. 
    5. Установите значение свойства width подпанели Status равным 275, а 
подпанелей User и Version — 150, а затем щелкните на кнопке ОК. 
    На рис. 9.15 показан вид завершенной формы fmRSYSMANO. 

    Рис. 9.15. Завершенная главная форма приложения RENTMAN 


    Тестирование главной формы 

    Ну что ж, давайте запустим приложение, чтобы увидеть, как будет выглядеть 
главная форма во время его работы. До этого нужно обязательно сохранить 
проект, чтобы в случае "зависания" приложения не потерять результаты 
проделанной работы. Для сохранения проекта и всех связанных с ним файлом можно 
воспользоваться либо кнопкой Save all панели инструментов Delphi, либо 
командой File=>Save All. Сохраните файл модуля главной формы под именем 
RSYSMANO.PAS. 
    Сохранив проект, щелкните на кнопке Run или нажмите <F9> для того, чтобы 
запустить приложение на выполнение и проверить внешний вид и работу главной 
формы. Когда вам будет предложено ввести имя пользователя и пароль, укажите 
соответствующие значения, которые вы использовали при создании базы данных 
RENTMAN (по умолчанию имя пользователя — SYSDBA, а пароль — masterkey). На 
рис. 9.16 показан вид формы fmRSYSMANO во время работы приложения. 

    Глава 9. Подготовка 203 


    На заметку 
    Вам может понадобиться вручную добавить модуль DB в оператор uses модуля, в 
котором используется обращение к свойству State. Данное свойство перечислимого 
типа предназначено для хранения значений вида dsInsert, dsEdit и т.п. Я не 
раз сталкивался с тем, что Delphi не всегда автоматически добавляет вызов 
этого модуля там, где это нужно. Если вы получите от компилятора системы 
сообщение об ошибке, в котором говорится, что один из перечислимых типов 
свойства State неизвестен, добавьте модуль DB в оператор uses соответствующего 
программного модуля. 

    На заметку 
    Перед запуском приложения убедитесь, что сервер InterBase уже работает. 
Если это не так, то приложение не запустится. 

    Рис. 9.16. Вид главной формы при первом запуске приложения RENTMAN 


    Резюме 

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

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

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

    204 Часть II. Учебный курс 