Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация функции перетаскивания элементов в VirtualTreeview для упорядочивания списков

Delphi , Компоненты и Классы , TTreeView

Вопрос пользователя заключается в необходимости реализации функции перетаскивания элементов (drag-and-drop) для упорядочивания одноуровневого списка в компоненте VirtualTreeview. Пользователь столкнулся с трудностями при использовании события OnDragDrop компонента TVirtualStringTree и не нашёл подходящего примера кода в документации.

Решение проблемы

Для реализации перетаскивания элементов в VirtualTreeview необходимо обработать события, связанные с процессом перетаскивания: OnDragAllowed, OnDragOver, и OnDragDrop. Пример кода для обработки этих событий приведён ниже:

uses
  ActiveX;

procedure TForm1.vt1DragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
  Allowed := True;
end;

procedure TForm1.vt1DragOver(Sender: TBaseVirtualTree; Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
  Accept := (Source = Sender);
end;

procedure TForm1.vt1DragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  pSource, pTarget: PVirtualNode;
  attMode: TVTNodeAttachMode;
begin
  pSource := TVirtualStringTree(Source).FocusedNode;
  pTarget := Sender.DropTargetNode;
  case Mode of
    dmNowhere: attMode := amNoWhere;
    dmAbove: attMode := amInsertBefore;
    dmOnNode, dmBelow: attMode := amInsertAfter;
  end;
  Sender.MoveTo(pSource, pTarget, attMode, False);
end;

Также важно отключить автоматическое удаление перемещаемых узлов, установив TreeOptions.AutoOptions в toAutoDeleteMoveNodes в False.

Перетаскивание нескольких узлов

Для перетаскивания нескольких узлов необходимо использовать цикл для перебора всех выбранных узлов и их перемещения:

procedure TForm1.vst(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  pTarget: PVirtualNode;
  attMode: TVTNodeAttachMode;
  List: TList<PVirtualNode>;
begin
  pTarget := Sender.DropTargetNode;
  // ... (определение attMode аналогично предыдущему примеру)
  List := TList<PVirtualNode>.Create;
  var pSource := Sender.GetFirstSelected();
  while Assigned(pSource) do
  begin
    List.Add(pSource);
    pSource := Sender.GetNextSelected(pSource);
  end;
  for pSource in List do
    Sender.MoveTo(pSource, pTarget, attMode, False);
  List.Free;
end;

Не забудьте также установить следующие свойства в TreeOptions для включения функционала перетаскивания: toAcceptOLEDrop в True, toFullRowDrag в True, а DragType в dtOLE.

Заключение

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

Создано по материалам из источника по ссылке.

Реализация функции перетаскивания элементов в VirtualTreeview для упорядочивания списков требует обработки определенных событий и настройки соответствующих свойств компонента.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TTreeView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:55:47/0.0059559345245361/0