264______________________________________________Глава 4

Все свойства, методы и события, связанные с процессом перетаскивания,
определены в классе TControl, являющемся прародителем всех визуальных ком-
понентов C++Builder. Поэтому они являются общими для всех компонентов.

Начало процесса перетаскивания определяется свойством DragMode, которое
может устанавливаться в процессе проектирования или программно равным
dmManual или dmAutomatic. Значение dmAutomatic (автоматическое) определя-
ет автоматическое начало процесса перетаскивания при нажатии пользователем
кнопки мыши над компонентом. Имейте в виду, что в этом случае событие OnMou-
seDown, связанное с нажатием пользователем кнопки мыши, для этого компонен-
та вообще не наступает. Значение же dmManual (ручное) говорит о том, что начало
процесса перетаскивания должен определять программист. Для этого он должен в
соответствующий момент вызвать метод BeginDrag. Например, он может поместить
вызов этой функции в обработчик события OnMouseDown, наступающего в момент
нажатия кнопки мыши. В этом обработчике он может проверить предварительно ;

какие-то условия (режим работы приложения, нажатие тех или иных кнопок мыши
и вспомогательных клавиш) и при выполнении этих условий вызвать BeginDrag.

Пусть, например, процесс перетаскивания должен начаться, если пользова
тель нажал левую кнопку мыши и клавишу Alt над списком ListBoxl. Тогда свой-
ство DragMode этого компонента надо установить в dmManual, а его обработчик |
события OnMouseDown может иметь вид:                                    J

void _fastcall TFormI::ListBoxlMouseDown(TObject *Sender,              1
TMouseButton Button, TShiftState Shift, int X, int Y)

{

if ((Button == mbLeft) && Shift.Contains(ssAlt))
ListBoxl->BeginDrag(false);

t

Параметр Button обработчика события OnMouseDown показывает, какая
кнопка мыши была нажата, а параметр Shift является множеством, содержащим
обозначения нажатых в этот момент кнопок мыши и вспомогательных клавиш
клавиатуры (см. раздел 4.3.1.2). Приведенный выше оператор проверяет, нажата
ли левая кнопка мыши и клавиша Alt. Если нажаты, то вызывается метод BeginD-
rag данного компонента.

В предыдущем примере в функцию BeginDrag передано значение false. Это
означает, что процесс перетаскивания начнется не сразу, а только после того, как
пользователь сдвинет мышь с нажатой при этом кнопкой. Это позволяет отличить
простой щелчок мыши от начала перетаскивания. Если же передать в BeginDrag
значение true, то перетаскивание начнется немедленно.

Когда начался процесс перетаскивания, обычный вид курсора изменяется.
Пока он перемещается над формой или компонентами, которые не могут при-
нять информацию, он обычно имеет тип crNoDrop: 0. Если же он перемещается
над компонентом, готовым принять информацию из перетаскиваемого объекта, то
приобретает вид, определяемый свойством перетаскиваемого объекта DragCursor.
По умолчанию это свойство равно crDrag, что соетветствует изображению  ^ .
Надо подчеркнуть, что вид курсора определяется свойством DragCursor перетас-
киваемого объекта, а не того объекта, над которым перемещается курсор.

В процессе перетаскивания компоненты, над которыми перемещается курсор,
могут сообщать о готовности принять информацию от перетаскиваемого объекта.
Для этого в компоненте должен быть предусмотрен обработчик события OnDragO-
ver, наступающего при перемещении над данным компонентом курсора, перетас-
кивающего некоторый объект. В этом обработчике надо проверить, может ли дан-
ный компонент принять информацию перетаскиваемого объекта, и если не может,
задать значение false передаваемому в обработчик параметру Accept. По умолча-
нию этот параметр равен true, что означает возможность принять перетаскиваемый
объект. Обработчик для списка ListBoxl может иметь, например, следующий вид: