- 20.11.2012
- 4670
- 90
Смотреть ещё
681
методическую разработку по информатике
Перейти в каталогВыбранный для просмотра документ MetodaDelphi.DOC
АНО УЦКТ «Цифровой мир»
Учебное пособие
«Разработка программ в среде Delphi 7»
Разработчик: Кузнецова Г.В.
Улан-Удэ, 2009
Содержание
Введение |
|
Раздел 1. Объектно- ориентированное программирование в среде Delphi…………... |
|
Тема 1. Главное и контекстное меню приложения. Краткие теоретические сведения………………………………………………………………………………… |
|
Лабораторная работа №1. Создание простейшего текстового редактора…….. |
|
Тема 2. Компоненты диалога среды визуального проектирования. Краткие теоретические сведения…………………………………………………………….. |
|
Лабораторная работа №2. Использование компонентов диалога среды визуального проектирования……………………………………………………………. |
|
Тема 3. Экранная среда и многодокументные приложения. Краткие теоретические сведения………………………………………………………………………... |
|
Лабораторная работа №3. Создание MDI-приложения «Текстовый редактор»…………………………………………………………………………………... |
|
Тема 4. Развитые элементы интерфейса. Панели инструментов. Краткие теоретические сведения……………………………………………………………… |
|
Лабораторная работа №4. Создание панели инструментов в приложении……. |
|
Тема 5. Способы оформления приложений. Краткие теоретические сведения. |
|
Лабораторная работа №5. Оформление приложения…………………………… |
|
Раздел 2. Базы данных……………………………………………………………………. |
|
Тема 1. Основы баз данных. Краткие теоретические сведения………………….. Лабораторная работа №1. Создание псевдонима БД. Создание таблицы баз данных и форм приложения……………………………………………………… Лабораторная работа №2. Создание простейшего приложения базы данных с использованием эксперта форм базы данных…………………………………… Тема 3. Фильтрация данных. Краткие теоретические сведения…………………. Лабораторная работа №3. Фильтрация данных в БД…………………………… Тема 4. Организация поиска в базе данных. Краткие теоретические сведения... Лабораторная работа №4. Организация поиска в БД……………………………. Тема 5. Создание простейшего отчета…………………………………………….. Лабораторная работа № 5. Создание простейшего отчета………………………
|
|
|
|
|
|
Введение
Учебное пособие разработано на основе государственных требований к минимуму содержания и уровню подготовки выпускников по специальности 080801 – Прикладная информатика (в информационной сфере).
Бурное развитие вычислительной техники, потребность в эффективных средствах разработки программного обеспечения привели к появлению систем программирования, ориентированных на так называемую «быструю разработку», среди которых можно выделить Borland Delphi и Мiсгosoft Visual Basic. В основе систем быстрой разработки (RAD-систем, Rapid Арр1icаtion Development — среда быстрой разработки приложений) лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть рутинной работы, оставляя программисту работу по конструированию диалоговых окон и функций обработки событий. Производительность программиста при использовании RAD -систем - фантастическая!
Delphi - это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi — строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.
Данное учебное пособие посвящено программированию в среде разработки Object Delphi 7. При изложении материала принят подход, в основу которого положен принцип соблюдения баланса между языком программирования, методами программирования и средой разработки.
В нем рассмотрена вся цепочка, весь процесс создания программы: от разработки диалогового окна и функций обработки событий до создания справочной системы.
Цель данного учебного пособия может быть сформулирована так: научить программировать в среде Delphi , т. е. создавать законченные программы различного назначения: от простых однооконных приложений до вполне профессиональных программ работы с базами данных.
Усвоение материала учебного пособия будет способствовать:
§ повышению общей эрудиции в области современных концепций и средств программирования;
§ формированию целостного представления о средствах автоматизации разработки программных продуктов;
§ умению самостоятельно ориентироваться в инструментальных средствах программирования;
§ развитию умения отбирать и осваивать новые информационные программные продукты;
Учебное пособие предназначено для студентов, чья информационная культура и программистская компетентность войдут органичными составными частями в структуру их будущей профессиональной деятельности.
Научиться программировать можно только программируя, решая конкретные задачи. При этом достигнутые в программировании успехи в значительной степени зависят от опыта. Поэтому, чтобы получить максимальную пользу от книги, вы должны работать с ней активно. Не занимайтесь просто чтением примеров, реализуйте их с помощью вашего компьютера. Не бойтесь экспериментировать — вносите изменения в программы. Чем больше вы сделаете самостоятельно, тем большему вы научитесь
Раздел 1. Объектно- ориентированное программирование в среде Delphi
Тема 1. Главное и контекстное меню приложения
|
Краткие теоретические сведения |
Большинство сложных программ обладают системой меню, которая предназначена для выбора различных путей выполнения приложения. Меню представляет собой набор команд, при выборе каждой из которых выполняются определенные программистом действия. В Delphi есть два компонента, используемые для создания меню: TMainMenu- главное меню и TPopupMenu - вспомогательное меню.
TMainMenu. Является
невизуальным компонентом. При выполнении программы будет видно только меню,
которое сгенерирует TMainMenu.
Обычно на форме достаточно одного главного меню и, соответственно, элемента TMainMenu. В этом
случае свойству Menu формы, на которой расположено TMainMenu,
автоматически присваивается имя данного компонента, т.е. значение его свойства Name.
Однако на одной форме возможно размещение нескольких компонентов TMainMenu с
различными разделами. Тогда свойству Menu формы присваивается имя одного
из них. А при выполнении программы это свойство можно изменять, преобразуя
соответствующим образом разделы главного меню приложения.
Наиболее важным свойством TMainMenu является свойство Items. Его заполнение производится с помощью окна Menu Designer (конструктора меню), которое можно вызвать тремя способами. Во-первых, щелкнув мышью два раза по компоненту TMainMenu. Во-вторых, нажав на кнопку, расположенную в правой части свойства Items в инспекторе объектов. Или нажать на элементе правую кнопку мыши и в контекстном меню выбрать команду Menu Designer. Результат любого из трех действий представлен на рис.1.1.
В этом окне
проектируется меню. Для создания разделов в конструкторе меню необходимо
выделить рамку, состоящую из точек, которая обозначает
место расположения нового раздела. Затем в Object Inspector в
свойстве Caption задать заголовок раздела
(например, Файл). После
чего щелкнуть мышью на этом разделе — автоматически появляется подменю этого раздела
(снизу) и следующий раздел (справа) , (см. рис.1.1).
Используя мышь можно менять расположение разделов (порядок их следования).
При работе в Menu Designer можно использовать его локальное меню (см. рис. 1.2).
Его пункты выполняют следующие действия:
Insert — вставляет новый пункт меню;
Delete- удаляет активный пункт меню;
Create SubMenu- создает подменю для активного пункта меню;
Select Menu- открывает окно с расположенным в нем списком всех созданных в форме меню. Выбранное в этом окне меню открывается для редактирования;
Save As Templates- сохраняет меню в качестве шаблона;
Insert From Templates- добавляет меню из окна шаблона;
Delete Templates — удаляет шаблон из окна шаблона меню;
Insert From Resource- открывает диалоговое окно добавления меню из ресурсов.
Каждый элемент свойства Items, которым является любой раздел, — это объект класса TMenuItem со своими свойствами, методами и событиями. Основные свойства класса TMenuItem описаны в табл. 1.1.
Таблица 1.1. Свойства класса TMenuItem
Название |
Описание |
Bitmap |
Указывает на изображение, которое будет размещено слева от подменю разделов (если есть изображение и не установлено свойство ImageIndex) |
Break |
Предоставляет возможность разбивать подменю на столбцы (mbNone - отсутствие разбиения, mbBarBreak — вводится новый столбец, отделенный полосой, mbBreak — столбец, отделенный пробелами) |
Caption |
Содержит текст меню |
Cheked |
Размещает рядом с элементом маркер флажка (при Тгuе) |
Command |
Используется при разработке программ, обращающихся непосредственно к АРI- командам. Только для чтения. |
Count |
Содержит количество элементов, содержащихся в свойстве Items. Используется только для чтения |
Default |
Определяет опцию по умолчанию (значение Тгuе). Такая опция выделяется цветом и выбирается двойным щелчком на родительской опции. В подменю может быть только одна умалчиваемая опция |
GroupIndex |
Задает номер группы для зависимых опций, определяемых в RadioItem. |
ImageIndex |
Связывает изображение из компонента TListImage с опцией и присваивает значению свойства его индекс. Изображение появляется слева от опции, если свойство не равно -1. |
Items |
Позволяет обращаться к опции подчиненного меню по ее номеру. |
MenuIndex |
Вычисляет номер опции в родительском свойстве Items |
Name |
Предоставляет возможность задавать имя объекта, соответствующего разделу меню. |
RadioItem |
Делает
помеченным этот элемент из всех, у |
ShortCut |
Предлагает установить код клавиши быстрого реагирования. |
TPopupMenu. Этот компонент используется для создания локального (контекстного) меню. В отличие от главного меню, которое постоянно находится на экране, локальное меню выводится по мере необходимости. Для того чтобы вспомогательное меню компонента появилось на экране, необходимо установить фокус на этот компонент и нажать правую кнопку мыши. В локальнёе меню включаются команды, которые требуются при работе с компонентом в первую очередь. Как правило, такое меню является одноуровневым, хотя это не обязательно.
Большинство оконных компонентов (рамки, редакторы текста и т.д.) содержат свойство TPopupMenu, которое по умолчанию не заполнено. Посредством этого свойства и производится связывание компонента с локальным меню. В свойстве записывается имя соответствующего вспомогательного меню. Для создания локального меню необходимо поместить компонент TPopupMenu на форму и, два раза кликнув по нему мышью, вызвать конструктор меню. Теперь можно создавать меню. Пункты локального меню будут добавляться только по вертикали. При разработке вспомогательного меню в Menu Designer также можно использовать его локальное меню (см. рис. 1.2).
Основным событием раздела меню является событие OnClick, возникающее после щелчка пользователя на разделе (т.е. выборе пункта меню). В обработчик этого события помещаются все действия, которые необходимо выполнять при выборе соответствующего пункта меню. Чтобы написать программный код в обработчик OnClick), необходимо либо в Menu Designer, либо в редакторе форм два раза щелкнуть мышью по соответствующему пункту меню и ввести код.
ЛАБОРАТОРНАЯ РАБОТА №1.
Создание простейшего текстового редактора
Цель: Научиться создавать главное и контекстное меню приложения.
Постановка задачи: В качестве примера приложения с использованием меню , написать программу, реализующую простейшие возможности текстового редактора, который работает с файлом memos.txt, находящимся в текущей папке.
Данное приложение работает следующим образом: при открытии приложения содержимое файла memos.txt записывается в компонент TRichEdit. Там с текстом, с помощью меню, могут производиться следующие действия — копирование фрагмента текста в буфер обмена, вставка текста из буфера, вырезание текста, выделение всего текста. Предоставляется возможность сохранять файл под тем же именем. Выход из программы осуществляется по выбору меню Выход.
1. Поместите на форму необходимые для создания приложения компоненты. Описание элементов, используемых в приложении, приведено в таблице 1.2.
Таблица 1.2. Элементы примера и их измененные свойства
Элемент |
Свойство |
Значение |
Форма TForm |
Caption |
Простейший текстовый редактор |
Name |
Form1 |
|
Текстовый редактор TRichEdit (вкладка WIN32) |
Name |
RichEdit1 |
Lines |
|
|
Align |
AlClient |
2. На форме также будет находиться меню MainMenu1, элементы которого приведены в таблице 1.3.
Таблица 1.3. Элементы управления меню MainMenu1
Название (Name) |
Свойство |
Значение |
mFile |
Caption |
Файл |
mFileSave |
Caption |
Сохранить |
mEdit |
Caption |
Правка |
mEditCopy |
Caption |
Копировать |
mEditPaste |
Caption |
Вставить |
mEditCut |
Caption |
Вырезать |
mEditSelectAll |
Caption |
Выделить все |
mExit |
Caption |
Выход |
3. Поместите на форму компонент всплывающее меню – PopupMenu1, которое должно появляться на работающем приложении при щелчке правой кнопкой мыши по форме. Это меню должно содержать пункты Сохранить, Копировать, Вставить, Вырезать, Выделить все с назначенными им клавишными эквивалентами для быстрого выполнения пунктов меню (для этого используйте свойство ShortCut).
4. Для того, чтобы форма могла использовать объект PopupMenu1, определите значение свойства PopupMenu1 для формы.
5. Запустите приложение и проверьте его работоспособность.
6. Поместите на форму объект RichEdit1, измените его размер и выровняйте визуальные компоненты, расположенные на форме, используя в главном меню Delphi Edit®Align.
7. Уберите у свойства Lines объекта RichEdit1 его значение. Установите вертикальную и горизонтальную полосы прокрутки, используя свойство ScrollBar объекта RichEdit1.
8. Для создания
обработчика события, заключающегося в выборе пункта Сохранить в главном
меню, в процедуру обработки события OnClick объекта mFileSave главного меню введите следующий оператор:
RichEdit1.Lines.SaveToFile(‘memos.txt’);
9. Для создания обработчика событий, поступающего от всплывающего меню, для объекта Сохранить определите значение события OnClick, выбрав из раскрывающегося списка значение mFileSaveClick, которое использовалось для объекта mFileSave главного меню. Таким образом, события для разных объектов будут совместно использовать один обработчик события.
10. При запуске приложения либо создаётся новый пустой файл memos.txt, если он отсутствует в текущей папке (пустое значение свойства Lines объекта RichEdit1 записывается в файл), либо файл memos.txt загружается из текущей папки в окно объекта RichEdit1, если файл уже существует. Поэтому, в процедуру обработки события OnActivate формы введите следующий оператор:
if FileExists('memos.txt') then RichEdit1.Lines.LoadFromFile('memos.txt')
else RichEdit1.Lines.SaveToFile('memos.txt');
11. Для того, чтобы курсор установился в окно редактора, необходимо после загрузки файла memos.txt в окно редактора RichEdit1 установить значение свойства ActiveControl равным RichEdit1. Поэтому, в процедуру обработки события OnActivate формы добавьте следующий оператор: Form1.ActiveControl:= RichEdit1;
12. При закрытии приложения текст из окна RichEdit1 необходимо сохранить в файле memos.txt. Для этого, в процедуру обработки события OnClose формы вставьте строку: RichEdit1.Lines.SaveToFile('memos.txt');
13. Пункты меню Правка выполняют стандартные для редакторов действия:
Копировать- RichEdit1.CopyToClipboard;
Вставить- RichEdit1.PasteFromClipboard; RichEdit1.SetFocus;
Вырезать- RichEdit1.CutToClipboard;
Выделить все- RichEdit1.SelectAll;
14. Выход из приложения осуществляется по выбору меню Выход: Form1.Close;
15. Свяжите пункты контекстного меню с соответствующими пунктами главного меню.
16. Подберите и установите значки (иконки) в главное и контекстное меню программы.
17. Запустите приложение и проверьте его работу.
|
Вопросы для самоконтроля |
1. Какой компонент используется для создания главного меню?
2. Какой компонент используется для создания контекстного меню?
3. В чем заключается отличие главного и контекстного меню?
4. Как связать пункты главного и контекстного меню?
5. Как установить иконку (значок) в меню?
6. По какому событию генерируется процедура обработки пункта меню?
Тема 2. Компоненты диалога среды визуального проектирования
|
Краткие теоретические сведения |
Компоненты TOpenDialog и TSaveDialog невидимы во время выполнения программы, – окна диалога активизируются лишь при определенных событиях, задаваемых в проекте. Чаще всего это выбор команды меню или нажатие кнопки.
ТOpenDialog. Компонент OpenDialog класса TOpenDialog — это диалоговое окно выбора имени открываемого файла (см. рис. 2.1).
Ниже описаны основные свойства этого класса.
Таблица 2.1. Основные свойства класса T OpenDialog
Свойство |
Описание |
DefaultExt |
Свойство типа string[3]. С его помощью добавляется расширение к имени файла, если при ручном наборе пользователь его не указал. При этом к имени файла дописывается разделительная точка и содержимое свойства DefaultExt. |
FileName |
Содержит имя файла, указанное в строке Имя файла диалога. Содержит имя искомого файла. |
Files |
Содержит список имен выделенных файлов. Доступно только для чтения. |
Filter |
Используется для фильтрации файлов, отображаемых в диалоговом окне. Фильтр представляет собой любое количество пар последовательностей символов, разделенных вертикальной чертой “|“. Первая часть пары определяет текст, выводимый для данного фильтра в диалоговом окне, а вторая — сам фильтр. Вертикальная черта предназначена не только для отделения первой части фильтра от второй, но и для разделения фильтров друг от друга. К примеру, запись ‘Файлы ресурсов|*.геs’ означает, что в диалоге будет выведена информация ‘файлы ресурсов’, а на экране отобразятся файлы с расширением *.геs. Тип действующего фильтра или фильтров выводится в комбинированной строке Тип файлов. Задавать фильтры можно двумя способами: на этапе конструирования и во время работы программы. На этапе конструирования необходимо в Object Inspector выбрать свойство Filter, затем после открытия вспомогательного окна Filter Editor в столбце Filter Nаmе (Имя фильтра) указать текст фильтра, а в поле Filter (Фильтр) — сам фильтр. Из
программы фильтры задаются одной строкой: |
FilterIndex |
Содержит номер фильтра, используемого по умолчанию, при этом отсчет идет с 1 (чаще всего используется первый элемент). |
InitialDir |
Позволяет
установить начальный каталог поиска программно: |
Характеристики диалогового окна напрямую зависят от свойства Options. Значения этого свойства могут быть следующими:
Таблица 2.2. Значения свойства Options класса T OpenDialog
Значение |
Описание |
ofReadOnly |
Отображает переключатель только для чтения |
ofOverwritePrompt |
Запрашивает подтверждение на сохранение файла, если файл с таким именем уже имеется |
ofNoChangeDir |
Использует текущий каталог по умолчанию при любых открытиях диалога |
ofNoValidate |
Запрещает проверку ввода недопустимого имени файла |
ofCreatePrompt |
Запрашивает подтверждение на создание несуществующего файла |
Title |
Задает заголовок диалогового окна |
Из методов класса TOpenDialog следует отметить метод Ехесutе — размещает диалог на экране в модальном режиме.
SaveDialog. Компонент является потомком класса ТОреnDialog и предназначен для открытия диалогового окна сохранения файла. Наследует все характеристики ТОреnDialog. Диалог содержит те же элементы, что и окно на рис.2.1 с небольшими изменениями названий. Так, в заголовке окна — Сохранение файла вместо Открытие файла; кнопка Сохранить вместо Открыть. Строка с раскрытой папкой в этом диалоге носит название — Сохранить в.
ЛАБОРАТОРНАЯ РАБОТА №2.
Использование компонентов диалога среды визуального проектирования.
Цель: Научиться работать с компонентами диалога TOpenDialog и TSaveDialog.
Постановка задачи: Создание редактора, работающего с диалоговыми окнами открытия и сохранения файлов.
Данное приложение работает следующим образом: при открытии файла его содержимое записывается в компонент RichEdit1. Там с текстом, с помощью меню, могут производиться следующие действия — копирование фрагмента текста в буфер обмена, вставка текста из буфера, вырезание текста, выделение всего текста. Предоставляется возможность создавать новый файл, сохранять файл под тем же или другим именем. Выход из программы осуществляется по выбору меню Выход.
Описание элементов, используемых в приложении, приведено в таблице 2.3.
Таблица 2.3. Компоненты приложения и их измененные свойства
Элемент |
Свойство |
Значение |
Форма TForm |
Caption |
Простейший текстовый редактор |
Name |
Form1 |
|
Текстовый редактор TRichEdit |
Name |
RichEdit1 |
Lines |
|
|
Align |
AlClient |
|
Диалог открытия файлов TOpenDialog |
Name |
OpenDialog1 |
Filter |
Текстовые документы|*.txt |
|
Диалог сохранения файлов TSaveDialog |
Name |
SaveDialog1 |
Filter |
Текстовые документы|*.txt |
Задание 1. Модифицируйте ранее созданный текстовый редактор (см. лаб. раб. №1).
1. Модифицируйте главное меню приложения в соответствии с таблицей 2.4.
Таблица 2.4. Элементы управления главного меню
Название (Name) |
Свойство |
Значение |
mFile |
Caption |
Файл |
mFileNew |
Caption |
Создать |
mFileOpen |
Caption |
Открыть |
mFileSave |
Caption |
Сохранить |
mFileSaveAs |
Caption |
Сохранить как… |
mEdit |
Caption |
Правка |
mEditCopy |
Caption |
Копировать |
mEditPaste |
Caption |
Вставить |
mEditCut |
Caption |
Вырезать |
mEditSelectAll |
Caption |
Выделить все |
mExit |
Caption |
Выход |
2. Поместите на форму объекты OpenDialog1 и SaveDialog1, расположенные на закладке Dialogs палитры компонентов. Для объектов OpenDialog1 и SaveDialog1 определите свойства DefaultExt, Filter, FilterIndex, Title.
3. Объявите глобальную переменную FN типа String, в которой хранится имя открытого файла.
4. Для активизации объектов OpenDialog1 и SaveDialog1 используйте их метод Execute. Если пользователь закрывает диалоговое окно, щелкнув на кнопке OK, эта функция возвращает значение True.
Обработчик пункта меню Открыть выполняет следующее:
if OpenDialog1.Execute then
begin
FN:= OpenDialog1. FileName ;
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
Здесь в переменную FN заносится имя открытого файла и его текст помещается в редактор RichEdit1. Все это выполняется, если отрывается какой-либо файл.
5. При выборе
пункта Сохранить происходит сохранение содержимого редактора RichEdit1 в файл,
который был открыт с помощью меню Открыть.
if FN<>’’ then RichEdit1.Lines.SaveToFile(FN);
6. Используя меню Сохранить как… можно сохранить открытый файл под другим именем:
if SaveDialog1.Execute then
begin
FN:= SaveDialog1. FileName ;
RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
end;
При сохранении файла в диалоговом окне должно предлагаться имя, заданное при открытии файла.
7. Используйте метод Clear для очистки окна RichEdit1 при открытии нового файла.
8. Выход из приложения осуществляется по выбору меню Выход: Form1.Close;
Задание 2: Создание пункта Файл главного меню текстового редактора с возможностью добавлять имена файлов во вложенное динамическое меню пункта Последние, максимальный размер которого ограничен 4 пунктами.
1. Модифицируйте главное меню в соответствии с рис. 2.2:
Основные свойства и значения пунктов меню приведены в таблице 2.5.
Таблица 2.5. Элементы управления меню MainMenu1
Название (Name) |
Свойство |
Значение |
|
|
|
mFile |
Caption |
Файл |
|
|
|
mFileNew |
Caption |
Создать |
|
|
|
mFileOpen |
Caption |
Открыть |
|
|
|
mReopen |
Caption |
Последние |
Название |
Свойство |
Значение |
mFileSave |
Caption |
Сохранить |
mName0 |
Caption |
Файл 0 |
mFileSaveAs |
Caption |
Сохранить как |
mName1 |
Caption |
Файл 1 |
mFileClose |
Caption |
Закрыть |
mName2 |
Caption |
Файл 2 |
mCherta |
Caption |
- |
mName3 |
Caption |
Файл 3 |
mExit |
Caption |
Выход |
|
|
|
mEdit |
Caption |
Правка |
|
|
|
mEditCopy |
Caption |
Копировать |
|
|
|
mEditPaste |
Caption |
Вставить |
|
|
|
mEditCut |
Caption |
Вырезать |
|
|
|
mEditSelectAll |
Caption |
Выделить все |
|
|
|
mExit |
Caption |
Выход |
|
|
|
Для создания вложенного меню пункта Последние нажмите Ctrl+<→>.
2. Доступность пункта меню определяет значение свойства Enabled, для пунктов Последние, Сохранить, Сохранить как… Установите это свойство равным False. Эти пункты становятся доступными после выполнения команды Создать или Открыть. Все пункты для вложенного меню Последние невидимы (установите свойства Visible равным False) и заполнены фиктивными именами файлов.
3. Между пунктами меню Закрыть и Выход поставьте разделительную черту. Для этого свойству Caption присвойте значение ‘-‘ (минус).
4. Получить доступ к пунктам меню можно обращаясь к ним по именам, а также при помощи свойства Items компонента MainMenu1. Items – это объект класса TmenuItem, к нему можно обращаться как к массиву, причем индекс первого элемента массива равен 0. Например, File1.Items[3] определяет пункт Сохранить. Кроме того, каждый пункт меню также является объектом класса TmenuItem и, поэтому, так же обладает свойством Items, которое обеспечивает доступ к пунктам подменю. Например, File1.Items[3].Items[1] или Reopen1.Items[1] определяют пункт Name1. При работе с несколькими пунктами меню удобнее пользоваться свойством Items. Свойство Count объектов класса TmenuItem равно количеству элементов в массиве Items.
В обработчике события OnClick пункта меню Создать должно быть реализовано следующее:
§ Пункты меню Сохранить, Сохранить как…, Закрыть становятся доступны.
§ Если пункт Последние доступен (т.е. содержит список конкретных файлов), то убирается пометка с имени файла (свойство Checked пункта меню) в подменю Последние.
В обработчике события OnClick пункта меню Закрыть должно быть реализовано следующее:
§ Пункты меню Сохранить, Сохранить как…, Закрыть становятся недоступны.
§ Убирается пометка в списке имен ранее открывавшихся файлов.
Команда Открыть открывает диалоговое окно открытия файла и, в случае выбора файла, добавляет его в подменю Последние в качестве нулевого пункта и помечает этот пункт. При добавлении нового имени весь список имён смещается вниз. В обработчике события OnClick пункта меню Открыть должно быть реализовано следующее:
§ Открывается диалоговое окно открытия файла. Если пользователь выбрал файл для открытия, то выполняется следующее:
§ Пункты меню Сохранить, Сохранить как…, Закрыть становятся доступны.
Для пункта Последние необходимо:
§ Установить доступность.
5. Выполнить смещение в имеющемся списке имен файлов на одну позицию вниз с сохранением свойства Visible от предыдущего элемента. При смещении списка изменяется нумерация в названии пунктов меню. Для изменения этой нумерации используйте процедуру Delete из модуля System. (Внимание! У пунктов меню тоже имеется метод Delete).
В качестве нулевой строки вложенного меню установить подчеркнутую цифру 0, а за ней полное имя файла, полученное из диалогового окна. Свойство Visible этой строки установить равным True.
Убрать старую пометку в списке имен файлов и установить пометку в нулевой строке.
6. Добавьте в процедуру обработки ситуацию, когда открываемый файл уже имеется в списке (запомните его номер и при смещение вниз в списке имен не изменяйте пункты подменю Последние, следующие за этим номером). Для выделения из строки списка полного имени файла используйте процедуру Delete из модуля System.
В обработчике события OnClick пункта вложенного меню должно быть реализовано следующее:
Для пункта Последние необходимо:
§ Убрать старую пометку в списке имен файлов.
§ Поставить пометку на том имени файла, по которому щелкнули мышкой, рассматривая параметр Sender, передаваемый в обработчик, как представитель класса TmenuItem.
§ Открыть в окне редактора выбранный файл.
7. Дополните написанные обработчики событий, используя функцию function ExtractFileName(const FileName: string): string для выделения неполного имени файла, таким образом, чтобы на месте заголовка формы, кроме самого заголовка формы, отображалось ещё и неполное имя выбранного файла.
|
Вопросы для самоконтроля |
1. Для чего предназначен компонент TOpenDialog ?
2. Для чего предназначен компонент TSaveDialog ?
3. С помощью какого свойства компонента TOpenDialog добавляется расширение к имени файла, если при ручном наборе пользователь его не указал?
4. Какое свойство компонента TOpenDialog используется для фильтрации файлов, отображаемых в диалоговом окне?
5. Какое свойство компонента TOpenDialog задает заголовок диалогового окна?
6. Какое значение нужно установить в TRUE в свойстве Options компонента TSaveDialog для того, чтобы запрашивалось подтверждение на сохранение файла, если файл с таким именем уже имеется?
7. Для чего предназначен метод класса TOpenDialog – Ехесutе?
8. Назначение функции: function ExtractFileName(const FileName: string): string ; ?
Тема 3. Экранная среда и многодокументные приложения
|
Краткие теоретические сведения |
Для каждого нового приложения в Delphi автоматически создается объект экрана Screen типа ТScreen. Данный объект предназначен для работы с различной экранной информацией. Используя объект Screen, можно получить сведения о текущем состоянии экрана, а именно:
§ созданные формы и модули приложения;
§ активные формы и элементы управления;
§ размер и разрешение экрана;
§ курсоры и шрифты, доступные для использования приложением.
Свойства объекта Screen, так же, как и объекта Application, доступны только в момент выполнения приложения и недоступны при его проектировании.
Рассмотрим некоторые наиболее важные свойства данного объекта.
Таблица 3.1. Свойства объекта Screen
Свойство |
Описание |
ActiveForm (тип TForm) |
Используется для определения активной формы приложения. Оно доступно только для чтения и указывает форму, имеющую фокус ввода в текущий момент времени. |
Cursor (тип TCursor) |
Определяет форму указателя мыши для всего приложения. |
Fonts (тип TStrings) |
Доступное только для чтения, используется для работы со списком шрифтов, установленных в системе. |
FormCount (тип Integer) |
Определяет количество форм приложения (сюда включаются все созданные формы, независимо от того, видимы ли они в настоящий момент на экране или нет). |
Forms[Index:Integer] (тип TForm) |
Возвращает список форм приложения. Это свойство представляет собой массив форм, к которым можно обращаться по индексам Index. |
Heigth (тип Integer) |
Возвращает соответственно высоту экранной области в пикселях. |
Width (тип Integer) |
Возвращает ширину экранной области в пикселях. С помощью свойств Width и Heigth можно, например, определить установленное в данный момент разрешение монитора. |
Многодокументные приложения MDI. MDI расшифровывается как multiple document interface (многодокументный интерфейс). В приложениях с MDI, в основном (родительском) окне можно открыть более одного дочернего окна.
MDI-приложения требуют больше планирования при их создании и более комплексного подхода к проектированию, чем SDI-приложения (однодокументные приложения). В многодокументном приложении главное окно содержит дочерние окна, располагаемые в его пределах.
Организация многодокументных приложений не имеет принципиальных различий с созданием однодокументных приложений. Отличие MDI-приложений обусловлено рядом особенностей, связанных с взаимодействием главного и дочерних окон, а также с управлением открытыми дочерними окнами.
Родительская форма служит контейнером, содержащим дочерние формы, которые заключены в клиентскую область и могут перемещаться, изменять размеры, минимизироваться или максимизироваться только в пределах родительской формы. Чтобы задать тип формы при проектировании приложения, необходимо установить свойство FormStyle: для родительской формы равным FsMDIForm, а для дочерней формы — FsMDIChild. В приложении могут быть дочерние формы разных типов, например, одна — для обработки изображений, а другая - для работы с текстом. В MDI-приложении, как правило, требуется выводить несколько экземпляров классов формы. Поскольку каждая форма представляет собой объект, она должна быть создана перед использованием и выгружена из памяти, когда в ней больше не нуждаются. Delphi может делать это автоматически, а может предоставить эту работу программисту.
Существует ряд общепринятых правил оформления главного и дочерних окон. Они не обязательны, однако их следует учитывать при создании MDI-приложений. Так, в главном окне размещаются обычно только такие элементы управления, как меню, панели инструментов и строка состояния. Остальная клиентская область предназначается для размещения дочерних окон. Главное окно, как правило, не содержит кнопок, надписей или переключателей, потому что они будут видны сквозь дочерние формы. Со своей стороны, дочерние окна не имеют панелей инструментов и строки состояния. А в том случае, если дочерняя форма включает в себя меню, то при создании данной формы ее меню автоматически сливается с меню главной формы (при этом необходимо, чтобы свойство AutoMerge обоих меню имело значение False).
Следует упомянуть еще об одной особенности дочерних форм. При попытке закрытия дочерней формы путем нажатия кнопки закрытия в верхнем правом углу формы нажатием клавиш [Ctrl-F4] либо вызовом метода OnClose, она на самом деле будет не закрываться, а минимизироваться. Это объясняется тем, что по умолчанию для всех дочерних окон параметр Action имеет значение caMinimize. Чтобы избежать данного явления, необходимо создать собственный обработчик события OnClose для дочерней формы, в котором присвоить параметру Action значение саFrее.
Нельзя также закрывать дочернее окно с помощью метода Hide, так как это вызовет исключительную ситуацию.
Объект TForm имеет несколько свойств, специфичных для MDI-приложений.
Таблица 3. 2. Свойства объекта TForm
Свойство |
Описание |
ActiveMDIChild (тип ТForm) |
Возвращает дочёрний объект ТForm, имеющий в текущий момент времени фокус ввода. Оно полезно, когда родительская форма содержит панель инструментов или меню, команды которых распространяются на открытую дочернюю форму. |
MDIChildren [I:Integer] (тип ТForm) |
Является массивом, содержащим список созданных дочерних форм. Окна в данном массиве нумеруются, начиная с нуля, в зависимости от их текущего положения на экране. Нумерация изменяется после каждого переупорядочения окон. Обычно используется при выполнении какого-либо действия над всеми открытыми дочерними формами. |
MDIChildCount |
Возвращает количество элементов в массиве MDIChildren. Обычно используется при выполнении какого-либо действия над всеми открытыми дочерними формами. |
TileMode (тип ТTileMode)
|
Определяет, как родительская форма размещает дочерние при вызове метода Tile. Используются значения tbHorizontal (по умолчанию) и tbVertical для размещения форм по горизонтали и вертикали соответственно. |
WindowMenu |
Используется для того, чтобы обеспечить возможность пользователю активизировать необходимое дочернее окно, выбрав его из списка в меню. Свойство WindowMenu определяет объект ТMenuItem, который Delphi будет использовать для вывода списка доступных дочерних форм. Для вывода списка ТMenuItem должно быть меню верхнего уровня. Это меню имеет свойство Caption, равное sWindow. |
Ниже перечислены некоторые методы, специфичные для MDI-форм.
Таблица 3.3. Методы MDI-форм.
Метод |
Описание |
ArrangeIcons |
Выстраивает пиктограммы минимизированных дочерних форм в нижней части родительской формы. |
Next |
Обеспечивает переход к следующей по порядку дочерней форме. |
Previous |
Дает возможность передать фокус ввода предыдущей дочерней форме. |
Cascade |
Располагает дочерние формы каскадом, таким образом, что видны все их заголовки. |
Tile |
Выстраивает дочерние формы мозаикой, то есть так, что они не перекрываются. |
Для MDI-приложений свою особенность имеет событие OnActivate, которое генерируется двумя способами. Если приложение активно, то данное событие возникает для окна, которое получает фокус ввода при переключении между дочерними окнами. Если же приложение было неактивно, то событие OnActivate возникает для главной формы в момент ее активизации.
ЛАБОРАТОРНАЯ РАБОТА №3.
Создание MDI-приложения «Текстовый редактор»
Цель: Научиться создавать многодокументные приложения, изучить особенности, связанные с взаимодействием главных и дочерних окон, а также с управлением открытыми дочерними окнами.
Постановка задачи. Разработать простейшее многодокументное приложение, позволяющее создавать, открывать, просматривать, редактировать и сохранять текстовые файлы, а также размещать окна каскадом или мозаикой по выбору.
Задание 1. Создать родительскую и дочернюю формы приложения.
1. В начале проектирования данного приложения необходимо создать две формы: главную и дочернюю. Основные свойства этих форм, используемые в данном приложении, приведены в табл. 3.4.
Таблица 3.4. Основные свойства главной и дочерней форм приложения “Текстовый редактор”
Элемент |
Свойство |
Значение |
Главная форма |
Name |
MainForm |
FormStyle |
fsMDIForm |
|
Menu |
MainMenu1 |
|
WindowMenu |
Windows1 |
|
Дочерняя форма |
Name |
ChildForm |
FormStyle |
fsMDIChild |
Главную форму сохранить под именем Editor. Дочернюю форму сохранить под именем ChildText.
2. На главную форму поместите следующие элементы: TМаinМеnu, TOpenDialog и TSaveDialog. Список пунктов и подпунктов главного меню (TМаinМеnu) содержится в табл. 3.5.
Таблица 3.5. Список пунктов главного меню приложения “Текстовый редактор”
Название пункта (Сарtiоn) |
Имя пункта (Nаmе) |
Название подпункта (Сарtiоn) |
Имя подпункта (Nаmе) |
Файл |
File1 |
Новый |
New1 |
Открыть |
Open1 |
||
Сохранить |
Save1 |
||
Сохранить как… |
SaveAs1 |
||
Выход |
Exit1 |
||
Окно |
Windows1 |
Мозаика |
Title1 |
Каскад |
Cascade1 |
На дочернюю форму помещается элемент TMemo, для которого свойство Allign устанавливается в alClient.
Программный код, реализующий работу с многодокументным приложением, приведен в листинге 3.1.
Листинг 3.1. Программный код приложения «Текстовый редактор»
// файл проекта
program TextEditor;
uses
Forms,
Editor in 'Editor.pas' {MainForm},
ChildText in 'ChildText.pas' {ChildForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TChildForm, ChildForm);
Application.Run;
end.
//Модуль главной формы приложения
unit Editor;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Windows1: TMenuItem;
Open1: TMenuItem;
Save1: TMenuItem;
SaveAs1: TMenuItem;
Exit1: TMenuItem;
N6: TMenuItem;
Title1: TMenuItem;
Cascade1: TMenuItem;
New1: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure Title1Click(Sender: TObject);
procedure Cascade1Click(Sender: TObject);
procedure New1Click(Sender: TObject);
procedure Open1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure SaveAs1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var MainForm: TMainForm;
implementation
Uses ChildText;
{$R *.dfm}
// расположение дочерних окон мозаикой
procedure TMainForm.Title1Click(Sender: TObject);
begin
Tile;
end;
// расположение дочерних окон каскадом
procedure TMainForm.Cascade1Click(Sender: TObject);
begin
Cascade;
end;
//Создание нового документа
procedure TMainForm.New1Click(Sender: TObject);
var ChildForm:TChildForm;
begin
ChildForm:= TChildForm.create(self);
ChildForm.Name:='';
ChildForm.Caption:='Новый документ';
end;
//Открытие существующего текстового файла
procedure TMainForm.Open1Click(Sender: TObject);
var ChildForm:TChildForm;
begin
if OpenDialog1.Execute then
begin
ChildForm:=TChildForm.Create(self);
ChildForm.memo1.Lines.LoadFromFile(OpenDialog1.FileName);
ChildForm.filename:= OpenDialog1.filename;
ChildForm.Caption:= OpenDialog1.filename;
end;
end;
//Сохранение текстового файла
procedure TMainForm.Save1Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
begin
if FileName<>'' then begin
memo1.lines.SaveToFile(FileName);
memo1.Modified:=false;
exit;
end;
saveas1.Click;
end;
end;
//Сохранение текстового файла под новым именем
procedure TMainForm.SaveAs1Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
begin
if saveDialog1.Execute then begin
Filename:= saveDialog1.FileName;
caption:=FileName;
memo1.Lines.SaveToFile(FileName);
memo1.Modified:=false;
end;
end;
end;
// Закрытие формы
procedure TMainForm.Exit1Click(Sender: TObject);
begin
close;
end;
end.
//Модуль дочерней формы приложения
unit ChildText;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TChildForm = class(TForm)
Memo1: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Memo1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
filename:string; //переменная для хранения имени открытого файла
end;
var ChildForm: TChildForm;
implementation
uses Editor;
{$R *.dfm}
// Закрытие дочерней формы
procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree; // Выгрузка из памяти дочерней формы
end;
// Процедура обработки запроса на закрытие дочерней формы приложения. Здесь реали-
// зован запрос о необходимости сохранения закрываемого файла, если он был изменен
procedure TChildForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var RetValue :integer;
begin
if not Memo1.Modified then begin CanClose:=true; exit; end;
RetValue:=MessageDlg('Сохранить изменения?', mtConfirmation, mbYesNoCancel,0);
if RetValue=mrCancel then begin CanClose:=False; Exit; end;
if RetValue=mrNo then begin CanClose:=True; Exit; end;
MainForm.Save1.click;
end;
end.
Дополнительные задания
1. Добавьте в главное меню программы пункт Правка и реализуйте функции работы с текстом: Выделить все, Копировать, Вырезать, Вставить.
2. Поместите на форму компонент TPopupMenu и обеспечьте его работоспособность.
3. Пунктам контекстного меню назначьте соответствующие горячие клавиши и значки (иконки).
|
Вопросы для самоконтроля |
1. Что такое MDI приложение?
2. Какая форма называется родительской?
3. Какая форма называется дочерней?
4. Перечислите методы, специфичные для MDI-форм.
5. Какую особенность имеет событие OnActivate для MDI-приложений?
Тема 4. Развитые элементы интерфейса. Панели инструментов
|
Краткие теоретические сведения |
Панель инструментов — это сложный элемент управления, обычно содержащий набор кнопок быстрого доступа TSpeedButton или TToolButton и комбинированных списков TСотbоBох, хотя могут быть также добавлены и другие компоненты, например, однострочный редактор Edit. Панели инструментов служат для упрощения вызова часто используемых команд. Если в приложении есть главное меню TМainМепи, то элементы панели инструментов, как правило, дублируют действия пунктов этого меню, вызывая соответствующие обработчики событий OnClick.
На кнопках, расположенных на панели инструментов, размещаются пиктограммы или надписи, поясняющие назначение каждой кнопки.
Панели инструментов используются практически во всех современных программных продуктах, а многие программы содержат несколько таких панелей.
На рис. 4.1 показано, как выглядит одна из панелей инструментов среды разработки Delphi.
Панели инструментов бывают двух видов: статические, которые не могут изменять свое расположение на форме, и плавающие, которые можно перемещать в пределах окна.
В Delphi есть два специальных элемента для создания панелей инструментов — это компоненты TToolBar и TCoolBar. Они наиболее часто используются для этих целей, хотя существует возможность создавать панели инструментов с использованием компонента формы или компонента TРаnel.
TToolBar. Компонент TToolBar является контейнером, содержащим специальные кнопки TToolButton. Этот компонент позволяет управлять кнопками и другими элементами управления, компонуя их в ряд и автоматически регулируя их размеры и позиции. Он дает возможность легко управлять визуальными элементами управления, входящими в его состав.
Все кнопки TToolButton на панели инструментов TToolBar сохраняют постоянную ширину и высоту.
Другие элементы управления тоже могут быть помещены на панель инструментов. Эти элементы управления (которые располагаются поверх невидимых кнопок TToolButton) сохраняют постоянной только высоту. Элементы управления могут автоматически переноситься на новую строку, когда они не помещаются горизонтально на панели инструментов.
Свойство Flat позволяет видеть фон сквозь панель инструментов и делает рамки кнопок невидимыми (всплывающими при наведении на них указателя мыши).
Пробелы и разделители (которые являются, фактически, особым образом сконфигурированными кнопками) могут группировать элементы на панели инструментов как визуально, так и функционально.
Для того чтобы на этапе разработки приложения добавить новую кнопку на панель инструментов, необходимо на компоненте TToolBar нажать правую кнопку мыши и в открывшемся контекстном меню выбрать пункт New Button. При этом на панели появится новая кнопка. Все кнопки будут автоматически выстраиваться вплотную одна за другой. Чтобы разбить кнопки на группы, необходимо вставить разделитель с помощью пункта New Separator контекстного меню.
Отдельные кнопки и другие элементы можно перемещать в пределах панели инструментов путем перетаскивания их с помощью мыши, после чего все элементы снова автоматически выравниваются. При изменении размеров любого элемента панели инструментов остальные элементы также изменяют свой размер.
На этапе проектирования с каждой отдельной кнопкой панели инструментов можно работать, используя Инспектор объектов.
Свойства объекта TToolButton приведены ниже.
Таблица 4.1. Основные свойства объекта TToolButton
Свойство |
Описание |
Style (тип ТТооIButtonStyle) |
Определяет вид кнопки и может принимать одно из значений: tbsButton — кнопка выглядит и работает как обычная кнопка; tbsCheck — кнопка работает как переключатель; tbsDropDown— кнопка содержит стрелку, направленную вниз. При ее нажатии раскрывается заранее подготовленное меню типа ТPopupMenu, ссылка на которое задается значением свойства DropDownMenu; tbsSeparator - разделитель (в панели отображается пустое место для визуального разделения групп и отдельных элементов); tbsDivider- разделитель (выглядит как вертикальная линия). |
Grouped (тип Boolean) |
Используется для объединения кнопок TToolButton в группу. По умолчанию имеет значение False для каждой кнопки, то есть все кнопки работают независимо друг от друга. Чтобы объединить кнопки в группу, необходимо отделить их от других кнопок разделителями типа tbsSeparator или tbsDivider. В качестве таких разделителей могут также выступать не кнопочные элементы, например TComboBox. Затем свойству Grouped для всех кнопок в выделенной группе устанавливается значение True, а свойству Style — значение tbsCheck. Теперь выбор одной из кнопок данной группы автоматически делает все остальные кнопки группы невыбранными, т.е. “отжатыми”. Для создания независимого переключателя необходимо также установить свойству Style кнопки значение tbsCheck, а свойству AllowAllUp- значение True. При этом свойство Grouped не учитывается. |
Marked (тип Boolean) |
Придает кнопке вид маркированной. Маркированная кнопка имеет затененную поверхность. |
Indeterminate (тип Boolean) |
Переводит кнопку в неопределенное состояние, которое показывает, что кнопка не может использоваться в конкретной ситуации, то есть она не может быть ни выбранной, ни невыбранной. Кнопка в неопределенном состоянии имеет серую поверхность. |
ImageIndex (тип Integer) |
Задает порядковый номер рисунка в списке (отсчет начинается с нуля). Этот рисунок будет помещен на поверхность кнопки. Рисунки являются изображениями в формате ВМР, как правило, размером 16х16. Они содержатся в списке TImаgеList, который должен быть заранее сформирован. В качестве основных рисунков для кнопок используются изображения, входящие в список TImаgеList, на который указывает свойство Imаgеs панели инструментов TToolBar. Если кнопка является переключателем и рисунок на ее поверхности в момент, когда она находится во включенном состоянии, должен отличаться от основного, то это изображение берется из другого списка TImаgеList, на который ссылается свойство HotImages панели инструментов. Заблокированные кнопки отображают рисунки из списка TImаgеList, ссылка на который содержится в свойстве DissableImage панели инструментов. В случае, если данное изображение отсутствует, на кнопке отображается основной рисунок более бледным цветом. |
MenuItem (тип TMenuItem ) |
Может указывать на соответствующий пункт меню в том случае, если кнопка дублирует данный пункт. При этом не требуется создавать обработчик события ОnСIiсk для такой кнопки, но обратной стороной использования данного свойства является то, что автоматически изменяются значения свойств Caption и ImageIndex. Свойство ImageIndex получает значение -1, то есть рисунок на поверхности кнопки не отображается, а свойство Caption становится равным одноименному свойству соответствующего пункта меню. Чтобы избежать таких изменений, требуется после установки значения свойству MenuItem повторно задать желаемые значения для свойств Caption и ImageIndex. |
Wrap (тип Boolean) |
Свойство, установленное в Тruе, разрешает автоматический перенос кнопки на новую строку, если она не умещается на панели инструментов. При этом необходимо, чтобы свойство Wrapable самой панели также имело значение Тruе. |
Теперь рассмотрим наиболее важные свойства панели инструментов TТооIВаr.
Таблица 4.2. Основные свойства панели инструментов TТооIВаr
Свойство |
Описание |
EdgeBorders (тип TEdgeBorders) |
Определяет наличие у панели инструментов рамок сверху, снизу, справа и слева. |
ShowCaptions (тип Boolean) |
Определяет, будет ли показываться заголовок панели инструментов. По умолчанию, это свойство имеет значение False. Таким образом, заголовок не будет отображаться, даже если значение свойства Caption не является пустой строкой. |
Flat (тип Boolean) |
Служит для того, чтобы сделать кнопки плоскими. Если данное свойство имеет значение Тruе, то рамки кнопки отображаются только при наведении на нее указателя мыши. Это является современным подходом к оформлению панелей инструментов. В случае, когда компонент TТооIВаr расположен в панели инструментов TСооIВаr, необходимо также свойству Transparent каждой кнопки установить значение Тruе, тогда кнопки будут прозрачными для общего фона панели инструментов. |
Indent (тип Integer) |
Устанавливает для панели отступ слева в пикселях, то есть свободный от элементов участок. По умолчанию имеет нулевое значение. |
List (тип Boolean) |
Определяет расположение заголовка и рисунка на кнопке. Если Тruе, то рисунок располагается слева от заголовка, а если свойство установлено в False, то заголовок размещается под рисунком. |
BorderWidth (тип BorderWidth) |
Устанавливает ширину границы в пикселях. |
RowCount (тип Integer) |
Возвращает в качестве результата число строк, занимаемых панелью инструментов. Свойство доступно в момент выполнения программы и только для чтения. |
EdgeInner (тип TEdgeStyle)
|
Задает вид внутренней фаски и может принимать значения: esNone — фаска отсутствует; esRaised — приподнятая фаска; esLowered — углубленная фаска. |
EdgeOuter (тип TEdgeStyle) |
Определяет вид внешней фаски и принимает одно из тех же значений, что и предыдущее свойство. |
Buttons [Index: Integer] (тип ТТооlButton) |
Обеспечивает доступ к кнопкам панели инструментов по индексу. т.о., к кнопкам можно обращаться не только по названиям, но и по их порядковым номерам (нумерация начинается с нуля). |
ЛАБОРАТОРНАЯ РАБОТА №4
Создание панели инструментов в приложении
Цель: Научиться создавать панели инструментов в приложениях.
Постановка задачи. Создать приложение с использованием панели инструментов TToolBar, которое позволяло бы открывать и просматривать текстовые файлы, а также изменять для выведенного на экран текста стиль шрифта, размер шрифта и его цвет.
Задание 1:
1. Откройте текстовый редактор, созданный ранее (см. лаб. раб №3). На форму создаваемого приложения помещаются такие элементы управления: панель инструментов TToolBar (вкладка WIN32), список графических образов TImageList (вкладка WIN32).
2. В поле редактора TМеmо будет помещаться текст из открываемого с помощью диалога TOpenDialog файла формата ТХТ. Для того чтобы пользователь мог открывать только файлы данного формата, свойству Filter диалога OpenDialog1 присваивается соответствующее значение.
3. На панель инструментов поочередно добавьте элементы: три кнопки (Новый, Открыть, Сохранить) разделитель, три кнопки (Черный, Зеленый, Красный), разделитель, две кнопки (Полужирный, курсив), разделитель, комбинированный список TСоmbоВох (Размер шрифта), разделитель, кнопка (Справка).
4. Для панели TToolBar свойству Images устанавите значение ImageList1, а свойству Flat — значение True.
5. Первые три кнопки TToolButton будут выполнять те же функции, что и пункты меню. Поэтому для них с помощью Инспектора объектов в свойстве MenuItem устанавливаются ссылки на соответствующие пункты меню.
6. Следующие три кнопки представляют собой группу зависимых переключателей, которые дают возможность изменить цвет текста в поле многострочного редактора. Для каждой из этих трех кнопок свойство Grouped установите в True, а свойству Style задается значение tbsCheck. Первая кнопка в этой группе делает текст черным. Она нажата по умолчанию, поэтому ее свойству Down присваивается значение True. Вторая кнопка позволяет окрасить текст в зеленый цвет, а третья — в красный. Когда одна из этих кнопок находится в нажатом состоянии, двё другие кнопки данной группы не нажаты.
7. Седьмая кнопка является независимым переключателем, с помощью которого можно сделать текст, отображаемый в поле редактора TMemo, полужирным либо отменить это выделение. Для этого свойству Style данной кнопки присвойте значение tbsCheck.
8. Такое же значение необходимо присвоить одноименному свойству восьмой кнопки. Если данная кнопка нажата, то текст будет отображаться курсивом, а если не нажата — то обычным образом.
9. Свойству Style комбинированного списка СоmbоВох1 присваивается значение DropDownList, а в список свойства Items данного компонента вносится набор целочисленных значений (8, 10, 12, .. - и т.д.), которые будут использоваться для установки размера шрифта выводимого текста.
10. Последняя кнопка является обычной кнопкой, ее свойство Style имеет значение tbsButton. Она позволяет открыть информационное окно «О программе».
11. Свойству ImageIndex каждой кнопки TToolButton присваивается соответствующий индекс графического образа, расположенного в списке ImageList1, который должен быть сформирован заранее. Проектировщик приложения может взять уже готовые изображения из файлов, а может сам нарисовать их вручную, например, с помощью редактора Image Editor, входящего в состав Delphi.
В процессе выполнения приложение может принимать примерно такой вид, как показано на рис. 4.2.
Программная реализация решения поставленной задачи приводится в листинге 4.1.
Листинг 4.1. Некоторые процедуры приложения “Текстовый редактор”
// процедуры изменения цвета текста в зависимости от выбранной кнопки
procedure TMainForm.ToolButton4Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
Memo1.Font.Color:=clBlack; // черный
end;
procedure TMainForm.ToolButton5Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
Memo1.Font.Color:=clGreen; // зеленый
end;
procedure TMainForm.ToolButton6Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
Memo1.Font.Color:=clRed; // красный
end;
// процедура включения/ выключения стиля полужирный
procedure TMainForm.ToolButton7Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
begin
if ToolButton8.Down then
begin
if ToolButton7.Down then Memo1.Font.Style:=[fsBold, fsItalic]
else Memo1.Font.Style:=[fsItalic]
end
else begin
if ToolButton7.Down then Memo1.Font.Style:=[fsBold]
else Memo1.Font.Style:=[] ;
end;
end;
end;
// процедура включения/ выключения стиля курсив
procedure TMainForm.ToolButton8Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
begin
if ToolButton7.Down then
begin
if ToolButton8.Down then Memo1.Font.Style:=[fsBold, fsItalic]
else Memo1.Font.Style:=[fsBold]
end
else begin
if ToolButton8.Down then Memo1.Font.Style:=[fsItalic]
else Memo1.Font.Style:=[] ;
end;
end;
end;
//процедура изменения размера шрифта
procedure TMainForm.ComboBox1Change(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
Memo1.Font.Size:=StrToInt(ComboBox1.Text);
end;
|
Вопросы для самоконтроля |
1. Для чего служат панели инструментов?
2. Перечислите виды панелей инструментов.
3. Как сделать кнопки на панели инструментов плоскими?
4. Как разбить кнопки на панели инструментов на группы?
5. Чем отличается кнопка TToolButton от кнопки TSpeedButton?
6. Как связать панель инструментов с главным меню программы?
Тема 5. Способы оформления приложений
|
Краткие теоретические сведения |
Заставка. Заставкой называется информационное окно, выводимое на экран при запуске программы, которое затем закрывается автоматически или по команде пользователя.
Наиболее типичной является заставка, выводимая в виде окна, которое не имеет заголовка и никаких элементов управления. Это окно выводится по центру экрана и содержит рисунок и иногда несколько строк пояснительного текста. После загрузки программы заставка автоматически удаляется с экрана и из памяти.
Для того чтобы сделать заставку, требуется, прежде всего при проектировании приложения создать окно заставки (то есть дополнить приложение еще одной формой) и вставить в него необходимый рисунок и текст. После этого следует определить некоторые свойства для данной формы.
С помощью Инспектора объектов устанавливаются такие параметры (свойства) формы:
Position: =роScreenСеnter;
FormStyle: =fsStayOnTop;
Caption:=’’;
BorderStyle: =bsNone;
BorderIcons:=[];
Создание, отображение и удаление формы-заставки осуществляется в файле проекта, как показано ниже. Предположим, что главная форма носит имя MainForm, а форма-заставка — имя ZastForm. Тогда файл проекта примет такой типовой вид:
Листинг 5. 1. Обработка формы-заставки в файле проекта
Program Zastavka;
uses
Forms,
Main in Main.pas' {MainForm},
Zastavka in 'Zastavka.pas' {ZastavkaForm};
{$R *.res}
begin
Application.Initialize;
// Создание и отображение заставки
ZastavkaForm:=TZastavkaForm.Create(Application);
ZastavkaForm.Show;
ZastavkaForm.Update;
// Создание главной формы приложения
Application.CreateForm(TMainForm, MainForm);
// Удаление формы—заставки
ZastavkaForm.Hide;
ZastavkaForm.Free;
// Запуск программы на выполнение
Application.Run;
end.
Экземпляр формы-заставки создается в файле проекта сразу же после инициализации приложения. После этого производится отображение заставки на экране с помощью методов Show и Update. В данном случае для отображения формы недостаточно использовать только метод Show, так как еще не запущен объект приложения и не обрабатываются сообщения операционной системы Windows. Не обрабатываются также сообщения при прорисовке формы, поэтому необходимо выполнить отображение формы путем применения метода Update.
После создания главной формы заставка делается невидимой и удаляется из памяти. С этой целью в файле проекта для формы заставки вызываются методы Hide и Free. Можно сделать временную задержку для того, чтобы заставка отображалась на экране определенное время, а не исчезала сразу после создания главной формы.
Рисунок, содержащийся в заставке, рекомендуется загружать при выполнении программы. В противном случае необоснованно увеличивается размер исполняемого файла за счет того, что он включает в себя рисунок, который не потребуется в дальнейшей работе программы.
Информационное окно. В большинстве программ существует возможность открывать специальное окно, содержащее краткую справочную информацию о названии программного продукта, его версии, дате выпуска, авторах и другие данные. Как правило, такое окно называется «О программе» или About.
Информационное
окно создается с помощью шаблона либо
самостоятельно. Для создания информационного окна с помощью шаблона выберите в
главном меню среды разработки Delphi пункт File® New® Other. Затем
на странице Forms выберите шаблон формы About Box. В результате
к приложению добавляется новая форма AboutBox с заголовком About
. (см. рис.5.1).
Как видно из рис. 5.1, данная форма содержит информационную панель с рисунком (объект TImage) и четырьмя надписями (объекты TLabel), а также кнопку ОК для закрытия окна. Программист может свободно изменять эту форму, удалять и изменять существующие объекты или добавлять новые.
Как правило, события элементов, расположенных на данной форме, не используются и обработчики событий не создаются. В том числе, не требуется обработчик события нажатия кнопки ОК, так как свойство ModalResult данной кнопки имеет значение mrOK, поэтому при ее нажатии форма автоматически закрывается.
Разработчик приложения может не использовать шаблон, а создавать информационное окно самостоятельно, путем добавления к проекту новой формы, на которой располагаются все необходимые управляющие элементы.
Вызов информационного окна на экран обычно осуществляется в модальном режиме, то есть с использованием метода ShowModal. Чтобы продолжить работу с приложением, следует закрыть информационное окно.
Строка состояния. Строка состояния — это управляющий элемент, с помощью которого пользователю выдается разного рода вспомогательная информация о ходе выполнения приложения, например, отображение координат указателя мыши в статусной строке графических редакторов или указание количества страниц и номера текущей страницы в текстовом редакторе Word. Также могут отображаться дата, время и т.д.
В Delphi для этой цели используется специальный компонент TStatusBar, представляющая собой ряд панелей, обычно располагающихся внизу главной формы приложения, которые содержат текущую справочную информацию. Каждая такая панель представлена в списке свойства Panels данного компонента.
Рассмотрим некоторые наиболее важные свойства данного объекта.
Таблица 5.1. Свойства объекта TStatusBar
Свойство |
Описание |
SimplePanel (тип Boolean) |
Определяет, будет статусная строка содержать одну панель или несколько. Для того чтобы отображалась одна панель, данное свойство нужно установить в True, чтобы несколько - в False. |
SimpleText (тип string) |
Содержит текст, который выводится в статусной строке в случае, если свойство SimplePanel имеет значение True. |
AutoHint (тип Boolean) |
Имеющее значение True, устанавливает, что в статусной строке автоматически будет отображаться значение текущей всплывающей подсказки (Hint). При этом сама всплывающая подсказка не показывается. |
Count (тип Integer) |
Показывает количество панелей в строке состояния. Свойство доступно только для чтения. |
SizeGrip (тип Boolean) |
Определяет возможность изменения размеров статусной строки. Если свойство имеет значение True, то в правом нижнем углу статусной строки будет отображаться специальная треугольная область захвата, с помощью которой можно изменять размеры статусной строки путем растягивания. В случае, когда строка состояния выровнена по нижнему краю формы, использование области захвата будет приводить к изменению размеров самой формы. Однако при этом для свойства BorderStyle формы должно быть установлено значение bsSizeable или bsSizeToolWin, в противном случае область захвата появляться не будет. |
Panels (тип TStatusPanels) |
Содержит список панелей статусной строки. Можно обращаться к соответствующей панели по ее индексу (нумерация начинается с нуля). |
В качестве основных свойств панели как объекта класса TStatusPanels можно выделить следующие.
Таблица 5.2. Свойства объекта TStatusPanels
Свойство |
Описание |
Alignment (тип TAlignment) |
Задает способ выравнивания текста относительно панели. |
Bevel (тип TStatusPanelBevel) |
Определяет вид панели: углубленная, приподнятая или плоская |
Style (тип TStatusPanel Style) |
Устанавливает способ отображения информации на панели и может принимать одно из двух значений: psText — в качестве содержимого панели используется значение свойства Text (по умолчанию); psOwnerDraw — вывод текстовой и графической информации выполняется программно с использованием поверхности рисования (Сanvas) строки состояния. |
Техt (тип String) |
Содержит текст, выводимый на панели. |
Width (тип Integer) |
Задает ширину панели. По умолчанию устанавливается ширина в 50 пикселей, а последняя панель занимает все оставшееся свободное пространство строки состояния. |
ЛАБОРАТОРНАЯ РАБОТА №5
Оформление приложения
Цель: Изучить способы оформления приложений. Научиться создавать и использовать заставки, строки состояния, а так же информационное окно программы.
Постановка задачи: Для созданного ранее текстового редактора создать заставку, информационное окно, строку состояния, таймер.
Задание 1: Создание заставки текстового редактора.
1. Откройте с помощью File®New новую форму, свойству Name формы присвойте значение Zast.
2. Удалите значение свойства Caption.
3. Свойству BorderStyle присвойте значение bsNone (результат увидите только при запуске программы).
4. Для удаления кнопок минимизации, максимизации формы и системного меню установите у свойства BorderIcons значения подсвойств biMinimize, biMaximize, biSystemMenu равными False( результат увидите только при запуске программы).
5. Свойство Enabled установите равным False для того, чтобы заблокировать обработку событий и лишить возможности пользователя управлять окном с помощью клавиатуры или мыши.
6. Сохраните проект, определив имя второго программного модуля проекта как Zastavka.
7. Выполните команду View®Project Manager и выберите в контекстном меню пункт Options. В предложенном окне выберите закладку страницы Forms. Переместите Zast из списка AutoCreate в список Available для рационального использования памяти и ресурсов.
8. Преобразуйте исходный файл проекта. Для этого выполните команду Project ® View Source и измените операторы между begin и end следующим образом:
Zast:= TZast.Create(Application);
{Этот оператор создает объект формы заставки и присваивает его адрес переменной
Zast, которая определена в программном модуле заставки}
Zast.Show;
Zast.Update;
{Отображение
объекта из памяти на экране и обновление его содержимого}
Application.CreateForm(TForm1, MainForm);
Zast.Hide;
Zast.Free;
{Скрытие формы заставки и освобождение занимаемой ею памяти}
Application.Run;
9. Для того, чтобы заставка оставалась на экране несколько секунд, для обработчика события OnCreate главной формы MainForm добавьте следующие операторы:
CurrentTime:=GetTickCount div 1000;
{ Процедура CurrentTime возвращает время работы Windows в миллисекундах}
while((GetTickCount div 1000)<(CurrentTime+4)) do;
{ Организация паузы в 4 секунды}
Объявите переменную CurrentTime типа Longint.
10. Поместите на форму заставки компонент TImage из закладки Additional палитры компонентов. Выберите свойство Picture объекта Image1. В появившемся окне Picture Editor щелкните по кнопке Load, выберите файл с картинкой для загрузки картинки в окно Picture Editor. Для того, чтобы растровое изображение внутри объекта Image1 занимало всю клиентную область, требуется изменить значение свойства Stretch образа на True.
11. Поместите на форму заставки справа и снизу от рисунка два компонента TLabel из закладки Standard палитры компонентов. Отобразите на них информацию об авторе приложения и название приложения, используя различный размер, цвет и начертание шрифта.
12. Запустите приложение и просмотрите результат работы.
Задание 2: Создайте информационное окно программы.
1. Добавьте в главное меню программы пункт «О программе».
2. Добавьте к проекту новую форму AboutBox с помощью шаблона. Для этого выберите в главном меню среды разработки Delphi пункт File® New® Other. Затем на странице Forms выберите шаблон формы About Box. В результате к приложению добавляется новая форма AboutBox с заголовком About .
3. Добавьте в программу команду вызова информационного окна в модальном режиме, то есть с использованием метода ShowModal.
4. Запустите приложение и просмотрите результат работы.
Задание 3: Создайте таймер.
1. Добавьте к проекту новую форму oClock. Измените границы окна у формы oClock, сделайте их невидимыми, уберите значки максимизации, минимизации, системного меню.
2. Поместите на форму oClock компонент TLabel, свойству Caption этого компонента присвойте значение 00:00:00. Выберите для своих часов шрифт, размер и стиль.
3.
Поместите на форму oClock компонент TTimer из
закладки System. В обработчик события OnTimer объекта Тimer1 добавьте
следующую строку:
TimerLabel.Caption:=TimeToStr(Time); //TimeToStr преобразует
время в строку
4. Для события OnCreate формы oClock выберите обработчик Timer1Timer, который был создан для компонента Timer1. Тогда текущее время будет записано в метку до появления окна.
5. Для формы oClock установите свойство Formstyle равным fsStayOnTop для того, чтобы часы были расположены всё время поверх других окон. Кроме того, установите свойство Visible в True.
6. Запустите приложение и просмотрите результат работы.
Задание 4: Создание строки состояния текстового редактора.
1. Поместите на форму компонент TStatusBar (вкладка Win32). Свойство AutoHint установите в True.
2. Для этого компонента с помощью Инспектора объектов через свойство Panels вызовите редактор EditingStatusBar.Panel, в котором добавьте шесть панелей. Начальные установки для каждой панели задаются путем изменения свойства Text в соответствии с рис. 5.3.
3. Свойству Width для каждой панели задается соответствующее значение, на выбор программиста.
4. Для всех кнопок панели ToolBar1 установите значение свойства Hint (подсказка). В панелях будет отображаться следующая информация:
Панель 0: значение текущей всплывающей подсказки (Hint), то есть подсказки для того элемента, над которым в данный момент находится указатель мыши.
Панель 1: цвет текста в поле редактора Меmо1.
Панель 2: стиль шрифта в поле редактора Меmо1 (обычный или курсив).
Панель 3: состояние кнопки СарsLock (если кнопка включена, то выводится строка «Сарs Lock включен», если выключена, то отображается строка «Сарs Lock выключен»).
Панель 4: количество строк, содержащихся в редакторе Меmо1.
Панель 5: текущее время.
Программная реализация решения поставленной задачи приводится в листинге 5.1.
Листинг 5.1. Некоторые процедуры приложения “Текстовый редактор”
//Отображение в панели статуса цвета текста
procedure TMainForm.ToolButton4Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
Memo1.Font.Color:=clBlack;
StatusBar1.Panels[1].Text:='Черный цвет';
end;
//Отображение в панели статуса толщины шрифта
procedure TMainForm.ToolButton7Click(Sender: TObject);
begin
with (ActiveMDIChild as TChildForm) do
begin
if ToolButton8.Down then
begin
if ToolButton7.Down then
begin
Memo1.Font.Style:=[fsBold, fsItalic];
StatusBar1.Panels[2].Text:='полужирный,Курсив';
end
else
begin
Memo1.Font.Style:=[fsItalic];
StatusBar1.Panels[2].Text:='Курсив';
end;
end
else begin
I f ToolButton7.Down then
begin
Memo1.Font.Style:=[fsBold];
StatusBar1.Panels[2].Text:='полужирный';
end
else
begin
Memo1.Font.Style:=[] ;
StatusBar1.Panels[2].Text:='обычный';
end;
end;
end;
end;
procedure ToClock.Timer1Timer(Sender: TObject);
begin
//Отображение времени в строке состояния
TimerLabel.Caption:=TimeToStr(Time);
MainForm.StatusBar1.Panels[5].Text:=TimeToStr(Time);
//Отображение состояния CapsLock в строке статуса
if GetKeyState(vk_Capital)=1
then MainForm.StatusBar1.Panels[3].Text:='CapsLock включен'
else MainForm.StatusBar1.Panels[3].Text:='CapsLock выключен';
end;
//Отображение количества строк в редакторе Memo1
procedure TChildForm.Memo1Change(Sender: TObject);
begin
MainForm.StatusBar1.Panels[4].Text:='Строк:'+IntToStr(Memo1.Lines.Count);
end;
|
Вопросы для самоконтроля |
1. Для чего предназначена заставка программы?
2. Как выглядит типичная заставка программного продукта?
3. Какие свойства следует определить для формы заставки и для чего?
4. Почему создание, отображение и удаление формы-заставки осуществляется в файле проекта?
5. Для чего предназначено информационное окно программы?
6. Какими способами можно создать информационное окно программы?
7. Для чего предназначена строка состояния TStatusBar?
8. Назначение индикаторов.
9. Какие, по вашему мнению, дополнительные способы оформления приложений можно использовать при создании программного продукта?
Раздел 2. Базы данных
Тема 1. Основы баз данных
|
Краткие теоретические сведения |
Процесс создания базы данных может быть представлен как последовательность следующих шагов:
1. Создание каталога.
2. Создание псевдонима.
3. Создание таблиц.
1. Создание каталога базы данных
Каталог (папка) для файлов базы данных создается обычным образом, например, при помощи Проводника. Обычно файлы локальной базы данных помещают в отдельном подкаталоге каталога программы работы с базой данных.
2. Создание псевдонима.
Псевдоним базы данных создается при помощи входящей в Delphi утилиты BDE Administrator, которая запускается из Windows выбором из меню Программы\Borland Delphi7\ BDE Administrator. В левой части окна, на вкладке Databases, перечислены псевдонимы, зарегистрированные на данном компьютере.
3. Создание структуры таблицы.
Таблицы создаются при помощи входящей в состав Delphi утилиты Database Desktop. Она обеспечивает создание, просмотр и модификацию таблиц баз данных различных форматов и, кроме того позволяет выполнять выборку информации путем создания запросов.
Для создания новой таблицы, выберите из меню Tools команду Database Desktop, и затем File- New- Table. Затем в открывшемся диалоговом окне Create Table выберите тип создаваемой таблицы (по умолчанию Paradox 7).
В результате открывается диалоговое окно Create Paradox 7 Table, в котором можно определить структуру записей таблицы.
Константа, определяющая тип поля, может быть введена с клавиатуры или путем выбора типа поля из списка, который появляется при щелчке правой кнопкой мыши в колонке Type или при нажатии клавиши [Пробел].
Одно или несколько полей можно пометить как ключевое. Чтобы пометить поле, как ключевое, необходимо выполнить двойной щелчок на кнопке Key. Ключевые поля должны быть сгруппированы в верхней части таблицы.
Если данные, для которых предназначено поле, должны обязательно присутствовать в таблице, то нужно установить флажок Required Field.
Перед тем, как приступить к разработке приложения управления базой данных, необходимо, используя утилиту Database Desktop, создать таблицу и добавить в нее несколько записей.
ЛАБОРАТОРНАЯ РАБОТА №1
Создание псевдонима БД. Создание таблицы баз данных и форм приложения
Цель: освоить создание псевдонима с помощью утилиты BDE Administrator и таблицы базы данных с помощью DataBase Desktop.
Постановка задачи: Создать базу данных «Школа» и псевдоним. Таблица School.db содержит информацию об учащихся школы. Структура записи: Код_Ученика, Фамилия, Имя, Отчество, Класс, Буква, Пол, День рождения, Адрес.
Задание 1. Создайте псевдоним базы данных «Школа»
1. Создайте папку: имя диска:\School и в ней подкаталог Data.
2. Запустите BDE Administrator из программной группы Delphi 7.
3. Для того, чтобы создать новый псевдоним, выберите в меню команду Object \ New.
4. В открывшемся диалоговом окне New Database Alias (Новый псевдоним базы данных) из списка Database Driver Name, в котором перечислены зарегистрированные в системе драйвера доступа к базам данных, нужно выбрать драйвер для создаваемой базы данных, т.е. фактически выбрать тип создаваемой базы данных. (По умолчанию предлагается драйвер STANDART, который обеспечивает доступ к таблицам в формате PARADOX. Выберите драйвер и щелкните на кнопке ОК. (В список псевдонимов будет добавлен новый элемент, рис. 1.1).
5. После этого нужно изменить автоматически созданное администратором имя псевдонима STANDART на псевдоним School и задать путь к файлам базы данных, для которой создается псевдоним. Путь к файлам базы данных можно ввести на вкладке Definition в поле Path с клавиатуры или воспользоваться стандартным диалоговым окном Select Directory (Выбор каталога), которое открывается щелчком на кнопке [...], находящейся в конце поля Path. Здесь выберите путь: имя диска:\School \Data для нового псевдонима и [ok].
6. Щелчком правой кнопки мыши по псевдониму School вызовите контекстное меню и выберите команду Apply (применить).
Задание 2. Создайте структуру таблицы базы данных «Школа».
1. Запустите DataBase Desktop из программной группы Delphi 7.
2. Укажите рабочий каталог, выполнив команду File\Work Directory и File\Private Directory.
Рис.2. Диалоговое окно Set Private Directory |
. Рис.3. Диалоговое окно Set Working Directory |
3. Cоздайте таблицу School.db командой File\New\Table.
4. Выберите тип таблицы Paradox 7.
5. Определите поля, входящие в таблицу School.db, как показано на рисунке 1.4.(Field Name-имя поля,Type- тип поля, Size- размер, Key- указывается, если поле входит в состав первичного ключа, определяется первым в списке).
Рис.1.4. Окно создания структуры таблицы
6. Полям Kod, FAM, Name, Klass, Pol назначить атрибут Required, это требование обязательного существования значения у поля на момент его запоминания в таблице.
7. Определите минимальное и максимальное значения поля Klass, равные 1 и 11. (Minimum value, Maximum value)
8. Определите значение поля по умолчанию: Pol-Мужской (Default value)
Задание 3. Создайте индекс по полям FAm и Klass.
1. Выберите из списка Table Properties элемент Secondary Indexes.
2. Определите новый индекс, нажав на кнопку Define.
3. Из списка полей Fields перенесите поля Klass и FAm в область Indexed Fields, нажав на кнопку с изображением правой стрелки. Последовательность полей определяет порядок в списке чередования (Рис.1.5.).
4. Определите опции индекса (Unique- отбираются только уникальные значения, Maintained- главный индекс, Case sensitive- учитывать регистр, Descending- индексирование по убыванию.
5. Сохраните индекс, дав ему имя Sort_Klass_FAM.
6. Сохраните созданную таблицу под именем имя диска:\Data\School.db, нажав на кнопку Save As.
Задание 4. Создайте приложение на основе созданной таблицы базы данных «Школа».
1. Запустите Delphi. Расположите на форме компоненты Table1, DataSource1, DBGrid1, DBNavigator1 и настройте соответствующие свойства этих компонентов.
Таблица 1.1. Основные свойства компонентов приложения
Компонент |
Свойство |
Значение |
TTable |
DataBaseName |
School |
TableName |
School.db |
|
Name |
Table_Deti |
|
Active |
True |
|
TDataSource |
DataSet |
Table_Deti |
Name |
Source_Deti |
|
TDBGrid |
DataSource |
Source_Deti |
Name |
DBGrid1 |
|
TDBNavigator |
DataSource |
Source_Deti |
Name |
DBNavigator1 |
2. Сохраните созданное приложение в своей папке (Команда File-Save all).
3. Запустите приложение, убедитесь, что оно работает правильно. Заполните пять записей произвольными данными.
|
Вопросы для самоконтроля |
1. Что такое псевдоним, как его создать? Поясните назначение BDE Administrator.
2. Назначение страницы Databases?
3. Назначение страницы Configuration? Опишите элементы страницы Configuration
4. Для чего предназначена утилита DataBase Desktop?
5. Как указать рабочие каталоги?
6. Как создать таблицу? Перечислите свойства, которыми может обладать таблица.
7. Из каких областей состоит окно создания структуры таблицы?
8. Какие типы полей допустимы в таблице Paradox 7?
9. Как создать структуру таблицы?
10. Как определить первичный ключ?
11. С какой целью создаются вторичные ключи?
12. Укажите, какие действия необходимо выполнить по созданию вторичных ключей?
13. Можно ли изменить структуру уже существующей таблицы?
ЛАБОРАТОРНАЯ РАБОТА №2
Создание простейшего приложения базы данных с
использованием эксперта форм базы данных
Цель работы: освоить создание простейшего приложения базы данных с использованием эксперта форм базы данных.
Постановка задачи: Создать приложение для работы с базой данных «Школа», используя эксперта форм базы данных. Реализовать возможность добавления, редактирования записей в базе данных с использованием дополнительных полей ввода. Осуществить возможность просмотра фотографий школьников.
Задание 1. Модернизируйте структуры таблицы School.db в соответствии с задачей.
1. В структуру таблицы School.db добавьте поле Foto (тип Ole), в котором будут храниться фотографии школьников.
2. Сохраните внесенные изменения.
Задание 2. Создайте простейшее приложение базы данных с использованием эксперта форм базы данных.
1. Создайте новое приложение.
2. Выполните команду DataBase - Form Wizard (или File-New и на закладке Business выберите элемент DataBase Form Wizard). В раскрывшемся окне DataBase Form Wizard выберите опции:
· Create a simple form;
· Create a form using Ttable objects.
Нажмите кнопку Next.
¨ В следующем раскрывшемся окне выберите в комбинированных списках папку C:\School\ Data. После этого, на панели слева будет выведен список таблиц. Выберите в этом списке таблицу School.dbf и нажмите кнопку Next.
¨ В следующем окне переместите все поля из левого списка в список Selected с помощью кнопки >>. В этом же окне можно поменять порядок полей с помощью кнопок и ¯. Для перехода к следующему окну нажмите кнопку Next.
¨ В следующем окне выберите компоновку формы In a grid для создания формы наподобие электронной таблицы, в которой можно просматривать и редактировать несколько записей сразу (по одной в каждой строке) и нажмите кнопку Next.
¨ В следующем окне включите параметр Generate a main form и в списке переключателей Form generation выберите Form and DataModule и нажмите кнопку Finish.
¨ В модуле данных для компонента Table1 установите свойство Active в True.
3. Установите свойство ShowHint для объекта DBNavigator1 равным True (для появления подсказок, когда курсор будет задерживаться над кнопкой панели).
4. Отредактируйте подсказки (переведите подсказки на русский язык), используя свойство Hints.
First record – первая запись
Prior record- последняя запись
Next record- следующая запись
Last record- предыдущая запись
Insert record- вставить запись
Delete record- удалить запись
Edit record- редактировать запись
Post edit- сохранить запись
Cancel edit- отменить редактирование
Refresh data- обновить данные
5. Замените свойство Align для объекта DBGrid1 на alNone и поместите на форму справа от объекта DBGrid1 компонент DBImage1 для просмотра поля BMP записи. Для объекта DBImage1 установите свойство Strech равным True для того, чтобы помещаемое изображение занимало всю область внутри DBImage1. Установите значения свойств DataSourse и DataField объекта DBImage1.
6. Поместите на форму компонент Image1 (вкладка Additional)- для ввода изображения.
7. Включите в секцию Uses имя модуля Clipbrd- чтобы использовать работу с функцией вставки-выбора из буфера.
8. Поместите на верхнюю панель кнопку Close.
9. Поместите на форму компонент OpenPictureDialog1 (вкладка Dialogs)- для поиска изображения для ввода в таблицу и кнопку BitBtn2 «Добавить фото».
10. Как происходит ввод изображения? С помощью кнопки «Добавить фото» нужно выбрать необходимое изображение (оно поместится в компонент Image1) и нажать кнопку Сохранить Навигатора. Изображение вставится в таблицу (компонент DBImage1) через буфер памяти, куда предварительно помещается из объекта Image1, в котором оказывается после выбора по OpenPictureDialog1.
Добавьте обработчик:
procedure TForm3.BitBtn2Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute //когда выбрали файл, его имя находится в FileName,
// он загружается в компонент Image1
then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
Clipboard.Assign( Image1.Picture); //Запись в буфер
Image1.Picture.Assign(Clipboard); //Запись из буфера
DBImage1.PasteFromClipboard; //Вставка из буфера
end;
11. Сохраните созданное приложение базы данных в папке C:\School\PRG.
3. Запустите созданное приложение базы данных. На верхней панели работающего приложения расположен объект DBNavigator1 с кнопками управления базой данных. Опробуйте работу всех кнопок, но имейте в виду, что при перемещении на другую запись все изменения полей предыдущей записи сохраняются автоматически.
Задание 3. Усовершенствуйте приложение. Создайте удобный интерфейс для ввода т редактирования данных. Для этого:
1. Добавьте на форму компоненты Label1, DBCtrlGrid1, DBEdit1, DBComboBox1 в соответствии с рисунком 2.7.
2. Для того, чтобы обращение к полям шло только через созданные компоненты запретите доступ к полям из компонента DBGrid1 (установите свойство ReadOnly в True).
3. Настройте компоненты в соответствии с таблицей 2.1.
Таблица2.1 . Основные свойства компонентов приложения
Компонент |
Свойство |
Значение |
DBCtrlGrid1 |
DataSource |
DataModule1.DataSource1 |
DBComboBox1 |
DataField |
Name |
DBComboBox2 |
DataField |
Klass |
DBComboBox2 |
DataField |
Pol |
DBEdit1 |
DataField |
Poim_N |
DBEdit2 |
DataField |
Fam |
DBEdit3 |
DataField |
Otch |
DBEdit4 |
DataField |
D_R |
DBEdit5 |
DataField |
Adress |
DBEdit6 |
DataField |
Telefon |
Окончательный вид приложения приведен на рис.2.7.
|
Вопросы для самоконтроля |
1. Можно ли изменить структуру уже существующей таблицы?
2. Для чего предназначены компоненты со страницы DataControl?
3. Для чего предназначен компонент TOpenPictureDialog?
4. Как реализовать ввод картинки в базу данных?
Тема 3. Фильтрация данных
|
Краткие теоретические сведения |
Сортировка, то есть размещение записей в определенном порядке, осуществляется путем установки необходимого индекса в качестве текущего. При осуществлении перемещения по набору данных желательно вначале определенным образом отсортировать записи и не изменять заданный порядок до полного завершения требуемого цикла перемещений.
Фильтрация – это задание ограничений для записей, отбираемых в набор данных. Иными словами, при наложении фильтра, в набор данных будут входить не все записи, а только те, которые отвечают условиям фильтрации.
Система Delphi дает возможность осуществлять фильтрации записей
§ по выражению;
§ по диапазону.
По умолчанию фильтрация записей не ведется, и НД Table содержит все записи связанной с ним таблицы БД.
При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими выражению фильтра, задающему условия отбора записей.
Достоинством фильтрации по выражению состоит в том, что она применима к любым полям, в том числе к неиндексированным. Так как в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей.
Свойство Filter типа Srting компонента TTable – задает выражение фильтра. Выражение фильтра представляет собой строку, которая может включать имена полей таблицы, литералы (числа, строки или символы), операции сравнения, арифметические операции, а также круглые и квадратные скобки. Имена переменных в выражении фильтра использовать нельзя. Для того чтобы включить в фильтр значение переменной, его следует предварительно преобразовать в строковый тип.
Выражения фильтров могут выглядеть, например, следующим образом:
1) Fam = ‘Cидоров’ (выбираются все записи, у которых поле Fam имеет значение ‘Cидоров’
2) Massa*Kolvo > 100 (будут выбраны записи, для которых произведение значения поля Massa на значение поля Kolvo больше 100);
3) Date >= 03.05.99 and Date <= 03.05.08 (отбираются те записи, для которых значение даты, содержащейся в поле Date, находится в промежутке от 03.05.99 до 03.05.08);
4) Cena >=500 or Cena <= 150 (отбираются те записи, для которых значение, содержащейся в поле Cena, большее 500 или меньше 150);
5) Рriсе <= 500 and Тоvаг <> ‘Диван’(выбираются записи, у которых значение поля Рriсе меньше или равно 500 и при этом значение поля Тоvаг не равно ‘Диван’).
Если имя поля содержит пробелы, то его заключают в [ ] (например, [Name Firma] = 'Слад&Ко'), в противном случае [ ] необязательны.
Для активизации и деактивизации фильтра используется свойство Filtered типа Boolean. Если Filtered=True, то фильтрация включается, и в набор данных отбираются записи, которые удовлетворяют фильтру, записанному в свойстве Filter. Если Filtered=False (по умолчанию), то фильтрация выключена.
Свойство FilterOptions типа TFilterOptions задает параметры фильтрации. Может принимать комбинации двух значений:
§ foCaseInsensitive – регистр букв не учитывается, т. е. при задании фильтра Tovar='Хлеб' слова "Хлеб", "хЛеБ", "ХЛЕБ" или "хлеб" будут восприняты как одинаковые;
§ foNoPartialCompare – выполняется проверка на полное соответствие содержимого поля и значения, заданного для поиска. Обычно применяется для строк. Если известны только первые символы строки, то нужно указать их в выражении фильтра, заменив остальные символом «*» и выключив значение foNoPartialCompare. Например, при выключенном значении foNoPartialCompare для фильтра Tovar = 'C*' будут отобраны записи, у которых в поле Tovar содержатся значения "Сметана", "Сыр", "Сахар" или "Сельдь с/м".
Все параметры фильтра перечисляются в свойстве FilterOptions через «,» и заключаются в [ ]. По умолчанию все параметры фильтра выключены, т.е. свойство FilterOptions = [ ].
2. Фильтрация по диапазону
При фильтрации по диапазону в НД включаются записи, значения полей которых попадают в заданный диапазон. Этот способ фильтрации можно применять только для индексированных полей (причем индекс поля, по которому осуществляется фильтрация, должен быть установлен как текущий). В связи с использованием индексно-последовательного метода доступа, фильтрация по диапазону производится быстрее, чем фильтрация по выражению. Данный способ применим только для компонента TTable.
Таким образом, условием фильтрации является выражение вида "значение > нижней границы AND значение < верхней границы" (вместо операций сравнения < ,> могут указываться и операции <=, >=,<>).
Для фильтрации записей по диапазону компонент TTable имеет следующие методы:
ApplyRange – активизирует фильтр (включение фильтра);
CancelRange – деактивизирует фильтр (выключение фильтра);
SetRangeStart – устанавливает нижнюю границу диапазона;
SetRangeEnd – устанавливает верхнюю границу диапазона;
EditRangeStart – изменяет предварительно заданную нижнюю границу диапазона;
EditRangeEnd – изменяет предварительно заданную верхнюю границу диапазона;
SetRange – имеет тот же эффект, что и последовательное выполнение методов SetRangeStart, SetRangeEnd и ApplyRange. Процедура позволяет одновременно задать границы диапазона и выполнить фильтрацию.
Свойство KeyExclusive типа Boolean определяет, как учитывается заданное граничное значение при анализе записей. Если KeyExclusive = False (по умолчанию), то записи, у которых значения полей фильтрации совпадают с границами диапазона, включаются в состав НД, а если KeyExclusive = True, то такие записи в НД не попадают. Свойство KeyExclusive действует отдельно для нижней и верхней границы. Значение этого свойства должно устанавливаться после вызова методов SetRangeStart, SetRangeEnd, EditRangeStart и EditRangeEnd.
Пример 1.
Table1.IndexName: ='indCena'; //установка текущего индекса indCena
Table1. SetRangeStart;
Table1. KeyExclusive: = True;
Table1.FieldByName('Cena').AsFloat: =100.5;
Записи, содержащие в поле Cena значение 100,5, не входят в отфильтрованный НД (т. к. KeyExclusive = True). Фильтрация по диапазону подчиняется условию Cena >100,5. Если бы KeyExclusive = False, то условие фильтрации выглядело бы по-другому (Cena >=100,5).
Когда одна из границ диапазона не задана, то диапазон открыт, то есть нижняя граница становится равной минимально возможному, а верхняя граница – максимально возможному значению этого поля.
Существует возможность установки фильтра по нескольким полям. В этом случае используется несколько операторов присваивания (для каждого фильтруемого поля), а предварительно должен быть создан индекс по этим полям и установлен в качестве текущего.
Пример 2.
// Установка индекса по полям Rost и Ves в качестве текущего
Table1.IndexFieldNames:=’Rost;Ves’;
Table1.CancelRange; // Отключение фильтрации
// Установка верхней границы диапазона
SetRangeStart;
FieldByName(‘Rost’).AsInteger:=150;
FieldByName(‘Ves’).AsInteger:=45;
// Установка нижней границы диапазона
SetRangeEnd;
FieldByName(‘Rost’).AsInteger:=170;
FieldByName(‘Ves’).AsInteger:=65;
ApplyRange; // Включение фильтрации
В результате выполнения данного кода будут отобраны записи, для которых значение поля Rost находится в диапазоне от 150 до 170, а значение поля Ves - от 45 до 65.
Фильтрацию по диапазону можно также осуществлять мощью метода SetRange, имеющего такой формат: SetRange (const StartValues, EndValues:array of const);
Этот метод позволяет сразу задать границы диапазона и одновременно произвести фильтрацию. Параметры представляют собой массив констант и содержат, соответственно, значения верхней и нижней границ диапазона. Если фильтрация производится по нескольким полям, то значения границ перечисляются через запятую. Поля, по которым осуществляется фильтрация, определяются текущим индексом.
Например, установка фильтра, который позволяет осуществить приведенную в примере 2 фильтрацию с помощью метода SetRange, выглядит следующим образом:
Таble1. SetRange ([150,45],[170,65]);
При этом необходимо учитывать, что предварительно обязательно должен быть установлен текущий индекс, построенный по полям Ves и Rost.
Пример 3. Пусть требуется выбрать из таблицы всех владельцев автомобиля ВАЗ-2107, фамилия которых начинается с буквы ‘С’.
Table1.IndexFieldNames:=’Car;Fam’;
Table1.CancelRange;
Таble1. SetRange ([ВАЗ-2107,’C’],[ ВАЗ-2107,’Cяяя’]);
При выборе фамилий в качестве нижней границы задается ‘C’, а для установки верхней границы выбора фамилии к символу 4С’ добавлена строка ‘яяя’. Фамилии будут выбираться следующим образом. В соответствии с нижней границей будут отобраны все строки, у которых код первой буквы больше кода буквы ’C’ т.е. фамилии, начинающиеся с буки С, Т, У, Ф и т.д. Затем из полученного множества значений выбираются те строки, коды первых символов которой меньше кодов букв строки ‘Сяяя’ т.е. фамилии начинающиеся с букв ‘Са’, ‘Сб’ и т.д., вплоть до ‘Сяяю…’ (где многоточие означает строку любой длины, состоящую из любых символов). Таким образом, длина фамилии не имеет значения, а отбор производится только по соответствию первых символов строки с установленными границами. Поскольку код буквы ‘я’ больше, чем коды других букв, то в результате в набор данных будут включены все записи, поле Fam которых содержит значение, начинающееся с буквы ‘С’. Вероятность же того, что при осмысленном заполнении таблицы найдутся записи, содержащие поля, которые включают подстроку ‘яяя’ бесконечно близка к нулю.
ЛАБОРАТОРНАЯ РАБОТА №3
Фильтрация данных в БД
Цель работы: освоить осуществление сортировки и фильтрации в таблице базы данных по выражению и по диапазону.
Постановка задачи: осуществить сортировку и фильтрацию в базе данных «Школа» по полям, имеющим различные типы данных по выражению и по диапазону.
Задание 1. Используйте модуль данных для размещения невизуальных компонентов доступа к данным.
1. Запустите приложение, созданное в лабораторной работе №2.
2. Для размещения невизуальных компонентов доступа к данным в приложении баз данных используйте специальную «форму»- модуль данных (класс TDataModule). Для создания модуля данных выполните команду: File-New-DataModule .
Примечание: Преимуществом размещения компонентов доступа к данным в модуле данных является то, что изменение значения любого свойства проявится сразу же во всех обычных модулях, к которым подключен этот модуль данных. Кроме этого, все обработчики событий этих компонентов, т.е. вся логика работы с данными приложения собраны в одном месте, что тоже весьма удобно.
3. Перенесите на нее невизуальные компоненты Table_Deti и Source_Deti и настройте их в соответствии с таблицей.
Компонент |
Свойство |
Значение |
DataModule1 (File- New- Data Module) |
Name |
DM |
TTable |
Name DataBaseName TableName Active |
T_Deti School School.db True |
TDataSource |
Name DataSet |
DS_Deti T_Deti |
4. Сохраните форму под именем U_DM.
5. Свяжите приложение с модулем данных, для этого включите имя модуля U_DM в секцию Uses:
…
implementation
uses U_DM;
…
6.Поместите на главную форму компонент TMainMenu. Элементы главного меню должны содержать следующие пункты: Фильтрация, Поиск, Отчеты, О программе.
7.Добавьте к приложению новую форму, разместив на форме компоненты TDBGrid, TDBNavigator, настройте соответствующие свойства этих компонентов, и сохраните созданную форму под именем U_Filtr. (см. рис.3.1)
8. Для организации фильтрации поместите на форму компоненты и настройте их свойства в соответствии с таблицей 3.1.
Таблица 3.1. Основные свойства компонентов приложения
Компонет |
Свойство |
Значение |
Форма (TForm) |
Caption Position Name |
Фильтрация в базе данных poScreenCenter F_Filtr |
DBGrid1 |
DataSource |
DM.Source_Deti |
TDBNavigator1 |
DataSource |
DM.Source_Deti |
GroupBox1 (На странице Standart) |
Caption |
Фильтрация |
TCheckBox1 |
Caption |
По фамилии |
CheckBox2 |
Caption |
По классу |
CheckBox3 |
Caption |
По дате |
BitButton1 (на странице Additional) |
Kind |
bkOK |
ComboBox1 (На странице Standart) |
Items |
Дмитрий Ксения |
ComboBox2 (На странице Standart) |
Items |
1 … 11 |
ComboBox3 (На странице Standart) |
Items |
A Б |
DateTimePicker1 (На странице Win32) |
Kind DateFormat |
DtkDate dfLong |
DateTimePicker2 (На странице Win32) |
Kind DateFormat |
DtkDate DfLong |
GroupBox2 (На странице Standart) |
Caption |
Сортировка |
RadioButton1 |
Caption |
По фамилии |
RadioButton2 |
Caption |
По имени |
RadioButton3 |
Caption |
По классу |
RadioButton4 |
Caption |
По дню рождения |
RadioButton5 |
Caption |
По полу |
Button1 |
Caption |
Фильтровать |
Некоторые процедуры приложения приведены в листинге 3.1.
Листинг 3.1. Некоторые процедуры приложения «Школа»
Код программы:
unit School;
………….
implementation
uses U_DM;
{$R *.dfm}
//Фильтровать по датам рождения
procedure TForm1.BitBtn1Click(Sender: TObject);
var d1,d2:tdate;
begin
DM.T_Deti.IndexFieldNames:='dr'; //установить текущий индекс
d1:=DateTimePicker1.Date; d2:=DateTimePicker2.Date;
with DM.T_Deti do
begin
setrange([d1],[d2]);
applyRange; // применить диапазон
end;
end;
//Фильтровать по имени
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Dm.T_Deti.IndexFieldNames:='Name'; //Установка текущего индекса по полю Name
Dm.T_Deti.Filter := 'Name=' + QuotedStr(ComboBox1.text);
Dm.T_Deti.FilterOptions:=[foCaseInsensitive]; //Не учитывать регистр
Dm.T_Deti.Filtered:=true;
end;
//Фильтровать по классу
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
Dm.T_Deti.IndexFieldNames:='Klass;B'; //Установка текущ. индекса по полям Klass и B
Dm.T_Deti.Filter := '(Klass=' + QuotedStr(ComboBox2.text)+') and ( '+'B=' +
QuotedStr(ComboBox3.text)+’)’;
Dm.T_Deti.Filtered:=true;
end;
//Фильтровать по двум полям: по классу и имени
procedure TForm1.Button1Click(Sender: TObject);
begin
dm.T_Deti.Filtered:=False; // Отменим предыдущий фильтр
if (CheckBox1.Checked) and(CheckBox2.Checked) //если выбраны два поля
then //Устанавливаем фильтр по двум соответствующим полям
dm.T_Deti.Filter:='Name='+ QuotedStr(ComboBox1.Text)+' and '+ 'Klass= ' +
QuotedStr(ComboBox2.Text);
dm.T_Deti.Filtered:=True; //Применить новый фильтр
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
//если флаг установлен, то сделать доступным ComboBox1
if CheckBox1.Checked then ComboBox1.Enabled:=true
else begin
//если флаг не установлен, то сделать не доступным ComboBox1
ComboBox1.Enabled:=false;
ComboBox1.Text:='';
dm.T_Deti.Filtered := false; //и показать все записи, т.е. отменить фильтр
end;
end;
procedure TForm1.CheckBox2Click(Sender: TObject);
begin
//если флаг установлен, то сделать доступным ComboBox2
if CheckBox2.Checked then begin
ComboBox2.Enabled:=true ;
ComboBox3.Enabled:=true ;
end
else begin
//если флаг не установлен, то сделать не доступным ComboBox2 и ComboBox3
ComboBox2.Enabled:=false;
ComboBox3.Enabled:=false;
ComboBox2.Text:='';
dm.T_Deti.Filtered := false; // отменить фильтр
end;
end;
procedure TForm1.CheckBox3Click(Sender: TObject);
var d1,d2:tdate;
begin
if CheckBox3.Checked then begin
DateTimePicker1.Enabled:=true;
DateTimePicker2.Enabled:=true;
end
else begin
DM.T_Deti.IndexFieldNames:='dr';
d1:=DateTimePicker1.Date;
d2:=DateTimePicker2.Date;
DateTimePicker1.Enabled:=FALSE;
DateTimePicker2.Enabled:=FALSE;
with DM.T_Deti do
begin
setrange([d1],[d2]);
CancelRange; //и показать все записи
end;
end;
end;
//Сортировать по фамилии
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
if RadioButton1.Checked then DM.Table_Deti.IndexFieldNames:=’Fam’;
end;
end.
Задания для самостоятельного выполнения:
1. Самостоятельно выполните фильтрацию по полу, по фамилии, по адресу.
2. Дополните обработчик события TForm1.Button1Click таким образом, чтобы при выборе любой конфигурации из двух полей происходила фильтрация данных.
3. Напишите обработчики событий для сортировки БД по выбранному полю.
|
Вопросы для самоконтроля |
1. Определение первичного ключа.
2. Как создать индексированные поля в таблице?
3. Укажите, какие действия необходимо выполнить по созданию вторичных ключей?
4. Для чего используется модуль данных ТDataModule?
5. В чем заключается фильтрация данных?
6. В чем заключается сортировка данных?
7. Какое значение имеет индексирование полей при фильтрации?
Тема 4. Организация поиска в базе данных
|
Краткие теоретические сведения |
Поиск записи, удовлетворяющей определенным условиям, означает переход на эту запись. Поиск похож на фильтрацию, но в отличие от фильтрации количество записей в наборе данных не изменяется. При поиске немаловажное значение имеет индексирование, так как оно позволяет значительно ускорить процесс поиска, а выполнение некоторых методов поиска вообще невозможно без индексирования. Существует несколько методов поиска данных в БД.
1. Метод Locate обеспечивает поиск записи, содержащей заданные поля и удовлетворяющей условиям поиска. Метод имеет такой формат:
Locate (const KeyField:String, const KeyValues:Variant, Options:TLocateOptions):Boolean;
Указатель устанавливается на первую встреченную запись, удовлетворяющую условию поиска. Если запись найдена, то Locate=true, если нет, то Locate=false.
В параметре KeyField указывается список полей (через ;), по которым ведется поиск;
KeyValues – указывается значение полей для поиска;
Options – задает значения, которые обычно используются для поиска строк. Параметр Options может принимать комбинацию значений:
1. loCaseInsensitive – регистр букв не учитывается (Петров=ПеТрОв=петров= …);
2. loPartialKey – запись удовлетворяет условию поиска, если она содержит только часть искомой строки. При этом символ ‘*’‚ не используется, то есть если в качестве искомого значения задана строка ‘Се’, то будет найдена первая запись, содержащие в искомом поле значения ‘Селин’,’Семенов’ и т.д.
Опции 1. и 2. записываются в [].
Пример поиска по одному полю:
table1.Locate ( ‘Kod’, 123, []); – в результате выполнения оператора указатель записи установится на запись, у которой в поле Kod число123.
Пример поиска записей по нескольким полям.
В методе Locate параметр KeyValues является массивом Variant, в котором содержится несколько значений.
Функция VarArrayOf – приводит к типу вариантного массива. Значения функции разделяются « , » и заключаются в []; порядок значений соответствует порядку полей параметра KeyField.
table1.Locate (Tovar;Kolvo ,Vararrayof([ Шоколад , 24 ]),[loCaseInsensitive, loPartialKey] );
– в результате выполнения оператора указатель записи установится на запись, у которой в поле Tovar значится ‘Шоколад’ и в поле Kolvo число 24.
2. Метод Lookup осуществляет поиск только на полное соответствие критерия поиска и значения полей записи и имеет следующий синтаксис:
Lookup (const KeyField:String; const KeyValues:Variant; const ResultFields:string):Variant;
Данная функция, аналогично методу Locate, обеспечивает поиск записи, удовлетворяющей заданным условиям, однако не делает найденную запись текущей, а возвращает значения некоторых полей данной записи. Тип результата — Variant или вариантный массив, содержащий значения полей записи, перечисленных в параметре ResultFields. Размерность результирующего массива зависит от списка полей, приведенного в данном параметре.
Параметры KeyField и KeyValues имеют то же назначение, что и одноименные параметры метода Locate (т.е. набор полей и критерии поиска соответственно).
В случае если поля поиска входят в какой-либо индекс, он будет автоматически использован при поиске, то есть записи будут упорядочены в соответствии с данным индексом.
В случае неудачного поиска метод возвращает значение Null. Для распознавания такого результата может быть использована функция VarIsTrue (const V: Variant): Boolean, которая принимает значение True, если параметр V равен Null. Следует учитывать, что, если результатом поиска является массив, то даже в случае успешного поиска некоторые поля найденной записи могут быть пустыми. Поэтому необходимо проверять значение каждого элемента результирующего массива, не равно ли оно Null.
В качестве поисковых полей могут быть указаны поля как входящие в какой-либо индекс, так и не входящие в него. Если искомые поля входят в индекс, то осуществляется его автоматическое применение.
Пример поиска записей ьетодом Lookup. Пусть имеется база данных, содержащая информацию о рейсах самолетов. Необходимо найти запись и извлечь из нее данные о номере рейса и времени отправления самолета. Пункт отравления и пункт прибытия задается пользователем, и по этим данным осуществляется поиск (для упрощения предполагается, что отправление рейсов происходит ежедневно).
Для решения этой задачи следует, прежде всего, создать таблицу с необходимыми сведениями, а затем разработать форму приложения примерно такого вида, как показано на рис.4.1.
Из рисунка видно, что в верхней части располагается список всех рейсов. Немного ниже располагаются два однострочных редактора, в поле которых вводятся искомые названия пунктов отправления и прибытия. По нажатию кнопки Найти, в случае успешного поиска, внизу окна выводится номер рейса и время отправления самолета. Следует обратить внимание на то, что указатель текущей записи при этом не изменяет своего положения (это можно видеть на приведенном рисунке).
Программная реализация решения данного примера отражена в листинге 4.1.
Листинг 4.1. Код программы «Расписание движения»
…
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
Var Res:Variant;
begin
//Поиск
Res:=Table1.Lookup('Punkt_Dep;
Punkt_Arr',VarArrayOf([Edit1.Text,Edit2.Text]),'Nom_r;Time_Dep');
// Анализ результатов поиска
//Проверка, найдена ли запись
if VarIsNull(Res)
then MessageDlg('Запись не найдена!',mtError,[mbOk],0)
else begin
//Проверка первой составляющей результата
if VarIsNull(Res[0])
then Label5.Caption:='№ рейса неизвестен!'
//отображение номера рейса с преобразованием результата к строковому типу
else Label5.Caption:='Рейс № '+String(Res[0]);
//Проверка второй составляющей результата
if VarIsNull(Res[1])
then Label6.Caption:='Время отправления неизвестено!'
//отображение времени отправления с преобразованием результата к строковому типу
else Label6.Caption:='Время отправления: '+String(Res[1]);
end;
end;
end.
3. Метод FindKey- поиск на полное соответствие.
FindKey(const KeyValues:Array of const):Boolean;
Позволяет найти запись по указанным значениям задаваемым параметром KeyValues. Список полей не задается. Поиск ведется по полям, на основе которых построен текущий индекс.
4. Метод FindNearest- поиск на частичное соответствие.
FindNearest (const KeyValues:Array of const):Boolean; аналогичен методу FindKey, однако производит поиск по частичному совпадению критерия поиска и значений полей записи. Поиск с помощью данного метода всегда является успешным. Указатель перемещается на запись, в наибольшей степени отвечающую условиям поиска.
ЛАБОРАТОРНАЯ РАБОТА №4
Организация поиска в БД
Цель: научиться использовать в приложениях различные методы поиска.
Постановка задачи: Организовать поиск в базе данных «Школа», используя рассмотренные выше методы.
Задание 1. Реализуйте поиск записей в БД «Школа», используя метод Locate.
1. Добавьте к приложению новую форму, разместив на форме компоненты TDBGrid, TDBNavigator, настройте соответствующие свойства этих компонентов, и сохраните созданную форму под именем U_Poisk (см. рис.4.2)
2. Для организации поиска записей поместите на форму компоненты и настройте их свойства в соответствии с таблицей 4.1.
|
Вопросы для самоконтроля |
1. В чем заключается поиск записей?
2. Какое значение имеет индексирование при поиске?
3. В чем заключается метод поиска Locate?
4. Для чего предназначены параметры Options: LoCaseInsensitive, LoPartialKey?
5. В чем заключается метод поиска Lookup. Что такое - вариантный массив?
6. В чем заключается метод поиска FindKey?
7. В чем заключается метод поиска FindNearest?
Тема 5. Создание простейшего отчета
|
Краткие теоретические сведения |
Процесс создания отчета с использованием генератора отчетов Rave Reports состоит из трех этапов. Первый выполняется в визуальной среде Rave Reports, второй и третий — в среде разработки Delphi.
1. На первом этапе в визуальной среде Rave Reports создается проект отчета и в нем необходимые страницы, объекты доступа к данным. На страницах располагаются элементы оформления, при необходимости к ним подключаются просмотры данных (если отчет отображает информацию из таблиц базы данных). И в завершение этапа готовый проект отчета сохраняется в файле с расширением rav.
2. На втором этапе в проект приложения в Delphi переносятся компоненты TRvProject и TRvSystem со страницы Rave Палитры компонентов. При этом в состав приложения автоматически включается ядро генератора отчета. Первый компонент связывается с файлом проекта отчета и представляет в приложении отчет со всеми его свойствами, страницами, элементами оформления и т. д. Второй компонент связывается с первым, взаимодействует с ядром генератора отчетов и обеспечивает печать отчета из приложения.
3. На третьем этапе создается программный код, обеспечивающий выполнение функций приложения, связанных с отчетом.
ЛАБОРАТОРНАЯ РАБОТА № 5
Создание простейшего отчета
Цель: Научиться создавать проект отчета в среде Rave Reports. Освоить программирование задачи создания простейшего отчета, конструируя форму и наполняя обработчик события описаниями и операторами, соответствующими заданию
Постановка задачи. Требуется создать простейший отчет об учащихся школы.
Этап 1. Создание файла отчета в визуальной среде Rave Reports.
1. Для создания файла отчета выполните команду: Tools- Rave Designer. Для начала создадим в визуальной среде Rave Reports новый проект (команда File | New главного меню). Обратите внимание, что по умолчанию вместе с проектом создается первый отчет Reportl с одной страницей Pagel. Его мы и используем, переименовав в rp_Deti. Проекту присвоим имя Otchet. Сохраните отчет в папке с программой: имя_диска:\School\PRG\Reports.rav.
2. Основой, без которой нельзя использовать полосы (элементы Band и DataBand), является элемент Region. Он ограничивает часть страницы, на которой будут печататься данные. Поместите на страницу элемент Region Component (страница Report).
3. Главную роль в отчетах для приложений баз данных играют полосы. Это невизуальные элементы оформления, моделирующие горизонтальную область или строку отчета. На странице Report доступны два таких элемента. Обычная полоса Band создает горизонтальную область, которая не изменяет свое абсолютное или относительное положение на странице.
Элемент оформления DataBand обеспечивает размножение строк отчета в соответствии с числом строк набора данных.
4. На полосе Band1 разместите элемент оформления Text1 (страница Standart) и свойству Text присвойте значение «Список учащихся школы»; Text2 (страница Standart) и свойству Text присвойте значение «№ Фамилия Имя Отчество Класс День рождения Адрес».
5. Свяжите полосы с объектом просмотра в соответствии с таблицей 5.1:
Таблица 5.1. Значения свойств компонентов
Элемент |
Свойство |
Значение |
Band1 |
ControllerBand BandStyle |
DataBand1 BodyHeader (Заголовок отчета) |
DataBand1 |
ControllerBand BandStyle |
Detail |
Band2 |
ControllerBand BandStyle |
DataBand1 BodyFooter (Подвал отчета) |
1. Добавьте к приложению «Школа» новую форму.
2. Свойству Name присвойте значение F_Otchet
3. Сохраните форму под именем U_Otchet.
4. Свяжите форму с приложением «Школа». Она должна открываться при выборе пункта Отчет главного меню приложения.
5. Разместите на ней компоненты TRvProject, TRvSystem, ТRvDataSetConnection, TTable, TButton и настройте их в соответствии с таблицей 5.2.
Таблица 5.2. Значения свойств компонентов формы U_Otchet
Компонент |
Свойство |
Значение |
TRvProject (На странице Rave) |
Engine ProjectFile
|
RvSystem1 C:\ School \PRG\Reports.rav (Полный путь до файла отчета) |
TRvSystem1(На странице Rave) |
DefaultDest |
rdPreview |
TTable |
Name DataBaseName TableName Active |
Table_Deti School School.db True |
TRvDataSetConnection (На странице Rave) |
DataSet |
Table_Deti |
TButton |
Caption |
Отчет |
6. Запустите приложение.
1. Не закрывая приложение откройте файл отчета.
2. Создайте соединение отчета с источником данных. Основная задача — передать в отчет связанный набор данных. Для создания соединения будем использовать компонент TRvDataSetConnection - создает соединение с любыми компонентами наборов данных, предком которых является класс TDataSet (см. рис. 5.3).
3. Выполните команду File- New Data Object- Direct Data View. После завершения настройки готовое соединение появляется в списке Data View Dictionary. Присвойте ему имя Spisok (см. рис. 5.4).
Рис.5.3 Создание соединения файла отчета с приложением |
Рис.5.4 список Data View Dictionary после завершения настройки
|
4. Далее к работающему соединению можно подключать объекты просмотра данных. Элементы отображения данных представляют собой модифицированные стандартные элементы, размещаются на структурных элементах отчета и отображают данные из связанных с ними полей просмотра данных. Они расположены на странице Report Палитры инструментов.
Элемент DataText предназначен для представления строковых или числовых значений полей связанного просмотра данных.
Элемент СalcText обеспечивает выполнение одной из агрегатных функций над значениями связанного поля и представление результата. Тип операции выбирается в свойстве СalcType.
Каждый из этих элементов связывается с объектом просмотра и полем данных такого просмотра. Для этого используются свойства Dataview и DataField соответственно. Таким образом, каждый элемент оформления DataText размножается вместе с полосой данных и формирует в отчете колонку значений поля набора данных.
Расположив на полосах горизонтальные и вертикальные линии, можно легко оформить данные в табличном виде.
Таблица 5.3. Значения свойств элементов отображения данных отчета
Элемент |
Свойство |
Значение |
DataBand1 |
DataView |
Spisok. |
СalcText (разместить на полосе Band2) |
Controller CalcType DataField |
DataBand1 ctCount Fam |
Text3 |
Text |
Итого в школе обучается |
Text4 |
Text |
учащихся |
DataText1 (разместить на полосе DataBand1) |
DataField DataView |
Poim_N Spisok. |
DataText2 |
DataField DataView |
Fam Spisok. |
DataText3 |
DataField DataView |
Name Spisok. |
DataText4 |
DataField DataView |
Otch Spisok. |
DataText5 |
DataField DataView |
Klass Spisok. |
DataText6 |
DataField DataView |
DR Spisok. |
DataText7 |
DataField DataView |
Adress Spisok. |
7. Просмотрите отчет. Чтобы просмотреть отчет не выходя из Rave Reports нажмите F9
Этап 5. Создание программного кода, обеспечивающего выполнение функций приложения, связанных с отчетом.
1. На кнопку Button1 напишем обработчик события:
procedure TForm1.Button1Click(Sender: TObject);
begin
RvProject1.SelectReport('Spisok',False) ;
RvProject1.Execute;
end;
Обратите внимание на очень важную деталь — чтобы все сделанные настройки действительно сработали, печать отчета необходимо выполнять только методом Execute компонента TRvProjeet.
Дополнительное задание. Усложним задание. Создадим программный код, обеспечивающий вывод списка учеников заданного класса.
1. Добавим на форму компоненты TLabel, TComboBox и настроим их (см. рис. 5.6).
2. Можно обеспечить дополнительную фильтрацию записей, передаваемых из набора данных в отчет. Для этого используется метод-обработчик type TRPValidateRowEvent = procedure(Connection: TRvCustomConnection; var ValidRow: Boolean);
property OnValidateRow: TRPValidateRowEvent;
Параметр ValidRow управляет отправкой отдельной записи отчету: при значении True запись пропускается в отчет.
Напишем обработчик события:
procedure TForm1.RvDataSetConnection1ValidateRow(Connection:TRvCustomConnection;
var ValidRow: Boolean);
begin
with TRvDataSetConnection(Connection) do
ValidRow :=DataSet.FieldByName('Klass').AsInteger =StrToInt(ComboBox1.Text);
end;
3. Обеспечьте дополнительную фильтрацию записей, передаваемых из набора данных в отчет, т.е реализуйте возможность формирования следующих отчетов:
|
Вопросы для самоконтроля |
1. Поясните назначение среды Rave Reports.
2. Перечислите основные этапы создания простейшего отчета БД.
3. Укажите, какие действия необходимо выполнить для связи отчета с приложением.
4. Перечислите невизуальные компоненты, которые используются при создании отчетов.
5. Перечислите визуальные компоненты, которые используются при создании отчетов.
6. Как обеспечить дополнительную фильтрацию записей, передаваемых из набора данных в отчет.
В нашем каталоге доступно 74 320 рабочих листов
Перейти в каталогПолучите новую специальность за 2 месяца
Получите профессию
за 6 месяцев
Пройти курс
Рабочие листы
к вашим урокам
Скачать
Получите профессию
за 6 месяцев
Пройти курс
Рабочие листы
к вашим урокам
Скачать
Цель данного учебного пособия: научить программировать в среде Delphi, т.е. создавать законченные программы различного назначения. Усвоение материала учебного пособия будет способствовать: - повышению общей эрудиции в области современных концепций и средств программирования; - формированию целостного представления о средствах автоматизации разработ-ки программных продуктов; - умению самостоятельно ориентироваться в инструментальных средствах программирования; - развитию умения отбирать и осваивать новые информационные программные продукты; Учебное пособие предназначено для студентов, чья информационная культура и программистская компетентность войдут органичными составными частями в структуру их будущей профессиональной деятельности.
6 662 308 материалов в базе
Настоящий материал опубликован пользователем Кузнецова Галина Валерьевна. Инфоурок является информационным посредником и предоставляет пользователям возможность размещать на сайте методические материалы. Всю ответственность за опубликованные материалы, содержащиеся в них сведения, а также за соблюдение авторских прав несут пользователи, загрузившие материал на сайт
Если Вы считаете, что материал нарушает авторские права либо по каким-то другим причинам должен быть удален с сайта, Вы можете оставить жалобу на материал.
Удалить материалВаша скидка на курсы
40%Курс профессиональной переподготовки
500/1000 ч.
Курс повышения квалификации
36 ч. — 144 ч.
Курс повышения квалификации
36 ч. — 180 ч.
Курс повышения квалификации
36 ч. — 180 ч.
Мини-курс
6 ч.
Мини-курс
3 ч.
Мини-курс
4 ч.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.