
- •Перетаскивание объектов 4 Перетаскивание объектов Перетаскивание информации об объектах — технология Drag&Drop
- •Начало процесса перетаскивания
- •Событие OnStartDrag
- •Информирование о готовности принять информацию Событие OnDragOver
- •Обеспечение приема информации Событие OnDragDrop
- •Событие OnEndDrag
Перетаскивание объектов 4 Перетаскивание объектов Перетаскивание информации об объектах — технология Drag&Drop
Процесс перетаскивания с помощью мыши информации из одного объекта в другой (Drag&Drop), коротко называемый перетаскиванием, очень широко используется в Windows. Например, вы можете перемещать файлы между папками, перемещать сами папки, включая их в другие папки, и т.д. Посмотрим, как осуществляется подобное перетаскивание информации объектов в Delphi.
Все свойства, методы и события, связанные с процессом перетаскивания, определены в классе TControl, являющемся прародителем всех визуальных компонентов Delphi. Поэтому они являются общими для всех компонентов.
Начало процесса перетаскивания
Начало процесса перетаскивания определяется свойством DragMode :TDragMode;
TDragMode= (dmManual,dmAutomatic)
dmAutomatic (автоматическое) определяет автоматическое начало процесса перетаскивания при нажатии пользователем кнопки мыши над компонентом. В этом случае событие OnMouseDown, связанное с нажатием пользователем кнопки мыши, для этого компонента вообще не наступает. Наступает событиеOnStartDrag.
dmManual (ручное) говорит о том, что начало процесса перетаскивания должен определять программист. Для этого он должен в соответствующий момент вызвать метод BeginDrag. Например, он может поместить вызов этой функции в обработчик событияOnMouseDown, наступающего в момент нажатия кнопки мыши. В этом обработчике он может проверить предварительно какие-то условия (режим работы приложения, нажатие тех или иных кнопок мыши и вспомогательных клавиш) и при выполнении этих условий вызватьBeginDrag.
Пусть, например, процесс перетаскивания должен начаться, если пользователь нажал левую кнопку мыши и клавишу Alt над списком ListBoxl. Тогда свойство DragModeэтого компонента надо установить вdmManual, а его обработчик события OnMouseDown может иметь вид:
procedure TForml.ListBoxlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and (ssAlt in Shift)
then ListBoxl.BeginDrag(false);
end;
Параметр Button обработчика событияOnMouseDown показывает, какая кнопка мыши была нажата, а параметрShift является множеством, содержащим обозначения нажатых в этот момент кнопок мыши и вспомогательных клавиш клавиатуры. Приведенный выше оператор проверяет, нажаты ли левая кнопка мыши и клавиша Alt. Если нажаты, то вызывается методBeginDrag данного компонента.
В предыдущем примере в функцию BeginDrag передано значениеfalse. Это означает, что процесс перетаскивания начнется не сразу, а только после того, как пользователь сдвинет мышь с нажатой при этом кнопкой. Это позволяет отличить простой щелчок мыши от начала перетаскивания. Если же передать вBeginDrag значениеtrue, то перетаскивание начнется немедленно.
Когда начался процесс перетаскивания, обычный вид курсора изменяется. Пока он перемещается над формой или компонентами, которые не могут принять информацию, он обычно имеет тип crNoDrop. Если же он перемещается над компонентом, готовым принять информацию из перетаскиваемого объекта, то приобретает вид, определяемый свойством перетаскиваемого объектаDragCursor.По умолчанию это свойство равноcrDrag. Надо подчеркнуть, что вид курсора определяется свойствомDragCursor перетаскиваемого объекта, а не того объекта, над которым перемещается курсор.