При разработке приложений на Visual FoxPro вы можете перетаскивать текст, файлы и объекты из Галереи Компонентов (Component Gallery)Менеджера проектов(Project Manager), Конструктора Баз Данных(Database Designer) и Конструктора Среды Окружения(Data Environment Designer)  в желаемое место на форме и отчете. Visual FoxPro позволяет применять возможности drag-and-drop в ваших программах во время их выполнения.

Операции drag-and-drop допускаются и между несколькими формами. Пользователь может перетаскивать текст, файлы и элементы управления в пределах экрана куда угодно, включая и другие формы.

Visual FoxPro поддерживает два типа функциональностей drag-and-drop: OLE drag-and-drop и control drag-and-drop. OLE drag-and-drop позволяет перетаскивать данные между вашим и другими приложениями, которые поддерживают OLE drag-and-drop (такими как Visual FoxPro, Visual Basic, Windows Explorer, Microsoft Word and Excel, and т.п.) В распространяемых приложениях можно перетаскивать данные между элементами управления вашего приложения или элементами управления вашего приложения и другими приложениями Window, поддерживающими OLE drag-and-drop.

Элементы управления drag-and-drop поддерживаются и в ранних версиях Visual FoxPro. Когда пользователь перетаскивает элемент управления, то рядом с указателем мыши появляется рисунок в виде серого прямоугольника. Можно изменить этот рисунок на другой, если указать файл курсора (.cur) в свойстве DragIcon переносимого элемента управления.

В этом разделе описывается управление операцией drag-and-drop. Более подробная информация об OLE drag-and-drop приведена в OLE Drag-and-Drop.

Чтобы увидеть пример управления операцией drag-and-drop, выполните приложение Solution.app из папки Visual FoxPro ...\Samples\Solution. В появившемся дереве вначале кликните Controls, а затем General.

NoteЗамечание

Элемент управления во время перетаскивания не меняет своего расположения автоматически. Это можно сделать вручную как описано в разделе "Causing Control Movement in a Drag-and-Drop Operation." ("Процесс перетаскивания элемента управления при операции Drag-and-Drop"). Зачастую перетаскивание используется только для обозначения того, что какое-то действие должно быть произведено; при этом элемент управления сохраняет свое первоначальное расположение и после того как пользователь отпустит кнопку мыши.

Операцией перетаскивания можно управлять с помощью следующих свойств, событий и метода:

Для того, чтобы Используйте

Включить режим автоматического или ручного перетаскивания элемента управления.

Свойство DragMode

Указать какую иконку отображать при перетаскивании элемента управления.

Свойство DragIcon

Узнать когда элемент управления окажется перенесен на искомый объект.

Событие DragDrop

Узнать когда элемент управления при перетаскивании окажется над искомым объектом.

Событие DragOver

Начать или остановить ручное перетаскивание.

Метод Drag

Все визуальные элементы управления могут перетаскиваться во време выполнения приложения и на всех на них распространяются правила, описанные в предыдущей таблице. Формы имеют возможность обработки событий DragDrop и DragOver, но не содержат свойств DragMode and DragIcon.

Включение Режима Автоматического Перетаскивания

Чтобы пользователь мог перетаскивать элемент управления всякий раз, когда он кликнет на него, установите свойство этого элемента управления DragMode равным 1. Это действие включит режим автоматического перетаскивания, т.е. сделает перетаскивание возможным всегда.

NoteЗамечание

Во время операции автоматического перетаскивания элемент управления не реагирует на другие события, происходящие при работе с мышью.

Реакция на Высвобождение Перетаскиваемого Объекта

После того, как пользователь перетащит элемент управления в нужное место и отпустит кнопку мыши , Visual FoxPro сгенерирует событие DragDrop. Вы можете отреагировать на это событие разными способами. Можно, например, переместить элемент управления в конечную локацию, обозначенный последней позицией серого прямоугольника. Напоминаем еще раз, что элемент управления самостоятельно не переместится в конечную локацию.

При обсуждении операций drag-and-drop очень важны два элемента: source и target.

Элемент Значение

Source (Источник)

Элемент управления, который перетаскивается.

Target

(Цель)

Объект, на который перетаскивается элемент управления. Этот объект идентифицируется событием DragDrop и может быть формой или другим элементом управления.

Элемент управления станет целью в том случае, если в момент отпускания кнопки мыши позиция ее указателя окажется в его границах, а форма -  когда указатель окажется на ее свободном от элементов управления пространстве.

Событие DragDrop получает три параметра:: oSource, nXCoord и nYCoord. Параметр oSource ссылается на элемент управления, который был высвобожден над целью. Параметры nXCoord и nYCoord содержат, соответственно, горизонтальную и вертикальную координаты указателя мыши над целью.

Т.к. oSource является объектом, то вы используете его просто как элемент управления, на свойства которого можно сослаться или вызвать один из его методов. Например, следующие операторы в коде события DragDrop проверяют не высвободил ли пользователь перетаскиваемый элемент управления над самим собой:

В  CopyCode imageКопировать Код
LPARAMETERS oSource, nXCoord, nYCoord
IF oSource.Name != THIS.Name
* Выбор некоего действия.
ELSE
* Элемент управления высвобожден над самим собой.
* Выбор другого действия.
ENDIF

Все возможные типы элементов управления, на которые указывает параметр oSource, имеют свойство Visible. Следовательно, вы можете сделать элемент управления невидимым если высвободить его над определенной частью формы или над другим элементом управления. Следующая строка в коде события DragDrop элемента управления Image является причиной того, что высвобождаемый над изображением элемент управления становится невидимым:

В  CopyCode imageКопировать Код
LPARAMETERS oSource, nXCoord, nYCoord
oSource.Visible = .F.

Указание Допустимых для Высвобождения Зон

Когда вы разрешаете функциональность drag-and-drop, то можете помочь пользователю вашего приложения, включив в него визуальное объяснение того где он может, а где не может высвобождать элемент управления. Лучший способ для этого - это изменение свойства DragIcon в коде  события DragOver.

Следующий код в событии DragOver элемента управления показывает пользователю, что перетаскиваемый элемент управления находится не над той целью, над которой его можно высвободить. В этом примере cOldIcon - это свойство формы, определенное пользователем.

В  CopyCode imageКопировать код
LPARAMETERS oSource, nXCoord, nYCoord, nState
DO CASE
CASE nState = 0 && Enter
THISFORM.cOldIcon = oSource.DragIcon
oSource.DragIcon = "NODROP01.CUR"
CASE nState = 1 && Leave
oSource.DragIcon = THISFORM.cOldIcon
ENDCASE

Управление Началом и Завершением Перетаскивания

Ручная установка свойства DragMode дает больше возможностей по управлению перетаскиванием по сравнению с Автоматической установкой. Ручная установка позволяет указать когда элемент управления можно перетаскивать, а когда - нет. (Когда DragMode установлен в Автоматический режим, то элемент управления возможно перетаскивать до тех пор, пока этот режим не сменится.)

Например, Вы можете позволить перетаскивание в ответ на события MouseDown и MouseUp, или в ответ на нажатие клавиатуры или выполнение команды меню. Кроме того Ручная установка позволит узнать момент наступления события MouseDown перед началом перетаскивания для того, чтобы вы смогли запомнить позицию указателя мыши.

Для того, чтобы разрешить перетаскивание в коде не изменяйте умалчиваемое значение свойства DragMode (0 - Ручной). Затем задействуйте метод Drag, в котором можно начать или завершить перетаскивание элемента управления.

Если параметр nAction равен 1, то метод Drag инициирует перетаскивание элемента управления. Если параметр nAction равен 2, то элемент управления высвободится и случится событие DragDrop. Параметр nAction равный 0 отменяет перетаскивание. Эффект подобен тому, который дает присвоение параметру значения 2, но при этом событие DragDrop не возникнет.

NoteЗамечание

Чтобы произвести операцию drag and drop из списка (list box) лучше всего вызывать метод Drag в коде события MouseMove исходного списка (list box) после того как будет определено, что кнопка мыши нажата. Для примера, смотрите форму Lmover.scx в папке ...\Samples\Solution\Controls\Lists.

Перемещение Элемента Управления при проведении Операции Drag-and-Drop

Вы можете пожелать, чтобы исходный элемент управления изменил свою позицию после того, как пользователь отпустит кнопку мыши. Для перемещения элемента управления в новую позицию используйте метод Move. Например, следующий код переместит перетаскиваемый элемент управления в ту позицию, в которой он высвободится:

В  CopyCode imageКопировать код
LPARAMETERS oSource, nXCoord, nYCoord
oSource.Move(nXCoord, nYCoord)

Этот код может не дать желаемого эффекта из-за того, что левый верхний угол элемента управления будет спозиционирован на указатель мыши. А вот следующий код позиционируетна указатель мыши центр элемента управления:

В  CopyCode imageКопировать код
LPARAMETERS oSource, nXCoord, nYCoord
oSource.Move ((nXCoord - oSource.Width / 2), ;
(nYCoord - oSource.Height / 2))

Этот код будет работает наилучшим образом когда свойство DragIconустановлено в значение отличное от умалчиваемого (серый прямоугольник). Если используется серый прямоугольник, то пользователь обычно хочет переместить элемент управления точно в конечную позицию серого прямоугольника. Чтобы достичь этого, запишите начальную позицию указателя мыши в исходном элементе управления, а затем используйте эту позицию как смещение при конечном позиционировании элемента управления. Пример такого действия приведен в форме Ddrop.scx, расположенной в папке ...\Samples\Solution\Forms.

Для записи начальной позиции мыши

  1. Установите ручной режим перетаскивания элемента управления.

  2. Объявите в форме два свойства-переменные nDragX и nDragY.

  3. Начните перемещение когда произойдет событие MouseDown. При этом, сохраните в коде этого события значение координат nXCoord и nYCoord, соответственно, в свойствах-переменных nDragX и nDragY.

  4. Завершите перемещение когда произойдет событие MouseUp.

См. также