{
This example shows how to drag&drop within a TListBox.
The Demo Program also shows how to implement an autoscroll-feature.
}
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Sender is TListBox;
end;
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
iTemp: Integer;
ptTemp: TPoint;
szTemp: string;
begin
{ change the x,y coordinates into a TPoint record }
ptTemp.x := x;
ptTemp.y := y;
{ Use a while loop instead of a for loop due to items possible being removed
from listboxes this prevents an out of bounds exception }
iTemp := 0;
while iTemp <= TListBox(Source).Items.Count-1 do
begin
{ look for the selected items as these are the ones we wish to move }
if TListBox(Source).selected[iTemp] then
begin
{ use a with as to make code easier to read }
with Sender as TListBox do
begin
{ need to use a temporary variable as when the item is deleted the
indexing will change }
szTemp := TListBox(Source).Items[iTemp];
{ delete the item that is being dragged }
TListBox(Source).Items.Delete(iTemp);
{ insert the item into the correct position in the listbox that it
was dropped on }
Items.Insert(itemAtPos(ptTemp, True), szTemp);
end;
end;
Inc(iTemp);
end;
end;
Пример реализации функции drag-and-drop в компоненте TListBox в Delphi. Демо-приложение также демонстрирует реализацию функции autoscroll.
Процедура ListBox1DragOver вызывается, когда пользователь перетаскивает элемент над списком. Она устанавливает параметр Accept в значение True, если перетаскиваемый элемент будет опущен на другой список, что указывает на то, что операция опускания разрешена.
Процедура ListBox1DragDrop вызывается, когда пользователь опускает элемент над списком. Она обрабатывает операцию опускания, перемещая выбранные элементы из источника в целевой список.
Схема работы кода:
Переменная ptTemp используется для хранения координат места опускания.
Цикл while используется вместо цикла for для итерации по элементам источника, потому что элементы могут быть удалены из списка во время процесса итерации.
Выбранные элементы идентифицируются с помощью свойства Selected[iTemp], а если элемент выбран, то он перемещается из источника в целевой список с помощью метода Items.Insert.
Альтернативное решение:
Вместо использования цикла while для итерации по элементам источника можно использовать цикл for с временной переменной для хранения индекса текущего элемента. Это может быть более эффективно и легче для чтения:
Обратите внимание, что эти альтернативные решения предполагают, что вы хотите переместить выбранные элементы из источника в целевой список. Если вы хотите скопировать или связать элементы вместо перемещения, вам нужно будет изменить код соответствующим образом.
Представлен пример кода на языке Delphi, демонстрирующий использование функции Drag and Drop для перемещения элементов из одного списка в другой.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.