Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009
.pdf/ I. Borland С++ Builder |
383 |
фейс конструируется путем размещения в форме компонентов, называемых интерфейсными компонентами или элемегипами управления. Создается пользовательский интерфейс приложения с помощью окна Ф о р м ы , которое в среде разработки представляет собой модель формы времени выполнения.
Ф у н к ц и о н а л ь н о с ть приложения определяется процедурами, которые ВЫ-
ПОЛНЯЮТСЯ при возникновении определенных событий, например, происходящих при действиях пользователя с элементами управления формы.
Таким образом, в процессе разработки приложения в форму помещаются компоненты, для них устанавливаются необходимые свойства и создаются обработчики событий.
Пример простейшего приложения
Создадим для примера простейшее приложение. Слово «создадим» в данном случае является не совсем точным, т. к. создавать и тем более программировать не придется вообще ничего: С++ Builder изначально предоставляет готовое приложение, состоящее из одной формы.
Сразу же после создания нового приложения С++ Builder предлагает разработчику «пустую» форму. Данная форма не является пустой в буквальном смысле слова — она содержит основные элементы окна Windows: заголовок Forml, кнопки сворачивания, разворачивания и закрытия окна, изменения размеров окна и кнопку вызова системного меню окна. Именно эта форма отображается при первом запуске С++ Builder в окне формы.
Любое приложение Windows выполняется в соответствующем окне. Даже если оно ничего не делает в смысле функциональности, т. е. является пустым, то все равно должно иметь свое окно. С++ Builder — это среда разработки приложений под Windows, поэтому для любого разрабатываемого приложения автоматически предлагается окно (форма), для которой уже созданы два файла — с описанием и модулем.
Итак, простейшее приложение создается автоматически каждый раз в начале работы над новым проектом и является отправной точкой для дальнейших действий. Это приложение имеет минимум того, что нужно любому приложению, выполняемому в среде Windows, и ни одним элементом больше.
Простейшее приложение представляет из себя заготовку или каркас, обеспечивающий разработчика всем необходимым для каждого приложения вообще. Так, не нужно писать свой обработчик событий клавиатуры или драйвер мыши, а также создавать пакет процедур для работы с окнами. Более того, нет необходимости интегрировать драйвер мыши с пакетом для работы с окнами. Это все уже выполнено создателями С++ Builder, и каркас приложения представляет собой полностью завершенное и функционирующее приложение, которое никаких действий не производит.
Отметим, что окно (а вместе с ним и приложение) действительно ничего не делает с точки зрения пользователя — оно не предоставляет функциональ-
384 Часть 3. Современные СУБД и их применение
ности, специфичной для каждого приложения. Вместе с тем это пустое окно выполняет достаточно большую работу с точки зрения программиста. Например, оно ожидает действий пользователя, связанных с мышью и клавиатурой, и реагирует на изменение своего размера, перемещение, закрытие и некоторые другие команды.
В полной мере оценить эти возможности окна может только программист, который писал приложения под Windows традиционным способом, т. е. вручную и без IDE. Изнутри Windows представляет собой систему с индексами, контекстами, обратными вызовами и множеством других сложнейших элементов, которые надо знать, которыми нужно управлять и в которых легко запутаться. Однако поскольку эти элементы имеются в каждом функционирующем приложении Windows, достаточно написать их один раз и в дальнейшем уже пользоваться готовыми блоками. Именно это и осуществляет система С++ Builder, избавляя тем самым программиста от сложной рутинной работы.
При компиляции проекта молено использовать специальные пакеты динамически загружаемых библиотек (DLL), что позволяет в значительной степени уменьшить размер приложения. Однако при этом приложение уже не является автономным и в процессе своей работы обращается к пакетам, которые были задействованы при компиляции проекта.
При конструировании приложения разработчик добавляет к простейшему приложению новые формы, управляющие элементы, а также новые обра-
ботчики событий. |
|
Создание пользовательского |
интерфейса |
Пользовательский интерфейс приложения составляют компоненты, которые разработчик выбирает в Палитре компонентов и размещает в форме. При конструировании интерфейса приложения действует принцип WYSIWYG (What You See Is What You Get — «что видите, то и получаете»), и разработчик при создании приложения видит форму почти такой же, как и при его выполнении.
Компоненты являются структурными единицами и делятся на визуальные (видимые) и невизуальные (системные). При этом понятия «видимый» и «невидимый» относятся только к этапу выполнения, на этапе проектирования видны все компоненты приложения.
Квизуальным компонентам относятся, например, кнопки, списки или переключатели, а также собственно форма. Так как с помощью визуальных компонентов пользователь управляет приложением, их также называют управляющими компонентами или элементами управления. Именно визуальные компоненты образуют пользовательский интерфейс приложения.
Кневизуальным компонентам относятся компоненты, выполняющие вспомогательные, но не менее важные действия, например, таймер Timer (позволяет отсчитывать интервалы времени).
11. Borland С++ Builder |
387 |
Враскрывающемся списке, расположенном в верхней части окна Инспектора объектов, отображаются имя компонента и его тип. Выбрать тот или иной компонент и, соответственно, получить доступ к его свойствам можно в этом списке Инспектора объектов. Такой способ выбора удобен в случаях, когда компонент полностью закрыт другими объектами.
Внижней части окна Инспектора объектов слева приводятся имена всех свойств компонента, которые доступны на этапе разработки приложения. Справа для каждого свойства стоит его значение. Отметим, что кроме этих свойств компонент может иметь и свойства, которые доступны только во время выполнения приложения.
Свойства представляют собой атрибуты, определяющие способ отображения и функционирования компонентов при выполнении приложения. Первоначально значения свойств задаются по умолчанию. После помещения компонента в форму его свойства можно изменять в процессе проектирования или в ходе выполнения приложения.
Управление свойствами в процессе проектирования заключается в изменении значений свойств компонентов непосредственно в окне формы («рисование») или с помощью Инспектора объектов.
Разработчик может изменить значение свойства компонента, введя или выбрав нужное значение. При этом одновременно изменяется соответствующий компонент, т. е. уже при проектировании видны результаты сделанных изменений. Например, при изменении заголовка кнопки (свойство оно сразу же отображается на ее поверхности.
Для подтверждения нового значения свойства достаточно нажать клавишу <Enter> или перейти к другому свойству или компоненту. Отмена изменений производится клавишей <Esc>. Если введено недопустимое для свойства значение, то выдается предупреждающее сообщение, а изменение значения отвергается. Изменения свойств автоматически учитываются в файле описания формы, используемом компилятором при создании формы, а при изменении свойства N a m e изменения вносятся и в описание класса формы.
Для большинства свойств компонентов (например, для свойств C o l o r (цвет), C a p t i o n ( з а г о л о в о к ) и Visible ( в и д и м о с т ь ) ) имеются значения по умолчанию.
Для обращения к компоненту в приложении предназначено свойство N a m e , первоначальное значение которого образуется автоматически следующим образом: к имени компонента добавляется его номер в порядке помещения в форму. Например, первая кнопка B u t t o n получает имя B u t t o n 1, вторая — B u t t o n 2 и т. д. Первоначально от значения свойства N a m e получает свое
значение и свойство Caption.
Обычно разработчик предпочитает дать компонентам более информативные имена, чем имена по умолчанию. При этом целесообразно включать в имя данные о типе компонента и его назначении в приложении. Так, кнопке типа T B u t t o n , предназначенной для закрытия окна, можно присвоить имя b t n C l o s e
3 8 8 Часть 3. Современные СУБД и их применение
или B u t t o n C l o s e . Каждый разработчик самостоятельно устанавливает удобные правила именования компонентов. Для простоты мы будем часто использовать имена, назначаемые по умолчанию, например, F o r m l , B u t t o n 1 или
Edit 1.
Значения свойств, связанных с размерами и положением компонента (например, L e f t и Т о р ) , автоматически изменяются при перемещении компонента мышью и настройке его размеров.
Если в форме выделено несколько компонентов, то в окне Инспектора объектов доступны свойства, общие для всех этих компонентов. При этом сделанные в окне Инспектора объектов изменения действуют на все выделенные компоненты.
Для установки значений свойств в Инспекторе объектов используются подключающиеся автоматически редакторы свойств:
•простой (текстовый) — значение свойства вводится или редактируется как обычная строка символов, которая интерпретируется как числовой или строковый тип С++ Builder; используется для таких свойств, как Caption, Left, Height и Hint;
•перечисляемый — значение свойства выбирается в раскрывающемся списке. Список раскрывается щелчком на стрелке, которая появляется при установке указателя мыши в области значения свойства. Можно не выбирать нужное значение, а ввести его с клавиатуры, однако на практике это обычно не делается, т. к. допускаются только предлагаемые значения.
Кроме того, возрастает трудоемкость и увеличивается вероятность ошибки. Используется для таких свойств, как F o r m S t y l e , V i s i b l e и M o d a l R e s u l t ;
• множественный — значение свойства представляет собой комбинацию значений из предлагаемого множества. В окне Инспектора объектов слева от имени свойства множественного типа стоит знак «+». Формирование значения свойства выполняется с помощью дополнительного списка, раскрываемого двойным щелчком на имени свойства. Этот список содержит перечень всех допустимых значений свойства, справа от каждого значения можно указать true или false. Выбор true означает, что данное значение включается в комбинацию значений, a false — нет. Используется для таких свойств, как и
• объекта — свойство является объектом и, в свою очередь, содержит другие свойства (подсвойства), каждое из которых можно редактировать отдельно. Используется для таких свойств, как F o n t , I t e m s и L i n e s . В области значения свойства-объекта в скобках указывается тип объекта, например, (TFont) или (TSrings). Для свойства-объекта слева от имени может стоять знак «+», в этом случае управление его свойствами выполняется так же, как и для свойства множественного типа, т. е. через раскрывающийся список. Этот список в левой части содержит имена подсвойств, а в правой — значения, редактируемые обычным
/ I. Borland С++ Builder |
3 89 |
способом. В области значения может отображаться кнопка с тремя точками. Это означает, что для данного свойства имеется специальный редактор, который вызывается нажатием этой кнопки. Так, для свойства F o n t открывается стандартное окно Windows для установки параметров шрифта.
При выполнении приложения значения свойств компонентов (доступных в окне Инспектора объектов) можно изменять с помощью инструкций присваивания, например, в обработчике события создания формы. Так, изменение заголовка кнопки B u t t o n 1 можно выполнить следующим образом:
Button 1->Caption = "OK";
Такой способ требует, однако, большего объема работ, чем в случае использования Инспектора объектов, кроме того, подобные установки вступают в силу только во время выполнения приложения и на этапе разработки не видны, что в ряде случаев затрудняет управление визуальными компонентами. Тем не менее, для наглядности во многих примерах значения отдельных свойств мы будем устанавливать с помощью операторов присваивания, а не через Инспектор объектов.
Отметим, что есть свойства времени выполнения, недоступные через Инспектор объектов, с которыми можно работать только во время выполнения приложения . К таким свойствам относятся, например, число записей R e c o r d C o u n t набора данных или поверхность рисования C a n v a s визуального компонента.
Определение функциональности приложения
На любой стадии разработки интерфейсной части приложение можно запустить на выполнение. После компиляции на экране появляется форма приложения, которая выглядит примерно так же, как она была сконструирована на этапе разработки. Форму можно перемещать но экрану, изменять ее размеры, сворачивать и разворачивать, а также закрывать нажатием соответствующей кнопки в заголовке или другим способом. То есть форма ведет себя, как обычное окно Windows.
Реакция на приведенные действия присуща каждой форме и не зависит от назначения приложения и его особенностей. В форме, как правило, размещены компоненты, образующие интерфейс приложения, и задача разработчика — определить для этих компонентов нужную реакцию на те или иные действия пользователя, например, на нажатие кнопки или выбор переключателя. Эта реакция и определяет функциональность приложения.
Допустим, что при создании интерфейса приложения в форме была размещена кнопка Button, предназначенная для закрытия окна. По умолчанию эта кнопка получила имя и заголовок Button 1, однако заголовок (свойство C a p t i o n ) с помощью окна Инспектора объектов было заменено более осмысленным — ОК. При выполнении приложения кнопку 1 мож-
/ I. Borland С++ Builder |
391 |
#include <Forms.hpp>
//
class TForml |
: public TForm |
{ |
|
published: |
/ / IDE-managed Components |
// Объявление объекта кнопки типа TButton с именем OK
TButton *0К;
// Заголовок процедуры обработчика
void |
fastcall OKCIick(TObject *Sender); |
private: |
/ / User declarations |
public: |
/ / U s e r declarations |
fastcall TForml (TComponent* Owner);
};
//
extern PACKAGETForml *Form1;
//
#endif
Файл реализации:
//
#include <vcl.h> #pragma hdrstop
#include"Unit1.h"
//
#pragma package(smartinit) #pragma resource "*.dfm"
TForml *Form1;
//
fastcall TForm 1::TForm 1 (TComponent* Owner)
: TForm(Owner)
{
}
//
void _fastcall TForm 1: :OKCIick(TObject *Sender)
{
F o r m l - > C l o s e ( ) ;
}
//
З д е с ь п о л у ж и р н ы м н а ч е р т а н и е м в ы д е л е н код, н а б р а н н ы й п р о г р а м м и с - том; все о с т а л ь н о е среда С + + Builder создала а в т о м а т и ч е с к и , в т о м ч и с л е и в к л ю ч е н и е з а г о л о в к а п р о ц е д у р ы - о б р а б о т ч и к а в о п и с а н и е к л а с с а ф о р м ы F o r m l .
В обработчике с о б ы т и й ( п р и в е д е н н о м в п р и м е р е и в других обработчи - к а х ) параметр Sender у к а з ы в а е т на компонент, к о т о р ы й п о л у ч и л событие и
392 Часть 3. Современные СУБД и их применение
вызвал обработчик. Иногда полезно иметь общий обработчик для разных объектов, который ведет себя по-разному в зависимости от класса вызвавшего его объекта. В такой ситуации использование параметра S e n d e r может быть очень полезным. Заметим, что в заголовках функции он объявлен как указа-
тель на объект типа T O b j e c t в виде T O b j e c t * S e n d e r .
Класс T O b j e c t является базовым классом для всех классов в С++ Builder, но в нем нет свойств, пригодных к использованию в обработчиках событий. В этой связи при необходимости обращения к некоторым свойствам объектов нужно выполнять приведение типа параметра S e n d e r к классу, в котором нужные свойства объявлены.
К примеру, пусть в обработчике требуется задать клманду, помещающую в
однострочный редактор E d i t текст В ы п о л н е н щ е л ч о к н а к о м п о н е н т е |
< и м я |
к о м п о н е н т а х Имя компонента определяется значением его свойства |
N a m e . |
Поскольку в классе T O b j e c t это свойство отсутствует, тип параметра нужно приводить к классу T C o m p o n e n t , в котором это свойство появляется впервые, или к любому его наследнику, например T C o n t r o l . В результате решающий поставленную задачу оператор можно записать в виде:
Editl ->Text = "Выполнен щелчок на компоненте "+((TComponent *)Sender)->Name;
или
Editl ->Text = "Выполнен щелчок на компоненте "+((TControl *)Sender)->Name;
Здесь выражения ( ( T C o m p o n e n t |
* ) S e n d e r ) и ( ( T C o n t r o l * ) S e n d e r ) задают |
приведение типа параметра S e n d e r |
к типу указателя на объект соответству- |
ющего класса. |
|
Среда С++ Builder обеспечивает автоматизацию набора кода при вызове свойств и методов объектов и записи стандартных конструкций языка С++. Так, после указания имени объекта и разделяющего знака -> автоматически появляется список (рис. 11.9), содержащий доступные свойства и методы этого объекта. При необходимости с помощью комбинации клавиш < Ctrl>+< пробел> можно обеспечить принудительный вызов этого списка. Имя выбранного свойства или метода автоматически добавляется справа от знака - >. Если метод содержит параметры, то отображается подсказка, содержащая состав и типы параметров.
Перечень стандартных конструкций языка вызывается нажатием комбинации клавиш <Ctrl>+<J>. После выбора требуемой конструкции автоматически добавляется ее код. Например, при выборе оператора for в коде появится следующий текст:
for (;;)
Имя обработчика T F o r m l : : O K C I i c k образуется прибавлением к имени компонента имени события без префикса On. Это имя является значением события, для которого создан обработчик, в нашем случае — для события O n C l i c k
