9.2 Общие шаги для разработки функций перетаскивания
Перетаскивание - это функция, которая облегчает работу объектов, предоставленных Windows, и может быть легко разработана в Delphi.
публично заявить. В соответствии с процессом работы перетаскивания, этапы разработки можно разделить на четыре этапа, а именно:
● Начните операцию перетаскивания
● Получить предметы перетаскивания
● Отбросить элемент перетаскивания
● Прекратите операцию перетаскивания
Во время процесса введения мы объединим пример перетаскивания TABSE (Tagged). Дизайн интерфейса показан на рисунке.
Когда пользователь перетаскивает тег в положение другого тега во время выполнения, тег перейдет в это место и вызывает
Перестановление набора тегов.
9.2.1 Начните перетаскивать
Когда DragMode устанавливается на дмаутоматический
Начните; Если вы хотите начать перетаскиваться
Используйте метод Betindrag.
В табсете перетаскивается, мы используем обработку событий Mousedown ниже, чтобы начать перетаскивать тег.
Сначала определите, является ли нажатая левая кнопка левой кнопкой, а затем определите, является ли элемент законным.
Процедура tform1.tabset1mousedown (отправитель: tobject; кнопка: tmousebutton;
Сдвиг: TshiftState;
вар
Dragitem: целое число;
Начинать
Если кнопка = mbleft тогда
Начинать
Dragitem: = tabset1.itematpos (точка (x, y));
if (dragitem> -1) и (Dragitem <tabset1.tabs.count) тогда
Tabset1.begindrag (false);
конец;
конец;
9.2.2 Получить перетаскиваемые предметы
Может ли управление получать элементы перетаскивания, определяется событием управления Ondragover. В перетаскивании табсана главным является использование позиции мыши для суждения.
Процедура tform1.tabset1dragover (отправитель, источник: tobject; x, y: целое число;
Состояние: tdragstate;
вар
Droppos: целое число;
Начинать
Если источник = tabset1, то
Начинать
Droppos: = tabset1.itematpos (точка (x, y));
Принять: = (droppos> -1) и (droppos <> tabset1.tabindex) и
(Droppos <tabset1.tabs.count);
конец;
еще
Принять: = false;
конец;
9.2.3 Положите элемент перетаскивания
Когда возврат обработки событий Ondragover принимает True, а элемент отброшен, событие Ondragdrop
Процесс перетаскивания и отброса ответа. В экземпляре перетаскивания в табсете он должен изменить положение тега.
Процедура tform1.tabset1dragdrop (отправитель, источник: tobject; x, y: integer);
вар
OldPos: целое число;
Newpos: целое число;
Начинать
Если источник = tabset1, то
Начинать
OldPos: = tabset1.tabindex;
Newpos: = tabset1.itematpos (point (x, y));
if (newpos> -1) и (newpos <> oldpos) тогда
Tabset1.tabs.move (Oldpos, Newpos);
конец;
конец;
9.2.4
Есть два способа завершить операцию перетаскивания: либо пользователь выпускает ключ мыши, либо программа использует метод EndDrag.
Вынужденная перетаскивание. Существует два последствия для окончания операции сопротивления: падение принимается или выпущен игнорируется.
После того, как операция перетаскивания будет завершена, элемент управления источником получит сообщение, чтобы ответить на событие Trag End OnendDrag.
9.3 Пример приложения перетаскивания: перетаскивать поддержку для диспетчера файлов
Хотя пример приложения File Manager, разработанный в главе 6, начал формироваться в функции, он работает
По сравнению с файловым менеджером Windows, есть еще много недостатков. Самым большим недостатком является то, что он не поддерживает движение перетаскивания файлов
и перетаскивать копию. В конце этой главы мы можем восполнить этот недостаток.
Движение по перетаскиванию файлов относится к файлу, когда пользователь перетаскивает файл в каталог под деревом каталогов и бросает его.
Он автоматически перейдет в этот каталог;
Когда вы надеваете и бросаете его, файл будет автоматически скопирован в текущий каталог диска. Файф списка файлов в качестве элемента управления источником и
Дерево каталогов и метка привода целевого управления может быть расположена в разных субвондах. Текущий каталог диска - это любой суб
Последний результат операции окна, независимо от того, имеет ли этот подзадачен связь с источником сопротивления и целью перетаскивания.
Чтобы реализовать вышеуказанные функции, есть две проблемы, которые необходимо сначала решить:
1. Как записать текущий каталог каждого диска?
Для этого мы определяем глобальную переменную:
var CurrentDirlist: массив [0 ... 25] из строки [70];
В OnChange Ace DirectoryOutline:
Процедура tfmform.directoryoutlineChange (отправитель: tobject);
Начинать
CreateCaption;
Filelist.clear;
FILELIST.Directory: = DirectoryOutline.Directory;
Filelist.update;
CurrentDirlist [riveTabset.tabindex]: = DirectoryOutline.directory;
Filemanager.directorypanel.caption: = DirectoryOutline.Directory;
конец;
Поскольку DriveTabset реагирует на событие OnClick, прежде чем отвечать на событие OnDragDrop, и активируется событием
Отправить событие OnChange of DirectoryOutline, поэтому оно может быть гарантированно использовать в мероприятии OnDragDrop в любое время
Элемент массива текущего типа не является пустой строкой.
2. Как обеспечить неуместность движения и копирование с помощью подхвостки?
Ключевой вопрос здесь заключается в том, что когда мы судим управление источником, мы используем оператор IS для выполнения проверки типов:
Если источник является Tfilelist, тогда…
Если мы используем следующее оператор:
Если источник = filelist, тогда
…
Тогда операции движения и копирования будут ограничены объемом этого подполучия.
Когда мы решили приведенный выше вопрос, наша работа просто следовала общим этапам развития перетаскивания, и мы завершили его шаг за шагом.
1.Filelist начинает перетаскивать операцию
Процедура tfmform.filelistmousedown (отправитель: tobject; кнопка: tmousebutton;
Сдвиг: TshiftState;
Начинать
Если кнопка = mbleft тогда
с отправителем в качестве tfilelistbox
Начинать
Если itematpos (point (x, y), true)> = 0 тогда
BERTINDRAG (false);
конец;
конец;
Itematpos используется для проверки, есть ли в настоящее время файл. Метод BERTINDRAG передает параметр false, позволяя FileList обрабатывать события мыши отдельно, не начиная перетаскивать. На самом деле эта ситуация существует в больших количествах.
2. Directoryoutline и DriveTabset решают, принимать ли перетаскивание и положить его на место.
Процедура tfmform.directoryoutlinedragover (отправитель, источник: tobject; x,
Y: целое число;
Начинать
Если источник - это tfilelistbox, тогда
Принять: = true;
конец;
Процедура tfmform.drivetabsetdragover (отправитель, источник: tobject; x,
Y: целое число;
вар
Проппос: целое число;
Начинать
Если источник - это tfilelistbox, тогда
с DriveTabset Do
Начинать
Proppos: = itematpos (point (x, y));
Принять: = (proppos> -1) и (proppos <tabs.count);
конец;
конец;
DirectoryOutline - это безусловное признание, в то время как DriveTabset необходимо проверить, является ли это юридической меткой.
3. Ответ перетаскивания
DirectoryOutline Drag and Drop используется для реализации функции движения файла. Вызов EnformChange Event в программе
Во время процесса обработки целевой путь получается с помощью DirectoryOutline.Items [getItem (x, y)]. FullPath.
Процедура tfmform.directoryoutlinedragdrop (отправитель, источник: tobject; x,
Y: целое число);
Начинать
Если источник - это tfilelistbox, тогда
с DirectoryOutline Do
Начинать
Подтверждение change ('move', filelist.filename, элементы [getitem (x, y)]. Fullpath);
конец;
конец;
DriveTabSet Trag and Drop используется для реализации функции копирования файлов. Преобразовать текущую позицию в соответствующий драйвер в программе
Письмо привода, целевой путь получает CurrentDirlist [drivetabset.tabindex].
Процедура tfmform.drivetabsetdragdrop (отправитель, источник: tobject; x, y: integer);
вар
Стаивание: tpoint;
Начинать
Apoint.x: = x;
DriveTabSet.tabindex: = riveTabSet.itematpos (intock);
Если источник - это tfilelistbox, тогда
с DriveTabset Do
Начинать
Если CurrentDirlist [tabIndex] <> '', тогда
Подтверждение change ('copy', thefilename, currentdirlist [tabindex]);
конец;
конец;
4. Ответфилеторский ответ на перетаскивание концов и обновления списка файлов
Процедура tfmform.filelistenddrag (отправитель, цель: tobject; x, y: целое число);
Начинать
Если цель <> nil, то filelist.update;
конец;