книги / C++Builder. ╨г╤З╨╡╨▒╨╜╤Л╨╣ ╨║╤Г╤А╤Б
.pdf10.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 ;