Министерство образования Российской Федерации Ульяновский государственный технический университет
ПРОЕКТИРОВАНИЕ БАЗ ДА...
144 downloads
1329 Views
750KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования Российской Федерации Ульяновский государственный технический университет
ПРОЕКТИРОВАНИЕ БАЗ ДАННЫХ В СРЕДЕ DELPHI Компьютерный методический материал к лабораторным работам
Составитель Л.С. Блюдина
Ульяновск 2001
УДК 681.3 (076) ББК 73я7 П79
Рецензент декан РТФ УлГТУ, кандидат технических наук, доцент В.Н. Рогов. Одобрено секцией методических пособий научно-методического cовета университета.
Проектирование баз данных в среде Delphi: Компьтерный методический материал к лабораторным работам / Сост. Л.С. Блюдина.Ульяновск: УлГТУ, 2001.-77 c. Cборник содержит методические указания к выполнению шести лабораторных работ по проектированию баз данных. Инструментальной средой для проектирования является современная СУБД Delphi. Методические указания содержат обучающие фрагменты и индивидуальные задания, выполнение которых позволит ускорить усвоение материала. Предназначены для студентов специальностей 522800 и 522300, а также могут использоваться на других специальностях.
УДК 681.39(76) ББК 73я7 © Ульяновский государственный технический университет, 2001
Лабораторная работа № 1 Проектирование базы данных и редактирование данных Проектирование БД При разработке собственной БД первое, с чего необходимо начать - это создание таблицы, в которую впоследствии будет вводиться информация. В дальнейшем данные в таблице могут дополняться новыми данными, редактироваться или исключаться из таблицы. Вы можете просматривать данные в таблицах или упорядочить их по некоторым признакам. Основным назначением программы DBD 7.0 при работе с таблицами является создание и модификация их структуры. Можно также заполнять таблицу данными, но, как правило, для этого используются приложения, созданные в DELPHI. Для того чтобы создать новую таблицу, требуется определить ее структуру. Таблица состоит из полей, в каждом из которых хранится информация. Поле имеет такие атрибуты как порядковый номер, имя, тип, размер и ключ. Рассмотрим подробнее структуру полей. Структура полей 1) Наименования полей: Порядковый номер поля - этот столбец не содержит заголовка и предназначен лишь для определения порядка следования полей в таблице. Значения в нем изменяются автоматически, начиная с единицы, упорядочиваются по возрастанию и их уникальность поддерживается для каждого поля. Field Name - столбец содержит название поля таблицы БД. Туре - тип данного поля. Он определяется символом, соответствующим конкретному типу данных. Size - размер поля в байтах, если тип данных требует задания размера (например, для строк). Key - определяет вхождение данного поля в первичный ключ, который определяет уникальность записи. Значения в таком поле используются для установления взаимосвязи между таблицами при поддержании целостности данных в совокупности таблиц. Правила именования полей для таблиц формата Paradox следующие: • длина имени поля не может быть более 25 символов; • нельзя, чтобы первым символом в имени был пробел, хотя использовать пробелы в имени можно; • каждое имя поля должно быть уникально (строчные и прописные буквы эквивалентны); • нельзя использовать символы: , (запятая), | (вертикальная линия) и ! (восклицательный знак); • нельзя применять ключевые слова, используемые в SQL-запросах, например SELECT и COUNT.
2) Типы данных: Для определения типов полей, т. е. типов данных, которые могут находиться в этих полях, используются следующие символы, определяющие соответствующие типы полей: A (Alpha) - определяет строку с фиксированным количеством символов от 1 до 255; N (Number) - определяет положительное или отрицательное вещественное число из диапазона -10(^307) до 10(^308) с точностью до 15 знаков; в число может входить знак + (плюс) или - (минус), цифры и десятичный знак (точка или запятая); $ (Money) - определяет денежный формат поля, который похож на формат (Number), но при выводе данных ограничивает число десятичных знаков и отображает символ валюты; S (Short) - определяет целое число из диапазона от -32767 до 32767; I (Long Integer) - определяет целое число из диапазона от -2147483648 до 2147483647; # (BCD) - определяет вещественное число с точностью от 0 до 32 знаков после запятой; D (Date) - определяет дату с 1 января 9999 года до н. э. до 31 декабря 9999 года н. э.; T (Time) - определяет время с точностью до миллисекунд, ограниченное 24 часами; @ (Timestamp) - определяет хранение одновременно и даты, и времени; M (Memo) - определяет текст произвольной длины, первые символы которого (от 1 до 240) хранятся в БД; F (Formatted Memo) - определяет текст произвольной длины с оформлением, первые символы которого (от 0 до 240) хранятся в таблице БД; G (Graphic) - определяет хранение графического изображения в формате BMP; O (OLE) - определяет хранение OLE - объекта; L (Logical) - определяет значение логического типа, по умолчанию можно использовать значения True и False; + (Autoincrement) - определяет поле счетчика (аналогично Long Integer, но только для чтения), значение которого автоматически увеличивается на единицу при переходе к новой записи; B (Binary) - определяет поле произвольной длины, в котором информация хранится в двоичном виде; DBD 7.0 этот формат не отображает; Y (Bytes) - определяет поле произвольной длины, в котором информация хранится в виде байтов; DBD 7.0 этот формат не отображает. 3) Модификация структуры таблицы: Для добавления нового поля в структуру таблицы следует, находясь в последнем столбце последней строки таблицы, нажать клавиши Enter либо Tab. После этого в таблице полей БД добавится внизу новая строка. Тип у
всех полей должен быть обязательно определен перед сохранением таблицы БД. Если требуется вставить новое поле между существующими, нужно перейти на строку, содержащую описание поля, перед которым будет вставлено новое. Затем нажать клавишу Insert. При удалении поля из структуры следует нажать клавиши Ctrl-Del. При этом надо соблюдать осторожность, т. к. данные из удаляемого поля будут потеряны. При вводе таблицы не обязательно поддерживаться нужного порядка следования полей - его можно менять. Для этого, находясь в поле порядкового номера строки с описанием поля, следует нажать левую клавишу мыши, затем, не отпуская клавишу, переместить курсор мыши на нужное место в порядке следования полей и отпустить клавишу. 4) Определение характеристик таблицы: В правой части окна находятся описания характеристик таблицы. Переход от описания полей к части описания характеристик таблицы осуществляется нажатием клавиши F4 или с помощью мыши. Обратный переход осуществляется с помощью мыши или клавиш Shift+Tab. Характеристики таблиц приведены в выпадающем списке, находящемся в правой верхней части окна. Validity Checks (Проверка ввода значений) С помощью этой характеристики определяются возможные значения в выбранном в данный момент поле. Контроль при вводе значений в таблицу осуществляется автоматически. Следует иметь в виду, что изменение допустимых значений может привести к потере уже имеющейся информации при сохранении таблицы. Здесь можно задать следующие значения: 1. Required Field (Обязательное поле). Данный выключатель определяет, обязательно ли нужно вводить значение в поле. Этот выключатель необходимо включать для ключевого поля. 2. Minimum Value (Минимальное значение). Величина, находящаяся в этой строке ввода, определяет минимально допустимое значение в выбранном поле таблицы. 3. Maximum Value (Максимальное значение). Величина, находящаяся в этой строке ввода, определяет максимально допустимое значение в выбранном поле таблицы. 4. Default Value (Значение по умолчанию). Определенное в этой строке ввода значение устанавливается в поле при создании новой записи в таблице. 5. Picture (Шаблон). В данной строке ввода определяется, какие символы могут быть введены в текущее поле. Это условие описывается в виде строки, состоящей из некоторого множества символов. Для удобства ввода и проверки шаблона можно воспользоваться диалоговым окном, которое вызывается при нажатии кнопки Assist (Помощник). Table Lookup (Таблица - справочник)
Данная характеристика позволяет определить множество значений, которые могут быть введены в поле таблицы БД из определенной здесь таблицы справочника. Secondary Indexes (Вторичные индексы) Вторичные индексы используются для связывания таблиц (например в запросах), для ускорения выполнения запросов и определения порядка сортировки значений в таблице. Данная характеристика относится ко всей таблице целиком, поэтому при определении индекса не имеет значения, какое поле в структуре в данный момент выбрано. Вторичных индексов у таблицы может быть несколько. Во вторичный индекс может входить любое количество полей. Одно и то же поле может входить в разные индексы. Следует помнить, что ключ всегда индексируется (этот индекс называется первичным), поэтому для него не требуется дополнительно определять индекс. Referential Integrity (Ссылочная целостность) Ссылочная целостность обеспечивает однозначное соответствие значений в поле одной таблицы значениям связанного поля в другой таблице. Помимо обеспечения равенства значений в связанных полях при вводе ссылочная целостность обеспечивает сохранение этого условия при внесении изменений в связанные поля основной таблицы, отображая их в подчиненной. Ссылочная целостность для формируемой таблицы может устанавливаться с несколькими таблицами, однако данная взаимосвязь может быть определена только для полей основной таблицы, входящих в первичный ключ. Вхождение в первичный ключ полей основной таблицы объясняется необходимостью поддерживать одинаковые значения в полях, которые могут использоваться для объединения таблиц в запросах, а значения первичного ключа однозначно определяют записи в одной из таблиц. Password Security (Защита паролем) Это свойство позволяет определить пароль, который требуется ввести при попытке получить информацию из формируемой таблицы БД. Паролей для таблицы может быть несколько, они могут определять различную информацию, входящую в таблицу, и свойства ее обработки. Table Language (Язык таблицы) Данное свойство позволяет переопределить драйвер языка, который задает порядок сортировки всех значений в таблице и использование определенного набора символов. Этот драйвер определяется в программе настройки конфигурации BDE. Dependent Table (Зависимые таблицы) После выбора этой характеристики появляется список всех таблиц, для которых редактируемая таблица является основной. Эта связь задается при определении характеристики Referential Integraty (Ссылочная целостность). Корректировка таблиц в DBD 7.0 Корректировку с помощью отображенной таблицы выполнять нельзя. Необходимо выполнить команду главного меню Table|Restructure, с помощью
которой уже можно корректировать структуру таблицы. Выполняется это так же, как и при создании новой таблицы. Индексирование Чтобы обеспечить быстрый поиск требуемых записей в БД, они должны быть определенным способом упорядочены. Сам процесс упорядочения для большой БД достаточно трудоемкий и длительный. Поэтому для быстрого поиска в БД используются различные приемы. Одним из них является индексация - создание специального поискового файла, содержащего для каждой записи БД какое-либо отдельное поле (поля), называемое индексом, и ссылку на местоположение этой записи в БД. Компоненты такого файла упорядочиваются в соответствии с индексом. Такой файл называется индексным файлом. Поиск осуществляется в этом файле по индексу, а после нахождения нужного индекса, используя полученную ссылку, осуществляется прямой доступ к соответствующей записи в БД. Индекс, построенный на основе ключа, называется первичным индексом, и соответствующий ему индексный файл создается автоматически. Но в этом случае имеется ряд ограничений: во-первых, ключевые поля обязательно должны стоять в начале записи, что ограничивает возможность выбора; во-вторых, у двух любых записей БД ключи должны быть различны. Если такие ограничения первичного индекса нас не устраивают, можно выбрать индекс (индексы) на основе других полей записи БД. Такой индекс называется вторичным, а вторичный индексный файл имеет точно такую же структуру, которую имеет первичный. Создание вторичного индекса (а часто и нескольких индексов) может потребоваться и в случае, когда поиск в БД осуществляется по разным критериям. Создание индекса обеспечивают программные средства, предназначенные для создания таблиц БД. Помимо ускорения поиска данных в БД, индекс может потребоваться для связывания таблиц (например в запросах), определения порядка сортировки значений в таблице. Пример 1. Создание базы данных «Телефонная книжка» и ее индексирование Рассмотрим задачу создания БД на примере простой электронной телефонной книжки. Для каждого человека записывается его фамилия, имя, отчество, дата рождения, пол, домашний и рабочий телефоны. Для хранения информации о человеке будем использовать таблицу с именем People. Описание структуры таблицы БД People Ключ Имя поля Тип Размер, Дополнительно Описание байт # IDPeople Счетчик Обязательное, Идентификатор ключевое записи Family Строка 30 Обязательное Фамилия
Name Строка SecName Строка Birthday Дата Sex Логическо е Notes Memo
15 15 Обязательное 100
Имя Отчество День рождения Пол Комментарий
В этой таблице было искусственно добавлено поле IDPeople, которое является ключом. Если бы один человек имел один телефон, можно было бы обойтись одной таблицей People, добавив к ее полям поле Tel. Но человек может иметь несколько телефонов, причем как домашних, так и рабочих. Если использовать одну таблицу, информация о человеке должна повторяться столько же раз, сколько у него номеров телефонов. Это вносит весьма большую избыточность, а кроме того, может повлечь за собой много ошибок при вводе однообразной информации. Поэтому для хранения информации о телефоне используется отдельная таблица с именем Tel, которая связана с таблицей People. Описание структуры таблицы БД Tel Ключ Имя поля Тип Размер, Дополнительн Описание байт о # IDTel Счетчи Ключевое Идентификатор записи к IDPeople Число 4 Обязательно Идентификатор человека индексированн ое Number Строка 9 Обязательно Номер телефона TypeTel Строка 4 Тип телефона IDPeople - поле, которое используется для установления взаимосвязи с полем типа счетчика в другой таблице, должно иметь тип длинного целого и быть индексированным. Таким образом, структура БД «Телефонная книжка» состоит из двух связанных таблиц People и Tel. Таблица People является основной, а взаимосвязь устанавливается с помощью полей IDPeople в этих таблицах. Приступим непосредственно к созданию нашей БД: 1. Запустите программу DataBase Desktop 7.0. Задайте команду меню File|New|Table. В результате появится окно Create Table со значением в списке форматов таблицы Paradox 7.0. Так как создавать таблицы будем в формате Paradox 7, нажмите кнопку ОК в этом окне. В результате появится окно Create Paradox 7 Table (Untitled), в котором будет определяться структура таблицы. Вначале создайте таблицу People. 2. Задайте поля таблицы
2.1. Введите в первой записи описания структуры, в столбце Field Name, значение IDPeople и нажмите клавишу Тab для перехода к следующему столбцу. 2.2. Далее в столбце Type нажмите клавишу пробела и выберите из списка значение +(Autoincrement), затем нажмите клавишу Tab для перехода к следующему столбцу. 2.3. В следующем столбце Key нажмите клавишу пробела для указания, что данное поле ключевое (в столбце Key появится звездочка). 2.4. Включите с помощью мыши выключатель Required field (Обязательное поле), а затем выберите мышью поле Key в последней записи и нажмите клавишу Tab для перехода к следующей строке, описывающей новое поле таблицы БД. Остальные поля таблицы задайте аналогичным образом, выбирая при этом соответствующий тип; только для полей Family, Name, SecName и Notes в столбце Size укажите соответствующий размер, а выключатель Required field включите только для полей Family и Sex. Следует отметить, что все оставшиеся поля не будут ключевыми, а следовательно и поле Key для них не будет активным. Для поля Birthday установите параметр Picture (Шаблон) следующим образом. Для удобства ввода и проверки шаблона воспользуемся окном, которое вызывается при нажатии кнопки Assist (Помощник). Здесь в строке Picture (Шаблон) вводится текст шаблона, правильность которого можно проверить кнопкой Verify Sintax (Проверка синтаксиса), а в строку Sample Value (Пример значения) вводится значение для проверки соответствия введенному шаблону. Тест осуществляется кнопкой Test Value (Проверка значения), после нажатия которой можно увидеть результат проверки в виде сообщения в рамке сообщений. Выберите шаблон #[#]:#[#]:#[#] {AM,PM};, #[#]/#[#]/#[#] - время, дата - из выпадающего списка Sample Picture (Примеры шаблонов) и нажмите кнопку Use. Теперь в строке ввода Picture в появившемся шаблоне удалите все, кроме #[#]/#[#]/#[#], т. к. нам нужна только дата. Нажмите кнопку ОК. 3. Сохраните таблицу под именем People.db на диске при помощи кнопки Save As, далее вам нужно будет активизировать выключатель Display Table (Показать таблицу) из группы Options для того, чтобы после сохранения новая таблица была отображена на экране для работы с данными в ней. 4. Открытая таблица позволяет лишь просматривать данные. Выберите команду меню Table|Edit Data или нажмите клавишу F9. Теперь введите несколько записей и запишите таблицу. Перемещаться по полям можно с помощью мыши, клавиш стрелок и клавиши Tab. 5. Создайте теперь таблицу Tel. Для этого выполните действия аналогичные действиям, которые выполнялись при создании таблицы People, вводя соответствующие таблице Tel поля, за одним лишь исключением - здесь необходимо создать вторичный индекс по полю IDPeople, который создается следующим образом: 5.1. Выберите в выпадающем списке Table Properties свойство Secondary Indexes.
5.2. Нажмите появившуюся кнопку Define. 5.3. В окне Define Secondary Index в списке Field выберите значение IDPeople, затем нажмите кнопку со стрелкой вправо рядом со списком, после чего нажмите кнопку ОК. 5.4. В появившемся окне Save Index As введите в строку ввода IDPeopleIndex и нажмите кнопку ОК. 6. Сохраните таблицу под именем Tel.db. 7. Установите взаимосвязь между таблицами. 7.1. Задайте в качестве рабочей папки ту папку, в которой вы сохраняли создаваемые таблицы БД «Телефонная книжка». Для этого выполните команду главного меню File|Working Directory и в появившемся диалоговом окне выберите требуемую папку. 7.2. Откройте таблицу Tel.db. 7.4. Задайте команду Table|Restructure, в результате появится окно, аналогичное окну определения структуры таблицы. 7.5. Выберите в выпадающем списке Table Properties свойство Referential Integrity. 7.6. Нажмите появившуюся кнопку Define. 7.7. В окне «Referential Integrity» из списка Field выберите значение IDPeople[I], затем нажмите кнопку со стрелкой вправо рядом со списком. 7.8. В списке Table выберите значение People, затем нажмите кнопку со стрелкой влево рядом со списком. В центре окна будет схематично изображена взаимосвязь таблиц. Нажмите кнопку ОК в окне «Referential Integrity». 7.10. В окне «Save Referential Integrity As» в строку введите имя соединения PeoplesTel, а затем нажмите кнопку ОК. В результате в списке, находящемся в правой части окна определения структуры таблицы, появится введенное имя. 7.11. В окне определения структуры таблицы нажмите кнопку Save. 8. Введите в таблицу несколько записей, используя команду меню Table|Edit Data. 9. Задайте команду главного меню File|Close для закрытия таблицы Tel.db.
Пример 2. Редактирование содержимого таблиц БД «Телефонная книжка» 1. Откройте файл People.db. 2. Выберите из меню команды Table опцию Edit Data. Теперь данные можно редактировать. 3. Активизируйте любую запись в таблице и откорректируйте или измените ее. 4. Откорректируйте подобным образом несколько записей.
5. Вставьте запись при помощи клавиш Insert или через меню команды Record|Insert. Вставка записи производится после активизированной в данный момент записи. 6. Удалите любую запись. Для этого активизируйте ее и нажмите комбинацию клавиш Ctrl+Del или Record|Delete. Но для того чтобы произошло физическое удаление из файла таблицы БД всех отмеченных на удаление записей, необходимо активизировать выключатель Pack Table (Упаковка таблицы) при сохранении файла с таблицей. Для этого войдите в Table|Restructure, откроется окно «Restructure Paradox 7.0 for Windows Table: People.db». Здесь и активизируйте этот выключатель и нажмите кнопку Save (Сохранить). 7. Потренируйтесь в осуществлении навигации по записям таблицы с помощью кнопок панели быстрого доступа с изображением различных стрелок или с помощью команд меню Record, или же с помощью различных комбинаций клавиш, которые указаны в меню Record. 8. Для таблицы БД Tel.db проделайте то же самое. Обратите внимание на то, что при таком методе введения данных и их редактирования могут очень часто возникать ошибки, вызванные взаимосвязанностью полей двух таблиц. Поэтому чаще всего данные вводятся и редактируются посредством созданной экранной формы. Преимущества этого метода вы узнаете при выполнении второй лабораторной работы. Сортировка Сортировка - это физическое упорядочивание файла. Это отличает сортировку от индексирования БД, которое при неизменности файла позволяет предъявлять записи и перемещаться по нему в желаемом порядке. Необходимость в сортировке может возникнуть, например, если требуется произвести упорядочивание по какому-то полю или нескольким полям. При сортировке всегда создается файл такого же размера, как и исходная таблица, в котором содержатся упорядоченные записи. Пример 3. Сортировка содержимого таблицы People БД “Телефонная книжка” 1. Выберите команду Tools|Utilities|Sort. 2. В открывшемся диалоговом окне «Select Table» (Выбор таблицы) выберите файл, который будете сортировать, в данном случае это - People.db. Нажмите кнопку Open, в результате чего откроется окно «Sort Table:...People.db». 3. В данном окне в группе Sorted Table (Отсортированная таблица) активизирован переключатель New Table (Новая таблица). Сюда введем имя файла, в котором вы сохраните результат сортировки, People-s. 4. Активизируйте выключатель Display sorted table (Отобразить отсортированную таблицу) в этой же группе для того, чтобы после задания условий сортировки увидеть ее результат. А выключатель Sort just selected fields (Сортировка по выделенным полям) оставьте не активизированным, т.
к. сортировать мы будем всю таблицу в целом, т. е. по всем полям, определенным в списке Fields, а не по полям, находящимся в списке Sort Oder. 5. В окне также имеется два списка: левый - Fields - содержит названия всех полей, входящих в таблицу, правый - Sort Oder - названия полей, по которым производится сортировка. Выберите в левом списке полей поле Family и, нажав кнопку со стрелкой вправо рядом со списком, занесите его в правый список. 6. Мы будем сортировать таблицу по полю Family, причем по возрастанию, об этом свидетельствует значок плюса перед именем поля в списке Sort Oder. Но при необходимости вы можете изменить вид сортировки кнопкой Sort Direction (убыванию соответствует значок минуса перед именем поля в списке Sort Oder). Здесь также можно изменять порядок следования полей, по которым сортируется таблица, с помощью кнопок-стрелок Change oder. 7. По окончании выбора порядка сортировки нажмите кнопку ОК. В результате проведенных действий вы должны увидеть, что таблица будет отсортирована по фамилиям, упорядоченным по алфавиту.
Задание к лабораторной работе № 1 1. Спроектируйте базу данных, состоящую из нескольких таблиц таким образом, чтобы в многотабличной системе были таблицы со связью 1:1, 1:N (N:1). Вариант 1. Данные для простой складской системы. База данных должна содержать следующую информацию: уникальный номер поставщика, фамилию, имя, отчество поставщика, название города местонахождения поставщика, а также уникальный номер детали, ее название, цвет, вес и название города хранения деталей этого типа. Вариант 2. Сведения об участниках конкурса бальных танцев. База данных должна содержать следующую информацию: фамилию, имя, отчество участника, город, фамилию тренера, оценки за каждый танец. Вариант 3. Сведения об успеваемости студентов. База данных должна содержать следующую информацию: фамилию, имя, отчество студента, номер группы, в которой обучается студент, название учебной дисциплины, номер задания, коэффициент сложности, оценку данного студента по данной дисциплине за данное задание от 0 до 1 (как доля сделанной работы). Вариант 4. Сведения о месячной зарплате рабочих. База данных должна содержать следующую информацию: фамилию, имя, отчество рабочего, название цеха, в котором он работает, дату поступления на работу. По заработной плате необходимо хранить информацию о ее размере, стаже работника, его разряде и должности.
Вариант 5. Учет изделий, собранных в цехе за неделю. База данных должна содержать следующую информацию: фамилию, имя, отчество сборщика, количество изготовленных изделий за каждый день недели раздельно, название цеха, а также тип изделия и его стоимость. Вариант 6. Учет изделий категорий А, В, С, собранных рабочим цеха за месяц. База данных должна содержать следующую информацию: фамилию, имя, отчество рабочего, название цеха, количество изделий по категориям, количество рабочих в цехе и фамилию начальника цеха. Вариант 7. Сведения об абонентах АТС. База данных должна содержать следующую информацию: фамилию, имя, отчество владельца телефона, год установки телефона, номер телефона, тип установки телефона (спаренный или нет), льготу (процентную скидку при оплате). Вариант 8. Сведения об ассортименте игрушек в магазине. База данных должна содержать следующую информацию: название игрушки, ее цену, количество, возрастную категорию детей, для которых она предназначена, а также название фабрики и города, где изготовлена игрушка. Вариант 9. Результаты сессии на первом курсе кафедры ВТ. База данных должна содержать следующую информацию: индекс группы, фамилию, имя, отчество студента, пол студента, семейное положение и оценки по пяти экзаменам. Вариант 10. Учет рейтинга теннисистов за 5 лет. Каждая запись содержит поля: фамилия, имя, отчество спортсмена, пол, год рождения, фамилия, имя, отчество тренера, названия стран и пять полей с рейтингом. Вариант 11. Сведения о рейсах Аэрофлота. База данных должна содержать следующую информацию: номер рейса, пункт назначения, время вылета, время прибытия, количество свободных мест, тип самолета и его вместимость. Вариант 12. Сведения об ассортименте обуви в магазине. База данных должна содержать следующую информацию: артикул, наименование обуви, количество пар, стоимость одной пары, имеющиеся размеры, название фабрики и срок поставки обуви в магазин. Вариант 13. Сведения о нападающих команд “Спартак” и “Динамо”. База данных должна содержать следующую информацию: фамилию, имя, отчество, название команды, дату приема в команду, число заброшенных шайб, количество голевых передач, штрафное время и количество сыгранных матчей. Вариант 14.
Сведения о выборе дисциплины студентом. База данных должна содержать следующую информацию: фамилию, имя, отчество студента, номер зачетной книжки и сведения о том, живет ли студент в общежитии, индекс группы, а также пять дисциплин (1 – желает изучать, 0 – не желает). Вариант 15. Журнал регистрации расходов в бухгалтерии. База данных должна содержать следующую информацию: номер пункта, дату перечисления, название организации-получателя, ее адрес и сведения о том, является ли организация коммерческой, а также вид затрат перечисления и общую сумму перечисления. Вариант 16. Учет оптовых продаж. База данных должна содержать следующую информацию: наименование товара, цену единицы товара и дату его поступления, номер партии, размер партии, названии фирмы-покупателя, размер проданной партии, цену единицы товара и дату продажи. Вариант 17. Учет лекарств в аптеке. База данных должна содержать следующую информацию: наименование лекарства, стоимость одной единицы, количество единиц, дату изготовления, срок годности, а также название фабрики, где производится данное лекарство, ее адрес. Вариант 18. Сведения о ветеранах спорта. Ассоциация ветеранов спорта проводит Всероссийские соревнования ветеранов. Для организации соревнований составляются списки участников, которые используются для размещения спортсменов в гостиницах. Для каждого спортсмена указывается гостиница, номер комнаты и количество мест в комнате. Для нужд самой ассоциации ветеранов спорта необходимо хранить информацию следующего вида: фамилию, имя, отчество спортсмена, возрастную группа, название города и вид спорта. Вариант 19. Учет рождаемости в роддоме. База данных должна содержать следующую информацию: фамилию, имя, отчество матери, пол ребенка, его вес, рост и дату рождения ребенка, а также ФИО лечащего врача и номер палаты, в которой находится мать ребенка. Вариант 20. Сведения об обучающихся на курсах повышения квалификации. База данных должна содержать следующую информацию: фамилию, имя, отчество слушателя, его пол и адрес, тип организации (коммерческая, государственная и т.д.), наименование организации, должность слушателя и оценки по прослушанным дисциплинам (маркетинг, финансы и кредит) для каждого слушателя. Вариант 21. Сведения о размере стипендии студента. База данных должна содержать следующую информацию: фамилию, имя, отчество студента, группу, адрес, по которому проживает студент, размер стипендии, а также фамилию
преподавателя, читаемую дисциплину, дату экзамена и оценку, полученную студентом. Вариант 22. Учет поступления больных. База данных должна содержать следующую информацию: фамилию, имя, отчество больного, его пол, дату рождения, дата поступления, начальный диагноз, степень тяжести состояния больного, номер палаты, куда был помещен больной, и фамилию, имя, отчество лечащего врача. Вариант 23. Учет призывников. База данных должна содержать следующую информацию: фамилию, имя, отчество призывника, год его рождения, адрес, семейное положение, дату прохождения медкомиссии, заключение о пригодности к службе. Вариант 24. Учет золотых изделий в ювелирном магазине. База данных должна содержать следующую информацию: вид изделия, его вес, пробу, дату поступления и стоимость, а также фамилию, имя, отчество мастера-изготовителя, стаж его работы и разряд (1,2,3). 2. Отредактируете несколько записей в базе данных. 3. Отсортируйте данные в базе данных по какому-либо признаку или полю, записав результаты сортировки. 4. Составьте вторичный индекс из одного, двух или более полей.
Лабораторная работа № 2 Проектирование приложений для работы с БД
Одной из самых существенных возможностей пакета Delphi является разработка приложений для работы с БД. Здесь под приложением мы будем понимать экранную форму, созданную для удобной работы с информацией, хранящейся в таблицах БД. Виды форм БД и их создание Формы БД различаются по способу представления информации. Существуют следующие виды форм: • Список-форма. Она похожа на таблицу, где записи расположены одна под другой. Следует отметить, что для создания такой формы используется компонента DBGrid. Как правило, все поля записи в этой форме размещаются в одну строку. С этой формой очень удобно работать, когда записи короткие. • Бланк-форма. Эта форма похожа на анкету, где все поля одной записи расположены на одном листе. Такая форма используется при отображении больших записей из БД, например анкетной информации о человеке, и позволяет создать очень информативное представление данных за счет дополнительных элементов. • Форма с подформой. Представляет собой форму, в которой отображаются два или более связанных между собой наборов данных. Эта форма используется для вывода данных из связанных таблиц. В главной форме отображаются записи из одной таблицы, а в подчиненной - записи из другой таблицы, связанные с текущей записью в главной форме. Этот вариант представления данных удобен, когда одной записи в первом наборе данных соответствует несколько записей во втором. Создавать форму БД при разработке приложения для работы с БД можно вручную, помещая необходимые компоненты на форму. С другой стороны, можно также воспользоваться помощью эксперта-построителя форм БД, а затем, в случае необходимости изменить расположение отображаемых компонент. Заметим, что эксперт помещает на форму не только отображаемые компоненты, но и компоненты, которые определяют связь с БД. Одной из важных задач при создании приложения для работы с БД является создание качественных форм БД. Простое, понятное расположение компонент не только повышает эффективность работы, но и позволяет минимизировать ошибки ввода.
Пример 1. Создание формы БД с подформой для работы с информацией из БД «Телефонная книжка»
1. Откроем новый проект с помощью команды главного меню File|New Application. Изменим свойство Caption (Заголовок) формы Form1 на «Информация о людях». Фактически этот заголовок формы будет являться названием БД. 2. Сразу же сохраним форму Form1 в файле MyExunitDB.pas, а сам проект в файле MyExampleDB.dpr. Для этого выполним команду главного меню File|Save Project As. При этом также появится окно выбора имени файла, в котором выберем для модуля папку, зададим модулю имя MyExUnitDB, после этого зададим проекту имя MyExampleDB. 3. Поместим на форму Form1 компоненты для связи с таблицей БД, находящейся в файле People.db. 3.1. В палитре компонент откроем страницу DataAccess (Доступ к данным) и перенесем с помощью мыши на форму Form1 компоненту Table (Таблица). Затем выберем свойство TableName и для него зададим значение People.db, устанавливая связь приложения с таблицей БД People.db. Для того чтобы отображаемые компоненты могли выводить на экран данные из этой таблицы, зададим свойству Active компоненты Table1 значение True. 3.2. С этой же страницы палитры компонент с помощью мыши перенесем на форму Form1 компоненту DataSource (Источник данных). Она обеспечивает связь отображаемых компонент с набором данных. Зададим для свойства DataSet компоненты DataSource1 значение Table1. После этого отображаемые компоненты, размещение которых в проекте будет описано ниже, получат доступ к данным из таблицы БД People.db. Расположение компонент в модуле не существенно. 4. Поместим на форму Form1 компоненты для связи с таблицей БД, находящейся в файле Tel.db, для чего выполним операции, аналогичные операциям в предыдущем пункте, только компоненты Table2 и DataSource2 будут связаны с таблицей Tel.db через свойство DatabaseName и DataSet соответственно. 5. Установим взаимосвязь между наборами данных для создания формы с подформой, отображающей данные из двух таблиц БД. Для этого выделим компоненту Table2 на форме Form1. Установим для ее свойства MasterSource значение DataSource1. Активизируем мышью значение свойства MasterFields этой же компоненты. В комбинированной строке ввода Available Index (Используемые индексы) выберем значение IDPeopleIndex, т.к. взаимосвязь таблиц устанавливается с помощью индексированных полей. Затем в левом списке выберем значение IDPeople (поле в подчиненной таблице Tel, в данном примере оно единственное) и в правом списке выберем значение IDPeople (поле в главной таблице People). Нажмем кнопку Add - установленное соединение отображается в нижней части окна. Если установлена ошибочная связь, ее следует выделить в нижнем окне и нажать кнопку Delete, находящуюся справа от окна. Завершается настройка взаимосвязи таблиц нажатием кнопки ОК. В результате свойство IndexName включает название вторичного индекса
- IDPeopleIndex, а MsterFields содержит имя поля в главной таблице, участвующего во взаимосвязи, - IDPeople. 6. Поместим в форму Form1 компоненты, предназначенные для отображения данных из БД. Для этого выполним следующие действия: 6.1. Со страницы Standart палитры компонент поместим в левый верхний угол формы Form1 метку Label (Метка). Изменим с помощью инспектора объектов ее свойство Caption на «Фамилия, имя, отчество». 6.2. Используя страницу DataControls палитры компонент, поместим в форму Form1 3 компоненты DBEdit (Строка ввода значений в БД) под меткой Label1 в один ряд. Для всех компонент зададим свойству DataSource значение DataSource1, а в свойстве DataField для каждой из этих строк ввода выберем соответственно из списка значения Family, Name и SecName. 6.3. Со страницы Standart палитры компонент поместим в форму еще одну метку Label. Разместим ее под компонентой DBEdit1. Изменим ее свойство Caption на «День рождения». 6.4. Правее этой метки со страницы DataControls палитры компонент поместим строку ввода DBEdit. Зададим ее свойству DataSource значение DataSource1, а в свойстве DataField выберем из списка значение Birthday. 6.5. Правее этой строки ввода со страницы DataControls палитры компонент поместим компоненту DBCheckBox (Выключатель значения в БД). Изменим свойство Alignment (Расположение) у компоненты DBCheckBox1 На LeftJustify, а Caption - на «Пол». Затем зададим ее свойству DataSource значение DataSource1, а в свойстве DataField выберем из списка значение Sex. 6.6. Ниже метки Label2 поместим со страницы Standart палитры компонент еще одну метку Label. Изменим ее свойство Caption на «Комментарий». 6.7. Под этой меткой поместим со страницы DataСontrols палитры компонент компоненту DBMemo (Редактор в БД). Увеличим ее по горизонтали на всю величину формы, а вертикальный размер несколько уменьшим. Зададим ее свойству DataSource значение DataSource1, а в свойстве DataField выберем из списка значение Notes. 6.8. В правую верхнюю часть формы Form1 поместим со станицы DataControls компоненту DBNavigator (Навигатор по записям БД). Записью в таблице БД является строка. Зададим свойству DataSource значение DataSopurce1. 7. Поместим в форму Form1 со страницы DataControls компоненту DBGrid (Таблица отображения БД). Поместим ее ниже всех компонент, уже размещенных в форме, и несколько уменьшим по вертикали. Здадим ее свойству DataSource значение DataSource2. Если все указанные выше действия были выполнены верно, в компоненте DBGrid1 сразу будет выведено содержимое таблицы Tel.db.
8. Определим список полей, значения из которых следует отобразить в компоненте DBGrid. Для этого необходимо выполнить следующие действия: 8.1. Активизируем мышью свойство Columns, тем самым вызвав редактор списка полей таблицы Editing DBGrid1.Columns. 8.2. В этом редакторе нажмем кнопку Add. Выделим появившееся название «0-TColumn». С помощью инспектора объектов дадим свойству FieldName значение Number. Для сложного свойства Titel дадим его параметру Caption значение Номер. 8.3. В окне редактора списка поле нажмем кнопку Add. Выделим появившееся название «1-TColumn». С помощью инспектора объектов дадим свойству FieldName значение Type. Активизируем свойство PickList и в появившемся текстовом редакторе введем две строки: дом. раб. После этих операций нажмем кнопку ОК. Таким образом мы задали список, из значений которого можно определять тип телефона. Затем для сложного свойства Titel дадим его параметру Caption значение Тип. Можно заметить, что отображаемые столбцы появляются в компоненте DBGrid1 по мере их определения. 8.4. Чтобы завершить работу с редактором столбцов таблицы, достаточно его закрыть, воспользовавшись стандартной кнопкой на границе окна. 9. Со страницы Standart палитры компонент поместим в форму Form1 метку Label. Разместим ее над компонентой DBGrid1 в левой части. Изменим свойство Caption на Телефоны. 10. Перенесем со страницы DataControls в форму Form1 еще один навигатор DBNavigator. Разместим его над компонентой DBGrid1 в правой части. Зададим свойству DataSource этого навигатора значение DataSource2. 11. Запустим программу с помощью главного меню Run|Run. 12. При вводе информации в форму с подформой имеются определенные особенности. Чтобы отметить их, введем информацию в форму. Для этого выполним следующие действия: 12.1. Нажмем кнопку «Плюс» на панели верхнего навигатора по записям БД. После этого создается новая запись в таблице People, куда внесем информацию о новом человеке. В три строки ввода под меткой «Фамилия, имя, отчество» последовательно введем значения «Хромов», «Олег», «Львович». В строку ввода рядом с меткой «День рождения» введем 14.01.79. Выключатель с надписью «Пол» должен быть включен. Нажмем кнопку «Галочка» на верхней панели навигатора по записям. Созданная запись о человеке сохраняется в таблице People. Сохранить данные о человеке необходимо до начала ввода его телефонов, иначе они не будут соответствовать этому человеку, а в БД окажется столько лишних записей, сколько в этом случае введено телефонов.
Чтобы пользователь не смог поступить иначе, нужно запретить ввод данных в компоненту DBGrid1 и нажатие на кнопки DBNavigator2. Для этого необходимо выполнить следующие действия: 12.1.1. Завершите работу программы. Выберите компонент DBNavigator1 на форме. Перейдите на вкладку Events инспектора объектов. 12.1.2. Дважды щелкните правой кнопкой мыши в строке BeforeAction. В окне MyExUnitDB.pas дополните процедуру Form1.DBNavigator1BeforeAction следующим фрагментом: if ((Button=nbInsert) or (Button=nbEdit)) then begin DBNavigator2.Enabled:=false; DBGrid1.Enabled:=false; end; if Button=nbPost then begin DBNavigator2.Enabled:=true; DBGrid1.Enabled:=true; end; 12.1.3. Сохраните изменения и запустите программу. 12.2. Нажмем кнопку «Плюс» на панели нижнего навигатора по записям. Создается новая запись в таблице Tel. Введем в ячейку «Номер» номер телефона. Выберем в ячейке «Тип», элемент «дом.» из выпадающего списка. 12.3. Нажмем кнопку «Плюс» на панели нижнего навигатора по записям. Кнопку «Галочка» нажимать для сохранения записи необязательно: при вводе последовательно нескольких телефонов и переходе на новую запись данные о телефоне автоматически сохраняются в таблице, и в этой же таблице создается новая запись. Введем информацию еще об одном телефоне. Нажмем кнопку «Галочка» на панели нижнего навигатора по записям. Созданная запись о телефоне сохраняется в таблице Tel. 13. Завершим работу программы нажатием стандартной кнопки закрытия окна на границе формы. 14. Сохраним все изменения проекта с помощью команды File|Save All. Примечания: 1. Если нужно будет удалить какую-либо запись из компоненты DBGrid1, следует выделить соответствующую строку и нажать у нижнего навигатора кнопку «Минус». Для изменения же какой-либо записи компоненты DBGrid1 следует выделить эту запись, нажать кнопку «Стрелка вверх» нижнего навигатора, выполнить соответствующие изменения и нажать кнопку «Галочка». 2. Для удаления записи из таблицы People необходимо предварительно удалить все записи из таблицы Tel, относящиеся к записи, удаляемой из таблицы People. Чтобы не выполнять предварительное удаление записей
«вручную» можно дополнить процедуру Form1.DBNavigator1BeforeAction следующим фрагментом: if Button=nbDelete then begin Table2.First; while not Table2.Eof do begin Table2.Delete; end; end; Как это осуществить, уже описывалось в п. 12.1.
Создание форм с помощью эксперта-построителя форм БД FormWizard FormWizard - эксперт, содержащий диалоговые окна, в которых требуется определить, как и какую информацию из БД следует отобразить в создаваемом окне формы БД. Вызвать данный эксперт можно командой меню DataBase|FormWizard или операцией File|New|Bisuness|DataBase Form Wizard. 1. Определение общего типа формы БД и источника данных Это первое диалоговое окно эксперта. В нем требуется определить тип формы. Для этого нужно выбрать следующие значения: Группа переключателей Form Options (Вид Формы) определяет тип формы и предлагает два варианта: Create simple form (Создать простую форму) - форма, в которой будет отображена информация из одной таблицы; Create master detail form (Создать форму с подформой) - форма, которая может содержать информацию из двух связанных таблиц. Группа переключателей DataSet Options (Выбор источника данных) определяет, какой объект будет являться источником данных для создаваемой формы: Create a form using TTable object (Создать форму на основе компоненты Table) - форма будет создана на основе таблицы БД; Create a form using TQuery object (Создать форму на основе компоненты Query) - форма в качестве источника данных будет использовать запрос на языке SQL. 2. Выбор таблицы с данными Это диалоговое окно, в котором требуется определить таблицу, данные из которой будут отображены в создаваемой форме. 3. Выбор полей таблицы Это новое диалоговое окно, где требуется определить поля таблицы, информация из которых должна быть отображена в форме. Это окно содержит два списка. В левом находятся поля, которые не входят в создаваемую форму, а в правом - выбраны для отображения в
форме. Порядок следования полей можно менять с помощью кнопок с синими стрелками. 4. Выбор способа размещения полей Здесь возможны следующие варианты: Horizontally (Горизонтальное) - поля размещаются слева на право; Vetically (Вертикальное) - поля размещаются сверху вниз; In a grid (Табличное) - данные представляются в виде таблицы (используется DBGrid). Эксперт предложит диалоговое окно в зависимости от выбранного типа формы: • если создается форма с подформой и были определены свойства для основной формы, необходимо произвести действия, описанные в п.2п.4; • если этот пункт был достигнут при определении свойств подформы, необходимо определить поля, связывающие основную форму с подформой (п.6); • если была выбрана простая форма, то необходимо определить характеристики окна БД (п.7). 5. Определение расположения названий полей Здесь возможны следующие варианты: Left (Слева) - слева от полей; Top (Сверху) - над полями. 6. Размещение связанных полей Это окно доступно лишь в случае создания формы с подформой. В верхней части диалогового окна находится выпадающий список Availabel Indexes (Доступные индексы), в котором содержатся все индексы источника данных для подформы. Окно также содержит 3 списка. В левом, Detail Fields (Поля подчиненной формы), находится список полей, которые не связаны, но могут быть связанными в подформе. В правом списке, Master Fields (Поля основной формы), - находится список полей, которые также не связаны, но могут быть связанными в основной форме. Для определения связанных полей нужно выбрать по одному элементу из этих списков, затем нажать кнопку Add (Добавить). После этого в нижнем списке, Joined Fields (Связанные поля), появится строка, содержащая выбранные поля, которые уже являются связанными. Кнопка Clear (Очистить) полностью очищает нижний список. Кнопка Delete (Удалить) позволяет отменить связывание для определенной пары полей. Для того чтобы перейти к следующему диалоговому окну, необходимо определить хотя бы одну пару связанных полей. 7. Характеристики окна формы БД Выключатель Generate a main form (Создать главную форму) указывает на необходимость сделать создаваемое окно формы БД основным в проекте.
Группа Form Generation (Содержание формы) определяет, где должны находиться создаваемые неотображаемые компоненты Tabel (Query) и DataSource. Для этого предлагается выбрать один из следующих вариантов: Form Only (Создание только формы) - будет создано только одно окно формы БД, и в нем будут отображены все объекты. Form and DataModule (Создание формы и окна «DataModule») - будет создаваться окно формы БД с отображаемыми компонентами и дополнительное окно «DataModule» c неотображаемыми объектами. При создании формы БД в нее будет добавлен объект Navigator. Для запуска процедуры создания окна с формой БД и завершения работы с экспертом требуется нажать кнопку Finish (Закончить). После создания формы БД ее можно далее корректировать обычными способами. Пример 2. Попробуйте самостоятельно создать форму БД с подформой для работы с информацией из БД «Телефонная книжка» с помощью возможностей Form Wizard. Сравните два метода создания формы (метод из Примера 1 и метод из Примера 2). Редактор полей (Fields Editor) и поле набора данных (Класс TField) Fields Editor помогает вам связывать заказные объекты с некоторыми или всеми полями таблицы. Связав заказной объект с полем, вы можете управлять тем, как поле отображается, форматами, контролерами допустимости значения и данными ввода. Fields Editor также позволяет добавлять новые поля в таблицы во время выполнения и рассчитывать значения, которые будут появляться в новых полях. Эта последняя процедура называется вычисляемыми полями.
Пример 3. Работа с редактором полей при создании формы БД «Телефонная книжка» 1. Загрузим проект, помещенный в файле MyExUnitDB.dpr, используя команду главного меню File|Open. 2. Будем выводить дополнительно порядковые номера записей (значение поля IDPeople). При этом будем выводить в виде трехзначного числа, независимо от фактического количества цифр, и снабжать выведенную информацию пояснением «Порядковый номер». Для этого выполним следующие действия: 2.1. На форме Form1 активизируем компоненту Table1. В появившийся редактор полей перенесем все поля таблицы, используя команду локального меню редактора Add Fields. В списке полей, появившемся в редакторе, выделим поле IDPeople. В инспекторе объектов появятся характеристики этого поля. В свойство DisplayFormat поместим следующую строку:
‘Порядковый номер: ‘000 2.2. Используя страницу DataControls палитры компонент, поместим в верхний левый угол формы Form1, перед навигатором, компоненту DBEdit. Несколько увеличим компоненту по горизонтали, чтобы в ней полностью разместилась выводимая информация. Используя инспектор объектов, зададим ее свойству DataSource значение DataSource1, а в свойстве DataField выберем из списка значение IDPeople. Если операции выполнены правильно, в строке ввода DBEdit5 должна появиться соответствующая информация. 3. В предыдущих примерах мы выводили поле «Пол» с помощью компоненты DBCheckBox1, что весьма не наглядно. Выведем это значение словами «Мужской» или «Женский». Для этого выполним следующие операции: 3.1. На форме Form1 активизируем компоненту Table1. В списке полей выделим поле Sex. В инспекторе объектов появятся характеристики этого поля. В свойство DisplayValues поместим следующую строку: Мужской;Женский 3.2. Удалим из формы Form1 компоненту DBCheckBox1, выделив ее и нажав клавишу Del. Используя страницу DataControls палитры компонент, поместим на ее место компоненту DBComboBox (Комбинированная строка ввода значений в БД) и слегка уменьшим ее размер по горизонтали. Используя инспектор объектов, зададим ее свойству DataSource значение DataSource1, а в свойстве DataField выберем из списка значение Sex. Если операции выполнены правильно, в строке ввода DBComboBox1 должна появиться соответствующая информация («Мужской» или «Женский»). В инспекторе объектов для компоненты DBComboBox1 активизируем мышью свойство Items и в появившемся редакторе строк введем следующие строки: Мужской Женский Работу с редактором завершим нажатием кнопки ОК. 3.3. Используя страницу Standart, поместим слева от комбинированной строки ввода компоненту Label. Используя инспектор объектов, зададим ее свойству Caption значение «Пол ». 4. Теперь выберем формат даты для вывода дня рождения человека. Для этого выполним следующие действия: 4.1. На форме Form1 активизируем компоненту Table1. В списке полей выделим поле Birthday. В инспекторе объектов появятся характеристики этого поля. 4.2. Выделим в инспекторе объектов свойство DisplayFormat этого поля и введем в него какой-либо формат, например «dddddd». Завершим ввод формата нажатием клавиши Enter. 5. Запустим программу с помощью команды главного меню Run|Run. На экране будут отображены все внесенные нами изменения.
6. Перемещаясь по записям, отметим, что в добавленной строке ввода появляется порядковый номер записи, соответствующим образом отформатированный. А в комбинированной строке ввода помещается значение пола человека, выраженное соответствующим словом. Это значение при необходимости можно скорректировать, используя выпадающий список. 7. Завершим работу программы, нажав стандартную кнопку закрытия окна на границе формы. 8. Сохраним все изменения в проекте с помощью команды главного меню File|Save All.
Задание к лабораторной работе № 2 1. Используя исходную БД, спроектируйте экранную форму (приложение), включив в нее все поля и оформив некоторые из них следующим образом: Вариант 1. Цвет – комбинированная строка ввода значений поля БД (DBComboBox). Вариант 2. Название танца и оценка – комбинированная строка ввода значений поля БД (DBComboBox). Вариант 3. Номер группы - комбинированная строка ввода значений поля БД (DBComboBox). Вариант 4. Цех - комбинированная строка ввода значений поля БД (DBComboBox). Дату поступления на работу необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 5. Цех - комбинированная строка ввода значений поля БД (DBComboBox). Тип изделия – набор варианта значения поля БД (DBRadioGroup). Вариант 6. Цех - набор варианта значения поля БД (DBRadioGroup). Вариант 7. Год установки телефона необходимо вывести в формате, например: 1990 год. Тип установки телефона – выключатель для полей БД логического типа (DBCheckBox). Вариант 8. Возрастная категория детей - комбинированная строка ввода значений поля БД (DBComboBox). Вариант 9. Пол – комбинированная строка ввода значений поля БД (DBComboBox). Семейное положение - набор варианта значения поля БД (DBRadioGroup). Вариант 10. Пол – комбинированная строка ввода значений поля БД (DBComboBox). Год установки телефона необходимо вывести в формате, например: 1980 год.
Вариант 11. Тип самолета - комбинированная строка ввода значений поля БД (DBComboBox). Вариант 12. Срок поставки обуви необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 13. Дату приема в команду необходимо вывести в формате, например: 15 Апрель 1998 г. Название команды - набор варианта значения поля БД (DBRadioGroup). Вариант 14. Признак проживания студента в общежитии - выключатель для полей БД логического типа (DBCheckBox). Выбор дисциплины - выключатель для полей БД логического типа (DBCheckBox). Вариант 15. Дату перечисления необходимо вывести в формате, например: 15 Апрель 1998 г. Признак того, является ли организация коммерческой - выбор варианта значения поля БД (DBRadioGroup). Вид затрат перечисления - комбинированная строка ввода значений поля БД (DBComboBox). Вариант 16. Дату поступления и дату продажи необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 17. Дату изготовления необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 18. Вид спорта - комбинированная строка ввода значений поля БД (DBComboBox). Вариант 19. Пол ребенка - набор варианта значения поля БД (DBRadioGroup). Дату рождения ребенка необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 20. Пол - выключатель для полей БД логического типа (DBCheckBox). Тип организации - комбинированная строка ввода значений поля БД (DBComboBox). Вариант 21. Группа - комбинированная строка ввода значений поля БД (DBComboBox). Дисциплина - комбинированная строка ввода значений поля БД (DBComboBox).
Дату экзамена необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 22. Пол - комбинированная строка ввода значений поля БД (DBComboBox). Дату рождения и дату поступления необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 23. Семейное положение - набор варианта значения поля БД (DBRadioGroup). Дату прохождения медкомиссии необходимо вывести в формате, например: 15 Апрель 1998 г. Вариант 24. Вид изделия - комбинированная строка ввода значений поля БД (DBComboBox). Дату поступления необходимо вывести в формате, например: 15 Апрель 1998 г. Разряд - набор варианта значения поля БД (DBRadioGroup). 2. Создайте и разместите на форме вычисляемое(ые) поле, содержащее следующую информацию: Вариант 1. Количество всех поставщиков и имеющихся на складах деталей (видов деталей). Вариант 2. Количество участников конкурса. Вариант 3. Количество студентов, не выполнивших задание. Вариант 4. Сумма заработной платы, приходящейся на цех. Вариант 5. Количество изготовленных изделий каждого типа за неделю. Вариант 6. Количество рабочих во всех цехах. Вариант 7. Количество не спаренных телефонов со льготами и без льгот. Вариант 8. Общее количество мест, откуда поступают игрушки. Вариант 9. Количество студентов, сдавших сессию на все пятерки. Вариант 10. Количество теннисистов из России. Вариант 11. Количество занятых мест на каждый рейс. Вариант 12.
Количество пар обуви определенного размера. Вариант 13. Вывести фамилию нападающего, у которого самое большое количество заброшенных шайб. Вариант 14. Средний балл успеваемости в группе. Вариант 15. Общие суммы перечисления в коммерческие и некоммерческие организации. Вариант 16. Количество непроданного товара (по каждой партии). Вариант 17. Общая стоимость всех единиц определенного лекарства. Вариант 18. Число ветеранов по каждому виду спорта. Вариант 19. Количество мальчиков и количество девочек в роддоме. Вариант20. Количество слушателей, не сдавших хотя бы одну дисциплину. Вариант 21. Количество студентов, получающих стипендию. Вариант 22. Количество больных, поступивших в тяжелом состоянии. Вариант 23. Количество женатых и неженатых призывников. Вариант 24. Количество изделий каждого вида. 3. Попробуйте создать такую же экранную форму (приложение) с помощью эксперта построителя форм БД – FormWizard.
Лабораторная работа № 3 Проектирование отчетов
Как правило, БД используется для обработки информации. Результаты обработки отображаются в отчетах. Отчет – это документ, который распечатывается на принтере, чтобы затем на его основе принимать решения. В Delphi отчет представляет собой специально оформленную информацию из БД и предназначен для наглядного ее отображения в виде особой формы. Его можно просмотреть на экране, а затем распечатать на принтере. Подобная форма содержит специальные компоненты, которые определяют данные и внешний вид отчета при печати. Перевод представления данных из формы в отчет осуществляется с помощью генератора отчетов. В пакете Delphi 3.0 имеется генератор отчетов QuickReport 2.0, который позволяет просматривать, сохранять в файл, читать из файла и печатать отчет. Отчеты, так же как и формы, могут быть разных типов: • Список – выводит информацию набором строк, каждая из которых представляет одну запись. • В бланке одна запись размещается на одной странице. • Отчет с подотчетом позволяет отобразить информацию из одной таблицы как дополнение к данным из другой. • Отчет печати почтовых этикеток позволяет разместить на листе в отчете несколько небольших прямоугольных областей, которые затем могут быть наклеены на отправляемые по почте вещи. При создании отчета можно выделить несколько стадий. Стадия подготовки отчета. На этой стадии выбираются компоненты отчета и их параметры. Стадия создания отчета. На этой стадии из выбранных компонент формируется отчет. Выполняется она с помощью генератора отчетов. Стадия просмотра отчета. На этой стадии можно просмотреть вид полученного отчета на экране и при необходимости внести в него изменения, вернувшись на стадию подготовки отчета. Стадия печати отчета. На этой стадии осуществляется вывод отчета на принтер. Создание отчета в БД Каждый отчет может состоять из следующих секций: заголовка отчета, заголовка страницы отчета, заголовка группируемых данных, области данных, области для подотчета, окончания группируемых данных, окончания страницы отчета, окончания отчета. Кроме того, QuickReport позволяет печатать фрагмент, повторяющийся на каждой странице и в заголовке каждой колонки в отчете, содержащем несколько колонок. Все это создается с помощью компонент, описанных выше. Пример № 1. Создание отчета для печати содержимого БД «Телефонная книжка» Этот отчет будет сделан как отчет с подотчетом для вывода информации о фамилии, имени, отчестве человека и его телефонах, а также с использованием системной информации.
1. Откроем стандартной командой проект, находящийся в файле MyExampleDB.dpr и полученный в результате выполнения лабораторной работы № 2. Изменим свойство Caption формы Form1 на «Информация о людях с выводом отчета». Сохраним все открытые файлы проекта под теми же именами, но только с индексом 2: MyExUnitDB2.pas, MyExampleDB2.dpr. 2. Добавим новую форму в проект с помощью команды главного меню File|New Form. В этой форме будет создаваться отчет. Изменим свойство Caption формы на «список телефонов». Сохраним форму в файле с именем MyUnitReport2.pas. 3. Установим взаимосвязь между формой Form2 и формой с компонентами, определяющими доступ к БД. Для этого в секции implementation формы Form2 сразу же после объявления этой секции введем следующую строку: USES MyExUnitDB2 4. Определим форму Form2 как отчет. Для этого требуется произвести следующие действия: 4.1 Перенесем со страницы QReport палитры компонент в форму Form2 компоненту QuickRep. Она изображается в виде прямоугольной области размером с лист формата А4, с координатной сеткой. В этой области также пунктирной линией отмечена граница области, которая будет распечатана. По умолчанию все поля, которые определяют эту область, равны 1 см. 4.2 Кроме того, у формы Form2 появятся линейки скроллинга. С помощью инспектора объектов зададим свойству DataSet компоненты QuickRep1 значение Form1.Table1. Таким образом определен источник данных для отображения в отчете – это информация из таблицы People.db. 5. Оформим заголовок отчета. Для этого нужно сделать следующее: 5.1. На форму Form2 со страницы QReport палитры компонент поместим компоненту QRBand (Секция). Она изображается в виде полосы на всю ширину области печати и используется для вывода заголовка отчета. 5.2. Со страницы QReport поместим на компоненту QRBand1 метку QRLabel (Текст в отчете). 5.3. Зададим для компоненты QRLabel1 значение свойства Caption как «Список телефонов», а в сложном свойстве Font установим размер шрифта (Size), равный 16. Поместим эту компоненту в центральной части компоненты QRBand1. 6. Определим секцию для основного отчета, в которую будет выводится информация о людях (из источника данных, определенного в QReport): 6.1. Со страницы QReport поместим на Form2 компоненту QRBand. Она будет находиться под компонентой QRBand1. Изменим свойство BandType этой компоненты на rbDetail, используя выпадающий список. Это означает, что с ее помощью будут выводиться конкретные данные.
6.2. Со страницы QReport поместим на компоненту QRBand2 рядом друг с другом три компоненты QRDBText (Строка с данными из БД). Для этих компонент зададим свойству DataSet значение Form1.Table1, а их свойству DataField соответственно присвоим значения Family,Name, SecName. Для всех этих строк зададим свойству AutoSize значение False, чтобы иметь возможность изменять размеры полей. Несколько увеличим размеры компонент по горизонтали, примерно до 4 см каждый, и разместим их в строку, одну рядом с другой, начиная с левого края компоненты QRBand2. 6.3. Изменим высоту QRBand2 так, чтобы она и компоненты QRDBText1, QRDBText2 и QRDBText3 были примерно одинаковой высоты. 7. Определим секцию подотчета для вывода информации о телефонах: 7.1. Со страницы QReport поместим в Form2 компоненту QRSubDetail (Секция подотчета). Она находится под компонентой QRBand2. Зададим свойству DataSet этой компоненты значение Form1.Table2. Таким образом определим источник данных для отображения в подотчете – это информация из таблицы БД Tel.db. Отметим, что свойство Master, которое определяет основной отчет для подотчета, уже автоматически установлено в QuickRep1. 7.2. Со страницы QReport поместим на компоненту QRSubDetail1 рядом друг с другом две компоненты QRDBText (Строка с данными из БД). 7.3. Для этих компонент зададим свойству DataSet значение Forme1.Table2, а их свойству DataField соответственно присвоим значения Number и Type. Для всех этих строк зададим свойству AutoSize значение False. Несколько увеличим размеры компонент по горизонтали, примерно до 3 см каждый, и разместим их в строку, одну рядом с другой, начиная с левого края компоненты QRSubDetail1. 7.4. Изменим высоту QRSubDetail1 так, чтобы она и компоненты QRDBText4 и QRDBText5 были примерно одинаковой высоты. 8. Разместим в отчете дополнительную системную информацию: время, дату и номера страниц отчета. Для этого выполним следующие действия: 8.1. Зададим вывод системного времени и даты: выберем компоненту QRBand1 и несколько увеличим ее вертикальный размер. Из страницы QReport перенесем на нее две компоненты QRSysData (Системные данные). Разместим эти компоненты одну под другой в левом верхнем углу секции QRBand1. Для компоненты QRSysData1 зададим свойству Data значение qrsDate, а свойству Text – значение Дата. Для компоненты QRSysData2 зададим свойству Data значение qrsTime, а свойству Text – значение Время. Для обеих компонент зададим свойству AutoSize значение False, увеличим их несколько по горизонтали.
8.2. Выберем компоненту QRShape из палитры компонент и поместим ее так, чтобы внутри нее оказались компоненты QRSySData1 и QRSysData2 (поместить эту компоненту необходимо позади, для чего воспользуемся командой главного меню Edit|Send to back). 8.3. Определим вывод номера страницы на каждой странице отчета. Из страницы QReport перенесем на форму Form2 еще одну компоненту QRBand. В тексте модуля она будет иметь имя QRBand3. Зададим ее свойству BandType значение rbPageFooter. Из страницы QReport примерно на середину компоненты QRBand3 поместим компоненту QRSysData. В модуле появится компонента с именем QRSysData3. Для этой компоненты выберем для свойства Data значение qrsPageNumber, а свойству Text зададим значение Страница. 9. Установим взаимосвязь между главной формой проекта Form1 и формой с отчетом Form2. Для этого в тексте модуля формы Form1, в секции implementation, сразу же после ее заголовка добавим строку: USES MyUnitReport; 10. Поместим в форму Form1 кнопки, которые будут использоваться для вывода отчета и закрытия формы. Для этого выполним следующие действия: 10.1. Со страницы Standart палитры компонент поместим в правый нижний угол формы Form1 две кнопки Button, предварительно освободив этот угол от компонент. Выберем кнопку Button2 и установим свойству Caption значение Выход. 10.2. Активизируем эту кнопку мышью и в появившейся заготовке обработчика события OnClick поместим следующий текст: procedure TForm1.Button2Click (Sender: TObject); begin Close; end; 10.3. Выберем кнопку Button1 и установим ее свойству Caption значение «Отчет». 10.4. Активизируем эту кнопку и в появившейся заготовке обработчика события OnClick поместим следующий текст: procedure TForm1.Button1Click (Sender: TObject); begin Form2.QuickRep1.Preview; end; 11. Сохраним внесенные изменения в проекте. 12. Запустим программу. Нажмем кнопку Отчет. В результате будет вызвана утилита QuickReport 2.0, которая отобразит отчет по всем записям в БД «Телефонная книжка». Завершим работу утилиты QuickReport 2.0 нажатием кнопки Close. Завершим работу программы, нажав кнопку Выход. Обработка задания на печать. Класс TQRPrinter
Класс TQRPrinter является потомком класса TPersistent. Компонента этого класса является неотображаемой. Экземпляр этого объекта создается автоматически при выполнении приложения и может использоваться независимо от наличия компоненты QuickRep. Именно этот объект, который имеет имя QRPrinter, обеспечивает создание отчета, его предварительный просмотр, распечатку, а также возможность сохранения отчета в файле и последующую работу с ним. В основном эти действия и возможности по просмотру отчета, обеспечиваемые классом TQRPrinter, представлены в стандартной форме для предварительного просмотра утилиты QuickReport 2.0. Вызвать эту форму с отображенным в ней отчетом можно несколькими способами. При проектировании отчета можно выбрать компоненту QuickRep, затем нажать правую кнопку мыши и во всплывающем меню задать команду Preview. При выполнении приложения следует воспользоваться методом Preview этой же компоненты для отображения стандартного окна просмотра отчета. Все действия в стандартном окне осуществляются с помощью кнопочной панели. Индикатор номера текущей отображаемой страницы с указанием количества страниц находится на строке состояния стандартного окна просмотра. Там же отображается индикатор процесса формирования отчета. Класс TQRPrinter определяет ряд дополнительных свойств, методов и событий, которые мы рассматривать не будем. Быстрое создание отчета Средства быстрого создания отчета можно рассматривать скорее не как эксперт, который предполагает определенную настройку параметров, а как заготовку отчета определенного вида. В этой заготовке отсутствует связь с источником данных, информация из которого выводится в отчете. В Delphi Standart 3.0 для определения источника данных требуется определить характеристики компонент Table, помещенных в форму отчета, которые задают доступ к БД. Следующие операции позволяют создать заготовки соответствующих отчетов для их дальнейшей модификации: File|New|Forms|QuickReport Labels – создается заготовка отчета для печати почтовых этикеток. Этот отчет состоит из трех колонок, в которых выводятся прямоугольные почтовые этикетки. File|New|Forms|QuickReport List – создается заготовка отчета, выводящего информацию в виде списка. Она включает в себя секцию заголовка отчета, секции заголовка страницы, секцию для вывода данных и секцию окончания страницы. File|New|Forms|QuickReport Master/Detail – создается заготовка отчета с подотчетом. Она включает в себя секцию заголовка отчета, секцию заголовка страницы, секцию для вывода данных основного отчета, секцию для вывода данных подотчета, секцию для подведения итогов в подотчете и секцию окончания страницы.
Перечисленные секции создаются по умолчанию и при необходимости к ним можно добавить другие. Кроме того, имеется возможность создать форму с пустой заготовкой отчета. Для этого следует воспользоваться операцией File|New|New|Report. В результате получается форма с помещенной в нее компонентой QuickReport. Report Wizard – эксперт по созданию настраиваемого отчета Report Wizard – эксперт, содержащий диалоговые окна, в которых требуется определить, какая информация будет выведена в формируемом отчете. При этом создается отчет, в котором информация выводится списком. Этот эксперт позволяет создавать отчеты на основе локальных БД. На любом шаге работы можно прервать процесс создания отчета, нажав кнопку Cancel, а также из любого диалогового окна (кроме первого) можно вернуться к предыдущему, нажав кнопку . Вызвать данный эксперт можно с помощью операции File|New|Bisuness|QuickReport Wizard.
Задание к лабораторной работе № 3 1. Используя приложение, созданное в лабораторной работе № 2, спроектируйте и создайте отчет, содержащий следующую информацию: Вариант 1. Список поставщиков и поставляемых ими деталей (номер, вес и цвет детали), сгруппированный по номеру детали. Вариант 2. Список участников соревнований, сгруппированный по городам (с указанием количества участников из каждого города). Вариант 3. Список номеров заданий по дисциплинам с указанием коэффициента сложности и ФИО студента, выполняющего задание. Вариант 4. Список рабочих, сгруппированных по цехам, с указанием ФИО, должности и заработной платы в порядке ее возрастания.
Вариант 5. Список изготовленных изделий, сгруппированных по их типу, с указанием ФИО сборщика, названия цеха. Произвести подсчет количества изделий данного типа, изготовленных за неделю, в конце каждой группы изделий. Вариант 6. Список изделий, сгруппированных по категориям, с указанием их количества и названия цеха, а также вывод суммы всех изделий по всем категориям в конце отчета. Вариант 7.
Список номеров телефонов, сгруппированных по их типу, с указанием ФИО владельца, адреса владельца и года установки, а также количество телефонов данного типа в конце каждой группы. Вариант 8. Список названий игрушек, сгруппированных по возрастным категориям, с указанием цены, количества и названия фабрики, изготовившей игрушку. Вывести общее количество всех игрушек, имеющихся в ассортименте, в конце отчета. Вариант 9. Список студентов, сгруппированных по группам, с указанием ФИО студента и всех его оценок. Вариант 10. Список теннисистов, сгруппированных по названиям стран, содержащий информацию о фамилии спортсмена, фамилии тренера, рейтинге за 5 лет. Для каждой группы подсчитать количество спортсменов. Вариант 11. Список рейсов с указанием их номера, пункта назначения, времени вылета, количества свободных мест. Список сгруппирован по типу самолета, в конце группы указать количество рейсов, осуществляемых самолетами данного типа. Вариант 12. Список названий обуви с указанием названия фабрики-изготовителя, стоимости и имеющихся размеров, а также вывод общего количества пар обуви, имеющейся в ассортименте, в конце отчета. Список должен быть сгруппирован по названию фабрики. Вариант 13. Список нападающих, сгруппированных по командам, с указанием ФИО нападающего, числа заброшенных шайб, даты приема в команду и количества сыгранных матчей. Вывести количество нападающих данной команды в конце каждой группы. Вариант 14. Список студентов, сгруппированных по группам, с указанием ФИО студента, номера его зачетной книжки и дисциплин, которые он желает изучать. Вариант 15. Список организаций-получателей, сгруппированных по их типу, с указанием названия фирмы, вида затрат перечисления, суммы перечисления и даты перечисления, а также количество перечислений в организации данного типа в конце каждой группы. Вариант 16. Список наименований товаров, сгруппированных по дате их поступления, с указанием стоимости товара, номер и размера партии, а также количества поступившего товара в данный день в конце каждой группы. Вариант 17. Список наименований лекарств, сгруппированных по названию фабрикиизготовителя, с указанием срока годности, даты изготовления и стоимости.
Указать общее количество всех лекарств, имеющихся в ассортименте, в конце отчета. Вариант 18. Список ветеранов спорта, сгруппированных по виду спорта, с указанием ФИО спортсмена, города и возрастной группы. Подсчитать количество ветеранов данного вида спорта в конце каждой группы. Вариант 19. Список рожениц, сгруппированных по палатам, с указанием ФИО матери, ФИО лечащего врача, даты рождения ребенка, пола ребенка, а также количества рожениц в данной палате в конце каждой группы. Вариант 20. Список слушателей, сгруппированных по организациям, с указанием ФИО слушателя, названий дисциплин и оценок по каждой дисциплине. Вывести количество слушателей, у которых по всем прослушанным дисциплинам стоит “отлично”, в конце отчета. Вариант 21. Список студентов, сгруппированных по группам, с указанием ФИО студента, наименования дисциплины, оценки, даты экзамена по каждому предмету, фамилии преподавателя по предмету, размера стипендии, а также количества студентов в каждой группе. Вариант 22. Список больных, сгруппированных по степени тяжести состояния, с указанием ФИО больного, даты рождения больного, ФИО лечащего врача, даты поступления и начального диагноза. Указать количество больных в тяжелом состоянии в конце отчета. Вариант 23. Список призывников, сгруппированных по заключению о пригодности к службе, с указанием года рождения, семейного положения и адреса, а также даты прохождения медкомиссии. Вариант 24. Список видов изделий в алфавитном порядке с указанием веса изделия, его пробы и мастера-изготовителя, а также вывод общего количества изделий в ювелирном магазине в конце отчета. Список должен быть сгруппирован по фамилии мастера.
Лабораторная работа № 4 Использование запросов при проектировании приложений При работе с БД широко применяется понятие запроса к ней. Под запросом понимается требование совершить определенное действие с информацией из БД. Можно выбрать данные в соответствии с заданным условием и отобразить результат – запрос на выборку. Можно также вставить, удалить, обновить определенные записи в БД, используя
соответствующие запросы. Такие требования формируются на специальных языках программирования QBE и SQL. SQL нашел более широкое распространение, в Delphi его можно использовать при создании приложения для работы с БД. SQL-запрос На языке SQL можно создать запросы различных типов: • запрос на выборку данных; • запрос на добавление; • запрос на обновление; • запрос на удаление. SQL-запрос, созданный с помощью DBD, помещается в файл с расширением sql. Каждый запрос на языке SQL состоит из нескольких частей, которые начинаются с определенного зарезервированного слова. При записи запросов можно использовать как прописные, так и строчные буквы. Информацию можно разбивать на строки произвольным образом, но желательно в отдельные строки помещать информацию, имеющую определенное смысловое назначение. Для разделения отдельных зарезервированных слов, идентификаторов, чисел, строк, знаков операций и т.д. следует использовать пробелы. 1.Запрос на выборку. Он предназначен для извлечения данных, находящихся в определенных полях одной или нескольких таблиц и соответствующих задаваемым условиям. Конструкция запроса следующая: SELECT [DISTINCT] <список выводимых полей> FROM <список используемых таблиц> [WHERE <условие отбора>] [ORDER BY <порядок сортировки>] [GROUP BY <порядок группировки>] [HAVING <условие отбора групп>] [UNION <объединяемый запрос на выборку>] Рассмотрим подробнее отдельные части запроса. DESTINCT – указывает, что в результате запроса не должно быть повторяющихся значений. <список выводимых полей>: [<таблица>.]<поле>[AS <псевдоним>]{,[<таблица>.]<поле>[AS <псевдоним>]}, где таблица – имя таблицы, если в запросе присутствует только одна таблица, его можно опустить; поле – имя поля; псевдоним – псевдоним для имени поля является локальным в запросе; AS – оператор, ставящий в соответствие конкретному полю псевдоним. Если требуется получить данные из всех полей таблицы, то достаточно указать * вместо перечисления всех имен полей. <список используемых таблиц>:
“<файл с таблицей>” [<псевдоним>]{,”<файл с таблицей>”[<псевдоним>]}. WHERE – зарезервированное слово, с которого начинается оператор задания условий. <условие отбора>: Условие, устанавливающее объединение: [(<таблицаM.поле1> <условие> <таблицаN.поле2>)]{AND|OR (<таблицаI.поле1> <условие> <таблицаJ.поле2>)}, где таблицаM, таблицаN, таблицаI, таблицаJ – имена объединяемых таблиц; поле1, поле2 – имена полей в этих таблицах, по соответствию значений которых устанавливается взаимосвязь таблиц; условие – определяет соответствие значений в заданных полях двух таблиц, например: равенство, больше, меньше, не равно и другие операции сравнения; условий может быть несколько, в этом случае они объединяются при помощи круглых скобок и логических операций AND и OR. Если условие для объединения отсутствует, формируется результат, представляющий собой всевозможные объединения записей всех таблиц. Условие на значение полей: [[<таблица>.]<поле> <условие> <значение>] {AND|OR [<таблица>.]<поле> <условие> <значение>}. Помимо математических, используются также логические операторы сравнения, предикаты IN, LIKE и другие. ORDER BY – зарезервированное слово, с которого начинается оператор задания порядка сортировки. <порядок сортировки>: [<таблица>.]<поле> [ASC|DESC] {,[<таблица >.]<поле> [ASC|DESC]}, где ASC (по умолчанию) или DESC – определяют порядок сортировки соответственно по возрастанию или убыванию. GROUP BY – зарезервированное слово, с которого начинается оператор задания порядка группировки. <порядок группировки>: [<таблица>.]<поле> {,[<таблица>.]<поле>}. 2.Запрос на добавление. Этот запрос позволяет добавить запись в таблицу и присвоить значения ее полям. Конструкция запроса следующая: INSERT INTO “<файл с таблицей>” (<поле>{,<поле>}) VALUES (<значение>{,<значение>}). Рассмотрим подробнее отдельные части запроса: файл с таблицей – имя файла с таблицей, в которую добавляется запись; должен быть с расширением и содержать путь; поле – имя поля, которому задается значение. VALUES - зарезервированное слово, с которого начинается оператор задания списка значений полям таблицы; значение – значение из списка значений, которое задается соответствующему полю новой записи (их количество должно равняться числу полей). 3.Запрос на обновление.
Этот запрос позволяет обновить значения в записях, которые соответствуют задаваемым условиям. Конструкция запроса следующая: UPDATE “<файл с таблицей>” SET <поле> = <значение>{, <поле> = <значение>} [WHERE <условие отбора>] Рассмотрим некоторые части запроса: SET – зарезервированное слово, с которого начинается оператор, задающий список подставляемых значений; <поле> = <значение>{, <поле> = <значение>} – список полей и значений, которые задаются этим полям. [WHERE <условие отбора>] – оператор, задающий условие отбора тех записей, в которых следует обновить данные. 4.Запрос на удаление. Этот запрос позволяет удалить из таблицы записи, удовлетворяющие заданным условиям. Конструкция запроса следующая: DELETE FROM «<файл с таблицей>» [WHERE <условие отбора>]. Запрос к БД (Query) Использование одной компоненты Table позволяет работать только с одной таблицей. Поэтому, когда необходимо работать с несколькими связанными таблицами, нужно создавать соответствующее число компонент Table. В этом случае целесообразно взять компоненту Query класса TQuery, являющегося потомком класса TDBDataSet. Эта компонента позволяет определить набор данных на основе нескольких таблиц с помощью SQLзапроса. Ее также удобно применять, когда таблица БД чрезмерно велика; в этом случае с помощью запроса можно ограничить набор рассматриваемых данных. Использование этой компоненты связано со знанием языка SQL. Отметим сразу, что можно создать оператор Delphi SQL при помощи компоненты Query следующим образом: 1) поместить на форму объекты Query, DataSource и связать их вместе; 2) присвоить псевдоним объекта TQuery свойству DataBaseName; 3) с помощью свойства SQL ввести указание SQL; 3) установить свойство Active в значение True. Если каждый шаг был завершен правильно и если BDE установлено корректно, сетка должна будет содержать записи из указанной таблицы. Delphi позволяет создавать SQL-запросы к БД как статические, в которых текст запроса остается неизменным, так и динамические (или запросы с параметрами). Динамические SQL-запросы содержат параметры, определенные в условиях отбора записей, которые в процессе выполнения программы могут изменяться. Таким образом, с помощью одного динамического запроса можно получать различные результаты при выполнении приложения. Синтаксическая конструкция динамических запросов аналогична статическим, за исключением того, что у них в секции, определяющей условия отбора записи, вместо значения записывается
<параметр>, где параметр – имя параметра, вместо которого при выполнении приложения будет подставляться значение. У класса TQuery отметим следующие наиболее важные свойства, которые он добавляет к наследуемым от классов TDataSet, TBDEDataSet и TDBDataSet: Local – определяет расположение таблиц (True – локальные таблицы, False – таблицы на SQL-сервере); свойство только для чтения. RequestLive – свойство логического типа (по умолчанию имеет значение False), определяет возможность изменять набор данных, полученный в результате выполнения запроса. Эта возможность имеется, если свойство имеет значение True, и у запросов, которые основаны на одной таблице и не используют сортировку и агрегатные функции. У остальных запросов результат доступен только для чтения независимо от значения данного свойства. В этих случаях можно посмотреть свойство CanModify для того чтобы увидеть, успешен ли запрос, если же нужно откорректировать таблицу с помощью запроса SQL, то следует использовать команду SQL Update. SQL – свойство типа TStrings, определяет текст SQL-запроса, который используется при выполнении методов Open или ExecSQL. UniDirectional – определяет направление перемещения курсора по набору данных, полученному в результате выполнения запроса. UpdateMode – свойство типа TUpdateMode, определяет способ обновления записей из промежуточного буфера. Следующие свойства компоненты TQuery используются в динамических SQL-запросах. Приведем некоторые из них: DataSource – свойство типа TDataSource, определяет источник данных, значения полей которого используются как параметры для динамического запроса. Params[Index] – свойство типа TParams, задает список элементов типа TParams, которые определяют параметры в динамическом запросе. С помощью этого свойства в редакторе значений параметров задаются начальные величины параметров. Чтобы перейти к редактору значений параметров запроса, нужно активизировать мышью значение этого свойства. Класс TQuery добавляет к наследуемым от классов TDataSet, TBDEDataSet и TDBDataSet следующие методы (некоторые из них): ExecSQL – процедура выполняет SQL-запрос. Prepare – процедура посылает запрос в BDE для проверки синтаксиса и оптимизации. Рекомендуется выполнять для динамических запросов. События, которые обрабатываются компонентой TQuery, полностью наследуются от класса TDataSet. При подстановке переменных связи в динамический запрос программным методом с помощью свойства Params выполняются обычно следующие шаги: 1) необходимо убедиться в том, что таблица закрыта; 2) подготавливается объект TQuery с помощью выдачи команды Prepare; 3) Свойству Params присваиваются конкректные значения;
4) Открывается запрос. Пример № 1. Создание запроса для вывода записей, имеющих фамилию, начинающуюся с одной и той же буквы, из БД «Телефонная книжка» Для работы с электронной телефонной книжкой как с обычной желательно иметь возможность просматривать абонентов только с фамилиями, начинающимися на одну букву. Для этого воспользуемся запросом с параметром. 1. Загрузим заготовку проекта, созданную в лабораторной работе № 2. Зададим свойству Caption формы значение «Информация о людях (запрос)». Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры «5» в конце имени: MyExUnitDB5.pas, MyExampleDB5.dpr. 2. Со страницы DataAccess поместим на форму Form1 компоненту Query (Запрос). Выберем компоненту Query1, активизируем свойство SQL и в появившемся текстовом редакторе введем следующие строки, которые задают запрос на языке SQL: SELECT D.*, D1.* FROM “<путь к файлу>\People.db” D, “<путь к файлу>\Tel.db” D1 WHERE (D.IDPeople = D1.IDPeople) AND (D.Family Like :FirstChar). Оператор Like позволяет отобрать записи, которые определяются параметром FirstChar в поле Family. Затем активизируем свойство Params и в появившемся окне редактора параметров запроса Form1.Query1 Parameters выполним следующее. Выберем из списка Parameter Name (Название параметра) FirstChar, в строке ввода со списком DataType (тип данных) выберем String и в строке Value (Значение) введем А% - начальное значение. Завершим настройку нажатием кнопки ОК. 3. Установим у свойств Active и RequestLive компоненты Query1 значение True, используя инспектор объектов. 4. Со страницы DataAccess палитры компонент поместим на форму Form1 еще одну компоненту DataSource. Активизируем ее и установим свойство DataSet в Query1. 5. Перейдем к форме Form1. Справа от компоненты DBGrid1 поместим со страницы Standart палитры компонент две компоненты Label. Свойству Caption компоненты Label6 зададим значение Постраничный, а свойству Caption компоненты Label7 – Просмотр. 6. Ниже, под компонентами Label6 и Label7, поместим со страницы Standart кнопку Button. Изменим ее свойство Caption на Просмотр. При нажатии на эту кнопку будет происходить переход на новую форму, на которой будет реализован постраничный просмотр БД «Телефонная книжка». Активизируем ее и в появившемся обработчике события OnClick введем следующее: procedure TForm1.Button1Click(Sender: TObject);
begin Form2.Visible := True; end; Свойство Visible обеспечивает отображение формы на экране после своего создания. 7. Добавим в форму Form1 со страницы Additional палитры компонент компоненту Bevel. Поместим ее позади компонент Label6, Label7 и Button1. Теперь эта группа компонент будет выделяться на форме. Изменим ее свойство Style на bsRaised (она будет выпуклой). 8. Создадим теперь вышеуказанную форму. Для этого выполним следующие действия: 8.1. Добавим в проект форму командой главного меню File|New Form. 8.2. Изменим свойство Caption формы Form2 на «Постраничный просмотр» и сохраним форму под именем MyExUnitQuery.pas. 8.3. В тексте модуля Form2 в секции implementation напишем следующую строчку для связи данной формы с Form1: USES MyExUnitDB5; Перейдем снова к форме Form1. В тексте ее модуля установим связь с Form2, для чего в секции implementation допишем: USES MyExUnitQuery; 8.4. В верхний левый угол формы поместим компоненту ComboBox со страницы Standart палитры компонент. Изменим ее свойство Text на A. Затем активизируем свойство Items и в появившемся окне редактора введем на каждой строке последовательно по одной букве от «А» до «Я», за исключением, быть может, букв «Ь» и «Ъ». Завершим ввод нажатием кнопки ОК. 8.5. Со страницы Standart палитры компонент с помощью мыши поместим рядом с компонентой ComboBox1 компоненту Button. Изменим ее свойство Caption на «Страница». Затем активизируем кнопку и в появившемся обработчике события OnClick введем оператор, задающий отображение в форме результатов выполнения запроса в компоненте Query1. Обработчик будет иметь следующий вид: procedure TForm2.Button1ClickSender: TObject); begin WITH Form1.Query1 DO BEGIN Close; Prepare; Params[0].AsString := ComboBox1.Text + ‘%’; Open; END; end; 9. Поместим на форму Form2 еще одну компоненту Button, справа от компоненты Button1. Изменим ее свойство Caption на Назад. При помощи
этой кнопки мы сможем вернуться к форме Form1 во время работы приложения. Активизируем кнопку Button2 и в открывшемся обработчике события OnClick введем следующее: procedure TForm2.Button2Click(Sender: TObject); begin Close; end; 10. Ниже помещенных нами компонент разместим на всю оставшуюся часть формы компоненту DBGrid со страницы DataControls палитры компонент. Зададим свойству DataSourse значение Form1.DataSource3. При помощи редактора списка полей Editing DBGrid1.Columns определим поля, которые будут отображаться в таблице (эти действия были описаны в лаб./раб. №2): Family, Name, SecName, Number, Type, задавая при этом через сложное свойство Titel заголовки столбцов в DBGrid1: Фамилия, Имя, Отчество, Номер, Тип соответственно. 11. Поместим в низ формы Form1, приблизительно в центр, еще одну кнопку Button, которая в тексте модуля будет иметь имя Button2. Изменим ее свойство Caption на Выход (выход из приложения). Активизируем ее и в обработчике события напишем: procedure TForm1.Button2Click(Sender: TObject); begin Close; end; 12. Запустим программу командой Run|Run. В результате появится окно, в котором при нажатии на кнопку Просмотр появится еще одно окно, где, выбирая в выпадающем списке разные буквы и нажимая кнопку Страница, можем видеть, как меняется набор отображаемых записей в таблице DBGrid в соответствии с первой буквой значения фамилии. 13. Завершим работу нажатием кнопки Выход в основном окне. 14.Сохраним все изменения в проекте. При программном использовании TQuery следует сначала закрыть текущий запрос и удалить все строки, которые уже могут находиться в свойстве SQL: Query1.Close; Query1.SQL.Clear; При этом всегда безопасно вызывать Close, т.к. если запрос уже закрыт, то это не вызовет никакой ошибки. Следующим шагом является добавление новых строк, которые необходимо выполнить, например: Query1.SQL.Add(‘Select * From People.db’); Можно использовать свойство Add для добавления в запрос SQL от одной до x строк. Для того, чтобы Delphi обработало операторы SQL и вернуло курсор с результатами запроса, требуется написать следующий оператор: Query1.Open;
Если возвращать курсор не обязательно, то можно сделать вызов ExecSQL. Вызывать ExecSQL также требуется, если происходит вставка, исключение и корректировка данных, т.е. вместо строки Query1.Open нужно будет записать: Query1.ExecSQL; Query1.Refresh; Отметим также, что операторы Select возвращают курсор и поэтому требуют вызова Open. Delete, Insert и Update не возвращают курсор и поэтому сопровождаются вызовом ExecSQL. Если требуется составить серию операторов, то ускорить работу можно за счет использования динамических запросов.
Пример № 2. Создание запроса для ограничения числа отображаемых записей из БД «Телефонная книжка» (программный путь) В телефонной книжке, как правило, располагается много записей и просмотр всех их последовательно затруднителен. Рассмотрим простейшее разбиение таких записей на следующие две части: в первую войдут те, которые содержат фамилии, начинающиеся на буквы от «А» до «М», а во вторую – от «Н» до «Я», причем записи будут выводиться в алфавитном порядке. Будем использовать TQuery программно. 1. Загрузим заготовку проекта, созданную в предыдущем примере. Зададим свойству Caption формы Form1 значение «Информация о людях (запрос 2)». Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры 6 в конце имени: MyExUnitDB6.pas, MyExUnitQuery6.pas и MyExampleDB6.dpr. В тексте модуля формы Form1 заменим раздел объявления используемых модулей в секции implementation USES MyExUnitQuery; на раздел USES MyExUnitQuery6; А в тексте модуля формы Form2 заменим раздел объявления используемых модулей в секции implementation USES MyExUnitDB5; на раздел USES MyExUnitDB6; А ее свойство Caption изменим на «Ограниченный просмотр». Изменим немного вид формы Form1: свойство Caption у компоненты Label6 с Постраничный на Ограниченный. 2. Перейдем к форме Form2. Удалим из нее две компоненты – ComboBox1 и Button1 (кнопка Страница). На место удаленных компонент поместим со страницы Standart две компоненты Button, а у компоненты DBGrid1 свойство DataSource сделаем пустым, чтобы первоначально в ней не было никаких записей.
3. Выберем кнопку Button1 и изменим ее свойство Caption на «А – М». Активизируем ее и в появившемся обработчике события OnClick введем следующие строки: procedure TForm2.Button1Click(Sender: TObject); begin WITH Form1.Query1 DO BEGIN Close; SQL.Clear; SQL.Add('SELECT D.*, D1.*'); SQL.Add('FROM "People.db" D, "Tel.db" D1'); SQL.Add('WHERE'); SQL.Add('(D1.IDPeople = D.IDPeople)AND(D.Family < "Н")'); SQL.Add('ORDER BY D.Family ASC'); Open; END; Form1.DataSource3.DataSet := Form1.Query1; DBGrid1.DataSource := Form1.DataSource3; end; 4. Выберем кнопку Button3 и изменим ее свойство Caption на «Н – Я». Активизируем ее и в появившемся обработчике события OnClick внесем следующее: procedure TForm2.Button3Click(Sender: TObject); begin WITH Form1.Query1 DO BEGIN Close; SQL.Clear; SQL.Add('SELECT D.*, D1.*'); SQL.Add('FROM "People.db" D, "Tel.db" D1'); SQL.Add('WHERE'); SQL.Add('(D1.IDPeople = D.IDPeople)AND(D.Family >= "Н")'); SQL.Add('ORDER BY D.Family ASC'); Open; END; Form1.DataSource3.DataSet := Form1.Query1; DBGrid1.DataSource := Form1.DataSource3; end; 5. Запустим программу командой Run|Run. 6. Перейдем ко второй форме, нажав кнопку Просмотр. Нажимая кнопки «А – М» и «Н – Я», можем видеть, как меняется набор отображаемых записей. 7. Завершим работу приложения. 8. Сохраним все изменения в проекте.
Задание к лабораторной работе № 4.
Используя приложение, созданное в лабораторной работе № 2, спроектируйте и создайте запрос следующего вида: Вариант 1. Запрос для вывода списка деталей, хранящихся в Москве, с указанием уникального номера детали, ее веса, цвета, фамилии поставщика. Вариант 2. Запрос, для вывода списка участников конкурса, приехавших из Ульяновска, содержащий фамилию, имя, отчество участника, фамилию тренера. Вариант 3. Запрос для вывода списка студентов, у которых оценка выше или равна 0,5, с указанием ФИО студента, номера группы, названия дисциплины, варианта задания и коэффициента его сложности. Вариант 4. Запрос для вывода списка рабочих, имеющих одну и ту же должность, с указанием ФИО рабочего, названия цеха, стажа и разряда. Вариант 5. Запрос для вывода списка изделий за каждый день недели с указанием типа изделия и его стоимости. Вариант 6. Запрос для вывода списка рабочих в каждом цехе с указанием количества изделий по категориям, выполненных каждым рабочим. Вариант 7. Создайте отчет, содержащий номера телефонов абонентов, у которых есть льготы, с указанием ФИО и адреса владельца, года установки. Отчет создайте на основе компоненты TQuery. Вариант 8. Запрос для вывода списка игрушек, предназначенных для одной и той же возрастной категории, с указанием названия игрушки, ее цены и количества. Вариант 9. Запрос для вывода списка студентов, у которых есть своя семья. Вариант 10. Запрос для вывода списка Российских спортсменов, с указанием фамилии, имени, отчества спортсмена, пола, года рождения. Вариант 11. Создайте отчет, содержащий номера всех рейсов, у которых есть хотя бы одно свободное место, с указанием пункта назначения, времени вылета и времени прибытия. Отчет создайте на основе компоненты TQuery. Вариант 12. Запрос для вывода списка наименований обуви, имеющей один и тот же размер, с указанием артикула, стоимости, названия фабрики-изготовителя и количества пар. Вариант 13.
Запрос для вывода списка нападающих, у которых количество сыгранных матчей больше трех, а число заброшенных шайб больше 15, с указанием ФИО нападающего и названия команды. Вариант 14. Запрос для вывода списка студентов, обучающихся в одной и той же группе, с указанием ФИО студента, номера его зачетной книжки и выбранных дисциплин. Вариант 15. Создайте отчет, содержащий названия и адреса коммерческих организацийполучателей. Отчет создайте на основе компоненты TQuery. Вариант 16. Запрос для вывода списка фирм, когда-либо покупавших товары. Вариант 17. Запрос для вывода списка наименований лекарств, произведенных на какойлибо фабрике. Вариант 18. Запрос для ограничения числа отображаемых записей по фамилиям ветеранов спорта с указанием пола спортсмена, его возрастной группы, города, в котором он проживает, и вида спорта. Вариант 19. Запрос для вывода списка рожениц, лечащихся у одного и того же врача, с указанием ФИО матери, номера палаты, в которой она лежит, и даты рождения ребенка. Вариант 20. Запрос для вывода списка слушателей, которые не сдали хотя бы одну дисциплину, с указанием ФИО слушателя и названия организации. Вариант 21. Создайте отчет, содержащий список студентов, получающих стипендию, с указанием группы и размера стипендии Отчет создайте на основе компоненты TQuery. Вариант 22. Запрос для вывода списка больных, лечащихся у одного и того же врача, с указанием ФИО больного, даты его рождения, пола, начального диагноза и степени тяжести состояния больного. Вариант 23. Запрос для вывода списка призывников, не пригодных к службе, с указанием ФИО призывника и года его рождения. Вариант 24. Запрос для вывода списка изделий, выполненных одним и тем же мастеромювелиром, с указанием вида изделия, его веса, пробы и стоимости.
Лабораторная работа № 5 Проектирование меню
Практически все достаточно сложные программы в настоящее время обладают системой меню, предназначенной для выбора того или иного пути выполнения программы. Интерфейс, основанный на использовании меню, становится очень удобным и позволяет быстро достигнуть необходимого результата. В Delphi имеется стандартная компонента, входящая в семейство класса TMenu. Она содержит структуру меню в виде объекта класса TMenuItem. Каждый из элементов меню, в свою очередь, также является объектом класса TMenuItem. Все элементы меню в явном виде размещаются в форме и непосредственно доступны через свои идентификаторы. Сделано это для того, чтобы упростить доступ к их обработчикам события OnClick и опубликованным свойствам. Элемент меню класса TMenuItem Элемент меню может представлять собой либо подменю, либо команду, либо разделительную линию. К какой категории относится конкретный элемент, зависит от его характеристик. Несмотря на это, любой элемент меню принадлежит к одному и тому же классу – TmenuItem, и каждый может рассматриваться как самостоятельное меню. Для того чтобы элемент меню представлял собой подменю, необходимо, чтобы свойство Items содержало соответствующие компоненты этого подменю. Если это свойство пустое (не содержит ни одного элемента), элемент меню является либо командой, либо разделительной линией. Для того, чтобы элемент меню представлял собой разделительную линию, следует его свойству Caption задать значение «-». Элементы меню могут объединяться в группы. Информация о принадлежности элементов к группам может использоваться при слиянии меню нескольких форм и при использовании взаимосвязанных элементов меню. При этом группы элементов меню должны идти в определенном порядке – по возрастанию их номеров. Характеристики элемента меню задают его внешний вид и место в структуре меню. Среди его свойств отметим следующие: Break – свойство, определяющее наличие разбиения меню на столбцы на текущем элементе. Caption – свойство типа string, содержащее текст элемента меню. Здесь можно задать клавишу быстрого перехода с помощью символа &, помещаемого перед соответствующим символом текста. Checked – свойство логического типа, определяющее, является ли элемент меню отмеченным (если имеет значение True, элемент помечается «галочкой»). Default – свойство логического типа; если оно имеет значение True, текст элемента меню выделяется полужирным шрифтом, а двойное нажатие мышью старшего элемента приводит к появлению у
текущего элемента события OnClick. По умолчанию имеет значение False. Enabled – свойство логического типа; если оно имеет значение True, элемент меню реагирует на события от мыши и клавиатуры (элемент меню разрешен). GroupIndex – свойство целого типа, содержащее номер группы, к которой принадлежит элемент меню. По умолчанию имеет нулевое значение. Items[Index] – свойство-массив типа TMenuItem (индекс Index – целого типа), задающее младшие элементы меню по отношению к текущему элементу. Число элементов определяется свойством Count. Нумерация начинается с нуля и используется только для чтения. MenuIndex – свойство целого типа, содержащее индекс текущей компоненты в списке Items старшей компоненты. RadioItem – свойство логического типа; если оно имеет значение True, элемент меню выполняет роль переключателя, т.е. помеченным может быть только один элемент одной группы. ShortCut – свойство целого типа, определяющее код клавиш быстрого управления, при нажатии которых активизируется элемент меню. Для работы с кодами клавиш быстрого управления используются подпрограммы ShortCut, ShortCutToKey, ShortCutToText, TextToShortCut. Visible – свойство логического типа; если оно имеет значение True, элемент меню отображается на экране, если False – нет. В классе TMenuItem определено одно событие – OnClick. Класс имеет ряд методов, в основном связанных с корректировкой структур. Add(Item) – процедура, добавляющая элемент Item (класса TMenuItem) в список младших элементов. Delete(Index) – процедура, удаляющая из списка младших элементов элемент с индексом Index. При этом элемент из динамической памяти не удаляется и может быть повторно использован. На стадии проектирования тому или иному элементу меню можно задать клавишу (клавиши) быстрого управления, используя свойство ShortCut, выбрав из выпадающего списка подходящее сочетание либо набрав их непосредственно с помощью клавиатуры. Можно эту операцию осуществить и на стадии выполнения программы, но, сделать это несколько труднее. Для этой цели можно воспользоваться специальными стандартными подпрограммами, позволяющими выполнять различные преобразования (ShortCut, ShortCutToKey, ShortCutToText, TextToShortCut).
Главное меню Main Menu
Обычно главное меню формируется на стадии проектирования. С этой целью следует воспользоваться компонентой Main Menu из страницы Standart палитры компонент, а затем применить свойство Items. При активизации мышью этого свойства открывается конструктор меню (работа с ним будет описана ниже). Характеристики элементов меню задаются с помощью инспектора объектов. При необходимости (например, для создания подменю) используется локальное меню конструктора. Можно создать меню или отдельные его элементы и на стадии выполнения программы. Для этого нужно использовать следующие стандартные функции: NewItem, NewLine, NewSubMenu, NewMenu. Локальное меню Popup Menu В отличие от главного меню локальное меню постоянно на экране не отображается, а выводится по мере необходимости. Чаще всего для этого используется правая клавиша мыши, когда курсор мыши находится над тем элементом управления, для которого следует открыть локальное меню. Как правило, локальное меню является одноуровневым, хотя это необязательно. Во многих случаях отдельные элементы локального меню дублируют наиболее часто используемые элементы главного меню. Локальное меню класса TPopupMenu, так же как и главное меню, является потомком класса TMenu. В свою очередь, в классе TPopupMenu вводятся новые характеристики, среди которых отметим следующие свойства: Alignment – свойство типа TPopupAlignment, которое определяет расположение локального меню относительно курсора мыши. AutoPopup – свойство логического типа. Если свойство имеет значение True, локальное меню появляется при нажатии правой клавиши мыши, если имеет значение False, меню не появляется (в этом случае следует использовать метод Popup). OnPopup – событие, возникающее при выводе локального меню на экран путем нажатия правой клавиши мыши (если свойство AutoPopup имеет значение True) или вызова метода Popup. Это единственное событие, которое обрабатывает локальное меню. Popup(X, Y) – процедура, выводящая на экран меню, при этом координаты его верхнего левого угла равны X и Y. На стадии проектирования локальное меню создается так же, как и главное меню. В форме размещается компонента Popup Menu из страницы Standart палитры компонент. Далее активизируется его свойство Items и с помощью конструктора меню набирается структура меню. Завершается создание локального меню привязкой его к конкретному элементу управления (элементам управления) через свойство PopupMenu элемента управления. Для создания локального меню на стадии выполнения программы можно использовать стандартную функцию NewPopupMenu.
Для формирования открытого массива Items элементов меню здесь также можно воспользоваться стандартными функциями NewItem, NewLine и NewSubMenu. Конструктор меню Окно конструктора меню содержит структуру имеющегося меню или один пустой прямоугольник (если создается новое меню), соответствующий первому создаваемому подменю. При создании нового главного меню в инспекторе объектов появляется информация, соответствующая новому создаваемому элементу меню. В этой информации важным является свойство Caption, куда следует поместить название элемента, которое будет отображаться на экране. При вводе этого названия наряду с остальными можно использовать и буквы кириллицы. Перед какой-либо буквой можно поставить символ &, задающий клавишу быстрого перехода. Здесь же можно задать и клавиши быстрого управления, позволяющие выполнять определенную для этого элемента команду. Для названий подменю главного меню клавиши быстрого управления не отображаются, однако выполняют свои функции. Для добавления элемента в любом месте меню (за исключением конечных элементов, которые создаются автоматически при прекращении работы с предыдущим элементом) необходимо выделить элемент, перед которым следует поместить новый элемент, и выполнить команду Insert локального меню конструктора. В результате этого появится пустой элемент в соответствующем месте, с которым дальше проводится работа, как указано выше. Для удаления любого элемента меню или даже группы элементов следует выполнить команду Delete. Все изменения главного меню сразу же отражаются на его виде, появляющемся в форме. Редактирование уже имеющегося главного меню выполняется аналогичным образом. Работа по созданию или редактированию локального меню аналогична работе с главным меню, только его следует рассматривать как самостоятельное подменю с соответствующими элементами. Здесь также можно использовать элементы трех типов, однако применения собственных подменю в локальном меню по возможности следует избегать. Завершается работа с конструктором меню закрытием его окна. Пример 1. Создание меню для приложения, работающего с БД «Телефонная книжка» В данном примере построим главное меню приложения, которое будет содержать такие пункты меню, как Файл, Поиск, Сортировка, со следующими подпунктами соответственно: Печать и Выход, По фамилии и По дате рождения, По номеру и По фамилии. Таким образом, при помощи данного меню можно будет осуществлять поиск по фамилии и по дате
рождения, проводить сортировку по номеру записи, а также по фамилии, кроме этого оно дает возможность произвести печать содержимого БД «Телефонная книжка». Поверхностный анализ задачи проектирования меню проясняет, что таблица People.db должна иметь вторичные индексы в полях IDPeople, Family и Birthday для осуществления поиска и сортировки по этим полям. 1. Откроем DataBase Desktop 7.0 и создадим необходимые нам вторичные индексы по полям Family, Birthday и IDPeople, назвав их FamilyIndex, BirthdayIndex и Number соответственно. 2. Теперь войдем в среду Delphi 3.0 для того, чтобы начать работу по созданию меню. 3. Вызовим заготовку проекта, созданную в лаб./раб. № 2. Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры 7: MyExampleDB7.dpr, MyExUnitDB7.pas. 4.Подготовим форму для размещения на ней меню. Для этого выполним следующее: 4.1. Сдвинем все имеющиеся в форме компоненты немного вниз, освободив тем самым место под главное меню (при необходимости нужно увеличить размер формы по вертикали). Изменим свойство Color (Цвет) формы на clTeal (или любой другой цвет) для того, чтобы меню выделялось на экране, привлекая внимание пользователя. 4.2. Создадим кнопку Выход для завершения работы приложения, разместив ее справа от компоненты DBGrid1 (подобная кнопка создавалась в лаб./раб. № 3 и лаб./раб. № 4). 5. Сформируем общий вид главного меню. Для этого выполним следующие действия: 5.1. Со страницы Standart палитры компонент поместим на форму Form1 компоненту MainMenu в правый нижний угол формы. 5.2. Активизируем у компоненты MainMenu1 свойство Items (Компоненты), в результате чего откроется окно конструктора меню. Зададим свойству Caption пустого прямоугольника значение Файл, а свойству Name этого же элемента меню значение File_pt. 5.3. У появившегося пустого прямоугольника, который соответствует первому элементу подменю Файл, свойство Caption изменим на Печать, а свойство Name – на Print_pt. У следующего элемента подменю свойству Caption зададим значение «-» – это будет разделительная линия. Наконец, у следующего и последнего элемента этого же подменю свойству Caption зададим значение Выход, а свойству Name – Exit_pt. 5.4. У следующего элемента главного меню (пустой прямоугольник справа от элемента меню Файл) свойству Caption зададим значение Поиск, а свойству Name – Search-pt. Подпункты элемента меню Поиск – По фамилии, По дате рождения – создадим аналогично элементам Печать и Выход (их свойствам Name зададим значения Family1_pt и Date_pt соответственно).
5.5. Аналогичным образом создадим элемент меню Сортировка, который включает в себя пункты По номеру (свойство Name – Number_pt) и По фамилии (свойство Name – Family2_pt). 5.6. Закроем конструктор меню. Отметим, что на форме Form1 уже отображено создаваемое меню, и следующим шагом будет обеспечение работы всех пунктов данного меню. 6. При выборе пункта меню Печать будет выводиться в режиме предварительного просмотра отчет, созданный в лаб./раб. № 3, т.е. список людей с имеющимися у них телефонами. Для того чтобы этот пункт меню стал рабочим, необходимо выполнить следующие действия: 6.1. Добавим в проект файл MyUnitReport2.pas из лаб./раб. № 3 и сохраним его под именем MyUnitReport.pas. В тексте модуля формы Form2 (форма с отчетом) изменим раздел объявления используемых модулей в секции implementation USES MyExUnitDB3; на раздел USES MyExUnitDB7; 6.2. В тексте модуля формы Form1 в секции implementation напишем следующую строчку для связи данной формы с формой Form2: USES MyUnitReport; 6.3. В форме Form1 активизируем пункт меню Печать и в появившемся обработчике события OnClick введем оператор, задающий отображение отчета в режиме предварительного просмотра: procedure TForm1.Print-ptClick (Sender: TObject); begin Form2.QuickRep1.Preview; end; 7. Для обеспечения работы пункта меню Выход выполним следующие действия: активизируем данный пункт меню и в появившемся обработчике события OnClick введем оператор, обеспечивающий завершение работы: procedure TForm1.Exit-ptClick (Sender: TObject); begin Close; end; 8. Для обеспечения поиска по фамилии и по дате рождения нам потребуется еще два окна, в каждом из которых будет осуществляться запрос у пользователя строки, которую надо найти. Для создания этих окон выполним следующее: 8.1. Добавим в проект новую форму. Изменим размер формы, уменьшив ее значительно по вертикали и слегка увеличив по горизонтали (в результате должен получиться узкий прямоугольник). Изменим также свойство Caption формы на «Поиск по фамилии». Сохраним форму в файле Search7.pas. 8.2. Со страницы Standart поместим на форму, в ее верхнюю часть, компоненту Label. Изменим ее свойство Caption на «Введите фамилию
искомого человека», а через сложное свойство Font изменим шрифт на полужирный. 8.3. Справа от компоненты Label1 поместим на форму со страницы Standart компоненту Edit и увеличим ее горизонтальный размер на оставшуюся часть формы (размер этой компоненты должен быть достаточным для ввода фамилии с максимально возможной длиной). Свойство Text этой компоненты сделаем пустым. 8.4. Ниже, под компонентами Label1 и Edit1, приблизительно в центре формы поместим две кнопки BitBtn со страницы Additional палитры компонент. Активизируем первую кнопку и изменим следующие ее свойства: Caption на ОК, Kind на bkOK, ModalResult на mrOK и Name на OKBtn. В результате мы получим стандартную кнопку ОК. Теперь активизируем вторую кнопку и изменим ее свойства следующим образом: Caption на Отмена, Kind на bkCancel, ModalResult на mrCancel и Name на CancelBtn, т.е. создадим стандартную кнопку Cancel. 8.5. Добавим в проект еще одну новую форму. Сохраним ее в файле Search7-1.pas. Зададим ее свойству Caption значение «Поиск по дате рождения». Придадим форме вид, аналогичный виду формы Form3, со следующими изменениями: свойство Caption компоненты Label1 будет иметь значение «Введите дату рождения человека», и под ней будет размещена еще одна компонента Label со свойством Caption равным «дата вводится через точку». 8.6. Установим связь формы Form1 с формами Form3 и Form4, дописав имеющуюся в форме Form1, в секции implementation строку следующим образом: USES MyUnitReport, Search7, Search7-1; 9. Для обеспечения работы с пунктом По фамилии подменю Поиск активизируем данный пункт меню и в появившемся обработчике события OnClick введем следующие строки: procedure TForm1.Family1-ptClick (Sender: TObject); begin IF Form3.ShowModal = mrCancel THEN Exit; Form1.Table1.IndexName := ‘FamilyIndex’; Form1.Table1.SetKey; Form1.Table1.FieldByName(‘Family’).AsString := Form3.Edit1.Text; Form1.Table1.GotoNearest; end; Данный код заставляет всплыть диалог поиска (Form3) в модальном режиме (метод ShowModal). Данный режим предполагает, что все сообщения, поступающие в программу в случае открытого модального окна, обрабатываются только этим окном. Если пользователь выбирает кнопку ОК, то осуществляется поиск введенной строки. Если же выбирается кнопка Отмена, то происходит отказ от выбранного действия, т.е. выход из подпрограммы. Далее устанавливается вторичный индекс по полю, в котором будет происходить поиск. После этого таблица устанавливается в режим
SetKey и потом таблице сообщается о поиске конкретной строки в поле Family. В заключение вызывается GotoNearest и таблица подводится как можно ближе к разыскиваемой записи, т.е. имеется возможность выполнять частичные поиски, можно использовать неполное или неточное написание фамилии. 10. Для обеспечения работы с пунктом меню «По дате рождения» необходимо проделать действия, аналогичные выполненным. Обработчик события OnClick будет иметь следующий вид: procedure TForm1.Date-ptClick (Sender: TObject); begin IF Form4.ShowModal = mrCancel THEN Exit; Form1.Table1.IndexName := ‘BirthdayIndex’; Form1.Table1.SetKey; Form1.Table1.FieldByName(’Birthday’).AsString := Form4.Edit1.Text; Form1.Table1.GotoNearest; end; 11. Активизируем теперь пункт меню По номеру подменю Сортировка и в появившемся обработчике события OnClick введем следующие строки: procedure TForm1.Number-ptClick (Sender: TObject); begin Form1.Table1.IndexName := ‘Number’; Form1.Table1.SetKey; Form1.Table1.GotoNearest; end; 12. Определим действия, выполняемые пунктом меню По фамилии подменю Сортировка, активизируя данный пункт меню и в появившемся обработчике события OnClick запишем следующий код: procedure TForm1.Family2-ptClick (Sender: TObject); begin Form1.Table1.IndexName := ‘FamilyIndex’; Form1.Table1.SetKey; Form1.Table1.FieldByName(‘Family’).AsString := ‘A’; Form1.Table1.GotoNearest; end; Во избежание возможности появления пустых записей в начале таблицы после сортировки по фамилии производится поиск записи, поле Family которой является ближайшим для согласования со строкой «A». 13. Запустим программу командой Run|Run и убедимся в правильности работы созданного меню. 14. Закроем приложение либо кнопкой Выход, либо командой главного меню Файл|Выход. 15. Сохраним все изменения в проекте.
Задание к лабораторной работе № 5 1. Используя приложение, созданное в лабораторной работе № 2, спроектируйте создайте главное меню, предоставляющее следующие возможности (состав и структуру меню и его подменю определить самостоятельно): 1. Завершение работы. 2. Печать отчета, созданного в лабораторной работе № 3, (можно использовать любой из созданных отчетов). А также: Вариант 1. 1. Поиск поставщика по фамилии. 2. Поиск детали по номеру 3. Сортировка записей по фамилиям поставщика. 4. Сортировка по номерам деталей. 5. Вывод списка деталей одного и того же цвета (цвет задается пользователем). 6. Вывод списка деталей одного и того же веса (вес задается пользователем). Вариант 2. 1. Поиск участника по фамилии. 2. Поиск участника по фамилии тренера. 3. Поиск участника по городу. 4. Сортировка по городам. 5. Сортировка по фамилиям участников. 6. Вывод списка участников, приехавших из одного города (название города задается пользователем). Вариант 3. 1. Поиск студента по фамилии. 2. Сортировка по номерам групп. 3. Сортировка по фамилиям студентов. 4. Вывод списка заданий по одной и той же дисциплине (дисциплина задается пользователем). 5. Вывод списка студентов с максимальным суммарным баллом. 6. Вывод списка студентов с их данными, выполнившими хотя бы одно задание. Вариант 4. 1. Поиск по должности. 2. Поиск по фамилии. 3. Поиск по дате поступления на работу. 4. Сортировка по названиям должностей. 5. Сортировка по стажу работника. 6. Вывод максимальной заработной платы. Вариант 5. 1. Поиск по фамилии. 2. Поиск по типу изделия.
3. Сортировка по названиям цехов. 4. Сортировка по типам изделий. 5. Вывод фамилии рабочего, изготовившего за неделю наибольшее количество деталей. 6. Вывод списка изделий, имеющих одну и ту же стоимость (стоимость задается пользователем). Вариант 6. 1. Поиск изделий по категориям. 2. Поиск по фамилии. 3. Сортировка по названиям цехов. 4. Сортировка по фамилиям. 5. Вывод списка рабочих из одного и того же цеха (название цеха задается пользователем). 6. Вывод фамилии рабочего, собравшего наибольшее количество изделий по всем категориям. Вариант 7. 1. Поиск телефона по номеру. 2. Поиск по фамилии. 3. Сортировка по годам установки телефонов. 4. Сортировка по номерам телефонов. 5. Вывод списка абонентов, имеющих спаренный телефон. 6. Вывод списка льготных номеров телефонов и их владельцев. Вариант 8. 1. Поиск игрушки по ее названию. 2. Поиск игрушки по названию фабрики. 3. Сортировка по цене игрушек. 4. Сортировка по количеству игрушек. 5. Вывод списка игрушек, сгруппированных по возрастным категориям, с данными об изготовителе. 6. Вывод названия самой дорогой игрушки. Вариант 9. 1. Поиск по фамилии. 2. Сортировка по индексу групп. 3. Сортировка по фамилиям. 4. Вывод списка студентов, имеющих собственную семью. 5. Вывод списка студентов, не сдавших сессию (более двух неудовлетворительных оценок). 6. Вывод списка студентов, обучающихся в одной и той же группе (группа задается пользователем). Вариант 10. 1. Поиск спортсмена по фамилии. 2. Поиск спортсмена по названиям стран. 3. Сортировка по фамилии спортсмена. 4. Сортировка по названиям стран. 5. Вывод списка спортсменов из одной страны (задается пользователем).
6. Вывод списка спортсменов, тренирующихся у одного тренера. Вариант 11. 1. Поиск рейса по пункту назначения. 2. Поиск рейса по количеству свободных мест. 3. Сортировка по номерам рейсов. 4. Сортировка по пунктам назначения. 5. Вывод номеров и времени вылета тех рейсов, у которых один и тот же пункт назначения (пункт назначения задается пользователем). 6. Вывод номеров рейсов, имеющих свободные места. Вариант 12. 1. Поиск обуви по названию. 2. Поиск обуви по размеру. 3. Поиск обуви по названию фабрики. 4. Сортировка по названиям обуви. 5. Сортировка по размерам обуви. 6. Вывод списка обуви (наименование и артикул), сгруппированной по размерам. Вариант 13. 1. Поиск по фамилии. 2. Поиск по дате приема в команду. 3. Сортировка по фамилиям. 4. Сортировка по количеству сыгранных матчей. 5. Вывод фамилии нападающего, сыгравшего максимальное количество матчей. 6. Вывод списка нападающих в одной и той же команде (название команды задается пользователем). Вариант 14. 1. Поиск по фамилии. 2. Поиск по номеру зачетной книжки. 3. Сортировка по фамилиям. 4. Сортировка по среднему баллу успеваемости. 5. Вывод списка студентов с их данными, обучающихся в одной и той же группе (группа задается пользователем). 6. Вывод списка студентов, проживающих в общежитии, с индексами их групп. Вариант 15. 1. Поиск по дате перечисления. 2. Поиск по названию организации-получателя. 3. Сортировка по дате перечисления. 4. Сортировка по видам затрат перечислений. 5. Вывод списка организаций-получателей с их адресами по заданному пользователем признаку (коммерческие или нет). 6. Вывод пункта с максимальной суммой перечислений. Вариант 16.
1. 2. 3. 4. 5. 6.
Поиск товара по именованию. Поиск по дате поступления. Поиск по № партии. Сортировка по названиям товаров. Сортировка по стоимости поступивших товаров. Вывод списка фирм-покупателей, купивших какой-либо товар (товар задается пользователем). Вариант 17. 1. Поиск лекарства по его наименованию. 2. Поиск лекарства по названию фабрики. 3. Сортировка по наименованиям лекарств. 4. Сортировка по дате изготовления. 5. Вывод списка лекарств, производимых на какой-либо фабрике. 6. Вывод самого дорогого лекарства. Вариант 18. 1. Поиск по фамилии. 2. Сортировка по фамилиям. 3. Сортировка по возрастным группам. 4. Вывод списка ветеранов спорта из одного и того же города с данными о них (название города задается пользователем). 5. Вывод списка спортсменов, сгруппированных по виду спорта. 6. Вывод списка гостиниц. Вариант 19. 1. Поиск по фамилии матери. 2. Поиск по дате рождения ребенка. 3. Сортировка по фамилиям матерей. 4. Сортировка по датам рождения. 5. Вывод списка детей с весом выше некоторой величины (пороговый вес задается пользователем). 6. Вывод списка рожениц, лежащих в одной и той же палате, с указанием даты рождения ребенка и ФИО лечащего врача (номер палаты задается пользователем). Вариант 20. 1. Поиск слушателя по фамилии. 2. Поиск по должности слушателя. 3. Сортировка по фамилиям слушателей. 4. Сортировка по наименованиям организаций, а внутри по фамилиям слушателей. 5. Вывод списка слушателей (ФИО, должность, оценки по всем предметам). 6. Вывод списка слушателей из одной и той же организации (название организации задается пользователем). Вариант 21. 1. Поиск студента по его фамилии.
2. 3. 4. 5.
Сортировка по фамилиям студентов. Сортировка по размеру стипендии Сортировка по группам. Вывод списка дисциплин с указанием ФИО преподавателя и даты экзамена. 6. Вывод списка студентов, не получающих стипендию. Вариант 22. 1. Поиск больного по фамилии. 2. Поиск больного по дате поступления. 3. Сортировка по фамилиям больных. 4. Сортировка по степени тяжести состояния больных. 5. Вывод списка врачей с указанием палаты. 6. Вывод списка больных из одной и той же палаты (номер палаты задается пользователем). Вариант 23. 1. Поиск по фамилии. 2. Поиск по дате прохождения медкомиссии. 3. Сортировка по фамилиям. 4. Сортировка по году рождения. 5. Вывод списка призывников одного года рождения (год задается пользователем). 6. Вывод списка призывников, не пригодных к службе. Вариант 24. 1. Поиск изделия по виду. 2. Поиск изделия по пробе. 3. Сортировка по видам изделий. 4. Сортировка по стоимости изделий. 5. Вывод самого дорогого изделия. 6. Вывод списка изделий одного и того же мастера с указанием веса, пробы и стоимости изделия (фамилия мастера задается пользователем).
Лабораторная работа № 6 Создание справочной системы Практически все серьезные программы в настоящее время обладают справочной системой, позволяющей в любой момент получить информацию о том или ином элементе программы. Процесс формирования справочной системы программы состоит из следующих этапов: • планирования справочной системы; • создания текстового файла в формате RTF (Rich Text Format); • создания содержания справочной системы (при необходимости);
• создания файла описания проекта; • компиляции файла справочной системы; • подключения справочной системы к приложению, определение контекстно-зависимой подсказки. Поиск и выбор статей справочной системы программы, их отображение обеспечивают стандартные средства Windows 95, реализованные в программе Winhlp32 в файле Winhlp32.exe. Перед началом создания файлов со справочной информацией необходимо продумать вопрос, как должна быть организованна справочная система. Пример 1. Создание текстового файла для справочной системы приложения, работающего с БД «Телефонная книжка» В качестве инструмента будем использовать текстовый редактор Word for Windows 95. 1. Проверим, будет ли скрытый текст отображаться на этапе набора текста. Для этого нужно задать команду меню Tools|Options (Сервис|Параметры), после чего в окне Options (Параметры) выбрать закладку View (Вид) и в открывшейся странице у группы Nonprinting Characters (Непечатаемые символы) установить выключатель HiddenText (Скрытый текст). После чего нажать кнопку ОК. 2. Наберем текст раздела справочной системы, посвященный общему описанию назначения, состава и возможностей электронной телефонной записной книжки: Назначение, состав и возможности электронной записной книжки Данная телефонная записная книжка предназначена для хранения информации о людях: ФИО, дата рождения, пол, номера имеющихся у них телефонов; а также для удобной работы с этой информацией. При запуске программы появляется основное окно MainWin (главная форма) с именем «Информация о людях», большую часть которой занимают элементы отображения информации из БДView. Различные возможности по работе с информацией предоставляют навигаторыNavigator и менюMenu. В конце текста следует ввести дополнительный пустой абзац. Подчеркнутые двойной линией слова являются выделенными фрагментами, по которым осуществляется переход на другие разделы справочной системы. После компиляции они будут подчеркнуты сплошной линией. Подчеркнутые пунктирной линией слова – ссылки на другие разделы справочной системы, оформленные как скрытый текст. Выделим фрагменты текста с двойным подчеркиванием синим цветом, для чего в строке ввода со списком Color (Цвет) выберем синий цвет. Нажмем кнопку ОК. 3. Определим уникальный идентификатор раздела. Для этого установим курсор перед первым словом раздела Назначение, и зададим команду меню Insert|Footnote (Вставка|Сноска). После этого в появившемся окне Footnote
and Endnote (Сноски) в группе Insert (Вставить сноску) установим переключатель Footnote (Обычную). Затем в группе Numbering (Нумерация) установим переключатель Custom Mark (Другая), в строке ввода рядом с ним введем символ # и нажмем кнопку ОК. В результате перед первым предложением строки появится изображение # в виде надстрочного индекса (оформление сноски), такой же символ появится внизу страницы. Внизу страницы рядом с символом сноски нужно ввести уникальный идентификатор раздела MainTopic. 4. Определим заголовок данного раздела, с которым он будет отображаться в окне результатов поиска. Для этого произведем те же действия, что и в п.2, за исключением того, что символ, помещаемый в строку ввода рядом с переключателем Custom Mark (Другая) в окне Footnote and Endnote (Сноски), - $, а текст внизу страницы рядом с символом сноски - Назначение, состав и возможности. 5. Определим ключевые слова для данного раздела, по которым можно будет его найти. Для этого произведем те же действия, что и в п.3, за исключением того, что символом сноски будет символ K (латинская), а текст внизу страницы рядом с символом сноски – о программе;назначение;состав;возможности. 6. Поместим созданный раздел на отдельную страницу. Для этого разместим курсор за последним словом в разделе и зададим команду меню Insert|Break (Вставка|Разрыв). Затем в появившемся окне выберем переключатель Page Break (Новую страницу) и нажмем кнопку ОК. 7. Наберем на новой странице текст справочной системы, посвященного описанию основного окна с именем «Информация о людях». Основное окно В данном окне производится большая часть работы с информацией из БД, и отображаются результаты всех операций и действий через элементы отображенияView. А имеющиеся элементы управления, такие как навигаторыNavigator и менюMenu, обеспечивают взаимодействие и работу с информацией о людях, хранящейся в БД, а также завершение работыClose с приложением. В конце текста следует ввести дополнительный пустой абзац. Оформление текста аналогично описанному в п.2. 8. Действуя аналогично пп.3-5, установим уникальный идентификатор раздела MainWin, заголовок раздела «Основное окно», ключевые слова – основное окно;главное окно;главная форма;основная форма;информация о людях. 9. Поместим созданный раздел на отдельную страницу, выполнив такие же действия, как в п.5. 10. Наберем текст раздела справочной системы, посвященного описанию элементов отображения информации в целом: Элементы отображения информации Вся информация, содержащаяся в записной книжке, разбита в БД на две таблицы: People.db – данные о человеке, Tel.db – данные о телефонах
человека, в результате чего для ее отображения используется два вида элементов: строки вводаEdit, и таблицаGrid. В конце текста следует ввести дополнительный пустой абзац. Оформление текста аналогично описанному в п.2. 11. Действуя аналогично пп.3-5, установим уникальный идентификатор раздела View, заголовок раздела Элементы отображения информации, ключевые слова – элементы отображения информации;строки ввода;таблица. 12. Поместим созданный раздел на отдельную страницу, выполнив такие же действия, как в п.6. 13. Наберем текст раздела справочной системы, посвященный описанию строк ввода: Строки ввода Данные элементы отображенияView предназначены для ввода/вывода и редактирования данных о человеке Имеются следующие строки ввода: Строка ввода порядкового номера: информация данного типа отображается в виде: Порядковый номер: 012; а вводится в виде: 12. Строка ввода фамилии: информация данного типа отображается в виде строки, состоящей из символов латинского или русского алфавита и начинающейся с заглавной буквы; ввод фамилии производится в таком же формате. Строка ввода имени: аналогична строке ввода фамилии. Строка ввода отчества: аналогична строке ввода фамилии. Строка ввода даты рождения: информация данного типа отображается в следующем виде: 15 Апрель 1979 г.; а ввод данных производится в формате: 15.04.1979 или 15.04.79. Комбинированная строка ввода пола: для ввода информации данного типа используется выпадающий список допустимых значений. Строка ввода комментариев: используется для ввода/вывода дополнительной информации в виде строки достаточно большой длины. Строки ввода фамилии и даты рождения используются также при поиске по фамилииSeekFamily и при поиске по дате рожденияSeekDate для ввода искомого значения. В конце текста следует ввести дополнительный пустой абзац. Оформление текста аналогично п.2. 14. Действуя аналогично пп.3-5, установим уникальный идентификатор раздела Edit, заголовок раздела «Строки ввода», ключевые слова – строки ввода;поиск;отображение информации;элементы отображения. Дополнительно определим номер в последовательности просмотра разделов, описывающих элементы отображения информации. Для этого произведем такие же действия, которые описаны в п.3, за исключением того, что символ, помещаемый в строке ввода рядом с переключателем Custom Mark (Другая) в окне Footnote and Endnote (Сноски), -«+», а текст в нижнем окне рядом с текстом сноски View:005.
15. Поместим созданный раздел на отдельную страницу, выполнив такие же действия, как в п.6. 16. Наберем текст раздела справочной системы, описывающий таблицу: Таблица. Данный элемент отображенияView предназначен для ввода/вывода и редактирования данных о телефонах человека. Таблица состоит из двух столбцов: Номер и Тип. Номер отображается и вводится в виде 232-00-00. Тип телефона вводится при помощи выпадающего списка допустимых значений. В конце текста следует ввести дополнительный пустой абзац. Оформление текста аналогично описанному в п.2. 17. Действуя по аналогии, установим уникальный идентификатор раздела – Grid, заголовок раздела Таблица, ключевые слова – таблица;отображение информации;элементы отображения, номер в последовательности просмотра View:010. 18. Поместим созданный раздел на отдельную страницу, выполнив те же действия, что и в п.6. 19. Составим и оформим раздел справочной системы, описывающий навигаторы, присвоив ему уникальный идентификатор Navigator, заголовок раздела Навигаторы, ключевые слова – элементы управления;навигатор;навигаторы. Этот раздел содержит следующий текст: Навигаторы. В основном окнеMainWin расположены два навигатора, каждый из которых включает в себя следующие кнопки (слева на право, по порядку): First record - переход к первой записи; Prior record - переход к предыдущей записи; Next record - переход к следующей записи; Last record - переход к последней записи; Insert record - вставить новую запись; Delete record - удалить текущую запись; Edit record - редактировать текущую запись; Post edit - сохранить изменения в текущей записи; Cancel edit - отменить изменения в текущей записи; Refresh data - обновление данных в текущей записи. При помощи четырех левых кнопок верхнего навигатора осуществляется навигация по всем имеющимся в записной книжке записям. Осуществить те же операции при помощи нижнего навигатора невозможно. Для того чтобы вставить новую запись, необходимо нажать кнопку плюс на панели верхнего навигатора, внести необходимую информацию в строки вводаEdit и нажать кнопку сохранения того же навигатора. Только после этого осуществляется ввод телефонов для этого же человека при помощи нижнего навигатора аналогичным образом. Все остальные операции имеют тот же принцип действия: сначала идет работа с данными конкретного человека при помощи верхнего навигатора,
затем выполняются различные операции с информацией о телефонах того же человека при помощи нижнего навигатора. 20. Составим и оформим раздел справочной системы, описывающий меню, присвоив ему уникальный идентификатор Menu, заголовок раздела – Меню, ключевые слова – элементы управления;меню. Этот раздел содержит следующий текст: Меню. Меню располагается в верхней части основного окнаMainWin, непосредственно под его названием. Оно включает в себя следующие пункты: ФайлFile. ПоискSeek для поиска информации. СортировкаSort для сортировки и упорядочивания информации по определенному признаку. 21. Составим и оформим раздел справочной системы, описывающий завершение работы с программой, присвоив ему уникальный идентификатор Close, заголовок раздела – Завершение работы, ключевые слова – закрытие формы;кнопка. Раздел содержит следующий текст: Завершение работы Завершить работу с электронной записной книжкой можно двумя способами: нажав кнопку Выход в основном окнеMainWin программы или выбрав команду меню Файл|ВыходFile. 22. Составим и оформим раздел справочной системы, описывающий пункт меню Файл, присвоив ему уникальный идентификатор – File, заголовок раздела – Пункт меню «Файл», ключевые слова – меню;файл;пункт менюФайл;печать;выход, номер в последовательности просмотра – Menu:005. Раздел содержит следующий текст: Пункт меню «Файл». Данный пункт менюMenu содержит следующие подпункты: ПечатьPrint. ВыходClose. 23. Составим и оформим раздел справочной системы, описывающий подпункт меню «Печать», присвоив ему уникальный идентификатор – Print, заголовок раздела – Печать, ключевые слова – печать;меню;файл;пункт меню печать. Раздел содержит следующий текст: Печать. Имеющееся менюMenu предоставляет возможность печати списка телефонов и их владельцев. При выборе команды Файл|Печать появляется окно предварительного просмотра, основную часть которого занимает изображение отчета, содержащего заголовок, системные дату и время, номер страницы и список людей с указанием их телефонов. На верхней панели окна расположены следующие кнопки управления (слева направо): Zoom to fit – разместить страницу отчета полностью на экране;
Zoom to 100% - отобразить страницу отчета так же, как она будет напечатана; Zoom to page width – разместить страницу, чтобы максимально отобразить ее ширину на экране; First Page – отобразить первую страницу отчета; Previous Page – отобразить предыдущую страницу отчета; Next Page – отобразить следующую страницу отчета; Last Page – отобразить последнюю страницу отчета; Printer Setup – определить параметры принтера в стандартном окне; Print – напечатать отчет; Save – сохранить отчет в файле с расширением .qrp; Load – загрузить отчет из файла с расширением .qrp; Close – закрыть стандартную форму для предварительного просмотра. 24. Составим и оформим раздел справочной системы, описывающий пункт меню Поиск, присвоив ему уникальный идентификатор – Seek, заголовок раздела – Пункт меню «Поиск», ключевые слова – меню;поиск;пункт меню Поиск;поиск по фамилии;поиск по дате рождения, номер в последовательности просмотра – Menu:010. Раздел содержит следующий текст: Пункт меню «Поиск». Данный пункт менюMenu предоставляет возможность поиска необходимой информации по какому-либо признаку, в частности, по фамилии человекаSeekFamily и по дате рожденияSeekDate. 25. Составим и оформим раздел справочной системы, описывающий поиск по фамилии человека, присвоив ему уникальный идентификатор – SeekFamily, заголовок раздела – Поиск по фамилии, ключевые слова – меню;поиск;пункт меню Поиск;поиск по фамилии. Раздел содержит следующий текст: Поиск по фамилии человека. При выборе команды менюMenu Поиск|По фамилии появляется вспомогательное диалоговое окно с именем «Поиск по фамилии», в котором необходимо ввести искомую фамилию в имеющуюся в окне строку ввода. Причем фамилию можно ввести не полностью, в этом случае будет найдена запись, наиболее похожая на искомую. Допускается также неточный ввод значения. Результат поиска отображается в основном окнеMainWin через имеющиеся в нем средства отображенияView информации. Работа заканчивается при нажатии одной из кнопок управления: OKButtonOK или ОтменаButtonCancel. См. также Строки вводаEdit 26. Составим и оформим раздел справочной системы, описывающий поиск по дате рождения человека, присвоив ему уникальный идентификатор – SeekDate, заголовок раздела – Поиск по дате рождения, ключевые слова – меню;поиск;пункт меню Поиск;поиск по дате рождения, и который содержит следующий текст:
Поиск по дате рождения человека. При выборе команды менюMenu Поиск|По дате рождения появляется вспомогательное диалоговое окно с именем «Поиск по дате рождения», в котором необходимо ввести искомую дату рождения в имеющуюся в окне строку ввода. Результат поиска отображается в основном окнеMainWin через имеющиеся в нем средства отображенияView информации. Работа заканчивается при нажати одной из кнопок управления: OKButtonOK или ОтменаButtonCancel. См. также Строки вводаEdit. 27. Составим и оформим раздел справочной системы, описывающий кнопку OK, присвоив ему уникальный идентификатор – ButtonOK, заголовок раздела – Кнопка ОК, ключевые слова – меню;поиск;кнопки управления. Раздел содержит следующий текст: Кнопка OK. Данная кнопка используется для подтверждения начала поискаSeek. При ее нажатии диалоговое окно закрывается и осуществляется поиск по заданному признаку. 28. Составим и оформим раздел справочной системы, описывающий кнопку Отмена, присвоив ему уникальный идентификатор – ButtonCancel, заголовок раздела – Кнопка Отмена, ключевые слова – меню;поиск;кнопки управления. Раздел содержит следующий текст: Кнопка Отмена. Данная кнопка позволяет отменить операцию поискаSeek. При ее нажатии диалоговое окно закрывается, а поиск не производится. 29. Составим и оформим раздел справочной системы, описывающий пункт меню «Сортировка», присвоив ему уникальный идентификатор – Sort, заголовок раздела – Пункт меню Сортировка, ключевые слова – меню;сортировка;пункт меню Сортировка;сортировка по фамилиям;сортировка по номеру, номер в последовательности просмотра – Menu:020. Раздел содержит следующий текст: Пункт меню «Сортировка». Данный пункт менюMenu предоставляет возможность упорядочивания информации по какому-либо признаку, в частности, по номеру деталиSortNDetal и по фамилиямSortFamily людей в алфавитном порядке. 30. Составим и оформим раздел справочной системы, описывающий сортировку по номеру записи, присвоив ему уникальный идентификатор – SortNDetal, заголовок раздела – «Сортировка по номеру записи», ключевые слова – меню;сортировка;пункт меню Сортировка;сортировка по номеру. Раздел содержит следующий текст: Сортировка по номеру записи.
При выборе команды менюMenu Сортировка| По номеру осуществляется упорядочивание записей по номеру, что сразу же отображается в основном окнеMainWin приложения через средства отображенияView информации. 31. Составим и оформим раздел справочной системы, описывающий сортировку по фамилиям, присвоив ему уникальный идентификатор – SortFamily, заголовок раздела – «Сортировка по фамилиям», ключевые слова –меню;сортировка;пункт меню Сортировка;сортировка по фамилиям. Раздел содержит следующий текст: Сортировка по фамилиям. При выборе команды менюMenu Сортировка|По фамилии осуществляется упорядочивание записей по фамилиям в алфавитном порядке, что сразу же отображается в основном окнеMainWin приложения через средства отображенияView информации. 32. Сохраним созданный документ для дальнейшего использования при формировании справочного файла под именем Help.rtf. Пример 2. Создание содержания справочной системы для приложения, работающего с БД «Телефонная книжка» Создадим содержание справочной системы на основе существующего текстового файла. Инструментом для создания файла содержания справочной системы является утилита Microsoft Help Workshop. Она входит в состав пакета Delphi Standard 3.0 и содержит редактор файла описания проекта справочной системы. При установке пакета утилита помещается в папку …\Delphi 3\Help\Tools. Чтобы запустить ее, нужно запустить файл hcw.exe, находящийся в этой папке. 1. Откроем редактор содержания справочной системы и выполним команду меню File|New. В появившемся окне New выберем из списка действий значение Help Contents и нажмем кнопку ОК. После этого будет открыто главное окно редактора файла содержания справочной системы. 2. Зададим имя справочного файла, используемое по умолчанию. Для этого нажмем кнопку Edit в верхней части главного окна редактора файла содержания. В появившемся окне Default Help Information в строке ввода Default Help filename запишем путь и имя файла Help.hlp, после чего нажмем кнопку ОК. В главном окне редактора файла содержания в строке Default filename (and window) отобразится введенное значение. 3. Зададим заголовок, который будет у основного окна программы Winhlp32. Для этого снова нажмем кнопку Edit и в появившемся окне Default Help Information в строке ввода Default Title запишем текст – «Справочная система телефонной книжки», после чего нажмем кнопку ОК. В главном окне редактора файла содержания в строке Default title отобразится введенное значение. 4. Создадим элемент содержания – тему «О программе». Для этого нажмем кнопку Add Above. В появившемся окне Edit Contents Tab Entry выберем переключатель Heading. Затем введем в строку Title (она окажется
единственной доступной строкой ввода) текст «О программе» и нажмем кнопку ОК. 5. Создадим элемент содержания – раздел «Назначение, состав и возможности». Для этого нажмем кнопку Add Below. В появившемся окне Edit Contents Tab Entry выберем переключатель Topic. Затем введем в строку Title текст «Назначение, состав и возможности», в строку Topic ID – текст «MainTopic» и нажмем кнопку ОК. 6. Аналогично п.4 создадим элемент содержания – тему «Основные элементы программы». Отличием будет то, что в строке ввода Title нужно будет ввести текст «Основные элементы программы». 7. Аналогично п.4 создадим элемент содержания – тему «Элементы отображения информации». Отличием будет то, что мы сдвинем его вправо кнопкой Move Right, т.к. это будет следующей ступенью иерархии (более глубокий уровень). 8. Аналогично п.5 создадим элемент содержания – раздел «Строки ввода» (Topic ID = Edit), который будет принадлежать теме «Элементы отображения информации». 9. Аналогичным образом создадим элемент содержания – раздел «Таблица» этой же темы (Topic ID = Grid). 10. Создадим следующий элемент содержания – тема «Меню», которая будет того же уровня иерархии, что и тема «Элементы отображения информации», для этого после ее создания нажмем кнопку Move Left, чтобы приблизить этот элемент к вершине иерархии. 11. Создадим элементы содержания – разделы «Пункт меню Файл», «Пункт меню Поиск» и «Пункт меню Сортировка» с идентификаторами (Topic ID) File, Seek и Sort соответственно, причем они будут входить в тему Меню. 12. Создадим последовательно следующие разделы содержания – Навигаторы (Topic ID = Navigator) и Завершение работы (Topic ID = Close), которые будут входить в тему «Основные элементы программы», для чего воспользуемся кнопкой Move Left. 13. Сохраним файл содержания под именем Help.cnt. Пример 3.Создание файла описания проекта справочной системы приложения, работающего с БД «Телефонная книжка», и его компиляция Создаваемый справочный файл основывается на сформированном текстовом файле. Кроме него подключим к справочной системе содержание. Мы воспользуемся по возможности стандартными настройками, установленными для создания справочной системы, поэтому большая часть параметров в фале описания проекта останется неизменной. 1. Откроем редактор файла описания проекта. Для этого запустим утилиту Microsoft Help Workshop. Затем зададим команду меню File|New. В появившемся окне New нужно выбрать из списка действий значение Help Project и нажать кнопку ОК. В стандартном окне для сохранения файла выберем папку и введем имя Help (расширение .hpj). После этого будет
открыто главное окно редактора файла описания проекта справочной системы. В формируемом тексте описания проекта уже присутствую следующие строки: [Option] LCID=0x419 0x0 0x0 ;Russian REPORT=Yes Параметр LCID определяет язык сортировки, а параметр REPORT – вывод сообщений об ошибках в процессе компиляции справочного файла. 2. Определим текстовый файл в формате RTF, на основе которого будет создан справочный файл. Для этого требуется нажать кнопку Files главного окна редактора файла описания проекта и в окне Topic Files нажать кнопку Add, затем в стандартном окне открытия файла следует выбрать папку, а в ней выбрать файл Help.rtf и нажать кнопку Open. После этого в окне Topic Files появится значение \Help.rtf. Нажав кнопку ОК в окне Topic Files, закроем его и перейдем в главное окно редактора файла содержания проекта. Отметим, что в этом окне в тексте файла описания проекта появится секция [Files] с именем выбранного файла. 3. Определим файл с содержанием для включения его в создаваемую справочную систему. Для этого требуется нажать кнопку Options главного окна редактора файла описания проекта и в окне Options выбрать закладку Files. Заметим, что в строке Rich Text Format (RTF) files будет находится имя только что выбранного текстового файла в формате RTF. Долее следует нажать кнопку Browse рядом со строкой Contents file и в появившемся стандартном окне открытия файла выбрать папку, а в ней файл Help.cnt. Нажав кнопку Open, закроем его и перейдем в окно Options, где в строке ввода Contents file появится информация .\Help.cnt. Чтобы добавить выбранный файл содержания в файл описания проекта, нужно нажать кнопку ОК. В результате в основном окне редактора файла описания проекта в формируемом тексте появится значение в секции [Option]: CNT=.\Help.cnt. 4. Установим в соответствие идентификаторам разделов числовые значения. Для этого требуется нажать кнопку Map. В появившемся окне Map нужно нажать кнопку Add, а затем в окне Add Map Entry в строке Topic ID ввести MainTopic, в строке Mapped numbering value – 1. Затем следует нажать кнопку ОК. В результате в списке значений в окне Map появится строка MainTopic=1 При желании можно ввести комментарии в строке Comment окна Add Map Entry. Аналогично введем с помощью формы Add Map Entry соответствие числовых значений другим строковым идентификаторам, добавляя к формируемому списку соответствий новые (в строку Mapped numbering value вводятся № соответствующих страниц в *.rtf-файле). После задания всех соответствий нужно нажать кнопку ОК в окне Map. В результате в главном окне редактора файла описания проекта в
формируемом тексте появится секция [Map] с только что введенным содержимым. 5. Установим возможность использования последовательности просмотра при работе со справочной системой, т.е. отображение кнопок << и >>. Для этого нажмем кнопку Config в главном окне. В появившемся окне Configuration macros следует нажать кнопку Add и в окне Add Macro в строке ввода Macro ввести название макрокоманды BrowseButtons(), а затем нажать кнопку ОК. В окне Configuration macros нажать кнопку ОК. В результате в главном окне редактора файла описания проекта в формируемом тексте появится секция [Config] со следующим содержимым: BrowseButtons() 6. Установим шрифты, которые будут использоваться в справочной системе, для того, чтобы не возникла проблема с чтением справочной информации. Для этого нажмем кнопку Options в главном окне, затем выберем закладку Fonts (Шрифты). Определим набор символов шрифта в комбинированной строке Character Set (Множество символов) – RUSSIAN. Далее определим шрифт, используемый в основном окне программы Winhlp32, для чего нажмем кнопку Change (Изменить) напротив строки ввода Font in Winhelp Dialog Boxes (Шрифт окон Winhlp), затем в появившемся окне Font (Шрифт) в комбинированной строке Font выберем шрифт MS Sans Serif, в строке Point size (Размер в поинтах) определим размер шрифта – 8, а в комбинированной строке ввода Character Set выберем значение RUSSIAN и нажмем кнопку ОК. Теперь определим замену одного шрифта другим, для чего нажмем кнопку Add, находящуюся напротив списка Substitute these fonts in help topics (Заменит эти шрифты в справочных разделах). В появившемся окне Edit/Add font Mapping (Редактирование/Добавление шрифтов) группу Original Font (Исходный шрифт) оставим без изменений, т.е. будем заменять все типы шрифтов всех наборов символов, а в группе Replacement font (Заменяющий шрифт) в комбинированной строке Font выберем шрифт MS Sans Serif – стандартный шрифт Windows и нажмем кнопку ОК. Закроем окно Options кнопкой ОК. В результате в секции [Option] файла описания проекта появится строка: DEFFONT = MS Sans Serif, 8, 204 Еще в тексте файла описания проекта появится секция [Fonts], содержащая следующее: =MS Sans Serif 7. Чтобы откомпилировать полученный файл, следует нажать расположенную в нижней части главного окна кнопку Save and Compile. В результате окно утилиты Help Workshop минимизируется, а затем появится в первоначальном размере с результатами компиляции. Подключение к проекту созданного справочного файла. 1. Откроем проект, созданный в Лаб./раб. № 5, MyExampleDB7.dpr.
2. Откроем модуль MyExampleDB7.dpr. Для этого нужно задать команду главного меню Project|View Source. В появившемся окне текстового редактора в тексте программы после строки Application.Initialize; для подключения справочного файла к проекту требуется вставить строку Application.HelpFile := ‘<путь к файлу>\Help.hlp’; 3. С помощью инспектора объектов зададим свойству HelpContext (Контекстная помощь) формы значение 2. 4. В форме выделим строку ввода, отображающую значение поля из БД, DBEdit1 и с помощью инспектора объектов зададим свойству HelpContext значение 5. Аналогичным образом установим свойство HelpContext у всех компонент формы Form1 (значение должно быть равно идентификатору соответствующего раздела справочной системы) 6. Теперь перейдем к форме Form3 и установим ее свойство HelpContext в значение 12, а это же свойство находящихся на ней компонент Edit1, OKBtn и CancelBtn в значения 4, 14 и 15 соответственно. 7. Перейдем к форме Form4 и установим ее свойство HelpContext равным 13, а свойство HelpContext ее компонент Edit1, OKBtn и CancelBtn равным 4, 14 и 15 соответственно. 8. Перейдем снова к форме Form1 и поместим на нее, над кнопкой Выход, компоненту BitBtn со страницы Additional палитры компонент. Установим ее свойство Caption в значении Помощь. Далее установим ее свойство Kind в значении bkHelp, свойству DragCursor зададим значение crHelp, свойству Layout – blGlyphRight (рисунок будет находиться справа от текста на кнопке), свойству HelpContext – значение 1, чтобы при нажатии на эту кнопку появлялась помощь, а точнее – раздел «Назначение, состав и возможности». Сохраним все изменения в проекте.
Задание к лабораторной работе № 6 1. Спроектируйте и создайте справочную систему для приложения, созданного в лабораторной работе № 5. 2. Организуйте в этом же приложении краткие справки по всем интерфейсным элементам.
Список литературы 1.Матчо Дж. Delphi 2 : Руководство для профессионалов: Пер. с англ.- СПб.: ВVH-Сант-Петербург,1997.-784 с.
2.СкусновА.Л. Справочник по компонентам Delphi 3.-М.: Приор,1998.-288 с. 3. Культин Н.Б. Программирование в Турбо Pascal 7.0 и Delphi: (Учебник)-СПб.: ВVH-Сант-Петербург,1999.-234 с. 4 . Епанешников А. М., Епанешников В.А. Программирование в среде Delphi: Учебное пособие.-М.: Диалог МИФИ.,1997.- Ч4. Работа с базами данных. Организация справочной системы.-1998.-400 с. 5. Бобровский С.Н. Delphi 5: Учебный курс.-СПб: ДЕСС: Инфорком-Пресс,2000.-638 с. 6.Архангельский А.Я. 100 компонентов общего назначения библиотеки Delphi 5.-М.: БИНОМ,1999.-266 с. 7.Епанешников А. М., Епанешников В.А. Delphi5. Базы данных.-М: Диалог-МИФИ, 2000.-416 с.
Проектирование баз данных в среде DELPHI Компьютерный методический материал к лабораторным работам Составитель БЛЮДИНА Людмила Сергеевна Корректор Галушкина А.А. Подписано в печать Формат 60x84/16. Бумага писчая. Усл.печ.л.0,00. Уч.-изд.л.0,00. Тираж 50 экз. Заказ . Ульяновский государственный технический университет, 432027,Ульяновск,Сев.Венец,32. Типография УлГТУ,432027,Ульяновск,Сев.Венец,32.