15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Пример использования TDragObject.

Компилятор: C++ Builder

Этот пример демонстрирует возможность перетаскивания (drag & drop) из ListBox1 в Edit1.

Создайте форму : Form1
Добавьте список : ListBox1
добавьте EditBox : Edit1
и TImageList: ImageList1.

Установите dragMode в dmAutomitic у ListBox, Edit и Form. Вставьте несколько строк в ListBox1. В Imagelist установите Width и Height в 32x32. Загрузите в него один битмап. В файле .h (Unit1.h) формы добавьте следующее:

//----------------------------------------------------------------------
class TMyDragObject : public TDragObject
{
TCustomImageList* __fastcall GetDragImages(void);
public:
   String Valeur;
   __fastcall TMyDragObject(void);
};
//----------------------------------------------------------------------

В файл cpp добавьте следующий код:

//----------------------------------------------------------------------
__fastcall TMyDragObject::TMyDragObject(void)
{
  TDragObject();
}
//----------------------------------------------------------------------
TCustomImageList* __fastcall TMyDragObject::GetDragImages(void)
{
  return(Form1->ImageList1);
}

В событие FormCreate добавьте следующий код:

//----------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ControlStyle << csDisplayDragImage;
  Edit1->ControlStyle << csDisplayDragImage;
  ListBox1->ControlStyle << csDisplayDragImage;
}
//----------------------------------------------------------------------

У списка StartDrag должно выглядеть следующим образом:

//----------------------------------------------------------------------
void __fastcall TForm1::ListBox1StartDrag(TObject *Sender,
        TDragObject *&DragObject)
{
   TListBox *tlb;
   TMyDragObject *tm;
   tlb = dynamic_cast<TListBox *>(Sender);
   if (tlb != NULL) {
     if (tlb->ItemIndex != -1) {
       tm = new TMyDragObject();
       tm->Valeur = tlb->Items->Strings[tlb->ItemIndex];
       DragObject = tm;
     }
   }
}
//----------------------------------------------------------------------

У окошка редактирования Drag Over должно выглядеть следующим образом:

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

Событие Edit1DragDrop будет:

//----------------------------------------------------------------------

void __fastcall TForm1::Edit1DragDrop(TObject *Sender, TObject
*Source, int X,
        int Y)
{
   TMyDragObject *tmydrag;
   tmydrag = dynamic_cast<TMyDragObject *>(Source);
   if (tmydrag) {
     Edit1->Text = tmydrag->Valeur;
   } 
}