Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 16 Перетаскивание объектов.doc
Скачиваний:
49
Добавлен:
23.03.2015
Размер:
54.27 Кб
Скачать

Событие 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, если они имеются в приложении.