Событие OnDragDrop возникает при отпускании левой кнопки мыши над элементом, готовым к приему. Его параметры Sender, Source, X и Y имеют тот же смысл, что и у предыдущего события. Содержимое этого обработчика зависит от того, какие функции программист разрешает выполнять пользователю путем перетаскивания. Это может быть изменение местоположения объектов, обмен информацией и т.д.
В следующем примере не происходит физического перемещения объектов; компонент Label1 получает указатель на перемещенный объект (геометрическая фигура) и считывает значения свойств (Height, Width) для вычисления периметра фигуры. Результат вычислений размещается в Label1 -> Caption.
void __fastcall TForm1::Label1DragDrop(TObject *Sender,
TObject *Source, int X, int Y)
{
float p, pi=3.14; int w, h, r, D;
if (String(Source->ClassName())=="TShape")
{
h=((TShape *)Source)->Height;
w= ((TShape *)Source)->Width ;
D = w; if ( D > h ) D = h;
switch ((( TShape *)Source) -> Shape)
{ case stRectangle:
Label2->Caption ="Прямоугольник";
p= 2*(w + h);
break;
case stSquare:
Label2->Caption = "Квадрат";
p= 4*D;
break;
case stCircle:
Label2->Caption = "Круг";
p= pi*D;
break;
case stEllipse:
Label2->Caption = "Эллипс";
p=pi*(3*(w+h)/4-sqrt(w*h)/2);
break;
case stRoundRect:
Label2->Caption = "Закругленный
прямоугольник";
r=(D-((TShape*)Source)->Pen->
Width +1)/4;
p=2*(w+h)-8*r+2*pi*r;
break;
case stRoundSquare:
Label2->Caption="Закругленный
квадрат";
r=(D-((TShape*)Source)->Pen->
Width+1)/4;
p=4*D-8*r+2*pi*r;
break;
}
p=p/(Form1->PixelsPerInch/2.54);
Label1->Caption = FloatToStr (p);
}
}
При завершении процесса перетаскивания вне зависимости от его результата исходный объект получает событие OnEndDrag. Его параметры:
- Sender – указатель объекта - источника;
- Target – указатель объекта - приемника;
- X, Y – координаты курсора.
В следующем примере переносимый компонент Shape1 узнает имя объекта - приемника (если объект не принят передается NULL):
void __fastcall TForm1::Shape1EndDrag(TObject *Sender, TObject *Target,
int X, int Y)
{
if (Target != NULL)
Label2->Caption =(AnsiString) (( TComponent *) Target)->Name;
}
|