Содержание материала

Перетаскивание информации с помощью мыши стало стандартом для программ, работающих в Windows. Часто это бывает удобно и позволяет добиться более быстрой работы. В данной статье я постарался показать максимальное количество примеров использования данной технологии при разработке приложений в среде Delphi. Конечно, результат может быть достигнут различными путями, продемонстрированные приемы не являются единственными и, возможно, не всегда самые оптимальные, но вполне работоспособны, и указывают направление поиска. Надеюсь, что они побудят начинающих программистов к более широкому использованию Drag'n'Drop в своих программах, тем более что пользователи, особенно неопытные, быстро привыкают к перетаскивание и часто его применяют.

 

Проще всего делать Drag из тех компонентов, для которых однозначно ясно, что именно перетаскивать. Для этого устанавливаем у источника DragMode = dmAutomatic, а у приемника пишем обработчики событий OnDragOver - разрешение на прием, и OnDragDrop - действия, производимые при окончании перетаскивания.

 

Code:

procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X,

Y: Integer; State: TDragState; var Accept: Boolean);

begin

Accept := Source = Edit1;

// разрешено перетаскивание только из Edit1,

// при работе программы меняется курсор

end;

 

procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X,

Y: Integer);

var

ACol, ARow: Integer;

begin

StringGrid2.MouseToCell( X, Y, ACol, ARow);

// находим, над какой ячейкой произвели Drop

StringGrid2.Cells[ Acol, Arow] := Edit1.Text;

//  записываем в нее содержимое Edit1

end;

 

 

 

Теперь рассмотрим копирование в упорядоченный список ListBox1 из другого списка. В OnDragOver проверяем, выбран ли хоть один элемент в источнике:

Code:

Accept := (Source = ListBox2) and (ListBox2.ItemIndex >= 0);

 

В OnDragDrop ищем отмеченные в источнике строки (установлен множественный выбор) и добавляем только те, которых еще нет в приемнике:

 

Code:

for i := 0 to ListBox2.Items.Count - 1 do

if (ListBox2.Selected[i]) and (ListBox1.Items.IndexOf(ListBox2.Items[i])<0)

   then

     ListBox1.Items.Add(ListBox2.Items[i]);

 

 

 

Для ListBox2 реализуем перенос строк из ListBox1 и перестановку элементов в желаемом порядке. В OnDragOver разрешаем Drag из любого ListBox:

 

Code:

Accept := (Source is TListBox) and ((Source as TListBox).ItemIndex >= 0);

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить