Добавить материал и получить бесплатное свидетельство о публикации в СМИ
Эл. №ФС77-60625 от 20.01.2015
Инфоурок / Информатика / Другие методич. материалы / Разработка программ в среде Delphi 7

Разработка программ в среде Delphi 7

Идёт приём заявок на самые массовые международные олимпиады проекта "Инфоурок"

Для учителей мы подготовили самые привлекательные условия в русскоязычном интернете:

1. Бесплатные наградные документы с указанием данных образовательной Лицензии и Свидeтельства СМИ;
2. Призовой фонд 1.500.000 рублей для самых активных учителей;
3. До 100 рублей за одного ученика остаётся у учителя (при орг.взносе 150 рублей);
4. Бесплатные путёвки в Турцию (на двоих, всё включено) - розыгрыш среди активных учителей;
5. Бесплатная подписка на месяц на видеоуроки от "Инфоурок" - активным учителям;
6. Благодарность учителю будет выслана на адрес руководителя школы.

Подайте заявку на олимпиаду сейчас - https://infourok.ru/konkurs

  • Информатика

Поделитесь материалом с коллегами:


СРЕДНЯЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА №17











Учебное пособие

«Разработка программ в среде Delphi













Разработчик: Коккозов Н.Т.

























г. Семей, 2016

Содержание



Введение


Раздел 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. Главное и контекстное меню приложения

hello_html_m7ca959ad.png

Краткие теоретические сведения

Большинство сложных программ обладают системой меню, которая предназначена для выбора различных путей выполнения приложения. Меню представляет собой набор команд, при выборе каждой из которых выполняются определенные программистом действия. В Delphi есть два компонента, используемые для создания меню: TMainMenu- главное меню и TPopupMenu - вспомогательное меню.

TMainMenu. Является невизуальным компонентом. При выполнении программы будет видно только меню, которое сгенерирует TMainMenu.
Обычно на форме достаточно одного главного меню и, соответственно, элемента
TMainMenu. В этом случае свойству Menu формы, на которой расположено TMainMenu, автоматически присваивается имя данного компонента, т.е. значение его свойства Name. Однако на одной форме возможно размещение нескольких компонентов TMainMenu с различными разделами. Тогда свойству Menu формы присваивается имя одного из них. А при выполнении программы это свойство можно изменять, преобразуя соответствующим образом разделы главного меню приложения.

Нhello_html_m69809b5d.gifаиболее важным свойством TMainMenu является свойство Items. Его заполнение производится с помощью окна Menu Designer (конструктора меню), которое можно вызвать тремя способами. Во-первых, щелкнув мышью два раза по компоненту TMainMenu. Во-вторых, нажав на кнопку, расположенную в правой части свойства Items в инспекторе объектов. Или нажать на элементе правую кнопку мыши и в контекстном меню выбрать команду Menu Designer. Результат любого из трех действий представлен на рис.1.1.















В этом окне проектируется меню. Для создания разделов в конструкторе меню необходимо выделить рамку, состоящую из точек, которая обозначает
место расположения нового раздела. Затем в Object Inspector в
свойстве Caption задать заголовок раздела (например, Файл). После
чего щелкнуть мышью на этом разделе — автоматически появляется подменю этого раздела (снизу) и следующий раздел (справа) , (см. рис.1.1).

Используя мышь можно менять расположение разделов (порядок их следования).

При работе в Menu Designer можно использовать его локальное меню (см. рис. 1.2).

hello_html_m7f3abb3d.gif













Его пункты выполняют следующие действия:

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

Делает помеченным этот элемент из всех, у
которых GroupIndex одинаков. Размещает рядом с элементом кружок (при Тгuе).

ShortCut

Предлагает установить код клавиши быстрого реагирования.



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

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

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



ЛАБОРАТОРНАЯ РАБОТА №1.

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

Цель: Научиться создавать главное и контекстное меню приложения.

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

Данное приложение работает следующим образом: при открытии приложения содержимое файла memos.txt записывается в компонент TRichEdit. Там с текстом, с помощью меню, могут производиться следующие действия — копирование фрагмента текста в буфер обмена, вставка текста из буфера, вырезание текста, выделение всего текста. Предоставляется возможность сохранять файл под тем же именем. Выход из программы осуществляется по выбору меню Выход.

hello_html_2d8b1d10.gif

















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 EditAlign.

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. Запустите приложение и проверьте его работу.

hello_html_525da950.png

Вопросы для самоконтроля

  1. Какой компонент используется для создания главного меню?

  2. Какой компонент используется для создания контекстного меню?

  3. В чем заключается отличие главного и контекстного меню?

  4. Как связать пункты главного и контекстного меню?

  5. Как установить иконку (значок) в меню?

  6. По какому событию генерируется процедура обработки пункта меню?



Тема 2. Компоненты диалога среды визуального проектирования

hello_html_m7ca959ad.png

Краткие теоретические сведения

Компоненты TOpenDialog и TSaveDialog невидимы во время выполнения программы, – окна диалога активизируются лишь при определенных событиях, задаваемых в проекте. Чаще всего это выбор команды меню или нажатие кнопки.

Тhello_html_m14fe518e.gifOpenDialog. Компонент 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 (Фильтр) — сам фильтр.

Из программы фильтры задаются одной строкой:
OpenDialog1. Filter = ‘файлы проектов | *dpr| Текстовые файлы| * txt’; Здесь указаны два фильтра — для отбора файлов проектов и текстовых.

FilterIndex

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

InitialDir

Позволяет установить начальный каталог поиска программно:
OpenDialog1. InitialDir:=’c:\’; либо в Object Inspector.



Характеристики диалогового окна напрямую зависят от свойства 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:

hello_html_m2143462a.gif















Основные свойства и значения пунктов меню приведены в таблице 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 для выделения неполного имени файла, таким образом, чтобы на месте заголовка формы, кроме самого заголовка формы, отображалось ещё и неполное имя выбранного файла.

hello_html_525da950.png

Вопросы для самоконтроля

  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. Экранная среда и многодокументные приложения

hello_html_m7ca959ad.png

Краткие теоретические сведения

Для каждого нового приложения в 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. Список пунктов главного меню приложения “Текстовый редактор”

Название пункта (Сарtn)

Имя пункта (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. Пунктам контекстного меню назначьте соответствующие горячие клавиши и значки (иконки).



hello_html_525da950.png

Вопросы для самоконтроля

  1. Что такое MDI приложение?

  2. Какая форма называется родительской?

  3. Какая форма называется дочерней?

  4. Перечислите методы, специфичные для MDI-форм.

  5. Какую особенность имеет событие OnActivate для MDI-приложений?



Тема 4. Развитые элементы интерфейса. Панели инструментов

hello_html_m7ca959ad.png

Краткие теоретические сведения

Панель инструментов — это сложный элемент управления, обычно содержащий набор кнопок быстрого доступа TSpeedButton или TToolButton и комбинированных списков TСотbоBох, хотя могут быть также добавлены и другие компоненты, например, однострочный редактор Edit. Панели инструментов служат для упрощения вызова часто используемых команд. Если в приложении есть главное меню TМainМепи, то элементы панели инструментов, как правило, дублируют действия пунктов этого меню, вызывая соответствующие обработчики событий OnClick.

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

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

На рис. 4.1 показано, как выглядит одна из панелей инструментов среды разработки Delphi.

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

В 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.



hello_html_58bf7a42.gif















Программная реализация решения поставленной задачи приводится в листинге 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;


hello_html_525da950.png

Вопросы для самоконтроля

  1. Для чего служат панели инструментов?

  2. Перечислите виды панелей инструментов.

  3. Как сделать кнопки на панели инструментов плоскими?

  4. Как разбить кнопки на панели инструментов на группы?

  5. Чем отличается кнопка TToolButton от кнопки TSpeedButton?

  6. Как связать панель инструментов с главным меню программы?







Тема 5. Способы оформления приложений

hello_html_m7ca959ad.png

Краткие теоретические сведения

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

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

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

С помощью Инспектора объектов устанавливаются такие параметры (свойства) формы:

;
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).

hello_html_m4f62bf01.gif













Как видно из рис. 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. Откройте с помощью FileNew новую форму, свойству Name формы присвойте значение Zast.

  2. Удалите значение свойства Caption.

  3. Свойству BorderStyle присвойте значение bsNone (результат увидите только при запуске программы).

  4. Для удаления кнопок минимизации, максимизации формы и системного меню установите у свойства BorderIcons значения подсвойств biMinimize, biMaximize, biSystemMenu равными False( результат увидите только при запуске программы).

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

  6. Сохраните проект, определив имя второго программного модуля проекта как Zastavka.

  7. Выполните команду ViewProject 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;

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

CurrentTime:=GetTickCount div 1000;
{ Процедура CurrentTime возвращает время работы Windows в миллисекундах}
while((GetTickCount div 1000)<(CurrentTime+4)) do;
{ Организация паузы в 4 секунды}
Объявите переменную
CurrentTime типа Longint.

  1. Поместите на форму заставки компонент TImage из закладки Additional палитры компонентов. Выберите свойство Picture объекта Image1. В появившемся окне Picture Editor щелкните по кнопке Load, выберите файл с картинкой для загрузки картинки в окно Picture Editor. Для того, чтобы растровое изображение внутри объекта Image1 занимало всю клиентную область, требуется изменить значение свойства Stretch образа на True.

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

  3. Запустите приложение и просмотрите результат работы.

Задание 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. Дhello_html_5b5ac29b.gifhello_html_m6c237dd.gifля этого компонента с помощью Инспектора объектов через свойство Panels вызовите редактор EditingStatusBar.Panel, в котором добавьте шесть панелей. Начальные установки для каждой панели задаются путем изменения свойства Text в соответствии с рис. 5.3.












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

  2. Для всех кнопок панели 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;


hello_html_525da950.png

Вопросы для самоконтроля

  1. Для чего предназначена заставка программы?

  2. Как выглядит типичная заставка программного продукта?

  3. Какие свойства следует определить для формы заставки и для чего?

  4. Почему создание, отображение и удаление формы-заставки осуществляется в файле проекта?

  5. Для чего предназначено информационное окно программы?

  6. Какими способами можно создать информационное окно программы?

  7. Для чего предназначена строка состояния TStatusBar?

  8. Назначение индикаторов.

  9. Какие, по вашему мнению, дополнительные способы оформления приложений можно использовать при создании программного продукта?















Раздел 2. Базы данных

Тема 1. Основы баз данных

hello_html_m7ca959ad.png

Краткие теоретические сведения

Процесс создания базы данных может быть представлен как последовательность следующих шагов:

  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.

  1. Для того, чтобы создать новый псевдоним, выберите в меню команду Object \ New.

  2. В открывшемся диалоговом окне New Database Alias (Новый псевдоним базы данных) из списка Database Driver Name, в котором перечислены зарегистрированные в системе драйвера доступа к базам данных, нужно выбрать драйвер для создаваемой базы данных, т.е. фактически выбрать тип создаваемой базы данных. (По умолчанию предлагается драйвер STANDART, который обеспечивает доступ к таблицам в формате PARADOX. Выберите драйвер и щелкните на кнопке ОК. (В список псевдонимов будет добавлен новый элемент, рис. 1.1).

  3. После этого нужно изменить автоматически созданное администратором имя псевдонима STANDART на псевдоним School и задать путь к файлам базы данных, для которой создается псевдоним. Путь к файлам базы данных можно ввести на вкладке Definition в поле Path с клавиатуры или воспользоваться стандартным диалоговым окном Select Directory (Выбор каталога), которое открывается щелчком на кнопке [...], находящейся в конце поля Path. Здесь выберите путь: имя диска:\School \Data для нового псевдонима и [ok].

hello_html_45a6ed4d.gif











6. Щелчком правой кнопки мыши по псевдониму School вызовите контекстное меню и выберите команду Apply (применить).

Задание 2. Создайте структуру таблицы базы данных «Школа».

  1. Запустите DataBase Desktop из программной группы Delphi 7.

  2. Укажите рабочий каталог, выполнив команду File\Work Directory и File\Private Directory.

    hello_html_28794b57.png

    Рис.2. Диалоговое окно

    Set Private Directory

    .hello_html_66b77c83.png

    Рис.3. Диалоговое окно Set Working Directory

  3. Cоздайте таблицу School.db командой File\New\Table.

  4. Выберите тип таблицы Paradox 7.

  5. Определите поля, входящие в таблицу School.db, как показано на рисунке 1.4.(Field Name-имя поля,Type- тип поля, Size- размер, Key- указывается, если поле входит в состав первичного ключа, определяется первым в списке).



hello_html_m2010fa0c.png

Рис.1.4. Окно создания структуры таблицы


  1. Полям Kod, FAM, Name, Klass, Pol назначить атрибут Required, это требование обязательного существования значения у поля на момент его запоминания в таблице.

  2. Определите минимальное и максимальное значения поля Klass, равные 1 и 11. (Minimum value, Maximum value)

  3. Определите значение поля по умолчанию: 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.




hello_html_m7ae9ddb6.gif










Задание 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


  1. Сохраните созданное приложение в своей папке (Команда File-Save all).

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


hello_html_525da950.png

Вопросы для самоконтроля

  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.

  1. Установите свойство ShowHint для объекта DBNavigator1 равным True (для появления подсказок, когда курсор будет задерживаться над кнопкой панели).

  2. Отредактируйте подсказки (переведите подсказки на русский язык), используя свойство Hints.

First recordпервая запись

Prior record- последняя запись

Next record- следующая запись

Last record- предыдущая запись

Insert record- вставить запись

Delete record- удалить запись

Edit record- редактировать запись

Post edit- сохранить запись

Cancel edit- отменить редактирование

Refresh data- обновить данные


  1. Замените свойство Align для объекта DBGrid1 на alNone и поместите на форму справа от объекта DBGrid1 компонент DBImage1 для просмотра поля BMP записи. Для объекта DBImage1 установите свойство Strech равным True для того, чтобы помещаемое изображение занимало всю область внутри DBImage1. Установите значения свойств DataSourse и DataField объекта DBImage1.

  2. Поместите на форму компонент Image1 (вкладка Additional)- для ввода изображения.

  3. Включите в секцию Uses имя модуля Clipbrd- чтобы использовать работу с функцией вставки-выбора из буфера.

  4. Поместите на верхнюю панель кнопку Close.

  5. Поместите на форму компонент OpenPictureDialog1 (вкладка Dialogs)- для поиска изображения для ввода в таблицу и кнопку BitBtn2 «Добавить фото».

  6. Как происходит ввод изображения? С помощью кнопки «Добавить фото» нужно выбрать необходимое изображение (оно поместится в компонент Image1) и нажать кнопку Сохранить Навигатора. Изображение вставится в таблицу (компонент DBImage1) через буфер памяти, куда предварительно помещается из объекта Image1, в котором оказывается после выбора по OpenPictureDialog1.

Дhello_html_4e6bc413.gifобавьте обработчик:

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;

  1. Сохраните созданное приложение базы данных в папке C:\School\PRG.

  1. Запустите созданное приложение базы данных. На верхней панели работающего приложения расположен объект 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.

hello_html_11820cbd.gif

hello_html_525da950.png

Вопросы для самоконтроля

  1. Можно ли изменить структуру уже существующей таблицы?

  2. Для чего предназначены компоненты со страницы DataControl?

  3. Для чего предназначен компонент TOpenPictureDialog?

  4. Как реализовать ввод картинки в базу данных?



Тема 3. Фильтрация данных

hello_html_m7ca959ad.png

Краткие теоретические сведения

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

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

Система Delphi дает возможность осуществлять фильтрации записей

  • по выражению;

  • по диапазону.

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

1. Фильтрация по выражению осуществляется путем установки необходимого значения свойству Filter (тип Srting ) компонента TTable.

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

Достоинством фильтрации по выражению состоит в том, что она применима к любым полям, в том числе к неиндексированным. Так как в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей.

Свойство 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 .

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

  1. Перенесите на нее невизуальные компоненты 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


  1. Сохраните форму под именем U_DM.

  2. Свяжите приложение с модулем данных, для этого включите имя модуля U_DM в секцию Uses:

implementation

uses U_DM;

  1. Поместите на главную форму компонент TMainMenu. Элементы главного меню должны содержать следующие пункты: Фильтрация, Поиск, Отчеты, О программе.

  2. Добавьте к приложению новую форму, разместив на форме компоненты TDBGrid, TDBNavigator, настройте соответствующие свойства этих компонентов, и сохраните созданную форму под именем U_Filtr. (см. рис.3.1)

hello_html_2b5f759c.gif
















  1. Для организации фильтрации поместите на форму компоненты и настройте их свойства в соответствии с таблицей 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. Напишите обработчики событий для сортировки БД по выбранному полю.


hello_html_525da950.png

Вопросы для самоконтроля

  1. Определение первичного ключа.

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

  3. Укажите, какие действия необходимо выполнить по созданию вторичных ключей?

  4. Для чего используется модуль данных ТDataModule?

  5. В чем заключается фильтрация данных?

  6. В чем заключается сортировка данных?

  7. Какое значение имеет индексирование полей при фильтрации?


Тема 4. Организация поиска в базе данных

hello_html_m7ca959ad.png

Краткие теоретические сведения

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

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.

hello_html_5f11cfae.gif














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

Программная реализация решения данного примера отражена в листинге 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.


hello_html_525da950.png

Вопросы для самоконтроля

  1. В чем заключается поиск записей?

  2. Какое значение имеет индексирование при поиске?

  3. В чем заключается метод поиска Locate?

  4. Для чего предназначены параметры Options: LoCaseInsensitive, LoPartialKey?

  5. В чем заключается метод поиска Lookup. Что такое - вариантный массив?

  6. В чем заключается метод поиска FindKey?

  7. В чем заключается метод поиска FindNearest?



Тема 5. Создание простейшего отчета

hello_html_m7ca959ad.png

Краткие теоретические сведения

Процесс создания отчета с использованием генератора отчетов 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 обеспечивает размножение строк отчета в соответствии с числом строк набора данных.

Нhello_html_108d6264.gif
а элементе
Region Component расположите полосы Band и DataBand, как показано на рисунке 5.1.

  1. На полосе Band1 разместите элемент оформления Text1 (страница Standart) и свойству Text присвойте значение «Список учащихся школы»; Text2 (страница Standart) и свойству Text присвойте значение «№ Фамилия Имя Отчество Класс День рождения Адрес».

  2. Свяжите полосы с объектом просмотра в соответствии с таблицей 5.1:

Таблица 5.1. Значения свойств компонентов

Элемент

Свойство

Значение

Band1

ControllerBand

BandStyle

DataBand1

BodyHeader (Заголовок отчета)

DataBand1

ControllerBand

BandStyle


Detail

Band2

ControllerBand

BandStyle

DataBand1

BodyFooter (Подвал отчета)

Этап 2. Создание формы «Отчеты» в среде Delphi, на которой будут располагаться компоненты для связи с отчетом.

  1. Дhello_html_m74c7b2db.gifобавьте к приложению «Школа» новую форму.

  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

Отчет


  1. Запустите приложение.

Этап 4. Установление связи между файлом отчета и приложением Delphi

1. Не закрывая приложение откройте файл отчета.

2. Создайте соединение отчета с источником данных. Основная задача — передать в отчет связанный набор данных. Для создания соединения будем использовать компонент  TRvDataSetConnection - создает соединение с любыми компонентами наборов данных, предком которых является класс TDataSet (см. рис. 5.3).

3. Выполните команду File- New Data Object- Direct Data View. После завершения настройки готовое соединение появляется в списке Data View Dictionary. Присвойте ему имя Spisok (см. рис. 5.4).

hello_html_71dd9a29.png

Рис.5.3 Создание соединения файла отчета с приложением

hello_html_60b722bc.png

Рис.5.4 список Data View Dictionary после завершения настройки


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

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

 Элемент СalcText обеспечивает выполнение одной из агрегатных функций над значениями связанного поля и представление результата. Тип операции выбирается в свойстве СalcType.

Каждый из этих элементов связывается с объектом просмотра и полем данных такого просмотра. Для этого используются свойства Dataview и DataField соответственно. Таким образом, каждый элемент оформления DataText размножается вместе с полосой данных и формирует в отчете колонку значений поля набора данных.

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













hello_html_27e7d039.gif

  1. Для полосы DataBand1 свойству DataView присвоим значение Spisok.

  2. Настройте значения свойств элементов отображения данных отчета в соответствии с таблицей 5.3.

Таблица 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).

hello_html_434f19a4.gif






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. Обеспечьте дополнительную фильтрацию записей, передаваемых из набора данных в отчет, т.е реализуйте возможность формирования следующих отчетов:

  • список мальчиков (девочек) заданного класса;

  • список учащихся школы, родившихся в заданном году;

  • отчет «Личная карточка»- вывод имеющихся данных о заданном ученике;

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


hello_html_525da950.png

Вопросы для самоконтроля

  1. Поясните назначение среды Rave Reports.

  2. Перечислите основные этапы создания простейшего отчета БД.

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

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

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

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







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

Предлагаем учителям воспользоваться 50% скидкой при обучении по программам профессиональной переподготовки.

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

Обучение проходит заочно прямо на сайте проекта "Инфоурок".

Начало обучения ближайших групп: 18 января и 25 января. Оплата возможна в беспроцентную рассрочку (20% в начале обучения и 80% в конце обучения)!

Подайте заявку на интересующий Вас курс сейчас: https://infourok.ru/kursy

Автор
Дата добавления 15.02.2016
Раздел Информатика
Подраздел Другие методич. материалы
Просмотров547
Номер материала ДВ-457147
Получить свидетельство о публикации

УЖЕ ЧЕРЕЗ 10 МИНУТ ВЫ МОЖЕТЕ ПОЛУЧИТЬ ДИПЛОМ

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

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

Список всех тестов можно посмотреть тут - https://infourok.ru/tests

Похожие материалы

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