Книга
Книга
®
Никита Культин
q<wlnh>MW <U
C++ Builder
Возможности среды разработки
Программирование
Успешноеосвоение среды быстрой разработки приложений
УДК 681.3.068+800.92C++
ББК 32.973.26-018.1
К90
Культин Н. Б.
К90Самоучитель C++ Builder. - СПб.: БХВ-Петербург, 2004. -
320 с.: ил.
ISBN 5-94157-378-2
Книга является руководством по программированию в среде Borland C++ Builder. В ней рассматривается весь процесс разработки программы — от компоновки диалогового окна и написания функций обработки событий до отладки и создания справочной системы при помощи программы Microsoft HTML Help Workshop и установочного CD-ROM в Install Shield Express, разбираются вопросы работы с графикой, мультимедиа и базами данных, приведено описание процесса создания анимации в Macromedia Flash 5. Прилагаемый к книге компакт-диск содержит проекты, приведенные в издании в качестве примеров.
Для начинающих программистов
УДК 681.3.068+800.92С++
ББК 32.973.26-018.1
Группа подготовки издания:
Главный редакторЗам. главного редактораЗав. редакцией РедакторКомпьютернаяверсткаКорректор •Дизайн обложки Зав. производствомГлавный редакторЗам. главного редактораЗав. редакцией РедакторКомпьютернаяверсткаКорректор •Дизайн обложки Зав. производствомЕкатерина Кондукова Анатолий АдаменкоГригорий ДобинГалина СмирноваОльги Сергиенко Зинаида ДмитриеваИгоря Цырульникова Николай ТверскихЕкатерина Кондукова Анатолий АдаменкоГригорий ДобинГалина СмирноваОльги Сергиенко Зинаида ДмитриеваИгоря Цырульникова Николай Тверских
Главный редактор
Зам. главного редактора
Зав. редакцией Редактор
Компьютернаяверстка
Корректор •
Дизайн обложки Зав. производством
Главный редактор
Зам. главного редактора
Зав. редакцией Редактор
Компьютернаяверстка
Корректор •
Дизайн обложки Зав. производством
Екатерина Кондукова Анатолий Адаменко
Григорий Добин
Галина Смирнова
Ольги Сергиенко Зинаида Дмитриева
Игоря Цырульникова Николай Тверских
Екатерина Кондукова Анатолий Адаменко
Григорий Добин
Галина Смирнова
Ольги Сергиенко Зинаида Дмитриева
Игоря Цырульникова Николай Тверских
Лицензия ИД № 02429 от 24.07.00. Подписано в печать 17.11.03.
Формат 70хЮ01/16. Печать офсетная. Усл. печ. л. 25,8.
Тираж 4000 экз. Заказ № 1252
"БХВ-Петербург", 198005, Санкт-Петербург, Измайловский пр., 29.
Гигиеническое заключение на продукцию, товар № 77.99.02.953.Д.001537.03.02от 13.03.2002 г. выдано Департаментом ГСЭН Минздрава России.
Отпечатано с готовых диапозитивовв Академической типографии "Наука" РАН199034, Санкт-Петербург, 9 линия, 12.
ISBN 5-94157-378-2ISBN 5-94157-378-2С Культин н. Б.. 2004
ISBN 5-94157-378-2
ISBN 5-94157-378-2
© Оформление, издательство "БХВ-Петербург", 2004
Содержание
Предисловие7
C++ Builder — что это?7
Об этой книге8
ЧАСТЬ I. СРЕДА РАЗРАБОТКИ C++ BUILDER9
Глава 1. Начало работы10
Глава 2. Первый проект14
Форма14
Компоненты18
Событие и функция обработкисобытия26
Редактор кода30
Система подсказок31
Навигатор классов32
Шаблоны кода33
Справочная система35
Сохранение проекта36
Компиляция38
Ошибки39
Предупреждения и подсказки.41
Компоновка41
Запуск программы42
Ошибки времени выполнения42
Внесение изменений48
Настройка приложения51
Название программы1
Значок приложения51
Перенос приложения на другойкомпьютер54
Структура простого проекта56
ЧАСТЬ II. ПРАКТИКУМ ПРОГРАММИРОВАНИЯ61
Глава 3. Графика62
Холст62
Карандаш и кисть64
Графические примитивы65
Линия....66
Ломаная линия66
Прямоугольник67
Многоугольник68
Окружность и эллипс69
Дуга70
Сектор.70
Текст71
Точка74
Иллюстрации77
Битовые образы82
Мультипликация87
Метод базовой точки87
Использование битовых образов91
Загрузка битового образа из ресурса программы94
Создание файла ресурсов94
Подключение файла ресурсов97
Глава 4. Мультимедиа102
Компонент Animate102
Компонент109
Воспроизведение звука
Просмотр видеороликов121
Создание анимации128
Глава 5. Базы данных134
База данных и СУБД134
Локальные и удаленные базы данных134
Структура базы данных135
Псевдоним136
Компоненты доступа и манипулирования данными137
Создание базы данных137
Доступ к базе данных143
Отображение данных146
Манипулирование данными
Выбор информации из базы данных153
Перенос программы управления базой данных на другой компьютер162
Глава 6. Компонент программиста163
Выбор базового класса163
Создание модуля компонента164
Тестирование компонента171
Установка компонента174
Ресурсы компонента174
Установка176
Проверка компонента178
Настройка палитры компонентов181
Глава 7. Консольное приложение183
Ввод/вывод183
Функция printf.183
Функция scanf.186
Создание консольного приложения187
Глава 8. Справочная система193
Создание справочной системы припомощи Microsoft Help Workshop193
Подготовка справочной информации194
Проект справочной системы197
Вывод справочной информации201
HTML Help Workshop202
Подготовка справочной информации203
Использование Microsoft Word204
Использование HTML Help Workshop205
Создание файла справки209
Компиляция214
Вывод справочной информации215
Глава 9. Создание установочного диска217
Программа Install Shield Express217
Новый проект218
Структура219
Выбор устанавливаемых компонентов222
Конфигурирование системы пользователя223
Настройка диалогов*225
Системные требования227
Создание образа установочной дискеты228
Глава 10. Примеры программ230
Система проверки знаний230
Требования к программе230
Файл теста231
Форма приложения234
Отображение иллюстрации235
Доступ к файлу теста236
Текст программы238
Игра "Сапер"."249
Правила игры и представление данных249
Форма приложения251
Игровое поле253
Начало игры254
Игра257
Справочная информация261
Информация о программе262
Текст программы266
Очистка диска276
Приложение1. C++ Builder — краткий справочник283
Компоненты283
Форма283
Label284
Edit.285
Button'.286
Memo287
RadioButton288
CheckBox289
ListBox290
ComboBox291
StringGrid292
Image293
Timer:294
Animate295
MediaPlayer295
SpeedButton296
UpDom298
Table298
Query299
DataSource300
DBEdit, DBMemo, DBText300
DBGrid301
DBNavigator302
Графика304
Canvas•304
Pen306
Brush307
Функции307
Функции ввода и вывода307
Математические функции308
Функции преобразования309
Функции манипулирования датами и временем309
События310
Исключения311
Приложение 2. Содержимое компакт-диска313
Рекомендуемая литература317
Предметный указатель318
Предисловие
C++ Builder — что это?
Интерес к программированию постоянно растет. Это связано с развитием и внедрением в повседневную жизнь информационных технологий. Если человек имеет дело с компьютером, то рано или поздно у него возникает желание, а иногда и необходимость, научиться программировать.
Среди пользователей персональных компьютеров в настоящее время наиболее популярна операционная система Windows, и естественно, что тот, кто хочет программировать, хочет и писать программы, которые будут работать в Windows.
Несколько лет назад рядовому программисту оставалось только мечтать о создании своих собственных программ, работающих в Windows. Единственным средством разработки был Borland C++ for Windows, явно ориентированный на профессионалов, обладающих серьезными знаниями и опытом.
Бурное развитие вычислительной техники, потребность в эффективных средствах разработки программного обеспечения привели к появлению на рынке целого ряда систем программирования, ориентированных на так называемую "быструю разработку", среди которых особо следует отметить Microsoft Visual Basic и Borland Delphi. В основе систем быстрой разработки (RAD-систем, Rapid Application Development — среда быстрой разработки приложений) лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть работы по генерации кода программы, оставляя программисту работу по конструированию диалоговых окон и написанию функций обработки событий. Производительность программиста при использовании RAD систем фантастическая!
Успех и популярность Delphi вызвал желание фирмы Borland распространить методы быстрой разработки на область профессионального программирования, что и привело к появлению Borland C++ Builder.
C++ Builder — это среда быстрой разработки, в которой в качестве языка программирования используется язык C++ Builder (C++ Builder Language). Не вдаваясь в подробности, можно сказать, что язык C++ Builder — это расширенный C++. Например, в C++ Builder есть строковый (AnsiString) и логический (bool) типы, которых нет в классическом C++.
В настоящее время программистам стала доступна очередная, шестая версия пакета — Borland C++ Builder 6. Как и предыдущие версии, Borland C++ Builder 6 позволяет создавать различные программы: от простейших однооконных приложений до программ управления распределенными базами.
Borland C++ Builder может работать в среде операционных систем от Windows 98 до Windows XP. Особых требований, по современным меркам, к ресурсам компьютера пакет не предъявляет: процессор должен быть типа Pentium или Celeron (рекомендуется Pentium II 400 МГц); объем оперативной памяти должен составлять не менее 128 Мбайт (рекомендуется 256 Мбайт) и свободное дисковое пространство должно быть достаточным (для полной установки версии Enterprise необходимо приблизительно 750 Мбайт).
Об этой книге
Книга, которую вы держите в руках, — не описание среды разработки или языка программирования, а руководство, учебное пособие по основам программирования в C++ Builder. В ней представлена концепция визуального проектирования и событийного программирования, а также рассмотрен процесс создания программы от разработки диалогового окна и функций обработки событий до создания справочной системы и установочного CD-ROM.
Цель этой книги — познакомить читателя с технологией визуального проектирования и событийного программирования и показать на конкретных примерах возможности среды разработки, а также дать методику создания программ. Следует обратить внимание, что хотя книга ориентирована на читателя, обладающего определенными знаниями и начальным опытом в области программирования, она вполне доступна для начинающих.
Среда разработкиC++ Builder
В первой части книги приводится краткое описание среды разработки C++ Builder; на примере программы вычисления силы тока в электрической цепи демонстрируется технология визуального проектирования и событийного программирования; вводятся основные понятия и термины.
Глава 1. Начало работы
Глава 2. Первый проект
ГЛАВА 1
Начало работы
Запускается C++ Builder обычным образом, т. е. выбором из меню Borland 6 команды6 (рис.
sUpdate
Открыть документ Office
Создать документ Office
Программы
,Borland СнВиИег 6
Автозагрузка
ДокументыСредства Microsoft
Стандартные
Настройка
Internet Explorer
НайтиWord
Outlook Express
СправкаAdobe Acrobat 4.0
Выполнить...
Завершение работы...
и 宅 Help►
> @ вое AdninetrMor
► EESS2EB№
Database Desktop
吊 Datapump
Editor
Register Now
SQL Explorer
SQL Monitor
XML Mapper
Рис.Запуск C++ Builder
Вид экрана после запуска C++ Builder несколько необычен (рис. 1.2). Вместо одного окна на экране появляются пять:
главное окно — C++Builder 6;
окно стартовой формы —
окно редактора свойств объектов — Object Inspector;
а окно просмотра списка объектов — Object TreeView;
□ окно редактора кода — Unitl.cpp.
Окно редактора кода почти полностью закрыто окном стартовой формы.
(左 C++Builder 6 - Project】(左 C++Builder 6 - Project】I Не Edit割arch View Project Runj iI Не Edit割arch View Project Runj iJ<NoneTJ<NoneTllnlxlllnlxl”i”i1口 **尿в雪 总 修「④一 Standard | Additional |Win32 i System I Data Access] Data Controls j dbExore$$| DataSnao |BDE Л1Х1口 **尿в雪 总 修「④一 Standard | Additional |Win32 i System I Data Access] Data Controls j dbExore$$| DataSnao |BDE Л1ХJ• ^5^".J• ^5^".в,в,••63S3BW3■ aa • ♦63S3BW3■ aa • ♦口 Fam"!口 Fam"!|Form1Properties j Events | I ActiveConlfol '|Form1Properties j Events | I ActiveConlfol '!Align!AlignI ah oneI ah one:AlphaBlend;falsei回 Anchors ilakLeftakfop] iiI BiDiModa ;bdLeftToRightf El В order) cons j [biSyslemM enu, 8ad«6g 'bsSeeabb:AlphaBlend;falsei回 Anchors ilakLeftakfop] iiI BiDiModa ;bdLeftToRightf El В order) cons j [biSyslemM enu, 8ad«6g 'bsSeeabb,BoderVZid巾,。二..CaptionjFoiml而 shown,BoderVZid巾,。二..CaptionjFoiml而 shownj Кj К......
(左 C++Builder 6 - Project】
(左 C++Builder 6 - Project】
I Не Edit割arch View Project Runj i
I Не Edit割arch View Project Runj i
J<NoneT
J<NoneT
llnlxl
llnlxl
”i
”i
1口 **尿в雪 总 修「④一 Standard | Additional |Win32 i System I Data Access] Data Controls j dbExore$$| DataSnao |BDE Л1Х
1口 **尿в雪 总 修「④一 Standard | Additional |Win32 i System I Data Access] Data Controls j dbExore$$| DataSnao |BDE Л1Х
J• ^5^".
J• ^5^".
в,
в,
•
•
63S3BW3■ aa • ♦
63S3BW3■ aa • ♦
口 Fam"!
口 Fam"!
|Form1
Properties j Events | I ActiveConlfol '
|Form1
Properties j Events | I ActiveConlfol '
!Align
!Align
I ah one
I ah one
:AlphaBlend;false
i
回 Anchors ilakLeftakfop] i
i
I BiDiModa ;bdLeftToRight
f El В order) cons j [biSyslemM enu, 8ad«6g 'bsSeeabb
:AlphaBlend;false
i
回 Anchors ilakLeftakfop] i
i
I BiDiModa ;bdLeftToRight
f El В order) cons j [biSyslemM enu, 8ad«6g 'bsSeeabb
,BoderVZid巾,。二..
CaptionjFoiml
而 shown
,BoderVZid巾,。二..
CaptionjFoiml
而 shown
j К
j К
...
...
Рис. 1.2. Вид экрана после запуска C++ Builder
В главном окне (рис. 1.3) находится меню команд, панели инструментов и палитра компонентов.
Окно стартовой формы (Forml) представляет собой заготовку главного окна разрабатываемой программы (приложения).
i
陛 C++Builder6 - Pro]ectl
File E& Search ^ew "oject Run Component database lools Window Help |<None>二];犷I *
D苏▼ S3 ! ◎尝 I 以修i!尋:standard (Additional1 Win32] Svsiem I Data Access] DataConnote | dbExoress ] DataSnao I BDE 211 百 口 .對. % A闷fc| • OK-l 仅№ И曾g匚j W匚];融
Панели инструментовПалитра компонентов
Рис. 1.3. Главное окно
Окно Object Inspector (рис. 1.4) — окно редактора свойств объектов предназначено для редактирования значений свойств объектов. В терминологии
Объект (имя объекта)
уаж;匚二一 • • т! Properties Events |lj ActiveContiol 1二Align ;alNoneAlphaBlend false1 AlphaBlendVali 255НИ Anchorsjуаж;匚二一 • • т! Properties Events |lj ActiveContiol 1二Align ;alNoneAlphaBlend false1 AlphaBlendVali 255НИ Anchorsji AutoScrolli AutoScrollAutoS izeAutoS izeBiDiModeBiDiModeiSВ order! consiSВ order! construe;fake ^bdLeftToRight[biSystemMenu,true;fake ^bdLeftToRight[biSystemMenu,i[05d^^idth'历CaptioniForml ▼]i[05d^^idth'历CaptioniForml ▼]
уаж;匚二一 • • т
! Properties Events |
lj ActiveContiol 1二
Align ;alNone
AlphaBlend false
1 AlphaBlendVali 255
НИ Anchorsj
уаж;匚二一 • • т
! Properties Events |
lj ActiveContiol 1二
Align ;alNone
AlphaBlend false
1 AlphaBlendVali 255
НИ Anchorsj
i AutoScroll
i AutoScroll
AutoS ize
AutoS ize
BiDiMode
BiDiMode
iSВ order! cons
iSВ order! cons
true
;fake ^bdLeftToRight
[biSystemMenu,
true
;fake ^bdLeftToRight
[biSystemMenu,
i
[05d^^idth'历
CaptioniForml ▼]
i
[05d^^idth'历
CaptioniForml ▼]
I All shown
СвойстваЗначения
объектасвойств
Рис. 1.4. Ma вкладке Properties перечислены свойства объекта и указаны их значения
Рис. 1.5. Окно редактора кодаРис. 1.5. Окно редактора кода
Рис. 1.5. Окно редактора кода
Рис. 1.5. Окно редактора кода
визуального проектирования объекты — это диалоговые окна и элементы управления (поля ввода и вывода, командные кнопки, переключатели и др.). Свойства объекта — это характеристики, определяющие вид, положение и поведение объекта. Например, свойства width и Height задают раз-
мер (ширину и высоту) формы, свойства тор и Left — положение формы на экране, свойство Caption — текст заголовка. В верхней части окна указан объект (имя объекта), значения свойств которого отражены в окне Object Inspector.
В окне редактора кода (рис. 1.5), которое можно увидеть, отодвинув в сторону окно формы, следует набирать текст программы. В начале работы над новым проектом окно редактора кода содержит сформированный C++ Builder шаблон программы.
ГЛАВА 2Первый проектГЛАВА 2Первый проект
ГЛАВА 2
Первый проект
ГЛАВА 2
Первый проект
Для демонстрации возможностей C++ Builder и технологии визуального проектирования и событийного программирования займемся разработкой программы, используя которую можно вычислить силу тока в электрической цепи. Сила тока вычисляется по известной формуле: I = U/R, где U - напряжение источника (вольт); R -- величина сопротивления (Ом). Вид диалогового окна программы во время ее работы (после щелчка на кнопке Вычислить) приведен на рис. 2.1.
Введите напряжение и величину сопротивления, затем щелкните на кнопке ВычислитьВведите напряжение и величину сопротивления, затем щелкните на кнопке ВычислитьНапряжение (вольт)Сопротивление (Ом)Напряжение (вольт)Сопротивление (Ом)
Введите напряжение и величину сопротивления, затем щелкните на кнопке Вычислить
Введите напряжение и величину сопротивления, затем щелкните на кнопке Вычислить
Напряжение (вольт)
Сопротивление (Ом)
Напряжение (вольт)
Сопротивление (Ом)
Ток: 1,50 А
[ё茄 ЙЕ 而砌 Завершить]
Рис. 2.1. Окно программы вычисления силы тока в электрической цепи
Чтобы начать разработку нового приложения (так принято называть прикладные программы), надо запустить C++ Builder или, если C++ Builder уже запущен, в меню File выбрать команду New | Application.
Форма
Работа над новым проектом (так в C++ Builder называется разрабатываемое приложение) начинается с создания стартовой формы — главного окна программы.
Стартовая форма создается путем изменения значений свойств формы Forml (настройки формы) и добавления к форме необходимых компонентов (полей ввода, полей вывода текстовой информации, командных кнопок).
Основные свойства формы, которые определяют ее вид и поведение во время работы программы, приведены в табл. 2.1.
Таблица 21 Свойства формы (объекта TForm)
Свойство
Описание
Name
Имя формы. В программе имя формы используется для управления формой и доступа к компонентам формы
Caption
Текст заголовка
Width
Ширина формы
Height
Высота формы
Top
Расстояние от верхней границы формы до верхней границы экрана
Left
Расстояние от левой границы формы до левой границы экрана
BorderStyle
Вид границы. Граница может быть обычной (bsSizeable), тонкой (bsSingle) или отсутствовать (bsNone). Если у окна обычная граница, то во время работы программы пользователь может при помощи мыши изменить размер окна. Изменить размер окна с тонкой границей нельзя. Если граница отсутствует, то на экран во время работы программы будет выведено окно без заголовка. Положение и размер такого окна во время работы программы изменить нельзя
Bordericons
Кнопки управления окном. Значение свойства определяет, какие кнопки управления окном будут доступны пользователю во время работы программы. Значение свойства задается путем присвоения значений уточняющим свойствам biSystemMenu, biMinimaze, biMaximaze и biHelp. Свойство biSystemMenu определяет доступность кнопки Свернуть и кнопки системного меню, biMinimaze — кнопки Свернуть, biMaximaze — кнопки Развернуть, biHelp — кнопки вывода справочной информации
Icon
Значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню
Color
Цвет фона. Цвет можно задать, указав название цвета или привязку к текущей цветовой схеме операционной системы. Во втором случае цвет определяется текущей цветовой схемой, выбранным компонентом привязки и меняется при изменении цветовой схемы операционной системы
Font
Шрифт. Шрифт, используемый "по умолчанию" компонентами, находящимися на поверхности формы. Изменение свойства Font формы приводит к автоматическому изменению свойства Font компонента, располагающегося на поверхности формы. То есть компоненты наследуют свойство Font от формы (имеется возможность запретить наследование)
Для изменения значений свойств объектов, в том числе и формы, используется вкладка Properties (Свойства) диалогового окна Object Inspector. В левой колонке этой вкладки перечислены свойства выбранного объекта, в правой — указаны значения свойств.
При создании формы в первую очередь следует изменить значение свойства caption (Заголовок). В нашем примере надо заменить текст Forml на Сила тока. Чтобы это сделать, нужно в окне Object Inspector щелкнуть левой кнопкой мыши в строке Caption (в результате будет выделено значение свойства и появится курсор) и ввести текст: Сила тока (рис. 2.2).
■ ■屮F I 1 •“♦■■■「—■ ■屮F I 1 •“♦■■■「—尸:J尸:J[FormlProperties | EvenU |I AlphaBlencT/ali255[FormlProperties | EvenU |I AlphaBlencT/ali255dd▲▲j S Anchors“akLeft,akT op]i AutoS Crollfalsei AutoSizeifake JI BDiModejbdLeftToRightS В ordericons[biSystemMenu]BorderStyleibsS ingleIsdeiWidth ‘0I Caption1 Силаток al! ClientHeight [173j! Color □clBtnFace 二]j S Anchors“akLeft,akT op]i AutoS Crollfalsei AutoSizeifake JI BDiModejbdLeftToRightS В ordericons[biSystemMenu]BorderStyleibsS ingleIsdeiWidth ‘0I Caption1 Силаток al! ClientHeight [173j! Color □clBtnFace 二]
■ ■屮F I 1 •“♦■■■「—
■ ■屮F I 1 •“♦■■■「—
尸:J
尸:J
[Forml
Properties | EvenU |
I AlphaBlencT/ali255
[Forml
Properties | EvenU |
I AlphaBlencT/ali255
d
d
▲
▲
j S Anchors“akLeft,akT op]
i AutoS Crollfalse
i AutoSizeifake J
I BDiModejbdLeftToRight
S В ordericons[biSystemMenu]
BorderStyleibsS ingle
IsdeiWidth ‘0
I Caption1 Силаток al
! ClientHeight [173
j
! Color □clBtnFace 二]
j S Anchors“akLeft,akT op]
i AutoS Crollfalse
i AutoSizeifake J
I BDiModejbdLeftToRight
S В ordericons[biSystemMenu]
BorderStyleibsS ingle
IsdeiWidth ‘0
I Caption1 Силаток al
! ClientHeight [173
j
! Color □clBtnFace 二]
iAIIshown
Рис. 2.2. Изменение значения свойства Caption путем ввода значения
Аналогичным образом можно установить значения свойств Height и width, которые определяют высоту и ширину формы. Размер формы, а также размер других компонентов задают в пикселах, т. е. точках экрана. Свойствам Height и width надо присвоить значения 200 и 330, соответственно.
Форма — это обычное окно. Поэтому размер формы можно изменить точно так же, как размер любого окна Windows, т. е. путем перетаскивания границы. По окончании перемещения границы значения свойств Height и width автоматически изменятся. Они будут соответствовать установленному размеру формы.
Положение диалогового окна на экране после запуска программы соответствует положению формы во время разработки, которое определяется значением свойств тор (отступ от верхней границы экрана) и Left (отступ от левой границы экрана). Значения этих свойств также можно задать путем перемещения формы при помощи мыши.
При выборе некоторых свойств, например, Borderstyle, справа от текущего значения свойства появляется значок раскрывающегося списка. Очевидно, что значение таких свойств можно задать путем выбора из списка (рис. 2.3).
Некоторые свойства являются сложными, т. е. их значение определяется совокупностью значений других (уточняющих) свойств. Например, свойство Bordericons определяет, какие кнопки управления окном будут доступны во время работы программы. Значения этого свойства определяется совокупностью значений СВОЙСТВ biSystemMenu, biMinimize, biMaximize И biHelp, каждое из которых, в свою очередь, определяет наличие соответствующей командной кнопки в заголовке окна во время работы программы. Перед именами сложных свойств стоит значок ”в результате щелчка на котором раскрывается список уточняющих свойств (рис. 2.4), значения которых можно задать обычным образом (ввести в поле или выбрать в списке допустимых значений).
|ob|ect ■|ob|ect ■jctorjctorIIтитиObject IObject IProperties EventsProperties Events• □ Bordedcons [biSystemMenu]• □ Bordedcons [biSystemMenu]Properties | Events |Properties | Events |BiDiMode bdLefiToRiehl 二] IBBoiderlcons IbiSWemMaiu.BiDiMode bdLefiToRiehl 二] IBBoiderlcons IbiSWemMaiu.bsSnglebsSngle| BorderStyle BordeiWidth IbsDiatog| BorderStyle BordeiWidth IbsDiatogbsNonebsNoneXSizeabie bsSizeTooNViriXSizeabie bsSizeTooNViriVue aDeUukVue aDeUukCaptionClientHeightClientWidthColor国ConstraintsCaptionClientHeightClientWidthColor国ConstraintsbiSystemMen trueI biMinimize j falsebiMaximize biHelpbiSystemMen trueI biMinimize j falsebiMaximize biHelp__BorderStyle bsSihgleBorderWidth (0BorderStyle bsSihgleBorderWidth (0QI3DCursorQI3DCursori D efaultM onilot dmAcbveFoirn』i D efaultM onilot dmAcbveFoirn』CaptionСила токаClientH eight173;Clientwidth323Coloi 'FlolBtnFace ▼ |CaptionСила токаClientH eight173;Clientwidth323Coloi 'FlolBtnFace ▼ |向shown向shownAll shownAll shown
|ob|ect ■
|ob|ect ■
jctor
jctor
I
I
ти
ти
Object I
Object I
Properties Events
Properties Events
• □ Bordedcons [biSystemMenu]
• □ Bordedcons [biSystemMenu]
Properties | Events |
Properties | Events |
BiDiMode bdLefiToRiehl 二] IBBoiderlcons IbiSWemMaiu.
BiDiMode bdLefiToRiehl 二] IBBoiderlcons IbiSWemMaiu.
bsSngle
bsSngle
| BorderStyle BordeiWidth IbsDiatog
| BorderStyle BordeiWidth IbsDiatog
bsNone
bsNone
XSizeabie bsSizeTooNViri
XSizeabie bsSizeTooNViri
Vue aDeUuk
Vue aDeUuk
Caption
ClientHeight
ClientWidth
Color
国Constraints
Caption
ClientHeight
ClientWidth
Color
国Constraints
biSystemMen trueI biMinimize j false
biMaximize biHelp
biSystemMen trueI biMinimize j false
biMaximize biHelp
_
_
BorderStyle bsSihgle
BorderWidth (0
BorderStyle bsSihgle
BorderWidth (0
QI3D
Cursor
QI3D
Cursor
i D efaultM onilot dmAcbveFoirn』
i D efaultM onilot dmAcbveFoirn』
CaptionСила тока
ClientH eight173
;Clientwidth323
Coloi 'FlolBtnFace ▼ |
CaptionСила тока
ClientH eight173
;Clientwidth323
Coloi 'FlolBtnFace ▼ |
向shown
向shown
All shown
All shown
Рис. 2.З. Установка значениясвойства путем выбора из спискаРис. 2.З. Установка значениясвойства путем выбора из спискаРис. 2.4. Изменение значенияуточняющего свойстваРис. 2.4. Изменение значенияуточняющего свойства
Рис. 2.З. Установка значениясвойства путем выбора из списка
Рис. 2.З. Установка значениясвойства путем выбора из списка
Рис. 2.4. Изменение значенияуточняющего свойства
Рис. 2.4. Изменение значенияуточняющего свойства
В результате выбора некоторых свойств (щелчка кнопкой мыши на свойстве), рядом со значением свойства появляется командная кнопка с тремя точками. Это значит, что задать значение свойства можно в дополнительном диалоговом окне, которое появится в результате щелчка на этой кнопке. Например, значение сложного свойства Font можно задать в окне Object Inspector путем ввода значений уточняющих свойств, а можно воспользоваться стандартным диалоговым окном Шрифт, которое появится в результате щелчка на кнопке с тремя точками (рис. 2.5).
В табл. 2.2 перечислены свойства формы разрабатываемой программы, которые следует изменить. Остальные свойства формы оставлены без изменения и в таблице не приведены. В приведенной таблице в именах некоторых свойств есть точка. Это значит, что надо задать значение уточняющего свойства.
Objprt Ins|Objprt Ins|33
Objprt Ins|
Objprt Ins|
3
3
Properties j Events
• Cursor• Cursorj DefaultMonitoi1 DockSite iDragModeEnabled|H Fontj DefaultMonitoi1 DockSite iDragModeEnabled|H FonticrDefauK 3dmActiveFormicrDefauK 3dmActiveForm[[IIFormStyleHeightHelpContextHelpFileFormStyleHeightHelpContextHelpFilej false idkDrag idmManual ihue:f$Normal 200ioj false idkDrag idmManual ihue:f$Normal 200ioHelpKeyword :HelpKeyword :AllshownAllshowndd
• Cursor
• Cursor
j DefaultMonitoi
1 DockSite i
DragMode
Enabled
|H Font
j DefaultMonitoi
1 DockSite i
DragMode
Enabled
|H Font
icrDefauK 3
dmActiveForm
icrDefauK 3
dmActiveForm
[
[
I
I
FormStyle
Height
HelpContext
HelpFile
FormStyle
Height
HelpContext
HelpFile
j false idkDrag idmManual ihue
:f$Normal 200
io
j false idkDrag idmManual ihue
:f$Normal 200
io
HelpKeyword :
HelpKeyword :
Allshown
Allshown
d
d
Рис. 2.5. Чтобы задать свойства шрифта, щелкните на кнопке с тремя точками
Таблица 2.2. Значения свойств стартовой формы
Свойство
Значение
Комментарий
Caption
Сила тока
Height
200
Width
330
Borderstyle
bsSingle
Тонкая граница не позволяет изменить
размер окна во время работы програм-
мы путем захвата и перемещения границы
BorderIcons.biMinimize
False
В заголовке окна нет кнопки Свернуть
Bordericons.biMaximize
False
В заголовке окна нет кнопки Развер-
нуть
Font. Name
Tahoma
Font.Size
10
Компоненты
Программа вычисления тока в электрической цепи должна получить от пользователя исходные данные — напряжение и величину сопротивления. Эти данные могут быть введены с клавиатуры в поля редактирования. Поэтому в форму надо добавить поле редактирования.
Поля редактирования, поля вывода текста, списки, переключатели, командные кнопки и другие элементы пользовательского интерфейса называют компонентами.
Для того чтобы в форму разрабатываемого приложения добавить поле редактирования, надо в палитре компонентов, на вкладке Standard, щелкнуть на значке компонента Edit (рис. 2.6), установить курсор в ту точку формы, в которой должен быть левый верхний угол компонента, и еще раз щелкнуть кнопкой мыши. В результате на форме появляется компонент Edit - поле редактирования (рис. 2.7).
Standard :一 —:
к 口 ST g A Т回Н区G fЗ届З ♦三7亲1
Edit
Рис. 2.6. Компонент Edit — поле редактирования
Рис. 2.7. Результат добавления в форму компонента Edit
Каждому добавленному компоненту автоматически присваивается имя, которое состоит из названия компонента и его порядкового номера. Например, если к форме добавить два компонента Edit, то их имена будут Editl и Edit2. Программист путем изменения значения свойства Name может изменить имя компонента. Однако в простых программах имена компонентов, как правило, не изменяют.
Основные свойства компонента Edit приведены в табл. 2.3.
Таблица 2.3. Свойства компонента Edit (объект типа TEdit)
СвойствоОпределяет (задает)
NameИмя компонента. Используется в программе для доступа к компонен
ту и его свойствам, в том числе к тексту, который находится в поле редактирования
TextТекст, который находится в поле в вода/реда ктирования
LeftРасстояние от левой границы компонента до левой границы формы
ТорРасстояние от верхней границы компонента до верхней границы формы
Таблица 2.3 (окончание)
СвойствоОпределяет (задает)
HeightВысоту поля
WidthШирину поля
FontШрифт, используемый для отображения вводимого текста
ParentFont Признак
На рис. 2.8 приведен вид формы после добавления двух полей редактирования. Один из компонентов выбран (выделен), окружен восемью маленькими квадратиками. Свойства выбранного компонента отображаются в окне Object Inspector. Чтобы увидеть и, если надо, изменить свойства другого компонента, надо этот компонент выбрать, щелкнув левой кнопкой мыши на изображении компонента, или выбрать имя компонента в раскрывающемся списке, который находится в верхней части окна Object Inspector (рис. 2.9). Компонент, свойства которого надо увидеть или изменить, можно выбрать и в окне Object TreeView (рис. 2.10).
Рис. 2.8. Форма с двумя компонентами
Значения некоторых свойств компонента, определяющих, например, размер и положение компонента на поверхности формы, можно изменить при помощи мыши.
Для того чтобы изменить положение компонента, необходимо установить курсор мыши на его изображение, нажать левую кнопку мыши и, удерживая ее нажатой, переместить контур компонента в нужную точку формы, а затем отпустить кнопку мыши. Во время перемещения компонента (рис. 2.11) отображаются текущие значения координат левого верхнего угла компонента (значения свойств Left и тор).
Для того чтобы изменить размер компонента, необходимо его выделить, установить указатель мыши на один из маркеров, помечающих границу
компонента, нажать левую кнопку мыши и, удерживая ее нажатой, изменить положение границы компонента. Затем отпустить кнопку мыши. Во время изменения размера компонента отображаются его текущие размеры: высота и ширина (значения свойств Height и (рис. 2.12).
|ob|ect Impet I <|ob|ect Impet I <EM2 EMIEM2 EMIE&2E&2Forml N CharCase ColorConstraints:CU3DCursor DiagCursor DragKindI DragMode EnabledSFonl | HeightForml N CharCase ColorConstraints:CU3DCursor DiagCursor DragKindI DragMode EnabledSFonl | HeightTE,tTE,t,ecNormal□ eWindow I (TSizeConstrainitruecrD efault crDrag dkDigg,ecNormal□ eWindow I (TSizeConstrainitruecrD efault crDrag dkDigg:dmManual hueifTFont]21:dmManual hueifTFont]21zJzJРис. 2.10. Выбор компонента в окне Object TreeViewРис. 2.10. Выбор компонента в окне Object TreeViewРис. 2.9. Выбор компонентав окне Object InspectorРис. 2.9. Выбор компонентав окне Object Inspector
|ob|ect Impet I <
|ob|ect Impet I <
EM2 EMI
EM2 EMI
E&2
E&2
Forml N CharCase Color
Constraints
:CU3D
Cursor DiagCursor DragKind
I DragMode Enabled
SFonl | Height
Forml N CharCase Color
Constraints
:CU3D
Cursor DiagCursor DragKind
I DragMode Enabled
SFonl | Height
TE,t
TE,t
,ecNormal
□ eWindow I (TSizeConstraini
true
crD efault crDrag dkDigg
,ecNormal
□ eWindow I (TSizeConstraini
true
crD efault crDrag dkDigg
:dmManual hue
ifTFont]
21
:dmManual hue
ifTFont]
21
zJ
zJ
Рис. 2.10. Выбор компонента в окне Object TreeView
Рис. 2.10. Выбор компонента в окне Object TreeView
Рис. 2.9. Выбор компонентав окне Object Inspector
Рис. 2.9. Выбор компонентав окне Object Inspector
仙 Сила тока仙 Сила токаM,「出凶M,「出凶Editl|Edit2Editl|Edit2Рис. 2.12. Отображение значений свойств Height и Width при изменении размера компонентаРис. 2.12. Отображение значений свойств Height и Width при изменении размера компонента
仙 Сила тока
仙 Сила тока
M,「出凶
M,「出凶
Editl
|Edit2
Editl
|Edit2
Рис. 2.12. Отображение значений свойств Height и Width при изменении размера компонента
Рис. 2.12. Отображение значений свойств Height и Width при изменении размера компонента
Рис.Отображение значений свойств
и Тор при изменении положения компонента
В табл. 2.4 приведены значения свойств компонентов Editl и Edit2 разрабатываемого приложения (значения остальных свойств оставлены без изменения и поэтому в таблице не приведены). Компонент Editl предназначен для ввода величины напряжения, Edit2 — для ввода величины сопротивления. Обратите внимание, значением свойства Text обоих компонентов является пустая строка. В результате форма разрабатываемого приложения должна выглядеть так, как показано на рис.
Таблица 2.4. Значения свойств компонентов Editl и Edit2
Компонент
СвойствоСвойствоEditlEdit2EditlEdit2
Свойство
Свойство
EditlEdit2
EditlEdit2
TextTop •LeftWidthTextTop •LeftWidth4814465481446572144657214465Рис. 2.13. Форма после настройки компонентов EditРис. 2.13. Форма после настройки компонентов EditEditlEdit2EditlEdit2
Text
Top •
Left
Width
Text
Top •
Left
Width
48
144
65
48
144
65
72
144
65
72
144
65
Рис. 2.13. Форма после настройки компонентов Edit
Рис. 2.13. Форма после настройки компонентов Edit
Editl
Edit2
Editl
Edit2
Помимо полей редактирования в окне программы находится текст — краткая информация о программе и назначении полей ввода.
Standard !飞口T旬Standard !飞口T旬Для вывода текста на поверхность формы используют поля вывода текста. Поле вывода текста — это компонент Label. Значок компонента Label находится на вкладке Standard (рис. 2.14). Добавляется компонент Label в форму точно так же, как и поле редактирования. Основные свойства компонента Label перечислены в табл. 2.5.
Standard !
飞口T旬
Standard !
飞口T旬
A (ST ej -2J (x (s 等窟 3 二糞,畐]
Label
Рис. 2.14. Компонент Label — поле вывода текста
Таблица 2.5. Свойства компонента Label
NameNameСвойствоОпределяет (задает)
Name
Name
Имя компонента. Используется в программе для доступа к свойствам компонента
Таблица 2.5 (окончание)
Свойство
Определяет (задает)
Caption
Отображаемый текст
Font
Шрифт, используемый для отображения текста
ParentFont
Признак наследования шрифта родительского компонента
AutoSize
Признак того, что размер поля определяется его содержимым
Left
Расстояние от левой границы поля вывода до левой границы формы
Тор
Расстояние от верхней границы поля вывода до верхней границы формы
Height
Высоту поля вывода
Width
Ширину поля вывода
Wordwrap
Признак того, что слова, которые не помещаются в текущей строке, автоматически переносятся на следующую строку (значение свойства AutoSize должно быть false)
Если поле Label должно содержать несколько строк текста, то перед тем как ввести в поле текст (изменить значение свойства Caption), нужно присвоить свойству AutoSize значение false, а свойству wordwrap — true. Затем надо установить требуемый размер поля (при помощи мыши или вводом значений свойств Height и width) и только после этого ввести значение свойства Caption.
В форму разрабатываемого приложения надо добавить четыре компонента Label. Поле Labe11 предназначено для вывода информационного сообщения, поля Label2 и Labe13 — для вывода информации о назначении полей ввода, поле Labe14 — для вывода результата расчета (величины тока в цепи). После добавления компонентов надо выполнить их настройку — установить значения свойств (табл. 2.6). Прочерк в таблице означает, что значение свойства оставлено без изменения или установлено автоматически — например, как результат изменения другого свойства. В результате форма разрабатываемого приложения должна выглядеть так, как показано на рис. 2.15.
Таблица 2.6. Значения свойств компонентовLabell—
Свойство
Компонент
Labell
Label2
Label3
Label 4
AutoSize
false
true
true
false
Wordwrap
true
false
false
true
Таблица 2.6 (окончание)
Свойство
Компонент
Labell
Label 2
Label3
Label4
Caption
Введите напряжение и величину сопротивления, затем щелкните на кнопке Вычислить
Напряжение (вольт)
Сопротивление (Ом)
Тор•
8
56
80
112
Left
8
8
8
8
Height
33
16
16
16
Width
300
120
120
200
Labell ―1 . Введите напряжение и величину сопротивления}затем щелкните на кнопке Вычислить
LabeG•Напряжение (вольт)
Label3 • —Сопротивление (Ом) • I
Label4 ..:■
Рис. 2.15. Вид формы после добавления и настройки полей вывода текста
Последнее, что надо сделать на этапе создания формы — это добавить в форму две командные кнопки: Вычислить и Завершить. Назначение этих кнопок очевидно.
Командная кнопка — компонент Button — добавляется в форму точно так же, как и другие компоненты. Значок компонента Button находится на вкладке Standard (рис. 2.16). Основные свойства компонента Button приведены в табл. 2.7.
:
0方哥电 A砌嵐〒(Я 0氈就3 - Jk :葛1I
Button
Рис. 2.16. Командная кнопка — компонент Button
После добавления к форме двух командных кнопок нужно установить значения их свойств в соответствии табл. 2.7.
Таблица 2.7. Свойства компонента Button (командная кнопка)
Свойство
Описание
Name
Имя компонента. Используется в программе для доступа к компоненту и его свойствам
Caption
Текст на кнопке
Enabled
Признак доступности кнопки. Кнопка доступна, если значение свойства равно true, и недоступна, если значение свойства равно false
Left
Расстояние от левой границы кнопки до левой границы формы
Тор
Расстояние от верхней границы кнопки до верхней границы формы
Height
Высота кнопки
Width
Ширина кнопки
После добавления к форме двух командных кнопок нужно установить значения их свойств в соответствии с табл. 2.8.
Окончательный вид формы разрабатываемого приложения приведен на рис. 2.17.
Labell 丄 Введите напряжение и величину сопротивления,
EditlEdit2FormlEditlEdit2Forml• затем щелкните на кнопке Вычислить I :::::■:
Editl
Edit2
Forml
Editl
Edit2
Forml
Label2 —^Напряжение (вольт)
Label3 —сопротивление (им; - |
I_abel4 . •••
i•••
Вычислить Завершить'..
ч^^т=~^ ■ 「——一
Buttonl Button2
Рис. 2.17. Окончательный вид формы программы "Сила тока
Завершив работу над формой, можно приступить к созданию программы. Но перед этим рассмотрим два важных понятия: событие и функцию обработки события.
Таблица 2.8. Значения свойств компонентов Button 1 иButton2
Свойство
Компонент
Buttonl
Button2
Caption
Вычислить
Завершить
Тор
144
144
Left
16
104
Height
25
25
Width
75
75
Событие и функция обработки события
Вид созданной формы подсказывает, как работает приложение. Очевидно, что пользователь должен ввести в поля редактирования исходные данные и щелкнуть мышью на кнопке Вычислить. Щелчок на изображении командной кнопки — зтб пример того, что в Windows называется событием.
Событие (Event) — это то, что происходит во время работы программы. В C++ Builder каждому событию присвоено имя. Например, щелчок кнопкой мыши -- это событие onclick, двойной щелчок мышью — событие OnDblClick.
В табл. 2.9 приведены некоторые события Windows.
Таблица 2.9. События
Событие
Происходит
Onclick
При щелчке кнопкой мыши
OnDblClick
При двойном щелчке кнопкой мыши
OnMouseDown
При нажатии кнопки мыши
OnMouseUp
При отпускании кнопки мыши
OnMouseMove
При перемещении мыши
OnKeyPress
При нажатии клавиши клавиатуры
OnKeyDown
При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress — это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)
Таблица 2.9 (окончание)
Событие
Происходит
OnKeyUp
При отпускании нажатой клавиши клавиатуры
OnCreate
При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий
OnPaint
При появлении окна на экране в начале работы программы; во время работы программы после появления окна (или его части), которое было закрыто другим окном или свернуто
OnEnter
При получении элементом управления фокуса
OnExit
При потере элементом управления фокуса
Реакцией на событие должно быть какое-либо действие. В C++ Builder реакция на событие реализуется как функция обработки события. Таким образом, для того чтобы программа выполняла некоторую работу в ответ на действия пользователя, программист должен написать функцию обработки соответствующего события. Следует обратить внимание на то, что значительную часть обработки событий берет на себя компонент. Поэтому программист должен разрабатывать функцию обработки события только в том случае, если реакция на событие отличается от стандартной или не определена. Например, если по условию задачи ограничений на символы, вводимые в поле Edit, нет, то процедуру обработки события OnKeyPress писать не надо, т. к. во время работы программы будет использована стандартная (скрытая от программиста) процедура обработки этого события.
Методику создания функций обработки событий рассмотрим на примере функции обработки события onclick для командной кнопки Вычислить.
Чтобы приступить к созданию функции обработки события, сначала надо выбрать компонент, для которого создается функция обработки события. Выбрать компонент можно в окне Object Inspector или щелчком на изображении компонента в форме. После этого в окне Object Inspector нужно выбрать вкладку Events (События).
В левой колонке вкладки Events (рис. 2.18) перечислены события, которые может воспринимать выбранный компонент (имя и тип компонента указаны в верхней части окна). Если для события определена функция обработки, то в правой колонке рядом с именем события будет выведено имя этой функции.
Для того чтобы создать функцию обработки события, нужно сделать двойной щелчок мышью в окне Object Inspector, в поле функции обработки соответствующего события (рис. 2.19). В результате этого откроется окно ре-
дактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector рядом с именем события появится сгенерированное C++ Builder имя функции обработки события (рис. 2.19).
Qbject InsjwctorQbject InsjwctorI Buttonl —on J2JPropertiesActionIOnContextPopyj OnDragOverOnEndDock :OnEndDrag OnE nter OnExiti OnKeyPress ।:OnKeyllp OnMouseDowr OnMouseMove OnMousellp,OnStartDock : OnS tartbrag : PopupMenushownI Buttonl —on J2JPropertiesActionIOnContextPopyj OnDragOverOnEndDock :OnEndDrag OnE nter OnExiti OnKeyPress ।:OnKeyllp OnMouseDowr OnMouseMove OnMousellp,OnStartDock : OnS tartbrag : PopupMenushownСобытиеФункция обработки события (вслучае неСобытиеФункция обработки события (вслучае не
Qbject Insjwctor
Qbject Insjwctor
I Buttonl —on J2J
Properties
Action
I
OnContextPopy
j OnDragOver
OnEndDock :
OnEndDrag OnE nter OnExit
i OnKeyPress ।
:OnKeyllp OnMouseDowr OnMouseMove OnMousellp
,OnStartDock : OnS tartbrag : PopupMenu
shown
I Buttonl —on J2J
Properties
Action
I
OnContextPopy
j OnDragOver
OnEndDock :
OnEndDrag OnE nter OnExit
i OnKeyPress ।
:OnKeyllp OnMouseDowr OnMouseMove OnMousellp
,OnStartDock : OnS tartbrag : PopupMenu
shown
Событие
Функция обработки события (вслучае не
Событие
Функция обработки события (вслучае не
Рис.На вкладке Events перечислены события, которые может воспринимать компонент
(в данном случае — командная кнопка)
Рис. 2.19. Шаблон функции обработки события, сгенерированный C++ BuilderРис. 2.19. Шаблон функции обработки события, сгенерированный C++ Builder
Рис. 2.19. Шаблон функции обработки события, сгенерированный C++ Builder
Рис. 2.19. Шаблон функции обработки события, сгенерированный C++ Builder
C++ Builder присваивает функции обработки события имя, которое состоит из двух частей. Первая часть имени идентифицирует форму, содержащую
объект (компонент), для которого создана процедура обработки события. Вторая часть имени идентифицирует сам объект и событие. В нашем примере имя формы — Forml, имя командной кнопки — But ton 1, а имя события — Click.
В окне редактора кода между фигурными скобками можно набирать инструкции, реализующие функцию обработки события.
В листинге 2.1 приведен текст функции обработки события Onclick для командной кнопки Вычислить. Обратите внимание на то, как представлена программа. Ее общий вид соответствует тому, как она выглядит в окне редактора кода: ключевые слова выделены полужирным шрифтом, комментарии — курсивом (выделение выполняет редактор кода). Кроме того, инструкции программы набраны с отступами в соответствии с принятыми в среде программистов правилами хорошего стиля.
I Листинг2.1. Простейшая обработка события Onclick на кнопке Вычислить
void _ fastcall TForml: : ButtonlClick (TObject * Sender) {
float u; // напряжение
float r; // сопротивление
float i; // ток
// получить данные из полей ввода
u = StrToFloat (Editl->Text); r=
// вычислить ток i = u/r; . // вывести результат в поле метки Label4->Caption = "Ток : " +
FloatToStrF(if ffGeneral,7,2) + " А"; }
Функция ButtonlClick выполняет расчет силы тока и выводит результат расчета в поле Label 4. Исходные данные вводятся из полей редактирования Editl и Edit2 путем обращения к свойству Text. Свойство Text содержит строку символов, которую ввел пользователь. Чтобы программа работала правильно, пользователь должен ввести в каждое поле редактирования целое или дробное число в правильном формате (при вводе дробного числа для разделения целой и дробной частей надо использовать запятую). Так как поле редактирования содержит текст (свойство Text строкового типа),
необходимо выполнить преобразование строки в число. Эту задачу решает функция StrToFioat, которой в качестве параметра передается содержимое поля редактирования — значение свойства Text (Editl->Text — это содержимое поля Editl). Функция strToFioat проверяет символы строки, переданной ей в качестве параметра, на допустимость и, если все символы верные, возвращает значение, соответствующее строке, полученной в качестве параметра.
После того как исходные данные будут помещены в переменные и и г, выполняется расчет.
Вычисленная величина силы тока выводится в поле Labe14 путем присваивания значения свойству caption. Для преобразования числа в строку символов (свойство caption - строкового типа) используется функция FloatToStrF.
В листинге 2.2 приведена процедура обработки события Onclick на командной кнопке Завершить. Создается она точно так же, как и процедура обработки события onclick для командной кнопки Вычислить. В результате щелчка на кнопке Завершить программа должна завершить работу. Чтобы это произошло, надо закрыть окно программы. Делает это метод close.
Листинг 2.2. Процедура обработки события Onclick на кнопке Завершить
voidfastcall TForml::Button2Click(TObj ect *Sender)
{
Forml->Close();
Редактор кода
Во время набора текста программы редактор кода автоматически выделяет элементы программы: полужирным шрифтом — ключевые слова языка программирования (if, else, int, float и др.), курсивом — комментарии. Это делает текст программы более выразительным, что облегчает восприятие структуры программы.
В процессе разработки программы часто возникает необходимость переключения между окном редактора кода и окном формы. Сделать это можно при помощи командной кнопки Toggle Form/Unit, которая находится на панели инструментов View (рис. 2.20), или нажав клавишу <F12>. На панели инструментов View находятся командные кнопки View Unit и View Form, используя которые можно выбрать нужный модуль или форму в случае, если проект состоит из нескольких модулей или форм.
View Form
View Unit Toggle Form/Unit
Рис. 2.20. Кнопка Toggle Form/Unit позволяет быстро переключатьсямежду формой и редактором кода
Система подсказок
Редактор кода поддерживает функцию контекстно-зависимой подсказки, которая во время набора текста программы автоматически выводит краткую справочную информацию о свойствах и методах объектов, о параметрах функций.
Например, после того как будет набрано имя объекта (компонента) и символы ->, редактор кода автоматически выведет список свойств и методов объекта (рис. 2.21). Программисту останется только выбрать из списка нужный элемент и нажать клавишу (быстро перейти к нужному элементу списка или к области, где этот элемент находится, можно, нажав клавишу, соответствующую первому символу этого элемента).
Рис.Редактор кода автоматически выводит список свойств и методов объекта (компонента)
Следует обратить внимание, что если список свойств и методов не появляется, то это значит, что в программе обнаружена ошибка (C++ Builder контролирует правильность набираемого программистом текста в "фоновом"
режиме). Например, если в окне редактора кода набрать if Editl->, то список свойств и методов объекта Editl не появится, т. к. инструкция if в данном случае записана с ошибкой (не поставлена открывающая скобка после if). C++ Builder информирует программиста об обнаруженной ошибке сообщением Unable to invoke Code Completion due to errors in source code, которое появляется в нижней части окна редактора кода.
После набора имени встроенной или объявленной программистом функции редактор кода также выводит подсказку: список параметров. Параметр, который в данный момент вводит программист, в подсказке выделен полужирным. Например, если набрать слово FloatToStrF, которое является именем функции преобразования дробного числа в строку символов, и открывающую скобку, то на экране появится окно, в котором будет указан список параметров функции (рис. 2.22).
Рис. 2.22. Пример подсказки
Навигаторклассов
Окно редактора кода разделено на две части (рис. 2.23). В правой части находится текст программы. Левая часть, которая называется навигатор классов (Class Explorer), облегчает навигацию по тексту (коду) программы. В иерархическом списке, структура которого зависит от проекта, над которым идет работа, перечислены объекты проекта (формы и компоненты) и функции обработки событий. Выбрав элемент списка, можно быстро перейти к нужному фрагменту кода, например к функции обработки события.
Функция обработки событияФункция обработки событияНавигатор классовНавигатор классовРис. 2.23. Окно ClassExplorer облегчает навигацию по тексту программыРис. 2.23. Окно ClassExplorer облегчает навигацию по тексту программы
Функция обработки события
Функция обработки события
Навигатор классов
Навигатор классов
Рис. 2.23. Окно ClassExplorer облегчает навигацию по тексту программы
Рис. 2.23. Окно ClassExplorer облегчает навигацию по тексту программы
Окно навигатора классов можно закрыть обычным образом. Если окно навигатора классов не доступно, то для того чтобы оно появилось на экране, нужно в меню View выбрать команду ClassExplorer.
Шаблоныкода
В процессе набора текста удобно использовать шаблоны кода (Code Templates). Шаблон кода — это инструкция программы, записанная в общем виде. Например, шаблон для инструкции if выглядит так:
if О
else
Редактор кода предоставляет программисту большой набор шаблонов: объявления классов, ФУНКЦИЙ, ИНСТРУКЦИЙ Выбора (if, switch), ЦИКЛОВ (for,
2 Зак. 1252
while). Для некоторых инструкций, например для if и while, есть несколько вариантов шаблонов.
Для того чтобы в процессе набора текста программы воспользоваться шаблоном кода и вставить его в текст программы, нужно нажать комбинацию клавиш <Ctrl>+<J> и из появившегося списка выбрать нужный шаблон (рис. 2.24). Выбрать шаблон можно обычным образом, прокручивая список, или вводом первых букв имени шаблона (имена шаблонов в списке выделены полужирным). Выбрав в списке шаблон, нужно нажать клавишу <Enter>, шаблон будет вставлен в текст программы.
i.cppi.cpp.IOlx|.IOlx|固“ & Amper • Classes固“ & Amper • Classes''«mper^.cpp«mper^.cppif $»drfemerrfif $»drfemerrffloat u; // напряжение float r; // сопротивлениеfloat i; '// токfloat u; // напряжение float r; // сопротивлениеfloat i; '// ток// получить Аанлие из полей ввода u=г = StrToFloat (Edit2->Text) ;// получить Аанлие из полей ввода u=г = StrToFloat (Edit2->Text) ;// c0 np отивленме не должно быть равно мулк// c0 np отивленме не должно быть равно мулкclass declaration (all parts)for statement(no opening/dosing braces)ction declarationclass declaration (all parts)for statement(no opening/dosing braces)ction declarationclassf刁 forbforsfunctionclassf刁 forbforsfunctionif (no opening/chsing braces) else (no opening/closing braces) ife ▼if (no opening/chsing braces) else (no opening/closing braces) ife ▼29: 5 Modified Insetl29: 5 Modified Insetl! \атрет.сррКзгпЬе【.Ь)Хё>дтат/! \атрет.сррКзгпЬе【.Ь)Хё>дтат/22
i.cpp
i.cpp
.IOlx|
.IOlx|
固“ & Amper • Classes
固“ & Amper • Classes
'
'
«mper^.cpp
«mper^.cpp
if $»drfemerrf
if $»drfemerrf
float u; // напряжение float r; // сопротивление
float i; '// ток
float u; // напряжение float r; // сопротивление
float i; '// ток
// получить Аанлие из полей ввода u=
г = StrToFloat (Edit2->Text) ;
// получить Аанлие из полей ввода u=
г = StrToFloat (Edit2->Text) ;
// c0 np отивленме не должно быть равно мулк
// c0 np отивленме не должно быть равно мулк
class declaration (all parts)
for statement
(no opening/dosing braces)
ction declaration
class declaration (all parts)
for statement
(no opening/dosing braces)
ction declaration
classf刁 forb
fors
function
classf刁 forb
fors
function
if (no opening/chsing braces) else (no opening/closing braces) ife ▼
if (no opening/chsing braces) else (no opening/closing braces) ife ▼
29: 5 Modified Insetl
29: 5 Modified Insetl
! \атрет.сррКзгпЬе【.Ь)Хё>дтат/
! \атрет.сррКзгпЬе【.Ь)Хё>дтат/
2
2
Рис. 2.24. Список шаблонов кода отображается в результате нажатия <Ctrl>+<J>
Рис. 2.25. В поля диалогового окна надо ввести имя шаблона и его краткое описаниеРис. 2.25. В поля диалогового окна надо ввести имя шаблона и его краткое описание
Рис. 2.25. В поля диалогового окна надо ввести имя шаблона и его краткое описание
Рис. 2.25. В поля диалогового окна надо ввести имя шаблона и его краткое описание
Программист может создать свой собственный шаблон кода и использовать его точно так же, как и стандартный. Для того чтобы создать шаблон кода, нужно в меню Tools выбрать команду Editor Options и в окне Code Insight щелкнуть на кнопке Add. В появившемся окне Add Code Template (рис. 2.25) надо задать имя шаблона (Shortcut Name) и его краткое описание (De-
scription). Затем, после щелчка на кнопке ОК, в поле Code надо ввести шаб-
лон (рис. 2.26).
Рис. 2.26. Пример шаблона кода программистаРис. 2.26. Пример шаблона кода программиста
Рис. 2.26. Пример шаблона кода программиста
Рис. 2.26. Пример шаблона кода программиста
Справочная система
В процессе набора текста программы можно получить справку о конструкции языка, типе данных, классе или функции. Для этого нужно в окне редактора кода набрать слово, о котором надо получить справку (например, имя функции), и нажать клавишу <F1>. Так как с запрашиваемой темой в справочной системе может быть связано несколько разделов, на экране, как правило, появляется окно Найденные разделы (рис. 2.27), в котором можно выбрать нужный раздел. Следует обратить внимание на то, что после имени функции может быть указано имя библиотеки, к которой эта функция относится: VCL или CLX (вспомните: библиотека VCL используется при разработке приложений для Windows,CLX — при разработке кроссплатфор-
приложений). Поэтому, выбирая раздел справочной системы, надо обращать внимание на то, к какой библиотеке он относится.
Справочную информацию можно получить также, выбрав из меню Help команду C++ Builder Help. В этом случае на экране появится стандартное окно справочной системы. В этом окне на вкладке Предметный указатель нужно ввести ключевое слово, определяющее тему, по которой нужна
справка. В качестве ключевого слова можно ввести, например, первые несколько букв имени функции, свойства или метода (рис. 2.28).
Рис. 2.27. В диалоговом окне следует уточнить раздел
Рис. 2.28. Поиск справочной информации по ключевому слову
Сохранениепроекта
Проект — это набор файлов, используя которые компилятор создает выполняемый файл программы (ехе-файл). В простейшем случае проект составляют: файл описания проекта (bpr-файл), файл главного модуля (срр-файл),
файл ресурсов (res-файл), файл описания формы (dfm-файл), заголовочный файл формы и файл описания функций формы (срр-файл).
Чтобы сохранить проект, нужно в меню File выбрать команду Save Project As. Если проект еще ни разу не был сохранен, то C++ Builder сначала предлагает сохранить модуль (содержимое окна редактора кода) и поэтому на экране появляется окно Save As. В этом окне (рис. 2.29) надо выбрать папку, предназначенную для проектов, создать в ней папку для сохраняемого проекта, открыть ее и ввести имя модуля. В результате щелчка на кнопке
Рис. 2.29. Сохранение модуля
Рис. 2.30. Сохранение проекта
OK в указанной папке будут созданы три файла: срр, h и dfm, и на экране появится диалоговое окно Save Projectl As (рис. 2.30), в которое надо ввести имя проекта.
Обратите внимание, что имена файла модуля (срр) и файла проекта (bpr) должны быть разными, т. к. C++ Builder в момент сохранения файла проекта создает одноименный срр-файл (файл главного модуля). Кроме того, надо учесть, что имя генерируемого компилятором выполняемого файла совпадает с именем проекта. Поэтому файлу проекта следует присвоить такое имя, которое, по вашему мнению, должен иметь выполняемый файл программы, а файлу модуля — какое-либо другое имя, например, полученное путем добавления к имени проекта порядкового номера модуля.
Компиляция
Процесс преобразования исходной программы в выполняемую состоит из двух этапов: непосредственно компиляции и компоновки. На этапе компиляции выполняется перевод исходной программы в некоторое внутреннее представление. На этапе компоновки выполняется сборка (построение) программы.
После ввода текста функции обработки события и сохранения проекта можно, выбрав в меню Project команду Compile, выполнить компиляцию. Процесс и результат компиляции отражается в диалоговом окне Compiling (рис. 2.31). Если ,в программе нет синтаксических ошибок, то окно будет содержать сообщение: Done: Compile Unit, в противном случае будет выведено сообщение Done: There are errors.
Рис. 2.31. Результат компиляции: в программе есть ошибки
В случае если компилятор обнаружит в программе ошибки и неточности, диалоговое окно Compiling будет содержать информацию о количестве синтаксических (Errors) и семантических (Warnings) ошибок, а также о числе подсказок (Hints). Сами сообщения об ошибках, предупреждения и подсказки находятся в нижней части окна редактора кода.
Чтобы перейти к фрагменту кода, который, по мнению компилятора, содержит ошибку, надо выбрать сообщение об ошибке (щелкнуть в строке сообщения левой кнопкой мыши) и из контекстного меню (рис. 2.32) выбрать команду Edit Source.
Рис. 2.32. Переход к фрагменту программы, который содержит ошибку
Процесс компиляции можно активизировать, выбрав в меню Run команду Run, которая запускает разрабатываемое приложение. Если будет обнаружено, что с момента последней компиляции в программу были внесены изменения или программа еще ни разу не компилировалась, то будет выполнена компиляция, затем — компоновка, и после этого программа будет запущена (естественно, только в том случае, если в программе нет ошибок).
Ошибки
Компилятор переходит ко второму этапу генерации выполняемой программы только в том случае, если исходный текст не содержит синтаксических ошибок. В большинстве случаев в только что набранной программе есть ошибки. Программист должен их устранить. Процесс устранения ошибок носит итерационный характер. Обычно сначала устраняются наиболее очевидные ошибки, например, объявляются необъявленные переменные. После очередного внесения изменений в текст программы выполняется повторная
компиляция. Следует обратить внимание на то, что компилятор не всегда может точно локализовать ошибку. Поэтому, анализируя фрагмент программы, который, по мнению компилятора, содержит ошибку, нужно обращать внимание не только на тот фрагмент кода, на который компилятор установил курсор, но и на тот, который находится в предыдущей строке. Например, в следующем фрагменте кода:
// вычислить ток
i = u/r
// вывести результат в поле метки
Label4->Caption = "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + “ A”;
не поставлена точка с запятой после оператора присваивания. Компилятор это обнаруживает, выводит сообщение statement missing но выделяет строку Label4->Caption = "ток : " + и устанавливает курсор после идентификатора Label4.
В табл. 2.10 перечислены типичные ошибки и соответствующие им сообщения компилятора.
Таблица 270. Типичные ошибки
Сообщение
Ошибка
Undefined symbol (неизвестный символ)
Используется необъявленная переменная
Имя переменной, функции или параметра записано неверно. Например, в программе объявлена переменная Summ, а в инструкциях используется sum
Statement missing ;
(отсутствует точка с запятой)
После инструкции не поставлена точка с запятой
Unterminated string or character constant (незаконченная строковая или символьная константа)
В конце строковой константы, например, текста сообщения, нет двойных кавычек
) expected
(ожидается закрывающая скобка)
При записи арифметического выражения, содержащего скобки, нарушен баланс открывающих и закрывающих скобок
if statement missing ( (в инструкции if нет открывающей скобки)
В инструкции if условие не заключено в скобки
Compound statement missing }
Нарушен баланс открывающих и закрывающих фигурных скобок. Вероятно, не поставлена закрывающая фигурная скобка отмечающая конец функции или группы инструкций, например, после условия или слова else в инструкции if
Таблица 2.10 (окончание)
СообщениеОшибка
Extra parameter in call toНеверно записана инструкция вызова функции,
(лишний параметр при вызовеуказан лишний параметр
функции)
Если компилятор обнаружил достаточно много ошибок, то просмотрите все сообщения и устраните сначала наиболее очевидные ошибки и выполните повторную компиляцию. Вполне вероятно, что после этого количество ошибок значительно уменьшится. Это объясняется особенностями синтаксиса языка, когда одна незначительная ошибка может "тащить" за собой довольно большое количество других.
Предупреждения и подсказки
При обнаружении в программе неточностей, которые не являются ошибками, компилятор выводит подсказки (Hints) и предупреждения (Warnings).
Например, наиболее часто выводимой подсказкой является сообщение об объявленной, но не используемой переменной (... is declared but never used.). Действительно, зачем объявлять переменную и не использовать ее?
В табл. 2. И приведены предупреждения, наиболее часто выводимые компилятором.
Таблица 2” Предупреждения компилятора
ПредупреждениеВероятная причина
is declared but never used
Possibly incorrect assignment.В условии, например, инструкции
(вероятно, инструкция присваиваниявместо оператора сравнения (==) ис-
некорректная)пользован оператор присваивания (=)
Possibly use of ... before definition.He присвоено начальное значение
(вероятно, используетсяпеременной
неинициализированная переменная)
Компоновка
Если в программе нет ошибок, то можно выполнить компоновку. Для этого надо в меню Compile выбрать команду Make или Build. Разница между командами Make и Build заключается в следующем. Команда Make обеспе-
чивает компоновку файлов проекта, а команда Build ia^MBa принудительную перекомпиляцию, а затем — компоновку.
На этапе компоновки также могут возникнуть ошибки. Чаще всего причина ошибок во время компоновки состоит в недоступности файлов библиотек или других ранее откомпилированных модулей. Устраняются эти ошибки путем настройки среды разработки и включением в проект недостающих модулей. В простых проектах ошибки времени компиляции, как правило, не возникают.
Запуск программы
Пробный запуск программы можно выполнить непосредственно из среды разработки, не завершая работу с C++ Builder. Для этого нужно в меню Run выбрать команду Run или щелкнуть на командной кнопке Run (рис. 2.33).
^к J.sl^^ i飞工』
|Run 彻
Рис. 2.33. Запуск программы из среды разработки
Ошибки времени выполнения
Во время работы приложения могут возникать ошибки, которые называются ошибками времени выполнения (run time errors) или исключениями (exceptions). В большинстве случаев причинами исключений являются неверные исходные данные.
Например, если во время работы программы вычисления силы тока в поле Напряжение ввести 10.5, т. е. разделить целую и дробную часть точкой, то в результате щелчка на кнопке Вычислить на экране появится окно с сообщением об ошибке (рис. 2.34).
Рис. 2.34. Пример окна с сообщением об ошибке времени выполнения (программа запущена из Windows)
Причина возникновения ошибки в следующем. В тексте программы дробная часть числа от целой отделяется точкой. При вводе данных в поле редактирования пользователь может отделить дробную часть числа от целой точкой или запятой. Какой из этих двух символов является правильным, зависит от настройки Windows.
Если в настройке Windows указано, что разделитель целой и дробной частей числа — запятая (для России это стандартная установка), а пользователь использовал точку (ввел в поле Напряжение (Editl) строку 10.5), то при выполнении инструкции
u = StrToFloat(Editl->Text);
возникнет исключение, т. к. при указанной настройке Windows содержимое поля редактирования и, следовательно, аргумент функции StrToFloat не является изображением дробного числа.
Если программа запущена из среды разработки, то при возникновении исключения выполнение программы приостанавливается и на экране появляется окно с сообщением об ошибке и ее типе. В качестве примера на рис. 2.35 приведено окно сообщения о возникновении исключения, причина которого заключается в том, что строка, введенная пользователем в поле редактирования, не является дробным числом.
Debugger Exception Notification
©
Project Amper.exe raisedexception class EConvertError with message "05 is not a valid floating point value'. Process stopped. Use Step or Run to continue.
I
Г ^iew CPU Window
Рис. 2.35. Пример сообщения о возникновении исключения (программа запущена из C++ Builder)
После возникновения исключения и щелчка на кнопке ОК в диалоговом окне Debugger Exception Notification (рис. 2.35) выполнение программы можно прервать или, несмотря на возникшую ошибку, продолжить. Чтобы прервать выполнение программы, надо в меню Run выбрать команду Program Reset, чтобы продолжить — команду Step Over.
Обработку исключений берет на себя автоматически добавляемый в выполняемую программу код, который обеспечивает, в том числе, и вывод информационного сообщения. Вместе с тем C++ Builder дает возможность программе самой выполнить обработку исключения.
Инструкция обработки исключения выглядит так:
try
{
// здесь инструкции, выполнение которых может вызвать исключение
catch ( Тип &е)
{
// здесь инструкции обработки исключения
}
где:
-- ключевое слово, обозначающее, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа;
catch - -слово, обозначающее начало секции обработки ис
ключения. Инструкции этой секции будут выполнены, если в программе возникнет исключение указанного типа.
Основной характеристикой исключения является его тип. В табл. 2.12 перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.
исключения
Исключение
Возникает
—
ошибка преобразования
При выполнении преобразования, если преобразуемая величина не может быть приведена к требуемому Наиболее часто возникает при преобразовании строки символов в число
EDivByZero — целочисленное деление на ноль
При выполнении операции целочисленного деления, если делитель равен нулю
— деление на ноль
При выполнении операции деления над дробными операндами, если делитель равен нулю
ElnOutError — ошибка ввода/вывода
При выполнении файловых операций. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе
В программе вычисления силы тока исключения могут возникнуть при выполнении преобразования строк, введенных в поля редактирования, в числа и при вычислении величины тока. Исключение EConvertError возникнет, если пользователь неправильно введет числа в поля редактирования: например, разделит целую и дробную части точкой. Исключение EZeroDivide возникнет, если пользователь задаст величину сопротивления равной нулю.
В листинге 2.3 приведена функция обработки события Onclick на командной кнопке Вычислить. В функцию включены инструкции обработки исключений.
\ Листинг 2.3. Обработка исключений
void _ fastcall T Forml : :ButtonlClick (TObject * Sender)
{
float u; // напряжение float r; // сопротивление float i; // ток
// получить данные из полей ввода
// возможно исключение — ошибка преобразования■ строки в число try
{ u=StrToFloat*(Editl->Text); r=
} catch (EConvertError &e)
{ ShowMessage ("При вводе дробных чисел используйте запятую.п); return;
}
// вычислить ток
// возможно исключение — деление на ноль try
{ i =
} catch (EZeroDivide &e)
{
ShowMessage ("Величина сопротивления не должна быть равна нулю1'); Edit2->SetFocus ();// курсор в поле Сопротивление
return;
// вывести результат в поле метки
Label4->Caption = "Ток : “ + FloatToStrF(i, ff General, 7, 3);
В приведенной функции для вывода сообщений в случае возникновения исключений использована функция ShowMessage, которая выводит на экран окно с текстом и командной кнопкой ОК.
Инструкция вызова функции ShowMessage выглядит так:
ShowMessage (Сообщение);
Где сообщение — строковая константа (текст, который надо вывести). На рис. 2.36 приведен вид окна сообщения, полученного в результате выполнения инструкции:
ShowMessage("Величина сопротивления не должна быть равна нулю. **);
Рис. 2.36. Сообщение, выведенное функцией ShowMessage
Следует обратить внимание на то, что в заголовке окна сообщения, выводимого функцией ShowMessage, указывается название приложения. Название приложения задается на вкладке Application окна Project Options. Если название приложения не задано, то в заголовке будет имя исполняемого файла.
Для вывода сообщений можно использовать функцию MessageDlg. Функция MessageDlg позволяет поместить в окно с сообщением один из стандартных значков, например "Внимание", задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь. На рис. 2.37 приведено окно, выведенное в результате выполнения инструкции
MessageDlg (пФайл с: WtempWtest. txt будет удален•”, mtWarning, TMsgDlgButtons() « mbOK « mbCancel, 0);
Файл c:\tem\test.txt будет удален.
Рис. 2.37. Пример окна сообщения
Значение функции MessageDlg — число, проверив значение которого можно определить, выбором какой командной кнопки был завершен диалог.
В общем виде обращение к функции MessageDlg выглядит так:
Выбор:= MessageDlg (Сообщение, Тип, Кнопки, КонтекстСправки)
где:
сообщение — текст сообщения;
тип — тип сообщения. Сообщение может быть информационным, предупреждающим или сообщением о критической ошибке. Каждому типу со-
общения соответствует определенный значок. Тип сообщения задается именованной константой (табл. 2.13);
□ кнопки — кнопки, отображаемые в окне сообщения. Задаются операцией
включения в множество элементов — констант (табл. 2.14).
口 КонтекстСправки — параметр, который определяет раздел справочной информации, который появится на экране, если пользователь нажмет клавишу <F1>. Если вывод справочной информации не предусмотрен, то значение параметра должно быть равно нулю.
Таблица 2.13. Константы, определяющие тип сообщения
Константа
Типсообщения
Значок
mtWarning
Внимание
4s
mtError
Ошибка
О
mtInformation
Информация
⑧
mt Confirmation
Подтверждение
Ф
MtCustom
Обычное
Без значка
Таблица 2.14. Константы, определяющие кнопки в окне сообщения
Константа
Кнопка
Константа
Кнопка
mbYes
Yes
mbAbort
Abort
rabNo
No
mbRetry
Retry
mbOK
OK
inblgnore
Ignore
mbCancel
Cancel
mb All
All
mbHelp
Help
Кроме приведенных констант можно использовать константы mbOkCancel, mbYesNoCancel и mbAbortRetrylgnore. Эти константы определяют наиболее часто используемые в диалоговых окнах комбинации командных кнопок.
Значение, возвращаемое функцией MessageDlg (табл. 2.15), позволяет определить, какая из командных кнопок была нажата пользователем.
Таблица Значения функции MessageDig
Значение функции MessageDig
Диалог завершен нажатием кнопки
Abort
Abort
mrYes
Yes
mrOk
Ok
mrRetry
Retry
mrNo
No
mrCancel
Cancel
mrIgnore
Ignore
mrAll
All
Внесение изменений
После нескольких запусков программы "Сила тока" возникает желание усовершенствовать программу, внести в нее изменения. Например, такие, чтобы после ввода напряжения в результате нажатия клавиши курсор переходил в поле Сопротивление, а после ввода сопротивления в результате нажатия этой же клавиши выполнялся расчет. Кроме того, было бы неплохо, чтобы пользователь мог вводить в поля редактирования только числа.
Чтобы внести изменения в программу, нужно запустить C++ Builder и открыть соответствующий проект. Сделать это можно обычным способом, выбрав в меню File команду Open Project. Можно также воспользоваться командой Reopen из меню File. При выборе команды Reopen открывается список проектов, над которыми работал программист в последнее время.
В листинге 2.4 приведена программа "Сила тока", в которую внесены изменения: добавлены функции обработки событий onKeypress для компонентов и Чтобы добавить в программу функцию обработки события, надо в окне Object Inspector выбрать компонент, для которого нужно создать функцию обработки события, на вкладке Events выбрать событие и сделать двойной щелчок в поле рядом с именем события. C++ Builder сформирует шаблон функции обработки события. После этого можно вводить инструкции, реализующие функцию.
Листинг 2.4. Функции обработки событий на компонентах формы программы "Сила тока"
// щелчок на кнопке Вычислить
voidfastcall
float // напряжение
float // сопротивление
float i; // ток
// проверим, введены ли данные в поля Напряжение и Сопротивление if (()
{
ввести напряжение и
0)
if== 0)
Editl->SetFocus () ; // курсор в поле Напряжение
else
Edit2->SetFocus () ; // курсор в поле Сопротивление
return;
};
// получить данные из полей ввода
u =
=
// вычислить силу тока
try
{
i =
}
catch (EZeroDivide &e)
{
сопротивления не должна быть равна
// курсор в поле Сопротивление return;
}
// вывести результат в поле
= "Ток :+
+
}
// нажатие клавиши в поле Напряжение
void _ fastcall*Sender, char &Key)
{
// коды запрещенных клавиш заменим нулем, в результате символы этих клавиш в поле редактирования не появятся
Key — код нажатой клавиши
является ли символ допустимым
if ( ( Key >= О) && ( Key <= ‘9,)) // цифра return;
// Глобальная переменная Decimalseparator
/ / содержит символ, используемый в качестве разделителя
/ / при записи дробных чисел
if ( Key == Decimalseparator)
if ( (Editl->Text).Pos(Decimalseparator) != 0)
Key =0; // разделитель уже введен
return;
}
if (Key == VK_BACK)// клавиша <Backspace>
return;
if ( Key == VK_RETURN) // клавиша <Enter>
{
Edit2->SetFocus();
return;
// остальные клавиши запрещены Key=0; //неотображать символ
}
// нажатие клавиши в поле Сопротивление
void _ fastcall TForml : :Edit2KeyDown (TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ( ( Key >= O) && ( Key <= 9)) // цифра return;
if ( Key == Decimalseparator) {
if ( (Edit2->Text).Pos (DecimalSeparator) != 0)
Key =0; // разделитель уже введен
return;
if (Key == VK_BACK) // клавиша <Backspace> return;
if ( Key ==VKRETURN) // клавиша <Enter>
{
Buttonl->SetFocus (); // переход к кнопке Вычислить
/ / повторное нажатие клавиши <En ter>
/ / активизирует процесс вычисления тока
return;
// остальные клавиши запрещены
Key =0; // не отображать символ }
/ / щелчок на кнопке Завершить
void _ fastcall TForml: :Button2Click (TObject * Sender) {
Fonnl->Close (); // закрыть форму приложения
Настройка приложения
После того как программа отлажена, необходимо выполнить ее окончательную настройку: задать название программы и значок, который будет изображать исполняемый файл приложения в папке, на рабочем столе и на панели задач, во время работы программы.
Название программы
Название программы отображается во время ее работы в панели задач Windows, а также в заголовках окон сообщений, выводимых функцией ShowMessage.
Название программы надо ввести в поле Title (рис. 2.38) вкладки Application диалогового окна Project Options, которое появляется в результате выбора в меню Project команды Options.
Значок приложения
Чтобы назначить приложению значок, отличный от стандартного, нужно в меню Project выбрать команду Options и в открывшемся окне на вкладке Application щелкнуть на кнопке Load Icon. В результате этих действий откроется стандартное окно, используя которое можно просмотреть каталоги и найти подходящий значок (значки хранятся в файлах с расширением ico). В состав C++ Builder входит утилита Image Editor (Редактор изображений), при помощи которой программист может создать для своего приложения уникальный значок. Запустить Image Editor можно из C++ Builder, выбрав в меню Tools команду Image Editor, или из Windows — командой Пуск | Программы | Borland C++ Builder | Image Editor.
Чтобы начать работу по созданию нового значка, нужно в меню File выбрать команду New | Icon File (рис. 2.39).
Рис. 2.38. Название программы надо ввести в поле Title
Рис. 2.39. Начало работы над новым значком
XXПосле выбора типа создаваемого файла открывается окно Icon Properties (рис. 2.40), в котором необходимо выбрать характеристики создаваемого значка: Size (Размер) -- 32x32 (стандартный размер значков Windows) и Colors (Палитра) — 16 цветов. В результате нажатия кнопки ОК открывается окно Iconl.ico (рис. 2.41), в котором можно, используя стандартные инструменты и палитру, нарисовать нужный значок.
X
X
Icon РгсфегН—
—
Г 16 х 16 (small icon] Г 2 colorG 32 x 32 (standard icon) I才16 color
•Cancel
Рис. 2.40. Стандартные характеристики значка
Рис. 2.41. Начало работы над новым значкомРис. 2.41. Начало работы над новым значком
Рис. 2.41. Начало работы над новым значком
Рис. 2.41. Начало работы над новым значком
Процесс рисования в Image Editor практически ничем не отличается от процесса создания картинки в обычном графическом редакторе, например в Microsoft Paint. Однако есть одна тонкость. Первоначально поле изображения закрашено "прозрачным" цветом. Если значок нарисовать на этом фоне, то при отображении значка части поля изображения, закрашенные "прозрачным" цветом, примут цвет фона, на котором будет находиться значок.
В процессе создания картинки можно удалить (стереть) ошибочно нарисованные элементы, закрасив их прозрачным цветом, которому на палитре соответствует левый квадрат в нижнем ряду (рис. 2.42).
Кроме "прозрачного" цвета в палитре есть "инверсный" цвет. Нарисованные этим цветом части рисунка при выводе на экран будут окрашены инверсным относительно цвета фона цветом.
"Инверсный"
мак г’””"■**• г~ —,г****ямм
П匚厂髓厂
Прозрачный"
Рис. 2.42. Палитра
Чтобы сохранить нарисованный значок, надо в меню выбрать команду Save, в открывшемся диалоговом окне раскрыть папку проекта (приложения, для которого создан значок) и задать имя файла значка, которое обычно совпадает с именем проекта (выполняемого файла приложения).
Перенос приложения на другой компьютер
Небольшую программу, которая использует только стандартные компоненты и представляет собой один-единственный ехе-файл, можно перенести на другой компьютер вручную, например, при помощи дискеты. Как правило, при запуске таких программ на другом компьютере проблем не возникает. Вместе с тем, необходимо обратить внимание на следующее. Программа, созданная в C++ Builder, использует DLL версию времени выполнения (RTL — Runtime Library) и динамические библиотеки — пакеты (например, в пакете VCL60 находятся наиболее часто используемые компоненты и системные функции). Чтобы программа могла работать на другом компьютере, помимо ехе-файла на этот компьютер надо перенести RTL-библиотеку и используемые программой пакеты или включить библиотеку и пакеты в ехе-файл (что существенно увеличит размер ехе-файла). Чтобы включить в выполняемый файл RTL-библиотеку и используемые программой пакеты, надо в меню Project выбрать команду Options и во вкладках Linker (рис. 2.43) и Packages (рис. 2.44) сбросить соответственно флажки Use dynamic RTL и Build with runtime packages. После этого нужно выполнить перекомпоновку программы.
Сложные программы, например те, которые используют компоненты доступа к базам данных, перенести на другой компьютер вручную проблематично. Для таких программ лучше создать установочную дискету (CD-ROM). Сделать это можно, например, при помощи пакета InstallShield Express, который входит в комплект поставки C++ Builder.
Project Options for Amper3.exe
xjxjVersion InfojPackagesTasm|CORBA| CodeGuaid
xj
xj
Forms j Application jCompiler |Advanced Compiler ]C++
PascalPascalГ LinkingI P Create debug informationГ LinkingI P Create debug informationГfi?eв dynamic fifijГfi?eв dynamic fifijI WarningsiАИ!G SelectedI WarningsiАИ!G SelectedI Г' Г! ГPI Г' Г! ГPUse debug librariesUse debug libraries* 3 file* 3 filePE file optionsM in Hack size: j 0x00002000PE file optionsM in Hack size: j 0x00002000jjDon't gegerate »Ute HetMa«軍torr [0力Don't gegerate »Ute HetMa«軍torr [0力!!Max stack size: |0x001 00000Max stack size: |0x001 00000Min heap size: [0x00001000Min heap size: [0x00001000..Map file:^-•ь Offii™ Publics! 「Dejailed厂Show mangled namesMap file:^-•ь Offii™ Publics! 「Dejailed厂Show mangled namesMaxheap size: 0x00100000Maxheap size: 0x00100000Image base: 10x00400000Image base: 10x00400000厂Default厂DefaultCancelCancelSubsystem major:Subsystem major:Subsystem minor:Subsystem minor:LULUHelpHelpРис. 2.43. Чтобы включить в выполняемый файл RTL-библиотеку,сбросьте флажок Use dynamic RTLРис. 2.43. Чтобы включить в выполняемый файл RTL-библиотеку,сбросьте флажок Use dynamic RTLProject Options For Projetll.ex®Project Options For Projetll.ex®XXForms j Application | Compiler |Advanced Compiler | C++Pascalj Linker |Advanced Linkerj D irectoriesZConditionalsVersion InfoPackagesj Tasm ) CORBA |CodeGuaidForms j Application | Compiler |Advanced Compiler | C++Pascalj Linker |Advanced Linkerj D irectoriesZConditionalsVersion InfoPackagesj Tasm ) CORBA |CodeGuaidDesign—Design—Borland AcbonBar ComponentsBorland AcbonBar Components伺Borland ADO DB Components叵) Borland Base Cached ClientDataset ComponentИ Borland BDE DB Components必Borland C++Builder COM Server Components Sample Package回Borland C++Builder Internet Explorer 5 Components Package伺Borland ADO DB Components叵) Borland Base Cached ClientDataset ComponentИ Borland BDE DB Components必Borland C++Builder COM Server Components Sample Package回Borland C++Builder Internet Explorer 5 Components Package99Add...Add...flemoveflemoveCancelCancel| Aprogram filesSborland^cbuildere^BinSdclactGO.bpl| Aprogram filesSborland^cbuildere^BinSdclactGO.bplRuntime packages —Runtime packages —Рис. 2.44. Чтобы включить в выполняемый файл используемые программой пакеты (специальные DLL-библиотеки), сбросьте флажок Build with runtime packagesРис. 2.44. Чтобы включить в выполняемый файл используемые программой пакеты (специальные DLL-библиотеки), сбросьте флажок Build with runtime packages厂 iBuild with runtime packaged厂 iBuild with runtime packaged..川 dMI edaH、0db.vckbdefH:vd..川 dMI edaH、0db.vckbdefH:vdГDefaultГDefaultLinker ft dvanced Linker| D irectoriesZConditionals
Pascal
Pascal
Г Linking
I P Create debug information
Г Linking
I P Create debug information
Гfi?eв dynamic fifij
Гfi?eв dynamic fifij
I Warnings
iАИ
!G Selected
I Warnings
iАИ
!G Selected
I Г
' Г
! Г
P
I Г
' Г
! Г
P
Use debug libraries
Use debug libraries
* 3 file
* 3 file
PE file options
M in Hack size: j 0x00002000
PE file options
M in Hack size: j 0x00002000
j
j
Don't gegerate »Ute Het
Ma«軍torr [0力
Don't gegerate »Ute Het
Ma«軍torr [0力
!
!
Max stack size: |0x001 00000
Max stack size: |0x001 00000
Min heap size: [0x00001000
Min heap size: [0x00001000
.
.
Map file:^-
•ь Off
i
i™ Publics
! 「Dejailed
厂Show mangled names
Map file:^-
•ь Off
i
i™ Publics
! 「Dejailed
厂Show mangled names
Maxheap size: 0x00100000
Maxheap size: 0x00100000
Image base: 10x00400000
Image base: 10x00400000
厂Default
厂Default
Cancel
Cancel
Subsystem major:
Subsystem major:
Subsystem minor:
Subsystem minor:
LU
LU
Help
Help
Рис. 2.43. Чтобы включить в выполняемый файл RTL-библиотеку,сбросьте флажок Use dynamic RTL
Рис. 2.43. Чтобы включить в выполняемый файл RTL-библиотеку,сбросьте флажок Use dynamic RTL
Project Options For Projetll.ex®
Project Options For Projetll.ex®
X
X
Forms j Application | Compiler |Advanced Compiler | C++
Pascalj Linker |Advanced Linkerj D irectoriesZConditionals
Version InfoPackagesj Tasm ) CORBA |CodeGuaid
Forms j Application | Compiler |Advanced Compiler | C++
Pascalj Linker |Advanced Linkerj D irectoriesZConditionals
Version InfoPackagesj Tasm ) CORBA |CodeGuaid
Design—
Design—
Borland AcbonBar Components
Borland AcbonBar Components
伺Borland ADO DB Components
叵) Borland Base Cached ClientDataset Component
И Borland BDE DB Components
必Borland C++Builder COM Server Components Sample Package
回Borland C++Builder Internet Explorer 5 Components Package
伺Borland ADO DB Components
叵) Borland Base Cached ClientDataset Component
И Borland BDE DB Components
必Borland C++Builder COM Server Components Sample Package
回Borland C++Builder Internet Explorer 5 Components Package
9
9
Add...
Add...
flemove
flemove
Cancel
Cancel
| Aprogram filesSborland^cbuildere^BinSdclactGO.bpl
| Aprogram filesSborland^cbuildere^BinSdclactGO.bpl
Runtime packages —
Runtime packages —
Рис. 2.44. Чтобы включить в выполняемый файл используемые программой пакеты (специальные DLL-библиотеки), сбросьте флажок Build with runtime packages
Рис. 2.44. Чтобы включить в выполняемый файл используемые программой пакеты (специальные DLL-библиотеки), сбросьте флажок Build with runtime packages
厂 iBuild with runtime packaged
厂 iBuild with runtime packaged
..川 dMI edaH、0db.vckbdefH:vd
..川 dMI edaH、0db.vckbdefH:vd
ГDefault
ГDefault
Структура простого проекта
Проект представляет собой набор программных единиц — модулей.
Один из модулей, называемый главным, содержит инструкции, с которых начинается выполнение программы. Чтобы увидеть главный модуль, нужно в меню Project выбрать команду View Source. В качестве примера в листинге 2.5 приведен текст главного модуля программы "Сила тока".
Листинг 2.5. Главный модуль (Amper.cpp)
#include <vcl.h>
#pragma hdrstop
USE FORM (HZ\mper_l. cpp", Forml);
WINAPI WinMain (HINSTMCE, H工NSTANCE, LPSTR, int) {
try {
Application->Initialize();
Application->Title = "Сила тока";
Application->CreateForm(—classic!(TForml), &Forml); Application->Run();
}
catch (Exception &exception) {
Application->ShowException(&exception);
} catch (...)
{ try { throw Exception (,,H); }
catch (Exception & except ion) {
Application->ShowException(&exception); } } return 0;
Начинается главный модуль директивами компилятору (точнее, препроцессору). Директива #include <vcl.h> информирует компилятор, что перед тем
как приступить непосредственно к компиляции, в текст главного модуля нужно включить заголовочный файл библиотеки визуальных компонентов — vcl. h. Строка USEFORM ("Amper_l. cpp", Forml) указывает, что в проект нужно включить файл модуля формы Amper」, cpp, который содержит функции обработки событий для формы Forml. Далее следует описание главной функции программы — WinMain. Функция WinMain инициализирует внутренние структуры программы, создает форму Forml и запускает программу, что приводит к появлению на экране стартовой формы. Так как в проекте "Сила тока" только одна форма, то на экране именно она и появляется. Инструкция обработки исключений catch выполняется, если в программе возникает ошибка. Таким образом, главный модуль обеспечивает вывод стартовой формы программы, дальнейшее поведение которой определяют функции обработки событий стартовой формы.
Помимо главного модуля в состав проекта входят модули формы. Для каждой формы C++ Builder создает отдельный модуль, который состоит из двух файлов: заголовочного файла и файла кода (содержимое этих файлов отражается в окне редактора кода). Заголовочный файл содержит описание формы (листинг 2.6), файл кода (модуль формы) - - описание (текст) функций, в том числе и обработки событий (листинг 2.7).
Листинг 2.6. Заголовочный файл модуля формы (Amper__1.h)
#ifndef Amper_lH ftdefineAmper_lH
#include <Classes.hpp>
#include <Controls.hpp> ttinclude<StdCtrls.hpp> #include <Forms.hpp>
class T Forml : public TForm
{
__published: // IDE-managed Components
TLabel *Labell;
TLabel *Label2;
TLabel *Label3;
TEdit *Editl;
TEdit *Edit2;
TButton *Buttonl;
TButton *Button2;
TLabel *Label4;
voidfastcall ButtonlClick(TObject *Sender);
voidfastcall Button2Click(TObject *Sender);
private:// User declarations
public:// User declarations
_ fastcall TForml (TComponent* Owner);
);
extern PACKAGE TForml *Forml;
#endif
Г Листинг 2.7. Модуль формы (Amper _1.cpp)
#include <vcl.h>
#pragma hdrstop
iinclude "Amper_l. h"
#pragma package (smart_init)
#pragma resource ”* ・dfm" TForml * Forml;
_ fastcall TForml: : TForml (TComponent*Owner)
:
// щелчок на кнопке Вычислить
void _ fastcall TForml: :ButtonlClick (TObject *Sender) {
float u; // напряжение float r; // сопротивление float i; // сила тока
// получить данные из полей■ ввода
// возможно исключение
try
{
u=StrToFloat (Editl->Text);
r=
} catch (EConvertError se)
{
););ShowMessage ("При вводе дробных чисел используйте запятую, return;
);
);
Глава2.Первый проект __59
// вычислить силу тока
// возможно исключение
try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage ( п Сопротивление не должно быть равно нулю*'); Editl->SetFocus ();// курсор в поле Сопротивление
return;
// вывести результат в поле метки
Label4->Caption = "Ток : u + FloatToStrF(i,ffGeneral,7,3);
}
// щелчок на кнопке Завершить
void _ fastcall T Forml: : Button2Click (T Obj ect * Sender) {
Forml->Close (); // закрыть окно программы
Следует отметить, что значительное количество работы по генерации программного кода выполнил C++ Builder. Он полностью сформировал главный модуль (Amper.cpp), заголовочный файл модуля формы (Amper_l.h), значительную часть модуля формы (Amper_l.cpp). Кроме того, C++ Builder, анализируя действия программиста, сформировал описание формы, файл проекта и файл ресурсов проекта.
часть II
Практикум
программирования
Во второй части книги демонстрируется назначение и возможности базовых компонентов, на конкретных примерах показано, как, используя эти базовые компоненты, создать программу, обеспечивающую отображение графики, воспроизведение звука и анимации. Уделено внимание разработке приложений работы с базами данных. Показано, как создать справочную систему и установочный CD.
Глава 3.
Графика
Глава 4.
Мультимедиа
Глава 5.
Базы данных
Глава 6.
Компонент программиста
Глава 7.
Консольное приложение
Глава 8.
Справочная система
Глава 9.
Создание установочного диска
Глава 10.
Примеры программ
ГЛАВА 3
Графика
C++ Builder позволяет программисту разрабатывать программы, которые работают с графикой. В этой главе рассказывается, что надо сделать, чтобы на поверхности формы появилась картинка, сформированная из графических примитивов, или иллюстрация, созданная в графическом редакторе или полученная в результате сканирования фотографии.
Холст
Программа может вывести графику на поверхность формы (или компонента image), которой соответствует свойство canvas (Canvas — холст для рисования). Для того чтобы на поверхности формы или компонента image появилась линия, окружность, прямоугольник или другой графический элемент (примитив), необходимо к свойству canvas применить соответствующий метод (табл.
Например, оператор
50, 50)
рисует на поверхности формы прямоугольник.
Таблица Методы вычерчивания графических примитивов
МетодДействие
Рисует линию из текущей точки в точку с указанными координатами
Рисуети х2, у2 — коор
динаты левого верхнего и правого нижнего углов прямоугольника. Цвет границы и внутренней области прямоугольника могут быть разными
Таблица 3J (окончание)
Метод
Действие
FillRect(xl,yl,x2,y2)
Рисует закрашенный прямоугольник. xl, yl, x2, у2 — определяют координаты диагональных углов
FrameRect(xl,yl,x2,y2)
Рисует контур прямоугольника. xl, yl, х2, у2 — определяют координаты диагональных углов
RounRect(xl,yl,x2,y2,x3,y3)
Ellipse(xl,yl,x2,y2)
Рисует прямоугольник со скругленными углами Рисует эллипс или окружность (круг). xl, yl, х2, у2 — координаты прямоугольника, внутри которого вычерчивается эллипс или, если прямоугольник является квадратом, окружность
Polyline(points,n)
Рисует ломаную линию, points — массив типа TPoint. Каждый элемент массива представляет собой запись, поля х и у которой содержат координаты точки перегиба ломаной; n — количество звеньев ломаной. Метод Polyline вычерчивает ломаную линию, последовательно соединяя прямыми отрезками точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д.
Методы вывода графических примитивов рассматривают свойство canvas как некоторый абстрактный холст, на котором они могут рисовать (Canvas переводится как "поверхность", "холст для рисования"). Холст состоит из отдельных точек — пикселов. Положение пиксела на поверхности холста характеризуется горизонтальной (X) и вертикальной (Y) координатами. Координаты возрастают сверху вниз и слева направо (рис. 3.1). Левый верхний пиксел поверхности формы (клиентской области) имеет координаты (О, О), правый нижний — (ClientWidth, ClientHeight). Доступ к отдельному пикселу осуществляется через свойство Pixels, представляющее собой двумерный массив, элементы которого содержат информацию о цвете точек холста.
Следует обратить внимание на важный момент. Изображение, сформированное на поверхности формы, может быть испорчено, например, в результате полного или частичного перекрытия окна программы другим окном. Поэтому программист должен позаботиться о том, чтобы в момент появления окна программа перерисовала испорченное изображение. К счастью, операционная система Windows информирует программу о необходимости перерисовки окна, посылая ей соответствующее сообщение, в результате чего возникает событие OnPaint. Событие OnPaint возникает и в момент за-
пуска программы, когда окно появляется на экране в первый раз. Таким образом, инструкции, обеспечивающие вывод графики на поверхность формы, надо поместить в функцию обработки события onPaint.
(0.0) —(0.0) —瞬 Fsnfl瞬 Fsnfl
(0.0) —
(0.0) —
瞬 Fsnfl
瞬 Fsnfl
m— (Form1->ClientWidthIForm1->ClientHeight)
Рис. 3.1. Координаты точек поверхности формы (холста)
Карандаш и кисть
Методы вычерчивания графических примитивов обеспечивают только вычерчивание. Вид графического элемента определяют свойства Реп (карандаш) и Brush (кисть) той поверхности (Canvas), на которой рисует метод.
Карандаш и кисть, являясь свойствами объекта canvas, в свою очередь представляют собой объекты Реп и Brush. Свойства объекта Реп (табл. 3.2) задают цвет, толщину и тип линии или границы геометрической фигуры. Свойства объекта Brush (табл. 3.3) задают цвет и способ закраски области внутри прямоугольника, круга, сектора или замкнутого контура.
Таблица 3.2. Свойства объекта Реп (карандаш)
Свойство
Определяет
Color
Цвет ЛИНИИ
width
Толщину линии (задается в пикселах)
Style
Вид линии (psSolid — сплошная; psDash — пунктирная, длинные штрихи; psDot — пунктирная, короткие штрихи; psDashDot — пунктирная, чередование длинного и короткого штрихов; psDashDotDot — пунктирная, чередование одного длинного и двух коротких штрихов; psClear — линия не отображается (используется, если не надо изображать границу области — например, прямоугольника)
Таблица3.3. Свойства объекта Brush (кисть)
Свойство
Определяет
Color
Цвет закрашивания замкнутой области
style
Стиль заполнения области (bsSolid — сплошная запивка.
Штриховка: bsHorizontal — горизонтальная; bsVertical — вертикальная; bsFDiagonal — диагональная с наклоном линий вперед; bsBDlagonal — диагональная с наклоном линий назад;
bsCross — в клетку; bsDiagCross — диагональная клетка
Ниже приведена функция обработки события onPain, которая рисует на поверхности формы олимпийский флаг.
void _ fastcall TForml: : FomPaint (TObject *Sender) {
// полотнище флага
Canvas->Pen->Width = 1;
Canvas->Pen->Color = clBlack;
Canvas->Brush->Color =
Canvas->Rectangle (30,30,150,150);
Canvas->Pen->Width = 2; // ширина колец
Canvas->Brush->Style =// чтобы круг, нарисованный
/ / методом Ellipse, не был закрашен
// рисуем кольца
Canvas->Pen->Color =
Canvas->Ellipse(40,40,80,80);
Canvas->Pen->Color = clBlack;
Canvas->Ellipse (70,40,110,80);
Canvas->Pen->Color =
Canvas->E11ipse (100,40,140, 80)
Canvas->Pen->Color =
Canvas->Ellipse (55,65,95,105);
Canvas->Pen->Color = clGreen;
Canvas->Ellipse (85,65,125,105);
Графические примитивы
Любая картинка, чертеж или схема могут рассматриваться как совокупность графических примитивов: точек, линий, окружностей, дуг и др. Таким образом, для того чтобы на экране появилась нужная картинка, программа
3 Зак. 1252
должна обеспечить вычерчивание (вывод) графических элементов — примитивов, составляющих эту картинку.
Вычерчивание графических примитивов на поверхности (формы или компонента image — области вывода иллюстрации) осуществляется применением соответствующих методов к свойству Canvas этой поверхности.
Линия
Вычерчивание прямой линии выполняет метод LineTo. Метод рисует линию из той точки, в которой в данный момент находится карандаш (эта точка называется текущей позицией карандаша или просто "текущей"), в точку, координаты которой указаны в инструкции вызова метода.
Например, оператор
Canvas->LineTo(100,200)
рисует линию в точку с координатами (100, 200), после чего текущей становится точка с координатами (100, 200).
Начальную точку линии можно задать, переместив карандаш в нужную точку графической поверхности. Сделать это можно при помощи метода MoveTo, указав в качестве параметров координаты точки начала линии. Например, операторы
Canvas->MoveTo(10,10); // установить карандаш в точку (10,10) Canvas->LineTo(50,10); // линия из точки (10,10) в точку (50,10)
рисуют горизонтальную линию из точки (10, 10) в точку (50, 10).
Используя свойство текущей точки, можно нарисовать ломаную линию. Например, операторы
Canvas->MoveTo(10,10);
Canvas->LineTo(50,10);
Canvas->LineTo(10,20);
Canvas->LineTo(50,20);
рисуют линию, похожую на букву Z.
Ломанаялиния
Метод Polyline вычерчивает ломаную линию. В качестве параметров методу передается массив типа TPoint, содержащий координаты узловых точек линии, и количество звеньев линии. Метод Polyline вычерчивает ломаную линию, последовательно соединяя точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д.
Например, приведенный ниже фрагмент кода рисует ломаную линию, состоящую из трех звеньев.
TPoint// координатыконца и точек перегиба
координаты точек ломаной
=100;=100;//начало
р[1].х =100;=150;//точкаперегиба
р[2].х =150;=150;//точкаперегиба
р[3].х =150;=100;//конец
// ломаная из трех звеньев
Метод Polyline можно использовать для вычерчивания замкнутых контуров. Для этого надо, чтобы первый и последний элементы массива содержали координаты одной и той же точки.
Прямоугольник
Метод Rectangle вычерчивает прямоугольник. В инструкции вызова метода надо указать координаты двух точек — углов прямоугольника. Например, оператор
50,50)
рисует квадрат, левый верхний угол которого находится в точке (10, 10), а правый нижний в точке (50, 50).
Цвет, вид и ширину линии контура прямоугольника определяют значения свойства Реп, а цвет и стиль заливки области внутри прямоугольника - значения свойства Brush той поверхности, на которой метод рисует прямоугольник. Например, следующие операторы рисуют флаг Российской Федерации.
Canvas->Brush->Color =// цвет кисти — белый
Canvas->Rectangle
Canvas->Brush->Color =// цвет кисти — синий
Canvas->Rectangle(10,30,90,50);
Canvas->Brush->Color =// цвет кисти — красный
Canvas->Rectang1e (10,50,90,70);
Вместо четырех параметров — координат двух диагональных углов прямоугольника — методу Rectangle можно передать один параметр — структуру типа TRect, поля которой определяют положение диагональных углов прямоугольной области. Следующий фрагмент кода демонстрирует использование структуры TRect в качестве параметра метода Rectangle.
TRect ret; // прямоугольная область
ret.Top = 10;
ret.Left = 10;
ret.Bottom =
ret.Right =
Canvas->Rectangle(ret); // нарисовать прямоугольник
Есть еще два метода, которые вычерчивают прямоугольник. Метод FillRect вычерчивает закрашенный прямоугольник, используя в качестве инструмента только кисть (Brush), а метод FraineRect — только контур и использует только карандаш (Pen). У этих методов только один параметр — структура типа TRect. Поля структуры TRect содержат координаты прямоугольной области. Значения полей структуры TRect можно задать при помощи функции Rect.
Например:
TRect ret; // область, которую надо закрасить ret =// координаты области
Canvas->Brush->Color = clRed; // цвет закраски Canvas->FillRect (ret);
Метод RoundRec вычерчивает прямоугольник со скругленными углами. Инструкция вызова метода RoundRec в общем виде выглядит так:
Canva s->RoundRec(xl,yl,x2,y2,x3, y3)
Параметры xl, yl, x2, y2 определяют положение углов прямоугольника, а параметры хЗ и уЗ — размер эллипса, одна четверть которого используется для вычерчивания скругленного угла (рис. 3.2).
Рис. 3.2. Метод RoundRecвычерчиваетпрямоугольниксоскругленнымиуглами
Многоугольник
Метод Polygon вычерчивает многоугольник. Инструкция вызова метода в общем виде выглядит так:
Canvas->Polygon(p, п)
где р — массив записей типа TPoint, который содержит координаты вершин многоугольника; п — количество вершин.
Метод Polygon чертит многоугольник, соединяя прямыми линиями точки, координаты которых находятся в массиве: первую со второй, вторую с третьей, третью с четвертой и т. д. Вид границы многоугольника определяют значения свойства Реп, а вид заливки области, ограниченной линией границы, — значения свойства Brush той поверхности, на которой метод рисует.
Ниже приведен фрагмент кода, который, используя метод Polygon, рисует ромб,
TPoint p[4]; // четыре вершины
// координаты вершин
p[0].x = 50; p[0] .y = 100;
p[l].x = 150; pdl.y= 75;
p[2] .x = 250; P[2] .y = 100;
p[3].x = 150; p[3] .y = 125;
Canvas->Brush->Color =clRed;
Canva s->Po1уgon(p,3);
Окружность и эллипс
Нарисовать эллипс или окружность (частный случай эллипса) можно при помощи метода Ellipse. Инструкция вызова метода в общем виде выглядит следующим образом:
Canvas->Ellipse(xl,yl,x2,y2)
Параметры xl, yl, x2, y2 определяют координаты прямоугольника, внутри которого вычерчивается эллипс или, если прямоугольник является квадратом, — окружность (рис. 3.3).
Рис. 3.3. Значения параметров метода Ellipse определяют вид геометрической фигурыРис. 3.3. Значения параметров метода Ellipse определяют вид геометрической фигуры
Рис. 3.3. Значения параметров метода Ellipse определяют вид геометрической фигуры
Рис. 3.3. Значения параметров метода Ellipse определяют вид геометрической фигуры
Вместо четырех параметров — координат диагональных углов прямоугольника — методу Ellipse можно передать один — объект типа TRect. Следующий фрагмент кода демонстрирует использование объекта TRect в качестве параметра метода Ellipse.
TRect rec = Rect (10,10,50, 50);
Canvas->Ellipse(rec);
Как и в случае вычерчивания других примитивов, вид контура эллипса (цвет, толщину и стиль линии) определяют значения свойства Реп, а цвет и стиль заливки области внутри эллипса — значения свойства Brush той поверхности (canvas), на которой метод чертит.
Дуга
Метод Arc рисует дугу — часть эллипса (окружности). Инструкция вызова метода в общем виде выглядит так:
Canvas->Arc(xl,yl,x2,y2,x3,y3,x4,y4)
Параметры xl, yl, x2, y2 определяют эллипс (окружность), частью которого является дуга. Параметры хз и уз задают начальную, а х4 и у4 — конечную точку дуги. Начальная (конечная) точка дуги — это точка пересечения границы эллипса и прямой, проведенной из центра эллипса в точку с координатами хЗ и уЗ (х4, у4). Метод Arc вычерчивает дугу против часовой стрелки от начальной точки к конечной (рис. 3.4).
Цвет, толщина и стиль линии, которой вычерчивается дуга, определяются значениями свойства Реп поверхности (canvas), на которую выполняется вывод.
Рис. 3.4. Значения параметров метода Arc определяют дугу как часть эллипса (окружности)
Сектор
Метод pie вычерчивает сектор эллипса или круга. Инструкция вызова метода в общем виде выглядит следующим образом:
Canvas->Pie(xl,yl,x2,y2,x3,y3,x4,y4)
Параметры xl, yl, x2, y2 определяют эллипс (круг), частью которого является сектор; хЗ, уз, х4 и у4 — прямые — границы сектора. Начальная точка границ совпадает с центром эллипса. Сектор вырезается против часовой стрелки от прямой, заданной точкой с координатами (хЗ, уз), к прямой, заданной точкой с координатами (х4, у4) (рис. 3.5).
Рис. 3.5. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)Рис. 3.5. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)
Рис. 3.5. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)
Рис. 3.5. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)
Текст
Вывод текста (строк типа AnsiString) на поверхность графического объекта обеспечивает метод TextoutA. Инструкция вызова метода TextoutA в общем виде выглядит следующим образом:
Canvas->TextOutA(x,у,Текст)
Параметр текст задает выводимый текст. Параметры х и у определяют координаты точки графической поверхности, от которой выполняется вывод текста (рис. 3.6).
Шрифт, который используется для вывода текста, определяется значением свойства Font соответствующего объекта canvas. Свойство Font представляет собой объект типа TFont. В табл. 3.4 перечислены свойства объекта TFont, определяющие характеристики шрифта, используемого методом TextOutA для вывода текста.
Таблица 3.4. Свойства объекта TFont
Свойство
Определяет
Name
Используемый шрифт. В качестве значения следует использовать название шрифта (например, Arial)
size
Размер шрифта в пунктах (points). Пункт— это единица измерения размера шрифта, используемая в полиграфии. Один пункт равен 1/72 дюйма
style
Стиль начертания символов. Может быть: нормальным, полужирным, курсивным, подчеркнутым, перечеркнутым. Стиль задается при помощи следующих констант: fsBold (полужирный), fsltalic (курсив), fsUnderline (подчеркнутый), fsStrikeOut (перечеркнутый)
Свойство Style является множеством, что позволяет комбинировать необходимые стили. Например, инструкция, которая устанавливает стиль "полужирный курсив", выглядит так:
Canvas->Font->Style =
TFontStyles () <<fsBold«fsUnderline
Color
Цвет символов. В качестве значения можно использовать константу типа TColor
При выводе текста весьма полезны методы Textwidth и TextHeight, значениями которых являются соответственно ширина и высота области вывода текста, которые, очевидно, зависят от характеристик используемого шрифта. Обоим этим методам в качестве параметра передается строка, которую предполагается вывести на поверхность методом TextOutA.
Следующий фрагмент кода демонстрирует использование методов, обеспечивающих вывод текста на поверхность формы. Приведенная функция обработки события OnPaint закрашивает верхнюю половину окна белым, нижнюю — голубым цветом, затем в центре окна, по границе закрашенных областей, выводит текст (рис. 3.7).
void fastcall TForml::FormPaint(TObject *Sender) {
AnsiString ms = "Borland C++Builder”;
TRect aRect;
int x, V; // точка, от которой будет выведен текст
/ / верхнюю половину окна красим белым
aRect = Rect(Or Or Clientwidth,ClientHeight/2);
Canvas->Brush->Color =
Canvas->FillRect(aRect);
// нижнюю половину окна красим■ голубым
aRect = Rect(0, ClientHeight/2,Clientwidth,ClientHeight);
Canvas->Brush->Cdlor =
Canvas->FillRect(aRect);
Canvas->Font->N ame = "Times New Roman";
Canvas->Font->Size = 24;
// Canvas->Font->Style =
// текст разместим в центре окна
х = (ClientWidth - Canvas->TextWidth(ms)) /2;
у = ClientHeight/2 - Canvas->TextHeight(ms) /2;
Canvas->Brush->Style = bsCLear; // область вывода текста // не закрашивать
Canvas->Font->Color =clBlack;
Canvas->TextOutA(x, y,ms); // вывести текст
Рис. З.7. Вывод текста
Иногда требуется вывести какой-либо текст после сообщения, длина которого во время разработки программы неизвестна. В этом случае необходимо знать координаты правой границы области выведенного текста. Координаты правой границы текста, выведенного методом TextOutA, можно получить, обратившись к свойству penPos.
Следующий фрагмент кода демонстрирует возможность вывода строки текста ПрИ ПОМОЩИ ДВУХ ИНСТРУКЦИЙ TextOutA:
Canvas->TextOutA(10r10,nBorland ");
Canvas->TextOutA(Canvas->PenPos.x, Canvas->PenPos.y, "C++Builder");
Точка
Поверхности, на которую программа может осуществлять вывод графики, соответствует объект canvas. Свойство pixels, представляющее собой двумерный массив типа TColor, содержит информацию о цвете каждой точки графической поверхности. Используя свойство pixels, можно задать цвет любой точки графической поверхности, т. е. "нарисовать" точку. Например, инструкция
Canvas->Pixels[10][10] =
окрашивает точку поверхности формы в красный цвет.
Размерность массива Pixels определяется реальным размером графической поверхности. Размер графической поверхности формы (рабочей области, которую также называют клиентской) определяют свойства Clientwidth и ClientHeight, а размер графической поверхности компонента image -- свойства Width и Height. Левой верхней точке рабочей области формы соответствует элемент pixels [0] [0], а правой нижней -- Pixels [Clientwidth - 1] [ClientHeight -1].
I Листинг3.1. График функцииI Листинг3.1. График функцииСледующая программа (листинг 3.1), используя свойство pixels, строит график функции у = 2 sin(x)ex/5. Границы диапазона изменения аргумента функции являются исходными данными. Диапазон изменения значения функции вычисляется во время работы программы. На основании этих данных программа вычисляет масштаб, позволяющий построить график таким образом, чтобы он занимал всю область формы, предназначенную для вывода графика. Для построения графика используется вся доступная область формы, причем если во время работы программы пользователь изменит размер окна, то график будет выведен заново с учетом реальных размеров окна.
I Листинг3.1. График функции
I Листинг3.1. График функции
// обработка события OnPaint
void _ fastcall TForml : : FormPaint (TObject * Sender) \ {
Grafik();
// обработка события OnResize
voidfastcall TForml: : FormResize (TObject * Sender)
{
TRect ret =
Canvas'->FillRect(ret);// стереть
Grafik ();
// для доступа к sin и ехр
//график которой надо построить
floatx)
return
// область вывода графика 1 = 10;Ъ =hw =— 20;// область вывода графика 1 = 10;Ъ =hw =— 20;}
// область вывода графика 1 = 10;
Ъ =
h
w =— 20;
// область вывода графика 1 = 10;
Ъ =
h
w =— 20;
void
{
float xl,
// границы изменения аргумента функции
float yl, float x; float у; float int
// границы изменения значения функции
// аргумент функции
// значение функции в точке х
// приращение аргумента
// левый нижнийобласти вывода графика
int w,
// ширина и высота области вывода графика
floatmy;
int
// масштаб по осям X и Y // начало координат
// X — координата левого верхнего угла // Y — координата левого нижнего угла // высота
// ширина
xl = 0;// нижняя граница диапазона аргумента
х2 = 25;// верхняя граница диапазона аргумента
dx// шаг аргумента
// найдем максимальное и минимальное значение
// функции на отрезке [xl,x2] x=xl;
yl =// минимум
у2 = f // максимум
do {
у =
if ( у < yl) yl = у;
if ( у > у2) у2 = у;
х += dx;
} while (x <=
// вычислим масштаб
ту = (float)h/abs(y2-yl); // масштаб по оси Y
mx = w/abs(x2—x_L) :// масштаб по оси X
оси хО = уО =
Canvas->MoveTo(xO,b); Canvas->LineTo(xO,b-h);
Canvas->MoveTo(1, yO);Canvas->LineTo(1+w,yO);
Canvas->TextOutA(xO+5,b-h,ELoatToStrF(y2,ffGeneral,6,3));
6,
//графика
x = xl; do {
У = f
= x +=
} while (x <=
Основную работу выполняетGrafik (ее объявление надо поместить
в раздел private объявления формы в заголовочном файле программы). Функция Grafik сначала вычисляет максимальное (у2) и минимальное значение функции на отрезке [xl,Затем, используя информацию о ши
рине и высоте области вывода графика, она вычисляет коэффициенты масштабирования по осям X и Y. После этого вычисляет координату Y горизонтальной оси, координату X вертикальной оси и вычерчивает координатные оси. Затем выполняется непосредственное построение графика (рис. 3.8).
Рис. 3.8.построенный поточкам
ВЫЗОВ фуНКЦИИ Grafik ВЫПОЛНЯЮТ фуНКЦИИ обработкиOnPaint И
OnResize. Функцияобеспечивает вычерчивание графика
после появления формы на экране в результате запуска программы, а также после появления формы во время работы программы — например, в результате удаления или перемещения других окон, полностью или частично перекрывающих окно программы. Функция TFoml: : FormResize обеспечивает вычерчивание графика после изменения размера формы.
Приведенная программа универсальна. Заменив инструкции в теле функции f (x), можно получить график другой функции. Причем независимо от вида функции ее график будет занимать всю область, предназначенную для вывода. Следует обратить внимание на то, что приведенная программа работает корректно, если функция, график которой надо построить, принимает как положительные, так и отрицательные значения. Если функция во всем диапазоне только положительная или только отрицательная, то в программу необходимо внести изменения. Какие — пусть это будет упражнением для читателя.
Иллюстрации
Наиболее просто вывести иллюстрацию, которая находится в файле с расширением bmp, jpg или ico, можно при помощи компонента image, значок которого находится на вкладке Additional палитры компонентов (рис. 3.9). Основные свойства компонента приведены в табл. 3.5.
:Additional |
L$ qj U冋嘎/ T白■圜IB + n >农明蹴篇,
Image
Рис. 3.9. Значок компонента Image
Таблица 3.5. Свойства компонента image
Свойство
Описание
Picture
Иллюстрация, которая отображается в поле компонента
Width, Height
Размер компонента. Если размер компонента меньше размера иллюстрации и значение свойств AutoSize, Strech и
Proportional равно false, то отображается часть иллюстрации
Proportional
Признак автоматического масштабирования картинки без искажения. Чтобы масштабирование было выполнено, значение свойства AutoSize ДОЛЖНО быть false
Strech
Признак автоматического масштабирования (сжатия или растяжения) иллюстрации в соответствии с реальным размером компонента. Если размер компонента не пропорционален размеру иллюстрации, то иллюстрация будет искажена
Таблица 3.5 (окончание)
Свойство
Описание
AutoSize
Признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации
Center
Признак определяет расположение картинки в поле компонента по горизонтали, если ширина картинки меньше ширины поля компонента. Если значение свойства равно false, то картинка прижата к правой границе компонента, если true — то картинка располагается по центру
visible
Признак указывает, отображается ли компонент и, соответственно, иллюстрация на поверхности формы
Canvas
Поверхность, на которую можно вывести графику
Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.
Во время разработки формы иллюстрация задается установкой значения свойства Picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое становится доступным в результате щелчка на командной кнопке Load окна Picture Editor, которое, в свою очередь, появляется в результате щелчка на кнопке с тремя точками в строке свойства Picture (рис. 3.10).
Если размер иллюстрации больше размера компонента, то свойству Proportional нужно присвоить значение true. Тогда будет выполнено масштабирование иллюстрации в соответствии с реальными размерами компонента.
Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству picture, указав в качестве параметра метода файл иллюстрации. Например, инструкция
Imagel->Picture->LoadFromFile(не:\\temp \\ba rt.bmp n)
загружает иллюстрацию из файла bart.bmp и выводит ее в поле компонента вывода иллюстрации (Imagel).
По умолчанию компонент image можно использовать для отображения иллюстраций форматов BMP, ICO и WMF. Чтобы использовать компонент для отображения иллюстраций в формате JPEG (файлы с расширением jpg), надо подключить соответствующую библиотеку (поместить в текст программы директиву ttinciude <jpeg.hpp>). Обратите внимание, что если указанной директивы в тексте программы не будет, то компилятор не выведет сообщения об ошибке. Но во время работы программы при попытке загру-
зить jpg-файл при помощизить jpg-файл при помощиметода LoadFroitiFile возникнет ошибка — ис-метода LoadFroitiFile возникнет ошибка — ис-ключение EInvalidGraphic.ключение EInvalidGraphic.UbiecQ MipeclotUbiecQ MipeclotQlmagelProperties j Everts |Enabled true刊 I;Height;[U5HelpContext -2HelpKeywordHelpType I htContext HintI lncrementaff)isifalseLeft.J72Name ;Imagel r—PaemShuwHiiitfue —,Picture! PopupMenu.К;Proportional lakejI Stretch :fafseTag0г Top ;;'i48j Transparent ,false J(Ali shownQlmagelProperties j Everts |Enabled true刊 I;Height;[U5HelpContext -2HelpKeywordHelpType I htContext HintI lncrementaff)isifalseLeft.J72Name ;Imagel r—PaemShuwHiiitfue —,Picture! PopupMenu.К;Proportional lakejI Stretch :fafseTag0г Top ;;'i48j Transparent ,false J(Ali shownРис. 3.10. Чтобы выбрать иллюстрацию, щелкните в строке Picture на кнопке с тремя точками,затем в окне Picture Editor — на кнопке LoadРис. 3.10. Чтобы выбрать иллюстрацию, щелкните в строке Picture на кнопке с тремя точками,затем в окне Picture Editor — на кнопке LoadРис. 3.11. Диалоговое окно программы Просмотр иллюстрацийРис. 3.11. Диалоговое окно программы Просмотр иллюстраций
зить jpg-файл при помощи
зить jpg-файл при помощи
метода LoadFroitiFile возникнет ошибка — ис-
метода LoadFroitiFile возникнет ошибка — ис-
ключение EInvalidGraphic.
ключение EInvalidGraphic.
UbiecQ Mipeclot
UbiecQ Mipeclot
Qlmagel
Properties j Everts |
Enabled true刊 I
;Height;[U5
HelpContext -2
HelpKeyword
HelpType I htContext Hint
I lncrementaff)isifalse
Left.J72
Name ;Imagel r—PaemShuwHiiitfue —,
Picture
! PopupMenu.К
;Proportional lake
j
I Stretch :fafse
Tag0
г Top ;;'i48
j Transparent ,false J
(Ali shown
Qlmagel
Properties j Everts |
Enabled true刊 I
;Height;[U5
HelpContext -2
HelpKeyword
HelpType I htContext Hint
I lncrementaff)isifalse
Left.J72
Name ;Imagel r—PaemShuwHiiitfue —,
Picture
! PopupMenu.К
;Proportional lake
j
I Stretch :fafse
Tag0
г Top ;;'i48
j Transparent ,false J
(Ali shown
Рис. 3.10. Чтобы выбрать иллюстрацию, щелкните в строке Picture на кнопке с тремя точками,затем в окне Picture Editor — на кнопке Load
Рис. 3.10. Чтобы выбрать иллюстрацию, щелкните в строке Picture на кнопке с тремя точками,затем в окне Picture Editor — на кнопке Load
Рис. 3.11. Диалоговое окно программы Просмотр иллюстраций
Рис. 3.11. Диалоговое окно программы Просмотр иллюстраций
Следующая программа (вид ее окна приведен на рис. 3.11, а текст — в листинге 3.2) использует компонент image для отображения JPG-иллюстраций.
Кнопка Каталог, в результате щелчка на которой появляется стандартное диалоговое окно Выбор папки, позволяет пользователю выбрать каталог, в котором находятся иллюстрации. Кнопка Дальше обеспечивает отображение следующей иллюстрации.
! Листинг 3.2. Просмотр иллюстраций
#include <jpeg.hpp>// обеспечивает работу с JPEG-иллюстрациями
#include <FileCtrl .hpp> // для доступа к функции SelectDirectory
AnsiString aPath;// каталог, в котором находится иллюстрация
TSearchRec aSearchRec; // результат поиска файла
void fastcall TForml: : FormCreate (TObject *Sender) {
aPath =// текущий каталог — каталог, из которого
// запущена программа
Imagel->AutoSize = false;
Imagel->Proportional = true;
Button2->Enabled = false;
FirstPicture (); // показать картинку, которая / / есть в каталоге программы }
/ / щелчок на кнопке Каталог
void _fastcall TFoml: :ButtonlClick (TObject * Sender) { if (SelectDirectory(
"Выберите каталог, в котором находятся иллюстрации", ”",aPath) != 0)
<
// пользователь выбрал каталог и щелкнул на кнопке OK aPath = aPath + ”\\,
FirstPicture();// вывести иллюстрацию
// найти и вывести первую картинку
voidTForml: : FirstPicture()
{
Imagel->Visible = false;// скрыть компонент Ima gel
Bu.tton2- >Enabled = false;// кнопка Дальше недоступна
Labell->Caption =
if ( FindFirst (aPath+ ”*.jpg", faAnyFile, aSearchRec) == 0)
Imagel->Picture->LoadFromFile(a Path+aSearchRec.Name);
Imagel->Visible = true;
Labell->Caption = aSearchRec.Name;
if ( FindNext(aSearchRec) == 0)// найти след. иллюстрацию
{
/ / иллюстрация есть
Button2->Enabled = true; // теперь кнопка Дальше доступна
/ / щелчок на кнопке Дальше
void _ fastcall TForml: :Button2Click (TObject * Sender)
{
Imagel->Picture~>Load.FromFile (aPath+aSearchRec. Name);
Labell->Caption =
if ( FindNext (aSearchRec) != 0)// найти след. иллюстрацию
{
/ / иллюстраций больше нет
Button2->Enabled = false; // теперь кнопка Дальше недоступна }
Загрузку и вывод первой и остальных иллюстраций выполняют соответственно функции FirstPicture И NextPicture.
Функция FirstPicture вызывает функцию FindFirst для того, чтобы получить имя файла первой иллюстрации. В качестве параметров функции FindFirst передаются:
имя каталога, в котором должны находиться иллюстрации;
структура aSearchRec, поле Name которой, в случае успеха, будет содержать имя файла, удовлетворяющего критерию поиска;
口маска файла иллюстрации.
Если в указанном при вызове функции FindFirst каталоге есть хотя бы один файл с указанным расширением, то значение функции будет равно нулю. В этом случае метод LoadFromFile загружает файл иллюстрации. После загрузки первой иллюстрации функция FirstPicture вызывает функцию FindNext для поиска следующего файла иллюстрации. Если файл будет найден, то кнопка Дальше будет сделана доступной.
Функция обработки события Onclick на кнопке Дальше загружает следующую иллюстрацию, имя файла которой было найдено функцией FindNext в процессе обработки предыдущего щелчка на кнопке Дальше, и снова вы-
зывает функцию FindNext для поиска следующей иллюстрации. Если файл иллюстрации не будет найден, то кнопка Дальше станет недоступной.
Необходимо обратить внимание на следующее. Для того чтобы иллюстрации отображались без искажения, свойству AutoSize компонента Image 1 надо присвоить значение false, а свойству Proportional — значение true. Сделать это можно во время создания формы в среде разработки (установить значения свойств в окне Object Inspector) или возложить задачу настройки компонента на саму программу. В последнем случае в функцию обработки события OnCreate ДЛЯ формы (TForml: :Добавить
следующие инструкции:
Imagel->AutoSize = false;
Imagel->Proportional = true;
Кроме того, во время создания формы свойству Enabled кнопки Дальше (Button2) надо присвоить значение false. Это обеспечит корректную работу программы в том случае, если в каталоге, из которого запускается программа, нет иллюстраций. Настройку кнопки Button2 можно возложить на ФУНКЦИЮ TForml: : FormCreate. ДЛЯ ЭТОГО В фунКЦИЮ надо ДобаВИТЬ one- ратор
Button2->Enabled = false
Битовые образы
Для формирования сложных изображений используют битовые образы. Битовый образ — это, как правило, небольшая картинка, которая находится в памяти компьютера.
Сформировать битовый образ можно путем загрузки из bmp-файла или из ресурса, а также путем копирования фрагмента из другого битового образа, в том числе и с поверхности формы.
Картинку битового образа (иногда говорят просто "битовый образ") можно подготовить при помощи графического редактора или, если предполагается, что битовый образ будет загружен из ресурса программы, — при помощи редактора ресурсов (например, Borland Resource Workshop). В последнем случае надо создать файл ресурсов и поместить в него битовый образ. Файл ресурсов можно создать и при помощи утилиты Image Editor.
В программе битовый образ — это объект типа TBitmap. Некоторые свойства объекта TBitmap приведены в табл. 3.6.
Загрузку картинки из файла обеспечивает метод LoadFromFile, которому в качестве параметра передается имя bmp-файла. Например, следующий фрагмент кода обеспечивает создание и загрузку битового образа из файла.
Graphics::TBitmap *Plane = new Graphics::TBitmap();
Plane->LoadFromFile("plane.1amp");
В результате выполнения приведенного выше фрагмента, битовый образ Plane представляет собой изображение самолета (предполагается, что в файле plane.bmp находится изображение самолета).
Таблица 3.6. Свойства объекта TBitmap
Свойство
Описание
Height, Width
Размер (ширина, высота) битового образа. Значения свойств соответствуют размеру загруженной из файла (метод LoadFromFile) ИЛИ ресурса (метод LoadFromResourcelD ИЛИ LoadFromResourceName) картинки
Empty
Признак того, что картинка в битовый образ не загружена (true)
Transparent
Устанавливает (true) режим использования "прозрачного" цвета. При выводе битового образа методом Draw элементы картинки, цвет которых совпадает с цветом TransparentColor, не выводится. По умолчанию значение TransparentColor определяет цвет левого нижнего пиксела
TransparentColor
Задает прозрачный цвет. Элементы картинки, окрашенные этим цветом, методом Draw не выводятся
Canvas
Поверхность битового образа, на которой можно рисовать точно так же, как на поверхности формы или компонента image
После того как
битовый образ сформирован (загружен из файла или из ре-
сурса), его можно вывести, например, на поверхность формы или компонента Image. Сделать ЭТО МОЖНО, Применив метод Draw К СВОЙСТВУ Canvas.
В качестве параметров методу Draw надо передать координаты точки, от которой будет выведен битовый образ. Например, оператор
Canvas->Draw(10z 20,Plane);
выводит на поверхность формы битовый образ Plane — изображение самолета.
Если перед применением метода Draw свойству Transparent битового образа присвоить значение true, то фрагменты рисунка, цвет которых совпадает с цветом левой нижней точки рисунка, не будут выведены. Такой прием используется для создания эффекта прозрачного фона. "Прозрачный" цвет можно задать и принудительно, присвоив соответствующее значение свойству TransparentColor.
Следующая программа демонстрирует работу с битовыми образами. После запуска программы в ее окне появляется изображение неба и двух самоле-
тов (рис. 3.12). И небо, и самолеты — это битовые образы, загруженные из файлов во время работы программы. Загрузку и вывод битовых образов на поверхность формы выполняет функция обработки события OnPaint, текст которой приведен в листинге 3.3. Белое поле вокруг левого самолета показывает истинный размер битового образа Plane. Белого поля вокруг правого самолета нет, т. к. перед тем как вывести битовый образ второй раз, свойству Transparent было присвоено значение true.
Рис. 3.12. Присвоив свойству Transparent значение true, можно скрыть фон
Листинг 3.3. Загрузка и вывод битовых образов на поверхность формы
voidfastcall TForml::FormPaint(TObject *Sender)
{ // битовые образы: небо и самолет Graphics::TBitmap *sky = new Graphics::TBitmap(); Graphics::TBitmap *plane = new Graphics::TBitmap();
sky->LoadFromFile("sky.bmp");
plane->LoadFromFile("plane.bmp”);
Canvas - >Dr av; (0z 0, sky);// фон — небо
Canvas->Draw(20,20,plane); // левый самолет
plane->Transparent = true; /* теперь элементы рисунка, цвет которых совпадает с цветом левой нижней точки битового образа^ не отображаются */
Canvas->Draw(120,20,plane); // правый самолет
// уничтожить объекты sky->Graph.ics:: -TBitmap (); plane->Graphics::^TBitmap();
Небольшие по размеру битовые образы часто используют при формировании фоновых рисунков по принципу кафельной плитки (рис. 3.13).
Рис. 3.13. Фоновый рисунок и битовый образ-плитка, из которого он составлен
Следующая программа показывает, как можно получить фоновый рисунок путем многократного вывода битового образа на поверхность формы. Формирование фонового рисунка, многократный вывод битового образа на поверхность формы выполняет функция Background. Ее объявление (прототип), а также объявление битового образа (объекта типа TBitmap) надо поместить в секцию private объявления класса формы (листинг 3.4), которая находится в заголовочном файле. Создание битового образа и загрузку картинки из файла выполняет функция обработки события OnCreate. Функция обработки события OnPaint путем вызова функции Background обеспечивает вывод фонового рисунка на поверхность формы (листинг 3.5).
[Листинг 3.4. Объявление битового образа и функции Background
class TForml : public TForm
_published:
voidfastcall FormCreate(TObject *Sender);
void fastcall FormPaint(TObject *Sender);
void fastcall FormResize(TObject *Sender);
private:
Graphics::TBitmap *back; // элемент фонового рисунка voidfastcall Background(); // формирует фоновый рисунок на
// поверхности формы
public:
fastcall TForml(TComponent* Owner);
);
Листинг 3.5. Функции, обеспечивающие формирование
1 и вывод фонового рисунка
// обработка события OnCreate _
{
back = new Graphics: :TBitmap(); // создать объект — битовый образ
// загрузить картинку
try // в процессе загрузки картинки возможны ошибки {
Forml->back->LoadFromFile ("Legal.bmp'*);
}
catch (EFOpenError &e)
{
return;
// формирует фоновый рисунок
void fastcall TForml: : Background () {
int x=0,y=0; // координаты левого верхнего угла битового образа
if ( back->Empty) // битовый образ не был загружен return;
do {
do {
Canvas->Draw(xr у,back);
x += back->Width;*
}
while (x < Clientwidth);
x = 0;
у += back->Height;
}
while (y < ClientHeight);
}
// обработка события■ OnPaint
void _ fastcall TForml: : FormPaint (TObject * Sender)
{
Background(); // обновить фоновый рисунок
Мультипликация
Под мультипликацией обычно понимается движущийся и меняющийся рисунок. В простейшем случае рисунок может только двигаться или только меняться.
Обеспечить перемещение рисунка довольно просто: надо сначала вывести рисунок на экран, затем через некоторое время стереть его и снова вывести этот же рисунок, но уже на некотором расстоянии от его первоначального положения. Подбором времени между выводом и удалением рисунка, а также расстояния между старым и новым положением рисунка (шага перемещения), можно добиться того, что у наблюдателя будет складываться впечатление, что рисунок равномерно движется по экрану.
Метод базовой точки
Следующая простая программа показывает, как можно заставить двигаться изображение, сформированное из графических примитивов. Окно и форма программы приведены на рис. 3.14.
Рис. 3.14. Окно и форма программыРис. 3.14. Окно и форма программы
Рис. 3.14. Окно и форма программы
Рис. 3.14. Окно и форма программы
На поверхности формы находится один-единственный компонент Timer, который используется для генерации последовательности событий, функция обработки которых обеспечивает вывод и удаление рисунка. Значок компонента Timer находится на вкладке System (рис. 3.15). Следует обратить внимание, что компонент Timer является невизуальным. Это значит, что во время работы программы компонент в диалоговом окне не отображается. Поэтому компонент Timer можно поместить в любую точку формы. Свойства компонента Timer приведены в табл. 3.7.
TimerTimerРис. 3.15. Значок компонента TimerРис. 3.15. Значок компонента Timer
Timer
Timer
Рис. 3.15. Значок компонента Timer
Рис. 3.15. Значок компонента Timer
Таблица 3.7. Свойства компонента Timer
Свойство
Определяет
Name
Имя компонента. Используется для доступа к свойствам компонента
Interval
Период возникновения события OnTimer. Задается в миллисекундах
Enabled
Разрешение работы. Разрешает (значение true) или запрещает (значение false) возникновение события OnTimer
Компонент Timer генерирует событие OnTimer. Период возникновения события OnTimer измеряется в миллисекундах и определяется значением свойства interval. Следует обратить внимание на свойство Enabled. Оно дает возможность программе "запустить" или "остановить" таймер. Если значение свойства Enabled равно false, то событие OnTimer не возникает.
В рассматриваемой программе вывод изображения выполняет функция ship, которая рисует на поверхности формы кораблик. В качестве параметров функция ship получает координаты базовой тонки. Базовая точка (^,Jo) определяет положение графического объекта в целом; от нее отсчитываются координаты графических примитивов, образующих объект (рис. 3.16). Координаты фафических примитивов можно отсчитывать от базовой точки не в пикселах, а в относительных единицах. Такой подход позволяет легко выполнить масштабирование изображения.
Рис. 3.16. Базовая точка (Хо, Уо) определяет положение объекта
Перед тем как нарисовать кораблик на новом месте, функция обработки события от таймера стирает кораблик, нарисованный в процессе обработки предыдущего события OnT inter. Изображение кораблика стирается путем вы- водапрямоугольника, перекрывающегоего.
ФУНКЦИИ Обработки события OnTimer, фуНКЦИЯ Ship И фуНКЦИЯ FormCreate, обеспечивающая настройку таймера, приведены в листинге 3.6
Листинг 3.6. Простая мультипликация
int х = -68, у = 50; // начальное положение базовой точки
рисует на поверхности формы кораблик
voidfastcall TForml::Ship(int x, int y)
{
int dx=4, dy=4; // шаг сетки
/ / корпус и надстройку будем рисовать
/ / при помощи метода Polygon
TPoint pl⑺; // координаты точек корпуса
TPoint p2[8]; // координаты точек надстройки
TColor pc,be; // текущий цвет карандаша и кисти
// сохраним текущий цвет карандаша и кисти рс = Canvas->Pen->Color;
Ьс =
// установим нужный цвет карандаша и кисти Canvas->Pen->Color =
Canvas->Brush->Color =
/ / рисуем . . .
/ / корпус
pl[0] .x = x;pl[0].y = y;
pl[l] .X = x;pi[i].y =
pl ⑵.X ==
pl[3].x ==
pl⑷・x =
pl[5].x =
pl[6].x = x;pl[6].y =y;
Canvas->Polygon(pl,6);
// надстройка
p2[0].x = x+3*dx; p2[0] .y =
p2[l].x = x+4*dx; p2[1].у =
p2⑵・x ==
p2[3] . x ==
p2[4] .x ==
p2[5].x ==
p2[6].x ==
p2[7] .x ==
Canvas->Polygon(p2r 7);
Canvas->MoveTo(x+5*dxz y-3*dy);
Canvas->LineTo(x+9*dx,y-3*dy);
// капитанский мостик
Canvas->Rectangle (x+8*dx,y-4*dy^x+ll*dx, y-5*dy);
/ / труба
Canvas->Rectangle (x+7*dx,y-4*dy, x+8*dx, y-7*dy);
// иллюминаторы
Canvas->E11 ipse (x+ll*dxf y-2*dy<x+12*dx<y-l*dy);
Canvas->Ellipse (x+13*dx, y-2*dyz x+14*dx, y-l*dy);
// мачта
Canvas - >Mo veTo (x+10*dx, y-5*dy) ;
Canvas - >LineTo (x+10*dx,y-10*dy);
// оснастка
Canvas->Pen->Color = clWhite;
Canvas->MoveTo(x+17*dxz y-3*dy);
Canvas->LineTo (x+10*dx,y-10*dy);
Canvas->LineTo (x,y-2*dy);
// восстановим цвет карандаша и кисти
Canvas->Pen->Color =
Canvas->Brush->Color =
// обработка события OnTimer
void _ fastcall TForml: :TimerlTimer (TObject *Sender)
{
// стереть кораблик — закрасить цветом^ совпадающим
// с цветом фона (формы)
Canvas->Brush->Color =
Canvas->FillRect(Rect(x~l,y+l,x+68,y-40));
// вычислить координаты базовой точки x+=3;
if (x > ClientWidth) {
// кораблик "уплыл" за правую границу формы
х= -70; // чтобы кораблик "выплывал" из-за левой границы формы y=random(Forml->ClientHeight);
}
// нарисовать кораблик на новом месте Ship (х, у)
}
// обработка события OnCreate для формы
voidfastcall TForml::FormCreate(TObject *Sender)
{
/* Таймер можно настроить во время разработки программы
(в процессе создания формы) или so время работы программы. * /
/ / настройка и запуск таймера Timerl->Interval = 100; // период события OnTimer -0.1 сек.
Timerl->Enabled = true; // пуск таймера
}
Использование битовых образов
В последнем примере изображение формировалось из графических примитивов. Теперь рассмотрим, как можно реализовать перемещение заранее подготовленного при помощи графического редактора изображения.
Как и в предшествующей программе, эффект перемещения объекта (картинки) достигается за счет периодической перерисовки картинки с некоторым смещением относительно ее прежнего положения. Перед выводом картинки в новой точке предыдущее изображение должно быть удалено, а фоновый рисунок, который был перекрыт — восстановлен. Удалить (стереть) картинку и одновременно восстановить фон можно путем перерисовки всей фоновой картинки или только той ее части, которая была перекрыта объектом. В рассматриваемой программе используется второй подход. Изображение объекта выводится применением метода Draw к свойству canvas формы, а стирается путем копирования (метод copyRect) нужной части фона из буфера в битовый образ, соответствующий поверхности формы.
Форма программы приведена на рис. 3.17, а текст — в листинге 3.6. Компонент Timer используется для организации цикла удаления и вывода изобра-
жения самолета.
Рис. 3.17. Форма программы "Полет над городом
! Листинг 3.7.городом"
voidfastcall
// загрузить фоновый рисунок из
back = new
back->LoadFromFile("factory.bmp");
// установить размер клиентской (рабочей) области формы
// в соответствии с размером фонового рисунка
=
ClientHeight =
// загрузить картинку
sprite = new
sprite->LoadFromFile ("aplane. bmp**);
true;
// исходное положение самолета
x=-2。; // чтобы самолет 'вылетал" из-за левой границы окна У=20;
fastcall*Sender)
{ // фон
// рисунок
}
voidfastcall*Sender)
{
TRect// положение и размер области
// которую надо восстановить
badRect = Rect (xf y,x+sprite->Wicith, y+sprite->Height);
// стереть самолет (восстановить "испорченный,r фон)
Canvas->CopyRect (badRect,back->Canvas, badRect);
// вычислим новые координаты спрайта (картинки) х +=2;
if (х > Clientwidth)
{
// самолет улетел за правую границу формы
// изменим высоту и скорость полета
х = -20;
у = random (ClientHeight — 30); // высота полета"
// скорость полета определяется периодом возникновения
// события On Time r^ который, в свою очередь, зависит
// от значения свойства Interval
Timerl->Interval =+ 10; // скорость "полета" меняется
// от 10 до 29
}
Canvas->Draw(x,у, sprite);
Для хранения битовых образов (картинок) фона и самолета используются два объекта ТИПа TBitmap, Которые создает функция TForml: : (объявления этих объектов надо поместить в заголовочный файл проекта). Эта же функция загружает из файлов картинки фона (factory.bmp) и самолета (aplane.bmp).
Восстановление фона выполняется при помощи метода CopyRect, который позволяет выполнить копирование прямоугольного фрагмента одного битового образа в другой. Объект, к которому применяется метод CopyRect, является приемником копии битового образа. В качестве параметров методу передаются: координаты и размер области, куда должно быть выполнено копирование; поверхность, с которой должно быть выполнено копирование; положение и размер копируемой области. Информация о положении и размере восстанавливаемой (копируемой на поверхность формы) области фона находится в структуре badRect типа TRect.
Следует обратить внимание на то, что начальное значение переменной х, которая определяет положение левой верхней точки битового образа (движущейся картинки) — отрицательное число, равное ширине битового образа картинки. Поэтому в начале работы программы самолет не виден и картинка отрисовывается за границей видимой области. С каждым событием OnTimer значение координаты х увеличивается и на экране появляется та часть битового образа, координаты которой больше нуля. Таким образом,
94 Часть II. Практикум про匚раммированм, у наблюдателя создается впечатление, что самолет вылетает из-за левой границы окна.
Загрузка битового образа из ресурса программы
В программе "Полет над городом" (листинг 3.7) картинки (битовые образы: фона и объекта (самолета) загружаются из файлов. Такой подход не всегда удобен. C++ Builder позволяет поместить нужные битовые образы в исполняемый файл программы и по мере необходимости загружать их непосредственно оттуда.
Битовый образ, находящийся в выполняемом файле программы, называется ресурсом, а операция загрузки битового образа из выполняемого файла - загрузкой битового образа из ресурса.
Для того чтобы воспользоваться возможностью загрузки картинки из ресурса, сначала надо создать файл ресурсов и поместить в него нужные картинки.
Создание файла ресурсов
Файл ресурсов можно создать при помощи утилиты Image Editor, которая поставляется вместе с C++ Builder. Запустить Image Editor можно из C++ Builder, выбрав в меню Tools команду Image Editor, или из Windows, выбрав команду Пуск | Программы | Borland C++Builder | Image Editor.
Для того чтобы создать файл ресурсов, надо в меню File выбрать команду New, а затем в появившемся подменю — команду Resource File (рис. 3.18). В результате выполнения команды будет создан файл ресурсов Untitledl.res
(рис. 3.19), в который надо поместить необходимые ресурсы.
File Window HelpFile Window Help也Image Editor也Image EditorI New...I New...Resource File ( res)Resource File ( res)Component Resource File (.dcr)Bitmap File (.bmp)Icon File (.ico)Cursor File (, cur)Component Resource File (.dcr)Bitmap File (.bmp)Icon File (.ico)Cursor File (, cur)Open... Ctrl+OOpen... Ctrl+OCreate a new resourceFileCreate a new resourceFileРис. 3.18. Чтобы создать файл ресурсов, выберите команду File | New | Resource FileРис. 3.18. Чтобы создать файл ресурсов, выберите команду File | New | Resource File
File Window Help
File Window Help
也Image Editor
也Image Editor
I New...
I New...
Resource File ( res)
Resource File ( res)
Component Resource File (.dcr)
Bitmap File (.bmp)
Icon File (.ico)
Cursor File (, cur)
Component Resource File (.dcr)
Bitmap File (.bmp)
Icon File (.ico)
Cursor File (, cur)
Open... Ctrl+O
Open... Ctrl+O
Create a new resourceFile
Create a new resourceFile
Рис. 3.18. Чтобы создать файл ресурсов, выберите команду File | New | Resource File
Рис. 3.18. Чтобы создать файл ресурсов, выберите команду File | New | Resource File
Рис. 3.19. Файл ресурсов создан. Теперь в него надо поместить необходимые ресурсыРис. 3.19. Файл ресурсов создан. Теперь в него надо поместить необходимые ресурсыFilea^^ й^ z Doo ■Filea^^ й^ z Doo ■
Рис. 3.19. Файл ресурсов создан. Теперь в него надо поместить необходимые ресурсы
Рис. 3.19. Файл ресурсов создан. Теперь в него надо поместить необходимые ресурсы
Filea^^ й^ z Doo ■
Filea^^ й^ z Doo ■
Для того чтобы в файл ресурсов добавить новый ресурс, надо в меню Resource выбрать команду New | Bitmap (Новый битовый образ). В результате выполнения этой команды открывается диалоговое окно Bitmap Properties (Характеристики битового образа), в котором нужно установить размер (в пикселах) битового образа и выбрать палитру (рис. 3.20). В результате нажатия кнопкив списке Contents появится новый элемент
соответствующий новому ресурсу, добавленному в файл ресурсов (рис. 3.21).
Рис. 3.20. В диалоговом окнеBitmap Properties надо задать характеристики создаваемого битового образаРис. 3.20. В диалоговом окнеBitmap Properties надо задать характеристики создаваемого битового образаРис.Окно файла ресурсовпосле добавления ресурса BitmapРис.Окно файла ресурсовпосле добавления ресурса Bitmap
Рис. 3.20. В диалоговом окне
Bitmap Properties надо задать характеристики создаваемого битового образа
Рис. 3.20. В диалоговом окне
Bitmap Properties надо задать характеристики создаваемого битового образа
Рис.Окно файла ресурсов
после добавления ресурса Bitmap
Рис.Окно файла ресурсов
после добавления ресурса Bitmap
— это автоматически созданное имя ресурса, которое можно изменить, выбрав команду Resource | Rename. После этого можно приступить к редактированию (созданию) битового образа. Для этого надо в меню Resource выбрать команду Edit. В результате этих действий будет активизирован режим редактирования битового образа.
Графический редактор Image Editor предоставляет программисту стандартный для подобных редакторов набор инструментов, используя которые можно нарисовать нужную картинку. Если во время работы надо изменить масштаб отображения картинки, то для увеличения масштаба следует выбрать команду View | Zoom In, а для уменьшения ^^^м* команду View | Zoom Out. Увидеть картинку в реальном масштабе можно, выбрав команду View | Actual Size.
В качестве примера на рис. 3.22 приведен вид диалогового окна Image Editor, в котором находится файл ресурсов images.res для программы Flight. Файл содержит два битовых образа FACTORY и APLANE.
Рис. 3.22. Файл ресурсов images.res содержит два битовых образа
Если нужная картинка уже существует в виде отдельного файла, то ее можно через буфер обмена (Clipboard) поместить в битовый образ файла ресурсов. Делается это следующим образом.
Сначала надо запустить графический редактор, например Microsoft Paint, загрузить в него файл картинки и выделить всю картинку или ее часть. В процессе выделения следует обратить внимание на информацию о размере (в пикселах) выделенной области (Paint выводит размер выделяемой области в строке состояния). Затем, выбрав команду Копировать меню Правка, необходимо поместить копию выделенного фрагмента в буфер.
Далее нужно переключиться в Image Editor, выбрать ресурс, в который надо поместить находящуюся в буфере картинку, и установить значения
характеристик ресурса в соответствии с характеристиками картинки, находящейся в буфере. Значения характеристик ресурса вводятся в поля диалогового окна Bitmap Properties, которое открывается выбором команды Image Properties меню Bitmap. После установки характеристик ресурса можно вставить картинку в ресурс, выбрав команду Past меню Edit.
После добавления всех нужных ресурсов файл ресурса следует сохранить в том каталоге, где находится программа, для которой этот файл создается. Сохраняется файл ресурса обычным образом, т. е. выбором команды Save меню File. Image Editor присваивает файлу ресурсов расширение res.
Подключение файла ресурсов
Для того чтобы ресурсы, находящиеся в файле ресурсов, были доступны программе, в текст профаммы надо поместить инструкцию (директиву), которая сообщит компилятору, что в исполняемый файл следует добавить содержимое файла ресурсов.
В общем виде эта директива выглядит следующим образом:
ipragma resource ФайлРесурсов
где ФайлРесурсов — имя файла ресурсов.
Например, для профаммы flight_l директива, обеспечивающая включение содержимого файла ресурсов в выполняемый файл, выглядит так:
#pragma resource "images.res"
Загрузить битовый образ из ресурса можно при помощи метода LoadFromResourceName, который имеет два параметра: идентификатор программы и имя ресурса. В качестве идентификатора профаммы используется глобальная переменная HInstance. Имя ресурса должно быть представлено в виде строковой константы.
Например, в профамме flight_l инструкция зафузки фона из ресурса выглядит так:
back->LoadFromResourceName ( (int) HInstance, "FACTORY");
В качестве примера в листинге 3.8 приведен фрагмент профаммы - функция TForml: : FormCreate, которая обеспечивает загрузку битовых образов из ресурсов.
| Листинг 3.8. Загрузка битовых образов из ресурса
// подключить файл ресурсов/ в котором находятся // необходимые программе битовые образы
#pragma resource '*images. res"
4 Зак. 1252
voidfastcall TForml:: FormCreate (TObject *Sender)
{
// загрузить фоновый рисунок из ресурса
back = new Graphics::TBitmap();
back->LoadFromResourceName ((int)HInstance, "FACTORY*');
// установить размер клиентской (рабочей) области формы
/ /в соответствии с размером фонового рисунка
Clientwidth =
ClientHeight = back->Height;
// загрузить изображение объекта из ресурса
sprite = new Graphics::TBitmap();
sprite->LoadFromResourceName((int)HInstance,"APLANE"); sprite->Transparent = true;
// исходное положение самолета
x=-20; // чтобы самолет "вылетал" из-за левой границы окна y=20;
}
Преимущества загрузки картинок из ресурса программы очевидны: при распространении программы не надо заботиться о том, чтобы во время работы программы были доступны файлы иллюстраций, т. к. все необходимые программе картинки находятся в исполняемом файле.
Теперь рассмотрим, как можно реализовать в диалоговом окне программы вывод баннера, представляющего собой последовательность сменяющих друг друга картинок (кадров). Кадры баннера обычно находятся в одном файле или в одном ресурсе. В начале работы программы они загружаются в буфер (объект типа TBitmap). Вывод кадров баннера обычно выполняет функция обработки сигнала от таймера (события OnTimer), которая выделяет очередной кадр и выводит его на поверхность формы.
Вывести кадр баннера (фрагмент битового образа) на поверхность формы можно при помощи метода copyRect, который копирует прямоугольную область одной графической поверхности на другую.
Инструкция применения метода copyRect в общем виде выглядит так:
Canvasl->CopyRect{Область!f Canvas2, Область2)
где:
口 Canvasl — поверхность, на которую выполняется копирование;
口 Canvas2 — поверхность, с которой выполняется копирование;
□ Область! — структура типа TRect, которая задает положение и размер области, куда выполняется копирование (приемник);
口 Область? — структура типа TRect, которая задает положение и размер области, откуда выполняется копирование (источник).
Определить прямоугольную область, заполнить поля структуры TRect можно при помощи функции Rect или Bounds. Функции Rect надо передать в качестве параметров координаты левого верхнего и правого нижнего углов области, функции Bounds — координаты левого верхнего угла и размер области. Например, если надо определить прямоугольную область, то это можно сделать так: ret =
или так:
ret =
где xl, yl — координаты левого верхнего угла области; х2, у2 — координаты правого нижнего угла области; w и h — ширина и высота области.
Следующая программа (ее текст приведен в листинге 3.9) выводит в диалоговое окно баннер — рекламное сообщение. На рис. 3.23 приведены кадры этого баннера (содержимое файла baner.bmp), а на рис. 3.24 — диалоговое окно. Форма программы содержит один-единственный компонент — таймер.
Рис. 3.24. Воспроизведение баннера в окне программы
Листинг 3.9. Баннер (baner.h, baner_.cpp)
// baner.h
class TForml : public TForm
{
—Published:
TTimer *Timerl;
void _ fastcall FormC teate (TObject * Sender);
void _fastcall Timer lTimer (TObject * Sender );
private:
Graphics: : TBitmap *baner; // баннер
TRect kadr;
//
кадр баннера
TRect scr;
//
область воспроизведения баннера
int w, h;
//
размер кадра
int c;
//
номер воспроизводимого кадра
public:
_ fastcall TForml (TComponent* Owner); };
// baner_. cpp
#define FBANER "borland.bmp" // баннер
#define NKADR 4 // количество кадров в баннере
void _ fastcall TFoml : : FormCreate (TObject * Sender) {
baner = new Graphics : :TBitmap();
baner->LoadFromFile (FBANER);// загрузить баннер
h = bane r->Height; w = baner->Width / NKADR;
scr=Rect (10,10,10+w, 10+h); // положение и размер области
// воспроизведения баннера
kadr = Rect (0,0, w,h);// положение и размер первого кадра
// в баннере
}
/ / обработка события OnTimer
void _ fastcall TForml: : TimerlTimer (TObject * Sender) {
// вывести кадр баннера
Canvas->CopyRect (scrrbaner~>Canvas,kadr)
// подготовиться к воспроизведению следующего кадра if (с < NKADR)
(
// воспроизводимый в данный момент
/ / кадр — не последний
с++;
kadr. Left += w;
kadr. Right += w;
else
С = 0;
kadr.Left = 0; kadr.Right =
Программа состоит из двух функций. Функция TForml::FormCreate создает объект TBitmap и загружает в него баннер — BMP-файл, в котором находятся кадры баннера. Затем, используя информацию о размере загруженного битового образа, функция устанавливает значения характеристик кадра: высоту и ширину.
Основную работу в программе выполняет функция обработки события OnTimer, которая выделяет из битового образа baner очередной кадр и выводит его на поверхность формы. Выделение кадра и его отрисовку путем копирования фрагмента картинки с одной поверхности на другую выполняет метод copyRect (рис. 3.25), которому в качестве параметров передаются координаты области, куда нужно копировать, поверхность и положение области, откуда нужно копировать. Положение фрагмента в фильме, т. е. координата х левого верхнего угла, определяется умножением ширины кадра на номер текущего кадра.
Рис. 3.25. Метод CopyRect копирует в область Rectl поверхности Canvasl область Rect2 с поверхности Canvas2
ГЛАВА 4
Мультимедиа
Большинство современных программ, работающих в среде Windows, являются мультимедийными. Такие программы обеспечивают просмотр видеороликов и мультипликации, воспроизведение музыки, речи, звуковых эффектов. Типичные примеры мультимедийных программ — игры и обучающие программы.
C++ Builder предоставляет в распоряжение программиста два компонента, которые позволяют разрабатывать мультимедийные программы:
п Animate — обеспечивает вывод простой, не сопровождаемой звуком анимации;
口 MediaPlayer - позволяет решать более сложные задачи, например воспроизводить видеоролики, звук и сопровождаемую звуком анимацию.
Компонент Animate
Компонент Animate, значок которого находится на вкладке Win32 (рис. 4.1), позволяет воспроизводить простую, не сопровождаемую звуком анимацию, кадры которой находятся в AVI-файле.
—Win32 I
叵三二,二/.…k //苗:□区厂一,业) >
Animate
Рис. 4.1. Значок компонента Animate
Компонент Animate добавляется к форме обычным образом. После того как компонент будет добавлен к форме, следует выполнить его настройку -- установить значения свойств. Свойства компонента Animate перечислены в табл. 4.1.
Таблица 4.1. Свойства компонента Animate
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента и для управления его поведением
Fil eName
Имя AVI-файла, в котором находится анимация, отображаемая при помощи компонента
FrameWidth
Ширина кадров анимации
FrameHeight
Высота кадров анимации
FrameCount
Количество кадров анимации
AutoSize
Признак автоматического изменения размера компонента в соответствии с размером кадров анимации
Center
Признак центрирования кадров анимации в поле компонента. Если значение свойства равно true и размер компонента больше размера кадров (AutoSize = false), кадры анимации располагаются в центре поля компонента
StartFrame
Номер кадра, с которого начинается отображение анимации
StopFrame
Номер кадра, на котором заканчивается отображение анимации
Active
Признак активизации процесса отображения анимации
Color
Цвет фона компонента (цвет "экрана"), на котором воспроизводится анимация
Transparent
Режим использования "прозрачного" цвета при отображении анимации
Repetitions
Количество повторов отображения анимации
CommonAVI
Определяет стандартную анимацию Windows (см. табл. 4.2)
Компонент Animate позволяет программисту использовать в своих программах стандартные анимации Windows. Вид анимации определяется значением свойства CommonAVI. Значение свойства задается при помощи именованной константы. В табл. 4.2 приведены некоторые константы, вид анимации и описание процессов, для иллюстрации которых используются эти анимации.
Таблица 4.2. Значение свойства CommonAvi определяет анимацию
Значение
АнимацияПроцесс
aviCopyFiles
留 9Копирование файлов
Таблица 4.2 (окончание)
Значение
Анимация
Процесс
aviDeleteFile
」
Удаление файла
aviRecycleFile
о
6 bqУдаление файла в корзину
Следует еще раз обратить внимание, что компонент Animate предназначен для воспроизведения AVI-файлов, которые содержат только анимацию. При попытке записать в свойство FileName имя файла, в котором находится сопровождаемая звуком анимация, возникает исключение и C++ Builder выводит сообщение об ошибке Cannot open AVI.
Следующая программа (вид ее диалогового окна приведен на рис. 4.2, а текст — в листинге 4.1) демонстрирует использование компонента Animate для просмотра анимации.
RadioButtonlRadioButtonlвв— Button4— Button4Edrt!Edrt!——AnimatelAnimatelButtonlButtonlнепрерывнонепрерывноButton2Button2Button3Button3в Просмотр анимациив Просмотр анимации%加7备%加7备RadioButton2по кадрамRadioButton2по кадрам
RadioButtonl
RadioButtonl
в
в
— Button4
— Button4
Edrt!
Edrt!
—
—
Animatel
Animatel
Buttonl
Buttonl
непрерывно
непрерывно
Button2
Button2
Button3
Button3
в Просмотр анимации
в Просмотр анимации
%加7备
%加7备
RadioButton2по кадрам
RadioButton2по кадрам
Рис. 4.2. Форма программы "Просмотр анимации
После запуска программы в форме будет выведен первый кадр анимации, которая находится в каталоге проекта. Если ни одного файла с расширением avi в каталоге проекта нет, то поле компонента Animate останется пустым.
Имя файла, в котором находится анимация, можно ввести В поле Editl или выбрать в стандартном диалоговом окне Открыть файл, которое становится
доступным в результате щелчка на кнопке Выбрать. Доступ к стандартному диалоговому окну Открыть файл обеспечивает компонент OpenDialogl. Значок компонента OpenDialog находится на вкладке Dialogs.
Программа "Просмотр анимации" обеспечивает два режима просмотра: непрерывный и по кадрам. Кнопка Buttonl используется как для инициализации процесса воспроизведения анимации, так и для его приостановки. Процесс непрерывного воспроизведения анимации инициирует процедура обработки события Onclick на кнопке Пуск, которая присваивает значение true свойству Active. Эта же процедура заменяет текст на кнопке Buttonl с "Пуск" на "Стоп". Режим воспроизведения анимации выбирается при помощи переключателей RadioButton1 и RadioButton2. Процедуры обработки события onclick на этих переключателях изменением значения свойства Enabled блокируют или, наоборот, делают доступными кнопки управления: активизации воспроизведения анимации (Buttonl), перехода к следующему (Button2) и предыдущему (Button3) кадру. Во время непрерывного воспроизведения анимации процедура обработки события onckick на кнопке Стоп (Buttoni) присваивает значение false свойству Active и тем самым останавливает процесс воспроизведения анимации.
Листинг4.1. Использование компонента Animate
// обработка события OnCreate
void _ fastcall TForml: : FomCreate (TObject *Sender) {
TSearchRec sr; // содержит информацию
// о файле, найденном функцией■ FindFirst
// найдем AVI-файл в текущем каталоге
if (FindFirst("*.avi”,faAnyFile,sr) == 0) {
Editl->Text = sr.Name;
/* если анимация содержит звук, то при выполнении следующего оператора произойдет ошибка, т. к. компонент Animate обеспечивает воспроизведение только простой, не сопровождаемой звуком анимации
try
{
Animatel->FileName = sr.Name;
catch (Exception &e) { return;
RadioButtonl->Enabled = true;
RadioButton2->Enabled = true;
Buttonl->Enabled = true;
/ / щелчок на кнопке Выбрать
void _ fastcall TForml : :Button4Click (TObject *Sender)
{
OpenDialogl->InitialDir =// открыть каталог, из которого
// запущена программа
OpenDialogl->FileName =// вывести список AVI-файлов
if ( OpenDialogl->Execute ())
{
// пользова тель выбрал файл и нажал кнопку Открыть
// Компонент Animate может отображать только простую, // не сопровождаемую звуком анимацию. Поэтому // при выполнении следующей инструкции возможна ошибка try {
Animate l->FileNam.e =
} catch (Exception &e)
{
=
// сделаем недоступными кнопки управления
RadioButtonl->Enabled = false;
RadioButton2->Enabled = false;
Buttonl->Enabled = false;
Button2->Enabled = false;
Button3->Enabled = false;
// сообщение об ошибке
=
"Ошибка открытия файла " +
OpenDialogl->FileName +
"\пВозможн。 анимация сопровождается звуком.";
ShowMessage (msg);
return;
}
Editl->Text = OpenDialogl->FileName; // отобразить имя файла
RadioButtonl->Checked =режим просмотра — непрерывно
Buttonl->Enabled = true;// кнопка Пуск доступна
Button2->Enabled = false;// кнопка Предыдущий кадр недоступна
Button3->Enabled = false;// кнопка Следующий кадр недоступна
RadioButtonl->Enabled = true;
RadioButton2->Enabled = true;
// щелчок на кнопке Пуск/Стоп
void _ fastcall TForml: :ButtonlClick (TObject * Sender) {
if (Animate l->Active) {
// анимация отображается f щелчок на кнопке Стоп Animatel->Active = false;
Buttonl->Caption = "Пуск";
RadioButton2->Enabled = true;
} else // щелчок на кнопке Пуск {
// активизировать отображение анимации
Animatel~>StartFrame = 1;// c первого кадра
Animatel'>StopFrame =// по последний кадр
Animate l->Active = true; Buttonl->Caption = ••Стоп";
RadioButton2->Enabled = false;
// выбор режима просмотра всей анимации
void _ fastcall T Forml : :RadioButtonlClick (TObject * Sender)
{
Buttonl->Enabled = true; // кнопка Пуск/Стоп доступна
/ / сделать недоступными кнопки режима просмотра по кадрам
Button2->Enabled = false;
Button3->Enabled = false;
Animatel->Active = false;
// выбор режима просмотра по кадрам
void fastcall TForml::RadioButton2Click(TObject *Sender) {
Buttonl->Enabled. = false; // кнопка Пуск/Стоп недоступна
Button2->Enabled = true;// кнопка Следующий кадр доступна
Button3->Enabled = false;// кнопка Предыдущей кадр недоступна
/ / отобразить первый кадр Animatel->StartFrame =1;
Animatel->StopFrame = 1;
Animatel->Active = true; CFrame = 1; // запомним номер отображаемого кадра
}
/ / щелчок на кнопке Следующий кадр
voidfastcall TForml::Button2Click(TObject *Sender)
{
CFrame++; // отобразить кадр Animate 1->S tart Frame = CFrame;
Animatel^>StopFrame = CFrame;
Animatel->Active = true;
if (CFrame > 1) Button3->Enabled = true;
if (CFrame == Animatel->FrameCount) // отобразили последний кадр Button2->Enabled = false;// кнопка Следующий кадр недоступна
// щелчок на кнопке Предыдущий кадр
voidfastcall TForml::Button3Click(TObject *Sender)
{ if (CFrame == Animatel->FrameCount) // последний кадр
Button2->Enabled =
CFrame—;
/ / отобразить кадр
Anima tel-> Start Frame = CFrame;
Animatel->StopFrame = CFrame;
Animate l->Active = true;
if (CFrame == 1)
Button3->Enabled = false;// кнопка Следующий кадр недоступна
Компонент MediaPlayer
Компонент MediaPlayer обеспечивает воспроизведение звуковых файлов различных форматов (WAV, MID, RMI, МРЗ), полноценной, сопровождаемой звуком анимации и видеороликов (AVI) и музыкальных компактдисков.
Значок компонента MediaPlayer находится на вкладке System (рис. 4.3).
h3夕产。fR.唸"/
MediaPlayer
Рис. 4.3. Значок компонента MediaPlayer
Компонент MediaPlayer представляет собой группу кнопок (рис. 4.4), подобных тем, какие можно видеть на обычном аудио- или видеоплеере. Назначение этих кнопок пояснено в табл. 4.3. Свойства компонента MediaPlayer, доступные во время разработки формы, приведены в табл. 4.4.
btPayse btNext btStep btRecord
» и ■И]<卜» <i ♦金-』」-小胃一胃btPlay btStop btPrev btBack blEject
Рис. 4.4. Компонент MediaPlayer
Таблица 4.3. Кнопки компонента MediaPlayer
Кнопка
ОбозначениеДействие
Воспроизведение
Пауза
Стоп
btPlayВоспроизведение звука или видео
btPauseПриостановка воспроизведения
btstopОстановка воспроизведения
Следующий Предыдущий Шаг
btNextПереход к следующему кадру
btPrevПереход к предыдущему кадру
btStepПереход к следующему звуковому фраг
менту, например, к следующей песне на CD
Назад
btBackПереход к предыдущему звуковому фраг
менту, например, к предыдущей песне на CD
110
Часть II. Практикум программирования
Таблица 4.3 (окончание)
Кнопка
ОбозначениеДействие
Запись
btRecordАктивизирует процесс записи
Открыть
btEjectОткрывает CD-дисковод компьютера
Таблица 4.4. Свойства компонента MediaPlayer
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента и для управления работой плеера
DeviceType
Тип устройства. Определяет конкретное устройство, которое представляет собой компонент MediaPlayer. Тип устройства задается именованной константой: dtAutoSelect — тип устройства определяется автоматически по расширению файла; dtVaweAudio — проигрыватель звука; dtAVIVideo — видеопроигрыватель; dtCDAudio — CD-проигрыватель
FileName
Имя файла, в котором находится воспроизводимый звуковой фрагмент или видеоролик
AutoOpen
Признак автоматической загрузки сразу после запуска программы, файла видеоролика или звукового фрагмента
Display
Определяет компонент, поверхность которого используется в качестве экрана для воспроизведения видеоролика (обычно в качестве экрана для отображения видео используют компонент Panel)
VisibleButtons
Составное свойство. Определяет видимые кнопки компонента. Позволяет сделать невидимыми некоторые кнопки
Помимо свойств, доступных в процессе разработки формы, компонент MediaPlayer предоставляет свойства, доступные во время работы программы (табл. 4.5), которые позволяют получить информацию о состоянии медиаплеера, воспроизводимом файле или треке Audio CD. Следует обратить внимание, что значения свойств, содержащих информацию о длительности, могут быть представлены в различных форматах. Наиболее универсальным форматом является формат tfMilliseconds, в котором длительность выражается в миллисекундах. Некоторые устройства поддерживают несколько форматов. Например, если MediaPlayer используется для воспроизведения Audio CD, то информация о воспроизводимом треке может быть представлена в формате tfTMSF (Track, Minute, Second, Frame — трек, минута, секунда, кадр). Для преобразования миллисекунд в минуты и секунды надо ВОС-
пользоваться известными соотношениями. Если значение свойства представлено в формате tfTMSF, то для преобразования можно воспользоваться макросами MCI_TMSF_TRACK, MCI_TMSF_SECOND и MCI_TMSF_ MINUTE. Объявление этих и других полезных макросов можно найти в файле mmsystem.h.
Таблица 4.5. Свойства компонентаMediaPlayer, доступные во время работы программы
Свойство
Описание
Length
Длина (время, необходимое для воспроизведения) открытого файла (например, WAV или AVI) или всех треков Audio CD
Tracks
Количество треков на открытом устройстве (количество композиций на Audio CD)
TrackLength
Длина (длительность) треков. Свойство представляет собой массив
Position
Позиция (время от начала) в процессе воспроизведения трека
Time Format
Формат представления значений свойств Length, TrackLength и Position. Наиболее универсальным является формат tfMilliseconds. Если медиаплеер представляет собой проигрыватель звуковых CD, то удобно использовать формат tfTMSF
Mode
Состояние устройства воспроизведения. Устройство может находиться в состоянии воспроизведения (mp Playing). Процесс воспроизведения может быть остановлен (mpS topped) или приостановлен (mpPaused). Устройство может быть не готово к работе (mpNotReady) или в устройстве (CD-дисководе) может отсутствовать носитель (mpOpen)
Display
Экран — поверхность, на которой осуществляется отображение клипа. Если значение свойства не задано, то отображение осуществляется в отдельном, создаваемом во время работы программы окне
DisplayRect
Размер и положение области отображения клипа на поверхности экрана
Компонент MediaPlayer предоставляет методы (табл. 4.6), используя которые можно управлять работой медиаплеера из программы так, как будто это делает пользователь.
Таблица 4.6. Методы компонента MediaPlayer
Метод
Действие
Play 0
Активизирует процесс воспроизведения. Действие метода аналогично щелчку на кнопке Play
112
Часть II. Практикум программирования
Таблица 4.6 (окончание)
МетодДействие
Stop О
Останавливает процесс воспроизведения
Pause ()
Приостанавливает процесс воспроизведения
Next ()
Переход к следующему треку, например к следующей композиции
на Audio CD
Previous ()
Переход к предыдущему треку, например к следующей композиции
на Audio CD
step О
Переход к следующему кадру
Back()
Переход к предыдущему кадру
Воспроизведение звука
В качестве примера использования компонента MediaPlayer для воспроизведения звука рассмотрим программу, используя которую, можно прослушать звуковые фрагменты, сопровождающие события Windows — такие, как начало и завершение работы, появление диалогового окна и др. Форма и диалоговое окно программы "Звуки Windows" представлены на рис. 4.5, текст - в листинге 4.2, а значения свойств компонента MediaPlayerl — в табл. 4.7.
«1Й x|«1Й x|同 bM—Wind—k同 bM—Wind—kLabellLabel2LabellLabel2Зыберите звуковой!файл и щелкните на кнопке PlayЗыберите звуковой!файл и щелкните на кнопке PlayВыберите звуковой файл и щелкните на кнопке PlayВыберите звуковой файл и щелкните на кнопке PlayListBoxIListBoxInotify.wavchimes.wav厶 |chofd.wavding wavtada.wavnotify.wavchimes.wav厶 |chofd.wavding wavtada.wav.noVy wav.noVy wavrecycle. wavУТОПИЯ - очистить Kop3HHy.WAVУТОПИЯ - стандартный звук. WAVУТОПИЯ - запуск Windows.WAV」УТОПИЯ - выход изWindows.WAVУТОПИЯ • критическая ошибка. WAVУТОПИЯ - Bonpoc.WAVУТОПИЯ • восклицание. WAV习recycle. wavУТОПИЯ - очистить Kop3HHy.WAVУТОПИЯ - стандартный звук. WAVУТОПИЯ - запуск Windows.WAV」УТОПИЯ - выход изWindows.WAVУТОПИЯ • критическая ошибка. WAVУТОПИЯ - Bonpoc.WAVУТОПИЯ • восклицание. WAV习MediaPiayeri-MediaPiayeri-Рис. 4.5. Форма и диалоговое окно программы "Звуки Windows"Рис. 4.5. Форма и диалоговое окно программы "Звуки Windows"
«1Й x|
«1Й x|
同 bM—Wind—k
同 bM—Wind—k
Labell
Label2
Labell
Label2
Зыберите звуковой!файл и щелкните на кнопке Play
Зыберите звуковой!файл и щелкните на кнопке Play
Выберите звуковой файл и щелкните на кнопке Play
Выберите звуковой файл и щелкните на кнопке Play
ListBoxI
ListBoxI
notify.wav
chimes.wav厶 |
chofd.wav
ding wav
tada.wav
notify.wav
chimes.wav厶 |
chofd.wav
ding wav
tada.wav
.noVy wav
.noVy wav
recycle. wav
УТОПИЯ - очистить Kop3HHy.WAV
УТОПИЯ - стандартный звук. WAV
УТОПИЯ - запуск Windows.WAV」
УТОПИЯ - выход изWindows.WAV
УТОПИЯ • критическая ошибка. WAV
УТОПИЯ - Bonpoc.WAV
УТОПИЯ • восклицание. WAV习
recycle. wav
УТОПИЯ - очистить Kop3HHy.WAV
УТОПИЯ - стандартный звук. WAV
УТОПИЯ - запуск Windows.WAV」
УТОПИЯ - выход изWindows.WAV
УТОПИЯ • критическая ошибка. WAV
УТОПИЯ - Bonpoc.WAV
УТОПИЯ • восклицание. WAV习
MediaPiayeri-
MediaPiayeri-
Рис. 4.5. Форма и диалоговое окно программы "Звуки Windows"
Рис. 4.5. Форма и диалоговое окно программы "Звуки Windows"
Таблица 4.7. Значения свойств компонента Media player1
Компонент
Значение
DeviceType
dtAutoSelect
VisibleButtons.btNext
false
VisibleButtons.BtPrev
false
VisibleButtons.btStep
false
VisibleButtons.btBack
false
VisibleButtons.btRecord
false
VisibleButtons.btEject
false
Помимо компонента MediaPlayer на форме находится компонент ListBox, который используется для выбора звукового файла, и два компонента Label, первый из которых используется для вывода информационного сообщения, второй — для отображения имени файла, выбранного пользователем.
I Листинг 4.2. Использование компонента MediaPiayer для воспроизведения звука
voidfastcall TForml::FormCreate(TObject *Sender)
{
char *wd; // каталог Windows
wd = (char*) AllocMem (MAX_PATH);
GetWindowsDirectory (wd, MAX_PATH);
Soundpath = wd;
// звуковые файлы находятся в подкаталоге Media
SoundPath = SoundPath + "\\Media\\”;
// сформируем список звуковых файлов
TSearchRec sr;
if (FindFirst( SoundPath + "*.wav", faAnyFile, sr) == 0)
{
/ / найден файл с расширением wav
ListBoxl->Items->Add(sr.Name); // добавим имя файла в список
// еще есть файлы с расширением wav?
while (FindNext(sr) == 0)
ListBoxl'->Iterns->Add (sr. Name);
if (FindFirst( SoundPath + "★.mid”, faAnyFile, sr)0)
(
// найден файл с расширением mid
ListBoxl->Items->Add (sr.Name); // добавим имя файла в список // еще есть файлы с расширением mid?
while (FindNext(sr) == 0)
ListBoxl->Items->Add(sr.Name);
}
if (FindFirst( SoundPath + "★・rmi", faAnyFile, sr) ==0) {
// найден файл с расширением rmi
ListBoxl->Items->Add(sr.Name); // добавим имя файла в список // еще есть файлы с расширением rmi?
while (FindNext(sr) == 0)
ListBoxl->Items->Add(sr.Name);
// воспроизвести первый файл if ( ListBoxl->Iterns->Count != 0) {
Label2->Caption = ListBoxl->Items->Strings [1];
MediaPlayerl->FileName = SoundPath + ListBoxl->Items->Strings [1];
MediaPlayerl->0pen ();
MediaPlayerl->Play();
}
// щелчок на элементе списка
void _ fastcall TForml: :ListBoxlClick (TObject *Sender)
{
Label2->Caption = ListBoxl->Items->Strings [ListBoxl->ItemIndex]; MediaPlayerl->FileName = SoundPath + Label2->Caption;
MediaPlayerl->Open(); MediaPlayerl->Play();
Работает программа следующим образом. Сразу после запуска функция обработки события OnCreate формирует список звуковых файлов (WAV, MID и RMI), которые находятся в подкаталоге Media главного каталога Windows. Так как на разных компьютерах каталог, в который установлена операционная система, может называться по-разному, то для получения его имени используется API функция GetWindowsDirectory, значением которой является полное имя каталога Windows. Список звуковых файлов формируется
При ПОМОЩИ функций FindFirst И FindNext. ФуНКЦИЯ FindFirst обеспечивает поиск файла, удовлетворяющего критерию поиска, указанному при вызове функции. Функция FindNext продолжает процесс поиска. Обеим функциям в качестве параметра передается структура типа TSearchRec, поле Name которой (в случае успеха) содержит имя файла, удовлетворяющего критерию поиска. После того как список звуковых файлов сформирован, применением метода play активизируется процесс воспроизведения первого файла.
Щелчок на элементе списка обрабатывается функцией TForml:: ListBoxlclick, которая присваивает значение свойству FileName компонента MediaPlayerl, при помощи метода open открывает выбранный файл и применением метода Play активизирует процесс воспроизведения.
Следующий пример показывает, как на основе компонента MediaPlayer можно создать вполне приличный проигрыватель компакт-дисков. Вид формы и диалогового окна программы приведен на рис. 4.6. Помимо компонентов, показанных на рисунке, в форме есть компонент MediaPiayer. Так как кнопки компонента MediaPiayer во время работы программы не используются (для управления плеером служат кнопки Buttonl, Button2 и Button3), свойству visible присвоено значение false, а сам компонент находится за границей формы.
Рис. 4.6. Форма программы CD Player
Значки на кнопках управления - это текст, изображенный шрифтом Webdings. При использовании этого шрифта, например, цифре 4 соответствует значок Play. Соответствие значков Webdings и обычных символов отражает табл. 4.8.
Таблица 4.8. Изображение символов шрифта Webdings
Символ Webdings
Обычный символ — например, шрифт Arial
Код символа
(шестнадцатеричный)
9
39
4
34
Таблица 4.8 (окончание)
Обычный символ —
Символ WebdingsЛ
например, шрифт
Код символа (шестнадцатеричн ый)
Ж
ЗА
■<
ЗС
Компонент Timer используется для организации цикла опроса состояния медиаплеера. Во время воспроизведения CD функция обработки события OnTimer выводит на индикатор (в поле метки Label1) номер трека и время воспроизведения.
Вид окна программы сразу после ее запуска в случае, если в CD-дисководе находится Audio CD, приведен на рис. 4.7. В случае, если в CD-дисководе диска нет или диск не звуковой, вместо информации о времени воспроизведения будет выведено сообщение "Вставьте Audio CD". Щелчок на кнопке Play (Button.1) активизирует процесс воспроизведения. Во время воспроизведения на индикаторе отражается номер и длительность воспроизводимого трека, а также время от начала воспроизведения (рис. 4.8).
Рис. 4.7. В начале работы на индикаторе выводится информация о времени воспроизведения CD или сообщение о необходимости вставить в дисковод Audio CDРис. 4.7. В начале работы на индикаторе выводится информация о времени воспроизведения CD или сообщение о необходимости вставить в дисковод Audio CDРис. 4.8. Во время воспроизведения на индикаторе отображается информация о воспроизводимом трекеРис. 4.8. Во время воспроизведения на индикаторе отображается информация о воспроизводимом треке
Рис. 4.7. В начале работы на индикаторе выводится информация о времени воспроизведения CD или сообщение о необходимости вставить в дисковод Audio CD
Рис. 4.7. В начале работы на индикаторе выводится информация о времени воспроизведения CD или сообщение о необходимости вставить в дисковод Audio CD
Рис. 4.8. Во время воспроизведения на индикаторе отображается информация о воспроизводимом треке
Рис. 4.8. Во время воспроизведения на индикаторе отображается информация о воспроизводимом треке
Текст программы приведен в листинге 4.3. Следует обратить внимание на событие Notify, которое может генерировать MediaPlayer. Событие Notify возникает в момент изменения состояния плеера при условии, что значение свойства Notify равно true. В рассматриваемой программе событие Notify
используется для обнаружения факта открытия CD-дисковода пользователем.
| Листинг 4.3. Проигрыватель компакт дисков
tdefine Webdings // на кнопках плеера стандартные символы,
/ / изображение которых взято из шрифта Webdings
#ifdef Webdings
// "текст" на кнопках при использовании
// шрифта Webdings
#define
PLAY
"4"
tdefine
STOP
Idefine
PREVIOUS
"9"
#define
NEXT
” .fl
#else
// текст на кнопках при использовании
// обычного шрифта/ например, Arial
#define PLAY "Play"
ttdefine STOP "Stop"
#define PREVIOUS "Previous"
#define NEXT "Next"
#endif
// эти макросы обеспечивают перевод интервала времени, // выраженного в миллисекундах в минуты и секунды
#define MINUTE (ms) ( (ms/1000)/60)
ttdefine SECOND(ms) ( (ms/1000)%60)
// выводит в поле Label 1 информацию о текущем треке
voidfastcall TForml::Trackinfo()
{
int ms; // время звучания трека, мсек
AnsiString st;
Track = MCI_TMS F_TRACK(MediaPlayer->Position);
MediaPlayer->TimeFormat =
ms = MediaPlayer->TrackLength[Track];
MediaPlayer->TimeFormat =
st = "Трек "+ IntToStr(Track);
st = st +Длительность ”+ IntToStr(MINUTE(ms));
st = st ++ IntToStr(SECOND(ms));
Labell->Caption = }
voidfastcall*Sender)
{
Buttonl->Caption = PLAY;
Button2->Caption = PREVIOUS;
= NEXT; MediaPlayer->Notify = true; // разрешить событие Notify }
// изменение состояния плеера
void*Sender)
{
switch (
{
case// пользователь открыл дисковод
{
Buttonl->Enabled = false; = PLAY;
Buttonl->Tag = 0;
Button2->Enabled = false;
Button3->Enabled = false; ="00:00";
по сигналу от таймера будем проверятьдисковода */= True;
}
} = true;
}
// щелчок на кнопке Play/Stop voidfastcall
{
if ( Buttonl->Tag == 0) { // щелчок на кнопке Play MediaPlayer->Play();
= STOP; Buttonl->Hint = =
= true; // доступна кнопкатрек"
MediaPlayer->Notify = true;
Timer->Enabled = true; Trackinfo (); } else { // щелчок на кнопке Stop Button” >Capt i on = PLAY; Buttonl->Hint = Buttonl->Tag = 0; MediaPlayer->Notify = true; MediaPlayer->Stop(); Timer^>Enabled = false;
// сигнал от таймера: вывести номер трека
// и время воспроизведения
void _ fastcall TForml: : TimerTimer (TObject * Sender)
{
int trk;// трек
int min, sec;// время
AnsiString st;
if ( MediaPlayer~>Mode ==// режим в о спроизв едения
{
// получить номер воспроизводимого трека trk = МС工_TMSF_TRACK(MediaPlayer->Position);
if ( trk != Track) // произошла смена трека (
Trackinfo ();
Track = trk;
if ( Track == 2)
Button2->Enabledtrue;// доступна кнопка "пред. трек”
if ( Track == MediaPlayer->Tracks)
Button3->Enabled = false; // кнопка "след, трек" недоступна }
// вывод информации о воспроизводимом треке min = MCI_TMSF_MINUTE(MediaPlayer->Position);
sec =MCI_TMSF_SECOND(MediaPlayer->Position);
st.printf (n%d:%.2dH,min,sec);
Label2->Caption = st;
return;
/* Если дисковод открыт ими в нем нет Audio CD, то Mode ==трОреп.
Ждем дискг т. е. до тех пор, пока не будет
Mode == mpS topped + кол-во треков > 1 */
if ( (MediaPlayer->ModempStopped) &&
(MediaPlayer->Tracks > 1))
{
// диск вставлен
Timer->Enabled = false;
Buttonl~>Caption = PLAY;
Buttonl->Enabled = true;
Buttonl->Tag = 0;
MediaPlayer->Notify = true;
// получить информацию о времени звучания CD
MediaPlayer->Time Format =
int ms = MediaPlayer->Length;
AnsiString st - "Audio CD. Время звучания:
st = st + IntToStr (M工NUTE(ms));
st = st ++ IntToStr (SECOND(ms));
Labell->Caption = st;
Medi a P1 aye r- >T ime Fo mat = tfTMSF;
Labell->Visible ,= true;
Track = 0;
return;
// дисковод открыт или в дисководе не Audio CD
if ((MediaPlayer->Mode ==
(MediaPlayer->Mode == mpStopped) && (MediaPlayer->Tracks == 1))
{
Labell->Caption ="Вставьте Audio CD";
if ( Labell->Visible)
Labell->Visible = false;
else Labell->Visible = true;
// щелчок на кнопке "следующий трек"
void _ fastcall TForml: :Button3Click (TObject *Sender)
MediaPlayer->Next ();MediaPlayer->Next ();<
MediaPlayer->Next ();
MediaPlayer->Next ();
// если перешли к последнему треку, то кнопку Next
// сделать недоступной
if ( MCI_TMSF_TRACK(MediaPlayer~>Position) ==
Button3->Enabled = false;
if (! Button2->Enabled) Button2->Enabled = true;
TracklnfoO ;
Label2->Caption = "0:00";
}
// щелчок на кнопке "предыдущий трек"
void _ fastcall TForml: :Button2Click (TObject * Sender) {
MediaPlayer->Previous (); // в начало текущего трека
MediaPlayer~>Previous (); // в начало предыдущего трека
if ( MCI_TMSF_TRACK(MediaPlayer~>Position) == 1)
Button2->Enabled = false;
if ( ! Button3->Enabled)
Button3->Enabled = true;
Trackinfo() ;
Label2->Caption = "0:00";
)
// пользователь закрыл окно программы
void _ fastcall TForml: : FormClose (TObject * Sender, TCloseAction &Action) {
Media Pl a yer->5 top ();
MediaPlayer->Close();
Просмотр видеороликов
Как было сказано выше, компонент Mediaplayer позволяет просматривать видеоролики и сопровождаемую звуком анимацию. В качестве примера использования компонента рассмотрим программу Video Player, при помощи которой можно просмотреть небольшой ролик или анимацию. Вид формы программы Video Player приведен на рис. 4.9.
Компонент OpenDialogl обеспечивает отображение стандартного диалогового окна Открыть файл для выбора файла. Окно Открыть файл становится доступным во время работы программы в результате щелчка на кнопке Eject (SpeedButtonl). Следует обратить внимание, что для управления процессом воспроизведения кнопки компонента MediaPlayerl не используются, поэтому СВОЙСТВУ Visible компонента MediaPiayeri присвоено Значение false.
124124Рис. 4.11. Структура битового образа Glyph: картинки, соответствующие состоянию кнопкиРис. 4.11. Структура битового образа Glyph: картинки, соответствующие состоянию кнопки
124
124
Рис. 4.11. Структура битового образа Glyph: картинки, соответствующие состоянию кнопки
Рис. 4.11. Структура битового образа Glyph: картинки, соответствующие состоянию кнопки
Часть II. Практикум программирования
Подготовить битовый образ для кнопки SpeedButton можно при помощи любого графического редактора, в том числе и Image Editor. После запуска Image Editor надо выбрать команду File | New | Bitmap File и в появившемся окне Bitmap Properties задать размер битового образа (например, 19x76 -■ если размер картинки на кнопке должен быть 19x19 пикселов). В качестве примера на рис. 4.12 приведен битовый образ дня кнопки Play (SpeedButton2). Границы кнопок показаны условно. Обратите внимание, что изображение нажатой и зафиксированной кнопок смещены вверх и вправо относительно изображений нажатой и недоступных кнопок. Сделано это для того, чтобы во время работы программы у пользователя не создавалось впечатление, что кнопка "ушла".
Рис. 4.12. Битовый образ для кнопки PlayРис. 4.12. Битовый образ для кнопки Play
Рис. 4.12. Битовый образ для кнопки Play
Рис. 4.12. Битовый образ для кнопки Play
В табл. 4.10 приведены значения свойств компонентов SpeedButtonl и speedButton2 разрабатываемой программы. Текст программы Video Player приведен в листинге 4.4.
Таблица 4.W. Значение свойств компонентов
SpeedButtoni И SpeedButton2
Свойство
SpeedButtoniSpeedButton2
Gliph
ejbtn.bmpplbtn.bmp
NumGliphs
44
Flat
truetrue
Таблица 4.10 (окончание)
Свойство
SpeedButtonl
SpeedButton2
AllowUp
false
true
Grouplndex
0
1
Enabled
true
false
Width
25
25
Height
25
25
ShowHint
true
true
Hint
Eject
Play
Листинг 4.4. Видеоплеер
// обработка события Create
voidfastcall TForml::FormCreate(TObject *Sender)
{
MediaPlayerl->Display =// отображение ролика на поверхности
// формы
// возвращает размер кадра AVI-файла
voidfastcall GetFrameSize(AnsiString f, int *w, int *h)
// в заголовке AVI-файла есть информация о размере кадра*
struct {
char
RIFF[4];
//
строка RIFF
long
int
nu_l[5];
//
не используется
char
AVIH[4];
//
строка AVIH
long
int
rm_2 [9];
〃
неиспользуется
long
int
w;
//
ширина кадра
long
int
h;
//
высота кадра
} header;
TFileStream
fs;//
поток (для чтения заголовка файла)
I* операторы объявления потока и его создания
можно объединить: TFileStream *fs =newTFileStream (f,fmOpenRead); */
fs = new TFileStream(f,fmOpenRead);// открыть поток для чтения
fs~>Read(sheader, sizeof(header));// прочитать заголовок файла
*w = header, w;
*h =
delete fs;
// щелчок на кнопке Eject (выбор видеоклипа)
voidfastcall TForml: : SpeedButtonlClick (TObject *Sender)
{
OpenDialogl->Title = "Выбор клипа";
OpenDialogl->InitialDir =
OpenDialogl~>FileName =
if ( ! OpenDialogl->Execute ())
return; // пользователь нажал кнопку Отмена
/* При попытке открыть файл клипал который уже открыт, возникает ошибка. */
if ( MediaPlayerl->FileName == return;
/* Пользователь выбрал клип. Зададим размер и положение "экрана "/ на который будет выведен клип. Для этого надо знать размер кадров клипа. */
int fw, fh;// размер кадра клипа
int top, left; // левый верхний угол экрана
int sw, sh;// размер экрана (ширина r высота)
int mwz mh;// максимально возможный размер экрана
/ / (определяется текущим размером формы)
float kw, kh; // коэф-ты масштабирования кадра по ширине и высоте float к; // коэфф-т масштабирования кадра
GetFrameSize(OpenDialogl->FileName, &fw, &fh);// получить размер кадра
/ / вычислим максимально возможный размер кадра
mw = Forml">ClientWidth;
mh = Forml->SpeedButtonl->Top-10;
if ( fw < mw)
kw = 1; // кадр по ширине меньше размера экрана else kw = (float) mw / fw;
if ( fh <mh)
kh = 1; // кадр по высоте меньше размера экрана else kh = (float) mh / fh;
/ / масштабирование должно быть пропорциональным
if ( kw < kh)
k = kw;
else k = kh;
// здесь масштаб определен
sw = fw * k; // ширина экрана
sh = fh * k; // высота экрана
left = (Forml->ClientWidth- sw) / 2;
top = (SpeedButtonl->Top - sh) / 2;
MediaPlayerl->FileName =
MediaPlayerl->Open();
MediaPlayerl->DisplayRect =
SpeedButton2->Enabled = True; // кнопка Play теперь доступна
/* если размер кадра выбранного клипа меньше размера кадра предыдущего клипаr то экран (область формы) надо очистить */
Forml'->Canvas->FillRect (Rect(0,0,Clientwidth, SpeedButtonl~>Top));
// активизируем процесс воспроизведения
MediaPlayerl->Play();
SpeedButton2->Down = True;
SpeedButton2->Hint = "Stop";
SpeedButtonl->Enabled = False;
}
// щелчок на кнопке Play/Stop (воспроизведение/стоп)
void fastcall TForml: : SpeedButton2Click (TObject ^Sender) {
if (SpeedButton2->Down)
{
// нажата кнопка Play MediaPlayerl->Play();
SpeedButton2~>Hint = "Stop";
SpeedButtonl~>Enabled = False; // кнопка Eject недоступна
}
else
{
// нажата кнопка Stop MediaPlayerl->Stop();
SpeedButton2->Hint = "Play";
SpeedButtonl->Enabled = True; // кнопка Eject доступна
// сигнал от плеера
void _ fastcall TForml : :MediaPlayerlNotify (TObject *Sender)
{
if ( ( Mediaplayerl->Mode ==( SpeedButton2-> Down))
{
SpeedButton?一>Down = False;// "отжать" кнопку Play
SpeedButton2->Hint = "Play";
SpeedButtonl->Enabled True; // сделать доступной кнопку Eject
Следует обратить внимание на следующее. В качестве экрана, на котором осуществляется воспроизведение видеороликов, используется поверхность формы. Поэтому установить значение свойства Display компонента MediaPlayerl во время разработки формы нельзя. Кроме того, размер экрана должен быть равен или пропорционален размеру кадров ролика. Значение свойства Display устанавливает функция обработки события Create для формы, а размер и положение экрана на форме — функция обработки события Click на кнопке Eject (SpeedButtonl). Размер экрана устанавливается максимально возможным и таким, чтобы ролик воспроизводился без искажения (высота и ширина экрана пропорциональны высоте и ширине кадров). Размер кадров ролика возвращает функция GetFrameSize, которая извлекает нужную информацию из заголовка файла.
Создание анимации
Процесс создания файла анимации (AVI-файла) рассмотрим на примере. Пусть надо создать анимацию, которая воспроизводит процесс рисования эскиза Дельфийского храма (окончательный вид рисунка представлен на рис. 4.13, несколько кадров анимации — на рис. 4.14).
Для решения поставленной задачи можно воспользоваться популярной программой Macromedia Flash.
В Macromedia Flash анимация, которую так же довольно часто называют "роликом" (Movie), состоит из слоев. В простейшем случае ролик представляет собой один-единственный слой (Layer). Слой — это последовательность кадров (Frame), которые в процессе воспроизведения анимации выводятся последовательно, один за другим. Если ролик состоит из нескольких слоев, то кадры анимации формируются путем наложения кадров одного слоя на кадры другого. Например, один слой может содержать изображение фона,
на котором разворачивается действие, а другой — изображение персонажей. Возможность формирования изображения путем наложения слоев существенно облегчает процесс создания анимации. Таким образом, чтобы создать анимацию, нужно распределить изображение по слоям и для каждого слоя создать кадры.
Рис. 4.13. Эскиз Дельфийского храма
Рис. 4.14. Кадры анимации процесса рисования Дельфийского храма
После запуска Macromedia Flash на фоне главного окна программы появляется окно Moviel (рис. 4.15), которое используется для создания анимации. В верхней части окна, которая называется Timeline, отражена структура анимации, в нижней части, которая называется рабочей областью, находится изображение текущего кадра выбранного слоя. После запуска Macromedia Flash анимация состоит из одного слоя (Layer 1), который, в свою очередь, представляет собой один пустой (чистый) кадр.
Перед тем как приступить непосредственно к созданию кадров анимации, нужно задать общие характеристики анимации (ролика) — размер кадров и скорость их воспроизведения. Характеристики вводятся в поля диалогового окна Movie Properties (рис. 4.16), которое появляется в результате выбора из меню Modify команды Movie. В поле Frame Rate нужно ввести скорость воспроизведения ролика, измеряемую в "кадрах в секунду" (fps — frame per second, кадров в секунду), в поля Width и Height — ширину и высоту кадров. В этом же окне можно выбрать фон кадров (список Background Color).
После того как установлены характеристики ролика, можно приступить к созданию кадров анимации.
Первый кадр нужно просто нарисовать. Технология создания изображений в Macromedia Flash обычная: используется стандартный набор инструментов: кисть, карандаш, пульверизатор, резинка и другие инструменты.
5 Зак. 1252
Рис. 4.15. Окно Movie в начале работы над новой анимацией
Рис. 4.16. Характеристики ролика отображаются в окне Movie Properties
Чтобы создать следующий кадр, нужно из меню Insert выбрать команду Keyframe. В результате в текущий слой будет добавлен кадр, в который будет скопировано содержимое предыдущего кадра (в большинстве случаев следующий кадр создается путем изменения предыдущего). Теперь можно нарисовать второй кадр. Аналогичным образом создаются остальные кадры анимации.
Иногда не нужно, чтобы новый кадр содержал изображение предыдущего. В этом случае вместо команды Keyframe надо воспользоваться командой Blank Keyframe.
Если некоторое изображение должно оставаться статичным в течение времени, кратного выводу нескольких кадров, то вместо того чтобы вставлять в слой несколько одинаковых кадров (Keyframe), можно сделать кадр статичным. Если кадр, изображение которого должно быть статичным, является последним кадром ролика, то в окне Timeline нужно выделить кадр, до которого изображение должно оставаться статичным, и из меню Insert выбрать команду Frame. Если кадр, изображение которого должно быть статичным, не является последним, то нужно выделить этот кадр и несколько раз из меню Insert выбрать команду Frame.
Можно значительно облегчить работу по созданию анимации, если разделить изображение на основное и фоновое, поместив каждое в отдельный слой (именно так поступают при создании мультфильмов). Сначала надо создать кадры слоя фона так, как было описано выше. Затем, выбрав из меню Insert команду Layer, нужно добавить слой основного действия.
Следует обратить внимание, что все действия по редактированию изображения направлены на текущий кадр выбранного слоя. В списке слоев выбранный слой выделен цветом, номер текущего кадра помечен маркером - красным квадратиком.
Чтобы выводимая анимация сопровождалась звуком, нужно сначала сделать доступным соответствующий звуковой файл. Для этого надо из меню File выбрать команду Import и добавить в проект звуковой файл (рис. 4.17).
Папка:戶 MEDIAПапка:戶 MEDIA三]^ 0 Й回▼三]^ 0 Й回▼ф Microsoft Office 2000 Й CHIMESф Microsoft Office 2000 Й CHIMES餌CHORD ,电DING餌CHORD ,电DINGRECYCLE注)5TARTRECYCLE注)5TART变]LOGOFF 4j NOTIFY变]LOGOFF 4j NOTIFY阳 TADAЗвук Microsoft阳 TADAЗвук MicrosoftИмя Файла; |TADAИмя Файла; |TADAТип Файлов: i All Sound FormatsТип Файлов: i All Sound FormatsОткрытьОткрытьРис. 4.17. Импорт звукового файлаРис. 4.17. Импорт звукового файлаЗатем в окне Timeline нужно выделить кадр, при отображении которого должно начаться воспроизведение звукового фрагмента, используя диалоговое окно Sound (рис. 4.18), выбрать звуковой фрагмент и задать, если надо, параметры его воспроизведения. Количество повторов нужно ввести в поле Loops, эффект, используемый при воспроизведении, можно выбрать из списка Effect.Затем в окне Timeline нужно выделить кадр, при отображении которого должно начаться воспроизведение звукового фрагмента, используя диалоговое окно Sound (рис. 4.18), выбрать звуковой фрагмент и задать, если надо, параметры его воспроизведения. Количество повторов нужно ввести в поле Loops, эффект, используемый при воспроизведении, можно выбрать из списка Effect.
Папка:戶 MEDIA
Папка:戶 MEDIA
三]^ 0 Й回▼
三]^ 0 Й回▼
ф Microsoft Office 2000 Й CHIMES
ф Microsoft Office 2000 Й CHIMES
餌CHORD ,电DING
餌CHORD ,电DING
RECYCLE
注)5TART
RECYCLE
注)5TART
变]LOGOFF 4j NOTIFY
变]LOGOFF 4j NOTIFY
阳 TADA
Звук Microsoft
阳 TADA
Звук Microsoft
Имя Файла; |TADA
Имя Файла; |TADA
Тип Файлов: i All Sound Formats
Тип Файлов: i All Sound Formats
Открыть
Открыть
Рис. 4.17. Импорт звукового файла
Рис. 4.17. Импорт звукового файла
Затем в окне Timeline нужно выделить кадр, при отображении которого должно начаться воспроизведение звукового фрагмента, используя диалоговое окно Sound (рис. 4.18), выбрать звуковой фрагмент и задать, если надо, параметры его воспроизведения. Количество повторов нужно ввести в поле Loops, эффект, используемый при воспроизведении, можно выбрать из списка Effect.
Затем в окне Timeline нужно выделить кадр, при отображении которого должно начаться воспроизведение звукового фрагмента, используя диалоговое окно Sound (рис. 4.18), выбрать звуковой фрагмент и задать, если надо, параметры его воспроизведения. Количество повторов нужно ввести в поле Loops, эффект, используемый при воспроизведении, можно выбрать из списка Effect.
Sound:Sound:t^DAt^DA
Sound:
Sound:
t^DA
t^DA
22 kHz St® 傕 4 16 Bit 1.8 s 171.0 kE
Effect: NoneSync: j Event Loops: JoEffect: NoneSync: j Event Loops: Jo3] Ed- I3]3] Ed- I3]
Effect: None
Sync: j Event Loops: Jo
Effect: None
Sync: j Event Loops: Jo
3] Ed- I
3]
3] Ed- I
3]
Рис. 4.18. Диалоговое окно Sound
В качестве примера на рис. 4.19 приведен вид окна Timeline в конце работы над анимацией. Анимация состоит из двух слоев. Слой Layer 2 содержит фон. Детали фона появляются постепенно, в течение 9 кадров. После этого фон не меняется, поэтому 9 кадр является статичным. Слой Layer 1 — слой основного действия, которое начинается после того, как будет выведен фон. Вывод анимации заканчивается стандартным звуком TADA (его длительность равна одной секунде). Начало воспроизведения звука совпадает с выводом последнего (49-го, если считать от начала ролика) кадра основного действия, поэтому этот кадр сделан статичным в течение вывода следующих 12 кадров (скорость вывода анимации — 12 кадров в секунду). Сделано это для того, чтобы процесс вывода анимации завершился одновременно с окончанием звукового сигнала.
Рис. 4.19. Пример анимацииРис. 4.19. Пример анимации
Рис. 4.19. Пример анимации
Рис. 4.19. Пример анимации
После того как ролик будет готов, его надо сохранить. Делается это обычным образом, т. е. выбором из меню File команды Save.
Для преобразования файла из формата Macromedia Flash в AVI-формат нужно из меню File выбрать команду Export Movie и задать имя файла. Затем в появившемся диалоговом окне Export Windows AVI (рис. 4.20) нужно задать размер кадра (поля width и Height), из списка Video Format выбрать формат, в котором будет записана видеочасть ролика, а из поля Sound Format — формат звука.
Если установлен переключатель Compress video, то после, щелчка на кнопке ОК появится диалоговое окно, в котором можно будет выбрать один из
стандартных методов сжатия видео. При выборе видео и звукового формата нужно учитывать, что чем более высокие требования будут предъявлены к качеству записи звука и изображения, тем больше места на диске займет AVI-файл. Здесь следует иметь в виду, что завышенные требования не всегда оправданы.
Рис. 4.20. Диалоговое окно Export Windows AVI
ГЛАВА 5
Базы данных
В этой главе на примере базы данных ''Ежедневник показан процесс создания приложения работы с локальной базой данных.
С точки зрения пользователя, база данных — это программа, которая обеспечивает работу с информацией. При запуске такой программы на экране, как правило, появляется таблица, просматривая которую можно найти нужные сведения. Если система позволяет, то пользователь может внести изменения в базу данных, например, добавить новую информацию или удалить ненужную.
С точки зрения программиста, база данных — это набор файлов, в которых находится информация. Разрабатывая базу данных для пользователя, программист создает программу, которая обеспечивает работу с файлами данных.
В состав C++ Builder включены компоненты, используя которые программист может создавать программы работы с файлами данных в форматах dBase, Microsoft Access, Infbmix и Oracle и др.
БазаданныхиСУБД
База данных — это набор, совокупность файлов, в которых находится информация. Программная система (приложение), обеспечивающая работу с базой данных (файлами данных) называется системой управления базой данных (СУБД). Следует обратить внимание, что вместо термина СУБД часто используется термин база данных, при этом файлы данных и СУБД рассматриваются как единое целое.
Локальные и удаленные базы данных
В зависимости от расположения программы, которая использует данные, и самих данных, а также от способа разделения данных между несколькими пользователями различают локальные и удаленные базы данных.
Данные локальной базы данных (файлы данных) локализованы, т. е. находятся на одном устройстве, в качестве которого может выступать диск компьютера или сетевой диск (диск другого компьютера, работающего в сети). Локальные базы данных не обеспечивают одновременный доступ к информации нескольким пользователям. Для обеспечения разделения данных (доступа к данным) между несколькими пользователями (программами, работающими на одном или разных компьютерах) в локальных базах данных используется метод, получивший название "блокировка файлов". Суть этого метода заключается в том, что пока данные используются одним пользователем, другой пользователь не может работать с этими данными, т. е. данные для него закрыты, заблокированы. Несомненным достоинством локальной базы данных является высокая скорость доступа к информации. Приложения работы с локальной базой данных и саму базу данных часто размещают на одном компьютере. dBase, Paradox, FoxPro и Microsoft Access — это локальные базы данных.
Удаленные базы данных строятся по технологии "клиент-сервер". Программа работы с удаленной базой данных состоит из двух частей: клиентской и серверной. Клиентская часть программы работает на компьютере пользователя и обеспечивает взаимодействие с серверной программой посредством запросов, передаваемых на удаленный компьютер (сервер), обеспечивая тем самым доступ к данным. Серверная часть программы, работающая на удаленном компьютере, принимает запросы, выполняет их и пересылает данные клиентской программе. Профамма, работающая на удаленном сервере, проектируется так, чтобы обеспечить одновременный доступ к базе данных нескольким пользователям. При этом для обеспечения доступа к данным вместо механизма блокировки файлов используют механизм транзакций, Транзакция — это последовательность действий, которая должна быть обязательно выполнена над данными перед тем, как они будут переданы. В случае обнаружения ошибки во время выполнения любого из действий вся последовательность действий, составляющая транзакцию, повторяется снова. Таким образом, механизм транзакций обеспечивает защиту от аппаратных сбоев. Он также обеспечивает возможность многопользовательского доступа к данным. Oracle, Infomix, Microsoft SQL Server и InterBase — это удаленные базы данных.
Структура базы данных
База данных — это набор однородной и, как правило, упорядоченной по некоторому критерию информации. База данных может быть представлена в "бумажном" или в "компьютерном" виде.
Типичным примером "бумажной" базы данных является каталог библиотеки — набор бумажных карточек, содержащих информацию о книгах. Информация в этой базе однородная (содержит сведения только о книгах) и
упорядоченная (карточки расставлены, например, в алфавитном порядке фамилий авторов). Другими примерами "бумажной" базы данных являются телефонный справочник и расписание движения поездов.
Компьютерная база данных представляет собой файл (или набор связанных файлов), содержащий информацию, который часто называют файлом данных. Файл данных состоит из записей. Каждая запись содержит информацию об одном экземпляре. Например, каждая запись базы данных "Ежедневник" содержит информацию только об одном экземпляре — запланированном мероприятии или задаче.
Записи состоят из полей. Каждое поле содержит информацию об одной характеристике экземпляра. Например, запись базы данных "Ежедневник" может состоять из полей: "Задача", "Дата" и "Примечание "Задача", "Дата" и "Примечание - это имена полей. Содержимое полей характеризует конкретную задачу.
Следует обратить внимание, что каждая запись состоит из одинаковых полей. Некоторые поля могут быть не заполнены, однако они все равно присутствуют в записи.
На бумаге базу данных удобно представить в виде таблицы. Каждая строка таблицы соответствует записи, а ячейка таблицы — полю. При этом заголовок столбца таблицы — это имя поля, а номер строки таблицы — номер записи.
Информацию компьютерных баз данных обычно выводят на экран в виде таблиц. Поэтому часто вместо словосочетания "файл данных" используют словосочетание "таблица данных" или просто "таблица".
Псевдоним
Разрабатывая программу работы с базой данных, программист не знает, на каком диске и в каком каталоге будут находиться файлы базы данных во время ее использования. Например, пользователь может поместить базу данных в один из каталогов диска С:, D: или на сетевой диск. Поэтому возникает проблема передачи в программу информации о месте нахождения файлов базы данных.
В C++ Builder проблема передачи в программу информации о месте нахождения файлов базы данных решается путем использования псевдонима базы данных. Псевдоним (Alias) — это имя, поставленное в соответствие реальному, полному имени каталога базы данных. Например, псевдонимом каталога C:\data\Petersburg может быть имя Peterburg. Программа работы с базой данных для доступа к данным использует не реальное имя каталога, а псевдоним. Псевдоним базы данных можно создать при помощи утилиты BDE Administrator. Информация о всех зарегистрированных в системе псевдонимах хранится в специальном файле.
Компоненты доступа иманипулированияданными
Обычно для доступа и манипулирования данными используется соответствующая СУБД. Однако часто возникает необходимость получить доступ к информации, которая находится в базе данных, из прикладной программы. Решить эту задачу можно при помощи компонентов доступа к данным.
C++ Builder предоставляет в распоряжение программиста компоненты, используя которые можно построить приложение, обеспечивающее работу практически с любой базой данных.
Компоненты доступа к данным находятся во вкладках Data Access, ADO и InterBase. Компоненты вкладок BDE и Data Access для доступа к данным используют баз данных Borland Database Engine (BDE), реализованный в виде набора динамических библиотек и драйверов. Компоненты вкладки ADO для доступа к данным используют разработанную Microsoft технологию ADO (ActiveX Data Object — ADO). Компоненты вкладки InterBase обеспечивают непосредственный доступ к данным InterBase.
Наиболее универсальным механизмом доступа к базам данных является механизм, реализованный на основе BDE. Драйверы, входящие в состав BDE, обеспечивают доступ как к локальным базам данных (Paradox, Access, dBASE), так и к удаленным серверам баз данных (Microsoft SQL Server, Oracle, Набор драйверов, включенных в BDE, определяется вариантом C++ Builder.
Создание базы данных
Процесс создания базы данных рассмотрим на примере. Создадим локальную базу данных "Ежедневник", которая представляет собой одну-един- ственную таблицу в формате Paradox. Для этого воспользуемся поставляемой вместе с C++ Builder утилитой Database Desktop.
Запустить Database Desktop можно из C++ Builder, выбрав в меню Tools команду Database Desktop, или из Windows (команда Пуск | Программы | C++Builder \ Database Desktop).
Процесс создания базы данных состоит из двух шагов: сначала надо создать псевдоним базы данных, затем — таблицу (в общем случае — несколько таблиц). Псевдоним (Alias) определяет расположение таблиц базы данных и используется для доступа к ним.
Для того чтобы создать псевдоним, надо:
В меню Tools выбрать команду Alias Manager.
В появившемся диалоговом окне Alias Manager щелкнуть на кнопке New.
Ввести в поле Database alias псевдоним создаваемой базы данных — например, organizer,
Ввести в поле Path путь к файлам таблиц базы данных (таблицы будут созданы на следующем шаге).
Щелкнуть на кнопке Keep New (рис. 5.1).
Теперь можно приступить к созданию таблицы.
Рис. 5.1. Создание псевдонима базы данных
Чтобы создать таблицу, надо в меню File выбрать команду New | Table (рис. 5.2), затем в появившемся диалоговом окне Create Table — тип таблицы (рис. 5.3).
В результате выполнения перечисленных выше действий открывается окно Create Table, в котором надо определить структуру таблицы — задать имена полей базы данных и указать их ТИП и размер (рис. 5.4).
Записи базы данных "Ежедневник" состоят из двух полей: Task_F и Date_F. Поле Task_F (символьного типа) содержит название задачи (мероприятия), поле Date_F (типа Date) — дату, не позднее которой задача должна быть выполнена (дату проведения мероприятия).
Имена полей вводят в столбец Field Name, тип — в столбец Туре. При записи имени поля можно использовать латинские буквы и цифры. При этом следует учитывать, что имя поля не должно совпадать ни с одним из ключевых слов языка SQL (таких, например, как WHEN или SELECT). Тип поля определяет тип данных, которые могут быть помещены в поле. Задается тип поля при помощи одной из приведенных в табл. 5.1 констант. Константа,
Рис. 5.2. Начало работы над новой таблицей
Рис. 5.3. В списке Table type надо выбрать тип создаваемой таблицы (файла данных)
Рис. 5.4. В диалоговом окне Create Table надо задать структуру таблицы создаваемой базы данных
определяющая тип поля, может быть введена с клавиатуры или выбором в списке, который появляется в результате нажатия клавиши "пробел" или щелчка правой кнопкой мыши.
Таблица 5・L Тип поля определяет тип информации,
которая может в нем находиться
Тип поля
Константа
Содержимое поля
Alpha
A
Строка символов. Максимальная длина строки определяется характеристикой Size, значения которой находятся.в диапазоне 1-255
Number
N
Число из диапазона 10-307一[0308 с 15-ю значащими цифрами
Money
$
Число в денежном формате. Цифры числа делятся на группы при помощи разделителя групп разрядов. Так же выводится знак денежной единицы
Short
S
Целое число из диапазона от -32767 до 32767
Long Integer
I
Целое число из диапазона от -2 147 483 648
До 2 147483 647
Date
D
Дата
Time
Т
Время, отсчитываемое от полуночи, выраженное в миллисекундах
Timestamp
@
Время и дата
Memo
M
Строка символов произвольной длины. Поле типа Memo используется для хранения текстовой информации, которая не может быть сохранена в поле типа Alpha. Размер поля (1-240) определяет, сколько символов хранится в таблице. Остальные символы хранятся в файле, имя которого совпадает с именем файла таблицы, а расширение файла — mb
Formated Memo
F
Строка символов произвольной длины (как у типа Memo). Имеется возможность указать тип и размер шрифта, способ оформления и цвет символов
Graphic
G
Графика
Logical
Логическое значение "истина" (true) или "ложь" (false)
Autoincrement
+
Целое число. При добавлении в таблицу очередной записи в поле записывается число на единицу большее, чем то, которое находится в соответствующем поле последней добавленной записи
Таблица 5Л (окончание)
Тип поля
КонстантаСодержимое поля
Bytes
YДвоичные данные. Поле этого типа используется
для хранения данных, которые не могут быть интерпретированы Database Desktop
Binary
ВДвоичные данные. Поле этого типа используется
для хранения данных, которые не могут быть интерпретированы Database Desktop. Как и данные типа Memo, эти данные не находятся в файле таблицы. Поля типа Binary, как правило, содержат аудиоданные
Рис. 5.5. Сохранение таблицы базы данных
После того как будут определены все поля, надо щелкнуть на кнопке Save As. На экране появится диалоговое окно Save Table As (рис. 5.5). В нем нужно выбрать (в списке Alias) псевдоним базы данных, элементом которой является сохраняемая таблица, в поле Имя файла ввести имя файла таблицы, установить переключатель Display table и щелкнуть на кнопке Сохранить. В результате в указанном каталоге (псевдоним связан с конкретным каталогом локального или сетевого диска) будет создан файл таблицы и на экране появится диалоговое окно Table (рис. 5.6), в котором можно ввести данные в только что созданную таблицу (базу данных). Следует обратить внимание, что по умолчанию Database Desktop открывает таблицы в режиме просмотра, и для того чтобы внести изменения в таблицу (добавить, удалить или
изменить запись), необходимо, выбрав в меню Table команду Edit (или нажав клавишу <F8>), активизировать режим редактирования таблицы.
Рис. 5.6. Database Desktop можно использовать для ввода информации в базу данных
Данные в таблицу вводят обычным образом. Для перехода к следующему полю (столбцу таблицы) нужно нажать клавишу <Enter>. Если текущее поле является последним полем последней строки (записи), то в результате нажатия клавиши <Enter> в таблицу будет добавлена строка (новая запись).
Если во время заполнения таблицы необходимо внести изменения в уже заполненное поле, то надо, используя клавиши перемещения курсора, выбрать это поле и нажать клавишу <F2>.
Если при вводе данных в таблицу буквы русского алфавита отображаются неверно, то надо изменить шрифт, который используется для отображения данных. Для этого нужно в меню Edit выбрать команду Preferences, затем, в появившемся диалоговом окне во вкладке General щелкнуть на кнопке Change. В результате этих действий откроется диалоговое окно Change Font (рис. 5.7), в котором надо выбрать русифицированный шрифт TrueType. Следует обратить внимание, что в Microsoft Windows 2000 (Microsoft Windows XP) используются шрифты типа Open Type, в то время как программа Database Desktop ориентирована на работу со шрифтами TrueType. Поэтому в списке шрифтов нужно выбрать русифицированный шрифт именно TrueType. После выбора шрифта необходимо завершить работу с Database
Desktop, т. к. внесенные в конфигурацию изменения будут действительны только после перезапуска утилиты.
2凶
О削同Ma®也О削同Ma®也? Ba»ang? Ba»angQ Book Antique0 Bookman Old StyleQ Book Antique0 Bookman Old StylezlzlOK IOK ICancelCancel
О削同Ma®也
О削同Ma®也
? Ba»ang
? Ba»ang
Q Book Antique
0 Bookman Old Style
Q Book Antique
0 Bookman Old Style
zl
zl
OK I
OK I
Cancel
Cancel
-§ampla:.二—一 -
АаВЬБбФф
Шрифт TfueType. Он используется как привыводе на экран, так и при печати.
Рис. 5.7. Для правильного отображения данных в Database Desktopнужно выбрать русифицированный шрифт TrueType
Доступ к базе данных
Доступ к базе данных обеспечивают компоненты Database, Table, Query и DataSource. Значки этих компонентов находятся на вкладках Data Access и BDE (рис. 5.8).
Рис. 5.8. Компоненты вкладок Data Access и BDE обеспечивают доступ к даннымРис. 5.8. Компоненты вкладок Data Access и BDE обеспечивают доступ к данным
Рис. 5.8. Компоненты вкладок Data Access и BDE обеспечивают доступ к данным
Рис. 5.8. Компоненты вкладок Data Access и BDE обеспечивают доступ к данным
Компонент Database представляет базу данных как единое целое, т. е. как совокупность таблиц, а компонент Table — как одну из таблиц базы данных. Компонент DataSource (источник данных) обеспечивает связь между компонентом отображения-редактирования данных (например, компонент DBGrid) и источником данных, в качестве которого может выступать таблица
(компонент Table) или результат выполнения SQL-запроса к таблице (компонент Query). Компонент DataSource позволяет оперативно выбирать источники данных, использовать один и тот же компонент (например, DBGrid) для отображения всей таблицы (базы данных) или только результата выполнения SQL-запроса к этой таблице. Компоненты доступа к данным обращаются к базе данных не напрямую, а через процессор баз данных - Borland Database Engine (BDE).
Ядро BDE образуют динамические библиотеки, реализующие механизмы обмена данными и управления запросами. В состав BDE включены драйверы, обеспечивающие работу с файлами данных форматов Paradox, dBase, FoxPro. Имеется также механизм подключения драйверов ODBC. Доступ к данным SQL серверов обеспечивает отдельная система драйверов — SQL Links. С их помощью можно получить доступ к базам данных Oracle, Infbmix, Sysbase и Interbase.
Механизм взаимодействия компонента отображения-редактирования данных (DBGrid) С Данными (Table ИЛИ Query) Через компонент DataSource ПОКазан на рис. 5.9.
Рис. 5.9. Взаимодействие компонентов доступа-отображения данных и BDE
В форму разрабатываемого приложения надо добавить компоненты Table и DataSource.
Свойства компонентов Table и DataSource приведены в табл. 5.2 и 5.3. Свойства перечислены в том порядке, в котором рекомендуется устанавливать их значения.
Значения свойств DatabaseName и Tabi eName задаются путем выбора из списков. В списке DatabaseName перечислены все зарегистрированные на данном компьютере псевдонимы, а в списке TabieName — имена файлов таблиц, которые находятся в соответствующем псевдониму каталоге.
Таблица 5.2. Свойства компонента Table
Свойство
Определяет
DatabaseName
Имя базы данных, частью которой является таблица (файл данных), для доступа к которой используется компонент. В качестве значения свойства следует использовать псевдоним базы данных
TableName
Имя файла данных (таблицы данных), для доступа к которому используется компонент
TableType
Тип таблицы. Таблица может быть набором данных в формате Paradox (ttParadox), dBase («DBase), FoxPro (ttFoxPro) или другого типа. По умолчанию значение свойства равно ttDefault — это означает, что тип таблицы будет определен на основе информации, которая находится в файле таблицы
Active
Признак активизации файла данных (таблицы). В результате присваивания свойству значения true файл таблицы будет открыт
Таблица 5.3. Свойства компонента DataSource
Свойство
Определяет
Name
Имя компонента. Используется для доступа к свойствам компонента
DataSet
Компонент, представляющий входные данные (таблица или запрос)
Свойство DataSet компонента DataSource обеспечивает возможность выбора источника данных, а также связь между компонентом, представляющим данные (таблица или запрос), и компонентом отображения данных. Например, большая база данных может быть организована как набор таблиц одинаковой структуры. В этом случае в приложении работы с базой данных каждой таблице будет соответствовать свой компонент Table, а выбор конкретной таблицы можно осуществить установкой значения свойства DataSet.
Компоненты доступа к базе данных являются невизуальными и во время работы программы на форме не видны. Поэтому их можно поместить в любую точку формы (рис. 5.10).
Значения свойств компонентов Tablel и DataSourcel приложения "Ежедневник" приведены в табл. 5.4 и 5.5.
Таблица 5.4. Значения свойств компонента Tablel
СвойствоЗначение
NameTablel
Databas eNameorganizer
TableNameorg.db
Activefalse
Таблица5.5. Значения свойств компонента Da taSource1
СвойствоЗначение
NameDataSourcel
DataSetTablel
•- DataSourcel•- DataSourcelРис. 5.10. Форма после добавления компонентов Table и DataSourceРис. 5.10. Форма после добавления компонентов Table и DataSource
•
- DataSourcel
•
- DataSourcel
Рис. 5.10. Форма после добавления компонентов Table и DataSource
Рис. 5.10. Форма после добавления компонентов Table и DataSource
Отображение данных
Пользователь может просматривать базу данных в режиме формы или в режиме таблицы. В режиме формы можно видеть только одну запись, а в режиме таблицы — несколько записей одновременно. Часто эти два режима комбинируют. Краткая информация (содержимое некоторых ключевых полей) выводится в табличной форме, а при необходимости увидеть содержимое всех полей выполняется переключение в режим формы.
Компоненты, обеспечивающие отображение и редактирование полей записей базы данных, находятся на вкладке Data Controls (рис. 5.11).
] Data Controls
-启备皆产沔输喃喩窗诔却户1
DBTextDBMemo
DBEdit
Рис. 5.11. Компоненты отображения и редактирования полей
Компонент DBText обеспечивает отображение содержимого отдельного поля, а компоненты DBEdit и DBMemo — отображение и редактирование. В табл. 5.6 перечислены некоторые свойства этих компонентов. Свойства перечислены в том порядке, в котором следует устанавливать их значения.
Таблица 5.6. Свойства компонентов DBText, DBEdit и DBMemo
СвойствоОпределяет
DataSource Источник данных (компонент Table или Query)
DataFieldПоле записи, для отображения или редактирования которого исполь
зуется компонент
Для обеспечения просмотра базы данных в режиме таблицы используется компонент DBGrid. Свойства компонента DBGridl определяют вид таблицы и действия, которые могут быть выполнены над данными во время работы программы. В табл. 5.7 перечислены некоторые свойства компонента DBGrid.
Таблица 5.7. Свойства компонента DBGrid
Свойство
Определяет
DataSource
Источник данных (компонент Table или Query)
Columns
Options.dgTitles
Options.dglndicator
Отображаемая информация (поля записей)
Разрешает вывод строки заголовка столбцов
Разрешает вывод колонки индикатора. Во время работы с базой данных текущая запись помечается в колонке индикатора треугольником, новая запись — звездочКОЙ, редактируемая — специальным значком
Options.dgColumnResize Разрешает менять во время работы программы ширину
колонок таблицы
Таблица 5,7 (окончание)
Свойство
Определяет
Options.dgColLines
Разрешает выводить линии, разделяющие колонки таблицы
Options.dgRowLines
Разрешает выводить линии, разделяющие строки таблицы
В диалоговом окне программы "Ежедневник" данные отображаются в режиме таблицы. Поэтому в форму надо добавить компонент DBGridi и установить значения его свойств в соответствии с табл. 5.8.
Таблица 5.8. Значения свойств компонента DBGridi
Свойство
Значение
DataSource
DataSourcel
Как было сказано ранее, свойство Colunns компонента DBGrid определяет поля, содержимое которых будет отображено в таблице DBGrid. Свойство columns является сложным свойством и представляет собой массив элементов типа TColuinn. Свойства элементов массива определяют поля, содержимое которых будет в таблице, а так же вид колонок (табл. 5.9).
Таблица 5.9. Свойства объекта TColumn
Свойство
Определяет
FieldName
Поле, содержимое которого отображается в колонке
width
Ширину колонки в пикселах
Font
Шрифт, используемый для вывода текста в ячейках колонки
Color
Цвет фона колонки
Alignment
Способ выравнивания текста в ячейках колонки. Текст может быть выровнен по левому краю (taLeftJustify), по центру (taCenter) или по правому краю (taRight Justify)
Title.Caption
Заголовок колонки. Значением по умолчанию является имя поля записи
Title.Alignment
Способ выравнивания заголовка колонки. Заголовок может быть выровнен по левому краю (taLeft Justify), по центру (taCenter) или по правому краю (taRightJustify)
Title. Color
Цвет фона заголовка колонки
Title. Font
Шрифт заголовка колонки
По умолчанию компонент DBGrid содержит одну колонку. Чтобы добавить в компонент DBGrid еще одну колонку, надо в окне Object Inspector выбрать свойство Colums компонента DBGrid, щелкнуть на кнопке с тремя точками, а затем в появившемся окне Editing — на кнопке Add New (рис. 5.12). После этого, используя Object Inspector, надо установить значения свойств элементов массива columns.
Выбрать настраиваемую колонку (ее свойства отражаются в окне Object Inspector) можно в окне Editing или в окне Object TreeView.
jDBGridlI
Properties I Events I
兩 Editing DBGiitH 心lumm
AlignjalNone上j
;EAnchors[akleH.akTop)
BiDiModebdLeftT oRight
ПВ orderS t)ilebsS ingle
i匚 otofridWind<2 ,
JColumnslidColumns),T1
ПЕ Constraints(T SizeCctfistfaWJ
■CH3Otrue _J
iCursorciDefault
i DataSource
'Defaulprawing true
i DragCuisor ;亜践 SagKinddkDiag
DiagModedmManudl
Enabledtrue
:FixedColor clBtnFace fJSFont(TFont)
,Height120二1
A8 shown
Add New (lns)|
Рис. 5.12. Чтобы добавить колонку в компонент DBGrid, щелкните в строке Coiumsна кнопке с тремя точками, затем — на кнопке Add New
В простейшем случае для каждой колонки достаточно установить значение свойства FieldName, которое определяет поле, содержимое которого отображается в колонке, а также значение свойства Title.Caption, определяющее заголовок колонки. В табл. 5.10 приведены значения свойств компонента DBGridl, а на рис. 5.13 — вид формы после настройки компонента.
Таблица 5.10. Значения свойствкомпонента DBGridl
СвойствоЗначение
Columns[0].FieldNameDate_F
Columns[0].TitleCaptionКогда
Columns[0].Title.Font.Style.Italic
true
Таблица 5.10 (окончание)
СвойствоЗначение
Columns.[1] .FieldNameTask_F
Columns[1] .TitleCaptionЧто
Columns[1].Title.Font.Style.Italictrue
DBGridlDBGridl-Tablel-DataSourcel-Tablel-DataSourcelРис. 5.13. Вид формы после настройки компонента DBGridРис. 5.13. Вид формы после настройки компонента DBGrid
DBGridl
DBGridl
-Tablel
-DataSourcel
-Tablel
-DataSourcel
Рис. 5.13. Вид формы после настройки компонента DBGrid
Рис. 5.13. Вид формы после настройки компонента DBGrid
Если после настройки компонента DBGrid присвоить значение true свойству Active компонента Tablel, то в поле компонента DBGrid будет выведено содержимое базы данных.
Манипулирование данными
Для того чтобы пользователь мог не только просматривать базу данных (решение этой задачи в рассматриваемой программе обеспечивает компонент DBGrid), но и редактировать ее, в форму приложения надо добавить компонент DBNavigator, значок которого находится на вкладке Data Controls (рис. 5.14). Компонент DBNavigator (рис. 5.15) представляет собой набор командных кнопок, обеспечивающих перемещение указателя текущей записи к следующей, предыдущей, первой или последней записи базы данных, а также добавление в базу данных новой записи и удаление текущей записи.
Табл. 5.11 содержит описания действий, которые выполняются в результате щелчка на соответствующей кнопке компонента DBNavigator. Свойства компонента DBNavigator перечислены в табл. 5.12.
j ОЫе ConUok I —
n?&衿*研圖伫畐%%曾磷囲嚙旨电
DBNavigator
Рис. 5.14. Значок компонента DBNavigator находится на вкладке Data Controls
у| <1»1Т*Л「"X :е
КнопкаКнопкаРис. 5.15. Компонент DBNavigator
Кнопка
Кнопка
К первой
nbFirst
Указатель текущей записи перемещается к первой записи файла данных
К предыдущей
nbPrior
Указатель текущей записи перемещается к предыдущей записи файла данных
К следующей
nbNext
Указатель текущей записи перемещается к следующей записи файла данных
К последней
nbLast
Указатель текущей записи перемещается к последней записи файла данных
Добавить
nblnsert
В файл данных добавляется новая запись
Удалить
nbDelete
Удаляется текущая запись файла данных
Редактирование
nbEdit
Активизирует режим редактирования текущей записи
Сохранить
nbPost
Изменения, внесенные в текущую запись, записываются в файл данных
Отменить
Cancel
Отменяет внесенные в текущую запись из-
менения
Обновить
nbRefresh
Записывает внесенные изменения в файл
Таблица 5.11. Кнопки компонента DBNavigator
Обозначение Действие
Г
Таблица 5. 72. Свойства компонента DBNavigator
СвойствоСвойствоОпределяетОпределяет
Свойство
Свойство
Определяет
Определяет
DataSourceDataSourceКомпонент, являющийся источником данных. В качестве источника данных может выступать база данных (компонент Database), таблица (компонент Table) или результат выполнения запроса (компонент Query)
DataSource
DataSource
VisibleButtonsВидимые командные кнопки
Следует обратить внимание на свойство VisibleButtons. Оно позволяет скрыть некоторые кнопки компонента DBNavigator и тем самым запретить выполнение соответствующих операций над файлом данных. Например, присвоив значение false свойству VisibleButtons.nbDelete, можно скрыть кнопку nbDeiete и тем самым запретить удаление записей.
На рис. 5.16 приведен вид формы приложения "Ежедневник" после добавления Компонента DBNavigator. СВОЙСТВУ DataSource Компонента DBNavigatorl следует ПрИСВОИТЬ Значение Tablel.
-DBNavigatorl-DBNavigatorl-DBGridl-DBGridl-Tablel” DalaSourcel-Tablel” DalaSourcelРис. 5.16. Форма приложения после добавления компонента DBNavigatorРис. 5.16. Форма приложения после добавления компонента DBNavigator
-DBNavigatorl
-DBNavigatorl
-DBGridl
-DBGridl
-Tablel
” DalaSourcel
-Tablel
” DalaSourcel
Рис. 5.16. Форма приложения после добавления компонента DBNavigator
Рис. 5.16. Форма приложения после добавления компонента DBNavigator
После этого программу можно откомпилировать и запустить. Следует обратить внимание, что для ТОГО чтобы после запуска программы в окне появилась информация или, если база данных пустая, можно было вводить новую информацию, свойство Active таблицы-источника данных должно иметь значение true.
Работа с базой данных, представленной в виде таблицы, во многом похожа на работу с электронной таблицей Microsoft Excel. Используя клавиши перемещения курсора вверх и вниз, а также клавиши листания текста страницами (<Page Up> и <Page Down>), можно, перемещаясь от строки к строке, просматривать записи базы данных. Нажав клавишу <Ins>, можно добавить запись, а нажав клавишу <Del> — удалить. Для того чтобы внести изменения в поле записи, нужно, используя клавиши перемещения курсора влево и вправо, выбрать необходимое поле и нажать клавишу <F2>.
Выбор информации из базы данных
При работе с базой данных пользователя, как правило, интересует не все ее содержимое, а некоторая конкретная информация. Найти нужные сведения можно последовательным просмотром записей. Однако такой способ поиска неудобен и малоэффективен.
Большинство систем управления базами данных позволяют выполнять выборку нужной информации путем выполнения запросов. Пользователь формулирует запрос, указывая критерий, которому должна удовлетворять интересующая его информация, а система выводит записи, удовлетворяющие запросу.
Для выборки из базы данных записей, удовлетворяющих некоторому критерию, предназначен компонент Query (рис. 5.17).
一」—8DEQ ,
Й冃盆0參嶋嚼嗫
Query
Рис. 5.17. Компонент Query
Компонент Query, как и компонент Table, представляет собой записи базы данных, но в отличие от последнего он представляет не всю базу данных (все записи), а только ее часть — записи, удовлетворяющие критерию запроса.
В табл. 5.13 перечислены некоторые свойства компонента Query.
Таблица 5.73. Свойства компонента Query
Свойство
Определяет
Name
Имя компонента. Используется компонентом DataSource для связи результата выполнения запроса (набора записей) с компонентом, обеспечивающим просмотр записей, например DBGrid
SQL
Записанный на языке SQL запрос к базе данных (к таблице)
Active
При присвоении свойству значения true активизируется процесс выполнения запроса
RecordCount
Количество записей, удовлетворяющих критерию запроса
Для того чтобы во время разработки программы задать, какая информация должна быть выделена из базы данных, в свойство SQL надо записать запрос — команду на языке SQL (Structured Query Language, язык структурированных запросов).
В общем виде SQL-запрос на выборку данных из базы данных (таблицы) выглядит так:
SELECT СписокПолей
FROM Таблица
WHERE
(Критерий)
ORDER BY СписокПолей
где:
О SELECT — команда "выбрать из таблицы записи и вывести содержимое полей, имена которых указаны в списке";
FROM — параметр команды, который определяет имя таблицы, из которой нужно сделать выборку;
О WHERE — параметр, который задает критерий выбора. В простейшем случае критерий — это инструкция проверки содержимого поля;
ORDER BY — параметр, который задает условие, в соответствии с которым будут упорядочены записи, удовлетворяющие критерию запроса.
Например, запрос
SELECT Date_F, Task_F
FROM ':organizer:org.db'
WHERE ( Date_F = ‘09.02.2003')
ORDER BY Date_F
обеспечивает выборку записей из базы данных organizer (из таблицы org.db), у которых в поле Date__F находится текст 09.02.2003, т. е. формирует список мероприятий, назначенных на 9 февраля 2003 года.
Другой пример. Запрос
SELECT Date_F, Task_F
FROM ':organizer:org.dbr
WHERE
( Date_F >= '10.02.2003') AND ( Date_F <= '16.02.2003')
ORDER BY Date_F
формируетсписок дел,назначенныхнанеделю(с10по16февраля
2003 года).
Запрос может быть сформирован и записан в свойство SQL компонента Query во время разработки формы или во время работы программы.
Для записи запроса в свойство SQL во время разработки формы используется редактор списка строк (рис. 5.18), окно которого открывается в результате
щелчка на кнопке с тремя точками в строке свойства SQL (в окне Object Inspector).
Рис. 5.18. Ввод SQL-запроса во время разработки формы приложения
Сформировать запрос во время работы профаммы можно при помощи метода Add, применив его к свойству SQL компонента Query.
Ниже приведен фрагмент кода, который формирует запрос (т. е. записывает текст запроса в свойство SQL компонента Query) на выбор информации из таблицы org базы данных organizer. Предполагается, что строковая переменная today (ТИП AnsiString) содержит дату В формате dd/inm/yyyy.
Fonnl->Queryl->SQL->Add("SELECT Date_F, Task_F");
Forml->Queryl->SQL->Add("FROM ':organizer:org.db1");
Forml->Queryl->SQL~>Add("WHERE (Date_F =+ today + "')”);
Forml->Queryl->SQL~>Add("ORDER BY Date_F");
Если запрос записан в свойство SQL компонента Query во время разработки формы приложения, то во время работы профаммы критерий запроса можно изменить простой заменой соответствующей строки текста запроса.
Например, для запроса:
SELECT Date_F, Task_F
FROM ':organizer:org. db'
WHERE
( Date_F=‘09.02.2003‘)
ORDER BY Date_F
инструкция замены критерия выглядит так:
Queryl->SQL~>Strings[3] ==+ tomorrow + ”')”;
Следует обратить внимание на то, что свойство SQL является структурой типа TStrings, в которой строки нумеруются с нуля.
Для того чтобы пользователь мог выбирать информацию из базы данных, в форму разрабатываемого приложения надо добавить кнопки Сегодня, Завтра, Эта неделя и Все (рис. 5.19). Назначение этих кнопок очевидно. Также в форму добавлены два компонента Label. Поле используется для отображения текущей даты. В поле отображается режим просмотра базы данных.
Рис. 5.19. Окончательный вид формы
Функции обработки события click на кнопках Сегодня, Завтра и Эта неделя приведены в листинге Каждая из этих функций изменяет соответствующим образом сформированный во время разработки формы SQL-запрос. Для получения текущей даты функции обращаются к стандартной функции NOW, которая возвращает текущую дату и время. Преобразование даты в строку СИМВОЛОВ стандартная ФУНКЦИЯ FormatDateTime.
|5.1. Обработка события Click на кнопках Сегодня, Завтра и Эта неделя
// Щелчок на кнопке Сегодня
voidfastcall
{
=
= "Сегодня";
//критерий запроса
==+ today +
// выполнить запрос
Forml->Queryl->Open ();
Forml->DataSourcel->DataSet =
if ( ! Forml->Queryl->RecordCount) {
ShowMessage ("Ha сегодня никаких дел не запланировано!”); }
// щелчок на кнопке Завтра
void _ fastcall TForml: :Button2Click (TObject ★Sender) {
AnsiString tomorrow = FormatDateTime ("dd/iran/yyyy", Now() +1);
Forml->Labe12 ~>Capt ion =
// изменить критерий запроса
Queryl->SQL->Strings[3] ==+ tomorrow + n,)";
// выполнить запрос
Fo ml - >Que г у 1 - >Open ();
Forml->DataSourcel->DataSet =
if ( ! Fo ml - >Que г у 1 - >Reco rdCount) {
ShowMessage ("Ha завтра никаких дел не запланировано!”);
// щелчок на кнопке Эта неделя
void _ fastcall TForml: :Button3Click (TObject *Sender) {
// от текущего дня до конца недели (до воскресенья) TDateTime Present,
EndOfWeek;
Label2->Caption = "На этой неделе";
Present= Now (); // Wow — возвращает текущую дату
// #**#***★★*★★★★★**+★+*★*★★#
// для доступа к StartOfWeek, EndOfWeek, YearOf и WeekOf
// надо подключить DateUtils.hpp (см. директивы #include)
// ★★★*★★★*★★*★*★*★*★*★★★★★★★
EndOfWeek = StartOfAWeek(YearOf(Present)zWeekOf(Present)+1);
=
"(Date_F >= ' "+ Format Dat eTime ("dd/m/yyyy", Present)+",) AND “ + ”(Date_F < '"+ FormatDateTime ("dd/rnm/yyyyn, EndOfWeek)+n') ” ;
Queryl->Open();
if ( Queryl->RecordCount)
{
DataSource1~>DataSet =
}
else
ShowMessage("Ha эту неделю никаких дел не запланировано. **);
В результате щелчка на кнопке Все в диалоговом окне программы должно быть выведено все содержимое базы данных. Базу данных представляет компонент■ Tablel. Поэтому функция обработки события click на кнопке Все просто "переключает" источник данных на таблицу (листинг 5.2).
Листинг 5.2. Обработка события на кнопке Все
// Щелчок на кнопке Все
void _ fastcall TForml : :Button4Click(TObject *Sender) {
// установить: источник данных — таблица , // таким образом, отобажается вся БД
Forml->DataSourcel->DataSet =
Label2->Caption = "Все, что намечено сделать";
Программа "Ежедневник" спроектирована таким образом, что при каждом ее запуске в диалоговом окне выводится текущая дата и список дел, запланированных на этот и ближайшие дни. Вывод даты и названия дня недели в поле Label выполняет функция обработки события OnActivate (ее текст приведен в листинге 5.3). Эта же функция формирует критерий запроса к базе данных, обеспечивающий вывод списка задач, решение которых запланировано на сегодня (в день запуска программы) и на завтра. Если программа запускается в пятницу, субботу или воскресенье, то завтрашним днем считается понедельник. Такой подход позволяет сделать упреждающее напоминание, ведь, возможно, что пользователь не включит компьютер в выходные дни.
Листинг 5.3. Функция обработки события OnActivate
AnsiString stDay[7] = {п воскресенье'*z n пене дель ник **, "вторник**, "среда", "четверг*\ "пятница *\ псуббота**};
AnsiString stMonth[12] =
папреля'* r пмаяп, ,,июня,'1, "июля", "августа","сентября","октября", "но只бря","декабря"};
// активизация формы
voidfastcall TForml::FormActivate(TObject *Sender)
{
TDateTime Today,// сегодня
NextDay;// следующий день (не обязательно завтра)
Word Year, Month, Day; // год, месяц, день
Today = Now О ;
DecodeDate(Today, Year, Month, Day);
Labell->Caption = "Сегодня rr + IntToStr(Day) + " " + stMonth[Month-1] + " " + IntToStr(Year) + “ года, " + stDay[DayOfWeek(Today) -1] ;
Label2->Caption = "Сегодня и ближайшие дни";
// вычислим следующий день
// если сегодня пятница, то, чтобы не забыть /
// что запланировано на понедельник, считаем, что следующий // день - понедельник
switch ( DayOfWeek(Today)) {.
case 6 : NextDay = Today + 3; break; // сегодня пятница case 7 : NextDay = Today + 2; break; // сегодня суббота default : NextDay二 Today + 1; break;
}
// запрос к базе данных;// запрос к базе данных;есть ли дел<зЛ запланированные
// запрос к базе данных;
// запрос к базе данных;
// на сегодня и на следующий день
=
”(Date_F >= ,"+ FormatDateTime (“dd/rnm/yyyy", Today) + ”') AND “ + "(Date_F <= ,"+ FormatDateTime("dd/mm/yyyy",NextDay)4-*r 1)";
Queryl->Open();
DataSourcel->DataSet =
if ( ! Queryl->RecordCount)
{
ShowMessage("Ha сегодня и ближайшие дни никаких дел
не запланировано.");
Использование псевдонима для доступа к базе данных обеспечивает независимость программы от размещения данных в системе, позволяет размещать программу работы с данными и базу данных на разных дисках компьютера, в том числе и на сетевом. Вместе с тем для локальных баз данных типичным решением является размещение базы данных в отдельном подкаталоге того каталога, в котором находится программа работы с базой данных. Таким образом, программа работы с базой данных "знает", где находятся данные. При таком подходе можно отказаться от создания псевдонима при помощи Database Desktop и возложить задачу создания псевдонима на программу работы с базой данных. Очевидно, что такой подход облегчает администрирование базы данных.
В качестве иллюстрации сказанного в листинге 5.4 приведен вариант реализации функции OnActivate, которая создает псевдоним для базы данных organizer. Предполагается, что база данных находится в подкаталоге DATA того каталога, в котором находится выполняемый файл программы. Непосредственное создание псевдонима выполняет функция AddStandardAlias, которой в качестве параметра передается псевдоним и соответствующий ему каталог. Так как во время разработки программы нельзя знать, в каком каталоге будет размещена программа работы с базой данных и, следовательно, подкаталог базы данных, имя каталога определяется во время работы программы путем обращения к функциям ParamStr(0) и ExtractFilePatcK Значение первой — полное имя выполняемого файла программы, второй - путь к этому файлу. Таким образом, процедуре AddStandardAlias передается полное имя каталога базы данных.
ГГ•••
Г
Г
I Листинг 5.4. Создание псевдонима во время работы программы
voidfastcall TForml::FonnActivate(TObject *Sender)
{
TDateTime Today,// сегодня
NextDay; // следующий день (не обязательно завтра)
Word Year, Month, Day; // год, месяц, день
Today = Now;
DecodeDate(Today, Year, Month, Day);
Labell->Caption = "Сегодня " + IntToStr(Day) + " " + stMonth[Month-1] + " " + IntToStr(Year) + гола,+
stDay[DayOfWeek(Today) -1]
Label2->Caption = "Сегодня и ближайшие дни";
// вычислим следующий день // если сегодня пятница/ то, чтобы не забыть, // что запланировано на понедельник, считаем, что следующий // день — понедельник switch ( DayOfWeek(Today)) {
case 6 : NextDay = Today + 3; break; // сегодня пятница case 7 : NextDay = Today + 2; break; // сегодня суббота default : NextDay = Today + 1; break;
}
#define DINJVLIAS // псевдоним доступа к БД создается динамически // если псевдоним создан при помощи Database Desktop // или BDE Administrator, директиву ^define DIN_ALIAS // надо удалить ("закомментировать"丿
#ifdef DIN_ALIAS ,/ псевдоним создается динамически
// создадим псевдоним для доступа к БД Session->ConfigMode = cmSession;
Session->AddstandardAlias("organizer",
ExtractFilePath(ParamStr(0))+"DATA\\","PARADOX"); // база данных "Ежедневник" -// в формате Paradox
#endif
Forml->Tablel->Active = true; // открыть таблицу
// запрос к базе данных: есть ли дела, запланированные // на сегодня и завтра
=
"(Date_F >=,”+ FormatDateTime (^^dci/InIll/yyyy,,, Today) +n •) AND “ +
”(Date_F <= * "+ FormatDateTime ("dd/m/yyyy”,NextDay) +”')”;
Queryl->Open(); DataSourcel->DataSet = if ( ! Queryl->RecordCount) {
ShowMessage("Ha сегодня и ближайшие дни никаких дел не запланировано.");
}•
6 Зак. 1252
Перенос программы управления базой данных на другой компьютер
Часто возникает необходимость перенести базу данных на другой компьютер. В отличие от процесса переноса обычной программы, когда, как правило, достаточно скопировать только выполняемый файл (ехе-файл), при переносе программы управления базой данных необходимо выполнить перенос BDE.
Здесь следует вспомнить, что BDE представляет собой совокупность программ, библиотек и драйверов, обеспечивающих работу прикладной программы с базой данных. Выполнить перенос BDE на другой компьютер "вручную" довольно трудно. Поэтому для переноса (распространения) программы, работающей с базами данных, Borland рекомендует создать установочную программу, которая выполнит копирование всех необходимых файлов, в том числе и компонентов BDE. В качестве средства создания установочной программы Borland настоятельно советует использовать утилиту InstallShield Express, которая входит в состав всех наборов C++ Builder. Поставляемая с C++ Builder версия этой утилиты специально адаптирована к задаче переноса и настройки BDE.
ГЛАВА 6
Компонент программиста
C++ Builder позволяет программисту создать свой собственный компонент, поместить его на одну из вкладок палитры компонентов и использовать при разработке приложений точно так же, как и другие компоненты C++ Builder.
Наиболее просто создать компонент программиста можно на базе существующего (базового) компонента путем расширения или ограничения возможностей базового компонента. Например, компонент, обеспечивающий ввод и редактирование числа, логично создать на основе компонента, обеспечивающего ввод строки символов.
Процесс создания компонента может быть представлен как последовательность следующих этапов:
Выбор базового класса.
Создание модуля компонента.
Тестирование компонента.
Добавление компонента в пакет компонентов.
Рассмотрим процесс создания компонента программиста на примере. Создадим компонент NkEdit, который обеспечивает ввод и редактирование целого или дробного числа. Компонент также должен контролировать вводимое значение на принадлежность заданному диапазону. Тип числа и границы диапазона должны задаваться во время разработки формы приложения, использующего компонент.
Выбор базового класса
Приступая к разработке нового компонента, следует четко сформулировать назначение компонента. Затем необходимо определить, какой из компонентов C++ Builder наиболее близок по своему назначению, виду и функцио-
нальным возможностям к компоненту, который разрабатывается. Именн< этот компонент следует выбрать в качестве базового.
Создание модуля компонента
Перед началом работы по созданию нового компонента нужно создать отдельный каталог для модуля и других файлов компонента. После этого можно приступить к созданию компонента.
Чтобы начать работу над новым компонентом, надо активизировать процесс создания нового приложения (команда File | New | Application), в меню Component выбрать команду New Component и в поля диалогового окна New Component (рис. 6.1) ввести информацию о создаваемом компоненте.
mew Component
New Component I
Ancestor type: |TEdit [StdCtfls]"3
,£la$s Name: |TNkEdii Palette Page: [Samples
Unit (ile name: ID: \П роекты СВ \Компоненг\1М KE dit. cpp
Seatch path: [$(ВСВКйь;$^…]
Install.. 11 OK Cancel j Help j I
Рис. 6.1. Начало работы над новым компонентом
В поле Ancestor type надо ввести базовый тип создаваемого компонента. Для разрабатываемого компонента базовым компонентом является стандартный компонент Edit (поле ввода-редактирования). Поэтому базовым типом разрабатываемого компонента является ТИП TEdit.
В поле Class Name необходимо ввести имя класса разрабатываемого компонента (например, TNkEdit). Вспомните, что в C++ Builder принято соглашение, согласно которому имена типов должны начинаться буквой т.
В поле Palette Page нужно ввести имя вкладки палитры компонентов, на которую будет помещен значок компонента. Название вкладки палитры компонентов можно выбрать из раскрывающегося списка. Если в поле Palette Page ввести имя еще не существующей вкладки палитры компонентов, то непосредственно перед добавлением компонента вкладка с указанным именем будет создана.
В поле Unit file name находится автоматически сформированное имя файла модуля создаваемого компонента. C++ Builder присваивает модулю компо-
нента имя, которое совпадает с именем типа компонента, но без буквы т. Щелкнув на кнопке с тремя точками, можно выбрать каталог, в котором должен быть сохранен модуль компонента.
В результате щелчка на кнопке ОК будет сформирован модуль компонента, состоящий из двух файлов: файла заголовка (листинг 6.1) и файла реализации (листинг 6.2).
Листинг6.1. Файл NkEdith
ttifndefNkEditH
tfdefineNkEditH
frinclude <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls,hpp>
class PACKAGE TNkEdit : public TEdit
{
private:
protected:
public:
fastcall TNkEdit(TComponent* Owner);
published:
};
tendif
Листинг 6.2. Файл NkEditcpp
#include <vcl.h>
ttpragmahdrstop
#include "NkEdit.h"
#pragma package (smart_init)
static inline void ValidCtrCheck(TNkEdit *) {
new TNkEdit(NULL);
>
—fastcall TNkEdit::TNkEdit (TComponent* Owner) :
namespace NkEdit
{
void _ fastcall PACKAGE Register ()
{
TComponentClass classes [1]={ classid (TNkEdit) };
RegisterComponents ("SamplesHr classes, 0);
В файле заголовка NkEdit.h находится объявление нового класса. В файл реализации NkEdit.cpp помещена функция Register, которая обеспечивает регистрацию, установку значка компонента на указанную вкладку палитры компонентов.
В сформированный C++ Builder шаблон компонента нужно внести дополнения: объявить поля данных, функции доступа к полям данных, свойства и методы. Если на некоторые события компонент должен реагировать не так, как базовый, то в объявление класса нужно поместить объявления соответствующих функций обработки событий.
В листингах 6.3 и 6.4 приведены файлы заголовка и реализации компонента NkEdit после внесения всех необходимых изменений.
• • • • : • •
; Листинг 6,3. nkedith
#ifndef NkEditH
#define NkEditH
#include <SysUtils.hpp>
#include <Classes. hpp>
#include <Controls . hpp>
#include 〈StdCtrls,hpp>
class PACKAGE TNkEdit : public TEdit {
private:
bool FEnableFloat; // разрешен ввод дробного числа
// диапазон
float FMin; // нижняя граница
float BNax; // верхняя граница
/* функция SetNumb используется для изменения содержимого поля редактирования */
void _ fastcall SetNuinb (float n);
/* Функция GetNumb используется для доступа к полю редактирования */ float fastcall GetNumb (void);
/* эти функции обеспечивают изменение границ диапазона допустимых значений */
boolfastcall SetMin (float min);
boolfastcall SetMax (float max);
protected:
public:
fastcall TNkEdit(TComponent* Owner);// конструктор
/* Свойство Numb должно быть доступно только во время работы программы. Поэтому оно объявлено в секции public.
Если надо, чтобы свойство было доступно во время разработки формы и его значение можно было задать в окне Object Inspector, то его объявление нужно поместить в секцию published
V
property float Numb = {read =//, write = SetNumb};
// Функция обработки события KeyPress
DYNAMIC voidfastcall KeyPress(char &key);
published:
// объявленные здесь свойства доступны в Object Inspector
property bool EnableFloat = { read= FEnableFloat,
write='FEnableFloat };
property float Min = {read =
write = SetMin };
property float Max = {read =
write = SetMax } ;
1;
#endif
Листинг 6.4. nkeditxpp
ttinclude<vcl.h>
#pragma hdrstop
#include "NkEdit.h"
#pragma package (smart_init)
static inline void ValidCtrCheck(TNkEdit *) {
new TNkEdit (NULL);
)
// конструктор
_Owner)
:
(
// конструктор имеет прямой доступ к полям компонента Text =”0"; FMin = FMax = 100;
FEnableFloat = true;
namespace Nkedit {
void fastcall PACKAGE Register () {
TComponentClass classes [1]={ classic! (TNkEdit) };
■ Registercomponents ("Samples", classes, 0) ; }
}
void _ fastcall TNkEdit: :SetNumb (float n) {
Text = FloatToStr (n);
)
// возвращает значение, соответствующее строке,
// которая находится в поле редактирования
float _ fastcall TNkEdit : : GetNumb (void) {•
if (Text.Length()) return StrToFloat (Text);
else return 0;
}
// функция обработки события KeyPress в поле компонента NkEdit void fastcall TNkEdit: : KeyPress (char&Key)
{
// Коды запрещенных клавиш заменим нулем, в результате чего // эти символы в поле редактирования не появятся
switch (Key) {
case:
case
case
case
case
case
case * 6* :
case
case
case
case
case ',':
Key = if
Key 0;
break;
case '-' : // знак "минус" if>=
// минус уже введен или fMinО
Key = break;
case// клавиша
break;
default// остальные символы запрещены
Key =
if(Key <={
/*не приведет ли ввод очередной цифры
к выходу числа за границыЕсли
то заменим введенное число на максимальное или
st = Text + Key;
if< FMin) {
Key= 0;
Text =
if> FMax) {
Key = 0;
Text
}
// вызвать функцию обработки события Key Press базового класса TEdit: : KeyPress (Key);
}・
// устанавливает значение поля FMin
boolfastcall TNkEdit: :SetMin (floatmin)
{
if (min > FMax) return false; .
ENin = min;
return true;
}
// устанавливает значение поля FMin bool _fastcall TNkEdit: : SetMax( floatmax) {
if ( max < FMin) return false;
FMax = max;
return true;
В объявлении класса TNkEdit добавлены объявления полей FEnabledFloat, FMin и FMax. Имена полей, согласно принятому в C++ Builder соглашению, начинаются с буквы F (от Field, поле). Поле FEnabiedFioat хранит признак возможности ввода в поле редактирования дробного числа. Поля FMin и FMax хранят границы диапазона. Доступ к полям обеспечивают соответствующие свойства: EnabledFloat, Min и мах. Так как объявления этих свойств находятся в секции published, то они будут доступны в окне Object Inspector. Свойство Numb, представляющее собой число, которое находится в поле редактирования, объявлено в секции public, поэтому оно доступно только во время работы программы. Здесь следует обратить внимание на то, что у свойства Numb нет соответствующего поля. Значение этого свойства вычисляется во время работы программы путем преобразования в число значения свойства Text базового компонента. Свойства Min и мах получают доступ к полям данных для чтения напрямую, для записи — посредством функций SetMin и SetMax. Свойство EnabiedFioat получает доступ к полю FEnabiedFioat для чтения и записи напрямую. Так как компонент NkEdit должен обеспечить фильтрацию символов (в поле редактирования должны отображаться только цифры и, в случае, если значение свойства EnabiedFioat равно true, десятичный разделитель), то в объявление класса добавлено объявление функции KeyPress, которая предназначена для обработки соответствующего события.
Реакцию компонента NkEdit на нажатие клавиши клавиатуры определяет функция TNkEdit: : KeyPress. В качестве параметра эта функция получает код
нажатой клавиши. Перед вызовом функции TEdit: :KeyPress, которая обеспечивает обработку события Keypress базовым компонентом, код нажатой клавиши проверяется на допустимость. Если нажата недопустимая клавиша, то код символа заменяется на ноль. Допустимыми для компонента NkEdit, в зависимости от его настройки, являются цифровые клавиши, разделитель целой и дробной частей числа (в зависимости от настройки Windows, точка или запятая), "минус" и клавиша <Backspase>.
Здесь следует вспомнить, что в тексте программы дробная часть числовой константы отделяется от целой части точкой. Во время работы программы при вводе исходных данных пользователь должен использовать тот символ, который задан в настройке Windows. В качестве разделителя обычно используют запятую (стандартная для России настройка) или точку. Приведенная процедура обработки события onKeypress учитывает, что настройка Windows может меняться, и поэтому введенный пользователем символ сравнивается не с константой, а со значением глобальной переменной DecimalSeparator, которая содержит символ-разделитель, используемый в Windows в данный момент.
Тестирование компонента
Перед тем как добавить новый компонент в палитру компонентов, необходимо всесторонне его проверить. Для этого надо создать приложение, использующее компонент, и убедиться, что компонент работает так, как надо.
Во время создания формы приложения нельзя добавить в форму компонент, значка которого нет в палитре компонентов. Однако такой компонент может быть добавлен в форму динамически, т. е. во время работы приложения.
Наиболее просто выполнить тестирование компонента можно следующим образом. Сначала надо активизировать процесс создания нового приложения, а затем создать форму (добавить и настроить необходимые компоненты) и сохранить приложение в том каталоге, в котором находятся файлы тестируемого компонента.
Вид формы приложения тестирования компонента NkEdit приведен на рис. 6.2.
Форма содержит две метки. Первая метка обеспечивает вывод общей информации о компоненте; вторая метка (на рисунке она выделена) используется для вывода информации о настройке компонента. Самого компонента NkEdit в форме нет. Он будет создан во время работы программы, в момент ее запуска.
После того как форма тестового приложения будет создана, в модуль приложения надо внести дополнения, приведенные ниже.
В текст файла реализации (срр-файл) включить следующую директиву #include "nkedit.cpp".
Объявить компонент NkEdit (оператор TNkEdit *NkEdit). Здесь следует вспомнить, что компонент является объектом (точнее ссылкой на объект), поэтому объявление компонента не обеспечивает создание компонента, а только создает указатель на компонент.
Для формы приложения создать процедуру обработки события OnCreate, которая путем вызова конструктора тестируемого компонента создаст компонент и выполнит его настройку (присвоит значения свойствам компонента).
,口I xj,口I xj•предназначен для ввода чисел, поэтому в поле•,' компонента появляютсятолько цифры и, в зависимости от■ настройки компонента, десятичный разделитель и знакминус.•предназначен для ввода чисел, поэтому в поле•,' компонента появляютсятолько цифры и, в зависимости от■ настройки компонента, десятичный разделитель и знакминус.Рис. 6.2. Форма приложения "Тест компонента NkEdit"Рис. 6.2. Форма приложения "Тест компонента NkEdit"У. Тест компонента NkEdit
,口I xj
,口I xj
•предназначен для ввода чисел, поэтому в поле
•,' компонента появляютсятолько цифры и, в зависимости от
■ настройки компонента, десятичный разделитель и знакминус.
•предназначен для ввода чисел, поэтому в поле
•,' компонента появляютсятолько цифры и, в зависимости от
■ настройки компонента, десятичный разделитель и знакминус.
Рис. 6.2. Форма приложения "Тест компонента NkEdit"
Рис. 6.2. Форма приложения "Тест компонента NkEdit"
В листинге 6.5 приведен файл реализации приложения тестирования компонента NkEdit.
I Листинг 6.5. Тест компонента NkEdit
#include <vcl.h>
#pragma hdrstop
#include "tk_.h"
#include "nkedit. cpp"
#pragma package (smart_init)
#pragma resource n*.dfmM
TForml *Forml;// форма
TNkEdit *NkEdit;// компонент программиста
// конструктор формы
fastcall TForml: : TForml (TComponent* Owner)
:TForm (Owner)
/ / создадим и инициализируем компонент NkEdit
NkEdit = new TNkEdit (Forml);
NkEdit->Parent = Forml;
NkEdit->Text = "0";
NkEdit->Left = 10;
NkEdit->Top = 100;
// настроим компонент
// зададим границы диапазона
NkEdit->Min = -100;
NkEdit->Max = 100;
NkEdit->EnableFloat = true;// разрешен ввод дробных чисел
// обработка события FormCreate
voidfastcall TForml::FormCreate(TObject *Sender)
{
AnsiString st = "Введите
// информация о компоненте if (NkEdit->EnableFloat) st = st + "дробное";
else st = st ,+ "целое"; st = st + “ число от st = st + FloatToStr(NkEdit->Min); st=st+ “ до st = st + FloatToStr(NkEdit->Max);
Label2->Caption = st;
Рис. 6.3. Тестирование компонента: попе ввода — компонент NkEdit
Тестируемый компонент создает и настраивает конструктор формы. Следует обратить внимание, что свойству Parent созданного компонента обязательно надо присвоить значение. Если этого не сделать, то компонент на форме не появится. Информацию о настройках созданного компонента выводит функция FormCreate. На рис. 6.3 приведен вид окна программы "Тест компонента NkEdit" во время ее работы.
Установка компонента
Для того чтобы значок компонента появился в палитре компонентов, компонент должен быть добавлен в один из пакетов (Packages) компонентов C++ Builder. Пакет компонентов — это специальная библиотека (файл с расширением bpk). Например, для компонентов, созданных программистом, предназначен пакет dclusr.bpk.
В процессе добавления компонента в пакет C++ Builder использует файл ресурсов компонента, в котором должен находиться битовый образ значка компонента. Имя файла ресурсов компонента должно совпадать с именем файла модуля компонента. Файл ресурсов имеет расширение dcr (Dynamic Component Resource). Битовый образ, находящийся внутри файла ресурсов, должен иметь имя, совпадающее с именем класса компонента.
Ресурсы компонента
Файл ресурсов компонента можно создать при помощи утилиты Image Editor, которую можно запустить из C++ Builder (команда Tools | Image Editor) или из Windows (команда Пуск | Программы I C++ Builder | Image Editor).
Для того чтобы создать файл ресурсов компонента, нужно из меню File выбрать команду New и из появившегося списка выбрать тип создаваемого файла — Component Resource File (рис. 6.4).
В результате открывается окно файла ресурсов Untitledl.dcr, а в меню диалогового окна Image Editor появляется новый пункт — Resource. Теперь нужно из меню Resourse выбрать команду New/Bitmap и в открывшемся окне Bitmap Properties (рис. 6.5) установить характеристики битового образа значка компонента: Size — 24x24 пиксела, Colors — 16.
В результате этих действий в создаваемый файл ресурсов компонента будет добавлен новый ресурс — битовый образ с именем Bitmap 1. Двойной щелчок на имени ресурса (Bitmapl) раскрывает окно редактора битового образа, в котором можно нарисовать нужную картинку.
Изображение в окне графического редактора можно увеличить. Для этого необходимо выбрать команду Zoom In меню View.
Следует обратить внимание на то, что цвет правой нижней точки рисунка определяет "прозрачный" цвет. Элементы значка компонента, закрашенные этим цветом, на палитре компонентов C++ Builder не видны.
,曰川,曰川产Image tdilor产Image tdilorJ File Window HelpJ File Window Helpa new DCR file For use with custom VCL coa new DCR file For use with custom VCL coРис. 6.4. Начало работы по созданию файла ресурсов компонентаРис. 6.4. Начало работы по созданию файла ресурсов компонентаРис. 6.5. Диалоговое окно Bitmap PropertiesРис. 6.5. Диалоговое окно Bitmap Properties
,曰川
,曰川
产Image tdilor
产Image tdilor
J File Window Help
J File Window Help
a new DCR file For use with custom VCL co
a new DCR file For use with custom VCL co
Рис. 6.4. Начало работы по созданию файла ресурсов компонента
Рис. 6.4. Начало работы по созданию файла ресурсов компонента
Рис. 6.5. Диалоговое окно Bitmap Properties
Рис. 6.5. Диалоговое окно Bitmap Properties
Перед тем как сохранить файл ресурсов компонента, битовому образу надо присвоить имя. Имя должно совпадать с именем класса компонента. Чтобы задать имя битового образа, необходимо щелкнуть правой кнопкой мыши на имени битового образа (Bitmapl), выбрать в появившемся контекстном меню команду Rename и ввести новое имя.
Созданный файл ресурсов компонента нужно сохранить в том каталоге, в котором находится файл модуля компонента. Для этого надо из меню File выбрать команду Save.
На рис. 6.6 приведен вид окна Image Editor, в левой части которого содержится файл ресурсов компонента TNkEdit (nkedit.dcr), а в правой части - окно редактора битового образа, в котором находится изображение значка компонента. Обратите внимание, что имя файла ресурсов компонента (NkEdit.dcr) должно совпадать с именем модуля компонента (NkEdit.cpp), a имя битового образа (TNKEDIT) — с именем класса компонента (TNkEdit).
Рис. 6.6. Значок компонента NkEdit
Установка
После того как будет создан файл ресурсов компонента, можно приступить к установке компонента в пакет компонентов. Компонент можно установить в существующий пакет или создать новый пакет и затем установить в него компонент.
Чтобы установить компонент в существующий пакет, надо из меню Component выбрать команду Install Component и заполнить поля вкладки Into existing package диалогового окна Install Component (рис. 6.1).
Рис. 6.7. Диалоговое окно Install Component
В поле Unit file name (Имя файла модуля) нужно ввести имя файла модуля. Для этого удобно воспользоваться кнопкой Browse.
Поле Search path (Путь поиска) должно содержать разделенные точкой с запятой имена каталогов, в которых C++ Builder во время установки компонента будет искать необходимые файлы, в частности файл ресурсов компонента. Если имя файла модуля было введено в поле Unit file name выбором файла из списка, полученного при помощи кнопки Browse, то C++ Builder автоматически добавляет в поле Search path имена необходимых каталогов. Следует обратить внимание на то, что файл ресурсов компонента должен находиться в одном из каталогов, перечисленных в поле Search path. Если его там нет, то компоненту будет назначен значок его родительского класса.
Поле Package file name должно содержать имя пакета, в который будет установлен компонент. По умолчанию компоненты, создаваемые программистом, добавляются в пакет dclusr.bpk.
Поле Package description содержит название пакета. Для пакета dclusr.bpk это текст: Borland User Components.
После того как поля будут заполнены, надо щелчком на кнопке ОК активизировать процесс установки. Сначала на экране появляется окно Confirm (рис. 6.8), в котором C++ Builder просит подтвердить обновление пакета.
Рис. 6.8. Запрос подтверждения обновления пакета в процессе установки компонента
После щелчка на кнопке Yes процесс установки продолжается. Если он завершается успешно, то на экране появляется информационное сообщение (рис. 6.9) о том, что пакет обновлен, а компонент зарегистрирован.
Рис. 6.9. Сообщение об успешной установке компонента
После установки компонента в пакет открывается диалоговое окно Package (Редактор пакета компонентов) (рис. 6.10), в котором перечислены компоненты, находящиеся в пакете.
Рис. 6.10. Окно редактора пакета компонентов
На этом процесс установки компонента заканчивается. В результате на вкладке палитры компонентов, имя которой было задано при создании модуля компонента, появляется значок установленного компонента (рис. 6.11).
[ Sarnptet ]■ 一
{T言讓同质HF圖目制
Рис. 6.11. Значок компонента NkEditна вкладке Samples
Проверка компонента
После того как компонент будет добавлен в пакет и его значок появится в палитре компонентов, необходимо проверить поведение компонента во время разработки приложения, использующего этот компонент (работоспособность компонента была проверена раньше, когда компонент добавлялся в форму приложения динамически, во время работы программы).
Можно считать, что компонент работает правильно, если во время разработки приложения удалось поместить этот компонент в форму разрабатываемого приложения и, используя окно Object Inspector, установить значения свойств компонента, причем как новых, так и унаследованных от родительского класса.
Работоспособность компонента NkEdit можно проверить, использовав его, например, в приложении "Сила тока", вид формы которого приведен на рис.6.12.
f. Сила тока
••Для ввода исходных данных программа использует компонент NkEdit
•
•
Введите напряжение и величину COnpOTMBneHM«j затем щелкните на КНОПКЕ Вычислить
. NkEdM- NkEdit2. NkEdM- NkEdit2Напряжение (вольт)- |о
. NkEdM
- NkEdit2
. NkEdM
- NkEdit2
Сопротивление (Ом):: jo
• ■• ■Label4Label4Вычислить I—匕Вычислить I—匕ЗавершитьЗавершить- Buttonl- Buttonl
• ■
• ■
Label4
Label4
Вычислить I
—匕
Вычислить I
—匕
Завершить
Завершить
- Buttonl
- Buttonl
Рис. 6.12. Форма приложения "Сила тока" (поля ввода-редактирования компоненты NkEdit)
Внешне форма разрабатываемого приложения почти ничем не отличается от формы приложения "Сила тока", рассмотренного в гл. 2. Однако если выбрать поле ввода, то в окне Object Inspector будет указано, что текущим компонентом является компонент класса TNkEdit, а в списке свойств можно будет увидеть свойства, которых нет у стандартного компонента Edit (рис. 6.13).
|NkE 由 1THkEdt二J
Properties I Events |
DiagModedmManualDiagModedmManualEnableFloatEnableFloatMax -Min •Max -Min •Enabledtrue+EnableFloat hueEIFont(TFont)Height22Enabledtrue+EnableFloat hueEIFont(TFont)Height22HelpContextHelpContextHelpKeywoidHelplype htContextHideS election taueHintImeMode impontCareImeNameLeft" ‘144Max100MaxLength0Min0NameNkEditlOEMConveKfalseHelpKeywoidHelplype htContextHideS election taueHintImeMode impontCareImeNameLeft" ‘144Max100MaxLength0Min0NameNkEditlOEMConveKfalse
DiagModedmManual
DiagModedmManual
EnableFloat
EnableFloat
Max -
Min •
Max -
Min •
Enabledtrue
+EnableFloat hue
EIFont(TFont)
Height22
Enabledtrue
+EnableFloat hue
EIFont(TFont)
Height22
HelpContext
HelpContext
HelpKeywoid
Helplype htContext
HideS election taue
Hint
ImeMode impontCare
ImeName
Left" ‘144
Max100
MaxLength0
Min0
NameNkEditl
OEMConveKfalse
HelpKeywoid
Helplype htContext
HideS election taue
Hint
ImeMode impontCare
ImeName
Left" ‘144
Max100
MaxLength0
Min0
NameNkEditl
OEMConveKfalse
%%jAIIshown
%
%
Рис. 6.13. Значения свойств EnableFloat, Max и Min компонента NkEditможно задать в окне Object Inspector
В листинге 6.6 приведен модуль приложения "Сила тока". Здесь надо обра-тить внимание на следующее. Первое. В программе нет кода, обеспечиваю-
щего фильтрацию символов, вводимых в поле редактирования. Тем не менее во время работы программы пользователь может ввести в поле редактирования только положительное число. Второе. В программе не используется функция StrToFloat. Число, которое соответствует введенной в поле редактирования строки символов, получается путем обращения к свойству Numb.
Очевидно, что использование в программе компонента NkEdit вместо стандартного Edit освобождает программиста от рутины, сокращает размер кода и делает его более понятным.
| Листинг 6.6. "Сила тока"
// нажатие клавиши в поле Напряжение
void _ fastcall TForml : : NkEdit IKeyPres s (TObject * Sender, char &Key) {
if ( Key == VK_RETURN) NkEdit2->SetFocus ();
// нажатие клавиши в поле Сопротивление
void _ fastcall TFoml : : NkEdit2KeyPress (TObject * Sender, char &Key) {
if ( Key == VK_RETURN) Buttonl->SetFocus();
// нажатие кнопки Вычислить
void _ fastcall TForml: :ButtonlClick (TObject *Sender) {
float u; // напряжение float r; // сопротивление float// ток
// получить исходные манные из полей ввода u = NkEditl->Numb;
r=
if ( r =={
ShowMessage ("Сопротивление не должно быть равно нулю"); return;
// вычислить ток
i = u/r;
// вывести результат
Labe14->Caption = "Ток : “ +
FloatToStrF(i,ffGeneral,7,3) + "А";
Настройка палитры компонентов
C++ Builder позволяет менять порядок следования вкладок в палитре компонентов, названия вкладок, а также порядок следования значков компонентов на вкладках. Настройка палитры компонентов выполняется в диалоговом окне Palette Properties, которое открывается выбором из меню Component команды Configure Palette (рис. 6.14).
Рис. 6.14. Диалоговое окно Palette Properties
Сначала в списке Pages необходимо выделить нужную вкладку палитры компонентов. Затем, если надо изменить порядок следования вкладок палитры компонентов, следует воспользоваться кнопками Move Up и Move Down и путем перемещения выбранного имени по списку Pages добиться нужного порядка следования вкладок.
Если надо изменить порядок следования значков компонентов на вкладке, то в списке Components следует выбрать нужный значок компонента и кнопками Move Up и Move Down переместить значок на новое место.
При необходимости изменить имя вкладки палитры следует в списке Pages выбрать имя нужной вкладки, нажать кнопку Rename и в поле Page name открывшегося диалогового окна Rename page (рис. 6.15) ввести новое имя.
Рис. 6.15. Диалоговое окно Rename page
ГЛАВА 7
Консольное приложение
Хотя эта книга посвящена программированию в Windows, нельзя обойти вниманием так называемые консольные приложения. Консольное приложение — это приложение, которое для взаимодействия с пользователем не использует графический интерфейс. Устройством, обеспечивающим взаимодействие с пользователем, является консоль — клавиатура и монитор, работающий в режиме отображения символьной информации (буквы, цифры и специальные знаки).
В операционной системе консольное приложение работает в окне командной строки.
Консольные приложения удобны как иллюстрации при рассмотрении общих вопросов программирования, когда надо сосредоточиться на сути проблемы, а также как небольшие утилиты "для внутреннего потребления".
Ввод/вывод
Перед тем как приступить к созданию консольного приложения, рассмотрим функции, обеспечивающие вывод на экран и ввод с клавиатуры.
Наиболее универсальными функциями, обеспечивающими вывод и ввод ИНфорМаЦИИ В КОНСОЛЬНЫХ ПрИЛОЖеНИЯХ, ЯВЛЯЮТСЯ ФУНКЦИИ printf И scanf. Для того чтобы программа могла их использовать, в начало программы надо ВКЛЮЧИТЬ директиву #include <stdio.h>.*
Функция printf
В общем виде инструкция вызова функции printf выглядит так:
printf (УправляющаяСтрока, СписокПеременных)
Параметр Упра вляющаяСтрока задает способ отображения (формат) значений переменных, имена которых задает параметр СписокПеременных. Помимо спецификаторов формата, параметр УправляющаяСтрока может содержать символы и управляющие последовател ьности.
Параметр СписокПеременных не является обязательным и представляет собой последовательность разделенных запятыми имен переменных, значения которых должны быть выведены.
Спецификатор формата задает вид вывода. Например, значение переменной типа float можно вывести как десятичное число с точкой (%f) или как число в формате с плавающей точкой (%е). В спецификаторе формата можно задать размер поля вывода (количество позиций экрана), а для формата f -- размер поля для вывода целой и дробной частей числа. Если во время работы программы окажется, что выводимое значение не умещается в поле, указанном в спецификации, то для его вывода будет использовано столько позиций, сколько необходимо.
В табл. 7.1 приведены наиболее часто используемые спецификаторы формата. Необязательный параметр с, вместо которого надо подставить десятичное число, задает размер поля вывода; параметр Л1 — размер поля для вывода цифр дробной части.
Таблица乙九Спецификаторы формата
Спецификатор
Тип переменной
Форма вывода
% nd
int
Десятичное со знаком
吿 n.mf
float или double
Дробное с десятичной точкой
% ne
float или double
Дробное в виде числа с плавающей точкой
%nc
char
Символ
%ns
Строка
При выводе одной инструкцией значений нескольких переменных значение первой переменной выводится в соответствии с первым по порядку спецификатором формата из управляющей строки, второй со вторым и т. д.
Следует обратить внимание на то, что компилятор не проверяет, соответствует ли количество переменных, значения которых должны быть выведены, количеству спецификаторов в управляющей строке, а также соответствие типа переменной — спецификатору. Например, если переменная х объявлена как float, то в инструкции printf ("x=%i”, x) компилятор не обнаружит ошибку.
Если надо вывести символ, который не может быть помещен в строку вывода обычным образом путем набора на клавиатуре, — например, символ новой строки или двойная кавычка, которая в языке C/C++ используется для ограничения в тексте программы строк, — то вместо этого символа применяется специальная последовательность символов. Специальная (управляющая) последовательность начинается символом обратной наклонной черты. Во время работы программы символы специальной последовательности на экран не выводятся, а выполняется действие, обозначаемое этой последовательностью. В табл. 7.2 приведены наиболее часто используемые управляющие последовательности.
Таблица 7.2. Управляющие последовательности
ПоследовательностьДействие
\пПереводит курсор в начало следующей строки
\гПереводит курсор на следующую строку текущей
колонки
\tПереводит курсор в следующую позицию табу
ляции
\"Выводит двойную кавычку
\\Выводит обратную наклонную черту
\ОхШестнадцагеричноеЧислоВыводит символ, код которого указан
Для вывода на экран сообщений часто используют функцию puts, которая, в отличие от printf, после вывода автоматически переводит курсор в начало следующей строки. У функции puts один параметр — сообщение. В простейшем случае в качестве параметра функции puts используется строковая константа. Например, функция
puts(”y лукоморья дуб зеленый, ХпЗлатая цепь, на дубе том. **)
выводит две строчки стихотворения, каждую на отдельной строке, и переводит курсор в начало следующей строки.
Чтобы вывести цветной текст, надо использовать функции cprintf и cputs. Они ничем не отличаются от рассмотренных ранее printf и puts, за исключением того, что цвет символов, выводимых этими функциями, можно задать, вызвав функцию textcolor, а цвет фона — textbackground.
В общем виде инструкции вызова указанных выше функций выглядят так:
textcolor(Цвет);•
textbackground(Цвет);
Параметр цвет — параметр целого типа, в качестве которого обычно используют одну из именованных констант (табл. 7.3).
186
Часть II. Практикум программирования
Таблица 7.3. Константы, в качестве параметра Цвет
Цвет
Константа
Значение константы
Черный
BLACK
0
Синий
BLUE
1
Зеленый
GREEN
2
Бирюзовый
CYAN
3
Красный
RED
4
Сиреневый
MAGENTA
5
Коричневый
BROWN
6
Светло-серый
LIGHTGRAY
7
Серый
DARKGRAY
8
Голубой
LIGHTBLUE
9
Светло-зеленый
LIGHTGREEN
10
Светло-бирюзовый
LIGHTCYAN
11
Алый
LIGHTRED
12
Светло-сиреневый
LIGHTMAGENTA
13
Желтый
YELLOW
14
Белый (яркий)
WHITE
15
Следует обратить внимание на то, что в качестве параметра функции textcolor можно использовать символьные константы со значением от О до 15, а в качестве параметра функции textbackground — только от 0 до 7.
При выводе на экран весьма полезна функция clrscr, которая очищает экран, закрашивая его цветом фона, установленным функцией textbackground. Функции textcoior, textbackground, cirscr и приведенные выше константы объявлены в файле conio.h, поэтому, чтобы они были доступны, в текст Программы НУЖНО ВКЛЮЧИТЬ директиву ttinclude <conio.h>.
Функция scant
Наиболее универсальной функцией, которая позволяет ввести данные с клавиатуры, является функция scanf. В общем виде инструкция вызова функции scanf для ввода значения одной переменной выглядит так:
scanf (Формат, & Переменная);
где:
Формат — это строка, которая содержит спецификатор формата, определяющий то, как должна интерпретироваться строка, введенная с клавиатуры. Наиболее часто используемыми спецификаторами являются: %i — для ввода целых, %f — для ввода дробных, — для ввода строк;
— это адрес переменной, значение которой вводится.
Например, инструкция
scanf("吿i”, &kol);
вводит целое число, а инструкция
scanf (咋i式",&kol, cena);
вводит целое и дробное.
При вызове функции scanf происходит следующее. Программа приостанавливает работу и ждет, пока пользователь наберет на клавиатуре строку символов и нажмет клавишу <Enter>. До нажатияможно редактировать
вводимую строку (например, нажав клавишуSpace> можно удалить
последний введенный символ). После нажатия клавиши <Enter> функция scanf преобразует введенную строку в данные и записывает их в переменную, адрес которой указан. Преобразование выполняется в соответствии со спецификатором формата. Например, в результате выполнения инструкции и набора на клавиатуре строкизначение перемен
ной сепа будет равно 25.99.
Следует обратить внимание, что при использовании функции scanf наиболее частой ошибкой, причем не обнаруживаемой компилятором, является отсутствие символа & перед именем переменной.
Если введенная пользователем строка не соответствует типу ожидаемых данных — например, программа ждет ввода целого числа, а пользователь ввел дробное, — то функция scanf обрабатывает только ту часть введенной строки, которая может быть преобразована в требуемые данные. Например, в программе для ввода данных о стоимости покупки используется инструкциякоторая предполагает, что пользователь
введет в одной строке сначала количество предметов, а затем цену предмета. Если во время работы программы вместо строки 3 24.99 (три предмета по 24.99) ввести строку 24.99 3, то значение переменной будет равно 24, а переменной сепа — 99.
Создание консольного приложения
Консольное приложение создается следующим образом. Сначала нужно из меню File выбрать команду New | Other Application и на вкладке New появившегося диалогового окна New Items щелкнуть на значке Console Wizard
(рис. 7.1). В результате этих действий на экране появится окно Console Wizard (рис. 7.2). В этом окне можно выбрать язык программирования и указать, будет ли использоваться та или иная библиотека. После того как будут заданы параметры создаваемого консольного приложения, надо щелкнуть на кнопке ОК. В результате C++ Builder создаст проект консольного приложения и на экране появится окно редактора кода, в котором находится шаблон консольного приложения — функция main (рис. 7.3).
ConsoleWizard "ConsoleWizard "Рис. 7.1. Чтобы приступить к созданию консольного приложения, надо щелкнуть на значке Console WizardРис. 7.1. Чтобы приступить к созданию консольного приложения, надо щелкнуть на значке Console Wizard
Console
Wizard "
Console
Wizard "
Рис. 7.1. Чтобы приступить к созданию консольного приложения, надо щелкнуть на значке Console Wizard
Рис. 7.1. Чтобы приступить к созданию консольного приложения, надо щелкнуть на значке Console Wizard
Рис. 7.2. В окне Console Wizard надо задать характеристики консольного приложение
Начинается консольное приложение директивой #pragma hdrs top, которая запрещает выполнение предварительной компиляции подключаемых фай-
Глава 7. Консольное приложение189
лов. После этой директивы надо вставить директивы #include, обеспечивающие подключение необходимых библиотек (например, #include <stdio.h>). Директива #pragma argsused отключает предупреждение компилятора о том, что аргументы, указанные в заголовке функции, не используются.
Рис. 7.З. Шаблон консольного приложения
Следует обратить внимание на то, что консольное приложение разрабатывается в Windows, а выполняется как программа DOS. В DOS и Windows буквы русского алфавита имеют разные коды (в DOS используется кодировка ASCII, а в Windows — ANSI). Это приводит к тому, что консольное приложение вместо сообщений на русском языке выводит "абракадабру".
Проблему вывода сообщений на русском языке консольными приложениями можно решить, разработав функцию перекодировки ANSI-строки в строку ASCII. Если эту функцию назвать rus, то инструкция вывода сообщения может выглядеть, например, так:
printf( rus("Скорость: %3.2f км/час") , v);
В качестве примера консольного приложения в листинге 7.1 приведена программа "Угадай число", которая для вывода сообщений использует функцию RUS. Значение функции rus — строка символов в кодировке ASCII, соответствующая строке, полученной в качестве параметра.
Листинг 7.1. Пример консольного приложения
^pragma hdrstop
#include
<stdio.h>
#include
<conio.h>
// для доступа
к
getch ()
#include
<stdlib.h>
// для доступа
к
srand (),
rand ()
#include
<time.h>
// для доступа
к
time_t и
time ()
char* rus(char* st)
// преобразует ANSI-строку
в строку ASCII
#pragma argsused
int main.(int argc, char* argv[]) {
intcomp,//число, "задуманное"компьютером
igrok,//вариант игрока
n=0;//число попыток
// ГСЧ — генератор случайных чисел
time_t t; // текущее время (для инициализации ГСЧ)
srand( (unsigned)time (&t)); // инициализация ГСЧ comp = rand () % 10 + 1;
puts ( rus ( " ХпКомпьютер \'*задумал\ичислоот1до10・”)); puts ( rus ( "Вы должны его угадать за три попытки •"));
do
{
printf (”->”);
scanf(”%i", &igrok); n++;
} while ( igrok 1 = comp && n < 3);
if (igrokcomp)
printf( rus ("ВЫ ВЫИГРАЛИ! п));
else {
puts ( rus ("Вы проиграли."));
printf( rus("Компьютер \"задумал\п число 吿d"), comp); }
printf( rus(”\пДля завершения нажмите любую клавишу.•.")); getch();
return 0;
Функция преобразуетв строку ASCII
и может использоваться для вывода
на русском языке в консольных программах.
Пример
printf (rus (^Скорость: %3.2f км/чаc"), ⑺; rus ("Удуб
V
char*st)
{ unsignedp = st;
/* при объявлении символов как char русские буквы кодируются отрицательными числами */
while ( *р) { if (*p >= 192) // здесь русская буква
if<= 239) // 员,E, 只,d‘,С, п
*р else // p я
*р -= 16;
р++;
} return st;
}
Компиляция консольного приложения выполняется обычным образом, т. е. выбором из меню Project команды Compile.
После успешной компиляции программа может быть запущена выбором из меню Run команды Run. При запуске консольного приложения на экране появляется стандартное окно командной строки. На рис. 7.4 приведен вид окна командной строки, в котором работает консольное приложение, созданное в C++ Builder.
Процесс сохранения проекта консольного приложения стандартный. В результате выбора из меню File команды Save Project на экране сначала появляется окно Save Project, в котором нужно ввести имя проекта, а затем - окно Save Utit, в котором надо задать имя модуля.
Получить доступ к модулю консольного приложения (тексту программы) для того, чтобы внести изменения в программу, несколько сложнее. Сначала, выбрав в меню File команду Open Project, нужно открыть файл проекта. Затем надо открыть окно Project Manager (команда View | Project Manager),
раскрыть список файлов, выбрать срр-файл и из контекстного меню выбрать команду Open (или сделать двойной щелчок на имени срр-файла) (рис. 7.5).
Рис. 7.4. Окно командной строки, в котором работает консольное приложение
夕Toolbar
Status Bar
Stay on Top
V Dockable
Рис. 7.5. Чтобы внести изменения в программу, надо в окне Project Managerвыбрать срр-файл и из контекстного меню выбрать команду Open
ГЛАВА 8
Справочная система
Каждая программа должна обеспечивать пользователя справочной информацией. Существует два способа отображения справочной информации: классический (рис. 8.1, левый) и современный, в "интернет-стиле" (рис. 8.1, правый). Классический способ отображения справочной информации применяется большинством приложений, в том числе и C++ Builder. Отображение справочной информации в интернет-стиле используется в программных продуктах Microsoft и, в последнее время, в продуктах других разработчиков программного обеспечения.
Классическая справочная система представляет собой набор файлов, используя которые программа Winhelp, являющаяся составной частью Windows, выводит справочную информацию. Основой такой справочной системы являются hip-файлы.
Основой современной справочной системы являются chm-файлы. Chm-файл представляет собой компилированный HTML-документ, полученный путем компиляции (объединения) файлов, составляющих HTM L-документ, в том числе и файлов иллюстраций.
Создать hip-файл можно при помощи утилиты Microsoft Help Workshop, которая входит в комплект C++ Builder (файл утилиты hce.exe находится в каталоге \CBuilder\Help\Tools). Chm-файл можно создать при помощи утилиты Microsoft HTML Help Workshop, которая, к сожалению, в состав C++ Builder не включена.
Рассмотрим процесс создания справочной системы, сначала классической, а затем — современной. •
Создание справочной системы при помощи Microsoft Help Workshop
Процесс создания справочной системы состоит из двух этапов. На первом этапе надо подготовить справочную информацию, на втором — преобразо-
7 Зак. 1252
вать справочную информацию в справочную систему. Задача первого этапа может быть решена при помощи редактора текста, второго — посредством утилиты Microsoft Help Workshop.
Файл Правка Мпадка П^раметрм pipw» 亠Сапер 2003Игра Сапер 2(103 является аналогом игры Сапер, входящей в состав MicrosoftWindows.ПравилаИгровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым. что в клетке находится мина Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок. есть мина, то происходить взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается Если в клетке мины нет. то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках,Файл Правка Мпадка П^раметрм pipw» 亠Сапер 2003Игра Сапер 2(103 является аналогом игры Сапер, входящей в состав MicrosoftWindows.ПравилаИгровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым. что в клетке находится мина Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок. есть мина, то происходить взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается Если в клетке мины нет. то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках,[С Сипер[С Сипер画е詔ер 2003it] О про(рамме画е詔ер 2003it] О про(раммеПравилаИгровое поле состоит из клеток, в каждой ИЗ которых может быть мина Задача игрока - найти все мины и пометить ихфлажками.ПравилаИгровое поле состоит из клеток, в каждой ИЗ которых может быть мина Задача игрока - найти все мины и пометить ихфлажками.Используя кнопки мыши, игрок может открыть клетку или поставить е нее флажок, указав тем самым, что в кпетке находится мина. Клетка открывается щелчкомлевой кнопки мыши, фпажок ставится щелчком правой. Если в кпетке, которую открыл игрок, есть мина, то происходить взрыв (сапер ошибся, а он. какизвестно, ошибается только один раз). и игра заканчивается. Если а кпетке мины нет, то в этой кпетке появляется число, соответствующее количеству мин. находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок можетИспользуя кнопки мыши, игрок может открыть клетку или поставить е нее флажок, указав тем самым, что в кпетке находится мина. Клетка открывается щелчкомлевой кнопки мыши, фпажок ставится щелчком правой. Если в кпетке, которую открыл игрок, есть мина, то происходить взрыв (сапер ошибся, а он. какизвестно, ошибается только один раз). и игра заканчивается. Если а кпетке мины нет, то в этой кпетке появляется число, соответствующее количеству мин. находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может
Файл Правка Мпадка П^раметрм pipw» 亠
Сапер 2003
Игра Сапер 2(103 является аналогом игры Сапер, входящей в состав MicrosoftWindows.
Правила
Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.
Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым. что в клетке находится мина Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок. есть мина, то происходить взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается Если в клетке мины нет. то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках,
Файл Правка Мпадка П^раметрм pipw» 亠
Сапер 2003
Игра Сапер 2(103 является аналогом игры Сапер, входящей в состав MicrosoftWindows.
Правила
Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.
Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым. что в клетке находится мина Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок. есть мина, то происходить взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается Если в клетке мины нет. то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках,
[С Сипер
[С Сипер
画е詔ер 2003
it] О про(рамме
画е詔ер 2003
it] О про(рамме
Правила
Игровое поле состоит из клеток, в каждой ИЗ которых может быть мина Задача игрока - найти все мины и пометить ихфлажками.
Правила
Игровое поле состоит из клеток, в каждой ИЗ которых может быть мина Задача игрока - найти все мины и пометить ихфлажками.
Используя кнопки мыши, игрок может открыть клетку или поставить е нее флажок, указав тем самым, что в кпетке находится мина. Клетка открывается щелчкомлевой кнопки мыши, фпажок ставится щелчком правой. Если в кпетке, которую открыл игрок, есть мина, то происходить взрыв (сапер ошибся, а он. какизвестно, ошибается только один раз). и игра заканчивается. Если а кпетке мины нет, то в этой кпетке появляется число, соответствующее количеству мин. находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может
Используя кнопки мыши, игрок может открыть клетку или поставить е нее флажок, указав тем самым, что в кпетке находится мина. Клетка открывается щелчкомлевой кнопки мыши, фпажок ставится щелчком правой. Если в кпетке, которую открыл игрок, есть мина, то происходить взрыв (сапер ошибся, а он. какизвестно, ошибается только один раз). и игра заканчивается. Если а кпетке мины нет, то в этой кпетке появляется число, соответствующее количеству мин. находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может
Рис. 8.1. Два способа представления справочной информации:классический и современный
Подготовка справочной информации
Исходным материалом для Microsoft Help Workshop является справочная информация, представленная в виде rtf-файла. Наиболее просто подготовить rtf-файл справочной информации можно при помощи Microsoft Word.
Сначала нужно набрать текст разделов справки. Заголовки разделов нужно оформить одним из стилей Заголовок. Каждый раздел должен заканчиваться символом "разрыв страницы".
После того как текст разделов будет набран, каждому разделу надо назначить идентификатор. Идентификатор назначается путем вставки перед заголовком раздела сноски #.
Для того чтобы назначить разделу идентификатор, нужно установить курсор перед первой буквой заголовка раздела, затем в меню Вставка выбрать команду Сноска, а появившемся диалоговом окне Сноски выбрать в группе Нумерация положение другая, в поле редактирования ввести символ "#" (рис. 8.2).
В результате щелчка на кнопке ОК в документ будет вставлена сноска #, а в нижней части окна документа откроется окно ввода текста сноски. В этом окне рядом со значком сноски надо ввести идентификатор раздела (рис. 8.3). Рекомендуется, чтобы идентификатор раздела состоял из префикса IDH и порядкового номера раздела, например, 工DH_1, IDH_2 и т. д.
QE339HBIH№£^: “卫凶
сноску Внизу страницы
Вдокумента
Нумерация —
「автоматическая1,2,3, ...
行 другая:I*
1
Отменаj|
Рис. 8.2. Чтобы задать идентификатор раздела, надо перед заголовком раздела вставить сноску
--айлrf:• •айлrf:• •s New Ros New RoЖ К*Ж К*Сноска, — помечает заголовок разделаСноска, — помечает заголовок раздела二―#Сапер・2003』Игра Саперигрывходящей в составWindowsПравила]клеток, вЗадача игрокавсе миныкнопкилевой кнопкиЕсли впроисходить-взрыв (сапер ошибся. а он.• как известно;ошибается только один раз),• и игра- заканчивается -Если-в клетке мины-нет, то-в-этой клетке появляется число, соответствующее- количеству мин, находящихся-в-соседних-клетках. Анализируя информацию о количестве-二―#Сапер・2003』Игра Саперигрывходящей в составWindowsПравила]клеток, вЗадача игрокавсе миныкнопкилевой кнопкиЕсли впроисходить-взрыв (сапер ошибся. а он.• как известно;ошибается только один раз),• и игра- заканчивается -Если-в клетке мины-нет, то-в-этой клетке появляется число, соответствующее- количеству мин, находящихся-в-соседних-клетках. Анализируя информацию о количестве-11мин в клетках,.соседнихс уже открытыми, игрок может обнаружить, пометить флажками, все . ^^»p*wi^/j^n^w«*4e«, м» wjn п»<» t^f^nt)-^1^^^^ сс.—gu^^u-.fhcpwr.",мат ’、at»,《^» епр-мин в клетках,.соседнихс уже открытыми, игрок может обнаружить, пометить флажками, все . ^^»p*wi^/j^n^w«*4e«, м» wjn п»<» t^f^nt)-^1^^^^ сс.—gu^^u-.fhcpwr.",мат ’、at»,《^» епр-
-
-
айл
rf:• •
айл
rf:• •
s New Ro
s New Ro
Ж К*
Ж К*
Сноска, — помечает заголовок раздела
Сноска, — помечает заголовок раздела
二―#Сапер・2003』
Игра Саперигрывходящей в состав
Windows
Правила]
клеток, вЗадача игрока
все мины
кнопки
левой кнопки
Если в
происходить-взрыв (сапер ошибся. а он.• как известно;ошибается только один раз),• и игра- заканчивается -Если-в клетке мины-нет, то-в-этой клетке появляется число, соответствующее- количеству мин, находящихся-в-соседних-клетках. Анализируя информацию о количестве-
二―#Сапер・2003』
Игра Саперигрывходящей в состав
Windows
Правила]
клеток, вЗадача игрока
все мины
кнопки
левой кнопки
Если в
происходить-взрыв (сапер ошибся. а он.• как известно;ошибается только один раз),• и игра- заканчивается -Если-в клетке мины-нет, то-в-этой клетке появляется число, соответствующее- количеству мин, находящихся-в-соседних-клетках. Анализируя информацию о количестве-
1
1
мин в клетках,.соседнихс уже открытыми, игрок может обнаружить, пометить флажками, все . ^^»p*wi^/j^n^w«*4e«, м» wjn п»<» t^f^nt)-^1^^^^ сс.—gu^^u-.fhcpwr.",мат ’、at»,《^» епр-
мин в клетках,.соседнихс уже открытыми, игрок может обнаружить, пометить флажками, все . ^^»p*wi^/j^n^w«*4e«, м» wjn п»<» t^f^nt)-^1^^^^ сс.—gu^^u-.fhcpwr.",мат ’、at»,《^» епр-
сноски
Текст сноски идентификатор разделаТекст сноски идентификатор раздела——**лиСтр. 1 Рйзд 11/2лиСтр. 1 Рйзд 11/2английский '由английский '由
Текст сноски идентификатор раздела
Текст сноски идентификатор раздела
—
—
*
*
ли
Стр. 1 Рйзд 11/2
ли
Стр. 1 Рйзд 11/2
английский '由
английский '由
Рис. 8.3. Вставка в документ сноски, помечающей заголовок раздела справки
Обычно в тексте справочной есть ссылки, которые обеспечивают переход к другому разделу, связанному с тем, который в момент видит пользователь.
Во время подготовки текста справочной информации слово-ссылку следует подчеркнуть двойной линией и сразу за этим словом, без пробела, поместить идентификатор раздела справки, к которому должен быть выполнен
переход в результате выбора ссылки. Вставленный идентификатор необходимо оформить как скрытый текст. Чтобы задать двойное подчеркивание, нужно выделить слово-ссылку, выбрать команду Формат | Шрифт и в появившемся окне выбрать способ подчеркивания. Аналогичным образом надо задать "скрытый текст" для идентификатора. В качестве примера на рис. 8.4 приведен вид окна редактора текста во время подготовки файла справочной информации для программы "Сапер 2003". Название игры помечено как ссылка на другой раздел справки, который имеет идентификатор IDH_3.
Ссылка наСсылка надругой разделдругой раздел羹 saper - Microsoft Word羹 saper - Microsoft Word■i Файл Правка Вив Вставка Формат Cgpeuc 工абсица Окно Справка■i Файл Правка Вив Вставка Формат Cgpeuc 工абсица Окно Справка!C言.0鋁昌®学亀0圈f・ 鳴国口 • 11用0年尸上, Gh!C言.0鋁昌®学亀0圈f・ 鳴国口 • 11用0年尸上, GhОбычный - Times New RomanОбычный - Times New Roman* 12 • 0 +觎 Coutier Ж Л 2 T匯■W正正便* 12 • 0 +觎 Coutier Ж Л 2 T匯■W正正便#Сапер-2003Ц—ттгрЫ^здбй^ОО^^^—^ является эналогом игры Сапер, входящей в состав Microsoft#Сапер-2003Ц—ттгрЫ^здбй^ОО^^^—^ является эналогом игры Сапер, входящей в состав MicrosoftWindows 田Windows 田「1「1
Ссылка на
Ссылка на
другой раздел
другой раздел
羹 saper - Microsoft Word
羹 saper - Microsoft Word
■i Файл Правка Вив Вставка Формат Cgpeuc 工абсица Окно Справка
■i Файл Правка Вив Вставка Формат Cgpeuc 工абсица Окно Справка
!C言.0鋁昌®学亀0圈f・ 鳴国口 • 11用0年尸上, Gh
!C言.0鋁昌®学亀0圈f・ 鳴国口 • 11用0年尸上, Gh
Обычный - Times New Roman
Обычный - Times New Roman
* 12 • 0 +觎 Coutier Ж Л 2 T匯■W正正便
* 12 • 0 +觎 Coutier Ж Л 2 T匯■W正正便
#Сапер-2003Ц
—ттгрЫ^здбй^ОО^^^—^ является эналогом игры Сапер, входящей в состав Microsoft
#Сапер-2003Ц
—ттгрЫ^здбй^ОО^^^—^ является эналогом игры Сапер, входящей в состав Microsoft
Windows 田
Windows 田
「1
「1
#ПравилаЦ
Игровое поле состоит из клеток,-в каждой из которых-может быть мина.-Задача игрока-• найти все- мины- и- пометить их- флажками .^
Используя кнопки мыши, игрок может-открыть клетку или поставить в нее флажок. указав тем самым.чтов клетке находится мина • Клетка-открывается-щелчком-левой-кнопки мыши,- флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходить взрыв-(сапер ошибся, а он, как известно, ошибается-только один раз), и игра- заканчивается. Если в клетке мины нет, то в этой-клетке появляется число, соответствующее-二 количеству-мин. находящихся-в соседних клетках. Аналиэируя информацию о количестве' 上 мин в клетках,-соседних с уже открытыми, игрок может обнаружить, пометить флажками, все 纟|
• ii«uu ■ CrcQл,、,аи,,,> из *mc“i,o,TDC sccrrcs nz«**o<юыыиh/* rbn^4votii« ывт ■ Onu^t^t ・ccc. 国川词》卜| ]
CwcKMiBceсноски
*IDH_11f*IDH_2U*IDH 二 ЗЦ<i т*IDH_11f*IDH_2U*IDH 二 ЗЦ<i тСтр. 1 Разд 11/2 晶 3;40f Ст 4Кол 1Стр. 1 Разд 11/2 晶 3;40f Ст 4Кол 1aK'fMkxHiaK'fMkxHi
*IDH_11f
*IDH_2U
*IDH 二 ЗЦ
<i т
*IDH_11f
*IDH_2U
*IDH 二 ЗЦ
<i т
Стр. 1 Разд 11/2 晶 3;40f Ст 4Кол 1
Стр. 1 Разд 11/2 晶 3;40f Ст 4Кол 1
aK'fMkxHi
aK'fMkxHi
Рис. 8.4. Оформление ссылки на другой раздел
Помимо ссылки, обеспечивающей переход к другому разделу справки, в документ можно вставить ссылку на комментарий — текст, который появляется во всплывающем окне. Во время работы справочной системы ссылки на комментарии выделяются цветом и подчеркиваются пунктирной линией. При подготовке документа справочной системы комментарии, как и разделы справки, располагают на отдельной странице, однако текст комментария не должен иметь заголовка. Сноска # должна быть поставлена перед текстом комментария. Ссылка на комментарий оформляется следующим образом: сначала надо подчеркнуть одинарной линией слово, выбор которого должен вызвать появление комментария, затем сразу после этого слова вставить идентификатор комментария, оформив его как скрытый текст.
Следует отметить, что справочная информация может быть распределена по нескольким файлам.
Проект справочной системы
Преобразование файла справочной информации в файл справочной системы выполняет входящий в состав Microsoft Help Workshop компилятор. Исходными данными для компилятора является справочная информация, представленная в виде rtf-файлов, и файл проекта справочной системы.
Для того чтобы преобразовать справочную информацию, подготовленную в редакторе текста, в справочную систему, сначала надо создать файл проекта справочной системы. Для этого нужно запустить Microsoft Help Workshop и в меню File выбрать команду New | Help Project (рис. 8.5). На экране появится диалоговое окно Project File Name. В этом окне (рис. 8.6) надо открыть папку, в которой находится файл справочной информации (rtf-файл), задать имя проекта и щелкнуть на кнопке Сохранить. В результате этих действий будет создан файл проекта (hpj-файл) и станет доступным окно проекта справочной системы (рис. 8.7).
Рис. 8.5. Начало работы над новым проектом
Первое, что надо сделать, — это добавить в проект rtf-файл, в котором находится справочная информация. Для этого нужно сначала щелкнуть на кнопке Files, затем в открывшемся окне Topic Files — на кнопке Add (рис. 8.8).
На экране появится стандартное диалоговое окно Открытие файла, исполь зуя которое можно выбрать нужный rtf-файл. Если справочная информаци: распределена по нескольким файлам, то операцию добавления файла нужн! повторить.
Рис. 8.6. В поле Имя файла надо ввести название проекта
Рис. 8.7. Окно проекта справочной системы
После того как все нужные файлы будут выбраны, надо в окне Topic Files щелкнуть на кнопке ОК. В результате этих действий вновь станет доступным окно проекта, в разделе [FILES] которого будут перечислены файлы, в которых находится справочная информация.
Следующее, что надо сделать, — это назначить числовые значения идентификаторам разделов справочной информации. Для этого в окне проекта надо сначала щелкнуть на кнопке Map, затем, в открывшемся окне Map, — на
кнопке Add (рис. 8.8). На экране появится окно Add Map Entry (рис. 8.9). В поле Topic ID этого окна надо ввести идентификатор раздела справки (идентификаторы были назначены разделам во время создания rtf-файла), в поле Mapped numeric value — число, идентифицирующее раздел. В поле Comment можно ввести комментарий — название раздела справки. После того как будут назначены числовые значения идентификаторам разделов справки, окно Map можно закрыть.
Рис. 8.8. Чтобы добавить в проект rtf-файл, щелкните на кнопке Add
Рис. 8.9. Назначение идентификатору раздела числового значения
Последнее, что надо сделать, — это настроить вид окна справочной информации. Для этого надо в окне проекта щелкнуть на кнопке Windows, в поле Create a window named открывшегося окна Create a window (рис. 8.10) ввести слово main и щелкнуть на кнопке ОК.
Рис. 8.10. Диалоговое окноРис. 8.11. В поле Title bar text надо ввести
Create a windowзаголовок окна справочной системы
На экране появится окно Window Properties, в поле Title bar text вкладки General которого нужно ввести заголовок главного окна создаваемой справочной системы (рис. 8.11).
Рис. 8.12. Работа над проектом простой справочной системы завершена; можно выполнить компиляцию
На этом процесс создания проекта простой справочной системы можно считать завершенным (рис. 8.12). Теперь можно выполнить компиляцию. Для этого надо в меню File выбрать команду Compile, в появившемся диалоговом окне Compile a Help File установить флажок Automatically display Help file in WinHelp when done (Автоматически показывать созданную справочную
систему по завершении компиляции) и щелкнуть на кнопке Compile (рис. 8.13).
Compile a Help File■*■!
'проёмы cb\$aper\SАРЕ^. H PJ -「一 ] 一一 "°竺' J
口 Minimize window while compiling
口 ^iiom<vhen dong
Temporary settings (for testing only)
厂工um off compression (reduces compile time)
口Include .rtffiervame and topic ID in Help file
Compile I Cancel I
Рис. 8.13. Чтобы выполнить компиляцию, надо щелкнуть на кнопке Compile
По завершении КОМПИЛЯЦИИ на экране появится окно с информационным сообщением о результатах компиляции и, если компиляция выполнена успешно, окно созданной справочной системы. Файл справочной системы (HLP-файл) компилятор поместит в ту папку, в которой находится файл проекта.
Вывод справочной информации
Обычно окно справочной системы становится доступным в результате нажатия клавиши <F1> или выбора в меню Справка команды ?.
Для того чтобы во время работы программы пользователь, нажав клавишу <F1>, мог получить справочную информацию, надо чтобы свойство HelpFile главного окна приложения содержало имя файла справочной системы, а свойство Helpcontext - числовой идентификатор нужного раздела (рис. 8.14).
Для каждого компонента формы можно задать свой раздел справки. Раздел справки, который появляется, если фокус находится на компоненте и пользователь нажимает клавишу <F1>, определяется значением свойства HeipContext этого компонента. Если значение свойства Helpcontext элемента управления равно нулю, то при нажатии клавиши <F1> появляется тот раздел справки, который задан для формы приложения.
Для того чтобы справочная информация появилась на экране в результате выбора в меню ? команды Справка, надо создать функцию обработки события Onclick для соответствующей команды меню. Процесс создания функции обработки события для команды меню ничем не отличается от процесса создания функции обработки события для элемента управления, например, для командной кнопки: в списке объектов надо выбрать объект типа
Tmenultem, для которого создается функция обработки события, а во вкладке Events — событие.
°@UJ 竺I°@UJ 竺IProperties j EventsProperties j Events"Clientwidth [688 一二JColor口cIBlnFacelEConstraints [(TSizeConstrainiCli3D[trueCursori crD efault"Clientwidth [688 一二JColor口cIBlnFacelEConstraints [(TSizeConstrainiCli3D[trueCursori crD efaultDefaullMonitor i dmActiveFormDefaullMonitor i dmActiveFormDockSite | falseDockSite | falseDragKindDtagModeEnabledSFontDragKindDtagModeEnabledSFontFamStyleHeight ;480HelpContext 1FamStyleHeight ;480HelpContext 1idmManual true RFonU fsNormalidmManual true RFonU fsNormalHelpF&e isapei.hlrfHelpF&e isapei.hlrfHelpKeyword j HelpType ; htContext HintAll shownHelpKeyword j HelpType ; htContext HintAll shownРис. 8.14. Свойство HelpFile должно содержать имя файла справки,а свойство HelpContext — идентификатор разделаРис. 8.14. Свойство HelpFile должно содержать имя файла справки,а свойство HelpContext — идентификатор разделаНиже приведена функция обработки события Onclick для команды Справка меню ?.Ниже приведена функция обработки события Onclick для команды Справка меню ?.// выбор в меню ? команды Справкаvoid _ fastcall TForml: :N3Click (TObj ect * Sender) {WinHelp (Forml->Handle, nsaper. hlpn, HELP_CONTEXT, 1);Вывод справочной информации выполняет функция WinHelp, которой в качестве параметра передается идентификатор окна программы, которая запрашивает вывод справочной информации, файл справки, константу HELP_CONTEXT и идентификатор раздела, содержимое которого должно быть отражено.// выбор в меню ? команды Справкаvoid _ fastcall TForml: :N3Click (TObj ect * Sender) {WinHelp (Forml->Handle, nsaper. hlpn, HELP_CONTEXT, 1);Вывод справочной информации выполняет функция WinHelp, которой в качестве параметра передается идентификатор окна программы, которая запрашивает вывод справочной информации, файл справки, константу HELP_CONTEXT и идентификатор раздела, содержимое которого должно быть отражено.HTML Help WorkshopПомимо стандартного, классического способа представления справочной информации, в современных программах все чаще используется представление информации в интернет-стиле (рис. 8.15).HTML Help WorkshopПомимо стандартного, классического способа представления справочной информации, в современных программах все чаще используется представление информации в интернет-стиле (рис. 8.15).
°@UJ 竺I
°@UJ 竺I
Properties j Events
Properties j Events
"Clientwidth [688 一二J
Color口cIBlnFace
lEConstraints [(TSizeConstraini
Cli3D[true
Cursori crD efault
"Clientwidth [688 一二J
Color口cIBlnFace
lEConstraints [(TSizeConstraini
Cli3D[true
Cursori crD efault
DefaullMonitor i dmActiveForm
DefaullMonitor i dmActiveForm
DockSite | false
DockSite | false
DragKind
DtagMode
Enabled
SFont
DragKind
DtagMode
Enabled
SFont
FamStyle
Height ;480
HelpContext 1
FamStyle
Height ;480
HelpContext 1
i
dmManual true RFonU fsNormal
i
dmManual true RFonU fsNormal
HelpF&e isapei.hlrf
HelpF&e isapei.hlrf
HelpKeyword j HelpType ; htContext Hint
All shown
HelpKeyword j HelpType ; htContext Hint
All shown
Рис. 8.14. Свойство HelpFile должно содержать имя файла справки,а свойство HelpContext — идентификатор раздела
Рис. 8.14. Свойство HelpFile должно содержать имя файла справки,а свойство HelpContext — идентификатор раздела
Ниже приведена функция обработки события Onclick для команды Справка меню ?.
Ниже приведена функция обработки события Onclick для команды Справка меню ?.
// выбор в меню ? команды Справка
void _ fastcall TForml: :N3Click (TObj ect * Sender) {
WinHelp (Forml->Handle, nsaper. hlpn, HELP_CONTEXT, 1);
Вывод справочной информации выполняет функция WinHelp, которой в качестве параметра передается идентификатор окна программы, которая запрашивает вывод справочной информации, файл справки, константу HELP_CONTEXT и идентификатор раздела, содержимое которого должно быть отражено.
// выбор в меню ? команды Справка
void _ fastcall TForml: :N3Click (TObj ect * Sender) {
WinHelp (Forml->Handle, nsaper. hlpn, HELP_CONTEXT, 1);
Вывод справочной информации выполняет функция WinHelp, которой в качестве параметра передается идентификатор окна программы, которая запрашивает вывод справочной информации, файл справки, константу HELP_CONTEXT и идентификатор раздела, содержимое которого должно быть отражено.
HTML Help Workshop
Помимо стандартного, классического способа представления справочной информации, в современных программах все чаще используется представление информации в интернет-стиле (рис. 8.15).
HTML Help Workshop
Помимо стандартного, классического способа представления справочной информации, в современных программах все чаще используется представление информации в интернет-стиле (рис. 8.15).
Jl=2?0U3.FJl=2?0U3.F回 Сапер 2003画 О прогрвмме 1回 Сапер 2003画 О прогрвмме 1ПравилаПравила
Jl=2?0U3.F
Jl=2?0U3.F
回 Сапер 2003
画 О прогрвмме 1
回 Сапер 2003
画 О прогрвмме 1
Правила
Правила
■E g 膏 障
СкрытьНазааПечатьПараметры
Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.
Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым, что в клетке находится мина. Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходить взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается, Если в клетке мины нет. то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может cK,se・s«v< сс・♦=—•«« 宀к~・“,с・««・ сс •”•,“ ・
Рис. 8.15. Современный, в интернет-стиле способ отображения справочной информации
Основой современной справочной системы являются компилированные HTML-документы — файлы с расширением chm. Chm-файл получается путем компиляции (объединения) файлов, составляющих HTML-документ.
Отображение справочной информации обеспечивает операционная система.
Создать chm-файл можно при помощи утилиты Microsoft HTML Help Workshop. Исходной информацией для компилятора справочной системы являются файлы HTML, файлы иллюстраций и файл проекта.
Чтобы получить chm-файл, надо:
О подготовить справочную информацию в виде набора HTM L-до кументов;
口создать файл проекта;
口создать файл контекста (содержания);
口выполнить компиляцию.
Последние три из перечисленных выше шагов выполняются в программе HTML Help Workshop.
Подготовка справочной информации
Подготовить справочную информацию в HTML-формате можно при помощи любого редактора текста. Наиболее быстро это можно сделать, если редактор позволяет сохранить набранный текст как HTML-документ. Можно воспользоваться и встроенным редактором Microsoft HTML Help Workshop, но для этого надо знать язык HTML (по крайней мере, его основы).
В простейшем случае вся справочная информация может быть помещена в один HTML-файл. Однако если для навигации по справочной системе предполагается использовать вкладку Содержание (см. рис. 8.15), в которой будут перечислены разделы справочной информации, то в этом случае информацию каждого раздела нужно поместить в отдельный HTML-файл.
Использование Microsoft Word
Сначала нужно набрать текст разделов справки (каждый раздел в отдельном файле). Заголовки разделов и подразделов надо оформить одним из стилей Заголовок. Заголовки разделов, как правило, оформляют стилем Заголовок!, подразделов — стилем Заголовок 2.
Следующее, что надо сделать, — это вставить закладки в те точки документа, в которые предполагаются переходы из других разделов справочной системы. Чтобы вставить закладку, нужно установить курсор в точку текста, в которой должна быть закладка, из меню Вставка выбрать команду Закладка и в поле Имя закладки диалогового окна Закладка ввести имя закладки (рис. 8.16).
Рис. 8.16. Добавление закладки
Имя закладки должно отражать суть предполагаемого перехода к закладке, содержимое помечаемого фрагмента текста. В имени закладки пробел использовать нельзя. Вместо пробела можно поставить символ подчеркивания. Заголовки, оформленные стилем Заголовок, помечать закладками не надо. Таким образом, если в создаваемой справочной системе предполагаются переходы только к заголовкам разделов справочной информации, закладки можно не вставлять.
После того как будут расставлены закладки, можно приступить к расстановке ссылок. Различают ссылки, которые обеспечивают навигацию внутри
раздела, и те, которые обеспечивают переход к другому разделу справочной системы.
Чтобы вставить ссылку, обеспечивающую навигацию внутри раздела, надо выделить фрагмент текста (слово или фразу), при выборе которого должен быть выполнен переход, из меню Вставка выбрать команду Гиперссылка, в появившемся окне Добавление гиперссылки (рис. 8,17) сначала щелкнуть на кнопке Связать с местом в этом документе, затем — выбрать закладку или заголовок, к которому должен быть выполнен переход.
Рис.8.17. Выборточкидокументадляпереходапоссылке
Если нужно вставить в документ ссылку на раздел справки, который находится в другом файле, то в диалоговом окне Добавление гиперссылки надо щелкнуть на кнопке Файл и в появившемся стандартном окне выбрать имя нужного HTML-файла.
После того как в документ будут помещены все необходимые гиперссылки, документ нужно сохранить в HTML-формате.
Использование HTML Help Workshop
Использование HTML-редактора, входящего в состав HTML Help Workshop, предполагает знание основ HTML — языка гипертекстовой разметки (далее приведены краткие сведения об HTML, которых достаточно для того, чтобы создать вполне приличную справочную систему).
Чтобы создать HTML-файл, надо запустить HTML Help Workshop, из меню File выбрать команду New | HTML File и в появившемся окне HTML Title
(рис. 8.18) задать название раздела справки, текст которого будет находиться в создаваемом файле.
Mhtmih .Mhtmih .• (uMM做阈• (uMM做阈围ZF' —围ZF' —加N加N且剪司竺1倒口 面、1 b1/Tu||<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD><meta name="GENERATOR" contents"Microsoft® HTML Help Workshop 4.1 "><TITLE>Untitled</TITLE></HtAU><BODY>且剪司竺1倒口 面、1 b1/Tu||<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML><HEAD><meta name="GENERATOR" contents"Microsoft® HTML Help Workshop 4.1 "><TITLE>Untitled</TITLE></HtAU><BODY></BODY></HTML></BODY></HTML>
Mhtmih .
Mhtmih .
• (uMM做阈
• (uMM做阈
围ZF' —
围ZF' —
加N
加N
且剪司竺1倒
口 面、1 b1/Tu||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" contents"Microsoft® HTML Help Workshop 4.1 ">
<TITLE>Untitled</TITLE>
</HtAU>
<BODY>
且剪司竺1倒
口 面、1 b1/Tu||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" contents"Microsoft® HTML Help Workshop 4.1 ">
<TITLE>Untitled</TITLE>
</HtAU>
<BODY>
</BODY>
</HTML>
</BODY>
</HTML>
Рис. 8.18. Начало работы над новым HTML-файлом
После щелчка на кнопке ОК становится доступным окно HTML-редактора, в котором находится шаблон HTML-документа. В 3TdM окне, сразу после строки <BODY>, можно набирать текст.
Основы HTML
HTML-документ представляет собой текст, в который помимо обычного текста включены специальные последовательности символов — теги. Тег начинается символом < и заканчивается символом >. Теги используются программами отображения HTML-документов для форматирования текста в окне просмотра (сами теги не отображаются).
Большинство тегов парные. Например, пара тегов <Н2> </H2> сообщает программе отображения HTML-документа, что текст, который находится между этими тегами, является заголовком второго уровня и должен быть отображен соответствующим стилем.
В табл. 8.1 представлен минимальный набор тегов, используя которые можно подготовить HTML-файл с целью дальнейшего его преобразования в chm-файл справочной системы.
Таблица 8.1. HTML-теги
Тег
Пояснение
<TITLE> Название </TITLE>
Задает название HTML-документа. Программы отображения HTML-документов, как правило, выводят название документа в заголовке окна, в котором документ отображается. Если название не задано, то в заголовке окна будет выведено название файла
<BODY BACKGROUND = "Файл"
BGC0L0R="〃8eT"
ТЕХТ=пЦветп>
Параметр BACKGROUND задает фоновый рисунок, BGCOLOR — цвет фона, TEXT — цвет символов HTML-документа
<BASEFONT ЕАСЕ=пП^ифтм
S工ZE=n>
Задает основной шрифт, который используется для отображения текста: FACE- название шрифта, SIZE- размер в относительных единицах. По умолчанию значение параметра SIZE равно 3. Размер шрифта заголовков (см. тег <н>) берется от размера, заданного параметром SIZE
<Н1> </Н1>
Определяет текст, находящийся между тегами <Н1> и </Hl>, как заголовок уровня 1. Пара тегов <Н2> </H2> определяет заголовок второго уровня, а пара <нз> </нз> — третьего
<BR>
Конец строки. Текст, находящийся после этого тега, будет выведен с начала новой строки
<р> </р>
Текст, находящийся внутри этих тегов, является параграфом
<в> </в>
Текст, находящийся внутри этой пары тегов, будет выделен полужирным
<1> </!>
Текст, находящийся внутри этой пары тегов, будет выделен курсивом
<А NAME= ** Закладка ** > </А>
Помечает фрагмент документа закладкой. Имя закладки задает параметр NAME. Это имя используется для перехода к закладке
<А HRE F= ” байл • h tm#3a кладка ” >
</А>
Выделяет фрагмент документа как гиперссылку, при выборе которой происходит перемещение к закладке, имя которой указано в параметре HREF
<IMG SRC=”Иллюстрация"〉
Выводит иллюстрацию, имя файла которой указано в параметре SRC
<!—.—>
Комментарий. Текст, находящийся между дефисами, на экран не выводится
Набирается HTML-текст обычным образом. Теги можно набирать как прописными, так и строчными буквами. Однако, для того чтобы лучше былг видна структура документа, рекомендуется записывать все теги строчными (большими) буквами. Следующее, на что надо обратить внимание — это то что программы отображения HTML-документов игнорируют "лишние" пробелы и другие "невидимые" символы (табуляция, новая строка). Это значит. что для того чтобы фрагмент документа начинался с новой строки, в конце предыдущей строки надо поставить тег <BR>, а для того чтобы между строками текста появилась пустая строка, в HTML-текст надо вставить два тега <BR> подряд.
Работая с HTML-редактором в программе HTML Help Workshop, уже в процессе набора HTML-текста можно увидеть, как будет выглядеть набираемый текст. Для этого надо из меню View выбрать команду In Browser или щелкнуть на командной кнопке, на которой изображен стандартный значок Internet Explorer.
В качестве примера на рис. 8.19 приведен текст одного из разделов справочной системы программы "Сапер 2003".
<HTML>
<Т1ТЬЕ>Правила</Т1ТЬЕ>
<BODY BGCOLOR=#FFFFFF BACKGROUND = "">
<BASEFONT FACEiArial" SIZE=2>
<A NAME="Правилап><Н2>Правила</Н2></А><Р>Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока — найти все мины и пометить их флажками.</P> <Р>Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым, что в клетке находится мина. Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходить взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается:. Если в клетке мины нет, то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может обнаружить, пометить флажками, все мины. Ограничений на количество клеток, помеченных флажками, нет. Однако, для завершения игры (выигрыша) флажки должны быть установлены только в тех клетках, в которых есть мины. Ошибочно установленный флажок можно убрать, щелкнув правой кнопкой мыши в клетке, в которой он находится.</Р>
<I>Cm.</I><BR>
<А HREF="saper_01. htm.#Canep_2 003" >Сапер 2003</AXBR>
<А HREF=nsaper_03. ЬСт#0__программен>0 программе< /A><BR>
</BODY>
</HTML>
Создание файла справки
После того как справочная информация будет подготовлена, можно приступить к непосредственному созданию справочной системы.
Сначала надо запустить HTML Help Workshop, из меню File выбрать команду New | Project и в окне New Project задать имя файла проекта создаваемой справочной системы (рис. 8.20). После щелчка на кнопке Далее в этом и следующем окнах окно HTML Help Workshop должно выглядеть так, как показано на рис. 8.21.
Рис. 8.20. Начало работы над новым проектом
Первое, что надо сделать,— это сформировать раздел [FILES], который должен содержать имена HTML-файлов, в которых находится справочная информация. Чтобы добавить в раздел [FILES] имя файла, надо щелкнуть на кнопке Add/Remove topic files (см. рис. 8.21), а затем в появившемся диалоговом окне Topic Files (рис. 8.22) — на кнопке Add, после чего в появившемся стандартном диалоговом окне Открыть выбрать HTML-файл раздела справки. Если справочная информация распределена по нескольким файлам, то операцию добавления нужно повторить несколько раз. После того как в диалоговом окне Topic Files будут перечислены все необходимые для создания справочной информации HTML-файлы, нужно щелкнуть на кнопке ОК. В результате этих действий в файле проекта появится раздел [FILES], в котором будут перечислены HTML-файлы, используемые для создания справочной системы (рис. 8.23).
Следующее, что надо сделать, — это задать главный (стартовый) раздел и заголовок окна справочной системы. Заголовок и имя файла главного раздела вводятся соответственно в поля Title и Default file вкладки General диа-
ЛОГОВОГО окна Options (рис. 8.24), которое появляется в результате щелчка на кнопке Change project options (см. рис. 8.21).
Если для навигации по справочной системе предполагается использовать вкладку Содержание, то надо создать файл контекста. Чтобы это сделать, нужно щелкнуть на вкладке Contents, подтвердить создание нового файла и
ChtmlHelp Workshop
File View Test Tools №)p
Change project
options
Add / Removetopic files
u- D- F一1Й
jj Contents | Index j Help
[OPTIONS]
Compatibility;】Л
Compiled file=$aper.chm Display compile progre$s=No Language=0x419 Русский
D:\npoeKTbi CB\5aper\saper.hhp
Рис. 8.21. Окно HTML Help Workshop в начале работы над новым проектом
t?HTML Help Workshop
File tfew Lest Took (Help
Project | Contents | Index | Help
a~71- K_ 闻el曳
[OPTIONS]
Compatibility»! .1
Compiled file^saper.chm Display compile progre$s=No Language«0x41 9 Русский
(FILES}
sapef_01 .htm
saper_02.htm
saper_O3.htm
D "Проекты CBiSaper\saper.hhp
Рис. 8.23. В разделе [FILES] перечислены файлы, используемые для создания chm-файла
Рис. 8.24. В диалоговом окне Options надо задать заголовок окна справочной системы и файл главного раздела
|f? HTML Help Worfctbap
£te y»ew [sst TqoIs Це1р
口1寸| T|w| 也I口1寸| T|w| 也I岡岡D:\npoeKTN CBpapw p^per. hhpD:\npoeKTN CBpapw p^per. hhpРис. 8.25. Вкладка ContentsРис. 8.25. Вкладка ContentsInsert a headingInserta pageEdit JselectionInsert a headingInserta pageEdit Jselection^ ^ 一1一宣王X一^ ^ 一1一宣王X一
口1寸| T|w| 也I
口1寸| T|w| 也I
岡
岡
D:\npoeKTN CBpapw p^per. hhp
D:\npoeKTN CBpapw p^per. hhp
Рис. 8.25. Вкладка Contents
Рис. 8.25. Вкладка Contents
Insert a heading
Insert
a page
Edit J
selection
Insert a heading
Insert
a page
Edit J
selection
^ ^ 一1一宣王X一
^ ^ 一1一宣王X一
задать имя файла контекста, в качестве которого можно использовать имя проекта. В результате станет доступной вкладка Contents (рис. 8.25), в которую нужно ввести содержание — названия разделов справочной системы.
Содержание справочной системы принято изображать в виде иерархического списка. Элементы верхнего уровня соответствуют разделам, а подчиненные им элементы — подразделам и темам.
Чтобы во вкладку Contents добавить элемент, соответствующий разделу справочной системы, нужно щелкнуть на кнопке Insert a heading, в поле Entry title появившегося диалогового окна Table of Contents Entry (рис. 8.26) ввести название раздела и щелкнуть на кнопке Add. На экране появится окно Path or URL (рис. 8.27). В поле HTML titles этого окна будут перечислены названия разделов (заголовки HTML-файлов) справочной информации, которая находится во включенных в проект файлах (имена этих файлов указаны в разделе [FILES] вкладки Project). Если вместо названия раздела будет указано имя файла, это значит, что в соответствующем файле нет тега <TITLE>. Выбрав раздел, надо щелкнуть на кнопке ОК. В результате перечисленных выше действий во вкладке Contents появится строка с названием раздела справочной информации.
При необходимости изменить значок, соответствующий добавленному разделу, следует щелкнуть на кнопке Edit selection и, используя список Image index вкладки Advanced окна Table of Contents, выбрать нужный значок (обычно рядом с названием раздела или подраздела изображена книжка).
Рис. 8.26. Добавление элемента в список разделов
Рис. 8.27. Выбор файла, соответствующего элементу списка разделов
Подраздел добавляется точно так же, как и раздел, с тем только отличием, что после того как подраздел будет добавлен, нужно щелкнуть на кнопке Move selection right. В результате чего уровень заголовка понизится, т. е. раздел станет подразделом.Элементы содержания, соответствующие темам справочной информации, добавляются аналогичным образом, но процесс начинается щелчком на кнопке Insert a page.Иногда возникает необходимость изменить порядок следования элементов списка содержания или уровень иерархии элемента списка. Сделать это можно при помощи командных кнопок, на которых изображены стрелки. Кнопки Move selection up и Move selection down перемещают выделенный элемент списка, соответственно, вверх и вниз. Кнопка Move selection right перемещает выделенный элемент вправо, т. е. делает его подчиненным предыдущему элементу списка. Кнопка Move selection left выводит элемент из подчиненности предыдущему элементу.В качестве примера на рис. 8.28 приведена вкладка Contents справочной системы программы "Сапер 2003".Подраздел добавляется точно так же, как и раздел, с тем только отличием, что после того как подраздел будет добавлен, нужно щелкнуть на кнопке Move selection right. В результате чего уровень заголовка понизится, т. е. раздел станет подразделом.Элементы содержания, соответствующие темам справочной информации, добавляются аналогичным образом, но процесс начинается щелчком на кнопке Insert a page.Иногда возникает необходимость изменить порядок следования элементов списка содержания или уровень иерархии элемента списка. Сделать это можно при помощи командных кнопок, на которых изображены стрелки. Кнопки Move selection up и Move selection down перемещают выделенный элемент списка, соответственно, вверх и вниз. Кнопка Move selection right перемещает выделенный элемент вправо, т. е. делает его подчиненным предыдущему элементу списка. Кнопка Move selection left выводит элемент из подчиненности предыдущему элементу.В качестве примера на рис. 8.28 приведена вкладка Contents справочной системы программы "Сапер 2003".;?HTML Help Workshop;?HTML Help WorkshopFile View lest Tools tlelp口闾《囱理]Pioject Contents I index | Help |File View lest Tools tlelp口闾《囱理]Pioject Contents I index | Help |ЩСапер2003回 ПрадипаЩСапер2003回 Прадипа□ программе□ программе■ IE*■ IE*РцПроекты CB\5apertsaper.hhpРцПроекты CB\5apertsaper.hhp
Подраздел добавляется точно так же, как и раздел, с тем только отличием, что после того как подраздел будет добавлен, нужно щелкнуть на кнопке Move selection right. В результате чего уровень заголовка понизится, т. е. раздел станет подразделом.
Элементы содержания, соответствующие темам справочной информации, добавляются аналогичным образом, но процесс начинается щелчком на кнопке Insert a page.
Иногда возникает необходимость изменить порядок следования элементов списка содержания или уровень иерархии элемента списка. Сделать это можно при помощи командных кнопок, на которых изображены стрелки. Кнопки Move selection up и Move selection down перемещают выделенный элемент списка, соответственно, вверх и вниз. Кнопка Move selection right перемещает выделенный элемент вправо, т. е. делает его подчиненным предыдущему элементу списка. Кнопка Move selection left выводит элемент из подчиненности предыдущему элементу.
В качестве примера на рис. 8.28 приведена вкладка Contents справочной системы программы "Сапер 2003".
Подраздел добавляется точно так же, как и раздел, с тем только отличием, что после того как подраздел будет добавлен, нужно щелкнуть на кнопке Move selection right. В результате чего уровень заголовка понизится, т. е. раздел станет подразделом.
Элементы содержания, соответствующие темам справочной информации, добавляются аналогичным образом, но процесс начинается щелчком на кнопке Insert a page.
Иногда возникает необходимость изменить порядок следования элементов списка содержания или уровень иерархии элемента списка. Сделать это можно при помощи командных кнопок, на которых изображены стрелки. Кнопки Move selection up и Move selection down перемещают выделенный элемент списка, соответственно, вверх и вниз. Кнопка Move selection right перемещает выделенный элемент вправо, т. е. делает его подчиненным предыдущему элементу списка. Кнопка Move selection left выводит элемент из подчиненности предыдущему элементу.
В качестве примера на рис. 8.28 приведена вкладка Contents справочной системы программы "Сапер 2003".
;?HTML Help Workshop
;?HTML Help Workshop
File View lest Tools tlelp
口闾《囱理]
Pioject Contents I index | Help |
File View lest Tools tlelp
口闾《囱理]
Pioject Contents I index | Help |
ЩСапер2003
回 Прадипа
ЩСапер2003
回 Прадипа
□ программе
□ программе
■ IE*
■ IE*
РцПроекты CB\5apertsaper.hhp
РцПроекты CB\5apertsaper.hhp
Рис. 8.28. Вкладка Contents содержит названия разделов справочной системы
Компиляция
После того как будут определены файлы, в которых находится справочная информация (сформирован раздел [FILES]) и подготовлена информация для
формирования вкладки Содержание (создан файл контекста), можно выполнить компиляцию — преобразовать исходную справочную информацию в файл справочной системы (chm-файл).
Исходной информацией для HTML Help компилятора являются:
口файл проекта (hhp-файл);
□ файл контекста (hhc);
口файлы справочной информации (htni-файлы);
П файлы иллюстраций (gif- иjpg-файлы).
Результатом компиляции является файл справочной системы (chm-файл).
Чтобы выполнить компиляцию, надо в меню File выбрать команду Compile, в появившемся диалоговом окне Create a compiled file (рис. 8.29) установить переключатель Automatically display compiled help file when done (после компиляции показать созданный файл справки) и щелкнуть на кнопке Compile. В результате этого будет создан файл справки и на экране появится окно справочной системы, в котором будет выведена информация главного раздела.
Рис. 8.29. Диалоговое окно Create a compiled file
Вывод справочной информации
Вывести справочную информацию, которая находится в chm-файле, можно несколькими способами. Наиболее просто это сделать при помощи утилиты hh.exe, являющейся составной частью Windows. Вызвать утилиту отображения справочной информации и передать ей в качестве параметра имя файла справочной системы можно при помощи функции WinExec. У функции WinExec два параметра. Первый — имя выполняемого файла программы, которую надо запустить, и командная строка. Второй параметр определяет способ отображения окна запускаемой программы. Окно запускаемой программы может быть развернуто на весть экран (SW_MAXIMIZE), запущенная
программа может работать в свернутом окне (SW_MINIMIZE) или окно программы может иметь размер и положение такие, какими они были в предыдущем сеансе работы (SW_RESTORE). Ниже в качестве примера приведена функция обработки события click на кнопке Справка. Функция обеспечивает вывод справочной информации, которая находится в файле saper.chm.
// Щелчок на кнопке Справка
void _fastcall TForml::Button2Click(TObject *Sender)
(
WinExec("hh saper.chmH,SW_RESTORE);
ГЛАВА 9
Создание
установочного диска
Современные программы распространяются на компакт-дисках. Процесс установки программы, который, как правило, предполагает не только создание каталога и перенос в него выполняемых файлов и файлов данных с промежуточного носителя, но и настройку системы, для многих пользователей является довольно трудной задачей. Поэтому установку прикладной программы на компьютер пользователя обычно возлагают на специальную программу, которая находится на том же диске, что и файлы программы, которую надо установить. Таким образом, разработчик прикладной программы помимо основной задачи должен создать программу установки -一 инсталляционную программу.
Инсталляционная программа может быть создана точно так же, как и любая другая программа. Задачи, решаемые во время инсталляции, являются типовыми. Поэтому существуют инструментальные средства, используя которые можно быстро создать инсталляционную программу, точнее, установочный диск, не написав ни одной строчки кода.
Программа InstallShield Express
Одним из популярных инструментов создания инсталляционных программ является пакет InstallShield Express. Borland настоятельно рекомендует использовать именно эту программу, поэтому она есть на установочном диске C++ Builder.
Процесс создания инсталляционного диска (CD-ROM) при помощи InstallShield Express рассмотрим на примере.
Пусть нужно создать инсталляционную дискету для программы "Сапер". Перед тем как непосредственно приступить к созданию установочной программы в InstallShield Express, нужно выполнить подготовительную работу — составить список файлов, которые должны быть установлены на ком-
пьютер пользователя; используя редактор текста, подготовить rtf-файлы лицензионного соглашения (EULA — End User Licensia Agreement) и краткой справки (readme-файл). Список файлов программы "Сапер", которые должны быть перенесены на компьютер пользователя, приведен в табл. 9.1.
Таблица 9.1. Файлы программы "Сапер", которые нужно установить на компьютер пользователя
Файл
Назначение
Куда устанавливать
Saper.exe
Программа
Program Files\Saper
Saper.chm
Файл справочной информации
Program Files\Saper
Readme.rtf
Краткая справка о программе
Program Files\Saper
Eula.rtf
Лицензионное соглашение
Program Files\Saper
Новый проект
После того как будет составлен список файлов, нужно запустить InstallShield Express, из меню File выбрать команду New и в поле Project Name and Location ввести имя файла проекта (рис. 9.1).
Рис. 9.1. Начало работы над новым проектом
После щелчка на кнопке ОК открывается окно проекта создания инсталляционной программы (рис. 9.2). В левой части окна перечислены этапы процесса создания и команды, при помощи которых задаются параметры создаваемой инсталляционной программы.
Команды настройки объединены в группы, название и последовательность которых отражает суть процесса создания инсталляционной программы. Заголовки групп пронумерованы. Настройка программы установки выполняется путем последовательного выбора команд. В результате выбора команды в правой части главного окна появляется список параметров. Команды, которые были выполнены, помечаются галочками.
Я Saper - Installshield Express Borland Limited EditionЯ Saper - Installshield Express Borland Limited EditionI Organize Your SetupI Organize Your Setup口 InstallShieldTodayHelp卜 Organize Your Setup国General InformationQp Features口 InstallShieldTodayHelp卜 Organize Your Setup国General InformationQp FeaturesOrganize Your SetupOrganize Your SetupЭ Setup Types 却 Upgrade Paths 0❷ Specify Application DataftFiles and FeaturesЭ Setup Types 却 Upgrade Paths 0❷ Specify Application DataftFiles and FeaturesВ❸В❸曰❹曰❹幽Objects/Merge Module: 陶DependenciesConfigure the Target Systemй Shortcuts/FoldersRegistryODBC Resources 働INI File Changes . File Extensions 礬Environment VariablesCustomize the Setup Appearai幽Objects/Merge Module: 陶DependenciesConfigure the Target Systemй Shortcuts/FoldersRegistryODBC Resources 働INI File Changes . File Extensions 礬Environment VariablesCustomize the Setup Appearain Dialogsn DialogsIIThe first step in building anything is to lay a solid foundation. The base of your setup is formed by specifying application information through the General Information view and creating features in the Features view.The first step in building anything is to lay a solid foundation. The base of your setup is formed by specifying application information through the General Information view and creating features in the Features view.回General Information回General InformationThe General Infarmation view is where you set global project properties such as the application name and support information. Most of the properties in this view are optional. Your setup will work properly if you accept the defaults or do not provide values for the optional properties. However, the following properties are required: Subject, Product Name, Publisher, Product:Code, Upgrade Code, and Destination Folder,The General Infarmation view is where you set global project properties such as the application name and support information. Most of the properties in this view are optional. Your setup will work properly if you accept the defaults or do not provide values for the optional properties. However, the following properties are required: Subject, Product Name, Publisher, Product:Code, Upgrade Code, and Destination Folder,命 Features命 FeaturesFeatures are the building blocks of your setup. They represent aFeatures are the building blocks of your setup. They represent aЛ1Л1
Я Saper - Installshield Express Borland Limited Edition
Я Saper - Installshield Express Borland Limited Edition
I Organize Your Setup
I Organize Your Setup
口 InstallShieldToday
Help
卜 Organize Your Setup
国General Information
Qp Features
口 InstallShieldToday
Help
卜 Organize Your Setup
国General Information
Qp Features
Organize Your Setup
Organize Your Setup
Э Setup Types 却 Upgrade Paths 0❷ Specify Application Data
ft
Files and Features
Э Setup Types 却 Upgrade Paths 0❷ Specify Application Data
ft
Files and Features
В❸
В❸
曰❹
曰❹
幽Objects/Merge Module: 陶Dependencies
Configure the Target Systemй Shortcuts/Folders
Registry
ODBC Resources 働INI File Changes . File Extensions 礬Environment Variables
Customize the Setup Appearai
幽Objects/Merge Module: 陶Dependencies
Configure the Target Systemй Shortcuts/Folders
Registry
ODBC Resources 働INI File Changes . File Extensions 礬Environment Variables
Customize the Setup Appearai
n Dialogs
n Dialogs
I
I
The first step in building anything is to lay a solid foundation. The base of your setup is formed by specifying application information through the General Information view and creating features in the Features view.
The first step in building anything is to lay a solid foundation. The base of your setup is formed by specifying application information through the General Information view and creating features in the Features view.
回General Information
回General Information
The General Infarmation view is where you set global project properties such as the application name and support information. Most of the properties in this view are optional. Your setup will work properly if you accept the defaults or do not provide values for the optional properties. However, the following properties are required: Subject, Product Name, Publisher, Product:Code, Upgrade Code, and Destination Folder,
The General Infarmation view is where you set global project properties such as the application name and support information. Most of the properties in this view are optional. Your setup will work properly if you accept the defaults or do not provide values for the optional properties. However, the following properties are required: Subject, Product Name, Publisher, Product:Code, Upgrade Code, and Destination Folder,
命 Features
命 Features
Features are the building blocks of your setup. They represent a
Features are the building blocks of your setup. They represent a
Л1
Л1
Ready
Рис. 9.2. В левой части окна проекта перечислены этапы и команды процесса созданияинсталляционной программы
Структура
Команды группы Organize Your Setup (рис. 9.3) позволяют задать структуру программы установки.
Organize Your 5etup
3 General Information
Features
Setup Types
Upgrade Paths
Рис.9.З.КомандыгруппыOrganizeYourSetup
В результате выбора команды General Information в правой части окна раскрывается список, в который нужно ввести информацию об устанавливаемой программе.
Значения большинства параметров, за исключением тех, которые идентифицируют устанавливаемую программу и ее разработчика, можно оставить
без изменения. Параметры, значения которых нужно изменить, приведены в табл. 9.2.
Таблица 9.2. Параметры команды General Information
Параметр
ОпределяетЗначение
Product Name
Название устанавливаемойSaper
программы
Product Version
Версия устанавливаемой1.01.0001
программы
INSTALLDIR
Каталог компьютера пользова- [PrograraFilesFolder] Saper теля, в который будет установлена программа
Следует обратить внимание на параметр INSTALLDIR. По умолчанию предполагается, что программа будет установлена в каталог, предназначенный для программ. Поскольку во время создания инсталляционной программы нельзя знать, как на компьютере пользователя называется каталог программ и на каком диске он находится, то вместо имени реального каталога используется его Псевдоним — [ProgramFilesFolder]. В процессе установки программы на компьютер пользователя инсталляционная программа получит из реестра Windows имя каталога программ и заменит псевдоним на это имя.
Другие псевдонимы, которые используются в программе InstallShield Express, приведены в табл. 9.3
Таблица 9.3. Некоторые псевдонимы каталогов Windows
Псевдоним
Каталог
[WindowsVolume ]
Корневой каталог диска, на котором находится Windows
[WindowsFolder]
Каталог Windows, например C:\Winnt
[SystemFolder]
Системный каталог Windows, например C:\Winnt\System32
[ProgramFilesFolder]
Каталог программ, например C:\Program Files
[PersonalFolder]
Папка Мои документы на рабочем столе (расположение папки зависит от версии ОС и способа входа в систему)
Очевидно, что возможности инсталлированной программы определяются составом установленных компонентов. Например, если установлены файлы справочной системы, то пользователю в процессе работы с программой доступна справочная информация. Команда Features (возможности) позволяет создать (определить) группы компонентов, которые определяют воз-
можности программы и которые могут устанавливаться по отдельности. Разделение компонентов на группы позволяет организовать многовариантную, в том числе и определяемую пользователем, установку программы.
В простейшем случае группа Features состоит из одного элемента Always Install. Чтобы добавить элемент в группу Features, нужно щелкнуть правой кнопкой мыши на слове Features, из появившегося контекстного меню выбрать команду New Feature Ins и ввести имя новой группы, например Help Files and samples. После этого в поле Description нужно ввести краткую характеристику элемента, а в поле Comments — комментарий (рис. 9.4).
白力j Features白力j Features阳州阪胃然酬阳州阪胃然酬AM. ■■■■ p— FeatureAM. ■■■■ p— Feature® Up Help Files and Samples® Up Help Files and SamplesDescriptionDescriptionEnter the description for this Feature here.Enter the description for this Feature here.Remote InstallationRemote InstallationFavor LocalFavor Local
白力j Features
白力j Features
阳州阪胃然酬
阳州阪胃然酬
AM. ■■■■ p— Feature
AM. ■■■■ p— Feature
® Up Help Files and Samples
® Up Help Files and Samples
Description
Description
Enter the description for this Feature here.
Enter the description for this Feature here.
Remote Installation
Remote Installation
Favor Local
Favor Local
AdvertisedCommentsREG File To Merge At BuildAdvertisedCommentsREG File To Merge At BuildAllow Advertise
Advertised
Comments
REG File To Merge At Build
Advertised
Comments
REG File To Merge At Build
Enter comments regarding this feature here.
Рис. 9.4. Несколько элементов в группе Features обеспечивают возможностьмноговариантной установки
Команда Setup Types позволяет задать, будет ли пользователю во время установки программы предоставлена возможность выбрать (в диалоговом окне Setup Type) вариант установки. Установка может быть обычной (Typical), минимальной (Minimal) или выборочной (Custom). Если устанавливаемая программа сложная, т. е. состоит из нескольких независимых компонентов, то эта возможность обычно предоставляется.
Для программы "Сапер" предполагается только один вариант установки - Typical. Поэтому флажки Minimal и Custom нужно сбросить (рис. 9.5).
~|宙 Installshield TodayX Helpt • Organize Your Setupi/General InformationQp FeaturesT Setup Types承Upgrade Paths 曰❷ Specify Application Data⑶ Files'词Files and Features~|宙 Installshield TodayX Helpt • Organize Your Setupi/General InformationQp FeaturesT Setup Types承Upgrade Paths 曰❷ Specify Application Data⑶ Files'词Files and FeaturesSetup TypesSetup TypesV尊 &Typical :j® &Winimal J宴 Cu&stomV尊 &Typical :j® &Winimal J宴 Cu&stom
~|宙 Installshield Today
X Help
t • Organize Your Setup
i/General Information
Qp Features
T Setup Types
承Upgrade Paths 曰❷ Specify Application Data
⑶ Files
'词Files and Features
~|宙 Installshield Today
X Help
t • Organize Your Setup
i/General Information
Qp Features
T Setup Types
承Upgrade Paths 曰❷ Specify Application Data
⑶ Files
'词Files and Features
Setup Types
Setup Types
V尊 &Typical :j® &Winimal J宴 Cu&stom
V尊 &Typical :j® &Winimal J宴 Cu&stom
Рис. 9.5. Команда Setup Types позволяет задать возможные вариантыустановки программы
Выбор устанавливаемых компонентов
Команды группы Specify Application Data (рис. 9.6) позволяют определить компоненты программы, которые должны быть установлены на компьютер пользователя. Если в проекте определены несколько групп компонентов (см. команду Features), то нужно определить компоненты для каждой группы.
❷ Specify Application Data
伊Files
陶Files and Features
必 Objects/Merge Modules
遇Dependencies
Рис. 9.6. Команды группы Specify Application Data
В результате выбора команды Files правая часть окна будет разделена на области (рис. 9.7). В области Source computer's files можно выбрать файлы, которые необходимо перенести на компьютер пользователя. В области Destination computer's folders надо выбрать папку, в которую эти файлы должны быть помещены. Для того чтобы указать, какие файлы нужно установить на компьютер пользователя, следует просто "перетащить" требуемые файлы из области Source computer's files в область Destination computer's files. Если в группе Features несколько элементов, то надо определить файлы для каждого элемента.
Рис. 9.7. Выбор файлов, которые нужно перенести на компьютер пользователя
Команда Object/Merge Modules позволяет задать, какие объекты, например динамические библиотеки или пакеты компонентов, должны быть помещены на компьютер пользователя и, следовательно, на установочную дискету. Объекты, которые нужно поместить на установочную дискету, выбираются в списке InstallShield Objects/Merge Modules (рис. 9.8).
卜Objects/Merge Modules
InstallShield Objects/Merge Modules
®ADORTL
^ATL 3.0
宓 BseRTL
®BaseVCL
□Ebde_ent
悶 BDERTl
Й DAO 3.60
芯 DatabaseRTL
С!芯DatabaseVCL
Г 1 & DaMSnan
Description of BDE—ENT
Conditional Installation
Help
Name
BDE_ENT
Destination
(Use merge module's default destination)
File Name
F:\Program Files\Borland\Delphi7 \MergeModules\BDE_ENT. Msm
Aiithnr
Select which feature, or features, you want to associate this module with. If the selected feature is installed, the module will also be installed, Merge modules replace the concept of objects found in earlier versions of InstallShield. See MerQC Modules for more information.
Рис. 9.8. Выбор объектов, которые должны быть установлены на компьютер пользователя
二I
Конфигурированиесистемыпользователя
Команды группы Configure the Target System (рис. 9.9) позволяют задать, какие изменения нужно внести в систему пользователя, чтобы настроить систему на работу с устанавливаемой программой.
❸ Configure the Target System 窟Shortcuts/Folders 婚Registry
〜圏ODBC Resources 蔺INI File Changes 0 File Extensions
.一 © Environment Variables
Рис. 9.9. Команды группы Configure the Target System
Команда Shortcuts/Folders позволяет указать, куда нужно поместить ярлык, обеспечивающий запуск устанавливаемой программы. В результате выбора этой команды в правой части окна открывается иерархический список, в котором перечислены меню и папки, куда можно поместить ярлык программы. В этом списке нужно выбрать меню, в которое должен быть помещен ярлык, щелкнуть правой кнопкой мыши и в появившемся списке выбрать команду New Shortcut (рис. 9.10).
S圆ShortcutsR gJ Taskbar: Е漂 Start MenuS圆ShortcutsR gJ Taskbar: Е漂 Start Menu卜.сл*,Г|卜.сл*,Г|Send ToSend ToDesktopDesktop啕Startup啕StartupNew Shortcut4 insNew Shortcut4 insNew Advertised Shortcut NNew Advertised Shortcut NNew Shortcut to Preexisting fileNew Shortcut to Preexisting file
S圆Shortcuts
R gJ Taskbar
: Е漂 Start Menu
S圆Shortcuts
R gJ Taskbar
: Е漂 Start Menu
卜.сл*,Г|
卜.сл*,Г|
Send To
Send To
Desktop
Desktop
啕Startup
啕Startup
New Shortcut4 ins
New Shortcut4 ins
New Advertised Shortcut N
New Advertised Shortcut N
New Shortcut to Preexisting file
New Shortcut to Preexisting file
New Folder
Рис. 9.10. В списке Shortcuts нужно выбрать меню, в которое должен быть помещенярлык запуска программы
Рис. 9.11. Выбор файла, для которого создается ярлыкРис. 9.11. Выбор файла, для которого создается ярлык
Рис. 9.11. Выбор файла, для которого создается ярлык
Рис. 9.11. Выбор файла, для которого создается ярлык
I El Й ShortcutsЁ:2® TaskbarH演Start Menu日啕Programs Menu闸Saper Game區 Startup^^Send ToDesktopI El Й ShortcutsЁ:2® TaskbarH演Start Menu日啕Programs Menu闸Saper Game區 Startup^^Send ToDesktopSaper Game ShortcutSaper Game ShortcutDescriptionArgumentsTarget[JN5TALLDIRjsaper.exeIcon FileF: \Projects\Saper\saper. exeIcon Index0RunNormal WindowWorking DirectoryHot KeyCommentsDescriptionArgumentsTarget[JN5TALLDIRjsaper.exeIcon FileF: \Projects\Saper\saper. exeIcon Index0RunNormal WindowWorking DirectoryHot KeyComments
I El Й Shortcuts
Ё:2® Taskbar
H演Start Menu日啕Programs Menu闸Saper Game區 Startup^^Send To
Desktop
I El Й Shortcuts
Ё:2® Taskbar
H演Start Menu日啕Programs Menu闸Saper Game區 Startup^^Send To
Desktop
Saper Game Shortcut
Saper Game Shortcut
Description
Arguments
Target[JN5TALLDIRjsaper.exe
Icon FileF: \Projects\Saper\saper. exe
Icon Index0
RunNormal Window
Working Directory
Hot Key
Comments
Description
Arguments
Target[JN5TALLDIRjsaper.exe
Icon FileF: \Projects\Saper\saper. exe
Icon Index0
RunNormal Window
Working Directory
Hot Key
Comments
Рис. 9.12. Ярлык создан, теперь можно выполнить его настройку
Затем, в диалоговом окне Browse for Shortcut Target, нужно выбрать файл программы (рис. 9.11), щелкнуть на кнопке Open и ввести имя ярлыка. После этого можно выполнить окончательную настройку ярлыка, например, в поле Arguments ввести параметры командной строки, а в поле Working Directory — рабочий каталог (рис. 9.12).
Настройка диалогов
Для взаимодействия с пользователем программа установки использует стандартные диалоговые окна. Разрабатывая программу инсталляции, программист может задать, какие диалоги увидит пользователь в процессе инсталляции программы.
Чтобы задать диалоговые окна, которые будут появляться на экране монитора во время работы инсталляционной программы, надо в группе Customize the Setup Appearance (рис. 9.13) выбрать команду Dialogs и в открывшемся списке Dialogs (рис. 9.14) отметить диалоги, которые нужно включить в программу установки.
О Customize the Setup AppearanceDialogs
й Billboards
画Text and Messages
Рис. 9.13. Команды группы Customize the Setup Appearance
Readme PropertiesReadme PropertiesBanner Bitmap <I5ProductFolder >\Redist\Languegf Readme File <I5ProductFolder>\Redist\0409\ReaBanner Bitmap <I5ProductFolder >\Redist\Languegf Readme File <I5ProductFolder>\Redist\0409\ReaВ口Dialogs
Readme Properties
Readme Properties
Banner Bitmap <I5ProductFolder >\Redist\Languegf Readme File <I5ProductFolder>\Redist\0409\Rea
Banner Bitmap <I5ProductFolder >\Redist\Languegf Readme File <I5ProductFolder>\Redist\0409\Rea
-□ W Splash Bitmap
0 n Install Welcome
"国License Agreement
:必口Readme
:I J^ Customer Information
□ H Destination Folder
D二Database Folder
Б 日Setup Type
-I ICustom Setup
:®三I Ready to Install
3 W Setup Progress
В n Setup Complete Success
Рис. 9.14. В списке Dialogs нужно отметить диалоги, которые должны появитьсяв процессе установки программы на компьютер пользователя
В таблице Properties (справа от списка диалогов) перечислены свойства выбранного диалога. Программист может изменить значение этих свойств и, тем самым, выполнить настройку диалога. Например, для диалога Readme нужно задать имя файла (свойство Readme File), в котором находится краткая справка об устанавливаемой программе.
8 Зак. 1252
Для большинства диалогов можно определить баннер (свойство Banne Bitmap) — иллюстрацию, которая отображается в верхней части окна диало га. Формат файла баннера — BMP, размер — 499x58 пикселов.
В табл. 9.4 перечислены диалоговые окна, которые могут появиться во вре мя работы инсталляционной программы.
Таблица 9.4. Диалоговые окна процесса установки
Диалоговое окно
Назначение
Splash Bitmap
Вывод иллюстрации, которая может служить в качестве информации об устанавливаемой программе. Размер иллюстрации — 465x281 пиксел, формат — BMP
Install Welcome
Вывод информационного сообщения на фоне иллюстрации (размер 499x312 пикселов)
License Agreement
Вывод находящегося в rft-файле лицензионного сообщения. Позволяет прервать процесс установки программы в случае несогласия пользователя с предлагаемыми условиями
Readme
Вывод краткой информации об устанавливаемой программе
Customer
Information
Запрашивает информацию о пользователе (имя, название организации) и, возможно, серийный номер устанавливаемой копии
Destination Folder
Предоставляет пользователю возможность изменить предопределенный каталог, в который устанавливается программа
Database Folder
Предоставляет пользователю возможность изменить предопределенный каталог, предназначенный для баз данных
Setup Type
Предоставляет пользователю возможность выбрать тип установки программы (Typical— обычная установка, Minimal — минимальная установка, Custom — выборочная установка)
Custom Setup
Предоставляет пользователю возможность выбрать устанавливаемые компоненты при выборочной (Custom) установке
Ready to Install
Вывод информации, введенной пользователем на предыдущих шагах, с целью ее проверки перед началом непосредственной установки программы
Setup Progress
Показывает процент выполненной работы во время установки программы
Setup Complete Success
Информирует пользователя о завершении процесса установки. Позволяет задать программу, которая должна быть запущена после завершения установки (как правило, это сама установленная программа), а также возможность вывода содержимого Readme-файла
Для того чтобы диалоговое окно появлялось во время работы инсталляционной программы, необходимо установить флажок, расположенный слева от названия диалогового окна. Для окон License Agreement и Readme нужно задать имена rtf-файлов, в которых находится соответствующая информация.
В простейшем случае профамма инсталляции может офаничиться выводом следующих диалогов:
a Readme;
О Destination Folder;
п Ready to Install;
口 Setup Progress;
□ Setup Complete Success.
Системные требования
Если устанавливаемая профамма предъявляет определенные требования к ресурсам системы, то, используя команды группы Define Setup Requirements and Actions (рис. 9.15), эти требования можно задать.
© Define Setup Requirements and Actionsi- > Requirements
. Custom Actions
胤Setup Files
Рис. 9.15. Команды группы Define Setup Requirements and Actions
:An\ *5 b*r讣8:An\ *5 b*r讣8AnyAnyрЗ VersionProcessor
:An\ *5 b*r讣8
:An\ *5 b*r讣8
Any
Any
RAM
Screen Resolution Any Resolution
Color DepthAny colors
Рис. 9.16. Параметры, характеризующие систему
В результате выбора команды Requirements на экране появляется таблица (рис. 9.16), в которую надо ввести значения параметров, характеризующих систему: версию операционной системы (OS Version), тип процессора (Processor), объем оперативной памяти (RAM), разрешение экрана (Screen Resolution) и цветовую палитру (Color Depth). Значения характеристик за-
даются путем выбора из раскрывающегося списка, значок которого появляется в результате щелчка в поле значения параметра.
Если программа не предъявляет особых требований к конфигурации системы, то команды группы Define Setup Requirements and Actions можно пропустить.
Создание образа установочной дискеты
Prepare for ReleasePrepare for ReleaseКоманды группы Prepare for Release (рис. 9.17) позволяют создать образ установочной дискеты (CD-ROM) и проверить, как работает программа установки.
Prepare for Release
Prepare for Release
в Build Your Release廿Test Your Releasei會,DistributeYour Release
Рис. 9.17. Команды группы Prepare for Release
Для того чтобы активизировать процесс создания образа установочной дискеты (CD-ROM), нужно выбрать команду Build Your Release, щелкнуть правой кнопкой мыши на значке носителя, на который предполагается поместить программу установки, и из появившегося контекстного меню выбрать команду Build (рис. 9.18).
NoNo2,0Copy From Source MediaYesBoth 9x and NT EnginesYesYesNo2,0Copy From Source MediaYesBoth 9x and NT EnginesYesYesNoCompress MediaСкЛвлсф fa McdMt SizeMSI Engine VersionMSI Engine LocationInclude Setup.exeInclude MSI Engine(s)Delay MSI Engine RebootSuppress Launcher WarningGenerate Autorun.inf FileCompress MediaСкЛвлсф fa McdMt SizeMSI Engine VersionMSI Engine LocationInclude Setup.exeInclude MSI Engine(s)Delay MSI Engine RebootSuppress Launcher WarningGenerate Autorun.inf File三•每 Builds
No
No
2,0
Copy From Source Media
Yes
Both 9x and NT Engines
Yes
Yes
No
2,0
Copy From Source Media
Yes
Both 9x and NT Engines
Yes
Yes
No
Compress Media
СкЛвлсф fa McdMt Size
MSI Engine Version
MSI Engine Location
Include Setup.exe
Include MSI Engine(s)
Delay MSI Engine Reboot
Suppress Launcher Warning
Generate Autorun.inf File
Compress Media
СкЛвлсф fa McdMt Size
MSI Engine Version
MSI Engine Location
Include Setup.exe
Include MSI Engine(s)
Delay MSI Engine Reboot
Suppress Launcher Warning
Generate Autorun.inf File
了
® 学 Custom
®-ф DVD-10
DVD-18 ,
данDVD-5亠 _ 二二二 1
ЕЯ -ф DVD-9
В &f 5inglelmage
-
Рис. 9.18. Активизация создания образа установочного CD-ROM
В результате этих действий на диске компьютера в папке проекта будет создан образ установочного диска. Если в качестве носителя выбран CD-ROM, то образ будет помещен в подкаталог \Express\Cd_rom\DiskImages\Diskl.
Можно, не завершая работу с InstallShield Express, проверить, как функционирует программа установки. Для этого надо щелкнуть на одной из командных кнопок Run или Test (рис. 9.19). Команда Run устанавливает
программу, для которой создана программа установки, на компьютер разработчика. Команда Test только имитирует установку, что позволяет проверить работоспособность интерфейса.
■e
Run Test
Рис. 9.19. Используя команды Run и Test можно проверить,как работает программа установки
После того как программа установки будет проверена, можно создать реальный установочный диск. Для этого надо просто скопировать (записать) содержимое каталога \Express\Cd_rom\DiskImages\DisklHa CD-ROM.
ГЛАВА 1 о
Примеры программ
Система проверки знаний
Тестирование широко применяется для оценки уровня знаний в учебных заведениях, при приеме на работу, для оценки квалификации персонала учреждений, т. е. практически во всех сферах деятельности человека. Испытуемому предлагается ряд вопросов (тест), на которые он должен ответить.
Обычно к каждому вопросу дается несколько вариантов ответа, из которых надо выбрать правильный. Каждому варианту ответа соответствует некоторая оценка. Суммированием оценок за ответы получается общий балл, на основе которого делается вывод об уровне подготовленности испытуемого.
Рассмотрим программу, которая позволяет автоматизировать процесс тестирования.
Требования к программе
В результате анализа используемых на практике методик тестирования были сформулированы следующие требования к программе:
О программа должна обеспечить работу с тестом произвольной длины, т. е. не должно быть ограничения на количество вопросов в тесте;
О вопрос может сопровождаться иллюстрацией;
口для каждого вопроса может быть до четырех возможных вариантов ответа со своей оценкой в баллах;
П результат тестирования должен быть отнесен к одному из четырех уровней, например: "отлично", "хорошо", "удовлетворительно" или "плохо";
口вопросы теста должны находиться в текстовом файле;
П в программе должна быть заблокирована возможность возврата к предыдущему вопросу. Если вопрос предложен, то на него должен быть дан ответ.
На рис. 10.1 приведен пример окна программы тестирования во время ее работы.
Рис. 10.4.Диалоговое окно программы тестирования
Файл теста
Тест представляет собой последовательность вопросов, на которые испытуемый должен ответить путем выбора правильного ответа из нескольких предложенных вариантов.
Файл теста состоит из трех разделов:
口раздел заголовка;
О раздел оценок;
П раздел вопросов.
Заголовок содержит название теста и общую информацию о тесте — например, о его назначении. Заголовок состоит из двух абзацев: первый абзац -- название теста, второй — вводная информация.
Вот пример заголовка:
История Санкт-Петербурга
Сейчас Вам будут предложены вопросы о знаменитых памятниках и архитектурных сооружениях Санкт-Петербурга. Вы должны из предложенных нескольких вариантов ответа выбрать правильный.
За заголовком следует раздел оценок, в котором указывается количество баллов, необходимое для достижения уровня, и сообщение, информирую-
шее испытуемого о достижении уровня. В простейшем случае сообщение — это оценка. Для каждого уровня надо указать балл (количество правильных ответов) и в следующей строке — сообщение. Вот пример раздела оценок:
100
Отлично 85 Хорошо 60
Удовлетворительно
50
Плохо
За разделом оценок следует раздел вопросов теста.
Каждый вопрос начинается текстом вопроса, за которым (в следующей строке) следуют три целых числа. Первое число — это количество альтернативных ответов, второе — номер правильного ответа, третье — признак иллюстрации. Если к вопросу есть иллюстрация, то третье число должно быть равно единице, и в следующей строке должно быть имя файла иллюстрации. Если иллюстрации к вопросу нет, то признак иллюстрации должен быть равен нулю. Далее следуют альтернативные ответы, каждый из которых должен представлять собой один абзац текста.
Вот пример вопроса:
Архитектор Зимнего дворца
321
herm.bmp
Бартоломео
Карл Росси
Огюст Монферран
В приведенном примере к вопросу даны три варианта ответа, правильным является второй ответ (архитектор Зимнего дворца — Карл Росси). К вопросу есть иллюстрация (третье число во второй строке — единица), которая находится в файле herm.bmp.
Ниже в качестве примера приведен текст файла вопросов для контроля знания истории памятников и архитектурных сооружений Санкт-Петербурга.
История Санкт-Петербурга
Сейчас Вам будут предложены вопросы о знаменитых памятниках и архитектурных сооружениях Санкт-Петербурга. Вы должны из предложенных нескольких вариантов ответа выбрать правильный.
7
Вы прекрасно знаете историю Санкт-Петербурга!
6
Вы много знаете о Санкт-Петербурге, но на некоторые вопросы ответили неверно.
5'..
Вы недостаточно хорошо знаете историю Санкт-Петербурга?
4
Вы, вероятно, только начали знакомиться с историей Санкт-Петербурга?
Архитектор Исаакиевского собора: 321 isaak.bmp
Доменико Трезини
Огюст Монферран
Карл Росси
Александровская колонна воздвигнута в 1836году по проекту Огюста Монферрана как памятник, посвященный:
210
деяниям императора Александра I
подвигу русского народа в Отечественной войне 1812года
Архитектор Зимнего дворца 321 herm.bmp
Бартоломео Растрелли
Карл Росси
Огюст Монферран
Михайловский (Инженерный) замок — жемчужина архитектуры Петербурга — построен по проекту:
310
Андрея Никифоровича Воронихина
Ивана Егоровича Старова
Василия Ивановича Баженова
Остров, на котором находится Ботанический сад, основанный императором Петром I, называется:
331
botbmp
Заячий
Медицинский
Аптекарский
Невский проспект получил свое название: 320
по имени реки, на которой стоит Санкт-Петербург
по имени близко расположенного монастыря, АлександроНевско 询лавры
в память о знаменитом полководце —Александре Невском
Скульптура знаменитого памятника Петру I выполнена: 210
Фальконе
Клодтом
Файл теста может быть подготовлен в текстовом редакторе Notepad или в Microsoft Word. В случае использования Microsoft Word при сохранении текста следует указать, что надо сохранить только текст. Для этого в диалоговом окне Сохранить в списке Тип файла следует выбрать Только текст (*.txt).
Форма приложения
На рис. 10.2 приведен вид формы программы тестирования.
Поле Label1 предназначено для вывода начальной информации, вопроса и результатов тестирования. Компонет Imagel предназначен для вывода иллюстрации, сопровождающей вопрос. Кнопка Buttonl используется для подтверждения выбора ответа и перехода к следующему вопросу.
LabellLabellImagelImagelButtoni •Buttoni •Рис. 10.2. Форма программы тестированияРис. 10.2. Форма программы тестирования
Labell
Labell
Imagel
Imagel
Buttoni •
Buttoni •
Рис. 10.2. Форма программы тестирования
Рис. 10.2. Форма программы тестирования
Нетрудно заметить, что в форме нет радиокнопок - компонентов RadioButton, обеспечивающих вывод альтернативных ответов и прием ответа испытуемого. В рассматриваемой программе компоненты RadioButton будут созданы динамически, во время работы программы.
В табл. 10.1 и 10.2 приведены значения свойств формы и компонента Labell. Значения остальных свойств этих и других компонентов можно оставить без изменений.
Таблица 10.1, Значения свойств формы
Свойство
Значение
Пояснение
Bordericons. biSysteinMenu
true
Есть кнопка системного меню
Bordericons.biMinimize
false
Нет кнопки Свернуть окно
BorderIcons•biMaximize
false
Нет кнопки Развернуть окно
Таблица 10.1 (окончание)
Свойство
Значение Пояснение
BorderStyle
bsSingleТонкая граница окна, нельзя изме
нить размер окна
Таблица 10.2. Значения свойств компонента Labell
Свойство
Значение
Пояснение
AutoSize
false
Запрет изменения размера поля в соответствии с его содержимым
Wordwrap
true
Разрешить перенос слов в следующую строку поля
Следует обратить внимание, что несмотря на то, что свойства Bordericons.biMinimize И Bordericons.biMaximize имеют значение false, кнопки Свернуть окно и Развернуть окно отображены в форме. Реальное воздействие значений этих свойств на вид окна проявляется только во время работы программы. Значение свойства BorderStyle также проявляет себя только во время работы программы.
Отображение иллюстрации
Для отображения иллюстраций используется компонент Imagel.
Размер и положение компонента image и, следовательно, размер и положение поля, используемого для отображения иллюстрации, наиболее просто задать во время разработки формы. В рассматриваемой программе применяется другой подход.
Очевидно, что размер области формы, которая может быть использована для вывода иллюстрации, зависит от длины (количества слов) вопроса, а также от длины и количества альтернативных ответов. Чем длиннее вопрос и ответы, тем больше места в поле формы они занимают, и тем меньше места остается для иллюстрации.
Размер и положение областей (компонентов), предназначенных для вывода вопроса, альтернативных ответов и иллюстрации, можно задать в процессе создания формы. Однако можно поступить иначе — задать размер и положение областей во время работы программы, после того как из файла будет прочитан очередной вопрос, когда будет получена информация о количестве альтернативных ответов. После того как вопрос прочитан, можно вычислить, сколько места займет текст вопроса и вариантов ответа и сколько места можно выделить для отображения иллюстрации (рис. 10.3).
Рис. 10.3. Вычисление размера области вывода иллюстрацииРис. 10.3. Вычисление размера области вывода иллюстрации
Рис. 10.3. Вычисление размера области вывода иллюстрации
Рис. 10.3. Вычисление размера области вывода иллюстрации
Если реальный размер иллюстрации превышает размер области, выделенной для ее отображения, то необходимо выполнить масштабирование иллюстрации. Для этого надо сначала присвоить максимально возможные значения свойствам width и Height, а затем — присвоить значение true свойству Proportional. Следует обратить внимание, что для того чтобы масштабирование было выполнено без искажения, значение свойства stretc должно быть false.
Доступ к файлу теста
Передать имя файла теста программе тестирования можно через параметр командной строки.
При запуске программы из операционной системы при помощи команды Пуск | Выполнить параметры командной строки указывают после имени выполняемого файла программы (рис. 10.4).
Запуск программыЗапуск программы2JX
Запуск программы
Запуск программы
Введите имя программы, папки, документа илиресурса Интернета, и Windows откроет их.
Открыть: [БАпроекты CBVesterexe Peter burg ht|▼]
OKОтменаОб^ор...
Рис. 10.4. Передача параметра при запуске программы командой Пуск | Выполнить
:33?:33?Если запуск программы выполняется при помощи значка, изображающего программу на рабочем столе или в папке, то параметр командной строки задают в окне Свойства этого значка. Например, для настройки программы тестирования на работу с файлом теста Peterburg.txt надо раскрыть окно свойств значка (щелкнуть правой кнопкой мыши на значке и из появившегося контекстного меню выбрать команду Свойства) и в поле Объект (после имени выполняемого файла программы) ввести имя файла теста (Peter- burg.txt), заключив его в двойные кавычки (рис. 10.5).
:33?
:33?
|с.ойств.: Проеерк. ..аняй
Общие Ярлык j
Проверка знанийПроверка знанийТип объекта:Тип объекта:ПриложениеПриложениеРазмещение:Размещение:Проекты свПроекты св
Проверка знаний
Проверка знаний
Тип объекта:
Тип объекта:
Приложение
Приложение
Размещение:
Размещение:
Проекты св
Проекты св
Объект:Объект:I "ОДПроекты CB\tester.exe" "Peterburg.txt"|I "ОДПроекты CB\tester.exe" "Peterburg.txt"|г~ Запускать от имени другого пользователяг~ Запускать от имени другого пользователя..Рабочая папка:"D:\npoeKTbi СВ"Рабочая папка:"D:\npoeKTbi СВ"Быстрый вызов; 1нетБыстрый вызов; 1нет
Объект:
Объект:
I "ОДПроекты CB\tester.exe" "Peterburg.txt"|
I "ОДПроекты CB\tester.exe" "Peterburg.txt"|
г~ Запускать от имени другого пользователя
г~ Запускать от имени другого пользователя
.
.
Рабочая папка:"D:\npoeKTbi СВ"
Рабочая папка:"D:\npoeKTbi СВ"
Быстрый вызов; 1нет
Быстрый вызов; 1нет
Окно:Окно:(обычный размер окна(обычный размер окна
Окно:
Окно:
(обычный размер окна
(обычный размер окна
Комментарий:
Найтиобъект.., 1 Изменитьзначок...
Отменаt ПрименитьОтменаt Применить
Отменаt Применить
Отменаt Применить
Рис. 10.5. Настройка программы тестирования на работу с файлом Peterburg.txt
Программа может получить информацию о количестве параметров командной строки, обратившись к функции ParamCount. Доступ к конкретному параметру обеспечивает функция ParamStr, которой в качестве параметра передается номер параметра, значение которого надо получить. Параметры командной строки нумеруются с единицы. Следует обратить внимание, что значением ParamStr(0) является полное имя выполняемого файла программы.
Ниже приведен фрагмент программы, который демонстрирует доступ к параметрам командной строки.
intn= ParamCount ();
if ( n < 1)
{
Labell->Font->Style = TFontStyles ( ) « fsBold;
Labell->Caption =
"В командной строке надо указать имя файла теста";
Buttonl->Tag = return;
/ / открыть файл теста
f=FileOpen(ParamStr(1), fmOpenRead);
При запуске программы, использующей параметры командной строки, из среды разработки параметры нужно ввести в поле Parameters диалогового окна Run Parameters (рис. 10.6), которое открывается в результате выбора из меню Run команды Parameters.
Рис. 10.6. Параметры командной строки надо ввести в поле Parameters
Текст программы
После того как будет создана форма программы, можно приступить к кодированию (набору текста). Сначала надо внести дополнения в объявление формы (листинг 10.1) — объявить массив компонентов RadioButton, функцию обработки события click на кнопке выбора ответа и функции, обеспечивающие отображение и удаление вопроса. Следует обратить внимание на то, что объявление массива компонентов RadioButton (указателей на компоненты) только устанавливает факт существования компонентов, сами же компоненты будут созданы в начале работы программы. Делает это конст-
руктор формы. Он же задает функции обработки события click для компонентов массива. Другой важный момент, на который следует обратить внимание, это объявление функций swowvopros и Erasevopros как методов объекта Forml. Это сделано для того, чтобы обеспечить этим функциям прямой доступ к компонентам формы.
Текст модуля главной формы приведен в листинге 10.2.
I Листинг 10.1. Программа тестирования (заголовочныйфайл)
#ifndef tester_H
#define tester_H
linclude <Classes.hpp>
#include <Controls.hpp>
#include<StdCtrls.hpp>
#include <Forms.hpp> #include <ExtCtrls .hpp> #include <Dialogs.hpp> #include <Graphics.hpp>
// вопрос
struct TVopros
{
AnsiString
Vopr;
//
вопрос
AnsiString
工mg;
// иллюстрация (имя BMP-файла)
AnsiString
0tv[4];
//
варианты ответа
int
nOtv;
//
кол-во вариантов ответа
int
rOtv;
//
номер правильного ответа
// форма
class T Forml : public TForm {
^published: / / IDE-managed Components
TLabel *Labell;// информационное сообщение, вопрос
TImage *Imagel;// иллюстрация к вопросу
TButton *Buttonl; // кнопка OK / Дальше
void _ fastcall FormActivate (TObject * Sender); void fastcall ButtonlClick (TObject* Sender );
private:
TRadioButton *RadioButton[4]; // варианты ответа - кнопки выбора void _ fastcall RadioButtonClick(TObject * Sender ); // щелчок на // кнопке выбора ответа
void _ fastcall ShowVopros (TVopros v); // выводит вопрос void fastcall EraseVopros (void);// удаляет вопрос
public:
_ fastcall TForml (TComponent* Owner);
extern PACKAGE TForml *Forml;
#endif
i Листинг 10.2. Программа тестирования
/* Универсальная программа тестирования. Тест загружается из файла, имя которого должно быть указано в командной строке.
Программа демонстрирует создание и настройку компонентов во время работы программы.
*/
#include <vcl. h>
#pragma hdrstop
•
#include "tester_.h"
#include <stdio.h>// для доступа к функции sscanf
ttpragmapackage (smart_init)
#pragma resource ”* .dfm”
TForml * Forml;// форма
int f;// ■ дискриптор файла теста
// имя файла теста берем из командной строки
int level [4];// кол-во правильных ответов, необходимое
// для достижения уровня
AnsiString mes [4 ]; // сообщение о достижении уровня
TVopros Vopros;// вопрос
int otv;// номер выбранного ответа
int right =0;// кол-во правильных ответов
// функции, обеспечивающие чтение вопроса из файла теста
int Get Int (int f );// читает целое
int GetString (int f, AnsiString *st);// читает строку
// конструктор
fastcall TForml::TForml(TComponent* Owner)
:
int
int left = 10;
// создадим радиокнопки для выбора
// правильного ответа/ но сделаем их невидимыми for (i = 0; i < 4; i++)
{
// создадим радиокнопку
RadioButton [i]=newTRadioButton (Forml);
// установим значения свойств
RadioButton[i]->Parent = Forml;
RadioButton[i]->Left = left;
RadioButton[i]->Width =- left - 20;
RadioButton[i]->Visible = false;
RadioButton [ i ] ->Checked = false;
// зададим функцию обработки события Click RadioButton [i]->OnClick =
void fastcall TForml: : ForraActivate (TObject *Sender)
{
AnsiString st;
// имя файла теста должно быть указано в командной строке intn=ParamCount ();
if ( n < 1)
{
Labell->Font->Style = TFontStyles() << fsBold;
Labell->Caption=
"В командной строке запуска надо задать имя файла теста";
Buttonl->Tag = 2;
return;
}
// открыть файл теста
f = FileOpen(ParamStr(1), fmOpenRead);
if ( f == -1)
{
Labell->Font->Style = TFontStyles ()« fsBold;
Labell->Caption=
"Ошибка доступа к файлу теста " + ParamStr(1);
2;
return;
// вывести информацию о тесте
GetString (f, &st); // прочитать название теста = st;
GetString(f, &st); // прочитать вводную информацию --20;
Labell->Caption = st;
Labell->AutoSize = true;
// прочитать информацию об уровнях оценки for (int i=0;
{
=
GetString(f, &mes[i]);
// читает из файла очередной вопрос
*v)
{
st;
int// еслито к вопросу есть иллюстрация
if (!= 0)
{
// прочитать кол-во вариантов ответа, номер правильного ответа // и признак наличия иллюстрации
v->nOtv = Getlnt (f); v->rOtv = p =
if (p) // к вопросу есть иллюстрация
GetString(f,&(v->Img));
else=
// читаем варианты ответа
for (int i = 0; i <
GetString (f z& (v->Otv[i]));
}
return true;
else return false;
// выводит вопрос voidfastcall TForml: : ShowVopros (TVopros v)
{
int top; int i;
// вопрос
Labell->Width =--20;
Labell->Caption = v.Vopr;
Labell->AutoSize = true;
if (v. Img !=// к вопросу есть иллюстрация
{ /* определим высоту области, которую можно использовать для вывода иллюстрации */ int RegHeight = Buttonl->Top
вопросавопроса-+ Labell->Height +10) // область вывода
вопроса
вопроса
-+ 10) * v.nOtv;
Image1->Тор = Labell->Top + Labell->Height + 10; // загрузим картинку и определим ее размер Imagel->Visible = false;
Image l-'>AutoSize = true;
Imagel->Picture->LoadFromFile (v.Img);
if (Imagel->Height > RegHeight) // картинка не помещается
{
Imagel->AutoSize = false;
Imagel->Height = RegHeight;
Imagel->Proportional = true;
}
Imagel->Visible = true;
// положение полей отсчитываем от иллюстрации top = Imagel->Top + Imagel->Height + 10;
I else // положение полей отсчитываем от вопроса top = Labell-ХГор + Labell->Height + 10;
// варианты ответа
for (i = 0; i < v.nOtv; i++)I
RadioButton[i]->Top = top;
RadioButton[i]->Caption =
RadioButton[i]->Visible = true; RadioButton [ i ] ->Checked. = false; top += 20;
// щелчок на радиокнопке выбора ответа
void _ fastcall TForml: : RadioButtonClick (TObject * Sender)
{
int i =0;
while {! RadioButton[i]->Checked)
i++;
otv = i+l;
// ответ выбран, сделаем доступной кнопку Дальше Buttonl->Enabled = true;
}
// удаляет вопрос с экрана
void _ fastcall TForml : :EraseVopros (void)
{
Imagel->Visible = false; // скрыть поле вывода иллюстрации
// скрыть поля выбора ответа
for (int i = 0; i <4; i++)
{ RadioButton[i]->Visible = false; RadioButton[i]->Checked = false;
}
Buttonl->Enabled = false; // сделать недоступной кнопку Дальше }
// щелчок на кнопке ОК/Дальше/OK
void _ fastcall TForml : :ButtonlClick (TObject * Sender)
{
bool ok; // результат чтения из файла очередного вопроса
switch (Buttonl->Tag) {
case 0: // щелчок на кнопке OK в начале работы программы
// прочитать и вывести первый вопрос GetVopros (&Vopros);
ShowVoprps (Vopros);
Buttonl->Caption = "Дальше";
Buttonl->Enabled = false;
Buttonl->Tag = 1;
break;
case 1 : // щелчок на кнопке Дальше
if (otv = Vopros.rOtv) // выбран правильный ответ right++;
EraseVppros();
ok=GetVopros (&Vopros); if ( ok)
ShowVopros(Vopros);
else
// вопросов больше нет
{
FileClose(f);
// вывести результат
AnsiString st; // сообщение int i; // номер достигнутого уровня
Forml->Caption = "Результат тестирования"; st .printf("Правильныхответов: %i\nn,right);
// определим оценку
i = 0; // предположим, что испытуемый // ответил на все опросы
while (( right < level [i]) &《(i < 3))
i++;
st= st+mes [i];
Labell->Caption = st;
Buttonl->Caption"OK";
Buttonl->Enabled = true;
Buttonl->Tag = 2;
}
break.;
case 2 : // щелчок на кнопке OK в конце работы программы Fonnl->Close (); // завершить работу программы
// Функция GetString читает строку из файла
// значение функции — количество прочитанных символов int GetString (int f, AnsiString *st) {
unsigned char buf[300]; // строка (буфер) unsigned char *P =// указатель на строку
int n;/ / кол-во пр о читанных байт (знй Чфунк функции FileRead)
int len — 。; / / длина строки
n = FileRead(f, p, 1);
while ( n != 0)
{
if ( "p == T\rT)
{
n = FileRead(f, p,// прочитать
break;
len++;
P++;
n = FileRead (f;! p, 1 );
}
=
if ( len !=0)
st->printf ("吿s”,buf);
return len ;
}
// читает из файла целое число
int GetInt(int f)
{
char baf [20] ;// строка (буфер)
char *p = buf; // указатель на строку
int n;// кол-во прочитанных байт (значение функции FileRead)
int a;// 4%с/о,, прочитанное из файла
n = FileRead (J p,
while ( 产p >= ' :)'}&& {*p <= "94 & & (n >
p++;
n = FileRead(f, p, 1);
}
if ( *p ==
n = FileRead(f, p,// прочитать
=
// изображение числа в буфереz преобразуем строку в целое
sscanf(bufх n%iM, &а);
return
Как было сказано ранее, объявление массива компонентов не создает компоненты, а только устанавливает факт их существования. Создает и настраивает компоненты RadioButton КОНСТруКТОр : TForml). Непосредственное создание компонента (элемента массива) выполняет оператор .
RadioButton[i] = new TRadioButton(Forml)
Следующие за этим оператором инструкции обеспечивают настройку компонента. В том числе, они путем присваивания значения свойству onclick задают функцию обработки события click. В рассматриваемой программе для обработки события click на всех компонентах RadioButton используется одна и та же функция, которая путем опроса значения свойства checked фиксирует номер выбранного ответа и делает доступной кнопку Дальше (Buttonl).
После запуска программы и вывода на экран стартовой формы происходит событие OnActivate. Функция обработки этого события проверяет, указан ли в командной строке параметр — имя файла теста. Реализация программы предполагает, что если имя файла теста задано без указания пути доступа к нему, то файл теста и файлы с иллюстрациями находятся в том же каталоге, что и программа тестирования. Если же путь доступа указан, то файлы с иллюстрациями должны находиться в том же каталоге, что и файл теста. Такой подход позволяет сгруппировать все файлы одного теста в одном каталоге.
Если файл теста задан, функция открывает его, читает название теста и вводную информацию и затем выводит их в диалоговое окно, причем название выводится в заголовок, а вводная информация — в поле Label 1.
Непосредственное чтение строк из файла выполняет функция Getstring. Значением функции является длина строки. Следует обратить внимание на ТО, ЧТО фуНКЦИЯ GetString Возвращает СТрОКуAnsiString.
После того как прочитана общая информация о тесте, программа считывает из файла теста информацию об уровнях оценки и фиксирует ее в массивах level и mes. Критерий достижения уровня (количество правильных ответов) считывает функция Getlnt.
После вывода информационного сообщения программа ждет, пока пользователь не нажмет кнопку Ok (Buttonl).
Командная кнопка Buttonl используется:
□ для завершения работы программы, если в командной строке не указан файл теста;
П для активизации процесса тестирования (после вывода информационного сообщения);
a для перехода к следующему вопросу (после выбора варианта ответа);
О для завершения работы программы (после вывода результата тестирования).
Таким образом, реакция программы на нажатие кнопки Buttonl зависит от состояния программы. Состояние программы фиксирует свойство Tag кнопки Buttoni.
После вывода информации о тесте значение свойства Tag кнопки Buttoni равно нулю. Поэтому в результате щелчка на кнопке Buttoni выполняется та часть программы, которая обеспечивает вывод первого вопроса и замену находящегося на кнопке текста ОК на текст Дальше, и заменяет значение свойства Tag на единицу.
В процессе тестирования значение свойства Tag кнопки Buttoni равно единице. Поэтому функция обработки события click сравнивает номер выбранного ответа (увеличенный на единицу номер компонента RadioButton) с номером правильного ответа, увеличивает на единицу счетчик правильных ответов (в том случае, если выбран правильный ответ) и активизирует процесс чтения следующего вопроса. Если попытка чтения очередного вопроса завершилась неудачно (это значит, что вопросы исчерпаны), функция выводит результаты тестирования, заменяет текст на командной кнопке на ОК и подготавливает операцию завершения работы программы (свойству Tag присваивает значение 2).
Чтение вопроса (вопрос, информация о количестве альтернативных ответов, номер правильного ответа и признак наличия иллюстрации, а также имя файла иллюстрации и альтернативные ответы) из файла теста выполняет ФУНКЦИЯ GetVoproS.
Вывод вопроса, иллюстрации и альтернативных ответов выполняет функция showvopros. Сначала функция выводит вопрос — присваивает значение свойству Caption компонента Labe11. Затем, если к вопросу есть иллюстрация, функция вычисляет размер области, которую можно выделить для отображения иллюстрации, и загружает иллюстрацию. Если размер иллюстрации больше размера области, функция устанавливает максимально возможный размер компонента Image 1 и присваивает значение false свойству AutoSize и true ЖМН* свойству Proportional, обеспечивая тем самым масштабирование иллюстрации. После этого функция выводит альтернативные ответы. Положение компонентов, обеспечивающих вывод альтернативных ответов, отсчитывается от нижней границы компонента Image1, если к вопросу есть иллюстрация, или компонента Labeii, если иллюстрации нет.
Сразу после вывода вопроса кнопка Дальше (Buttoni) недоступна. Сделано это для того, чтобы блокировать возможность перехода к следующему вопросу, если не дан ответ на текущий. Доступной кнопку Дальше делае! функция обработки события click на одном из компонентов RadioButton.
Кроме того, функция путем сканирования (проверки значения свойства checked компонентов массива RadioButton) определяет, на каком из компонентов массива испытуемый сделал щелчок и, следовательно, какой из вариантов ответа выбран. Окончательная фиксация номера выбранного ответа и сравнение его с номером правильного ответа происходит в результате нажатия кнопки Дальше.
Игра "Сапер"
Всем, кто работает с операционной системой Windows, хорошо знакома игра "Сапер". В этом разделе рассматривается аналогичная программа.
Пример окна программы в конце игры (после того, как игрок открыл клетку, в которой находится мина) приведен на рис. 10.7.
Эту клетку сапероткрылЭту клетку сапероткрылЗдесь сапер ошибсяЗдесь сапер ошибсяЭто обнаруженная минаОшибка! В клетке мины нетЭто обнаруженная минаОшибка! В клетке мины нетЭти клетки сапер не успел открытьЭти клетки сапер не успел открытьРис. 10.7. Окно программы "СаперРис. 10.7. Окно программы "Сапер
Эту клетку сапероткрыл
Эту клетку сапероткрыл
Здесь сапер ошибся
Здесь сапер ошибся
Это обнаруженная мина
Ошибка! В клетке мины нет
Это обнаруженная мина
Ошибка! В клетке мины нет
Эти клетки сапер не успел открыть
Эти клетки сапер не успел открыть
Рис. 10.7. Окно программы "Сапер
Рис. 10.7. Окно программы "Сапер
Правила игры и представление данных
Игровое поле состоит из клеток, в каждой из которых может быть мина.
Задача игрока — найти все мины и пометить их флажками.
Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым, что в клетке находится мина. Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходит взрыв (сапер ошибся, а он, как известно, ошибается только один раз) и игра заканчивается. Если в клетке мины нет, то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может обнаружить и пометить флажками все мины. Ограничений на количество клеток, помеченных флажками, нет. Однако для завершения игры (для выигрыша) флажки должны быть установлены только в тех клетках, в которых есть мины. Ошибочно установленный флажок можно убрать, щелкнув правой кнопкой мыши в клетке, в которой он находится.
В программе игровое поле представлено массивом N+2 на М+2, где NxM- размер игрового поля. Элементы массива с номерами строк от 1 до Nи номерами столбцов от 1 до M соответствуют клеткам игрового поля (рис. 10.8); первые и последние столбцы и строки соответствуют границе игрового поля.
Рис. 10.8. Клетке игрового поля соответствует элемент массива
В начале игры каждый элемент массива, соответствующий клеткам игрового поля, может содержать число от 0 до 9. Ноль соответствует пустой клетке, рядом с которой нет мин. Клеткам, в которых нет мин, но рядом с которыми мины есть, соответствуют числа от 1 до 8. Элементы массива, соответствующие клеткам, в которых находятся мины, имеют значение 9, а элементы массива, соответствующие границе поля, содержат —3.
В качестве примера на рис. 10.9 изображен массив, соответствующий состоянию поля в начале игры.
В процессе игры состояние игрового поля меняется (игрок открывает клетки и ставит флажки, и, соответственно, меняются значения элементов массива. Если игрок поставил в клетку флажок, то значение соответствующегс
элемента массива увеличивается на 100. Например, если флажок поставлен правильно, т. е. в клетку, в которой есть мина, значение соответствующего элемента массива станет равным 109. Если флажок поставлен ошибочно (например, в пустую клетку), элемент массива будет содержать число 100. Если игрок открыл клетку, значение элемента массива увеличивается на 200. Такой способ кодирования позволяет сохранить информацию об исходном состоянии клетки.
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
9
1
0
0
0
0
0
0
0
0
-3
-3
1
1
0
0
0
0
0
0
0
0
-3
-3
1
2
2
1
0
0
0
1
1
1
-3
-3
1
9
9
1
0
0
0
2
9
2
-3
_з
1
2
2
1
0
0
0
2
9
3
-3
-3
0
0
0
0
0
0
0
2
3
9
-3
-3
0
1
2
2
1
0
0
1
9
2
-3
-3
0
2
9
9
1
0
0
1
1
1
-3
-3
0
2
9
3
1
0
0
0
0
0
-3
-3
0
1
1
1
0
0
0
0
0
0
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
Рис. 10.9. Массив в начале игры
Форма приложения
Главная (стартовая) форма ифы "Сапер" приведена на рис. 10.10.
MainMenul-MainMenul-Рис. 10.10. Главная форма программы "СаперРис. 10.10. Главная форма программы "Сапер
MainMenul-
MainMenul-
Рис. 10.10. Главная форма программы "Сапер
Рис. 10.10. Главная форма программы "Сапер
Следует обратить внимание на то, что размер формы не соответствует размеру игрового поля. Нужный размер формы будет установлен во время работы программы. Делает это функция обработки события OnFormActivate, которая на основе информации о размере игрового поля (количестве клеток по вертикали и горизонтали) и размере клеток устанавливает значения свойств ClientHeight и Clientwidth, определяющие размер клиентской области главного окна программы.
Главное окно программы содержит компонент MainMenul, который представляет собой главное меню программы. Значок компонента MainMenu находится на вкладке Standard (рис. 10.11).
I Standard |
[!卞工旦冒梨А岡1置画I I* 9 ffl Я FTM1 С]:圜賓 J
MainMenu
Рис. 10.1.1. Компонент MainMenu
Значок компонента MainMenu можно поместить в любое место формы, т. к. во время работы программы он не виден. Пункты меню появляются в верхней части формы в результате настройки компонента. Для настройки меню используется редактор меню, который запускается двойным щелчком левой кнопкой мыши на значке компонента или путем выбора из контекстного меню компонента команды Menu Designer. В начале работы над новым меню, сразу после добавления компонента к форме, в окне редактора находится один-единственный прямоугольник — заготовка пункта меню. Чтобы превратить эту заготовку в меню, нужно в поле Caption окна Object Inspector ввести название меню.
Если перед какой-либо буквой в названии меню ввести знак &, то во время работы программы можно будет активизировать этот пункт меню путем нажатия комбинации клавиши <Alt> и клавиши, соответствующей символу, перед которым стоит знак &・В названии меню эта буква будет подчеркнута.
Чтобы добавить в главное меню элемент, нужно в окне редактора меню выбрать последний (пустой) элемент меню и ввести название нового пункта.
Чтобы добавить в меню команду, нужно выбрать тот пункт меню, в который надо добавить команду, переместить указатель активного элемента меню в конец списка команд меню и ввести название команды.
На рис. 10.12 приведено окно редактора меню, в котором находится меню программы "Сапер".
После того как будет сформирована структура меню, нужно, используя окно Object Inspector, выполнить настройку элементов меню (выбрать настраиваемый пункт меню можно в окне формы приложения или из списка объектов в верхней части окна Object Inspector). Каждый элемент меню (пунк-
ты и команды) — это объект типа TMenuItem. Свойства объектов TMenuItem (табл. 10.3) определяют вид меню во время работы программы.
Рис. 10.12. Структура меню программы "Сапер
Таблица 10.3. Свойства объекта TMenuitem
Свойство
Определяет
Name
Имя элемента меню. Используется для доступа к свойствам
Caption
Bitmap
Enabled
Название меню или команды
Значок, который отображается слева от названия элемента меню
Признак доступности элемента меню. Если значение свойства равно false, то элемент меню недоступен, при этом название меню отображается серым цветом
При выборе во время работы программы элемента меню происходит событие Click. Чтобы создать процедуру обработки этого события, нужно в окне формы выбрать пункт меню и щелкнуть левой кнопкой мыши — C++ Builder создаст шаблон процедуры обработки этого события. В качестве примера ниже приведена функция обработки события click, которое возникает в результате выбора из меню ? команды Справка. N3 — это имя элемента меню, соответствующего этой команде.
// выбор в меню команды Справка
voidfastcall TForml::N3Click(TObject "Sender)
WinHelp(Forml->Handle,"saper.hip",HELP_CONTEXT,1);
Игровое поле
На разных этапах игры игровое поле выглядит по-разному. Вначале поле просто разделено на клетки. Во время игры, в результате щелчка правой кнопкой мыши, в клетке появляется флажок. Щелчок левой кнопкой тоже
меняет вид клетки: клетка меняет цвет и в ней появляется цифра или мина (игра на этом заканчивается). Рассмотрим объекты, свойства и методы, обеспечивающие работу с графикой.
Начало игры
В начале игры надо расставить мины и для каждой клетки поля подсчитать, сколько мин находится в соседних клетках. Функция (ее текст приведен в листинге 10.3), решает эту задачу.
Листинг 10.3. Функция NewGame
// новая игра —новое поле
void _
<
// Очистим элементы массива, 2оответств;/ю.щие отображаемым // клеткам, а впо границе игрового поля,
// запишем число Уникальное значение клеток границы // используется функцией Open для завершения рекурсивного // процесса открытия соседних пустых клеток.
int
for (工6尸。;row <= MR+1; row++)
forcol <=- MC+1; col++)
Pole [rcwj [colj = -3;
for 口4出=1; row <= MR; row++)
for (co 工=1; col <= NC; col++)
=0;
// расставим мины
// используется генератором случайных чисел (ГСЧ) srand( (unsigned) time (&t)) ; // инициализация ГСЧ int n = 0; // количество мин do
{
row = rand () % MR +1;
col = rand。% MC +1;
if (!= 9)
{
=
n++;
while ( n <
// вычисление количества мин в соседних клетках int k;
for ( row ■■= 1; row <= MR; row++)
for ( col = 1; colMC; col++)
if ( Foie [row;5 [col] != 9) {
k =0 ;
if
Pole[row-1][col-1]
==9)
k++;
if
Pole[row-1][col]
==9)
k++;
if
Pole[row-1][col+1]
==9)
k++;
if
(Pole[row][col-1]
=9)
k++;
if
Pole[row][col+1]
==9)
k++;
if
Pole[row+1][col-1]
==9)
k++;
if
Pole[row+1][col]
==9)
k++;
if
Pole[row+1][col+1]
==9)
k++;
Pole[row][col] = k;
}
status = 0; // начало игры
nMin = 0;// нет обнаруженных мин
nFlag 二 0;// нет флагов
После того как функциярасставит мины, функция ShowPole (ее
текст приведен в листинге 10.4) выводит изображение игрового поля.
IФункция ShowPole
//поле
voidfastcallint status)
{
for ( int row = 1; row <= MR; row++)
for ( int col = 1; col <= MC; col++)Kletka(row, col, status);
Функция ShowPole выводит изображение поля последовательно, клетка за клеткой. Вывод изображения отдельной клетки выполняет функция Kletka, ее текст приведен в листинге 10.5. Функция Kletka используется для вывода изображения поля в начале игры, во время игры и в ее конце. В начале игры (значение параметра status равно нулю) функция выводит только контур клетки, во время игры — количество мин в соседних клетках или флажок, а в конце она отображает исходное состояние клетки и действия пользователя. Информацию о фазе игры функция Kletka получает через параметр status.
Листинг 10.5. Функция Kletka
// рисует на экране клетку
void _ fastcall TForml : : Kletka (int row, int col, int status)
{
int x = LEFT + (col-1)* W;*
int у = TOP + (row-1)* H;
if (status ==0) // начало игры
{
// клетка — серый квадрат
Canvas->Brush->Color = clLtGray;
Canvas->Rectangle (x-1,y-1 ,x+W,y+H);
return;
I
// во время (status = 1) и в конце (status = 2} игры
if ( Pole [row] [col] < 100)
{
// клетка не открыта
Canvas->Brush->Color = clLtGray; // не открытые — серые Canvas->Rectangle (x-l,y-l, x+W,y+H);
if (status == 2 && Pole [row] [col] == 9)
Mina ( x, y); // игра закончена, показать мину return;
}
// клетка открыта
Canvas->Brush->Color = clWhite;// открытые белые
Canvas->Rectangle (x-l,y-l, x+Wzy+H);
if ( Pole [row] [col] == 100) return; // клетка пустая
if ( Pole [row] [col] >= 101 && Pole [row] [col] <= 108)
{
Canvas->Font->Size =14;
Canvas->Font->Color = clBlue;
Canvas->TextOutA(x+3zy+2, IntToStr(Pole [row] [col] -100)); return;
}
if ( Pole [row] [col] >= 200) Flag(x, y) ;
if (Pole[row] [col] == 109) // на этой мине подорвались!
=
Canvas->Rectangle(x,у,x+W,y+H);
}
if ((% 10 == 9)(status ==
x,
Игра
Во время игры программа воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает клетки или ставит в клетки флажки.
Основную работу выполняет функция обработки события OnMouseDown (ее текст приведен в листинге 10.6). Функция получает координаты точки формы, в которой игроккнопкой мыши, а также информацию о том,
какая кнопка была нажата. Сначала функция преобразует координаты точки, в которой игрок нажал кнопку мыши, в координаты клетки игрового поля. Затем она вносит необходимые изменения в массив Pole и, если нажата правая кнопка, вызывает функцию Flag, которая рисует в клетке флажок. Если нажата левая кнопка в клетке, в которой нет мины, то эта клетка открывается, и на экране появляется ее содержимое. Если нажата левая кнопка в клетке, в которой есть мина, то вызывается функция которая показывает все мины, в том числе и те, которые игрок не успел найти.
i Листинг 10.6. Обработка события OnMouseDown на поверхности игрового поля i
// нажатие кнопки мыши на игровом
voidfastcall
Button,
TShiftState Shift, int x,y)
{
if ( status == 2) return;
•
if ( status == 0) status = 1;
x -= LEFT;
у TOP;
if (x > 0 у > 0)
{
// преобразуем координаты мыши
// в индексы клетки поля
int row = y/H +
int col =+ 1;
9 Зак. 1252
if (Button == mbLeft)
if ( Pole[row][col] == 9)
Pole[row][col] +=100; status =2;// игра закончена
ShowPole(status);
}
else if ( Pole[row][col] < 9)
Open(row,col); ShowPole(status);
} }
else if (Button ==mbRight)
{
nF丄ag++;
if ( Pole[row][col] == 9) nMin++;
Pole[row][col] += 200;// поставили флаг
if (nMin == NM && nFlag == { status = 2;// игра закончена
ShowPole(status);
} else Kletka(row, col, status);
}
Функция Flag (листинг 10.7) рисует флажок. Флажок (рис. 10.13) состоит и: четырех примитивов: линии (древко), замкнутого контура (флаг) и ломано{ линии (буква "М"). Функция Flag рисует флажок, используя метод базово! точки, т. е. координаты всех точек, определяющих положение элементе! рисунка, отсчитываются от базовой точки.
Функция Mina (листинг 10.8) рисует мину. Мина (рис. 10.14) состоит и восьми примитивов: два прямоугольника и сектор образуют корпус мины остальные элементы рисунка — линии ("усы" и полоски на корпусе).
Обеим функциям в качестве параметров передаются координаты базово точки рисунка и указатель на объект, на поверхности которого надо ри
совать.
(х,У)
Листинг 10.7. Функция Flag рисует флажок
// рисует флаг
voidfastcall TForml:: Flag ( int x, int y)
TPoint P⑷; // координаты флажка и ни氷не^ точки древка
// точки флажка
p[0].x=x+4;p[0].y=y+4;
p[l].x=x+30; p[l].y=y+12;
p[2].x=x+4;p[2].y=y+20;
// установим цвет кисти и карандаша
Canvas->Brush~>Color =
Canvas->Pen->Color = clRed; // чтобы контур флажка был красный
Canvas->Polygon(p, 2);// флажок
// древко
Canvas->Pen->Color = clBlaek;
Canvas->MoveTo(p[0].x, p[0].y);
Canvas->LineTo(x+4,у+Зб);
•
TPoint m[5];// буква М
m[0].x=x+8; m[0].y=y+14;
т[1].х=х+8; т[1].у=у+8;
m[2].x=x+10; m[2].y=y+10;
m[3].x=x+12; m[3].y=y+8;
m[4].x=x+12; m[4].y=y+14;
Canvas->Pen->Color =
Canvas->Polyline(m,4);
Canvas->Pen->Color = clBlaek;
Листинг 10.8. Функция Mina рисует мину
// рисует мину
voidfastcall TForml: :Mina (int x, int y)
f
Canvas->Brush->Color =
Canvas->Pen->Color = clBlaek;
// корпус
Canvas->Rectangle(x+16,y+26,x+24,y+30);
Canvas->Rectangle(x+8,y+30,x十32,y+34);
Canvas->Pie(x+6,y+28,x+34,y+44,x+34,y+36,x+6,y+36);
// полоса на корпусе
Canvas->MoveTo(x+12,y+32); Canvas->LineTo(x+28,y+32);
// основание
Canvas->MoveTo(x+8,y+36); Canvas->LineTo(x+32,y+36);
// вертикальный "ус"
Canvas->MoveTo(x+20,y+22); Canvas~>LineTo(x+20,y+26);
// боковые "усы"Canvas->MoveT。(x+8, y+30);Canvas->MoveTo(x+32,y+30);// боковые "усы"Canvas->MoveT。(x+8, y+30);Canvas->MoveTo(x+32,y+30);Canvas->LineTo(x+6,y+28);Canvas->LineTo(x+34,y+28);Canvas->LineTo(x+6,y+28);Canvas->LineTo(x+34,y+28);
// боковые "усы"
Canvas->MoveT。(x+8, y+30);
Canvas->MoveTo(x+32,y+30);
// боковые "усы"
Canvas->MoveT。(x+8, y+30);
Canvas->MoveTo(x+32,y+30);
Canvas->LineTo(x+6,y+28);
Canvas->LineTo(x+34,y+28);
Canvas->LineTo(x+6,y+28);
Canvas->LineTo(x+34,y+28);
Справочная информация
В результате выбора в меню ? команды Справка или нажатия клавиши <F1> должна появляться справочная информация — правила ифы (рис. 10.15).
Файл Правка Закладка Параметры Справкаёй^^анме] 一 -Печать
Сапер2
Игра Сапер является аналогом игры Сапер, входящей в состав MicrosoftWindows.
Правила
Игровое поле состоит из клеток, в каждой из которых может быть мина. Задача игрока - найти все мины и пометить их флажками.
Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым, что в клетке находится мина.
Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой.
Если в клетке, которую открыл игрок, есть мина, то происходит взрыв (сапер ошибся, а он, как известно, ошибается только один раз), и игра заканчивается. Если в клетке мины нет, то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, * ।
Рис. 10.15. Окно справочной системы программы "Сапер
Для того чтобы во время работы программы пользователь, нажав клавишу <F1>, мог получить справочную информацию, свойствам HelpFile и HelpContext главной формы надо присвоить значения, указанные в табл. 10.4.
Таблица 10.4. Значения свойств главной формы
СвойствоЗначение
Пояснение
heipfilesaper.hlp
HelpContext1
Файл справки
Идентификатор раздела, содержимое которого отображается в результате нажатия <F1>
Для того чтобы справочная информация появилась на экране в результате выбора в меню ? команды Справка, надо создать функцию обработки события Onclick для соответствующей команды меню. Процесс создания функции обработки события для команды меню ничем не отличается от процесса создания функции обработки события для элемента управления, например, для командной кнопки: в списке объектов надо выбрать объект типа TMenuItem, для которого создается функция обработки события, а во вкладке Events — событие.
Ниже приведена функция обработки события Onclick для команды Справка меню ?.
// выбор в меню ? команды Справка
void fastcall TForml: :N3Click (TObject *Sender) {
WinHelp (Forml->Handle, nsaper.hlp",HELP_CONTEXT, 1);
)
I
Вывод справочной информации выполняет функция WinHelp, которой в качестве параметра передается идентификатор окна программы, которая запрашивает вывод справочной информации, файл справки, константу HELP_CONTEXT и идентификатор раздела, содержимое которого должно быть отражено.
Информация о программе
При выборе из меню ? команды О программе на экране должно появиться одноименное окно (рис. 10.16).
II О программе
Программа демонстрирует работа с графикой, массивами и использование рекурсии.
Текст программы можно найти в книге:
Культин Н.Б.
СамоучительC++ Builder.
-СПб.: БХВ-Петербург. ?003.
hto;\、ffismt
OK
Рис. 10.16. Выбрав ссылку, можно активизировать браузери перейти на страницу издательства "БХВ-Петербург"
Чтобы программа во время своей работы могла вывести на экран окно, от личное от главного (стартового), нужно добавить в проект форму. Делаете это выбором из меню File команды New form. В результате выполнени
команды New form в проект добавляется новая форма и соответствующий ей модуль.
Если в проекте несколько форм, то для того чтобы получить доступ к нужной форме и, соответственно, к модулю, надо выбрать имя нужной формы в списке диалогового окна View Form (рис. 10.17), которое становится доступным в результате щелчка на командной кнопке View Form (рис. 10.18) или нажатия комбинации клавиш <Shift>+<F12>.
Рис. 10.17. Выбрать нужную форму можно в списке окна View Form
jVi啰рейт (Shilt+F12)|
Рис. 10.18. Командная кнопка View Form
Вид формы AboutForm после добавления необходимых компонентов приведен на рис. 10.19, значения ее свойств — в табл. 10.5.
Таблица 10.5. Значения свойств формы О программе
Свойство
Значение
Name
AboutForm
Caption
Borderstyle
BorderIcons.biSystemMenu
О программе bsSingle false
Таблица 10.5 (окончание)
СвойствоЗначение
BorderIcons•biMininizefalse
Рис. 10.19. Форма О программеРис. 10.19. Форма О программеКультин Н.Б.• Самоучитель C++ Builder.-СПб.: БХВ-Петербург. 2003Культин Н.Б.• Самоучитель C++ Builder.-СПб.: БХВ-Петербург. 2003BorderIcons.biMaximizefalse
Рис. 10.19. Форма О программе
Рис. 10.19. Форма О программе
Культин Н.Б.
• Самоучитель C++ Builder.
-СПб.: БХВ-Петербург. 2003
Культин Н.Б.
• Самоучитель C++ Builder.
-СПб.: БХВ-Петербург. 2003
• Программа демонстрирует работу сграфикой,
'.и использование рекурсии
. Текст программы можно найти в книге:
Вывод окна О программе выполняет функция обработки события click, которое происходит в результате выбора из меню ? команды О программе (листинг 10.9). Непосредственно вывод окна выполняет метод ShowModal, который выводит окно как модальный диалог. Модальный диалог перехватывает все события, адресованные другим окнам приложения, в том числе и главному. Таким образом, пока модальный диалог находится на экране, продолжить работу с приложением, которое вывело модальный диалог, нельзя.
[Листинг 10.9. Вывод окна О программе
void _ fastcall TForml : :N4Click (TObject *Sender)
// "привяжем" окно О программе к главному окну приложения
About Fo rm->Top =+ Forml->Height/2 - AboutForm->Height/2;
AboutForm->Left =+ Fo ml ->Width/2 — About Fo rm->Width/2;
About Form->ShowModa1();
Если не предпринимать никаких усилий, то окно О программе появится в той точке экрана, в которой находилась форма во время ее разработки. Вместе с тем, можно "привязать" это окно к главному окну программы так, чтобы оно появлялось в центре главного окна. Привязка осуществляется на основании информации о текущем положении главного окна программы (свойства тор и Left) и о размере окна О программе.
На поверхности формы О программе есть ссылка на сайт издательства "БХВ-Петербург'. Предполагается, что в результате щелчка на ссылке в окне браузера будет открыта указанная страница. Для того чтобы это произошло, надо создать функцию обработки события onclick для компонента Labels. Значения свойств компонента Labe15 приведены в табл. 10.6, а текст функции обработки события — в листинге 10.10.
Таблица 10.6. Значения свойств компонента Label5
Свойство
Значение
Комментарий
Font. Color
clBlue
Цвет —синий
Font.Style.Underline
true
Подчеркивание
Cursor
crHandPoint
При позиционировании указателя мыши на текст указатель принимает форму руки
Для запуска браузера использована функция ShellExecute, которая открывает указанный файл при помощи программы, предназначенной для работы с файлами указанного типа. Так как имя файла в данном случае представляет собой URL-адрес, то будет запущен браузер (тот, который установлен на компьютере пользователя).
Наиболее просто передать URL-адрес в функцию SheilExecute можно как строку-константу, например:
ShellExecute(AboutForm->Handle, "open", "http: WWwww.bhv. run, NULL, NULL, SW_RESTORE);
Но лучше URL-адрес брать из поля метки. В функцию ShellExute надо передать указатель на обычную строку, т. е. завершающуюся нулевым символом. Однако свойство caption — это AnsiString. Преобразование строки Ansi В указатель на null terminated string выполняет МеТОД c_str () .
[Листинг 10.10. Щелчок в поле URL
voidfastcall TAboutForm::Label5Click(TObject *Sender)
{
/* наиболее просто передать в функцию SheilExecute строку-константу (URL-адрес) так, как показано ниже:
ShellExecute (About Form->Handle ^
"open ”,
"http: \ \ Wwww.bhv. ru ",
NULL, NULL)
Лучше URL-адрес брать из поля метки,
В функцию ShellExecute надо передать указатель на null termina ted-строку, но свойство Caption - это AnsiString.
Преобразование Ansi -строки в char* выполняет метод c_str ()
*/
\
// открыть файл, имя которого находится в поле Label5
ShellExecute (AboutFomi-^andle, "open",Label5->Caption.cstr (), NULL,NULL,SW_RESTORE);
Окно О программе закрывается в результате щелчка на кнопке ОК. Функ ЦИЯ обработки этого события приведена ниже.
void _ fastcall TAbout Form: : ButtonlClick (TObj ect * Sender) {
ModalResult = mrOk; // убрать окно О программе
Текст программы
Полный текст профаммы "Сапер" приведен ниже: в листингах 10.11 и 10.12 -■ заголовочный файл и модуль главной формы; в листинге 10.13 — модуль формы О программе.
Листинг 10.11. Заголовочный файл главной формы (saper_.h)
#ifndef saper_H
#define saper_H
include <Classes.hpp>
include <Controls.hpp>
include <StdCtrls.hpp>
#include <Forms ,hpp>
include <ExtCtrls.hpp>
include<Menus . hpp>
class TForml : public TForm {
_published:
TMainMenu *MainMenul;
// команды главного меню
TMenuItem *N1; // Новая игра
TMenuItem *N2; // команда
// команды меню // Справка // О программе
void _ fastcallButton,
TShiftState Shift, int X, _ fastcall _ fastcall
выбор команды в меню
void _
fastcall
NlClick
(TObject * Sender);
//
Новая игра
void
fastcall
N3Click
(TObject *Sender);
//
Справка
void _
fastcall
N4Click
(TObject *Sender);
//
О программе
private:
void _ fastcall// отображает поле
//содержимое клетки
void _fastcall(intint col, int
void _ fastcall(int x, int // рисует мину
voidint x, int// рисует флаг
public:
_ fastcall
extern PACKAGE TForml
#endif
Листинг 10.12. Модуль главной формы (saper.cpp)
/*
Игра "Сапер". Демонстрирует работу с графикой, использование рекурсии, доступ к файлу справочной информации.
*/
include <vcl. h>
ttinclude <stdlib.h> // для доступа к ГСЧ
#include
<stdio.h>
hdrstop
include "saper_.h"
include nsaper_2.cppn
ttpragmapackage (smart_init)
ttpragma resource ”*.dfm"
TForml *Forml; // главное окно
_ fastcall TForml: : TForml (TComponent*Owner) :
#define MR 10#define MR 10#define MC 10#define MC 10.// кол-во клеток по вертикали
#define MR 10
#define MR 10
#define MC 10
#define MC 10
// кол-во клеток по горизонтали
Idefine NM 10 // кол-во мин
int Pole[MR+2] [MC+2]; // минное поле
// 0. .8 — количество мин в соседних клетках
// 9 — в клетке мина
// 100..109 — клетка открыта
// 200.. 209 — в клетку поставлен флаг
int nMin;// кол-во найденных мин
int nFlag; // кол-во поставленных флагов
int status =0; // 0 — начало игры; 1 — игра; 2 — результат
// смещение игрового поля относительно левого верхнего угла
// поверхности
ttdefine LEFT 0
формы
// по X
fdefine ТОР 1
// по Y
Idefine W40
// ширина клетки поля
#define H40
// высота клетки поля
void _ fastcall void _ fastcall
NewGame (); // новая игра — "разбрасывает" мины
Open (int row, int col); /* открывает текущую и соседние
пустые клетки */
// нажатие кнопки мыши на игровом поле
void _ fastcall TForml : : FormMouseDown (TObject *Sender, TMouseButton Button,
TShiftState Shift, int x, int y)
(
if ( status == 2) return;
if ( status == 0) status = 1,-
x -= LEFT;
у -= TOP;
if (х > 0 у > 0) { //координаты мыши
// в индексы клетки поля int row = y/H + 1;
int col =+ 1;
if==
{
if (== 9)
{
Pole[row][col] +=100;
status =// игра
ShowPole(status);
}
else if (< 9)
{
Open(row,col); ShowPole(status);
}
else if (Button ==
{ nFlag++; if (== 9)
nMin++; += 200;// поставили флаг
if== NM== NM)
{
status// игра закончена
ShowPole(status);
)
elsecol,
}
// Функция обработки события OnCreate обычно используется . // для инициализации глобальных переменных voidfastcall
{
// В неотображаемые зл - ты ма ccma , которые соответствуют // клеткам по границе игрового поля, запишем число
Ч
// Это значение используется функцией Open для завершения // рекурсивного процесса открытия соседних пустых клеток. for ( int row=0; row <= MR+1; row++)
for ( int col=0; col <= МС+1; col++)
Pole [row] [col] = -3;
NewGame ();// "разбросать" мины
Fo ml->ClientW idth =
Fo rail->Cli ent Height =
}
// Вывод поля как результат обработки события Paint
// позволяет проводить любые манипуляции с формой
// во время работы программы
void fastcall TForml: : FormPaint (TObj ect *Sender)
{
ShowPole(status);
}
// Показывает поле
void fastcall TForml : : ShowPole ( int status) {
for ( int row = 1; row <= MR; row++)
for ( int col = 1; col <= MC; col++) Kletka (row, col, status);
)
// рисует на экране клетку
void _ fastcall TForml: :Kletka (int row, int col, int status) {
int x = LEFT + (col-1)* W;
int у = TOP + (row-1)* H;
if (status ==0) // начало игры (
// клетка — серый квадрат Canvas->Brush->Color = clLtGray;
Canvas->Rectangle (x-l,y-lr x+W, y+H); return;
}
// во время (status = 1) и в конце (status = 2) игр if ( Pole [row] [col] < 100)
{
// клетка не открыта
Canvas->Brush->Color = clLtGray;// не открытые — серые
Canvas->Rectangle(x-l,y-l,x+W,y+H);
if (status == 2 &&== 9)
x,// игра закончена, показать мину
return;
}
// клетка открыта
Canvas->Brush~>Color//- белые
Canvas->Rectangle(x-1,y-1,x+W,y+H);
if (== 100) // клетка открыта, но она пустая
return;
if ([col] >= 101<= 108)
{
Canvas->Font->Size = Canvas->Font->Color = Canvas->TextOutA(x+3,y+2, IntToStr(Pole[row][col]-100)); return;
}
if (>= 200)
Flag(x, y);
if== 109) // на этой мине подорвались!
(
Canvas->Brush->Color =
Canvas->Rectangle(x,y,x+W,y+H);
}
if% 10 == 9)(status ==
x,
// рекурсивная функция открываети все соседние
// клетки, в которых нет мин
voidfastcallrow, int col)
{
if0)
{
= 100;
// открываем клеткиснизу и сверху
Open(row,col-1);
Open(row-1,col);
Open(row/СО1+1);
Open(row+1,col);
// открываем примыкающие диагонально
Open(row-1,col-1);
Open(row-1,co1+1);
Open(row+1,col-1);
Open(row+1,col+1);
)
else
/ / -3 — это граница игрового поля
if (Pole[row] [col] < 100 && Pole [row] [col] != -3) Pole [rovj] [colj +二 100;
}
/ / новая игра — генерирует новое поле void
{
// Очистим эл - ты ш с сив a z состветствуюЩ' i е отображаемым
//а в неотображаемые (по границе игрового поля)
// запишем число -3. Уникальное значение клеток границы
// используется функцией Open для завершения рекурсивного
// процесса открытия соседних пустых
int row, col;
for (row=0; row <= MR+1; row++)
for (col=0; colcol++)
Po2 e f row] [col ;二-3;
for (row=l; row <= MR; row++)
for (ccl-1 ; col <= MC; col++)
Pole [row] [ccd]二 0;
// р а с с та вим мины
tima t t;/ / используется ГСЧ
srand( (unsigned) time (& t)) ; // инициализация гсч
int n = 0; // кол-во мин
do
{
row 二二and 0 % MR +1;
col 二匸and() % MC +1;
if ( Pole [row- [col; != 9)
{
Pole[row] [col]二 9;
n++;
}
while ( n <
// вычисление кол-ва мин в соседних клетках
int for
k;
( row = 1; row <= MR; row++)
for ( col = 1; col <= MC; col++)
if (Pole [row] [col] != 9) {
k =0;
if ( Pole[row'l] [col-1] == 9) k++; if ( Pole [row-1] [col] == 9) k++;
if ( Pole [ row-1 ] [col+1]== 9) k++; if(Pole [row] [col-1]=9)k++;
if(Pole [row] [col+1]==9)k++;
if(Pole [row+1] [col-1]==9)k++;
if(Pole [row+1 ] [col]=9)k++;
if(Pole [row+1] [col+1]==9)k++;
Pole [row] [col] = k;
}
status =о; // начало игры
nMin. = 0;// нет обнаруженных мин
nFlag = 0;// нет флагов
}
// рисует мину
void _ fastcall TForml: :Mina (int x, int y) {
Canvas->Brush->Color =
Canvas->Pen->Color = clBlack;
Canvas->Rectangle (x+16,y+26, x+24,y+30);
// корпус
Canvas->Rectangle (x+8,y+30, x+32,y+34 );
Canvas->Pie (x+6,y+28, x+34,y+44, x+34,y+36, x+6,y+36);
// полоса на корпусе
Canvas->MoveTo (x+12,y+32) ; Canvas-〉LineT。(x+28,y+32);
// основание
Canvas->MoveTo (x+8,y+36) ; Canvas->LineTo (x+32,y-h36);
// вертикальный "ус"
Canvas~>MoveTo (x+20ry+22) ; Canvas->LineTo (x+20ry+26);
// боковые "усы"
Canvas->MoveT。(x+8, y+30); Canvas->LineTo (x+6,y+28);
Canvas->MoveTo (x+ 32,y+30) ; Canvas->LineTo (x+34,y+28);
}
// рисует флаг
void fastcall TForml : : Flag ( int x, int y) {
TPoint p[4]; // координаты флажка и нижней точки древка
// точки флажка
p[0].x=x+4;p[0].y=y+4;
p[l].x=x+30; p[l].y=y+12;
р[2].х=х+4;p[2],y=y+20;
// установим цвет кисти и карандаша Canvas->Brush->Color = clRed;
Canvas->Pen->Color = clRed; // чтобы контур флажка был красный
Canvas->Polygon(p, 2); // флажок
// древко
Canvas ->Pen->Color = clBlack;
Canvas->MoveTo(p[0] .x, p[0] ,y);
;
TPoint m[5];// буква M
m[0] .x=x+8; m[0] .y=y+14;
m[l].x=x+8; m[l] .y=y+8;
m[2] .x=x+10; m[2] .y=y+10;
m[3] .x=x+12; m[3] .y=y+8;
m[4] .x=x+12; m[4] .y=y+l4; Canvas->Pen->Color = clWhite;
Canvas->Polyline (m,4); Canvas->Pen->Color = clBlack;
// команда главного меню Новая игра
void _ fastcall TForml: : NIClick (TObj ect * Sender) {
NewGame ();
ShowPole(status);
}.
// выбор в меню команды О программе
void _ fastcall TForml: :N4Click (TObject *Sender) {
About Fo rm->Top =+ Forml->Height/2
-
2\boutForm->Left =+ Forml->Width/2 ,
- About Fo rm->Width/2;
AboutFom->ShowModa 1 ();
}
// выбор в меню команды Справка
voidfastcall TForml::N3Click(TObject *Sender)
{
WinHelp (Forml->Handle, f,saper .hlp^/HELP^ONTEXT# 1);
I
Листинг 10.13. Модуль формы О программе (saper2_.cpp)
# include <vcl. h>
ttpragmahdrstop
#include "saper_2・h"
#pragma package (smart_init)
#pragma resource ”* ・dfm"
TAboutForm * About Form;
_ fastcall TAboutForm: : TAboutForm (TComponent*Owner)
:
{
}
// Выбор URL-адреса
void _fastcall TAboutForm: : Label5Click (TObject *Sender)
{
/* В функцию ShellExute надо передать указатель на null terminated строку (char^). Свойство Caption — это AnsiString. Преобразование Ansi -строки в указатель на nt-строку выполняет метод c_str ()
*/
// открыть файл, имя которого находится в поле Labe15
ShellExecute(AboutForm->Handle,"open",Label5->Caption.c_str() F NULL,NULL,SW_RESTORE);
// щелчок на кнопке OK
void —fastcall TAboutForm: :ButtonlClick(TObject *Sender)
(
ModalResult =
Очистка диска
Открыв каталог какого-либо проекта C++ Builder, можно увидеть, что помимо файлов, составляющих проект и используемых компилятором для генерации выполняемого файла (bpi, dfrn-, h- и срр-файлы), в каталоге есть файлы с расширением obj, tds и еще несколько файлов, расширение которых начинается значком ~ (рис. 10.20).
I,Проверк знаний
; ФайлПравка g-ид Избранное Сереж ^рдака
| 3 Назад *喃-曰 QПоиск <jПапки ^Журнал 力空X公削▼
j jo Проверка знанийj jo Проверка знаний▼ I р Переход▼ I р ПереходПроверказнанийПроверказнаний7 элементоввыделено.7 элементоввыделено.Общий размер файлов: 2,01 МБОбщий размер файлов: 2,01 МБtester.tds tester_.~ddp tester_.~dfm tester_.~h tester, obj tester_.objtester_.~cpptester.tds tester_.~ddp tester_.~dfm tester_.~h tester, obj tester_.objtester_.~cppИмяtester, bpr ^ftStester_.dfm ЙЦ tester.cpp й2 tester,, cpp ^tester.exe SPeterburg.txtэкономика, txt "*5fBOT.BMP 呷Herm.bmp "^ I5AAK.BMPИмяtester, bpr ^ftStester_.dfm ЙЦ tester.cpp й2 tester,, cpp ^tester.exe SPeterburg.txtэкономика, txt "*5fBOT.BMP 呷Herm.bmp "^ I5AAK.BMPРазмерJ ТипРазмерJ Тип..Выделено объектов: 7Выделено объектов: 7^tester_.ddp Jtester^.h^tester_.ddp Jtester^.hQ]tester_.yppЯlester_. 2ddp tester.,~dfm tester二句.Q]tester_.yppЯlester_. 2ddp tester.,~dfm tester二句.4 КБ 1КБКБКБ34 КБ2 КБ2 КБ59 КБ206 КБ67 КБ9 КБКБКБКБ 1КБКБ18 КБ57 КБ1КБ4 КБ 1КБКБКБ34 КБ2 КБ2 КБ59 КБ206 КБ67 КБ9 КБКБКБКБ 1КБКБ18 КБ57 КБ1КБ1 984 КБ1 984 КБBCBProject C++Builder Form C++Builder Source ... C++Builder Source ПриложениеТекстовый документ Текстовый документ Точечный рисунок Точечный рисунок Точечный рисунок Файл "~CPP"Файл "~DDP" Файл "~DFM"Файл %H”Файл "DDP"Файл "H"Файл "OBJ" Файл "OBJ"Файл "RES" Файл "IDS"BCBProject C++Builder Form C++Builder Source ... C++Builder Source ПриложениеТекстовый документ Текстовый документ Точечный рисунок Точечный рисунок Точечный рисунок Файл "~CPP"Файл "~DDP" Файл "~DFM"Файл %H”Файл "DDP"Файл "H"Файл "OBJ" Файл "OBJ"Файл "RES" Файл "IDS"<1<12,01МБ2,01МБ.. I Мой компьютер.. I Мой компьютер±1±1
j jo Проверка знаний
j jo Проверка знаний
▼ I р Переход
▼ I р Переход
Проверказнаний
Проверказнаний
7 элементоввыделено.
7 элементоввыделено.
Общий размер файлов: 2,01 МБ
Общий размер файлов: 2,01 МБ
tester.tds tester_.~ddp tester_.~dfm tester_.~h tester, obj tester_.obj
tester_.~cpp
tester.tds tester_.~ddp tester_.~dfm tester_.~h tester, obj tester_.obj
tester_.~cpp
Имя
tester, bpr ^ftStester_.dfm ЙЦ tester.cpp й2 tester,, cpp ^tester.exe SPeterburg.txt
экономика, txt "*5fBOT.BMP 呷Herm.bmp "^ I5AAK.BMP
Имя
tester, bpr ^ftStester_.dfm ЙЦ tester.cpp й2 tester,, cpp ^tester.exe SPeterburg.txt
экономика, txt "*5fBOT.BMP 呷Herm.bmp "^ I5AAK.BMP
РазмерJ Тип
РазмерJ Тип
.
.
Выделено объектов: 7
Выделено объектов: 7
^tester_.ddp Jtester^.h
^tester_.ddp Jtester^.h
Q]tester_.ypp
Яlester_. 2ddp tester.,~dfm tester二句.
Q]tester_.ypp
Яlester_. 2ddp tester.,~dfm tester二句.
4 КБ 1КБ
КБ
КБ
34 КБ
2 КБ
2 КБ
59 КБ
206 КБ
67 КБ
9 КБ
КБ
КБ
КБ 1КБ
КБ
18 КБ
57 КБ
1КБ
4 КБ 1КБ
КБ
КБ
34 КБ
2 КБ
2 КБ
59 КБ
206 КБ
67 КБ
9 КБ
КБ
КБ
КБ 1КБ
КБ
18 КБ
57 КБ
1КБ
1 984 КБ
1 984 КБ
BCBProject C++Builder Form C++Builder Source ... C++Builder Source Приложение
Текстовый документ Текстовый документ Точечный рисунок Точечный рисунок Точечный рисунок Файл "~CPP"
Файл "~DDP" Файл "~DFM"
Файл %H”
Файл "DDP"
Файл "H"
Файл "OBJ" Файл "OBJ"
Файл "RES" Файл "IDS"
BCBProject C++Builder Form C++Builder Source ... C++Builder Source Приложение
Текстовый документ Текстовый документ Точечный рисунок Точечный рисунок Точечный рисунок Файл "~CPP"
Файл "~DDP" Файл "~DFM"
Файл %H”
Файл "DDP"
Файл "H"
Файл "OBJ" Файл "OBJ"
Файл "RES" Файл "IDS"
<1
<1
2,01МБ
2,01МБ
.. I Мой компьютер
.. I Мой компьютер
±1
±1
Рис. 10.20. Содержимое каталога проекта "Проверка знаний". Файлы, выделенные цветом,по окончании работы над проектом можно удалить
Файлы с расширением tds и obj создает компилятор в процессе генерации выполняемого файла. Это временные файлы. По окончании работы над проектом они не нужны, и их можно удалить, тем более что размер tds- файла может достигать нескольких мегабайт. Файлы, расширение которых начинается значком ~, — это резервные копии соответствующих файлов проекта. По окончании работы над проектом их тоже можно удалить с диска.
Программа "Очистка диска" удаляет из текущего каталога и всех его подкаталогов файлы, которые по окончании работы над проектом не нужны
(если удалить временные файлы проекта, работа над которым еще не завершена, то в процессе компиляции они будут созданы снова).
Окно программы "Очистка диска" в начале ее работы приведено на рис. 10.21. Для выбора каталога, который надо "почистить", используется стандартное диалоговое окно Обзор папок, которое появляется в результате щелчка на кнопке Каталог.
Программа удалит ненужные, созданные в процессе компиляцииФайлыи резервные копии
из указанного каталога его подкаталогов.
Каталог...Каталог...Рис.Окно программы "Очистка диска" в начале ее работыРис.Окно программы "Очистка диска" в начале ее работы
Каталог...
Каталог...
Рис.Окно программы "Очистка диска" в начале ее работы
Рис.Окно программы "Очистка диска" в начале ее работы
Процесс активизации процесса активизирует кнопка Выполнить, которая становится доступной только после того, как пользователь выберет каталог. В процессе очистки диска программа выводит в поле Memo имена удаленных файлов.
Вид формы программы приведен на рис. 10.22. После того как компоненты будут добавлены в форму, необходимо выполнить их настройку — задать значения свойств (табл. 10.7).
Текст программы "Очистка диска" приведен в листинге 10.14.
Таблица 10.7. Настройкакомпонентов
Компонент
Свойство
Значение
Комментарий
Forml
BorderStyle
bsSingle
Тонкая граница окна.
Во время работы программы нельзя изменить размер окна, захватив границу мышью
Forrnl
Borderlcins.biMaximize
false
Во время работы программы в заголовке окна нет кнопки Развернуть
Button2
Enabled
false
В начале работы программы кнопка Выполнить недоступна
Memol
ScrollBars
ssVertical
Есть вертикальная полоса прокрутки
MemolMemolEditlButtonlButton2EditlButtonlButton2Рис. 10.22. Форма программы "Очистка дискаРис. 10.22. Форма программы "Очистка диска
Memol
Memol
Editl
Buttonl
Button2
Editl
Buttonl
Button2
Рис. 10.22. Форма программы "Очистка диска
Рис. 10.22. Форма программы "Очистка диска
Листинг 10.14. Очистка диска
#include <vcl.h>
#pragma hdrstop
#include "clear —・h"
#include <FileCtrl.hpp> // для доступа к SelectDirectory
#pragma package (smart__init)
#pragma resource ”*.dfm"
TFonul *Forml;
_ fastcall TForml: : TForml (TComponent*Owner)
:
•
(
AnsiString Directory; // каталог, в котором находятся проекты C++ Builder
AnsiString eDir; // текущий каталог
AnsiString FileExt; // расширение файла
int n = 0;// количество удаленных файлов
// щелчок на кнопке Каталог
void fastcall TForml: : Buttonl Click (TObject*Sender) {
AnsiString dir;// каталог, который выбрал пользователь
if ( SelectDirectory ("Выберите каталог", пп, dir)) {
// диалог Выбор файла завершен щелчком на кнопке 0K Editl->Text = dir;
Button2->Enabled = true; // теперь кнопка Выполнить доступна
// удаляет ненужные файлы из текущего каталога и его подкаталогов void _ fastcall Clear (void)
TSearchRec SearchRec; // информация о файле или каталоге
cDir = GetCurrentDir ()+”\\“;
if ( FindFirst ("*.*", faArchive,SearchRec) == 0) do {
// проверим расширение файла
intp=SearchRec ・ Name . Pos (". **);
FileExt = SearchRec.Name. Substring (p+l,MAX_PATH);
if ( ( FileExt [1] ==( FileExt == "objn) H
( FileExt=="tds"))
Forml->Memol ->Lines~>Add (cDir+SearchRec.Name); DeleteFile(SearchRec.Name);
n++;
while { FindNext (SearchRec) ==
// обработка подкаталогов текущего каталога
if ( FindFirst ("*”, faDirectory, SearchRec)0)
do
if ((SearchRec.Attr & faDirectory) = SearchRec.Attr) {
// каталоги ・ и " rr тоже каталогиf
// но в них входить не надо / / r if ((SearchRec.Name != n.") && (SearchRec.Name != "..'•))
{
ChDir (SearchRec. Name); // войти в подкаталог Clear ();// очистить каталог
ChDir (”.•”);// выйти из каталога
while ( FindNext (SearchRec) == }
// щелчок на кнопке Выполнить
void _ fastcall TForml: :Button2Click (TObject * Sender)
{
Memol'->Clear ();// очистить поле Memol
Directory = Editl->Text;// каталог, который выбрал пользователь
ChDir (Directory);// войти в каталог
Clear ();// очистить текущий каталог и его подкаталоги
Memol->Lines->Add(""); if (n)
Memol->Lines->Add( нУдаленофайлов: “ + IntToStr(n));
else
Memol->Lines->Add (
"В указанном каталоге нет файлов, которые надо удалить.n);
Основную работу (удаление файлов) выполняет рекурсивная функция clear (рекурсивной называют функцию, которая в процессе работы вызывает сама
себя). Решение реализовать функцию clear как рекурсивную не случайно: функция обрабатывает каталоги компьютера, которые являются рекурсивными объектами. Рекурсивным называют объект, частично состоящий из объектов этого же типа.
Алгоритм функции clear приведен на рис. 10.23.
Рис. 10.23. Алгоритм функции Clear
Сначала функция clear обрабатывает текущий каталог: просматривает все файлы и удаляет те, которые надо удалить. Просмотр файлов обеспечивают функции FindFirst и FindNext. Функция FindFirst просматривает каталог, указанный при ее вызове, и записывает в структуру SearchRec имя первого из найденных файлов, имя которого соответствует маске. В данной программе маска *.*, t. e. функция выбирает первый по порядку файл. Если файл найден, то выполняется проверка его расширения. Если расширение файла obj, tds или начинается со значка ~, то имя файла добавляется в поле
Memol, а сам файл удаляется с диска. Удаляет файл функция DeleteFile. После обработки первого файла для поиска следующего вызывается функция FindNext. После того как все файлы текущего каталога будут обработаны, функция clear проверяет, есть ли в текущем каталоге подкаталоги. Проверку выполняет функция FindFirst, которой в качестве параметра передается константа faDirectory, информирующая функцию о том, что надо искать имена каталогов, а не файлов. Если в текущем каталоге нет подкаталогов, то функция clear завершает работу. Если в текущем каталоге есть подкаталоги, то выполняется вход в подкаталог (делает это функция ChDir) и вызов функции clear (для обработки подкаталога функция вызывает саму себя). Если в текущем каталоге нет необработанных каталогов, то она завершает работу и возвращает управление функции clear, которая ее вызвала и которая после этого продолжает обработку "своих" подкаталогов.
Вывод окна Обзор папок выполняет функция SelectDirectory, которую вызывает функция обработки события click на кнопке Каталог. Для доступа к этой функции в текст программы надо включить директиву #include <FileCtrl.hpp>.
ПРИЛОЖЕНИЕ 1
C++ Builder - краткий справочник
Приложение представляет собой краткий справочник по компонентам и функциям C++ Builder.
Компоненты
В этом разделе приведено краткое описание базовых компонентов C++ Builder. Подробное описание этих и других компонентов можно найти в справочной системе.
Форма
Форма (объект тип TForm) является основой программы. Свойства формы (табл. П1.1) определяют вид окна программы.
Таблица /77.7・Свойства формы (объекта TForm)
Свойство
Описание
Name
Имя формы. В программе имя формы используется для управления формой и доступа к компонентам формы
Caption
Тор
Текст заголовка
Расстояние от верхней границы формы до верхней границы экрана
Left
Расстояние от левой границы формы до левой границы экрана
Width
Ширина формы
Height
Clientwidth
Высота формы
Ширина рабочей (клиентской) области формы, т. е. без учета ширины левой и правой границ
Таблица шл (окончание)
Свойство
Описание
ClientHeight
Высота рабочей (клиентской) области формы, т. е. без учета высоты заголовка и ширины нижней границы формы
Borderstyle
Вид границы. Граница может быть обычной (bsSizeable), тонкой (bssingle) или отсутствовать (bsNone). Если у окна обычная граница, то во время работы программы пользователь может при помощи мыши изменить размер окна. Изменить размер окна с тонкой границей нельзя. Если граница отсутствует, то на экран во время работы программы будет выведено окно без заголовка. Положение и размер такого окна во время работы программы изменить нельзя
BorderIcons
Кнопки управления окном. Значение свойства определяет, какие кнопки управления окном будут доступны пользователю во время работы программы. Значение свойства задается путем присвоения значений уточняющим свойствам biSystemMenu, biMinimize, biMaximize и biHelp. Свойство biSystemMenu определяет доступность кнопки Свернуть и кнопки системного меню, biMinimize— кнопки Свернуть, biMaximize — кнопки Развернуть, biHelp — кнопки вывода справочной информации
Icon
Значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню
Color
Цвет фона. Цвет можно задать, указав название цвета или элемент цветовой схемы операционной системы. Во втором случае цвет компонента "привязан" к цветовой схеме операционной системы и будет изменяться при каждой смене цветовой схемы
Font
Шрифт. Шрифт, используемый "по умолчанию" компонентами, находящимися на поверхности формы. Изменение свойства Font формы приводит к автоматическому изменению свойства Font компонента, располагающегося на поверхности формы. То есть компоненты наследуют свойство Font от формы (имеется возможность запретить наследование)
Canvas
Поверхность, на которую можно вывести графику
Label
Компонент Label (рис. П1.1) предназначен для вывода текста на поверхность формы. Свойства компонента (табл. П1.2) определяют вид и расположение текста.
Standard |_ _ __ _
飞目甘*个囱量山区g對届3,应」每
Label
Таблица П12 Свойства компонента Label (поле вывода текста)
Свойство
Описание
Name
Имя компонента. Используется в программе для доступа к компоненту и его свойствам
Caption
Left
Отображаемый текст
Расстояние от левой границы поля вывода до левой границы формы
Тор
Расстояние от верхней границы поля вывода до верхней границы формы
Height
Width
Высота поля вывода
Ширина поля вывода
AutoSize
Признак того, что размер поля определяется его содержимым
wordwrap
Признак того, что слова, которые не помещаются в текущей строке, автоматически переносятся на следующую строку (значение свойства AutoSize ДОЛЖНО быть false)
Alignment
Задает способ выравнивания текста внутри поля. Текст может быть выровнен по левому краю (taLeft Justify), по центру (taCenter) или по правому краю (taRightJustify)
Font
Шрифт, используемый для отображения текста. Уточняющие свойства определяют шрифт (Name), размер (size), стиль (style) и цвет символов (Color)
ParentFont
Признак наследования компонентом характеристик шрифта формы, на которой находится компонент. Если значение свойства равно true, то текст выводится шрифтом, установленным для формы
Color
Цвет фона области вывода текста
Transparent
Управляет отображением фона области вывода текста. Значение true делает область вывода текста прозрачной (область вывода не закрашивается цветом, заданным свойством Color)
Visible
Позволяет скрыть текст (false) или сделать его видимым (true)
Edit
Компонент Edit (рис, П1.2) представляет собой поле ввода-редактирования строки символов. Свойства компонента приведены в табл. П1.3.
Standard |
,G 口冢% A T量山区傷氈圍山.言 羽
Edit
Рис. П1.2. Компонент Edit — поле ввода-редактирования строки символов
Таблица П1.3. Свойства компонента Edi t (поле редактирования)
Свойство
Описание
Name
Имя компонента. Используется в программе для доступа к компоненту и его свойствам, в частности для доступа к тексту, введенному в поле редактирования
Text
Текст, находящийся в поле ввода и редактирования
Left
Расстояние от левой границы компонента до левой границы формы
Тор
Расстояние от верхней границы компонента до верхней границы формы
Height
Высота поля
Width
Ширина поля
Font
Шрифт, используемый для отображения вводимого текста
ParentFont
Признак наследования компонентом характеристик шрифта формы, на которой находится компонент. Если значение свойства равно true, то при изменении свойства Font формы автоматически меняется значение свойства Font компонента
Enabled
Используется для ограничения возможности изменить текст в поле редактирования. Если значение свойства равно false, то текст в поле редактирования изменить нельзя
visible
Позволяет скрыть компонент (false) или сделать его видимым (true)
Button
Компонент Button (рис. П1.3) представляет собой командную кнопку.
Свойства компонента приведены в табл. П1.4.
Standard ]
[V bi sr % a园画手( я т -—
Button
Рис. П1.3. Компонент Button — командная кнопка
Таблица 〃74 Свойства компонента Button (командная кнопка)
СвойствоОписание
NameИмя компонента. Используется в программе для доступа к компо
ненту и его свойствам
ТаблицаП1.4 (окончание)
Свойство
Описание
Caption
Текст на кнопке
Left
Расстояние от левой границы кнопки до левой границы формы
Тор
Расстояние от верхней границы кнопки до верхней границы формы
Height
Высота кнопки
Width
Ширина кнопки
Enabled
Признак доступности кнопки. Если значение свойства равно true, то кнопка доступна. Если значение свойства равно false, то кнопка недоступна— например, в результате щелчка на кнопке, событие Click не возникает
Visible
Позволяет скрыть кнопку (false) или сделать ее видимой (true)
Hint
Подсказка — текст, который появляется рядом с указателем мыши при позиционировании указателя на командной кнопке (для того чтобы текст появился, надо, чтобы значение свойства showHint было true)
ShowHint
Разрешает (true) или запрещает (false) отображение подсказки при позиционировании указателя на кнопке
Memo
Компонент Memo (рис. П1.4) представляет собой элемент редактирования текста, который может состоять из нескольких строк. Свойства компонента приведены в табл. П1.5.
Standard |
e3牙书A碇I乳山-信网—3「套」金 二
Memo
Рис. П1.4.Компонент Memo
Таблица "7.5. Свойства компонента Memo
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента
Text
Текст, находящийся в поле Memo. Рассматривается как единое целое
Таблица П1.5 (окончание)
Свойство
Описание
Lines
Массив строк, соответствующий содержимому поля. Доступ к строке осуществляется по номеру. Строки нумеруются с нуля
Left
Расстояние от левой границы поля до левой границы формы
Тор
Height width
Расстояние от верхней границы поля до верхней границы формы
Высота поля
Ширина поля
Font
Шрифт, используемый для отображения вводимого текста
ParentFont
Признак наследования свойств шрифта родительской формы
RadioButton
Компонент RadioButton (рис. П1.5) представляет зависимую кнопку, состояние которой определяется состоянием других кнопок группы. Свойства компонента приведены в табл. П1.6.
Если в диалоговом окне надо организовать несколько групп радиокнопок, то каждую группу следует представить компонентом RadioGroup.
Standard I
К 旦野%A丽園®因®:戳膏3口唁:里
4=
RadioButton
Рис. П1.5. Компонент RadioButton
Таблица П1.6. Свойства компонента RadioButton
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента
Caption
Checked
Текст, который находится справа от кнопки
Состояние, внешний вид кнопки. Если кнопка выбрана, то значение свойства Checked равно true, если кнопка не выбрана, то false
Left
Расстояние от левой границы флажка до левой границы формы
Тор
Height
Расстояние от верхней границы флажка до верхней границы формы
Высота поля вывода поясняющего текста
Таблица П1.6 (окончание)
СвойствоОписание
WidthШирина поля вывода поясняющего текста
FontШрифт, используемый для отображения поясняющего текста
ParentFontПризнак наследования характеристик шрифта родительской формы
CheckBox
Компонент CheckBox (рис. П1.6) представляет собой независимую кнопку (переключатель). Свойства компонента приведены в табл. П1.7.
Standard
:Q m訳/ A网圓@3反<S,й a ^「信」戛
CheckBox
Рис. П1.6. Компонент CheckBox
Таблица ПТ.7. Свойства компонента CheckBox
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента
Caption
Checked
Текст, который находится справа от флажка
Состояние, внешний вид флажка. Если флажок установлен (в квадратике есть "галочка"), то значение свойства Checked равно true; если флажок сброшен (нет "галочки"), то значение checked равно false
State
Состояние флажка. В отличие от свойства Checked, позволяет различать установленное, сброшенное и промежуточное состояния. Состояние флажка определяет одна из констант: cbChecked (установлен); cbGrayed (серый, неопределенное состояние); cbUnChecked (сброшен)
AllowGrayed
Свойство определяет, может ли флажок быть в промежуточном состоянии: если значение AllowGrayed равно false, то флажок может быть только установленным или сброшенным; если значение AllowGrayed равно true, то допустимо промежуточное состояние
Left
Расстояние от левой границы флажка до левой границы формы
Тор
Расстояние от верхней границы флажка до верхней границы формы
10 Зак. 1252
Таблица П1.7 (окончание)
Свойство
Описание
Height width
Font ParentFont
Высота поля вывода поясняющего текста
Ширина поля вывода поясняющего текста
Шрифт, используемый для отображения поясняющего текста
Признак наследования характеристик шрифта родительской формы
ListBox
Компонент ListBox (рис. П1.7) представляет собой список, в котором можно выбрать нужный элемент. Свойства компонента приведены в табл. П1.8.
Standard [一
5
ВГ АЖВ!^) I* 口罩|置ШЩ□目□對 II
ListBox
Рис. П1.7. Компонент ListBox
Таблица П1.8. Свойства компонента ListBox
Свойство
Описание
Name
Имя компонента. В программе используется для доступа к компоненту и его свойствам
Items
Элементы списка — массив строк
Count
Количество элементов списка
Sorted
Признак необходимости автоматической сортировки (true) списка после добавления очередного элемента
Itemlndex
Номер выбранного элемента (элементы списка нумеруются с нуля). Если в списке ни один из элементов не выбран, то значение свойства равно -1 (минус один)
Left
Расстояние от левой границы списка до левой границы формы
Тор Height Width Font
Расстояние от верхней границы списка до верхней границы формы
Высота поля списка
Ширина поля списка
Шрифт, используемый для отображения элементов списка
ParentFont
Признак наследования свойств шрифта родительской формы
ComboBox
Компонент ComboBox (рис. П1.8) дает возможность ввести данные в поле редактирования путем набора на клавиатуре или выбором из списка. Свойства компонента приведены в табл. П1.9.
Standard I
R二黑A成В®国@量8罩w,匚i固亡金I
ComboBox
Рис. П1.8. Компонент ComboBox
Таблица "九9 Свойства компонента CowboBox
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента
Text
Текст, находящийся в поле ввод£1/редактирования
Items
Элементы списка — массив строк
Count
Количество элементов списка
Itemindex
Номер элемента, выбранного в списке. Если ни один из элементов списка не был выбран, то значение свойства равно -1 (минус один)
Sorted
Признак необходимости автоматической сортировки (true) списка после добавления очередного элемента
DropDownCount
Количество отображаемых элементов в раскрытом списке. Если количество элементов списка больше, чем DropDownCount, то появляется вертикальная полоса прокрутки
Left
Расстояние от левой границы компонента до левой границы формы
Top
Расстояние от верхней границы компонента до верхней границы формы
Height
Высота компонента (поля ввода/редактирования)
Width
Ширина компонента
Font
Шрифт, используемый для отображения элементов списка
ParentFont
Признак наследования свойств шрифта родительской формы
StringGrid
Компонент stringGrid (рис. П1.9) представляет собой таблицу, ячейки которой содержат строки символов. Свойства компонента stringGrid приведены в табл. ШЛО.
I Addkional |一
5 41M硏*噁」。口罠圍+ А т代置廉層二
StringGrid
Рис. П1.9. Компонент StringGrid
Таблица шла Свойства компонента stringGrid
Свойство
Описание
Name
Имя компонента. Используется в программе для доступа к компоненту и его свойствам
ColCount
Количество колонок таблицы
RowCount
Количество строк таблицы
DefaultColWidth
Ширина колонок таблицы
DefaultRowHeight
FixedCols
Высота строк таблицы
Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте
FixedRows
Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте
Cells
Соответствующий таблице двумерный массив. Ячейке таблицы, находящейся на пересечении столбца с номером col и строки с номером row, соответствует элемент cells [col] [row]
GridLineWidth
Ширина линий, ограничивающих ячейки таблицы
Left
Расстояние от левой границы поля таблицы до левой границы формы
Top
Расстояние от верхней границы поля таблицы до верхней границы формы
Height
Width
Высота поля таблицы
Ширина поля таблицы
Таблица П1.10 (окончание)
Свойство
Описание
Options.goEditing
Признак допустимости редактирования содержимого ячеек таблицы (true — редактирование разрешено, false — запрещено)
Options.goTab
Разрешает (true) или запрещает (false) использование клавиши <ТаЬ> для перемещения курсора в следующую ячейку таблицы
Options.goAlways ShowEditor
Признак нахождения компонента в режиме редактирования. Если значение свойства false, то для того чтобы в ячейке появился курсор, надо или начать набирать текст или нажать клавишу <F2>, или сделать щелчок мышью в ячейке таблицы
Font
Шрифт, используемый для отображения содержимого ячеек таблицы
ParentFont
Признак наследования характеристик шрифта формы
Image
Компонент image (рис. П1.10) обеспечивает вывод на поверхность формы иллюстраций, представленных в формате BMP (чтобы компонент можно было использовать для отображения иллюстраций в формате JPG, надо подключить модуль JPEG — включить в текст программы директиву # include <jpeg.hpp>). Свойства компонента image приведены в табл. П1.11.
一 」AddborSTI.
広勾図冋嘎%1拿鳳圍*瓦⑭区國秋層,
image
Рис. П1.10. Компонент Image
Таблица П1.11. Свойства компонента image
Свойство
Описание
Picture
Иллюстрация, которая отображается в поле компонента
Width, Height
Размер компонента. Если размер компонента меньше размера иллюстрации, а значение свойств AutoSize, Strech и Proportional равно false, то отображается часть иллюстрации
294
Приложение 1
ТаблицаП1.11 (окончание)
Свойство
Описание
Proportional
Признак автоматического масштабирования картинки без искажения. Чтобы масштабирование было выполнено, значение свойства AutoSize должно быть false
Strech
Признак автоматического масштабирования (сжатия или растяжения) иллюстрации в соответствии с реальным размером компонента. Если размер компонента не пропорционален размеру иллюстрации, то иллюстрация будет искажена
AutoSize
Признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации
Center
Признак определяет расположение картинки в поле компонента по горизонтали, если ширина картинки меньше ширины поля компонента. Если значение свойства равно false, то картинка прижата к правой границе компонента, если true — то картинка располагается по центру
Visible
Отображается ли компонент, и, соответственно, иллюстрация, на поверхности формы
Canvas
Поверхность, на которую можно вывести графику (см. табл. П1.25)
Timer
Компонент Timer (рис. П1.11) обеспечивает генерацию последовательности событий OnTimer. Свойства компонента приведены в табл. П1.12.
Timer
Рис. П1.11. Компонент Timer
Таблица 〃7・12 Свойства компонента Timer
СвойствоОписание
NameИмя компонента. Используется для доступа к компоненту
intervalПериод генерации события OnTimer. Задается в миллисекундах
EnabledРазрешение работы. Разрешает (значение true) или запрещает (зна
чение false) генерацию события OnTimer
Animate
Компонент Animate (рис. П1.12) позволяет воспроизводить простую, не сопровождаемую звуком анимацию, кадры которой находятся в AVI-файле. Свойства компонента приведены в табл. П1.13.
j Win32 [
E 土」㈡圖M「.当阿/司臼宙仁G 口画® •
Animate
Рис. П1.12. Компонент Animate
Таблица П1.13. Свойства компонента Animate
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента и управления его поведением
Fil eName
Имя AVI-файла, в котором находится анимация, отображаемая при помощи компонента
StartFrame
Номер кадра, с которого начинается отображение анимации
StopFrame
Номер кадра, на котором заканчивается отображение анимации
Activate
Признак активизации процесса отображения кадров анимации
Color
Цвет фона компонента (цвет "экрана"), на котором воспроизводится анимация
Transparent
Режим использования "прозрачного" цвета при отображении анимации
Repetitions
Количество повторов отображения анимации
MediaPlayer
Компонент MediaPlayer (рис. П1.13) позволяет воспроизвести видеоролик, звук и сопровождаемую звуком анимацию. Свойства компонента приведены в табл. П1.14.
MediaPlayerMediaPlayerРис. П1.13. Компонент MediaPlayerРис. П1.13. Компонент MediaPlayer
MediaPlayer
MediaPlayer
Рис. П1.13. Компонент MediaPlayer
Рис. П1.13. Компонент MediaPlayer
Таблица /77/4 Свойства компонента MediaPlayer
Свойство
Описание
Name
Имя компонента. Используется для доступа к свойствам компонента и управлениея работой плеера
DeviceType
Тип устройства. Определяет конкретное устройство, которое представляет собой компонент MediaPlayer. Тип устройства задается именованной константой: dtAutoSelect — тип устройства определяется автоматически; dtVaweAudio — проигрыватель звука; dtAVIVideo — видеопроигрыватель; dtCDAudio — CD-проигрыватель
FileName
Имя файла, в котором находится воспроизводимый звуковой фрагмент или видеоролик
AutoOpen
Признак автоматического открытия сразу после запуска программы файла видеоролика или звукового фрагмента
Display
Определяет компонент, на поверхности которого воспроизводится видеоролик (обычно в качестве экрана для отображения видео используют компонент Panel)
VisibleButtons
Составное свойство. Определяет видимые кнопки компонента. Позволяет сделать невидимыми некоторые кнопки
SpeedButton
Компонент SpeedButton (рис. П1.14) представляет собой кнопку, на поверхности которой находится картинка. Свойства компонента приведены в табл. П1.15.
5 互I屮矶嘎%」@口园塞+瓦瓦代m虚眉,
SpeedButton
Рис. П1.14. Компонент SpeedButton
Таблица П1.15. Свойства компонента SpeedButton
Свойство
Описание
Name
Имя компонента. Используется для доступа к компоненту и его свойствам
Glyph
Битовый образ, в котором находятся картинки для каждого из состояний кнопки. В битовом образе может быть до четырех изображений кнопки (рис. П1.15)
Таблица ШЛ5 (окончание)
Свойство
Описание
NumGlyphs
Количество картинок в битовом образе Glyph
Flat
Свойство Flat определяет вид кнопки (наличие границы). Если значение свойства равно true, то граница кнопки появляется только при позиционировании указателя мыши на кнопке
GroupIndex
Идентификатор группы кнопок. Кнопки, имеющие одинаковый идентификатор группы, работают подобно радиокнопкам: нажатие одной из кнопок группы вызывает срабатывание других кнопок этой группы. Чтобы кнопку можно было зафиксировать, значение свойства Grouplndex не должно быть равно нулю
Down
Идентификатор состояния кнопки. Изменить значение свойства можно, если значение свойства Grouplndex не равно нулю
AllowAllUp
Свойство определяет возможность отжать кнопку. Если кнопка нажата и значение свойства равно true, то кнопку можно отжать
Left
Расстояние от левой границы кнопки до левой границы формы
Тор
Height
Расстояние от верхней границы кнопки до верхней границы формы Высота кнопки
Width
Ширина кнопки
Enabled
Признак доступности кнопки. Если значение свойства равно true, то кнопка доступна. Если значение свойства равно false, то кнопка недоступна
visible
Позволяет скрыть кнопку (false) или сделать ее видимой (true)
Hint
Подсказка — текст, который появляется рядом с указателем мыши при позиционировании указателя на командной кнопке (для того чтобы текст появился, надо, чтобы значение свойства ShowHint было равно true)
ShowHint
Разрешает (true) или запрещает (false) отображение подсказки при позиционировании указателя на кнопке
〉[>囲〉[>囲
〉
[>
囲
〉
[>
囲
Рис. П1.15. Структура и пример битового образа Glyph:картинки, соответствующие состоянию кнопки
UpDown
Компонент UpDown (рис. П1.16) представляет собой две кнопки, используя которые можно изменить значение внутренней переменной-счетчика на определенную величину. Увеличение или уменьшение значения происходит при каждом щелчке на одной из кнопок. Свойства компонента приведены в табл. П1.16.
—LWin3i|
п и ДД НЕЕ 山 口 м;碎
UpDown
Рис. П1.16. Компонент UpDown
Таблица EJ6. Свойства компонента UpDown
Свойство
Описание
Name
Имя компонента. Используется для доступа к компоненту и его свойствам
Position
Счетчик. Значение свойства изменяется в результате щелчка на кнопке Up (увеличивается) или Down (уменьшается). Диапазон изменения определяют свойства Min и Мах, величину изменения — свойство Increment
Min
Нижняя граница диапазона изменения свойства Position
Мах
Верхняя граница диапазона изменения свойства Position
Increment
Величина, на которую изменяется значение свойства Position в результате щелчка на одной из кнопок компонента
Associate
Определяет компонент (Edit — поле ввода/редактированмя), используемый в качестве индикатора значения свойства Position. Если значение свойства задано, то при изменении содержимого поля редактирования автоматически меняется значение свойства Position
Orientation
Задает ориентацию кнопок компонента. Кнопки могут быть ориентированы вертикально (udVertical) или горизонтально (udHorizontal)
Table
Компонент Table (рис. П1.17) представляет всю таблицу базы данных.
Свойства компонента приведены в табл. П1.17.
「0位
IV,鷗蜀能御肾嗚圖喝
Table
Рис. П1.17. Компонент Table — таблица базы данных
Таблица ГИ・"・Свойства компонента Table
Свойство
Определяет
Name
Имя компонента. Используется для доступа к свойствам компонента
DatabaseName
Имя базы данных, частью которой является таблица (файл данных), для доступа к которой применяется компонент. В качестве значения свойства следует использовать псевдоним базы данных
TableName
Имя файла данных (таблицы данных), для доступа к которому используется компонент
TableType
Тип таблицы. Таблица может быть набором данных в формате Paradox (ttParadox), dBase (ttDBase), FoxPro (ttFoxPro) или представлять собой форматированный текстовый файл (ttASCIl)
Active
Признак того, что таблица активна (файл данных открыт). В результате присваивания свойству значения true происходит открытие файла таблицы
Query
Компонент Query (рис. П1.18) представляет часть базы данных — записи, содержимое которых удовлетворяет критерию SQL-запроса к таблице. Свойства компонента приведены в табл. П1.18.
Таблица П1.18. Свойства компонента Query
Свойство
Определяет
Name
Имя компонента. Используется компонентом Datasource для связи результата выполнения запроса (набора записей) с компонентом, обеспечивающим просмотр записей, например DBGrid
SQL
Записанный на языке SQL-запрос к базе данных (к таблице)
Active
При присвоении свойству значения true активизирует выполнение запроса
Таблица П1.18 (окончание)
Свойство Определяет
RecordCount Количество записей в базе данных, удовлетворяющих критерию запроса
p *施聘跄奩君噬嘲囁
Query
Рис. П1.18. Компонент Query обеспечивает выбор информации из базы данных
DataSource
Компонент DataSource (рис. П1.19) обеспечивает связь между данными, представленными компонентом Table или Query, и компонентами отображения данных (DBEdit, DBMemo, DBGrid). Свойства компонента приведены в табл. П1.19.Компонент DataSource (рис. П1.19) обеспечивает связь между данными, представленными компонентом Table или Query, и компонентами отображения данных (DBEdit, DBMemo, DBGrid). Свойства компонента приведены в табл. П1.19.DataAccess]DataAccess]DataSourceDataSource
Компонент DataSource (рис. П1.19) обеспечивает связь между данными, представленными компонентом Table или Query, и компонентами отображения данных (DBEdit, DBMemo, DBGrid). Свойства компонента приведены в табл. П1.19.
Компонент DataSource (рис. П1.19) обеспечивает связь между данными, представленными компонентом Table или Query, и компонентами отображения данных (DBEdit, DBMemo, DBGrid). Свойства компонента приведены в табл. П1.19.
DataAccess]
DataAccess]
DataSource
DataSource
Рис. П1.19. Компонент DataSource обеспечиват связь между даннымии компонентом просмотра-редактирования
Таблица nt 19. Свойства компонента DataSource
Свойство
Определяет
Name
Имя компонента. Используется компонентом отображения данных для доступа к компоненту и, следовательно, к данным, связь с которыми обеспечивает компонент
DataSet
Компонент, представляющий собой входные данные (Table ИЛИ Query)
DBEdit, DBMemo, DBText
Компоненты DBEdit и DBMemo (рис. П1.20) обеспечивают просмотр и редактирование полей записи базы данных, компонент DBText — только просмотр. Свойства компонентов приведены в табл. П1.20.
Data Controls |
" *и™~■ - • - -^—- -.—' . ■—-* ■一' '—
飞 ЙеЭ :А滅灣 二阍 骂lx图图 ■ fi -В @
DBTextDBMemo
DBEdit
Рис. П1.20. Компоненты просмотра и редактирования полей БД
Таблица П1,20, Свойства компонентов DBText, DBEdit и DBMemo
Свойство
Определяет
Name
Имя компонента. Используется для доступа к свойствам компонента
DataSource
Компонент-источник данных
DataField
Поле базы данных, для отображения или редактирования которого используется компонент
DBGrid
Компонент DBGrid (рис. П1.21) используется для просмотра и редактирования базы данных в режиме таблицы. Свойства компонента приведены в табл. П1.21.
一J Data Controls I
IПЕГ理」尊S ' I* 三I胤遣置J&
..D.B.G..rid
Рис. П1.21. Компонент DBGrid обеспечивает работу с базой данных в режиме таблицы
Таблица П1.21. Свойства компонента DBGrid
Свойство
Описание
Name
Имя компонента
DataSource
Источник отображаемых в таблице данных (компонент DataSource)
Columns
Свойство columns представляет собой массив объектов типа TColumn, каждый из которых определяет колонку таблицы и отображаемую в ней информацию (см. табл. П1.22)
Options
Options.dgTitles
Свойство Options определяет настройку компонента
Разрешает вывод строки заголовка столбцов
Таблица П1.21 (окончание)
Свойство
Описание
Options.dglndicator
Разрешает вывод колонки индикатора. Во время работы с базой данных текущая запись помечается в колонке индикатора треугольником, новая запись — звездочкой, редактируемая — специальным значком
Options. dgColuninResize
Разрешает менять во время работы программы ширину колонок таблицы
Options.dgColLines
Разрешает выводить линии, разделяющие колонки таблицы
Options.dgRowLines
Разрешает выводить линии, разделяющие строки таблицы
Таблица E・22 Свойства объекта TColumn
Свойство
Определяет
FieldName
Поле записи, содержимое которого выводится в колонке
Width
Ширину колонки в пикселах
Font
Шрифт, используемый для вывода текста в ячейках колонки
Color
Цвет фона колонки
Alignment
Способ выравнивания текста в ячейках колонки. Текст может быть выровнен по левому краю (taLeft Justify), по центру (taCenter) или по правому краю (taRightJustify)
Title.Caption
Заголовок колонки. Значением по умолчанию является имя
поля записи
Title .Alignment
Способ выравнивания заголовка колонки. Заголовок может быть выровнен по левому краю (taLeftJustify), по центру (taCenter) или по правому краю (taRightJustify)
Title.Color
Цвет фона заголовка колонки
Title.Font
Шрифт заголовка колонки
DBNavigator
Компонент DBNavigator (рис. П1.22 и П1.23) обеспечивает перемещение указателя текущей записи, активизацию режима редактирования, добавление и удаление записей. Компонент представляет собой совокупность командных кнопок (табл. П1.23). Свойства компонента приведены в табл. П1.24.
j
口尸:A丽封」貳菖/闫冠■囹鱼&
DBNavigator
Рис.Значок компонента DBNavigator
MRFJ可刁刁M刁可司
Рис.Компонент DBNavigator
Таблица П1.23. Кнопки компонента DBNavigator
Кнопка
Обозначение
Действие
К первой
nbFirst
Указатель текущей записи перемещается к первой записи файла данных
К предыдущей
nbPrior
Указатель текущей записи перемещается к предыдущей записи файла данных
К следующей
nbNext
Указатель текущей записи перемещается к следующей записи файла данных
К последней
nbLast
Указатель текущей записи перемещается к последней записи файла данных
Добавить
nblnsert
В файл данных добавляется новая запись
Удалить
nbDelete
Удаляется текущая запись файла данных
Редактирование
nbEdit
Устанавливает режим редактирования текущей записи
Сохранить
nbPost
Изменения, внесенные в текущую запись, записываются в файл данных
Отменить
Cancel
Отменяет внесенные в текущую запись изменения
Обновить
nbRefresh
Записывает внесенные изменения в файл
ТаблицаСвойства компонента DBNavigator
Свойство
Определяет
Name
Имя компонента. Используется для доступа к свойствам компонента
Таблица П1.24 (окончание)
Свойство
Определяет
DataSource
Имя компонента, являющегося источником данных. В качестве источника данных может выступать база данных (компонент Database), таблица (компонент Table) или результат выполнения запроса (компонент Query)
VisibleButtons
Видимые командные кнопки
Графика
Canvas
Canvas — это поверхность (формы или компонента image), на которой соответствующие методы (табл. П1.25) могут вычерчивать графические примитивы. Вид графических элементов определяют свойства поверхности, на которой эти элементы вычерчиваются (табл. П1.26).
Таблица П1.25. Методы объекта canvas
Метод
Описание
TextOut(x,у,s)
Выводит строку s от точки с координатами (х, у). Шрифт определяет свойство Font поверхности (Canvas), на которую выводится тест, цвет закраски области вывода текста — свойство Brush этой же поверхности
Draw(x,y,b)
Выводит от точки с координатами (х, у) битовый образ b. Если значение свойства Transparent поверхности, на которую выполняется вывод, равно true, то точки, цвет которых совпадает с цветом левой нижней точки битового образа, не отображаются
LineTo (x, y)
Вычерчивает линию из текущей точки в точку с указанными координатами. Вид линии определяет свойство Pen
MoveTo(xr y)
Перемещает указатель текущей точки в точку с указанными координатами
PolyLine(pl)
Вычерчивает ломаную линию. Координаты точек перегиба задает параметр pl — массив структур типа TPoint. Если первый и последний элементы массива одинаковы, то будет вычерчен замкнутый контур. Вид линии определяет свойство Реп
Polygon(pl)
Вычерчивает и закрашивает многоугольник. Координаты углов задает параметр pl — массив структур типа TPoint. Первый и последний элементы массива должны быть одинаковы. Вид границы определяет свойство Реп, цвет и стиль закраски внутренней области — свойство Brush
Arc(xl,yl,x2,y2, хЗ,уЗ,х4,у4)Arc(xl,yl,x2,y2, хЗ,уЗ,х4,у4)Вычерчивает дугу. Параметры xl, yl, x2, у2 определяют эллипс, из которого вырезается дуга, параметры х2, у2, хЗ, и у4 — координаты концов дуги. Дуга вычерчивается против часовой стрелки от точки (хЗ, уЗ) к точке (х4, у4). Вид линии (границы) определяет свойство Реп, цвет и способ закраски внутренней области — свойство BrushВычерчивает дугу. Параметры xl, yl, x2, у2 определяют эллипс, из которого вырезается дуга, параметры х2, у2, хЗ, и у4 — координаты концов дуги. Дуга вычерчивается против часовой стрелки от точки (хЗ, уЗ) к точке (х4, у4). Вид линии (границы) определяет свойство Реп, цвет и способ закраски внутренней области — свойство BrushRectangle(xl,yl, х2,у2)Rectangle(xl,yl, х2,у2)Вычерчивает прямоугольник. Параметры xl, yl, x2 и у2 задают координаты левого верхнего и правого нижнего углов. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство BrushВычерчивает прямоугольник. Параметры xl, yl, x2 и у2 задают координаты левого верхнего и правого нижнего углов. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство BrushRoundRec(xl,yl, х2,у2, хЗ,уЗ)RoundRec(xl,yl, х2,у2, хЗ,уЗ)Вычерчивает прямоугольник со скругленными углами. Параметры xl, yl, х2 и у2 задают координаты левого верхнего и правого нижнего углов, хЗ и уЗ — радиус скругления. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство BrushВычерчивает прямоугольник со скругленными углами. Параметры xl, yl, х2 и у2 задают координаты левого верхнего и правого нижнего углов, хЗ и уЗ — радиус скругления. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush(Х1.У1)(Х1.У1)Таблица П1.25 (окончание)
Arc(xl,yl,x2,y2, хЗ,уЗ,х4,у4)
Arc(xl,yl,x2,y2, хЗ,уЗ,х4,у4)
Вычерчивает дугу. Параметры xl, yl, x2, у2 определяют эллипс, из которого вырезается дуга, параметры х2, у2, хЗ, и у4 — координаты концов дуги. Дуга вычерчивается против часовой стрелки от точки (хЗ, уЗ) к точке (х4, у4). Вид линии (границы) определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush
Вычерчивает дугу. Параметры xl, yl, x2, у2 определяют эллипс, из которого вырезается дуга, параметры х2, у2, хЗ, и у4 — координаты концов дуги. Дуга вычерчивается против часовой стрелки от точки (хЗ, уЗ) к точке (х4, у4). Вид линии (границы) определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush
Rectangle(xl,yl, х2,у2)
Rectangle(xl,yl, х2,у2)
Вычерчивает прямоугольник. Параметры xl, yl, x2 и у2 задают координаты левого верхнего и правого нижнего углов. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush
Вычерчивает прямоугольник. Параметры xl, yl, x2 и у2 задают координаты левого верхнего и правого нижнего углов. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush
RoundRec(xl,yl, х2,у2, хЗ,уЗ)
RoundRec(xl,yl, х2,у2, хЗ,уЗ)
Вычерчивает прямоугольник со скругленными углами. Параметры xl, yl, х2 и у2 задают координаты левого верхнего и правого нижнего углов, хЗ и уЗ — радиус скругления. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush
Вычерчивает прямоугольник со скругленными углами. Параметры xl, yl, х2 и у2 задают координаты левого верхнего и правого нижнего углов, хЗ и уЗ — радиус скругления. Вид линии определяет свойство Реп, цвет и способ закраски внутренней области — свойство Brush
(Х1.У1)
(Х1.У1)
Метод
Описание
Ellipse (xLyl, [V18] х2,у2)
Вычерчивает эллипс, окружность или круг. Параметры xl, yl, x2 и у2 задают размер прямоугольника, в который вписывается эллипс. Вид линии определяет свойство Реп
Таблица П1.26. Свойства объекта Canvas
Свойство
Описание
Transparent
Признак использования "прозрачного" цвета при выводе битового образа методом Draw. Если значение свойства равно true, то точки, цвет которых совпадают с цветом левой нижней точки битового образа, не отображаются
Реп
Свойство Реп представляет собой объект (см. табл. (11.27), свойства которого определяют цвет, толщину и стиль линий, вычерчиваемых методами вывода графических примитивов
Brush
Свойство Brush представляет собой объект (см. табл. П 1.28), свойства которого определяют цвет и стиль закраски областей, вычерчиваемых методами вывода графических примитивов
Font
Свойство Font представляет собой объект, уточняющие свойства которого определяют шрифт (название, размер, цвет, способ оформления), используемый для вывода на поверхность холста текста
Реп
Объект Реп является свойством объекта canvas. Свойства объекта Реп (табл. П1.27) определяют цвет, стиль и толщину линий, вычерчиваемых ме- тодамивыводаграфическихпримитивов.
Та6лмцаГИ・27・Свойства объекта Реп
Свойство
Описание
Color
Цвет линии (clBlack — черный; clMaroon — каштановый; clGreen — зеленый; clOlive — оливковый; clNavy— темно-синий; clPurple — розовый; clTeal — зелено-голубой; clGray— серый; clSilver — серебристый; clRed — красный; clLime — салатный; clBlue — синий; clFuchsia— ярко-розовый; cl Aqua— бирюзовый; clWhite — белый)
Style
Стиль (вид) линии. Линия может быть: psSolid — сплошная; psDash — пунктирная (длинные штрихи); psDot — пунктирная (короткие штрихи); psDashDot — пунктирная (чередование длинного и короткого штрихов); psDashDotDot — пунктирная (чередование одного длинного и двух коротких штрихов); psClear— не отображается (используется, если не надо изображать границу, например, прямоугольника)
Width
Толщина линии задается в пикселах. Толщина пунктирной линии не может быть больше 1
Brush
Объект Brush является свойством объекта canvas. Свойства объекта Brush (табл. П1.28) определяют цвет, стиль закраски внутренних областей контуров, вычерчиваемых методами вывода графических примитивов.
Таблица П1.28. Свойства объекта Brush
Свойство
Определяет
Color
Цвет закрашивания замкнутой области
Style
Стиль (тип) заполнения области (bsSolid— сплошная заливка; bsClear—область не закрашивается; bsHorizontal—горизонтальная штриховка; bsVertical — вертикальная штриховка; bsFDiagonal — диагональная штриховка с наклоном линий вперед; bsBDiagonal — диагональная штриховка с наклоном линий назад; bsCross — горизонтально-вертикальная штриховка, в клетку; bsDiagCross — диагональная штриховка, в клетку)
Функции
В этом разделе приведено краткое описание наиболее часто используемых функций. Подробное их описание можно найти в справочной системе.
Функции ввода и вывода
Таблица П1.29. Функции ввода и вывода
Функция
Описание
InputBox(Заголовок, Подсказка, Значение)
В результате выполнения функции на экране появляется диалоговое окно, в поле которого пользователь может ввести строку символов. Значением функции является введенная строка. Параметр Значение задает значение функции "по умолчанию", т. е. строку, которая будет в поле редактирования в момент появления окна
ShowMessage(s)
Процедура ShowMessage выводит окно, в котором находится сообщение s и командная кнопка ОК
MessageDlg(s,t,b,h)
Выводит на экран диалоговое окно с сообщением s и возвращает код кнопки, щелчком на которой пользователь закрыл окно. Параметр t определяет тип окна: mtWarning— Внимание; mtError— ошибка; mtlnformati — информация; mtConfirmati — запрос; mt Custom — пользовательское (без значка).
Таблица П1.29 (окончание)
Функция
Описание
(прод.)
Параметр ь (множество — заключенный в квадратные скобки список констант) задает командные кнопки диалогового окна (rabYes, mbNo, mbOK, mbCancel, mbHelp, mbAbort, mbRetry, mblgnore И mbAll). Параметр h задает раздел справочной системы программы, который появится в результате нажатия кнопки Help или клавиши <F1>. Если справочная система не используется, значение параметра должно быть 0. Значение функции равно коду кнопки, которую нажал пользователь (mrAbort, mrYes, mrOk, mrRetry, mrNo, mrCancel, mr Ignore ИЛИ mrAll)
Математические функции
Таблица /77.30. Математические функции
Функция
Значение
abs (n)
sqrt (n)
ехр (п)
random [VI9] (n)
Абсолютное значение n
Квадратный корень из п
.
Экспонента п
Случайное целое число в диапазоне от 0 до n-1 (перед первым обращением к функции необходимо вызвать функцию randomize () , которая выполнит инициализацию программного генератора случайных чисел)
sin (а) cos (а)
tan (а) asin (n)
Синус выраженного в радианах угла а
Косинус выраженного в радианах угла а
Тангенс выраженного в радианах угла a
Угол (в радианах), синус которого равен п
acos (n)
Угол (в радианах), косинус которого равен п
atan (n)
Угол (в радианах), тангенс которого равен п
Обратите внимание: для того чтобы в программе были доступны приведенные функции, в ее текст надо включить директиву #include <math.h>.
Величина угла тригонометрических функций должна быть выражена в радианах. Для преобразования величины угла из градусов в радианы используется формула (а -3.1415256) / 180, где а- величина угла в градусах;
число "пи". Вместо константы 3.1415926 можно использовать стандартную именованную константу M_PI. Константа определена в файле
Функции преобразования
Таблица П1.31. Функции преобразования
Функция
Значение функции
IntToStr(к)
Строка, являющаяся изображением целого k
FloatToStr(п)
Строка, являющаяся изображением вещественного n
k,m)
Строка, являющаяся изображением вещественного п. При вызове функции указывают: f — формат; k — точность; т— количество цифр после десятичной точки. Формат определяет способ изображения числа: универсальный;научный;
f Fixed — с фиксированной точкой;— с раз
делителями групп разрядов; ffCurrency— финансовый. Точность — нужное общее количество цифр: 7 или меньше для значения типа single, 15 или меньше для значения типа Double и 18 или меньше для значения типа Extended
StrToInt(s)
Целое число, изображением которого является строка s
StrToFloat(s)
Дробное число, изображением которого является строка s
Функции манипулирования датами и временем
Большинству функций манипулирования датами в качестве параметра передается переменная типа TDateTime, которая хранит информацию о дате и времени.
ДЛЯ ТОГОВ Программе были ДОСТУПНЫ фуНКЦИИ DayOf,MonthOf
и др., в ее текст надо включить директиву
Таблица П1.32. Функции манипулирования датами и временем
Функция
Значение
Now ()
Системная дата и время — значение типа TDateTime
DateToStr(dt)
Строка символов, изображающая дату в формате dd.mm.yyyy
TimeToStr(dt)
Строка символов, изображающая время в формате hh:mm:ss
DayOf(dt)
День (номер дня в месяце), соответствующий дате, указанной в качестве параметра функции
MonthOf(dt)
Номер месяца, соответствующий дате, указанной в качестве параметра функции
WeekOf(dt)
Номер недели, соответствующий дате, указанной в качестве параметра функции
YearOf(dt)
Год, соответствующий указанной дате
DayOfWeek(dt)
Номер дня недели, соответствующий указанной дате: 1 — воскресенье, 2 — понедельник, 3 — вторник и т. д.
StartOfWeek(w)
Дата первого дня указанной недели
HourOf (dt)
Количество часов
MinuteOf(dt)
Количество минут
SecondOf(dt)
Количество секунд
DecodeDate(dt,yzm,d)
Возвращает год, месяц и день, представленные отдельными числами
DecodeTime (dt,h,m, s,ms)
Возвращает время (часы, минуты, секунды и милисе- кунды), представленное отдельными числами
FonnatDateTime (s, dt)
Строка символов, представляющая собой дату или время. Способ представления задает строка формата s, например, строка dd/mm/yyyy задает, что значением функции является дата, а строка hhiinm — время
События
Таблица П1.33. События
Событие
Происходит
OnClick
При щелчке кнопкой мыши
Таблица 〃人33 (окончание)
Событие
Происходит
OnDblClick
При двойном щелчке кнопкой мыши
OnMouseDown
При нажатии кнопки мыши
OnMouseUp
При отпускании кнопки мыши
OnMous eMove
При перемещении мыши
OnKeyPress
При нажатии клавиши клавиатуры
OnKeyDown
При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress — это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp)
OnKeyUp
При отпускании нажатой клавиши клавиатуры
OnCreate
При создании объекта (формы, элемента управления). Процедура обработки этого события обычно используется для инициализации переменных, выполнения подготовительных действий
OnPaint
При появлении окна на экране в начале работы программы, после появления части окна, которая, например, была закрыта другим окном и в других случаях. Событие сообщает о необходимости обновить (перерисовать) окно
OnEnter
При получении элементом управления фокуса
OnExit
При потере элементом управления фокуса
Исключения
ТаблицаП1.34. Типичные исключения
ТиписключенияВозникает
EConvertError При выполнении преобразования, если преобразуемая вели-
чина не может быть приведена к требуемому виду. Наиболее часто возникает при преобразовании строки символов в число
EDivByZero
Целочисленное деление на ноль. При выполнении операции целочисленного деления, если делитель равен нулю
EZeroDivide
Деление на ноль. При выполнении операции деления над дробными операндами, если делитель равен нулю
Таблица П1.34 (окончание)
Тип исключения
Возникает
EFOpenError
При обращении к файлу, например при попытке загрузить файл иллюстрации при помощи метода LoadFrcmFile. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе
ElnOutError
При обращении к файлу, например при попытке открыть для чтения (инструкция reset) несуществующий файл
EDBEngineError
При выполнении операций с базой данных, например при попытке выполнить SQL-запрос к несуществующей таблице
ПРИЛОЖЕНИЕ 2
Содержимое компакт-диска
Прилагаемый к книге компакт-диск содержит проекты (см. табл. П2.1), приведенные в книге в качестве примеров. Каждый проект находится в отдельном каталоге.
Помимо файлов проекта, в каждом каталоге находится выполняемый файл, что позволяет увидеть, как работает программа, без загрузки проекта в C++ Builder.
Большинство программ не требуют для своей работы никаких дополнительных программных компонентов (библиотек) и могут быть запущены непосредственно с CD-ROM.
Некоторые программы, например программы работы с базами данных, требуют, чтобы в системе был установлен процессор баз данных Borland Database Engine (устанавливается автоматически в процессе установки на компьютер C++ Builder) и зарегистрирован псевдоним соответствующей базы данных. Создать псевдоним базы данных можно при помощи SQL Explorer или BDE Administrator, которые также автоматически устанавливаются на компьютер в процессе установки C++ Builder.
Для активной работы с примерами, для того чтобы иметь возможность вносить в них изменения, необходимо скопировать каталоги проектов на жесткий диск компьютера.
Таблица "2人 Содержимое компакт-диска
Каталог/Проект
Краткое описание
Глава
Сила тока/Amper
Программа вычисляет силу тока в электрической цепи. Демонстрирует обработку события Click, ввод из поля редактирования, вывод в поле метки, использование функций strToFloat и FloatToStrF
2
ТаблицаП2.1 (продолжение)
Каталог/Проект
Краткоеописание
Глава
Сила тока/Amperl
Программа вычисляет силу тока в электрической цепи. Демонстрирует: обработку события KeyPress; исключения EZerroDevide (деление на ноль) при помощи инструкции try catch
2
Вывод,текста/ TextOutDemo
Демонстрирует вывод текста на поверхность формы при помощи метода TextOutA, обработку событий OnPaint и OnFormResize
3
График функции/grf
Строит график функции. Демонстрирует: использование методов Line, MoveTo, TextOutA; обработку события OnFormResize
3
Просмотр иллюстраций/ ShowPic
Программа позволяет просматривать иллюстрации. Демонстрирует: использование компонента Image; использование функций FindFirst и FindNext; доступ к стандартному окну Обзор папок
3
Битовый образ/ВИМар
Формирует картинку из битовых образов, загруженных из файла. Демонстрирует: загрузку и вывод битовых образов; влияние свойства Transparent
3
Фоновый рисунок/Back
Формирует фоновый рисунок путем многократного вывода битового образа на поверхность формы
3
Кораблик/Ship
Простая мультипликация (изображение формируется из графических примитивов). Демонстрирует использование методов, обеспечивающих вычерчивание графических примитивов; использование компонента Timer
3
Полет над городом /Flight
Мультипликация, элементы которой загружаются из bmp-файла. Демонстрирует вывод на поверхность формы иллюстраций, загруженных из файла
3
Полет над городом /Flightl
Мультипликация, элементы которой загружаются из ресурса программы. Демонстрирует загрузку битовых образов из ресурса программы
3
Баннер/Вапег
Выводит на поверхность формы простой "мультик" — (баннер), все кадры которого находятся в одном bmp-файле. Демонстрирует использование метода CopyRect
3
Таблица П2.1 (продолжение)
Каталог/Проект
Краткое описание
Глава
Просмотр анимации/ ShowAVI
Программа позволяет просмотреть, в том числе и по кадрам, простую (не сопровождаемую звуком) анимацию (содержимое avi-файла). Демонстрирует использование компонентов Animate И FileOpen
4
Звуки Windows/ WinSound
Программа позволяет прослушать звуковые фрагменты, находящиеся в wav-файлах. Демонстрирует использование компонента MediaPlayer, использование функций FindFirst и FindNext для формирования списка файлов
4
CDPIayer/CDPIayer
Полнофункциональный проигрыватель CD-дисков. Демонстрирует использование компонента MediaPlayer
4
VideoPlayer
Простой видеоплеер. Демонстрирует использование компонента MediaPlayer для воспроизведения небольших видеороликов (формат AVI) и использование компонента SpeedButton
4
Ежедневник/org
База данных "Ежедневник". Комплексный пример. Демонстрирует использование компонентов Table, DataSource, Query, DBGrid И DBNavigator
5
Компонент
Компонент программиста, предназначенный для ввода целых или дробных (в зависимости от настройки компонента) чисел в заданном диапазоне. В каталоге находится модуль компонента (NkEdit.cpp), программа тестирования модуля компонента (tk.bpr) и программа тестирования компонента (Amper4.bpr).
Замечание. Перед тем как открыть проект Amper4, необходимо установить компонент NkEdit в пакет dclusr
6
Консольное приложение/ Game
Игра "Угадай число". Пример консольного приложения
7
Справочная система
Справочная система для программы "Сапер". Каталог содержит файлы справочной информации и файлы проектов, необходимые для создания справочной системы в форматах HLP иСНМ
8
Сапер
Игра "Сапер". Демонстрирует работу с графикой, использование компонента Menu, использование рекурсии, вывод справочной информации, запуск внешних программ
10
Таблица П2.1 (окончание)
Каталог/Проект
Краткое описаниеГлава
Проверка знаний
Система тестирования. Демонстрирует исполь-10
зование компонентов, создаваемых во время работы программы
Очистка диска
Утилита "Очистка диска". Демонстрирует ис-10
пользование рекурсии
Рекомендуемая литература
Вирт Н. Алгоритмы и структуры данных / Пер. с англ. -- М.: Мир, 1989. - 360 с., ил.
Гринзоу Лу. Философия программирования для Windows 95/NT / Пер. с англ. — СПб.: Символ-Плюс, 1997. — 640 с., ил.
Зелковиц М., Шоу А., Гэннон Дж. Принципы разработки программного обеспечения / Пер. с англ. — М.: Мир, 1982. — 386 с., ил.
Культин Н. Б. C/C++ в примерах и задачах. -- СПб.: БХВ-Петербург, 2001. - 288 с., ил.
Практическое руководство по профаммированию / Пер. с англ. Б. Мик, П. Хит, Н. Рашби и др.; под ред. Б. Мика, П. Хит, Н. Рашби. -- М.: Радио и связь, 1986. — 168 с., ил.
Страуструп Б. Язык профаммирования C++. — М.: Радио и связь, 1991.
Фокс Дж. Профаммное обеспечение и его разработка / Пер. с англ. - М.: Мир, 1985. — 368 с., ил.
Предметный указатель
Alias 137
Alias Manager 137
В
BDE 144
Borland Database Engine 144
Brush 306, 307
с
Canvas 78, 284, 294
CD Player 115
ClientHeight 284
ClientWidth 283
D
Database Desktop 137
О настройка 142
Decimalseparator 171
I
Image Editor 94, 174
Install Shield Express 162
M
Macromedia Flash 128
Microsoft Help Workshop 193
Microsoft HTML Help Workshop 193
p
Pen 306
printf 183
s
SQL-запрос 154
Т
Transparent 306
A
Абсолютное значение 308
Б
База данных:
О добавление записи 150
О локальная 135
О просмотр 147
О псевдоним 137
О создание таблицы 138
О тип поля 140, 141
О удаление записи 150
О удаленная 135
В
Внешняя программа:
О запуск 265
Вывод на поверхность формы:
О картинка 304
О текст 304
Г
Графический примитив 65
д
Дуга 305
И
Иллюстрация:
О добавление к форме 235
Исключение:
О EConvertError 311
О EDivByZero 44, 311
О EFOpenError 312
О EI nOutError 44
О ERange Error 44
О EZeroDivide 44, 311
Карандаш 306
Квадратный корень 308
Кисть 306
Компонент:
О Animate 102, 295
О Button 24, 286
О Chee к Box 289
О ComboBox 291
О DataSource 144, 300
О DBEdit 300
О DBGrid 147, 301
О DBMemo 300
О DBNavigator 150, 302
О DBText 300
О Edit 19, 285
О Form 283
О Image 293
О Label 22, 284
О List Box 290
О Main Menu 252
О MediaPlayer 109
О Memo 287
О Query 153, 299
О RadioButton 288
О Speed Button 296
О StringGrid 292
О Table 144, 298
О Timer 294
О UpDown 298
О программиста 163
Косинус 308
Круг 305
О тип 64
О толщина 64
О цвет 64
м
Метод:
О CopyRect 98
О Ellipse 63, 69
О Fill Red 68
О LineTo 62, 66
О LoadFromFile 78
О Load Fro in Resource Name 97
О MoveTo 66
О Pie 70
О Polygon 68
О Polyline 63
О Poly Li ne 66
О Rectangle 62, 67
О ShowModal 264
О TextOut 71
Многоугольник 304
О
Окружность 63, 305
п
Пакет компонентов 174
Преобразование AnsiToChar 265
Прозрачность 306
Проигрыватель CD 115
Прямоугольник 62, 305
Псевдоним БД 137
О динамический 160
О создание 160
p
Редактор образов 174
Редактор файла ресурсов 94
Рекурсия 280
Ресурс 174
Л
Линия 62, 304
О замкнутая 304
О ломаная 63, 304
c
Свойство:
О Brush 64
Продолжение рубрики см. на с. 320
Свойство
0 Canvas 62
0 Cursor 265
0
0 HelpFile
0 Pen 64
0 Pixels 74
Синус 308
Случайное число 308
Событие 26
0
027
0
0 OnEnter 27
027
026
026
0
026
026
026
027, 63
0
0 обработка 27, 48
Спецификатор формата
Ссылка на раздел справки 195
Тип TRect 68
У
ЛУ7становочная дискета
О создание 162
Ф
Файл:
О пакет компонентов (DPK) 174
О ресурсов компонента 174
Функция:
О
О160
О Bounds 99
О c_str 265
О Cos 308
О
О DateToStr
0
0310
0 DecodeDate 310
0 DecodeTime 310
0308
0160
0309
0 FloatToStrF 309
0156, 310
0
0307
0309
0 MessageDlg 46,308
0
0
0 Now310
0160
0 Random 308
0 Rect 68, 99
0186
0
0282
0265
045, 307
0 Sin 308
0308
0310
0309
0309
0310
0
0215
0202, 262
0310
ц
Цвет:
О закраски 64, 306
О линии 64, 306
э
Эллипс 63, 305
Я
SQL 153