C++ Builder Snippets  

Drag'n Drop in VCL am Beispiel der TListBox:
 
//---------------------------------------------------------------------------
// Im folgenden Beispiel wird die Vorgehensweise beim Implementieren 
// der Drag'n Drop-Funktionalitäten für TListBox-Steuerelemente mit Hilfe 
// von VCL-Mitteln verdeutlicht.
//---------------------------------------------------------------------------
// Vorgehensweise:
//
// 1. Es wird ein Formular (im folgenden Beispiel 'frmMain' genannt) mit zwei
//    TListBox-Listenfeldern ('lboxSource' und 'lboxTarget') benötigt.
// 2. Die Eigenschaft 'DragMode' beider TListBoxen wird auf 'dmAutomatic' gesetzt.
// 3. Es wird eine globale Integer-Variable 'igOldPos' benötigt. Diese kann in
//    in der Formularklasse deklariert sein.
// 4. Ereignissbehandlungsroutinen für folgende Ereignisse der lboxTarget müssen 
//    erstellt werden (s. Beispiel unten): OnDragOver, OnDragDrop, OnStartDrag.
//
//---------------------------------------------------------------------------
// Funktion:
// 
// 1. Die Strings aus der ListBox lboxSource können per Drag'nDrop an 
//    beliebigen Stellen der ListBox lboxTarget abgelegt werden. Die Quell-
//    strings in der lboxSource werden dabei nicht gelöscht.
// 2. Die Position (Reihenfolge) der Einträge in der Ziel-Listbox kann
//    ebenfalls per Drag'n Drop beliebig verändert werden
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Behandlungsroutine für das Ereignis OnDragOver der Ziel-ListBox
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lboxTargetDragOver(TObject *Sender,
      TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
  Accept = Source->ClassNameIs("TListBox");
  int ilIndex = lboxTarget->ItemAtPos(Point(X,Y), true);
  if(ilIndex > -1)
    lboxTarget->ItemIndex = ilIndex;
}


//---------------------------------------------------------------------------
// Behandlungsroutine für das Ereignis OnDragDrop der Ziel-ListBox
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lboxTargetDragDrop(TObject *Sender,
      TObject *Source, int X, int Y)
{
  // Falls von einer anderen Listbox gezogen:
  if(Sender==lboxTarget && Source == lboxSource)
  {
    int ilNewPos = lboxTarget->ItemAtPos(Point(X,Y), true);
    if(ilNewPos > -1)
    {
      lboxTarget->Items->Insert(ilNewPos, lboxSource->Items->
        Strings[lboxSource->ItemIndex]);
      lboxTarget->ItemIndex = ilNewPos;
    }
    else
    {
      lboxTarget->Items->Insert(lboxTarget->Items->Count,
        lboxSource->Items->Strings[lboxSource->ItemIndex]);
      lboxTarget->ItemIndex = lboxTarget->Items->Count-1;
    }
  }

  // Falls innerhalb der Listbox verschieben:
  else if(Sender==lboxTarget && Source == lboxTarget)
  {
    int ilNewPos = lboxTarget->ItemAtPos(Point(X,Y), true) >= 0 ?
      lboxTarget->ItemAtPos(Point(X,Y), true) : lboxTarget->Items->Count-1;

    if(igOldPos >= 0 && igOldPos != ilNewPos)
    {
      lboxTarget->Items->Exchange(igOldPos, ilNewPos);
      lboxTarget->ItemIndex = ilNewPos;
    }
  }

}

//---------------------------------------------------------------------------
// Behandlungsroutine für das Ereignis OnStartDrag der Ziel-ListBox
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lboxTargetStartDrag(TObject *Sender,
      TDragObject *&DragObject)
{
  // alte Position des Eintrags zwischenspeichern:
  if(Sender == lboxTarget)
    igOldPos = lboxTarget -> ItemIndex;
}


  Download BCB5
Projekt-Quellcode
Download
Demo-Exe

© '99-2001 by S. Kreutzmann