Разделы

В сети

Пользователей: 130
Из них просматривают:
Аналоги: 52. Видео: 1. Даташиты: 16. Инструкции: 9. Магазин: 1. Новости: 21. Остальное: 7. Ошибки: 1. Программы: 2. Производители: 4. Профиль пользователя: 1. Расчёты: 1. Торрент: 1. Форум: 9. Чат: 4.
Участников: 6
Гостей: 124

an , KT315 , alex01981 , Google , wolf170571 , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

Программирование

Borland C++ Builder 6 для начинающих (Статья одиннадцатая)

Написал MACTEP в 18.10.2010 0:20:00 (31126 прочтений)

В этой статье рассказывается о событиях визуальных компонентах

Статья  1  2  3  4  5  6  7  8  9  10  11  12



 



СОБЫТИЯ КОМПОНЕНТОВ
Мы неоднократно рассматривали применение различных событий компонентов в предыдущих примерах программ. Настало время рассмотреть их отдельно. В табл. 1 приведены основные события компонентов и дано описание моментов, когда они происходят.

 

Таблица1
Событие
Когда происходит событие
OnActivateПри активизации объекта
OnCanResizeПри изменении размеров
OnContextPopupПри вызове контекстного меню
OnClickПо щелчку мыши на компоненте и при другой активизации компонента
OnCloseПри закрытии
OnDblClickПо двойному щелчку мыши на компоненте
OnChanqeПосле изменения графического объекта
OnDragDropВ момент отпускания перетаскиваемого компонента над данным компонентом
OnDragOveКогда пользователь перемещает перетаскиваемый объект над компонентом
OnEndDraqВ момент прерывания или окончания перетаскивания компонента
OnEnterВ момент получения элементом Фокуса
OnExitВ момент потери элементом фокуса
OnKeyDownПри нажатии пользователем любой клавиши
OnKeyPressПри нажатии пользователем клавиши символа
OnKeyUpПри отпускании пользователем любой клавиши
OnMouseUpВ момент нажатия пользователем клавиши мыши над компонентом
OnMouseMoveПри перемещении курсора мыши над компонентом
OnPaintПри получении сообщения Windows о необходимости перерисовать изображение
OnProgressВо время медленных процессов изменения графического изображения
OnStartDraqКогда пользователь начал перетаскивание объекта
OnEnterПри вводе
OnExitПри выходе



Самым часто используемым и уже знакомым нам событием является OnClick. Обычно событие OnClick наступает, если пользователь нажал и отпустил левую кнопку мыши в тот момент, когда указатель мыши находился на компоненте. Кроме того, это событие происходит в следующих случаях:
• пользователь нажал клавишу пробела, когда кнопка или индикатор были в фокусе;
• пользователь нажал клавишу Enter, а активная форма имеет кнопку по умолчанию, указанную свойством Default;
• пользователь нажал клавишу Esc, а активная форма имеет кнопку прерывания, указанную свойством Cancel;
• пользователь нажал клавиши быстрого доступа к кнопке или индикатору;
• пользователь выбрал элемент в сетке, дереве, списке или выпадающем списке, нажав клавишу со стрелкой;
• приложение установило в True свойство Checked кнопки RadioButton;
• приложение изменило свойство Checked индикатора CheckBox;
• вызван метод Click элемента меню.
Как видим, данное событие может происходить в большинстве случаев, недаром оно является одним из самых распространенных.
Для компонента формы событие OnClick наступает, если пользователь щелкнул на пустом месте формы или на недоступном компоненте.
Создайте новое приложение и поместите на форму одну кнопку Button1. Откройте для нее в инспекторе объектов закладку событий Events и щелкните дважды левой кнопкой мыши на поле правее события OnClick. Откроется инспектор кодов и появится заготовка программного кода для функции обработки события OnClick, создаваемая автоматически средой разработки Borland C++ Builder 6. Она имеет вид:
void __fastcall TForm1:: Button1Click(T0bject *Sender)
{
}

Параметр Sender данного события содержит объект, в котором произошло событие, и может быть использован для извлечения информации о том, какой компонент сформировал событие OnClick.
Впишите между фигурными скобками функции обработки события OnClick для кнопки Button1 следующую программную строку:

ShowMessage("Событие OnClick произошло в "+((TControl *)Sender)->Name);


Аналогичные действия выполните для формы Form1, после чего запустите приложение. В результате при возникновении события OnClick на кнопке или форме будет формироваться окно сообщения с информацией о компоненте, в котором произошло данное событие. Проверьте реакцию программы на щелчок левой кнопкой мыши по кнопке, нажатие клавиш пробел и Enter и другие действия пользователя программы.
Другое событие — OnDblClick наступает, если пользователь осуществил двойной щелчок, т. е. дважды нажал и отпустил основную кнопку мыши с коротким интервалом, когда указатель мыши находился на компоненте. К одному и тому же компоненту нельзя написать обработчики событий OnClick и OnDblClick, поскольку первый из обработчиков всегда перехватит щелчок мыши. Параметр Sender для события OnDblClick может быть использован аналогично примеру, описанному выше.
Довольно часто в программах необходимо определять, какую клавишу на клавиатуре нажал пользователь, для того, чтобы назначить выполнение определенных действий в соответствии с нажатой клавишей. Для этих целей хорошо подходят следующие события, описываемые ниже.
Событие OnKeyDown наступает, если компонент находится в фокусе при нажатии пользователем любой клавиши, включая функциональные и специальные, такие как Shift, Alt и Ctrl. В обработчик события передаются кроме обычного параметра Sender, указывающего на компонент, в котором произошло событие, такие параметры, как Key и Shift. Параметр Key позволяет определить код нажатой клавиши клавиатуры. Для большинства клавиш имеются символьные имена API Windows. Коды клавиш и соответствующих им символьных имен приведены в табл. 2.

 

Табл.2.1              На основном поле клавиатуры

КлавишаДесят. кодHEX кодСимвольное имя
F11120x70VK_F1
F21130x71VK_F2
F31140x72VK_F3
F41150x73VK_F4
F51160x74VK_F5
F61170x75VK_F6
F71180x76VK_F7
F81190x77VK_F8
F91200x78VK_F9
F101210x79VK_F10
пробел320x20VK_SPACE
Backspace80x8VK_BACK
Tab90x9VK_TAB
Enter130x0DVK_RETURN
Shift160x10VK_SHIFT
Ctrl170x11VK_CONTROL
Alt180x12VK_MENU
CapsLock200x14VK_CAPITAL
Esc270x1BVK_E5CAPE
Insert450x2DVK_INSERT
PageUp330x21VK_PRIOR
PageDown340x22VK_NEXT
End350x23VK_END
Home360x24VK_HOME
Стрелка ←370x25VK_LEFT
Стрелка ↑380x26VK_UP
Стрелка →390x27VK_RIGHT
Стрелка ↓400x28VK_DOWN
Delete460x2EVK_DELETE
PrintScreen440x2CVK_SNAPSHOT
ScrollLock1450x91VK_SCROLL
0 )480x30     ---        
1 !490x31     ---    
2 @500x32     ---       
3 #510x33     ---       
4 $520x34     ---    
5 %530x35     ---    
6 ^540x36     ---    
7 &550x37     ---    
8 *560x38     ---    
9 (570x39     ---    
` ~1920xС0     ---    
- _1890xBD     ---    
= +1870xBB     ---    
[ {2190xDB     ---    
] }2210xDD     ---    
; :1860xBA     ---    
' "2220xDE     ---    
\ |2200xDC     ---    
, <1880xBC     ---    
. >1900xBE     ---    
/ ?1910xBF     ---    
a A650x41     ---    
b B660x42     ---    
с С670x43     ---    
d D680x44     ---    
e E690x45     ---    
f F700x46     ---    
g G710x47     ---    
h H720x48     ---    
i I730x49     ---    
j J740x4A     ---    
k K750x4B     ---    
l L760x4C     ---    
m M770x4D     ---    
n N780x4E     ---    
o O790x4F     ---    
p P800x50     ---    
q Q810x51     ---    
r R820x52     ---    
s S830x53     ---    
t T840x54     ---    
u U850x55     ---    
v V860x56     ---    
w W870x57     ---    
x X880x58     ---    
y Y890x59     ---    
z Z900x5A     ---    
Win (Л)910x5BVK_LWIN
Win (Пр)920x5CVK_RWIN

 

Табл.2.2      На дополнительном поле клавиатуры
при выключенном индикаторе NumLock

КлавишаДесят. кодHEX кодСимвольное имя
0960x60VK_NUMPAD0
1970x61VK_NUMPAD1
2980x62VK_NUMPAD2
3990x63VK_NUMPAD3
41000x64VK_NUMPAD4
51010x65VK_NUMPAD5
61020x66VK_NUMPAD6
71030x67VK_NUMPAD7
81040x68VK_NUMPAD8
91050x69VK_NUMPAD9
*1060x6AVK_MULTYPLY
+1070x6BVK_ADD
-1080x6CVK_SUBTRACT
.1090x6DVK_DECIMAL
/1100x6EVK_DIVIDE
n N780x4E ---
o O790x4F ---

 

Параметр Shift является множеством, которое может быть пустым или включать символьные значения, описываемые в табл. 3.

Таблица 3
Символьное значение
Назначение
ssShiftНажата или отпущена клавиша Shift
ssAltНажата или отпущена клавиша Alt
ssCtrlНажата или отпущена клавиша Ctrl

Другое событие — OnKeyPress наступает, если компонент находится в фокусе при нажатии пользователем клавиши символа. Параметр Key в обработчике этого события имеет тип char и соответствует символу нажатой клавиши. Функциональные клавиши и специальные клавиши типа Shift, Alt и Ctrl не вызывают этого события. Нажатие таких комбинаций клавиш как, например, Shift+A, генерирует только одно событие OnKeyPress, при котором параметр Key равен "А". Поскольку параметр Key передается в обработчик события как переменная, его можно изменять, передавая для дальнейшей обработки другой символ. В некоторых программах этот прием полезно использовать.
Для того, чтобы распознавать комбинации клавиш или клавиши, не соответствующие символам, необходимо использовать обработчики событий OnKeyDown и OnKeyUp.
Следует отметить, что событие OnKeyPress заведомо наступает, если нажимается только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогательных клавиш, то событие OnKeyPress может не наступить (произойдут только события OnKeyDown при нажатии и OnKeyUp при отпускании) или если и наступит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает, а при нажатой Ctrl событие OnKeyPress при нажатии символьной клавиши наступает, но символ не распознается.
Событие OnKeyUp наступает, если компонент находится в фокусе при отпускании пользователем любой ранее нажатой клавиши, включая функциональные и вспомогательные, такие как Shift, Alt и Ctrl. В обработчик кроме параметра Sender, указывающего на компонент, в котором произошло событие, передаются также параметры Key и Shift, описанные выше.
Событие OnKeyUp наиболее удобно для распознавания нажатых клавиш и комбинации клавиш. Необходимо обратить внимание на то, что параметр Key для обработчика данного события имеет тип word в отличие от типа char для события OnKeyPress. Поэтому допускается параметр Key сравнивать с целым числом, соответствующим коду символа или применять к параметру Key функцию char, переводящую его в символ для сравнения с символами. К тому же надо учитывать, что виртуальный символьный код одинаков для символов в верхнем и нижнем регистре и для различной раскладки клавиатуры (русской или английской).
Рассмотрим способ определения кода нажатой клавиши на примере небольшой программы. Создайте в среде разработки Borland C++ Builder 6 новое приложение и поместите на форму один компонент Label1. В инспекторе кодов для формы Form1 на закладке событий щелкните дважды по полю правее OnClick и введите в заготовку обработчика события программный код:

Label1->Caption = "Было событие OnClick";


Этот код программы позволит изменять свойство Caption компонента на сообщение о возникновении события OnClick на форме приложения.
Аналогично введите для формы Form1 код обработки события KeyDown:


if(Shift.Contains(ssAlt)) Label1->Caption = "Alt";
if(Shift.Contains(ssCtrl)) Label1->Caption = "Ctrl";
if(Shift.Contains(ssShift)) Label1->Caption = "Shift";
switch (Key)
{
case VK_INSERT: Label1->Caption = "Insert"; break;
case VK_CAPITAL: Label1->Caption = "CapsLock"; break; case VK_NUMLOCK: Label1->Caption = "NumLock"; break;
}


и код обработки события KeyPress:

switch  (Key)
{
case ' ': Label1->Caption = "Был нажат пробел";
break;
default : Label1->Caption = Key;
break;
}


Теперь запустите приложение на выполнение и нажимайте любые клавиши на клавиатуре, а также пощелкайте левой кнопкой мышки по форме приложения. В результате вы увидите реакцию программы на ваши действия.
Событие OnExit наступает в момент потери элементом фокуса при его переключении на другой элемент. Это событие не наступает при переключениях между формами или между приложениями. Значение свойства ActiveControl изменяется прежде, чем происходит событие OnExit. При переключениях между элементами, расположенными в разных контейнерах, например, на разных панелях, событие OnExit сначала наступает для элемента, а потом для содержащего его контейнера. Это противоположно последовательности событий OnEnter, которые при переключении из другого контейнера на компонент данного контейнера наступают сначала для контейнера, а потом для компонента.
Создайте новое приложение и поместите на него три компонента Edit из закладки Standard. Создайте обработчик события OnEnter для компонента Edit2 и вставьте в него программный код:

ShowMessage("Фокус  на  элементе");

Теперь создайте обработчик события OnExit для этого же компонента и вставьте в него программный код:

ShowMessage("Фокус переключен");

Запустите приложение и нажимайте клавишу табуляции. Фокус будет переключаться между компонентами Edit, и при переходе через Edit2 на экране будет формироваться сообщение о состоянии фокуса.
Далее рассмотрим события, связанные с работой мыши.
Событие OnMouseDown наступает в момент нажатия пользователем клавиши мыши над компонентом. Имеется также парное к нему событие OnMouseUp, наступающее при отпускании нажатой кнопки мыши над объектом.
Обработка событий OnMouseDown и OnMouseUp используется для операций, требуемых при нажатии и отпускании пользователем какой-либо кнопки мыши. Обработчики этих событий имеют параметры Sender, Shift, Button, X и Y. С первыми двумя параметрами мы уже знакомы из описания предыдущих событий. Значения параметра Button определяют, какая кнопка мыши нажата: mbLeft — левая, mbRight — правая, mbMiddle — средняя. Параметры X и Y определяют координаты указателя мыши в клиентской области компонента.
Создайте новое приложение и поместите на его форму два компонента Label. Для формы Forml создайте обработчик события OnMouseDown и введите в него следующие строки программного кода:

if(Button == mbLeft) Label1->Caption = "Нажата левая кнопка мыши";
if(Button == mbRight) Label1->Caption = "Нажата правая кнопка мыши";
if(Button == mbMiddle) Label1->Caption = "Нажата средняя кнопка мыши";
Label2->Caption = "Координаты мыши: X="+string(X)+" Y="+String(Y);


Запустите приложение и пощелкайте разными кнопками мыши на его форме. Вы увидите сообщения программы о ваших действиях и координаты курсора мыши.
Событие OnMouseMove наступает при перемещении курсора мыши над компонентом.
Обработчик события OnMouseMove вставляется в программу, если необходимо произвести какие-то операции при перемещении курсора мыши над компонентом. Параметр Shift, являющийся множеством, содержит элементы, позволяющие определить, какие кнопки мыши и вспомогательные клавиши (Shift, Ctrl или Alt) нажаты в этот момент. Параметры X и Y определяют координаты указателя мыши в клиентской области компонента.
Добавьте в предыдущую программу обработчик события OnMouseMove для формы Forml и вставьте в него следующую строку программного кода:

Label2->Caption = "Координаты мыши: X="+String(X)+" Y="+Strlng(Y);

Вновь запустите приложение и проверьте, как ведет себя программа, когда вы перемещаете курсор мыши над формой и другими компонентами.
Следующие описываемые события относятся к графическим компонентам и перемещению объектов.
Событие OnChange связано с графическим компонентом канвы (рамки) и наступает после изменения графического объекта. Обработчик события OnChange должен осуществить необходимые операции при изменении графического объекта и отразить его новые установки. Событие происходит сразу после изменения изображения на канве. При вызове любого метода рисования осуществляется следующая последовательность операций:
• происходит событие OnChanging;
• вызванный метод канвы TCanvas осуществляет изменения в изображении;
• наступает событие OnChange.
Событие канвы OnChange наступает при изменении именно самого изображения, а не свойств канвы. Такие свойства канвы, как объекты Font (шрифт). Brush (кисть) и Реп (перо), имеют свои собственные события OnChange.
Событие OnPaint наступает, когда приходит сообщение Windows о необходимости перерисовать испорченное изображение. Изображение может испортиться из-за временного перекрытия данного окна другим окном того же или постороннего приложения. Обработчик данного события должен перерисовать изображение. При перерисовке изображения канвы Canvas можно использовать свойство ClipRect, которое указывает область канвы, внутри которой изображение испорчено.
События OnProgress наступают во время медленных процессов изменения графического изображения, таких как загрузка, сохранение, трансформация. Заготовка его обработчика приведена ниже:

void __fastcall TForml::
Image1Progress(T0bject *Sender,   TProgressStage Stage,   BYTE PercentDone, bool RedrawNow,   const TRect &R,   const AnsiString Msg)
{
}


Эти события позволяют построить в приложении индикатор хода процесса, обеспечивающий обратную связь с пользователем. Разработчики новых компонентов могут генерировать события OnProgress, вызывая защищенный метод Progress. Параметр Stage указывает стадию процесса — начало, продолжение, окончание. Он может принимать значения psStarting, psRunning и psEnding соответственно. Если приложение предусматривает индикацию процесса, можно создавать индикатор при Stage = psStarting, изменять его показания, пока Stage = = psRunning, и закрывать при Stage = = psEnding. Параметр PercentDone показывает, какая примерно часть процесса выполнена. Этот параметр может использоваться в индикаторе процесса. Параметр RedrawNow указывает на то, возможно ли в данный момент успешно отобразить изображение на экране. Параметр R указывает область изображения, которая изменена и нуждается в перерисовке. Параметр Msg содержит краткую справку о протекающем процессе, например, Loading (загрузка), Storing (запоминание) или Reducing colours (уменьшение цветов). Строка Msg может быть и пустой.
Событие OnDragDrop наступает в момент отпускания над компонентом другого перетаскиваемого компонента. В обработчике данного события необходимо описать, что в этот момент должно произойти. Параметр Source соответствует перетаскиваемому объекту, а параметр Sender — объекту, над которым другой объект был отпущен. Параметры X и Y содержат координаты позиции курсора мыши над компонентом в системе координат клиентской области этого компонента.
Событие OnDragOver происходит в момент, когда перетаскиваемый объект пересек границу данного компонента и оказался внутри его контура. Заканчивается событие, когда объект покидает компонент, пересекая его границу. Обработчик события OnDragOver используется для того, чтобы дать сигнал о готовности компонента принять перетаскиваемый объект в том случае, если пользователь отпустит его над данным компонентом. Если компонент готов принять объект, то в обработчике надо задать значение параметра Accept, равное True. Впрочем, это значение по умолчанию равно True, так что его можно не задавать. Обработчик может быть и пустым, что будет означать готовность компонента принять любой объект, но даже пустой обработчик нужен, поскольку иначе сообщения о приеме компонента приложение не получит.
Во время перетаскивания над компонентом объекта, который может быть принят, форма курсора мыши может изменяться, сигнализируя пользователю о готовности компонента принять объект. Для обеспечения этого необходимо во время проектирования задать соответствующее значение свойства компонента DragCursor. Параметр Source обработчика события определяет перетаскиваемый объект, а параметр Sender — сам компонент. Параметры X и Y дают координаты точки экрана в пикселях. Параметр State типа TDragState onределяет состояние перетаскиваемого объекта по отношению к другим объектам. Значения этого параметра приведены в табл. 4.

Таблица 4
ЗначениеОписание
dsDragEnterКурсор мыши входит в пределы компонента
dsDragMoveКурсор мыши перемещается в пределах компонента
dsDragLeaveКурсор мыши выходит за пределы компонента


Событие OnStartDrag наступаем когда пользователь нажал левую кнопку мыши над объектом и, не отпуская ее> начал смещать курсор мыши, т. е. начал перетаскивание. Обработчик события OnStartDrag позволяет описать какие-либо специальные действия, необходимые перед началом перетаскивания. Параметр Sender является тем компонентом, который должен перетаскиваться или который содержит объект будущего перетаскивания. Переменная DragObject по умолчанию является пустой, т. е. имеет значение NULL. Это означает, что переноситься будет сам компонент или его объект, в этом случае автоматически создается объект типа TDragControlObject, с которым среда разработки Borland C++ Builder 6 осуществляет весь процесс перетаскивания. Обработчик может создавать и новый объект перетаскивания, в котором определен какой-нибудь особый вид курсора и т. п.
Событие OnEndDrag наступает при любом окончании процесса перетаскивания компонента, которое может быть успешным (компонент перетащен в приемник) или безуспешным (компонент отпущен над формой или компонентом, неспособным его принять). Данное событие наступает в момент прерывания или окончания перетаскивания компонента, оно наступает в перетаскиваемом компоненте. Его обработка не требуется для осуществления процесса перетаскивания. Соответствующий обработчик может быть написан, если требуется какое-либо действие или сообщение, подтверждающее результат перетаскивания, или какая-то реакция в перетаскиваемом компоненте. Параметр Sender обработчика — это сам объект перетаскивания. Параметр Target является компонентом-приемником, если объект был им принят, или пустым, если перетаскивание закончилось неудачей. Параметры X и Y дают координаты экрана в пикселях.

Продолжение следует...


Статья  1  2  3  4  5  6  7  8  9  10  11  12

17
 
Теги: C++   Borland   Уроки   Builder  
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити

Разное

Не давайте детям играть с ПДУ при работающем телевизоре.

Интересно

Чтобы защитить стержень от обгорания, его нужно обмазать тонким слоем смеси силикатного клея и сухой минеральной краски (окись железа, цинка и магния).

Похожие новости