P. 1
C++ Builder в задачах и примерах (1)

C++ Builder в задачах и примерах (1)

|Views: 1,076|Likes:
Published by Alex Chitoraga

More info:

Published by: Alex Chitoraga on May 15, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

10/09/2013

pdf

text

original

Sections

  • Предисловие
  • Базовые компоненты
  • Общие замечания
  • Конвертор
  • Фунты-килограммы
  • Сила тока
  • НЧ Сила тока
  • Сопротивление
  • Кафе
  • Любимый напиток
  • ОСАГО
  • Калькулятор-2
  • Секундомер
  • Угадай число
  • \ЩУгадай число
  • Угадай число-2
  • Запуск Internet Explorer
  • Вывод справочной информации
  • Файлы
  • Погода
  • Средняя температура
  • Простая база данных
  • Редактор текста
  • Графика
  • Приветствие
  • Олимпийский флаг
  • Диаграмма
  • График
  • WГрафик
  • Круговая диаграмма
  • Просмотр иллюстраций
  • Часы
  • Пинг-понг
  • Полет в облаках
  • Баннер
  • Фоновый рисунок
  • Мультимедиа
  • Воспроизведение MIDI
  • Compact Disk Player (версия 1)
  • Compact Disk Player (версия 2)
  • Video Player
  • Анимация
  • W'j Анимация
  • Базы данных
  • Записная книжка
  • Магазин
  • Ежедневник
  • ЩЕжедневник
  • Игры и другие полезные программы
  • Сапер
  • Игра 15
  • Игра "Собери картинку" (Puzzle)
  • Игра "Парные картинки"
  • Экзаменатор-2
  • Календарь
  • Будильник
  • Очистка диска
  • Печать
  • Скидка
  • '. Скидка
  • Доход по вкладу
  • Таблица умножения
  • Поездка на автомобиле
  • Стоимость разговора
  • Стеклопакет
  • «Ктвклопакет
  • Калькулятор
  • Электроэнергия
  • [^Электроэнергия
  • Добрый день
  • Узоры
  • Курс доллара
  • Домашние животные
  • Кораблик
  • Тест памяти (на внимательность)
  • Экзаменатор
  • База данных "Расходы"
  • Форма
  • Компоненты
  • Label
  • Edit
  • Memo
  • RadioButton
  • CheckBox
  • ListBox
  • ComboBox
  • StringGrid
  • Image
  • Timer
  • UpDown
  • ProgressBar
  • StatusBar
  • Animate
  • MediaPlayer
  • Table
  • Query
  • DataSource
  • DBEdit, DBMemo, DBText
  • DBGrid
  • DBNavigator
  • Canvas
  • Brush
  • Функции
  • Функции ввода и вывода
  • Математические функции
  • Функции преобразования
  • Функции манипулирования датами и временем
  • Таблица 2.35. Функции манипулирования датами и временем
  • События
  • Исключения
  • Предметный указатель

Н и к и т а К у л ь т и н

C + + B u i l d e r
в з а д а ч а х и п р и м е р а х
С а н к т   П е т е р б у р г
«Б Х В   П е т е р б у р г »
2005
У Д К 681.3.068+800.92С ++
Б Б К 32.973.26  018.1
К 90
К ул ьт и н Н . Б .
К 90 C++ Builder в з а д а ч а х и п р и м е р а х .
П е т е р б у р г , 2005. —336 с : и л .
ISBN 5 94157 631 5
  С П б .: Б Х В  
К н и г а п р е д с т а в л я е т с о б о й с б о р н и к п р о г р а м м и з а д а ч д л я с а  
м о с т о я т е л ь н о г о р е ш е н и я в с р е д е р а з р а б о т к и C++ Builder. П р и  
м е р ы р а з л и ч н о й с л о ж н о с т и —о т п р о с т е й ш и х д о п р и л о ж е н и й р а  
б о т ы с г р а ф и к о й , м у л ь т и м е д и а и б а з а м и д а н н ы х —д е м о н с т р и р у  
ю т н а з н а ч е н и е к о м п о н е н т о в и р а с к р ы в а ю т т о н к о с т и п р о ц е с с а
п р о г р а м м и р о в а н и я в C++ Builder. С п р а в о ч н и к с о д е р ж и т о п и с а  
н и я б а з о в ы х к о м п о н е н т о в и н а и б о л е е ч а с т о и с п о л ь з у е м ы х ф у н к  
ц и й . Н а п р и л а г а е м о м к о м п а к т   д и с к е н а х о д я т с я и с х о д н ы е т е к с т ы
п р о г р а м м .
Д л я н а ч и н а ю щ и х п р о г р а м м и с т о в
У Д К 681.3.068+800.92С ++
Б Б К 32.973.26  018.1
Г р у п п а п о д г о т о в к и и з д а н и я :
Г л а в н ы й р е д а к т о р
З а м . г л а в н о г о р е д а к т о р а
З а в . р е д а к ц и е й
Р е д а к т о р
К о м п ь ю т е р н а я в е р с т к а
К о р р е к т о р
Д и з а й н о б л о ж к и
З а в . п р о и з в о д с т в о м
Е к а т е р и н а К о н д у к о в а
Ш и ш и г и н И г о р ь
Г р и г о р и й Д о б и н
А н д р е й С м ы и и ш е в
Т а т ь я н ы О л о н о в о й
Н а т а л и я П е р ш а к о в а
И г о р я Ц ы р у л ь н и к о в а
Н и к о л а й Т в е р с к и х
Л и ц е н з и я И Д № 0 2 4 2 9 о т 2 4 . 0 7 . 0 0 . П о д п и с а н о в п е ч а т ь 2 4 . 0 8 . 0 5 .
Ф о р м а т 6 0 x9 0 Vie. П е ч а т ь о ф с е т н а я . У с л . п е ч . л . 2 1 .
Т и р а ж 5 0 0 0 э к з . З а к а з № 1 2 4 1
"Б Х В   П е т е р б у р г ", 1 9 4 3 5 4 , С а н к т   П е т е р б у р г , у л . с е н и н а , 5 Б .
С а н и т а р н о   э п и д е м и о л о г и ч е с к о е з а к л ю ч е н и е н а п р о д у к ц и ю
№ 7 7 . 9 9 . 0 2 . 9 5 3 . Д . 0 0 6 4 2 1 . 1 1 . 0 4 о т 1 1 . 1 1 . 2 0 0 4 г . в ы д а н о Ф е д е р а л ь н о й с л у ж б о й
п о н а д з о р у в с ф е р е з а щ и т ы п р а в п о т р е б и т е л е й и л а г о п о л у ч и я ч е л о в е к а .
О т п е ч а т а н о с г о т о в ы х д и а п о з и т и в о в
в Г У П "Т и п о г р а ф и я "Н а у к а "
1 9 9 0 3 4 , С а н к т   П е т е р б у р г , 9 л и н и я , 1 2
I S B N 5   9 4 1 5 7   6 3 1   5
О К ул ьти н Н . Б ., 200S
О О ф о р м л е н и е , и зд а те л ьс тв о " Х В   П е те р б ур г", 2005
С о д е р ж а н и е
П р е д и с л о в и е 1
Ч А С Т Ь 1. П Р И М Е Р Ы И З А Д А Ч И 3
Б а з о в ы е к о м п о н е н т ы 5
О б щ и е з а м е ч а н и я 5
К о н в е р т о р 6
Ф у н т ы   к и л о г р а м м ы 10
С и л а т о к а 12
С о п р о т и в л е н и е 16
К а ф е 18
Л ю б и м ы й н а п и т о к 21
Э л е к т р о э н е р г и я 25
О С А Г О 28
П р о с м о т р и л л ю с т р а ц и й 33
К а л ь к у л я т о р 36
К а л ь к у л я т о р   2 43
С е к у н д о м е р 48
У г а д а й ч и с л о 51
У г а д а й ч и с л о   2 54
З а п у с к Internet Explorer 57
В ы в о д с п р а в о ч н о й и н ф о р м а ц и и 58
Ф а й л ы 62
П о г о д а 62
С р е д н я я т е м п е р а т у р а 65
П р о с т а я б а з а д а н н ы х 70
Р е д а к т о р т е к с т а ...  . 75
IV_ С о д е р ж а н и е
Г р а ф и к а 81
О б щ и е з а м е ч а н и я 81
П р и в е т с т в и е ....ч . 81
О л и м п и й с к и й ф л а г 84
Д и а г р а м м а 87
Г р а ф и к 90
К р у г о в а я д и а г р а м м а 93
П р о с м о т р и л л ю с т р а ц и й 100
Ч а с ы 104
П и н г   п о н г 109
П о л е т в о б л а к а х 114
Б а н н е р 118
Ф о н о в ы й р и с у н о к 121
М у л ь т и м е д и а 124
О б щ и е з а м е ч а н и я 124
WAV 124
М Р З Player 128
В о с п р о и з в е д е н и е MIDI '. 138
Compact Disk Player (в е р с и я 1) 142
Compact Disk Player (в е р с и я 2) 148
Video Player 150
А н и м а ц и я 158
Б а з ы д а н н ы х 161
О б щ и е з а м е ч а н и я 161
З а п и с н а я к н и ж к а 162
М а г а з и н 166
Е ж е д н е в н и к 172
И гр ы и д р у г и е п о л е з н ы е п р о гр а м м ы 180
С а п е р 180
И г р а 15 192
И г р а "С о б е р и к а р т и н к у " (Puzzle) 198
И г р а "П а р н ы е к а р т и н к и " 207
Э к з а м е н а т о р 218
Э к з а м е н а т о р   2 232
С о д е р ж а н и е V
К а л е н д а р ь 241
Б у д и л ь н и к 246
О ч и с т к а д и с к а 255
П е ч а т ь ..259
З а д а ч и д л я с а м о с т о я т е л ь н о г о р е ш е н и я 265
С к и д к а 265
Д о х о д п о в к л а д у ...., 266
Т а б л и ц а у м н о ж е н и я •. 266
П о е з д к а н а а в т о м о б и л е 267
С т о и м о с т ь р а з г о в о р а 267
С т е к л о п а к е т 268
К а л ь к у л я т о р 268
Э л е к т р о э н е р г и я 269
Д о б р ы й д е н ь 269
Ч а с ы : 269
У з о р ы 270
К у р с д о л л а р а 270
Д и а г р а м м а 271
Д о м а ш н и е ж и в о т н ы е 271
К о р а б л и к 272
С а п е р 272
Т е с т п а м я т и (н а в н и м а т е л ь н о с т ь ) 272
Э к з а м е н а т о р 273
Б а з а д а н н ы х "Р а с х о д ы " 273
Ч А С Т Ь 2. BORLAND C+ + BUILDER  
К Р А Т К И Й С П Р А В О Ч Н И К 275
Ф о р м а 277
К о м п о н е н ты 278
Label 279
Edit 280
Button • . 281
Memo 283
RadioButton 284
CheckBox 285
ListBox 286
VI С о д е р ж а н и е
ComboBox 287
StringGrid 288
Image 290
Timer 291
SpeedButton :..., .292
UpDown 294
ProgressBar 295
StatusBar 296
Animate 297
MediaPlayer..... 298
Table 299
Query .....300
DataSource..... ......301
DBEdit, DBMemo, DBText 301
DBGrid 302
DBNavigator 304
Г р а ф и к а 306
Canvas 306
Pen. 309
Brush 310
Ф ун к ц и и , 310
Ф у н к ц и и в в о д а и в ы в о д а ...., 310
М а т е м а т и ч е с к и е у н к ц и и 311
Ф у н к ц и и п р е о б р а з о в а н и я 312
Ф у н к ц и и м а н и п у л и р о в а н и я д а т а м и и в р е м е н е м 313
С о б ы ти я 315
И с к л ю ч е н и я 315
П р и л о ж е н и е . О п и с а н и е CD  ROM 317
П р е д м е т н е й ук а з а т е л ь 324
Предисловие
В п о с л е д н е е в р е м я р е з к о в о з р о с и н т е р е с к п р о г р а м м и р о в а н и ю .
Э т о с в я з а н о с р а з в и т и е м и в н е д р е н и е м в п о в с е д н е в н у ю ж и з н ь
и н ф о р м а ц и о н н ы х и к о м м у н и к а ц и о н н ы х т е х н о л о г и й . Е с л и ч е л о  
в е к и м е е т д е л о с к о м п ь ю т е р о м , т о , р а н о и л и п о з д н о , у н е г о в о з  
н и к а е т ж е л а н и е , а и н о г д а и н е о б х о д и м о с т ь , п р о г р а м м и р о в а т ь .
Б у р н о е р а з в и т и е в ы ч и с л и т е л ь н о й т е х н и к и , п о т р е б н о с т ь в э ф ф е к  
т и в н ы х с р е д с т в а х р а з р а б о т к и п р о г р а м м н о г о о б е с п е ч е н и я п р и в е л и к
п о я в л е н и ю с и с т е м п р о г р а м м и р о в а н и я , о р и е н т и р о в а н н ы х н а т а к
н а з ы в а е м у ю "б ы с т р у ю р а з р а б о т к у ". В о с н о в е с и с т е м б ы с т р о й р а з  
р а б о т к и и л и RAD с и с т е м (Rapid Application Development —с р е д а
б ы с т р о й р а з р а б о т к и п р и л о ж е н и й ) л е ж и т т е х н о л о г и я в и з у а л ь н о г о
п р о е к т и р о в а н и я и с о б ы т и й н о г о п р о г р а м м и р о в а н и я , с у т ь к о т о р о й
з а к л ю ч а е т с я в т о м , ч т о с р е д а р а з р а б о т к и б е р е т н а с е б я б о л ь ш у ю
ч а с т ь р у т и н ы , о с т а в л я я п р о г р а м м и с т у р а б о т у п о к о н с т р у и р о в а н и ю
д и а л о г о в ы х о к о н и с о з д а н и ю ф у н к ц и й о б р а б о т к и с о б ы т и й . П р о и з  
в о д и т е л ь н о с т ь п р о г р а м м и с т а п р и и с п о л ь з о в а н и и RAD с и с т е м —
ф а н т а с т и ч е с к а я !
О д н о й и з ш и р о к о и с п о л ь з у е м ы х RAD  с и с т е м я в л я е т с я Borland
C++Builder, к о т о р а я п о з в о л я е т с о з д а в а т ь р а з л и ч н ы е п р о г р а м м ы :
о т п р о с т е й ш и х о д н о о к о н н ы х п р и л о ж е н и й д о п р о г р а м м у п р а в л е  
н и я р а с п р е д е л е н н ы м и б а з а м и д а н н ы х . В к а ч е с т в е я з ы к а п р о  
г р а м м и р о в а н и я в с р е д е Borland C++Builder и с п о л ь з у е т с я C++.
Ч т о б ы н а у ч и т ь с я п р о г р а м м и р о в а т ь , н а д о п р о г р а м м и р о в а т ь —п и  
с а т ь п р о г р а м м ы , р е ш а т ь к о н к р е т н ы е з а д а ч и . Д л я э т о г о н а д о и з у  
ч и т ь я з ы к п р о г р а м м и р о в а н и я и с р е д у р а з р а б о т к и . И з д е с ь х о р о  
ш и м п о д с п о р ь е м м о г у т б ы т ь п р о г р а м м ы , к о т о р ы е д е м о н с т р и р у ю т
н а з н а ч е н и е к о м п о н е н т о в и о с о б е н н о с т и и х и с п о л ь з о в а н и я .
В к н и г е , к о т о р у ю в ы д е р ж и т е в р у к а х , с о б р а н ы р а з н о о б р а з н ы е
п р и м е р ы , к о т о р ы е д е м о н с т р и р у ю т т е х н о л о г и ю с о з д а н и я п р о  
г р а м м , в о з м о ж н о с т и с р е д ы р а з р а б о т к и , н а з н а ч е н и е к о м п о н е н т о в ,
П р е д и с л о в и е
з н а к о м я т с п р и н ц и п а м и р а б о т ы с г р а ф и к о й , з в у к о м , б а з а м и д а н  
н ы х . С л е д у е т о б р а т и т ь в н и м а н и е н а т о , ч т о б о л ь ш и н с т в о п р и м е  
р о в н е я в л я ю т с я у ч е б н ы м и — э т о в п о л н е р а б о т о с п о с о б н ы е п р о  
г р а м м ы .
С о с т о и т к н и г а и з д в у х ч а с т е й .
П е р в а я ч а с т ь с о д е р ж и т п р и м е р ы , п р е д с т а в л е н н ы е в в и д е к р а т к о  
го о п и с а н и я , д и а л о г о в ы х о к о н и п р о к о м м е н т и р о в а н н ы х т е к с т о в
п р о г р а м м .
В т о р а я ч а с т ь к н и г и — э т о к р а т к и й с п р а в о ч н и к , в к о т о р о м м о ж  
н о н а й т и о п и с а н и е б а з о в ы х к о м п о н е н т о в и н а и б о л е е ч а с т о и с  
п о л ь з у е м ы х ф у н к ц и й .
Н а у ч и т ь с я п р о г р а м м и р о в а т ь м о ж н о , т о л ь к о р е ш а я к о н к р е т н ы е
з а д а ч и . П р и э т о м у с п е х и , д о с т и г н у т ы е в п р о г р а м м и р о в а н и и , в
з н а ч и т е л ь н о й с т е п е н и з а в и с я т о т о п ы т а . П о э т о м у ч т о б ы п о л у  
ч и т ь м а к с и м а л ь н у ю п о л ь з у о т к н и г и , в ы д о л ж н ы а к т и в н о с н е й
р а б о т а т ь . И з у ч а й т е л и с т и н г и , с т а р а й т е с ь п о н я т ь , к а к р а б о т а ю т
п р о г р а м м ы . Н е б о й т е с ь э к с п е р и м е н т и р о в а т ь —в н о с и т е и з м е н е  
н и я в п р о г р а м м ы .
Е с л и ч т о   т о н е п о н я т н о , о б р а т и т е с ь к с п р а в о ч н и к у в к о н ц е н и  
г е , к с п р а в о ч н о й с и с т е м е C++Builder и л и к л и т е р а т у р е , н а п р и  
м е р , к к н и г е К ул ьти н Н . Б . С а м о уч и те л ь C++Builder. —С П б .:
Б Х В   П е т е б у р г, 2004. В н е й п о м и м о о п и с а н и я с р е д ы р а з р а б о т к и ,
• к о м п о н е н т о в , п р о ц е с с о в с о з д а н и я и о т л а д к и п р о г р а м м в ы н а й  
д е т е о т в е т ы н а м н о г и е в о п р о с ы , в т о м ч и с л е : к а к с о з д а т ь б а з у
д а н н ы х и з а р е г и с т р и р о в а т ь е е в с и с т е м е , к а к , п р и п о м о щ и Mi 
crosoft Help Workshop, с о з д а т ь с п р а в о ч н у ю с и с т е м у , к а к , и с п о л ь  
з у я installShield Express, с о з д а т ь д и с т р и б у т и в (п а к е т д л я у с т а н о в  
к и п р о г р а м м ы ).
Ч А С Т Ь 1
П р и м е р ы и з а д а ч и
Б а з о в ы е к о м п о н е н т ы
В э т о м р а з д е л е п р и в е д е н ы п р и м е р ы , к о т о р ы е д о л ж н ы п р о д е  
м о н с т р и р о в а т ь н а з н а ч е н и е и т е х н о л о г и ю р а б о т ы с б а з о в ы м и
к о м п о н е н т а м и .
О б щ и е з а м е ч а н и я
П П р о ц е с с с о з д а н и я п р о г р а м м ы в C++Builder с о с т о и т и з д в у х
ш а г о в : с н а ч а л а н у ж н о с о з д а т ь ф о р м у п р о г р а м м ы (д и а л о г о в о е
о к н о ), а з а т е м ф у н к ц и и о б р а б о т к и с о б ы т и й . Ф о р м а п р и л о ж е  
н и я (т а к п р и н я т о н а з ы в а т ь п р и к л а д н ы е п р о г р а м м ы , р а б о  
т а ю щ и е в Windows) с о з д а е т с я п у т е м д о б а в л е н и я в н е е к о м п о  
н е н т о в и п о с л е д у ю щ е й и х н а с т р о й к и .
• В ф о р м е п р а к т и ч е с к и л ю б о г о п р и л о ж е н и я е с т ь к о м п о н е н т ы ,
к о т о р ы е о б е с п е ч и в а ю т и н т е р ф е й с (в з а и м о д е й с т в и е ) м е ж д у
п р о г р а м м о й и п о л ь з о в а т е л е м . Т а к и е к о м п о н е н т ы н а з ы в а ю т
б а з о в ы м и . К б а з о в ы м к о м п о н е н т а м м о ж н о о т н е с т и :
• Label —п о л е в ы в о д а т е к с т а ;
• Edit —п о л е р е д а к т и р о в а н и я т е к с т а ;
• Button —к о м а н д н а я к н о п к а ;
• checkBox —н е з а в и с и м а я к н о п к а в ы б о р а ;
• RadioButton —з а в и с и м а я к н о п к а в ы б о р а ;
• ListBox —с п и с о к в ы б о р а ;
• comboBox —к о м б и н и р о в а н н ы й с п и с о к в ы б о р а .
П В и д к о м п о н е н т а , е г о р а з м е р и п о в е д е н и е о п р е д е л я ю т з н а ч е  
н и я с в о й с т в (х а р а к т е р и с т и к ) к о м п о н е н т а (о п и с а н и е с в о й с т в
б а з о в ы х к о м п о н е н т о в м о ж н о н а й т и в с п р а в о ч н и к е в о в т о р о й
ч а с т и к н и г и ).
Ч а с т ь 1. П р и м е р ы и з а д а ч и
О О с н о в н у ю р а б о т у в п р о г р а м м е в ы п о л н я ю т ф у н к ц и и о б р а  
б о т к и с о б ы т и й (о п и с а н и е о с н о в н ы х с о б ы т и й м о ж н о н а й т и в
с п р а в о ч н и к е в о в т о р о й ч а с т и к н и г и ).
• И с х о д н у ю и н ф о р м а ц и ю п р о г р а м м а м о ж е т п о л у ч и т ь и з п о л е й
р е д а к т и р о в а н и я (к о м п о н е н т Edit ), с п и с к а в ы б о р а (к о м п о  
н е н т ListBox) и л и к о м б и н и р о в а н н о г о с п и с к а (к о м п о н е н т
comboBox). Д л я в в о д а з н а ч е н и й л о г и ч е с к о г о т и п а м о ж н о и с  
п о л ь з о в а т ь К о м п о н е н т ы CheckBox И RadoiButton.
• Р е з у л ь т а т п р о г р а м м а м о ж е т в ы в е с т и в п о л е в ы в о д а т е к с  
т а (к о м п о н е н т Label) и л и в о к н о с о о б щ е н и я (ф у н к ц и и
ShowMessage, MessageDlg).
• Д л я п р е о б р а з о в а н и я т е к с т а , н а п р и м е р , н а х о д я щ е г о с я в п о л е
р е д а к т и р о в а н и я , в ц е л о е ч и с л о н у ж н о и с п о л ь з о в а т ь ф у н к ц и ю
st rTomt , а в д р о б н о е —ф у н к ц и ю st rToFioat . Д л я п р е о б р а  
з о в а н и я ц е л о г о , н а п р и м е р , з н а ч е н и я п е р е м е н н о й , в с т р о к у
н у ж н о и с п о л ь з о в а т ь ф у н к ц и ю int Tost r, а д л я п р е о б р а з о в а н и я
Д р о б Н О Г О — ф у Н К Ц И Ю F l o a t T o St r И Л И F l o a t T o St r F .
К о н в е р т о р
П р о г р а м м а К о н в е р то р п е р е с ч и т ы в а е т ц е н у и з д о л л а р о в в р у б л и .
Д е м о н с т р и р у е т И С П О Л Ь З О В а Н И е К б М П О Н е Н Т О В Text Box И La bel Д Л Я
в в о д а и о т о б р а ж е н и я ч и с л о в ы х д а н н ы х . П р о г р а м м а с п р о е к т и р о  
в а н а т а к и м о б р а з о м , ч т о п о л ь з о в а т е л ь м о ж е т в в е с т и в п о л я р е  
д а к т и р о в а н и я т о л ь к о п р а в и л ь н ы е д а н н ы е (ч и с л о ). Ф о р м а п р о  
г р а м м ы п р и в е д е н а н а р и с . 1.1.
\ Ш К о н в е р т о р •' •
' " j f l l
Label4 •
But t oni
В в е д и т е ц е н у в д о л л а р а х , к у р с и
щ е л ю н и т е н а к н о п к е П е р е с ч е т
Ц е н а Щ " : 1~ .
К у р с (р у б / $>
П е р е с ч е т З а в е р ш и т ь '
  Editi
  Edit2
  Button2
Р и с . 1 . 1 . Ф о р м а п р о г р а м м ы К о н в е р т о р
Базовые компоненты
// нажатие клавиши в поле Цена
void fastcall TForml::EditlKeyPress(TObject *Sender, char
&Key)
{
// код запрещенного символа заменим нулем, в результате
// символ в поле редактирования не появится
// Key   код нажатой клавиши
// проверим, является ли символ допустимым
if ((Key >= '0') && (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 ; // не отображать символ
8 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// нажатие клавиши в поле Курс
void fastcall TForml::Edit2KeyPress(TObject *Sender,
char &Key)
{
if ((Key >= '0') && (Key <= '9')) //цифра
return;
if (Key == DecimalSeparator)
{
• if ((Edit2 >Text).Pos(DecimalSeparator) != 0)
Key = 0 ; // разделитель уже введен
return;
if (Key == VK_BACK) // клавиша <Backspace>
return;
if (Key == VK_RETURN) // клавиша <Enter>
I
Buttonl >SetFocus();// переход к кнопке Вычислить
// повторное нажатие клавиши <Enter>
// активизирует процесс вычисления денег
return;
// остальные клавиши запрещены
Key = 0 ; // не отображать символ
// щелчок на кнопке Пересчет
void fastcall TForml::ButtonlClick(TObject *Sender)
float usd; // цена в долларах
Базовые компоненты
float к; // курс
float rub; // цена в рублях
// проверим, введены ли данные в поля Цена и Курс
if (((Editl >Text).Length() ==0) ||
((Edit2 >Text).Length)) == 0))
{
MessageDlgC'Haflo ввсети цену и курс",
mtlnformation, TMsgDlgButtons() « mbOK, 0);
if ((Editl >Text).Length!) == 0)
Editl >SetFocus(); // курсор в поле Цена
else
Edit2 >SetFocus(); // курсор в поле Курс
return;
// ввод исходных данных
usd = StrToFloat(Editl >Text);
k = StrToFloat(Edit2 >Text);
// вычисление
rub = usd * k;
// вывод результата
Label4 >Caption = FloatToStrF(usd,ffGeneral,7,2) +
"$ = "+FloatToStrF(rub,ffGeneral,7,2) + " руб."
//щелчок на кнопке Завершить
void fastcall TForml::Button2Click(TObject *Sender)
{
Forml >Close(); // закрыть форму приложения
10 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Ф у н т ы   к и л о г р а м м ы
П р о г р а м м а Ф ун ты   к и л о гр а м м ы , ф о р м а к о т о р о й п р и в е д е н а н а
р и с . 1.2, п о з в о л я е т п е р е с ч и т а т ь в е с и з ф у н т о в в к и л о г р а м м ы .
П р о г р а м м а с п р о е к т и р о в а н а а к и м о б р а з о м , ч т о к н о п к а П е р е с ч е т
д о с т у п н а т о л ь к о в т о м с л у ч а е , е с л и п о л ь з о в а т е л ь в в е л и с х о д н ы е
д а н н ы е .
Editl  
Label2
В в е д и т е в е с ф у н т а х и щ е л к н и т е н а
к н о п к е П е р е с ч е т . Д л я т д е л е н и я д р о б н о й
ч а с т и о т ц е л о й и с п о л ь з у й т е з а п я т у ю
I
П е р е с ч е т
  Buttoni
Р и с . 1. 2. К н о п к а П е р е с ч е т д о с т у п н а т о л ь к о т о г д а ,
к о г д а в п о л е р е д а к т и р о в а н и я е с т ь д а н н ы е
f a s t c a l l T F o r ml : : T F o r ml ( T Co mp o n en t * O wner) : TF orm( O wn er)
{
/* так как поле Editl пустое (пользователь
еще не ввел исходные данные), то
сделаем кнопку Пересчет недоступной */
Buttonl >Enabled = False;
// нажатие клавиши в поле Editl
void fastcall TForml::EditlKeyPress(TObject *Sender, char
&Key)
{
/ / к о д з а п р е щ е н н о г о с и м в о л а з а м е н и м н у л е м , в р е з у л ь т а т е
/ / с и м в о л в п о л е р е д а к т и р о в а н и я н е п о я в и т с я
// Key   код нажатой клавиши
// проверим, является ли символ допустимым
if ( (Key >= '0') && (Key <= '9')
return;
Базовые компоненты 11_
// глобальная переменная DecimalSeparator
// содержит символ, используемый в качестве разделителя
// при записи дробных чисел
if (Key == DecimalSeparator)
{
if ((Editl >Text).Pos(DecimalSeparator) ! = 0)
Key = 0 ; // разделитель уже введен
return;
if (Key == VK_BACK) // клавиша <Backspace>
return;
if (Key == VK_RETURN) // клавиша <Enter>
{
Buttonl >SetFocus();
return;
// остальные клавиши запрещены
Key = 0 ; // не отображать символ
// Содержимое поля Editl изменилось
void fastcall TForml::EditlChange(TObject *Sender)
{
// проверим, есть ли в поле Editl исходные данные
if ( (Editl >Text).Length() == 0)
Buttonl >Enabled = False; // кн. Пересчет недоступна
else Buttonl >Enabled = True; // кн. Пересчет доступна
Label2 >Caption = "";
12 Часть 1. Примеры и задачи
// щелчок на кнопке Пересчет
void fastcall TForml::ButtonlClick(TObject *Sender)
{
double funt; // вес в фунтах
double kg; // вес в килограммах
// кнопка Пересчет доступна только в том случае,
// если в поле Editl есть данные. Поэтому,
// наличие в поле информации можно не проверять.
funt = StrToFloat(Editl >Text);
kg = funt * 0.4995;
Label2 >Caption = FloatToStrF(funt,ffGeneral,5,2) +
" ф.   это " +
FloatToStrF(kg,ffGeneral,5,2) + " кг";
С и л а т о к а
П р о г р а м м а С и л а т о к а д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н  
т о в TextBox и Label, а т а к ж е о б р а б о т к у и с к л ю ч е н и я "д е л е н и е н а
н о л ь ". Ф о р м а п р о г р а м м ы п о к а з а н а н а р и с . 1.3.
Н Ч С и л а т о к а
П р о г р а м м а в ы ч и с л и т с и л у т о к а в э л е к т р и ч е с к о й
Н а п р я ж е н и е (в о л ь т ) 
С о п р о т и в л е н и е (О м ) 
LabeU  
Buttoni  
. В ы ч и с л и т ь I; : : : З а в е р ш и т ь *
• EdiH
  Edit2
  Button2
Р и с . 1. 3. Ф о р м а п р о г р а м м ы С и л а т о к а .
/ / щ е л ч о к н а к н о п к е В ы ч и с л и т ь
void fas t cal l T F orml::But t on lClic k( T O bjec t *Sender)
Базовые к о м п о н е н т ы / 3
float u; // напряжение
float r; // сопротивление
float i; // ток
// проверим, введены ли данные в поля Напряжение и
// Сопротивление
if ( ((Editl >Text).Length() ==0) ||
((Edit2 >Text).Length() == 0))
{
MessageDlg("Надо ввести напряжение и сопротивление",
mtlnformation, TMsgDlgButtons() << mbOK, 0) ;
if ((Editl >Text).Length() == 0)
Editl >SetFocus(); // курсор в поле Напряжение
else
Edit2 >SetFocusО; // курсор в поле Сопротивление
return;
// получить данные из полей ввода
u = StrToFloat(Editl >Text);
г = StrToFloat(Edit2 >Text);
// вычислить ток
try
{
i = u/r;
}
catch (EZeroDivide &e)
{
ShowMessage("Величина сопротивления не должна быть"
"равна нулю");
Edit2 >SetFocus(); // курсор в поле Сопротивление
return;
14 Ч асть 1. Примеры и задачи
// вывести результат в поле Labels
Label4 >Caption   "Ток : " +
FloatToStrF(i,ffGeneral,7,2) + " A";
// нажатие клавиши в поле Напряжение
// коды запрещенных клавиш заменим нулем, в результате
// символы этих клавиш в поле редактирования не появятся
void fastcall TForml::EditlKeyPress(TObject *Sender,
char &Key)
{
// Key   код нажатой клавиши
// проверим, является ли символ допустимым
if ( ( Key >= '0') && ( 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;
 азовые компоненты 75
// остальные клавиши запрещены
Key = 0; // не отображать символ
// нажатие клавиши в поле Сопротивление
void fastcall TForml::Edit2KeyDown(TObject *Sender,
WORD &Key,TShiftState Shift)
{
if ( ( Key >= '0') && ( Key <= '9' ) ) // цифра
return;
if ( Key == DecimalSeparator) {
if ( (Edit2 >Text).Pos(DecimalSeparator) != 0 )
Key = 0; // разделитель уже введен
return;
if (Key == VK_BACK) // клавиша <Backspace>
return;
if ( Key == VK_RETURN) // клавиша <Enter>
I
Buttonl >SetFocus(); // переход к кнопке Вычислить
// повторное нажатие клавиши <Enter>
// активизирует процесс вычисления тока
// см. ButtonlClick
return;
// остальные клавиши запрещены
Key = 0 ; // не отображать символ
У
// щелчок на кнопке Завершить
void fastcall TForml::Button2Click(TObject 'Sender)
1 6 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Forml >Close(); // закрыть форму приложения
/* Процедура EditlChange обрабатывает событие Change
как поля Editl, так и поля Edit2.
Сначала надо создать процедуру обработки события Change
для поля Editl, затем   в строке события Change компонента
Edit2 щелкнуть на значке раскрывающегося списка и выбрать
EditlChange. */
void fastcall TForml::EditChange(TObject *Sender)
{
Label4 >Caption = "";
С о п р о т и в л е н и е
П р о г р а м м а С о п р о ти в л е н и е , е е ф о р м а п р и в е д е н а н а р и с . 1.4, в ы ч и с  
л я е т с о п р о т и в л е н и е э л е к т р и ч е с к о й ц е п и , с о с т о я щ е й и з д в у х р е з и  
с т о р о в , к о т о р ы е м о гу т б ы т ь с о е д и н е н ы п о с л е д о в а т е л ь н о и л и п а  
р а л л е л ь н о . Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а RadioButton.
RadioButtoni
RadioButton2
С о п р о т и в л е н и е
П р о г р а м м а в ы ч и с л и т с о п р о т и в л е н и е
э л е к т р и ч е с к о й ц е п и , к о т о р а я с о с т о и т
и з д в у х о п р о т и в л е н и й
I С о п р о т и в л е н и я с о е д и н е н ы
• j ^ п о с л е д о в а т е л ь н о
п а р а л л е л ь н о
Label4
Р и с . 1.4. Ф о р м а п р о г р а м м ы С о п р о т и в л е н и е
 азовые компоненты 17_
// щелчок на кнопке Вычислить
void fastcall TForml::ButtonlClick(TObject *Sender)
{
float rl,r2,r;
rl = StrToFloat(Editl >Text);
r2 = StrToFloat(Edit2 >Text);
/* Переключатели RadioButtonl и RadioButton2
зависимые, поэтому о типе соединения можно
судить по состоянию одного из них */
±£ ( RadioButtonl->Checked )
{
/ / выбран переключатель "последовательно"
г = rl + г2;
ela*
/ / в ы б р а н п е р е к л ю ч а т е л ь "п а р а л л е л ь н о "
/ / п р и в ы ч и с л е н и и с о п р о т и в л е н и я в о з м о ж н о
/ / и с к л ю ч е н и е EInvalidOp
t r y
{
г = ( r l * r2) / ( r l + r 2) ;
}
catch ( EInvalidOp &e)
{
ShowMessage("Необходимо задать величину"
"сопротивлений");
return;
Label4 >Caption = FloatToStrF(r, ffGeneral, 6,2) + " Ом";
}
18 Ч а с т ь 1. П р и м е р ы з а д а ч и
I I щелчок на переключателе "последовательно"
void fastcall TForml::RadioButtonlClick(TObject *Sender)
{
Label4 >Caption = "";
// щелчок на переключателе "параллельно"
void fastcall TForml::RadioButton2Click(TObject *Sender)
{
Label4 >Caption = "";
Кафе
П р о г р а м м а К а ф е , е е ф о р м а п р и в е д е н а н а р и с . 1.5, д е м о н с т р и р у  
е т и с п о л ь з о в а н и е к о м п о н е н т а checkBox.
Label! •
С т о и м о с т ь з а к а з а :
Che:kBox1 •
CheckBox2 •
CheckBox3 •
CheckBox4
Buttoni
Б и г  М а к
с о у с
к а р т о ш к а
К о к а   К о л а
ок I::
Рис. 1.5. Форма программы Кафе
float surnm; // сумма аказа
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
Базовые компоненты f£
/ / сделать недоступным переключатель "соус"
CheckBox2 >Enabled = false;
// щелчок на переключателе "Биг Мак"
void fastcall TFoml: :CheckBoxlClick(TObject *Sender)
{
if ( CheckBoxl >Checked )
{
/* переключатель был сброшен,
пользователь установил его */
summ += 54;
// сделать доступным переключатель "соус"
CheckBox2 >Enabled = true;
}
else
{
/* переключатель был установлен,
пользователь сбросил его */
summ  = 54;
// сбросить и сделать недоступным переключатель "соус"
if (CheckBox2 >Checked)
CheckBox2 >Checked = false;
CheckBox2 >Enabled = false;
// отобразить измененную сумму в поле
Labell >Caption = FloatToStrF(summ,ffCurrency,6,2);
20 Часть 1. Примеры и задачи
// щелчок на переключателе "соус"
void faetcall TForml::CheckBox2Click(TObject *Sender)
if ( CheckBox2 >Checked)
summ +=10.5;
•la*
summ  = 10.5;
Labell >Caption = FloatToStrFtsumm,ffCurrency,6,2);
// щелчок на переключателе "картошка"
void faetcall TForml::CheckBox3Click(TObject *Sender)
if ( CheckBox3 >Checked)
summ += 18.5;
•la*
summ  = 18.5;
Labell >Caption = FloatToStrF(summ,ffCurrency,6,2);
// щелчок на переключателе "Кока Кола"
void faetcall TForml::CheckBox4Click(TObject *Sender)
{
if ( CheckBox4 >Checked)
sum += 14;
summ  = 14;
Labell >Caption = FloatToStrF(summ,ffCurrency,6,2)
// щелчок на кнопке OK
Базовые компоненты 21_
void fastcall TForml::ButtonlClick(TObject *Sender)
{
if ( (CheckBoxl >Checked)&& (CheckBox2 >Checked)&&
(CheckBox3 >Checked)&&(CheckBox4 >Checked) )
/* пользователь заказам полный набор
предоставить скидку 5% */
summ = summ * 0.95;
ShowMessage("Вам предоставляется скидка 5%.\п"
"Сумма заказа: " + FloatToStrF(summ, ffCurrency, 6,2) +
" руб.");
}
else
if ( (CheckBoxl >Checked)||
(CheckBox3 >Checked)||
(CheckBox4 >Checked))
ShowMessage("Сумма заказа: " +
FloatToStrF(summ,ffGeneral,6,2)+ " руб.");
else ShowMessage("Вы ничего не заказали");
Л ю б и м ы й н а п и т о к
П р о г р а м м а Л ю б и м ы й н а п и то к , е е ф о р м а п р и в е д е н а н а р и с . 1.6,
д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а с о т Ь о в о х .
С П И С К И К О М П О Н е Н Т О В ComboBox2 И С о т Ь о В о х З ф о р М И р у Ю Т С Я В О
в р е м я р а б о т ы п р о ф а м м ы (д е л а е т э т о к о н с т р у к т о р ф о р м ы ).
П о л ь з о в а т е л ь м о ж е т д о б а в и т ь э л е м е н т ы в с п и с к и о м п о н е н т о в
comboBox2 и С о т Ь о В о х З , о д н а к о э л е м е н т в с п и с о к к о м п о н е н т а
С о т Ь о В о х З д о б а в л я е т с я т о л ь к о в т о м с л у ч а е , е с л и т а к о г о э л е  
м е н т а в с п и с к е н е т .
З н а ч е н и я с в о й с т в к о м п о н е н т о в с о т Ь о в о х п р и в е д е н ы в
т а б л . 1.1.
22
Ч а с т ь 1. П р и м е р ы и з а д а ч и
r i v Л ю б и м ы й н а п и т о к •
В ы б е р и т е в С П И С К Е и л и в в е д и т е в п о л е р е д а к т и р о в а н и я с в о й л ю б и м ы й н а п и т о к
Labell  • Label2
:
• • • •   LabeB • • • • • •
ComboBoxi ComboBox2 С о т Ь о В о х З
Р и с . 1. 6. П р о г р а м м а Л ю б и м ы й н а п и т о к
Т а б л и ц а 1 . 1 . З н а ч е н и я с в о й с т в к о м п о н е н т о в С о т Ь о В о х
С в о й с т в о З н а ч е н и е К о м м е н т а р и й
ComboBoxl . st yl e csDropDownList Р а с к р ы в а ю щ и й с я с п и с о к
(д о б а в и т ь э л е м е н т в с п и с о к
н е л ь з я )
ComboBox2.Style csDropDown
СотЬоВохЗ.Style csSimple
Р а с к р ы в а ю щ и й с я к о м б и н и  
р о в а н н ы й с п и с о к . П о л ь з о  
в а т е л ь м о ж е т в в е с т и т е к с т в
п о л е р е д а к т и р о в а н и я
П о л е р е д а к т и р о в а н и я и с п и  
с о к
/ / к о н с т р у к т о р ф о р м ы
fastcall TForml::TForml(TComponent* Owner) TForm(Owner)
/ / с ф о р м и р о в а т ь с п и с о к к о м п о н е н т а С о т Ь о В о х З
ComboBox2  >Sorted = true; / / с п и с о к у п о р я д о ч е н
ComboBox2  >It ems  >Add("К о к а   К о л а ");
ComboBox2  >Items  >Add("Mepjttui,a") ;
ComboBox2  >It ems  >Add("П е п с и   К о л а ");
ComboBox2  >It ems  >Add("С п р а й т ");
ComboBox2  >It ems  >Add("Ф а н т а ");
Базовые компоненты 23
// сформировать список компонента СотЬоВохЗ
ComboBox2  >Sorted = true; / / с п и с о к у п о р я д о ч е н
ComboBox3  >It ems  >Add("4aii") ;
ComboBox3  >Items  >Add("4aM с л и м о н о м ") ;
ComboBox3~>Items  >Add("Ko(J>e ч е р н ы й ") ;
ComboBox3  >Items  >Add("Ko<J>e с о с л и в к а м и ") ;
ComboBox3  >It ems  >Add("KaKao");
// выбор элемента в списке ComboBoxl
void fastcall TForml::ComboBoxlClick(TObject *Sender)
{
Labell >Caption = CornboBoxl >Text;
// щелчок на элементе списка компонента ComboBox2
void fastcall TForml::ComboBox2Click(TObject *Sender)
{
Label2 >Caption = ComboBox2 >Items >
Strings[ComboBox2 >ItemIndex]
// щелчок на элементе списка компонента СотЬоВохЗ
void fastcall TForml::ComboBox3Click(TObject *Sender)
{
Label3 >Caption = СотЬоВохЗ >Iterns >
Strings[ComboBox3 >ItemIndex]
// нажатие клавиши в поле редактирования компонента ComboBox2
void fastcall TForml::ComboBox2KeyPress(TObject *Sender,
char &Key)
{
if (Key == VK_RETURN)
24 Ч асть 1. Примеры и задачи
У / Пользователь ввел в поле редактирования строку 
// и нажал <Enter>. Добавим строку в список.
int n = ComboBox2 >ltems >Add(ComboBox2 >Text);
ComboBox2 >ItemIndex = n;
Label2 >Caption = ComboBox2 >Items >Strings[n];
// нажатие клавиши в поле редактирования компонента СотЬоВохЗ
void fastcall TForml::ComboBox3KeyPress(TObject *Sender,
char &Key)
AnsiString st; // строка, которую ввел пользователь
// в поле редактирования компонента
// ComboBox
if (Key == VK_RETURN)
// Пользователь ввел в поле редактирования строку
// и нажал <Enter>. Если такой строки в списке нет,
// добавим ее в список
st = ComboBox3 >Text.Trim(); // удалить пробелы
if ( ComboBox3 >Items >lndex0f(st) ==  1 )
// добавить
int n = ComboBox3 >Items >Add(st);
ComboBox3 >ItemIndex = n;
Label3 >Caption = ComboBox3 >Items >Strings[n]
Б а з о в ы е к о м п о н е н т ы
25
Э л е к т р о э н е р г и я
П р о г р а м м а Э л е к тр о э н е р ги я (р и с . 1.7) п о к а з ы в а е т , к а к о д н а
ф у н к ц и я м о ж е т о б р а б а т ы в а т ь с о б ы т и я р а з н ы х , н о о д н о т и п н ы х
к о м п о н е н т о в .
Э л е к т р о э н е р г и я
' П о к а з а н и я с ч е т ч и к а  
п р е д ы д у щ е е
т е к у щ е е
г
1 0 5 2
'
7
I
3 1 2 7 4
'
2
Ц е н а (р у б . / к В т ) I
0
'
9 6
С у м м а к о п л а т е : 2 1 2 , 6 4 р .
[ В Ы Ч И С / H Tb j
Р и с . 1.7. П р о г р а м м а Э л е к т р о э н е р г и я
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
/ * з а д а т ь , ч т о с о б ы т и е KeyPress
д л я к о м п о н е н т о в Edit2 и Edit3
о б р а б а т ы в а е т ф у н к ц и я EditKeyPress */
Edit 2  > 0nKeyPress = Edit KeyP ress;
Edit 3  > 0nKeyPress = Edit KeyP ress;
/ * ч т о б ы п р о ц е д у р а о б р а б о т к и с о б ы т и я KeyPress м о г л а
о п р е д е л и т ь , в к а к о м п о л е п о л ь з о в а т е л ь н а ж а л к л а в и ш у ,
з а п и ш е м в с в о й с т в о Tag к а ж д о г о к о м п о н е н т а Edit
ц е л у ю к о н с т а н т у */
Edit l  > T ag = 1;
Edit 2  > Tag = 2;
26 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Edit3 >Tag = 3;
// нажатие клавиши в поле редактирования
void fastcall TForml::EditKeyPress(TObjееt *Sender,
char &Key)
TEdit * Edit; // компонент Edit
Edit = (TEdit*)Sender;
/* теперь ed   это компонент Edit, в поле которого
пользователь нажал клавишу */
/* Реакция компонентов на нажатие всех клавиш,
за исключением <Enter> одинаковая. */
if ( Key == VK_RETURN) // нажате клавиша <Enter>
switch (Edit >Tag) {
case 1 : /* клавиша нажата в поле Editl
переместить курсор в поле Edit3 */
Edit2 >SetFocus() ; break;
case 2 : /* клавиша нажата в поле Edit2
переместить курсор в поле Edit3 */
Edit3 >SetFocus() ; break;
case 3 /* клавиша нажата в поле Edit3
сделать активной кнопку Вычислить */
Buttonl >SetFocusО ; break;
}
return;
if ( (( Key >= '0') && ( Key <= •9' )
(Key == VK_BACK))
Базовые к о м п о н е н т ы 2 7
// цифра или <>Backspace>
return;
if ((Key == ',') || (Key == '.'))
{
Key = DeciinalSeparator;
if ( (Edit >Text).Pos(DecimalSeparator) != 0
Key = 0;
return;
i f ( Key == VK_BACK )
r e t ur n;
/ / о с т а л ь н ы е с и м в о л ы з а п р е щ е н ы
Key = 0;
// щелчок на кнопке Вычислить
void fastcall TForml::ButtonlClick(TObject *Sender)
{
float prior, curr; // предыдущее и текущее показания
// счетчика
float tariff; // тариф   цена 1 кВт/час
float summ; // сумма к оплате
prior = StrToFloat(Editl >Text);
curr = StrToFloat(Edit2 >Text);
tariff = StrToFloat(Edit3 >Text);
// проверить исходные данные
if ( curr < prior)
2 3а к . 1241
28 Ч асть 1. Примеры и задачи
MessageDlg("Текущее значение показания счетчика не"
" может быть меньше предыдущего.",
mtWarning, TMsgDlgButtons() « mbOK,0);
return;
}
summ = (curr   prior) * tariff;
Label4 >Caption = "Сумма к оплате: " +
FloatToStrF(summ, ffCurrency, 6,2);
О С А Г О
П р о ф а м м а О С А Г О (р и с . 1.8), п о з в о л я е т р а с с ч и т а т ь р а з м е р с т р а  
х о в о й п р е м и и (р и с . 1.9), п о д л е ж а щ е й у п л а т е п о д о г о в о р у о б я з а  
т е л ь н о г о с т р а х о в а н и я г р а ж д а н с к о й о т в е т с т в е н н о с т и . Д е м о н с т р и  
р у е т и с п о л ь з о в а н и е к о м п о н е н т а с о т Ь о В о х , о б р а б о т к у о д н о й
ф у н к ц и е й с о б ы т и й о т н е с к о л ь к и х к о м п о н е н т о в . П р о г р а м м а с п р о  
е к т и р о в а н а т а к и м о б р а з о м , ч т о к н о п к а О К д о с т у п н а т о л ь к о в т о м
с л у ч а е , е с л и в в е д е н ы в с е д а н н ы е , н е о б х о д и м ы е д л я р а с ч е т а .
J U J < J
П р о г р а м м а п о з в о л я е т р а с ч и т а т ь т а р и ф п о о б я з а т е л ь н о м у с т р а х о в а н и ю
г р а ж д а н с к о й о т в е т с т в е н н о с т и в л а д е л ь ц е в т р а н с л о р т н ы х с р е д с т в
(ф и з и ч е с к о г о л и ц а в л а д е л ь ц а л е г к о в о г о а в т о м о б и л я
Б а з о в а я с т а в к а с т р а х о в о г о а р и ф а (р у б .): Jl980
Т е р р и т о р и я п р е и м у щ е с т в е н н о г о и с п о л ь з о в а н и я : [С а н к т   П е т е р б у р г
К л а с с п р е д ы д у щ е г о г о д а ; [ з К о л и ч е с т в о с т р а х о в ы х с л у ч а е в : | 0
В о з р а с т и с т а ж : о т 22 л е т и с т а р ш е .с т а ж с в ы ш е 2 л е т j j
Р о г р а н и ч е н и е к о л и ч е с т в а л и ц , д о п у щ е н н ы х к у п р а в л е н и ю Т С
М о щ н о с т ь д в и г а т е л я ( л . с ) : [с в ы ш е 70 д о 95 в к л ю _^J
П е р и о д и с п о л ь з о в а н и я Т С [ б о л е е 9 м е с я ц е в
OK
Р и с . 1.8. О к н о п р о г р а м м ы О С А Г О
Базовые компоненты 29
Б азовая ставка тарифа: 1 980,00р.
К оэф. тарифа: 1,8
К о э ф . б е з а в а р и й н о с т и : 0,95
К о э ф . в о д и т е л ь с к о г о с т а ж а : 1
К о э ф . к о л   в а л и ц , д о п у щ е н ы х к у п р а в л е н и ю : 1
К о э ф . м о щ н о с т и д в и г а т е л : 1
К о э ф . п е р и о д а и с п о л ь з о в а н и я Т С : 1
Т а р и ф : 3385,80р .
О К
Рис. 1.9. Результат расчета
AnsiString reg[8] = {"Москва","Московская обл.",
"Санкт Петербург",
"Нижний Новгород",
"Ленинградская обл.",
"Ростов наДону", "Самара",
"Мурманск"};
// коэф., учитывающей регион
float Kt [8] = {1.8,1.6, 1.8,1.3,1,1,1,1};
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
int i, n;
n = sizeof (Kt) / sizeof (float);
for (i=0; i<n; i++)
ComboBoxl >Items >Add(reg[i]);
/* событие Change всех компонентов обрабатывает
функция TForml::Change */
ComboBoxl >OnChange = Change;
ComboBox2 >OnChange = Change; 
30 Ч а с т ь 1. П р и м е р ы и з а д а ч и
ComboBox4 >0nChange = Change;
ComboBox4 >OnChange = Change;
Editl >OnChange = Change;
Edit2 >0nChange = Change;
Edit3 >0nChange = Change;
/* таблица определения коэффициента страхового тарифа
Первый год   3 й класс, второй год (если не было страховых
случаев) 4 й класс и т.д.). Если страховой случай был,
то класс ячейка таблицы: строка   класс предыдущего
года, столбец   кол во страховых случаев. */
/ / к л а с с б е з а в а р и й н о с т и
i n t Cb[ 6] [ 5] = {{1,   1,   1,   1,   1},
{2,   1,   1,   1,   1},
{3, 1,   1,   1,   1},
{4, 1,   1,   1,   1},
{5, 2, 1,   1,   1},
{6, 3, 1,   1,   1}};
// коэффициент безаварийности
float Kb[7] = {2.3, 1.55, 1.4, 1, 0.95, 0.9};
// щелчок на кнопке ОК
void fastcall TForml::ButtonlClick(TObject *Sender)
float aTb; // базовая ставка тарифа
float aKt; // коэф. тарифа
float aKb; // коэф. безаварийности
float aKvs; // коэф. водительского стажа
float aKo; // коэф., учитывающий количество лиц,
// допущеных к управлению
Базовые компоненты 31_
float аК ш; // коэф. мощности двигателя
float aKs; // коэф., учитывающей период использования ТС
int pcb,ccb; // предыдущий и текущий класс безаварийности
int nss; // количество страховых случаев предыдущего
// периода
аТЬ = StrToFloat (Edit3 >Text) ;
aKt = Kt[ComboBoxl >Itemlndex];
pcb = StrToInt(Editl >Text);
nss = StrToInt(Edit2 >Text);
ccb = Cb[pcb][nss];
if ( ccb !=  1)
aKb = Kb[ccb];
else aKb = 2.45;
aKb = Kb[ccb];
// коэф. водительского стажа
switch (ComboBox2 >ItemIndex)
{
case 0: aKvs = 1.3; break;
case 1: aKvs = 1.2; break;
case 2: aKvs = 1.15; break;
case 3: aKvs = 1.0; break;
// коэф., учитывающей количество лиц, допущенных к
// управлению
if (CheckBoxl >Checked)
аК о = 1;
else
аК о ш 1.5;
32
// коэф. мощности двигателя
switch (ComboBox3 >ItemIndex)
г
I
case
case
case
case
case
case
case
// коэф.
0
1
2
3
4
5
6
aKm =
aKm =
aKm =
aKm =
aKm =
aKm =
aKm =
• 0.5;
: 0.7;
: 1.0;
: 1.3;
= 1.5;
= 1.7;
= 1.9;
, учитывающий г
break
break
break
break
break
break
break
юриод
;
;
;
;
;
'•
исполь.
Ч асть 1.

зования
Примеры и задачи
тс
switch (ComboBox4 >ItemIndex)
{
case 0 : aKs = 0.7; break;
case 1 : aKs = 0.8; break;
case 2 : aKs = 0.9; break;
case 3 : aKs = 0.95; break;
case 4 : aKs = 1.0; break;
// все коэффициенты определены
float T; // тариф
AnsiString st;
T = аТЬ * aKt * aKb * aKvs * аК о * aKm *aKs;
st = "Б азовая ставка тарифа: " +
FloatToStrF(aTb,ffCurrency,5,2)+
"ХпК оэф. тарифа: " + FloatToStrF(aKt,ffGeneral,2,2)+
"ХпК оэф. безаварийности: " +
Базовые компоненты 3J3
FloatToStrF(aKb,ffGeneral,2,2)+
"ХпК оэф. водительского стажа: " +
FloatToStrF(aKvs,ffGeneral,2,2)+
"\п.Коэф. кол ва лиц, допущеных к управлению: " +
FloatToStrF(aKo,ffGeneral,2,2)+
"\пК оэф. мощности двигател: " +
FloatToStrF(aKm,ffGeneral,2,2)+
"ХпК оэф. периода использования ТС: " +
FloatToStrF(aKs,ffGeneral,2,2)+
"\п\пТариф: " + FloatToStrF(T,ffCurrency,5,2);
ShowMessage(st) ;
// пользователь изменил состояние какого либо из компонентов
формы
void fastcall TForml::Change(TObjееt *Sender)
{
Buttonl >Enabled =
(ComboBoxl >ItemIndex !=  1) &&
(ComboBox2 >ItemIndex !=  1) &&
(ComboBox3 >ItemIndex !=  1) &&
(ComboBox4 >ItemIndex !=  1) &&
(Editl >Text.Length<) != 0) &&
(Edit2 >Text.Length() != 0) &&
(Edit3 >Text.Length() != 0);
П р о с м о т р и л л ю с т р а ц и й
П р о г р а м м а П р о с м о т р и л л ю с тр а ц и й (р и с . 1.10) д е м о н с т р и р у е т
и с п о л ь з о в а н и е к о м п о н е н т о в ListBox и openDiaiog. В ы б о р
к а т а л о г а (п а п к и ) в ы п о л н я е т с я в с т а н д а р т н о м о к н е О тк р ы ть
ф а й л , к о т о р о е с т а н о в и т с я д о с т у п н ы м в р е з у л ь т а т е щ е л ч к а п о
к н о п к е В ы б о р . О т о б р а ж е н и е д и а л о г а о с у щ е с т в л я е т к о м п о н е н т
OpenDiaiog.
34 Ч а с т ь 1. П р и м е р ы и з а д а ч и
PICT0208JPG
PICT0209.JPG
PICT0210.JPG
PICT0211.PG
PICT0212.JPG
PICT0213.PG
PICT0214.PG
PICT0217.JPG
PICT0001.JPG
PICT0002.JPG
PICT0003.PG
PICT0004.JPG
PICT0006.PG
PICT0O0BJPG
PICT0011.PG
PICT0013JPG
PICT0014.JPG
0Т Г Т П П 1Ч
Р и с . 1. 10. В ы б о р ф о т о г р а ф и и в ы п о л н я е т с я в с п и с к е
к о м п о н е н т а L i s t B o x
#include <jpeg.hpp> // обеспечивает работу
// с иллюстрациями в формате JPEG
AnsiString aPath; // каталог, в котором находится
// иллюстрация
TSearchRec aSearchRec; // рез т поиска файла
// конструктор
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
Imagel >Proportional = true;
if (FindFirst(aPath+ "*.jpg"/ faAnyFile, aSearchRec) == 0)
ListBoxl >Items >Add(aSearchRec.Name);
while ( FindNext(aSearchRec) == 0 )// айти след. илл.
Базовые компоненты 3!5
{
ListBoxl >Items >Add(aSearchRec.Name);
}
// отобразить первую иллюстрацию
ListBoxl >ItemIndex = 0;
Labell >Caption = ListBoxl >Items >Strings[0];
Imagel >Picture >LoadFromFile(aPath +
ListBoxl >Items >Strings[0]);
// щелчок в строке компонента ListBox
void fastcall TForml::ListBoxlClick(TObject *Sender)
{
int n = ListBoxl >ItemIndex; // номер выбранного эл та
// списка
Labell >Caption = ListBoxl >Items >Strings[n];
Imagel >Picture >LoadFrornFile(aPath + ListBoxl >
Items >Strings[n]);
// щелчок на кнопке Выбор
void fastcall TForml::BitBtnlClick(TObject *Sender)
{
if ( OpenDialogl >Execute() )
{
// пользователь выбрал файл
ListBoxl >Clear(); // очистить список
aPath = ExtractFilePath(OpenDialogl >FileName);
Forml >Caption = "Просмотр иллюстраций   "+ aPath;
if ( FindFirst(aPath+ "*.jpg", faAnyFile, aSearchRec)
== 0)
36 Ч а с т ь 1. П р и м е р ы и з а д а ч и
List Boxl  > I t ems  > Add( aSearch Rec. Name) ;
while ( F indNext ( aSearchRec) == 0)/ / н а й т и с л е д .и л л .
{
ListBoxl >Items >Add(aSearchRec.Name);
}
// определим позицию выбранного пользователем файла
// в списке ListBox и отобразим его
int n = ListBoxl >Items >
IndexOf(ExtractFileName(OpenDialogl >FileName));
ListBoxl >ItemIndex = n;
Labell >Caption = ListBoxl >Items >Strings[n];
Imagel >Picture >LoadFromFile(aPath +
ListBoxl >Items >Strings[n]);
К а л ь к у л я т о р
П р о г р а м м а К а л ьк ул я то р (р и с . 1.11) п о з в о л я е т в ы п о л н и т ь п р о  
с т е й ш и е р а с ч е т ы . С л е д у е т о б р а т и т ь в н и м а н и е , ч т о в к а ч е с т в е
и н д и к а т о р а и с п о л ь з у е т с я к о м п о н е н т st at icText .
(Ж К а л ь к у л я т о р     '
5
I _ ! _ L J _ ^ J
Р и с . 1 . 1 1 . П р о с т е й ш и й к а л ь к у л я т о р
Базовые компоненты 37^
float accum; // аккумулятор (рез т выполнения операции)
int op; /* операция:
1   "+ ", 
2   " ";
О   "выполнить" (нажата кнопка "=" */
int f; /* f == 0   жмем первую цифру нового числа,
например, после выполнения
операции, когда на индикаторе результат.
f == 1   ждем остальные цифры */
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
f =0; // ждем первую цифру
op = 0; // предыдущая операция выполнена
StaticTextl >Caption = 0;
// кнопка "0"
void fastcall TForml::Btn0Click(TObject *Sender)
{
if ( f != 0)
StaticTextl >Caption = StaticTextl >Caption + "0"
// кнопка "1"
void fastcall TForml::BtnlClick(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "1";
f = 1;
38 Ч а с т ь 1. П р и м е р ы и з а д а ч и
e l s e
StaticTextl >Caption = StaticTextl >Caption + "1";
// кнопка "2"
void fastcall TForml::Btn2Click(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "2";
f = 1;
else
StaticTextl >Caption = StaticTextl >Caption + "2";
// кнопка "3"
void fastcall TForml::Btn3Click(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "3 ";
f = 1;
}
else
StaticTextl >Caption = StaticTextl >Caption + "3 "
// кнопка "4"
void fastcall TForml::Btn4Click(TObject *Sender)
{
if ( f == 0)
StaticTextl >Caption = "4";
Базовые компоненты 3 9
f = 1;
}•
else
StaticTextl >Caption = StaticTextl >Caption + "4";
// кнопка "5"
void fastcall TForml::Btn5Click(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "5";
f = 1;
}
else
StaticTextl >Caption = StaticTextl >Caption + "5"
// кнопка "б"
void fastcall TForml::Btn6Click(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "6";
f = 1;
}
else
StaticTextl >Caption = StaticTextl >Caption + "6"
// кнопка "7"
void fastcall TForml::Btn7Click(TObject *Sender)
{
if ( f == 0)
40 Ч асть 1. Примеры и задачи
StaticTextl >Caption = "7";
f = 1;
}
else
StaticTextl >Caption = StaticTextl >Caption
// кнопка "8"
void fastcall TForml::Btn8Click(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "8";
f = 1;
else
StaticTextl >Caption = StaticTextl >Caption + "8";
// кнопка "9"
void fastcall TForml::Btn9Click(TObject *Sender)
{
if ( f == 0)
{
StaticTextl >Caption = "9";
f = 1;
else
StaticTextl >Caption = StaticTextl >Caption + "9"
// кнопка ", " (десятичная точка)
void fastcall TForml::BtnkClick(TObject *Sender)
Базовые компоненты 41_
{
if ( f == 0)
{
StaticTextl >Caption = "0,";
f = 1;
else
if ( StaticTextl >Caption.Pos(",") == 0)
StaticTextl >Caption = StaticTextl >Caption
// кнопка "С" (сброс)
void fastcall TForml::BtnCClick(TObject *Sender)
{
StaticTextl >Caption = "0";
accum = 0;
op = 0;
f = 0; // ждем первую цифру числа
// выполнить операцию
void fastcall TForml::DoOp(void)
{
/ * accum с о д е р ж и т р е з у л ь т а т п р е д ы д у щ е й о п е р а ц и и .
С е й ч а с н а д о в ы п о л н и т ь о п е р а ц и ю , к о д к о т о р о й о р .
О п е р а н д н а х о д и т с я н а и н д и к а т о р е */
float op2 = StrToFloat(StaticTextl >Caption);
switch ( op )
{
case 0 : accum = op2; break ;
case 1 : accum += op2; break;
42 Ч а с т ь 1. П р и м е р ы и з а д а ч и
case 2 : accum  = op2; break;
StaticTextl >Caption = FloatToStrF(accum,ffGeneral,6,3);
// кнопка "+ "
void fastcall TForml::BtnPClick(TObject *Sender)
{
/* надо выполнить предыдущую операцию,
вывести результат на индикатор, запомнить
текущую операцию и установить режим ввода
нового числа */
if ( f != 0)
{
// на индикаторе есть число
DoOp(); // выполнить предыдущую операцию
f = 0; // ждем первую цифру нового числа
}
ор =1;
// кнопка " "
void fastcall TForml::BtnMClick(TObject *Sender)
{
if ( f != 0)
{
// на индикаторе есть число
DoOp(); // выполнить предыдущую операцию
f = 0; // ждем первую цифру нового числа
}
ор = 2; // запомнить текущую операцию
// кнопка "="
Базовые компоненты 43
void fastcall TForml::BtnEClick(TObject *Sender)
{
if ( f != 0)
{
DoOp(); // выполнить операцию
f = 0; // ждем первую цифру нового числа
}
ор = 0;
К а л ь к у л я т о р   2
П р о г р а м м а К а л ьк ул я то р   2, е е ф о р м а и о к н о п р и в е д е н ы н а
р и с . 1.12, д е м о н с т р и р у е т с о з д а н и е к о м п о н е н т о в в о в р е м я р а б о т ы
п р о г р а м м ы и л и , а к и н о г д а г о в о р я т , "в к о д е ". К н о п к и к а л ь к у л я  
т о р а — э т о о б ъ е д и н е н н ы е в м а с с и в к о м п о н е н т ы SpeedButton.
С о з д а н и е и н а с т р о й к у к н о п о к в ы п о л н я е т к о н с т р у к т о р ф о р м ы ,
о н ж е о п р е д е л я е т (з а д а е т ) п р о ц е д у р у о б р а б о т к и с о б ы т и я click.
С л е д у е т о б р а т и т ь в н и м а н и е , ч т о о б ъ я в л е н и е м а с с и в а к о м п о н е н  
т о в speedButton и ф у н к ц и и о б р а б о т к и с о б ы т и я click н а х о д и т с я
в о б ъ я в л е н и и т и п а ф о р м ы , в з а г о л о в о ч н о м ф а й л е .
Р и с . 1 . 1 2 . Ф о р м а и о к н о п р о г р а м м ы К а л ь к у л я т о р   2
/ / о &ь я в л е н и е ф о р м ы   ф р а г м е н т h  ф а й л а
c l a s s TForml : p ub l i c TForm
published:
TStaticText *StaticTextl; // индикатор
44
Ч а с т ь 1. П р и м е р ы и з а д а ч и
private:
// ** эти объявления вставлены сюда вручную **
TSpeedButton * btn[16]; // кнопки
// процедура обработки события Click на кнопке
void fastcall btnClick(TObject *Sender);
public:
fastcall TForml (TComponent* Ownejr) ;
// *** модуль формы ***
float ас; // аккумулятор (первый операнд)
int op; // операция
int fd; /* fd == 0   ждем первую цифру числа, например,
после того, как была нажата клавиша "+ ";
fd = 1   ждем ввода следующей цифры или
нажатия клавиши операции */
#define WBTN 35 // ширина кнопки
#define HBTN 20 // высота кнопки
#define DXBTN 6 // шаг кнопок по X
#define DYBTN 6 // шаг кнопок по Y
// текст на кнопке
Char btnText[] = "789+456 123=00.с";
#define CM  1 // запятая
#define EQ  2 // "="
ttdefine PL  3 // "+"
#define MN  4 // " "
#define CL  5 // "C"
t
// идентификатор кнопки
int btnTagU = {7,8,9,PL,4,5,6,MN,1,2,3,EQ,0,0,CM,CL}
Базовые компоненты 45
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
int left, top; // положение кнопки
top = 48;
int к = 0; // индекс массива btn
for ( int i = 0; i < 4; i++ ) // четыре ряда кнопок
{
left = 8;
for ( int j = 0; j < 4; j++) // no 4 в каждом ряду
{
btn [к] = new TSpeedButton {Forml), 
btn[k] >Parent = Forml; // "посадить" кнопку на
// форму
// настройка кнопки
btn[k] >Left = left;
btn[k] >Top = top;
btn[k] >Width = WBTN;
btn[k] >Height = HBTN;
//btn[k] >Flat = true;
btn[k] >Font >Color = clNavy;
btn[k] >Caption = btnText[k]; // текст на кнопке
btn[k] >Tag = btnTag[k]; // идентификатор кнопки
// задать процедуру обработки события Click
btn[k] >OnClick = btnClick; // см. объявление
/ / h  ф а й л е ф о р м ы
left = left + WBTN+ DXBTN;
46 Ч а с т ь 1. П р и м е р ы и з а д а ч и
top = top + HBTN + DYBTN;
}
// объединить две кнопки "О" (btn[12] и btn[13]) в одну
btn[13] >Visible = false;
btn[12] >Width = 2 * WBTN + DXBTN;
op = EQ;
// Щелчок кнопке btn[i]
// ( одна процедура для всех кнопок )
void fastcall TForml::btnClick(TObject *Sender)
{
TSpeedButton *btn;
int id; // идентификатор нажатой нопки
btn = (TSpeedButton*(Sender;
// свойство Tag кнопки содержит ее идентификатор
id = btn >Tag;
// кнопка "1" .. "9"
if ( id > 0 ) {
if ( fd == 0 ) {
StaticTextl >Caption = btn >Tag;
fd = 1;
}
else
StaticTextl >Caption =
StaticTextl >Caption + btn >Tag;
return;
// кнопка "О"
if ( id == 0) {
if ( StaticTextl >Caption != "0" )
StaticTextl >Caption =
Базовые компоненты 47
StaticTexCl >Caption + btn >Tag;
return;
}
// кнопка ","
if ( id == CM) {
if ( StaticTextl >Caption.Pos(",") == 0 )
{
StaticTextl >Caption = StaticTextl >Caption + ",";
fd = 1;
}
return;
}
// кнопка "с"
if ( id == CL) {
ac = 0;
id = EQ;
fd = 0;
StaticTextl >Caption = 0;
return;
}
// остальные кнопки: "+", " " и "="
float op2; // операнд (число на индикаторе )
ор2 = StrToFloat(StaticTextl >Caption);
/* гак как нажата клавиша операции, то это значит,
что надо выполнить предыдущую операцию, код которой
находится в переменной ор */
switch (op) {
case EQ : ас = op2; break;
case PL : ac = ac + op2; break;
case MN : ac = ac   op2; break;
}
StaticTextl >Caption = FloatToStrF(ac,ffGeneral,15,6);
op = id; // запомнить текущую операцию
48
Ч а с т ь 1. П р и м е р ы и з а д а ч и
fd = 0; // ждем новое число
// деструктор формы
void fastcall TForml::FormDestroy(TObjееt *Sender)
// уничтожить компоненты, созданные программой
for ( int i = 0; i < 16; i++)
delete btn[i];
С е к у н д о м е р
П р о г р а м м а С е к ун д о м е р , ф о р м а и о к н о к о т о р о й п р и в е д е н ы н а
р и с . 1.13, д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а Timer.
Label Label2 Label3
Timeri   0:00 00:
П у с к j : с б р о с
Buttoni Button2
Ри с . 1.13. Форма и окно программы Се кунд о ме р
// время
int min; // минуты
int sec; // секунды
int msec; // миллисекунды
// конструктор
_fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
Базовые компоненты 4£
{
/ / настройка таймера
Timerl >Enabled = false;
Timerl >Interval = 10; // период сигналов от таймера
// 1 сек
// щелчок на кнопке Пуск/Стоп
void fastcall TForml::ButtonlClick(TObject *Sender)
{
if ( ! Timerl >Enabled )
{ *
// запустить таймер
Timerl >Enabled = true;
Buttonl >Caption = "Стоп";
Button2 >Enabled = false, 
}
else
{
// остановить таймер
Timerl >Enabled = false;
Buttonl >Caption = "Пуск";
Button2 >Enabled = true, 
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
{
if ( msec < 99)
msec++;
else
50 Ч а с т ь 1. П р и м е р ы и з а д а ч и
msec = 0;
if ( sec < 59 )
sec++;
else
{
sec = 0;
min++;
Labell >Caption = IntToStr(min);
}
if ( sec <= 9 )
Label2 >Caption = "0" + IntToStr(sec);
else
Label2 >Caption = IntToStr(sec);
// двоеточие
Label4 >Visible = ! Label4 >Visible;
}
if ( msec <= 9 )
Label3 >Caption = "0" + IntToStr(msec);
else
Label3 >Caption = IntToStr(msec);
// щелчок на кнопке Сброс
void fastcall TForml::Button2Click(TObject *Sender)
{
min = 0;
sec = 0;
msec = 0;
Labell >Caption = "0";
Label2 >Caption = "00";
Label3 >Caption = "00";
Б а з о в ы е к о м п о н е н т ы 51
У г а д а й ч и с л о
П р о г р а м м а У га д а й ч и с л о (р и с . 1.14) д е м о н с т р и р у е т и с п о л ь з о в а  
н и е к о м п о н е н т а ProgressBar. З н а ч е н и я с в о й с т в к о м п о н е н т а
ProgressBar п р и в е д е н ы в т а б л . 1.2.
\ Щ У г а д а й ч и с л о
К о м п ь ю т е р "з а д у м а л " т р е х з н а ч н о е ч и с л о . У г а д а й т е е г о .
В в е д и т е ч и с л о и щ е л к н и т е н а О К и л и н а ж м и т е <Enter>
Editi •
ProgressBarl
® |
О с т а л о с ь 60' с е к  
F п о л о с а
Buttoni CheckBoxi Timeri
Р и с . 1 . 1 4 . Ф о р м а п р о г р а м м ы У г а д а й ч и с л о
С в о й с т в о
Т а б л и ц а 1 . 2 . З н а ч е н и я с в о й с т в к о м п о н е т а ProgressBar
З н а ч е н и е
Min
Мах
Step
Position
Smooth
О
60
1
60
true
#define TR 60 // время, отведенное на решение задачи
int pw; // "секретное" число
int rem = TR; // остаток времени на выполнения задания
// конструктор формы
fastcall TForml::TForml(TComponent* Owner) : TForm(Owner)
52 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Label4 >Caption = IntToStr(TR);
//
настройка индикатора
// обратный отсчет, поэтому начальное значение
// равно максимальному
ProgressBarl >Max = TR;
ProgressBarl >Position = TR;
ProgressBarl >Step = 1; // шаг изменения
ProgressBarl >Smooth = true,  // индикатор   полоса
// загадать число
Randomize() ;
pw = RandomRange(100,999); // "секретное" число
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
{
rem—;
ProgressBarl >Position  ;
Label4 >Caption = IntToStr(rem);
if (rem == 0 )
{
// время, отведенное на решение задачи истекло
Timerl >Enabled = false;
Editl >Enabled = false;
Buttonl >Enabled = false;
ShowMessage("К сожалению, Вы не справились с"
" поставленной задачей\п \"Секретное\" число:" +
IntToStr(pw) );
Базовые компоненты
// щелчок на переключателе Полоса
void fastcall TFonnl::CheckBoxlClick(TObject *Sender)
{
if ( CheckBoxl >Checked )
{
// полоса
ProgressBarl >Step = 1 ; // шаг изменения
ProgressBarl >Smooth = true; // индикатор   полоса
else
// сегменты
ProgressBarl >Step = 6; // шаг изменения
ProgressBarl >Smooth = false; // индикатор   сегменты
// проверяет, правильное ли число ввел игрок
void fastcall TForml::isRight(void)
{
if ( StrToInt(Editl >Text) == pw )
{
Timerl >Enabled = false;
Buttonl >Enabled = false;
Editl >Enabled = false;
ShowMessage("Поздравляю!\пВы угадали число за " +
IntToStr(TR   rem)+ " сек");
// Нажатие клавиши в поле редактирования
void fastcall TForml::EditlKeyPress(TObject *Sender,
char &Key)
{
if ( ( Editl >Text.Length() < 3) &&
54 Ч асть 1. Примеры и задачи
((Key >= '0') &&
(Key <= '9')))
return;
if ( Key == VK_RETUKN)
{
isRight(); // проверить, правильное ли число ввел
// пользователь
return;
}
if ( Key == VK_BACK) return;
// остальные символы запрещены
Key = 0;
// Содержимое поля редактирования изменилось
void fastcall TForml::EditlChange(TObject *Sender)
{
// кнопка OK доступна только в том случае,
// если в поле редактирования три ашвола (цифры)
if ( Editl >Text.Length() == 3)
Buttonl >Enabled = true;
else
Buttonl >Enabled = false;
// щелчок на кнопке OK
void faatcall TForml::ButtonlClick(TObject *Sender)
isRightO; // проверить, правильное ли число ввел
// пользователь
У г а д а й ч и с л о   2
П р о г р а м м а У га д а й ч и с л о   2, о к н о к о т о р о й п р и в е д е н о н а р и с . 1.15,
д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а st at usBar. В п а н е л я х
Б а з о в ы е к о м п о н е н т ы
55
с т р о к и с о с т о я н и я о т о б р а ж а е т с я к о л и ч е с т в о с и м в о л о в , в е д е н н ы х
в п о л е р е д а к т и р о в а н и я , к о л и ч е с т в о п о п ы т о к у г а д а т ь ч и с л о и в р е  
м я , о с т а в ш е е с я н а р е ш е н и е п о с т а в л е н н о й з а д а ч и .
!' г а д а й и с л о   2
К о м п ь ю т е р "з а д у м а л " т р е х з н а ч н о е т л е л о . У г а д а й т е е г о .
В в е д и т е ч и с л о и н а ж м и т е <Entef>
)482|
С и м в о л о в : 3 " (П о п ы т о к :! j О с т а л о с ь : 5О ,с е к
Р и с . 1. 15. В с т о к е с о с т о я н и я о т о б р а ж а е т с я и н ф о р м а ц и я
# defin e TR 60 / / в р е м я , о т в е д е н н о е н а р е ш е н и е з а д а ч и
i nt pw; / / "с е к р е т н о е " ч и с л о
i nt rem = TR; / / о с т а т о к в р е м е н и н а в ы п о л н е н и я з а д а н и я
i nt р = 0; / / к о л и ч е с т в о п о п ы т о к
/ / к о н с т р у к т о р ф о р м ы
fas t cal l TF orml::TF orml( TComponent * Owner) : TForm(Owner)
{
// загадать число
Randomize();
pw = RandomRange( 100, 999) ; / / "с е к р е т н о е " ч и с л о
// сигнал от таймера
void fastcall TForml::TimerITimer(TObject *Sender)
{
rem  ;
St a t usBa rl  > P a n els  > I t ems[ 2]   > T ext = " О с т а л о с ь : " +
I n t ToSt r( rem) + " с е к ";
i f (rem == 0 )
/ / в р е м я , о т в е д е н н о е н а р е ш е н и е з а д а ч и и с т е к л о
56^ Ч а с т ь 1. П р и м е р ы з а д а ч и
Timerl >Enabled = false;
Editl >Enabled = false;
ShowMessage("К сожалению, Вы не справились с"
" поставленной задачей\п\"Секретное\" число:" +
IntToStr(pw) );
// Нажатие клавиши в поле редактирования
void fastcall TForml::EditlKeyPress(TObject *Sender, char
&Key)
if ( ( Editl >Text.Length() < 3) && ( ( Key >= '0') &&
( Key <= '9') ) )
return;
if (( Key == VK_RETURN) && (Editl >Text.Length() == 3))
// проверить, правильное ли число ввел пользователь
if ( StrToInt(Editl >Text) == pw )
Timerl >Enabled = false;
Editl >Enabled = false;
ShowMessage("Поздравляю!\пВы угадали число за " +
IntToStr(TR   rem)+ " сек");
else
// увеличить счетчик попыток
Р++;
StatusBarl >Panels >Items[I] >Text =
" Попыток: " + IntToStr(p);
return;
Базовые компоненты 57
if ( Key == VK_BACK) return;
// остальные символы запрещены
Key ш 0;
// Содержимое поля редактирования изменилось
void fastcall TForml::EditlChange(TObject *Sender)
StatusBarl >Panels >Items[O] >Text =
" Символов: " + IntToStr(Editl >Text.Length()
З а п у с к I nternet Explorer
П р о г р а м м а Д о с т у п в Internet п о к а з ы в а е т , к а к з а п у с т и т ь Internet
Explorer и л и д р у г о й б р а у з е р д л я д о с т у п а к в е б   с т р а н и ц е . Ф о р м а
п р о г р а м м ы п р и в е д е н а н а р и с . 1.16. Б р а у з е р з а п у с к а е т с я в р е  
з у л ь т а т е щ е л ч к а в п о л е Label i. З н а ч е н и я с в о й с т в к о м п о н е н т а
Label п р и в е д е н ы в т а б л . 1.3.
Л и т е р а т у р а п о п р о гр а м м и р о в а н и ю • http: //www.phy.ru
Labeli
Р и с . 1. 16. Ф о р м а п р о г р а м м ы Д о с т у п в I nt er net
Свойство
Таблица 1.3. Значения свойств компонента Label i
Значение
Font.Color
Font.Style.fsUnderline
Cursor
clBlue
true
crHandPoint
58
Ч а с т ь 1. П р и м е р ы и з а д а ч и
/ / щ е л ч о к в п о л е Label 1
void fas t cal l TF orml::LabellClick( TO bject *Sender)
{
/ / О т к р ы т ь ф а й л , и м я к о т о р о г о н а х о д и т с я в п о л е Labell
Sh ellExec ut e( F o r ml  > H a n dle, "o p en ", La bell  > Ca p t i o n . c _ st r О ,
NULL,NULL,SW_RESTORE);
В ы в о д с п р а в о ч н о й и н ф о р м а ц и и
К о н в е р т о р
П р о г р а м м а К о н в е р то р (р и с . 1.17) д е м о н с т р и р у е т р а з л и ч н ы е
с п о с о б ы о т о б р а ж е н и я с п р а в о ч н о й и н ф о р м а ц и и в ф о р м а т е
Winhelp (ф а й л с р а с ш и р е н и е м Ы р ). О к н о с п р а в к и (р и с . 1.18)
п о я в л я е т с я в р е з у л ь т а т е н а ж а т и я к л а в и ш и <F1> и л и щ е л ч к а н а
к н о п к е С п р а в к а . С л е д у е т о б р а т и т ь в н и м а н и е , ч т о п р и н а ж а т и и
к л а в и ш и <F1> в т о т м о м е н т , к о г д а к у р с о р н а х о д и т с я в о д н о м
и з п о л е й в в о д а , в о к н е с п р а в о ч н о й с и с т е м ы о т о б р а ж а е т с я р а з  
д е л , п о я с н я ю щ и й н а з н а ч е н и е т о г о п о л я , в к о т о р о м н а х о д и т с я
к у р с о р .
С п р а в о ч н а я и н ф о р м а ц и я п р о г р а м м ы К о н в е р то р с о с т о и т и з п я т и
р а з д е л о в (т а б л . 1.4). З н а ч е н и я с в о й с т в , о б е с п е ч и в а ю щ и х о т о  
б р а ж е н и е с п р а в о ч н о й и н ф о р м а ц и и , п р и в е д е н ы в т а б л . 1.5.
\   Ф К о н в е р т о р
Ц е н а ($)
К у р с (р у б / $) J"~
F1   с п р а в к а
П е р е с ч е т
С п р а в к а
З а в е р ш и т ь
EdiM Edil2 Button3
Р и с . 1 . 1 7 . С п р а в о ч н а я и н ф о р м а ц и я о т о б р а ж а е т с я
в р е з у л ь т а т е щ е л ч к а н а к н о п к е С п р а в к а
и л и н а ж а т и я к л а в и ш и < F1>
Б а з о в ы е к о м п о н е н т ы
59
Ф а й л ^а к л а д к а
С о д е р ж а н и е П е ч а ть 1
К о н в е р т о р
П р о г р а м м а К о н в е р т о р п о з в о л я е т п е р е с ч и т а т ь
ц е н у и з д о л л а р о в в р у б л и .
С о з д а н а в Borland C++Builder. Д е м о н с т р и р у е т
р а з л и ч н ы е с п о с о б ы д о с т у п а к с п р а в о ч н о й
и н ф о р м а ц и и . Ф а й л с п р а в о ч н о й и н ф о р м а ц и и (с
onvertor.hlp) д о л ж е н н а х о д и т с я в о д н о м к а т а л о г е с
ф а й л о м п р о г р а м м ы и л и в с и с т е м н о м к а т а л о г е Help.
3
 У
d
Р и с . 1 . 1 8 . С п р а в о ч н а я и н ф о р м а ц и я в ф о р м а т е Winhelp
Т а б л и ц а 1 . 4. Р а з д е л ы с п р а в о ч н о й и н ф о р м а ц и и
п р о г р а м м ы К о н в е р т о р
Р а з д е л И д е н т и ф и к а т о р р а з д е л а
К о н в е р т о р
И с х о д н ы е д а н н ы е
Ц е н а
К у р с
В в о д ч и с е л
1
2
3
4
5
Т а б л и ц а 1 . 5. С в о й с т в а , о б е с п е ч и в а ю щ и е в ы в о д
с п р а в о ч н о й и н ф о р м а ц и и
К о м п о н е н т С в о й с т в о З н а ч е н и е
Forml
Forml
Editl
Edit2
HelpFile
HelpContext
HelpContext
HelpContext
conv.hlp
1
3
4
/ / щ е л ч о к н а к н о п к е "С п р а в к а "
void fas t cal l TF orml::But t on 3Click( TO bject *Sender)
{
WinExecCwinh lp32. exe c o n v. h l p ", SW_RESTORE) ;
3 З а к . 1241
60
Ч а с т ь 1. П р и м е р ы и з а д а ч и
К о н в е р т о р   2
П р о г р а м м а К о н в е р то р   2 (р и с . 1.19) д е м о н с т р и р у е т р а з л и ч н ы е с п о  
с о б ы о т о б р а ж е н и я с п р а в о ч н о й и н ф о р м а ц и и в ф о р м а т е HTML
Help (ф а й л с р а с ш и р е н и е м chm). О к н о с п р а в к и (р и с . 1.20) п о я в л я  
е т с я в р е з у л ь т а т е щ е л ч к а н а к н о п к е С п р а в к а и л и н а ж а т и я к л а в и ш и
<F1> в м о м е н т , к о г д а к у р с о р н а х о д и т с я в о д н о м и з п о л е й в в о д а /
р е д а к т и р о в а н и я . В п о с л е д н е м с л у ч а е в о к н е с п р а в о ч н о й и н ф о р м а  
ц и и с р а з у о т о б р а ж а е т с я к о н к р е т н ы й (н у ж н ы й ) р а з д е л с п р а в к и .
С л е д у е т о б р а т и т ь в н и м а н и е , ч т о о т о б р а ж е н и е с п р а в к и а к т и в и з и р у  
е т п р о ц е д у р а о б р а б о т к и с о б ы т и я KeyDown, a He KeyPress.
I ».?
1
К о н в е р т о р   2
Ц е н а ($) | ~
К у р с (р у б / $) | "
F1   с п р а в к а —
П е р е с ч е т
С п р а в к а
З а в е р ш и т ь
* 1
Р и с . 1. 19. п р а в о ч н а я и н ф о р м а ц и я о т о б р а ж а е т с я в р е з у л ь т а т е щ е л ч к а
н а к н о п к е С п р а в к а и л и н а ж а т и я к л а в и ш и < F1>
ь * К о н в е р т о р   2 . i ql . xj
• TV
t LJ
С к р ы т ь
П е ч а т ь П а р л ц е т р ы
51
Щ И с х о д н ы е д а н н ы е
Э Ц е н а
Д К у р с
ii] В и о д и с е л
К о н в е р т о р
П р о г р а м м а К о н в е р т о р п о з в о л я е т
п ф е с ч и т а т ь ц е н у и з о л щ х © в р у б л и .
С о з д а н а в Borland C++ Builder.
Д е м о н с т р и р у е т р а з л и ч н ь е с п о с о б ы
д о с т у п а к с п р а в о ч н о й и н ф о р м а ц и и .
Ф а й л с п р а в о ч н о й и н ^ю р м а ц и и
(convertor.chm) д о л ж е н н а х о д и т с я в
о д н о м к а т а л о г е с ф а й л о м п р о г р а м м ы
и л и в с и с т е м н о м к а т а л о г е Help.
Р и с . 1. 20. С п р а в о ч н а я и н ф о р м а ц и я в ф о р м а т е HTML Help
Базовые компоненты 61_
/* Нажатие клавиши в поле "Цена". Процедура
обработки события KeyDown позволяет обрабатывать
нажатие всех клавиш, в том числе и функциональных
(при нажатии функциональной клавиши событие KeyPress
не возникает) */
void fastcall TForml::EditlKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
if (Key == VK_F1 )
/* Отображение справочной информации
обеспечивает утилита hh.exe, входящая
в состав Windows. Ключ mappid задает
отображаемый раздел справочной информации */
WinExecfhh.exe  mapid 3 converter.chm", SW_RESTORE);
// нажатие клавиши в поле "Курс"
void fastcall TForml::Edit2KeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
{
if (Key == VK_F1 )
WinExecChh.exe  mapid 4 convertor.chm", SW_RESTORE)
// щелчок на кнопке "Справка"
void fastcall TForml::Button3Click(TObject *Sender)
{
WinExecChh.exe  mapid 1 convertor.chm", SW_RESTORE)
Ф а й л ы
В э т о м р а з д е л е п р и в е д е н ы п р о г р а м м ы , к о т о р ы е д е м о н с т р и р у ю т
в ы п о л н е н и е р а з л и ч н ы х о п е р а ц и й с ф а й л а м и .
П о г о д а
П р о г р а м м а П о го д а , ф о р м а к о т о р о й п р и в е д е н а н а р и с . 1.21, д о  
б а в л я е т в б а з у д а н н ы х , п р е д с т а в л я ю щ у ю с о б о й т е к с т о в ы й ф а й л ,
и н ф о р м а ц и ю о т е м п е р а т у р е в о з д у х а . К а ж д а я с т р о к а ф а й л а д а н  
н ы х meteo.txt с о д е р ж и т д а т у и з н а ч е н и е т е м п е р а т у р ы . Е с л и а й  
л а д а н н ы х в т е к у щ е м к а т а л о г е н е т , т о п р о г р а м м а с о з д а е т е г о .
П р о г р а м м а с п р о е к т и р о в а н а т а к , ч т о к н о п к а О К д о с т у п н а т о л ь к о
в т о м с л у ч а е , е с л и п о л е Т е м п е р а тур а с о д е р ж и т д а н н ы е .
П н В т С р Ч т П т С б В с
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
«3» 22 23 24 25 26 27
I 28 .: : •: . •  
С е г о д н я : 2 1 . 0 2 . 2 0 0 5
Т е м п е р а т у р а ; I : : : : : :
д о б а в и т ь I ; : : : : ; : : : : ; ; : . : :
Р и с . 1 . 2 1 . Ф о р м а п р о г р а м м ы П о г о д а
Файлы 63
int f; // дескриптор файла
//' конструктор
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
MonthCalendarl >ShowTodayCircle = false;
MonthCalendarl >Date = Now();
Buttonl >Enabled = false;
}
// изменилось содержимое поле редактирования
void fastcall TForml::EditlChange(TObject *Sender)
{
// кнопка "Добавить" доступна, если в поле редактирования
// находится число. Если в поле символов нет или первый
// символ   "минус", кнопка недоступна
if ( (Editl >Text.Length() == 0 ) ||
( (Editl >Text.Length() ==1) &&
(Editl >Text[l] == ' ') ) )
Buttonl >Enabled = false;
else
Buttonl >Enabled = true;
}
// щелчок на кнопке "Добавить"
void fastcall TForml::ButtonlClick(TObject *Sender)
{
AnsiString st;
/* файл можно открыть в режиме fmCreate, тогда, если
файл существует, он будет открыт для записи,
если файла нет, то он будет создан */
64 Ч асть 1. Примеры и задачи
st в MonthCalendarl >Date.DateString() + " " +
Editl >Text + "\r\n";
/* открыть для записи или создать файл meteo.txt */
if ( FileExists("meteo.txt") )
f = FileOpen("meteo.txt",fmOpenWrite);
else
£ = FileCreatef"meteo.txt"); / / создать файл
if ( f !=  1 )
{
// файл открыт для записи
FileSeek(f,0,2); // установить указатель на конец
// файла
FileWrite(f,st.c_str(),st.Length());
FileClose(f);
Buttonl >Enabled = false;
}
else
{
/* ошибка доступа к файлу: ни открыть,
ни создать не получилось */
ShowMessage("Ошибка доступа к файлу: ни открыть,"
"ни создать не получилось");
// в поле редактирования можно ввести только
// положительное или отрицательное число
void fastcall TForml::EditlKeyPress(TObject *Sender,
char &Key)
Файлы 65
if (( Key >= '0') && (Key <= '9'))
return;
// десятичная точка (запятая)
if ( ( Key == '.') || (Key == ','))
{
Key = ' , ' ;
if ( Editl >Text.Pos(',') != О )
Key = 0;
return;
if ( Key == 8)
return;
if ((Key == ' ') && (Editl >Text.Length() == 0))
// "минус" может быть только первый символом
return;
// все остальные символы запрещены
Key = 0;
}
// щелчок в поле компонента MohthCalendar
void fastcall TForml::MonthCalendarlClick(TObject *Sender)
{
Editl >Text = ""; // очистить поле ввода температуры
Editl >SetFocus(); // установить курсор в поле ввода
// температуры
С р е д н я я т е м п е р а т у р а
П р о г р а м м а С р е д н е м е с я ч н а я те м п е р а тур а (р и с . 1.22) д е м о н с т р и  
р у е т ч т е н и е д а н н ы х и з т е к с т о в о г о ф а й л а . П р о г р а м м а в ы в о д и т в
п о л е к о м п о н е н т а м ен ю с о д е р ж и м о е , с ф о р м и р о в а н н о г о п р о г р а м  
м о й П о го д а ф а й л а meteo.txt, а т а к ж е в ы п о л н я е т е г о о б р а б о т к у —
в ы ч и с л я е т с р е д н е м е с я ч н у ю т е м п е р а т у р у .
66
Ч а с т ь 1. П р и м е р ы и з а д а ч и
  •   • • •   •
19.02.2005  12
20.02.2005  7
21.02.2005  5
22.02.2005  14
23,02.2005  12
24.02.2005  10
]Февраль JJ
Среднее значение:  8,73
j
OK
Рис. 1.22. Окно программы Среднемесячная температура
#include "DateUtils.hpp" // для достпа к MonthOf
/* Функция GetString читает из файла строку символов
от текущей позиции до первого пробела.
значение функции   кол во прочитанных символов */
int GetString(int f, AnsiString *st);
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
ComboBoxl >Style = csDropDownList;
ComboBoxl >Items >Add("Январь");
ComboBoxl >Items >Add("Февраль");
ComboBoxl >Items >Add("MapT");
ComboBoxl >Items >Add("Апрель");
ComboBoxl >Items >Add("Май");
ComboBoxl >Items >Add("MraHb");
ComboBoxl >Items >Add("Июль");
ComboBoxl >Items >Add("Август");
Файлы (э7_
ComboBoxl >Items >Add("Сентябрь");
ComboBoxl >Items >Add("Октябрь");
ComboBoxl >Items >Add("Ноябрь");
ComboBoxl >Items >Add("Декабрь");
// эл ты списка нумеруются с нуля
ComboBoxl >ItemIndex = MonthOf( Now() )  1 ;
}
// щелчок на кнопке ОК
void fastcall TForml::ButtonlClick(TObject *Sender)
{
int h; // дескриптор файла
h = FileOpen("meteo.txt",fmOpenRead);
if ( h ==  1)
{
ShowMessage("Файл данных meteo.txt не найден.");
return;
Memol >Lines >Clear();
// Обработка файла
AnsiString st; // строка, прочитанная из файла
int Is; // длина строки
TDateTime aDate; // дата
float temp; // температура
int nMonth; // месяц
int n = 0; // количество дней (прочитанных строк)
float sum = 0 ; // сумма температур
float sred; // среднее значение
AnsiString buf;
/* каждая строка файла имеет вид:
68 Ч а с т ь 1. П р и м е р ы и з а д а ч и
ДД ММ.ГГГГ Т
где: ДЦ.ММ.ГГГГ  дата; Т   температура */
do
Is = GetString(h,&st); // дата
if ( Is I» 0)
{
nMonth = MonthOf (StrToDate(st))   1; // месяц
buf = st;
Is = GetStringfh,&st); // температура
temp = StrToFloat(st);
if ( nMonth == ComboBoxl >ItemIndex )
sum = sum + temp;
buf = buf + " " + st;
Memol >Lines >Add(buf);
} while ( Is != 0);
FileClose(h);
if ( n != 0 )
sred = sum / n;
Labell >Caption = "Среднее значение: " +
FloatToStrF(sred,ffGeneral,3,2);
else
Labell >Caption = "В Б Д нет информации о "
"температуре за " + ComboBoxl >Text, 
}
Файлы (Ю
// пользователь выбрал другой месяц
void fastcall TForml::ComboBoxlChange(TObject *Sender)
{
Labell >Caption = "";
Memol >Text = "";
// Функция GetString читает из файла строку символов
// от текущей позиции до первого пробела.
// значение функции   кол во прочитанных символов
int GetString(int f, AnsiString *st)
{
unsigned char buf[256]; // строка (буфер)
unsigned char *p = buf; //указатель на строку
i nt n ; / / к о л   в о п р о ч и т а н н ы х б а й т (з н а ч е н и е ф   и FileRead)
i nt len = 0 ; / / д л и н а с т р о к и
// удалить ведущие пробелы
do
n = FileReadff, р, 1);
while ((n != 0) && (*р == ' '));
while (( п != 0 ) && ( *р !=''))
{
if ( *р == '\г')
{
п = F ileRead( f, р , 1) ; / / п р о ч и т а т ь '\ п '
break;
Р++;
n = FileRead(f, p, 1);
70
*р = ' \ 0' ;
i f ( l en != 0 )
s t   > p r i n t f ( "%s ", buf) ;
return l en ;
}
П р о с т а я б а з а д а н н ы х
Ч а с т ь У . П р и м е р ы и з а д а ч и
п р е д с т а в л я е т с о б о й т е к с т о в ы й ф а й л . Д л я р е д а к т и р о в а н и я и
п р о с м о т р а д а н н ы х и с п о л ь з у е т с я к о м п о н е н т st ringGrid (р и с . 1.23).
В н а ч а л е р а б о т ы д а н н ы е а в т о м а т и ч е с к и з а ф у ж а ю т с я в к о м п о н е н т
st ringGrid и з ф а й л а , в к о н ц е —з а п и с ы в а ю т с я в ф а й л .
Ш Р а с х о д ы
: Д о б а в и ть
Рис. 1.23. омпонент StringGrid используется
для просмотра и редактирования данных,
которые находятся в текстовом файле
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TFormfOwner)
// *** настроить таблицу ***
StringGridl >Options
« goEditing // разрешить редактировать
« goTabs; // <Tab>   переход к следующей ячейке
Файлы 7£
// заголовки столбцов
StringGridl >Cells[O][0] = "Дата";
StringGridl >Cells[l][0] = "Сумма";
StringGridl >Cells[2][0] = "К омментарий";
// ширина столбцов
StringGridl >ColWidths[0] = 70;
StringGridl >ColWidths[l] = 70;
StringGridl >ColWidths[2] = 200;
4
// нажатие клавиши в ячейке таблицы
void _fastcall TForml::StringGridlKeyPress(TObject *Sender,
char &Key)
{
int cRow, cCol;
if ( Key == VKJXETURN )
{
// переместить курсор в следующую ячейку
cRow = StringGridl >Row;
cCol = StringGridl >Col;
if ( cCol < StringGridl >ColCount   1 )
StringGridl >Col = StringGridl >Col + 1;
else
if ( cRow < StringGridl >RowCount   1 )
{
StringGridl >Row = StringGridl >Row + 1;
StringGridl >Col = 1 ; /
// добавить строку
void fastcall TForml::ButtonlClick(TObject *Sender)
72
Ч асть 1. Примеры и задачи
// добавить строку в таблицу
StringGridl >Row = StringGridl >RowCount l; // перейти к
// последней строке
StringGridl >RowCount++; // добавить строку
StringGridl >Row =
StringGridl >RowCount l; // перейти к последней строке
// завершение работы программы
void _fastcall TForml::FormCloseQuery(TObject *Sender, bool
&CanClose)
{
int f; // дескриптор файла
/* файл можно открыть в режиме fmCreate, тогда, если
файл существует, н будет открыт для записи,
если файла нет, то он будет создан */
if ( FileExistsC'tabl.grd") )
f = FileOpen("tabl.grd",fmOpenWrite);
else
f = FileCreateC'tabl.grd");
if ( f !=  1 )
// сохранить таблицу в файле
for (int i = 1; i < StringGridl >RowCount;
{ •
AnsiString st = StringGridl >
Rows[i] >DelimitedText +"\r\n
1
FileWriteff,st.c_str(), st.Length());
}
FileClose(f);
Файлы 73
else
// ошибка доступа к файлу
ShowMessage (''Ошибка доступа к файлу");
}
int GetLine(int f, AnsiString *st); // читает строку из файла
// загружает таблицу из файла
void fastcall TForml::FormActivate(TObject *Sender)
{
int f; // дескриптор файла
AnsiString st; // прочитанная строка
bool fl = true; // true   чтение первой строки
if (( f = FileOpen("tabl.grd",fmOpenRead)) ==  1 )
return;
// файл открыт
// загрузить таблицу
while ( GetLine(f, &st) != 0)
{
// добавить строку в таблицу
if ( fl )
{
StringGridl >Rows[StringGridl >Row] >
DelimitedText = st;
fl = false;
}
else
{
StringGridl >RowCount++;
StringGridl >Row = StringGridl >RowCount l;
StringGridl >Rows[StringGridl >Row] >
DelimitedText = st;
74 Ч а с т ь 1. П р и м е р ы и з а д а ч и
}
FileClose(f);
// читает из файла строку символов
// от текущей позиции до символа "новая строка"
// значение функции   кол во прочитанных символов
int GetLine(int f, AnsiString *st)
unsigned char buf[256]; // строка (буфер)
unsigned char *p = buf; // указатель на строку
int n; // кол во прочитанных байт (значение ф и FileRead)
int len = 0; // длина строки
n = FileRead(f, p, 1 );
while ( n != 0 )
if ( *р == '\г')
n = F ileRead( f, р , 1) ; / / п р о ч и т а т ь '\ п '
brea k;
len++;
Р++;
n = FileRead(f, p, 1 );
*р = '\0';
if ( len !=0)
st >printf("%s", buf) ;
return len;
Ф а й л ы 75
Р е д а к т о р т е к с т а
П р о г р а м м а MEdit (Micro Editor) д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м  
п о н е н т о в RichEdit, MainMenu, ToolBar, SpeedButton, OpenDialog И
saveDialog, а т а к ж е о т о б р а ж е н и е и н ф о р м а ц и и о п р о ф а м м е в о т  
д е л ь н о м о к н е . Г л а в н а я ф о р м а п р о ф а м м ы п р и в е д е н а н а р и с . 1.24,
з н а ч е н и я с в о й с т в к о м п о н е н т а RichEdit — в т а б л . 1.6. И н ф о р м а ц и я
о п р о ф а м м е о т о б р а ж а е т с я в о к н е О п р о гр а м м е MEedit, к о т о р о е
п о я в л я е т с я в р е з у л ь т а т е в ы б о р а с о о т в е т с т в у ю щ е й к о м а н д ы в м е н ю
С п р а в к а . Ф о р м а О п р о гр а м м е MEedit п р и в е д е н а н а р и с . 1.25.
SpeedButtoni  
SpeedButton2 •
ToolBar!
MainMenui
RIchEditi •
OpenDialogi —j—!Ц |
SaveDialog!
MEdit   Н о в ы й д о к у м е н т
Ф а й л П а р а м е т р ы С п р а в к а
Р и с . 1.24. Ф о р м а п р о г р а м м ы MEdit
С в о й с т в о
Т а б л и ц а 1.6. З н а ч е н и я с в о й с т в к о м п о н е н т а RichEdit
З н а ч е н и е
Ali gn
Bo r der St yl e
Sc r o l l Ba r s
Wordwrap
alClient
bsNone
ssVertical
true
76 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Image!  
Labeli
Label2 
Beveli  
Buttoni •
Я У О п р о г р а м м е MEdit
M E d i t
П р о с т о й р е д а к т о р т е к с т а . С о з д а н в C++Builder.
Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т о в RichEdit,
MainMenu, ToolBar, SpeedButton, OpenDialog, SaveDialog.
Ok
Рис. 1.25. Форма О программе MEedit
// ***модулъ главной формы (MEd.itFrm.cpp) ***
#include "about.h" // директива вставлена вручную
TForml *Forml;
AnsiString aFileName; // имя редактируемого файла
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
aFileName = "";
/* Задать функцию обработки события Click для
кнопок панели инструментов
Внимание! Сначала надо создать функции обработки
события Click для команд Файл/Открыть и Файл/Сохранить,
затем   вставить в текст следующие две инструкции. */
SpeedButtonl >OnClick = imOpenClick;
SpeedButton2 >0nClick = imSaveClick;
// сохранить текст в файле
bool fastcall TForml::SaveText()
Файлы
// значение функции SaveText равно false, если
// в окне Сохранить пользователь сделал щелчок
// на кнопке Отменить
if ( aFileName == "" )
{
// получить у пользователя имя файла
//SaveDialogl >FileName = "Text.txt";
SaveDialogl >Options « ofPathMustExist
« ofOverwritePrompt;
if ( SaveDialogl >Execute() )
aFileName = SaveDialogl >FileName;
else
return false; // пользователь закрыл окно
// щелчком на кнопке Отменить
}
// записать текст в файл
RichEditl >Lines >SaveToFile(aFileName);
return true;
// команда Файл/Открыть
void fastcall TForml::imOpenClick(TObject *Sender)
{
int r;
// если текст изменен, то его надо сохранить
if ( RichEditl >Modified )
{
// текст изменен
г = MessageDlg("Текст был изменен.\п"
"Сохранить изменения?",
mtWarning, TMsgDlgButtons () « mbYes
« mbNo « mbCancel, 0);
if ( r == mrCancel )
78
Ч а с т ь 1. П р и м е р ы и з а д а ч и
// в окне сообщения пользователь Cancel
// щелкнул на кнопке return;
// здесь пользователь выбрал Yes
if ( ( г == mrYes ) && ( ! SaveText() ))
return;
/ / о т к р ы т ь ф а й л
OpenDialogl >FileName = "*.txt";
OpenDialogl >Options « ofPathMustExist
« ofFileMustExist;
if ( OpenDialogl >Execute() )
{
RichEditl >Lines >LoadFromFile(OpenDialogl >FileName);
RichEditl >Modified = false;
F omnl  > Capt ion = "MEdit   " + O penD ialogl  > F ileName;
aFileName = OpenDialogl >FileName;
// команда Файл/Сохранить
void fastcall TForml::imSaveClick(TObject *Sender)
{
// записать текст в файл
if ( SaveText() )
{
RichEditl >Modified = false;
Forml >Caption = "MEdit   " + aFileName;
// команда Файл/Выход
Файлы 79
void fastcall TForml::imExitClick(TObject *Sender)
{
Forml >Close();
/* возникает событие FormCloseQuery,
функция которого проверяет, внесены ли
изменения в текст */
// пользователь сделал щелчок на кнопке "Закрыть окно"
void fastcall TForml::FormCloseQuery(TObject *Sender,
bool &CanClose)
{
int r;
if ( RichEditl >Modified ) // текст изменен
{
г = MessageDlg("Текст был изменен.\n"
"Сохранить изменения?",
mtWarning, TMsgDlgButtons()
« mbYes « mbNo « mbCancel, 0);
switch ( r )
{
case mrYes : // пользователь щелкнул на кнопке Yes
if ( ! SaveTextO )
CanClose = false; // окно не закрывать
break;
case mrCancel : // пользователь щелкнул на Cancel
CanClose = false; // продолжить работу
// с текстом
80 Ч асть 1. Примеры и задачи
// команда Параметры/Панель инструментов
void fastcall TForml::imToolBarClick(TObject *Sender)
{
// скрыть/отобразить панель инструментов
ToolBarl >Visible = ! ToolBarl >Visible, 
// поставить/убрать "галочку" в меню Параметры/Панель
// инструментов
imToolBar >Checked = ! imToolBar >Checked;
// команда Справка/О программе
void fastcall TForml::imAboutClick(TObject *Sender)
{
TAboutForm *AboutForm;
// свойству Position формы AboutForm надо присвоить
// значение poOwnerForm
AboutForm = new TAboutForm (this);
AboutForm >ShowModal();
delete AboutForm;
/* Модуль формы "О программе" (about.cpp).
Ссылку на этот модуль (директиву iinclude "about.h")
надо поместить в модуль главной формы (MEditFrm.cpp) */
// щелчок на кнопке ОК
void fastcall TAboutForm: :ButtonlClick(TObject *Sender)
ModalResult = mrOk;
Г р а ф и к а
В э т о м р а з д е л е с о б р а н ы п р о г р а м м ы , к о т о р ы е д е м о н с т р и р у ю т
р а б о т у с г р а ф и к о й .
О б щ и е з а м е ч а н и я
• П р о г р а м м а м о ж е т в ы в о д и т ь г р а ф и к у н а п о в е р х н о с т ь о б ъ е к т а
(ф о р м ы и л и к о м п о н е н т а image), к о т о р о й с о о т в е т с т в у е т с в о й  
с т в о (о б ъ е к т ) Canvas.
• Д л я т о г о ч т о б ы н а п о в е р х н о с т и о б ъ е к т а п о я в и л с я г р а ф и ч е  
с к и й э л е м е н т (л и н и я , о к р у ж н о с т ь , п р я м о у г о л ь н и к и т . д .)
и л и к а р т и н к а , н е о б х о д и м о п р и м е н и т ь с о о т в е т с т в у ю щ и й м е  
т о д к с в о й с т в у canvas э т о г о о б ъ е к т а .
• Ц в е т , с т и л ь и т о л щ и н у л и н и й , в ы ч е р ч и в а е м ы х м е т о д а м и
Li n e, E l l i p s e, R ec t a n gl e И Т . Д ., о п р е д е л я е т С В О Й С Т В О Р е п
о б ъ е к т а Canvas.
П Ц в е т з а к р а с к и в н у т р е н н и х о б л а с т е й г е о м е т р и ч е с к и х ф и г у р ,
В ы ч е р ч и в а е м ы х м е т о д а м и Line, Elli p se, Rect angle И Т . Д .,
о п р е д е л я е т с в о й с т в о Brush о б ъ е к т а canvas.
П Х а р а к т е р и с т и к и ш р и ф т а т е к с т а , в ы в о д и м о г о м е т о д о м
Text out о п р е д е л я е т с в о й с т в о F ont о б ъ е к т а canvas.
• О с н о в н у ю р а б о т у п о в ы в о д у г р а ф и к и н а п о в е р х н о с т ь ф о р м ы
д о л ж н а в ы п о л н я т ь ф у н к ц и я о б р а б о т к и с о б ы т и я onPaint .
П р и в е т с т в и е
П р о г р а м м а П р и в е т с т в и е в з а в и с и м о с т и о т в р е м е н и с у т о к в ы в о  
д и т п р и в е т с т в и е Д о б р о е у т р о , Д о б р ы й д е н ь , Д о б р ы й в е ч е р и л и
82
Ч а с т ь 1. П р и м е р ы и з а д а ч и
Д о б р о й н о ч и (р и с . 1.26). Д е м о н с т р и р у е т в ы в о д т е к с т а н а п о в е р х  
н о с т ь ф о р м ы . С л е д у е т о б р а т и т ь в н и м а н и е н а т о , ч т о в н е з а в и  
с и м о с т и о т р а з м е р а ш р и ф т а , к о т о р ы й и с п о л ь з у е т с я д л я в ы в о д а
п р и в е т с т в и я , т е к с т в с е г д а р а з м е щ а е т с я в ц е н т р е о к н а , д а ж е в
т о м с л у ч а е , е с л и п о л ь з о в а т е л ь в о в р е м я р а б о т ы п р о г р а м м ы и з  
м е н и т р а з м е р о к н а .
Р и с . 1.26. В н е а в и с и м о с т и о т р а з м е р а ф о р м ы и ш р и ф т а т е к с т
п р и в е т с т в и я н а х о д и т с я в ц е н т р е о к н а
Graphics::TBitmap *bgp; // фоновый рисунок
AnsiString sMonth[] = ("","января","февраля","марта",
"апреля","мая","июня",
"июля","августа","сентября",
"октября","ноября","декабря"};
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
bgp = new Graphics::TBitmap();
try
bgp >LoadFromFile("sky.tamp");
Г р а ф и к а 83
c a t c h (EF OpenError &e)
// обработка события Paint
void fastcall TForml::FormPaint(TObject *Sender)
{
int h; // текущее время (часы)
AnsiString mes; // сообщение
int wt,ht; // размер (ширина и высота) области
// вывода екста
int х,у; // координаты области вывода текста
h = HourOf( Now() );
if ( h <= 4 ) mes = "Доброй ночи!";
else if ( h < 12 ) mes = "Доброе утро!" ;
else if ( h <= 16) mes = "Добрый день!" ;
else mes = "Добрый вечер!";
Forml >Font >Name = "Times New Roman";
//Forml >Font >Color = clBlue;
Forml >Canvas >Font >Size = 20;
// определить размер области вывода текста
wt • Canvas >TextWidth(mes);
ht = Canvas >TextHeight(mes);
x = (ClientWidth   wt) / 2;
у = ClientHeight / 2   ht;
// фоновая картинка
Canvas >Draw(0,0,bgp);
// чтобы область вывода текста была прозрачной
84
Ч а с т ь 1. П р и м е р ы и з а д а ч и
Canvas >Brush >Style = bsClear;
Canvas >TextOutA(x,y,mes);
у = у + ht; // координата нижней границы
// области вывода текста
// дата и день недели
mes = FormatDateTime("Сегодня d", Ncw() );
mes = mes + " " + sMonth[MonthOf( Now())] + ", "
FormatDateTime("dddd", Now() );
/* размер шрифта вывода даты на 4 пункта меньше
размера шрифта приветствия */
Canvas >Font >Size  = 4;
wt = Canvas~>TextWidth(mes);
ht = Canvas >TextHeight(mes);
x = (ClientWidth   wt) / 2;
У = У + 6;
Canvas >TextOutA(x,у,mes);
// пользователь изменил размер формы
void fastcall TForml::FormResize(TObject *Sender)
{
Forml >Refresh(); // перерисовать окно
О л и м п и й с к и й ф л а г
П р о г р а м м а О л и м п и й с к и й ф л а г (р и с . 1.27) д е м о н с т р и р у е т в ы в о д
г р а ф и к и н а п о в е р х н о с т ь ф о р м ы .
Г р а ф и к а
85
Б ы с т р е е , в ы ш е , с и л ь н е е !
Р и с . 1.27. О к н о п р о г р а м м ы О л и м п и й с к и й ф л а г
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner) \
{
Canvas >Font >Name = "Tahoma";
Canvas >Font >Size = 12;
void fastcall TForml::FormPaint(TObject *Sender)
{
tdefine WB 140 // ширина полотнища
#define HB 80 // высота полотнища
#define D 36 // диаметр колец
i
int x,y;
AnsiString st = "Б ыстрее, выше, сильнее!";
// вычислить координаты левого верхнего угла флага
х = (ClientWidth   WB) / 2;
у = (ClientHeight   HB ) / 2   Canvas >Font >Size;
// полотнище
Canvas >Brush >Color = (TColor) RGB(255,255,255);
Canvas >FillRect( Rect(x,y,x+WB,y+HB) );
86 Ч а с т ь 1. П р и м е р ы и з а д а ч и
int xl = (ClientWidth   Canvas >TextWidth(st)) / 2;
/* Ч тобы область вывода текста не была закрашена цветом фона,
а также чтобы метод Ellipse рисовал окружность, а не круг,
значение свойства Brush >Style должно быть равно bsClear */
Canvas >Brush >Style = bsClear;
// девиз
Canvas >TextOutA(xl,y+HB+6,st);
Canvas >Pen >Width = 2; // ширина колец   два пиксела
// первый ряд колец
/•/ 3.2 * D   ширина области, занимаемой кольцами 1 го
// ряда
х = х + (WB   3.2 * D) / 2;
y = y + ( H B   1 . 6 * D ) / 2 ;
Canvas >Pen >Color = (TColor) RGB(0,0,225); // синий
Canvas >Ellipse(x,y,x+D,y+D);
x = x + 1.1* D, 
Canvas >Pen >Color = clBlack;
Canvas >Ellipse(x,y,x+D,y+D);
// черный
X = x + 1.1 * D;
Canvas >Pen >Color = (TColor) RGB(255,0,0); // красный
Canvas >Ellipse(x,y,x+D,y+D);
// второй ряд колец
x = x   D * 0.55;
у = у + 0.6 * D;
Canvas >Pen >Color = (TColor) RGB(0,128,0); // зеленый
Canvas >Ellipse(x,y,x+D,y+D);
Г р а ф и к а
87
X = X   1.1 * D;
Canvas  > Pen  > Color = (TColor) RG B( 250, 217, 25) ;
Canvas >Ellipse(x,y,x+D,y+D);
// желтый
// пользователь изменил размер окна
void fastcall TForml::FormResize(TObject *Sender)
{
Forml >Refresh();
Д и а г р а м м а
В о к н е п р о г р а м м ы Д и а гр а м м а (р и с . 1.28) о т о б р а ж а е т с я д и а г р а м  
м а , к о т о р а я и л л ю с т р и р у е т и з м е н е н и е к у р с а д о л л а р а . П р о г р а м м а
с п р о е к т и р о в а н а т а к , ч т о , н е з а в и с и м о о т р а з м е р а о к н а , д и а г р а м  
м а р а с п о л а г а е т с я в ц е н т р е о к н а и з а н и м а е т б о л ь ш у ю е г о ч а с т ь ,
д а ж е п о с л е т о г о , к а к п о л ь з о в а т е л ь и з м е н и т р а з м е р о к н а .
И з м е н е н и е к у р с а д о л л а р а
28,1528,15
28,11
28,08
28
27,98
27,94 ^ ^ 5
• d i l l
Р и с . 1.28. О к н о п р о г р а м м ы Д и а г р а м м а
fl oat da t a [ ] = {27.98, 28. 01, 27. 96, 27.96., 28. 11, 28. 08,
28. 00, 27. 98, 28. 15, 28. 15, 28. 11, 27. 94,
27. 86, 27. 88, 27. 95, 27. 95};
88 Ч асть 1. Примеры и задачи
AnsiString Title = "Изменение курса доллара";
void fastcall TForml::FormPaint(TObject *Sender)
{
int x,y;
// заголовок
Canvas >Font >Name = "Tahoma";
Canvas >Font >Size =12;
x = (ClientWidth   Canvas >TextWidth(Title)) /2;
Canvas >Brush >Style = bsClear;
Canvas >TextOutA(x,10,Title);
// гистограмма
int n; // количество столбцов
int wCol; // ширина столбца
#define MC 5 // расстояние между столбиками по горизонтали
n = sizeof(data) / sizeof(float);
wCol = (ClientWidth   (n   1)*MC   20) / n;
x = 10;
у = ClientHeight   20;
// найти минимальное и максимальное значение данных
int min,max; // индекс миним, и максим, элемента
min = 0 ; // пусть первый элемент минимальный
max = 0 ; // пусть первый элемент максимальный
for (int i = 1; i < n; i++)
if (datati] < data[min]) min = i;
Графика
if (data[i] > data[max]) max = i;
/* Если отклонение значений ряда от среднего значения
незначительное, то диаграмма получается ненаглядной.
В этом случае можно построить не абсолютные значения,
а отклонения от минимального значения ряда. */
bool frmin = true; // true   отсчитывать от минимального
int h; // высота столбика
// максимальному значению соответствует
// столбик высотой ClientHeight   90
Canvas >Font >Size  = 2;
for ( int i = 0; i < n; i++)
{
if (I frmin)
h = (ClientHeight   90) * data[i]/data[max];
else
/* Отсчитывать от минимального значения.
Минимальное значение отобразим столбиком
высотой 10 пикселов */
h = (ClientHeight   90) * (data[i]  
data[min])/(data[max]   data[min]) + 10;
Canvas >Brush >Style = bsSolid;
Canvas >Brush >Color = clLime;
Canvas >Rectangle(x,y,x+wCol,y h); // столбик
// подпись данных
AnsiString st;
st = FloatToStrF(data[i],ffGeneral,5,2);
Canvas >Brush >Style = bsClear,  // область вывода
// текста   прозрачная
90 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Can vas  > Text O ut A( x, y  h   20, st ) ;
х = х + wCol + М С ;
// изменился размер окна
void fastcall TForml::FormResize(TObject *Sender)
{
F orml  > Refresh ( ) ; / / о б н о в и т ь с о д е р ж и м о е о к н а
Г р а ф и к
В о к н е п р о г р а м м ы Г р а ф и к (р и с . 1.29) о т о б р а ж а е т с я г р а ф и к и з  
м е н е н и я к у р с а д о л л а р а . С л е д у е т о б р а т и т ь в н и м а н и е , ч т о н а г р а  
ф и к е о т о б р а ж а ю т с я н е з н а ч е н и я , а о т к л о н е н и е о т м и н и м а л ь н о г о
з н а ч е н и я р я д а . Э т о д е л а е т г р а ф и к н а г л я д н ы м д а ж е в т о м с л у ч а е ,
е с л и р а з б р о с з н а ч е н и й (р а з н и ц а м е ж д у м и н и м а л ь н ы м и м а к с и  
м а л ь н ы м з н а ч е н и я м и ) р я д а н е з н а ч и т е л ь н ы й .
WГ р а ф и к
И з м е н е н и е к у р с а д о л л а р а
23,15
28,11 28,11
  i Dl xj
Р и с . 1 . 2 9 . О к н о п р о г р а м м ы Г р а ф и к
Графика 91_
float data[] = {27.98, 28.01, 27.96, 27.96, 28.11, 28.08,
28.00, 27.98, 28.15,28.15, 28.11, 27.94, 27.86, 27.88, 27.95,
27.95};
AnsiString Title = "Изменение курса доллара";
fastcall TForml::TForml(TComponent* Owner)
: TFormfOwner)
void fastcall TForml::FormPaint(TObject *Sender)
{
int n; // количество точек
int x,y; // координаты точки
int dx; // шаг по X
int x0,yO; // координаты левого нижнего угла области
// построения графика
// заголовок
Canvas >Font >Name = "Tahoma";
Canvas >Font >Size = 12, 
хО = (ClientWidth   Canvas >TextWidth(Title)) /2;
Canvas >Brush >Style = bsClear;
Canvas >TextOutA(x0,10,Title);
n = sizeof(data) / sizeof(float);
// найти минимальное и максимальное значение данных
int min,max; // индекс миним. и максим, элемента
min = 0 ; // пусть первый элемент минимальный
max = 0 ; // пусть первый элемент максимальный
for (int i = 1; i < n; i++)
4 3ак. 1241
Ч асть 1. Примеры и задачи
if (datafi] < data[min]) min = i;
if (data[i] > data[max]) max = i;
/* Если отклонение значений ряда от среднего значения
незначительное, то диаграмма помучается ненаглядной.
В этом случае можно построить не абсолютные значения,
а отклонения от минимального значения ряда. */
bool frmin = true; // true   отсчитывать от минимального
// значения
dx= (ClientWidth   20) / (n 1);
Canvas >Font >Size  = 2;
Canvas >Pen >Color = clGreen;
Canvas >Pen >Width = 1;
xO = 10;
yO = ClientHeight   10;
x = xO;
dx= (ClientWidth   20) / (n 1);
for ( int i = 0; i < n; i++)
{
/* максимальному значению соответствует
точка с координатой ClientHeight   90 */
if (! frmin)
у = у0 + (ClientHeight    90) * data [i]/data[max] ;
else
// Отсчитывать от минимального значения
у = yO (ClientHeight   90) * (data[i]  
data[min])/(data[max]   data[min]) 10;
Г р а ф и к а 93
/ / п о с т а в и т ь т о ч к у
Can vas  > Rect an gle( х   2, у   2, х + 2, у + 2) ;
i f ( i != 0)
Can vas  > Lin eTo( x, y) ;
// ** подпись данных **
/* т.к. метод TextOutA изменит положение точки
привязки (точки, из которой рисует метод LineTo, то
после вывода текста надо будет переместить
указатель в точку (х,у) */
if ( ( i == 0) || (data[i] != data[i l]))
AnsiString st;
st = FloatToStrF(data[i] , ffGeneral, 5,2) , 
Canvas >Brush >Style = bsClear; // область вывода
// текста   прозрачная
Canvas >TextOutA(x,y 20,st);
Canvas >MoveTo(x,y);
x += dx;
} • • ' .
// изменился размер окна
void fastcall TForml::FormResize(TObject *Sender)
{
Forml >Refresh(); // обновить содержимое окна
К р у г о в а я д и а г р а м м а
В о к н е п р о г р а м м ы К р уго в а я д и а гр а м м а (р и с . 1.30) о т о б р а ж а е т с я
д и а г р а м м а , к о т о р а я о т о б р а ж а е т д о л ю к а ж д о й к а т е г о р и и в о б щ е й
с у м м е . И с х о д н ы е д а н н ы е м о г у т б ы т ь п р е д с т а в л е н ы к а к в "г о т о в о м
94
Ч а с т ь 1. П р и м е р ы и з а д а ч и
в и д е " (д о л я к а ж д о й к а т е г о р и и в о б щ е й с у м м е ), т а к и б е з п р е д в а  
р и т е л ь н о й о б р а б о т к и . В о в т о р о м с л у ч а е п р о г р а м м а с а м а в ы ч и с л я  
е т д о л ю к а ж д о й к а т е г о р и и . Т а к ж е в ы п о л н я е т с я с о р т и р о в к а и с  
х о д н ы х д а н н ы х .
• Щ ' К р у г о в а я д и а г р а м м а
И с п о л ь з о в а н и е э н е р г и и
Ц Н э ф т ь , 40%
[ | У г о л ь , 24%
| | Р а з , 23%
| А т о м н ы е э л е к т р о с т а н ц и и , 7%
| Г и д р о э л е к т р о с т а н ц и и , 2,5%
§ Л р у г и е , 0,5%
Р и с . 1 . 3 0 . О к н о п р о г р а м м ы К р у г о в а я д и а г р а м м а
#include "Math.h" // для доступа к sin и cos
TForml *Forml;
#undef PEOPLE // диаграмма "Население земли"
#define ENERGY // диаграмма "Источники энергии"
#ifdef PEOPLE
#define HB 6
«define OBR
/* выполнить предварительную бработку исходных данных
(вычислить долю каждой категории в общей сумме) */
// *** исходные данные ***
AnsiString Title = "Население земли";
// значения по каждой категории
Графика 95
float datafHB] = {1.25e9,1е9,274е6,216е6,172е6,146еб};
// доля категории в общей сумме (процент)
float pr[HB];
// *** подписи легенды ***
AnsiString dTitle[HB] = {"Китай","Индия","США",
"Индонезия","Б разилия","Россия"};
// *** цвет для каждой категории ***
TColor cl[HB] = {clLime, clBlue, clMaroon,
clGreen, clYellow, clTeal};
#endif
#ifde£ ENERGY
#define HB 6
#undef OBR
/ * предварительную обработку исходных данных выполнять не
надо   сумма элементов массива data должна быть равна 100 */
// *** исходные данные ***
AnsiString Title = "Использование энергии";
float data[HB] = {0.5,2.5,7,23,24,40}; // значения по каждой
// категории
float pr[HB]; // доля категории в общей сумме (процент)
// *** подписи легенды ***
AnsiString dTitle[HB]   ("Другие",
"Гидро электростанции",
"Атомные электростанции",
"Газ","Уголь","Нефть"};
// *** цвет для каждой категории ***
TColor cl[HB] = {clLime, clBlue, clPurple, clSkyBlue,
clYellow, clTeal};
Ч а с т ь 1, П р и м е р ы и з а д а ч и
# endif
#define R 80 // радиус диаграммы
#define D 160 // диаметр диаграммы
#define TORAD 0.0174532 // коэф. пересчета угла из градусов
// в радианы
/* для пересчета величины угла из градусов в радианы,
величину в градусах надо умножить на Pi/180 */
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
int i,j;
// сортировка исходных данных методом "пузырька"
float bd;
AnsiString bt;
TColor be;.
for (i = 0; i < KB; i ++)
for (j = 0 ; j < HB 1; j++)
if (data[j+l] < datatj])
// поменять местами i ый и i+ 1 ый элементы
bd = datatj];
datatj] = data[j+l];
data[j+l] = bd;
bt = dTitletj];
dTitletj] = dTitle[j+l];
dTitle[j+l] = bt;
be = cl[j];
Графика 97
cl[j+l] = be;
#ifdef OBR
// обработка данных   вычисление доли
// каждой категории в общей сумме
float sum = 0;
for (i = 0; i < HB; i++)
sum += data[i];
for (i = 0; i < HB; i++)
pr[i] = ( data[i] / sum) * 100;
#else
// исходные данные представлены в виде роцентов
for ( i = 0; i < HB;
pr[i] = data[i];
#endif
// процедура обработки события Paint рисует диаграмму
void fastcall TForml::FormPaint(TObject *Sender)
{
int x,y;
int i;
// *** заголовок ***
Canvas >Font >Name = "Tahoma";
Canvas >Font >Size = 12;
x = (ClientWidth   Canvas >TextWidth(Title)) /2;
Canvas >Brush >Style = bsClear;
Canvas >TextOutA(x,15,Title);
98 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// *** круговая диаграмма ***
// здесь х,у   координаты левого верхнего угла
// прямоугольника, в который вписан круг, из которого
// вырезается сектор
х = (ClientWidth   D) /2   R;
у = 15 + Canvas >TextHeight(Title) + 20;
int xO,yO; // центр сектора (круга)
int xl,yl; // координата точки начала дуги
int x2,y2; // координата точки конца дуги
int al,a2; // угол между осью ОХ и прямыми,
// ограничивающими сектор
// int n; // количество категорий (секторов)
// n = sizeof(data) / sizeof(float);
xO = x + R;
yO = у + R;
al = 0; // первый сектор откладываем от оси ОХ
//Canvas >Pen >Style = psClear;
for (int i = 0; i < HB; i++ )
/* из за ошибок округления возможна
ситуация, когда между первым и последним
секторами будет небольшой промежуток или
последний сектор перекроет первый.
Ч тобы этого не было, зададим что граница
последнего сектора совпадает с прямой ОХ */
if (i != НВ 1)
а2 = ( al + 3.6 * pr[i]);
Графика £9
else
а2 = 359;
// координата точки начала дуги
xl = хО + R * cos (а2 * TORAD);
yl = уО + R * sin (а2 * TORAD);
// координата точки конца дуги
х2 = хО + R * cos (al * TORAD);
у2 = уО + R * sin (al * TORAD);
if ( abs(al a2) <= 6 )
Canvas >Pen >Style = psClear;
else
Canvas >Pen >Style = psSolid;
Canvas >Brush >Color =
Canvas >Pie(x,y,x+D,y+D,xl,yl,x2,y2);
al =a2; // следующий сектор рисуем от начала текущего
// легенда
Canvas >Font >Size  = 2;
int dy = Canvas >TextHeight("a");
x = x + D + 40;
у = у + 20;
for (i =HB 1; i >=0; i—)
{
Canvas >Brush >Color = cl[i];
Canvas >Rectangle(x,y,x+40,y+dy);
Canvas >Brush >Style = bsClear;
Canvas >TextOutA(x+50,y,dTitle[i]+
", " + FloatToStrF(pr[i],ffGeneral,2,2)
100 Ч а с т ь 1. П р и м е р ы з а д а ч и
у = у + dy + 10;
void fastcall TForml::FormResize(TObject *Sender)
Forml >Refresh();
П р о с м о т р и л л ю с т р а ц и й
П р о г р а м м а П р о с м о т р и л л ю с тр а ц и й (р и с . 1.31) п о з в о л я е т п р о  
с м о т р е т ь ф а й л ы ф о р м а т а JPEG, н а п р и м е р —ф о т о г р а ф и и . В ы  
б о р р а б о ч е й п а п к и (к а т а л о г а ) в ы п о л н я е т с я в с т а н д а р т н о м о к н е
В ы б о р п а п к и . И л л ю с т р а ц и и м о ж н о п р о с м а т р и в а т ь п о к а д р а м
и л и в р е ж и м е с л а й д   ш о у . Ф о р м а п р о г р а м м ы п р и в е д е н а н а
р и с . 1.32, з н а ч е н и я с в о й с т в к о м п о н е н т а imagei — в т а б л . 1.7.
Ч а с т о т у с м е н ы к а д р о в в р е ж и м е с л а й д   ш о у о п р е д е л я е т з н а ч е н и е
с в о й с т в а int erval т а й м е р а .
ftff П р о с м о т р и л т о с т р а и и й
К а т а л о г I [ Д а л ь ш е ! f ~ н е п р е р ы в н о
Р и с . 1 . 31 . П р о г р а м м а П р о с м о т р и л л ю с т р а ц и й м о ж е т о т о б р а ж а т ь
и л л ю с т р а ц и и в р е ж и м е с л а й д   ш о у
Г р а ф и к а
101
\ ' с Ы П р о с м о т р и л л ю с т р а ц и й
Label!
К а т а л о г Д а л ь ш е Г н е п р е р ы в н о
• • ' I
. : : : © ! : : :
Buttoni Button2 CheckBoxi Imag ei Timerl
Р и с . 1 . 3 2 . о р м а п р о г р а м м ы П р о с м о т р и л л ю с т р а ц и й
Свойство
Таблица 1.7. Значения свойств компонента imagei
Значение
Autosize
Stretch
Proportional
false
false
true
#include <FileCtrl.hpp> // для доступа к SelectDirectory
tinclude <jpeg.hpp> // обеспечивает работу с
// иллюстрациями в формате JPEG
AnsiString aPath; // каталог, в котором находится
// иллюстрация
TSearchRec aSearchRec; // рез т поиска файла
102 Ч а с т ь 1. П р и м е р ы и з а д а ч и
void fastcall TForml::FormCreate(TObject *Sender)
aPath = ""; // текущий каталог   каталог, из которого
// запущена программа
FirstPicture(); // показать картинку, которая есть в
// каталоге программы
// щелчок на кнопке Каталог
void fastcall TForml::ButtonlClick(TObject *Sender)
if (SelectDirectory("Выберите каталог, в котором"
" находятся иллюстрации", "", aPath) ! = О
// пользователь выбрал каталог и щелкнул на ОК
aPath = aPath + " \ \";
if ( FirstPicture() ) // вывести иллюстрацию
CheckBoxl >Enabled = true;
else
Labell >Caption = "В каталоге " + aPath +
" нет jpg иллюстраций." ;
// вывести первую картинку и найти следующую
bool fastcall TForml::FirstPicture()
{
Imagel >Visible •  false; // скрыть компонент I magel
Button2 >Enabled = false; // кнопка Дальше недоступна
CheckBoxl >Enabled = false;
CheckBoxl >Checked = false;
Labell >Caption =
if (FindFirst(aPath+ "*.jpg", faAnyFile, aSearchRec) == 0)
Imagel >Picture >LoadFromFile(aPath+aSearchRec.Name);
Графика 103
Imagel >Visible = true;
Labell >Caption = aPath + aSearchRec.Name;
if ( FindNext(aSearchRec) == 0 ) // найти след. ил.
// иллюстрация есть
Button2 >Enabled = true; // теперь кнопка Дальше
// доступна
CheckBoxl >Enabled = true;
return true;
}
}
return false;
// вывести текущую и найти следующую картинку
bool fastcall TForml::NextPicture()
Imagel >Picture >LoadFromFile(aPath+aSearchRec.Name);
Labell >Caption = aPath + aSearchRec.Name;
if ( FindNext(aSearchRec) != 0 ) // найти след.
// иллюстрацию
// иллюстраций больше нет
Button2 >Enabled = false; // теперь кнопка Дальше
// недоступна
CheekBoxl >Enabled = false;
return false;
return true;
// щелчок на кнопке Дальше
void fastcall TForml::Button2Click(TObject *Sender)
104 Ч а с т ь 1. П р и м е р ы и з а д а ч и
NextPicture();
// щелчок на переключателе "непрерывно"
void fastcall TForml::CheckBoxlClick(TObject *Sender)
{
if ( CheckBoxl >Checked)
Timerl >Enabled = true; // слайд шоу
else
Timerl >Enabled = false; // по кадрам
/ / С и г н а л о т т а й м е р а   в ы в е с т и с л е д у ю щ у ю и л л ю с т р а ц и ю
void fas t cal l TF orml::TimerlTimer( TO bject *Sender)
{
if ( ! NextPicture())
Timerl >Enabled = false;
Часы
В о к н е п р о г р а м м ы Ч а с ы (р и с . 1.33) н а х о д и т с я и з о б р а ж е н и е
и д у щ и х ч а с о в , к о т о р ы е п о к а з ы в а ю т т е к у щ е е в р е м я .
Р и с . 1.33. В о к н е п р о г р а м м ы Ч а с ы
о т о б р а ж а е т с я т е к у щ е е в р е м я
Графика 105
#include "DateUtils.hpp" // для доступа к SecondOf, MinuteOf и
// HourOf
•include "math.h" // для доступа к sin и cos
/* Для вычисления синуса и косинуса можно воспользоваться
функцией SinCos, которая возвращает синус и косинус угла,
заданного в радианах. Ч тобы использовать эту функцию,
в программу надо добавить директиву ^include "Math.hpp" */
tdefine R 75 // радиус циферблата часов
int хО, уО; // центр циферблата
int ahr,amin,asec; // положение стрелок (угол)
fastcall TForml::TForml(TComponent* Owner)
: TFormfOwner)
{
TDateTime t;
// зададим размер формы
// в соответствии с размером циферблата
ClientHeight = (R + 30)*2;
ClientWidth = (R + 30)*2;
хО = R + 3 0;
уО = R + 3 0;
t = Now();
/* Определить положение стрелок.
У гол между метками (цифрами) часов, например, цифрами 2 и
3,  30 градусов.
У гол между метками минут   6 градусов.
У гол отсчитываем от 12 ти часов */
ahr • 90   HourOf(t)*30 (MinuteOf(Today() ) / 12) *6;
106
Ч асть 1. Примеры и задачи
amin = 90   MinuteOf(t)*б;
asec = 90   SecondOf( Today() )*6;
Timerl >Interval = 1000; // период сигнала от таймера
// 1 сек
Timerl >Enabled = true; // пуск таймера
// рисует вектор из точки (х0,у0) под углом а относительно
// оси X. Длинна вектора 1 .
void fastcall TForml: . Vector (int xO, int yO, int a, int 1)
{
// x0,y0   начало вектора
//a   угол между осью х и вектором
// 1   длина вектора
#define TORAD 0.0174532 // коэффициент пересчета угла из
// градусов в радианы
int х, у; // координаты конца вектора
Canvas >MoveTo(x0,у0);
х = хО + 1 * cos(a*TORAD);
у а у0   1 * sin(a*TORAD);
Canvas >LineTo(x,y);
// прорисовка циферблата
void fastcall TForml::FormPaint(TObject *Sender)
int x, у; // координаты маркера на циферблате
int a; // угол между ОХ и прямой (х0,уо) (х,у)
int h; // метка часовой риски
TBrushStyle bs; // стиль кисти
TColor pc; // цвет карандаша
Графика 107
int pw; // ширина карандаша
bs = Canvas >Brush >Style;
pc = Canvas >Pen >Color;
pw = Canvas >Pen >Width;
Canvas >Brush >Style = bsClear;
Canvas >Pen >Width = 1;
Canvas >Pen >Color = clBlack;
a = 0; // метки ставим от 3 х часов, против часовой
// стрелки
h = 3; // угол 0 градусов   это 3 часа
// циферблат
while ( а < 360 )
{
х = хО + R * cos(а * TORAD);
у = хО   R * sin(а * TORAD);
Forml >Canvas >MoveTo(х,у);
if ( (a % 30) •• 0 )
{
Canvas >Ellipse(х 2,у 2,х+3 ,у+3 );
// цифры по большему радиусу
х = хО + (R+15) * cos(a * TORAD);
у = хО   (R+15) * sin(a * TORAD); . •
Canvas >TextOut(x 5,y 7,IntToStr(h));
h  ;
if ( h == 0 ) h = 12;
}
else
Canvas >Ellipse (x. l, y 1, x+1, y+1) ;
a = a + 6; // 1 минута   6 градусов
}
// восстановить карандаш и кисть
108 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Canvas >Brush >Style = bs;
Canvas >Pen >Width = pw;
Canvas >Pen >Color = pc;
DrawClock();
void fastcall TForml::DrawClock(void)
TDateTime t;
// шаг секундной и минутной стрелок 6 градусов,
// часовой   30.
// стереть изображение стрелок
Canvas >Pen >Color = clBtnFace;
Canvas >Pen >Width = 3;
// часовую
Vector(xO,yO, ahr, R 20);
// минутную
Vector(xO,yO, amin, R 15);
// секундную
Vector(xO,yO, asec, R 7);
t = Now();
// новое положение стрелок
ahr = 90   HourOf(t)*30 (MinuteOf(t)% 12)*6;
amin = 90   MinuteOf(t)*6;
asec = 90   SecondOf(t)*6;
// нарисовать стрелки
// часовая стрелка
Canvas >Pen >Width = 3;
Canvas >Pen >Color = clBlack;
Г р а ф и к а
Vect or( xO , yO , a h r, R  20) ;
// минутная стрелка
Canvas >Pen :>Width = 2 ;
Canvas >Pen >Color = clBlack;
Vector(xO,yO, amin, R 15);
// секундная стрелка
Canvas >Pen >Width = 1;
Canvas >Pen >Color = clYellow, 
Vector(xO,yO, asec, R 7);
109
/ / ' с и г н а л о т т а й м е р а
void fas t cal l TF orml::TimerI Timer( TO bject *Sender)
{
DrawClockO ;
П и н г   п о н г
П р о г р а м м а П и н г  п о н г д е м о н с т р и р у е т , к а к м о ж н о с д е л а т ь г р а ф и  
к у и н т е р а к т и в н о й . В о к н е п р о г р а м м ы д в а о б ъ е к т а : м я ч и к и р а  
к е т к а (р и с . 1.34), к о т о р о й п р и п о м о щ и к л а в и ш п е р е м е щ е н и я
к у р с о р а у п р а в л я е т и г р о к . Н а ф о р м е п р о г р а м м ы т о л ь к о о д и н
к о м п о н е н т —Timer.
Р и с . 1 . 3 4 . О к н о п р о г р а м м ы П и н г   П о н г
110 Ч а с т ь 1. П р и м е р ы и з а д а ч и
/ * И г р а "П и н г   п о н г "
Д е м о н с т р и р у е т п р и н ц и п п р о г р а м м и р о в а т ь и н т е р а к т и в н о й
г р а ф и к и */
int х, у; // положение мячика
int dx, dy; // приращение координат
int r; // радиус мячика
TColor cBall; // цвет мячика
TColor cBack; // цвет поля
int wp, hp; // размер поля (формы)
// это переменные для управления движешлем ракетки
int rd; // 0   ракетка не движется; 1   движется
// влево; 2   движется вправо
int rxl, rx2; // координаты X концов ракетки
int ry; // координата Y концов ракетки
int rdx; // шаг перемещения ракетки
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
r = 5; // радиус мячика
x = г; у = 50; // начальное положение мячика
dx = 1;
dy = 1;
cBall = (TColor)RGB(217, 217, 25); // цвет мячика
cBack = (TColor)RGB(33, 94, 3 3 ); // цвет поля
Forml >Color = cBack;
wp = Forml >ClientWidth;
hp = Forml >ClientHeight;
Графика 111
// управление ракеткой
rd = 0; // ракетка на месте (не движется)
rxl = 100;
гх2   12 5;
ry = Forml >ClientHeight   20; // расстояние до нижней
// границы формы 20 пикселей
rdx = 2; // шаг движения ракетки
// настройка таймера
Timerl >Interval = 10;
Timerl >Enabled = true, 
void fastcall TForml::FormPaint(TObject *Sender)
{
// нарисовать ракетку
Forml >Canvas >Pen >Color = clRed;
Forml >Canvas >Rec tangle(rxl, ry, rx2, ry+1) ;
/ / с и г н а л о т т а й м е р а
void fastcall TForml::TimerlTimer(TObject *Sender)
{
// стереть изображение мяча
Forml >Canvas >Pen >Color = сВаск;
Forml >Canvas >Ellipse(x,y,x+r,y+r);
// ** вычислить новее положение мяча **
if ( dx > 0 )
{
// мяч движется вправо
i f ( x + d x + r > w p ) d x =   dx;
112 Ч а с т ь 1. П р и м е р ы и з а д а ч и
e l s e
// мяч движется влево
if ( x + d x   r < O ) d x =  dx;
if ( dy > 0 )
{
// мяч движется вниз
if ((х >= rxl) && (х <= гх2  г) && (у == гу   г   1) )
// мячик попал в ракетку
dy =   dy;
else
if ( у + dy + г > Forml >ClientHeight ) dy =  dy;
}
else
{
// мяч движется вверх
if ((x >= rxl) && (x <= rx2) && (y >= ry   r) && (y <
ry + r) )
{
// Мячик отскочил от нижней стенки и попал в
// ракетку снизу.
// Ч тобы не было дырок в ракетке, перерисуем ее.
Forml >Canvas >Pen >Color = clRed;
Forml >Canvas >Rectangle(rxl, ry, rx2, ry+1);
}
if ( у + dy   r < 0 ) dy =  dy;
}
x += dx;
У += dy;
// нарисовать мяч в новой точке
Forml >Canvas >Pen >Color = cBall;
Forml >Canvas >Ellipse(x,y,x+r,y+r);
Г р а ф и к а Г / 3
/ / *** р а к е т к а ***
i f ( r d != О )
{
/ / и г р о к н а ж а л и у д е р ж и в а е т о д н у и з к л а в и ш
/ / "с т р е л к а в п р а в о " и л и "с т р е л к а в л е в о "
/ / (с м . FormKeyDown )
i f ( r d == 1 )
{
/ / в п р а в о
i f ( rx2 < wp )
{
/ / с т е р е т ь ч а с т ь с л е в а
Forml  >Canvas  >Pen  >Color = cBack, 
Forml  >Canvas  >Rectangle(rxl, ry, rxl + rdx,
ry + 1 );
// дорисовать часть справа
Forml >Canvas >Pen >Color = clRed;
Forml >Canvas >Rectangle (rx2, ry, rx2 + rdx,
ry + 1) ;
rxl += rdx;
rx2 += rdx;
else
// влево
if (rxl > 1 )
{ / / с т е р е т ь ч а с т ь с п р а в а
Forml >Canvas >Pen >Color = cBack;
Forml >Canvas >Rectangle (rx2, ry, rx2   rdx,
ry+1);
// дорисовать слева
Forml >Canvas >Pen >Color = clRed;
Forml >Canvas >Rectangle(rxl   rdx, ry, rxl +
rdx, ry+ 1 );
114
}
}
}
rxl  =
rx2  =
// нажата клавиша
void fastcall
г
TForml
rdx;
rdx;
: : ForrriKeyDown (TOb
WORD &Key, T
Ч асть
ject
1. Примеры и задачи
*Sender,
ShiftState Shift)
i f ( rd != О )
/ / п о л ь з о в а т е л ь у д е р ж и в а е т к л а в и ш у , р а к е т к а д в и ж е т с я
ret urn,  
swit c h ( Key )
case VK_LEFT : // Шаг (стрелка) право
rd = 2; break;
case VK_RIGHT : // Шаг (стрелка) влево
rd = 1; break;
// клавиша отпущена
void fastcall TForml::FormKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
r d = 0;
П о л е т в о б л а к а х
П р о г р а м м а П о л е т в о б л а к а х (р и с . 1.35) д е м о н с т р и р у е т п р и н ц и  
п ы м у л ь т и п л и к а ц и и (д в и ж е н и е о б ъ е к т а н а ф о н е к а р т и н к и ).
Г р а ф и к а 115
Р и с . 1. 35. Л е т я щ и й в о б л а к а х с а м о л е т
И з о б р а ж е н и я ф о н а и о б ъ е к т а (р и с . 1.36) з а г р у ж а ю т с я и з ф а й л а .
О ч е р е д н о й к а д р ф о р м и р у е т с я в п а м я т и (н а п о в е р х н о с т и н е в и  
д и м о г о б и т о в о г о о б р а з а ), а з а т е м в ы в о д и т с я н а п о в е р х н о с т ь
ф о р м ы с н е к о т о р ы м с м е щ е н и е м о т н о с и т е л ь н о п р е д ы д у щ е г о п о  
л о ж е н и я .
Рис. 1.36. Фоновый рисунок и объект
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TFormlOwner)
// загрузить фоновый рисунок из bmp файла
back = new Graphics::TBitmap();
back >LoadFromFile("sky.bmp");
// установить размер клиентской (рабочей) области формы
// в соответствии с размером фонового рисунка
116 Ч а с т ь 1. П р и м е р ы з а д а ч и
ClientWidth = back >Width;
ClientHeight = back >Height;
// загрузить картинку
sprite = new Graphics::TBitmap();
sprite >LoadFromFile("plane.bmp");
sprite >Transparent = true;
// сформировать кадр
kadr в new Graphics::TBitmap();
kadr >LoadFromFile("plane.bmp"); j
// исходное положение самолета
x= 40; // чтобы самолет "вылетал" из за левой границы окна
У=20;
Timerl >Interval = 10;
Timerl >Enabled = true;
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
{
TRect badRect; // положение и размер области фона,
// которую надо восстановить
TRec t f rameRec t ;
badRect = Rect(x,y,x+sprite >Width,y+sprite >Height)
frameRect = Rect(0,0, kadr >Width, kadr >Height);
#ifdef ONCANVAS
Г р а ф и к а 1J7_
/ / *** и з о б р а ж е н и е ф о р м и р у е м н а п о в е р х н о с т и ф о р м ы ***
/ / с т е р е т ь с а м о л е т (в о с с т а н о в и т ь "и с п о р ч е н н ы й " ф о н )
Canvas  > CopyRect ( badRect , back  > Canvas, badRect ) ;
/ / в ы ч и с л и м н о в ы е к о о р д и н а т ы с п р а й т а
х += 2;
if (х > ClientWidth)
{
/ / с а м о л е т у л е т е л з а п р а в у ю г р а н и ц у ф о р м ы
// изменим высоту и скорость полета
х =  20;
у = ran dom( Clien t H eigh t   30) ; / / в ы с о т а п о л е т а
/ / с к о р о с т ь п о л е т а о п р е д е л я е т с я п е р и о д о м в о з н и к н о в е н и я
/ / с о б ы т и я OnTimer, к о т о р ы й , в с в о ю о ч е р е д ь , з а в и с и т
/ / о т з н а ч е н и я с в о й с т в а Interval
T i mer l   > I n t er va l = random( 20) + 10; / / с к о р о с т ь
/ / "п о л е т а " о т 10 д о 29
}
Canvas >Draw(х,у,sprite);
#else
/ / и з о б р а ж е н и е ф о р м и р у е м н а р а б о ч е й п о в е р х н о с т и ,
/ / з а т е м в ы в о д и м н а п о в е р х н о с т ь ф о р м ы
/ / с ф о р м и р о в а т ь о ч е р е д н о й к а д р
/ / с к о п и р о в а т ь ф р а г м е н т ф о н а
kadr  > Canvas  > CopyRect ( frameRect , back  > Can vas, badRect ) ;
/ / н а р и с о в а т ь о б ъ е к т
kadr  > Can vas  > D raw( 0, 0, sprit e) ;
/ / в ы в е с т и к а д р
118 Ч а с т ь 1. П р и м е р ы з а д а ч и
Forml >Canvas >Draw(x,y,kadr);
// вычислим новые координаты спрайта
х += 1;
if (х > ClientWidth)
// самолет улетел за правую границу формы
// изменим высоту и скорость полета
х =  20;
у = random(ClientHeight   3 0); // высота полета
// скорость полета определяется периодом возникновения
// события OnTimer, который, в свою очередь, зависит
// от значения свойства I nterval
Timerl >Interval = random(20) + 10; // скорость
// "полета" от 10 до 29
#endif
}
void fastcall TForml::FormPaint(TObject *Sender)
// восстановить фоновый рисунок
Canvas >Draw(0,0,back); // фон
Б а н н е р
П р о г р а м м а Б е гущ а я с тр о к а (р и с . 1.37) д е м о н с т р и р у е т и с п о л ь з о  
в а н и е б и т о в о г о о б р а з а д л я в ы в о д а б а н н е р а в с т и л е б е г у щ е й
с т р о к и . Б и т о в ы й о б р а з (б е г у щ а я с т р о к а ) з а г р у ж а е т с я и з р е с у р с а
п р о г р а м м ы . Б а н н е р "в ы п л ы в а е т " и з   з а п р а в о й г р а н и ц ы ф о р м ы .
В м о м е н т в р е м е н и , к о г д а б а н н е р д о с т и г а е т ц е н т р а о к н а , д в и ж е  
н и е п р и о с т а н а в л и в а е т с я н а н е с к о л ь к о с е к у н д , а з а т е м —в о з о б  
н о в л я е т с я .
Г р а ф и к а 119
4 Б е гу щ а я с тр о к , у ш и
К у л ь т и н Н .Б . С а м о у ч и т е л ь С + +Builder. Б Х В   П е т е р б '
Р и с . 1.37. В ы в о д б а н н е р а в с т и л е б е г у щ е й с т р о к и
Graphics::TBitmap *banner; // баннер   картинка загружается
// из ресурса
int x,y; // координаты левого верхнего угла области ывода
// баннера
int pause; // время (количество тактов таймера) приостановки
// движения баннера
int xp; // координата приостановки движения баннера
TColor be; // цвет фона баннера
// конструктор формы
fastcall TForml::TForml(TCoinponent* Owner)
: TForm(Owner)
banner = new Graphics::TBitmap();
// загрузить баннер из ресурса
banner >LoadFromResourceID((int)HInstance,101);
be = banner >Canvas >Pixels[O][0]; // цвет фона баннера
x = Forml >ClientWidth; // баннер "выплывает" из за правой
// границы окна
У = 0;
// вычислить координату X точки приостановки движения
// баннера
xp = (Forml >ClientWidth   banner >Width) / 2;
if (xp < 0 ) xp = 0;
120 Ч асть 1. Примеры и задачи
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
if ( pause > 0 )
pause—;
return;
Forml >Canvas >Draw(x,у,banner);
if ( — x == xp)
pause = 100; // остановить движение баннера на
// 100 тактов таймера
if ( х <   banner >Width)
х = Forml >ClientWidth;
// обработка события Paint
void fastcall TForml::FormPaint(TObject *Sender)
TColor b,p;
b = Canvas >Brush >Color,  // сохранить текущий цвет кисти
р = Canvas >Pen >Color; // сохранить текущий цвет
// карандаша
// закрасить область вывода баннера цветом фона баннера
Canvas >Brush >Color = be;
Canvas >Pen >Color = be;
Canvas >Rectangle(O,O,ClientWidth,banner >Height);
Г р а ф и к а
121
Canvas  > Brush  > Color = b ; / / в о с с т а н о в и т ь ц в е т к и с т и
Canvas  > Pen  > Color = p ; / / в о с с т а н о в и т ь ц в е т к а р а н д а ш а
// пользователь изменил размер формы
void fastcall TForml::FormResize(TObject *Sender)
{
/ / в ы ч и с л и т ь к о о р д и н а т у Х т о ч к и п р и о с т а н о в к и д в и ж е н и я
/ / б а н н е р а
х р = ( F orml  > Client Widt h   banner  > Widt h) / 2, 
i f (xp < 0 ) х р = 0;
Ф о н о в ы й р и с у н о к
П р о г р а м м а Ф о н о в ы й р и с ун о к д е м о н с т р и р у е т , к а к м о ж н о п о л у  
ч и т ь ф о н о в ы й р и с у н о к п у т е м м н о г о к р а т н о г о в ы в о д а б и т о в о г о
о б р а з а н а п о в е р х н о с т ь ф о р м ы . Б и т о в ы й о б р а з з а г р у ж а е т с я и з
ф а й л а , н о м о ж е т б ы т ь з а г р у ж е н и и з р е с у р с а . О к н о п р о г р а м м ы и
б и т о в ы й о б р а з , и с п о л ь з о в а н н ы й д л я ф о р м и р о в а н и я ф о н о в о г о
р и с у н к а , п р и в е д е н ы н а р и с . 1.38.
Р и с . 1. 38. Ф о н о в ы й р и с у н о к ф о р м ы (а ) с ф о р м и р о в а н п у т е м
м н о г о к р а т н о г о в ы в о д а б и т о в о г о о б р а з а ( б )
122 Ч асть 1. Примеры и задачи
// начало работы программы
void fastcall TForml::FormCreate(TObject *Sender)
{
back = new Graphics::TBitmap(); // создать объект  
// битовый образ
// загрузить картинку
try // в процессе загрузки картинки возможны ошибки
{
Forml >back >LoadFromFile("canvas.bmp");
}
catch (EFOpenError &e)
{
return, 
// формирует фоновый рисунок
void fastcall TForml::Background() , .
{
int x=0,y=0; // координаты левого верхнего угла битового
// образа
if ( back >Empty ) // битовый образ не был загружен
return;
do {
do {
Canvas >Draw(x,y,back);
x += back >Width;
}
while (x < ClientWidth);
Г р а ф и к а 123
х = 0;
у += back >Height;
}
while (у < ClientHeight);
// обработка события Paint
void fastcall TFormlt:FormPaint(TObject *Sender)
{
Backgroun d( ) ; / / о б н о в и т ь ф о н о в ы й р и с у н о к
5 3ак. 1241
М у л ь т и м е д и а
В э т о м р а з д е л е с о б р а н ы п р о г р а м м ы , к о т о р ы е д е м о н с т р и р у ю т
р а б о т у с о з в у к о м , в и д е о и а н и м а ц и е й .
О б щ и е з а м е ч а н и я
• Р а б о т у с а н и м а ц и е й и з в у к о м о б е с п е ч и в а ю т к о м п о н е н т ы
An imat e И Medi a P la yer .
• К о м п о н е н т MediaPlayer п о з в о л я е т в о с п р о и з в о д и т ь з в у к ,
а н и м а ц и ю и в и д е о .
• К о м п о н е н т Animate п о з в о л я е т в о с п р о и з в е с т и т о л ь к о п р о  
с т у ю , н е с о п р о в о ж д а е м у ю з в у к о м а н и м а ц и ю .
WAV
П р о г р а м м а З в ук и Windows (р и с . 1.39) п о з в о л я е т п р о с л у ш а т ь з в у  
к о в ы е ф а й л ы (ф о р м а т о в WAV, RMI и MID), к о т о р ы е н а х о д я т с я
в к а т а л о г е Windows\ Media.
В ы б е р и т е з в у к о в о й ф а й л
З в у к Mic rosof t wav
ir_begin.wav
ir_end.wav
ir_inter.wav
В ы х о д и з Windows.wav
В х о д в Windows.wav
ringin.wav
ring out wav
st ar t wav
chimes.wav
chord.wav
ding, wav
. . . .
1
W н е п р е р ы в н о
Р и с . 1.39. П р о г р а м м а З в у к и Windows
п о з в о л я е т п р о с л у ш а т ь з в у к о в ы е ф а й  
л ы , к о т о р ы е н а х о д я т с я в к а т а л о г е
WindowsVMedia
М у л ь т и м е д и а 125
С п и с о к ф а й л о в ф о р м и р у е т с я в н а ч а л е р а б о т ы п р о ф а м м ы . Е с л и
п е р е к л ю ч а т е л ь н е п р е р ы в н о в ы б р а н , т о п о с л е в о с п р о и з в е д е н и я
т е к у щ е г о ф а й л а а в т о м а т и ч е с к и а к т и в и з и р у е т с я в о с п р о и з в е д е н и е
с л е д у ю щ е г о . Ф о р м а п р о ф а м м ы п р и в е д е н а н а р и с . 1.40.
Label2
ListBoxi •
CheckBoxi
MediaPlayeri 
З в у к и Windows
В ы б е р и т е з в у к о в о й ф а й л •
•V н е п р е р ы в н о
• I
Р и с . 1.40. Ф о р м а п р о г р а м м ы З в у к и Windows
/ / н а ч а л о р а б о т ы п р о г р а м м ы
void fas t cal l TF orml::F ormCreat e( TO bject *Sender)
{
char *wd; // каталог Windows
wd = (char*)AllocMem(MAX_PATH);
GetWindowsDirectory(wd,MAX_PATH);
SoundPath = wd;
// звуковые файлы находятся в подкаталоге Media
SoundPath = SoundPath + "WMediaW" ;
// сформируем список звуковых файлов
126 Ч а с т ь 1. П р и м е р ы и з а д а ч и
TSearchRec sr;
if (FindFirst( SoundPath + "*.wav", faAnyFile, sr) == 0 )
// найден файл с расширением WAV
ListBoxl >Items >Add(sr.Name); // добавим имя файла
// в список
// еще есть файлы с расширением WAV ?
while (FindNext(sr) == 0 )
ListBoxl >Items >Add(sr.Name);
if (FindFirstf SoundPath + "*.mid", faAnyFile, sr) == 0 )
{
// найден файл с расширением MI D
ListBoxl >Items >Add(sr.Name); // добавим имя файла
// в список
// еще есть файлы с расширением MI D ?
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 >Items >Count != 0)
М у л ь т и м е д и а 727
{
Label2 >Caption = ListBoxl >Items >Strings[1];
ListBoxl >ItemIndex = 0;
MediaPlayerl >FileName = SoundPath + ListBoxl >
Items >Strings[1] ;
MediaPlayerl >Qpen();
MediaPlayerl >Play();
// щелчок на элементе списка
void fastcall TForml::ListBoxlClick(TObject *Sender)
{
if ( (CheckBoxl >Checked) &&
( MediaPlayerl >Mode == mpPlaying ) )
return;
Label2 >Caption = ListBoxl >Items >
Strings[ListBoxl >ItemIndex];
MediaPlayerl >FileName = SoundPath + Label2 >Caption;
MediaPlayerl >Open();
if ( ! CheckBoxl >Checked) •
MediaPlayerl >Notify = false;
MediaPlayerl >Play();
/* событие Notify возникает в момент завершения оспроизведения
звукового файла, если перед активизацией метода Play значение
свойства Notify равно true */
void fastcall TForml::MediaPlayerlNotify(TObject *Sender)
{
if ( ListBoxl >ItemIndex < ListBoxl >Items >Count )
{
ListBoxl >ItemIndex = ListBoxl >ltemlndex + 1;
128 Ч а с т ь 1. П р и м е р ы з а д а ч и
Label2 >Caption = ListBoxl >Items >
Strings[ListBoxl >ItemIndex];
MediaPlayerl >FileName = SoundPath + Label2 >Caption;
MediaPlayerl >Open()j
if ( ! CheckBoxl >Checked)
MediaPlayerl >Notify = false;
MediaPlayerl >Play();
M P 3 P l a y e r
П р о г р а м м а М Р З Player (р и с . 1.41) п о з в о л я е т п р о с л у ш а т ь м у з ы  
к а л ь н ы е ф а й л ы ф о р м а т а М Р З .
'S» М Р З Player
Thoug hts o f a dying at heist . mp3
Thoughts ot a wina atheret.mc3
Butterflies and Huiricanes.mp3
Muse • Map of your head.mp3
Hypernnusic.mp3
Hyper chondriac music. mp3
Endlessly. mp3
Stockholm syndrome.mp3
Sinn fm flhsnluhnn mn3
2 : 5 7
Р и с . 1. 41. В о к н е п р о г р а м м ы о т о б р а ж а е т с я
в р е м я в о с п р о и з в е д е н и я о м п о з и ц и и ,
е с т ь в о з м о ж н о с т ь р е г у л и р о в к и г р о м к о с т и
Ф о р м а п р о г р а м м ы п р и в е д е н а н а р и с . 1.42. С л е д у е т о б р а т и т ь в н и  
м а н и е , ч т о н а ф о р м е н е т к о м п о н е н т а MediaPlayerl, о н с о з д а е т с я в
н а ч а л е р а б о т ы п р о г р а м м ы (д е л а е т э т о к о н с т р у к т о р ф о р м ы ). В ы б о р
п а п к и (к а т а л о г а ), в к о т о р о м н а х о д я т с я ф а й л ы ф о р м а т а М Р З , о с у  
щ е с т в л я е т с я в с т а н д а р т н о м д и а л о г о в о м о к н е В ы б о р п а п к и , к о т о р о е
с т а н о в и т с я д о с т у п н ы м в р е з у л ь т а т е щ е л ч к а н а к н о п к е Eject
(speedButtoni). С л е д у е т о б р а т и т ь в н и м а н и е н а т о , ч т о б и т о в ы е
Образы КНОПОК SpeedButton2 И SpeedButton4 содержат ПО ДВЭ ИЗО 
б р а ж е н и я к н о п к и — д о с т у п н о й и н е д о с т у п н о й , а к н о п о к
М у л ь т и м е д и а 1 2 9
speedButtoni и speedButton3 —о д н о (д о с т у п н о й ). Т е м н е м е н е е
к а р т и н к а н а к н о п к е Play/ Stop (speedButton3) и з м е н я е т с я — в
н у ж н ы й м о м е н т з а г р у ж а е т с я и з р е с у р с а . Р е с у р с п р о г р а м м ы с о д е р  
ж и т т р и б и т о в ы х о б р а з а : "д о с т у п н а я к н о п к а Play", "д о с т у п н а я
к н о п к а Stop" и "н е д о с т у п н а я к н о п к а Play". И д е н т и ф и к а т о р ы э т и х
б и т о в ы х о б р а з о в , с о о т в е т с т в е н н о , 101, 102 и 103. З н а ч е н и я с в о й с т в
к о м п о н е н т а т г а с к в а п п р и в е д е н ы в т а б л . 1.8.
ListBoxi
SpeedButtoni 
Ф М Р З Player
Label l •
• TrackBart
  Timer!
SpeedButton2 SpeedButton3 Speedbutton4 Label2 LabeH
Р и с . 1 . 4 2 . о р м а п р о г р а м м ы М Р З Player
С в о й с т в о
Т а б л и ц а 1 . 8. З н а ч е н и я с в о й с т в к о м п о н е н т а TrackBarl
З н а ч е н и е
Orientation
Мах
Min
ThumbLength
TickMarks
Frequency
ShowHint
Hint
vrVertical
0
 65535
10
tmBoth
8192
true
Громкость
130 Ч а с т ь 1. П р и м е р ы з а д а ч и
TForml *Forml;
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
/ * С о з д а т ь к о м п о н е н т MediaPlayer.
О б ъ я в л е н и е MediaPlayerl н а х о д и т с я в о б ъ я в л е н и и
ф о р м ы (с м . mp3main.h), т а м ж е н а х о д и т с я с с ы л к а
н а MPlayer.hpp (д и р е к т и в а § include "MPlayer.hpp" ) .
*/
MediaPlayerl • new TMediaPlayer(Forml >Handle);
#include "FileCtrl.hpp" // для доступа к TSearchRec
AnsiString SoundPath; // путь к МРЗ файлам
int min,sec; // время воспроизведения (минуты, секунды)
int mode = 0 ; // 0   режим "Стоп"
// 1   режим "Воспроизведение"
/* Процедуре vaweOutSetVolume в качестве параметра
передается двойное слово, старший байт оторого
определяет громкость левого канала, младший   правого.
Определив таким образом тип TVolume, имеется возможность
независимой регулировки громкости каждого канала.
Максимальной громкости канала соответствует значение
OxFFFF.
*/
union TVolume{
unsigned long Volume;
struct
Word Left;
М у л ь т и м е д и а
Word Right;
};
} volume;
// начало работы программы
void fastcall TForml::FormCreate(TObject *Sender)
{
PlayList("");
// установить движок регулятора громкости в соответствии
// с текущем уровнем, установленным в системе
waveOutGetVolume(0,&volume.Volume);
TrackBarl >Position =   volume.Left;
ListBoxl >Color = (TColor)RGB(56,176,222);
/ / ф о р м и р у е т с п и с о к М Р З   ф а й л о в , н а х о д я щ и х с я в у к а з а н н о м
/ / к а т а л о г е
void __fastcall TForml::PlayList(AnsiString path)
{
/ * с т р у к т у р а SearchRec с о д е р ж и т и н ф о р м а ц и ю о ф а й л е ,
удовлетворяющем условию поиска */
TSearchRec SearchRec;
ListBoxl >Clear();
/ / с ф о р м и р о в а т ь с п и с о к М Р З   ф а й л о в
if ( FindFirst(path + "*.mp3", faAnyFile, SearchRec)!= 0 )
{
// в выбранном каталоге нет МРЗ файлов
SpeedButton2 >Enabled = false;
SpeedButton3 >Glyph >
LoadFrornResourceID( (int)HInstance, 103) ;
SpeedButton4 >Enabled = false;
132 Ч а с т ь 1. П р и м е р ы з а д а ч и
Labell >Caption
return, 
// в каталоге есть файл с расширением трЗ
// добавим имя этого файла в список
ListBoxl >Items >Add(SearchRec.Name);
// пока в каталоге есть другие файлы с расширением wav
while (FindNext(SearchRec) •• 0)
ListBoxl >Iterns >Add(SearchRec.Name);
ListBoxl >ItemIndex = 0;
Labell >Caption = ListBoxl >Items >
Strings [ListBoxl >ItemIndex];
SpeedButton2 >Enabled = false;
if (ListBoxl >Coxmt == 1)
SpeedButton4 >Enabled = false;
else
SpeedButton4 >Enabled = true;
SpeedButton3 >Glyph >
LoadFromResourcelDf(int)HInstance,101);
// активизировать воспроизведение МРЗ файла, имя которого
// выделено в списке ListBox
void fastcall TForml::Play()
{
Labell >Caption = ListBoxl >Items >
Strings [ListBoxl >ItemIndex];
MediaPlayerl >FileName = SoundPath +
ListBoxl >Items >Strings [ListBoxl >ItemIndex],
MediaPlayerl >Open();
MediaPlayerl >Play();
М у л ь т и м е д и а 133
min = 0;
sec = О;
Timerl >Enabled = true;
// остановить воспроизведение
void fastcall TForml::Stop()
{
MediaPlayerl >Stop();
Timerl >Enabled = false;
Label2 >Caption = "0";
Label4 >Caption • "00";
// щелчок на кнопке Play/Stop
// ( картинки для кнопок лучше загружать из ресурса )
void fastcall TForml::SpeedButton3Click(TObject *Sender)
{
if ( mode == 1 )
{
SpeedButton3 >Glyph >
LoadFromResourcelD((int)Hlnstance, 101)
SpeedButton3 >Hint = "Воспроизведение";
StopO;
mode = 0;
}
else {
SpeedButton3 >Glyph >
LoadFromResourcelD((int)HInstance, 102);
SpeedButton3 >Hint = "Стоп";
Play();
mode = 1;
134 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
{
// индикация времени воспроизведения
if ( sec < 59 )
{
sec++;
if ( sec < 10)
Label4 >Caption = "0" + IntToStr(sec);
else
Label4 >Caption = IntToStr(sec);
}
else
sec = 0;
min++;
Label2 >Caption = IntToStr(min)
Label4 >Caption = "00";
// завершено воспроизведение текущего файла?
if ( MediaPlayerl >Position < MediaPlayerl~>Length )
// воспроизведение текущей композиции не завершено
return;
// воспроизведете текущей композиции завершено
Stop();
if ( ListBoxl >ItemIndex < ListBoxl >Count   1 )
ListBoxl >ItemIndex += 1;
PlayO; // активизировать воспроизведение следующего
// МРЗ файла
М у л ь т и м е д и а 135
if ( ListBoxl >ItemIndex == ListBoxl >Count   1 )
SpeedButton4 >Enabled = false;
}
else {
// закончено воспроизведение оследнего МРЗ файла
SpeedBut ton3 >Glyph >
LoadFromResourcelD((int)HInstance, 101);
SpeedButton3 >Hint = "Воспроизведение";
mode = 0;
// щелчок на кнопке "К следующему файлу"
void fastcall TForml::SpeedButton4click(TObject *Sender)
{
if ( mode == 1 )
Stop(); // остановить воспроизведение текущей
// композиции
ListBoxl >ItemIndex += 1;
Labell >Caption = ListBoxl >
Items >Strings [ListBoxl >ItemIndex];
// проверить и, если надо, изменить состояние
// кнопок перехода к следующему и предыдущему файлу
if ( ListBoxl >ItemIndex == ListBoxl >Count   1)
SpeedButton4 >Enabled = false, 
if ( ! SpeedButton2 >Enabled )
SpeedButton2 >Enabled = true;
if ( mode == 1)
PlayO; // активизировать воспроизведение следующей
// композиции
136 Ч асть 1. Примеры и задачи
// щелчок на кнопке "К предыдущему файлу"
void fastcall TForml::SpeedButton2Click(TObject *Sender)
{
if ( mode == 1 )
Stop(); // остановить воспроизведение текущей
// композиции
ListBoxl >ItemIndex  = 1;
Labell >Caption = ListBoxl >Iteitis >
Strings [ListBoxl >ItemIndex];
// проверить и, если надо, изменить состояние
// кнопок перехода к следующему и предыдущему файлу
if ( ! SpeedButton4 >Enabled )
SpeedButton4 >Enabled = true;
if ( ListBoxl >ItemIndex == 0 )
SpeedButton2 >Enabled = false;
if (mode == 1 )
PlayO; // активизировать воспроизведение предыдущей
// композиции
iinclude "FileCtrl.hpp"
// щелчок на кнопке Eject   выбор каталога
void fastcall TForml::SpeedButtonlClick(TObject *Sender)
AnsiString dir;
if ( SelectDirectory("Выберите каталог","",dir) )
if ( mode = = 1 ) // режим "Воспроизведение"
Stop () ;
Мультимедиа 737
SpeedButton3 >Glyph >
LoadFroirtResourcelD((int)HInstance, 101);
SpeedButton3 >Hint = "Воспроизведение";
Stop();
mode = 0;
}
SoundPath = dir + "\\";
PlayList(SoundPath);
// щелчок на имени файла (композиции)
void fastcall TForml::ListBoxlClick(TObject *Sender)
{
if ( MediaPlayerl >Mode ==2) // плеер в режиме
воспроизведения
{
Stop () ,  // остановить воспроизведение текущей
композиции
Play(); // активизировать оспроизведение выбранной
композиции
// изменить, если надо, состояние кнопок
// перекода к предыдущей и следующей композиции
if (ListBoxl >ItemIndex == 0 )
SpeedButton2 >Enabled = false;
else
SpeedButton2 >Enabled = true;
if (ListBoxl >ItemIndex == ListBoxl >Count  1 )
SpeedButton4 >Enabled = false;
else
SpeedButton4 >Enabled = true;
•include "mmsystem.hpp"
138 Ч асть 1. Примеры и задачи
// пользователь изменил положение регулятора громкости
void fastcall TForml::TrackBarlChange(TObject *Sender)
{
volume.Left =   TrackBarl >Position, 
volume.Right =   TrackBarl >Position;
waveOutSetVolume(0,volume.Volume);
В о с п р о и з в е д е н и е MIDI
П р о г р а м м а У с п е ть з а 60 с е к ун д , е е ф о р м а п р и в е д е н а н а р и с . 1.43,
д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а MediaPlayer д л я в о с  
п р о и з в е д е н и я з в у к а в ф о р м а т е MIDI. М е л о д и я в о с п р о и з в о д и т с я
"п о к р у г у ", д о т е х п о р , п о к а п о л ь з о в а т е л ь н е у г а д а е т ч и с л о и л и
н е и с т е ч е т в р е м я , о т в е д е н н о е н а р е ш е н и е з а д а ч и .
И З У с п е т ь з а 60 с е к у н д
В ы д о л * * ! у г а д а т ь т р е х з н а ч н о е ч и с л о з а 60 с е к у н д ,
В в е д и т е ч и с л о и щ е л к н и т е н а к н о п к е О К
и л и н а ж м и т е к л а в и ш у <Enter>
OK
О с т а л о с ь   60 • с е к •
• I I • • ! Н ! • «М
Timeri Label4 MediaPlayeri
Р и с . 1.43. Ф о р м а п р о г р а м м ы с п е т ь з а 60 с е к у н д
int pw; // "секретное" число
int rem = 60; // остаток времени на выполнение задания
// начало работы программы
void fastcall TForml::FormCreate(TObject *Sender)
{
TSearchRec sr;
i f ( F i n dF i r st ( "* . mi d", f a An yF i l e, sr) == 0)
М у л ь т и м е д и а 739
{
MediaPlayerl >FileName = sr.Name;
MediaPlayerl >Open();
MediaPlayerl >Play();
Randomize();
pw = RandomRange(100,999); // "секретное" число
// проверяет, правильное ли число ввел игрок
void fastcall TForml::isRight(void)
{
if ( StrToInt(Editl >Text) == pw )
{
Timerl >Enabled = false;
Buttonl >Enabled = false;
Editl >Enabled = false;
MediaPlayerl >Stop();
// аплодисменты!
//PlaySound("Applause.wav", 0, SND_ASYNC);
ShowMessage("Поздравляю!\пВы угадали число за " +
IntToStr(60   rem)+ " сек");
// Нажатие клавиши в поле редактирования
void fastcall TForml::EditlKeyPress(TObject *Sender, char
&Key)
{
i f ( ( Edi t l  > T ext . Len gt h ( ) < 3) &&
( (Key >= ' 0' ) Scb (Key <= ' 9' ) ) )
return;
if ( Key •  VK_RETURN)
140
if
//
Key
isRight();
return;
( Key == VK.
// проверить, правил
// ввел пользователь
_ВАСК) return;
остальные символы запрещены
= 0;
Ч асть 1.
ъное ли
Примеры и задачи
число
// Содержимое поля редактирования изменялось
void fastcall TForml::EditlChange(TObjееt *Sender)
{
// кнопка OK доступна только в том случае,
// если в поле редактирования три символа (цифры)
if ( Editl >Text.Length() == 3)
Buttonl >Enabled = true, 
else
Buttonl >Enabled = false;
// щелчок на кнопке OK
void fastcall TForml::ButtonlClick(TObject *Sender)
{
isRight(); // проверить, правильное ли число ввел
// пользователь
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
rem  ;
Label4 >Caption = IntToStr(rem);
М у л ь т и м е д и а Ы 1_
i f (rem == 0 )
{
// время, отведенное на решение задачи, истекло
Timerl >Enabled = false;
Editl >Enabled = false;
Buttonl >Enabled = false;
MediaPlayerl >Stop();
ShowMessage("К сожалению, Вы не справились с "
"поставленной задачей\п"
"\"Секретное\" число   " + intToStr(pw) );
// состояние плеера изменилось
void fastcall TForml::MediaPlayerlNotify(TObject *Sender)
{
/* Если плеер воспроизводит файл и значение свойства
Notify равно true (метод Play по умолчанию присваивает
свойству Notify значение true), то в момент окончания
воспроизведения озникает событие Notyfy */
if (Timerl >Enabled)
/* Длительность мелодии меньше времени, отведенного
на решение задачи. Проиграть еще раз. */
MediaPlayerl >Play();
}
// завершение работы программы
void fastcall TForml::FormClose(TObject *Sender,
TCloseAction SAction)
{
Timerl >Enabled=false ;
MediaPlayerl >Stop();
MediaPlayerl >Close();
142 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Compact Disk Player (в е р с и я 1 )
П р о г р а м м а Compact Disk Player п о з в о л я е т п р о с л у ш а т ь к о м п а к т  
д и с к . П о с л е з а п у с к а и л и п о с л е т о г о , к а к в д и с к о в о д б у д е т в с т а в  
л е н к о м п а к т   д и с к , в о к н е п р о г р а м м ы о т о б р а ж а е т с я к о л и ч е с т в о
т р е к о в д и с к а и о б щ е е в р е м я з в у ч а н и я CD, в п р о ц е с с е в о с п р о и з  
в е д е н и я —н о м е р в о с п р о и з в о д и м о г о т р е к а , е г о д л и н а (в р е м я ) и
в р е м я о т н а ч а л а в о с п р о и з в е д е н и я (р и с . 1.44).
©Compact Di sc Player
Т р е к 1. Д л и т е л ь н о с т ь 3:08
2:47
Р и с . 1 . 4 4 . В о к н е п р о г р а м м ы о т о б р а ж а е т с я и н ф о р м а ц и я о
в о с п р о и з в о д и м о м т р о к е
О т л и ч и т е л ь н о й о с о б е н н о с т ь ю п р о г р а м м ы я в л я е т с я т о , ч т о о н а
к о н т р о л и р у е т н а л и ч и е д и с к а в д и с к о в о д е и е г о т и п . Ф о р м а п р о  
г р а м м ы п р и в е д е н а н а р и с . 1.45 (к о м п о н е н т MediaPiayer н а х о  
д и т с я в н е р а б о ч е й о б л а с т и ф о р м ы ).
Timer! Shape! Label! Label2
SpeedButtoni SpeedButton2 SpeedButton3
Р и с . 1 . 4 5 . Ф о р м а п р о г р а м м ы Compact Disk Playe r ( в е р с и я 1)
// картинки для кнопки Play/Stop
Graphics::TBitmap *bmPlay; // Play
Graphics::TBitmap *tmStop; // Stop
_fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
Мультимедиа 143
{
fcmPlay = new Graphics::TBitmap();
hmStop = new Graphics::TBitmap();
// загрузить картинки для кнопки Play/Stop
fcmPlay >LoadFromResourceID((int)HInstance,101);
fcmStop >LoadFromResourceID((int)HInstance,102);
// отобразить картинку
SpeedButton2 >Glyph >Assign(bmPlay);
} I
void fastcall TForml::FormCreate(TObject *Sender)
{
MediaPlayer >Notify = true; // разрешить событие Notify
// эти макросы обеспечивают перевод интервала времени
// выраженного в миллисекундах, в минуты и секунды
^define MINUTE(ms) ((ms/1000)/60)
#define SECOND(ms) ((ms/1000)%60)
// выводит в поле Label 1 информацию о текущем треке
void fastcall TForml::TrackInfo()
{
int ms; // время звучания трека, мсек
AnsiString st;
Track = MCI_TMSF_TRACK(MediaPlayer >Positicn);
MediaPlayer XFimeFonnat = tfMilliseconds;
ms = MediaPlayer >TrackLength[Track];
MediaPlayer >TimeFormat = tfTMSF;
st = IntToStr(SECOND(ms));
if ( st.LengthO •• 1)
144 Ч а с т ь 1. П р и м е р ы и з а д а ч и
s t = "О " + s t ;
st = "Трек "+ IntToStr(Track) +
". Длительность "+ IntToStr(MINUTE(ms)} + ":" + st;
Labell >Caption = st;
}
// изменение состояния плеера
void fastcall TForml::MediaPlayerNotify(TObject *Sender)
{
switch ( MediaPlayer >Mode )
{
case mpOpen: // пользователь открыл дисковод
{
SpeedButtonl >Enabled = false;
SpeedButton2 >Glyph >Assign(bmPlay);
SpeedButton2 >Tag = 0;
SpeedButton3 >Enabled = false;
Label2 >Caption = "00:00";
/* по сигналу от таймера будем проверять
состояние дисковода */
Timer >Enabled = True;
}
}
MediaPlayer >Notify = true;
// сигнал от таймера: вывести номер трека
// и время воспроизведения
void fastcall TForml::TimerTimer(TObject *Sender)
{
i n t t r k ; / / т р е к
М у л ь т и м е д и а 745
int min, sec; // время
AnsiString st;
if ( MediaPlayer >Mode == mpPlaying ) // Воспроизведение
{
// получить номер воспроизводимого трека и
trk = MCI_TMSF_TRACK(MediaPlayer >Position);
if ( trk != Track ) // произошла смена трека
{
Tracklnfо();
Track = trk;
if ( Track > 1 )
SpeedButtonl >Enabled = true; // доступна нопка
// "пред.трек"
if ( Track == MediaPlayer >Tracks)
SpeedButton3 >Enabled = false; // кнопка
// "след.трек"
// едоступна
// вывод информации о воспроизводимом треке
min = MCI_TMSF_MINUTE(MediaPlayer >Position);
sec = MCI_TMSF_SECOND(MediaPlayer >Position);
st.printf("%d:%.2d",min,sec);
Label2 >Caption = st;
return;
/ * Е с л и д и с к о в о д о т к р ы т и л и в н е м н е т
AudioCD, т о Mode == mpOpen.
Ж д е м д и с к , т .е . д о т е х п о р п о к а н е б у д е т
Mode == mpStopped + к о л   в о т р е к о в > 1 */
if ( (MediaPlayer >Mode == mpStopped) &&
(MediaPlayer >Tracks > 1) )
146 Ч а с т ь 1. П р и м е р ы и з а д а ч и
{
// диск вставлен
Timer >Enabled = false;
SpeedButton2 >Enabled = true, ;
SpeedButton2 >Tag = 0;
SpeedButton3 >Enabled = true;
MediaPlayer >Notify = true;
// получить информацию о времени звучания CD
MediaPlayer >TimeFormat = tfMilliseconds;
int ms = MediaPlayer >Length;
AnsiString st = "Audio CD. Время звучания: ";
st = st + IntToStr(MINUTE(ms));
st = st + ":" + IntToStr(SECOND(ms));
Labell >Caption = st;
MediaPlayer >TimeFormat = tfTMSF;
Labell >Visible = true;
Track = 0;
return;
// дисковод открыт или в дисководе не AudioCD
if (( MediaPlayer >Mode == mpOpen ) ||
(MediaPlayer >Mode == mpStopped) &&
(MediaPlayer >Tracks == 1))
{
Labell >Caption = "Вставьте AudioCD" , 
if ( Labell >Visible )
Labell >Visible = false;
else Labell >Visible = true;
Мультимедиа 147
// пользователь закрыл окно программы
void fastcall TForml::FormClose(TObject *Sender,
TCloseAction &Action)
{
MediaPlayer >Stop();
MediaPlayer >Close();
// предыдущий трек
void fastcall TForml::SpeedButtonlClick(TObject *Sender)
{
MediaPlayer >Previous(); //в начало текущего трека
MediaPlayer >Previous(); // в начало предыдущего трека
if ( MCI_TMSF_TRACK(MediaPlayer >Position) == 1 )
SpeedButtonl >Enabled = false;
if ( ! SpeedButton3  >Enabled )
SpeedButton3  >Enabled = true, 
TracklnfoO ;
Label2 >Caption = "0:00" ;
// следующий трек
void fastcall TForml::SpeedButton3 Click(TObject *Sender)
{
MediaPlayer >Next();
// если перешли к последнему треку, то кнопку
// Next сделать недоступной
if ( MCI_TMSF_TRACK(MediaPlayer >Position) ==
MediaPlayer >Tracks )
SpeedButton3  >Enabled = false, 
if (!SpeedButtonl >Enabled ) SpeedButtonl >Enabled = true;
Tracklnfо();
Label2 >Caption = "0:00";
148 Ч а с т ь 1. П р и м е р ы и з а д а ч и
/ / щ е л ч о к н а к н о п к е Play/ Stop
void fas t cal l TF orml::SpeedBut t on 2Click( TO bject *Sender)
{
if ( SpeedButton2 >Tag == 0 ) {
// щелчок на кнопке Play
MediaPlayer >Play();
SpeedButton2  >Glyph >Ass ign (bmStop) ;
SpeedButton2 >Hint = "Стоп";
SpeedButton2 >Tag = 1;
//SpeedButton3~>Enabled   true; // доступна кнопка
// "следующий трек"
MediaPlayer >Notify = true;
Timer >Enabled = true;
Tracklnfо();
}
else {
// щелчок на кнопке Stop
SpeedButton2 >Glyph >Assign(bmPlay);
SpeedButton2 >Hint = "Воспроизведение";
SpeedButton2 >Tag = 0;
MediaPlayer >Notify = true;
MediaPlayer >Stop();
Timer >Enabled = false, 
Compact Disk Player ( в е р с и я 2 )
П р о г р а м м а Compact Disk Player, ф о р м а и о к н о к о т о р о й п р и в е д е  
н ы , с о о т в е т с т в е н н о , н а р и с . 1.46 и р и с . 1.47, п о з в о л я е т п р о с л у  
ш а т ь к о м п а к т   д и с к . К а к м о ж н о в и д е т ь , з а г о л о в о к и г р а н и ц а о к н а
в о в р е м я р а б о т ы п р о г р а м м ы н е о т о б р а ж а ю т с я (р и с . 1.47),
т е м н е м е н е е п о л ь з о в а т е л ь м о ж е т п е р е м е с т и т ь о к н о п р о г р а м м ы ,
у с т а н о в и в у к а з а т е л ь м ы ш и н а и з о б р а ж е н и е и н д и к а т о р а
(в п о л е к о м п о н е н т а shapei). З н а ч е н и я с в о й с т в ф о р м ы п р и в е д е н ы
в т а б л . 1.9. С л е д у е т о б р а т и т ь в н и м а н и е , ч т о в с е к о м п о н е н т ы
М у л ь т и м е д и а 1 49
н а х о д я т с я н а п о в е р х н о с т и к о м п о н е н т а shape2, а н е н а п о в е р х н о  
с т и ф о р м ы . П р о ц е д у р ы о б р а б о т к и с о б ы т и й к о м п о н е н т а
MediaPiayer т е ж е , ч т о и в п р о г р а м м е Compact Disk Player (в е р  
с и я 1). С в о й с т в у cursor к о м п о н е н т а shapei н а д о п р и с в о и т ь з н а  
ч е н и е crDrag.
Shape2 Shapei Label! Label2
  iDlxl
Track 0
0:00 
SpeedButtoni SpeedButton2 SpeedButton3 SpeedButton4
Р и с . 1 . 4 6 . о м а п р о г р а м м ы Compact Disk Player (в е р с и я 2)
Р и с . 1.47. О к н о п р о г р а м м ы Compact Disk Player (в е р с и я 2)
С в о й с т в о
Т а б л и ц а 1.9. З н а ч е н и я с в о й с т в ф о р м ы
З н а ч е н и е
Bo r der St yl e
Co l o r
TransparentColorValue
TransparentColor
bsNone
clFuchsia
clFuchsia
true
int px,py; // точка, в которой нажата кнопка мыши
// нажатие кнопки мыши в поле компонента Shapei
void fastcall TForml::ShapelMouseDown(TObject *Sender,
150 Ч а с т ь 1. П р и м е р ы и з а д а ч и
TMouseButton Button, TShiftState Shift, int X, int Y)
// запомнить координаты точки, в которой
// пользователь нажал кнопку мыши
рх = X;
РУ = Y;
// нажатая в поле компонента Shapel кнопка мыши отпущена
void fastcall TForml::ShapelMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Forml >Left = Forml >Left + X   px;
Forml >Top = Forml >Top + Y   py;
/ / щ е л ч о к н а к н о п к е Off (В ы к л ю ч и т ь )
void . fastcall TF orml::SpeedBut t on 4Click( TO bject *Sender)
{
// завершение работы программы
MediaPlayer >Stop();
Forml >Close() ;
V i d e o P l a y e r
П р о г р а м м а Video Player, е е о н о и ф о р м а п р и в е д е н ы н а р и с . 1.48 и
р и с . 1.49 с о о т в е т с т в е н н о , п о з в о л я е т п р о с м о т р е т ь в и д е о р о л и к
ф о р м а т о в AVI и л и MPG. В ы б о р к л и п а о с у щ е с т в л я е т с я в с т а н  
д а р т н о м о к н е О тк р ы ть ф а й л , к о т о р о е с т а н о в и т с я д о с т у п н ы м в
р е з у л ь т а т е щ е л ч к а н а к н о п к е Eject (speedButtoni). К н о п к а
speedButton2 и с п о л ь з у е т с я к а к д л я а к т и в и з а ц и и п р о ц е с с а в о с  
п р о и з в е д е н и я , т а к и д л я е г о п р и о с т а н о в к и . К а р т и н к и д л я к н о п к и
з а г р у ж а ю т с я и з р е с у р с а п р о г р а м м ы . С л е д у е т о б р а т и т ь в н и м а н и е
н а т о , ч т о п р о г р а м м а о п р е д е л я е т р а з м е р к а д р о в в и д е о р о л и к а . Э т о
М у л ь т и м е д и а
151
п о з в о л я е т р а з м е с т и т ь э к р а н в ц е н т р е ф о р м ы и , е с л и р а з м е р к а д  
р о в п р е в ы ш а е т р а з м е р р а б о ч е й о б л а с т и ф о р м ы , в ы п о л н и т ь м а с  
ш т а б и о в а н и е .
*• Vi deo Pl ayer
Р и с . 1, 48. П р о г р а м м а Vi deo Pl ayer п о з в о л я е т п р о с м о т р е т ь в и д е о р о л и к
SpeedButtoni SpeedButton2 Р з п е И MediaPlayeri OpenDialogi
Р и с . 1. 49. Ф о р м а п р о г р а м м ы Vi deo Playe r
152 Ч асть 1. Примеры и задачи
// эти макросы обеспечивают перевод интервала времени,
// выраженного в миллисекундах, в минуты и секунды
#define MINUTE(ms) ((ms/1000)/60)
#define SECOND(ms) ((ms/1000)%60)
// картинки для кнопок
Graphics::TBitmap *fcmPlay; // Play
Graphics::TBitmap *fcmPause; // Pause
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
kmPlay = new Graphics::TBitmap();
fcmPause = new Graphics::TBitmap();
// загрузить картинки для кнопки Play/Stop
bmPlay >LoadFromResourceID((int)HInstance,101);
bmPause >LoadFromResourceID((int)HInstance,102);
// отобразить картинку
SpeedButton2 >Glyph >Assign(bmPlay);
MediaPlayerl >Display = Forml;
// возвращает размер кадра
void .fastcall GetFrameSize(AnsiString f, int *w, int *h)
{
if ( f.Pos(".avi") == 0 )
{
// пользователь выбрал mpg файл
*w = 352;
*h = 240;
return;
// *** Пользователь выбрал AVI  файл ***
М у л ь т и м е д и а 153
/ / В з а г о л о в к е AVI  ф а й л а е с т ь и н ф о р м а ц и я о р а з м е р е к а д р а
s t r uc t {
char RIFF[4]; // строка RI FF
long int nu_l15]; //не используется
char AVIH[4]; // строка AVI H
long int nu_2[9]; // не используется
long int w; // ширина кадра
long int h; // высота кадра
} header;
TFileStream *fs; // поток для чтения заголовка файла
/* операторы объявления потока и его создания
можно объединить:
TFileStream *fs = new TFileStreamff, fmOpenRead); */
fs = new TFileStream(f,fmOpenRead) ;г
fs >Read(&header, sizeof(header));
*w = header.w;
*h = header.h;
delete fs;
// открыть поток для
// чтения
// прочитать
// заголовок файла
// щелчок на кнопке Eject (выбор видеоклипа)
void fastcall TForml::SpeedButtonlClick(TObject *Sender)
{
int fw, fh; // размер кадра клипа
int top,left; // левый верхний угол экрана
int sw, sh; /,/ размер экрана (ширина, высота)
int mw, mh; // максимально возможный размер экрана
// (определяется текущим размером формы)
154
Ч асть 1. Примеры и задачи
float kw, kh; // коэф ты масштабирования кадра
// по ширине и высоте
float к; // коэффициент масштабирования кадра
OpenDialogl >Title = "Выбор клипа";
OpenDialogl >InitialDir = "";
OpenDialogl >Filter =
"Все форматы|*.avi;*.mpg;*.mpegI"
"AVI|*.avi|MPG|*.mpg|MGEG|*.mpeg";
if ( ! OpenDialogl >Execute() )
return; // пользователь нажал кнопку Отмена
/* При попытке открыть файл клипа, который уже открыт,
возникает ошибка. */
if ( MediaPlayerl >FileName == OpenDialogl >FileName )
return;
/* Пользователь выбрал клип. Зададим размер и положение
"экрана", на котором будет выведен клип. Для этого надо,
знать размер кадров клипа. */
I I получить размер кадра
GetFrameSize(OpenDialogl >FileName,&fw, &fh);
// вычислим максимально возможный размер кадра
mw = Forml >ClientWidth;
mh = Forml >Panell >Top 10;
if ( fw < mw )
kw = 1; // кадр по ширине меньше размера экрана
else kw = (float) mw / fw;
if ( fh < mh )
kh = 1; // кадр по высоте меньше размера экрана
else kh = (float) mh / fh;
Мультимедиа 155
// масштабирование должно быть пропорциональным
if ( kw < kh )
к = kw;
else к = kh;
/ / з д е с ь м а с ш т а б о п р е д е л е н
sw = fw * к ,  / / ш и р и н а э к р а н а
sh = fh * к ; / / в ы с о т а э к р а н а
left = (Forml >ClientWidth   sw) / 2;
top = (Panell >Top   sh) / 2;
MediaPlayerl >FileName = OpenDialogl >FileName;
MediaPlayerl >Open();
MediaPlayerl >DisplayRect = Rect(left,top,sw,sh);
/* если размер кадра выбранного клипа меньше размера
кадра предыдущего клипа, то экран (область формы)
надо очистить */
Forml >Canvas >FillRect(Rect(0,0,ClientWidth,Panell >Top));
SpeedButton2 >Enabled = true; // теперь кнопка Play
// доступна
// вывести информацию о времени воспроизведения
MediaPlayerl >TimeFormat = tfMilliseconds;
int ms = MediaPlayerl >Length;
AnsiString st = IntToStr(SECOND(ms));
if ( st.Length() == 1)
st = "0" + st;
st = IntToStr(MINUTE(ms)) + ":" + st;
Labell >Caption = st;
Label3 >Caption = "0:00";
// активизируем процесс воспроизведения
SpeedButton2 >Glyph >Assign(bmPause);
бЗак. 1241
156 Ч а с т ь 1. П р и м е р ы и з а д а ч и
SpeedButton2 >Hint = "Pause";
SpeedButton2 >Tag = 1;
SpeedButtonl >Enabled = False; // кнопка Eject недоступна
MediaPlayerl >Play();
Timerl  > Eriabled = t r ue;
// щелчок на кнопке Play/Stop (воспроизведение/стоп)
void fastcall TForml::SpeedButton2Click(TObject *Sender)
{
if (SpeedButton2 >Tag == 0)
{
// нажата кнопка Play
SpeedButton2 >Glyph >Assign(bmPause);
SpeedButton2 >Hint = "Pause";
SpeedButton2 >Tag = 1;
SpeedButtonl >Enabled = False; // кнопка Eject
// едоступна
MediaPlayerl >Play();
Timerl >Enabled = true;
}
else // нажата кнопка Stop
{
MediaPlayerl >Stop();
SpeedButton2 >Glyph >Assign(bmPlay);
SpeedButton2 >Hint = "Play";
SpeedButton2 >Tag = 0;
SpeedButtonl >Enabled = True; // кнопка Eject доступна
Timerl >Enabled = false;
// сигнал от плеера
void fastcall TForml::MediaPlayerlNotify(TObject *Sender)
М у л ь т и м е д и а 157
{
if ( ( MediaPlayerl >Mode == mpStopped ) &&
( SpeedButton2 >Tag == 1))
{
Timerl >Enabled • false;
SpeedButton2 >Glyph >Assign(bmPlay);
SpeedButton2 >Hint = "Play";
SpeedButton2 >Tag = 0;
SpeedButtonl >Enabled = True; // сделать доступной
// кнопку Eject
/* Процедура обработки события Pain обеспечивает
отображение (перерисовку) первого кадра,
при появлении окна, например, после того,
как пользователь отодвинет другое окно, перекрывающее
окон Video Player. */
void _fastcall TForml::FormPaint(TObject *Sender)
{
if ( MediaPlayerl >Mode == mpStopped )
{
MediaPlayerl >Position = 1;
MediaPlayerl >Position = 0;
// завершение работы программы
void fastcall TForml::FormClose(TObject *Sender,
TCloseAction &Action)
{
MediaPlayerl >Close();
void fastcall TForml::TimerlTimer(TObject *Sender)
158 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// вывести информацию о времени воспроизведения
// MediaPlayerl >TimeFormat = tfMilliseconds;
int ms = MediaPlayerl >Position;
AnsiString st = IntToStr(SECOND(ms));
if ( st.Length() == 1)
st = "0" + st;
st = IntToStr(MINUTE(ms)) + ":" + st;
Label3 >Caption = st;
А н и м а ц и я
П р о г р а м м а А н и м а ц и я , е е ф о р м а и о к н о п р и в е д е н ы н а р и с . 1.50,
д е м о н с т р и р у е т в о с п р о и з в е д е н и е AVI  а н и м а ц и и п р и п о м о щ и к о м  
п о н е н т а Animate. А н и м а ц и я з а г р у ж а е т с я и з ф а й л а в н а ч а л е р а б о т ы
п р о г р а м м ы . П р о ц е с с в о с п р о и з в е д е н и я а к т и в и з и р у е т с я а в т о м а т и ч е  
с к и , в м о м е н т п о я в л е н и я о к н а п р о г р а м м ы н а э к р а н е . С л е д у е т о б  
р а т и т ь в н и м а н и е , ч т о к о м п о н е н т Animate о б е с п е ч и в а е т в о с п р о и з  
в е д е н и е т о л ь к о п р о с т о й , н е с о п р о в о ж д а е м о й з в у к о м а н и м а ц и и .
Animaei •
Buttoni •
W'j А н и м а ц и я
: ! • —
Play
if!?
1
А н и м а ц и я delpN,avl
;
:
К а д р о в : 36 Р а з м е р к а д р о в ; 90x45
Р и с . 1.50. Ф о р м а и о к н о п р о г р а м м ы
М у л ь т и м е д и а 159
bool loaded = false; // анимация загружена
// конструктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
/* если файл анимации недоступен или анимация
сопровождается звуком, возникает исключение */
try
{
Animatel >FileName = "delphi.avi", 
}
catch (Exception &e)
{ }
Forml >Caption = "Анимация   " + Animatel >FileName;
loaded = true, 
Labell >Caption =
"К адров: " + IntToStr(Animatel >FrameCount) +
" Размер кадров: " + IntToStr(Animatel >Width) +
"x" + IntToStr(Animatel >Height);
// начало работы программы
void fastcall TForml::FonnActivate(TObject *Sender)
{
if ( loaded)
// воспроизвести анимацию один раз с первого по
// последний кадр
Animatel >Р1ау(1,Animatel >FrameCount,1);
160 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// щелчок на кнопке Play
void _fastcall TForml::ButtonlClick(TObject *Sender)
if ( loaded)
// воспроизвести анимацию один раз с первого по
// последний кадр
Animatel >Play(1,Animatel >FrameCount,1);
Б а з ы д а н н ы х
В с о с т а в C++Builder в к л ю ч е н ы к о м п о н е н т ы , п о д д е р ж и в а ю щ и е
р а з л и ч н ы е т е х н о л о г и и д о с т у п а к д а н н ы м . В э т о м р а з д е л е п р и в е  
д е н ы п р и м е р ы и с п о л ь з о в а н и я BDE  и ADO  к о м п о н е н т о в .
О б щ и е з а м е ч а н и я
• К о м п о н е н т ы BDE д л я д о с т у п а к д а н н ы м и с п о л ь з у ю т п р о  
ц е с с о р б а з д а н н ы х Borland Database Engine.
О К о м п о н е н т ы ADO д л я д о с т у п а к д а н н ы м и с п о л ь з у ю т ActiveX 
к о м п о н е н т ы (б и б л и о т е к и ) Microsoft.
• Д л я т о г о ч т о б ы п р о г р а м м а , к о т о р а я д л я д о с т у п а к д а н н ы м
и с п о л ь з у е т BDE  к о м п о н е н т ы , м о г л а р а б о т а т ь с б а з о й д а н  
н ы х , н а к о м п ь ю т е р е д о л ж е н б ы т ь у с т а н о в л е н п р о ц е с с о р б а з
д а н н ы х —Borland Database Engine (BDE). BDE у с т а н а в л и в а  
е т с я н а к о м п ь ю т е р п р о г р а м м и с т а в п р о ц е с с е и н с т а л л я ц и и
C++Builder.
• Б а з а д а н н ы х , д л я д о с т у п а к к о т о р о й и с п о л ь з у ю т с я BDE к о м  
п о н е н т ы , д о л ж н а б ы т ь з а р е г и с т р и р о в а н а в с и с т е м е . З а р е г и  
с т р и р о в а т ь б а з у д а н н ы х , с о з д а т ь п с е в д о н и м (Alias) м о ж н о
п р и п о м о щ и у т и л и т ы BDE Administrator.
О С о з д а т ь б а з у д а н н ы х (т а б л и ц у ) и н а п о л н и т ь е е и н ф о р м а ц и е й
м о ж н о п р и п о м о щ и у т и л и т ы Database Desktop и л и SQL Ex 
plorer. П е р е д т е м к а к п р и с т у п и т ь к с о з д а н и ю т а б л и ц ы д а н  
н ы х н а д о с о з д а т ь п с е в д о н и м (Alias) б а з ы д а н н ы х .
• Д л я т о г о ч т о б ы п е р е н е с т и п р о г р а м м у р а б о т ы с б а з о й д а н н ы х
н а д р у г о й к о м п ь ю т е р , н а д о с о з д а т ь у с т а н о в о ч н ы й CD. Д л я
р е ш е н и я э т о й з а д а ч и Borland р е к о м е н д у е т и с п о л ь з о в а т ь у т и  
л и т у InstallShield Express, к о т о р а я п о с т а в л я е т с я в м е с т е с
C++Builder.
162 Ч а с т ь 1. П р и м е р ы и з а д а ч и
З а п и с н а я к н и ж к а
П р о г р а м м а З а п и с н а я к н и ж к а , е е ф о р м а п р и в е д е н а н а р и с . 1.51,
д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т о в BDE д л я р а б о т ы с
о д н о и м е н н о й б а з о й д а н н ы х ф о р м а т а Paradox. Б а з а д а н н ы х с о  
с т о и т и з о д н о й е д и н с т в е н н о й т а б л и ц ы adrbk.db (т а б л . 1.10).
П р о г р а м м а р а б о т а е т с д а н н ы м и в р е ж и м е т а б л и ц ы и п о з в о л я е т
п р о с м а т р и в а т ь , р е д а к т и р о в а т ь , д о б а в л я т ь и у д а л я т ь з а п и с и , а
т а к ж е о б е с п е ч и в а е т в ы б о р к у (п о и с к ) и н ф о р м а ц и и п о с о д е р ж и  
м о м у п о л я Name. Д л я д о с т у п а к б а з е д а н н ы х п р о г р а м м а и с  
п о л ь з у е т п с е в д о н и м adrbk. С о з д а т ь п с е в д о н и м м о ж н о п р и п о  
м о щ и у т и л и т ы BDE Administrator.
З н а ч е н и я С В О Й С Т В К О М П О Н е Н Т О В T a ble, D a t a So ur c e И DBGrid
п р и в е д е н ы в т а б л . 1.11, 1.12, 1.13 с о о т в е т с т в е н н о .
Т а б л и ц а 1 . 1 0. П о л я т а б л и ц ы adrbk б а з ы д а н н ы х
З а п и с н а я к н и ж к а (adrbk.db)
П о л е Т и п Р а з м е р К о м м е н т а р и й
Name
Phone
Cell
Email
A (Alpha)
A (Alpha)
A (Alpha)
A (Alpha)
25
20
20
30
И м я , ф а м и л и я
Т е л е ф о н
С о т о в ы й т е л е ф о н
А д р е с э л е к т р о н н о й п о ч т ы
И м я . Ф а м и / j е л е ф о н | С о т о в ы й J E mail
BitBtnl Button2 Т а Ы е 1 DataSourcel Quervi DBOridi
Р и с . 1 . 5 1 . Ф о р м а п р о г р а м м ы З а п и с н а я к н и ж к а
Базы данных
Свойство
DatabaseName
TableName
Свойство
DataSet
Свойство
Значение
adrbk
adrbk.db
Значение
Tablel
163
Таблица 1.11. Значения свойств
компонента Tablel
Комментарий
Псевдоним базы данных
Файл, в отором находится таблица
Таблица 1.12. Значения свойств
компонента DataSourcel
Таблица 1.13. Значения свойств
Компонента DBGridl
Значение
DataSource
Columns[0]
Columns[0]
Columns[1]
Columns[1]
Columns[2]
Columns[2]
Columns[3 ]
Columns[3 ]
FildName
Title.Caption
FildName
Title.Caption
FildName
Title.Caption
FildName
Title.Caption
DataSourcel
Name
Имя, фамилия
Phone
Телефон
Cell
Сотовый
Email
E mail
К р и т е р и й з а п р о с а (и м я , ф а м и л и я и л и ф р а г м е н т и м е н и , н а п р и  
м е р , н е с к о л ь к о п е р в ы х б у к в ) в в о д и т с я в о к н е Н а й т и (FindForm)
к о т о р о е п о я в л я е т с я в р е з у л ь т а т е щ е л ч к а н а к н о п к е П о и с к
(Bit Bt nl). Ф о р м а Н а й ти (FindForm) п р и в е д е н а н а р и с . 1.52.
164 Ч а с т ь 1. П р и м е р ы и з а д а ч и
  JnJj i J
В в е д и т е и м я и л и а м и л и ю
о к
Р и с . 1. 52. Ф о р м а Н а й т и
/ / *** Э т о м о д у л ь г л а в н о й (с т а р т о в о й ) ф о р м ы ***
# in c lude "F in d_ . h " / / э т а д и р е к т и в а в с т а в л е н а в р у ч н у ю
/ / н а ч а л о р а б о т ы п р о г р а м м ы
void fas t cal l TMainF orm::F ormShow(TObject *Sender)
{
// если псевдоним adrbk не зарегистрирован, возникает ошибка
try
{
Tablel >Open();
}
catch (EDBEngineError &e)
{
ShowMessage("Ошибка доступа к базе данных: "
"не определен псевдоним adrbk\n" +
е.Message );
Button2 >Enabled = false;
BitBtnl >Enabled = false;
CheckBoxl >Enabled = false;
// щелчок на кнопке поиска информации
void fastcall TMainForm::BitBtnlClick(TObject *Sender)
Базы данных 165
{
FindForm >Tag = 0;
FindForm >ShowModal(); // отобразить окно Запрос
if ( FindForm >Tag )
{
// пользователь закрыл окно поиска
// щелчком на кнопке ОК, то есть он ввел
// фамилию или имя
Queryl >SQL >Text =
"SELECT * FROM adrbk WHERE Name LIKE \042%" +
FindForm >Editl >Text +"%\042";
// \042   это восьмеричный код двойной авычки
if ( CheckBoxl >Checked )
ShowMessage (Queryl >SQL >Text);
Queryl >Open(); // открыть (выполнить) запрос
if ( Queryl >RecordCount != 0)
DataSourcel >DataSet = Queryl;
else
{
ShowMessage ("В базе данных нет запрашиваемой"
" информации: " + FindForm >Editl >Text);
DataSourcel >DataSet = Tablel;
// щелчок на кнопке Все записи
void fastcall TMainForm::Button2Click(TObject *Sender)
{
// источник данных   таблица
DataSourcel >DataSet = Tablel;
// завершение работы рограммы
166 Ч а с т ь 1. П р и м е р ы и з а д а ч и
void fastcall TMainForm::FormClose(TObject *Sender,
TCloseAction SAction)
{
Tablel >Close();
// *** Это модуль формы Найти ***
// окно Найти стало доступным
void fastcall TFindForm::FormShow(TObject *Sender)
{
Editl >SetFocus(); // установить курсор в поле
// редактирования
У
// Щелчок на кнопке ОК (пользователь ввел критерий запроса)
void .fastcall TFindForm::ButtonlClick(TObject *Sender)
{
Tag = 1; // пользователь щелкнул на кнопке ОК
Close();
/ / н а ж а т а к л а в и ш а
void f a st c a ll TFindForm::EditlKeyPress(TObject *Sender,
char &Key)
{
if ( Key == 13) Buttonl >SetFocus(); // переместить фокус
// на кнопку ОК
Магазин
П р о г р а м м а М а га зи н (р и с . 1.53) р а б о т а е т с о д н о и м е н н о й б а з о й
д а н н ы х и д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т о в BDE.
Б а з ы д а н н ы х 167
• ш и к I i xl
{К о м п л е к т с т о л о в о й м е б е л и
3 990,00р .
• • •
К о м п л е к т с т о л о в о й м е б е л и (с т о л +4 с т у л а ).
Р а з м е р с т о л а 120x70. М а т е р и а л : м а с с и в
г и в е и .

Н а з в а н и е [Ц е н а (О п и с а н и е
Ч а й н и к
Ч а ш к а с б л ю д ц е м
Л а м п а н а с т о л ь н а я
Л ю с т р а
С м е с и т е л ь
И и с к а
670,00р . Ч а й н и к , и з н е р ж а в е ю щ е й с т а л и . О б ъ е м : 2,5 л и т р г
Э 9,00р . Ч а ш к а с б л ю д ц е м . К е р а м и к а . Ц в е т : с и н и й , з е л е н
3 990,00р К о м п л е к т с т о л о в о й м е б е л и (с т о л +4 с т а л а ). Р а з м е
530,00р . Л а м п а н а с т о л ь н а я , Е 14, 40 в т . М а т е р и а л : к е р а м и
2 590,00р . Л ю с т р а 6х Е 14,40 в т . М а т е р и а л : х р о м , т р и п л е к с I
870,00р .: м е с и т е л ь д л я м о й к и . М а т е р и а л : х р о м . П р о и з в о л
75,00р . М и с к а д е к о р а т и в н а я . М а т е р и а л : к е р а м и к а . П р о и :
[З а п и с ь : 3 ;П р о с м о р т р
Р и с . 1 . 5 3 . П р о г р а м м а М а г а з и н
Б а з а д а н н ы х "М а г а з и н " с о с т о и т и з о д н о й т а б л и ц ы stock.db и с о  
д е р ж и т и н ф о р м а ц и ю о т о в а р а х (т а б л . 1.14).
Т а б л и ц а . 1 . 1 4. П о л я т а б л и ц ы stock (stock.db)
П о л е
Title
Price
Memo
Image
Т и п
A (Alpha)
$ (Money)
A (Alpha)
A (Alpha)
Р а з м е р
5 0

1 0 0
3 0
К о м м е н т а р и й
Н а з в а н и е т о в а р а
Ц е н а
О п и с а н и е т о в а р а
Ф а й л и л л ю с т р а ц и и (в ф о р м а т е
BMP)
Д л я д о с т у п а к б а з е д а н н ы х и с п о л ь з у е т с я п с е в д о н и м stock. С о з  
д а т ь п с е в д о н и м м о ж н о п р и п о м о щ и у т и л и т ы BDE Administrator.
168 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Ф о р м а п р о гр а м м ы М а га зи н п р и в е д е н а р и с . 1.54, з н а ч е н и я
с в о й с т в к о м п о н е н т о в —в т а б л . 1.15, 1.16, 1.17, 1.18.
DBEdi H
JDBEdi G
DBMemol
1
" ' !'" ' i •" ' . j . .1
Ц е н а [О п и с а н и е | Image
а з в а н и е
Р и с . 1.54. Ф о р м а п р о г р а м м ы р а б о т ы с б а з о й д а н н ы х М а г а з и н
Т а б л и ц а 1 . 1 5. З н а ч е н и я с в о й с т в к о м п о н е н т а Tablei
С в о й с т в о З н а ч е н и е К о м м е н т а р и й
DatabaseName s t o c k П с е в д о н и м б а з ы д а н н ы х
TableName s t o c k . d b Ф а й л , в к о т о р о м н а х о д и т с я т а б л и ц а
Т а б л и ц а 1 . 1 6 . З н а ч е н и я с в о й с т в к о м п о н е н т а DataSourcei
С в о й с т в о З н а ч е н и е
D a t a Set
T a b l ei
Б а з ы а н н ы х
С в о й с т в о
Т а б л и ц а 1.17. З н а ч е н и я с в о й с т в
З н а ч е н и е
к о м п о н е н т а
169
DBGridi
DataSource DataSourcel
Columns[0].FildName Title
Columns [0] . T.itle.Caption Название
Columns[1].FildName Price
Columns[1].Title.Caption Цена
Columns[2].FildName Memo
Columns[2].Title.Caption Описание
Columns[3 ].FildName Image
Columns[3 ].Title.Caption Image
Т а б л и ц а 1 . 1 8. З н а ч е н и я с в о й с т в к о м п о н е н т о в
DBEdi t И DBMemo
Свойство Значение
DBEditl.DataSource DataSourcel
DBEditl.DataField Title
DBEdit2.DataSource DataSourcel
DBEdit2.DataField Price
DBMemol.DataSource DataSourcel
DBMemol.DataField Memo
/ / н а ч а л о р а б о т ы п р о г р а м м ы
void fastcall TForml::FormShow(TObject *Sender)
{
try
{
Tablel >Open(); // открыть базу данных
170 Ч асть 1. Примеры и задачи
catch ( EDBEngineError &e)
{
ShowMessage("Для доступа к базе данных надо создать "
"псевдоним stock");
// изменилось состояние набора данных
void fastcall TForml::DataSourcelStateChange(
TObject *Sender)
{
if ( DataSourcel >State == dsBrowse)
StatusBarl >Panels >Items[l] >Text = "Просмортр";
else
StatusBarl >Panels >Items[1] >Text = "Редактирование"
// событие At'terScroll возникает после перехода к другой
// записи (смены текущей записи)
void fastcall TForml::TablelAfterScroll(TDataSet *DataSet)
{
AnsiString Picture;
if ( Tablel >RecNo !=  1)
StatusBarl >Panels >Items[0] >Text =
"Запись: " + IntToStr( Tablel >RecNo );
/* Доступ к значению поля текущей записи можно
получить через свойство FieldValue. Если поле I mage
пустое, то при попытке чтения из него данных
возникает ошибка. */
try {
Picture =
Tablel >Database >Directory +
DataSet >FieldValues["Image"];
Базы данных 171
catch (EVariantTypeCastError &e) {
Imagel >Visible = false;
return;
}
ShowPhoto(Picture);
else
StatusBarl >Panels >Items[O] >Text = "";
StatusBarl >Panels >Itemsf1] >Text = "Новая запись
Imagel >Visible = false;
// отображает картинку в поме компонента I magel
void fastcall TForml::ShowPhoto(AnsiString Picture)
{
try
.{
Imagel >Picture >LoadFromFile(Picture);
}
catch ( EFOpenError &e)
{
// ничего не делаем, просто не отображаем картинку
Imagel >Visible = false;
return;
}
Imagel >Visible = true;
// завершение работы программы
void fastcall TForml::FormClose(TObject *Sender,
TCloseAction SAction)
172 Ч а с т ь 1. П р и м е р ы и з а д а ч и
if (Tablel >State == dsEdit )
/ / т а б л и ц а в р е ж и м е р е д а к т и р о в а н и я
Tablel >Post(); // сохранить внесенные изменения
Е ж е д н е в н и к
П р о г р а м м а Е ж е д н е в н и к д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н  
т о в ADO д л я д о с т у п а к б а з е д а н н ы х ф о р м а т а Microsoft Access.
Б а з а д а н н ы х с о д е р ж и т и н ф о р м а ц и ю о з а п л а н и р о в а н н ы х м е р о  
п р и я т и я х (д а т а , з а д а ч а ). П р о г р а м м а п о з в о л я е т в н о с и т ь в б а з у
д а н н ы х и з м е н е н и я (д о б а в л я т ь , у д а л я т ь и р е д а к т и р о в а т ь з а п и с и ),
а т а к ж е о б е с п е ч и в а е т в ы б о р и н ф о р м а ц и и п о з а п р о с у —в ы в о д и т
с п и с о к м е р о п р и я т и й , з а п л а н и р о в а н н ы х "н а с е г о д н я ", "н а з а в т р а "
и "н а э т у н е д е л ю ". П р и з а п у с к е п р о г р а м м а а в т о м а т и ч е с к и в ы в о  
д и т с п и с о к м е р о п р и я т и й , з а п л а н и р о в а н н ы х "н а с е г о д н я " и л и ,
е с л и п р о г р а м м а з а п у щ е н а в п я т н и ц у , с у б б о т у и л и в о с к р е с е н ь е ,
"н а с е г о д н я и б л и ж а й ш и е д н и " (р и с . 1.55).
Щ Е ж е д н е в н и к
С е г о д н я 31 д е к а б р я 2004 г о д а , п я т н и ц а
С е г о д н я и б л и ж а й ш и е д н и
 XJ
• • I + —  ••
Ч т о
Ц Ш .12.2004 Н о в о г о д н и й п р а з д н и к , С П б Г П У , 16; 00
J03.01.2005 к о н с у л ь т а ц и я (Т Т П ). 12:00
С е г о д н я З а в т р а Э т а н е д е л я В с в
Г SQL
Р и с . 1. 5 5 . П р и з а п у с к е п р о г р а м м а в ы в о д и т с п и с о к д е л ,
з а п л а н и р о в а н н ы х н а б л и ж а й ш и е д н и
Б а з ы д а н н ы х
173
Б а з а д а н н ы х "Е ж е д н е в н и к " (Planner.mdb) с о с т о и т и з о д н о й  
е д и н с т в е н н о й т а б л и ц ы schedule (т а б л . 1.19). Ф о р м а п р о г р а м м ы с
б а з о й д а н н ы х п р и в е д е н а н а р и с . 1.56, з н а ч е н и я с в о й с т в к о м п о  
н е н т о в —в т а б л . 1.20, 1.21, 1.22, 1.23.
Б а з а д а н н ы х д о л ж н а б ы т ь з а р е г и с т р и р о в а н а в с и с т е м е к а к и с  
т о ч н и к д а н н ы х ODBC:
• д р а й в е р —Microsoft Access Driver (*.mdb);
• .и м я и с т о ч н и к а д а н н ы х —DPlanner;
• о п и с а н и е —Е ж е д н е в н и к ;
• б а з а д а н н ы х —Planner.mdb.
Т а б л и ц а . 1 . 1 9 . П о л я т а б л и ц ы schedule б а з ы д а н н ы х
" Е ж е д н е в н и к " (Planner.mdb)
П о л е
Т и п
К о м м е н т а р и й
aDate Д А Т А / В Р Е М Я
aTask С т р о к о в ы й , 50 с и м в о л о в
Д а т а
З а п л а н и р о в а н н о е м е р о п р и  
я т и е (з а д а ч а )
Щ { Е ж е д н е в н и к
Lab el ! ;
La b e l 2
[ Ч т о о г д а
Г ")* !
С е г о д н я I ! З а в т р а | ', Э т а н е д е л я | ' . В с е | !: '." , • ' ,' . ' ," ..• [
SQL
Р и с . 1 . 5 6 . Ф о р м а п р о г р а м м ы Е ж е д н е в н и к
174
Таблица
Св о й с тв о
1.20.Значения свойств
З наче ни е
Часть 1.
компонента
Примеры и задачи
ADOConnectionl
ConnectionString Provider=MSDASQL.1;
Persist Security Info=False;
Data Source=DPlanner
или
DSN=DPlanner
Т а б л и ц а 1 . 2 1 . З н а ч е н и я с в о й с т в к о м п о н е н т а ADODataSeti
С в о й с т в о З н а ч е н и е
Connection ADOConnectionl
CommandText SELECT * FROM schedule ORDER BY aDate
Таблица 1.22. Значения свойств компонента DataSourcel
Св о й с тв о З наче ни е
DataSet ADODataSeti
Т а б л и ц а 1 . 2 3 . З н а ч е н и я с в о й с т в к о м п о н е н т а DataGridi
Св о й с тв о
DataSource
Columns[0].FlldName
Columns[0].Title.Caption
Columns[1].FildName
Columns[1].Title.Caption
#include <DateUtils.hpp>
#include <ComObj.hpp> // для
З наче
DataS
aDate
К огда
aTask
Что
доступа ъ
ние
ourcel
: EOleException
Базы данных 175
AnsiString stDay[7] = ("воскресенье","понедельник","вторник",
"среда","четверг","пятница","суббота"} ;
AnsiString stMonth[12] = {"января","февраля","марта",
"апреля","мая","июня","июля",
"августа","сентября","октября",
"ноября","декабря"};
void fastcall TForml::FormShow(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 r» Today + 2; break; // сегодня суббота
default : NextDay = Today + 1; break;
176 Ч а с т ь 1. П р и м е р ы и з а д а ч и
ADODataSetl >CommandText =
"SELECT * FROM schedule WHERE aDate BETWEEN DateValueC"
FormatDateTimeC'dd/iran/yyyy", Today) +
"') AND DateValue('" +
FormatDateTime("dd/mm/yyyy",NextDay) +
"') ORDER BY aDate";
// если надо, отобразить SQL команду
if ( CheckBoxl >Checked) ShowSQLO;
// если БД не зарегистрирована как источник данных ODBC,
// возникает исключение EOleException
try
{
// открыть набор данных (выполнить
// SQL команду ADODataSetl >CommandText
ADODataSetl >Open();
catch ( EOleException &e)
// чтобы тип EOleException был доступен, в программу
// надо поместить директиву ^include <ComObj.hpp>
I
ShowMessage(
"Ошибка обращения к Б Д. Б аза данных Planner.mdb должна"
"быть зарегистрирована\пв системе как источник данных ODBC "
"под именем dplaner"
Buttonl >Enabled = false;
Button2 >Enabled = false;
Button3 >Enabled = false;
Базы данных 177
Button4 >Enabled = false;
return;
if ( ! ADODataSetl >RecordCount )
ShowMessage("На сегодня и ближайшие дни ни каких дел
"не запланировано.");
// Щелчок на кнопке Сегодня
void fastcall TForml::ButtonlClick(TObject *Sender)
{
AnsiString today = FormatDateTime("dd/inm/yyyy",Now());
Forml >Label2 >Caption = "Сегодня";
ADODataSetl >Close(); // закрыть набор данных
// изменить критерий запроса
ADODataSetl >CommandText =
"SELECT * FROM schedule WHERE aDate =
DateValue('" + today +"')";
if ( CheckBoxl >Checked) ShowSQLf); // отобразить запрос
ADODataSetl >Open(); // открыть набор данных с новым
// запросом
// щелчок на кнопке Завтра
void fastcall TForml::Button2Click(TObject *Sender)
{
AnsiString tomorrow = FormatDateTime("dd/mm/yyyy"
Now () +1 ) ;
Label2 >Caption = "Завтра";
178
Ч а с т ь 1. П р и м е р ы и з а д а ч и
ADODataSetl >Close() ;
// изменить критерий запроса
ADODataSetl >CornmandText =
"SELECT * FROM schedule WHERE aDate = DateValue('" +
tomorrow + " ' ) " ;
if ( CheckBoxl >Checked) ShowSQLO;
ADODataSetl >Open(); // выполнить запрос
if ( ! ADODataSetl >RecordCount )
{
ShowMessage("На завтра никаких дел не"
"запланировано!");
// щелчок на кнопке На этой неделе
void fastcall TForml::Button3Click(TObject *Sender)
{
// "эта неделя"   от текущего дня до конца едели
// (до воскресенья)
TDateTime Present, eWeek;
Label2 >Caption = "На этой неделе";
Present^ Now О; // Now   возвращает текущую дату
eWeek = EndOfAWeek(YearOf(Present),WeekOf(Present));
/*
д л я д о с т у п а к StartOfWeek, EndOfAWeek, YearOf и WeekOf
н а д о п о д к л ю ч и т ь DateUtils.hpp (с м . д и р е к т и в ы iinclude )
*/
Базы данных 179
ADODataSetl >Close();
ADODataSetl >CommandText =
"SELECT * FROM schedule WHERE aDate BETWEEN DateValue('" +
FormatDateTime("dd/mm/yyyy", Present) + ."•') AND DateValuef
1
" +
FormatDateTime("dd/mm/yyyy",eWeek)+"') ORDER BY aDate";
if ( CheckBoxl >Checked) ShowSQLO;
ADODataSetl >Open();
if ( ! ADODataSetl >RecordCount )
ShowMessage("На эту неделю никаких дел "
"не запланировано.");
}
// Щелчок на кнопке Все
void fastcall TForml::Button4Click(TObject *Sender)
{
ADODataSetl >Close();
ADODataSetl >CommandText =
"SELECT * FROM schedule ORDER BY aDate";
if ( CheckBoxl >Checked) ShowSQLO;
ADODataSetl >Open();
Label2 >Caption   "Все, что намечено сделать";
}
// отображает SQL команду
void fastcall TForml::ShowSQL(void)
{
ShowMessage ( ADODataSetl >CommandText );
И г р ы и д р у г и е
п о л е з н ы е п р о г р а м м ы
С а п е р
И г р а С а п е р , о к н о к о т о р о й п р и в е д е н о н а р и с . 1.57, —а н а л о г о д н о  
и м е н н о й и г р ы , х о р о ш о з н а к о м о й в с е м п о л ь з о в а т е л е м Windows.
Н о в а я и г р а С п р а в к а
1
1
В :
1
1
1
1
1
1
2
1
1
1
2
1
1
1
к  
I
л
2
1
1
1
1
2
щ
я * *
2 1 1
Э т у к л е т к у
с а п е р о т к р ы л
Э т о о б н а р у ж е н н а я м и н а
О ш и б к а ! В к л е т к е
м и н ы н е т
Э т и к л е т к и с а п е р
н е у с п е л о т к р ы т ь
Р и с . 1 . 5 7 . О к н о п р о г р а м м ы С а п е р
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы
181
П р о г р а м м а д е м о н с т р и р у е т р а б о т у с г р а ф и к о й , м а с с и в а м и , в ы в о д
с п р а в о ч н о й и н ф о р м а ц и и и п о к а з ы в а е т , к а к м о ж н о з а п у с т и т ь п р о  
г р а м м у д о с т у п а в Internet. Г л а в н а я ф о р м а и ф о р м а О п р о гр а м м е
п р и в е д е н ы н а р и с . 1.58, 1.59 с о о т в е т с т в е н н о . О к н о О п р о гр а м м е
п о я в л я е т с я н а э к р а н е в р е з у л ь т а т е в ы б о р а в м е н ю С п р а в к а к о м а н  
д ы О п р о гр а м м е . З н а ч е н и я с в о й с т в ф о р м ы О п р о гр а м м е п р и в е д е н ы
в т а б л . 1.24.
Р и с . 1. 58. Г л а в н а я ф о р м а п р о г р а м м ы С а п е р
, , . О п р о г р а м м е
П р о г р а м м а д е м о н с т р и р у е т р а б о т а с г р а ф и к о й ,
м а с с и в а м и и и с п о л ь з о в а н и е р е к у р с и и .
Т к с т п р о г р а м м ы м о ж н о н а й т и в к н и г е :
К у л ь т и н Н   Б .
C++ Builders п р и м е р а х .
  С П б .; Б Х В   П е т е р б у р г . 2005.
hUp:\\ww bhv.ru
OK
Р и с . 1.59. Ф о р м а О п р о г р а м м е
С в о й с т в о
Т а б л и ц а 1.24. З н а ч е н и я с в о й с т в ф о р м ы О п р о г р а м м е
З н а ч е н и е
Name
BorderSt yle
P o sit io n
About
bsToolWindow
poOwnerFormCenter
182 Ч а с т ь 1. П р и м е р ы и з а д а ч и
I I *** модуль главной формы ***
#include <stdlib.h> // для доступа к
// генератору случайных чисел
#include <time.h>
# include "SaperAbout.h"
TMain *Main; // главное окно
#define MR 10 // кол во клеток по вертикали
#define MC 10 // кол во клеток по горизонтали
#define NM 10 // кол во мин
int Pole[MR+2][МС+2]; // минное поле
// 0..8   количество мин в соседних клетках
// 9   в клетке мина
// 100..109   клетка открыта
// 200..209   в клетку поставлен флаг
int nMin; // кол во найденных мин
int nFlag; // кол во поставленных флагов
int status = 0 ; // 0   начало игры; 1   игра; 2   результат
// смещение игрового поля относительно левого верхнего угла
// поверхности формы
#define LEFT 0 // по X
#define TOP 1 // по Y
#define W 40 // ширина клетки поля
#define H 40 // высота клетки поля
// новая игра   "разбрасывает" мины
void fastcall NewGame();
// открывает текущую и соседние пустые клетки
Игры и другие полезные программы 183
void fastcall Open(int row, int col);
// нажатие кнопки мыши на игровом поле
void fastcall TMain::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int x, int y)
{
if ( status == 2 ) return, 
if ( status == 0) status = 1;
x  = LEFT;
у  = TOP;
if (x > 0 && у > 0)
{
// преобразуем координаты мыши в индексы
// клетки поля
int row = y/H + 1;
int col = x/W + 1;
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)
{
nFlag++;
184
if ( Pole[row][col] ==
nMin++;
Pole[row][col] += 200;
if (nMin == NM ScSc nFla
status = 2 ; // игра
ShowPole(status);
else Kletka(row, col,
}
Ч асть 1. Примеры и задачи
9 )
// поставили флаг
g == NM)
закончена
status);
// Функция обработки  события OnCreate обычно используется
// для инициализации глобальных переменных
void fastcall TMain::FormCreate(TObject *Sender)
{
// В неотображаемые эл ты массива, которые соответствуют
// клеткам по границе игрового поля, запишем число  3.
// Это значение используется функцией Open для завершения
// рекурсивного процесса открытия соседних пустых клеток.
for ( int row=0; row <= MR+l; row++)
for ( int col=0; col <= MC+l; col++)
Pole[row][col] =  3 ;
NewGameO; // "разбросать" мины
ClientWidth = W*MC;
ClientHeight = H*MR+TOP+1;
// Вывод поля как результат обработки события Paint
// позволяет проводить любые манипуляции с формой во время
// работы программы
void fastcall TMain::FormPaint(TObject *Sender)
Игры и ругие полезные программы 7S5
ShowPole(status);
// Показывает поле
void fastcall TMain::ShowPole( int status)
{
for ( int row = 1; row <= MR; row++ )
for ( int col = 1; col <= MC; col++ )
Kletka(row, col, status);
// рисует на экране клетку
void fastcall TMain::Kletka(int row, int col, int status)
{
int X = LEFT + (col 1)* W; .
int у = TOP + (row 1)* H;
if (status ==0) // начало игры
{
// клетка   серый вадрат
Canvas >Brush >Color = clBtnFace;
Canvas >Rectangle(x l,y l,x+W,y+H);
return;
}
// во время (status = 1) и в конце (status = 2) игры
if ( Pole[row][col] < 100 )
{
// клетка не открыта
Canvas >Brush >Color = clBtnFace; // не открытые
// серые
Canvas >Rectangle(x 1,у 1,x+W,у+Н);
if (status == 2 && Pole[row][col] == 9)
Mina( x, y); // игра закончена, показать мину
186 Ч а с т ь 1. П р и м е р ы и з а д а ч и
return;
// клетка ткрыта
Canvas >Brush >Color = clWhite; // открытые — белые
Canvas >Rectangle(х 1,у 1,x+W,у+Н);
if ( Pole[row][col] == 100 ) // клетка открыта, но она
// пустая
return;
if ( Pole[row][col] >= 101 && Pole[row][col] <= 108 )
{
Canvas >Font >Size = 11;
Canvas >Font >Color = clBlue;
Canvas >TextOutA(x+3, y+2,
IntToStr(Pole[row][col]  100 ));
return;
if ( Pole[row][col] >= 200 )
Flag(x, y);
if (Pole[row][col] == 109 ) // на этой мине одорвались!
Canvas >Brush >Color = clRed;
Canvas >Rectangle(x 1,y 1,x+W,y+H);
if (( Pole[row][col] % 10 == 9) && (status
Mina( x, y);
== 2)
// рекурсивная функция открывает текущую и все соседние
// клетки, в которых нет мин
void fastcall Open(int row, int col)
Игры и другие полезные программы 187
{
if (Pole[row][col]    0)
{
Pole[row][col] = 100;
// открываем клетки слева/ справа, снизу и сверху
Open(row,col 1);
Open(row 1,col);
Open(row,col+1);
Open(row+1,col);
..// открываем примыкающее диагонально
Open(row 1,col 1);
Open(row 1,col+1);
Open(row+1,col 1);
Open (row+1, col+1) ;.
}
else
//  3 это граница игрового поля
if (Pole[row][col] < 100 && Pole[row][col] !=  3)
Pole[row][col] += 100;
// новая игра   генерирует новое поле
void fastcall NewGame()
{
/ / О ч и с т и м э л   т ы м а с с и в а , с о о т в е т с т в у ю щ и е о т о б р а ж а е м ы м
/ / к л е т к а м , а в н е о т о б р а ж а е м ы е (п о г р а н и ц е и г р о в о г о п о л я )
/ / з а п и ш е м ч и с л о   3. У н и к а л ь н о е з н а ч е н и е к л е т о к г р а н и ц ы
/ / и с п о л ь з у е т с я ф у н к ц и е й Open д л я з а в е р ш е н и я р е к у р с и в н о г о
/ / п р о ц е с с а о т к р ы т и я с о с е д н и х п у с т ы х к л е т о к .
i n t row, c ol;
for (row=0; row <= MR+l; row++)
for (col=0; col <= MC+l; col++)
Pole[row][col] =  3 ;
for (row=l; row <= MR; row++)
3ак. 1241
188 Ч асть 1, Примеры и задачи
for (col=l; col <= МС; col++)
Pole[row][col] = 0;
// расставим мины
time_t t; // используется ГСЧ
srand((unsigned) time(&t)); // инициализация ГСЧ
int n = 0; // кол во мин
do
{
row = rand О % MR +1;
col = rand О % MC +1;
if ( Pole[row][col] != 9)
{
Pole[row][col] = 9;
while ( n < 10) ;
// вычисление кол ва мин в соседних клетках
int к;
for ( row = 1; row <= MR; row++)
for ( col = 1; col <= MC; col++)
if ( Pole[row][col] != 9 ) {
к =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;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 189
status = 0 ; // начало игры
riMin = 0 ; //нет обнаруженных мин
nFlag = 0 ; // нет флагов
// рисует мину
void fastcall TMain::Mina(int x, int y)
{
Canvas >Brush >Color = clGreen;
Canvas >Pen >Color = clBlack;
Canvas >Rectangle(x+16,y+26,x+24,y+30);
// корпус
Canvas >Rectangle(x+8,y+3 0,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 >MoveTo(x+8, y+3 0); Canvas >LineTo(x+6,y+28);
Canvas >MoveTo(x+32,y+30); Canvas >LineTo(x+34,y+28)
// Рисует флаг
void fastcall TMain::Flag( int x, int y)
{
TPoint p[4]; // координаты флажка и нижней точки древка
// точки флажка
190
р[0].х=х+4; р[0]
р[1].х=х+30; р[1]
р[2].х=х+4; р[2]
// установим цвет
•y=y+4;
•У=У+12;
•У=У+2 ;
кисти и карандаша
Canvas >Brush >Color = clRed;
Canvas >Pen >Color
Canva s >Polygon(p,
// древко
Canvas >Pen >Color
= clRed; // чтоС
// крас
2); // флажок
= clBlack;
Ч асть 1. Примеры и задачи
>ы контур флажка был
•НЫЙ
Canvas >MoveTo(p[0].х, p[O].y)
Canvas >LineTo(x+4,y+36);
TPoint m[5]; // буква М
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+14;
Canvas >Pen >Color • clWhite;
Canvas >Polyline(m,4);
Canvas >Pen >Color = clBlack;
// команда главного меню Новая игра
void fastcall TMain::NlClick(TObject *Sender)
NewGame();
ShowPole(status);
Игры и ругие полезные программы 191
// выбор в меню "?" команды О программе
void fastcall TMain::N4qlick(TObject *Sender)
About~>ShowModal();
// выбор в меню "?" команды Справка
void fastoall TMain::N3Click(TObject *Sender)
{
/* Отображение справочной информации
обеспечивает утилита hh.exe, входящая
в состав Windows. Ключ mappid задает
отображаемый раздел справочной информации. */
WinExecChh.exe  mapid I saper.chm", SW_RESTORE);
// *** модуль формы О программе***
// Выбор URL адреса (щелчок поле компонента Label5)
void fastcall TAbout::Label5Click(TObject *Sender)
{
/* наиболее просто передать в функцию ShellExecute
строку константу (URL адрес) так, как показано ниже
ShellExecute (AboutForm >Handle,
"open",
"http:\\\\www.bhv.ru",
NULL, NULL)
Лучше URL адрес брать из поля метки.
В функцию ShellExute надо передать указатель (char*) на
null terminated строку, но свойство Caption  
это AnsiString.
Преобразование Ansi строки в (char*) строку выполняет
метод c_str ()
*/
192 Ч асть 1. Примеры и задачи
// открыть файл, имя которого находится в поле Labels
ShellExecute(About >Handle,"open",Label5 >Caption.c_str(),
NULL,NULL,SW_RESTORE);
}
// щелчок на кнопке OK
void fastcall TAbout::ButtonlClick(TObject *Sender)
{
ModalResult = mrOk;
Игра 15
В с е м и з в е с т н а и г р а "15". В о т е е п р а в и л а . В п р я м о у г о л ь н о й
к о р о б о ч к е н а х о д я т с я 15 ф и ш е к , н а к о т о р ы х н а п и с а н ы ч и с л а
о т 1 д о 15. Р а з м е р к о р о б о ч к и —4x4, т а к и м о б р а з о м в к о р о  
б о ч к е е с т ь о д н а п у с т а я я ч е й к а . В н а ч а л е и г р ы ф и ш к и п е р е  
м е ш а н ы (р и с . 1.60). З а д а ч а и г р о к а с о с т о и т в т о м , ч т о б ы , н е
в ы н и м а я ф и ш к и и з к о р о б о ч к и , в ы с т р о и т ь ф и ш к и в п р а в и л ь  
н о м п о р я д к е (р и с . 1.61).
5
9
3
12
2
6
15
1
8
11
13
4
14
17
10
Р и с . 1. 60. В н а ч а л е и г р ы
ф и ш к и п е р е м е ш а н ы
1
5
9
13
2
6
10
14
3
7
11
15
4
8
12
Р и с . 1 . 6 1 . П р а в и л ь н ы й п о р я д о к
ф и ш е к
П р о г р а м м а И гр а 15 р е а л и з у е т о п и с а н н у ю и г р у . Ф о р м а и о к н о
п р о г р а м м ы п р и в е д е н ы н а р и с . 1.62.
Игры и другие полезные программы 193
1
11
5
14
• г.
1
..
1
,
1
.
1
.;..,.'. —•
& ? '   I r l x i
1 0
7
1 5
3
8
6
2
4
9
1 3
1 2
Рис. 1.62. Форма и окно программы Игра 15
#include "math.hpp" // для доступа к Randomize и RandomRange
//' размер клеток 48x48
#define WC 48
tdefine НС 48
byte pole[4][4]; // игровое поле
byte ex,ey; // координаты пустой летки
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
Forml >Font >Size = 12;
// начало работы рограммы
void fastcall TForml::FormShow(TObject *Sender)
{
NewGame();
// новая игра
void fastcall TForml::NewGame()
194
// установить
ClientWidth =
ClientHeight
размер формы
WC * \4 ;
= HC * 4;
//' исходное (правильное) положение
int к = 1;
for (int i =
for (int
pole[
Mixer()i
ShowPole();
0; i < 4; i++)
j = 0; j < 4; j++)
i][j] = k++;
// перемешать фишки
// отобразить игровое
Ч асть 1. Примеры и задачи
фишек
поле
// перемешивает фишки
void fastealI TForml::Mixer()
int xl,yl; // пустая клетка
int x2,y2; // эту переместить в пустую
int d; // направление относительно пустой
Randomize() ;
xl = 3; yl = 3; // см. описание массива stp
for ( int i = 0; i < 150; i++) // кол во перестановок
do {
x2 = xl;
y2 = yl;
/* выберем фишку, примыкающую к пустой клетке,
которую переместим в пустую клетку */
d = RandomRange(1,5);
switch ( d ) {
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 795
case I: x2  ; break;
case 2: х2++; break;
case 3: у2— ; break;
case 4: y2++; break;
} while ( (x2 < 0) | | (x2 >= 4) | | (y2 < 0) | (y2 >=
4)) ;
/* здесь определили фишку, которую
надо переместить в пустую клетку */
pole[yl][xl] =
Р
о1е[у2][х2];
pole[y2][x2] = 16;
xl = х2;
У1 = У2;
// запомним координаты пустой клетки
ex = xl;
еу = yl;
}
// отображает на поверхности формы игровое поле
void fastcall TForml::ShowPole()
int x,y; // координаты левого верхнего угла клетки
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
x = j * HC;
у = i * WC;
if <pole[i][j] != 16 ) {
Canvas >Brush >Color = clBtnFace;
Canvas >Rectangle(x,y, x+WC 1, y+HC 1);
/96 Ч асть 1. Примеры и задачи
Canvas >TextOutA(x+15,у+10,
IntToStr(pole[i][j]));
}
else {
Canvas >Brush >Color = clBtnHighlight;
Canvas >Rectangle(x,y, x+WC 1, y+HC 1);
bool Finish(); // проверяет, правильно ли размещены фишки
// щелчок в клетке
void fastcall TForml::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X,
int Y)
{
int cx,cy; // координаты клетки
ex = X / WC;
cy = Y / HC;
// переместить выбранную клетку в соседнюю свободную
if ( ( a b s ( c x   ex) == 1 & & су еу = = 0 ) ||
( a b s ( c y   еу) == 1 & & с х   е х = = 0 ) )
{
// переместить фишку из (сх,су) в (ех,еу)
pole[ey][ex] = pole[су][сх];
pole [су] [сх] = 16, 
ех = сх;
еу = су;
ShowPole(); // отрисовать поле
if ( Finish () )
{
ShowPole();
Игры и другие полезные программы 197
int r = MessageDlg ("Цель достигнута!\Еще раз?",
mtInformation, TMsgDlgButtonsО « mbYes
« mbNo, 0);
if ( r == mrNo )
Forml >Close(); // завершить работу программы
else
{
NewGame();
ShowPole();
/* проверяет, расположены ли
клетки (фрагменты картинки) в нужном порядке */
bool Finish()
{
bool result;
int row, col;
int к = 1;
result = true; // пусть фишки в нужном порядке
for (row = 0; row < 4; row++)
{
for (col = 0; col < 4; col++)
if ( pole[row][col] == к )
else {
result = false;
break;
}
if ( ! result ) break;
198
Ч а с т ь 1. П р и м е р ы и з а д а ч и
return ( r e s ul t ) ;
// обработка события Paint
void fastcall TForml::FormPaint(TObjesct *Sender)
ShowPole();
И г р а "С о б е р и к а р т и н к у " ( Puzzle)
И г р а С о б е р и к а р ти н к у —а н а л о г и г р ы "15", н о в о т л и ч и е о т п о  
с л е д н е й , н а ф и ш к а х н а р и с о в а н ы н е ц и ф р ы , а ф р а г м е н т ы к а р т и н  
к и (р и с . 1.63). З а д а ч а и г р о к а —р а с п о л о ж и т ь ф и ш к и в п р а в и л ь  
н о м п о р я д к е . И г р а з а к а н ч и в а е т с я , к о г д а к а р т и н к а б у д е т с о б р а н а .
Н о в а я и г р а П а р а м е т р ы С п р а в к а
Р и с . 1.63. О к н о п р о г р а м м ы С о б е р и к а р т и н к у
П р о г р а м м а з а г р у ж а е т к а р т и н к у и з ф а й л а ф о р м а т а BMP, и м я к о  
т о р о г о у к а з а н о в к о м а н д н о й с т р о к е з а п у с к а п р о г р а м м ы , и л и и з
ф а й л а , к о т о р ы й н а х о д и т с я в к а т а л о г е п р о г р а м м ы . Е с л и в к а т а  
л о г е п р о г р а м м ы н е с к о л ь к о ф а й л о в с р а с ш и р е н и е м bmp, т о б у д е т
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 199
з а г р у ж е н п е р в ы й п о п о р я д к у ф а й л . П р и п о в т о р н о й а к т и в и з а ц и и
и г р ы в р е з у л ь т а т е в ы б о р а в с т р о к е м е н ю к о м а н д ы Н о в а я и гр а
з а г р у ж а е т с я с л е д у ю щ и й ф а й л с р а с ш и р е н и е м btnp.
Ф о р м а п р о г р а м м ы С о б е р и к а р ти н к у п р и в е д е н а н а р и с . 1.64.
Н о в а я и г р а П а р а м е т р ы С п р а в к а
Рис. 1.64. Форма программы Собери картинку
#include "math.hpp" // для доступа к Randomize и RandomRange
// размер поля WxH
#define W 4
#define H 4
int we, he; // размер клетки
byte pole[H][W]; // игровое поле
byte ex,ey; // координаты пустой клетки
bool GameOver;
AnsiString fn; // имя bmp файла (картинка)
TSearchRec SearchRec; // результат поиска файла
fastcall TForml::TForml(TComponent* Owner)
: TForm{Owner)
{
pic = new Graphics::TBitmap();
200
Ч асть 1. Примеры и задачи
// начало работы программы
void fastcall TForml::FormShow(TObject *Sender)
{
NewGame();
// новая игра
void fastcall TForml::NewGame()
static int Tag = 0;
// загрузить файл иллюстрации
if (( ParamCountO == 0 ) && (Tag == 0 )) Tag = 1;
switch ( Tag )
case 0 : // имя файла   из командной строки
fn = ParamStr(1);
Tag = 1;
break;
case 1: // выбрать первый по порядку bmp файл
FindFirst("*.bmp",faAnyFile,SearchRec);
fn = SearchRec.Name;
Tag = 2;
brea k;
c a se 2: / / в ы б р а т ь с л е д у ю щ и й bmp  ф а й л
if ( FindNext(SearchRec) != 0)
FindFirst("*.bmp",faAnyFile,SearchRec);
fn = SearchRec.Name;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 201
br eak ; ,
// загрузить иллюстрацию
try {
pic >LoadFromFile(fn);
}
catch (EFOpenError &e)
{
MessageDlg("Ошибка доступа к файлу иллюстрации",
mtWarning, TMsgDlgButtons ()« mbOK«mbHelp, 0) ;
return;
// определить размер клетки
we = pic >Width / W;
he = pic >Height / H;
// установить размер формы
ClientWidth = we * W;
ClientHeight = he * H;
// исходное (правильное) положение фишек
int k = 1;
for (int i = 0; i < H; i++)
for ( i n t j = 0; j < W; j++)
p o l e t i ] [ j ] = k++;
GameOver = false,  
Mixer(); // перемешать фишки
ShowPole(); // отобразить игровое поле
202
// перемешивает
void fastcall
int
int
int
xl,yl;
x2,y2;
d;
фишки
TForml::Mixer()
// пустая летка
// эту переместить в пус
// направление относитех
Ч асть 1. Примеры и задачи
•тую
\ьно пустой
Randomized ;
xl = 3; yl = 3; // см. описание массива stp
for ( int i = 0; i < 150; i++) // кол во перестановок
{
do {
x2 = xl;
У2   yl;
// выберем фишку, примыкающую к пустой клетке,
// которую переместим в пустую летку
d = RandomRange(1,5);
switch ( d ) {
case 1: x2  ; break;
case 2: x2++; break;
case 3: y2  ; break;
case 4: y2++; break;
}
} while ((x2 < 0) || (x2 >= W) ||
(y2 < 0) ] | (y2 >= H)) ;
/* здесь определили фишку, которую
надо переместить в пустую клетку */
poletyl][xl] = pole[y2][x2];
pole[y2][х2] = 16;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 203
xl = х2;
yl = у2;
};
// запомним координаты пустой летки
ex = xl;
еу = yl;
// отображает на поверхности формы игровое поле
void fastcall TForml::ShowPole()
TRect src, dst; // фрагмент картинки и область ее
// ее отображения на поверхности формы
int sx,sy;
for (int i = 0; i < H; i++)
for (int j = 0; j < W; jj++)
{
/ / П р е о б р а з у е м н о м е р ф р а г м е н т а к а р т и н к и в
/ / к о о р д и н а т ы л е в о г о
/ / в е р х н е г о у г л а о б л а с т и   и с т о ч н и к а
sx = ( ( p o l e [ i ] [ j ]   D % W) * we;
sy = < ( p o l e[ i ] [ j ]   D / H) * h e;
src = Bounds(sx,sy,we,he);
dst = Bounds(j*wc,i*hc,we,he);
if (( pole[i][j] != 16 ) || GameOver )
// фрагмент картинки
Canvas >CopyRect(dst,pic >Canvas,src);
else
{
// пустая летка
Canvas >Brush >Style = bsSolId;
204
if
/
t
Canvas >Brush >Color = •
Canvas >Rectangle(dst);
( N6 >Checked )
// вывести номер фишки
Canvas >Brush >Style = bsClear;
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
Canvas >TextOutA(wc*j,hc*i,
Ч асть 1. Примеры и задачи
:lBtnFace;
IntToStr(pole[i][j]));
// щелчок в клетке
void fastcall TForml::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int cx,cy; // координаты клетки
cx = X / wcj
cy = Y / he 
Move (ex,cy); // переместить выбранную клетку в соседнюю
// свободную
bool Finish(); // проверяет, правильно ли размещены фишки
// перемещает фишку из клетки, в которой сделан щелчок
// в свободную клетку
void __fastcall TForml::Move(int cx, int cy)
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 205
{
if ( ( a b s ( c x   ex) == 1 & & су еу = = 0 ) ||
( abs(cy   еу) == 1 & & с х   е х = = 0 ) )
{
// переместить фишку из (сх,су) (ех,еу)
pole[ey][ex] = pole[су][сх];
pole[су][сх] = 16;
ех = сх;
еу = су;
// отрисовать поле
ShowPole();
if ( Finish () ) N
{
GameOver = true;
ShowPole();
int r = MessageDlg ("Цель достигнута! "
"Еще раз (другая картинка)?",
mtInformation,
TMsgDlgButtons() « mbYes « mbNo, 0);
if ( r == mrNo )
Forml >Close(); // завершить работу программы
else
{
NewGame();
ShowPole();
// проверяет, расположены ли клетки (фрагменты картинки) в
// нужном порядке
bool Finish()
206 Ч асть 1. Примеры и задачи
{
bool result;
int row, col;
int к = 1, 
result = true; // пусть фишки в нужном порядке
for (row = 0; row < H; row++)
{
for (col = 0; col < W; col++)
if ( pole[row][col] •  к )
else {
result = false;
break;
}
if ( ! result ) break;
}
return (result);
// обработка события Paint
void fastoall TForml::FormPaint(TObject *Sender)
{
ShowPole();
// выбор в строке меню команды Новая игра
void fastcall TForml::NlClick(TObject *Sender)
{
NewGame ();
// выбор в меню Справка команды Справка
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 207
void fastoall TForml::N3Click(TObject 'Sender)
{
WinExec("hh.exe puz zle.chm", SW_RESTORE);
/ / в ы б о р в м е н ю С п р а в к а к о м а н д ы О п р о г р а м м е
void _f as t c al l TF orml::N4Click( TO bject *Sender)
{
WinExecCh h . exe   mapid 3 puzzle. ch m", SW_RESTORE)
/ / к о м а н д а П а р а м е т р ы / Н о м е р ф и ш к и
void fas t cal l TF orml::N6Click( TO bject *Sender)
{
N6 >Checked = ! N6 >Checked;
ShowPcle() ;
Игра "Парные картинки"
И г р а П а р н ы е к а р ти н к и р а з в и в а е т в н и м а н и е . В о т е е п р а в и л а .
И г р о в о е п о л е р а з д е л е н о н а к л е т к и , з а к а ж д о й и з к о т о р ы х
с к р ы т а к а р т и н к а . К а р т и н к и п а р н ы е , т . е . н а и г р о в о м п о л е е с т ь
д в е к л е т к и , в к о т о р ы х н а х о д я т с я о д и н а к о в ы е к а р т и н к и . В н а  
ч а л е и г р ы в с е к л е т к и "з а к р ы т ы ". Щ е л ч о к л е в о й к н о п к о й м ы ш и
"о т к р ы в а е т " к л е т к у , в к л е т к е п о я в л я е т с я к а р т и н к а . Т е п е р ь н а д о
н а й т и к л е т к у , в к о т о р о й н а х о д и т с я т а к а я ж е к а р т и н к а , к а к и в
о т к р ы т о й к л е т к е . Щ е л ч о к п о д р у г о й к л е т к е о т к р ы в а е т в т о р у ю
к а р т и н к у (р и с . 1.65). Е с л и к а р т и н к и в о т к р ы т ы х к л е т к а х о д и  
н а к о в ы е , т о э т и к л е т к и "и с ч е з а ю т ". Е с л и р а з н ы е —т о к л е т к и
о с т а ю т с я о т к р ы т ы м и . С л е д у ю щ и й щ е л ч о к з а к р ы в а е т о т к р ы т ы е
к л е т к и и о т к р ы в а е т с л е д у ю щ у ю . С л е д у е т о б р а т и т ь в н и м а н и е ,
ч т о д в е о т к р ы т ы е к л е т к и з а к р ы в а ю т с я д а ж е в т о м с л у ч а е , е с л и
о т к р ы т а я к а р т и н к а т а к а я ж е , к а к и о д н а и з д в у х о т к р ы т ы х . И г  
р а з а к а н ч и в а е т с я , к о г д а и г р о к о т к р о е т — "н а й д е т " в с е п а р ы
к а р т и н о к .
208 Ч а с т ь 1. П р и м е р ы з а д а ч и
'П а р н ы е к а р т и н к и
Н о в а я и г р а С п р а в к а
V
В э т и х к л е т к а х б ы л и
о д и н а к о в ы е к а р т и н к и
И г р о к "н а ш е л " и х .
• Щ е л ч о к в э т о й л е т к е
з а к р о е т о т к р ы т ы е к л е т к и ,
д а ж е е с л и к а р т н к а в
э т о й к л е т к е с о в п а д е т
с о д н о й и з о т к р ы т ы х .
Р и с . 1. 65. И г р о в о е п о л е п р о г р а м м ы П а р н ы е к а р т и н к и
П р о г р а м м а , р е а л и з у ю щ а я и г р у П а р н ы е к а р ти н к и , д е м о н с т р и р у е т
р а б о т у с г р а ф и к о й . В п р и в е д е н н о й р е а л и з а ц и и и г р ы в с е к а р т и н к и
к в а д р а т н ы е и н а х о д я т с я в о д н о м ф а й л е (р и с . 1.66). Э т о п о з в о л и л о
с д е л а т ь п р о г р а м м у "и н т е л л е к т у а л ь н о й " —р а з м е р и г р о в о г о п о л я
(к о л и ч е с т в о к л е т о к п о г о р и з о н т а л и и в е р т и к а л и ) о п р е д е л я е т с я
к о л и ч е с т в о м к а р т и н о к в ф а й л е : з н а я в ы с о т у и ш и р и н у к а р т и н к и
в ф а й л е , п р о г р а м м а в ы ч и с л я е т р а з м е р и к о л и ч е с т в о к а р т и н о к и
у с т а н а в л и в а е т с о о т в е т с т в у ю щ и й р а з м е р и г р о в о г о п о л я .
v Ъ '
Р и с . 1. 66. В с е к а р т и н к и н а х о д я т с я в о д н о м ф а й л е
Ф о р м а п р о г р а м м ы П а р н ы е к а р ти н к и п р и в е д е н а н а р и с . 1.67.
Т а й м е р и с п о л ь з у е т с я д л я о р г а н и з а ц и и з а д е р ж к и и с ч е з н о в е н и я
о т к р ы т ы х к л е т о к , в к о т о р ы х н а х о д я т с я о д и н а к о в ы е к а р т и н к и .
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 209
.П а р н ы е к а р т и н к и
Н о в а я и г р а С п р а в к а
Р и с . 1.67. Ф о р м а п р о г р а м м ы П а р н ы е к а р т и н к и
# i n c lude <Mat h.hpp> / / д л я д о с т у п а к г е н е р а т о р у с л у ч а й н ы х
ч и с е л
# defin e MAX_SIZE 32 / / м а к с и м а л ь н о е к о л   в о п а р к а р т и н о к
# defin e MAX_H 8 / / м а к с и м а л ь н ы й р а з м е р п о л я   8x8
# def in e MAX_W 8
/ / idefine DEBUG / / р е ж и м о т л а д к и
i nt Pole[MAX_W][MAX_H]; / / п о л е
/ * Pole[i][j] < 100   к о д к а р т и н к и , к л е т к а з а к р ы т а ;
Pole[i][j] >= 100 н о < 200   к л е т к а о т к р ы т а
(игрок идит картинку);
Pole[i][j] >= 200   игрок нашел пару для этой картинки
*/
Graphics::TBitmap *Pictures; // картинки
int np; // количество пар картинок
int nf; // кол во открытых (найденных) пар картинок
int no; // количество открытых в данный момент клеток
TPoint openl; // координаты 1 ой открытой клетки
TPoint ореп2; // координаты 2 ой открытой клетки
i nt W,H; / / К о л   в о к л е т о к п о г о р и з о н т а л и и в е р т и к а л и .
/ / П р о и з в е д е н и е W и Н д о л ж н о б ы т ь к р а т н о 2  м
int WK, НК ; // размер клетки (картинки)
210
Ч а с т ь 1. П р и м е р ы и з а д а ч и
TForml *Forml;
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
void fastcall TForml::FormCreate(TObject *Sender)
int np; // кол во картинок в файле pictures
Pictures = new Graphics::TBitmap();
try {
Pictures >LoadFromFile ("pictures .bmp") ;
catch (EFOpenError &e)
ShowMessage("Ошибка доступа к файлу картинок.");
return;
/* В файле pictures находятся все картинки. Предполагается,
что каждая картинка квадратная.
Считаем, что в файле 8,10,12,14 или 15 артинок:
Картинок Клеток Поле
8
10
12
14
15
16
20
24
28
30
4x4
4x5
4x6
4x7
5x6
*/
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 211
Н К = P i c t ur es  > H ei gh t   l ; / / в ы с о т а к а р т и н к и
WK = Н К ; / / ш и р и н а к а р т и н к и
np = P ict ures  > Widt h / WK;
i f ( np < 15)
H = 4;
e l s e H = 5;
W = (np*2)/ H;
// установить размера поля (формы)
ClientHeight = H * НК ;
ClientWidth = W * WK;
// настройка таймера
Timerl >Enabled = False;
Timerl >Interval = 200;
NewGame();
// новая игра
void fastcall TForml::NewGame()
{
/* В каждую ячейку Pole надо записать номер картинки.
Так как для каждой картинки должна быть пара, то
число i должно быть в двух ячейках Pole */
int r; // случайное число
int buf[MAX_SIZE];
/* в buf[i] записываем, сколько раз число i
записали в массив Pole */
int i, j; // индексы массивов
212 Ч а с т ь 1. П р и м е р ы и з а д а ч и
/ / з а п и ш е м в м а с с и в Pole с л у ч а й н ы е ч и с л а
/ / о т 0 д о п р , г д е л   к о л   в о к а р т и н о к
/ / к а ж д о е ч и с л о д о л ж н о б ы т ь з а п и с а н о д в а р а з а
tor (i = 0 ; i < np;
buf[i] = 0;
Randomize!); // инициализация ГСЧ
for (i = 0; i < H; i++)
for (j = 0; j < W; j++) {
do {
r = RandomRange(0,np);
} while ( buf[r] ==2 );
Pole[i]tj] = r; // код картинки
buf[r]++;
}
// здесь поле сгенерировано
nf = 0;
// отрисовывает поле
void fastcall TForml::ShowPole()
{
int row, col;
for ( row = 0; row < H; row++)
for (col = 0; col < W; col++)
Kletka(row,col);
// рисует клетку поля
void fastcall TForml::Kletka(int col,int row)
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 213
{
int х, у; // левый верхний угол клетки (координаты)
TRect src, dst; // источник и получатель битового образа
/ / п р е о б р а з у е м к о о р д и н а т ы к л е т к и
/ / в к о о р д и н а т ы н а п о в е р х н о с т и ф о р м ы
х = (col)*WK;
у = (row)*HK;
i f ( P o le[ c o l] [ r o w] >= 200 ) {
/* Для этой клетки найдена ара.
Клетку надо убрать с поля */
/ / у с т а н о в и т ь ц в е т г р а н и ц ы и з а к р а с к и о б л а с т и
Canvas  > Brush  > Color = c lBt n F a c e;
Canvas  > Pen  > Color • c lBt n F a c e;
Can vas  > Rect an gle( x, у , x+WK  2, y+HK  2);
return;
i f ( ( P olefcol] [ row] >= 100) && ( P olefcol] [ row] < 200) ) {
/ / к л е т к а о т к р ы т а   в ы в е с т и к а р т и н к у
/ / Pole[col,row] =  н о м е р к а р т и н к и + 100,
/ / г д е 100   п р и з н а к т о г о , ч т о к л е т к а о т к р ы т а
/ / о п р е д е л и м п о л о ж е н и е к а р т и н к и в Pictures
sr c = Boun ds( ( P ole[ c ol] [ row]   100 )*WK,0,WK,HK);
/ / к о о р д и н а т ы к а р т и н к и (к л е т к и ) н а ф о р м е
ds t = Bounds(х , у , Н К   2, WK  2);
/ / в ы в е с т и к а р т и н к у в к л е т к у
214 Ч адть 1. Примеры и задачи
Forml >Canvas >CopyRect(dst,Pictures >Canvas,src);
// нарисовать контур клетки
Canvas >Pen >Color = clBlack;
Canvas >Brush >Style = bsClear;
Canvas >Rectangle(x,у,x+WK 2,y+HK 2);
return;
if ( (Pole[col][row] >= 0) && (Pole[col][row] < 100)
// клетка закрыта, рисуем только онтур
{
Canvas >Brush >Color = clBtnFace;
Canvas >Pen >Color = clBlack;
Canvas >Rectangle(x,у,x+WK 2,y+HK 2);
#ifdef DEBUG
// подсказка   номер картинки
Canvas >Font >Color = clBlack;
Canvas >TextOut(x+l5,y+15, IntToStr(Pole[col][row])
#endif
// нажатие кнопки мыши
void fastcall TForml::FormMouseDown(TObject *Sender,
TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int col; // номер клетки по горизонтали
int row; //номер клетки по вертикали
col = X/WK;
row = Y/HK;
Игры и другие полезные программы 215
if ( Pole[col][row] >= 200 )
// щелчок на'месте уже открытой картинки
return;
if ( no == 0 ) // открытых клеток нет
{
ПО = 1 ;
openl.х = col;
open 1. у = row;
// клетка помечается как открытая
Pole[openl.x][openl.у] += 100;
Kletka(openl.x,openl.у);
return;
i f ( no == 1 )
{
/ / о т к р ы т а о д н а к л е т к а , н а д о о т к р ы т ь в т о р у ю
о р е п 2. х = c o l ;
о р е п 2. у = row;
/ / е с л и о т к р ы т а о д н а к л е т к а и щ е л ч о к с д е л а н
/ / в э т о й к л е т к е , т о н и ч е г о н е п р о и с х о д и т
i f ( ( o p en l. х == о р е п 2.х ) && ( o pen l. у == о р е п 2. у ) )
return;
e l s e
{
п о = 2; / / т е п е р ь о т к р ы т ы д в е к л е т к и
P ole[ open 2. x] [ о р е п 2. у ] += 100;
Klet ka ( о р е п 2. х , о р е п 2. у ) ; / / о т р и с у е м в т о р у ю к л е т к у
216 Ч асть 1. Примеры и задачи
// проверим, открытые картинки одинаковые?
if ( Pole[openl.x][openl.у] == Pole[open2.x][open2.у] )
// открыты две одинаковые картинки
{
nf++;
F orml  > Timerl  > Enabled = True; / / з а п у с т и т ь т а й м е р
/ / п р о ц е д у р о б р а б о т к и с о б ы т и я On Timer
/ / "с о т р е т " д в е о д и н а к о в ы е к а р т и н к и
};
return;
i f ( no == 2 )
{
/ / о т к р ы т ы 2 к л е т к и с р а з н ы м и к а р т и н к а м и
/ / з а к р о е м и х и о т к р о е м н о в у ю , в к о т о р о й
/ / с д е л а н щ е л ч о к
/ / з а к р ы т ь о т к р ы т ы е к л е т к и
P o l e[ o p en l . x] [ o p en l . у ]   = 100;
P o le[ o pen 2. x] [ o pen 2. y]   = 100;
Kl et ka ( o p en l . x, o p en l . у ) ;
Klet ka ( o p en 2. х , о р е п 2. у ) ;
// запись в openl номера текущей клетки
openl.х = col;
openl.у = row;
no = 1; // счетчик открытых клеток
// открыть текущую клетку
Pole[openl.x][openl.у] += 100;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 217
Kletka(openl.x,openl,y);
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender>
{
/* Сейчас отображаются две одинаковые картинки.
Пометим их как найденные и уберем с экрана. */
Pole[openl.x][openl.у] += 100;
Pole[open2.x][ореп2.у] += 100;
по = 0; // количество открытых клеток
// Отрисовать клетки
Kletka(ореп2.х,ореп2.у);
Kletka(openl.х,openl.у);
// остановить таймер
Forml >Timerl >Enabled = false;
if ( nf == W*H/2 )
{
// открыты все пары
Canvas >Font >Name = "Tahoma";
Canvas >Font >Size = 16;
Canvas >Font >Color = clBlue;
Canvas >Font >Color = clBlack;
Canvas >TextOut(100,160,"Game Over!");
Canvas >Font >Size = 10;
Canvas >TextOut(120,210,"(с) К ультинН.Б ., 2005")
218 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// обработка события Paint
void fastcall TForml::FormPaint(TObject *Sender)
{
ShowPole();
// команда Новая программа
void fastcall TForml::NlClick(TObject *Sender)
{
NewGame();
ShowPole() ;
/ / К о м а н д а С п р а в к а / С п р а в к а
void fas t cal l TF orml::N3Click( TO bject *Sender)
{
WinExec("hh.exe dpic.chm", SW_RESTORE);
// Команда Справка/О программе
void fastcall TForml::N4Click(TObject *Sender)
{
Win ExecCh h . exe   mapid 3 dpic. ch m", SW_RESTORE) ;
Э к з а м е н а т о р
П р о ф а м м а Э к з а м е н а т о р (р и с . 1.68) п о з в о л я е т а в т о м а т и з и р о в а т ь
п р о ц е с с т е с т и р о в а н и я . В о к е п р о ф а м м ы о т о б р а ж а е т с я т е с т —
п о с л е д о в а т е л ь н о с т ь в о п р о с о в , н а к о т о р ы е и с п ы т у е м ы й д о л ж е н
о т в е т и т ь п у т е м в ы б о р а п р а в и л ь н о г о о т в е т а . В р а с с м а т р и в а е м о й
п р о ф а м м е в о п р о с ы з а ф у ж а ю т с я и з ф а й л а (п р и м е р ф а й л а т е с т а
п р и в е д е н н а р и с . 1.69). И м я ф а й л а т е с т а п е р е д а е т с я п р о ф а м м е
п р и е е з а п у с к е —у к а з ы в а е т с я в к а ч е с т в е п а р а м е т р а к о м а н д ы
з а п у с к а .
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 219
Щ ь И с т о р и я С а н к т   П е т е р б у р г а
А р х и т е к т о р И с а а к и е в с к о г о с о б о р а :
ш и ш : Г ^Г
С Д о м е н и к о Т р е з и н и
(~ О г ю с т М о н ф е р р а н
С к а р л Р о с с и
Р и с . 1 . 6 8 . О к н о п р о г р а м м ы Э к з а м е н а т о р .
П о л ь з о в а т е л ь д о л ж е н в ы б р а т ь п р а в и л ь н ы й о т в е т
И с т о р и я С а н к т   П е т е р б у р г а
С е й ч а с В а м б у д у т п р е д л о ж е н ы в о п р о с ы о з н а м е н и т ы х п а м я т н и к а х и а р х и т е к т у р  
н ы х с о о р у ж е н и я х С а н к т   П е т е р б у р г а . В ы д о л ж н ы и з п р е д л о ж е н н ы х н е с к о л ь к и х
в а р и а н т о в о т в е т а в ы б р а т ь п р а в и л ь н ы й .
В ы п р е к р а с н о з н а е т е и с т о р и ю С а н к т   П е т е р б у р г а !
В ы м н о г о з н а е т е о С а н к т   П е т е р б у р г е , н о н а н е к о т о р ы е в о п р о с ы о т в е т и л и н е в е р  
н о .
5
В ы н е д о с т а т о ч н о х о р о ш о з н а е т е и с т о р и ю С а н к т   П е т е р б у р г а .
4
В ы , в е р о я т н о , т о л ь к о н а ч а л и з н а к о м и т ь с я с и с т о р и е й С а н к т   П е т е р б у р г а ?
А р х и т е к т о р И с а а к и е в с к о г о с о б о р а :
3 2 1
Р и с . 1. 69. П р и м е р ф а й л а т е с т а (н а ч а л о )
8 З а к . 1241
220 Ч а с т ь 1. П р и м е р ы и з а д а ч и
isaak.jpg
Д о м е н и к о Т р е з и н и
О г ю с т М о н ф е р р а н
К а р л Р о с с и
А л е к с а н д р о в с к а я к о л о н а в о з д в и г н у т а в 1836 г о д у п о п р о е к т у О г ю с т а М о н ф е р р а н а
к а к п а м я т н и к , п о с в я щ е н н ы й :
21 О
д е я н и я м и м п е р а т о р а А л е к с а н д р а I.
п о д в и г у н а р о д а в О т е ч е с т в е н н о й в о й н е 1812 г о д а .
А р х и т е к т о р З и м н е г о д в о р ц а
32 1
herm.jpg
Б артоломео Растрелли
К арл Росси
О г ю с т М о н ф е р р а н
М и х а й л о в с к и й (И н ж е н е р н ы й ) з а м о к   ж е м ч у ж и н а а р х и т е к т у р ы П е т е р б у р г а п о с т р о  
е н п о п р о е к т у
31 О
В о р о н и х и н а А н д р е я Н и к и ф о р о в и ч а
С т а р о в а И в а н а Е г о р о в и ч а
Б а ж е н о в а В а с и л и я И в а н о в и ч а
О с т р о в , н а к о т о р о м н а х о д и т с я Б о т а н и ч е с к и й с а д , о с н о в а н н ы й и м п е р а т о р о м П е т  
р о м I, н а з ы в а е т с я :
3 3 0
З а я ч и й
М е д и ц и н с к и й
А п т е к а р с к и й
Н е в с к и й п р о с п е к т п о л у ч и л с в о е н а з в а н и е
3 2 0
п о и м е н и р е к и , н а к о т о р о й с т о и т С а н к т   П е т е р б у р г .
п о и м е н и б л и з к о р а с п о л о ж е н н о г о м о н а с т ы р я , А л е к с а н д р о   Н е в с к о й л а в р ы .
в п а м я т ь о з н а м е н и т о м п о л к о в о д ц е   А л е к с а н д р е Н е в с к о м .
С к у л ь п т у р а з н а м е н и т о г о п а м я т н и к а П е т р у I в ы п о л н е н а
2 1 0
Ф а л ь к о н е
К л о д т о м
Р и с . 1. 69. П р и м е р ф а й л а т е с т а (о к о н ч а н и е )
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы
221
П е р в ы е д в а а б з а ц а ф а й л а — э т о н а з в а н и е т е с т а и о б щ а я и н ф о р  
м а ц и я . Д а л е е с л е д у е т р а з д е л о ц е н о к , в к о т о р о м у к а з ы в а ю т с я к о  
л и ч е с т в о б а л о в , н е о б х о д и м о е д л я д о с т и ж е н и я у р о в н я , и о ц е н к а
(в с е г о ч е т ы р е у р о в н я ). З а р а з д е л о м о ц е н о к с л е д у ю т в о п р о с ы .
К а ж д ы й в о п р о с п р е д с т а в л я е т с о б о й п о с л е д о в а т е л ь н о с т ь а б з а ц е в .
П е р в ы й а б з а ц —в о п р о с , в т о р о й —п о с л е д о в а т е л ь н о с т ь ц и ф р
(к о л и ч е с т в о а л ь т е р н а т и в н ы х о т в е т о в , н о м е р п р а в и л ь н о г о о т в е т а
и п р и з н а к н а л и ч и я и л л ю с т р а ц и и ). С л е д у ю щ и е н е с к о л ь к о а б з а  
ц е в — э т о в а р и а н т ы о т в е т а .
И м я ф а й л а т е с т а п е р е д а е т с я п р о г р а м м е т е с т и р о в а н и я п р и е е з а  
п у с к е —у к а з ы в а е т с я в к а ч е с т в е п а р а м е т р а к о м а н д ы з а п у с к а .
Ф о р м а п р о г р а м м ы Э к за м е н а то р п р и в е д е н а н а р и с . 1.70. С л е д у е т
о б р а т и т ь в н и м а н и е , ч т о к н о п к и в ы б о р а о т в е т а с о з д а ю т с я д и н а м и  
ч е с к и , в о в р е м я р а б о т ы п р о г р а м м ы , и п о э т о м у н а ф о р м е и х н е т .
I к : э к з а м е н а т о р
Labeli
I magei
Buttoni
OK
Р и с . 1.70. Ф о р м а п р о г р а м м ы Э к з а м е н а т о р
// *** заголовочный (п) файл формы
// вопрос
struct TVopros {
AnsiString Vopr; // вопрос
222 Ч асть 1. Примеры и задачи
AnsiString Img; // иллюстрация (имя ВМР файла)
AnsiString Otv[4]; // варианты ответа
int nOtv; // кол во вариантов ответа
int rOtv; // номер правильного ответа
class TForml : public TForm
{
published:
TLabel *Labell; // информационное сообщение, вопрос
Tlmage *Image1; // иллюстрация к вопросу
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);
// *** модуль формы ***
#include <stdio.h> // для доступа к функции sscanf
iinclude <jpeg.hpp> // обеспечивает работу с
// jpg иллюстрациями
#pragma package(smart_init)
#pragma resource "*.dfm"
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 223
TForml *Forml; // форма
int f; // дескриптор файла теста
// имя файла теста берем из командной строки
int level[4]; // кол во правильных ответов, необходимое
// для достижения уровня
AnsiString mes[4];// сообщение о достижении уровня
TVopros Vopros; // вопрос
int otv; // номер выбранного ответа
int right = 0 ; // кол во правильных ответов
i
// функции, обеспечивающие чтение вопроса из файла теста
int Getlnt(int f); // читает целое
int GetStringfint f, AnsiString *st); // читает строку
// конструктор
fastcall TForml::TForml(ТСomponent* Owner)
: TForm(Owner)
{
int i;
int left = 10;
// создадим радиокнопки для выбора
// правильного ответа, но сделаем их невидимыми
tor (i = 0; i < 4; i++ )
{
// создадим радиокнопку
RadioButton[i] = new TRadioButton(Forml);
// установим значения свойств
RadioButton[i] >Parent = Forml;
RadioButton[i] >Left = left;
RadioButton[i] >Width = Forml >
224 Ч а с т ь 1. П р и м е р ы и з а д а ч и
ClientWidth   left   20;
RadioButton[i] >Visible = false;
RadioButton[i] >Checked = false:
// зададим функцию обработки события Click
RadioButton[i] >OnClick = RadioButtonClick;
void fastcall TForml::FormActivate(TObject *Sender)
{
AnsiString st;
// имя файла теста должно быть указано в командной строке
int n = ParamCount();
if ( n < 1 )
{
Labell >Font >Style = TFontStyles()« fsBold;
Labell >Caption = "В командной строке запуска"
"программы надо задать имя файла теста";
Buttonl >Tag = 2;
return; N
/ / о т к р ы т ь ф а й л т е с т а
f = FileOpen(ParamStr(1), fmOpenRead);
if ( f ==  1 )
{
Labell >Font >Style = TFontStyles()« fsBold;
Labell >Caption = "Ошибка доступа к файлу теста" +
ParamStr(1);
Buttonl >Tag = 2;
return;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 225
// вывести информацию о тесте
G et St r i n g( f , &st ) ; / / п р о ч и т а т ь н а з в а н и е т е с т а
Forml >Caption = st;
GetString(f, &st); // прочитать вводную информацию
Labell >Width = Forml >ClientWidth   Labell >Left  20;
Labell >Caption = st;
Labell >AutoSize = true, 
// прочитать информацию об уровнях оценки
for (int i=0; i<4; i
level[i] = Getlnt(f);
GetString(f, &mes[i]);
/ / ч и т а е т и з ф а й л а о ч е р е д н о й в о п р о с
bool GetVopros(TVopros *v)
{
AnsiString st;
int p; // если р=1, то к вопросу есть иллюстрация
if ( GetString(f, &(v >Vopr)) != 0 )
{
/ * п р о ч и т а т ь к о л   в о в а р и а н т о в о т в е т а , н о м е р
п р а в и л ь н о г о о т в е т а и п р и з н а к н а л и ч и я
и л л ю с т р а ц и и */
v  > nOt v = G et l n t ( f ) ;
v  > rO t v = G e t l n t ( f ) ;
p = G e t l n t ( f ) ;
if (p) //к вопросу есть иллюстрация
GetString(f,&(v >Img) );
226 Ч а с т ь 1. П р и м е р ы з а д а ч и
el s e v  >Img = "";
// читаем варианты ответа
for (int i = 0; i < v >nOtv; i
{
GetStringff,&(v >0tv[i])
}
return true;
}
else return false;
// выводит вопрос
void fastcall TForml::ShowVopros(TVopros v)
{
int top;
int i;
// вопрос
Labell >Width = ClientWidth   Labell->Le£t -20;
Labell->Caption = v.Vopr;
Labell->AutoSize = true;
if (v.Img != "") //к вопросу есть иллюстрация
I
/* определим высоту области, которую можно
использовать для вывода иллюстрации */
int RegHeight = Buttonl >Top
  (Labell >Top + Labell >Height +10)
  (RadioButton[l] >Height + 10) * v.nOtv;
Imagel >Top = Labell >Top + Labell >Height + 10;
// загрузим картинку и определим ее размер
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 227
Imagel >Visible = false;
Imagel >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;
}
else // положение полей отсчитываем от вопроса
top = Labell >Top + Labell >Height + 10;
// варианты твета
for (i = 0; i < v.nOtv; i++)
{
RadioButton[i] >Top = top;
RadioButton[i] >Caption = v.0tv[i];
RadioButton[i] >Visible = true;
RadioButton[i] >Checked = false;
top += 20;
// щелчок на радиокнопоке выбора твета
void fastcall TForml::RadioButtonClick(TObject *Sender)
{
int i =0;
while ( ! RadioButton[i] >Checked )
228 Ч а с т ь 1. П р и м е р ы и з а д а ч и
otv = i+1;
// ответ выбран, сделаем доступной кнопку Дальше
Buttonl >Enabled = true;
// удаляет вопрос с экрана
void fastoall TForml::EraseVopros(void)
{
Imagel >Visible = false,  // скрыть поле вывода иллюстрации
// скрыть поля выбора ответа
for (int i = 0; i <4; i
RadioButton[i] >Visible = false 
RadioButton[i] >Checked = false;
}
// сделать недоступной кнопку Дальше
Buttonl >Enabled = false;
// щелчок на кнопке ОК/Дальше/ОК
void fastcall TForml::ButtonlClick(TObject *Sender)
{
bool ok; // рез т чтения из файла очередного вопроса
switch (Buttonl >Tag) {
case 0: // щелчок на кнопке ОК в начале работы
// программы
// прочитать и вывести первый вопрос
GetVopros(&Vopros);
ShowVopros(Vopros);
Buttonl >Caption   "Дальше";
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 229
Buttonl >Enabled = false, 
Buttonl >Tag = 1;
break;
case 1: //^щелчок на кнопке Дальше
if (otv == Vopros.rOtv) // выбран правильный
// ответ
right++;
EraseVopros();
ok = GetVopros(&Vopros);
if ( ok )
ShowVopros(Vopros);
else
// вопросов больше нет
{
FileClose(f);
// вывести результат
AnsiString st; // сообщение
int i; // номер достигнутого уровня
Forml >Caption = "Результат тестирования";
st.printf(
"Правильных ответов: %i\n",right
// определим оценку
i = 0; // предположим, что испытуемый
/ / о т в е т и л н а в с е
// вопросы
while (( right < level[i]) && (i < 3))
st = st + mes[i];
230 Ч а с т ь 1. П р и м е р ы и з а д а ч и
Labell >Caption = st;
Buttonl >Caption = "OK";
Buttonl >Enabled = true;
Buttonl >Tag = 2;
}
break;
case 2: // щелчок на OK в конце работы программы
Forml >Close(); // завершить работу программы
// Функция GetString читает строку из файла
// значение функции   кол во прочитанных символов
int GetString(int f, AnsiString *st)
unsigned char buf[3 00]; // строка (буфер)
unsigned char *p = buf; // указатель на строку
int n; // кол во прочитанных байт (значение ф и FlleRead)
int len = 0; // длина строки
n = FileRead(f, р, 1);
while ( п != 0 )
if ( *р == '\г')
n = F ileReacHf, р , 1) ; / / п р о ч и т а т ь '\ п '
brea k;
len++;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 231
n = FileRead(f, p, 1);
*р = '\0';
if ( len !=0) st >printf("%s", buf)
return len;
// читает из файла целое число
int Getlnt(int f)
{
char buf[20]; // строка (буфер)
char *p = buf; // указатель на строку
int n; // кол во прочитанных байт (значение ф и FileRead)
int a; // число, прочитанное из файла
n = FileRead(f, p, 1) ;
while ( (*р >= '0') && (*р <= '9') ScSc (n > 0) )
{
Р++;
n = FileRead(f, p, 1) ;
if ( *р == Чг')
n = FileReadff, р, 1); // прочитать '\п'
*р = ' \0 • ;
// преобразуем строку из буфера в целое
sscanf(buf,"%i", &а);
return a;
232
Ч а с т ь 1. П р и м е р ы и з а д а ч и
Э к з а м е н а т о р   2
П р о г р а м м а Э к за м е н а то р   2 (р и с . 1.71) п о з в о л я е т а в т о м а т и з и р о в а т ь
п р о ц е с с т е с т и р о в а н и я . И м я ф а й л а т е с т а п е р е д а е т с я п р о г р а м м е
п р и е е з а п у с к е —у к а з ы в а е т с я в к а ч е с т в е п а р а м е т р а к о м а н д ы з а  
п у с к а (р и с . 1.72).
* ? Э к о н о м и к а
К а р л М а р к с н а п и с а л ж и г у ;
С " м а т е р и а л и з м и м п и р и о к р и т и ц и з м "
С "К а к н а м б о р о т ь с я с и н ф л я ц и е й "
С * Г К а п и т а л " !
Р и с . 1. 71. О к н о п р о г р а м м ы Э к з а м е н а т о р   2
З а п у с к п р о г р а м м ы •
В в е д и т е и м я п р о г р а м м ы , п а п к и , д о к у м е н т а и л и
р е с у р с а И н т е р н е т а , и Windows о т к р о е т и х .
О т к р ы т ь :! е с Ь $\ Э к з а м е н а т о р \ у l\ Exam.exe "economics.xml" VI
Р и с . 1. 72. Ф а й л т е с т а н а д о у к а з а т ь
в к о м а н д е з а п у с к а П р о г р а м м ы
Т е с т п р е д с т а в л я е т с о б о й XML  д о к у м е н т о п р е д е л е н н о й с т р у к т у р ы
(р и с . 1.73). У з л ы head и descript ion с о д е р ж а т н а з в а н и е и о б щ у ю
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 233
и н ф о р м а ц и ю о т е с т е . У з л ы q —э т о в о п р о с ы . З н а ч е н и е а т р и б у т а
t ext у з л а q п р е д с т а в л я е т с о б о й в о п р о с , а т р и б у т а right — н о м е р
п р а в и л ь н о г о о т в е т а . К а ж д ы й у з е л а —э т о в а р и а н т о т в е т а . У з л ы
level с о д е р ж а т и н ф о р м а ц и ю о б у р о в н я х о ц е н к и р е з у л ь т а т а т е с т и  
р о в а н и я : а т р и б у т score о п р е д е л я е т к о л и ч е с т в о п р а в и л ь н ы х о т в е  
т о в , н е о б х о д и м о е д л я д о с т и ж е н и я у р о в н я , а т р и б у т t ext —о ц е н к у .
С о з д а т ь ф а й л т е с т а м о ж н о , н а п р и м е р , п р и п о м о щ и Б л о к н о т а .
В к а ч е с т в е п р и м е р а н а р и с . 1.73 п р и в е д е н т е с т "Э к о н о м и к а ".
<?xml version="1.0" encoding="Windows 1251"?>
<test>
<Ь е а с !>Э к о н о м и к а </ Г 1е а с )>
<description>Ceiii4ac В а м б у д у т п р е д л о ж е н ы в о п р о с ы и з р а з н ы х р а з д е л о в
э к о н о м и к и . В ы д о л ж н ы и з п р е д л о ж е н н ы х н е с к о л ь к и х в а р и а н т о в о т в е т о в в ы б р а т ь
п р а в и л ь н ы й .</ description>
<qw>
<q text="Kapn М а р к с н а п и с а л к н и г у :" src ="marks.jpg" right="3">
<а >"М а т е р и а л и з м и э м п и р и о к р и т и ц и з м "</ а >
<а >"К а к н а м б о р о т ь с я с и н ф л я ц и е й "</ а >
<а >"К а п и т а л "</ а >
<q text="KorAa в п е р в ы е п о я в и л и с ь б а р т е р н ы е с д е л к и ?" src ="" right="1">
<а >п р и п е р в о б ы т н о о б щ и н н о м с т р о е </ а >
<а >в п е р и о д о б щ е с т в е н н о г о р а з д е л е н и я т р у д а </ а >
<а >в н а ш е в р е м я </ а >
<q text="«Hoy  xay» о б о з н а ч а е т :" src ="" right="3">
<а >с е к р е т </ а >
<а >н о в о е п р е д п р и я т и е </ а >
<а >н о в а я и д е я (з н а ю , к а к )</ а >
</ q>
<q text="CTaBKa д и с к о н т и р о в а н и я п о з в о л я е т :" src ="" right="1 ">
<а >п р и в е с т и с т о и м о с т ь д е н е г в б у д у щ е м к т е к у щ е м у м о м е н т у </ а >
<а >р а с ч и т а т ь с к и д к у п о к р е д и т у </ а >
<а >у ч е с т ь и н ф л я ц и ю </ а >
Р и с . 1. 73. П р и м е р ф а й л а т е с т а (н а ч а л о )
234
Ч а с т ь 1. П р и м е р ы и з а д а ч и
</ qw>
<levels>
<level score="4" text = "О ц е н к а   О Т Л И Ч Н О ."/ >
<level score="3" text = " О ц е н к а   Х О Р О Ш О .7>
<level score="2" text = "О ц е н к а   У Д О В Л Е Т В О Р И Т Е Л Ь Н О ." ^
<level score="0" text = "О ц е н к а   П Л О Х О !"/ >
</ levels>
</ test>
Р и с . 1 . 7 3 . П р и м е р ф а й л а т е с т а (о к о н ч а н и е )
Ф о р м а п р о г р а м м ы Э к за м е н а то р   2 п р и в е д е н а н а р и с . 1.74. К о м п о  
н е н т XMLDocument о б е с п е ч и в а е т ч т е н и е и з XML  ф а й л а : в о п р о с о в ,
а л ь т е р н а т и в н ы х о т в е т о в и д р у г о й и н ф о р м а ц и и . Н и ж е п р и в е д е н
п р и м е р ф а й л а т е с т а . В о п р о с , а т а к ж е и н ф о р м а ц и я о т е с т е и р е  
з у л ь т а т т е с т и р о в а н и я , о т о б р а ж а ю т с я в п о л е к о м п о н е н т а Labeli.
К омпоненты RadioButtonl, RadioButton2 И RadioButton3 ИС 
п о л ь з у ю т с я д л я о т о б р а ж е н и я в а р и а н т о в о т в е т а . Н е в и д и м ы й в о
в р е м я р а б о т ы п р о г р а м м ы к о м п о н е н т RadioButton4 и с п о л ь з у е т с я
д л я с б р о с а п е р е к л ю ч а т е л е й в ы б о р а о т в е т а п е р е д в ы в о д о м о ч е р е д  
н о г о в о п р о с а .
  Ш Ш М х
f* RadioButfcnl
С RadioButtorfi
С RadioButtorS
у RadioButton4
Р и с . 1. 74. Ф о р м а п р о г р а м м ы Э к з а м е н а т о р   2
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 235
int nQuery = 0; // всего вопроов
int nRight; // правильных ответов
int Right; // правильный ответ
int Sel; // ответ, выбранный испытуемым
static int mode = 0 ; //0   начало работы программы
// (вывести первый вопрос)
// 1   процесс тестирования
// 2   тестирование завершено
// начало работы
void fastcall TForml::FormActivate(TObject *Sender)
{
if (ParamCount() = = 0 ) {
Labell >Caption = "В командной строке надо указать "
"имя файла теста";
mode = 2;
return;
XMLDocumentl >FileName = ParamStr(l);
try
{
// открыть XML документ
XMLDocumentl >Active = True;
}
catch (EDOMParseError &e)
{
Labell >AutoSize = True;
Labell >Caption = "Ошибка доступа к файлу теста " +
ParamStr(l) +
"\nMessage: " + е.Message;
mode = 2;
236 Ч а с т ь 1. П р и м е р ы з а д а ч и
r et ur n ;
Forml >Info(); // вывести информацию о тесте
// считывает и выводит вопрос с указанным номером
int fastcall TForml::Qery(int i)
// привести форму в исходное состояние
RadioButtonl >Visible = False;
RadioButton2 >Visible = False;
RadioButton3 >Visible = False;
RadioButton4 >Checked = True;
Button3 >Enabled = False;
// настроить интерфейс на работу с узлом qw
_di_IXMLNode qw = XMLDocumentl >
DocumentElement >ChildNodes >
Nodes[WideString("qw")];
if ( i > qw >ChildNodes >Count  1 )
return  1;
nQuery++; // количество вопросов
/* У зел q   это вопрос.
Параметр text узла q   это текст вопроса
дети узла g   это альтернативные тветы */
_di_IXMLNode q = qw >ChildNodes >Nodes[i];
/* Атрибут Text узла qw   это текст опроса,
атрибут right   номер правильного ответа */
Игры и ругие полезные программы
237
// вопрос
Labell >AutoSize = false;
Labell >Width = ClientWidth  20;
Labell >Height = 150;
Labell >Caption • q >GetAttribute(WideString("text"));
Labell >AutoSize = true;
Right = StrToInt( q >GetAttribute(WideString("right")));
// узел "q" состоит из нескольких узлов "а"
//(альтернативных ответов)
_di_IXMLNode a;
int j = 0; // номер узла "а"
while ( j < q >ChildNodes >Count )
а = q >ChildNodes >Nodes[j];
switch ( j ) {
case 0 : RadioButtonl >Caption = a >Text;
RadioButtonl >Top = Labell >Top +
Labell >Height + 10;
RadioButtonl >Visible = True; break;
case 1 : RadioButton2 >Caption = a >Text;
RadioButton2 >Top = RadioButtonl >Top +
RadioButtonl >Height + 10;
RadioButton2 >Visible = True,  break;
case 2 : RadioButton3 >Caption = a >Text;
RadioButton3 >Top = RadioButton2 >Top +
RadioButton2 >Height + 10;
RadioButton3 >Visible = True; break;
return 0;
238 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// информация о тесте
void fastcall TForml::Info()
{
Forml >Caption = XMLDocumentl >DocumentElement >
ChildNodes >Nodes[WideString("head")] >Text;
Labell >Caption = XMLDocumentl >DocumentElement >
ChildNodes >Nodes[WideString("description")] >Text;
// щелчок на кнопке ОК
void fastcall TForml::Button3Click(TObject *Sender)
static int i = 0; // номер вопроса
int r; // результат вывода опроса:
//  1   вопросов больше нет
switch ( mode) {
case 0:
г = Qery(i++);
mode = 1;
break;
case 1:
// проверим, правильный ли ответ выбрал
// испытуемый
if ( Sel == Right) nRight++;
/ / в ы в е с т и с л е д у ю щ и й в о п р о с
г = Qery( i + + ) ;
if ( r ==  1 ) // больше вопросов нет
// результат тестирования
Result();
Button3 >Enabled = true;
mode = 2;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 239
break;
case 2: Forml >Close(); // завершить работу программы
// вывести результат тестирования
void fastcall TForml::Result()
(
int i = 0;
int score;
_di_lXMLNode Is; // интерфейс доступа к узлу levels
_di_IXMLNode 1; // интерфейс доступа к узлу level
// считываем последовательно узлы level и сравниваем
// значение параметра score с количеством правильных
// ответов
Is = XMLDocrnnentl >DocumentElement >
ChildNodes >Nodes[WideString("levels")]
while ( i < ls >ChildNodes >Count)
{
1 = ls~>ChildNodes >Nodes[i];
score = StrToInt( l >
GetAttribute(WideString("score")));
if ( nRight >= score ) break;
AnsiString mes;
mes.printf("Экзамен закончен\п"
"Всего вопросов: %i\n"
"Правильных ответов: %i\n",
nQuery,nRight);
240 Ч а с т ь 1. П р и м е р ы и з а д а ч и
mes = mes + l >GetAttribute(WideString("text"));
Labell >Width = Forml >ClientWidth   20;
Labell >Caption = mes;
// пользователь выбрал первый ответ
void fastcall TForml::RadioButtonlClick(TObject *Sender)
{
Sel = 1;
Button3 >Enabled = True;
// пользователь выбрал второй ответ
void fastcall TForml::RadioButton2Click(TObject *Sender)
{
Sel = 2;
Button3 >Enabled = True;
// пользователь выбрал третий твет
void fastcall TForml::RadioButton3Click(TObject *Sender)
{
Sel = 3;
Button3 >Enabled = True;
П р и м е ч а н и е
С л е д у е т о б р а т и т ь в н и м а н и е , ч т о о п е р а ц и о н н у ю с и с т е м у Windows
м о ж н о н а с т р о и т ь т а к , ч т о п р о г р а м м а т е с т и р о в а н и я б у д е т з а п у с  
к а т ь с я а в т о м а т и ч е с к и в р е з у л ь т а т е д в о й н о г о щ е л ч к а н а и м е н и
ф а й л а т е с т а . Ч т о б ы э т о с д е л а т ь , и з м е н и т е р а с ш и р е н и е ф а й л а  
т е с т а , н а п р и м е р , н а etr и с д е л а й т е д в о й н о й щ е л ч о к н а и м е н и
ф а й л а т е с т а . З а т е м , в о к н е В ы б о р п р о г р а м м ы , с д е л а й т е щ е л ч о к
н а к н о п к е Д р у г а я , о т к р о й т е п а п к у , в к о т о р о й н а х о д и т с я в а ш а п р о  
г р а м м а т е с т и р о в а н и я , и в ы б е р и т е и с п о л н я е м ы й а й л .
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы
241
К а л е н д а р ь
П р о г р а м м а К а л е н д а р ь в ы в о д и т и з о б р а ж е н и е к а л е н д а р я н а т е  
к у щ и й м е с я ц . И м е е т с я в о з м о ж н о с т ь з а д а т ь п р а з д н и ч н ы е д н и .
Д е м о н с т р и р у е т в ы в о д г р а ф и к и н а п о в е р х н о с т ь ф о р м ы , р а б о т у с
ф у н к ц и я м и м а н и п у л и р о в а н и я д а т а м и . Ф о р м а и о к н о п р о г р а м  
м ы п р и в е д е н ы н а р и с . 1.75. К а к в и д н о , з а г о л о в о к о к н а в о в р е  
м я р а б о т ы п р о г р а м м ы н е о т о б р а ж а е т с я (з н а ч е н и е с в о й с т в а
Borderst yle р а в н о bsNone), о д н а к о п о л ь з о в а т е л ь в с е   т а к и м о  
ж е т п е р е м е с т и т ь о к н о , "з а х в а т и в " м ы ш ь ю с а м к а л е н д а р ь . Н е п о  
с р е д с т в е н н о е п е р е м е щ е н и е к а л е н д а р я (о к н а п р о г р а м м ы ) в ы  
п о л н я е т ф у н к ц и я о б р а б о т к и с о б ы т и я Mouseup, к о т о р о е
в о з н и к а е т в м о м е н т о т п у с к а н и я к н о п к и м ы ш и .
:; • _sj :: :
Р   l Ol x i
• • .
П Н
В Т
С Р
ч т
п т
С Б
В С
Я н в а р ь
3
4
5
б
7
1 8
2 9
10
1 1
112
13
14
15
16
17
18
| 19
20
2 1
22
23
24 3 1
25
26
27
2 8
29
30
Р и с . 1.75. Ф о р м а и о к н о п р о г р а м м ы К а л е н д а р ь
#define BACKGROUND
#undef BACKIMAGE
AnsiString stMonth[12] = {"Январь","Февраль","Март", "Апрель",
"Май","Июнь","Июль","Август",
"Сентябрь","Октябрь","Ноябрь",
"Декабрь"};
An si St r i n g st D ay[7] = {"П Н ", "В Т ", "С Р ", "Ч Т ", "П Т ", "С Б ", "В С "};
/ / п р а з д н и ч н ы е д н и в ф о р м а т е dd.rm
242 Ч а с т ь 1. П р и м е р ы и з а д а ч и
AnsiString holiday =
"01.01;02.01;07.01;23.02;08.03;01.05;09.05;07.11;12.12;";
Word aYear, aMonth, aDay; // год, месяц, день
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
{
DecodeDate (Now() , aYear, aMonth, aDay) , 
UpDownl >Position = aMonth;
#ifdef BACKIMAGE
// загрузка фоновой картинки
backimage = new Graphics::TBitmap();
try {
backimage >LoadFromFile("back.bmp");
}
catch (EFOpenError &e) {
return;
}
#endif
// возвращает строковое представление двузначного числа
•// с ведущем нулем: 01, 02 и т.д.
AnsiString fastcall IntToStr_(int i)
{
AnsiString s;
if ( IntToStr(i).Length() ==1) s = "0"+IntToStr(i);
e l s e s = I n t T o St r ( i ) ;
return s;
// обработка события Paint   вывести календарь
void fastcall TForml::FormPaint(TObject *Sender)
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 243
{
Word aDayOfWeek; // день недели
AnsiString st; // дата в формате dd.mm
int x, у,
dx< dy, // шаг столбцов и строк цифр
хО,уО; // левый верхний угол области вывода календаря
int i;
хО = 50; уО = 40;
dx = 20; dy = 20;
Caption   "К алендарь " + IntToStr(aYear);
#ifdef BACKGROUND
Canvas >Brush >Color = clBackground;
#endif
#ifdef BACKIMAGE
Canvas >Draw(0, 0,backimage) , 
#else
Canvas >Pen >Color = Canvas >Brush >Color;
Canvas >Rectangle(O,O,ClientWidth,ClientHeight);
#endif
// вывести календарь на текущий есяц
Canvas >Brush >Style = bsClear;
Canvas >Font >Size = 12;
Canvas >Font >Color = clBlack;
Canvas >TextOutA(xO,yO 35, stMonth[aMonth 1]);
Canvas >Font >Size = 10;
// первая колонка   название дней недели
х = хО   3 0;
244
Ч асть 1. Примеры и задали
У = уО;
for ( i = 0; i < 7; i++)
{
if ( i < 5 )
Canvas >Font >Color • clBlack;
else
Canvas >Font >Color • clRed;
Canvas >TextOutA(x,y, stDayfi]);
У += dy;
/* определим день недели, с которого
начинается месяц */
aDayOfWeek = DayOfTheWeek( EncodeDate(aYear,aMonth,1))
x = xO;
у = yO + dy * (aDayOfWeek 1);
for ( i = 1; i <= DaysInAMonth(aYear,aMonth); i++ )
{
// проверим, не является ли день раздничным
st = IntToStr_(i) + "." + IntToStr_(aMonth);
if ( holiday.Pos(st) 1=0 )
Canvas >Font >Color = clRed; // раздничный
else // обычный
if ( aDayOfWeek < б )
Canvas >Font >Color = clBlack;
else // суббота или воскресенье
Canvas >Font >Color = clRed;
Canvas >TextOutA(x,у, IntToStr(i));
if ( i »« aDay) {
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 245
// выделить сегодняшнее число
// рамка
Canvas >Brush >Style = bsClear;
Canvas >Pen >Color = clGray;
Canvas >Rectangle(x 3,y 1,x+dx 2,y+dy 1);
if ( aDayOfWeek != 7 ) {
У += dy;
aDayOfWeek ++;
}
else {
aDayOfWeek =1;
x += dx;
У = yO;
// щелчок на кнопке компонента UpDown
void fastcall TForml::UpDownlClick(TObject *Sender,
TUDBtnType Button)
switch (UpDownl >Position) {
case 0 : UpDownl >Position = 12; aYear  ; break;
case 13 : UpDownl >Position = 1; aYear++; ,  break;
aMonth = UpDownl >Position;
Paint(); // обновить календарь
}
// отпущена кнопка мыши
void fas t cal l TForml::ForrriMouseUp(TObject *Sender,
TMouseButton Button,
TShiftState Shift, int X, int Y)
246
Ч а с т ь 1. П р и м е р ы з а д а ч и
// переместить окно в ту точку экрана,
// в которой находится указатель мыши
Forml >Left = Forml >Left + X;
Forml >Top = Forml >Top + Y;
// нажатие клавиши
void fastcall TForml::FormKeyDown(TObject *Sender,
WORD &Key, TShiftState Shift)
if ( Key == 27) // клавиша <Esc>
F orml  > Close( ) ; / / з а в е р ш и т ь р а б о т у п р о г р а м м ы
Б у д и л ь н и к
П р о г р а м м а Б уд и л ьн и к (р и с . 1.76) в ы в о д и т с о о б щ е н и е в у с т а н о в  
л е н н о е п о л ь з о в а т е л е м в р е м я .
О Б У Д И Л Ь Н И К
С е й ч а с •
1 7 : 2 1
С и г н а л  
1 8 : 0 0
П о п и т ь к о ф е й к у
О К I
Р и с . 1 . 7 6 . О к н о п р о г р а м м ы Б у д и л ь н и к
П о с л е т о г о к а к п о л ь з о в а т е л ь з а д а с т с о о б щ е н и е , в р е м я и с д е л а  
е т щ е л ч о к н а к н о п к е О К , о к н о п р о г р а м м ы и с ч е з а е т с э к р а н а
(с в о р а ч и в а е т с я ). В у с т а н о в л е н н о е в р е м я о к н о Б уд и л ьн и к п о я в  
л я е т с я н а э к р а н е . О т л и ч и т е л ь н о й о с о б е н н о с т ь ю п р о г р а м м ы
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы
247
я в л я е т с я т о , ч т о з н а ч о к , о б о з н а ч а ю щ и й р а б о т а ю щ у ю п р о г р а м  
м у (к о г д а о к н о с в е р н у т о ), о т о б р а ж а е т с я н е в п а н е л и з а д а ч , а в
с и с т е м н о й о б л а с т и п а н е л и з а д а ч (System Tray) (р и с . 1.77). П р и
п о з и ц и о н и р о в а н и и у к а з а т е л я м ы ш и н а з н а ч о к п р о г р а м м ы о т о  
б р а ж а е т с я в р е м я , н а к о т о р о е у с т а н о в л е н б у д и л ь н и к (р и с . 1.78),
а в р е з у л ь т а т е н а ж а т и я п р а в о й к н о п к и п о я в л я е т с я к о н т е к с т н о е
м е н ю , к о м а н д ы к о т о р о г о п о з в о л я ю т з а в е р ш и т ь р а б о т у п р о  
г р а м м ы и л и р а з в е р н у т ь е е о к н о .
1Ф Ё 1И I7 23 |
Р и с . 1 . 7 7 . З н а ч о к р а б о т а ю щ е й п р о г р а м м ы Б у д и л ь н и к
о т о б р а ж а е т с я в с и с т е м н о й о б л а с т и
п а н е л и з а д а ч
. 18:00
17:23
В о с т а н о в и т ь
X З а в е р ш и т ь .
Р и с . 1 . 7 8 . В о в с п л ы в а ю щ е й п о д с к а з к е о т о б р а ж а е т с я в р е м я ,
н а к о т о р о е у с т а н о в л е н б у д и л ь н и к , а в к о н т е к с т н о м м е н ю —
к о м а н д ы у п р а в л е н и я п р о г р а м м о й
Ф о р м а п р о г р а м м ы Б у д и л ь н и к п р и в е д е н а н а р и с . 1.79, з н а ч е н и я
с в о й с т в к о м п о н е н т о в —в т а б л . 1.25.
UpDowni
UpDown2
Buttoni PopupMenui Timeri
Р и с . 1.79. Ф о р м а п р о г р а м м ы Б у д и л ь н и к
248
Ч а с т ь 1. П р и м е р ы и з а д а ч и
Т а б л и ц а 1 . 2 5. З н а ч е н и я с в о й с т в к о м п о н е н т о в
С в о й с т в о З н а ч е н и е
UpDownl.Min
UpDownl.Max
UpDownl.Wrap
UpDownl.Hint
UpDownl.ShowHint
0
23
true
Часы
true
UpDown2.Min
UpDown2.Max
UpDown2.Wrap
UpDown2.Wrap
UpDown2.Hint
0
59
true
true
Минуты
// *** заголовочный модуль (AlarmForm.h) ***
#define WM_MYTRAYNOTIFY (WM_USER + 123)
class TForml : public TForm
{
__published:
TTimer *Timerl;
TEdit *Editl;
TButton *Buttonl;
// индикатор текущего времени
TGroupBox *GroupBox2;
TLabel *Labell; // часы
TLabel *Label2; // двоеточие
TLabel *Label3; // минуты
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 249
// индикатор времени сигнала
TGroupBox *GroupBoxl;
TLabel *Label4; // часы
TLabel *Label5; // двоеточие
TLabel *Label6; // минуты
// кнопки установки времени будильника
TUpDown *UpDownl; // часы
TUpDown *UpDown2; // минуты
TPopupMenu *PopupMenul,  // контекстное еню
TMenuItem *N1; // команда Восстановить
TMenuItem *N2; // команда Закрыть
void fastcall ButtonlClick(TObject *Sender);
void fastcall TimerlTimer(TObject *Sender);
void fastcall UpDownlClick(TObject *Sender,
TUDBtnType Button);
void fastcall UpDown2Click(TObject *Sender,
TUDBtnType Button);
void fastcall NIClick(TObject *Sender);
void fastcall N2Click(TObject *Sender);
// *** определение этих функций вставлено сюда вручную ***
// создать и поместить значок на System Tray
void fastcall CreateTrayIcon(int n, AnsiString Tip);
// удалить значок из System Tray
void fastcall DeleteTrayIcon(int n);
protected:
// процедура обработки сообщения WM_MYTRAYNOTI FY,
// которое генерирует значок, находящийся на System Tray
void fastcall MYTRAYNOTIFY(TMessage &Message);
250 Ч а с т ь 1. П р и м е р ы и з а д а ч и
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MYTRAYNOTIFY, TMessage,
MYTRAYNOTIFY)
END_MESSAGE_MAP(TControl)
private:
public:
fastcall TForml(TComponent* Owner);
// *** модуль формы AlarmForm.cpp ***
•include "DateUtils.hpp"
#include "ShellAPI.hpp" // для доступа к Shell__NottifyI con
#include "mmsystern.hpp" // для доступа к PlaySound
int cHour, cMinute; // время на индикаторе
int alrHour, alrMinute; // время сигнала
/ / п р е о б р а з у е т ц е л о е в с т р о к у с в е д у ш у а л н у л е м
AnsiString fastcall mm(int m)
{
if (m <= 9)
return "0" + IntToStr(m);
else
return IntToStr(m);
/ констуктор формы
fastcall TForml::TForml(TComponent* Owner)
: TForm(Owner)
// отобразить текущее время
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 251
cHour = HourOff Now() );
Labell >Caption = IntToStr (cHour) ,•
cMinute = MinuteOf( Now() );
Label3 >Caption = mm(cMinute);
/ / д о б а в и т ь з н а ч о к н а System Tray
void fastcall TForml::CreateTrayIcon(int n, AnsiString Tip)
{
TNotifylconData nidata;
/* заполнить структуру nidat, поля которой
определяют значок на System Tray */
nidata.cbSize = sizeof(TNotifylconData);
nidata.hWnd = Forml >Handle; // окно приложения, которое
/ / п р е д с т а в л я е т з н а ч о к
nidata.uID = n; // номер значка (одно приложение может
// разместить на панели
// несколько значков
nidata.uFlags = NIF_ICON + NIF_MESSAGE + NIF_TIP;
/* при позиционировании указателя мыши на
на значке, генерируется определенное
п р о г р а м м и с т о м с о б ы т и е WM_MYTRAYNOTIFY
( см. AlarmMainForm.h ) */
nidata.uCallbackMessage = WM_MYTRAYNOTIFY;
// значок
nidata.hlcon = Application >Icon >Handle;
// посказка (всплывающий текст)
StrPCopy(nidata.szTip,Tip);
Shell_NotifyIcon(NIM_ADD, &nidata); // добавить значок
9 3ак. 1241
252 Ч а с т ь 1. П р и м е р ы и з а д а ч и
// удалить картинку с System Tray
void fastcall TForml::DeleteTraylcon(int n)
TNotifylconData nidata;
nidata.cbSize = sizeof(TNotifylconData);
nidata.hWnd = Forml >Handle;
nidata.ulD = n,  // номер значка, который надо убрать
// (одно приложение может разместить на
// панели несколько значков)
Shell_NotifyIcon(NIM_DELETE, &nidata);
// щелчок на кнопке ОК
void fastcall TForml::ButtonlClick(TObject *Sender)
{
AnsiString st;
alrHour = UpDownl >Position;
alrMinute = UpDown2 >Position;
if ( ( alrHour == cHour ) && (alrMinute <= cMinute)
( alrHour < cHour ) )
{
AnsiString st;
int r;
st.printf(
"Сейчас %i:%1\пБ удильник установлен на %i:%i",
cHour,cMinute,alrHour,alrMinute
r = MessageDlg(st, mtWarning, TMsgDlgButtons()
« mbOK «mbCancel, 0) ;
if (r == mrCancel) return;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 253
st = "Б удильник. " + IntToStr(alrHour) + ":" +
mm(alrMinute);
CreateTraylcon(1,st);
Forml >Hide();
// сигнал от таймера
void fastcall TForml::TimerlTimer(TObject *Sender)
if ( Forml >Visible )
// окно программы на экране
if ( HourOf( Now() ) != cHour) {
cHour = HourOf( Now() );
Labell >Caption = IntToStr(cHour);
if ( MinuteOf( Now() ) != cMinute) {
cMinute = MinuteOf( Now() );
Label3 >Caption = mm(cMinute);
// показать/скрыть двоеточие
Label2 >Visible = ! Label2 >Visible;
else
TDateTime t = Now();
if ( (alrHour == HourOf(t) ) &&
(alrMinute == MinuteOf(t)) )
PlaySoundCnotify.wav", 0, SND_ASYNC) ;
DeleteTraylcon(1); // убрать значок с System Tray
Forml >Show();
}
}
}
254 Ч асть 1. Примеры и задачи
// щелчок на кнопке компонента UpDownl (часы)
void fastcall TForml::UpDownlClick(TObject *Sender,
TUDBtnType Button)
{
Label4 >Caption = IntToStr(UpDownl >Position);
// щелчок на кнопке компонента UpDown2 (минуты)
void fastcall TForml::UpDown2Click(TObject *Sender,
TUDBtnType Button)
{
Label6 >Caption = mm(UpDown2 >Position);
// обработка определенного пользователем сообщения
// WM_MYTRAYNOTI FY
void fastcall TForml:rMYTRAYNOTIFY(TMessage ^Message)
{
TPoint p;
i f ( Message.LParam == m_RBUTTONDCWN )
{
GetCursorPos(&p);
SetForegroundWindow(Application >MainForm >Handle);
Forml >PopupMenul >Popup(p.x,p.y);
// команда Восстановить
void fastcall TForml::NlClick(TObject *Sender)
{
Timerl >Enabled = false;
Forml >Show();
DeleteTraylcon(1); // убрать значок с System Tray
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 255
// команда контекстного меню Закрыть
// (завершение работы программы)
void fastcall TForml::N2Click(TObject *Sender)
{
Forml >DeleteTrayIcon(l); // убрать значок с System Tray
Forml >Close();
О ч и с т к а д и с к а
П р о г р а м м а О ч и с тк а д и с к а у д а л я е т н е н у ж н ы е , с о з д а н н ы е в п р о  
ц е с с е к о м п и л я ц и и п р о е к т о в C++Builder, ф а й л ы obj, tds, и р е  
з е р в н ы е к о п и и (~bpr, ~dfm, ~h, ~cpp) и з у к а з а н н о г о п о л ь з о в а т е  
л е м к а т а л о г а и в с е х е г о п о д к а т а л о г о в . Д л я в ы б о р а к а т а л о г а
(п а п к и ) и с п о л ь з у е т с я с т а н д а р т н о е о к н о О б з о р п а п о к (р и с . 1.80).
Ф о р м а п р о г р а м м ы п р и в е д е н а н а р и с . 1.81.
• и В и н
! П р о г р а м м а у д а л и т н е н у ж н ы е , с о з д а н н ы е п р о ц е с с е
; к о м п и л я ц и и п р о е к т о в С ++ М Н е г , ф а й л ы (obj, tds)
р е з е р в н ы е к о п и и (~bpr, ~dfm, ~h, ~cpp) и з у к а з а н н о г о
I к а т а л о г а и е г о п о д к а т а л о г о в .
1
К а т а л о г :
О б з о р ... |
  2J  XI
В ы б е р и т е к а т а л о г
£ Э Л о к а л ь н ы й д и с к (F:)
S Q Documents and Settings
  p HOS
I GJ HI S
:   Q H2S
ffl  f* 1 Inetpub
Si Q Program Files
$   Q TEMP
;
ffl   CJ vbrkit
ffi О WINNT
Й d VAMAHA
. . $ ( 1 WnmnAICT  niACW / С Л
О т м е н а
Р и с . 1.80. О к н о п р о г р а м м ы О ч и с т к а д и с к а . Д л я в ы б о р а к а т а л о г а
и с п о л ь з у е т с я о к н о О б з о р п а п о к
256 Ч а с т ь 1. П р и м е р ы и з а д а ч и
* О ч и с т к а д и с к а
П р о г р а м м а у д а л и т н е н у ж н ы е , с о з д а н н ы е в р о ц е с с е
к о м п и л я ц и и п р о е к т о в C++Builder, ф а й л ы (obj, tds) и
р е з е р в н ы е к о п и и (~bpr, ~dfrn, ~h, ~cpp) и з у к а з а н н о г о
к а т а л о г а н е г о п о д к а т а л о г о в ..
:
К а т а л о г :
:
" '
: В ы п о л н и т ь *!
Label3
Buttoni
Button2
Memol
Р и с . 1 . 81 . Ф о р м а п р о г р а м м ы О ч и с т к а д и с к а
О с н о в н у ю р а б о т у в ы п о л н я е т р е к у р с и в н а я ф у н к ц и я clear. С н а  
ч а л а о н а о б р а б а т ы в а е т т е к у щ и й к а т а л о г : п р о с м а т р и в а е т в с е ф а й  
л ы и у д а л я е т т е , к о т о р ы е н а д о у д а л и т ь . П о с л е т о г о к а к в с е ф а й  
л ы б у д у т о б р а б о т а н ы , ф у н к ц и я clear п р о в е р я е т , е с т ь л и в
т е к у щ е м к а т а л о г е п о д к а т а л о г и . Е с л и п о д к а т а л о г е с т ь , т о в ы п о л  
н я е т с я в х о д в п о д к а т а л о г (э т о т п о д к а т а л о г с т а н о в и т с я т е к у щ и м
к а т а л о г о м ) и в ы з ы в а е т с я ф у н к ц и я clear, к о т о р а я о б р а б а т ы в а е т
э т о т к а т а л о г .
#include <FileCtrl.hpp> // для, доступа к SelectDirectory
AnsiString aDirectory; // каталог, который выбрал пользователь
// (в котором находятся проекты C+ + Builder)
AnsiString cDir; // текущий каталог
AnsiString FileExt; // расширение файла
int n = 0; // количество удаленных файлов
Игры и другие полезные программы 257
// Щелчок на кнопке Обзор (выбор каталога)
void fastcall TMainForm::ButtonlClick(TObject *Sender)
{
if ( SelectDirectory("Выберите каталог","", aDirectory))
{
// диалог Выбор файла завершен щелчком на ОК
Label3 >Caption = aDirectory;
Button2 >Enabled = true; // теперь кнопка Выполнить
// доступна
// удаляет ненужные файлы из текущего каталога и его
/ / п о д к а т а л о г о в
void fastcall Clear(void)
TSearchRec SearchRec; // информация о файле или каталоге
cDir = GetCurrentDir()+"\\";
if ( FindFirst("*.*", faArchive,SearchRec) в 0)
do {
// проверим расширение файла
int p = SearchRec.Name.Pos(".");
FileExt = SearchRec.Name.Substring(p+1,MAX_PATH);
if ( ( FileExt[1] ==' ') || ( FileExt == "obj" )
|| ( FileExt == "tds" )
)
{
MainForm >Memol >
Lines >Add(cDir+SearchRec.Name);
DeleteFile(SearchRec.Name);
258
Ч а с т ь 1. П р и м е р ы и з а д а ч и
while ( FindNext(SearchRec) == 0);
// обработка подкаталогов текущего каталога
if ( FindFirst("*", faDirectory, SearchRec) == 0)
do
if ((SearchRec.Attr & faDirectory) ==
SearchRec.Attr )
// каталоги
и тоже каталоги,
// но в них входить не надо!!!
if (( SearchRec.Name != "." ) &&
( SearchRec.Name != ".." ))
// войти в подкаталог
ChDir (SearchRec. Name) ;
// очистить каталог
Clear();
// выйти из каталога
ChDir("..");
w h i l e ( F i n d N e x t ( S e a r c h R e c ) = = 0 ) ;
// щелчок на кнопке Выполнить
void fastcall TMainForm::Button2Click(TObject *Sender)
{
Memol >Clear(); // очистить поле Memol
ChDir(aDirectory); // войти в каталог, который выбрал
// пользователь
Clear(); // очистить текущий каталог и его
// подкаталоги
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 259
Memol >Lines >Add("");
if (n)
Memol >Lines >Add("Удалено файлов: " + IntToStr(n));
else
Memol >Lines >Add("В указанном каталоге нет файлов, "
"которые надо удалить.");
П е ч а т ь
П р о г р а м м а С ч е т, е е о к н о п р и в е д е н о н а р и с . 1.82, п о з в о л я е т р а с  
п е ч а т а т ь (в ы в е с т и н а п р и н т е р ) с ч е т .
С ч е т
1
2
3
4
5
6
7
8
9
10
Н а и м е н о в а н и е
К у л ь т и н Н .Б . C++Builder.С а м о у ч и т е л ь
i Г о т о в о ] П е ч а т ь '
Ш Щ В В Ш : .=.13
Ц е н а | К о л   в о С у м м а
98,00 Я 490,00
)с е г о : 490 у б .
Р и с . 1 . 8 2 . В р е з у л ь т а т е щ е л ч к а н а к н о п к е П е ч а т ь
с ч е т б у д е т р а с п е ч а т а н
voi d f a s t c a l l T F o r ml : : F o r mCr ea t e( T O b j ec t * Sen der )
/ / *** н а с т р о и т ь т а б л и ц у ***
St ri n gG ri dl  > O p t i o n s
« go Edi t i n g / / р а з р е ш и т ь р е д а к т и р о в а т ь
260 Ч асть 1. Примеры и задачи
« goTabs; // <Tab>   переход к следующей ячейке
// заголовки столбцов
StringGridl >Cells[O][0] =
" Наименование";
" Цена";
К ол во";
StringGridl >Cells[l][0] =
StringGridl >Cells[2][0] =
StringGridl >Cells[3][0] •
StringGridl >Cells[4][0] =
Сумма";
// ширина столбцов
StringGridl >ColWidths[0] = 3 0;
StringGridl >ColWidths[l] = 250;
StringGridl >ColWidths[2] = 80;
StringGridl >ColWidths[3] = 50;
StringGridl >ColWidths[4] = 80;
// заполнить первый столбец
for ( int i = 1; i < 11; i++)
if (i < 10) . ,
StringGridl >Cells[0)[i] = " " + IntToStr(i);
else
StringGridl >Cells[0][i] = IntToStr(i);
int w = 0;
for (int i = 0; i < StringGridl >ColCount; i
w += StringGridl >ColWidths[i];
// установить размер StringGrid в соответствии с размером
// столбцов и количеством строк
StringGridl >Width = w + StringGridl >ColCount + 1 ;
StringGridl >Height =
ч
StringGridl >DefaultRowHeight * StringGridl >
RowCount + StringGridl >RowCount + 1;
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 261
# i n c lude "P r i n t er s . h p p "
/ / щ е л ч о к н а к н о п к е П е ч а т ь
void fas t cal l TF orml::But t on 2Click( TO bject *Sender)
{
TPrinter *Prn; // принтер
#define LEFT_MARGIN 2 // отступ слева 2 см
#define TOP_MARGIN 2 // отступ сверху 2 см
float dpix, dpiY,  // разрешение принтера по X и Y
float кх, ky; // коэф. пересчета координат экрана
// в координаты принтера по X и Y
// таблица
int р[5]; // позиции колонок
int xl,yl,x2,y2; // границы таблицы
int рх, ру; // указатель точки вывода
int i, j;
/* Разрешение экрана и принтера разное,
поэтому чтобы добиться соответствия
размеров изображения на экране и принтере,•
координаты точек экрана надо преобразовать
з координаты принтера, умножить на коэф.,
значение которого зависит от разрешения ринтера.
Например, если разрешение принтера 300 dpi,
то значение коэффициента равно 3.125, т. к.
разрешение экрана   96 dpi */
Prn = Printer () , 
/* ф я GetDeviceCaps позволяет получить характеристики
устройства. LOGPI XELSX   кол во пикселов на дюйм по X
262 Ч асть 1. Примеры и задачи
dpiX = GetDeviceCaps(Prn >Handle,LOGPIXELSX);
dpiY = GetDeviceCaps(Prn >Handle,LOGPIXELSY);
kx = dpiX / Screen >PixelsPerInch;
ky = dpiY / Screen >PixelsPerInch;
px = LEFT_MARGIN / 2.54 * dpiX;
py = TOP_MARGIN / 2.54 * dpiY;
// вычислим "принтерные" координаты колонок таблицы
р[0] = рх;
for (i = 1; i < 5; i++ )
p[i] = p[i l] + StringGridl >ColWidths[i l]* kx + i;
Prn >BeginDoc(); // открыть печать
// заголовок таблицы
Prn >Canvas >Font >Name = Labell >Font >Name;
Prn >Canvas >Font >Size = Labell >Font >Size;
Prn >Canvas >TextOut(px,py,Labell >Caption);
// таблица   содержимое StringGridl
РУ = РУ + Labell >Font >Size * 2 * ky;
xl = px; yl = py; // левый верхний угол таблицы
Prn >Canvas >Font >Name = StringGridl >Font >Name;
Prn >Canvas >Font >Size = StringGridl >Font >Size;
x2 = p[4] + StringGridl >ColWidths[4]* kx;
y2 = py + StringGridl >RowCount *
StringGridl >RowHeights[l] * ky;
for ( j = 0; j < StringGridl >RowCount; 'j
И г р ы и д р у г и е п о л е з н ы е п р о г р а м м ы 263
// строки таблицы
for (i = 0 ; i < StringGridl >ColCount; i
Prn >Canvas >TextOut(p[i],py,
StringGridl >Cells[i][j]
// гор >линия
Prn >Canvas >MoveTo(p[0],py);
Prn >Canvas >LineTo(x2,py);
}
РУ = РУ+ StringGridl >RowHeights[j]* ky;
// вертикальные линии
for ( i = 0; i < StringGridl >ColCount; i++ )
{
Prn >Canvas >MoveTo(p[i],yl);
Prn >Canvas >LineTo(p[i],y2);
}
// правая граница
Prn >Canvas >MoveTo(x2,yl);
Prn >Canvas >LineTo(x2,y2);
// нижняя граница
Prn >Canvas >MoveTo(xl,y2);
Prn >Canvas >LineTo(x2,y2);
РУ = y2 + 0.5 / 2.54 * dpiY; // здесь 1   это 1 см.
Prn >Canvas >Text0ut(p[3],py,Label2 >Caption);
Prn  > EndDoc( ) ; / / з а к р ы т ь п е ч а т ь
// щелчок на кнопке Готово
264 Ч асть 1. Примеры и задачи
void fastcall TForml::ButtonlClick(TObject *Sender)
{
float summ;
surran = 0;
for ( int i = 1; i < 11; i++)
{
// если ячейка Сумма пустая, то при выполнении
// функции StrToFloat возникает ошибка (исключение)
try
{
summ += StrToFloat(StringGridl >Cells[4][i]);
}
catch (Exception &e)
Label2 >Caption   "Всего: " + FloatToStr(summ) + " руб.";
}
З а д а ч и
д л я с а м о с т о я т е л ь н о г о
р е ш е н и я
В э т о м р а з д е л е п р и в е д е н ы з а д а ч и , р е ш и т ь к о т о р ы е п р е д л а г а е т с я
ч и т а т е л ю с а м о с т о я т е л ь н о .
С к и д к а
Н а п и ш и т е п р о г р а м м у в ы ч и с л е н и я с т о и м о с т и п о к у п к и с у ч е т о м
с к и д к и . С к и д к а п р е д о с т а в л я е т с я , е с л и с у м м а п р е в ы ш а е т
1000 р у б ., а т а к ж е в в ы х о д н ы е д н и . Р е к о м е н д у е м ы й в и д ф о р м ы
п р и в е д е н н а р и с . 1.83. В р е з у л ь т а т е щ е л ч к а н а к н о п к е С к и д к а
в п о л е к о м п о н е н т а Label д о л ж н о п о я в л я т ь с я с о о б щ е н и е , и н  
ф о р м и р у ю щ е е о п р е д о с т а в л е н и и с к и д к и , и и т о г о в а я с у м м а с
у ч е т о м с к и д к и . И н ф о р м а ц и ю о т о м , я в л я е т с я л и д е н ь в ы х о д  
н ы м , п р о г р а м м а д о л ж н а п о л у ч а т ь н а о с н о в е а н а л и з а т е к у щ е й
д а т ы .
С у м м а {р у б .} 
' . С к и д к а
• . •  
1 «
< * :
.. • • «
• • • .'
Р и с . 1. 83. Ф о р м а п р о г р а м м ы С к и д к а
266
Ч а с т ь 1. П р и м е р ы и з а д а ч и
Д о х о д п о в к л а д у
Н а п и ш и т е п р о г р а м м у в ы ч и с л е н и я д о х о д а п о в к л а д у в б а н к е .
Д о х о д в ы ч и с л я е т с я п о ф о р м у л е : Д = С * (С Р / 360) * (С Т / 100),
г д е : С —с у м м а в к л а д а ; С Р —с р о к в к л а д а (к о л и ч е с т в о д н е й );
С Т —п р о ц е н т н а я с т а в к а (г о д о в ы х ). Р е к о м е н д у е м ы й в и д ф о р м ы
п р и в е д е н н а р и с . 1.84.
Д о х о д п о к / а д у <_
С у м м а (р у б .) 
С р о к (д н е й ) .  • • '!
С т а к к э {п р о ц е н т о в г о д о в ы х )
Р и с . 1. 84. Ф о р м а п р о г р а м м ы Д о х о д п о в к л а д у
Т а б л и ц а у м н о ж е н и я
Н а п и ш и т е п р о г р а м м у , п р и п о м о щ и к о т о р о й м о ж н о п р о к о н  
т р о л и р о в а т ь з н а н и е т а б л и ц ы у м н о ж е н и я . П р о г р а м м а д о л ж н а
п р е д л о ж и т ь и с п ы т у е м о м у 10 п р и м е р о в и п о о к о н ч а н и и п р о ц е с с а
т е с т и р о в а н и я в ы с т а в и т ь о ц е н к у . Р е к о м е н д у е м ы й в и д ф о р м ы п р и  
в е д е н н а р и с . 1.85. К о м п о н е н т Labeli и с п о л ь з у е т с я д л я в ы в о д а
п р и м е р а , Label2 — д л я в ы в о д а с о о б щ е н и я о б о ш и б к е и р е з у л ь т а  
т о в т е с т и р о в а н и я .
Labeli
Label2
Р и с . 1. 85. Ф о р м а п р о г р а м м ы п р о в е р к и з н а н и я т а б л и ц ы у м н о ж е н и я
З а д а ч и д л я с а м о с т о я т е л ь н о г о р е ш е н и я 267
П о е з д к а н а а в т о м о б и л е
Н а п и ш и т е п р о г р а м м у , п р и п о м о щ и к о т о р о й м о ж н о в ы ч и с л и т ь
с т о и м о с т ь п о е з д к и н а а в т о м о б и л е . Р е к о м е н д у е м ы й в и д ф о р м ы
п р и в е д е н н а р и с . 1.86.
1 j K С т о и м о с т ь о е з д к и
• • Ц е н а б е н з и н а (р у б ./ л и т р ^ •
• П о т р е б л е н и е б е н з и н а • •
; ; (л и т р о в н а 1 о о к м ) ; :
• • а с с т о я н и е (к м )
[ \ В ы ч и с л и т ь Г ' .' .' ..' ,' .' .
• • я
• • я ' . я
• • • •
• . . .
Р и с . 1 . 8 6 . Ф о р м а п р о г р а м м ы С т о и м о с т ь п о е з д к и
С т о и м о с т ь р а з г о в о р а
Н а п и ш и т е п р о г р а м м у в ы ч и с л е н и я с т о и м о с т и и с х о д я щ е г о з в о н к а
с с о т о в о г о т е л е ф о н а . Р е к о м е н д у е м ы й в и д ф о р м ы п р и в е д е н н а
р и с . 1.87.
Д л и т е л ь н о с т ь (с е к ] • • 1
(• в н у т р и е т и
| С * д р у г о й о п е р а т о р
J f*
4
н а г о р о д с к о й
В ы ч и с л и т ь
Р и с . 1 . 8 7 . Ф о р м а п р о г р а м м ы С т о и м о с т ь р а з г о в о р а
Ю З а к . 1241
268
Ч а с т ь 1. П р и м е р ы и з а д а ч и
С т е к л о п а к е т
Н а п и ш и т е п р о г р а м м у , п р и п о м о щ и к о т о р о й м о ж н о в ы ч и с л и т ь
с т о и м о с т ь о к н а (с т е к л о п а к е т а ). Р е к о м е н д у е м ы й в и д ф о р м ы п р и в е  
д е н н а р и с . 1.88.
«К т в к л о п а к е т
Р а з м е р о к н а
Ш и р и н а (с м )
В ы с о т а (с м )
Г " п о д о к о н н и к
Ok I
• .
С т е к л о г и к е т
f*
1
о д н о к а м е р н ы й
С д в у х к а м е р н ы й
Р и с . 1.88. о р м а п р о г р а м м ы С т е к л о п а к е т
К а л ь к у л я т о р
У с о в е р ш е н с т в у й т е п р о г р а м м у К а л ьк ул я то р т а к , ч т о б ы м о ж н о
б ы л о в ы п о л н я т ь о п е р а ц и и у м н о ж е н и я и д е л е н и я . Р е к о м е н д у е м а я
ф о р м а п р и в е д е н а н а р и с . 1.89.
 101*1
_J J
Р и с . 1.89. о р м а п р о г р а м м ы К а л ь к у л я т о р
З а д а ч и д л я с а м о с т о я т е л ь н о г о р е ш е н и я 269
Э л е к т р о э н е р г и я
Н а п и ш и т е п р о г р а м м у , к о т о р а я с о х р а н я е т в ф а й л е electr.txt
п о к а з а н и я с ч е т ч и к а р а с х о д а э л е к т р о э н е р г и и (о д и н р а з в м е с я ц ).
Р е к о м е н д у е м ы й в и д ф о р м ы п р и в е д е н н а р и с . 1.90.
[ ^Э л е к т р о э н е р г и я
П о к а з а н и я ч е т ч и к а
М е с я ц • •
ok
Р и с . 1.90. Ф о р м а п р о г р а м м ы Э л е к т р о э н е р г и я
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й (в п о л е к о м п о н е н т а Memo)
о т о б р а ж а е т с я с о д е р ж и м о е ф а й л а electr.txt.
Д о б р ы й д е н ь
И з м е н и т е п р о г р а м м у Д о б р ы й д е н ь т а к и м о б р а з о м , ч т о б ы в з а в и  
с и м о с т и о т в р е м е н и с у т о к м е н я л с я н е т о л ь к о т е к с т п р и в е т с т в и я ,
н о и ф о н о в ы й р и с у н о к .
Ч а с ы
Н а п и ш и т е п р о г р а м м у Ч а с ы , в о к н е к о т о р о й о т о б р а ж а е т с я
т е к у щ е е в р е м я . Р е к о м е н д у е м ы й в и д ф о р м ы п р и в е д е н н а
р и с . 1.91. Д в о е т о ч и е н а и н д и к а т о р е д о л ж н о м и г а т ь .
Labeli Label3 Label2
Р и с . 1. 91. Ф о р м а п р о г р а м м ы Ч а с ы
270
Ч а с т ь 1. П р и м е р ы и з а д а ч и
У з о р ы
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й ф о р м и р у е т с я у з о р и з
о к р у ж н о с т е й п р о и з в о л ь н о г о д и а м е т р а и ц в е т а (р и с . 1.92).
Р и с . 1. 92. У з о р и з к р у ж н о с т е й
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й ф о р м и р у е т с я у з о р и з
п р я м о у г о л ь н и к о в п р о и з в о л ь н о г о р а з м е р а и ц в е т а .
К у р с д о л л а р а
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й н а ф о н е к а р т и н к и
о т о б р а ж а е т с я г р а ф и к и з м е н е н и я к у р с а д о л л а р а (р и с . 1.93). Д а н  
н ы е д о л ж н ы з а г р у ж а т ь с я и з ф а й л а .
И з м е н е н и е , к у р с а д о л и г р а
Р и с . 1. 93. Г р а ф и к н а ф о н е к а р т и н к и
З а д а ч и д л я с а м о с т о я т е л ь н о г о р е ш е н и я 271
Д и а г р а м м а
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й , в в и д е д и а г р а м м ы , о т о  
б р а ж а е т с я д и н а м и к а и з м е н е н и я , н а п р и м е р , ц е н ы м о н и т о р о в
(р и с . 1.94).
• Щ ' Д и а г р а м м а .
Ж и д к о к р и с т а л л и ч е с к и е м о н и т о р ы
(с р е д н я я ц е н а USD)
 
360
ььи
з го
270
М а й И ю н ь И ю л ь
I 1 17" Е Г Е З 19"
Р и с . 1 . 9 4 . Д и а г р а м м а
Д о м а ш н и е ж и в о т н ы е
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й ф о р м и р у е т с я к р у г о в а я
д и а г р а м м а , и л л ю с т р и р у ю щ а я р е з у л ь т а т о п р о с а — о т в е т а н а
в о п р о с "Е с т ь л и у в а с д о м а ш н и е ж и в о т н ы е ? К а к и е ?" Д а н н ы е д л я
п о с т р о е н и я д и а г р а м м ы п р и в е д е н ы в т а б л . 1.26.
Т а б л и ц а 1 . 2 6 . Р е з у л ь т а т о п р о с а
О т в е т Д о л я ( п р о ц е н т о т о б щ е г о к о л и ч е с т в а о т в е т о в )
Н е т
К о ш к а
С о б а к а
40%
30%
22%
272
Ч а с т ь 1. П р и м е р ы и з а д а ч и
Т а б л и ц а 1 . 2 6 (о к о н ч а н и е )
О т в е т
Д о л я ( п р о ц е н т о т о б щ е г о к о л и ч е с т в а о т в е т о в )
Р ы б к и
П о п у г а й
Х о м я к
Ч е р е п а х а
3%
3%
1%
1%
К о р а б л и к
Н а п и ш и т е п р о г р а м м у , в о к н е к о т о р о й "п л ы в е т " к о р а б л и к
(р и с . 1.95). И з о б р а ж е н и е к о р а б л и к а ф о р м и р у й т е и з ф а ф и ч е с к и х
п р и м и т и в о в .
Р и с . 1 . 9 5 . К о р а б л и к
С а п е р
В н е с и т е т а к и е и з м е н е н и я в п р о г р а м м у С а п е р , ч т о б ы и з о б р а ж е н и я
к л е т о к (п у с т а я к л е т к а ; ф л а ж о к ; м и н а ; м и н а , п о м е ч е н н а я ф л а ж к о м )
з а г р у ж а л и с ь и з ф а й л а .
Т е с т п а м я т и ( н а в н и м а т е л ь н о с т ь )
Н а п и ш и т е п р о ф а м м у , и с п о л ь з у я к о т о р у ю м о ж н о о ц е н и т ь с п о  
с о б н о с т ь и ф о к а (и с п ы т у е м о г о ) з а п о м и н а т ь ч и с л а . П р о г р а м м а
З а д а ч и д л я с а м о с т о я т е л ь н о г о р е ш е н и я
273
д о л ж н а в ы в о д и т ь ч и с л а , а и с п ы т у е м ы й —в в о д и т ь э т и ч и с л а с
к л а в и а т у р ы . В р е м я , в т е ч е н и е к о т о р о г о и г р о к б у д е т в и д е т ь ч и с л о ,
о г р а н и ч ь т е , н а п р и м е р , о д н о й с е к у н д о й . П о о к о н ч а н и и т е с т а п р о  
г р а м м а д о л ж н а в ы в е с т и р е з у л ь т а т : к о л и ч е с т в о п о к а з а н н ы х ч и с е л
и к о л и ч е с т в о ч и с е л , к о т о р ы е и с п ы т у е м ы й з а п о м н и л п р а в и л ь н о .
Ф о р м а п р о г р а м м ы п р и в е д е н а н а р и с . 1.96.
Т е с т п а м я т и  
Н а ч а т ь
Р и с . 1.96. Ф о р м а п р о г р а м м ы Т е с т п а м я т и
Э к з а м е н а т о р
У с о в е р ш е н с т в у й т е п р о г р а м м у Э к з а м е н а т о р т а к , ч т о б ы о н а з а  
п р а ш и в а л а и м я т е с т и р у е м о г о и с о х р а н я л а р е з у л ь т а т т е с  
т и р о в а н и я в ф а й л е . Д л я в в о д а и м е н и т е с т и р у е м о г о и с п о л ь з у й т е
с т а н д а р т н о е о к н о в в о д а , к о т о р о е в ы в о д и т ф у н к ц и я inputBox.
Б а з а д а н н ы х "Р а с х о д ы "
Н а п и ш и т е п р о г р а м м у р а б о т ы с б а з о й д а н н ы х Р а с х о д ы . В б а з е
д а н н ы х д о л ж н а ф и к с и р о в а т ь с я с у м м а , д а т а и т о , н а ч т о
п о т р а ч е н ы д е н ь г и (п о к а т е г о р и я м , н а п р и м е р : е д а , т р а н с п о р т ,
о б р а з о в а н и е , р а з в л е ч е н и я , п р о ч е е ). П р о г р а м м а д о л ж н а о б е с п е  
ч и в а т ь с т а т и с т и ч е с к у ю о б р а б о т к у —в ы в о д и т ь с у м м у з а т р а т з а
п е р и о д . Б а з у д а н н ы х в ф о р м а т е Paradox (т а б л и ц у rash.db) м о ж н о
с о з д а т ь п р и п о м о щ и у т и л и т ы Database Desktop. Р е к о м е н д у е м ы й
в и д ф о р м ы п р о г р а м м ы р а б о т ы с б а з о й д а н н ы х п р и в е д е н н а
р и с . 1.97.
274 Ч а с т ь 1. П р и м е р ы и з а д а ч и
В
ы \ •« • и +   X
Date (Summ I Cat
В с е
З а п р о с
Е Я
Sii.L
Р и с . 1 . 9 7 . Ф о р м а п р о г р а м м ы р а б о т ы с б а з о й д а н н ы х Р а с х о д ы
Ч А С Т Ь 2
Borland C+ + Builder —
к р а т к и й с п р а в о ч н и к
В т о р а я ч а с т ь к н и г и п р е д с т а в л я е т с о б о й к р а т к и й
с п р а в о ч н и к п о к о м п о н е н т а м и ф у н к ц и я м Borland
C++ Builder.
Ф о р м а
Ф о р м а (о б ъ е к т т и п а TForm) я в л я е т с я о с н о в о й п р о г р а м м ы . С в о й  
с т в а ф о р м ы (т а б л . 2.1) о п р е д е л я ю т в и д о к н а п р о г р а м м ы .
Т а б л и ц а 2 . 1 . С в о й с т в а ф о р м ы (о б ъ е к т а TFcrm)
С в о й с т в о О п и с а н и е
Name
Ca p t i o n
Top
Lef t
Widt h
H ei gh t
Cl i en t Wi dt h
Cl i en t H ei gh t
И м я ф о р м ы . В п р о г р а м м е и м я ф о р м ы и с п о л ь з у е т с я
д л я у п р а в л е н и я ф о р м о й и д о с т у п а к к о м п о н е н т а м
ф о р м ы
Т е к с т з а г о л о в к а
Р а с с т о я н и е о т в е р х н е й г р а н и ц ы ф о р м ы д о в е р х н е й
г р а н и ц ы э к р а н а
Р а с с т о я н и е о т л е в о й г р а н и ц ы ф о р м ы д о л е в о й г р а  
н и ц ы э к р а н а
Ш и р и н а ф о р м ы
В ы с о т а ф о р м ы
Ш и р и н а р а б о ч е й (к л и е н т с к о й ) о б л а с т и ф о р м ы , т . е .
б е з у ч е т а ш и р и н ы л е в о й и п р а в о й г р а н и ц
В ы с о т а р а б о ч е й (к л и е н т с к о й ) о б л а с т и ф о р м ы , т . е .
б е з у ч е т а в ы с о т ы з а г о л о в к а и ш и р и н ы н и ж н е й г р а  
н и ц ы ф о р м ы
278
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2.1 (о к о н ч а н и е )
Bo r d er St yl e В и д г р а н и ц ы . Г р а н и ц а м о ж е т б ы т ь о б ы ч н о й ( bs Si ze 
abl e) , т о н к о й ( bs Si ng l e) и л и о т с у т с т в о в а т ь
(bsNone). Е с л и у о к н а о б ы ч н а я г р а н и ц а , т о в о в р е м я
р а б о т ы п р о г р а м м ы п о л ь з о в а т е л ь м о ж е т п р и п о м о щ и
м ы ш и и з м е н и т ь р а з м е р о к н а . И з м е н и т ь р а з м е р о к н а
с т о н к о й г р а н и ц е й н е л ь з я . Е с л и г р а н и ц а о т с у т с т в у е т ,
т о н а э к р а н в о в р е м я р а б о т ы п р о г р а м м ы б у д е т в ы в е  
д е н о о к н о б е з з а г о л о в к а . П о л о ж е н и е и р а з м е р т а к о г о
о к н а в о в р е м я р а б о т ы п р о г р а м м ы и з м е н и т ь н е л ь з я
Bo r d er l c o n s К н о п к и у п р а в л е н и я о к н о м . З н а ч е н и е с в о й с т в а о п р е  
д е л я е т , к а к и е к н о п к и у п р а в л е н и я о к н о м б у д у т д о  
с т у п н ы п о л ь з о в а т е л ю в о в р е м я р а б о т ы п р о г р а м м ы .
З н а ч е н и е с в о й с т в а з а д а е т с я п у т е м п р и с в о е н и я з н а  
ч е н и й у т о ч н я ю щ и м с в о й с т в а м bi Syst emMenu,
b i Mi n i mi ze, bi Max i mi ze и b i Hel p . С в о й с т в о
bi Syst emMenu о п р е д е л я е т д о с т у п н о с т ь к н о п к и с и с  
т е м н о г о м е н ю , b i Mi n i mi ze — к н о п к и С в е р н у т ь ,
b i Max i mi ze— к н о п к и Р а з в е р н у т ь , b i He l p — к н о п  
к и в ы в о д а с п р а в о ч н о й и н ф о р м а ц и и
i c o n З н а ч о к в з а г о л о в к е о к н а
C o l o r Ц в е т ф о н а . Ц в е т м о ж н о з а д а т ь , у к а з а в н а з в а н и е
ц в е т а и л и п р и в я з к у к т е к у щ е й ц в е т о в о й с х е м е о п е  
р а ц и о н н о й с и с т е м ы . В о в т о р о м с л у ч а е ц в е т о п р е д е  
л я е т с я т е к у щ е й ц в е т о в о й с х е м о й , в ы б р а н н ы м к о м  
п о н е н т о м п р и в я з к и и м е н я е т с я п р и и з м е н е н и и
ц в е т о в о й с х е м ы о п е р а ц и о н н о й с и с т е м ы
Font Ш р и ф т , и с п о л ь з у е м ы й "п о у м о л ч а н и ю " к о м п о н е н т а  
м и , н а х о д я щ и м и с я н а п о в е р х н о с т и ф о р м ы . И з м е н е  
н и е с в о й с т в а Font ф о р м ы п р и в о д и т к а в т о м а т и ч е  
с к о м у и з м е н е н и ю с в о й с т в а Font к о м п о н е н т а ,
р а с п о л а г а ю щ е г о с я н а п о в е р х н о с т и ф о р м ы . Т о е с т ь
к о м п о н е н т ы н а с л е д у ю т с в о й с т в о Font о т ф о р м ы
(и м е е т с я в о з м о ж н о с т ь з а п р е т и т ь н а с л е д о в а н и е )
Canvas П о в е р х н о с т ь , н а к о т о р у ю м о ж н о в ы в е с т и г р а ф и к у
К о м п о н е н т ы
В э т о м р а з д е л е п р и в е д е н о к р а т к о е о п и с а н и е б а з о в ы х к о м п о н е н  
т о в C++ Builder. П о д р о б н о е о п и с а н и е э т и х и д р у г и х к о м п о н е н  
т о в м о ж н о н а й т и в с п р а в о ч н о й с и с т е м е .
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 279
Label
К о м п о н е н т Label (р и с . 2.1) п р е д н а з н а ч е н д л я в ы в о д а т е к с т а н а
п о в е р х н о с т ь ф о р м ы . С в о й с т в а к о м п о н е н т а (т а б л . 2.2) о п р е д е л я  
ю т в и д и р а с п о л о ж е н и е т е к с т а .
I Standard j
| г . j   j j m
А
щ grs) is? e g g
. "». i _ ___,_._  , ;
label
Р и с . 2 . 1. К о м п о н е н т Lab el — п о л е в ы в о д а т е к с т а
Т а б л и ц а 2 . 2 . С в о й с т в а к о м п о н е н т а Label (п о л е в ы в о д а т е к с т а )
С в о й с т в о О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я в п р о г р а м м е д л я
д о с т у п а к к о м п о н е н т у и е г о с в о й с т в а м
C ap t i o n О т о б р а ж а е м ы й т е к с т
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы п о л я в ы в о д а д о л е в о й
г р а н и ц ы ф о р м ы
т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы п о л я в ы в о д а д о
в е р х н е й г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а п о л я в ы в о д а
wi d t h Ш и р и н а п о л я в ы в о д а
Au t o s i ze П р и з н а к т о г о , ч т о р а з м е р п о л я о п р е д е л я е т с я е г о
с о д е р ж и м ы м
Wordwrap П р и з н а к т о г о , ч т о с л о в а , к о т о р ы е н е п о м е щ а ю т с я в
т е к у щ е й с т р о к е , а в т о м а т и ч е с к и п е р е н о с я т с я н а с л е  
д у ю щ у ю с т р о к у (з н а ч е н и е с в о й с т в а Au t o s i ze д о л ж  
н о б ы т ь f al s e)
Al i g nment З а д а е т с п о с о б в ы р а в н и в а н и я т е к с т а в н у т р и п о л я .
Т е к с т м о ж е т б ы т ь в ы р а в н е н п о л е в о м у к р а ю
( t a Le f t J u s t i f y ) , п о ц е н т р у ( t aCent er ) и л и п о
п р а в о м у к р а ю ( t aRi g h t J u s t i f y )
280
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2 . 2 (о к о н ч а н и е )
Font Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я т е к с т а .
У т о ч н я ю щ и е с в о й с т в а о п р е д е л я ю т ш р и ф т (Name),
р а з м е р ( s i ze) , с т и л ь ( s t y l e ) и ц в е т с и м в о л о в
( c o l o r )
Par ent Font П р и з н а к н а с л е д о в а н и я к о м п о н е н т о м х а р а к т е р и с т и к
« ш р и ф т а ф о р м ы , н а к о т о р о й н а х о д и т с я к о м п о н е н т .
Е с л и з н а ч е н и е с в о й с т в а р а в н о t r u e, т о т е к с т в ы в о  
1
д и т с я ш р и ф т о м , у с т а н о в л е н н ы м д л я ф о р м ы
Co l o r Ц в е т ф о н а о б л а с т и в ы в о д а т е к с т а
Tr ans p ar ent У п р а в л я е т о т о б р а ж е н и е м ф о н а о б л а с т и в ы в о д а т е к  
с т а . З н а ч е н и е t r u e д е л а е т о б л а с т ь в ы в о д а т е к с т а
п р о з р а ч н о й (о б л а с т ь в ы в о д а н е з а к р а ш и в а е т с я ц в е  
т о м , з а д а н н ы м с в о й с т в о м Col or )
v i s i b l e П о з в о л я е т с к р ы т ь т е к с т ( f al s e) и л и с д е л а т ь е г о
в и д и м ы м ( t r ue)
Edit
К о м п о н е н т Edit (р и с . 2.2) п р е д с т а в л я е т с о б о й п о л е в в о д а /
р е д а к т и р о в а н и я с т р о к и с и м в о л о в . С в о й с т в а к о м п о н е н т а п р и в е  
д е н ы в т а б л . 2.3.
Standard |
Edit
Р и с . 2 . 2 . К о м п о н е н т Ed i t — п о л е в в о д а / р е д а к т и р о в а н и я
с т р о к и с и м в о л о в
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 281
Т а б л и ц а 2 . 3 . С в о й с т в а к о м п о н е н т а Sdi t
(п о л е в в о д а / р е д а к т и р о в а н и я )
С в о й с т в о О п и с а н и е
Name
T ext
И м я к о м п о н е н т а . И с п о л ь з у е т с я в п р о г р а м м е д л я д о  
с т у п а к к о м п о н е н т у и е г о с в о й с т в а м , в ч а с т н о с т и —
д л я д о с т у п а к т е к с т у , в в е д е н н о м у в п о л е р е д а к т и р о  
в а н и я
Т е к с т , н а х о д я щ и й с я в п о л е в в о д а и р е д а к т и р о в а н и я
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы к о м п о н е н т а д о л е в о й
г р а н и ц ы ф о р м ы
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы к о м п о н е н т а д о в е р х  
н е й г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а п о л я
Widt h Ш и р и н а п о л я
Font Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я в в о д и м о г о
т е к с т а
Par ent Font П р и з н а к н а с л е д о в а н и я к о м п о н е н т о м х а р а к т е р и с т и к
ш р и ф т а ф о р м ы , н а к о т о р о й н а х о д и т с я к о м п о н е н т .
Е с л и з н а ч е н и е с в о й с т в а р а в н о t r u e , т о п р и и з м е н е ! 
н и и с в о й с т в а Font ф о р м ы а в т о м а т и ч е с к и м е н я е т с я
з н а ч е н и е с в о й с т в а Font к о м п о н е н т а
Enabl ed И с п о л ь з у е т с я д л я о г р а н и ч е н и я в о з м о ж н о с т и и з м е н и т ь
т е к с т в п о л е р е д а к т и р о в а н и я . Е с л и з н а ч е н и е с в о й с т в а
р а в н о f al s e , т о т е к с т в п о л е р е д а к т и р о в а н и я и з м е  
н и т ь н е л ь з я
v i s i b l e П о з в о л я е т с к р ы т ь к о м п о н е н т ( f al s e) и л и с д е л а т ь е г о
в и д и м ы м ( t r ue)
Button
К о м п о н е н т Button (р и с . 2.3) п р е д с т а в л я е т с о б о й к о м а н д н у ю
к н о п к у . С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.4.
282
Ч а с т ь 2
Standard |
Button
Р и с . 2. 3. К о м п о н е н т Bu t t o n — к о м а н д н а я к н о п к а
Т а б л и ц а 2 . 4. С в о й с т в а к о м п о н е н т а Button
(к о м а н д н а я к н о п к а )
С в о й с т в о О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я в п р о г р а м м е д л я д о с т у  
п а к к о м п о н е н т у и е г о с в о й с т в а м
C ap t i o n Т е к с т н а к н о п к е
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы к н о п к и д о л е в о й г р а н и ц ы
ф о р м ы
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы к н о п к и д о в е р х н е й г р а  
н и ц ы ф о р м ы
Hei g h t В ы с о т а к н о п к и
Wi dt h Ш и р и н а к н о п к и
Enabl ed П р и з н а к д о с т у п н о с т и к н о п к и . Е с л и з н а ч е н и е с в о й с т в а
р а в н о t r u e , т о к н о п к а д о с т у п н а . Е с л и з н а ч е н и е с в о й с т  
в а р а в н о f al s e , т о к н о п к а н е д о с т у п н а , н а п р и м е р , в
р е з у л ь т а т е щ е л ч к а н а к н о п к е с о б ы т и е c l i c k н е в о з н и  
к а е т
v i s i b l e П о з в о л я е т с к р ы т ь к н о п к у ( f al s e) и л и с д е л а т ь е е в и д и  
м о й ( t r ue)
Hi n t П о д с к а з к а — т е к с т , к о т о р ы й п о я в л я е т с я р я д о м с у к а з а  
т е л е м м ы ш и п р и п о з и ц и о н и р о в а н и и у к а з а т е л я н а к о  
м а н д н о й к н о п к е (д л я т о г о ч т о б ы т е к с т п о я в и л с я , з н а ч е  
н и е с в о й с т в а sh owHi nt д о л ж н о б ы т ь t r ue)
ShowHi nt Р а з р е ш а е т ( t r ue) и л и з а п р е щ а е т ( f al s e) о т о б р а ж е н и е
п о д с к а з к и п р и п о з и ц и о н и р о в а н и и у к а з а т е л я н а к н о п к е
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 283
Memo
К о м п о н е н т Memo (р и с . 2.4) п р е д с т а в л я е т с о б о й э л е м е н т р е д а к т и  
р о в а н и я т е к с т а , к о т о р ы й м о ж е т с о с т о я т ь и з н е с к о л ь к и х с т р о к .
С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.5.
Standard [
А |В Г . gjLaJ 1* ® И 1 ^
Memo
Р и с . 2. 4. К о м п о н е н т Memo
Т а б л и ц а 2 . 5. С в о й с т в а к о м п о н е н т а Memo
С в о й с т в о О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я в д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а
Tex t • Т е к с т , н а х о д я щ и й с я в п о л е Memo. Р а с с м а т р и в а е т с я
к а к е д и н о е ц е л о е
Li nes М а с с и в с т р о к , с о о т в е т с т в у ю щ и й с о д е р ж и м о м у п о л я .
Д о с т у п к с т р о к е о с у щ е с т в л я е т с я п о н о м е р у . С т р о к и
н у м е р у ю т с я с н у л я
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы п о л я д о л е в о й г р а н и ц ы
ф о р м ы
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы п о л я д о в е р х н е й
г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а п о л я
Wi dt h Ш и р и н а п о л я
Font Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я в в о д и м о г о
т е к с т а
Par ent Font П р и з н а к н а с л е д о в а н и я с в о й с т в ш р и ф т а р о д и т е л ь  
с к о й ф о р м ы
284 Ч а с т ь 2
RadioButton
К о м п о н е н т RadioButton (р и с . 2.5) п р е д с т а в л я е т з а в и с и м у ю
к н о п к у , с о с т о я н и е к о т о р о й о п р е д е л я е т с я с о с т о я н и е м д р у г и х
к н о п о к г р у п п ы . С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.6.
Е с л и в д и а л о г о в о м о к н е н а д о о р г а н и з о в а т ь н е с к о л ь к о г р у п п р а  
д и о к н о п о к , т о к а ж д у ю г р у п п у с л е д у е т п р е д с т а в и т ь к о м п о н е н т о м
RadioGroup.
Standard I
 
А |З Г Щ Ш Ы
RadioButton
Р и с . 2 . 5 . К о м п о н е н т Ra d i o B u t t o n
Т а б л и ц а 2 . 6 . С в о й с т в а к о м п о н е н т а RadioButton
С в о й с т в о О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к с в о й с т  
в а м к о м п о н е н т а
C ap t i o n Т е к с т , к о т о р ы й н а х о д и т с я с п р а в а о т к н о п к и
c h ec k ed С о с т о я н и е , в н е ш н и й в и д к н о п к и : е с л и к н о п к а в ы б р а  
н а , т о c h ec k ed = t r u e , е с л и к н о п к а н е в ы б р а н а , т о
Checked= false
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы ф л а ж к а д о л е в о й г р а  
н и ц ы ф о р м ы
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы ф л а ж к а д о в е р х н е й
  г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а п о л я в ы в о д а п о я с н я ю щ е г о т е к с т а
wi d t h Ш и р и н а п о л я в ы в о д а п о я с н я ю щ е г о т е к с т а
Font Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я п о я с н я ю щ е г о
т е к с т а
Par ent Font П р и з н а к н а с л е д о в а н и я х а р а к т е р и с т и к ш р и ф т а р о д и  
т е л ь с к о й ф о р м ы
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 285
CheckBox
К о м п о н е н т CheckBox (р и с . 2.6) п р е д с т а в л я е т с о б о й н е з а в и с и м у ю
к н о п к у (п е р е к л ю ч а т е л ь ). С в о й с т в а к о м п о н е н т а п р и в е д е н ы в
т а б л . 2.7.
fStindard]
| | И
А |зг il
CheckBox
Р и с . 2 . 6 . К о м п о н е н т Chec kBox
Т а б л и ц а 2 . 7. С в о й с т в а к о м п о н е н т а CheckBox
С в о й с т в о
О п и с а н и е
Name
Ca p t i o n
Ch ecked
St a t e
AllowGrayed
Left
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к с в о й  
с т в а м к о м п о н е н т а
Т е к с т , к о т о р ы й н а х о д и т с я с п р а в а о т ф л а ж к а
С о с т о я н и е , в н е ш н и й в и д ф л а ж к а : е с л и ф л а ж о к у с  
т а н о в л е н (в к в а д р а т и к е е с т ь "г а л о ч к а "), т о з н а ч е н и е
Chec ked р а в н о t r u e; е с л и ф л а ж о к с б р о ш е н (н е т
"г а л о ч к и "), т о з н а ч е н и е Chec ked р а в н о f a l s e
С о с т о я н и е ф л а ж к а . В о т л и ч и е о т с в о й с т в а Chec ked,
п о з в о л я е т р а з л и ч а т ь у с т а н о в л е н н о е , с б р о ш е н н о е и
п р о м е ж у т о ч н о е с о с т о я н и я . С о с т о я н и е ф л а ж к а о п р е  
д е л я е т о д н а и з к о н с т а н т : c bChec k ed (у с т а н о в л е н );
c bGr ayed (с е р ы й , н е о п р е д е л е н н о е с о с т о я н и е );
c bUnChec ked (с б р о ш е н )
С в о й с т в о о п р е д е л я е т , м о ж е т л и ф л а ж о к б ы т ь в п р о  
м е ж у т о ч н о м с о с т о я н и и : е с л и з н а ч е н и е Al l owGr ayed
р а в н о f al s e , т о ф л а ж о к м о ж е т б ы т ь т о л ь к о у с т а  
н о в л е н н ы м и л и с б р о ш е н н ы м ; е с л и з н а ч е н и е Al l o w 
Gr ayed р а в н о t r u e, т о д о п у с т и м о п р о м е ж у т о ч н о е
с о с т о я н и е
Р а с с т о я н и е о т л е в о й г р а н и ц ы ф л а ж к а д о л е в о й г р а  
н и ц ы ф о р м ы
286
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2 . 7 (о к о н ч а н и е )
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы ф л а ж к а д о в е р х н е й
г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а п о л я в ы в о д а п о я с н я ю щ е г о т е к с т а
wi d t h Ш и р и н а п о л я в ы в о д а п о я с н я ю щ е г о т е к с т а
Font Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я п о я с н я ю  
щ е г о т е к с т а
Par ent Font П р и з н а к н а с л е д о в а н и я х а р а к т е р и с т и к ш р и ф т а р о д и  
т е л ь с к о й ф о р м ы
ListBox
К о м п о н е н т ListBox (р и с . 2.7) п р е д с т а в л я е т с о б о й с п и с о к , в к о  
т о р о м м о ж н о в ы б р а т ь н у ж н ы й э л е м е н т . С в о й с т в а к о м п о н е н т а
п р и в е д е н ы в т а б л . 2.8.
\ Standaid I
А Щ Щ L&l lx <s §Ц |§|н х и ; '
ListBox
Р и с . 2. 7. К о м п о н е н т Li s t Bo x
ш
Т а б л и ц а 2 . 8. С в о й с т в а к о м п о н е н т а ListBox
С в о й с т в о О п и с а н и е
Name
Items >Strings
Count
Sorted
И м я к о м п о н е н т а . В п р о г р а м м е и с п о л ь з у е т с я д л я
д о с т у п а к к о м п о н е н т у и е г о с в о й с т в а м
Э л е м е н т ы с п и с к а — м а с с и в с т р о к (н у м е р у ю т с я с
н у л я )
К о л и ч е с т в о э л е м е н т о в с п и с к а
П р и з н а к н е о б х о д и м о с т и а в т о м а т и ч е с к о й с о р т и  
р о в к и ( t r ue) с п и с к а п о с л е д о б а в л е н и я о ч е р е д  
н о г о э л е м е н т а .
Borland C++
С в о й с т в о
Builder   к р а т к и й с п р а в о ч н и к
О п и с а н и е
Т а б л и ц а 2 . 8
287
(о к о н ч а н и е )
I t emi nd ex Н о м е р в ы б р а н н о г о э л е м е н т а (э л е м е н т ы с п и с к а
н у м е р у ю т с я с н у л я ). Е с л и в с п и с к е н и о д и н и з
э л е м е н т о в н е в ы б р а н , т о з н а ч е н и е с в о й с т в а р а в  
н о м и н у с о д и н
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы с п и с к а д о л е в о й
г р а н и ц ы ф о р м ы
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы с п и с к а д о в е р х  
н е й г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а п о л я с п и с к а
Wi dt h Ш и р и н а п о л я с п и с к а
Font Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я э л е м е н  
т о в с п и с к а
Par ent Font П р и з н а к н а с л е д о в а н и я с в о й с т в ш р и ф т а р о д и  
т е л ь с к о й ф о р м ы
ComboBox
К о м п о н е н т ComboBox (р и с . 2.8) д а е т в о з м о ж н о с т ь в в е с т и д а н н ы е
в п о л е р е д а к т и р о в а н и я п у т е м н а б о р а н а к л а в и а т у р е и л и в ы б о р о м
и з с п и с к а . С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.9.
Standard
A' j a r § ш * <?< И
Е Ш З
: ~J
  I
ComboBox
Р и с . 2. 8. К о м п о н е н т ComboBox
  ?
Т а б л и ц а 2 . 9 . С в о й с т в а к о м п о н е н т а ComboBox
С в о й с т в о О п и с а н и е
Name
T ext
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а
Т е к с т , н а х о д я щ и й с я в п о л е в в о д а / р е д а к т и р о  
в а н и я
288
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2 . 9 (о к о н ч а н и е )
Items >Sbrings
Count
Itemlndex
Sorted
DropDownCount
Left
Top
Height
Width
Font
ParentFont
Э л е м е н т ы с п и с к а   м а с с и в с т р о к (н у м е р у ю т с я с
н у л я )
К о л и ч е с т в о э л е м е н т о в с п и с к а
Н о м е р э л е м е н т а , в ы б р а н н о г о в с п и с к е . Е с л и н и
о д и н и з э л е м е н т о в с п и с к а н е б ы л в ы б р а н , т о
з н а ч е н и е с в о й с т в а р а в н о м и н у с 2
П р и з н а к н е о б х о д и м о с т и а в т о м а т и ч е с к о й с о р т и  
р о в к и ( t r ue) с п и с к а п о с л е д о б а в л е н и я о ч е р е д  
н о г о э л е м е н т а
К о л и ч е с т в о о т о б р а ж а е м ы х э л е м е н т о в в р а с к р ы  
т о м с п и с к е . Е с л и к о л и ч е с т в о э л е м е н т о в с п и с к а
б о л ь ш е ч е м DropDownCount , т о п о я в л я е т с я в е р  
т и к а л ь н а я п о л о с а п р о к р у т к и
Р а с с т о я н и е о т л е в о й г р а н и ц ы к о м п о н е н т а д о л е  
в о й г р а н и ц ы ф о р м ы
Р а с с т о я н и е о т в е р х н е й г р а н и ц ы к о м п о н е н т а д о
в е р х н е й г р а н и ц ы ф о р м ы
В ы с о т а к о м п о н е н т а (п о л я в в о д а / р е д а к т и р о в а н и я )
Ш и р и н а к о м п о н е н т а
Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я э л е м е н  
т о в с п и с к а
П р и з н а к н а с л е д о в а н и я с в о й с т в ш р и ф т а р о д и  
т е л ь с к о й ф о р м ы
StringGrid
К о м п о н е н т St ringGrid (р и с . 2.9) п р е д с т а в л я е т с о б о й т а б л и ц у ,
я ч е й к и к о т о р о й с о д е р ж а т с т р о к и с и м в о л о в . С в о й с т в а к о м п о н е н  
т а п р и в е д е н ы в т а б л . 2.10.
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 289
" ST :
StnngGrid
Р и с . 2 . 9. К о м п о н е н т S t r i n g Gr i d
Т а б л и ц а 2 . 1 0. С в о й с т в а к о м п о н е н т а StringGrid
С в о й с т в о О п и с а н и е
Name
ColCount
RowCount
DefaultColWidth
DefaultRowHeight
FixedCols
FixedRows
Cells
GridLineWidth
Lef t
Top
И м я к о м п о н е н т а . И с п о л ь з у е т с я в п р о г р а м  
м е д л я д о с т у п а к к о м п о н е н т у и е г о с в о й с т  
в а м
К о л и ч е с т в о к о л о н о к т а б л и ц ы
К о л и ч е с т в о с т р о к т а б л и ц ы
Ш и р и н а к о л о н о к т а б л и ц ы
В ы с о т а с т р о к т а б л и ц ы
К о л и ч е с т в о з а ф и к с и р о в а н н ы х с л е в а к о л о  
н о к т а б л и ц ы . З а ф и к с и р о в а н н ы е к о л о н к и
в ы д е л я ю т с я ц в е т о м и п р и г о р и з о н т а л ь н о й
п р о к р у т к е т а б л и ц ы о с т а ю т с я н а м е с т е
К о л и ч е с т в о з а ф и к с и р о в а н н ы х с в е р х у с т р о к
т а б л и ц ы . З а ф и к с и р о в а н н ы е с т р о к и в ы д е  
л я ю т с я ц в е т о м и п р и в е р т и к а л ь н о й п р о  
к р у т к е т а б л и ц ы о с т а ю т с я н а м е с т е
С о о т в е т с т в у ю щ и й т а б л и ц е д в у м е р н ы й м а с  
с и в . Я ч е й к е т а б л и ц ы , н а х о д я щ е й с я н а п е  
р е с е ч е н и и с т о л б ц а с н о м е р о м c ol и с т р о к и
с н о м е р о м row, с о о т в е т с т в у е т э л е м е н т
c e l l s [ c o l ] [ r o w]
Ш и р и н а л и н и й , о г р а н и ч и в а ю щ и х я ч е й к и
т а б л и ц ы
Р а с с т о я н и е о т л е в о й г р а н и ц ы п о л я т а б л и ц ы
д о л е в о й г р а н и ц ы ф о р м ы
Р а с с т о я н и е о т в е р х н е й г р а н и ц ы п о л я т а б  
л и ц ы д о в е р х н е й г р а н и ц ы ф о р м ы
290
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2 . 1 0 (о к о н ч а н и е )
Height
Width
Options.goEditing
Options.goTab
Options.
goAlways ShowEdi tor
Font
ParentFont
В ы с о т а п о л я т а б л и ц ы
Ш и р и н а п о л я т а б л и ц ы
П р и з н а к д о п у с т и м о с т и р е д а к т и р о в а н и я с о  
д е р ж и м о г о я ч е е к т а б л и ц ы , t r u e — р е д а к  
т и р о в а н и е р а з р е ш е н о , f a l s e — а п р е щ е н о
Р а з р е ш а е т ( t r ue) и л и з а п р е щ а е т ( f al s e)
и с п о л ь з о в а н и е к л а в и ш и <Т а Ь > д л я п е р е м е  
щ е н и я к у р с о р а в с л е д у ю щ у ю я ч е й к у т а б л и ц ы
П р и з н а к н а х о ж д е н и я к о м п о н е н т а в р е ж и м е
р е д а к т и р о в а н и я . Е с л и з н а ч е н и е с в о й с т в а
f al s e , т о д л я т о г о , ч т о б ы в я ч е й к е п о я в и л  
с я к у р с о р , н а д о н а ч а т ь н а б и р а т ь т е к с т , н а  
ж а т ь к л а в и ш у <F
r
2> и л и с д е л а т ь щ е л ч о к
м ы ш ь ю
Ш р и ф т , и с п о л ь з у е м ы й д л я о т о б р а ж е н и я
с о д е р ж и м о г о я ч е е к т а б л и ц ы
П р и з н а к н а с л е д о в а н и я х а р а к т е р и с т и к
ш р и ф т а ф о р м ы
Image
К о м п о н е н т image (р и с . 2.10) о б е с п е ч и в а е т в ы в о д н а п о в е р х н о с т ь
ф о р м ы и л л ю с т р а ц и й , п р е д с т а в л е н н ы х в ф о р м а т е BMP (ч т о б ы
к о м п о н е н т м о ж н о б ы л о и с п о л ь з о в а т ь д л я о т о б р а ж е н и я и л л ю с т  
р а ц и й в ф о р м а т е JPG, н а д о п о д к л ю ч и т ь м о д у л ь JPEG —в к л ю  
ч и т ь в т е к с т п р о г р а м м ы д и р е к т и в у # inciude <jpeg.hpp>). С в о й  
с т в а к о м п о н е н т а image п р и в е д е н ы в т а б л . 2.11.
| Additional]
|А Ш &
Image
Р и с . 2 . 10 . К о м п о н е н т I mag e
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 291
Т а б л и ц а 2 . 1 1 . С в о й с т в а к о м п о н е н т а image
С в о й с т в о О п и с а н и е
P i c t u r e
И л л ю с т р а ц и я , к о т о р а я о т о б р а ж а е т с я в п о л е к о м  
п о н е н т а
Width, Height
Proportional
Strech
AutoSize
Center
Visible
Canvas
Р а з м е р к о м п о н е н т а . Е с л и р а з м е р к о м п о н е н т а
м е н ь ш е р а з м е р а и л л ю с т р а ц и и и з н а ч е н и е с в о й с т в
Aut oSi ze, St r ec h и P r o p o r t i o n al р а в н о f al s e ,
т о о т о б р а ж а е т с я ч а с т ь и л л ю с т р а ц и и
П р и з н а к а в т о м а т и ч е с к о г о м а с ш т а б и р о в а н и я к а р  
т и н к и б е з и с к а ж е н и я . Ч т о б ы м а с ш т а б и р о в а н и е
б ы л о в ы п о л н е н о , з н а ч е н и е с в о й с т в а Aut o Si ze
д о л ж н о б ы т ь f a l s e
П р и з н а к а в т о м а т и ч е с к о г о м а с ш т а б и р о в а н и я (с ж а  
т и я и л и р а с т я ж е н и я ) и л л ю с т р а ц и и в с о о т в е т с т в и и с
р е а л ь н ы м р а з м е р о м к о м п о н е н т а . Е с л и р а з м е р
к о м п о н е н т а н е п р о п о р ц и о н а л е н р а з м е р у и л л ю с т  
р а ц и и , т о и л л ю с т р а ц и я б у д е т и с к а ж е н а
П р и з н а к а в т о м а т и ч е с к о г о и з м е н е н и я р а з м е р а
к о м п о н е н т а в с о о т в е т с т в и и с р е а л ь н ы м р а з м е р о м
и л л ю с т р а ц и и
П р и з н а к о п р е д е л я е т р а с п о л о ж е н и е к а р т и н к и в
п о л е к о м п о н е н т а п о г о р и з о н т а л и , е с л и ш и р и н а
к а р т и н к и м е н ь ш е ш и р и н ы п о л я к о м п о н е н т а . Е с л и
з н а ч е н и е с в о й с т в а р а в н о f al s e , т о к а р т и н к а п р и  
ж а т а к п р а в о й г р а н и ц е к о м п о н е н т а , е с л и t r u e —
т о к а р т и н к а р а с п о л а г а е т с я п о ц е н т р у
О т о б р а ж а е т с я л и к о м п о н е н т , и , с о о т в е т с т в е н н о ,
и л л ю с т р а ц и я , н а п о в е р х н о с т и ф о р м ы
П о в е р х н о с т ь , н а к о т о р у ю м о ж н о в ы в е с т и г р а ф и к у
Timer
К о м п о н е н т Timer (р и с . 2.11) о б е с п е ч и в а е т г е н е р а ц и ю п о с л е д о  
в а т е л ь н о с т и с о б ы т и й OnTimer. С в о й с т в а к о м п о н е н т а п р и в е д е н ы
в т а б л . 2.12.
292
_j System i
Ч а с т ь 2
• ' • 1
Timer
Р и с . 2 . 1 1 . К о м п о н е н т Ti me r
С в о й с т в о
Т а б л и ц а 2 . 1 2 . С в о й с т в а к о м п о н е н т а Timer
О п и с а н и е
Name
I n t e r v a l
En a bled
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к к о м п о  
н е н т у
П е р и о д г е н е р а ц и и с о б ы т и я OnTimer. З а д а е т с я в
м и л л и с е к у н д а х
и л и
а з р е ш е н и е р а б о т ы . Р а з р е ш а е т (з н а ч е н и е t r u e) и л и
з а п р е щ а е т (з н а ч е н и е f al s e) г е н е р а ц и ю с о б ы т и я
O nTimer
SpeedButton
К о м п о н е н т SpeedButton (р и с . 2.12) п р е д с т а в л я е т с о б о й к н о п к у ,
н а п о в е р х н о с т и к о т о р о й н а х о д и т с я к а р т и н к а . С в о й с т в а к о м п о  
н е н т а п р и в е д е н ы в т а б л . 2.13.
SpeedButton
Р и с . 2 . 12 . К о м п о н е н т Sp e e d B u t t o n
С в о й с т в о
Т а б л и ц а 2 . 1 3 . С в о й с т в а к о м п о н е н т а SpeedButton
О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к к о м п о  
н е н т у и е г о с в о й с т в а м
Gl yp h Б и т о в ы й о б р а з , в к о т о р о м н а х о д я т с я к а р т и н к и д л я к а  
ж д о г о и з с о с т о я н и й к н о п к и . В б и т о в о м о б р а з е м о ж е т
б ы т ь д о ч е т ы р е х и з о б р а ж е н и й к н о п к и (р и с . 2.13)
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 293
Т а б л и ц а 2.13 (о к о н ч а н и е )
С в о й с т в о О п и с а н и е
NumGlyphs К о л и ч е с т в о к а р т и н о к в б и т о в о м о б р а з е Gl yp h
Fl a t С в о й с т в о Fl a t о п р е д е л я е т в и д к н о п к и (н а л и ч и е г р а  
н и ц ы ). Е с л и з н а ч е н и е с в о й с т в а р а в н о t r u e , т о г р а н и ц а
к н о п к и п о я в л я е т с я т о л ь к о п р и п о з и ц и о н и р о в а н и и у к а  
з а т е л я м ы ш и н а к н о п к е
Gr oup i ndex И д е н т и ф и к а т о р г р у п п ы к н о п о к . К н о п к и , и м е ю щ и е
о д и н а к о в ы й и д е н т и ф и к а т о р г р у п п ы , р а б о т а ю т п о д о б н о
р а д и о к н о п к а м : н а ж а т и е о д н о й и з к н о п о к г р у п п ы в ы з ы  
в а е т с р а б а т ы в а н и е д р у г и х к н о п о к э т о й г р у п п ы . Ч т о б ы
к н о п к у м о ж н о б ы л о з а ф и к с и р о в а т ь , з н а ч е н и е с в о й с т в а
Gr oup i ndex н е д о л ж н о б ы т ь р а в н о н у л ю
Down И д е н т и ф и к а т о р с о с т о я н и я к н о п к и . И з м е н и т ь з н а ч е н и е
с в о й с т в а м о ж н о , е с л и з н а ч е н и е с в о й с т в а Gr oup i ndex
н е р а в н о О
Al l o wAl l Up С в о й с т в о о п р е д е л я е т в о з м о ж н о с т ь о т ж а т ь к н о п к у . Е с  
л и к н о п к а н а ж а т а и з н а ч е н и е с в о й с т в а р а в н о t r u e , т о
к н о п к у м о ж н о о т ж а т ь
Le f t Р а с с т о я н и е о т л е в о й г р а н и ц ы к н о п к и д о л е в о й г р а н и ц ы
ф о р м ы
Т о р Р а с с т о я н и е о т в е р х н е й г р а н и ц ы к н о п к и д о в е р х н е й
г р а н и ц ы ф о р м ы
Hei g h t В ы с о т а к н о п к и
wi d t h Ш и р и н а к н о п к и
Enabl ed П р и з н а к д о с т у п н о с т и к н о п к и . Е с л и з н а ч е н и е с в о й с т в а
р а в н о t r u e , т о к н о п к а д о с т у п н а . Е с л и з н а ч е н и е с в о й  
с т в а р а в н о f al s e , т о к н о п к а н е д о с т у п н а
v i s i b l e П о з в о л я е т с к р ы т ь к н о п к у ( f al s e) и л и с д е л а т ь е е в и  
д и м о й ( t r ue)
Hi n t П о д с к а з к а — т е к с т , к о т о р ы й п о я в л я е т с я р я д о м с у к а з а  
т е л е м м ы ш и п р и п о з и ц и о н и р о в а н и и у к а з а т е л я н а к о  
м а н д н о й к н о п к е (д л я т о г о ч т о б ы т е к с т п о я в и л с я , н а д о ,
ч т о б ы з н а ч е н и е с в о й с т в а ShowHint б ы л о t r ue)
ShowHi nt Р а з р е ш а е т ( t r ue) и л и з а п р е щ а е т ( f al s e) о т о б р а ж е н и е
п о д с к а з к и п р и п о з и ц и о н и р о в а н и и у к а з а т е л я н а к н о п к е
294 Ч а с т ь 2
Н е д о с т у п н а я З а ф и к с и р о в а н н а я
о
>
О б ы ч н а я Н а ж а т а я м ы ш ь ю
Р и с . 2 . 1 3 . т р у к т у р а и п р и м е р б и т о в о г о о б р а з а Gl yp h : к а р т и н к и ,
с о о т в е т с т в у ю щ и е с о с т о я н и ю к н о п к и Play/ Stop
UpDown
К о м п о н е н т upDown (р и с . 2.14) п р е д с т а в л я е т с о б о й д в е к н о п к и ,
и с п о л ь з у я к о т о р ы е м о ж н о и з м е н и т ь з н а ч е н и е в н у т р е н н е й п е р е  
м е н н о й   с ч е т ч и к а н а о п р е д е л е н н у ю в е л и ч и н у . У в е л и ч е н и е и л и
у м е н ь ш е н и е з н а ч е н и я п р о и с х о д и т п р и к а ж д о м щ е л ч к е н а о д н о й
и з к н о п о к . С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.14.
Wi n32 !
1 ...:...   iJ F urq r 3 G ~ ] ^
— 1
:
" ••"—"  
UpDown
Р и с . 2. 14. К о м п о н е н т UpDown
Т а б л и ц а 2 . 1 4. С в о й с т в а к о м п о н е н т а vpDown
С в о й с т в о О п и с а н и е
Name
P o s i t i o n
Min
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к к о м  
п о н е н т у и е г о с в о й с т в а м
С ч е т ч и к . З н а ч е н и е с в о й с т в а и з м е н я е т с я в р е з у л ь т а  
т е щ е л ч к а н а к н о п к е up (у в е л и ч и в а е т с я ) и л и Down
(у м е н ь ш а е т с я ). Д и а п а з о н и з м е н е н и я о п р е д е л я ю т
с в о й с т в а Mi n и М а х , в е л и ч и н у и з м е н е н и я — с в о й с т в о
I n c r emen t
Н и ж н я я г р а н и ц а д и а п а з о н а и з м е н е н и я с в о й с т в а
P o s i t i o n
Borland C++
С в о й с т в о
Builder — к р а т к и й с п р а в о ч н и к
О п и с а н и е
Т а б л и ц а 2 . 1 4
295
(о к о н ч а н и е )
М а х В е р х н я я г р а н и ц а д и а п а з о н а и з м е н е н и я с в о й с т в а
P o s i t i o n
I nc r ement В е л и ч и н а , н а к о т о р у ю и з м е н я е т с я з н а ч е н и е с в о й с т  
в а P o s i t i o n в р е з у л ь т а т е щ е л ч к а н а о д н о й и з к н о  
п о к к о м п о н е н т а
As s o c i at e О п р е д е л я е т к о м п о н е н т ( Ed i t — п о л е в в о д а /
р е д а к т и р о в а н и я ), и с п о л ь з у е м ы й в к а ч е с т в е и н д и к а  
т о р а з н а ч е н и я с в о й с т в а P o s i t i o n . Е с л и з н а ч е н и е
с в о й с т в а з а д а н о , т о п р и и з м е н е н и и с о д е р ж и м о г о
п о л я р е д а к т и р о в а н и я а в т о м а т и ч е с к и м е н я е т с я з н а  
ч е н и е с в о й с т в а P o s i t i o n
Or i e n t a t i o n З а д а е т о р и е н т а ц и ю к н о п о к к о м п о н е н т а ". К н о п к и м о  
г у т б ы т ь о р и е н т и р о в а н ы в е р т и к а л ь н о ( u d ve r t i c al )
и л и г о р и з о н т а л ь н о ( ud Ho r i zo nt al )
ProgressBar
К о м п о н е н т ProgressBar (р и с . 2.15) п р е д с т а в л я е т с о б о й и н д и к а т о р ,
к о т о р ы й о б ы ч н о и с п о л ь з у е т с я д л я н а г л я д н о г о п р е д с т а в л е н и я
п р о т е к а н и я п р о ц е с с а , н а п р и м е р , о б р а б о т к и (к о п и р о в а н и я ) ф а й л о в ,
з а г р у з к и и н ф о р м а ц и и и т . п . С в о й с т в а к о м п о н е н т а ProgressBar
п р и в е д е н ы в т а б л . 2.15.
J T i w сС ' 53 Г З F Г
ProgressBar
Р и с . 2 . 1 5 . К о м п о н е н т Pr og r es s Bar
С в о й с т в о
Т а б л и ц а 2 . 1 5. С в о й с т в а к о м п о н е н т а ProgressBar
О п и с а н и е
P o s i t i o n З н а ч е н и е , к о т о р о е о т о б р а ж а е т с я в п о л е к о м п о н е н  
т а в в и д е п о с л е д о в а т е л ь н о с т и п р я м о у г о л ь н и к о в
(с е г м е н т о в ) и л и п о л о с ы . К о л и ч е с т в о п р я м о у г о л ь  
н и к о в (д л и н а п о л о с ы ) п р о п о р ц и о н а л ь н о з н а ч е н и ю
с в о й с т в а P o s i t i o n
296
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2 . 1 5 (о к о н ч а н и е )
Mi n М и н и м а л ь н о д о п у с т и м о е з н а ч е н и е с в о й с т в а P o s i t i o n
М а х М а к с и м а л ь н о д о п у с т и м о е з н а ч е н и е с в о й с т в а
P o s i t i o n
s t ep П р и р а щ е н и е (ш а г ) и з м е н е н и я з н а ч е н и я с в о й с т в а
P o s i t i o n п р и и с п о л ь з о в а н и и д л я и з м е н е н и я з н а ч е  
н и я с в о й с т в а Val ue м е т о д а s t e p i t
Smooth О п р е д е л я е т в и д и н д и к а т о р а . И н д и к а т о р м о ж е т б ы т ь
р а з д е л е н н а с е г м е н т ы ( f al s e) и л и п р е д с т а в л я т ь
с о б о й п о л о с у
StatusBar
К о м п о н е н т st at usBar (р и с . 2.16) п р е д с т а в л я е т с о б о й о б л а с т ь (п о  
л о с у ) в ы в о д а с л у ж е б н о й и н ф о р м а ц и и , к о т о р а я н а х о д и т с я в н и ж  
н е й ч а с т и о к н а п р о г р а м м ы (и н о г д а п о л о с у в ы в о д а с л у ж е б н о й
и н ф о р м а ц и и н а з ы в а ю т п а н е л ь ю и л и с т р о к о й с о с т о я н и я ). О б ы ч н о
п а н е л ь в ы в о д а с л у ж е б н о й и н ф о р м а ц и и р а з д е л е н а н а о б л а с т и .
С в о й с т в а к о м п о н е н т а st at usBar п р и в е д е н ы в т а б л . 2.16.
! Win32
т | par ef а Ё з | £
StatusBar
Р и с . 2. 16. К о м п о н е н т St at us Bar
Т а б л и ц а 2 . 1 6 . С в о й с т в а к о м п о н е н т а statusBar
С в о й с т в о О п и с а н и е
Panel s К о л л е к ц и я о б ъ е к т о в т и п а TSt at us Panel (т а б л . 2.17),
к а ж д ы й и з к о т о р ы х п р е д с т а в л я е т с о б о й о т д е л ь н у ю
о б л а с т ь п а н е л и StatusBar
s i mp l eP anel П р и з н а к , о п р е д е л я ю щ и й в и д п а н е л и с о с т о я н и я .
Е с л и з н а ч е н и е с в о й с т в а р а в н о t r u e , т о п а н е л ь с о  
с т о я н и я н е р а з д е л я е т с я н а о б л а с т и , а т е к с т , о т о  
б р а ж а е м ы й в с т р о к е с о с т о я н и я , о п р е д е л я е т с в о й с т  
в о Si mp l eTex t
Borland C++
С в о й с т в о
Builder — к р а т к и й с п р а в о ч н и к
О п и с а н и е
Т а б л и ц а 2 . 1 6
297
(о к о н ч а н и е )
s i mp l eTex t Т е к с т , к о т о р ы й о т о б р а ж а е т с я в п а н е л и с о с т о я н и я ,
е с л и п а н е л ь н е р а з д е л е н а н а о б л а с т и (з н а ч е н и е
с в о й с т в а Si mp l ePanel р а в н о t r ue) . Е с л и п а н е л ь
р а з д е л е н а н а о б л а с т и , т о т е к с т , н а х о д я щ и й с я в о б  
л а с т и , о п р е д е л я е т с в о й с т в о Tex t с о о т в е т с т в у ю щ е г о
э л е м е н т а к о л л е к ц и и Panel s
С в о й с т в о
Т а б л и ц а 2 . 1 7. С в о й с т в а о б ъ е к т а rstatusPanel
О п и с а н и е
Tex t Т е к с т , о т о б р а ж а е м ы й в о б л а с т и
wi d t h Ш и р и н а о б л а с т и . Ш и р и н а с а м о й п р а в о й о б л а с т и
у с т а н а в л и в а е т с я т а к , ч т о п р а в а я г р а н и ц а о б л а с т и
с о в п а д а е т с п р а в о й г р а н и ц е й п а н е л и (к о м п о н е н т а
St a t usBa r )
Animate
К о м п о н е н т Animate (р и с . 2.17) п о з в о л я е т в о с п р о и з в о д и т ь п р о  
с т у ю , н е с о п р о в о ж д а е м у ю з в у к о м а н и м а ц и ю , к а д р ы к о т о р о й н а  
х о д я т с я в ф а й л е ф о р м а т а AVI. С в о й с т в а к о м п о н е н т а п р и в е д е н ы
в т а б л . 2.18.
р г  
± М Ш Ш
i
Ani mat e
Р и с . 2 . 1 7 . о м п о н е н т Ani mat e
Т а б л и ц а 2 . 1 8. С в о й с т в а к о м п о н е н т а Anima te
С в о й с т в о О п и с а н и е
Name
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а и у п р а в л е н и я е г о п о  
в е д е н и е м
298 Ч асть 2
Таблица 2.18 (окончание)
Свойство Описание
FileName
StartFrame
StopFrame
Activate
Color
Transparent
Repetitions
И м я ф а й л а ф о р м а т а AVI, в к о т о р о м н а х о д и т с я
а н и м а ц и я , о т о б р а ж а е м а я п р и п о м о щ и к о м п о  
н е н т а
Н о м е р к а д р а , с к о т о р о г о н а ч и н а е т с я о т о б р а  
ж е н и е а н и м а ц и и
Н о м е р к а д р а , н а к о т о р о м з а к а н ч и в а е т с я о т о  
б р а ж е н и е а н и м а ц и и
П р и з н а к а к т и в и з а ц и и п р о ц е с с а о т о б р а ж е н и я
к а д р о в а н и м а ц и и
Ц в е т ф о н а к о м п о н е н т а (ц в е т "э к р а н а "), н а
к о т о р о м в о с п р о и з в о д и т с я а н и м а ц и я
Р е ж и м и с п о л ь з о в а н и я "п р о з р а ч н о г о " ц в е т а
п р и о т о б р а ж е н и и а н и м а ц и и
К о л и ч е с т в о п о в т о р о в о т о б р а ж е н и я а н и м а ц и и
MediaPlayer
К о м п о н е н т MediaPlayer (р и с . 2.18) п о з в о л я е т в о с п р о и з в е с т и в и  
д е о р о л и к , з в у к и с о п р о в о ж д а е м у ю з в у к о м а н и м а ц и ю . С в о й с т в а
к о м п о н е н т а п р и в е д е н ы в т а б л . 2.19.
J System~]_
MediaPlayer
Р и с . 2. 18. К о м п о н е н т Medi a P l a yer
С в о й с т в о
Т а б л и ц а 2 . 1 9 . С в о й с т в а к о м п о н е н т а MediaPlayer
О п и с а н и е
Name
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а и у п р а в л е н и я р а б о т о й
п л е е р а
Borland C++
С в о й с т в о
Builder   к р а т к и й с п р а в о ч н и к
О п и с а н и е
299
Т а б л и ц а 2 . 1 9 (о к о н ч а н и е )
DeviceType
FileName
AutoOpen
Display
VisibleButtons
Т и п у с т р о й с т в а . О п р е д е л я е т к о н к р е т н о е у с т р о й с т  
в о , к о т о р о е п р е д с т а в л я е т с о б о й к о м п о н е н т
Medi aPl ayer . Т и п у с т р о й с т в а з а д а е т с я и м е н о в а н  
н о й к о н с т а н т о й : d t Aut o Sel ec t — т и п у с т р о й с т в а
о п р е д е л я е т с я а в т о м а т и ч е с к и , dt vaweAudi o— п р о  
и г р ы в а т е л ь з в у к а , dt AVi vi deo — в и д е о п р о и г р ы  
в а т е л ь , dt CDAudio — CD  п р о и г р ы в а т е л ь
И м я ф а й л а , в к о т о р о м н а х о д и т с я в о с п р о и з в о д и  
м ы й з в у к о в о й ф р а г м е н т и л и в и д е о р о л и к
П р и з н а к а в т о м а т и ч е с к о г о о т к р ы т и я с р а з у п о с л е
з а п у с к а п р о г р а м м ы , ф а й л а в и д е о р о л и к а и л и
з в у к о в о г о ф р а г м е н т а
О п р е д е л я е т к о м п о н е н т , н а п о в е р х н о с т и к о т о р о г о
в о с п р о и з в о д и т с я в и д е о р о л и к (о б ы ч н о в к а ч е с т в е
э к р а н а д л я о т о б р а ж е н и я в и д е о и с п о л ь з у ю т к о м  
п о н е н т Panel )
С о с т а в н о е с в о й с т в о . О п р е д е л я е т в и д и м ы е к н о п  
к и к о м п о н е н т а . П о з в о л я е т с д е л а т ь н е в и д и м ы м и
н е к о т о р ы е к н о п к и
Table
К о м п о н е н т Table (р и с . 2.19) п р е д с т а в л я е т с о б о й т а б л и ц у б а з ы
д а н н ы х . С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.20.
I BDE
Table
Р и с . 2 . 1 9 . К о м п о н е н т Tabl e — т а б л и ц а б а з ы д а н н ы х
Т а б л и ц а 2 . 2 0. С в о й с т в а к о м п о н е н т а Table
С в о й с т в о О п и с а н и е
Name
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а
З а к . I241
300
Ч а с т ь 2
Т а б л и ц а 2 . 2 0 (о к о н ч а н и е )
С в о й с т в о О п и с а н и е
Da t aba seName
TableName
TableType
Ac t i ve
И м я б а з ы д а н н ы х , ч а с т ь ю к о т о р о й я в л я е т с я т а б л и ц а
(ф а й л д а н н ы х ), д л я д о с т у п а к к о т о р о й и с п о л ь з у е т с я
к о м п о н е н т . В к а ч е с т в е з н а ч е н и я с в о й с т в а с л е д у е т
и с п о л ь з о в а т ь п с е в д о н и м б а з ы д а н н ы х
И м я ф а й л а д а н н ы х (т а б л и ц ы д а н н ы х ), д л я д о с т у  
п а к к о т о р о м у и с п о л ь з у е т с я к о м п о н е н т
Т и п т а б л и ц ы . Т а б л и ц а м о ж е т б ы т ь н а б о р о м д а н н ы х
в ф о р м а т е Paradox ( t t Par adox) , dBase ( t t DBase),
FoxPro ( t t FoxPr o) и л и п р е д с т а в л я т ь с о б о й ф о р м а  
т и р о в а н н ы й т е к с т о в ы й ф а й л ( t t ASCi i )
П р и з н а к т о г о , ч т о т а б л и ц а а к т и в н а (ф а й л д а н н ы х
о т к р ы т ). В р е з у л ь т а т е п р и с в а и в а н и я с в о й с т в у з н а  
ч е н и я t r u e п р о и с х о д и т о т к р ы т и е ф а й л а т а б л и ц ы
Query
К о м п о н е н т Query (р и с . 2.20) п р е д с т а в л я е т ч а с т ь б а з ы д а н н ы х —
з а п и с и , у д о в л е т в о р я ю щ и е к р и т е р и ю SQL  з а п р о с а к т а б л и ц е .
С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.21.
Query
Р и с . 2 . 2 0 . К о м п о н е н т Quer y о б е с п е ч и в а е т в ы б о р и н ф о р м а ц и и
и з б а з ы д а н н ы х
Т а б л и ц а 2 . 2 1 . С в о й с т в а к о м п о н е н т а Query
С в о й с т в о О п и с а н и е
Name
И м я к о м п о н е н т а . И с п о л ь з у е т с я к о м п о н е н т о м
Dat aSour c e д л я с в я з и р е з у л ь т а т а в ы п о л н е н и я з а  
п р о с а (н а б о р а з а п и с е й ) с к о м п о н е н т о м , о б е с п е ч и  
в а ю щ и м п р о с м о т р з а п и с е й , н а п р и м е р , DBGr i d
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 301
Т а б л и ц а 2.21 (о к о н ч а н и е )
С в о й с т в о О п и с а н и е
SQL З а п и с а н н ы й н а я з ы к е SQL  з а п р о с к б а з е д а н н ы х
(к т а б л и ц е )
Ac t i ve П р и п р и с в о е н и и с в о й с т в у з н а ч е н и я t r u e а к т и в и з и  
р у е т в ы п о л н е н и е з а п р о с а
Rec or dCount К о л и ч е с т в о з а п и с е й в б а з е д а н н ы х , у д о в л е т в о р я ю  
щ и х к р и т е р и ю з а п р о с а
DataSource
К о м п о н е н т DataSource (р и с . 2.21) о б е с п е ч и в а е т с в я з ь м е ж д у
д а н н ы м и , п р е д с т а в л е н н ы м и к о м п о н е н т о м Table и л и Query, и
К о м п о н е н т а м и о т о б р а ж е н и я Д аН Н Ы Х (DBEdit, DBMemo И Л И
DBGrid). С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.22.
I Data Access |
I; k   is, lira Ш ; XML 3
W I
y r :
DataSource
Р и с . 2 . 2 1 . К о м п о н е н т Dat aSour c e о б е с п е ч и в а е т с в я з ь м е ж д у д а н н ы м и
и к о м п о н е н т о м п р о с м о т р а / р е д а к т и р о в а н и я
Т а б л и ц а 2.22. С в о й с т в а к о м п о н е н т а DataSource
С в о й с т в о О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я к о м п о н е н  
т о м о т о б р а ж е н и я д а н н ы х д л я д о с т у п а к
к о м п о н е н т у и , с л е д о в а т е л ь н о , к д а н н ы м ,
с в я з ь с к о т о р ы м и о б е с п е ч и в а е т к о м п о н е н т
Dat aSet К о м п о н е н т , п р е д с т а в л я ю щ и й с о б о й в х о д  
н ы е д а н н ы е ( Tabl e и л и Query)
DBEdit, DBMemo, DBText
К о м п о н е н т ы DBEdit и DBMemo (р и с . 2.22) о б е с п е ч и в а ю т п р о  
с м о т р и р е д а к т и р о в а н и е п о л е й з а п и с и б а з ы д а н н ы х , к о м п о  
н е н т DBText — т о л ь к о п р о с м о т р . С в о й с т в а к о м п о н е н т о в п р и  
в е д е н ы в т а б л . 2.23.
302 Ч а с т ь 2
Data Controls
DBText
' Й '
DBMemo
DBEdit
Р и с . 2 . 2 2 . К о м п о н е н т ы п р о с м о т р а и р е д а к т и р о в а н и я п о л е й Б Д
Т а б л и ц а 2.23. С в о й с т в а к о м п о н е н т о в DBText, DBEdi t и DBMemo
С в о й с т в о О п и с а н и е
Name И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а
Dat aSour c e К о м п о н е н т   и с т о ч н и к д а н н ы х
Dat aFi el d П о л е б а з ы д а н н ы х , д л я о т о б р а ж е н и я и л и р е  
д а к т и р о в а н и я к о т о р о г о и с п о л ь з у е т с я к о м п о  
н е н т
DBGrid
К о м п о н е н т DBGrid (р и с . 2.23) и с п о л ь з у е т с я д л я п р о с м о т р а и р е  
д а к т и р о в а н и я б а з ы д а н н ы х в р е ж и м е т а б л и ц ы . С в о й с т в а к о м п о  
н е н т а п р и в е д е н ы в т а б л . 2.24.
Ш %
ppala Controls
% Ш Щ
!
il
DBGri d
Р и с . 2 . 2 3 . К о м п о н е н т DBGr i d о б е с п е ч и в а е т р а б о т у
с б а з о й д а н н ы х в р е ж и м е т а б л и ц ы
Т а б л и ц а 2 . 2 4. С в о й с т в а к о м п о н е н т а DBGrid
С в о й с т в о О п и с а н и е
Name
DataSource
И м я к о м п о н е н т а
И с т о ч н и к о т о б р а ж а е м ы х в т а б л и ц е
д а н н ы х (к о м п о н е н т Dat aSour c e)
Borland C++ Builder  
С в о й с т в о
к р а т к и й с п р а в о ч н и к
О п и с а н и е
Т а б л и ц а 2.24
303
(о к о н ч а н и е )
Columns
Options.dgTitles
Options.dglndicator
Options.dgColumnResize
Options.dgColLines
Options.dgRowLines
С в о й с т в о c ol umns п р е д с т а в л я е т с о б о й
м а с с и в о б ъ е к т о в т и п а TColumn, к а ж  
д ы й и з к о т о р ы х о п р е д е л я е т к о л о н к у
т а б л и ц ы и о т о б р а ж а е м у ю в н е й и н  
ф о р м а ц и ю (т а б л . 2.25)
Р а з р е ш а е т в ы в о д с т р о к и з а г о л о в к а
с т о л б ц о в
Р а з р е ш а е т в ы в о д к о л о н к и и н д и к а т о р а .
В о в р е м я р а б о т ы с б а з о й д а н н ы х т е к у  
щ а я з а п и с ь п о м е ч а е т с я в к о л о н к е и н  
д и к а т о р а т р е у г о л ь н и к о м , н о в а я з а  
п и с ь — з в е з д о ч к о й , р е д а к т и р у е м а я —
с п е ц и а л ь н ы м з н а ч к о м
Р а з р е ш а е т м е н я т ь в о в р е м я р а б о т ы
п р о г р а м м ы ш и р и н у к о л о н о к т а б л и ц ы
Р а з р е ш а е т в ы в о д и т ь л и н и и , р а з д е л я ю  
щ и е к о л о н к и т а б л и ц ы
Р а з р е ш а е т в ы в о д и т ь л и н и и , р а з д е л я ю  
щ и е с т р о к и т а б л и ц ы
Т а б л и ц а 2 . 2 5. С в о й с т в а о б ъ е к т а TColumn
С в о й с т в о О п и с а н и е
F ieldName
Widt h
F on t
Co l o r
Align men t
П о л е з а п и с и , с о д е р ж и м о е к о т о р о г о в ы в о д и т с я
в к о л о н к е
Ш и р и н а к о л о н к и в п и к с е л а х
Ш р и ф т , и с п о л ь з у е м ы й д л я в ы в о д а т е к с т а в
я ч е й к а х к о л о н к и
Ц в е т ф о н а к о л о н к и
С п о с о б в ы р а в н и в а н и я т е к с т а в я ч е й к а х к о л о н  
к и . Т е к с т м о ж е т б ы т ь в ы р о в н е н п о л е в о м у к р г н о
( t a Le f t J u s t i f y ) , п о ц е н т р у ( t aCent er ) и л и
п о п р а в о м у к р а ю ( t aRi g h t J u s t i f y )
304
С в о й с т в о О п и с а н и е
Ч а с т ь 2
Т а б л и ц а 2 . 2 5 (о к о н ч а н и е )
T i t l e . Ca p t i o n
T i t l e. Al i gn men t
T i t l e . Co l o r
T i t l e . F o n t
З а г о л о в о к к о л о н к и . З н а ч е н и е м п о у м о л ч а н и ю
я в л я е т с я и м я п о л я з а п и с и
С п о с о б в ы р а в н и в а н и я з а г о л о в к а к о л о н к и . З а  
г о л о в о к м о ж е т б ы т ь в ы р о в н е н п о л е в о м у к р а ю
( t a Le f t J u s t i f y ) , п о ц е н т р у ( t aCent er ) и л и
п о п р а в о м у к р а ю ( t a Ri g h t J u s t i f y )
Ц в е т ф о н а з а г о л о в к а к о л о н к и
Ш р и ф т з а г о л о в к а к о л о н к и
DBNavigator
К о м п о н е н т DBNavigator (р и с . 2.24) о б е с п е ч и в а е т п е р е м е щ е н и е
у к а з а т е л я т е к у щ е й з а п и с и , а к т и в и з а ц и ю р е ж и м а р е д а к т и р о в а  
н и я , д о б а в л е н и е и у д а л е н и е з а п и с е й .
DBNavigator
Р и с . 2 . 2 4 . З н а ч о к к о м п о н е н т а DBNavi g at or
К о м п о н е н т п р е д с т а в л я е т с о б о й с о в о к у п н о с т ь к о м а н д н ы х к н о п о к
(р и с . 2.25, т а б л . 2.26). С в о й с т в а к о м п о н е н т а п р и в е д е н ы в т а б л . 2.27.
N
А *•
• 1 +  
А .
• X
К н о п к а
Р и с . 2 . 2 5 . К о м п о н е н т DBNavi g at or
Т а б л и ц а 2 . 2 6 . К н о п к и к о м п о н е н т а DBNavigator
О б о з н а ч е н и е Д е й с т в и е
К п е р в о й n b F i r s t
К п р е д ы д у щ е й n b P r i o r
У к а з а т е л ь т е к у щ е й з а п и с и
п е р е м е щ а е т с я к п е р в о й з а п и  
с и ф а й л а д а н н ы х
У к а з а т е л ь т е к у щ е й з а п и с и
п е р е м е щ а е т с я к п р е д ы д у щ е й
з а п и с и ф а й л а д а н н ы х
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 305
Т а б л и ц а 2 . 2 6 (о к о н ч а н и е )
К н о п к а О б о з н а ч е н и е Д е й с т в и е
К с л е д у ю щ е й nbNext
J
К •и I К п о с л е д н е й
I 4  1 Д о б а в и т ь
Г   \ У д а л и т ь
Г А ] Р е д а к т и р о в а  
" ™ н и е
Е Л С о х р а н и т ь
О т м е н и т ь
Г Щ О б н о в и т ь
nbLast
n bln ser t
nbD elet e
nbEdit
nbPost
Cancel
nbRefresh
У к а з а т е л ь т е к у щ е й з а п и с и п е  
р е м е щ а е т с я к с л е д у ю щ е й з а  
п и с и ф а й л а д а н н ы х
У к а з а т е л ь т е к у щ е й з а п и с и п е  
р е м е щ а е т с я к п о с л е д н е й з а п и  
с и ф а й л а д а н н ы х
В ф а й л д а н н ы х д о б а в л я е т с я
н о в а я з а п и с ь
У д а л я е т с я т е к у щ а я з а п и с ь а й  
л а д а н н ы х
У с т а н а в л и в а е т р е ж и м р е д а к  
т и р о в а н и я т е к у щ е й з а п и с и
И з м е н е н и я , в н е с е н н ы е в т е  
к у щ у ю з а п и с ь , з а п и с ы в а ю т с я в
ф а й л д а н н ы х
О т м е н я е т в н е с е н н ы е в т е к у  
щ у ю з а п и с ь и з м е н е н и я
З а п и с ы в а е т в н е с е н н ы е и з м е  
н е н и я в ф а й л
С в о й с т в о
Т а б л и ц а 2 . 2 7. С в о й с т в а к о м п о н е н т а DBNavigator
О п р е д е л я е т
Name
DataSource
И м я к о м п о н е н т а . И с п о л ь з у е т с я д л я д о с т у п а к
с в о й с т в а м к о м п о н е н т а
И м я к о м п о н е н т а , я в л я ю щ е г о с я и с т о ч н и к о м
д а н н ы х . В к а ч е с т в е и с т о ч н и к а д а н н ы х м о ж е т
в ы с т у п а т ь б а з а д а н н ы х (к о м п о н е н т Dat abase),
т а б л и ц а (к о м п о н е н т Tabl e) и л и р е з у л ь т а т в ы  
п о л н е н и я з а п р о с а (к о м п о н е н т Query)
VisibleButtons В и д и м ы е к о м а н д н ы е к н о п к и
306
Ч а с т ь 2
Г р а ф и к а
Canvas
canvas —э т о п о в е р х н о с т ь (ф о р м ы и л и к о м п о н е н т а image), н а
к о т о р о й с о о т в е т с т в у ю щ и е м е т о д ы (т а б л . 2.28) м о г у т в ы ч е р ч и в а т ь
г р а ф и ч е с к и е п р и м и т и в ы . В и д г р а ф и ч е с к и х э л е м е н т о в о п р е д е л я  
ю т с в о й с т в а п о в е р х н о с т и , н а к о т о р о й э т и э л е м е н т ы в ы ч е р ч и в а  
ю т с я (т а б л . 2.29).
Т а б л и ц а 2 . 2 8. М е т о д ы о б ъ е к т а Canvas
М е т о д О п и с а н и е
T ext O ut ( x, y, s )
D rawfx, y, b)
Li n eT o ( x, y)
MoveTo( x, y)
P o l yL i n e( p l )
В ы в о д и т с т р о к у s о т т о ч к и с к о о р д и н а т а м и
(х , у ). Ш р и ф т о п р е д е л я е т с в о й с т в о Font п о  
в е р х н о с т и , н а к о т о р у ю в ы в о д и т с я т е с т , ц в е т
з а к р а с к и о б л а с т и в ы в о д а т е к с т а — с в о й с т в о
Br us h э т о й ж е п о в е р х н о с т и
В ы в о д и т о т т о ч к и с к о о р д и н а т а м и (х , у )
б и т о в ы й о б р а з Ь . Е с л и з н а ч е н и е с в о й с т в а
Tr ans p ar ent п о в е р х н о с т и , н а к о т о р у ю в ы  
п о л н я е т с я в ы в о д р а в н о t r u e , т о т о ч к и , ц в е т
к о т о р ы х с о в п а д а е т с ц в е т о м л е в о й н и ж н е й
т о ч к и б и т о в о г о о б р а з а , н е о т о б р а ж а ю т с я
В ы ч е р ч и в а е т л и н и ю и з т е к у щ е й т о ч к и в т о ч к у
с у к а з а н н ы м и к о о р д и н а т а м и . В и д л и н и и о п р е  
д е л я е т с в о й с т в о Р е п
П е р е м е щ а е т у к а з а т е л ь т е к у щ е й т о ч к и в т о ч  
к у с у к а з а н н ы м и к о о р д и н а т а м и
В ы ч е р ч и в а е т л о м а н у ю л и н и ю . К о о р д и н а т ы
т о ч е к п е р е г и б а з а д а е т п а р а м е т р p i — м а с с и в
с т р у к т у р т и п а TPoi nt . Е с л и п е р в ы й и п о  
с л е д н и й э л е м е н т ы м а с с и в а о д и н а к о в ы е , т о
б у д е т в ы ч е р ч е н з а м к н у т ы й к о н т у р . В и д л и н и и
о п р е д е л я е т с в о й с т в о Р е п
Borland C++
М е т о д
Builder     к р а т к и й с п р а в о ч н и к
О п и с а н и е
307
Т а б л и ц а 2.28 (п р о д о л ж е н и е )
Polygon(pi)
Ellipse
(xl,y,x2,y2)
В ы ч е р ч и в а е т и з а к р а ш и в а е т м н о г о у г о л ь н и к .
К о о р д и н а т ы у г л о в з а д а е т п а р а м е т р p i —
м а с с и в с т р у к т у р т и п а TPoi nt . П е р в ы й и п о  
с л е д н и й э л е м е н т ы м а с с и в а д о л ж н ы б ы т ь
о д и н а к о в ы е . В и д г р а н и ц ы о п р е д е л я е т с в о й  
с т в о Р е п , ц в е т и с т и л ь з а к р а с к и в н у т р е н н е й
о б л а с т и — с в о й с т в о Br us h
В ы ч е р ч и в а е т э л л и п с , о к р у ж н о с т ь и л и к р у г .
П а р а м е т р ы x l , y l , x2 и у 2 з а д а ю т р а з м е р
п р я м о у г о л ь н и к а , в к о т о р ы й в п и с ы в а е т с я э л  
л и п с . В и д и н и и о п р е д е л я е т с в о й с т в о Р е п
( Х 1 . У 1 )
( Х 2 . У 2 ) ( Х 2 , у 2 )
A r c ( x l , y l , x 2 , y 2 ,
х З ,у З ,х 4,у 4)
В ы ч е р ч и в а е т д у г у . П а р а м е т р ы x l , y l , х 2,
у 2 о п р е д е л я ю т э л л и п с , и з к о т о р о г о в ы р е з а  
е т с я д у г а , п а р а м е т р ы х 2, у 2, х З , и у 4 — к о  
о р д и н а т ы к о н ц о в д у г и . Д у г а в ы ч е р ч и в а е т с я
п р о т и в ч а с о в о й с т р е л к и о т т о ч к и (х З , у З )
т о ч к е ( х 4, у 4). В и д л и н и и (г р а н и ц ы ) о п р е д е  
л я е т с в о й с т в о Р е п , в е т и с п о с о б з а к р а с к и
в н у т р е н н е й о б л а с т и — с в о й с т в о Br us h
(xi.yi) ( Х 1 . У 1 )
н а д
308 Ч а с т ь 2
Т а б л и ц а 2 . 2 8 (о к о н ч а н и е )
М е т о д О п и с а н и е
R ec t a n  
gl e ( xl , у , х 2, у 2)
RoundRec
( xl , yl , x2, y2, x3, y3)
В ы ч е р ч и в а е т п р я м о у г о л ь н и к . П а р а м е т р ы x l ,
y l , х 2 и у 2 з а д а ю т к о о р д и н а т ы л е в о г о в е р х  
н е г о и п р а в о г о н и ж н е г о у г л о в . В и д л и н и и о п  
р е д е л я е т с в о й с т в о Р е п , ц в е т и с п о с о б з а  
к р а с к и в н у т р е н н е й о б л а с т и — с в о й с т в о Br us h
В ы ч е р ч и в а е т п р я м о у г о л ь н и к с о с к р у г л е н н ы  
м и у г л а м и . П а р а м е т р ы x l , y l , x2 и у 2 з а д а  
ю т к о о р д и н а т ы л е в о г о в е р х н е г о и п р а в о г о
н и ж н е г о у г л о в , х З и у З   р а д и у с з а к р у г л е  
н и я . В и д л и н и и о п р е д е л я е т с в о й с т в о Р е п ,
ц в е т и с п о с о б з а к р а с к и в н у т р е н н е й о б л а с  
т и — с в о й с т в о Br us h
(Х 2 . У 2 )
Т а б л и ц а 2 . 2 9 . С в о й с т в а о б ъ е к т а Canvas
С в о й с т в о О п и с а н и е
Transparent
Pen
П р и з н а к и с п о л ь з о в а н и я "п р о з р а ч н о г о " ц в е т а п р и
в ы в о д е б и т о в о г о о б р а з а м е т о д о м Draw. Е с л и з н а ч е  
н и е с в о й с т в а р а в н о t r u e , т о т о ч к и , ц в е т к о т о р ы х
с о в п а д а е т с ц в е т о м л е в о й н и ж н е й т о ч к и б и т о в о г о
о б р а з а , н е о т о б р а ж а ю т с я
С в о й с т в о Р е п п р е д с т а в л я е т с о б о й о б ъ е к т (с м .
т а б л . 2.27), с в о й с т в а к о т о р о г о о п р е д е л я ю т ц в е т
т о л щ и н у и с т и л ь л и н и й , в ы ч е р ч и в а е м ы х м е т о д а м и
в ы в о д а г р а ф и ч е с к и х п р и м и т и в о в
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 309
Т а б л и ц а 2 . 2 9 (о к о н ч а н и е )
С в о й с т в о О п и с а н и е
Br us h С в о й с т в о Br us h п р е д с т а в л я е т с о б о й о б ъ е к т (с м .
т а б л . 2.28), с в о й с т в а к о т о р о г о о п р е д е л я ю т ц в е т и
с т и л ь з а к р а с к и о б л а с т е й , в ы ч е р ч и в а е м ы х м е т о д а м и
в ы в о д а г р а ф и ч е с к и х п р и м и т и в о в
Font С в о й с т в о Font п р е д с т а в л я е т с о б о й о б ъ е к т , у т о ч  
н я ю щ и е с в о й с т в а к о т о р о г о о п р е д е л я ю т ш р и ф т (н а  
з в а н и е , р а з м е р , ц в е т , с п о с о б о ф о р м л е н и я ), и с п о л ь  
з у е м ы й д л я в ы в о д а н а п о в е р х н о с т ь х о л с т а т е к с т а
Р е п
О б ъ е к т Р е п я в л я е т с я с в о й с т в о м о б ъ е к т а Canvas. С в о й с т в а о б ъ е к  
т а Р е п (т а б л . 2.30) о п р е д е л я ю т ц в е т , с т и л ь и т о л щ и н у л и н и й ,
в ы ч е р ч и в а е м ы х м е т о д а м и в ы в о д а г р а ф и ч е с к и х п р и м и т и в о в .
Т а б л и ц а 2 . 3 0. С в о й с т в а о б ъ е к т а Р е п
С в о й с т в о О п и с а н и е
C o l o r Ц в е т л и н и и ( c l Bl ac k — ч е р н ы й ; c l Mar oon — к а ш т а н о  
в ы й ; c l Gr een — з е л е н ы й ; c l o i i v e — о л и в к о в ы й ;
c l Navy — т е м н о   с и н и й ; c l P u r p l e — р о з о в ы й ; c l Te al —
з е л е н о   г о л у б о й ; c l Gr ay — с е р ы й ; c l s i l v e r — с е р е б р и  
с т ы й ; c l Red — к р а с н ы й ; c l Li me — с а л а т н ы й ; c l B l u e —
с и н и й ; c l Fu c h s i a — я р к о   р о з о в ы й ; c l Aq ua — б и р ю з о  
в ы й ; c i wh i t e — б е л ы й )
s t y l e С т и л ь (в и д ) л и н и и . Л и н и я м о ж е т б ы т ь : p s So l i d —
с п л о ш н а я ; psDash — п у н к т и р н а я (д л и н н ы е ш т р и х и );
psDot — п у н к т и р н а я (к о р о т к и е ш т р и х и ); psDashDot —
п у н к т и р н а я (ч е р е д о в а н и е д л и н н о г о и к о р о т к о г о ш т р и  
х о в ); p sDashDot Dot — п у н к т и р н а я (ч е р е д о в а н и е о д н о г о
д л и н н о г о и д в у х к о р о т к и х ш т р и х о в ); p s c l e ar — н е о т о  
б р а ж а е т с я (и с п о л ь з у е т с я , е с л и н е н а д о и з о б р а ж а т ь г р а  
н и ц у , н а п р и м е р , п р я м о у г о л ь н и к а )
wi d t h Т о л щ и н а л и н и и з а д а е т с я в п и к с е л а х . Т о л щ и н а п у н к т и р  
н о й л и н и и н е м о ж е т б ы т ь б о л ь ш е 2
370
Ч а с т ь 2
Brush
О б ъ е к т Brush я в л я е т с я с в о й с т в о м о б ъ е к т а canvas. С в о й с т в а о б ъ  
е к т а Brush (т а б л . 2.31) о п р е д е л я ю т ц в е т , с т и л ь з а к р а с к и в н у т  
р е н н и х о б л а с т е й к о н т у р о в , в ы ч е р ч и в а е м ы х м е т о д а м и в ы в о д а
г р а ф и ч е с к и х п р и м и т и в о в .
Т а б л и ц а 2 . 3 1 . С в о й с т в а о б ъ е к т а TBrush (к и с т ь )
С в о й с т в о О п и с а н и е
c o l o r Ц в е т з а к р а ш и в а н и я з а м к н у т о й о б л а с т и
s t y l e С т и л ь (т и п ) з а п о л н е н и я о б л а с т и ( b s So l i d — с п л о ш н а я
з а л и в к а ; b s C l ear — о б л а с т ь н е з а к р а ш и в а е т с я ;
bsHorizonta! — г о р и з о н т а л ь н а я ш т р и х о в к а ; b s Ve r t i c al —
в е р т и к а л ь н а я ш т р и х о в к а ; bsFDi ag onal — д и а г о н а л ь н а я
ш т р и х о в к а с н а к л о н о м л и н и й в п е р е д ; bsBDi ag onal — д и а  
г о н а л ь н а я ш т р и х о в к а с н а к л о н о м л и н и й н а з а д ; bsCr oss  
г о р и з о н т а л ь н о   в е р т и к а л ь н а я ш т р и х о в к а , в к л е т к у ; bs Di ag  
Cross — д и а г о н а л ь н а я ш т р и х о в к а в к л е т к у )
Ф у н к ц и и
В э т о м р а з д е л е п р и в е д е н о к р а т к о е о п и с а н и е н а и б о л е е ч а с т о и с  
п о л ь з у е м ы х ф у н к ц и й (т а б л . 2.32—2.35). П о д р о б н о е о п и с а н и е
м о ж н о н а й т и в с п р а в о ч н о й с и с т е м е .
Ф у н к ц и и в в о д а и в ы в о д а
Т а б л и ц а 2.32. Ф у н к ц и и в в о д а и в ы в о д а
Ф у н к ц и я О п и с а н и е
I n p ut Bo x{З а г о л о в о к ,
П о е к а з к а , З н а ч е н и е )
В р е з у л ь т а т е в ы п о л н е н и я ф у н к ц и и н а э к р а  
н е п о я в л я е т с я д и а л о г о в о е о к н о , в п о л е к о  
т о р о г о п о л ь з о в а т е л ь м о ж е т в в е с т и с т р о к у
с и м в о л о в . З н а ч е н и е м ф у н к ц и и я в л я е т с я
в в е д е н н а я с т р о к а . П а р а м е т р З н а ч е н и е з а  
д а е т з н а ч е н и е ф у н к ц и и "п о у м о л ч а н и ю ",
т . е . с т р о к у , к о т о р а я б у д е т в п о л е р е д а к т и  
р о в а н и я в м о м е н т п о я в л е н и я о к н а
Borland C++
Ф у н к ц и я
Builder —к р а т к и й с п р а в о ч н и к
О п и с а н и е
311
Т а б л и ц а 2 . 3 2 (о к о н ч а н и е )
ShowMessage(s)
MessageDlg(s,t,b,h)
П р о ц е д у р а Sh owMessag e в ы в о д и т о к н о , в
к о т о р о м н а х о д я т с я с о о б щ е н и е s и к о  
м а н д н а я к н о п к а О К
В ы в о д и т н а э к р а н д и а л о г о в о е о к н о с с о  
о б щ е н и е м s и в о з в р а щ а е т к о д к н о п к и ,
щ е л ч к о м н а к о т о р о й п о л ь з о в а т е л ь з а к р ы л
о к н о . П а р а м е т р t о п р е д е л я е т т и п о к н а :
mt War ni ng — в н и м а н и е ; mt Er r o r —
о ш и б к а ; mt l n f o r mat i o n — и н ф о р м а ц и я ;
mt C o n f i r mat i o n — а п р о с ; mt Cust om —
п о л ь з о в а т е л ь с к о е (б е з з н а ч к а ). П а р а м е т р
b (м н о ж е с т в о — з а к л ю ч е н н ы й в к в а д р а т  
н ы е с к о б к и с п и с о к к о н с т а н т ) з а д а е т к о  
м а н д н ы е к н о п к и д и а л о г о в о г о о к н а
(mbYes, rnbNo, mbOK, mbCanc el , mbHel p,
mb Ab o r t , mb Ret r y, mb l g n o r e И mb Al l ) .
П а р а м е т р h з а д а е т р а з д е л с п р а в о ч н о й
с и с т е м ы п р о г р а м м ы , к о т о р ы й п о я в и т с я в
р е з у л ь т а т е н а ж а т и я к н о п к и H elp и л и к л а  
в и ш и <F1>. Е с л и с п р а в о ч н а я с и с т е м а н е
и с п о л ь з у е т с я , з н а ч е н и е п а р а м е т р а д о л ж  
н о б ы т ь 0. З н а ч е н и е м ф у н к ц и и м о ж е т
б ы т ь о д н а и з к о н с т а н т : mr Abor t , mrYes,
mrOk, mr Ret r y, mrNo, mr Canc el ,
mr l g n o r e и л и mr Al l , о б о з н а ч а ю щ а я с о  
о т в е т с т в у ю щ у ю к о м а н д н у ю к н о п к у
М а т е м а т и ч е с к и е ф у н к ц и и
Т а б л и ц а 2 . 3 3 . М а т е м а т и ч е с к и е ф у н к ц и и
Ф у н к ц и я З н а ч е н и е
abs( n)
sq r t ( n )
е х р (п )
А б с о л ю т н о е з н а ч е н и е п
К в а д р а т н ы й к о р е н ь и з п
Э к с п о н е н т а п
312
Ф у н к ц и я З н а ч е н и е
Ч а с т ь 2
Т а б л и ц а 2.33 (о к о н ч а н и е )
ra rdo m( n )
s i n ( a )
c o s( а )
t a n ( а )
a s i n ( n ) , a c o s ( n ) ,
a t a n ( n )
С л у ч а й н о е ц е л о е ч и с л о в д и а п а з о н е о т О
д о п   1 (п е р е д п е р в ы м о б р а щ е н и е м к
ф у н к ц и и н е о б х о д и м о в ы з в а т ь ф у н к ц и ю
r and o mi ze( ) , к о т о р а я в ы п о л н и т и н и ц и а  
л и з а ц и ю п р о г р а м м н о г о г е н е р а т о р а с л у ч а й  
н ы х ч и с е л )
С и н у с в ы р а ж е н н о г о в р а д и а н а х у г л а а
К о с и н у с в ы р а ж е н н о г о в р а д и а н а х у г л а а
Т а н г е н с в ы р а ж е н н о г о в р а д и а н а х у г л а а
У г о л (в р а д и а н а х ), с и н у с , к о с и н у с и т а н г е н с
к о т о р о г о р а в е н п
С л е д у е т о б р а т и т ь в н и м а н и е , д л я т о г о ч т о б ы в п р о г р а м м е б ы л и
д о с т у п н ы п р и в е д е н н ы е ф у н к ц и и , в е е т е к с т н а д о в к л ю ч и т ь д и  
р е к т и в у # Include <math.h>.
В е л и ч и н а у г л а т р и г о н о м е т р и ч е с к и х ф у н к ц и й д о л ж н а б ы т ь в ы р а  
ж е н а в р а д и а н а х . Д л я п р е о б р а з о в а н и я в е л и ч и н ы у г л а и з г р а д у с о в
в р а д и а н ы и с п о л ь з у е т с я ф о р м у л а (а *з . 1415256) / 180, г д е а —в е  
л и ч и н а у г л а в г р а д у с а х , 3.1415926 —ч и с л о "П И ". В м е с т о к о н  
с т а н т ы 3.1415926 м о ж н о и с п о л ь з о в а т ь с т а н д а р т н у ю и м е н о в а н н у ю
к о н с т а н т у M_PI. К о н с т а н т а M_PI о п р е д е л е н а в ф а й л е math.h.
Ф у н к ц и и п р е о б р а з о в а н и я
Т а б л и ц а 2 . 3 4. Ф у н к ц и и п р е о б р а з о в а н и я
Ф у н к ц и я З н а ч е н и е / о п и с а н и е
I n t T o St r ( k )
FloatToStr(п)
С т р о к а , я в л я ю щ а я с я и з о б р а ж е н и е м ц е  
л о г о к
С т р о к а , я в л я ю щ а я с я и з о б р а ж е н и е м в е  
щ е с т в е н н о г о п
Borland C++
Ф у н к ц и я
Builder —
р а т к и й с п р а в о ч н и к
Т а б л и ц а 2 . 3 4
З н а ч е н и е / о п и с а н и е
313
(о к о н ч а н и е )
FloatToStrF(n,f,k,m)
StrToInt(s)
StrToFloat(s)
С т р о к а , я в л я ю щ а я с я и з о б р а ж е н и е м в е щ е  
с т в е н н о г о п . П р и в ы з о в е ф у н к ц и и у к а з ы  
в а ю т : f — ф о р м а т ; к — т о ч н о с т ь ; т — к о  
л и ч е с т в о ц и ф р п о с л е д е с я т и ч н о й т о ч к и .
Ф о р м а т о п р е д е л я е т с п о с о б и з о б р а ж е н и я
ч и с л а : f f Gener al — у н и в е р с а л ь н ы й ;
f f Exp onent — н а у ч н ы й ; f f Fi x e d — С
ф и к с и р о в а н н о й т о ч к о й ; f f Number — с
р а з д е л и т е л я м и г р у п п р а з р я д о в ; f f Cur  
r enc y — ф и н а н с о в ы й . Т о ч н о с т ь — н у ж н о е
о б щ е е к о л и ч е с т в о ц и ф р : 7 и л и м е н ь ш е
д л я з н а ч е н и я т и п а s i n g l e, 15 и л и м е н ь ш е
д л я з н а ч е н и я т и п а Doubl e и 18 и л и м е н ь  
ш е д л я з н а ч е н и я т и п а Ext ended
Ц е л о е , и з о б р а ж е н и е м к о т о р о г о я в л я е т с я
с т р о к а s
В е щ е с т в е н н о е , и з о б р а ж е н и е м к о т о р о г о
я в л я е т с я с т р о к а s
Ф у н к ц и и м а н и п у л и р о в а н и я д а т а м и
и в р е м е н е м
Б о л ь ш и н с т в у ф у н к ц и й м а н и п у л и р о в а н и я д а т а м и в к а ч е с т в е п а  
р а м е т р а п е р е д а е т с я п е р е м е н н а я т и п а TDateTime, к о т о р а я х р а н и т
и н ф о р м а ц и ю о д а т е и в р е м е н и .
Д л я т о г о ч т о б ы в п р о г р а м м е б ы л и д о с т у п н ы ф у н к ц и и Dayof,
weekof, Monthof и д р у г и е , в е е т е к с т н а д о в к л ю ч и т ь д и р е к т и в у
#include <DateUtils.hpp>.
Т а б л и ц а 2 . 3 5. Ф у н к ц и и м а н и п у л и р о в а н и я д а т а м и и в р е м е н е м
Ф у н к ц и я З н а ч е н и е
Now ()
DateToStr(dt)
С и с т е м н а я д а т а и в р е м я — з н а ч е н и е
т и п а TDat eTime
С т р о к а с и м в о л о в , и з о б р а ж а ю щ а я д а т у
в ф о р м а т е dd.mm.yyyy
314
Ф у н к ц и я
Ч а с т ь 2
Т а б л и ц а 2 . 3 5 (о к о н ч а н и е )
З н а ч е н и е
TimeToStr(dt)
DayOf(dt)
MonthOf(dt)
WeekOf(dt)
YearOf(dt)
DayOfWeek(dt)
StartOfWeek(w)
HourOf(dt)
MinuteOf(dt)
SecondOf(dt)
DecodeDate(dt,y,m,d)
DecodeTime(dt,h,m,s,ms)
FormatDateTime(s,dt)
С т р о к а с и м в о л о в , и з о б р а ж а ю щ а я
в р е м я в ф о р м а т е hh:mm:ss
Д е н ь (н о м е р д н я в м е с я ц е ), с о о т в е т с т  
в у ю щ и й д а т е , у к а з а н н о й в к а ч е с т в е
п а р а м е т р а ф у н к ц и и
Н о м е р м е с я ц а , с о о т в е т с т в у ю щ и й д а  
т е , у к а з а н н о й в к а ч е с т в е п а р а м е т р а
ф у н к ц и и
Н о м е р н е д е л и , с о о т в е т с т в у ю щ и й д а т е ,
у к а з а н н о й в к а ч е с т в е п а р а м е т р а
ф у н к ц и и
Г о д , с о о т в е т с т в у ю щ и й у к а з а н н о й д а т е
Н о м е р д н я н е д е л и , с о о т в е т с т в у ю щ и й
у к а з а н н о й д а т е : 1 — в о с к р е с е н ь е , 2 —
п о н е д е л ь н и к , 3 — в т о р н и к и т . д .
Д а т а п е р в о г о д н я у к а з а н н о й н е д е л и
К о л и ч е с т в о ч а с о в
К о л и ч е с т в о м и н у т
К о л и ч е с т в о с е к у н д
В о з в р а щ а е т г о д , м е с я ц и д е н ь , п р е д  
с т а в л е н н ы е о т д е л ь н ы м и ч и с л а м и
В о з в р а щ а е т в р е м я (ч а с ы , м и н у т ы ,
с е к у н д ы и м и л л и с е к у н д ы ), п р е д с т а в  
л е н н о е о т д е л ь н ы м и ч и с л а м и
С т р о к а с и м в о л о в , п р е д с т а в л я ю щ а я
с о б о й д а т у и л и в р е м я . С п о с о б п р е д  
с т а в л е н и я з а д а е т с т р о к а ф о р м а т а s,
н а п р и м е р , с т р о к а dd/ mm/ yyyy з а д а  
е т , ч т о з н а ч е н и е м ф у н к ц и и я в л я е т с я
д а т а , а с т р о к а hh :rnm — в р е м я
Borland C++ Builder — к р а т к и й с п р а в о ч н и к 315
С о б ы т и я
Т а б л и ц а 2.36. С о б ы т и я
С о б ы т и е П р о и с х о д и т
On c l i c k П р и щ е л ч к е к н о п к о й м ы ш и
On Db l c i i c k П р и д в о й н о м щ е л ч к е к н о п к о й м ы ш и
OnMouseDown П р и н а ж а т и и к н о п к и м ы ш и
OnMouseUp П р и о т п у с к а н и и к н о п к и м ы ш и
OnMouseMove П р и п е р е м е щ е н и и м ы ш и
OnKeyPress П р и н а ж а т и и к л а в и ш и к л а в и а т у р ы
OnKeyDown П р и н а ж а т и и к л а в и ш и к л а в и а т у р ы . С о б ы т и я О п  
KeyDown и OnKeyPr ess — э т о ч е р е д у ю щ и е с я , п о  
в т о р я ю щ и е с я с о б ы т и я , к о т о р ы е п р о и с х о д я т д о т е х
п о р , п о к а н е б у д е т о т п у щ е н а у д е р ж и в а е м а я к л а  
в и ш а (в э т о т м о м е н т п р о и с х о д и т с о б ы т и е
OnKeyUp)
OnKeyUp П р и о т п у с к а н и и н а ж а т о й к л а в и ш и к л а в и а т у р ы
OnCr eat e П р и с о з д а н и и о б ъ е к т а (ф о р м ы , э л е м е н т а у п р а в л е  
н и я ). П р о ц е д у р а о б р а б о т к и э т о г о с о б ы т и я о б ы ч н о
и с п о л ь з у е т с я д л я и н и ц и а л и з а ц и и п е р е м е н н ы х , в ы  
п о л н е н и я п о д г о т о в и т е л ь н ы х д е й с т в и й
OnPai nt П р и п о я в л е н и и о к н а н а э к р а н е в н а ч а л е р а б о т ы п р о  
г р а м м ы , п о с л е п о я в л е н и я ч а с т и о к н а , к о т о р а я , н а  
п р и м е р , б ы л а з а к р ы т а д р у г и м о к н о м и в д р у г и х с л у  
ч а я х . С о б ы т и е с о о б щ а е т о н е о б х о д и м о с т и о б н о в и т ь
(п е р е р и с о в а т ь ) о к н о
OnEnt er П р и п о л у ч е н и и э л е м е н т о м у п р а в л е н и я ф о к у с а
OnEx i t П р и п о т е р е э л е м е н т о м у п р а в л е н и я ф о к у с а
И с к л ю ч е н и я
И с к л ю ч е н и е —э т о о ш и б к а , к о т о р а я п р о и с х о д и т в о в р е м я р а б о  
т ы п р о г р а м м ы .
316
Т и п и с к л ю ч е н и я В о з н и к а е т
Т а б л и ц а 2 . 3 7. и п и ч н ы е
Ч а с т ь 2
и с к л ю ч е н и я
EConvert Error
EDivByZero
EZeroDivide
EFOpenError
EInO ut Error
EDBEngineError
П р и в ы п о л н е н и и п р е о б р а з о в а н и я , е с л и п р е о б  
р а з у е м а я в е л и ч и н а н е м о ж е т б ы т ь п р и в е д е н а к
т р е б у е м о м у в и д у . Н а и б о л е е ч а с т о в о з н и к а е т п р и
п р е о б р а з о в а н и и с т р о к и с и м в о л о в в ч и с л о
Ц е л о ч и с л е н н о е д е л е н и е н а н о л ь . П р и в ы п о л н е  
н и и о п е р а ц и и ц е л о ч и с л е н н о г о д е л е н и я , е с л и
д е л и т е л ь р а в е н н у л ю
Д е л е н и е н а н о л ь . П р и в ы п о л н е н и и о п е р а ц и и
д е л е н и я н а д д р о б н ы м и о п е р а н д а м и , е с л и д е л и  
т е л ь р а в е н н у л ю
П р и о б р а щ е н и и к ф а й л у , н а п р и м е р , п р и п о п ы т к е
з а г р у з и т ь ф а й л и л л ю с т р а ц и и п р и п о м о щ и м е т о  
д а LoadFr omFi l e. Н а и б о л е е ч а с т о й п р и ч и н о й
я в л я е т с я о т с у т с т в и е т р е б у е м о г о ф а й л а и л и , в
с л у ч а е и с п о л ь з о в а н и я с м е н н о г о д и с к а , о т с у т с т  
в и е д и с к а в н а к о п и т е л е
П р и о б р а щ е н и и к ф а й л у , н а п р и м е р , п р и п о п ы т к е
о т к р ы т ь д л я ч т е н и я (и н с т р у к ц и я r es et ) н е с у щ е  
с т в у ю щ и й ф а й л
П р и в ы п о л н е н и и о п е р а ц и й с б а з о й д а н н ы х , н а  
п р и м е р , п р и п о п ы т к е в ы п о л н и т ь SQL  з а п р о с к
н е с у щ е с т в у ю щ е й т а б л и ц е
П р и л о ж е н и е
О п и с а н и е CD  ROM
П р и л а г а е м ы й к к н и г е CD  ROM с о д е р ж и т п р о е к т ы C++Builder,
п р и в е д е н н ы е в к н и г е в к а ч е с т в е п р и м е р о в . К а ж д ы й п р о е к т
(т а б л . П 1) н а х о д и т с я в о т д е л ь н о м к а т а л о г е . П о м и м о ф а й л о в
п р о е к т а в к а ж д о м к а т а л о г е е с т ь в ы п о л н я е м ы й ф а й л , ч т о п о з в о  
л я е т з а п у с т и т ь п р о г р а м м у и з Windows.
Б о л ь ш и н с т в о п р о г р а м м м о гу т б ы т ь з а п у щ е н ы н е п о с р е д с т в е н н о с
CD  ROM (п р и у с л о в и и , ч т о н а к о м п ь ю т е р е у с т а н о в л е н Borland
C++Builder Version 6). Н е к о т о р ы е п р о г р а м м ы , н а п р и м е р , п р о  
гр а м м ы р а б о т ы с б а з а м и д а н н ы х , т р е б у ю т д о п о л н и т е л ь н о й н а  
с т р о й к и с и с т е м ы (с о з д а н и я п с е в д о н и м а и л и р е г и с т р а ц и и и с т о ч н и  
к а д а н н ы х ODBC).
Д л я а к т и в н о й р а б о т ы , ч т о б ы и м е т ь в о з м о ж н о с т ь в н о с и т ь и з м е  
н е н и я в п р о г р а м м ы , с к о п и р у й т е к а т а л о г и п р о е к т о в н а ж е с т к и й
д и с к к о м п ь ю т е р а .
Т а б л и ц а П 1 . С о д е р ж и м о е CD  ROM
П р о е к т ( к а т а л о г ) О п и с а н и е
CD Player П о л н о ф у н к ц и о н а л ь н ы й п р о и г р ы в а т е л ь CD  д и с к о в .
К о н т р о л и р у е т н а л и ч и е д и с к а в д и с к о в о д е и е г о
т и п . Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а
MediaPlayer
CDP П о л н о ф у н к ц и о н а л ь н ы й п р о и г р ы в а т е л ь CD  д и с к о в .
К о н т р о л и р у е т н а л и ч и е д и с к а в д и с к о в о д е и е г о
т и п . Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а
Medi aPl ayer , а т а к ж е о т о б р а ж е н и е о к н а п р о г р а м  
м ы б е з г р а н и ц и з а г о л о в к а
318
П р о е к т ( к а т а л о г ) О п и с а н и е
П р и л о ж е н и е
Т а б л и ц а П 1 (п р о д о л ж е н и е )
MEdit П р о с т о й р е д а к т о р т е к с т а . Д е м о н с т р и р у е т и с п о л ь з о  
в а н и е к о м п о н е н т о в Ri c h Edi t , MainMenu, Tool Bar ,
SpeedBut t on, OpenDial og , SaveDi al og , р а б о т у с
м е н ю , в ы п о л н е н и е о п е р а ц и й ч т е н и я и з а п и с и т е к с т а
в ф а й л
MIDI П р о г р а м м а У с п е т ь з а 6 0 с е к у н д д е м о н с т р и р у е т
и с п о л ь з о в а н и е к о м п о н е н т а Medi aPl ayer д л я
в о с п р о и з в е д е н и я MIDI  ф а й л а . М е л о д и я в о с п р о  
и з в о д и т с я "п о к р у г у ", д о т е х п о р , п о к а п о л ь з о в а  
т е л ь н е у г а д а е т ч и с л о и л и н е и с т е ч е т в р е м я , о т  
в е д е н н о е н а р е ш е н и е з а д а ч и
М Р З Player М Р З   п л е е р с р е г у л я т о р о м г р о м к о с т и . Д е м о н с т р и  
р у е т р а б о т у с к о м п о н е н т о м MediaPlayer, К а р т и н к и
д л я к н о п к и Play/ Stop з а г р у ж а ю т с я и з р е с у р с а
Spending П р о г р а м м а Р а с х о д ы о б е с п е ч и в а е т р а б о т у с б а  
з о й д а н н ы х , к о т о р а я п р е д с т а в л я е т с о б о й т е к с т о  
в ы й ф а й л (tabl.grd). Д л я р е д а к т и р о в а н и я и п р о  
с м о т р а д а н н ы х и с п о л ь з у е т с я к о м п о н е н т
StringGrid.
В н и м а н и е ! К а т а л о г п р о е к т а н а з ы в а е т с я
"Spending" а н е "Р а с х о д ы ", т а к к а к п р и и с п о л ь з о  
в а н и и в и м е н и п а п к и б у к в ы "Ы " к о м п и л я т о р н е
м о ж е т в ы п о л н и т ь к о м п и л я ц и ю
VideoPlayer П р о г р а м м а VideoPlayer п о з в о л я е т п р о с м о т р е т ь
в и д е о р о л и к ф о р м а т а AVI и л и MPG
А н и м а ц и я П р о г р а м м а А н и м а ц и я д е м о н с т р и р у е т в о с п р о и з  
в е д е н и е AVI  а н и м а ц и и п р и п о м о щ и к о м п о н е н т а
Ani mat e. А н и м а ц и я з а г р у ж а е т с я и з ф а й л а в н а  
ч а л е р а б о т ы п р о г р а м м ы
Б е г у щ а я с т р о к а В э т о й п р о г р а м м е б а н н е р (б е г у щ а я с т р о к а ) з а  
г р у ж а е т с я и з р е с у р с а . Б а н н е р "в ы п л ы в а е т " и з   з а
п р а в о й г р а н и ц ы ф о р м ы . В м о м е н т в р е м е н и , к о г д а
б а н н е р д о с т и г а е т ц е н т р а о к н а , д в и ж е н и е п р и о с  
т а н а в л и в а е т с я н а н е с к о л ь к о с е к у н д , а з а т е м в о  
з о б н о в л я е т с я
О п и с а н и е CD  ROM
П р о е к т ( к а т а л о г )
Б у д и л ь н и к
Т а б л и ц а П 1
О п и с а н и е
319
(п р о д о л ж е н и е )
П р о г р а м м а Б у д и л ь н и к . П о к а з ы в а е т , к а к п о м е с т и т ь
н а System Tray з н а ч о к п р о г р а м м ы , о б е с п е ч и т ь в ы  
в о д п о д с к а з к и и к о н т е к с т н о г о м е н ю з н а ч к а
Г р а ф и к П р о г р а м м а Г р а ф и к д е м о н с т р и р у е т в ы в о д г р а ф и  
к и (м е т о д ы Li neTo, Tex t Wi dt h , Text Out A) н а
п о в е р х н о с т ь ф о р м ы — в ы в о д и т г р а ф и к и з м е н е н и я
к у р с а д о л л а р а
Д о с т у п в Internet
Е ж е д н е в н и к
П р о г р а м м а Д о с т у п в I nternet п о к а з ы в а е т , к а к
з а п у с т и т ь Internet Explorer и л и д р у г о й б р а у з е р д л я
д о с т у п а к в е б   с т р а н и ц е
П р о г р а м м а р а б о т ы с б а з о й д а н н ы х "Е ж е д н е в н и к ".
Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т о в
ADOConnec t i on, ADODataSet, Dat aSour c e,
Tabl e и DBNavi g at or . Б а з а д а н н ы х "Е ж е д н е в  
н и к " (Planer.mdb) д о л ж н а б ы т ь з а р е г и с т р и р о в а н а
в с и с т е м е к а к и с т о ч н и к д а н н ы х ODBC п о д и м е  
н е м dpianner
З а п и с н а я к н и ж к а П р о г р а м м а р а б о т ы с б а з о й д а н н ы х "З а п и с н а я
к н и ж к а ". Д е м о н с т р и р у е т и с п о л ь з о в а н и е BDE 
к о м п о н е н т о в Tabl e и Qery, а т а к ж е к о м п о н е н т о в
DBGr i d и Dat aSour c e. Д л я д о с т у п а к ф а й л у т а б  
л и ц ы (adrbk.db) п р о г р а м м а и с п о л ь з у е т п с е в д о н и м
adrbk (Type: Standard, Default Driver: Paradox).
С о з д а т ь п с е в д о н и м м о ж н о п р и п о м о щ и
BDEAdministrator
З в у к и Windows П р о г р а м м а З в у к и Windows п о з в о л я е т п р о с л у  
ш а т ь з в у к о в ы е ф а й л ы , к о т о р ы е н а х о д я т с я в к а т а  
л о г е Windows\ Media. Д е м о н с т р и р у е т и с п о л ь з о в а  
н и е к о м п о н е н т а Medi aPl ayer
К Р Д и а г р а м м а П р о г р а м м а К р у г о в а я д и а г р а м м а д е м о н с т р и р у е т
в ы в о д г р а ф и к и (м е т о д ы Pi e, Rec t ang l e,
Text Out A) н а п о в е р х н о с т ь ф о р м ы — в ы в о д и т
к р у г о в у ю д и а г р а м м у
К а л е н д а р ь П р о г р а м м а К а л е н д а р ь в ы в о д и т и з о б р а ж е н и е
к а л е н д а р я н а т е к у щ и й м е с я ц . В ы х о д н ы е и п р а з д  
н и ч н ы е д н и в ы д е л я ю т с я ц в е т о м , т е к у щ а я д а т а —
р а м к о й . И м е е т с я в о з м о ж н о с т ь з а д а т ь п р а з д н и ч  
н ы е д н и . Д е м о н с т р и р у е т в ы в о д г р а ф и к и н а п о  
в е р х н о с т ь ф о р м ы , р а б о т у с ф у н к ц и я м и м а н и п у  
л и р о в а н и я д а т а м и
320 П р и л о ж е н и е
Т а б л и ц а П 1 (п р о д о л ж е н и е )
П р о е к т ( к а т а л о г ) О п и с а н и е
К а л ь к у л я т о р П р о с т е й ш и й к а л ь к у л я т о р . С о б ы т и е C l i c k к а ж д о й
к н о п к и о б р а б а т ы в а е т о т д е л ь н а я ф у н к ц и я
К а л ь к у л я т о р _2 П р о г р а м м а К а л ь к у л я т о р   2 д е м о н с т р и р у е т с о з  
д а н и е к о м п о н е н т о в в о в р е м я р а б о т ы п р о г р а м м ы
К а ф е П р о г р а м м а К а ф е д е м о н с т р и р у е т и с п о л ь з о в а н и е
к о м п о н е н т а Chec kBox
К о н в е р т о р П р о г р а м м а К о н в е р т о р п е р е с ч и т ы в а е т ц е н у и з
д о л л а р о в в р у б л и . Д е м о н с т р и р у е т и с п о л ь з о в а н и е
к о м п о н е н т о в Text Box и Label . П р о г р а м м а с п р о  
е к т и р о в а н а т а к и м о б р а з о м , ч т о п о л ь з о в а т е л ь м о  
ж е т в в е с т и в п о л я р е д а к т и р о в а н и я т о л ь к о ч и с л а
Л ю б и м ы й н а п и т о к П р о г р а м м а Л ю б и м ы й н а п и т о к д е м о н с т р и р у е т
и с п о л ь з о в а н и е к о м п о н е н т а ComboBox
М а г а з и н П р о г р а м м а р а б о т ы с (5а з о й д а н н ы х "М а г а з и н ".
Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т о в
Т А Ы е , Dat aSo u r c e , DBGr i d , DB Ed i t , DBMemo.
Ф о р м а т б а з ы д а н н ы х — Paradox. Д л я д о с т у п а к
б а з е д а н н ы х н е о б х о д и м о , п р и п о м о щ и BDE
Administrator, с о з д а т ь п с е в д о н и м stock (Type:
Standard; Default Driver: Paradox)
О С А Г О П р о г р а м м а О С А Г О п о з в о л я е т р а с с ч и т а т ь р а з м е р
с т р а х о в о г о в з н о с а п о д о г о в о р у о б я з а т е л ь н о г о с т р а  
х о в а н и я г р а ж д а н с к о й о т в е т с т в е н н о с т и . Д е м о н с т р и  
р у е т и с п о л ь з о в а н и е к о м п о н е н т а ComboBox, о б р а  
б о т к у о д н о й ф у н к ц и е й с о б ы т и й о т н е с к о л ь к и х
к о м п о н е н т о в
О ч и с т к а д и с к а П р о г р а м м а О ч и с т к а д и с к а у д а л я е т н е н у ж н ы е ,
с о з д а н н ы е в п р о ц е с с е к о м п и л я ц и и п р о е к т о в
C++Builder, ф а й л ы (obj, tds) и р е з е р в н ы е к о п и и
(~bpr, ~df m, ~h , ~c pp) и з у к а з а н н о г о п о л ь з о в а т е  
л е м к а т а л о г а и в с е х е г о п о д к а т а л о г о в . Д л я в ы б о  
р а к а т а л о г а и с п о л ь з у е т с я с т а н д а р т н о е о к н о
О б з о р п а п о к
П а р н ы е к а р т и н к и И г р а П а р н ы е к а р т и н к и . Д е м о н с т р и р у е т р а б о т у с
г р а ф и к о й , о т о б р а ж е н и е с п р а в о ч н о й и н ф о р м а ц и и .
К а р т и н к и з а г р у ж а ю т с я и з ф а й л а pictures.bmp
О п и с а н и е CD  ROM
П р о е к т ( к а т а л о г )
П е ч а т ь
П и н г   п о н г
321
Т а б л и ц а П 1 (п р о д о л ж е н и е )
О п и с а н и е
П р о г р а м м а С ч е т д е м о н с т р и р у е т в ы в о д н а п р и н  
т е р и п о з в о л я е т п о д г о т о в и т ь и р а с п е ч а т а т ь с ч е т
П р о г р а м м а П и н г   п о н г д е м о н с т р и р у е т , к а к м о ж н о
с д е л а т ь г р а ф и к у и н т е р а к т и в н о й
П о г о д а П р о г р а м м а П о г о д а (п р о е к т Meteo.bpr) д е м о н с т  
р и р у е т о п е р а ц и ю з а п и с и в ф а й л — д о б а в л я е т в
ф а й л meteo.txt и н ф о р м а ц и ю о т е м п е р а т у р е в о з  
д у х а . Е с л и ф а й л а д а н н ы х в т е к у щ е м к а т а л о г е
н е т , т о п р о г р а м м а с о з д а е т е г о . П р о г р а м м а С р е д  
н е м е с я ч н а я т е м п е р а т у р а (п р о е к т Meteolnfo.bpr)
д е м о н с т р и р у е т ч т е н и е д а н н ы х и з т е к с т о в о г о ф а й  
л а (meteo.txt)
П о л е т в о б л а к а х М у л ь т и п л и к а ц и я , э л е м е н т ы к о т о р о й з а г р у ж а ю т с я
и з bmp  ф а й л а . О ч е р е д н о й к а д р ф о р м и р у е т с я в
п а м я т и , а з а т е м в ы в о д и т с я н а п о в е р х н о с т ь ф о р  
м ы , ч т о п р е д о т в р а щ а е т м е р ц а н и е и з о б р а ж е н и я
(с т и р а е т о б ъ е к т и р и с у е т е г о н а н о в о м м е с т е —
к а к о д н а о п е р а ц и я в ы в о д а )
П р и в е т с т в и е П р о г р а м м а П р и в е т с т в и е д е м о н с т р и р у е т в ы в о д
т е к с т а н а п о в е р х н о с т ь ф о р м ы . В н е з а в и с и м о с т и
о т р а з м е р а ф о р м ы т е к с т в ы в о д и т с я в е е ц е н т р е
П р о с м о т р и л л ю  
с т р а ц и й
П р о с м о т р и л л ю  
с т р а ц и й ^?
С а п е р
П р о г р а м м а П р о с м о т р и л л ю с т р а ц и й п о з в о л я  
е т п р о с м о т р е т ь jpg   и л л ю с т р а ц и и . Д е м о н с т р и  
р у е т и с п о л ь з о в а н и е к о м п о н е н т о в Li s t Bo x ,
Op enDi al og , Imag e
П р о г р а м м а П р о с м о т р и л л ю с т р а ц и й п о з в о л я е т
п р о с м о т р е т ь ф а й л ы ф о р м а т а JPEG, н а п р и м е р ,
ф о т о г р а ф и и . В ы б о р п а п к и в ы п о л н я е т с я в
с т а н д а р т н о м о к н е В ы б о р п а п к и . И л л ю с т р а ц и и
м о ж н о п р о с м а т р и в а т ь п о к а д р а м и л и в р е ж и м е
с л а й д   ш о у
И г р а С а п е р . Д е м о н с т р и р у е т р а б о т у с г р а ф и к о й ,
в ы в о д д о ч е р н е г о о к н а и о т о б р а ж е н и е с п р а в о ч н о й
и н ф о р м а ц и и
С е к у н д о м е р П р о г р а м м а С е к у н д о м е р д е м о н с т р и р у е т и с п о л ь з о  
в а н и е к о м п о н е н т а Ti mer
322
П р о е к т ( к а т а л о г ) О п и с а н и е
П р и л о ж е н и е
Т а б л и ц а П 1 (п р о д о л ж е н и е )
С и л а т о к а П р о г р а м м а С и л а т о к а д е м о н с т р и р у е т и с п о л ь з о  
в а н и е к о м п о н е н т о в Text Box и Lab el , а т а к ж е
о б р а б о т к у и с к л ю ч е н и я EZer oDi vi de (д е л е н и е н а
н о л ь )
С о б е р и к а р т и н к у И г р а С о б е р и к а р т и н к у — и г р а "15" с г р а ф и ч е  
с к и м и н т е р ф е й с о м (в м е с т о ц и ф р — ф р а г м е н т ы
к а р т и н к и ). К а р т и н к а з а г р у ж а е т с я и з bmp  ф а й л а ,
и м я к о т о р о г о у к а з а н о в к о м а н д н о й с т р о к е з а п у с  
к а п р о г р а м м ы , и л и и з ф а й л а , к о т о р ы й н а х о д и т с я
в т о м ж е к а т а л о г е , ч т о и ф а й л п р о г р а м м ы
С о п р о т и в л е н и е П р о г р а м м а С о п р о т и в л е н и е в ы ч и с л я е т с о п р о т и в  
л е н и е э л е к т р и ч е с к о й ц е п и , с о с т о я щ е й и з д в у х
р е з и с т о р о в , к о т о р ы е м о г у т б ы т ь с о е д и н е н ы п о с л е  
д о в а т е л ь н о и л и п а р а л л е л ь н о . Д е м о н с т р и р у е т и с  
п о л ь з о в а н и е к о м п о н е н т а Radi oBut t on
С п р а в о ч н а я и н  
ф о р м а ц и я
П р о г р а м м а К о н в е р т о р д е м о н с т р и р у е т р а з л и ч н ы е
с п о с о б ы о т о б р а ж е н и я с п р а в о ч н о й и н ф о р м а ц и и .
В п о д к а т а л о г е hip н а х о д я т с я ф а й л ы , н е о б х о д и  
м ы е д л я с о с з д а н и я ф а й л а с п р а в к и
С п р а в о ч н а я и н   П р о г р а м м а д е м о н с т р и р у е т р а з л и ч н ы е м е т о д ы
ф о р м а ц и я _2 о т о б р а ж е н и я с п р а в о ч н о й и н ф о р м а ц и и . В п о д к а  
т а л о г е \ С п т н а х о д я т с я ф а й л ы , н е о б х о д и м ы е д л я
с о з д а н и я ф а й л а с п р а в о ч н о й с и с т е м ы
Ф л а г П р о г р а м м а О л и м п и й с к и й ф л а г д е м о н с т р и р у е т
в ы в о д г р а ф и к и н а п о в е р х н о с т ь ф о р м ы
Ф о н о в ы й р и с у н о к
Ф у н т
П р о г р а м м а Ф о н о в ы й р и с у н о к д е м о н с т р и р у е т ,
к а к м о ж н о п о л у ч и т ь ф о н о в ы й р и с у н о к п у т е м м н о  
г о к р а т н о г о в ы в о д а б и т о в о г о о б р а з а н а п о в е р х  
н о с т ь ф о р м ы . Б и т о в ы й о б р а з з а г р у ж а е т с я и з
ф а й л а Puzzle.bmp
П р о г р а м м а Ф у н т ы   к и л о г р а м м ы п о з в о л я е т п е р е  
с ч и т а т ь в е с и з ф у н т о в в к и л о г р а м м ы . К н о п к а
П е р е с ч е т д о с т у п н а т о л ь к о в т о м с л у ч а е , е с л и
п о л ь з о в а т е л ь в в е л и с х о д н ы е д а н н ы е
О п и с а н и е CD  ROM
П р о е к т ( к а т а л о г ) О п и с а н и е
323
Т а б л и ц а П 1 (о к о н ч а н и е )
Х о д и к и Ч а с ы с ч а с о в о й , м и н у т н о й и с е к у н д н о й с т р е л к а м и .
П о к а з ы в а ю т т е к у щ е е в р е м я .
З а м е ч а н и е . Е с л и к а т а л о г п р о е к т а н а з в а т ь "Ч а с ы ", т о
в о з н и к а е т о ш и б к а в р е м е н и к о м п и л я ц и и . К о м п и л я  
т о р у н е н р а в и т с я с л о в о "Ч а с ы ", т о ч н е е б у к в а "ы "
Э к з а м е н а т о р П р о г р а м м а Э к з а м е н а т о р . В о п р о с ы с ч и т ы в а ю т с я
и з txt  ф а й л а . П р и м е р ф а й л а т е с т а — с м .
peterburg.txt. И м я ф а й л а т е с т а н а д о у к а з а т ь в к о  
м а н д н о й с т р о к е з а п у с к а п р о г р а м м ы . К о м а н д у
з а п у с к а н а д о н а б р а т ь в о к н е З а п у с к п р о г р а м м ы ,
к о т о р о е с т а н о в и т с я д о с т у п н ы м в р е з у л ь т а т е в ы  
б о р а к о м а н д ы П у с к | В ы п о л н и т ь
Э к з а м е н а т о р _2 У н и в е р с а л ь н а я п р о г р а м м а т е с т и р о в а н и я Э к з а м е  
н а т о р . Д е м о н с т р и р у е т и с п о л ь з о в а н и е к о м п о н е н т а
XMLDocument (ф а й л т е с т а — XML  д о к у м е н т ). И м я
ф а й л а т е с т а п е р е д а е т с я в п р о г р а м м у ч е р е з п а р а  
м е т р к о м а н д н о й с т р о к и . Д л я о б л е г ч е н и я п р о ц е с с а
з а п у с к а п р о г р а м м ы м о ж н о с о з д а т ь bat  ф а й л (с м .
economics.bat)
Э л е к т р о э н е р г и я П р о г р а м м а Э л е к т р о э н е р г и я п о к а з ы в а е т , к а к
о д н а ф у н к ц и я м о ж е т о б р а б а т ы в а т ь с о б ы т и я р а з  
н ы х (н о о д н о т и п н ы х ) к о м п о н е н т о в
П р е д м е т н ы й у к а з а т е л ь
в
Brush 309, 310
С
Canvas 278, 291
ClientHeight 278
ClientWidth 278
X
XML  ф а й л 232
А
А б с о л ю т н о е з н а ч е н и е 311
А р к т а н г е н с 312
Б
Б и т о в ы й о б р а з :
з а г р у з к а и з ф а й л а 81, 114
з а г р у з к а и з р е с у р с а 118
Б р а у з е р 57
В
В о с п р о и з в е д е н и е :
AVI 150
CD 142
MIDI 138
Р
Pen 308, 309
Т
Transparent 308
М Р З 128
WAV 124
В и д е о 150
В ы в о д :
в ф а й л 62
н а п р и н т е р 259
В ы в о д н а п о в е р х н о с т ь ф о р  
м ы :
к а р т и н к а 81, 306
т е к с т 306
г 
г
Г р а ф и к а :
а н и м а ц и я 115
б и т о в ы й о б р а з 114
д в и ж е н и е о б ъ е к т а 109
и л л ю с т р а ц и я 100
Б а з о в ы е к о м п о н е н т ы 325
л и н и я 104
м у л ь т и п л и к а ц и я 114
о к р у ж н о с т ь 84
п р я м о у г о л ь н и к 87
с е к т о р 93
т е к с т 82
ф о н о в ы й р и с у н о к 121
д
Д и а л о г о в о е о к н о :
В ы б о р п а п к и 128, 255
О п р о г р а м м е 181
О т к р ы т ь ф а й л 33
Д у г а 307
З в у к :
CD 142
MIDI 138
М Р З 128
PlaySound 246
WAV 124
И
И с к л ю ч е н и е :
EConvertError 316
EDB Engine Error 166
EDivByZero 316
EFOpenError 316
EZeroDivide 316
EZerroDivide 12
К
К а р а н д а ш 308
К в а д р а т н ы й к о р е н ь 311
К и с т ь 309
К о м п о н е н т :
ADOConnection 172
ADODataSet 172
Animate 158, 297
Button 281
CheckBox 18, 285
ComboBox 21, 28, 65, 287
DataSource 162, 166, 301
DBEdit 166, 301
DBGrid 162, 166, 302
DBMemo 166, 301
DBNavigator 304
DBText301
Edit 280
Form 277
Image 100, 290
Label 6, 279
ListBox 33, 128, 286
MainMenu75, 180
MediaPlayer 125, 138, 298
Memo 255, 283
MonthCalendar 62
Open Dialog 33, 75
PopupMenu 246
ProgressBar 51, 295
Queiy 162, 300
RadioButton 16, 284
RichEdit 75
SaveDialog 75
SpeedButton 75, 128, 142, 292
StaticText 36
StatusBar 54, 296
StringGrid 70, 259, 288
Table 162, 166, 299
TextBox 6
Timer 48, 291
Tool Bar 75
TrackBar 128
Up Down 246, 294
XMLDocument 232
с о з д а н и е в к о д е 43, 218
326 Ч а с т ь 1. П р и м е р ы и з а д а ч и
К о с и н у с 312
К р у г 307
Л
Л и н и я 306
з а м к н у т а я 306
л о м а н а я 306
м
М а с с и в к о м п о н е н т о в 43
М е т о д :
TextHeight 82
TextWidth 82
М н о г о у г о л ь н и к 307
О к н о б е з з а г о л о в к а 148, 241
О к р у ж н о с т ь 307
п
П а н е л ь з а д а ч 246
П р о з р а ч н о с т ь 308
П р я м о у г о л ь н и к 308
Р е г у л и р о в к а г р о м к о с т и 128
С и н у с 312
С л у ч а й н о е ч и с л о 312
С п р а в о ч н а я и н ф о р м а ц и я
о т о б р а ж е н и е 58
ф о р м а т С Н М 60
ф о р м а т HLP 58
Ф
Ф а й л :
з а п и с ь 62
п о и с к 255
с о з д а н и е 62
ч т е н и е 65, 218
Ф у н к ц и я :
Abs 311
Arc 312
Cos 312
DateToStr313
DayOf314
DayOfWeek 314
Decode Date 314
DecodeTime 314
Е х р З П
ExtractFileName 33
ExtractFilePath 33
FileClose 62
FileCreate 62
FileDelete 255
FileOpen 62
FileSeek 62
FileWrite 62
FindFirst 33, 129, 255
FinclNext 33, 129, 255
FloatToStr312
FloatToStrF 313
FonnatDateTime 314
HourOf314
InputBox 310
IntToStr312
MessageDlg 311
MinuteOf 314
MonthOf314
Now 313
ParamCount 232
Б а з о в ы е к о м п о н е н т ы 327
ParamSt r 232
PlaySound 246
Ra n do m 312
Ran domize 198
Ra n domRa n ge 198
ReadF ile 65
Sec o n dO f314
Shell Execut e 57
ShowMessage 311
Sin 312
Sqrt 311
St art O fWeek314
St rToF loat 313
St rToI n t 313
T i meT o St r 314
WeekO f314
WinExec 58
YearO f314
Ц
1
Ц в е т :
з а к р а с к и 309
л и н и и 308
ч
Ч т е н и е :
и з XML  ф а й л а 232
и з ф а й л а 65, 218
э
Э л л и п с 307
\ "л
ч т о о б ъ е д и н я е т б о л е е 30 000
it  с п е ц и а л и с т о в в е д у щ и х к о м п а н и й ?
о н и п о д п и с а н ы н а к а т а л о г
s o f t I i n e   d i r e c t !
К а к р е г у л я р н о п о л у ч а т ь с в е ж у ю и н ф о р м а ц и ю и з м и р а и н ф о р м а ц и о н н ы х т е х н о л о г и й ? К а к
д о б и т ь с я м а к с и м а л ь н о й э ф ф е к т и в н о с т и и н в е с т и ц и й в IT? К а к в ы б р а т ь п р а в и л ь н у ю с т р а т е г и ю
в р а з в и т и и Г Г   и н ф р а с т р у к т у р ы , к а к в ы б р а т ь п р а в и л ь н о е с т е х н о л о г и ч е с к о й т о ч к и з р е н и я
р е ш е н и е т о й и л и и н о й п р о б л е м ы ? Э т и в о п р о с ы п о с т о я н н о в о з н и к а ю т к а к п е р е д
р у к о в о д и т е л я м и б и з н е с а , т а к и п е р е д р у к о в о д и т е л я м и Г Г   п о д р а з д е л е н и й . Г д е м о ж н о
п о л у ч и т ь о б ъ е к т и в н ы е о т в е т ы н а в с е э т и в о п р о с ы и у з н а т ь , к а к IT и с п о л ь з у ю т с я д р у г и м и
к о м п а н и я м и ? К а т а л о г Soft Line
9
  direct — и с т о ч н и к т а к о й и н ф о р м а ц и и .
И н ф о р м а ц и я , к о то р а я н е о б х о д и м а . П р а в и л ь н о п о с т р о е н н а я IT  и н ф р а с т р у к т у р а к о м п а н и и —з а л о г
у с п е ш н о г о и к о н к у р е н т н о с п о с о б н о г о б и з н е с а . В а т а л о г е п р е д с т а в л е н а д е т а л ь н а я и н ф о р м а ц и я о
п о с л е д н и х н о в и н к а х в м и р е п р о г р а м м н о г о о б е с п е ч е н и я , п р и в е д е н ы о б :ю р н ы е с т а т ь и , п р и м е р ы
у с п е ш н о г о в н е д р е н и я и р а з н о о б р а з н ы е ч и п о в ы е р е ш е н и я . Э Ш й и н ф о р м а ц и я п о м о ж е т В а м с д е л а т ь
п р а в и л ь н ы й в ы б о р .
В ы б е р и те к а та л о г, к о то р ы й В ам н у ж е н . В н а с т о я щ е е в р е м я и ы п у с к а с т с я н е с к о л ь к о в е р с и й к а т а л о г о в
SoftUne'  direct и р я д с п е ц в ы п у с к о в (Microsoft, Unux, Novell, Apple). О с н о в н о й к а т а л о г Soft!jne*  direct
п р е д с т а в л е н в т р е х р е д а к ц и я х :
Softlinc'  dircct Standard Edition
Softline*  direct Professional Edition
SoftUne'  direci Enterprise Edition
П о д п и ш и с ь н а к а т а л о г с е г о д н я !
Д л я б е с п л а т н о й п о д п и с к и н а к а т а л о г SoftLine*  Direct п о з в о н и т е п о т е л . : +7 ( 0 9 5 ) 2 3 2   0 0   2 3 и л и п о с е т и т е
с а й т www. softline. ru
« " и ц ^ ^ | Ш №
S O U
п р о г р а м м н о е о б е с п е ч е н и е — и ц е н з и р о в а н и е , о б у ч е н и е , к о н с а л т и н г
7 ( 0 9 5 ) 2 3 2   О О   2 3 W wjw

Никита Культин

C

+

+

B

u

i

l

d

e

r

в задачах и примерах

Санкт-Петербург «БХВ-Петербург» 2005

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->