Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009 (960530), страница 82
Текст из файла (страница 82)
к. допускаются только предлагаемые значения.Кроме того, возрастает трудоемкость и увеличивается вероятность ошибки. Используется для таких свойств, как 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 — нет. Используется для таких свойств, как B o r d e r l c o n s и A n c h o r s ;• объекта — свойство является объектом и, в свою очередь, содержитдругие свойства (подсвойства), каждое из которых можно редактировать отдельно. Используется для таких свойств, как F o n t , I t e m s и L i n e s .В области значения свойства-объекта в скобках указывается тип объекта, например, ( T F o n t ) или (TSrings). Д л я свойства-объекта слева отимени может стоять знак «+», в этом случае управление его свойствами выполняется так же, как и для свойства множественного типа, т.
е.через раскрывающийся список. Этот список в левой части содержитимена подсвойств, а в правой — значения, редактируемые обычным/ I. Borland С++ Builder389способом. В области значения может отображаться кнопка с тремя точками. Это означает, что д л я данного свойства имеется специальныйредактор, к о т о р ы й в ы з ы в а е т с я нажатием этой кнопки. Так, д л я свойства F o n t открывается стандартное окно W i n d o w s для установки параметров ш р и ф т а .При выполнении приложения значения свойств компонентов (доступныхв окне Инспектора объектов) можно изменять с помощью инструкций присваивания, например, в обработчике события создания формы.
Так, изменение заголовка кнопки 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.Реакция на приведенные действия присуща каждой форме и не зависит отназначения приложения и его особенностей.
В форме, как правило, размещены компоненты, образующие интерфейс приложения, и задача разработчика — определить для этих компонентов нужную реакцию на те или иные действия пользователя, например, на нажатие кнопки или выбор переключателя.Эта реакция и определяет функциональностьприложения.Допустим, что при создании интерфейса п р и л о ж е н и я в форме была размещена кнопка B u t t o n , п р е д н а з н а ч е н н а я д л я з а к р ы т и я окна. По умолчанию эта кнопка получила и м я и заголовок Button 1, однако заголовок (свойство C a p t i o n ) с п о м о щ ь ю окна И н с п е к т о р а объектов было заменено болеео с м ы с л е н н ы м — О К . П р и в ы п о л н е н и и п р и л о ж е н и я кнопку B u t t o n 1 мож-Часть 3. Современные СУБД и их применение390но нажимать с помощью мыши или клавиатуры. Кнопка отображает нажатие визуально, однако никаких действий, связанных с закрытием формы,не выполняется.
Подобное происходит потому, что для кнопки не определена реакция на какие-либо действия пользователя, в том числе и на еенажатие.Чтобы кнопка могла реагировать на то или иное событие, для него необходимо создать или указать процедуру обработки, которая будет вызыватьсяпри возникновении этого события. Для создания процедуры обработки события, или обработчика, нужно прежде всего выделить в форме кнопку и перейти на страницу Events (События) окна Инспектора объектов, где указываются все возможные для данной кнопки события (рис. 11.8).| Object Inspector|Button113 rf.
FormlProperties Events jI1j!ШВ-lnixlT ButtonActionButtonl Clic ^• j — I jOnClick1OnContextPoDi!OnDragDropjJjAH shownш••OKiJ.Рис. 11.8. Доступ к событиям компонентаТак как при нажатии кнопки возникает событие OnClick, следует создатьобработчик именно этого события. Нужно сделать двойной щелчок в областизначения события O n C l i c k , в результате С++ Builder автоматически создает вмодуле формы заготовку процедуры-обработчика. При этом окно Редакторакода переводится на передний план, а курсор устанавливается в то место процедуры, где программист должен написать код, выполняемый при нажатиикнопки B u t t o n 1.
Поскольку при нажатии кнопки О К должно закрыватьсяокно, то в этом месте можно указать F o r m l - > C l o s e ( ) или просто CloseQ. Файлы в составе модуля формы будут иметь следующий вид:Заголовочный файл://#ifndef U n i t l H#define U n i t l H//#include <Classes.hpp>#include <Controls.hpp>#include <StdCtrls.hpp>/ I. Borland С++ Builder391#include <Forms.hpp>//class TForml : public TForm{published:/ / IDE-managed Components/ / Объявление объекта кнопки типа TButton с именем OKTButton * 0 К ;/ / Заголовок процедуры обработчикаvoid fastcall OKCIick(TObject *Sender);private:/ / User declarationspublic:/ / U s e r declarationsfastcall T F o r m l (TComponent* Owner);};//extern PACKAGETForml *Form1;//#endifФайл реализации://#include <vcl.h>#pragma hdrstop#include"Unit1.h"//#pragma p a c k a g e ( s m a r t i n i t )#pragma resource "*.dfm"T F o r m l *Form1;//fastcall TForm 1::TForm 1 (TComponent* Owner): TForm(Owner){}//void _ f a s t c a l l TForm 1: :OKCIick(TObject *Sender){Forml->Close();}//З д е с ь п о л у ж и р н ы м н а ч е р т а н и е м в ы д е л е н код, н а б р а н н ы й п р о г р а м м и с том; все остальное среда С + + Builder создала автоматически, в том числе ивключение заголовка процедуры-обработчика в описание класса формыForml.В обработчике событий (приведенном в примере и в других обработчиках) параметр Sender указывает на компонент, который получил событие иЧасть 3.
Современные СУБД и их применение392вызвал обработчик. Иногда полезно иметь общий обработчик для разныхобъектов, который ведет себя по-разному в зависимости от класса вызвавшего его объекта. В такой ситуации использование параметра 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 > + < пробел> можно обеспечить принудительный вызов этого списка.
Имявыбранного свойства или метода автоматически добавляется справа от знака >. Если метод содержит параметры, то отображается подсказка, содержащаясостав и типы параметров.Перечень стандартных конструкций языка вызывается нажатием комбинации клавиш < C t r l > + < J > . После выбора требуемой конструкции автоматически добавляется ее код. Например, при выборе оператора for в коде появится следующий текст:for (;;)Имя обработчика T F o r m l : : O K C I i c k образуется прибавлением к имени компонента имени события без префикса On. Это имя является значением события, для которого создан обработчик, в нашем случае — для события O n C l i c k/ I. Borland С++Builder393ШШi=i+UniH.cpp j'3E d i t l - >}/ /JJ21: 8piopertypropertyproperlyproperlyproperly[Modifiedbool TEdilAuloSelectbool TEdit::AutoSizeTBevelEdges TEdil::BevelEdgesTBevelCul T E d i t : : B e v e l l n n e rTBevelKind T E d i t : : B e v e l K i n d[insert[\Unit1 .cpp^Unitl.h /Diagram/Рис.
11.9. Список свойств и методов объекта E d i t lнажатия кнопки с именем ОК. При изменении через окно Инспектора объектов имени кнопки происходит автоматически переименование этой процедуры во всех файлах (.dfm и .срр) проекта.Аналогично создаются обработчики для других событий и других компонентов. Более подробно события рассматриваются при изучении соответствующих компонентов.Для удаления процедуры-обработчика достаточно удалить код, который программист внес в нее самостоятельно. После этого при сохранении или компиляции модуля обработчик будет удален автоматически из всех файлов проекта.При удалении какого-либо компонента все его непустые обработчики остаются в модуле формы.Вместо создания нового обработчика для события можно выбрать существующий обработчик, если такой имеется. Для этого нужно в окне Инспектораобъектов щелчком на стрелке в области значения свойства раскрыть списокпроцедур, которые можно использовать для обработки этого события.