ActiveX в Delphi

Стандартные события



Рассмотрим основные события, учитываемые компилятором Delphi. Для начала перечислим эти события:


OnChange

OnEnter

OnMouseMove

OnClick

OnExit

OnPaint

OnDblClick

OnKeyDown

OnProgress

OnDragDrop

OnKeyPress

OnStartDrag

OnDragOver

OnKeyUp

OnMouseUp

OnEndDrag

OnMouseDown

Рассмотрим каждое событие более подробно.
Событие onchange наступает после изменения какого-либо графического объекта. Создавайте обработчик такого события для выполнения каких-либо операций, происходящих после изменения графического объекта.
Событие onclick компонента наступает в случае, если пользователь нажал и отпустил левую кнопку мыши в тот момент, когда указатель мыши находился на компоненте. Кроме того, событие Onciick происходит в следующих случаях:
- при выборе пользователем, путем нажатия клавиш управления курсором, элемента в сетке (Grid), дереве (Tree), списке (List) или выпадающем списке (DropDown List);
- при нажатии пользователем клавиши <Пробел> или <Enter> в тот момент, когда компонент (например, кнопка) был в фокусе (component.Focused = True);
- при нажатии пользователем клавиши <Enter>, в случае, когда активная форма имеет кнопку по умолчанию;
- при нажатии пользователем клавиши <Esc>, в случае, когда активная форма имеет кнопку прерывания;
- при нажатии пользователем комбинации клавиш быстрого доступа ("горячих" клавиш) для обращения к кнопке или пункту меню. Например, в свойстве caption кнопки формы записано &пуск, при этом надпись на кнопке имеет вид Пуск. В результате, когда пользователь нажимает комбинацию клавиш <Alt>+<П>, происходит событие onclick;
- при установке приложением свойства checked переключателя RadioButton В true;
- при изменении приложением свойства Checked индикатора checkBox; - при вызове метода click элемента меню приложения.
Событие onciick возникает для формы в случае, когда пользователь щелкнул на любом месте формы, незанятом компонентами.
Событие onDblclick наступает в случае, когда пользователь дважды щелкнул левой кнопкой мыши на компоненте, причем отпустил кнопку мыши после второго щелчка над компонентом.

Примечание
К одному и тому же компоненту нельзя написать обработчики событий Onclick и OnDbiciick, поскольку первый из них всегда перехватит первый из щелчков. Событие OnStartDrag наступает, когда пользователь начинает перетаскивать компонент, т. е. нажал над компонентом левую кнопку мыши и, не отпуская ее, начал смещать курсор мыши. Событие имеет параметр Sender, содержащий наименование компонента, который должен перетаскиваться или который содержит объект перетаскивания (в случае, когда компонент является компонентом контейнерного типа).

Событие onDragDrop компонента наступает, когда пользователь отпускает перетаскиваемый компонент над компонентом. В обработчике события нужно описать, что должно происходить в момент отпускания перетаскиваемого компонента. При этом параметр source должен соответствовать перетаскиваемому компоненту, а параметр Sender - компоненту, над которым компонент будет отпущен. Кроме того, два параметра х и Y служат для хранения координат курсора мыши над компонентом. Система координат, в данном случае, соответствует клиентской части компонента.
Событие onDragOver компонента наступает, когда перетаскиваемый компонент пересекает границу данного компонента и оказывается над ним. Это событие возникает все время, пока пользователь перемещает компонент над компонентом-приемником. Как только пользователь отпускает компонент (отпускает левую кнопку мыши) происходит событие OnDragDrop, описанное выше. Для того чтобы определить, компоненты какого типа принимает данный компонент, используется параметр Accept. Если компонент способен принимать любые компоненты, то можно оставить обработчик OnDragOver пустым, но он обязательно должен присутствовать. Например:
procedure TForml.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); begin
// Данный комментарий нужен, чтобы компилятор не удалил этот пустой // обработчик
end;
Во время перетаскивания компонента форма указателя мыши может изменяться. Для установки этого свойства служит свойство DragCursor компонента, на который будет переноситься другой компонент.
Приведем простой пример использования событий OnDragDrop и OnDragOver.
Для наглядного применения события OnDragDrop создадим приложение, которое позволит пользователю перетаскивать строки одного списка в другой. Итак, расположим на форме два списка ListBox: ListBoxi и ListBox2. Добавим строки в первый список путем редактирования его свойства items. Назовем строки Строка 1. . .Строка 10 (рис. 2.7).
Для простоты будем перетаскивать строки из первого списка во второй. Поменяем значение СВОЙСТВа DragMode СПИСКа ListBoxi на dmAutomatic, ЧТО обеспечит автоматическое начало перетаскивания. Теперь для второго списка (ListBox2) напишем Обработчик события OnDragOver (Листинг 2.2).

Листинг 2.2
procedure TForml.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source is TListBox;
end;


Рис. 2.7. Пример применения событий OnDragDrop и OnDragOver
В данном обработчике мы указываем, что на компонент ListBox2 можно перетаскивать компоненты типа TListBox. Затем в обработчике события OnDragDrop запишем следующий код (листинг 2.3):

Листинг 2.3
procedure TForml.ListBox2DragDrop(Sender, Source: TObject; X, У: Integer);
begin
ListBox2.Items.Add(ListBoxl.Items[ListBoxl.Itemlndex]);
end;

Таким образом, мы добавляем выбранную строку компонента ListBoxl в компонент ListBox2.
Все! Можно запускать приложение. Попробуйте перетащить любую строку из первого списка во второй.
Событие OnEndDrag - последнее из событий, которые предназначены для обработки переноса одного компонента на другой. Оно наступает при любом окончании процесса переноса, как успешного, так и неудачного (когда компонент отпущен над формой или компонентом, не способном его принять). Данное событие наступает в перетаскиваемом компоненте. Событие
OnEndDrag. может применяться для реакции приложения на перетаскивание (например, "выполнено успешно" или "неудача"). В обработчике данного события параметр Sender - это сам объект перетаскивания, а параметр Target принимает значение компонента-приемника (при успешном перетаскивании) или nil (при неудачном переносе). Приведем пример (листинг 2.4).

Листинг 2.4
procedure TForml.ComponentlEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
If Target = Nil then ShowMessage('Перенесение объекта '+
(Sender as TControl).Name + ' завершилось неудачно') else
ShowMessage((Sender as TControl).Name + ' перенесен в ' + (Target as TControl).Name);
end;
Добавим код, записанный в листинге 2.3, в вышеописанное приложение. При этом код нужно поместить в обработчике события OnEndDrag для первого списка (ListBox1). В результате, при каждом успешном перетаскивании строки из первого списка во второй будет выдаваться окно-сообщение (рис. 2.8), а при неудачном - окно-сообщение, изображенное на рис. 2.9.


Рис. 2.8. Окно, выдаваемое при успешном перетаскивании строки из ListBox1 в ListBox2


Рис. 2.9. Окно, выдаваемоe при неудачном перетаскивании строки из ListBox1
Событие OnEnter происходит, когда компонент получает фокус. Данное событие не наступает при переключении между разными формами приложения или между различными приложениями. При переключении между компонентами контейнерного типа (т. е. между компонентами, которые могут размещать на себе другие компоненты, например панели) событие OnEnter наступает сначала для компонента контейнерного типа, а затем для содержащегося в нем компонента.
Событие OnExit является противоположным по отношению к OnEnter. Оно наступает в момент, когда компонент теряет фокус, т. е. когда фокус переходит к другому компоненту. Это событие также не наступает при переключении между разными формами или приложениями. В отличие от события OnEnter, событие OnExit наступает сначача для компонента, содержащегося в компоненте-контейнере, а затем для самого компонента контейнерного типа.
Приведем пример, иллюстрирующий события OnEnter и OnExit. Расположим на форме кнопку Button1 и группу переключателей RadioGroupi (рис. 2.10). Добавим в группу переключателей несколько строк (путем редактирования свойства items).


Рис. 2.10. Пример, иллюстрирующий работу событий OnEnter и OnExit
Запустим приложение. Фокус при запуске будет передан компоненту, который был размещен на форме первым (в нашем случае - это кнопка Button1). Если теперь выбрать щелчком мыши любой переключатель группы переключателей, то произойдет следующее:
И для кнопки Button1 наступит событие OnExit;
- для группы переключателей RadioGroupi - событие OnEnter;
- наконец, для выбранного переключателя из группы - событие OnEnter.
Если после этого выбрать щелчком мыши кнопку Button1, то события произойдут в таком порядке:
- для активного переключателя группы наступит событие OnExit; - для группы переключателей - событие OnExit;
- для кнопки Button1 - событие OnEnter.
Событие onKeyDown наступает, когда пользователь нажимает любую клавишу. Данное событие наступает для компонента, имеющему фокус в момент нажатия кнопки. С помощью этого события можно обрабатывать все клавиши, включая <Shift>, <Alt> и <Ctrl>. В процедуру-обработчик передаются, кроме параметра sender, такие параметры, как Key и shift. Параметр Key определяет нажатую клавишу. В случае, если нажата не алфавитно-цифровая клавиша, в параметр передается виртуальный код клавиши. Приведем таблицу кодов клавиш (табл. 2.7).
Таблица 2.7. Коды клавиш
Клавиша

Десятичное число

Шестнадцатеричное число

Символическое имя

<F1>

112

70

VK F1

<F2>

113

71

VK_F2

<F3>

114

72

VK_F3

<F4>

115

73

VK_F4

<F5>

116

74

VK_F5

<F6>

117

75

VK_F6

<F7>

118

76

VK F7

<F8>

119

77

VK_F8

<F9>

120

78

VK_F9

<F10>

121

79

VK F10

<Пробел>

32

20

VK SPACE

<BackSpace>

8

8

VK_BACK

<Tab>

9

9

VKJTAB

<Enter>

13

OD

VK_RETURN

<Shift>

16

10

VK SHIFT

<Ctrl>

17

11

VK_CONTROL

<Alt>

18

12

VK_MENU-

<CapsLock>

20

14

VK_CAPITAL

<Еsc>

27


VK ESCAPE

<lnsert>

45

2D

VK INSERT

<PageUp>

33

21

VK PRIOR

<PageDown>

34

22

VK_NEXT

<End>

35

23

VK END

<Home>

36

24

VK HOME

<Стрелка влево

37

25

VK_LEFT

<Стрелка вверх>

38

26

VK UP

<Стрелка вправо>

39

27

VK_RIGHT

<Стрелка вниз>

40

28

VK DOWN

<Delete>

46

2E

VK_DELETE

<PrintScreen>

44

2C

VKJ3NAPSHOT

<ScrollLock>

145

91

VK SCROLL

<Pause>

19

13

VK_PAUSE

<NumLock>

144

90

VK_NUMLOCK

На цифровой клавиатуре, при выключенном режиме NumLock
<0>

96

60

VK_NUMPADO

<1>

97

61

VK_NUMPAD1

<2>

98

62

VK_NUMPAD2

<3>

99

63

VK_NUMPAD3

<4>

100

64

VK_NUMPAD4

<5>

101

65

VKJTOMPAD5

<6>

102

66

VK_NUMPAD6

<7>

103

67

VK_NUMPAD7

<8>

104

68

VK_NUMPAD8

<9>

105

69

VK_NUMPAD9

<*>

106


VK_MULTIPLY

<+>

107


VK_ADD

<->

109

6D

VK_SUBTRACT

<.>

110


VK_DECIMAL

</>

111

6F

VK_DIVIDE


Данные коды не различают регистр и раскладку клавиатуры (латинская/кириллица). Параметр shift является множеством, которое может быть пустым или содержать следующие элементы:
- ssshift - при нажатой клавише <Shift>;
- ssAlt - при нажатой клавише <Alt>;
- ssctrl - при нажатой клавише <Ctrl>.
Приведем пример использования события OnKeyDown. Предположим, что нам необходимо распознать, когда пользователь нажмет комбинацию клавиш <Ctrl>+<Shift>+<L>. В обработчике события OnKeyDown напишем следующий код:
if ((Key = ord CL1)) and (ssShift in Shift) and (ssCtrl in Shift)) then ShowMessage ('Нажата комбинация клавиш <Ctrl>+<Shift>+<L>');
В вышеприведенном примере мы использовали функцию ord (), которая позволяет по символу клавиши получить код клавиши (в нашем случае, код клавиши <L>). Теперь, всякий раз, когда фокус будет у компонента, к которому привязан данный обработчик, и когда пользователь нажмет комбинацию клавиш <Ctrl>+<Shift>+<L>, будет выводиться окно (рис. 2.11).


Рис. 2.11. Окно, появляющееся при обработке события OnKeyDown
Событие onKeypress наступает при нажатии пользователем символьной клавиши. Данное событие имеет параметр Key, который содержит символ нажатой клавиши и имеет тип char. При этом различаются символы верхнего и нижнего регистров, а также раскладка клавиатуры.

Примечание
С помощью события OnKeyPress невозможно обработать нажатие функциональных клавиш и клавиш <Shift>, <Ctrl> и <Alt>. Таким образом, когда вы нажимаете комбинацию клавиш <Shift>+<b>, в параметр Key события OnKeyPress поступит значение "В", клавиша <Shift> только поменяет регистр символа. При нажатии комбинации клавиш, включающих клавишу <Alt>, событие OnKeyPress при нажатии комбинации клавиш <АИ>+<любая символьная клавиша> не наступает. При нажатой комбинации клавиш <С1г1>+<любая символьная клавиша> событие OnKeyPress наступает, но в параметр Key ничего не передается.

Событие OnKeyUp происходит при отпускании пользователем любой ранее нажатой клавиши. Данное событие позволяет обрабатывать все клавиши, как и событие OnKeyDown. По своим параметрам и поведению событие OnKeyUp равносильно событию OnKeyDown.
Событие onMouseDown наступает при нажатии пользователем любой кнопки мыши в тот момент, когда указатель мыши находится над компонентом. Данное событие имеет параметры Button, shift, x и Y. Параметр Button определяет, какая кнопка мыши нажата:
- mbLeft - левая кнопка; - mbMiddle - средняя кнопка; - mbRight - правая кнопка.
Параметр shift равносилен параметру shift для событий, связанных с обработкой клавиатуры. Таким образом, можно обрабатывать нажатие любой кнопки мыши одновременно с клавишами <Shift>, <Ctrl> или <Alt>.
Параметры х и Y содержат координаты указателя мыши в области компонента.
Событие onMouseUp наступает, когда пользователь отпускает любую кнопку мыши над компонентом. По своим функциям и параметрам данное событие аналогично событию onMouseDown.
Событие onMouseMove наступает при перемещении указателя мыши над компонентом. Это событие возникает'независимо от того, нажаты какие-либо клавиши мыши или нет.

Примечание
При нажатой левой кнопке мыши данное событие не возникает. Эта особенность почему-то не документирована.

Данное событие имеет следующие параметры: shift, х и Y, аналогичные вышеописанным.
Событие onPaint. наступает, когда приложение получает сообщение Windows о необходимости перерисовки испорченного изображения. Изображение может испортиться от перекрытия окон одного или нескольких приложений. В обработчик данного события программист должен разместить процедуру, выполняющую перерисовку изображения. Например, если на форме был размещен рисунок, хранящийся в компоненте BitMap, тогда можно использовать следующий обработчик события OnPaint для перерисовки изображения:
Canvas.Draw (О, О, BitMap);
Событие OnProgress наступает при прохождении медленных процессов, связанных с изменением графического изображения. Данное событие позволяет строить индикаторы хода выполнения процесса. Событие OnProgress имеет следующие параметры: stage, PercentDone, RedrawNow, R и Msg. Параметр stage предназначен для указания стадии прогресса (начало, продолжение, окончание) и может принимать значения psstarting (начало), psRunning (продолжение), psEnding (окончание). Параметр PercentDone показывает, какая часть процесса выполнена. Параметр RedrawNow говорит, может ли в настоящий момент изображение успешно отобразиться на экране. Параметр R служит для указания области изображения, которая изменена и требует перерисовки. Наконец, параметр Msg служит для отображения сообщений о ходе процесса. Этот параметр имеет строковый тип. Параметр Msg может быть пустым.

Содержание раздела