1.3. Метод Drag – ручное перетаскивание
Этот метод начинает, завершает или отменяет операцию перетаскивания любого из элементов управления кроме Line, Menu, Shape, Timer и CommonDialog. Он позволит нам не блокировать объект для редактирования, использовать всевозможные иконки, чтоб пользователь видел, что делает при перетаскивании.
Еще раз напомним очень важную вещь: результат перетаскивания над перемещаемым объектом (копирование, удаление, вставка и т.д.) определяется в объекте-приемнике в процедуре обработки события DragDrop.
Итак, для того, чтобы начать что-нибудь перетаскивать, надо перейти в режим перетаскивания. Для этого обычно используется процедура события MouseDown для объекта-источника. В ней мы включаем метод Drag. Для включения-выключения метода и отмены перетаскивания используются следующие встроенные константы:
vbCancel =0 'отменяет операцию перетаскивания
vbBeginDrag =1 'включает метод Drop
vbEndDrag =2 'выключает метод Drop
Пример.
1. Создайте новый проект и расположите на форме три текстовых поля Text1, Text2 и Text3 и кнопку Command1. Смысл проекта в том, чтобы перетаскивать содержимое Text1 в Text3, а Text2 запрещен для перетаскивания. Также организуем перетаскивание по форме командной кнопки Command1.
2. Объявим переменную Flag как булеву (логическую), чтобы позволить пользователю беспрепятственно редактировать текст в объекте-источнике, т.е в Text1. Т.е. изначально Flag=False и при первом щелчке метод Drag в процедуре Text1_MouseDown не включается. Пользователь спокойно может редактировать текст. Но в конце процедуры Flag меняет свое значение на противоположное (Flag = Not Flag) и при повторном нажатии кнопки мыши уже включается метод Drag. В процедуре загрузки формы зададим какое-нибудь содержимое текстовым полям.
Option Explicit
Dim Flag As Boolean
'координаты мыши в момент ее нажатия по командной кнопке
Dim downX As Single, downY As Single
Private Sub Form_Load()
Text1.Text = "Доброе утро"
Text2.Text = "Спокойной ночи"
Text3.Text = "Здравствуйте"
Flag = False
End Sub
3. Далее в событии MouseDown для объекта-источника Text1 включим метод Drag для левой кнопки мыши. И меняем состояние переменной Flag:
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
'проверяем, если нажата левая кнопка мыши и это повторное нажатие, то
If Button = 1 And Flag = True Then
'включаем метод Drag
Text1.Drag vbBeginDrag
'загружаем иконку для курсора
Text1.DragIcon = LoadPicture(App.Path & "\Drop1pg.ico")
End If
'меняем значение флага на противоположное
Flag = Not Flag
End Sub
4. В объекте-приемнике по событию DragDrop производим результат перетаскивания, т.е. присваиваем значение Text3=Text1. При этом проверяем тип объекта-источника:
Private Sub Text3_DragDrop(Source As Control, X As Single, Y As Single)
'проверяем, соответствует ли тип объекта-источника TextBox'у
If TypeOf Source Is TextBox Then
'если да, то
Text3.Text = Source.Text
'и передадим фокус в объект-приемник (Text3)
Text3.SetFocus
End If
End Sub
5. Поскольку наглядность перетаскивания для пользователя чрезвычайно важна, загрузим иконки в соответствии с положением мыши для объекта-источника (Text1):
Private Sub Text1_DragOver(Source As Control, X As Single, Y As Single, _
State As Integer)
'если мышь над объектом-источником грузим обычную иконку
If State = vbEnter Then
Text1.DragIcon = LoadPicture(App.Path & "\Drop1pg.ico")
'если покидает объект, то грузим другую иконку
ElseIf State = vbLeave Then
Text1.DragIcon = LoadPicture(App.Path & "\Drag3pg.ico")
End If
End Sub
и для объекта-приемника (Text3):
Private Sub Text3_DragOver(Source As Control, X As Single, Y As Single, _
State As Integer)
'если мышь над объектом-приемником, то
If State = vbEnter Then
Text1.DragIcon = LoadPicture(App.Path & "\Drag1pg.ico")
'если вне объекта-приемника, то
ElseIf State = vbLeave Then
Text1.DragIcon = LoadPicture(App.Path & "\Drag3pg.ico")
End If
End Sub
6. На этой же форме включим метод Drag для командной кнопки Command1.
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = 1 Then
Command1.Drag vbBeginDrag
'запоминаем координаты мыши над командной кнопкой
downX = X
downY = Y
End If
End Sub
и напишем процедуру ее перетаскивания по форме
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
If TypeOf Source Is CommandButton Then
Source.Move X - downX, Y - downY
End If
End Sub
Если бы мы не проверяли тип объекта с помощью ключевого слова TypeOf, то при попытке перетащить кнопку в Text3 получили бы ошибку и фатальное завершение программы. А при наличии проверки наши методы не мешают друг другу и все проходит успешно.
7. Сохраните и протестируйте проект.
