Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Программирование -> C++ Builder -> Реализация Drag and Drop в списках C++ Builder


Реализация Drag and Drop в списках C++ Builder

   Рассмотрим реализацию в своих программах такой функции как Drag and Drop. Для опытов создадим форму, содержащую два объекта TListBox и объект TLabel. Для поддержки перетаскивания объекты должны обрабатывать два события. Первое - событие OnDragDrop, возникающее, когда вы роняете что-нибудь на объект. Второе событие - OnDragOver. Обработчик этого события вызывается для проверки корректности перетаскиваемых данных. Если это событие не обрабатывать, то курсор перетаскивания над объектом превратится в знак запрещения. Итак, выделяем оба списка и на закладке Events в Object Inspector выбираем событие OnDragOver. После двойного щелчка на нем вводим следующий код:

void __fastcall TForm1::ListBox1DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
   Accept = true;
}

   Данный код просто сообщает, что списки способны воспринимать перетаскивание. Вообще-то в этом обработчике можно (и нужно) отсекать данные, нам не предназначающиеся (и устанавливать в таком случае Accept = false), но в нашем небольшом примере не будем рассматривать такие случаи.
   Теперь напишем обработчик события OnDragDrop. Он выполняется, когда вы притащите что-нибудь на один из списков.

void __fastcall TForm1::ListBox1DragDrop(TObject *Sender, TObject *Source, int X, int Y)
{
   TListBox *pListSource = (TListBox *)Source;
   TListBox *pListDest = (TListBox *)Sender;

   for (int i=0; i<pListSource->Items->Count; ++i)
      if (pListSource->Selected[i])
      {
         pListDest -> Items -> Add(pListSource->Items->Strings[i]);
         pListSource->Items->Delete(i);
      }
}

   Да, забыли про наш объект TLabel. Он у нас будет служить для индикации текущего состояния перетаскивания. Когда мы только начинаем перетаскивать данные, или когда отпускаем кнопку мыши, возникают соответственно два события - OnStartDrag и OnEndDrag. В нашем случае не будем слишком перегружать обработчики этих событий (а использовать их можно для проверки совместимости или правильности перетаскиваемых данных и т.п.), а просто напишем:

void __fastcall TForm1::ListBox1StartDrag(TObject *Sender, TDragObject *&DragObject)
{
   Label1 -> Caption = "Начинаем перетаскивание...";
}

void __fastcall TForm1::ListBox1EndDrag(TObject *Sender, TObject *Target, int X, int Y)
{
   Label1 -> Caption = "Закончили перетаскивание";
}

   Собственно, все. Проверьте, что свойство DragMode установлено в dmAutomatic. Если хотите, чтобы перетаскивались сразу несколько выделенных строк списка, установите свойство MultiSelect в true. И напоследок, неплохо бы добавить элементы, которые мы будем перетаскивать. Для этого введите несколько строк (любых) в свойствах Items списков. Можно компилировать проект.
   Отметим несколько неочевидных вещей: первое - код работает для обоих списков одинаково, т.е. оба списка могут служить как источниками, так и приемниками; второе - код работает даже для одного и того же источника и приемника (когда мы перетаскиваем объект на тот же список, откуда его и взяли).
   А теперь несколько усложним задачу. Как вы заметили, перетащенный объект появляется в конце списка, что не всегда удобно. Изменим обработчик события OnDragDrop таким образом, чтобы объект помещался именно в то место списка, куда мы указываем мышью. Код будет выглядеть следующим образом:

void __fastcall TForm1::ListBox1DragDrop(TObject *Sender, TObject *Source, int X, int Y)
{
   TListBox *pListSource = (TListBox *)Source;
   TListBox *pListDest = (TListBox *)Sender;
   POINT p;

   p.x = X;
   p.y = Y;
   int nItemIndex = pListDest -> ItemAtPos(p, false);

   for (int i=0; i<pListSource->Items->Count; ++i)
      if (pListSource->Selected[i])
      {
         pListDest -> Items -> Insert(nItemIndex, pListSource->Items->Strings[i]);
         pListSource->Items->Delete(i);
      }
}

Вот так все просто... Вы можете скачать архив с проектом для C++Builder 5.0.



 

 
Интересное в сети

https://sprintex.online как usdt перевести в рубли конвертер usdt.

 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.