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

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

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

10.2.4. Управление связью Master-Detail между наборами

данных при выполнении приложения

 

- Поместите на форму компонент TCheckBox.

 

 

-Свойству

Name компонента присвойте значение cb A ll-

C it ie s .

 

 

 

 

-Свойству

C a p tio n компонента

присвойте

значение Все

города.

 

 

 

 

-Создайте

обработчик события

O nC lick

компонента

c b A l l C i t i e s .

 

 

 

v o i d

__ f a s t c a l l T Form l: :c b A H C itie s C lic k ( T O b je c t

‘ S e n d e r)

 

 

 

{

 

 

 

 

i f

( c b A llC itie s - > C h e c k e d )

 

 

 

c d s C i t i e s - > M a s t e r F i e l d s =

 

 

e l s e

 

 

 

{

c d s C itie s - > I n d e x F ie ld N a m e 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 ";

"C o u n try " ;

}

}

Таким образом, при установленном флажке Все города связь между таблицами будет отключена.

10.2.5. Сортировка записей в таблице базы данных

Для сортировки записей в таблице БД необходимо:

-перед открытием таблиц БД создать вторичные индексы по соответствующим полям;

-сделать этот индекс текущим (активным) при выполнении приложения.

Для установки текущего индекса можно использовать свойст­

ва IndexN am e и IndexF ieldN am es компонента

T C lie n tD a ta S e t. В первом случае необходимо указать имя ин­ декса, во втором случае - список индексных полей, перечислен­ ных через символ

-С оздайте обработчик события O n T it le C l i c k компонента

d b g C o u n tr ie s .

void __fastcall

T F o rm l: : d b g C o u n tr ie s T itle C lic k ( T C o lu m n *Column)

{

if

(Column->FielcLName ==

" C o u n try " )

if

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 " ;

(Column->FielcLName ==

" C a p i t a l " )

 

c d s C o u n tr ie s - > I n d e x F ie ld N a m e s

=

" C a p i t a l " ;

}

- Запустите приложение и проверьте правильность его рабо­ ты. При щелчке по заголовку таблицы С траны должна изменяться сортировка записей.

- Аналогичным образом создайте обработчик события

O n T it le C l i c k компонента d b g C i t ie s .

void __fastcall T F o rm l: : d b g C ity T itle C lic k ( T C o lu m n *Column)

{

if ( c b A llC itie s - > C h e c k e d )

{

if

(C olum n ->FieldN am e ==

" C o d e C ity ")

if

c d s C i t ie s - > I n d e x F i e l d N a m e s = " C o d e C ity " ;

(C olum n ->FieldN am e ==

" C o u n try " )

if

c d s C i t ie s - > I n d e x F i e l d N a m e s = " C o u n tr y " ;

(C olum n ->FieldN am e ==

" C ity " )

 

c d s C i t ie s - > I n d e x F i e l d N a m e s = " C i t y " ;

}

}

Для таблицы C i t i e s сортировка будет правильно работать, если связь между таблицами будет отключена.

10.2.6. Поиск записей в таблице базы данных

Для поиска записей в таблице БД можно использовать метод L o c a te компонента T C lie n tD a ta S e t. Вызов этого метода име­ ет следующий вид:

L o c a t e (сп о л е п о и с к а > , ск р и тер и й п о и ска> , <опции п о и ск а> )

Метод L o c a te ищет первую запись, удовлетворяющую кри­ терию поиска, и, если такая запись найдена, делает ее текущей. В этом случае в качестве результата возвращается tr u e .

Опции позволяют указать режимы поиска:

-

l o C a s e l n s e n s i t i v e - поиск ведется без учета регистра.

-

l o P a r t i a l K e y - критерий поиска

допускает частичное

совпадение.

 

Ниже демонстрируется использование

метода L o c a te для

поиска записей в таблице C o u n tr ie s .

 

-Поместите на форму компоненты TComboBox, T E d it и

T B u tto n .

Компонент TComboBox будет использоваться для выбора по­ ля поиска, компонент T E d it - для установки критерия поиска, а при нажатии на кнопку должен осуществляться поиск в таблице.

- В

свойство

Ite m s компонента TComboBox занесите две

строки: С тр ан а и С толица .

- В

обработчике события O n C re a te формы свойству

I te m ln d e x компонента TComboBox присвойте значение 0.

-С оздайте

обработчик события O n C lick компонента

T B u tto n .

 

v o id __ f a s t c a l l T F o r m l: : B u t t o n l C l i c k ( T O b j e c t *S e n d e r )

{

T L o c a te O p tio n s O p ts ;

O p t s . C l e a r ( ) ;

O p ts << l o P a r t i a l K e y << l o C a s e l n s e n s i t i v e ; s w itc h (ComboBoxl- > lte m ln d e x )

case 0: // Поиск по ст р а н е

c d s C o u n t r i e s - > L o c a t e ( " C o u n t r y " , E d i t l - > T e x t ,

break;

O p t s ) ;

// Поиск по столи ц е

case Is

c d s C o u n t r i e s - > L o c a t e ( " C a p i t a l ", E d i t l - > T e x t , O p t s ) ;

break;

}

}

- Запустите приложение и проверьте правильность его работы.

10.2.7.Фильтрация записей в таблице базы данных

Для фильтрации записей в наборах данных можно использо­

вать

свойства

F i l t e r

и

F i l t e r e d

и

событие

O n F ilte r R e c o r d .

Свойство F i l t e r задает критерий фильтра­

ции. Свойство F i l t e r e d ,

установленное в t r u e ,

 

инициирует

фильтрацию. Событие O n F ilte r R e c o r d возникает при установ­

ке значения t r u e в свойство F i l t e r e d . Обработчик события имеет два параметра:

- имя фильтруемого набора данных;

- переменную A c c e p t, которая должна принимать значение t r u e , если текущая запись удовлетворяет условию фильтрации.

Ниже демонстрируется использование фильтрации по полю

C o u n try для таблицы C i t i e s .

- Поместите на форму компоненты T E d it и T B u tto n . Компонент T E d it будет использоваться для ввода условия

фильтрации, кнопка - для фильтрации набора данных.

- Создайте обработчик события O n C lic k компонента T B u t­ t o n .

v o id __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)

{

/ / Формирование у слови я фильтрации

c d s C i t i e s - > F i l t e r =

" [C o u n try ]= '" +

E d it2 - > T e x t

+

c d s C i t i e s - > F i l t e r e d

= true;

}

- Запустите приложение и проверьте правильность его рабо­ ты, предварительно отключив связь между таблицами.

Примечание. При формировании условия фильтрации следу­ ет помнить, что строковые константы должны заключаться в апо­ строфы.

С использованием события O n F ilte r R e c o rd компонента c d s C i t i e s последний пример может быть реализован следую­ щим образом:

void __fastcall T F o rm l: : B u tto n 2 C lic k (T O b je c t ♦ S e n d e r)

{

c d s C i t i e s - > F i l t e r e d

=

false;

c d s C i t i e s - > F i l t e r e d

=

true;

}

 

 

void __fastcall T F o rm l:: (T D a ta S e t * D a ta S e t,

{

c d s C i t i e s F i l t e r R e c o r d b o o l ^A ccept)

/ / У словие фильтрации

A c c e p t = c d s C itie s C o u n tr y - > V a lu e - > V a lu e == E d i t 2 - > T e x t ;

}

В связи с тем, что опция фильтрации fo N o P artialC o m p are не работает, фильтрацию с частичным совпадением можно реали­ зовать следующим образом.

- Поместите на форму компонент TCheckBox и назовите его c b P a r tia lC o m p a r e .

- Отключите обработчик события O n F ilte rR e c o rd .

- Создайте обработчик события O n C lic k компонента T B u t- t o n .

void __fastcall T F o r m l: : B u t t o n 2 C l i c k ( T O b j e c t * S e n d e r )

{

S t r i n g s i , s 2 ;

 

 

 

 

s i =

+ E d i t 2 - > T e x t +

 

 

/ /

Ч астичное с о о т в е т с т в и е

 

if

(c b P a rtia lC o m p a r e - > C h e c k e d )

{

s2 =

+ E d i t 2 - > T e x t

+

" я 1";

 

 

c d s C i t i e s - > F i l t e r

=

" ( [ C o u n t r y ] >=" + s i + ") AND

 

([ C o u n try ] <=

 

+

s2

+ " ;

}

 

 

 

 

 

 

/ /

Полное

с о о т в е т с т в и е

 

 

 

else

 

 

 

 

 

 

c d s C i t i e s - > F i l t e r = " [ C o u n tr y ] =" + s i ;

c d s C i t i e s - > F i l t e r e d

=

true;

 

}

 

 

 

 

 

 

- Запустите приложение и проверьте правильность его рабо­ ты, предварительно отключив связь между таблицами.

11.ОСНОВЫ РАБОТЫ С БИБЛИОТЕКОЙ OPENGL

Вэтой главе рассматривается использование графической библиотеки OpenGL в C++Builder.

На данный момент в Windows существует два стандарта для работы с трехмерной графикой: OpenGL, являющийся стандартом де-факто для всех графических рабочих станций, и D ir e c t3 D -

стандарт, предложенный фирмой Microsoft. Здесь мы рассмотрим только стандарт OpenGL, так как он является намного более про­ думанным и удобным, нежели постоянно изменяющийся Direct3D.

Существенным достоинством OpenGL является его широкая распространенность: он является стандартом в мире графических рабочих станций типа Sun, Silicon Graphics и др.

OpenGL (Open Graphics Library) - открытая графическая биб­ лиотека. Термин «открытый» означает независимый от производи­ телей. Стандарт OpenGL был разработан и утвержден в 1992 г. де­ вятью ведущими фирмами, среди которых Digital Equipment Corporation, Evans & Sutherland, Hewlett Packard Co., IBM Corp., Intel Corp., Intergraph Corp., Silicon Graphics Inc., Sun Microsystems и Microsoft. В основу стандарта была положена библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc. С тех пор библио­ тека завоевала огромную популярность.

OpenGL - это стандартная библиотека для всех операционных систем, в том числе и для операционной системы Windows. Ос­ новное назначение OpenGL - программирование трехмерной гра­ фики. Библиотека написана на языке С, но может быть использо­ вана в других языках программирования: C++, Pascal, Java и мно­ гих других языках.

Библиотека OpenGL представляет собой интерфейс програм­ мирования трехмерной графики. Единицей информации является вершина, из них состоят более сложные объекты. Программист создает вершины, указывает, как их соединять (линиями или мно­ гоугольниками), устанавливает координаты и параметры источни­

ков света, а библиотека OpenGL берет на себя работу создания изображения на экране. OpenGL идеально подходит для програм­ мистов, которым необходимо создать небольшую трехмерную сцену, не задумываясь о деталях реализации алгоритмов трехмер­ ной графики. Для профессионалов, занимающихся программиро­ ванием трехмерной графики, библиотека тоже будет полезной, так как она представляет собой основные механизмы и выполняет оп­ ределенную автоматизацию. Используя OpenGL, вы с легкостью создадите трехмерные поверхности, наложите на них текстуры, разместите источники света, сможете сделать эффект тумана, про­ зрачности, смешивания цветов, а также сможете наложить трафа­ рет, передвигать объекты сцены, лампы и камеры по заданным траекториям, создав тем самым анимацию.

OpenGL непосредственно не поддерживает работу с устрой­ ствами ввода такими, как мышь или клавиатура, так как эта биб­ лиотека является платформенно независимой. Но вы можете за­ действовать функции конкретной операционной системы, под ко­ торую пишете свою программу или воспользоваться надстройками над OpenGL, такими как библиотеки GLUT или GLAUX. Тем самым ваша программа заживет новой жизнью. Возможности просто без­ граничны.

11.1. Подключение OpenGL

Библиотека

OpenGL размещена в двух

DLL-файлах:

o p e n g l 3 2 . d l l

и g l u 3 2 . d l l . Первый из этих

файлов и есть

собственно библиотека OpenGL. Назначение его -

осуществление

взаимодействия с акселератором или программная эмуляция уско­ рителя за счет центрального процессора.

Файлы DLL (D ynam ic L in k L i b r a r y , библиотека дина­ мической компоновки) являются основой программной архитекту­ ры Windows и отличаются от исполняемых файлов фактически только заголовком. Использование DLL позволяет операционной системе экономить память. Например, для загрузки операционной системы Windows ХР необходимо запустить файл w i n . com, име­

ющий размер всего 18 Кбайт. Как легко догадаться, в файл такого размера невозможно поместить код, реализующий всю ту гигант­ скую работу, которая производится по ходу выполнения любого приложения. Этот файл является загрузчиком ядра операционной системы, физически размещенным в нескольких DLL-файлах.

Помимо кода, DLL-файлы могут хранить данные и ресурсы. Например, при изменении значка (ярлыка) пользователю предла­ гается на выбор набор значков из файла SHELL3 2 . DLL.

Использование DLL позволяет операционной системе эконо­ мить память.

Для просмотра списка функций, размещенных в конкретном файле d l l можно воспользоваться утилитой td u m p . ехе, постав­ ляемой в составе C-H-Builder.

11.1.1. Вывод с использованием функций GDI

Перед тем как перейти к использованию библиотеки OpenGL, рассмотрим вывод на форму графической информации с помощью функций GDI. Для рисования в примере будем использовать низ­ коуровневые функции вывода Windows, так называемые функции

GDI ( G r a p h ic D e v ic e I n t e r f a c e , интерфейс графического

устройства). Эти функции требуют в качестве одного из своих ар­ гументов ссылку на контекст устройства. Тип такой величины - HDC (H a n d le D e v ic e C o n te x t, ссылка на контекст устройст­ ва), значение ее можно получить вызовом функции API GetDC с аргументом-ссылкой на устройство вывода. В примере в качестве аргумента указана ссылка на окно формы.

Пример 11.1

- Объявите в заголовочном файле модуля в секции p r i v a t e

переменную d c типа HDC

HDC d c ;

- Создайте обработчик события O n C re a te формы:

void __fastcall T F o rm l: : F o rm C r e a te (T O b je c t * S en d er)

{

dc = G e tD C (H a n d le ); / / З а да ем зн ач ен и е

ссылки

}

 

 

 

 

 

- Создайте обработчик события O n P a in t формы:

void __fastcall

T F o rm l: : F o r m P a in t( T O b je c t

* S en d er)

{

 

 

 

 

 

R e c t a n g l e ( d c ,

10,

10,

110,

1 1 0 );

 

}

 

 

 

 

 

- Создайте обработчик события O n D e stro y формы:

void __fastcall

T F o rm l: : F o rm D e s tro y (T O b je c t ^ S en d er)

{

 

 

 

 

 

R e le a se D C (H a n d le ,

d c ) ;

/ /

Освобождение

ссылки

D e le te D C ( d c ) ;

/ /

У даление

ссылки,

 

 

/ /

освобож дение памяти

 

}

- Запустите приложение и проверьте правильность его работы. После получения ссылки на контекст устройства в обработ­

чике события O n C re a te формы в обработчике события O n P a in t

обращаемся к функции, строящей прямоугольник. Первым аргу­ ментом этой функции является ссылка на контекст устройства.

После использования ссылки ее необходимо освободить и удалить для освобождения памяти (обработчик события O n D e stro y ) - это необходимо для корректной работы приложе­ ния.

В случае, если необходимо указать параметры пера и кисти, обработчик события может выглядеть, например следующим обра­ зом:

void __fastcall T F o rm l: : F o r m P a in t( T O b je c t * S en d er)

{

HPEN P en; HBRUSH B ru s h ;