Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C++Builder. Учебный курс

.pdf
Скачиваний:
14
Добавлен:
15.11.2022
Размер:
9.54 Mб
Скачать

- Создайте обработчик события 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 .