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

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Программирование -> 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.



 
Популярные книги

SQL для "чайников", 5-е издание

Подробнее

Практические работы по Excel на уроках информатики

Подробнее

Обработка цифровых фотографий (+CD)

Подробнее

 

 
Новости ИТ
01.12.2008  Buffalo выпустил миниатюрные USB-накопители
01.12.2008  VENTO TA-U1 - стильный корпус представлен Asus
01.12.2008  Fujitsu-Siemens выпускает в продажу внешний ускоритель для ноутбуков
01.12.2008  Оригинальные чехлы для ноутбуков от Choiix
01.12.2008  Опубликован код драйвера для беспроводных карт Atheros
01.12.2008  Лучший блог 2008
01.12.2008  Linux запустили на Apple iPhone
01.12.2008  LG KC780
01.12.2008  MSI дополнит линейку Wind-нетбуков двумя моделями
01.12.2008  Nikon D3X - 24,5 млн пикселей для профессионалов
01.12.2008  Киловаттник HIPER M1000 с КПД выше 85%
01.12.2008  AMD впервые снизила цены линейки Radeon HD 4800
01.12.2008  Чистильщики: Wise Registry Cleaner v.3.8.2
01.12.2008  Антивирусы: RemoveIT Pro v4 SE (30.11.2008)
01.12.2008  Корпус ASUS Vento TA-U1 можно поставить вместо новогодней ёлки
01.12.2008  Диагностика: PC Wizard 2008 v.1.871
01.12.2008  Диагностика: NextSensor v.2.7.6.0 Build 1130
01.12.2008  Тестовые приложения: PassMark BurnInTest v.6.0 Build 1000 Beta 15
01.12.2008  Неофициальные драйверы для модемов Motorola
01.12.2008  Драйверы и утилиты для сетевых хранилищ D-Link
 
Полезно

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