- •Перетаскивание объектов 4 Перетаскивание объектов Перетаскивание информации об объектах — технология Drag&Drop
- •Начало процесса перетаскивания
- •Событие OnStartDrag
- •Информирование о готовности принять информацию Событие OnDragOver
- •Обеспечение приема информации Событие OnDragDrop
- •Событие OnEndDrag
Событие OnStartDrag
Событие наступает, когда пользователь начал процесс перетаскивания компонента. В обработчике этого события можно произвести какие-то операции в начале перетаскивания. Это событие полезно при автоматическом начале перетаскивания, когда иным способом этот момент нельзя зафиксировать.
Информирование о готовности принять информацию Событие OnDragOver
В процессе перетаскивания компоненты, над которыми перемещается курсор, могут информировать о готовности принять информацию от перетаскиваемого объекта. Для этого в компоненте должен быть предусмотрен обработчик события OnDragOver, наступающего при перемещении над данным компонентом курсора, перетаскивающего некоторый объект. В этом обработчике надо проверить, может ли данный компонент принять информацию перетаскиваемого объекта, и, если не может, задать значениеfalse передаваемому в обработчик параметруAccept. По умолчанию этот параметр равенtrue, что означает возможность принять перетаскиваемый объект. Обработчик для спискаListBoxl может иметь, например, следующий вид:
procedureTForml.ListBoxlDragOver(Sender,Source:TObject;X,Y:Integer;
State: TDragState; var Accept: Boolean);
begin
if (Source as TControl <> Sender)
then Accept := Source is TListBox
else Accept := false;
end;
В нем сначала проверяется, не являются ли данный компонент (Sender) и перетаскиваемый объект(Source) одним и тем же объектом. Это сделано, чтобы избежать перетаскивания информации внутри одного и того же списка. Если источник и приемник являются одним и тем же объектом, то срабатываетelse и параметрAccept становится равнымfalse, запрещая прием информации. Если же это разные объекты, тоAccept делается равнымtrue, если источником является какой-то другой список (компонент классаTListBox), и равнымfalse, если источник является объектом любого другого типа. Таким образом компонентListBoxl сообщает, что готов принять информацию из любого другого списка.
Значение параметра Accept, задаваемое в обработчике событияOnDragOver, определяет вид курсора, перемещающегося при перетаскивании над данным компонентом. Этот вид показывает пользователю, может ли данный компонент принять перетаскиваемую информацию. Если в компоненте не описан обработчик событияOnDragOver, то считается, что данный компонент не может принять информацию перетаскиваемого объекта.
Параметр State типа TDragState определяет состояние перетаскиваемого объекта по отношению к другим объектам. Возможны следующие состояния:
Значение Описание
dsDragEnter Курсор мыши входит в пределы компонента.
DsDragMove Курсор мыши перемещается в пределах компонента.
DsDragLeave Курсор мыши выходит за пределы компонента.
Обеспечение приема информации Событие OnDragDrop
Процедура приема информации от перетаскиваемого объекта записывается в обработчике события OnDragDrop принимающего компонента. Это событие наступает, если после перетаскивания пользователь отпустил кнопку мыши над данным компонентом. В обработчик этого события передаются параметрыSource (объект-источник) и X и Y координаты курсора. Если продолжить начатый выше пример перетаскивания информации из одного списка в другой, то обработчик событияOnDragDrop может иметь вид:
procedure TForml.ListBoxlDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
(Sender as TListBox).Items.Add((Source as TListBox).
Items[(Source as TListBox).ItemIndex]);
end;
В этом обработчике строка, выделенная в списке-источнике (Source as TListBox). Items[(Source as TListBox). ItemIndex], добавляется в список-приемник методом (SenderasTListBox). Items. Add, Используется операция as, позволяющая рассматривать параметрыSender и Source как указатели на объекты классаTListBox. Это делается потому, что эти параметры объявлены в заголовке процедуры как указатели на объекты классаTObject. Но в классеTObject нет свойствItems и Itemlndex, которые нам требуются. Эти свойства определены в классеTListBox, являющемся наследникомTObject. Поэтому с параметрамиSender иSource в данном случае надо оперировать как с указателями на объектыTListBox, что и выполняет операция as.
Конечно, в данном случае можно было бы не использовать параметр Sender, заменив(Sender as TListBox) просто наListBoxl. Но запись оператора в общем виде с помощью параметраSender позволяет воспользоваться таким обработчиком и для других компонентовListBox, если они имеются в приложении.
