Изменение позиций элементов ListBox с помощью Drag and Drop 2
Автор: Peter Donnelly
Вот еще одна вариация сабжа.
procedure TPickParty.PickListBMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
beginif Button = mbLeft thenwith Sender as TListBox dobegin
DraggedPM := ItemAtPos(Point(X, Y), True);
if DraggedPM > l;
= 0 then
BeginDrag(False);
end;
end;
procedure TPickParty.PickListBDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
beginif Source = PickListB then
Accept := True;
end;
procedure TPickParty.PickListBDragDrop(Sender, Source: TObject; X, Y: Integer);
var
NewIndex: integer;
begin
NewIndex := PickListB.ItemAtPos(Point(X, Y), False);
if NewIndex > PickListB.Items.Count - 1 then
NewIndex := PickListB.Items.Count - 1;
PickListB.Items.Move(DraggedPM, NewIndex);
PickListB.ItemIndex := NewIndex;
end;
Программный код на языке Delphi, демонстрирующий реализацию функциональности перетаскивания и оставления (drag-and-drop) для компонента ListBox. Код состоит из трех процедур:
PickListBMouseDown: Вызывается при нажатии левой кнопки мыши над контролем ListBox PickListB. Она определяет, какой элемент был выбран, вызывая метод ItemAtPos с текущим положением курсора, и если элемент был найден, она запускает операцию перетаскивания с помощью метода BeginDrag.
PickListBDragOver: Вызывается при перетаскивании мыши над контролем ListBox PickListB во время операции перетаскивания. Она проверяет, является ли источник перетаскивания действительно контролом PickListB, и если это так, она устанавливает параметр Accept в значение True, указывая, что оставление разрешено.
PickListBDragDrop: Вызывается при оставлении перетаскиваемого элемента над контролем ListBox PickListB во время операции перетаскивания. Она определяет, где должен быть оставлен выбранный элемент, вызывая метод ItemAtPos с текущим положением курсора, и затем перемещает выбранный элемент в это место с помощью метода Items.Move. Наконец, она устанавливает свойство ItemIndex контрола PickListB в новое значение.
Некоторые предложения по улучшению кода:
В процедуре PickListBMouseDown можно использовать метод GetItemAtPos вместо ItemAtPos, так как он возвращает ссылку на элемент, находящийся в указанном положении.
Может быть полезно добавить некоторые визуальные отображения во время операции перетаскивания, например, изменение формы курсора или выделение цели для оставления.
Если вы хотите позволить пользователю оставлять элементы вне контрола ListBox, можно модифицировать процедуру PickListBDragOver, чтобы установить параметр Accept в значение True, независимо от источника перетаскивания.
Может быть полезно добавить некоторые обработчики ошибок, если пользователь пытается оставить элемент в недопустимом положении (например, вне контрола ListBox).
В целом, этот код предоставляет основную реализацию функциональности перетаскивания и оставления для компонента ListBox в Delphi. С некоторыми дополнительными функциями и улучшениями он мог бы быть сделан более robust и пользовательски friendly.
В статье описывается реализация функции Drag and Drop в компоненте ListBox с помощью отслеживания клика левой кнопки мыши и перемещения элементов списка по координатам мыши.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.