МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН СЕМИПАЛАТИНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ имени ШАКАРИМА

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ
РЕСПУБЛИКИ КАЗАХСТАН
СЕМИПАЛАТИНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
имени ШАКАРИМА
Документ СМК 3уровня
УМКД
УМКД
Редакция №1 от
01.09.2008г.
Учебно-методические
материалыпо дисциплине “
Визуальные средства
разработки программного
обеспечения ” для студентов
УМКД 042-14-0203.1.20.26-2007
УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС
ДИСЦИПЛИНЫ
«Визуальные средства разработки программного обеспечения»
для специальности 050702- Автоматизация и управление
УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ
Семей
2008
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 2 из 54
Предисловие
1.РАЗРАБОТАНО
Составитель Шайханова А.К., ст.преподаватель кафедры «Автоматизация и
управление», Семипалатинского государственного университета имени
Шакарима
«___» ______2008г.
2.ОБСУЖДЕНО
2.1 На заседании кафедры «Автоматизация и управление», Семипалатинского
государственного университета имени Шакарима
Протокол от «___» __________ 2008г., №____.
Заведующий кафедрой ____________ А.Д.Золотов
2.2. На заседании учебно-методического совета ФИКТ
Протокол от «____» __________ 2008 года, № __.
Председатель_____________С.Б.Кайсанов
СОДЕРЖАНИЕ
1 Лекции...........................
2 Практические занятия......................
3 Самостоятельная работа студента................
УМКД 042-14-02-03.1.20.26-2007
1 ЛЕКЦИИ
Редакция № 1 от 01.09.2008 г.
Страница 3 из 54
Лекция 1.
Тема. Введение. Цели и задачи курса
Визуальный язык программирования формирует наше воображение и определяет, что
мы можем себе представить.
В традиционной процедурной модели программирования выполнение программы
начинается с первой строки и следует стандартным путем с вызовом, по мере
необходимости, тех или иных процедур. В объектно-ориентированных языках реализуется
событийно-управляемая модель программирования, т.е. программа выполняется, не следуя
строго определенным путем, а в зависимости от того, какие наступают события.
Эти события вызываются либо действиями пользователя, либо сообщениями от
системы. Таким образом, последовательность выполнения запущенной программы
определяется последовательностью событий. При последующем запуске программы
последовательность может быть иной.
В мире существует несколько различных сред визуальной разработки: Visual Basic,
Delphi, Borland C++ Builder и другие. Каждая рассчитана на свой язык программирования, от
которого зависят правила записи программ. Готовая программа состоит из операторов
этого языка, причем часть этих операторов записывают вручную, а часть операторов
система программирования подставляют автоматически.
Системы визуального объектно-ориентированного программирования предоставляют
разработчику множество средств для создания объектов и настройки их свойств и методов.
Свойства объектов всегда имеют названия, процесс настройки можно выполнять с помощью
специальных графических средств, не прибегая к ручному кодированию. Эта особенность
визуальных систем разработки значительно повышает производительность программиста и
делает создание больших программ достаточно простым.
Мы будем использовать одну из самых мощных систем визуальной разработки
программ — среду Delphi. Язык программирования, который использован в ней, называется
Object Pascal (Объектный Паскаль).
Вопросы для самоконтроля:
1. Что представляет собой визуальный язык программирования?
2. В чем отличие визуального языка программирования от традиционного процедурного?
3. В чем преимущества визуального языка программирования?
Лекция 2.
Тема.
Идеология объектно-ориентированного
интерфейса программы. Инспектор объектов
программирования.
Элементы
Идеология объектно-ориентированного программирования
Объектно-ориентированное программирование (object-oriented programming) или
событийно-управляемое программирование (event-driven programming) – программирование,
направленное на объекты. Объект (object) – это все то, что нас окружает, и с чем мы можем
взаимодействовать. Объекты могут быть информационными и материальными.
В программировании мы имеем дело с созданием моделей информационного типа,
отражающих (описывающих) свойства и поведение некоторых реальных объектов.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 4 из 54
В визуальном объектно-ориентированном программировании в качестве объектов
могут выступать и объекты самого языка.
В каждый момент времени объект характеризуется присущим именно ему набором
свойств (properties) и методов (methods) – операций, совершаемых над другими объектами
или данным объектом, а также реагирует на события (events).
Если взять набор объектов, как правило, одного и того же типа, хотя и не обязательно,
то мы получим семейство или коллекцию (collection), которая в свою очередь, тоже является
объектом. Чтобы обращаться к элементам коллекции, каждому объекту присваивается
уникальное имя или номер.
Способность реагировать на определенные события – это разновидность свойства.
При возникновении события производится его обработка. Объекты, используемые в
компьютерных программах, реагируют на события. При возникновении события происходит
автоматический запуск специального метода – обработчика данного события. С помощью
событий обеспечивается взаимодействие программы с пользователем. События, связанные с
действиями пользователя, называются пользовательскими. Кроме пользовательских событий
в программах происходят программные события.
Объединение в объекте его свойств и методов называют инкапсуляцией
(encapsulation). Инкапсуляция означает, что объект инкапсулирует (содержит) в себе
свойства и методы, но описывать мы ничего не должны. Под термином «инкапсуляция»
подразумевается то, что мы работаем (взаимодействуем) с объектом, совершенно не зная об
его устройстве. Синонимом инкапсуляции может служить термин «сокрытие информации»
(information hiding) о конструкции объекта. Итак, объект можно определить как продукт
инкапсуляции данных вместе с кодом, предназначенным для их обработки.
Элементы интерфейса программы
Delphi – интегрированная среда разработки (Integrated Development Environment –
IDE). Delphi дает возможность создавать программы в стиле визуального конструирования
формы, разместив на ней какие-либо визуальные элементы. Delphi имеет сложный
интерфейс.
В Delphi имеются 10 окон, но после загрузки появляются четыре окна:

главное окно Delphi - <имя проекта>;

окно с формой для проектирования приложения Form1 (окно проектировщика
формы);

окно инспектора объектов Object Inspector;

окно редактора кода Unit1.pas.
В главном окне реализуется основные функции управления проектом создаваемой
программы. Главное управляющее окно системы Delphi обычно располагается в верхней
части экрана. Оно содержит средства управления созданием программы и выглядит наиболее
загруженным из всех окон
Это окно содержит:

строку заголовка;

строку меню;

панель инструментов;

палитру компонентов.
Строка заголовка главного окна отображает имя открытого в данный момент проекта
Project1. Под строкой заголовка окна системы располагается строка меню, содержащая команды
системы Delphi.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 5 из 54
Рисунок 1.Главное окно
Рис.
1.
Рисунок 1. Главное окно
Строка меню содержит команды, необходимые для разработки и тестирования
приложений, и используется так же, как любое стандартное меню Windows. Строка меню — это
очень важный элемент управления любой программы или системы. Кроме строки меню
программы обычно содержат и другие элементы управления: командные кнопки, кнопки
инструментов и прочие. Кнопками удобно пользоваться для исполнения операций, но не для
всякой операции есть кнопка, а только для тех, которые встречаются особенно часто. Зато с
помощью строки меню можно найти любую команду, на которую система способна.
Под строкой меню располагаются панели инструментов с кнопками. Во многих программах имеется только одна такая панель, но в системе Delphi их несколько. Панели
инструментов предназначены для выполнения некоторых команд, реализуемых главным
меню. Кнопки панелей инструментов обеспечивают доступ к наиболее часто встречающимся
командам. Чтобы узнать, как называется та или иная кнопка, надо навести на нее
указатель мыши и подождать, пока рядом с ним появится всплывающая подсказка. На этой
панели есть, в частности, кнопка сохранения проекта на диске, кнопка открытия проекта,
кнопка запуска программы на выполнение.
Одна из панелей инструментов, имеющихся в главном окне системы Delphi, заметно отличается от остальных. Это палитра компонентов. Палитра компонентов устроена в виде
набора пиктограмм. Палитра компонентов содержит множество вкладок. Каждая из них
содержит свой набор компонентов. Общее число компонентов достигает нескольких сотен.
Совокупность наборов составляет библиотеку визуальных компонентов (Visual Components
Library - VCL). Имеется несколько категорий компонентов, каждая из которых
расположена на своей вкладке. С помощью палитры компонентов создаются экземпляры
компонентов (объекты) на форме.
Рисунок 2. Палитра компонентов
Окно инспектора объектов (Object Inspector) отображает свойства какого-либо компонента,
активизированного щелчком мышью, или самой формы. Имя активизированного компонента
находится под заголовком окна. Именно с помощью инспектора объектов настраивают
объекты, используемые в программах. Это же окно используется для выбора и настройки
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 6 из 54
событий, на которые будут реагировать объекты нашей программы. С его помощью
создаются или выбираются нужные процедуры обработки .
Окно проектировщика формы – главное место, где происходит сборка программы
из компонентов, содержащихся в палитре компонентов. Сама форма – это уже готовая к
выполнению программа. Вначале окно формы пустое, но, создавая программу, в указанное
место формы добавляются объекты – экземпляры компонента выбранного типа. Сетка из
точек в окне формы поможет разместить объекты ровно и аккуратно. При работе
программы ее не видно.
Форма — это заготовка окна будущей программы. Каждая программа содержит хотя
бы одно окно и, следовательно, одну форму. Поэтому при работе над программой окно
формы мы видим на экране всегда. Заготовка первого окна называется Form1. Если в
программе будет два окна, то заготовка второго будет называться Form2 и так далее.
Возможна замена стандартного названия более подходящим для программы.
Рис.
3.
Рисунок 3 . Форма
Последнее из открытых окон содержит код программы. Часть программы система
Delphi формирует автоматически. Даже «пустая» программа для Windows собирается из
нескольких тысяч операторов языка Pascal. Добавлять нужные операторы система Delphi
начинает еще до того, как программист приступил к созданию своей программы.
Рис. 4.
Рисунок 4. Код программы
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 7 из 54
Добавляются операторы именно в этом окне. Некоторые операторы система Delphi
добавит сама, другие мы введем вручную. Именно поэтому окно кода никогда не бывает
пустым.
Для системы Delphi каждая незавершенная программа – это проект. Проект включает
в себя множество файлов. Наиболее важными являются три файла: файл формы, файл кода
и файл проекта.
Проект, состоит из:
 файла проекта Project1.dpf,
 файла параметров проекта Project1.dof,
 файла ресурсов проекта Project.res,
 файла настроек проекта Project1.cfg,
 файла описания формы Unit1.dfm,
 файла модуля формы Unit1.pas.
Файл модуля формы доступен для редактирования, именно он отображается в
Редакторе Кода. Остальные файлы создаются Delphi автоматически. В процессе компиляции
программы файлы преобразуются в исполняемый exe-файл, который, по умолчанию,
создается в той же папке, в которой расположен файл проекта.
В проекте могут быть задействованы несколько форм, а также дополнительные
модули и файлы ресурсов, при этом схема компиляции остается похожей.
Для сохранения проекта нужно воспользоваться пунктом главного меню Save Project
As…
Чтобы не смешивать файлы разных проектов, желательно каждый новый проект
сохранять в отдельную папку. Сначала предлогается ввести имя для модуля формы, а затем
имя проекта.
Когда программа сохранена, можно начать написание новой программы. Для этого
выберается пункт главного меню File → New Application.
В результате на экране появляется пустая заготовка формы. Если же необходимо
загрузить старую программу, нужно выбрать в главном меню Open Project либо
воспользоваться кнопкой на панели инструментов и загрузить соответствующий файл
проекта.
Вместе со средой Delphi поставляется более сотни различных компонентов, а в
Интернете можно найти тысячи. Они отличаются по своему внешнему виду, функциям,
способам реализации, требованиям к аппаратной части и т.п., но, тем не менее, все они
построены на едином фундаменте, единой объектной основе.
Несмотря на различие форм и функций компонентов, их можно разбить на группы и
классифицировать. Все компоненты можно разделить на визуальные и невизуальные.
Визуальные, в свою очередь, делятся на оконные элементы управления и графические
элементы управления.
Визуальные компоненты являются элементами управления, которые добавляются на
форму: это кнопки, поля ввода, картинки, панели и т.д. Те из них, что предназначены для
ввода данных, могут принимать фокус ввода, обеспечивая управление с клавиатуры.
Невизуальные компоненты служат в основном для обеспечения более удобного
доступа к определенным функциям системы. При добавлении их на форму на ней появляется
иконка с изображением компонента, невидимая во время исполнения программы. В этом и
заключается их «невизуальность». Несмотря на это, некоторые из них служат для
обеспечения визуальных по природе эффектов. Например, к таким относятся компоненты
меню и диалоги.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 8 из 54
Визуальные компоненты составляют интерфейс программы. Визуальные компоненты
имеют много общих свойств и событий, связанных, прежде всего, с их визуальным
отображением на форме.
Часть свойств отвечает за положение на форме: отступ слева, отступ сверху, высота,
ширина, выравнивание.
Некоторые определяют внешний вид: цвет, шрифт, заголовок. Некоторые задают
поведение компонента во время исполнения программы: доступен, виден, курсор, подсказка.
Механизм событий позволяет связать действия пользователя с необходимыми
действиями программы. События определяют всю структуру программы, поскольку
фактически весь код, то есть, собственно работа программиста, пишется в обработчиках
событий.
В Windows действия пользователя обычно сводятся к нажатиям мыши в
определенных местах экрана, нажатию клавиш клавиатуры, переключению между окнами и
компонентами. В соответствии с этим существуют и события, реагирующие на нажатие
мыши и клавиатуры, переключение фокуса, активацию окон.
Кроме того, для каждого компонента могут существовать характерные для него
события, на которые может потребоваться реакция и обработка, например, событие
изменения текста в поле ввода.
Некоторые конкретные компоненты и их предназначение.

Для вывода надписей предназначен компонент Label.

Для ввода текста пользователем используется компонент Edit.

Для работы с несколькими строками используют Memo. Строки хранятся в
свойстве Lines.

Кнопка реализуется компонентом Button.

Для работы с пунктами используется CheckBox.

Для выбора текста из нескольких альтернатив предназначен компонент
ComboBox. Альтернативы хранятся в свойстве Items, аналогичном свойству Lines у
компонента Memo.

Для множественного выбора используется RadioGroup. Чтобы добавить в него
пункты, щелкните на кнопку свойства Items и введите названия пунктов. Номер выделенного
пункта соответствует свойству ItemIndex, нумерация с нуля.

Простейшим контейнером компонентов может служить компонент Panel. На
него можно поместить другой компонент, например, кнопку. При перемещении контейнера
передвигаются все находящиеся в нем компоненты.

Для работы с картинкой используется компонент Image. Картинку можно
загрузить, щелкнув на кнопку свойства Picture и выбрав сохраненную картинку. Если
загруженная картинка не совпадает по размерам с размерами компонента, ее можно
масштабировать, установив свойство Stretch, либо изменить размеры компонента, установив
свойство AutoSize. Задний фон картинки можно убрать, используя свойство Transparent.

Для графического оформления используется компонент Bevel. Его вид можно
настроить с помощью свойства Shape.

Ввод целых чисел с помощью мыши можно обеспечить с помощью компонента
TrackBar. Его основное свойство – Position.

А для отображения процесса длительных расчетов можно использовать
компонент ProgressBar. Его свойство Position отображает процент выполненной работы.
Инспектор объектов
Каждый элемент управления, как и сама форма, обязательно имеет название. Название
по умолчанию формирует сама система. Кроме того, практически все элементы управления
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 9 из 54
также характеризуются текстовой информационной строкой - надписью, которая
первоначально совпадает с названием элемента. Например, кнопка на форме получает
название и надпись Button1, а поле-надпись - название и надпись Label1. Эти надписи можно
изменять.
Инспектор - одно из важнейших окон при работе в дизайнере. С его помощью
настраиваются всевозможные свойства объектов, используемых в программе, а также
возможные реакции программы на различные действия пользователя с этими элементами
управления. Многие составляющие части программы (прежде всего элементы управления)
представляют собой объекты. Они характеризуются наборами свойств и методами,
вызываемыми в различных ситуациях. У каждого элемента управления есть обязательно
свойство Name, с помощью которого можно определить название этого объекта (на самом
деле это название будет названием переменной в тексте программы, по которому к нему
можно обращаться!). А текстовая надпись элемента задается с помощью свойства Caption.
Некоторые свойства существуют практически у всех элементов управления, а некоторые специфичны, так как предназначаются для определения конкретных особенностей работы
определенного элемента управления.
В Инспекторе показывается список свойств, связанный с текущим элементом,
выделенным на форме. Как только изменяется значение какого-нибудь свойства в окне,
внесенные изменения сразу же будут отражены и в главном окне дизайнера.
Вопросы для самоконтроля:
1. Что называют объектом?
2. Что называют свойством?
3. Что называют методом?
4. Что такое коллекция?
5. Что называют инкапсуляцией?
6. Расскажите об интерфейсе Delphi?
7. Что Вы знаете о Главном окне Delphi?
8. Какие команды содержит строка меню?
9. Для чего предназначены панели инструментов?
10. Расскажите о палитре компонентов?
11. Что знаете об инспекторе объектов?
12. Для чего нужно окно проектировщика формы?
13. Что содержит код программы?
14. Из скольких и каких файлов состоит проект?
15. Чем отличаются визуальные компоненты от невизуальных?
16. Назовите основные компоненты и дайте их предназначение.
17. Какую роль выполняет Инспектор объектов?
Лекция 3.
Тема. Основы языка Delphi
Алфавит
Буквы
Текст программы на языке Delphi формируется с помощью букв, цифр и специальных
символов.
Буквы - это прописные и строчные символы латинского алфавита и символ подчеркивания:
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 10 из 54
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ_
Цифры представлены стандартной арабской формой записи:
0123456789
Специальные символы
+-*/=<>[],.:;'(){}@#$&^
применяются в основном в качестве знаков арифметических операций, разделителей,
ограничителей и т.д. Из специальных символов формируются составные символы:
<> <= >= .. (. .) (* *) // :=
Они служат, в частности, для обозначения операций типа "не равно", "больше или равно",
указания диапазонов значений, комментирования программы, т.д.
Все перечисленные знаки отражены на клавиатуре и при нажатии соответствующих клавиш
появляются на экране. Как вы видите, среди них нет русских букв, хотя на клавиатуре
вашего компьютера они наверняка присутствуют. Дело в том, что такие буквы в языке Delphi
несут чисто информационную нагрузку и используются только в качестве данных или при
написании комментария к программе.
Числа
Одно и то же число можно записать самыми разными способами, например:
15
{ целое }
15.0
{ вещественное с фиксированной точкой }
1.5E01
{ вещественное с плавающей точкой }
$F
{ шестнадцатиричное }
В языке Delphi имеется возможность применять все способы записи, но чаще всего
используют целые и вещественные числа.
Целые числа состоят только из цифр и знака + или -. Если знак опущен и число не равно 0, то
оно рассматривается как положительное, например:
0
{ 0 интерпретируется как целое число }
17
{ положительное целое число }
-39
{ отрицательное целое число }
Вещественные числа содержат целую и дробную части, разделенные точкой:
0.0
{ 0 интерпретируется как вещественное число }
133.5
{ положительное вещественное число }
-0.7
{ отрицательное вещественное число }
Вещественные числа могут быть представлены в двух формах: с фиксированной и
плавающей точкой.
Форма с фиксированной точкой совпадает с обычной записью чисел, например:
27800
{ точка в конце числа опущена }
0.017
3.14
Форма с плавающей точкой используется при работе с очень большими или очень малыми
числами. В этой форме число, стоящее перед буквой E, умножается на 10 в степени,
указанной после буквы E:
7.13E+14 { 7.13 x 1014 }
1.7E-5
{ 1.7 x 10-5 }
3.14E00 { 3.14 x 100 = 3.14}
Число, стоящее перед буквой E, называется мантиссой, а число после буквы E - порядком.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 11 из 54
Мы чаще будем использовать форму с фиксированной точкой, так как она воспринимается
лучше второй формы и совпадает с привычной математической записью чисел.
Слова-идентификаторы
Неделимые последовательности символов алфавита образуют слова (идентификаторы).
Идентификатор начинается с буквы и не должен содержать пробелов. После первого
символа допускаются буквы и цифры. Напоминаем, что символ подчеркивания считается
буквой.
При написании идентификаторов могут использоваться как прописные, так и строчные
буквы (между ними не делается различий). Длина идентификатора может быть любой, но
значимы только первые 255 символов (вполне достаточный предел, не так ли). Примеры
написания идентификаторов приведены ниже:
Правильно Неправильно
RightName Wrong Name
E_mail
E-mail
_5inches
5inches
Все идентификаторы подразделяются на зарезервированные слова, стандартные директивы,
стандартные идентификаторы и идентификаторы программиста.
Зарезервированные (ключевые) слова составляют основу языка Delphi, любое их искажение
вызовет ошибку компиляции.
Стандартные директивы интерпретируются либо как зарезервированные слова, либо как
идентификаторы программиста в зависимости от контекста, в котором используются.
Стандартные идентификаторы - это имена стандартных подпрограмм, типов данных языка
Delphi, т.д. В качестве примера приведем имена подпрограмм ввода и вывода данных и
нескольких математических функций. Вы, без сомнения, сами угадаете их назначение:
Read Write Sin Cos Exp Ln
Идентификаторы программиста определяются программистом, т.е вами, и носят
произвольный характер. Если идентификатор состоит из двух или более смысловых частей,
то для удобства их лучше выделять заглавной буквой или разделять символом
подчеркивания:
LowProfit
AverageProfit HighProfit
Price_One
Price_Two
Price_Sum
Имя идентификатора обязательно должно нести смысловую нагрузку, тогда вы сможете
читать программу как книгу и не потратите время на расшифровку непонятных обозначений.
Комментарии
С помощью комментариев вы можете пояснить логику работы своей программы.
Комментарий пропускается компилятором и может находиться в любом месте программы.
Комментарием является:
{ Любой текст в фигурных скобках }
(* Любой текст в круглых скобках со звездочками *)
// Любой текст от двойной наклонной черты до конца строки
Если за символами { или (* сразу идет знак доллара $, то текст в скобках считается не
комментарием, а директивой компилятора. Большинство директив компилятора являются
переключателями, которые включают или выключают те или иные режимы компиляции,
оптимизацию, контроль выхода значений из допустимого диапазона, переполнение, т.д.
Примеры таких директив:
{$OPTIMIZATION ON}
{$WARNINGS ON}
{$RANGECHECKS OFF}
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 12 из 54
Данные
Понятие типа данных
Программа в процессе выполнения всегда обрабатывает какие-либо данные. Данные могут
представлять собой целые и дробные числа, символы, строки, массивы, множества и др. Так
как компьютер всего лишь машина, для которой данные - это последовательность нулей и
единиц, он должен абсолютно точно "знать", как их интерпретировать. По этой причине все
данные в языке Delphi подразделены на типы. Для описания каждого типа данных
существует свой стандартный идентификатор: для целых - Integer, для дробных - Real, для
строк - string и т.д. Программист может образовывать собственные типы данных и давать им
произвольные имена (о том, как это делается, мы поговорим чуть позже).
Тип данных показывает, какие значения принимают данные и какие операции можно с ними
выполнять. Каждому типу данных соответствует определенный объем памяти, который
требуется для размещения данных. Например, в языке Delphi существует тип данных Byte.
Данные этого типа принимают значения в целочисленном диапазоне от 0 до 255, могут
участвовать в операциях сложения, вычитания, умножения, деления, и занимают 1 байт
памяти.
Все типы данных в языке Delphi можно расклассифицировать следующим образом:
простые типы данных. Они в свою очередь подразделяются на порядковые и вещественные
типы данных. К порядковым типам относятся целочисленные, символьные, булевские,
перечисляемые и интервальные типы данных;
временной тип данных. Служит для представления значений даты и времени;
строковые типы данных. Служат для представления последовательностей из символов,
например текста;
составные типы данных (в некоторых источниках - структурированные типы данных).
Формируются на основе всех остальных типов. К ним относятся массивы, множества,
записи, файлы, классы и ссылки на классы;
процедурные типы данных. Позволяют манипулировать процедурами и функциями как
данными программы;
указательные типы данных. Данные этих типов хранят адреса других данных, с их помощью
организуются различные динамические структуры: списки, деревья и т.д.;
тип данных с непостоянным типом значений. Служит для представления значений, тип
которых заранее неизвестен; с его помощью легко организуется работа со списком
разнотипных значений;
Некоторые предопределенные типы данных делятся на фундаментальные и обобщенные
типы. Данные фундаментальных типов имеют неизменный диапазон значений и объем
занимаемой памяти на всех моделях компьютеров. Данные обобщенных типов на различных
моделях компьютеров могут иметь разный диапазон значений и занимать разный объем
памяти. Деление на фундаментальные и обобщенные типы характерно для целых,
символьных и строковых типов данных.
Константы
Данные, независимо от типа, имеют некоторое значение и в программе предстают как
константы или переменные. Данные, которые получили значение в начале программы и по
своей природе изменяться не могут, называются константами. Константами, например,
являются скорость света в вакууме и соотношение единиц измерения (метр, сантиметр, ярд,
фут, дюйм), которые имеют научно обоснованные или традиционно принятые постоянные
значения. Константы описываются с помощью зарезервированного слова const. За ним идет
список имен констант, каждому из которых с помощью знака равенства присваивается
значение. Одно присваивание отделяется от другого с помощью точки с запятой. Тип
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 13 из 54
константы распознается компилятором автоматически, поэтому его не надо указывать при
описании. Примеры констант:
const
DelphiLanguage = 'Object Pascal';
KylixLanguage = DelphiLanguage;
Yard = 914.4;
Foot = 304.8;
После такого описания для обращения к нужному значению достаточно указать лишь имя
соответствующей константы.
Значение константы можно задавать и выражением. Эту возможность удобно использовать
для комплексного представления какого-либо понятия. Например, временной промежуток,
равный одному месяцу, можно задать так:
const
SecondsInMinute = 60;
SecondsInHour = SecondsInMinute * 60;
SecondsInDay = SecondsInHour * 24;
Очевидно, что, изменив базовую константу SecondsInMinute, можно изменить значение
константы SecondsInDay.
При объявлении константы можно указать ее тип:
const
Percent: Double = 0.15;
FileName: string = 'HELP.TXT';
Такие константы называются типизированными; их основное назначение - объявление
константных значений составных типов данных.
Переменные
Переменные в отличие от констант могут неограниченное число раз менять свое значение в
процессе работы программы. Если в начале программы некоторая переменная X имела
значение 0, то в конце программы X может принять значение 10000. Так бывает, например,
при суммировании введенных с клавиатуры чисел.
Переменные описываются с помощью зарезервированного слова var. За ним перечисляются
идентификаторы переменных, и через двоеточие указывается их тип. Каждая группа
переменных отделяется от другой группы точкой с запятой. Например:
var
Index: Integer;
// переменная целого типа данных
FileName: string;
// переменная строкового типа данных
Sum, Profit: Double; // группа переменных вещественного типа данных
В теле программы переменной можно присвоить значение. Для этого используется
составной символ :=, например:
Sum := 5000.0;
// переменной Sum присваивается 5000
Percent := 0.15;
// переменной Percent присваивается 0.15
Profit := Sum * Percent; // вычисляется произведение двух переменных
// и его результат присваивается переменной
// Profit
Вы можете присвоить значение переменной непосредственно при объявлении:
var
Index: Integer = 1;
Delimiter: Char = ';';
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 14 из 54
Объявленные таким образом переменные называются инициализированными. На
инициализированные переменные накладывается ограничение: они не могут объявляться в
подпрограммах (процедурах и функциях). Если переменная не инициализируется при
объявлении, то по умолчанию она заполняется нулем.
Каждый используемый в программе элемент данных должен быть описан в разделе const или
var. Исключение составляют данные, заданные непосредственно значением, например:
Write(100, 200); // 100 и 200 - данные, заданные значением
Простые типы данных
Целочисленные типы данных
Целочисленные типы данных применяются для описания целочисленных данных. Для
решения различных задач могут потребоваться различные целые числа. В одних задачах счет
идет на десятки, в других - на миллионы. Соответственно в языке Delphi имеется несколько
целочисленных типов данных, среди которых вы можете выбрать наиболее подходящий для
своей задачи
Фундаментальные типы данных:
Тип данных Диапазон значений
Объем памяти (байт)
Byte
0..255
1
Word
0..65535
2
Shortint
-128..127
1
Smallint
-32768..32767
2
Longint
-2147483648..2147483647 4
Longword
0.. 4294967295
4
Int64
-2^63..2^63-1
8
Обобщенные типы данных:
Тип данных Диапазон значений
Формат (байт)
Cardinal
0.. 4294967295
4*
Integer
-2147483648..2147483647 4*
Пример описания целочисленных данных:
var
X, Y: Integer;
TextLength: Cardinal;
FileSize: Longint;
При программировании алгоритмов предпочтение следует отдавать обобщенным
типам даных, поскольку они позволяют достичь максимальной производительности
программ при переходе на другие модели компьютеров (например, при переходе на
компьютеры, построенные на основе новых 64-разрядных процессоров). Переменные
обобщенных типов данных могут храниться в памяти по-разному в зависимости от
конкретной модели компьютера, и для работы с ними компилятор может генерировать
наиболее оптимальный код. Однако при использовании переменных обобщенных типов
данных ни в коем случае нельзя полагаться на формат их хранения в памяти, в частности на
размер.
Вещественные типы данных
Вещественные типы данных применяются для описания вещественных данных с
плавающей или с фиксированной точкой
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 15 из 54
Тип
данных
Real
Real48
Single
Double
Extended
Comp
Диапазон значений
Мантисса Объем памяти
(байт)
15-16
8*
11-12
6
7-8
4
15-16
8
19-20
10
19-20
8
5.0*10-324..1.7*10308
2.9*10-39..1.7*1038
1.5*10-45..3.4*1038
5.0*10-324..1.7*10308
3.4*10-4932..1.1*104932
-9223372036854775808 ..
9223372036854775807
Currency
-922337203685477.5808 ..
19-20
8
922337203685477.5807
Пример описания вещественных данных:
var
X, Y: Double;
Z: Extended;
Необходимо отметить, что тип Real является обобщенным типом данных и по отношению к
нему справедливо все то, что было сказано о типах Integer и Cardinal.
Символьные типы данных
Символьные типы применяются для описания данных, значением которых является
буква, цифра, знак препинания и другие символы. Существуют два фундаментальных
символьных типа данных: AnsiChar и WideChar (таблица 2.3). Они соответствуют двум
различным системам кодировки символов. Данные типа AnsiChar занимают один байт
памяти и кодируют один из 256 возможных символов расширенной кодовой таблицы ANSI,
в то время как данные типа WideChar занимают два байта памяти и кодируют один из 65536
символов кодовой таблицы Unicode. Кодовая таблица Unicode - это стандарт двухбайтовой
кодировки символов. Первые 256 символов таблицы Unicode соответствуют таблице ANSI,
поэтому тип данных AnsiChar можно рассматривать как подмножество WideChar.
Фундаментальные типы данных:
Тип данных Диапазон значений
Объем памяти (байт)
AnsiChar
Extended ANSI character set 1
WideChar
Unicode character set
2
Обобщенный тип данных:
Тип данных Диапазон значений
Формат (байт)
Char
Same as AnsiChar's range 1*
Пример описания переменной символьного типа:
var
Symbol: Char;
В программе значения переменных и констант символьных типов заключаются в апострофы
(не путать с кавычками!), например:
Symbol := 'A'; // Переменной Symbol присваивается буква A
Булевские типы данных
Булевские типы данных названы так в честь Георга Буля (George Boole), одного из авторов
формальной логики. Диапазон значений данных булевских типов представлен двумя
предопределенными константами: True - истина и False - ложь
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 16 из 54
Тип данных
Boolean
ByteBool
WordBool
LongBool
Диапазон значений
False (0), True (1)
False (0), True (не равно 0)
False (0), True (не равно 0)
False (0), True (не равно 0)
Объем памяти (байт)
1
1
2
4
Пример описания булевских данных:
var
Flag: Boolean;
WordFlag: WordBool;
LongFlag: LongBool;
Булевские типы данных широко применяются в логических выражениях и в выражениях
отношения. Переменные типа Boolean используются для хранения результатов логических
выражений и могут принимать только два значения: False и True (стандартные
идентификаторы). Булевские типы данных ByteBool, WordBool и LongBool введены в язык
Delphi специально для совместимости с другими языками, в частности с языками C и C++.
Все булевские типы данных совместимы друг с другом и могут одновременно
использоваться в одном выражении.
Определение новых типов данных
Кроме стандартных типов данных язык Delphi поддерживает типы, определенные
программистом. Новый тип данных определяется с помощью зарезервированного слова type,
за которым следует идентификатор типа, знак равенства и описание. Описание завершается
точкой с запятой. Например, можно определить тип, тождественный существующему типу:
type
TUnicode = WideChar; // TUnicode тождественен типу WideChar
TFloat = Double; // TFloat тождественен типу Double
Нетрудно заметить, что идентификаторы новых типов в примере начинаются заглавной
буквой T (первая буква слова type). Такое соглашение о типах программиста принято
разработчиками среды Delphi, но оно не является строгим. Тем не менее, мы рекомендуем
его придерживаться, так как оно способствует более легкому восприятию исходного текста
программы.
Синтаксическая конструкция type позволяет создавать новые порядковые типы:
перечисляемые типы и интервальные типы.
Перечисляемые типы данных
Перечисляемый тип данных представляет собой список значений, которые может принимать
переменная этого типа. Каждому значению поставлен в соответствие идентификатор,
используемый в программе для указания этого значения.
type
TDirection = (North, South, East, West);
На базе типа TDirection можно объявить переменную Direction и присвоить ей значение:
var
Direction: TDirection;
begin
Direction := North;
end.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 17 из 54
На самом деле за идентификаторами значений перечисляемого типа стоят целочисленные
константы. По умолчанию, первая константа равна 0, вторая - 1 и т.д. Существует
возможность явно назначить значения идентификаторам:
type
TSizeUnit = (Byte = 1, Kilobyte = 1024 * Byte, Megabyte = Kilobyte * 1024,
Gigabyte = Megabyte * 1024);
Интервальные типы данных
Интервальный тип данных задается двумя константами, ограничивающими диапазон
значений для переменных данного типа. Обе константы должны принадлежать одному из
стандартных порядковых типов (но не вещественному и не строковому). Значение первой
константы должно быть обязательно меньше значения второй. Например, определим
интервальный тип TDigit:
type
TDigit = 0..9;
var
Digit: TDigit;
begin
Digit := 5;
Digit := 10; // Ошибка! Выход за границы диапазона
end.
В операциях с переменными интервального типа данных компилятор генерирует код
проверки на принадлежность диапазону, поэтому последний оператор вызовет ошибку. Это
очень удобно при отладке, но иногда отрицательно сказывается на скорости работы
программы. Для отключения контроля диапазона откройте окно Project Options, выберите
страницу Compiler и снимите пометку пункта Range Checking.
Данные перечисляемых и интервальных типов занимают в памяти 1, 2 или 4 байта в
зависимости от диапазона значений типа. Например, если диапазон значений не превышает
256, то элемент данных занимает один байт памяти.
Временной тип данных
Для представления значений даты и времени в среде Delphi существует тип TDateTime. Он
объявлен тождественным типу Double. Целая часть элемента данных типа TDateTime
соответствует количеству дней, прошедших с полночи 30 декабря 1899 года. Дробная часть
элемента данных типа TDateTime соответствует времени дня. Следующие примеры
поясняют сказанное:
Значение Дата
Время
0
30.12.1899 00:00:00
0.5
30.12.1899 12:00:00
1.5
31.12.1899 12:00:00
-1.25
29.12.1899 06:00:00
35431.0
1.1.1997
00:00:00
Типы данных со словом type
Если в программе создается новый тип данных, тождественный уже существующему типу
данных, то компилятор не делает никаких различий между ними (ни на этапе компиляции,
ни на этапе исполнения программы). По сути, создается не новый тип данных, а псевдоним
для уже существующего типа данных.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 18 из 54
type
TFileName = string;
В приведенном выше примере тип данных TFileName является псевдонимом для
стандартного типа данных string.
Для того чтобы создать действительно новый тип данных, обладающий свойствами уже
существующего типа данных, но не тождественный ему, необходимо использовать
зарезервированное слово type:
type
TFileName = type string;
Различие между таким способом создания типа и обычным (без слова type) проявится при
изучении массивов, записей и классов. Чтобы подготовленный читатель уже сейчас понял, в
чем оно состоит, забежим вперед и приведем поясняющий пример (новичкам советуем
пропустить пример и вернуться к нему позже после изучения массивов):
type
TType1 = array [1..10] of Integer;
TType2 = type TType1;
var
A: TType1;
B: TType2;
begin
B := A; // Ошибка!
end.
В примере переменные A и B оказываются несовместимы друг с другом из-за слова type в
описании типа TType2. Если же переменные A и B принадлежат простым типам данных, то
оператор присваивания будет работать:
type
TType1 = Integer;
TType2 = type TType1;
var
A: TType1;
B: TType2;
begin
B := A; // Работает
end.
Операции
Выражения
Переменные и константы всех типов могут использоваться в выражениях. Выражение задает
порядок выполнения действий над данными и состоит из операндов, круглых скобок и
знаков операций. Операнды представляют собой константы, переменные и вызовы функций.
Операции - это действия, выполняемые над операндами. Например, в выражении
(X + Y) / 2;
X, Y, 2 - операнды; '+', '/' - знаки операций; скобки говорят о том, что сначала выполняется
операция сложения, потом - деления.
В простейшем случае выражение может состоять из одной переменной или константы.
Круглые скобки используются, как и при записи обычных математических выражений, для
управления порядком выполнения операций.
Операции в языке Delphi подразделяются на арифметические, операции отношения,
логические (булевские), строковые, операцию получения адреса и другие. Выражения
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 19 из 54
соответственно называются арифметическими, отношения, булевскими, строковыми и т.д. в
зависимости от того, какого типа операнды и операции в них используются.
Арифметические операции
Арифметические операции наиболее часто используются в выражениях и выполняют
арифметические действия над значениями операндов целочисленных и вещественных типов
данных
Операция Действие
Тип операндов
Тип результата
+
Сложение
Целый, вещественный Целый, вещественный
Вычитание
Целый, вещественный Целый, вещественный
*
Умножение
Целый, вещественный Целый, вещественный
/
Деление
Целый, вещественный Вещественный
div
Целочисленное деление Целый
Целый
mod
Остаток от деления
Целый
Целый
Операции сложения, вычитания и умножения соответствуют аналогичным операциям в
математике. В отличие от них операция деления имеет три формы: обычное деление (/),
целочисленное деление (div), остаток от деления (mod). Назначение каждой из операций
станет понятным после изучения следующих примеров:
Выражение Результат
6.8 - 2
4.8
7.3 * 17
124.1
-(5 + 9)
-14
-13.5 / 5
-2.7
-10 div 4
-2
27 div 5
5
5 div 10
0
5 mod 2
1
11 mod 4
3
-20 mod 7
-6
-20 mod 7
-6
Операции отношения выполняют сравнение двух операндов и определяют, истинно значение
выражения или ложно. Сравниваемые величины могут принадлежать к любому порядковому
типу данных. Результат всегда имеет булевский тип.
Эта группа операций специально разработана для реализации алгоритмических элементов
типа "больше", "больше или равно" и т.п., которые имеются практически в каждой
программе.
Операция Действие
Выражение Результат
=
Равно
A=B
True, если A = B
<>
Не равно
A <> B
True, если A < B или A > B
<
Меньше
A<B
True, если A < B
>
Больше
A>B
True, если A > B
<=
Меньше или равно A <= B
True, если A < B или A = B
>=
Больше или равно A >= B
True, если A > B или A = B
Вопросы для самоконтроля:
1. Из каких символов состоит язык Delphi?
2. Что называют идентификатором?
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 20 из 54
3.
4.
5.
6.
Для чего предназначены комментарии?
Что называют константой?
Расскажите о простых типах данных?
Какие операции применяются в Delphi?
Лекция 4.
Тема. Структура программы
Модуль кода (unit) делится на две части – интерфейс (interface) и реализацию
(implementation).
Раздел interface:
 uses: подключаемые модули, в которых содержатся используемые процедуры,
функции, классы и т.п. Их список формируется автоматически в зависимости от
добавленных в форму компонентов.
 type: описания типов. Автоматически в этом разделе описан класс вашей формы.
 var: описание глобальных переменных. Автоматически тут описана переменная типа
описанного класса формы. В этой переменной во время работы программы хранится
указатель на экземпляр формы.
 const: описание констант. Этот раздел автоматически не создается, однако может
быть легко добавлен.
Раздел implementation:
 Здесь также можно добавить uses.
 С помощью {$R} подключаются файлы ресурсов. Автоматически подключен файл
dfm, имеющий то же имя, что и файл модуля и потому подключаемый как *.dfm. В
этом файле хранится информация о форме – расположение и настройки компонентов,
помещенных в форму, и т.п.
 Раздел содержит описание реализаций процедур и функций. Автоматически тут
создаются обработчики событий. Здесь описывается реализация необходимых в
программе процедур, функций и методов классов.
Все то, что касается объявления доступных из других модулей переменных, констант,
процедур, типов, классов и т.п., должно быть описано в разделе interface. В этой части
программы, которая создается автоматически, в разделе uses перечисляются используемые
модули, в разделе type описывается класс формы – потомок класса TForm, а в разделе var
описывается глобальная переменная, в которой будет храниться указатель на объектэкземпляр формы. Соответственно, если надо подключить какой-то свой модуль, то
необходимо добавить его в раздел uses. При описани нового типа его добавляют в раздел
type до или после класса формы. Если нужно описать глобальную переменную, то ее
добавляют в раздел var, а если нужна константа – создается дополнительно раздел const. В
свою очередь, в разделе implementation сначала указывается ссылка на файлы ресурсов, а
затем описываются реализации процедур и функций – как создаваемых автоматически
обработчиков событий, так и добавляемых по необходимости. Вначале эта часть пуста, но
она будет заполняться во время написания программы.
При добавлении компонента в форму автоматически модифицируется код модуля – в
описании класса формы появляется переменная, хранящая ссылку на добавленный
компонент.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 21 из 54
При создании обработчика события (при нажатии на компонент, помещенный в форму,
создается обработчик основного события, а остальные создаются с помощью Инспектора
Объектов) в коде происходят следующие изменения:
 в разделе implementation создается пустой обработчик, который вы потом заполняете;
 в классе вашей формы создается описание этого метода (обработчики событий
являются методами);
 если не создавать обработчик через страницу Events Инспектора Объектов (или
двойным щелчком по компоненту), а просто написать в коде процедуру-обработчик,
то он не будет должным образом связан с компонентом, и событие не сработает.
Если изменить имя компонента, то изменятся имена и обработчиков событий,
которые с ним связаны.
Если необходимо изменить название обработчика, то надо воспользоваться
Инспектором Объектов. Переименовывая здесь имя процедуры обработчика, корректно
автоматически изменяются также и ссылки на эту процедуру.
Если необходимо удалить какой-то обработчик, то удалите весь код внутри
процедуры. При следующем запуске программы все пустые процедуры автоматически
корректно удаляются. Компилятор автоматически удаляет пустые процедуры при запуске.
При удалении всей процедуры описание и ссылки на нее останутся, а удаление их всех
требует времени и аккуратности.
При удалении компонента не удаляются процедуры-обработчики его событий. Это
связано с тем, что один и тот же обработчик может использоваться для разных компонентов.
В случае, если нужно удалить эти оставшиеся обработчики, удалите код внутри них и
запустите программу.
Проблема обеспечения гарантированного выполнения некоторых действий решается
наличием специального события OnCreate. Это событие формы. Оно возникает тогда, когда
форма создается, а поскольку главная форма создается в самом начале работы
приложения, то и код, описанный в обработчике данного события, выполнится один раз и в
самом начале. В обработчике события OnCreate можно описать процедуры и функции
инициализации, присваивать нужные значения глобальным переменным и т.п.
Раздел implementation предназначен не только для обработчиков событий. В этот
раздел добавлять в него свои собственные функции и процедуры. Необходимо помнить, что
они должны идти раньше процедур и обработчиков, из которых вызываются, или объявить
их в разделе interface. В последнем случае эти функции и процедуры будут доступны для
вызова из других модулей.
Существует также важная тонкость использования собственных функций: все
обработчики событий имеют в своем названии имя формы:
procedure TForm1.FormCreate(Sender: TObject);
Это указывает на то, что работают с классом формы TForm1 и описывают методы для нее.
Из обработчика просто обращаются к компонентам формы (класс формы «знает» о наличии
компонентов на ней и имеет к ним непосредственный доступ), например:
MyGrid.RowCount := Num;
Когда описывается собственная процедура, то она «ничего не знает» о компонентах формы,
и поэтому нужно обращаться к компонентам через форму, а, не минуя ее
Вопросы для самоконтроля:
1. Из каких частей состоит структура программы?
2. Что содержит интерфейсная часть?
3. Что содержит раздел реализации?
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 22 из 54
Лекция 5.
Тема. Стандартные компоненты
Некоторые конкретные компоненты и их предназначение.

Для вывода надписей предназначен компонент Label.

Для ввода текста пользователем используется компонент Edit.

Для работы с несколькими строками используют Memo. Строки хранятся в
свойстве Lines.

Кнопка реализуется компонентом Button.

Для работы с пунктами используется CheckBox.

Для выбора текста из нескольких альтернатив предназначен компонент
ComboBox. Альтернативы хранятся в свойстве Items, аналогичном свойству Lines у
компонента Memo.

Для множественного выбора используется RadioGroup. Чтобы добавить в него
пункты, щелкните на кнопку свойства Items и введите названия пунктов. Номер выделенного
пункта соответствует свойству ItemIndex, нумерация с нуля.

Простейшим контейнером компонентов может служить компонент Panel. На
него можно поместить другой компонент, например, кнопку. При перемещении контейнера
передвигаются все находящиеся в нем компоненты.

Для работы с картинкой используется компонент Image. Картинку можно
загрузить, щелкнув на кнопку свойства Picture и выбрав сохраненную картинку. Если
загруженная картинка не совпадает по размерам с размерами компонента, ее можно
масштабировать, установив свойство Stretch, либо изменить размеры компонента, установив
свойство AutoSize. Задний фон картинки можно убрать, используя свойство Transparent.

Для графического оформления используется компонент Bevel. Его вид можно
настроить с помощью свойства Shape.

Ввод целых чисел с помощью мыши можно обеспечить с помощью компонента
TrackBar. Его основное свойство – Position.
А для отображения процесса длительных расчетов можно использовать компонент
ProgressBar. Его свойство Position отображает процент выполненной работы.
Вопросы для самоконтроля:
1. Что называют компонентом?
2. Дайте характеристику каждому из стандартных компонентов?
Лекция 6.
Тема. Диалоговые окна
Диалоговые окна для выбора открываемого или сохраняемого файла организуются с
помощью компонентов OpenDialog и SaveDialog/ Найдите их в палитре компонентов на
вкладке Dialogs и поместите на форму. Первый компонент назовите OpenDialog, а второй SaveDialog.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 23 из 54
Рисунок 5. Палитра компонентов – вкладка Dialogs
Таблица 1. Характерные свойства этих компонентов.
Свойство
DefaultExt
Описание
Расширение, которое добавляется к имени файла, если пользователь
его не указал.
FileName
Имя выбранного файла.
Filter
Фильтры имени файла.
FilterIndex
Номер активного фильтра.
InitialDir
Начальный каталог, открываемый при первом появлении окна
диалога.
Options
Параметры, определяющие внешний вид и поведение окна диалога.
(см. таблицу 8.7).
OptionsEx
Дополнительные параметры, определяющие внешний вид и
поведение окна диалога (см. таблицу 8.7).
Title
Заголовок окна диалога. Если значение свойства не указано, то
заголовок будет стандартным - Open (Открыть) или Save (Сохранить) в
зависимости от типа компонента.
OnCanClose
Происходит, когда пользователь пытается закрыть окно диалога.
Позволяет выполнить дополнительные проверки и отменить закрытие
окна при необходимости.
OnClose
Происходит непосредственно перед закрытием формы после
события OnCanClose.
OnFolderChan
ge
OnIncludeIte
m
Происходит, если пользователь переходит в другой каталог.
Происходит при добавлении каждого файла в список отображаемых
в окне файлов. Позволяет выполнять дополнительную фильтрацию
файлов.
OnSelectionC
hange
Происходит при смене выделенного файла или списка файлов.
OnShow
Происходит непосредственно перед отображением окна диалога на
экране.
OnTypeChang
e
Происходит, когда пользователь выбирает фильтр.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 24 из 54
Компоненты OpenDialog и SaveDialog очень схожи между собой, оба являются
объектно-ориентированными оболочками стандартных диалоговых окон Windows: Open и
Save. На следующем рисунке показано окно Open
Рисунок 6. Стандартное окно Open для выбора открываемого файла
Приблизительный сценарий работы с каждым из компонентов OpenDialog и SaveDialog
таков. Компонент помещается на форму и конфигурируется для выбора тех или иных
файлов. По команде меню Open... или Save As... у соответствующего компонента
вызывается метод Execute. Он вызывает диалог и возвращает значение True, если
пользователь выбрал файл. Полный маршрут к файлу запоминается в свойстве FileName.
Ход дальнейших действий зависит от прикладной задачи и, как правило, включает или
чтение, или запись файла, в зависимости от обрабатываемой команды меню.
Придерживаясь написанного сценария, приспособим компоненты OpenDialog и
SaveDialog для выбора графических файлов, поддерживаемых нашей программой. Чтобы
пользователь мог просматривать файлы выборочно (какого-то одного типа) в диалоговых
блоках имеется набор фильтров, оформленный в виде раскрывающегося списка с подписью
Files of type (см. рис. выше). Исходные данные для этого списка устанавливаются в свойстве
Filter. Номер активного в данный момент фильтра записывается в свойстве FilterIndex.
Приступим к формированию списка фильтров. Активизируйте на форме компонент
OpenDialog и в окне свойств выберите свойство Filter. Щелчком кнопки с многоточием
откройте редактор фильтров - окно Filter Editor.
Рисунок 7. Нажатие кнопки с многоточием вызывает редактор фильтров
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 25 из 54
Окно Filter Editor представляет собой список с двумя столбцами. В левой колонке
вводится текст, отображаемый в раскрывающемся списке Files of type окна диалога. В
правом столбце через точку с запятой записываются маски, на основании которых
выполняется фильтрация файлов.
Установите в компоненте OpenDialog фильтры.
Рисунок 8. Фильтры
Аналогичным образом установите фильтры в компоненте SaveDialog. Самый простой и
быстрый способ в данном случае - скопировать текст свойства Filter из компонента
OpenDialog в компонент SaveDialog через буфер обмена.
.
Рисунок 9. Фильтры для окна Save скопированы из окна Open
Компоненты OpenDialog и SaveDialog имеют большое количество булевских
параметров, организованных в виде составных свойств Options и OptionsEx. Эти параметры
влияют на то, как окно диалога выглядит и работает.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 26 из 54
Таблица 2. Параметры компонентов OpenDialog и SaveDialog
Параметр
Описание
ofReadOnly
Если равно True, то переключатель Read-only в окне диалога включен.
ofOverwritePro
Если равно True, то пользователю выдается предупреждение при
попытке сохранить файл с именем, которое уже существует.
ofHideReadOnly
Если равно True, то переключатель Read-only отсутствует в окне
диалога.
ofNoChangeDir
Если равно True, то пользователь не сможет сменить каталог в
окне диалога.
mpt
ofShowHelp
Если равно True, то в окне диалога присутствует кнопка Help.
ofNoValidate
Если равно True, то пользователь может вводить в имени файла
любые символы, даже недопустимые.
ofAllowMultiSe
Если равно True, то пользователь может выделить сразу
несколько файлов.
ofExtensionDiff
Этот параметр устанавливается после завершения диалога, если
расширение в имени файла отличается от начального расширения.
ofPathMustExist
Если равно True, то пользователь не сможет ввести для файла
несуществующий маршрут.
ofFileMustExist
Если равно True, то пользователь не сможет ввести имя
lect
erent
несуществующего файла.
ofCreatePrompt
Если равно True и пользователь вводит имя несуществующего
файла, то пользователю задается вопрос, желает ли он создать новый
файл с таким именем.
ofShareAware
Если равно True, то ошибки одновременного доступа к файлу со
стороны нескольких приложений игнорируются.
ofNoReadOnlyR
Если равно True, то пользователь не сможет ввести файл с
eturn
атрибутом read-only (только для чтения).
ofNoTestFileCre
Если равно True, то проверка на возможность записи в каталог не
выполняется.
ofNoNetworkBu
Если равно True, то кнопка Network отсутствует в окне диалога.
Этот параметр работает только в паре с параметром ofOldStyleDialog.
ate
tton
ofNoLongName
Если равно True, то длинные имена файлов запрещены.
s
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 27 из 54
Продолжение таблицы 2
ofOldStyleDialog
Если равно True, то окно диалога отображается в старом стиле
Windows 3.1.
ofNoDereference
Links
Если равно True, то ярлыки к каталогам трактуются как обычные
файлы. В противном случае они трактуются как каталоги.
ofEnableInclude
Notify
Если равно True, то при формировании списка отображаемых
файлов происходит событие OnIncludeItem (для каждого файла). В
обработчике этого события обычно выполняется дополнительная
фильтрация файлов.
ofEnableSizing
Если равно значению True, то пользователь имеет возможность
изменять размеры окна диалога.
ofDontAddToRec
Если равно значению True, то файл не помещается в список
последних открытых файлов.
ofShowHidden
Если равно True, то в окне показываются скрытые файлы (файлы
с атрибутом Hidden).
ofExNoPlaceBar
Если равно True, то боковая панель не показывается в окне
диалога. Флажок ofExNoPlaceBar относится к свойству OptionsEx.
ent
В нашем простом примере ограничимся тем, что установим в компоненте SaveDialog
параметр ofOverwritePrompt в значение True.
Заметим, что проверить работу компонентов OpenDialog и SaveDialog можно с
помощью команды Test Dialog. Она находится в контекстном меню значка компонента в
форме.
Вопросы для самоконтроля:
1. Как организуются диалоговые окна?
2. Чем различаются компоненты OpenDialog и SaveDialog?
3. Как формируют список фильтров?
4.
Лекция 7.
Тема. Организация меню
Важнейшим элементом пользовательского интерфейса является меню. Оно очень
похоже на список блюд, который вы не раз видели в ресторане. Отличие только одно - там
его подает официант, а здесь оно само появляется на экране вашего компьютера после старта
практически любого приложения. Короче говоря, меню - это список возможностей, которые
программа предоставляет в распоряжение пользователя и которые он может выбирать по
своему желанию. Выбор пунктов меню осуществляется с помощью мыши или клавиатуры.
Различают два типа меню:
главное меню формы;
контекстное меню формы или компонента.
Главное меню всегда одно и располагается под заголовком формы. Выбор одного из
пунктов главного меню вызывает появление на экране подчиненного меню со списком
вложенных пунктов. Любой пункт подчиненного меню может быть либо командой, либо
содержать другое подчиненное меню, о чем свидетельствует стрелка справа от пункта.
Уровень вложенности подчиненных меню практически не ограничен, но современное
представление о хорошем пользовательском интерфейсе требует, чтобы вложенность была
минимальной.
Контекстных меню может быть много и они не имеют постоянного места внутри
формы. Такие меню не связаны с главным меню и появляются лишь по специальному
требованию со стороны пользователя, как правило, по щелчку правой кнопкой мыши, когда
указатель мыши наведен на нужный элемент. Пункты контекстного меню могут содержать
подчиненные меню. Контекстное меню привязывается к конкретному элементу формы и
идеально подходит для размещения команд, специфичных только этому элементу.
Поскольку доступ к командам контекстного меню можно получить быстрее, чем к командам
главного меню, использование контекстных меню делает пользовательский интерфейс более
удобным.
Для создания главного и контекстного меню среда Delphi имеет два разных компонента:
MainMenu и PopupMenu. Заполнение этих компонентов пунктами меню происходит
одинаково, но результат будет разным. В первом случае мы получим стандартную строку
главного меню, а во втором - окно контекстного меню.
Таблица 3. Компонент MainMenu - свойства
Свойство
Описание
AutoHotKeys
Значение maAutomatic избавляет программиста от необходимости
назначать пунктам меню "горячие" клавиши (с помощью специального
символа & в тексте пунктов); компонент автоматически подбирает
"горячие" клавиши. Значение maManual требует, чтобы "горячие"
клавиши назначил программист (см. параграф 8.1.3).
AutoLineReduction
Если равно значению maAutomatic, то при отображении меню идущие
подряд пункты-разделители рисуются как один разделитель, а пункты-
разделители, находящиеся в начале или конце меню вообще не
показываются. Свойство AutoLineReduction применяется при
программном добавлении и удалении пунктов меню, чтобы избежать
нежелательных явлений вроде повторяющихся и повисших
разделительных линий. Если свойство AutoLineReduction равно
значению maManual, то все пункты меню рисуются как есть.
AutoMerge
Определяет, сливается ли главное меню вторичной формы с главным
меню главной формы. Способ слияния определяется значением свойства
GroupIndex каждого пункта меню верхнего уровня.
Images
Список значков, отображаемых рядом с пунктами меню. Свойство
Images используется совместно со свойством ImageIndex компонентов
MenuItem (см. параграф 8.1.12).
Items
Массив пунктов меню.
OwnerDraw
Если равно значению True, то каждый пункт меню получает возможность
участвовать в процессе своего отображения при помощи специальных
событий OnMeasureItem и OnDrawItem. Событие OnMeasureItem
происходит в пункте меню, когда рассчитываются размеры пункта.
Событие OnDrawItem происходит в пункте меню, когда пункт рисуется
на экране. Если свойство OwnerDraw равно значению False, то пункты
меню имеют стандартный вид и события OnMeasureItem и OnDrawItem
не происходят.
OnChange
Происходит при изменении структуры меню.
Добавление новых пунктов выполняется в специальном окне - дизайнере меню (Menu
Designer). Дизайнер меню работает в паре с окном свойств. Создание и удаление пунктов
осуществляется в дизайнере меню, а свойства отдельно взятого пункта устанавливаются в
окне свойств.
Таблица 4. Контекстные команды в дизайнере меню
Команда
Описание
Insert
Вставляет новый пункт.
Delete
Удаляет выбранный пункт.
Create Submenu Создает в позиции пункта подчиненное меню.
Select Menu
Предлагает выбрать для работы другой компонент меню.
Save As
Template
Сохраняет текущую структуру меню в списке шаблонов.
Insert From
Template
Вставляет меню из списка шаблонов.
Delete
Templates
Удаляет шаблон(ы) меню.
Insert From
Resource
Вставляет меню из файла с описанием меню (расширение MNU) или из
стандартного файла ресурсов (расширение RC).
Класс пункта меню называется TMenuItem, самые характерные его свойства обозначены в
таблице Свойства TMenuItem.
Таблица 5. Важнейшие свойства и события компонента MenuItem
Свойство
Описание
Action
Задает так называемую команду, которая будет выполняться при
выборе данного пунтка меню. Весь список команд содержится в
компоненте ActionList (см. параграф 8.6).
AutoCheck
Если равно значению True, то выбор пункта меню автоматически
приводит к изменению значения свойства Checked на
противоположное. Если равно значению False, то изменением
свойства Checked управляет программист.
AutoHotkeys
Значение maAutomatic избавляет программиста от необходимости
назначать пункту меню "горячую" клавишу (с помощью специального
символа & в тексте пункта); компонент автоматически подбирает
"горячую" клавишу. Значение maManual требует, чтобы "горячую"
клавишу назначил программист (см. параграф 8.1.3). Значение
maParent показывает, что способ назначения горячей клавиши
определяется "родительским" компонентом MainMenu.
AutoLineReduction
Если равно значению maAutomatic, то при отображении меню
подряд идущие пункты-разделители рисуются как один разделитель, а
пункты-разделители, находящиеся в начале или конце меню вообще
не показываются. Свойство AutoLineReduction применяется при
программном добавлении и удалении пунктов меню, чтобы избежать
нежелательных явлений вроде повторяющихся и повисших
разделительных линий. Если свойство AutoLineReduction равно
значению maManual, то все пункты меню отображаются как есть.
Если свойство равно значению maParent, то способ определяется
"родительским" компонентом (например, MainMenu).
Bitmap
Значок, который отображается рядом с текстом пункта меню. Если
для данного пункта меню указан индекс значка с помощью свойство
ImageIndex, то значение свойства Bitmap игнорируется. Значки в
пунктах меню более подробно расмотрены в параграфе 8.1.12.
Break
Если равно mbBreak или mbBarBreak, то пункт меню начинает
новый столбец. Значение mbBarBreak обеспечивает отделение нового
столбца от предыдущего вертикальной чертой.
Caption
Текст пункта меню.
Checked
Если равно значению True, то пункт меню содержит метку в виде
"птички".
Default
Значение True говорит о том, что выбор пункта меню можно
осуществить двойным щелчком "родительского" пункта меню.
Enabled
Определяет, доступен ли пользователю данный пункт меню.
GroupIndex
Работает по-разному в зависимости от того, находится пункт в
подчиненном меню или в строке главного меню. Пункты
подчиненного меню с одинаковым положительным значением
GroupIndex согласовано переключают между собой метку - установка
у одного пункта свойства Checked в значение True снимает метку с
другого пункта.В MDI-формах свойство GroupIndex работает подругому. Пункты главного меню, находящиеся в дочерней форме
MDI, сливаются с пунктами главного меню обрамляющей формы
MDI при активизации дочерней формы. При этом если в строке
главного меню обрамляющей формы существуют пункты с таким же
значением свойства GroupIndex, то новый пункт со своим списком
пунктов полностью заменяет старый; в противном случае новый
пункт со своим списком пунктов вставляется в строку главного
меню. Более подробно слияние меню изложено в справочнике среды
Delphi.
Hint
Краткая подсказка для пользователя, отображаемая в строке
состояния.
ImageIndex
Номер значка в списке Images компонента MainMenu. Значок
отображается рядом с текстом пункта меню (см. параграф 8.1.12).
Отрицательное значение свойства ImageIndex говорит о том, что для
пункта меню значок не задан. Свойство ImageIndex имеет приоритет
над свойством Bitmap.
RadioItem
Если равно значению True, то метка имеет вид жирной точки.
ShortCut
Комбинация клавиш для выполнения команды, не открывая меню.
SubMenuImages
Список значков, отображаемых рядом с пунктами подчиненного
меню. Свойство SubMenuImages используется совместно со
свойством ImageIndex компонентов MenuItem (см. параграф 8.1.12).
Visible
Определяет, виден ли пользователю пункт меню.
Происходит при рисовании отдельно взятого пункта меню на экране.
Событие происходит только в том случае, если соответствующий
OnAdvancedDrawItem компонент меню (MainMenu или PopupMenu) содержит значение
True в свойстве OwnerDraw. Предоставляет более широкие
возможности по сравнению с событием OnDrawItem.
OnClick
Происходит при выборе пункта меню пользователем.
OnDrawItem
Происходит при рисовании отдельно взятого пункта меню на экране.
Событие происходит только в том случае, если соответствующий
компонент меню (MainMenu или PopupMenu) содержит значение
True в свойстве OwnerDraw.
OnMeasureItem
Происходит при расчете размеров отдельно взятого пункта меню перед
его рисованием на экране. Событие происходит только в том случае,
если соответствующий компонент меню (MainMenu или PopupMenu)
содержит значение True в свойстве OwnerDraw.
По аналогии с остальными классами компонентов можно было бы предположить, что в
палитре компонентов существует компонент MenuItem. Однако его там нет, поскольку
пункты меню не существуют сами по себе, а работают только в составе строки главного
меню или окна контекстного меню. Тем не менее, они во многом ведут себя как настоящие
компоненты, например, настраиваются в окне свойств и наряду с остальными компонентами
помещаются в исходный текст формы в виде отдельных полей.
Вопросы для самоконтроля:
1. Что называют меню?
2. Какие два типа меню различают?
3. Какие компоненты применяются для создания главного меню?
4. Какие компоненты применяются для создания контекстного меню?
Лекция 8.
Тема. Графические компоненты
Визуальные компоненты подразделяются на компоненты, рисуемые оконной системой
Windows, и компоненты, рисуемые графической библиотекой VCL. На программистском
жаргоне первые называют <оконными> компонентами, а вторые - <графическими>
компонентами.
<Оконные> компоненты (windowed controls) являются специализированными окнами
внутри окна формы. Их самое главное качество - способность получать фокус ввода. К числу
оконных компонентов относятся, например, компоненты Button, RadioButton, CheckBox,
GroupBox, и т.д. Некоторые оконные компоненты (GroupBox, TabControl, PageControl)
способны содержать другие визуальные компоненты и называются контейнерами (container
controls). Отображение оконных компонентов обеспечивается операционной системой
Windows. Для профессионалов, имевших дело Windows API, заметим, что оконные
компоненты имеют свойство Handle. Оно связывает компонент среды Delphi с
соответствующим объектом операционной системы.
<Графические> компоненты (graphical controls) не являются окнами, поэтому не могут
получать фокус ввода и содержать другие визуальные компоненты. Графические
компоненты не основаны на объектах операционной системы Windows, их отображение
полностью выполняет библиотека VCL. К числу графических компонентов относятся,
например, компоненты SpeedButton, Image, Bevel и т.д.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 33 из 54
Рисунок 10. Компоненты, рисуемые оконной системой Windows и графической
библиотекой Delphi
Общая классификация компонентов составлена, поэтому перейдем к обсуждению их
свойств и событий. Очевидно, каждый компонент обладает специфичным набором свойств и
событий и, казалось бы, изучать их следует в контексте изучения компонента. Так мы и
будем поступать в будущем при рассмотрении отличительных свойств компонентов. Однако
сейчас имеет смысл рассмотреть общие для большинства компонентов свойства и события.
Визуальные компоненты имеют ряд общих свойств:
Left и Top - местоположение визуального компонента внутри формы (или внутри
компонента-владельца).
Width и Height - горизонтальный и вертикальный размеры компонента соответственно.
Anchors - позволяет привязать границы компонента к границам формы. Привязанная
граница компонента будет следовать за соответствующей границей формы при изменении
размеров формы. Поэкспериментируйте со значениями этого свойства и вы быстро уловите
логику его работы.
BiDiMode - позволяет сделать так, чтобы текст читался справа налево (используется
при работе с восточными языками). Компонент либо использует свое собственное значение
свойства, либо копирует его из компонента-владельца, если вспомогательное свойство
ParentBiDiMode равно значению True.
Caption - надпись компонента. Установленная в свойстве текстовая строка может
содержать специальный символ '&' (амперсант). Если в строке встречается амперсант, то
следующий за ним символ отображается подчеркнутым (амперсант при этом не
отображается). Нажатие соответствующей символьной клавиши на клавиатуре в сочетании с
клавишей Alt активизирует компонент.
Constraints - ограничения на размеры компонента. Вложенные свойства MinWidth и
MinHeight определяют минимальные ширину и высоту, а вложенные свойства MaxWidth и
MaxHeight - максимальные ширину и высоту соответственно.
Color - цвет компонента. Компонент либо использует свой собственный цвет, либо
копирует цвет содержащего компонента. Это определяется значением свойства ParentColor.
Если свойство ParentColor имеет значение True, то изменение цвета у содержащего
компонента (например, формы) автоматически приводит к изменению цвета вложенного
компонента (например, кнопки). Однако, если вы измените значение свойства Color, то
свойство ParentColor автоматически примет значение False, и компонент получит свой
собственный цвет.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 34 из 54
Cursor - определяет, какой вид принимает указатель мыши, когда пользователь наводит
его на компонент. Каждому варианту указателя соответствует своя целочисленная константа
(например, константа crArrow соответствует обычному указателю в виде стрелки). Полный
список значений с описанием вы сможете найти в справочной системе среды Delphi.
DragCursor - вид указателя мыши, когда пользователь буксирует объект над
компонентом. Этот вид курсора устанавливается лишь в том случае, если объект может быть
принят.
DragKind - определяет поведение компонента при буксировке: просто буксировка
(dkDrag) или стыковка (dkDock). В зависимости от значения этого свойства возникает та
или иная цепочка событий: цепочка событий буксировки или цепочка событий стыковки.
DragMode - определяет режим буксировки компонента по экрану. Если в свойстве
установлено значение dmManual (принято по умолчанию), то буксировка должна
инициироваться программно. Если же в свойстве установлено значение dmAutomatic, то
компонент уже готов к буксировке, пользователю достаточно навести указатель мыши на
компонент, нажать кнопку мыши и, удерживая ее, отбуксировать компонент в нужное место.
Enabled - определяет, доступен ли компонент для пользователя. Если свойство имеет
значение True, то компонент доступен, а если значение False, то недоступен. Недоступный
компонент обычно имеет блеклый вид.
Font - шрифт надписи на компоненте. Параметры шрифта задаются с помощью
вложенных свойств CharSet, Color, Name, Size, Style, Height, Pitch, Weight. Компонент
либо использует свой собственный шрифт, либо копирует шрифт содержащего компонента.
Это определяется значением свойства ParentFont. Если свойство ParentFont имеет значение
True, то изменение шрифта у содержащего компонента (например, формы) автоматически
приводит к изменению шрифта у вложенного компонента (например, кнопки). Однако, если
вы измените значение свойства Font, то свойство ParentFont автоматически примет значение
False, и компонент получит свой собственный шрифт для надписи.
HelpType - определяет, каким образом в файле справки будет осуществляться поиск
темы, соответствующей компоненту. Когда компонент обладает фокусом ввода,
пользователь может нажать клавишу F1, чтобы получить оперативную справку. Поиск
соответствующей темы осуществляется либо по номеру, заданному в свойстве HelpContext,
либо по ключевому слову, заданному в свойстве HelpKeyword. В первом случае свойство
HelpType должно иметь значение htContext, а во втором - htKeyword.
HelpContext - содержит номер соответствующей темы в файле справки. Используется,
когда свойство HelpType имеет значение htContext. Если свойство HelpContext имеет
значение 0, то номер темы берется из аналогичного свойства компонента-владельца (как
правило, формы).
HelpKeyword - содержит ключевое слово для поиска темы в файле справки.
Используется, когда свойство HelpType имеет значение htKeyword. Если свойство
HelpKeyword имеет пустое значение, то поиск осуществляется по ключевому слову, которое
берется из аналогичного свойства компонента-владельца (как правило, формы).
Hint - подсказка, появляющаяся над компонентом, когда пользователь временно
задерживает над ним указатель мыши. Появление подсказки может быть разрешено или
запрещено с помощью свойства ShowHint. Значение свойства ShowHint может копироваться
из содержащего компонента в зависимости от значения свойства ParentShowHint. Если
свойство ParentShowHint имеет значение True, то запрет подсказки для содержащего
компонента (например, для формы), автоматически приводит к запрету подсказки для
вложенного компонента (например, для кнопки). Однако, если вы измените значение
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 3 5из 54
свойства ShowHint, то свойство ParentShowHint автоматически примет значение False, и
управление запретом подсказки перейдет к компоненту.
PopupMenu - используется для привязки контекстного меню к компоненту. Это меню
вызывается щелчком правой кнопки мыши по компоненту. Меню подробно рассмотрены в
главе 8.
TabOrder - содержит порядковый номер компонента в пределах своего компонентавладельца. Это номер очереди, в которой компонент получает фокус ввода при нажатии
клавиши Tab на клавиатуре. Свойство TabOrder присутствует только в оконных
компонентах.
TabStop - определяет, может ли компонент получать фокус ввода. Если свойство имеет
значение True, то компонент находится в очереди на фокус ввода, а если значение False, то нет. Свойство TabStop присутствует только в оконных компонентах.
Visible - определяет видимость компонента на экране. Если свойство имеет значение
True, то компонент виден, а если значение False, то - не виден.
Вопросы для самоконтроля:
1. Как подразделяются визуальные компоненты?
2. Что называют оконными компонентами?
3. Что называют графическими компонентами?
4. Назовите основные свойства визуальных компонентов?
Лекция 9.
Тема. Создание SDI и MDI приложений
Форма - это главный компонент приложения, который, как и менее значительные
компоненты, имеет свойства. Важнейшие свойства формы: заголовок, высота, ширина,
местоположение, цвет фона и др. При создании новой формы среда Delphi сама задает
начальные значения свойствам формы, но вы можете изменить их так, как считаете нужным.
Это можно сделать во время проектирования формы (в окне свойств) или во время
выполнения приложения (с помощью операторов языка Delphi).
Форма имеет очень много свойств, и поначалу в них легко запутаться. Практика
показывает, что путаница возникает из-за алфавитного порядка свойств в окне Object
Inspector: близкие по смыслу свойства оказываются разбросанными по ячейкам списка.
Чтобы у вас сложилось представление о возможностях формы, рассмотрим основные
свойства формы в порядке их важности. Для этого нам понадобится новое приложение.
Выберите в меню команду File | New | Application. Среда Delphi автоматически создаст
в новом проекте чистую форму и поместит ее исходный текст в редактор кода.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 36 из 54
Рисунок 11. Форма на экране и ее описание в редакторе кода
Сразу сохраните проект и его форму, чтобы дать им осмысленные имена. Выберите в
меню команду File | Save All и дайте модулю имя Main.pas, а проекту - имя FormTest.dpr.
Полигон для изучения формы подготовлен, можно заняться ее свойствами.
Имя и заголовок формы
Главное свойство, с которого вы начинаете настройку формы, - это свойство Name имя. Оно содержит идентификатор, используемый для обращения к форме из программы.
Первой же форме нового проекта автоматически назначается имя Form1. Мы советуем
всегда его изменять, чтобы имя формы отражало ее роль в приложении. Например, главную
форму приложения можно назвать MainForm.
Рисунок 12. Программный идентификатор формы
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 37 из 54
На будущее заметим, что свойство Name есть в любом компоненте, и оно
редактируется в окне свойств.
Каждая форма приложения должна иметь понятный заголовок, говорящий
пользователю о ее назначении. Заголовок задается в свойстве Caption. Наша форма учебная, поэтому мы дадим ей заголовок Main, говорящий о том, что это просто главная
форма.
Рисунок 13. Заголовок формы
Стиль формы
Настраивая форму, нужно принимать во внимание, какой пользовательский интерфейс
будет иметь ваше приложение: многодокументный интерфейс MDI (от англ. Multiple
Document Interface) или обычный одно-документный интерфейс SDI (от англ. Single
Document Interface). За это отвечает свойство формы FormStyle, которое может принимать
следующие значения:
fsMDIChild - дочернее окно MDI-приложения;
fsMDIForm - главное окно MDI-приложения;
fsNormal - обычное окно (значение по умолчанию);
fsStayOnTop - окно, всегда расположенное поверх других окон на экране.
Многие приложения, с которыми работаем, имеют пользовательский интерфейс MDI.
Они состоят из основного окна, которое включает одно или несколько внутренних окон.
Внутренние окна ограничены областью основного окна и не могут выходить за его границы.
Для главной формы, соответствующей основному окну MDI-приложения, значение свойства
FormStyle должно быть равно fsMDIForm. Для всех второстепенных форм,
соответствующих внутренним окнам, значение свойства FormStyle равно fsMDIChild. Для
окон диалога, выполняющихся в монопольном режиме, свойство FormStyle равно значению
fsNormal, что дает возможность выносить их за пределы основной формы.
Если программа имеет пользовательский интерфейс SDI, то каждая форма существует в
виде отдельного независимого окна. Одно из окон является главным, однако оно не
содержит другие окна. В SDI-приложении значение свойства FormStyle равно fsNormal и
для главной формы, и для второстепенных форм. В некоторых случаях допускается
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 38 из 54
установка значения fsStayOnTop для того, чтобы форма всегда отображалось поверх других
форм.
Очевидно, что наш простой вычислитель идеального веса является SDI-приложением и
поэтому свойство FormStyle имеет значение по умолчанию - fsNormal.
Размеры и местоположение формы на экране
Теперь определимся с размерами формы и ее местоположением на экране. Установить
размеры и положение формы проще всего во время проектирования с помощью мыши.
Другой способ - обратиться к окну свойств и задать размеры формы с помощью свойств
Width и Height, а местоположение - с помощью свойств Left и Top (значения задаются в
пикселах).
Рисунок 14 . Размеры и местоположение формы на экране
Кроме того, с помощью свойства Position можно организовать автоматическое
размещение формы на экране, выбрав одно из следующих возможных значений:
poDefault - размеры и положение формы подбираются автоматически исходя из
размеров экрана.
poDefaultPosOnly - положение формы подбирается автоматически, а ширина и высота
определяются значениями свойств Width и Height соответственно.
poDefaultSizeOnly - размеры формы устанавливаются автоматически, а местоположение
определяется значениями свойств Left и Top.
poDesigned - размеры и положение формы определяются значениями свойств Left, Top,
Width, Height.
poDesktopCenter - форма размещается в центре рабочего стола (т.е. экрана, из которого
исключена панель задач). Размеры формы определяются значениями свойств Width и
Height.
poMainFormCenter - форма центрируется относительно главной формы. Размеры формы
определяются значениями свойств Width и Height.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 39 из 54
poOwnerFormCenter - форма центрируется относительно формы-владельца. Размеры
формы определяются значениями свойств Width и Height.
poScreenCenter - форма размещается в центре экрана. Размеры формы определяются
значениями свойств Width и Height.
Иногда размеры формы рассчитываются исходя из размеров ее внутренней рабочей
области (client area), на которой размещаются компоненты. Как известно, в рабочую область
не входят рамка и заголовок. Размеры рабочей области хранятся в свойствах ClientWidth и
ClientHeight. При их установке значения свойств Width и Height автоматически
пересчитываются (и наоборот).
Бывает, что при выборе размеров формы учитываются размеры экрана. Поскольку
современные видео-адаптеры поддерживают множество режимов с различными
разрешениями, встает вопрос: как обеспечить одинаковую пропорцию между формой и
экраном независимо от разрешающей способности дисплея. На этот случай в форме
предусмотрено свойство Scaled. Если оно установлено в значение True, то форма будет
автоматически масштабироваться в зависимости от разрешающей способности дисплея.
При перемещении по экрану, форма может слегка прилипать к краям экрана, если края
формы находятся в непосредственной близости от них. Это происходит в том случае, если
свойство ScreenSnap содержит значение True. Расстояние формы до краев экрана, при
котором форма прилипает, задается в свойстве SnapBuffer и измеряется в пикселях.
Работая с приложением, пользователь может свернуть форму или развернуть ее на всю
рабочую область экрана с помощью соответствующих кнопок рамки. Состояние формы
(свернута или развернута) определяется свойством WindowState, которое принимает
следующие значения:
wsNormal - форма находится в нормальном состоянии (ни свернута, ни развернута на
весь экран);
wsMinimized - форма свернута;
wsMaximized - форма развернута на весь экран.
Если при проектировании вы измените значение свойства WindowState на wsMinimized
или wsMaximized, то получите форму, которая при первом появлении будет автоматически
либо свернута в панель задач, либо развернута на весь экран.
На компьютере с двумя и более мониторами существует возможность выбрать для
формы монитор, на котором она отображается. Для этого следует установить свойство
DefaultMonitor в одно из следующих значений:
dmDesktop - форма отображается на текущем мониторе; никаких попыток разместить
форму на каком-то конкретном мониторе не делается;
dmPrimary - форма отображается на первом мониторе в списке Monitors объекта
Screen;
dmMainForm - форма отображается на том мониторе, на котором находится главная
форма;
dmActiveForm - форма отображается на том мониторе, на котором находится активная в
данный момент форма.
Свойство DefaultMonitor учитывается лишь в том случае, если в программе существует
главная форма.
Вопросы для самоконтроля:
1. Что называют формой?
2. Как задается имя и заголовок формы?
3. Как настроить стиль формы?
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 40 из 54
4. Если программа имеет пользовательский интерфейс SDI, то как существует
каждая форма?
Лекция 10.
Тема. Обработка исключительных ситуаций
Исключительная ситуация (exception) - это прерывание нормального хода работы
программы из-за невозможности правильно выполнить последующие действия.
Представим, что подпрограмма выделяет область динамической памяти и загружает в
нее содержимое некоторого файла. Если в системе окажется недостаточно памяти, то данные
будет негде разместить и попытка загрузить файл приведет к ошибке. Скорее всего, вся
программа будет аварийно завершена из-за того, что оператор загрузки данных обратится по
недоступному для программы адресу. Как этого избежать? При обнаружении проблемы
подпрограмма должна создать исключительную ситуацию - прервать нормальный ход своей
работы и передать управление тем операторам, которые смогут обработать ошибку. Как
правило, операторы обработки исключительных ситуаций находятся в одной из вызывающих
подпрограмм.
Механизм обработки исключительных ситуаций лучше всего подходит для
взаимодействия программы с библиотекой подпрограмм. Подпрограммы библиотеки
обнаруживают ошибки, но в большинстве случаев не знают, как на них реагировать.
Вызывающая программа, наоборот, знает, что делать при возникновении ошибок, но, как
правило, не умеет их своевременно обнаруживать. Благодаря механизму обработки
исключительных ситуаций обеспечивается связь между библиотекой и использующей ее
программой при обработке ошибок.
Исключительные ситуации в языке Delphi описываются классами. Каждый класс
соответствует определенному типу исключительных ситуаций. Когда в программе возникает
исключительная ситуация, создается объект соответствующего класса, который переносит
информацию об этой ситуации из места возникновения в место обработки.
Классы исключительных ситуаций образуют иерархию, корнем которой является класс
Exception. Класс Exception описывает самый общий тип исключительных ситуаций, а его
наследники - конкретные виды таких ситуаций (таблица 4.1). Например, класс
EOutOfMemory порожден от Exception и описывает ситуацию, когда свободная
оперативная память исчерпана.
В следующей таблице приведены стандартные классы исключительных ситуаций,
объявленные в модуле SysUtils. Они покрывают практически весь спектр возможных
ошибок. Если их все-таки окажется недостаточно, вы можете объявить новые классы
исключительных ситуаций, порожденные от класса Exception или его наследников.
Таблица 6. Классы исключительных ситуаций
Класс
Описание
исключительных
ситуаций
EAbort
<Безмолвная> исключительная ситуация, используемая для выхода
из нескольких уровней вложенных блоков или подпрограмм. При этом
на экран не выдается никаких сообщений об ошибке. Для генерации
исключительной ситуации класса EAbort нужно вызвать стандартную
процедуру Abort.
УМКД 042-14-02Редакция № 1 от 01.09.2008 г.
Страница 41 из 54
03.1.20.26-2007
Продолжение таблицы 6
EInOutError
Ошибка доступа к файлу или устройству ввода-вывода. Код
ошибки содержится в поле ErrorCode.
EExternal
Исключительная ситуация, возникшая вне программы, например, в
операционной системе.
EExternalExc
Исключительная ситуация, возникшая за пределами программы,
eption
например в DLL-библиотеке, разработанной на языке C++.
EHeapExcepti
Общий класс исключительных ситуаций, возникающих при работе
on
с динамической памятью. Является базовым для классов EOutOfMemory
и EInvalidPointer.Внимание! Создание исключительных ситуаций этого
класса (и всех его потомков) полностью берет на себя среда Delphi,
поэтому никогда не создавайте такие исключительные ситуации с
помощью оператора raise.
EOutOfMemo
Свободная оперативная память исчерпана (см. EHeadException).
ry
EInvalidPoint
Попытка
освободить
недействительный
указатель
(см.
er
EHeadException). Обычно это означает, что указатель уже освобожден.
EIntError
Общий класс исключительных ситуаций целочисленной
арифметики, от которого порождены классы EDivByZero, ERangeError и
EIntOverflow.
EDivByZero
Попытка деления целого числа на нуль.
ERangeError
Выход за границы диапазона целого числа или результата
целочисленного выражения.
EIntOverflow
Переполнение в результате целочисленной операции.
EMathError
Общий
класс
исключительных
ситуаций
вещественной
математики, от которого порождены классы EInvalidOp, EZeroDivide,
EOverflow и EUnderflow.
EInvalidOp
Неверный код операции вещественной математики.
EZeroDivide
Попытка деления вещественного числа на нуль.
EOverflow
Потеря старших разрядов вещественного числа в результате
переполнения разрядной сетки.
EUnderflow
Потеря младших разрядов вещественного числа в результате
переполнения разрядной сетки.
EInvalidCast
Неудачная попытка приведения объекта к другому классу с
помощью оператора as.
EConvertErro
Ошибка преобразования данных с помощью функций IntToStr,
r
StrToInt, StrToFloat, StrToDateTime.
EVariantError
Невозможность преобразования варьируемой переменной из
одного формата в другой.
EAccessViola
Приложение осуществило доступ к неверному адресу в памяти.
tion
Обычно это означает, что программа обратилась за данными по
неинициализированному указателю.
EPrivilege
Попытка выполнить привилегированную инструкцию процессора,
на которую программа не имеет права.
EStackOverfl
Стек приложения не может быть больше увеличен.
ow
УМКД 042-14-02Редакция № 1 от 01.09.2008 г.
Страница 42 из 54
03.1.20.26-2007
Продолжение таблицы 6
EControlC
Во время работы консольного приложения пользователь нажал
комбинацию клавиш Ctrl+C.
EAssertion
Возникает при вызове процедуры Assert, когда первый параметр
Failed
равен значению False.
EPackageE
Проблема во время загрузки и инициализации библиотеки
rror
компонентов.
EOSError
Исключительная ситуация, возникшая в операционной системе.
Наследование классов позволяет создавать семейства родственных исключительных
ситуаций. Примером такого семейства являются классы исключительных ситуаций
вещественной математики, которые объявлены в модуле SysUtils следующим образом.
type
EMathError = class(Exception);
EInvalidOp = class(EMathError);
EZeroDivide = class(EMathError);
EOverflow = class(EMathError);
EUnderflow = class(EMathError);
Класс исключительных ситуаций EMathError является базовым для классов EInvalidOp,
EZeroDivide, EOverflow и EUnderflow, поэтому, обрабатывая исключительные ситуации
класса EMathError, вы будете обрабатывать все ошибки вещественной математики, включая
EInvalidOp, EZeroDivide, EOverflow и EUnderflow.
Нетрудно заметить, что имена классов исключений начинаются с буквы E (от слова
Exception). Этого правила полезно придерживаться при объявлении собственных классов
исключений, например:
type
EMyException = class(Exception)
MyErrorCode: Integer;
end;
Как описываются классы исключительных ситуаций понятно
Идея обработки исключительных ситуаций состоит в следующем. Когда подпрограмма
сталкивается с невозможностью выполнения последующих действий, она создает объект с
описанием ошибки и прерывает нормальный ход своей работы с помощью оператора raise.
Так возникает исключительная ситуация.
raise EOutOfMemory.Create('Маловато памяти');
Данный оператор создает объект класса EOutOfMemory (класс ошибок исчерпания
памяти) и прерывает нормальное выполнение программы. Вызывающие подпрограммы
могут эту исключительную ситуацию перехватить и обработать. Для этого в них
организуется так называемый защищенный блок:
try
// защищаемые от ошибок операторы
except
// операторы обработки исключительной ситуации
end;
Между словами try и except помещаются защищаемые от ошибок операторы. Если при
выполнении любого из этих операторов возникает исключительная ситуация, то управление
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 43 из 54
передается операторам между словами except и end, образующим блок обработки
исключительных ситуаций. При нормальном (безошибочном) выполнении программы блок
except...end пропускается.
Рисунок 15. Логика работы оператора try:except:end
При написании программы вы можете использовать вложенные защищенные блоки,
чтобы организовать локальную и глобальную обработку исключительных ситуаций.
Концептуально это выглядит следующим образом:
try
// защищаемые операторы
try
// защищаемые операторы
except
// локальная обработка исключительных ситуаций
end;
// защищаемые операторы
except
// глобальная обработка исключительных ситуаций
end;
Исключительные ситуации внешнего защищенного блока, возникающие за пределами
вложенного блока, обрабатываются внешней секцией except...end. Исключительные
ситуации вложенного защищенного блока обрабатываются вложенной секцией except...end.
Распознавание класса исключительной ситуации выполняется с помощью конструкций
on <класс исключительной ситуации> do <оператор>;
которые записываются в секции обработки исключительной ситуации, например:
try
// вычисления с вещественными числами
except
on EZeroDivide do ... ; // обработка ошибки деления на нуль
on EMathError do ... ; // обработка других ошибок вещественной математики
end;
Поиск соответствующего обработчика выполняется последовательно до тех пор, пока
класс исключительной ситуации не окажется совместимым с классом, указанным в
операторе on. Как только обработчик найден, выпоняется оператор, стоящий за словом do и
управление передается за секцию except...end. Если исключительная ситуация не относится
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 44 из 54
ни к одному из указанных классов, то управление передается во внешний блок
try...except...end и обработчик ищется в нем.
Обратите внимание, что порядок операторов on имеет значение, поскольку
распознавание исключительных ситуаций должно происходить от частных классов к общим
классам, иначе говоря, от потомков к предкам. С чем это связано? Сейчас поймете.
Представьте, к чему приведет изменение порядка операторов on в примере выше, если
принять во внимание, что класс EMathError является базовым для EZeroDivide. Ответ
простой: обработчик EMathError будет поглощать все ошибки вещественной математики, в
том числе EZeroDivide, в результате обработчик EZeroDivide никогда не выполнится.
На самом высоком уровне программы бывает необходимо перехватывать все
исключительные ситуации, чтобы в случае какой-нибудь неучтенной ошибки корректно
завершить приложение. Для этого применяется так называемый обработчик по умолчанию
(default exception handler). Он записывается в секции except после всех операторов on и
начинается ключевым словом else:
try
{ вычисления с вещественными числами }
except
on EZeroDivide do { обработка ошибки деления на нуль };
on EMathError do { обработка других ошибок вещественной математики };
else { обработка всех остальных ошибок (обработчик по умолчанию) };
end;
Учтите, что отсутствие части else соответствует записи else raise, которое нет смысла
использовать явно. Мы со своей стороны вообще не советуем вам пользоваться обработкой
исключительных ситуаций по умолчанию, поскольку все ваши приложения будут строиться,
как правило, на основе библиотеки VCL, в которой обработка по умолчанию уже
предусмотрена.
Пример обработки исключительной ситуации
В качестве примера обработки исключительной ситуации рассмотрим две функции:
StringToCardinal и StringToCardinalDef.
Функция StringToCardinal выполняет преобразование строки в число с типом Cardinal.
Если преобразование невозможно, функция создает исключительную ситуацию класса
EConvertError.
function StringToCardinal(const S: string): Cardinal;
var
I: Integer;
B: Cardinal;
begin
Result := 0;
B := 1;
for I := Length(S) downto 1 do
begin
if not (S[I] in ['0'..'9']) then
raise EConvertError.Create(S + ' is not a valid cardinal value');
Result := Result + B * (Ord(S[I]) - Ord('0'));
B := B * 10;
end;
end;
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 45 из 54
Функция StringToCardinalDef также выполняет преобразование строки в число с типом
Cardinal, но в отличие от функции StringToCardinal она не создает исключительную
ситуацию. Вместо этого она позволяет задать значение, которое возвращается в случае
неудачной попытки преобразования:
function StringToCardinalDef(const S: string; Default: Cardinal = 0): Cardinal;
begin
try
Result := StringToCardinal(S);
except
on EConvertError do
Result := Default;
end;
end;
Для преобразования исходной строки в число используется определенная выше
функция StringToCardinal. Если при преобразовании возникает исключительная ситуация, то
она <поглощается> функцией StringToCardinalDef, которая в этом случае возвращает
значение параметра Default. Если происходит какая-нибудь другая ошибка (не
EConvertError), то управление передается внешнему блоку обработки исключительных
ситуаций, из которого была вызвана функция StringToCardinalDef.
Пример очень прост, но хорошо демонстрирует преимущества исключительных
ситуаций перед традиционной обработкой ошибок. Представьте более сложные вычисления,
состоящие из множества операторов, в каждом из которых может произойти ошибка.
Насколько сложной окажется обработка ошибок многочисленными операторами if и
насколько простой оператором try.
Возобновление исключительной ситуации
В тех случаях, когда защищенный блок не может обработать исключительную
ситуацию полностью, он выполняет только свою часть работы и возобновляет
исключительную ситуацию с тем, чтобы ее обработку продолжил внешний защищенный
блок:
try
// вычисления с вещественными числами
except
on EZeroDivide do
begin
// частичная обработка ошибки
raise; // возобновление исключительной ситуации
end;
end;
Если ни один из внешних защищенных блоков не обработал исключительную
ситуацию, то управление передается стандартному обработчику исключительной ситуации,
завершающему приложение.
качестве примера обработки исключительной ситуации рассмотрим две функции:
StringToCardinal и StringToCardinalDef.
Функция StringToCardinal выполняет преобразование строки в число с типом Cardinal.
Если преобразование невозможно, функция создает исключительную ситуацию класса
EConvertError.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 46 из 54
function StringToCardinal(const S: string): Cardinal;
var
I: Integer;
B: Cardinal;
begin
Result := 0;
B := 1;
for I := Length(S) downto 1 do
begin
if not (S[I] in ['0'..'9']) then
raise EConvertError.Create(S + ' is not a valid cardinal value');
Result := Result + B * (Ord(S[I]) - Ord('0'));
B := B * 10;
end;
end;
Функция StringToCardinalDef также выполняет преобразование строки в число с типом
Cardinal, но в отличие от функции StringToCardinal она не создает исключительную
ситуацию. Вместо этого она позволяет задать значение, которое возвращается в случае
неудачной попытки преобразования:
function StringToCardinalDef(const S: string; Default: Cardinal = 0): Cardinal;
begin
try
Result := StringToCardinal(S);
except
on EConvertError do
Result := Default;
end;
end;
Для преобразования исходной строки в число используется определенная выше
функция StringToCardinal. Если при преобразовании возникает исключительная ситуация, то
она <поглощается> функцией StringToCardinalDef, которая в этом случае возвращает
значение параметра Default. Если происходит какая-нибудь другая ошибка (не
EConvertError), то управление передается внешнему блоку обработки исключительных
ситуаций, из которого была вызвана функция StringToCardinalDef.
Пример очень прост, но хорошо демонстрирует преимущества исключительных
ситуаций перед традиционной обработкой ошибок. Представьте более сложные вычисления,
состоящие из множества операторов, в каждом из которых может произойти ошибка.
Насколько сложной окажется обработка ошибок многочисленными операторами if и
насколько простой оператором try.
Вопросы для самоконтроля:
1. Что называют исключительной формой?
2. Как описываются исключительные ситуации в Delphi?
3. Как возобновить исключительную ситуацию?
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 47 из 54
2 ПРАКТИЧЕСКИЕ ЗАНЯТИЯ
Практическая работа №1
Тема: создание консольного приложения
Цель: создание консольной программы
Практическая работа №2
Тема: Приветствие
Цель: создание программы выполняющую следующие действия:
1. После запуска программы по щелчку мышью на кнопке «Приветствие» появляется
сообщение «Первые успехи».
2. Для выхода из программы необходимо щелкнуть мышью на кнопке «Закрыть».
Практическая работа №3
Тема: Случайный выбор
Цель: - создать программу, выполняющую следующие действия:
1. После запуска программы появляется надпись «Брось кубик».
2. По щелчку мышью на кнопке «Бросок кубика» появляется сообщение, выдающее числаочки в диапазоне 0 - 6.
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Практическая работа №4
Тема: Пересчет денежной суммы
Цель: создать программу, выполняющую следующие действия:
После запуска программы отображаются: две строки для ввода текущих курсов для
евро и доллара; строка для ввода денежной суммы в рублях; две строки для вывода
эквивалента в евро, долларах.
Практическая работа №5
Тема: Двигающаяся кнопка
Цель: создать программу, выполняющую следующие действия:
1. По щелчку мышью на кнопке кнопка либо останавливается, либо двигается.
2. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 48 из 54
Практическая работа №6
Тема: Альбом
Цель: создать программу, выполняющую следующие действия:
1. После запуска программы в окне изображается рисунок.
2. По щелчку мышью на рисунке появляется диалоговое окно.
3. Выбрать в открывшемся диалоговом окне любой другой рисунок.
1.
2.
3.
4.
5.
6.
7.
Практическая работа №7
Тема: Работа с меню
Цель: создать программу, выполняющую следующие действия:
После запуска программы в окне изображается строка меню (Файл, Выход).
При выборе пункта меню Файл появляются пункты меню (Рисунки, Выход).
При выборе пункта меню Рисунки появляется вложенное меню, состоящее из двух
пунктов (Облака, Лес).
По щелчку правой кнопки мыши появляется контекстное меню.
Выбрать по пункту другой рисунок
Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Если выбрать любой из пунктов Выход, работа программы завершается.
Практическая работа №8
Тема: Случайный выбор из списка
Цель: создать программу, выполняющую следующие действия:
1. После запуска программы в окне изображается три поля.
2. По щелчку мышью на кнопке «Случайный выбор» из трех слов составляется
предложение случайным образом.
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Практическая работа №9
Тема: Плеер
Цель: создать программу, выполняющую следующие действия:
1. После запуска программы в окне изображается музыкальный проигрыватель.
2. По щелчку мышью на кнопке «Play» воспроизвести выбранную мелодию.
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
1.
2.
3.
4.
Практическая работа №10
Тема: Прыгающая кнопка
Цель: создать программу-игру, выполняющую следующие действия:
После запуска программы в окне изображается беспорядочно прыгающая кнопка.
Необходимо успеть щелкнуть по ней.
Кнопка перепрыгивает из одного места в другое по сигналу, полученному от таймера.
Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 49 из 54
1.
2.
3.
4.
1.
2.
3.
4.
5.
Практическая работа №11
Тема: Таблица умножения
Цель: создать программу, выполняющую следующие действия:
После запуска программы в окне изображается два движка.
Необходимо выбрать два числовых значения и найти их произведение.
Если выбирается одно число, то находится его квадрат.
Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Практическая работа №12
Тема: Применение полос прокрутки
Цель: создать программу, выполняющую следующие действия:
После запуска программы в окне изображается две полосы прокрутки. Вертикальная
полоса будет управлять движением по вертикали, горизонтальная – по горизонтали.
Наводя указатель мыши на одну из двух фигур, можно выбирать, какая из этих фигур
связана с полосами прокрутки.
Требуются дополнительные объекты, с помощью которых ограничивается область
движения фигур в окне.
Если полоса прокрутки активная, то она должна реагировать на клавиши ВВЕХ, ВНИЗ,
ВЛЕВО, ВПРАВО, PAGE UP, PAGE DOWN.
Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Практическая работа №13
Тема: Светофор
Цель: создать программу, выполняющую следующие действия:
1. После запуска программы в окне изображается светофор с тремя лампочками,
способными реагировать на наведение указателя мыши.
2. Когда указатель мыши наведен на лампочку, она меняет свой цвет.
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Практическая работа №14
Тема: Ханойские башни
Цель: создать компьютерную версию игры-головоломки «Ханойские башни». Игровая
доска содержит семь клеток, расположенных в ряд. На трех левых клетках стоят белые
фишки, на трех правых – черные. Центральная клетка пуста. Задача заключается в том,
чтобы, делая допустимые ходы, поменять фишки местами. Правила ходов такие.
1. Белые фишки могут ходить только вправо, а черные – только влево.
2. Ходить разрешается только на свободное поле.
3. Разрешены перемещения на соседнее поле и «прыжок» через одну фишку.
В роли фишек выступают кнопки с изображением, например, цветных
треугольников, направленных так, чтобы они указывали допустимое направление ходов.
Кнопки будут передвигаться по игровой доске, созданной при помощи панели.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 50 из 54
Практическая работа №15
Тема: Электронный альбом
Цель: создать программу, выполняющую следующие действия:
1. После запуска программы в окне изображается рисунок, выбранный первым
переключателем из раскрывающегося списка.
2. Выбираем необходимый переключатель, рисунок из соответствующего
раскрывающегося списка.
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
1.
2.
3.
4.
Практическая работа №16
Тема: Вычисление процентов
Цель: создать программу, выполняющую следующие действия:
После запуска программы в окне изображается три текстовых поля.
В первое поле вводится число. Во второе поле – проценты. При нажатии кнопки
«Рассчитать» в третье поле выводятся вычисленные проценты от числа.
При нажатии кнопки «Очистить» очищаются значения полей. Далее вводятся новые
значения в поля.
Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке в
строке заголовка.
Практическая работа №17
Тема: Головоломка № 1
Цель: создать компьютерную версию одной из головоломок Самуэля Ллойда: из
заданного набора чисел надо выбрать те, сумма которых составит 50. Числа,
которые избрал Ллойд для своей головоломки: 25, 27, 3, 12, 6, 15, 9, 30, 21, 19.
Практическая работа №18
Тема: Головоломка № 2
Цель: - создать компьютерную версию головоломки: из изображенных пяти
сброшенных флажков установить все. Но при выборе одного флажка меняется состояние
двух следующих.
Практическая работа №19
Тема: Инженерный калькулятор
Цель: создать программу, выполняющую действия инженерного калькулятора.
Практическая работа №20
Тема: Строковый калькулятор
Цель: создать программу, выполняющую действия строкового калькулятора.
Практическая работа №21
Тема: Нахождение индекса в массиве случайных чисел
Цель: создать программу, которая находит индекс числа в массиве случайных чисел.
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 51 из 54
Практическая работа №22
Тема: Нахождение минимального и максимального числа в массиве
Цель: создать программу, которая находит минимальное и максимальное числа в
введенном массиве.
.
Практическая работа №23
Тема: создание программы «Узоры»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу, выполняющую следующие действия без участия пользователя:
1. После запуска программы в окне изображаются рисунки, созданные самой
программой по заранее заданным правилам.
2. Картинка обновляется «сама собой». Интервал таймера может быть любым. Он
зависит от компьютера, на котором работает программа.
3. Для выхода из программы необходимо щелкнуть мышью на закрывающей кнопке
в строке заголовка.
Практическая работа №24
Тема: создание программы «Перемещение рисунка»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу, в которой на поверхности окна перемещается случайным
образом изображение веселой рожицы. Пользователь должен сделать щелчок кнопкой мыши
по изображению. Программа должна завершить работу после того, как пользователь сделает
10 щелчков кнопкой мыши.
Практическая работа №25
Тема: создание программы «Рисунок»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу, выводящую на форму приведенный ниже рисунок. По нажатию
на клавишу «Лучи» происходит смена направления лучей. Изменить программу так, чтобы
лучи изменяли направления без нажатия клавиши.
Р
и
Практическая работа №26
с.
Тема: создание программы «Построение графика»
5
Цель работы:
7.
- усвоить способы создания программ на Delphi;
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 52 из 54
- создать программу построения графика, в которой устанавливается масштаб, в
цикле осуществляется построение графика функции, рисуются оси координат и печатаются
на них числовые шкалы.
Практическая работа №27
Тема: создание программы «Градусник»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу, которая переводит значение температуры по Цельсию в
значения температуры по Фаренгейту. Введите графический объект изображения значения
температуры.
Практическая работа №28
Тема: создание программы «Вывод табличных данных»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу, рассчитывающую суммы по столбцам и строкам вводимых
чисел.
.
Практическая работа №29
Тема: создание программы «Игра»
Цель работы:
- усвоить способы создания программ на Delphi;
- - создать программу – игру. Игрок управляет пушкой зенитки, его боевое задание –
справиться с нашествием воздушных шаров. Воздушные шары несут бомбы, которые они
сбросят, как только окажутся над пушкой. Необходимо не допустить этого и уничтожить их
все на подлете. Снаряды не ограничены, но следующий выстрел можно делать только после
того, как выпущенный снаряд поразит цель, упадет на землю или уйдет из зоны видимости.
В игре участвуют:

воздушные шары,

знитная пушка,

пушечный снаряд,
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 53 из 54


бомба,
внешняя среда.
Практическая работа №30
Тема: создание программы «Тест»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу, которая тестирует учащегося по информатике и математике.
Проект должен содержать последовательность форм, реализующих диалог с
тестируемым учащимся.
На первой форме происходит регистрация учащегося.
Практическая работа №31
Тема: создание программы «Проигрыватель»
Цель работы:
- усвоить способы создания программ на Delphi;
- создать программу - проигрыватель файлов мультимедиа, снабженный системой
визуализации. Для начала многооконность будет реализована посредством стандартных
диалогов. Проигрыватель файлов мультимедиа, проигрывающий различные форматы, а
также сопровождающий музыкальные файлы визуализацией.
3 СРСП И СРС
При кредитной системе обучения предъявляются высокие требования к
повышению качества организации самостоятельной работы студента, которая
включает выполнение различных домашних заданий.
Самостоятельная работа студента под руководством преподавателя – одна
из форм учебной работы при кредитной системе обучения, которая проводится
в виде аудиторного занятия в диалоговом режиме, а также в виде консультаций
во внеаудиторное время.
Содержание самостоятельной работы студентов под руководством
преподавателя и чисто самостоятельной работы студента приведено в таблице 1
УМКД 042-14-02-03.1.20.26-2007
Редакция № 1 от 01.09.2008 г.
Страница 54 из 54
Таблица 1 – План СРСП и СРС
№
СРСП
п/п
1
2
1. Идеология объектно-ориентированного
программирования
Элементы интерфейса программы
Инспектор объектов
2. Простые типы данных
3. Подпрограммы
4. Программные модули
5. Строки
6. Массивы
7. Множества
8. Записи
9. Методы, свойства
СРС
3
Идеология объектно-ориентированного
программирования
Элементы интерфейса программы
Инспектор объектов
Простые типы данных
Операторы
Стандартные модули языка Delphi
Строковые переменные
Работы с массивами
Операции над множествами
Записи
Наследование, виртуальные методы
Download