C++Builder. Учебный курс
.pdf- Создайте обработчик события OnChange компонента T C o lo rG rid , который используется для палитры цветов. В этом обработчике необходимо обеспечить изменение основного и фо нового цветов рисования.
Обычно в графических редакторах основной цвет использует ся, если при рисовании нажимается левая кнопка мыши; фоновый цвет используется, если при рисовании нажимается правая кнопка мыши.
-Запрограммируйте, чтобы при выборе соответствующего инструмента рисования пользователь имел возможность в окне рисования нарисовать прямоугольник, линию, выполнить опера цию заливки и т.д.
Ниже приведен пример рисования в программе прямоуголь ника.
- В |
обработчике события |
OnMouseDown |
компонента |
|||
Im age 1 введите следующий код: |
|
|
||||
void __fastcall T Form l: : ImageIMouseDown (TObject |
||||||
♦ S en d er, |
TM ouseButton B u tto n , |
T S h iftS ta te |
S h ift, |
|||
int |
X, |
int |
Y) |
|
|
|
{ |
|
|
|
true; |
|
|
D raw ing |
= |
|
|
|||
x l |
= |
X; |
|
|
|
|
x2 |
= |
X; |
|
|
|
|
y l |
= |
У; |
|
|
|
|
У2 |
= |
Y; |
|
|
|
|
} |
|
|
|
|
|
|
В обработчике события OnMouseMove компонента Im agel:
void __fastcall T Form l:: ImageIMouseMove (TObject ♦ S en d er, T S h if tS ta te S h if t, int X, int Y)
{_
if (Drawing)
{
if ( S h i f t . C o n ta in s ( s s L e f t))
Im agel-> C anvas-> P en -> C olor = FGShape- > B rush -> C olor;
else
Im a g e l - > C a n v a s - > P e n - > C o lo r = |
||
|
|
BGShape- > B ru s h - > C o lo r ; |
/ / Р и с о в а н и е п р я м о у го л ь н и к а |
||
i f |
(s b R e c ta n g l e - >Down) |
|
{ |
Im a g e l-> C a n v a s -> P e n -> M o d e = pm N otX or; |
|
|
||
|
I m a g e l- > C a n v a s - > B r u s h - > S ty le = b s C l e a r ; |
|
|
I m a g e l - > C a n v a s - > R e c t a n g l e ( x l ,y l ,x 2 ,y 2 ) ; |
|
|
I m a g e l - > C a n v a s - > R e c t a n g l e ( x l ,y l ( X ,Y ); |
|
} |
|
|
X 2 |
= |
X ; |
y2 |
= |
Y; |
}
}
В обработчике события OnMouseUp компонента Im age 1:
void __fastcall T F o rm l: : Im agelM ouseU p(T O bject
* S e n d e r, TM ouseB utton B u tto n , T S h i f t S t a t e S h i f t , int X, int Y)
{
D raw ing = false;
}
-Закончите самостоятельно разработку графического редак
тора.
10. ОСНОВЫ РАБОТЫ С БАЗАМИ ДАННЫХ
Базы данных (БД) могут быть локальными, то есть они могут просто являться коллекцией таблиц dBASE или P a ra d o x в одной поддиректории на вашем локальном жестком диске или на файло вом сервере локальной подсети. Или же они могут быть удален ными - в этом случае база данных поддерживается сервером базы данных, типа S y b a se , O r a c le , I n fo r m ix или I n te r b a s e .
Реляционные базы данных часто управляются посредством SQL (структурированный язык запросов - S t r u c t u r e d Q uery L a n g u a g e). SQL - это специальный язык для определения и управления реляционными базами данных.
Хотя SQL и признан как международный стандарт, существу ет много диалектов SQL, в которых реализованы различные опре деленные производителями расширения. При написании приложе ний баз данных необходимо знать все ограничения и/или расши рения SQL, поддерживаемые специфической платформой базы данных, для которой пишется программа.
Термин клиент/сервер означает архитектуру базы данных: сервер - это центральное место, где хранятся данные. Сервер дос тупен любому числу клиентов, то есть приложениям, использую щим и управляющим содержимым базы данных сервера. При та ком подходе большие объемы данных хранятся и управляются централизованно, что делает возможной оптимизацию доступа к данным, а также управление одновременными многократными за просами к одним и тем же данным. Обычно клиенты и сервер за пущены на разных машинах, связанных друг с другом через сеть.
Примеры серверов баз данных, получивших наибольшее рас пространение, - O r a c le , S y b a se , I n fo r m ix или I n te r b a s e .
C++Builder, со своей стороны, обеспечивает всеми средствами об служивания и инструментами, требуемыми для развития и под
держания приложений клиента, которые обращаются к данным, управляемым сервером.
Ниже рассматривается пример создания приложения баз дан ных с использованием C++Builder.
Рассмотрим пример создания базы данных Г орода и
стран ы , состоящей из двух таблиц Страны и Г орода. Отноше |
|
ние между таблицами "о д и н -к о -м н о ги м ", то есть одной записи |
|
в таблице С траны может соответствовать более одной |
записи в |
таблице Г орода. В данной программе рассматривается |
создание |
приложения, |
в |
котором |
с |
помощью |
компонента |
T C lie n tD a ta S e t |
создается связь M a s t e r - D e t a i l . |
|
Компоненты доступа к данным T T a b le , T Q uery используют вызовы к библиотеке BDE, поэтому она должна быть инсталлиро вана на рабочей станции. Для создания приложений баз данных, не нуждающихся в BDE, используется компонент T C lie n tD a ta S e t.
Можно отметить следующие преимущества его применения:
-упрощ ается установка разработанной программы - не тре буется инсталляция BDE и ее настройка (необходимо вместе с при ложением передать только один файл m id a s . d l l ) ;
-файлы базы данных имеют меньший размер;
-увеличивается скорость работы с базой данных;
-в приложениях, использующих многоуровневую архитекту ру, клиентское приложение не требовательно к ресурсам рабочей станции (так называемый «тонкий клиент»);
-при неустойчивой связи с сервером допускается локальная буферизация данных.
10.1. Написание приложения для создания таблиц базы данных
Для создания БД «Г орода и стран ы » желательно разрабо тать отдельную программу. Структура таблиц C o u n t r ie s и C i t i e s приведена ниже (табл. 10.1, 10.2).
|
|
|
|
|
|
|
Таблица 10.1 |
C o u n t r i e s : |
|
|
|
|
|
|
|
Название поля |
Тип поля |
Длина поля |
Описание поля |
||||
C o u n t r y |
S t r i n g |
20 |
|
|
Страна |
||
C a p i t a l |
S t r i n g |
20 |
|
|
Столица |
||
|
|
|
|
|
|
|
Таблица 10.2 |
C i t i e s : |
|
|
|
|
|
|
|
Название поля |
Тип поля |
Длина поля |
Описание поля |
||||
C o d e C ity |
A u t o ln c |
- |
|
|
Код города |
||
C o u n t r y |
S t r i n g |
20 |
|
Код страны |
|||
C i t y |
S t r i n g |
20 |
|
|
Город |
||
Эти |
таблицы |
будут |
связаны отношением |
« о д и н -к о - |
|||
м ногим » с использованием поля C o u n try . |
|
|
|||||
-Поместите на |
форму два компонента T C lie n tD a ta S e t, |
||||||
назвав их c d s C o u n t r i e s и c d s C i t i e s |
и две кнопки T B u tto n . |
||||||
—Для |
каждой |
кнопки |
создайте |
обработчики событий |
|||
O n C lic k . |
|
|
|
|
|
|
|
v o id __ f a s t c a l l T F o rm l: : B u t t o n l C l i c k ( T O b j e c t |
|||||||
♦S ender) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
/ / -------------------------------------------------------------------------- |
|
|
|
|
|
|
|
/ / С оздание таблицы |
«Страны» |
|
|
|
|||
/ / ----------------------------------------------------------------------- |
|
|
|
|
|
|
|
T In d e x O p tio n s O p ts ; |
|
false; |
|
|
|
||
c d s C o u n t r i e s - > A c t i v e |
= |
|
|
|
|||
c d s C o u n t r i e s - > F i e l d D e f s - > C l e a r () ; |
|
|
|||||
c d s C o u n t r i e s - > F ie ld D e f s - >Add ( "Country", |
f t S tr i n g , |
||||||
|
20, |
true); |
|
|
|
|
|
c d s C o u n t r i e s - > F i e l d D e f s - > A d d ( "Capital"t |
f t S t r i n g , |
||||||
|
20, |
true); |
|
|
|
|
/ / С оздание индексов
c d s C o u n t r i e s - > I n d e x D e f s - > C l e a r () ;
O p t s . C l e a r ( ) ;
O p ts << i x P r i m a r y << ix U n iq u e ;
c d s C ount r i e s - > IndexD e f s ->A d d ( " P r i m a r y ", " C o u n tr y " ,
O p t s ) ;
c d s C o u n t r i e s - > C r e a t e D a t a S e t ( ) ;
c d s C o u n t r i e s - > S a v e T o F i l e ( " C o u n t r i e s . c d s ", d f B i n a r y ) ;
}
v o i d |
__ f a s t c a l l |
T F o rm l: : B u tto n 2 C lic k ( T O b je c t |
|
* S en d er) |
|
|
|
{ |
|
|
|
/ / |
---------------------------------------------------------------------------- |
|
|
/ / |
Создание таблицы "Города" |
|
|
/ / ---------------------------------------------------------------------------- |
|
|
|
T In d e x O p tio n s |
O p ts ; |
|
|
c d s C i t i e s - > A c t i v e = f a l s e ; |
|
||
c d s C i t i e s - > F i e l d D e f s - > C l e a r ( ) ; |
|
||
c d s C i t i e s - > F i e l d D e f s - > A d d ( " C o d e C ity " , |
f t A u t o I n c , |
||
|
0, |
f a l s e ) ; |
|
c d s C i t i e s - > F i e l d D e f s - > A d d ( " C o u n tr y " , f t S t r i n g , |
|||
|
20, |
t r u e ) ; |
|
c d s C i t i e s - > F i e l d D e f s - > A d d ( " C i t y " , f t S t r i n g , |
|||
|
20, |
t r u e ) ; |
|
/ / |
Создание и н д ек со в |
|
|
c d s C i t i e s - > I n d e x D e f s - > C l e a r ( ) ; |
|
||
O p t s . C l e a r ( ) ; |
|
|
|
O p ts << i x P r i m a r y << ix U n iq u e ; |
|
||
c d s C i t ie s - > I n d e x D e f s - > A d d ( " P r i m a r y " , |
" C o d e C ity " , |
||
|
O p t s ) ; |
|
|
O p ts >> ix P r i m a r y ; |
|
c d s C i t ie s - > I n d e x D e f s - > A d d ( " C o u n tr y I n d e x " , " C o u n t r y " , O p t s ) ;
c d s C i t i e s - > C r e a t e D a t a S e t ( ) ;
c d s C i t i e s - > S a v e T o F i l e ( " C i t i e s . c d s " , d f B i n a r y ) ;
Процесс создания таблиц заключается в следующем. Посред ством свойства F ie ld D e f s описываются поля таблиц, а с помо щью свойства In d e x D e fs - их индексы (создаются первичные индексы). С целью формирования связи M a s te r - D e ta il созда ется вторичный индекс для поля C o u n try таблицы C i t i e s .
-Запустите приложение.
-Нажмите на обе кнопки. В результате в каталоге программы
будут созданы два файла C o u n t r i e s . c d s и C i t i e s . c d s , со держащие две таблицы БД C o u n tr ie s и C i t i e s .
10.2. Создание приложения для работы с базой данных
- Начните новое приложение и сохраните его.
- Скопируйте |
в |
каталог |
приложения |
файлы таблиц БД |
C o u n t r i e s . c d s |
и C |
i t i e s . c d s, созданные ранее. |
||
-Поместите |
на |
форму |
компоненты |
T C lie n tD a ta S e t, |
T D a ta S o u rc e и TDBGrid. |
|
|
||
-С войству Name |
компонента T C lie n tD a ta S e t присвойте |
|||
значение c d s C o u n t r i e s . |
|
|
- Свойству Name компонента T D a ta S o u rc e присвойте зна
чение d s C o u n t r i e s , свойству D a ta S e t - c d s C o u n trie s .
- Свойству Name компонента TDBGrid присвойте значение
d b g C o u n tr ie s , свойству D a ta S o u rc e - d s C o u n trie s .
- В |
контекстном |
меню для компонента c d s C o u n trie s вы |
|
берите пункт L o ad fro m f i l e |
... и в диалоговом окне выберите |
||
файл C o u n t r i e s . c d s . |
|
||
- В |
контекстном |
меню для компонента c d s C o u n tr ie s вы |
|
берите |
пункт F i e l d s E d i t o r |
(для запуска F i e ld s E d ito r |
можно также дважды щелкнуть по компоненту c d s C o u n trie s ) .
- В появившемся списке редактора полей (пока он пуст) на жмите правую кнопку мыши и в контекстном меню выберите пункт Add A l l F i e l d s . Будет показан список всех полей таб лицы БД.
Таким образом, |
компоненты T C l i e n t D a t a S e t , T D a ta - |
S o u r c e и T D B G rid мы связали с таблицей C o u n t r i e s . |
|
-Поместите на |
форму компоненты T C l i e n t D a t a S e t , |
T D a t a S o u r c e |
и T D B G rid и аналогичным образом свяжите их с |
||
таблицей C i t i e s . |
|
||
|
10.2.1. |
Создание обработчиков событий |
|
- |
Создайте обработчик события O n C r e a t e формы. |
||
v o id |
__f a s t c a l l |
T F o rm l: : F o rm C r e a te (T O b je c t * S en d er) |
|
{ |
|
|
|
T In d e x O p tio n s |
O p ts ; |
||
/ / ---------------------------------------------------------------------------- |
|
|
|
/ / |
Таблица |
"Страны" |
|
/ / ---------------------------------------------------------------------------- |
|
|
|
c d s C o u n tr ie s - > F ile N a m e = " C o u n t r i e s . c d s " ; |
|||
/ / |
Создание вторичных и нд ек сов |
||
O p t s . C l e a r ( ) ; |
|
O p ts << ix U n iq u e ;
c d s C o u n tr ie s - > I n d e x D e f s - > A d d ( " C a p i t a l l n d e x " , " C a p i t a l " , O p t s ) ;
c d s C o u n t r i e s - > O p e n ( ) ;
c d s C o u n tr ie s - > I n d e x F ie ld N a m e s = " C o u n tr y " ;
c d s C o u n t r i e s - > L o a d F r o m F i l e ( " C o u n t r i e s . c d s " ) ; c d s C o u n t r i e s - > F i r s t ( ) ;
/ / ----------------------------------------------------------------------------
/ / Таблица "Города"
/ / ----------------------------------------------------------------------------
c d s C i t ie s - > F i le N a m e = " C i t i e s . c d s "; / / Создание вторичных и нд ек со в
O p t s . C l e a r ( ) ;
O p ts << ix U n iq u e ;
c d s C i t ie s - > I n d e x D e f s - > A d d ( " C o u n tr y I n d e x " , "C o u n t r y ; C i t y " , O p t s ) ;
O p t s . C l e a r ( ) ;
c d s C i t ie s - > I n d e x D e f s - > A d d ( " C i t y l n d e x " , " C i t y " ,
c d s C i t i e s - > O p e n ( ) ; |
|
|
c d s C itie s - > I n d e x F ie ld N a m e s |
= " C o u n try ;C ity " ; |
|
c d s C i t i e s - > L o a d F r o m F i l e ( " C i t i e s . cds" ) ; |
||
c d s C i t i e s - > F i r s t ( ) ; |
|
|
/ / |
Р еал и зац и я с в я зи M a s t e r - D e t a il |
|
/ / |
между наборами данных |
|
c d s C i t ie s - > M a s t e r S o u r c e = d s C o u n tr ie s ; |
||
c d s C i t i e s - > M a s t e r F i e l d s = |
" C o u n try " ; |
}
- Создайте обработчик события O nClose формы.
v o id __f a s t c a l l T F o rm l: : F orm C lose(T O bject *Sender, T C lo s e A c tio n S A ctio n )
{
c d s C o u n t r i e s - > C l o s e () ; c d s C i t i e s - > C l o s e () ;
}
При открытии таблиц БД следует учитывать, что вторичные индексы не сохраняются - их нужно создавать после загрузки за ново.
10.2.2. Настройка параметров столбцов в DBGrid
Измените параметры компонентов DBGrid так, чтобы назва ния его столбцов содержали русские наименования.
- Для этого щелкните правой кнопкой мыши на компоненте d b g C o u n trie s и в контекстном меню выберите пункт Columns
E d i to r (можно также дважды щелкнуть по компоненту
d b g C o u n trie s ) . На экране появится окно редактора столбцов
компонента. |
|
- Для того |
чтобы изменить характеристики столбцов в |
d b g C o u n trie s , |
нужно перейти от неявно определяемых столб |
цов к явно определяемым. Для этого нужно щелкнуть по кнопке
Add A l l F i e l d s , в результате чего будут добавлены столбцы,
каждый из которых соответствует полю, определенному в редак
торе полей компонента c d s C o u n tr ie s .
-Ч тобы изменить заголовок каждого столбца, следует вы брать при помощи мыши имя столбца в редакторе столбцов, и в инспекторе объектов раскрыть список свойства T i t l e и изменить свойство C a p tio n .
10.2.3. Реализация связи Master-Detail между наборами данных
Таблицы БД C o u n t r ie s и C i t i e s находятся в отношении подин-ко-многимм. Можно сделать так, чтобы при установке ука зателя на наборе данных c d s C o u n t r i e s (ассоциированном с таблицей C o u n t r ie s ) в наборе данных c d s C i t i e s (ассоцииро ванном с таблицей C i t i e s ) показывались только города соответ ствующей страны. Это реализуется через механизм связи наборов данных M a s t e r - D e t a i l .
Для реализации связи M a s t e r - D e t a i l между наборами данных c d s C o u n t r i e s и c d s C i t i e s в обработчик события Оп- C r e a te формы включены следующие строки:
c d s C it ie s - > I n d e x F i e l d N a m e s
c d s C i t i e s - > M a s t e r S o u r c e |
= |
c d s C i t i e s - > M a s t e r F i e l d s |
= |
= " C o u n try " ; d s C o u n t r i e s ; " C o u n t r y " ;
Вторичный индекс по полю C o u n try необходимо сделать текущим, так как таблицы связаны отношением «один-ко-многим» с использованием поля C o u n try .
-Запустите приложение и заполните таблицу C o u n t r i e s (3-4 страны) и затем для каждой страны введите города. Прц за полнении таблицы C i t i e s следует заполнять только поле C ity .